何を量子化するか
まず重み、続いて活性化とKVキャッシュも対象にできます。対象を増やすほどメモリは節約できますが品質のリスクも増えるため、それぞれ別の判断になります。
トラフィックを受ける前にモデルへ施す作業です。デプロイのコストと挙動を変えるレバーは3つあります。数値を小さくする(量子化)、モデルを小さくする(蒸留)、挙動を変える(ファインチューニング)です。
量子化は数値をより少ないビット数で保存します。1パラメータはFP32で4バイト、FP16/BF16で2バイト、FP8/INT8で1バイト、INT4で0.5バイトなので、7Bモデルは精度が下がるにつれて約28 GBから14、7、3.5 GBへと縮みます。利点は3つです。購入するメモリが減ること、トークンあたりに動かすデータが減ること(decodeは帯域律速です)、そして低精度をネイティブに扱えるハードウェアでは演算自体が速くなることです。
まず重み、続いて活性化とKVキャッシュも対象にできます。対象を増やすほどメモリは節約できますが品質のリスクも増えるため、それぞれ別の判断になります。
サービングでは学習後の手法が主流です。GPTQ(層ごとの誤差最小化)、AWQ(最も重要なごく一部の重みを保護)、SmoothQuant(W8A8のために難しさを活性化から重みへ移す)などがあります。量子化を考慮した学習も存在しますが、LLMでは比較的まれです。
多くのチームは自前で量子化せず、量子化済みのチェックポイント(ハブでの配布、ローカルランタイム向けのGGUF Q4/Q5/Q8)をダウンロードします。対象の精度に自分のGPU世代がネイティブ対応しているか確認してください。対応していないと速度面の利点は消えます。
代償は精度です。8ビットでは通常わずかですが、小さいモデルや難しいタスクほど早く目立ちます。perplexityだけで量子化ビルドを採用してはいけません。自分の評価セットでフル精度のベースラインと比較してください。
蒸留は、より大きな教師モデルを模倣するように小型の生徒モデルを学習させ、能力をより安価な成果物へ移す手法です。同じモデルを圧縮する量子化とは異なり、蒸留はレイテンシ、メモリ、リクエストあたりコストのいずれも小さい、実際に別の小型モデルを生み出します。
ファインチューニングは、既存モデルの学習を自分の例データで継続する手法です。ドメイン特有の言い回し、出力形式、トーン、あるいはプロンプトでは安定して得られないタスク挙動を対象にします。プロンプト、few-shotの例、検索を試したうえで検討し、効果を証明できるよう学習前に評価セットを用意してください。
当サイトには、手法、フレームワーク、ローカル学習とクラウド学習の選択を詳しく扱う専用ハブがあります。ファインチューニングをご覧ください。
| 症状 | 選ぶべき手 |
|---|---|
| モデルがGPUに載らない、または許容品質でのサービングコストが高すぎる | まず量子化。試すコストが低く、元に戻せる |
| 範囲の狭いタスクで、リクエストごとに大きなモデルを使うのが過剰 | 小型の生徒モデルへの蒸留、または既存の小型モデルとファインチューニングの組み合わせ |
| 良いプロンプトと検索を用いてもドメインの挙動、形式、トーンが合わない | ファインチューニング(まずLoRA、アダプタで足りなければフル調整) |
| 上記すべてを大規模に抱えている | 各手法は併用できる。蒸留やファインチューニングを施したモデルを、サービング向けに量子化するのは日常的な運用 |