BladeLLM は、Large Language Models(LLM)向けに、効率的で使いやすい量子化機能を提供します。これには、重みのみの量子化(weight_only_quant)と、重みと活性化の同時量子化(act_and_weight_quant)が含まれます。 GPTQ、AWQ、SmoothQuant など、いくつかの主流の有効な量子化アルゴリズムを統合し、INT8、INT4、FP8 などのさまざまなデータ型の量子化をサポートしています。このトピックでは、モデルの量子化操作を実行する方法について説明します。
背景情報
既存の問題
LLM 技術とアプリケーションの急速な発展に伴い、そのパラメーターとコンテキストの規模は、推論のデプロイメントに大きな課題をもたらします。
過剰な GPU メモリ消費: 大きなモデルの重みをロードするだけでもかなりの GPU メモリが必要になり、シーケンス長と隠れ層の規模の組み合わせにより、KV キャッシュに追加の GPU メモリが必要になります。
サービスのスループットとレイテンシの問題: GPU メモリの消費は、LLM 推論計算中のバッチサイズを制限し、それによって LLM サービスの全体的なスループットを制限します。モデルの規模とコンテキストの増加は、推論計算量を増やし、テキスト生成速度に影響を与えます。バッチサイズの制約と相まって、高並行負荷下でのリクエストのキューイングにより、応答レイテンシの問題が深刻になります。
解決策
モデルの重みと計算キャッシュを圧縮すると、デプロイメント中の GPU メモリ消費を効果的に削減し、推論計算バッチサイズの上限を引き上げるのに役立ち、それによってサービス全体の スループットが向上します。さらに、INT8/INT4 量子化は、計算中に GPU メモリから読み取られるデータのサイズを削減し、LLM 推論計算におけるメモリのボトルネックを軽減します。 INT8/INT4 ハードウェアの計算能力を使用することで、さらなる高速化を実現できます。
BladeLLM は、量子化アルゴリズムとシステム最適化の実装を組み合わせて、包括的な機能と優れたパフォーマンスを備えた量子化最適化ソリューションを開発しました。量子化ツールは、柔軟なキャリブレーションデータ入力方法を提供し、マルチ GPU モデルの量子化をサポートします。さらに、BladeLLM は CPU オフロード機能を提供し、GPU メモリが限られている状況でのモデルの量子化をサポートします。また、自動混合精度機能も提供し、量子化された計算の一部をフォールバックすることで量子化精度の調整をサポートします。
量子化タスクの作成
Platform for AI(PAI)の Elastic Algorithm Service(EAS)で伸縮自在なジョブサービスをデプロイして、サービスをジョブとして実行し、モデルの量子化キャリブレーションと変換を完了できます。次の手順を実行します。
PAI コンソール にログインします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 [サービスのデプロイ] ページの [カスタムモデルのデプロイ] セクションで、[カスタムデプロイ] をクリックします。
[カスタムデプロイ] ページで、主要なパラメーターを構成します。その他のパラメーターについては、コンソールでのカスタムデプロイのパラメーター をご参照ください。
パラメーター
説明
基本情報
サービス名
サービスの名前を指定します(例: bladellm_quant)。
環境情報
デプロイ方法
[イメージベースのデプロイ] を選択します。
イメージ構成
[公式イメージ] リストで、 を選択します。
説明イメージバージョンは頻繁に更新されます。最新バージョンを選択することをお勧めします。
モデル設定
量子化するモデルをマウントします。 OSS マウントを例にとります。他のマウント方法を選択することもできます。 [OSS] をクリックし、次のパラメーターを構成します。
URI: 量子化モデルが配置されている OSS ストレージディレクトリを選択します。 Object Storage Service (OSS) ディレクトリの作成方法とファイルのアップロード方法については、OSS コンソールを使用して開始する をご参照ください。
マウントパス: サービスインスタンスにマウントする宛先パスを構成します(例:
/mnt/model)。読み取り専用モードを有効にする: この機能をオフにします。
コマンド
モデルの量子化コマンドを構成します:
blade_llm_quantize --model /mnt/model/Qwen2-1.5B --output_dir /mnt/model/Qwen2-1.5B-qt/ --quant_algo gptq --calib_data ['hello world!'].パラメーター:
--model: 量子化モデルの入力パスを構成します。--output_dir: 量子化モデルの出力パスを構成します。--quant_algo: 量子化アルゴリズム を指定します。デフォルトの量子化アルゴリズムは MinMax です。デフォルトの量子化アルゴリズムを使用する場合は、--calib_dataを指定する必要はありません。
入力パスまたは出力パスは、モデル構成でマウントされた OSS パスと一致する必要があります。構成可能なその他の量子化パラメーターについては、モデルの量子化パラメーター をご参照ください。
ポート番号
イメージを選択すると、システムは自動的にポート 8081 を構成します。手動での変更は必要ありません。
リソース情報
リソースタイプ
この例では、[パブリックリソース] を選択します。ビジネス要件に基づいて他のリソースタイプを選択することもできます。
デプロイリソース
BladeLLM 量子化コマンドを実行するための [インスタンスタイプ] を選択します。選択したインスタンスタイプの GPU メモリは、量子化モデルに必要な GPU メモリよりわずかに大きいだけで済みます。モデルの GPU メモリ計算式は次のとおりです。
。たとえば、FP16 モデルに 70 億のパラメーターが含まれている場合、GPU メモリは次の式を使用して計算されます: 。 機能
タスクモード
スイッチをオンにして、EAS スケーラブルジョブサービスを作成します。
パラメーターを構成した後、[デプロイ] をクリックします。
サービスステータス が 完了 になると、モデルの量子化は完了です。 OSS(データソース)の出力パスに移動して、生成された量子化モデルを表示し、BladeLLM を使い始める を参照して、EAS にモデルをデプロイできます。
量子化手法の紹介
このセクションでは、BladeLLM 量子化ツールに含まれるさまざまな量子化モード、量子化アルゴリズム、およびそれらのアプリケーションシナリオを紹介し、一部のパラメーターの具体的な使用方法を説明します。
量子化モード
BladeLLM は、weight_only_quant と act_and_weight_quant の 2 つの量子化モードをサポートしており、quant_mode パラメーターを使用して指定できます。
weight_only_quant
定義: モデルの重みのみを量子化します。
特徴: act_and_weight_quant と比較して、weight_only_quant は通常、モデルの精度をより簡単に維持します。場合によっては、LLM デプロイの主なボトルネックは GPU メモリ帯域幅であり、weight_only_quant はモデルのパフォーマンスと精度の両方を考慮したより良いソリューションです。
サポートされているデータ型: 8 ビットと 4 ビットをサポートします。どちらもデフォルトでは符号付き対称量子化です。
量子化の粒度: チャネルごとの量子化とブロック単位の量子化をサポートします。
サポートされているアルゴリズム:
minmax、gptq、awq、smoothquant+が含まれます。
act_and_weight_quant
定義: モデルの重みと活性化値の両方を同時に量子化します。
特徴: weight_only_quant と比較して、真に低ビット密度の計算を可能にし、演算子の実行速度を大幅に向上させます。
サポートされているデータ型: 8 ビットをサポートします。デフォルトでは符号付き対称量子化です。
量子化の粒度: 活性化値にはトークンごとの動的量子化を、重みにはチャネルごとの静的量子化を使用します。ブロック単位の量子化は現在サポートされていません。
サポートされているアルゴリズム:
minmax、smoothquant、smoothquant_gptqが含まれます。
量子化モードは、次のハードウェアと量子化データ型をサポートしています。
ハードウェアタイプ | weight_only_quant | act_and_weight_quant | ||||
INT8 | INT4 | FP8 | INT8 | FP8 | ||
Ampere (SM80/SM86) | GU100/GU30 | Y | Y | N | Y | N |
Ada Lovelace (SM89) | L20 | N | N | N | Y | Y |
Hopper (SM90) | GU120/GU108 | N | N | N | Y | Y |
block_wise_quant
以前は、モデルパラメーターの量子化では、通常、出力チャネルごとに 1 セットの量子化パラメーターを共有する、パーチャネル量子化が使用されていました。現在、weight_only_quant では、LLM モデルの量子化損失をさらに低減するために、多くの量子化手法で、より細かい量子化設定が採用されており、各出力チャネルを複数の小さなブロックにさらに分割し、小さなブロックごとに個別の量子化パラメーターを使用しています。BladeLLM では、小さなブロックのサイズを 64 に固定しています。つまり、64 パラメーターごとに 1 セットの量子化パラメーターを共有します。
例: パラメーター
チャネルごとの量子化を使用する場合、量子化パラメーターは
です。 ブロック単位の量子化を使用する場合、量子化パラメーターは
です。
上記の例は、ブロック単位の量子化では、よりきめ細かい量子化パラメーターを使用することで、理論的にはより良い量子化精度(特に 4 ビットの重みのみの量子化において)を達成できることを示していますが、モデルの量子化パフォーマンスがわずかに低下します。
量子化アルゴリズム
BladeLLM は、quant_algo パラメーターを使用して指定できる複数の量子化アルゴリズムを提供します。
MinMax
MinMax は、最近接偶数への丸め (RTN) を使用する、シンプルで直接的な量子化アルゴリズムです。
このアルゴリズムは、weight_only_quant と act_and_weight_quant の両方に適しています。キャリブレーションデータは必要なく、量子化プロセスは高速です。
GPTQ
GPTQ は、量子化ファインチューニングのための近似二次情報に基づく重みのみの量子化アルゴリズムであり、量子化精度を効果的に維持し、比較的効率的な量子化プロセスを備えています。 GPTQ は、各チャンネル (またはブロック) 内のパラメーターを順番に量子化し、各パラメーターが量子化された後、活性化値から計算されたヘッセ行列の逆数を使用して、そのチャンネル (またはブロック) 内のパラメーターを適切に調整し、量子化による精度の損失を補償します。
このアルゴリズムはブロック単位の量子化をサポートし、一定量のキャリブレーションデータを必要とし、ほとんどの場合、MinMax アルゴリズムよりも量子化精度が優れています。
AWQ
AWQ は、活性化を認識する重みのみの量子化アルゴリズムです。このアルゴリズムは、異なる重みが異なる重要度を持つことを認識しており、重要なパラメーター (顕著な重み) のわずかな部分 (0.1%~1%) があり、これらのパラメーターの量子化をキャンセルすると、量子化損失が大幅に減少します。実験により、活性化値が大きいパラメーターチャンネルほど重要であることがわかっているため、重要なパラメーターチャンネルの選択は、活性化値の分布に基づいて決定されます。具体的には、AWQ は、量子化前に重要なパラメーターに比較的大きなスケーリング係数を掛けて、重要なパラメーターの量子化損失を低減します。
このアルゴリズムはブロック単位の量子化をサポートし、一定量のキャリブレーションデータを必要とし、場合によっては GPTQ よりも精度が優れていますが、量子化キャリブレーションに時間がかかります。たとえば、4 つの V100-32G GPU で Qwen-72B をキャリブレーションする場合、gptq は約 25 分かかりますが、awq は約 100 分かかります。
SmoothQuant
SmoothQuant は、LLM W8A8 量子化を改善するための効果的なポストトレーニング量子化アルゴリズムであり、典型的な act-and-weight 量子化です。モデルの量子化中に、活性化値はモデルの重みよりも量子化が難しいのが一般的であり、外れ値は活性化値の量子化の主な課題です。 SmoothQuant は、LLM 活性化の外れ値は、多くの場合、特定のチャンネルに均一に現れ、トークンによって変化しないことを発見しました。この発見に基づいて、SmoothQuant は数学的に同等の変換を使用して、量子化の難しさを活性化値から重みに転送し、活性化の外れ値のスムーズな処理を実現します。
このアルゴリズムは一定量のキャリブレーションデータを必要とし、ほとんどの場合、MinMax アルゴリズムよりも量子化精度が優れています。現在、ブロック単位の量子化はサポートしていません。
SmoothQuant+
SmoothQuant+ は、活性化の外れ値をスムージングすることで量子化損失を低減する重みのみの量子化アルゴリズムです。このアルゴリズムは、モデルの重みの量子化エラーが活性化の外れ値によって増幅されることを認識しているため、smoothquant+ は最初にチャンネル次元で活性化の外れ値をスムージングし、同時に対応する重みを調整して計算の等価性を維持してから、通常の重みのみの量子化に進みます。
このアルゴリズムは一定量のキャリブレーションデータを必要とし、ブロック単位の量子化をサポートします。
SmoothQuant-GPTQ
SmoothQuant-GPTQ は、SmoothQuant の原則を使用して活性化の外れ値をスムージングした後、GPTQ アルゴリズムを使用してモデルパラメーターを量子化することを指します。この方法では、ある程度、SmoothQuant と GPTQ の利点を組み合わせることができます。
次の表は、さまざまな量子化アルゴリズムの基本的なサポートについて説明しています。
量子化アルゴリズム | weight_only_quant (ブロック単位の量子化をサポート) | act_and_weight_quant (ブロック単位の量子化をサポートしていません) | キャリブレーションデータの依存関係 | |||
INT8 | INT4 | FP8 | INT8 | FP8 | ||
minmax | Y | Y | N | Y | Y | N |
gptq | Y | Y | N | N | N | Y |
awq | Y | Y | N | N | N | Y |
smoothquant | N | N | N | Y | Y | Y |
smoothquant+ | Y | Y | N | N | N | Y |
smoothquant_gptq | N | N | N | Y | Y | Y |
量子化アルゴリズムを選択するための推奨事項:
迅速に実験を行いたい場合は、キャリブレーションデータが不要で量子化プロセスが速い MinMax アルゴリズムを試してみることをお勧めします。
MinMax 量子化の精度が要件を満たしていない場合:
重みのみの量子化の場合は、gptq、awq、または smoothquant+ をさらに試すことができます。
act_and_weight 量子化の場合は、smoothquant または smoothquant_gptq をさらに試すことができます。
これらのうち、awq と smoothquant+ は gptq に比べて量子化プロセスに時間がかかりますが、場合によっては量子化精度の損失が小さくなります。 gptq、awq、smoothquant、smoothquant+ はすべてキャリブレーションデータを必要とします。
量子化精度をより良く維持したい場合は、ブロック単位の量子化を有効にすることをお勧めします。 ブロック単位の量子化は、量子化モデルのパフォーマンスをわずかに低下させる可能性がありますが、通常は 4 ビットの重みのみの量子化シナリオでは量子化精度が大幅に向上します。
上記の量子化精度が依然として要件を満たしていない場合は、fallback_ratio パラメーターを設定して浮動小数点演算に戻すレイヤーの割合を指定することにより、自動混合精度量子化を有効にすることができます。 これにより、各レイヤーの量子化感度が自動的に計算され、指定された割合の計算レイヤーがフォールバックされ、量子化精度が向上します。