GPT実践シリーズ - Baichuan2などの大規模モデルの計算精度と定量化

GPT の実用的な級数精度と Baichuan2 などの大規模モデルの定量化

特別な処理を行わない場合、深層学習のデフォルトのパラメータ精度は浮動小数点 32 ビット精度 (FP32) です。大規模モデルのパラメータは 10 ~ 1000B と膨大で、最適化に注意を払わないと、大量のグラフィックス カード リソースと多くのトレーニング時間が消費され、AI アルゴリズム センターのトレーニング投資はすべて無駄になってしまいます。 NVIDIAに譲渡される。32 ビット精度があまり必要でない場所があり、ここで浮動小数点精度と量子化が関係します。

大規模モデルのトレーニングと予測プロセスを高速化するにはどうすればよいでしょうか? ビデオメモリの使用量を減らすにはどうすればよいですか?
簡単ですぐに始める方法にはどのようなものがありますか?

混合精度

混合精度トレーニングは、ディープラーニング トレーニングを高速化するための手法です。主なアイデアは、精度低下の許容範囲内で、低精度の浮動小数点数 (FP16 など) を使用してニューラル ネットワークの重みとアクティベーション値を表すことにより、メモリ使用量と計算オーバーヘッドを削減し、それによって高速化することです。トレーニングのプロセス。

混合精度トレーニングの実装は、次の手順に分けることができます。

  1. FP32 の重みを FP16 形式に変換し、前方計算を実行して FP32 損失 (loss) を取得します。
  2. FP16を使用して勾配を計算します。
  3. グラデーションを FP32 形式に変換し、重みに更新します。

FP16 の精度が低く、表現される値の範囲が狭いため、精度の損失が発生する可能性があるため、混合精度トレーニングでは、モデルの精度を維持するためにいくつかのテクニックを使用する必要があります。たとえば、勾配スケーリング (GradScaler) を使用して勾配のサイズを制御し、勾配が急激に低下してモデルの精度に影響を与えるのを防ぐことができます。

精密なデジタル表現

  • FP32:単精度浮動小数点数で、符号ビットが1ビット、指数ビットが8ビット、仮数ビットが23ビットの32ビットの2進数で表現され、表現できる値の範囲は以下の通りです。±3.4×1038±3.4×10^{38}± 3.4×1 038
  • FP16: 半精度浮動小数点数で、符号ビットを 1 ビット、指数ビットを 5 ビット、仮数ビットを 10 ビットとした 16 ビットの 2 進数で表現されます。± 2 15 ± 2^{15}± 215
  • FP64: 64 ビットの 2 進数で表される倍精度浮動小数点数で、符号ビットが 1 ビット、指数ビットが 11 ビット、仮数ビットが 52 ビットで表現されます。± 1.8 × 1 0 308 ± 1.8 × 10^ {308}± 1.8×1 0308
  • INT8: 8 ビット整数、1 ビットは符号ビットを表し、表現できる値の範囲は $-128 ~ 127$ です。
  • INT4: 4 ビット整数、1 ビットは符号ビットを表し、表現できる値の範囲は-8 ~ 7 -8 ~ 78から7

ここに画像の説明を挿入します

  • 変換プロセス

混合精度トレーニングのプロセスは次のとおりです。

  1. FP32 の重みを FP16 形式に変換し、前方計算を実行して FP32 損失 (loss) を取得します。
  2. FP16を使用して勾配を計算します。
  3. グラデーションを FP32 形式に変換し、重みに更新します。

トレーニング プロセス中に、autocast入力と出力は FP16 形式に変換され、GradScaler速すぎてモデルの精度に影響を与える勾配降下を避けるために損失値がスケーリングされます。

定量化する

量子化とは、整数値を使用して浮動小数点を表現し、数値で表現される桁数を減らしてモデルの保存量と計算量を削減する計算方法です。深層学習では、通常、重みとアクティベーション値を表すために 32 ビット浮動小数点数が使用されます。ただし、この精度により、計算とストレージのオーバーヘッドが非常に高くなる可能性があります。したがって、量子化では、より短い整数を使用して重みとアクティベーションを表すため、メモリと計算のオーバーヘッドが削減されます。

量子化では整数値を使用して浮動小数点処理の使用を回避し、計算プロセスを高速化すると同時に、数値または値を表すために使用されるビット数を減らし、ストレージ技術を削減します。重みを低精度のデータ型に保存することにより、モデル パラメーターのトレーニング、予測計算プロセス、モデルと中間キャッシュの保存スペースが削減されます。量子化によりモデルのサイズが縮小されるため、CPU や組み込みシステムなどのリソースに制約のあるデバイスへのモデルの展開が容易になります。

一般的なアプローチは、モデルの重みを生の 16 ビット浮動小数点値から精度の低い 8 ビット整数値に量子化することです

8bitパラメータ量子化

GPT、Baichuan2、ChatGLM3 などの大規模モデル LLM は優れた機能を実証していますが、多くの CPU とメモリを必要とします。1 つの方法として、量子化を使用してこれらのモデルを圧縮し、メモリ フットプリントを削減し、計算推論を高速化することができます。モデルの精度を維持します。


量子化プロセスでは、動的量子化と静的量子化の2 つの方法を使用できます。

  • 動的量子化では、実行時にデータを収集し、そのデータに基づいてモデルを動的に量子化します。
  • 静的量子化では、トレーニング中にモデルを量子化し、推論時に量子化を適用します。

精度が低いと丸め誤差が生じる可能性があるため、量子化によりモデルの精度が低下する可能性があります。したがって、量子化中に、モデルの精度を維持するには、重みのスケーリングやダイナミック レンジ量子化の使用など、いくつかの工夫が必要です。

同時に、モデルを定量化する前に、精度が許容範囲内であることを確認するためにモデルをテストする必要があります。さらに、すべてのモデルを量子化できるわけではありません。この方法を使用して量子化できるのは、動的量子化をサポートするモデルのみです

例:load_in_8bit=True

 from transformers import AutoTokenizer, AutoModel 
 model = AutoModel.from_pretrained("THUDM/chatglm3-6b",
                                      revision='v0.1.0',
                                      load_in_8bit=True,
                                      trust_remote_code=True,
                                      device_map="auto")

一般に、量子化は、モデルのストレージと計算のオーバーヘッドを削減し、デバイス上のモデルの実行効率を向上させることができる非常に便利な方法です。

定量的なトレーニング

深層学習における量子化は、数値で表されるビット数を減らすことによって、モデルに必要なストレージと計算の量を削減する方法です。混合精度でトレーニングする場合、モデルの重みと勾配を FP32 から FP16 に変換して、メモリを節約し、トレーニングを高速化できます。同様に、量子化トレーニングはアクティベーション値をより短い整数に変換できるため、メモリと計算オーバーヘッドが削減されます

PyTorch は、ダイナミック レンジ量子化などを使用したQAT (量子化対応トレーニング)などの定量的トレーニングのためのいくつかのツールと API を提供します。その中でも定量的なトレーニングにAdam8bitを利用するのは一つの方法です。

定量的推論

モデルの定量化はメソッドを使用して実現できますload_in_8bitこの方法では、モデルの重みとアクティベーション値を 8 ビット整数に量子化できるため、メモリと計算のオーバーヘッドが削減されます。具体的な実装方法は以下の通りです。

import torch
from transformers import AutoModel

# 加载模型
model = AutoModel.from_pretrained('bert-base-uncased',load_in_8bit=True)

load_in_8bitモデルを定量化する方法を使用すると、モデルの精度が低下する可能性があることに注意してください。さらに、すべてのモデルを量子化できるわけではありません。この方法を使用して量子化できるのは、動的量子化をサポートするモデルのみです。

好き、好き、好き、好き

役に立ちました。集めてください。集めてください。

終わり


GPTコラム記事:
GPT実践シリーズ - ChatGLM2導入 Ubuntu+Cuda11+ビデオメモリ24G実践ソリューション

GPT実践シリーズ - Baichuan2ローカライズ展開実践計画

GPT実践シリーズ - ChatGLM3ローカル展開CUDA11+1080Ti+グラフィックスカード24G実践ソリューション

GPT 実践シリーズ - 独自のデータを使用して ChatGLM2 モデルのトレーニングを微調整する方法

GPT実践シリーズ - GPTトレーニング 事前トレーニング、SFT、報酬モデリング、RLHF

GPT実践シリーズ - P-Tuningのローカライズトレーニング ChatGLM2とその他のLLMモデル、具体的には何をするのですか?(二)

GPT実践シリーズ - P-Tuningのローカライズトレーニング ChatGLM2とその他のLLMモデル、具体的には何をするのですか?(1つ)

GPT実践シリーズ - ChatGLM2モデルの微調整トレーニングパラメータの解釈

GPT実践シリーズ - GPTトレーニング 事前トレーニング、SFT、報酬モデリング、RLHF


意思決定エンジンコラム:
Falcon が軽量 REST API サービスを構築

意思決定エンジン - Drools を使用して単純なファイアウォール ポリシーを実装する

おすすめ

転載: blog.csdn.net/Alex_StarSky/article/details/83933045