# AutoRound

[AutoRound](https://github.com/intel/auto-round) は高度な量子化ツールキットです。符号勾配降下法を活用し、チューニングを最小限に抑えながら、超低ビット幅（2〜4ビット）で高い精度を実現するとともに、幅広いハードウェアとの互換性を備えています。詳細については、論文 [SignRoundV1](https://arxiv.org/pdf/2309.05516) および [SignRoundV2](https://arxiv.org/abs/2512.04746) をご覧ください。

`auto-round`（バージョン ≥ 0.13.0）をインストールします：

```bash
pip install "auto-round>=0.13.0"
```

より高速な CUDA 推論のために Marlin カーネルを使用するには、`gptqmodel` をインストールしてください。

```bash
pip install "gptqmodel>=5.8.0"
```

## 量子化モデルの読み込み

`AutoRoundConfig`を[from_pretrained()](/docs/diffusers/main/ja/api/models/overview#diffusers.ModelMixin.from_pretrained)に渡すことで、事前量子化済みのAutoRoundモデルを読み込みます。このメソッドは、[Accelerate](https://hf.co/docs/accelerate/index)経由で読み込めるモデルであれば、`torch.nn.Linear`レイヤーを持つ限りすべてで動作します。

[PipelineQuantizationConfig](/docs/diffusers/main/ja/api/quantization#diffusers.PipelineQuantizationConfig) を使用して、パイプラインの特定のコンポーネントを量子化できます:

```python
import torch
from diffusers import DiffusionPipeline, PipelineQuantizationConfig, AutoRoundConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={"transformer": AutoRoundConfig(backend="auto")}
)
pipe = DiffusionPipeline.from_pretrained(
    "INCModel/Z-Image-W4A16-AutoRound",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)

image = pipe("a cat holding a sign that says hello").images[0]
image.save("output.png")
```

または、量子化されたモデルコンポーネントを直接読み込みます:

```python
import torch
from diffusers import ZImageTransformer2DModel, ZImagePipeline, AutoRoundConfig

model_id = "INCModel/Z-Image-W4A16-AutoRound"

quantization_config = AutoRoundConfig(backend="auto")
transformer = ZImageTransformer2DModel.from_pretrained(
    model_id,
    subfolder="transformer",
    quantization_config=quantization_config,
    dtype=torch.bfloat16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)

pipe = ZImagePipeline.from_pretrained(
    model_id,
    transformer=transformer,
    dtype=torch.bfloat16,
    device_map="cuda",
)

image = pipe("a cat holding a sign that says hello").images[0]
image.save("output.png")
```

> [!NOTE]
> Diffusers における AutoRound は、*事前量子化済み*モデルの読み込みのみをサポートしています。モデルをゼロから量子化するには、[AutoRound CLI または Python API](https://github.com/intel/auto-round)を直接使用し、その結果を Diffusers で読み込んでください。

## torch.compile

AutoRound は、より高速な推論のために [`torch.compile`](../optimization/fp16#torchcompile) と互換性があります。パフォーマンスを向上させるために、量子化された Transformer（DiT）をコンパイルできます。

```python
import torch
from diffusers import DiffusionPipeline, PipelineQuantizationConfig, AutoRoundConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={"transformer": AutoRoundConfig(backend="auto")}
)
pipe = DiffusionPipeline.from_pretrained(
    "INCModel/Z-Image-W4A16-AutoRound",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)

pipe.transformer = torch.compile(pipe.transformer, mode="default", fullgraph=False)
```

## バックエンド

AutoRound は、Weight-only 量子化モデルに対して複数の推論バックエンドをサポートしています。バックエンドは、フォワードパス中のデクォアンティゼーションをどのカーネルが処理するかを制御します。`AutoRoundConfig` の `backend` パラメータを設定して、バックエンドを選択します。

| バックエンド | 値 | デバイス | 要件 | 注記 |
|---------|-------|--------|--------------|-------|
| **Auto** | `"auto"` | すべて | — | デフォルト。利用可能な最適なバックエンドを自動的に選択します。 |
| **PyTorch** | `"torch"` | CPU / CUDA | — | 純粋なPyTorch実装。最も広い互換性。 |
| **Triton** | `"tritonv2"` | CUDA | `triton` | GPU推論用のTritonベースのカーネル。 |
| **ExllamaV2** | `"exllamav2"` | CUDA | `gptqmodel>=5.8.0` | ExllamaV2カーネルによる優れたCUDAパフォーマンス。 |
| **Marlin** | `"marlin"` | CUDA | `gptqmodel>=5.8.0` | Marlinカーネルによる最高のCUDAパフォーマンス。 |

```python
from diffusers import AutoRoundConfig

# Auto-select (default)
config = AutoRoundConfig()

# Explicit Triton backend for CUDA
config = AutoRoundConfig(backend="tritonv2")

# Marlin backend for best CUDA performance (requires gptqmodel>=5.8.0)
config = AutoRoundConfig(backend="marlin")

# ExllamaV2 backend for good CUDA performance (requires gptqmodel>=5.8.0)
config = AutoRoundConfig(backend="exllamav2")

# PyTorch backend for CPU/CUDA inference
config = AutoRoundConfig(backend="torch")
```

## 保存と読み込み

AutoRoundでは、モデルの量子化にデータキャリブレーションが必要です。これはDiffusersの外側で、[AutoRoundライブラリ](https://github.com/intel/auto-round)を直接使用して行います。

```python
from auto_round import AutoRound

autoround = AutoRound(
    "Tongyi-MAI/Z-Image",
    scheme="W4A16",  # W4G128 symmetric
    enable_torch_compile=True,
    num_inference_steps=3,
    guidance_scale=7.5,
    dataset="coco2014",
)
autoround.quantize_and_save("Z-Image-W4A16-AutoRound")
```

キャリブレーションのオプションの詳細については、[AutoRoundのドキュメント](https://github.com/intel/auto-round)を参照してください。

```python
import torch
from diffusers import ZImageTransformer2DModel, ZImagePipeline

model_id = "INCModel/Z-Image-W4A16-AutoRound"

# The inference backend will be automatically selected.
pipe = ZImagePipeline.from_pretrained(
    model_id,
    dtype=torch.bfloat16,
    device_map="cuda",  # or "mps", "xpu", "cpu"
)

image = pipe("a cat holding a sign that says hello").images[0]
image.save("output.png")
```

### サポートされている量子化スキーム

AutoRoundは複数のSchemesをサポートしています:

- **W4A16**(bits:4,group_size:128,sym:True,act_bits:16)
- **W8A16**(bits:8,group_size:128,sym:True,act_bits:16)
- **W3A16**(bits:3,group_size:128,sym:True,act_bits:16)
- **W2A16**(bits:2,group_size:128,sym:True,act_bits:16)
- **GGUF:Q4_K_M**（llamacpp が提供するすべての Q*_K、Q*_0、Q*_1 はサポートされています）
- **NVFP4**（実験的な機能です。`llm_compressor`形式へのエクスポートを推奨します。data_type nvfp4,act_data_type nvfp4,static_global_scale,group_size 16）
- **MXFP4**(**研究機能、実用カーネルなし**、標準 MXFP4、data_type mxfp、act_data_type mxfp、bits 4、act_bits 4、group_size 32)
- **MXINT4**(**研究機能、実用カーネルなし**、Standard MXINT4、data_type mxint、act_data_type mxint、bits 4、act_bits 4、group_size 32)
- **MXFP4_RCEIL**(**研究機能、実装されたカーネルなし**、NVIDIA のバリアント、data_type mxfp、act_data_type mxfp_rceil、bits 4、act_bits 4、group_size 32)
- **MXFP8**(**研究機能、実装済みカーネルなし**、data_type mxfp、act_data_type mxfp_rceil、group_size 32)
- **FPW8A16**(**研究機能、実装済みカーネルなし**、data_type fp8、group_size 0->テンソルごと)
- **FP8_STATIC**(**研究段階の機能、実装済みカーネルなし**、data_type:fp8、act_data_type:fp8、group_size -1 ->チャンネルごと、act_group_size=0->テンソルごと)

また、`group_size`、`bits`、`sym` など、必要に応じて多くの設定を変更できますが、実際には対応するカーネルが存在しない可能性があります。

## リソース

- [Hub上の事前量子化済みAutoRoundモデル](https://huggingface.co/models?search=autoround)

