LLM におけるモデルの定量化と定量化の応用|Dewu Technology

1.モデル推論の最適化

さまざまなシナリオでのモデルの実装により、モデル推論の高速化は長い間 AI エンジニアリングの重要な部分になってきました。近年、Transformer アーキテクチャに基づく大規模なモデルが主流になり、さまざまなタスクで SoTA の結果が得られるようになり、トレーニングや推論にかかるコストが高くつくため、妥当なコストでの導入実践がさらに重要になっています。

大規模モデル推論が直面する課題には主に次の 2 点が含まれます。

  • 膨大なメモリ (ビデオ メモリ) 要件は主に、パラメータとモデル自体の推論に対する直接的な要件から生じます。
    • LLaMA2-30B モデルの場合、モデル自体をビデオ メモリにロードするには、推論プロセス中に約 60 GiB のビデオ メモリが必要です。単一トークンの KV キャッシュには、約 1.6MiB のビデオ メモリが必要です: 6656(layer dim) * 52()。レイヤー番号) *2 ( K & V) * 2(fp16、2 バイト); 2048 トークンのリクエストには、3.3GiB のビデオ メモリが必要です。
  • 生成プロセスは通常、タイミングの点でシリアルなプロセスであるため並列性が低く、デコードプロセスの並列化が困難であり、計算のボトルネックになります。

一般的な推論最適化手法には、知識蒸留 (KD)、枝刈り、量子化のほか、LLM メモリ最適化のために提案されたさまざまなソリューション (フラッシュ アテンション、ページ アテンションなど) が含まれます。

蒸留とは、小さなモデルをスチューデントモデルとして直接構築し、ソフトラベルと元のラベルの組み合わせを通じて元のモデルの知識を教師あり学習することを指します。これにより、小さなモデルは元のモデルと同等のパフォーマンスを持ち、最終的には元のモデルと置き換えられます。推論の効率を向上させるために、大きなモデルと小さなモデルを組み合わせます。

 

[画像出典: 知識の蒸留: 調査、2021 年、p2]

枝刈りは、モデル内の重要でない重みを枝刈りすることによってモデルを「スリム化」し、モデルの推論効率を向上させます。モデルの機能を確保するには、通常、枝刈りプロセスにトレーニング データに基づくモデルの微調整も伴う必要があります。 。枝刈り重みの異なる次元に応じて、構造化枝刈りと非構造化枝刈りに分けることができます。

  • 構造化された枝刈り: 通常、重みテンソルの 1 つまたは複数の次元に従ってブロック内の重要でないチャネルを枝刈りし、通常の行列乗算を維持します。ただし、枝刈りされたチャネルは上位層と下位層の推論に影響を与えるため、ネットワークの論理精度が必要になります。チェックしてください。
  • 非構造化枝刈り: 重みテンソル内の重要でない要素をランダムに枝刈りするため、通常は元の重み構造が維持され、その結果、乗算計算が疎になりますが、汎用ハードウェアには適していないため、高速化するには特別なハードウェアが必要です。

現時点では、LLM での枝刈りの適用例はほとんどありません。たとえば、Activation-aware [1] に基づく次の枝刈り作業は、主に重み自体の絶対値と入力テンソルの絶対値に基づいて非構造化枝刈りを実行します。重みテンソル自体が疎になるため、モデルの精度の低下がエンジニアリング要件を満たすことができなくなります。

 

[画像ソース: 大規模言語モデルに対するシンプルで効果的な枝刈りアプローチ、2021、p2]

以下に示すように、構造化枝刈りに関する最近の研究 [2] では、検索手法を使用してモデル内の部分構造を見つけ、再学習を通じてモデルの精度を維持していますが、枝刈りされたモデルの精度は元のモデルと比較して大幅に低下します。同じ数のパラメーター (枝刈り後) を持つ他のより小さなモデルと比較して、その方法の重要性を示します。

 

[画像ソース: Sheared LLaMA: 構造化枝刈りによる言語モデルの事前トレーニングの加速、2023、p3]

 

[画像ソース: ハグフェイス/Sheared-llama-1.3B]

定量化がニューラル ネットワークと LLM の最初の選択肢となっている理由は、次の利点があるためです。

  • ビデオ メモリの削減を直感的に反映します。
    • 一般に、LLM 重みは FP16 に保存され、重みが int4 に量子化された後、ボリュームは直感的に元のサイズの 1/4 に縮小されます (実際には、非定量化埋め込み、メモリ割り当てなどによりわずかに大きくなる可能性があります)理由)、ビデオ メモリのリソース要件が大幅に削減されました。
  • W4A16 や W8A16 などの演算子の高速化により、計算速度が向上します。

2.定量化の概要

ベース

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

量子化パラメータは通常、スケールとゼロポイントの 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 値に基づいて対称であることです。つまり、上記の式のゼロ点は 0、qmax = -qmin となり、次の式が成立します。量子化の形式がより簡素化されました。

非対称量子化は、量子化範囲を最大限に活用するのに有益です。たとえば、Conv+ReLU によって出力される励起テンソルはすべて正の値を持ち、対称量子化が使用される場合、すべての浮動小数点は [0 ~ 127] の範囲にマッピングされ、範囲の半分は使用されず、その量子化精度は保証されません。非対称量子化と同じくらい優れています。

 

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

実際には、重みテンソルに対して対称量子化を実行し、入力テンソルに対して非対称量子化を実行することがよく選択されます。以下は、クアルコムの量子化ホワイト ペーパーからの分析です。たとえば、線形層の行列乗算を例として、重みと入力の両方に非対称量子化が選択されている場合、式は次のように展開されます。

 

  • 最初の項目は整数テンソルの乗算演算であり、これは必要な即時演算です。
  • 3 番目と 4 番目の項目の演算には、スケール、ゼロ、および整数の重みの乗算が含まれます。これらはすべて事前に予測されるため、事前に計算してオフセットとして追加できます。
  • 2 番目の項目の計算は x{int} に依存します。x{int} は推論ごとにすぐに計算する必要があるため、追加の計算能力が必要になります。

したがって、重み量子化を対称量子化 (zW=0) に変更すると、上記の式は次のように簡略化され、リアルタイム計算では最初の項目の行列乗算のみを計算する必要があり、2 番目の項目は行列乗算になります。事前に計算されたバイアス項目:

 

両方が対称的に量子化される場合、式は次のように簡略化されます。

 

元のモデルの浮動小数点計算 W{x} を比較すると、W{int}x{int} は、Nvidia GPU では前者よりもはるかに高速です。これは量子化されたモデルです。スピードが大幅に加速します。

3. LLM の定量化

LLM 量子化における課題

モデルのパフォーマンスの観点から見ると、量子化が最初から最後まで解決しなければならない前提の 1 つは、量子化されたモデルの精度をどのように維持するか、つまり、モデルのユーザーに、量子化されたモデルが元のパフォーマンスを維持しながらも、パフォーマンスを向上させることができると感じさせるかということです。推論効率。

ニューラル ネットワークで定量化する必要がある操作は、主に畳み込み層 Conv(x;W) と全結合層 Wx、つまり重み量子化 (WQ) と、説明した操作によるそれぞれ W と x の励起です。前のパートの定量化 (アクティベーション量子化、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]

行列の乗算では、入力テンソル ) と 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 もそれに応じて 2 次元で再配置されます。
  • 逆 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 による Pygmalion-7B の複雑性 [7]

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

オペレーター

厳密に言うと、重みのみに基づく W4A16 は、元の W16A16 と比べてあまり効率が改善されていません。また、重みのみが LLM 定量化の主流となり、その適用が増加しているため、推論にクオント/デクォント プロセスも追加されています。量子化アルゴリズムの推論を高速化するために、W4A16 の効率的な演算子の作成に基づいたオープン ソースの作品が数多くあります。たとえば、GPTQ の Python パッケージ AutoGPTQは、量子化乗算の並列計算を書き直すオープン ソース ツール exllama に統合されています。トリトンとCUDAに基づいています。 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 で、Weight の定量化プロセスで Activation 値の影響が考慮されることを意味します。開始点は、Weight の各チャネルにおいて、対応する Activtion 値が大きいチャネルが相対的に重要であり、その逆も同様であり、その重要性とその値を反映するためにスケーリング係数 Δ が乗算されるという事実に基づいています。 Δの値は次の値に等しい。範囲は入力アクティベーションのテンソル値によって設計される。

 

探索の測定基準は、線形層量子化の前後の出力結果の比較に基づいており、MSE 結果が最も小さいものが最適解となります。

 

効果

モデルのパフォーマンスに関しては、レイヤーごとのスケール検索によって最適なスケーリング係数が見つかり、量子化誤差が最小のソリューションが得られます。AWQ 論文の次の効果比較は、2 世代の Llama のテストにおける定量化結果を示しています。 Perplexity の観点からは、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.x ~ 3.x 倍の速度向上にすぎませんが、実際の導入効果はこの値よりも低い可能性があり、その加速効果は W4A4、W8A8、およびその他の全整数乗算演算子の従来の量子化方法よりもはるかに劣ります。 。

一般に、LLM の分野での定量的な作業はまだ暫定的なものであり、実際のタスクでモデルのパフォーマンス精度が非常に高い場合は、KV キャッシュのみに基づいたアルゴリズムとツールを使用して、ユニット メモリのスループットを向上させることをお勧めします。フラッシュ アテンション-2、ページド アテンションなど。

5.参考資料

1. 大規模言語モデルに対するシンプルで効果的な枝刈りアプローチ、2023 年。

2. Sheared LLaMA: 構造化プルーニングによる言語モデルの事前トレーニングの加速、2023 年。

3. ニューラル ネットワーク量子化に関するホワイト ペーパー、2021 年。

4. SmoothQuant: 大規模言語モデルの正確かつ効率的なポストトレーニング量子化、2023 年。

5. GPTQ: 事前トレーニング済み生成トランスフォーマーの正確なポストトレーニング量子化、2023 年。

6. AWQ: LLM 圧縮および加速のためのアクティベーション対応重み量子化、2023 年。

7. GPTQ パフォーマンスに関する評価。

 

※文/シュジオン

この記事は Dewu Technology によるものです。さらに興味深い記事については、Dewu Technology 公式 Web サイトをご覧ください。

Dewu Technology の許可なく転載することは固く禁じられています。さもなければ、法律に従って法的責任が追及されます。

Google Python Foundation チームが解雇されたことを Google が確認し、Flutter、Dart、Python に関与するチームが GitHub のホット リストに殺到しました - オープンソースのプログラミング言語とフレームワークはどうしてこんなにも魅力的なのでしょうか? Xshell 8 ベータ テストを開始: RDP プロトコルをサポートし、Windows 10/11 にリモート接続 できる Rail WiFi の最初の長期サポート バージョン 8.4 GA AI 検索ツール Perplexica : 完全にオープンソースで無料、Perplexity の代替となるオープンソースの価値をファーウェイ幹部が評価 : 継続的な抑制にもかかわらず、依然として独自のオペレーティング システムを持っています。ドイツの自動車ソフトウェア会社 Elektrobit がUbuntu をベースとした自動車オペレーティング システム ソリューションをオープンソース化しました。
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5783135/blog/11066139