重み圧縮

重み圧縮によるモデル効率の向上

重み圧縮は、モデルのメモリー使用量を削減することを目的としています。また、大規模言語モデル (LLM) など、メモリーに依存する大規模なモデルのパフォーマンスが大幅に向上する可能性もあります。LLM やその他のモデルは、推論中に重みを保存する大量のメモリーを必要とするため、次の方法で重み圧縮の利点を得られます。

  • デバイスのメモリーに格納できない大規模なモデルの推論を可能にします。

  • 線形レイヤーなどの重みを使用した演算を行う際のメモリー・アクセス・レイテンシーを短縮することで、モデルの推論パフォーマンスを向上させます。

現在、ニューラル・ネットワーク圧縮フレームワーク (NNCF) は、主に LLM の最適化向けに設計された圧縮方法として、8 ビットおよび 4 ビット整数データタイプへの重み量子化を提供しています。重み圧縮とフルモデル量子化の主な違いは、重み圧縮はアクティベーションが浮動小数点のままであるため、精度が向上することです。LLM の重み圧縮は、完全なモデル量子化のパフォーマンスに匹敵する推論パフォーマンスの向上をもたらします。さらに、重み圧縮はデータに依存せず、キャリブレーション・データセットも必要としないため、容易に利用できます。

モデルの重みを圧縮

  • 8 ビット重み量子化 - この方法は、正確なモデルの最適化を目的としており、通常、トランスフォーマー・ベースのモデルのパフォーマンスを大幅に向上させます。8 ビット圧縮重みを持つモデルは、サポートされる CPU および GPU プラットフォームの大部分でパフォーマンスの利点が得られます。

以下のコードは、NNCF を使用して OpenVINO IR モデルの重みを 8 ビット量子化する方法を示しています。

from nncf import compress_weights

...
model = compress_weights(model) # model is openvino.Model object

これで、モデルをコンパイルして推論する準備が整いました。圧縮形式で保存することもできるため、バイナリーファイルのサイズが小さくなります。

  • 4 ビット重み量子化 - これは、INT4-INT8 混合精度重み量子化を表し、INT4 が主精度、INT8 がバックアップ精度と見なされます。通常、これによりモデルサイズがさらに小さくなり、推論レイテンシーは低くなりますが、モデルによっては精度の低下が大きくなります。この方法には、最適化後にさまざまなパフォーマンスと精度のトレードオフを制御するパラメーターがあります。

    • mode - ここでは 2 つのモードから選択できます。

      • INT4_SYM - 対称重み量子化を表し、推論の高速化とモデルサイズの縮小を実現します。
      • INT4_ASYM - 可変ゼロ点を使用した INT4 非対称重み量子化により、より正確な結果が得られます。
    • group_size - 同じ量子化パラメーターを共有する重みのグループのサイズを制御します。モデルサイズが小さいほど、最適化されたモデルはより正確になりますが、フットプリントが大きくなり、推論が遅くなります。次のグループサイズが推奨されます: 1286432 (デフォルトは 128 です)。

    • ratio - モデル内の INT4 圧縮レイヤーと INT8 圧縮レイヤーの比率を制御します。例えば、0.8 は、レイヤーの 80% が INT4 に圧縮され、残りが INT8 精度に圧縮されることを意味します。

    • dataset - データを意識した重み圧縮のためのキャリブレーション・データセット。これにはいくつかの圧縮オプションがあります。例えば、一部のタイプの sensitivity_metric では精度の選択にデータを使用できます。

    • sensitivity_metric - ビット幅選択アルゴリズムにおける圧縮レイヤーの感度を推定するためのメトリックを制御します。一部のメトリックでは、データセットの提供が必要です。次のタイプがサポートされます。

      • nncf.SensitivityMetric.WEIGHT_QUANTIZATION_ERROR - 反転 8 ビット量子化ノイズとして計算されるデータフリー・メトリック。このメトリックの最高値を持つ重みは、チャネルごとに 8 ビットに正確に量子化されます。これらの重みを 8 ビットのままにして、残りのレイヤーをグループごとに 4 ビットに量子化します。グループ単位のほうがチャネル単位よりも正確であるため、精度が低下することはありません。

      • nncf.SensitivityMetric.HESSIAN_INPUT_ACTIVATION - データセットを必要とします。8 ビット量子化ノイズの L2 ノルムを乗算したレイヤーごとの量子化誤差に対する重みの平均ヘシアントレース。

      • nncf.SensitivityMetric.MEAN_ACTIVATION_VARIANCE - データセットを必要とします。レイヤーの入力の平均分散に、反転 8 ビット量子化ノイズを乗算したもの。

      • nncf.SensitivityMetric.MAX_ACTIVATION_VARIANCE - データセットを必要とします。レイヤーの入力の最大分散に、反転 8 ビット量子化ノイズを乗算したもの。

      • nncf.SensitivityMetric.MEAN_ACTIVATION_MAGNITUDE - データセットを必要とします。レイヤーの入力の平均値に、反転 8 ビット量子化ノイズを乗算したもの。

    • all_layers - モデル内の最初と最後のレイヤーを含む、すべての全結合レイヤーと埋め込みレイヤーの INT4 重み量子化を有効にするブール・パラメーター。

    • awq - AWQ メソッドで正確な INT4 重み量子化を可能にするブール・パラメーター。すべてのレイヤーの重みが 4 ビットに量子化されている場合に役立ちます。この方法をアクティベーションの動的量子化と併用すると、精度が低下する場合があります。データセットを必要とします。

以下の例は、OpenVINO IR に適用されたデータフリーの 4 ビット重み量子化を示しています。

from nncf import compress_weights, CompressWeightsMode

...
model = compress_weights(model, mode=CompressWeightsMode.INT4_SYM, group_size=128, ratio=0.8) # model is openvino.Model object

データを意識した重み圧縮については、次のを参照してください。

OpenVINO は、GPTQ で最適化された Hugging Face Transformers ライブラリーの 4 ビット・モデルもサポートしています。この場合、モデル変換によって INT4 最適化の結果が自動的に保存されてモデル推論の利点が得られるため、追加のモデル最適化ステップは必要ありません。

以下の表は、最適化ステップでデータセットが使用されない、データフリー設定のさまざまな最適化設定を使用したテキスト生成言語モデルの例を示しています。パープレキシティー・メトリックは、Lambada OpenAI データセットで測定されます。

モデル

最適化

パープレキシティー*

モデルサイズ (Gb)

databricks/dolly-v2-3b

FP32

5.01

10.3

databricks/dolly-v2-3b

INT8

5.07

2.6

databricks/dolly-v2-3b

INT4_ASYM,group_size=32,ratio=0.5

5.28

2.2

facebook/opt-6.7b

FP32

4.25

24.8

facebook/opt-6.7b

INT8

4.27

6.2

facebook/opt-6.7b

INT4_ASYM,group_size=64,ratio=0.8

4.32

4.1

meta-llama/Llama-2-7b-chat-hf

FP32

3.28

25.1

meta-llama/Llama-2-7b-chat-hf

INT8

3.29

6.3

meta-llama/Llama-2-7b-chat-hf

INT4_ASYM,group_size=128,ratio=0.8

3.41

4.0

togethercomputer/RedPajama-INCITE-7B-Instruct

FP32

4.15

25.6

togethercomputer/RedPajama-INCITE-7B-Instruct

INT8

4.17

6.4

togethercomputer/RedPajama-INCITE-7B-Instruct

INT4_ASYM,group_size=128,ratio=1.0

4.17

3.6

meta-llama/Llama-2-13b-chat-hf

FP32

2.92

48.5

meta-llama/Llama-2-13b-chat-hf

INT8

2.91

12.1

meta-llama/Llama-2-13b-chat-hf

INT4_SYM,group_size=64,ratio=0.8

2.98

8.0

次の表は、Wikitext データセットで測定されたデータ対応の 4 ビット重み量子化セットアップの精度メトリックを示しています。

モデル

最適化

Word パープレキシティー*

モデルサイズ (Gb)

meta-llama/llama-7b-chat-hf

FP32

11.57

12.61

meta-llama/llama-7b-chat-hf

INT4_SYM,group_size=128,ratio=1.0,awq=True

12.34

2.6

stabilityai_stablelm-3b-4e1t

FP32

10.17

10.41

stabilityai_stablelm-3b-4e1t

INT4_SYM,group_size=64,ratio=1.0,awq=True

10.89

2.6

Hugging FaceH4/zephyr-7b-beta

FP32

9.82

13.99

Hugging FaceH4/zephyr-7b-beta

INT4_SYM,group_size=128,ratio=1.0

10.32

2.6

*両方のテーブルのパープレキシティー・メトリックは、OpenVINO ランタイムで動的量子化を無効化して測定されました。

重み圧縮パラメーターの自動調整

特定のモデルに最適な重み圧縮パラメーターを見つけるには、値のサブセットから重み圧縮パラメーターが検索されるを参照してください。検索を高速化するため、独自に設計された検証パイプライン WhoWhatBench が使用されます。パイプラインは、ベースラインと比較した最適化されたモデルの精度の変化を迅速に評価できます。