Quanto: Optimum 用の PyTorch 量子化バックエンド

Hugging Face は Quanto をリリースしました。これは Optimum ライブラリ向けの PyTorch 量子化バックエンドです。Quanto はシンプルで汎用的な量子化アプローチを提供し、重みやアクティベーションを 32 ビット浮動小数点 (float32) ではなく、8 ビット整数 (int8) などの低精度データ型で表現することで、メモリ使用量と計算コストを削減できます。

主な機能と特長

Quanto はシンプルさと汎用性を重視して設計されており、最近の多くの量子化ライブラリが LLM に特化しているのとは異なり、線形およびグループ単位の量子化プリミティブを提供し、あらゆるモデルモダリティに適応できます。

その主な技術的特長は次のとおりです:

  • デバイス非依存性: 量子化モデルは CUDA、CPU、MPS(Apple Silicon)を含む任意のデバイスにデプロイできます。
  • イーガーモードサポート: すべての機能はイーガーモードで利用可能で、トレース不可能なモデルとの互換性を確保します。
  • 広範な精度サポート: 重みは int2、int4、int8、float8 を、アクティベーションは int8 と float8 をサポートします。
  • 自動統合: バックエンドは量子化/逆量子化スタブ、量子化された関数操作、量子化モジュールを自動的に挿入します。
  • パフォーマンス最適化: CUDA デバイス上で int8‑int8、fp16‑int4、bf16‑int8、bf16‑int4 などの組み合わせに対して高速な行列乗算を提供します。
  • シリアライズ: 効率的なモデルの保存とロードのために PyTorch weight_only と Hugging Face Safetensors に対応しています。

量子化ワークフロー

Quanto は、浮動小数点精度のモデルを凍結された量子化状態へと移行させる構造化されたワークフローを実装しています:

  1. Quantize: 標準的な float モデルを動的に量子化されたモデルに変換します。
  2. Calibrate (Optional): アクティベーションが量子化される場合、キャリブレーションモードは代表的なサンプルを使用してアクティベーション範囲を記録します。
  3. Tune (Optional): Quantization‑Aware‑Training (QAT) をサポートし、数エポックのトレーニングで性能低下を回復します。
  4. Freeze: float の重みを量子化された重みに置き換えます。
  5. Serialize: 量子化された重みを state_dict に、量子化マップを JSON ファイルに保存します。
  6. Reload: requantize ヘルパーを使用して空のモデルをインスタンス化し、シリアライズされた重みとマップを再ロードします。

Hugging Face Transformers との統合

Quanto は transformers ライブラリに直接統合されています。ユーザーは QuantoConfigfrom_pretrained メソッドに渡すことでモデルを量子化できます。

  • ハードウェア要件: デバイス非依存であるものの、float8 は対応ハードウェアが必要です。対応していない場合、Quanto は行列乗算時に静かに float32 または float16 にアップキャストします。float8 は現在 MPS デバイスでエラーを発生させます。
  • コンパイル: Quanto は torch.compile に対応しています。ただし、より高速な生成のために、ユーザーは QuantoConfigactivations=None を設定し、動的量子化(QAT や量子化アクティベーションなど)に起因する問題を回避すべきです。
  • クロスモダリティ利用: この統合はさまざまなモダリティをサポートし、openai/whisper-large-v3 のようなモデルを int8 で量子化できることが実証されています。

パフォーマンスベンチマーク

meta-llama/Meta-Llama-3.1-8B の評価により、Quanto がレイテンシとメモリ使用量の削減への道を提供することが示されました。トークンあたりのレイテンシは NVIDIA A10 GPU 上で測定されました。提示された結果は、AWQ や HQQ といった事後トレーニング最適化アルゴリズムを適用せずに得られたものです。

Sources