HUOXIU

モデル量子化とLLMへの応用 | Dewu Technology

出典:デウーテクノロジー


目次

I. モデル推論の最適化

II. 定量分析入門

1. ベース

2. 対称/非対称

III. LLMの定量化

1. LLM量子化における課題

2. GPTQ

2.1 定量化プロセス

2.2 グループサイズ

2.3 desc_act の並べ替え

2.4 演算子

3. AWQ

3.1 検索

3.2 効果

IV. 要約

V. 参考文献

1つ

モデル推論の最適化

様々なシナリオにおけるモデルの実用化に伴い、モデル推論の高速化は長年AIエンジニアリングの重要な側面となっています。近年、Transformerアーキテクチャに基づく大規模モデルが主流となり、様々なタスクにおいてSoTA(社会的独立性と真に独立性)の性能を達成しています。しかし、学習と推論にかかるコストが高いため、合理的なコストでの導入がますます重要になっています。
大規模モデル推論が直面する主な課題は次のとおりです。
  • 膨大なメモリ (GPU メモリ) 要件は、主にモデルのパラメータと推論の即時のニーズから生じます。
    • LLaMA2-30Bモデルの場合、モデル自体のロードには約60GiBのビデオメモリが必要です。推論中は、1トークンのKVキャッシュに約1.6MiBのビデオメモリが必要です(6656(レイヤー次元)* 52(レイヤー番号)* 2(KとV)* 2(fp16、2バイト)。2048トークンのリクエストでは、3.3GiBのビデオメモリが必要です。
  • 生成プロセスは通常、時間的に順次的なプロセスであるため並列性が低く、デコードプロセスの並列化が困難で、計算のボトルネックになります。
一般的な推論最適化手法には、知識蒸留 (KD)、プルーニング、量子化のほか、LLM のメモリ最適化のために提案されているさまざまなスキーム (Flash Attention、Paged Attention など) が含まれます。
蒸留とは、小さなモデルを学生モデルとして直接構築し、ソフトラベルと元のラベルを組み合わせることで、元のモデルの知識の学習を監督するプロセスを指します。これにより、小さなモデルは元のモデルに匹敵する性能を持つようになり、最終的には小さなモデルが大きなモデルに置き換えられ、推論効率が向上します。

[画像出典: Knowledge Distillation: A survey、2021年、p2]

一方、プルーニングは、重要でない重みを削除することでモデルを「スリム化」し、推論効率を向上させます。モデルの能力を確保するために、プルーニングプロセスでは通常、トレーニングデータに基づいてモデルを微調整します。削除される重みの次元に応じて、プルーニングは構造化プルーニングと非構造化プルーニングに分けられます。
  • 構造化プルーニング: 通常、重要でないチャネルは、通常の行列乗算を維持しながら、重みテンソルの 1 つ以上の次元に沿ってブロック単位でプルーニングされます。ただし、プルーニングされたチャネルは上位層と下位層の推論に影響を与えるため、ネットワークの論理的正確性を確認する必要があります。
  • 非構造化プルーニング:重みテンソルから重要でない要素をランダムに削除することで、通常は元の重み構造を維持し、スパースな乗算計算を実現します。ただし、汎用ハードウェアとは互換性がないため、高速化には専用のハードウェアが必要です。
現在、LLMにおいてプルーニングはほとんど用いられていない。例えば、Activation-aware[1]に基づく以下のプルーニング手法では、主に重みの絶対値と入力テンソルの絶対値を用いて非構造化プルーニングを行っているため、重みテンソル自体がスパースになっているが、モデルの精度低下はエンジニアリングの要求を満たすことができない。

[画像出典: 大規模言語モデルのためのシンプルで効果的な剪定アプローチ、2021年、p2]

下図に示すように、構造化プルーニングに関する最近の研究[2]では、モデル内の部分構造を探索する手法を用いて、モデルの精度を維持するために再学習を行っています。プルーニングされたモデルの精度は元のモデルに比べて大幅に低下しています。この手法の有効性を示すには、同じパラメータ数(プルーニング後)を持つ他の小規模モデルと比較することしかできません。

[画像出典: Sheared LLaMA: 構造化プルーニングによる言語モデルの事前トレーニングの加速、2023年、p3]

[画像出典: huggingface/Sheared-llama-1.3B]

ニューラル ネットワークと LLM で量子化が優先されるようになった主な理由は次のとおりです。
  • ビデオメモリの減少の最も明白な兆候。
    • 通常、LLM の重みは FP16 を使用して保存されますが、重みが int4 に量子化された後、サイズは直感的に元の 1/4 に縮小されます (実際には、埋め込みが量子化されていないことやメモリ割り当てなどの理由により、サイズが若干大きくなる場合があります)。これにより、ビデオ メモリのリソース要件が大幅に削減されます。
  • W4A16 演算子と W8A16 演算子が高速化され、計算速度が向上します。

定量分析入門

ベース

量子化の本質は通常、モデルのパラメータ、またはモデルの推論プロセス全体を浮動小数点から整数に変換することです。

量子化パラメータは通常、スケール(浮動小数点)とゼロ点(整数)の2つの値で構成されます。xをテンソル(重みまたは推論における中間変数)とすると、その量子化プロセスは次のように表すことができます。

b は量子化ビット幅、q{min} と q{max} は整数値の範囲を表します。たとえば、int-8 の量子化は [-128, 127] の範囲を取ります。つまり、q{min}=-2^(b-1)=-128、q{max}=2^(b-1)-1=127 です。clamp(a;q{min},q{max}) は入力値 a が [q{min}, q{max}] の範囲に基づいて切り捨てられることを意味します。x{int} は量子化された結果を表し、s と z は量子化パラメータのスケールとゼロ点を表します。
[画像出典: 効率的なニューラルネットワーク推論のための量子化手法の調査、2021年、p5; 大規模言語モデルの量子化入門、p12]
整数から浮動小数点への逆量子化プロセスは次のとおりです。
量子化パラメータに関しては、多くのアルゴリズムが検索、最適化、LKD(レイヤーごとの蒸留)などに基づいて最適なソリューションを計算し、量子化による精度の低下を最小限に抑えます。一方、スケールを計算する最も直接的な方法は、テンソル要素の最小値/最大値に基づいています。
以下は、テンソル x を fp32 から int8 に量子化し、その後 fp32 に逆量子化する方法を示す簡単なコード例です。
プロセス x->x{int}->x_hat の例は次のとおりです。
量子化前 x:
量子化されたx_hat:

対称/非対称

非対称量子化と比較して、対称量子化はゼロに対称な整数範囲をマッピングするものとして定義されます。つまり、上記の式のゼロ点は 0、qmax = -qmin であり、量子化の表現が簡素化されます。
非対称量子化は、量子化範囲を最大限に活用できるという利点があります。例えば、Conv+ReLUによって出力される励起テンソルは正の値を持ちます。対称量子化を使用すると、浮動小数点値は[0~127]の範囲にマッピングされ、範囲の半分が未使用になります。その量子化精度は非対称量子化ほど高くありません。

[画像出典: 効率的なニューラルネットワーク推論のための量子化手法の調査、2021年、p5]

実際には、重みテンソルには対称量子化が、入力テンソルには非対称量子化が選択されることが多いです。Qualcommの量子化に関するホワイトペーパーに掲載されている以下の分析は、重みと入力の両方が非対称量子化されている場合の線形層における行列乗算の式を拡張する方法を示しています。
  • 最初の項目は整数テンソルの乗算演算であり、これは必要な即時演算です。
  • 3 番目と 4 番目の操作には、スケーリング、ゼロ化、および整数の重みの乗算が含まれます。これらはすべて事前にわかっているため、バイアスとして事前に計算できます。
  • 2 番目の項の計算は x{int} に依存しますが、これは推論ごとにオンザフライで計算する必要があり、これにより追加の計算能力が必要になります。
したがって、重み付き量子化を対称量子化(zW = 0)に変更すると、上記の式は次のように簡略化されます。つまり、計算中は最初の項の行列乗算のみを計算し、2 番目の項は事前に計算されたバイアス項になります。
両方が対称的に量子化されている場合、式は次のように簡略化されます。
元のモデルの浮動小数点演算 W{x} と比較すると、W{int}x{int} は整数乗算であり、Nvidia GPU でははるかに高速です。これが、量子化モデルの推論速度が大幅に向上した理由です。

三つ

LLMの量子化

LLM量子化における課題

モデル性能の観点から、量子化が最初から解決しなければならない前提は、量子化モデルの精度をどのように維持するか、つまり、モデルのユーザーが、量子化モデルが推論効率を向上させながら本来の性能を維持できると感じられるようにすることです。
ニューラル ネットワークで量子化を必要とする操作は主に畳み込み層 Conv(x;W) と完全接続層 Wx であり、前のセクションで説明したように、主に W と x に対して実行される重み量子化 (WQ) と活性化量子化 (AQ) です。
CNNモデルや小規模なTransformerモデルとは異なり、大規模なTransformerモデルでは、行列乗算によって生成される活性化テンソルには通常、多くの外れ値(値の分布の大部分から大きく外れた値)が含まれます。これらの要素は絶対値が大きいものの、割合が低いため、量子化の難易度が高くなります。外れ値をどのように扱うかは、量子化においてしばしば大きな課題となります。外れ値を過度に考慮すると、量子化範囲が過度に大きくなり、量子化の表現範囲が狭まる可能性があります。一方、外れ値を過度に切り捨てると、その絶対値が大きいため、モデルの推論結果に大きな影響を与え、モデル性能の低下につながる可能性があります。後者は特にLLM量子化において顕著です。
以下の図は、それぞれResNet18とOpt-13Bのある層の入力テンソルの要素ごとの値を示しています。シグマは分布の標準偏差を表しています。ResNet18の入力の最大値は約28シグマで、6シグマの絶対値から外れた値の割合は0.05%未満です。これに対し、Opt-13Bネットワーク入力の最大値は約325シグマで、6シグマの絶対値から外れた値の割合は0.2%未満です。量子化性能の点では、ResNet18はint-8の精度にほとんど損失がないのに対し、Opt-13Bのint-8モデルの精度は崩壊しています。

[画像出典: 大規模言語モデルの量子化入門、p20]

インセンティブ量子化の課題に対処するために、SmoothQuant が提案したアプローチなど、量子化の精度を下げようとするソリューションもあります。

[画像出典: SmoothQuant、p4]

行列の乗算において、入力テンソルXの値を比例的に減らし、その削減率を重みテンソルWに割り当てることで削減を補います。これにより、問題はXとWの量子化から、X·diag(s^(-1))とdiag(s)·Wの量子化へと変換されます。これにより、テンソルXの量子化難易度が低減されると同時に、乗算演算の積は変化しません。しかし、実際のエンジニアリングにおいては、この方式による量子化誤差は、int-8精度の量子化であっても、大規模モデルの推論性能に依然として大きな影響を与えます。例えば、Llama2-7BへのSmoothQuantの適用結果は、そのパープレキシティが非常に低く、実用化が難しいことを示しています。
したがって、現在のエンジニアリング展開における最も実用的なソリューションは、アクティベーションの量子化を放棄した重みのみの量子化スキームに基づいています。

GPTQ

GPTQは、エンジニアリング展開に採用された最初の量子化方式です。W8A16またはW4A16の量子化効果は、ほとんどのシナリオにおいて元のモデルに近く、量子化プロセスも非常に高速です。

定量化プロセス

行列乗算の基本単位演算を例にとると、重みのみの量子化の前後の積の平均二乗誤差に基づいて、次の最適化関数を記述できます。
WはTransformerの線形層の重みを表し、Xは対応する入力を表します。オフライン量子化プロセスは、モジュール(Transformer)ごと、層(Q、K、V、O、Fc1、Fc2)ごとに実行されます。
パラメータとデータは次のように定義されます。
  • W∈R^{K×M}、X∈R^{M×N}、Y=W×X∈R^{K×N}
  • キャリブレーション セット: データの一部は推論に使用され、各レイヤーの入力テンソルの値の範囲を調べ、それに応じて量子化します。
具体的な定量化プロセスは以下のとおりです。
  • ヘッセ行列(バックプロパゲーションのヘッセ行列ではなく、W_hat の上記の最適化関数のヘッセ行列)を計算し、摂動項を追加します。
  • `act order sort(desc_act, 類似する値の範囲を持つ列は一緒に量子化されます)` は、`diag(H)` に基づいて `W` の列を `M` 次元に沿って並べ替えます。同様に、`H` も両方の次元に沿って並べ替えられます。
  • H^(-1) の逆関数を求めます(コレスキー分解)。
  • M次元に沿ったWについて、ブロックサイズB=128で、左から右へブロックごとに量子化します。右側の量子化されていない部分は、量子化損失を補償するためにH^(-1)に基づいて更新されます。
  • (内部ループ) 各ブロックについて、列ごとに量子化し、誤差を計算し、その誤差に基づいてそのブロック内の量子化されていない列を更新します。

  • 外側のループがブロックでの操作を完了すると、後続のすべての列が更新されます。

グループサイズ

  • グループサイズが指定されていない場合、デフォルト値はg=-1です。これは、列ごとに量子化パラメータをカウントし、各行の重みを量子化します。W∈R^{K×M}の場合、量子化パラメータの数はK×1です。

  • グループサイズ(例えばg=128)が指定された場合、量子化パラメータは128列単位でカウントされ、各行の重みが量子化されます。W∈R^{K×M}の場合、量子化パラメータの数はK×(M/g)です。

並べ替え desc_act

ヘッセ行列Hに基づき、Wの列はdiag(H)に基づいてM次元に応じて並べ替えられます。これは、絶対値の大きい活性化の重みに対応する列を優先的に量子化するためです。これらの列は推論結果に大きな影響を与えると考えられるため、これらの列を量子化する際に発生する誤差を可能な限り小さくし、量子化誤差を後の重要度の低い列に多く転嫁することが望ましいと考えられます。
いくつかの実験では、desc_act はほとんどのタスクにおける量子化損失に対する効果的なトリックであることが示されています。

GPTQによるピグマリオン7Bの困惑度[7]

[画像出典: https://huggingface.co/reeducator/vicuna-13b-free/discussions/22]

オペレーター

厳密に言えば、重みのみのW4A16はオリジナルのW16A16と比べて大幅な効率向上は見られず、推論中に量子化/逆量子化処理も追加されます。しかし、重みのみの量子化がLLM量子化の主流となり、その応用が拡大するにつれて、多くのオープンソースプロジェクトがW4A16をベースにした効率的な演算子を作成し、量子化アルゴリズムの推論を高速化しています。例えば、GPTQ用のPythonパッケージAutoGPTQは、TritonとCUDAに基づく量子化乗算の並列計算を書き換えるオープンソースツールexllamaに統合されています。exllama/exllama_ext/matrix.cuhでは、`dot_product8_h`における`out = W_hat·x = (W{int}-z)s·x = (W{int}-z)x·s`の実装を見ることができます。

[画像出典: https://github.com/turboderp/exllama/blob/3b013cd53c7d413cf99ca04c7c28dd5c95117c0d/exllama_ext/matrix.cuh#L86]

AWQ

最適化問題に基づいてソリューションを設計する GPTQ と比較して、AWQ は検索に基づく量子化ソリューションです。
Q(·) を量子化と逆量子化のプロセスとします。変更前の量子化プロセスは以下のとおりです。
修正された量子化プロセスは次のようになります。W のスケーリングが追加されています。

検索

AWQはActivation-aware Weight Quantization(活性化を考慮した重み量子化)の略で、重み量子化プロセスにおける活性化値の影響を考慮します。その前提は、様々な重みチャネルのうち、対応する活性化値が大きいチャネルは相対的に重要であり、その逆もまた同様であるということです。この重要性は、入力活性化テンソル値に基づいて設計されるスケーリング係数Δを乗算することで反映されます。Δの値と範囲は、入力活性化テンソル値に基づいて設計されます。
検索メトリックは、線形層の量子化の前後の出力結果の比較に基づいており、MSE が最小のソリューションが最適なものとなります。

効果

モデル性能の観点からは、層ごとのスケール探索によって最適なスケーリング係数が求められ、量子化誤差が最小となる解が得られます。AWQ論文における以下の性能比較は、パープレキシティの観点から、Llamaの2世代の量子化結果がGPTQおよびソート版GPTQの結果よりもわずかに優れていることを示しています。

[画像出典: AWQ、p6]

実際のタスクにおける精度では、AWQ の精度は GPTQ の act_order バージョン (GPTQ-R) に匹敵しますが、速度は優れています。

[画像出典: AWQ、p5]

計算性能の観点では、GPTQは並べ替え演算を持つため、行列乗算はMV(行列×ベクトル)となり、非連続なメモリアクセスを伴います。AWQは並べ替え演算を持たないため、行列乗算は(行列×行列)となり、高速化されます。

4つ

要約

LLM 量子化の現在の最先端 (SOTA) パフォーマンスは、主に重みのみの量子化に基づいており、モデル実行に必要な GPU メモリの削減が主な貢献となっています。
モデルのパフォーマンスの観点から見ると、避けられない量子化損失と、LLM モデルが通常従来の CNN モデルよりも量子化に対してはるかに敏感であることから、量子化された LLM モデルのパフォーマンスは多くのタスクで量子化されていないモデルのパフォーマンスとそれほど変わりませんが、一部のタスクでは依然として良好なパフォーマンスを発揮できない可能性があります。
モデル高速化の観点から見ると、重みのみの量子化は、主にW4A16、W3A16、W8A16などの乗算演算子に重点を置いた高速化の取り組みにつながっています。論文の理論データでは、FP16モデルと比較して1倍から3倍の高速化しか示されていませんが、実際の実装結果はこれよりも低くなる可能性があります。この高速化効果は、W4A4やW8A8などの完全整数乗算演算子を使用する従来の量子化手法に比べてはるかに劣ります。
全体として、LLM分野における量子化研究はまだ初期段階にあります。実用的なタスクにおいてモデルの精度要件が非常に高い場合は、Flash Attention-2やPaged Attentionなど、KVキャッシュに基づいてGPUメモリ単位あたりのスループットを向上させるアルゴリズムやツールの使用がより推奨されます。

参照

1. 大規模言語モデルのためのシンプルで効果的な剪定アプローチ、2023 年。
2. Sheared LLaMA: 構造化プルーニングによる言語モデルの事前トレーニングの加速、2023 年。
3. ニューラルネットワーク量子化に関するホワイトペーパー、2021年。
4.   SmoothQuant: 大規模言語モデルのための正確かつ効率的なトレーニング後の量子化、2023 年。
5.   GPTQ: 生成的事前トレーニング済みトランスフォーマーの正確なトレーニング後量子化、2023 年。
6. AWQ: LLM 圧縮および加速のためのアクティベーションを考慮した重み量子化、2023 年。
7. GPTQ のパフォーマンスに関するいくつかの評価。