# 量子化対応学習（QAT）

PyTorchと協力して、UnslothにQAT（量子化対応トレーニング）を導入し、次を可能にします： **学習可能な量子化** できるだけ多くの精度を回復します。これにより、標準的な4ビット単純量子化と比べてモデル品質が大幅に向上します。QATは最大で **失われた精度の70％** を回復し、 **1–3％** のモデル性能改善をGPQAやMMLU Proなどのベンチマークで達成できます。

> **無料の** [**Qwen3（4B）ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)_Instruct-QAT.ipynb)

### :books:量子化

{% columns %}
{% column width="50%" %}
モデルを単純に量子化することは **事後量子化** （PTQ）と呼ばれます。例えば、8ビット整数に量子化したいと仮定すると：

1. を探す `max(abs(W))`
2. を探す `a = 127/max(abs(W))` ここで a は int8 の最大範囲である127です
3. 次のように量子化します `qW = int8(round(W * a))`
   {% endcolumn %}

{% column width="50%" %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-f3e1cee8e4047dcbbbace7548694ad63af9869de%2Fquant-freeze.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

16ビットに戻すデクオンタイズは単に逆の操作を行い、 `float16(qW) / a` となります。事後量子化（PTQ）はストレージと推論コストを大幅に削減できますが、少ないビットで高精度値を表現する際に精度が劣化することがしばしばあります。特に4ビット以下では顕著です。これを解決する一つの方法は、 [**動的GGUF量子化**](https://unsloth.ai/docs/jp/ji-ben/unsloth-dynamic-2.0-ggufs)を利用することです。これはキャリブレーションデータセットを使って、重要な重みにより多くの重要度を割り当てるよう量子化手順を変更します。もう一つの方法は、 **量子化を賢くする、つまり学習可能にすること**!

### :fire:賢い量子化

<div><figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1f6260ef5c041ada2f8b1fb4c6aad114f61061d4%2F4bit_QAT_recovery_sideways_clipped75_bigtext_all(1).png?alt=media" alt=""><figcaption></figcaption></figure> <figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-ad1ac9d29482ea07cbabb6efa18a0d1f06b297e9%2FQLoRA_QAT_Accuracy_Boosts_v7_bigaxes_nogrid_600dpi.png?alt=media" alt=""><figcaption></figcaption></figure></div>

賢い量子化を可能にするために、私たちは [TorchAO](https://github.com/pytorch/ao) チームと協力して **量子化対応トレーニング（QAT）** をUnsloth内部に直接追加しました。これにより、Unslothでモデルをファインチューニングし、精度改善を伴う4ビットQATフォーマットとして直接エクスポートできるようになりました！

実際に、 **QATは66.9％を回復し** Gemma3-4BのGPQAにおいて、原精度を+1.0％上げています。Gemma3-12BはBBHで45.5％を回復し、 **原精度を+2.1％向上させました**。QATは推論時に追加のオーバーヘッドがなく、通常の単純量子化と同じディスクおよびメモリ使用量を利用します！つまり、低ビット量子化の利点をすべて享受しながら、精度を大幅に向上させることができます！

### :mag:量子化対応トレーニング

QATはトレーニング中に「**フェイク量子化**」した重みと任意で活性化をシミュレートします。これは通常、高精度の値を量子化された値に丸め（ただし高精度のデータ型、例：bfloat16のまま）、直ちにデクオンタイズすることを意味します。

TorchAOはまず（1）線形層にフェイク量子化操作を挿入し、（2）トレーニング後にフェイク量子化操作を実際の量子化およびデクオンタイズ操作に変換して推論準備を行うことでQATを実現します。ステップ1により、より正確な量子化表現を学習することが可能になります。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-3d990e2bf19ef1aa7e65a8dd07e4b71cf8882a2a%2Fqat_diagram.png?alt=media" alt=""><figcaption></figcaption></figure>

### :sparkles:QAT + LoRA ファインチューニング

UnslothのQATはさらにLoRAファインチューニングと組み合わせることができ、トレーニング時のストレージと計算要件を大幅に削減しつつ量子化による劣化を緩和するという両方の利点を実現します！私たちは `qat_scheme` を通じて複数の方式をサポートしており、 `fp8-int4`, `fp8-fp8`, `int8-int4`, `int4` などを含みます。今後のリリースでQATのカスタム定義を追加する予定もあります！

{% code overflow="wrap" %}

```python
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Qwen3-4B-Instruct-2507",
    max_seq_length = 2048,
    load_in_16bit = True,
)
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 32,
    
    # 我々は fp8-int4, fp8-fp8, int8-int4, int4 をサポートします
    qat_scheme = "int4",
)
```

{% endcode %}

### :teapot:QATモデルのエクスポート

Unslothでファインチューニングした後、次を呼び出して `model.save_pretrained_torchao` TorchAOのPTQフォーマットを使用してトレーニング済みモデルを保存できます。これらをHuggingFaceハブにアップロードすることも可能です！任意の設定をサポートしており、テキストベースの方法も提供し、誰にとってもプロセスをより簡単にする予定です。ただしまず、最終変換ステップのためにQATモデルを次のように準備する必要があります：

{% code overflow="wrap" %}

```python
from torchao.quantization import quantize_
from torchao.quantization.qat import QATConfig
quantize_(model, QATConfig(step = "convert"))
```

{% endcode %}

そして、どのQATスタイルを使用するか選択できます：

{% code overflow="wrap" %}

```python
# QATとまったく同じ設定を使う（便利な関数）
model.save_pretrained_torchao(
    model, "tokenizer", 
    torchao_config = model._torchao_config.base_config,
)

# Int4 QAT
from torchao.quantization import Int4WeightOnlyConfig
model.save_pretrained_torchao(
    model, "tokenizer",
    torchao_config = Int4WeightOnlyConfig(),
)

# Int8 QAT
from torchao.quantization import Int8DynamicActivationInt8WeightConfig
model.save_pretrained_torchao(
    model, "tokenizer",
    torchao_config = Int8DynamicActivationInt8WeightConfig(),
)
```

{% endcode %}

その後、マージされたQAT低精度モデルをvLLM、Unsloth、その他のシステムで推論に実行できます！これらはすべて [Qwen3-4B QAT Colabノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)_Instruct-QAT.ipynb) にもあります！

### :teapot:トレーニングなしでのモデル量子化

また、QATを行わずに `model.save_pretrained_torchao` を直接呼び出すこともできます！これは単にPTQまたはネイティブ量子化です。例えば、動的float8形式で保存する例は以下の通りです：

{% code overflow="wrap" %}

```python
# Float8
from torchao.quantization import PerRow
from torchao.quantization import Float8DynamicActivationFloat8WeightConfig
torchao_config = Float8DynamicActivationFloat8WeightConfig(granularity = PerRow())
model.save_pretrained_torchao(torchao_config = torchao_config)
```

{% endcode %}

### :mobile\_phone:ExecuTorch - モバイル展開向けのQAT

{% columns %}
{% column %}
UnslothとTorchAOのQATサポートを利用すると、Unslothでモデルをファインチューニングしてシームレスに [ExecuTorch](https://github.com/pytorch/executorch) （PyTorchのオンデバイス推論向けソリューション）にエクスポートし、直接モバイルにデプロイすることもできます。動作例を [ここ](https://huggingface.co/metascroy/Qwen3-4B-int8-int4-unsloth) を使って示しており、より詳細なワークフローも準備中です！

**発表は間もなく！**
{% endcolumn %}

{% column %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-53631bae5588644d2c64cec18f371f0a7e2688c6%2Fswiftpm_xcode.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

### :sunflower:QATを有効にする方法

Unslothを最新バージョンにアップデートし、最新のTorchAOもインストールしてください！

dataset\[i]\["audio"] **無料の** [**Qwen3（4B）ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)_Instruct-QAT.ipynb)

{% code overflow="wrap" %}

```bash
pip install --upgrade --no-cache-dir --force-reinstall unsloth unsloth_zoo
pip install torchao==0.14.0 fbgemm-gpu-genai==1.3.0
```

{% endcode %}

### :person\_tipping\_hand:謝辞

PyTorchおよびTorchAOチーム全体の支援と協力に大きな感謝を捧げます！QATに関する多くの議論やUnslothへの統合を手伝ってくれたAndrew Or、Jerry Zhang、Supriya Rao、Scott Roy、Mergen Nachinに特に感謝します。ExecuTorchチームにも感謝します！


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/burogu/quantization-aware-training-qat.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
