大規模言語モデル推論を100倍高速化する量子化手法

大規模言語モデル推論を100倍高速化する量子化手法

本記事では、最新の研究論文に基づき、主流のGPUハードウェアと量子化アルゴリズムを用いた量子化推論の高速化の実現可能な方向性を探ります。現在の量子化スキームを背景に、このトピックを深掘りしていきます。

量子化の簡単な紹介

モデル量子化は、重みと活性化のビット幅を調整することでモデルサイズを削減するモデル圧縮技術です。これにより、計算負荷、GPUメモリI/O、占有量が低減され、レイテンシが短縮されスループットが向上します。次の図は、量子化がどのようにディープラーニングを高速化するかを示しています。

  • ステップ1: 重みと活性化のストレージがメモリからMatMul計算ユニットにロードされます。重みと活性化のビット幅はデータ転送レイテンシに大きな影響を与えます。
  • ステップ2: MatMul計算ユニットが行列乗算を実行します。ビット幅とフォーマットもレイテンシに影響します。
  • ステップ3: アキュムレータは通常、高精度な加算のために高いビット幅を持ちます。加算後、アキュムレータ内の値は再量子化される可能性があります(出力ビット幅は、次の処理ステップでメモリに送信および格納されるビット数を決定します)。

ディープラーニングアクセラレータの概要図

量子化スキームには主に2つのアプローチがあります。量子化認識トレーニング(QAT)と学習後量子化(PTQ)です。

  • QAT(量子化認識トレーニング)はオンライン量子化とも呼ばれ、トレーニング中に追加の計算を必要とします。量子化を逆伝播と組み合わせてモデルの重みを調整し、量子化されたモデルの精度を維持します。
  • PTQ(学習後量子化)はオフライン量子化とも呼ばれ、あらかじめ学習されたモデルを最小限または追加データなしで量子化します。このプロセスには、モデルの重みのスケーリングを含むキャリブレーションが含まれる場合があります。PTQには2つのタイプがあります。
    • ポスト動的量子化(PDQ)はキャリブレーションデータセットに依存しません。代わりに、量子化式を使用して各層を直接変換します。QLoRA(量子化認識低ランク適応)はこの方法を使用します。
    • ポストキャリブレーション量子化(PCQ)は、モデル内の各層の入出力に基づいて量子化重みを調整するために、代表的なデータセットを必要とします。GPTQ(生成的事前学習トランスフォーマー量子化)はこのアプローチを採用しています。

ハードウェアサポート

NVIDIAシリーズ

NVシリーズのカードは、CUDAエコシステムのおかげで、異なる精度とデータ型のサポートにおいて常に主導的な立場にあります。

AMDシリーズ

AMDのMI300シリーズカードは、一部のテストでH100を上回るパフォーマンス指標を示しており、次に有望な選択肢です。また、FP8タイプもサポートしています。

NVIDIAシリーズとAMDシリーズ以外に、国産カードもFP16やINT8などのデータ型に対して良好なサポートを提供しています(現在、FP8やその他のデータ形式のサポートは比較的不足しています)。ここではすべてを列挙しません。

LLM量子化における課題

簡単な比較から始めましょう。ResNet18とOPT-13Bモデルの両方に対して基本的なINT量子化を実行しました。ResNet18のパフォーマンスはほとんど影響を受けなかったのに対し、OPT-13Bは大きな損失を被りました。

なぜどちらもガウス分布に従うニューラルネットワークであるのに、このような違いが生じるのでしょうか?これは主に、LLMにおける外れ値や異常値に起因します。

単一のトランスフォーマーブロックは、自己注意モジュールと線形モジュールで構成されます。赤い接続は、トランスフォーマー内で外れ値が発生する問題の接続です。上のトランスフォーマー構造の赤いマーカーで示されているように、トランスフォーマーにおける量子化の問題はネットワークの非常に特定の部分で発生します。一部の全結合モジュール、特にネットワークの最後の数層では、層正規化の合計に大きな外れ値があります。単にこれらの外れ値を除去すると、ネットワークの精度が大幅に低下します。なぜなら、それらは特定の目的を果たしているからです。これらの外れ値は、次の層の注意機構をテキスト内の無意味なトークン(文の区切り、ピリオド、カンマなど)に集中させ、これらの特定のトークンが大幅に更新されないようにします。論文LLM.int8()によると、活性化には外れ値が存在し、その絶対値は非常に大きいことが明らかにされています。さらに、これらの外れ値は少数の特徴量に分布しており、創発的特徴量と呼ばれます。外れ値はモデルのパフォーマンスに大きな影響を与えることが知られており、直接破棄することは現実的な解決策ではありません。外れ値が存在するため、fp16の範囲は非常に広くなります。そのため、int8で表現する場合、各数値は広範囲のfp16を表現する必要があり、必然的に誤差が生じます。従来のCNNでもこの問題に取り組み、キャリブレーション手法を提案しています。具体的には、fp16値を統計的に分析し、KLダイバージェンスなどのアルゴリズムを使用して大きな値を破棄し、int8が表現する必要のあるfp16の範囲を狭め、精度を向上させます。破棄する具体的な量は、KLアルゴリズムを繰り返し適用して最適な範囲を見つけることで決定されます。幸いなことに、これらの外れ値は非常に特異的です。特定の注意ブロックにのみ現れ、それらのブロック内の1つの層にのみ現れ、それらの層内の少数の出力チャネルにのみ現れます。これらの外れ値は、データポイントごとに同じチャネルでも発生します([1,3])。上記の結論に基づき、LLM.int8()[1]は混合精度アルゴリズムを提案しています。

LLM.int8()の概略図

上の図に従うと、Xは各層の活性化を表し、行数は系列長、列数は隠れサイズです。図中の黄色い棒は外れ値を表し、その分布パターン(2つ目の結論)を視覚的に示しています。ベクトル単位の量子化の意味は、外れ値でない列についてはint8を使用して対称的に量子化することです。列を扱うため、行列乗算では、対応する重みWから対応する行を抽出してint8演算を行う必要があります。黄色い外れ値の列については、行と列の両方をfp16演算に使用します。最後に、2つの部分の結果を加算します。これは直接行列乗算と同等です。LLM.int8()の混合量子化方法により、精度はfp32とほぼ同じであり、実験結果のデータはここでは貼り付けません。

FP8とINT8

なぜ特にFP8とINT8を取り上げるのでしょうか?これは主に、Hopperアーキテクチャやテンソルコアのような最新のGPUアーキテクチャがFP8精度の計算をサポートしているためです。したがって、FP8量子化を探求する価値はあります。

テンソルコア (Hopper)
(a) 範囲または精度のいずれかに1ビットを割り当てる
(b) 複数のアキュムレータタイプと出力タイプをサポート

INT8はfp8と異なり、中間の指数を持たず、仮数のみを含みます。このデータ表現構造は、下図に示すように、一様分布を表現するのに適しています。

[4]によると、分布が非常に顕著な外れ値を示す場合、FP8-E4/FP8-E5形式の方が精度が高くなります。しかし、分布が良好でガウス分布に近い形状を示す場合、INT8またはFP8-E2/FP8-E3の方が良いパフォーマンスを示すと期待されます。

ここでは、いくつかの分布について「精度のビット数」: 反転および正規化されたRMSEをプロットします。上の図に示すように、一様分布ではINT8が最も優れています。正規分布ではFP8-E2が最適で、INT8がそれに続きます。ニューラルネットワークの多くの分布はガウス分布であり、分布の結果が非常に重要なパフォーマンス指標であることを示しています。外れ値が発生した場合にのみ、より多くの指数ビットを持つ形式がより良い結果をもたらします。最適な量子化器はLloyd-Max量子化器に基づいており、これらの分布に対して取得できます。ResNet18、MobileNetV2などのネットワークでは、層のほとんどがガウス分布形状であるため、FP8-E2やINTなどの形式でパフォーマンスが最適であり、FP8-E4やFP8-E5などの形式ではパフォーマンスが著しく低下します。また、ViTやBERTなどのトランスフォーマーモデルはFP8-E4で最適なパフォーマンスを示すことがわかります。これはまさに、トランスフォーマーの一部の層に非常に大きな外れ値があるためです。具体的には、一部の層では層正規化前の活性化に多くの外れ値があります。これらの外れ値はパフォーマンスに大きな影響を与えるため、クリッピング中にゼロ誤差が発生し、FP8-E4形式が最も優れたパフォーマンスを発揮し、FP8-E2/INT8形式は著しく劣ります。

では、FP8はLLMの分野でINT8に対して絶対的な優位性を持っているのでしょうか?結論はむしろ逆であり、主な理由は以下のとおりです。

  • 回路設計における固定小数点および浮動小数点の加算の原理によると、FP8 MACユニットはINT8ユニットよりも50%から180%非効率です。ワークロードが計算バウンドの場合、専用チップの処理速度が低下します。
  • ほとんどのネットワークでは、FP8はINT8よりもパフォーマンスが劣ります。多くの外れ値を持つトランスフォーマーのような構造であっても、混合精度や量子化認識トレーニングの手法で対処できます。

全体として、純粋な量子化の文脈では、FP8-E4やFP8-E5のような浮動小数点形式は、ディープラーニング推論のパフォーマンスと精度の面でINT8を代替することはできません。では、FP8形式の利点と位置付けはどこにあるのでしょうか?まず、FP8形式の利点をまとめます。

  • FP8テンソルコアは16ビットテンソルコアよりも高速です。
  • メモリ移動が削減されます。
  • モデルが既にFP8でトレーニングされている場合、デプロイがより便利です。
  • FP8はより広いダイナミックレンジを持ちます。
  • FP8からFP16/FP32/BF16への変換回路は、よりシンプルかつ直接的であり、INT8/UINT8からFPへの変換に必要な乗算と加算のオーバーヘッドがありません。

これらの利点に基づき、FP8は実際にはトレーニングに適していることが明らかです。[5]を参照すると、学習率や重み減衰などのハイパーパラメータを一切変更せずに、事前学習タスクと下流タスクの両方で、FP8を使用してトレーニングされたモデルは、BF16高精度トレーニングを使用してトレーニングされたモデルと同様のパフォーマンスを示します。注目すべきは、GPT-175Bモデルのトレーニング中に、TE法と比較して、H100 GPUプラットフォーム上で新たに提案されたFP8混合精度フレームワークにより、トレーニング時間を17%、メモリ使用量を21%削減できることです。

下流タスクにおけるゼロショットパフォーマンス。モデルは標準のBF16混合精度スキームまたは提案されたFP8低精度スキームのいずれかでトレーニングされています。

推論にFP8形式を使用してモデルを量子化すると、QATやPTQのプロセスを回避でき(精度低下を避けるため)、またFP8からFP16などの形式への変換効率が高いという利点も得られるため、推論パフォーマンスが大幅に向上します。

量子化の最良の費用対効果について: exllamav2プロジェクトと同様に、GPTQアルゴリズムに基づく2、3、4、5、6、8ビットの量子化をサポートしていますが、LLMにとって、どの長さと形式が量子化の最良の費用対効果を提供するのでしょうか?[6]を参照すると、さまざまなLLMアーキテクチャで広範な実験が行われ、異なるビット割り当てがモデルパフォーマンスに与える影響が決定されています。

125Mから176BパラメータのOPTモデルに対する、4つのデータセットにおける平均ゼロショットパフォーマンスのビットレベルのスケーリング則。固定モデルビットの場合、量子化精度を16ビットから4ビットに下げるとゼロショットパフォーマンスは着実に向上します。3ビットではこの関係が逆転し、4ビット精度が最適になります。

  • 特定のゼロショットパフォーマンスに対して、4ビット精度はほぼすべてのモデルシリーズとサイズで最適なスケーリングを提供します(4ビット精度はモデルパフォーマンスに大きな低下をもたらしません)。唯一の例外はBLOOM-176Bで、3ビットがわずかに優れたパフォーマンスを示しますが、大きな差ではありません。
  • 4ビット精度は現在、ビット単位で最も効果的な精度であり、同時に3ビット精度のパフォーマンスが改善される可能性があることを示しています。したがって、4ビット未満の低ビット精度に関する研究は価値のある方向性です。
  • ビットレベルの量子化に関する研究により、データ型とブロックサイズがビットレベルの量子化の効果に影響を与える重要な要因であることが明らかになりました。

以上に基づき、4ビット精度の量子化が現在最も費用対効果の高いソリューションであると結論付けられます。しかし、4ビットデータの中で、どのデータ型がより良い量子化結果をもたらすのでしょうか?[7]を参照すると、LLM-FP4法は、大規模言語モデル(LLM)に対するFP4量子化を学習後方式で提案し、重みと活性化を4ビット浮動小数点値に量子化します。既存のPTQソリューションは主に整数ベースであり、8ビット未満のビット幅では困難を伴います。整数量子化と比較して、浮動小数点(FP)量子化はより柔軟で、長い裾やベル型の分布をより適切に処理でき、多くのハードウェアプラットフォームでデフォルトの選択肢となっています。プロジェクト参照: https://github.com/nbasyl/LLM-FP4

FP量子化の特徴の1つは、そのパフォーマンスが指数ビットとクリッピング範囲の選択に大きく依存することです。LLM-FP4は、最適な量子化パラメータを探索することで、堅牢なFP-PTQベースラインを構築します。さらに、活性化分布にはチャネル間分散が高く、チャネル内分散が低いという特性があり、活性化量子化の難易度を高めています。この問題に対処するため、LLM-FP4はチャネルごとの活性化量子化を提案し、これらの追加のスケーリング係数を重みの指数バイアスに再パラメータ化でき、コストを無視できることを示しています。LLM-FP4は、LLaMA-13Bの重みと活性化を初めてわずか4ビットに量子化し、常識的なゼロショット推論タスクで平均スコア63.1を達成し、これは全サンプルよりわずか5.8低く、以前の最先端モデルを12.7パーセントポイント上回ります。具体的なデータは次の図にあります。

LLaMAモデルを用いた常識推論タスクにおけるゼロショットパフォーマンス。E/W/Aはそれぞれ単語埋め込み、モデル重み、活性化のビット幅を示します。

上の図から、以下の主な結論を導き出すことができます。

  • 活性化が量子化されておらず、単語埋め込みと重みが4ビットに量子化されている場合、LLM-FP4(FP型)はGPTQ(INT型)などのアルゴリズムよりもわずかに優れています。
  • 活性化が8ビットに量子化され、単語埋め込みと重みが4ビットまたは8ビットのいずれかに量子化されている場合、LLM-FP4(FP型)は他のアルゴリズム(INT型)と同様のパフォーマンスを示し、パフォーマンスに有意な差はありません。
  • 活性化が4ビットに量子化されている場合、LLM-FP4(FP型)は他のアルゴリズム(INT型)と比較して顕著な改善を示します。

結論として、活性化が4ビットに量子化されていない場合、現在のところFP4がINT4に対して大きな優位性があるとは言えません。

注目すべき量子化プロジェクト

GPTQ-for-LLaMa

  • GPTQを使用して量子化されたモデルは、速度面で大きな利点があります。簡単に言えば、GPTQはブロック内の各パラメータを個別に量子化し、各パラメータの量子化後、ブロック内の他のパラメータを調整して量子化による精度低下を補償します。
  • GPTQ量子化では、キャリブレーションデータセットを使用してモデルに学習後量子化を施し、量子化された重みを取得する必要があります。GPTQの概念は、1990年にYann LeCunが提案したOBDアルゴリズムに由来し、OBS、OBC(OBQ)などの手法で継続的に改良され、GPTQはOBQ法の高速化バージョンです。
  • GPTQ-for-LLaMaリポジトリは、LLaMa専用のGPTQ量子化ソリューションを提供します。GPU上でLLaMaモデルをデプロイする場合に推奨されます。
  • プロジェクトリンク: GPTQ-for-LLaMa

ExLlama

  • ExLlamaにはExLlamaとExLlamaV2の2つのバージョンがあり、現代のコンシューマー向けGPU上でローカルLLMを実行するための推論ライブラリとして機能します。
  • ExLlamaV2はV1と同様に4ビットGPTQモデルをサポートしますが、新しい「EXL2」形式も導入しています。EXL2はGPTQと同じ最適化手法に基づき、2、3、4、5、6、8ビットの量子化をサポートし、モデル内で量子化レベルを混合して、重みあたり2〜8ビットの任意の平均ビットレートを実現できます。
  • ExLlamaV2は各線形層に複数の量子化レベルを適用でき、スパース量子化に似たものを生成します。より重要な重み(列)はより多くのビットで量子化されます。ExLlamaが逐次モデルで効率的に動作するのを可能にするのと同じ再マッピング技術により、この混合形式はパフォーマンスにほとんど影響を与えずに実現できます。
  • 一般的に、ExLlamaは他の量子化アプローチと比較してわずかに高速な推論速度を提供します。
  • プロジェクトリンク: ExLlama

GGML

  • GGMLはGeorgi Gerganovによって作成されたC言語の機械学習ライブラリで、略称「GG」です。このライブラリはテンソルなどの機械学習の基本要素を提供するだけでなく、LLMを配布するための独自のバイナリ形式も提供します。
  • GGMLはC言語で記述されており、整数量子化(4ビット、5ビット、8ビット)および16ビット浮動小数点をサポートしています。
  • GGMLはllama.cppライブラリとシームレスに連携し、実践者がLLMの力を効果的に活用できるようにします。llama.cppライブラリの主な目的は、MacBook上でINT4量子化されたLLaMAモデルを使用できるようにすることです。
  • プロジェクトリンク: GGML

Transformer Engine

Transformer Engine (TE) は、NVIDIA GPU上でTransformerモデルを高速化するために設計されたライブラリであり、Hopper GPU上での8ビット浮動小数点(FP8)精度の使用を含み、トレーニングと推論の両方でより低いメモリ使用率で優れたパフォーマンスを提供します。TEは、人気のあるTransformerアーキテクチャ向けの高度に最適化されたビルディングブロックのセットと、フレームワーク固有のコードとシームレスに統合する自動混合精度クラスAPIを提供します。さらに、TEにはFP8サポートのためのフレームワークに依存しないC++ APIが含まれており、他のディープラーニングライブラリと統合できます。主な機能は次のとおりです。

  • FP8をサポートするTransformer層を構築するための使いやすいモジュール。
  • カーネル融合を含むTransformerモデルの最適化。
  • NVIDIA HopperおよびNVIDIA Ada GPUでのFP8サポート。
  • NVIDIA Ampere GPUアーキテクチャ以降のすべての精度(FP16、BF16)の最適化。

プロジェクトリンク: Transformer Engine

注意テストでは、te.LayerNormLinearをインポートし、注意計算の平均時間を測定できます。

ステージ モデル構造 データ形式 RTX 4090 RTX 3090
基本Attention PyTorchネイティブAttention FP16 92ms 183ms
基本Attention + TE LinearとLayerNorm tx置換 FP16 96ms サポート外
基本Attention + TEのLayerNorm最適化 TE.LayerNormLinear FP16 96ms サポート外
TEフル TEフルAttentionアルゴリズム FP16 74ms サポート外
TEフル + FP8 FP前方伝搬置換 FP8 42ms サポート外

テストの結論: Transformer Engineの場合、fp16を使用した基本Attentionアルゴリズムと比較して約20%の改善が見られました。また、fp8を使用した場合、大幅な54.5%の改善が見られ、推論パフォーマンスを向上させるために時間を投資する価値があることを示しています。

Bitsandbytes

Bitsandbytesは、カスタムCUDA関数の軽量ラッパーであり、特に8ビット演算、行列乗算(LLM.int8())、量子化関数に最適化されており、主にLLM.int8()量子化アルゴリズムをサポートしています。bitsandbytesライブラリは、分位数、線形、動的量子化などの量子化方法をサポートしています。これは利用可能な最もシンプルな方法の1つであり、量子化キャリブレーションデータやキャリブレーションプロセスを必要としません。torch.nn.Linearモジュールを含む任意のモデルで簡単に使用できます。現在の分析では、NF4(NormalFloatデータ型)とFP4は同等に効果的な4ビット量子化手法であり、推論速度、メモリ消費、生成コンテンツの品質など、同様の属性を示します。NormalFloatデータ型は、情報理論の観点から正規分布の重みの最適な表現を表す、強化された形式の量子化技術です。主にQLoRA法で4ビット精度でモデルを微調整するために使用されます。以下はQLoRAのデータです。

125Mから13BのOPT、BLOOM、LLaMA、Pythiaモデルにおける、異なるデータ型でのPile Common Crawl平均perplexity。

AIMET

AIMETは、Qualcommが提供する、ニューラルネットワークモデルの高度なモデル量子化および圧縮技術のためのライブラリです。精度への影響を最小限に抑えながら、計算要件とメモリ要件を削減し、推論速度を向上させることを目的としています。たとえば、Qualcomm Hexagon DSPで実行されるモデルは、Qualcomm Kyro CPUよりも5〜15倍高速になります。AIMETは、非NVIDIAハードウェアでの量子化実装の反映として機能します。通常、ハードウェアベンダーが提供する基本的な量子化機能を表し、現在のところ、異なるハードウェアプラットフォームに汎用的な量子化機能を提供する単一のプロジェクトはありません。

結論

4ビット量子化は現在、最も費用対効果の高い量子化スキームです。ただし、最適化は単語埋め込み、重み、活性化の量子化レベルによって異なります。ほとんどのシナリオでは、活性化が4ビットに量子化された場合を除き、整数(Int)量子化の方が費用対効果が高くなります(非量子化シナリオも含む)。したがって、特に活性化に焦点を当てた学習後量子化(PTQ)による低ビット量子化は、量子化を高速化するための有望な方向性です。INT8は現在最も一般的に使用されている量子化スキームです。INT8と比較して、FP8は量子化シナリオで完全に代替することはできませんが、モデルトレーニングに適しており、量子化を必要とせずに推論パフォーマンスの問題に対するソリューションを提供します。FP8関連技術をハードウェアテンソルコアと統合して推論速度を最大化することは、探求する価値のある新しい方向性です。GPTQアルゴリズムに基づくプロジェクトは、大規模言語モデル(LLM)の分野を支配しています。しかし、新しいデータ型(FP4やNF4など)、より低いビット精度、動的量子化は、革新と研究の機会を提供します。NVIDIA GPU以外にも、新しいGPUやCPU(AMD、国産GPU、Qualcommなど)は新たな機会をもたらします。量子化アルゴリズムを異なるハードウェアプラットフォームに迅速に適応させ、ハードウェアのパフォーマンスを最大化することは、探求すべき新しい方向性です。

参考文献

[1] LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale
[2] Outliers Dimensions that Disrupt Transformers Are Driven by Frequency
[3] Smoothquant: Accurate and efficient post-training quantization for large language models
[4] FP8 versus INT8 for efficient deep learning inference
[5] FP8-LM: Training FP8 Large Language Models
[6] The case for 4-bit precision: k-bit Inference Scaling Laws
[7] LLM-FP4: 4-Bit Floating-Point Quantized Transformers
[8] GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
[9] Understanding the Impact of Post-Training Quantization on Large Language Models
[10] QLoRA: Efficient Finetuning of Quantized LLMs

novita.ai は、Stable Diffusion APIと、10,000モデルに対応する数百の高速で最も安価なAI画像生成APIを提供しています。🎯 最速2秒で生成、従量課金制、標準画像あたり最低0.0015ドル、独自モデルの追加が可能でGPUメンテナンスは不要です。オープンソースの拡張機能を無料で共有できます。

おすすめの記事

  1. Stable Diffusion API: 包括的ガイド
  2. ChatGLM3: オープンソースチャットLLM