ニューラル ネットワーク (モデル) 量子化の概要 - PTQ と QAT
1. 需要目的
機械学習アプリケーションを開発する場合、サーバー側とデバイスの両方でコンピューティング リソースを効率的に利用することが重要です。サーバーやエッジ デバイスでのより効率的な展開をサポートするために、モデルの量子化のサポートがより重要になります。
量子化は 8 ビット整数 (int8) 命令を利用して、モデルのサイズを縮小し、推論をより高速に実行し (レイテンシを削減)、サービス品質の目標を達成するか、モバイル デバイスで利用可能なリソース内に収まるモデル間の違いになる可能性があります。リソースの制約が少ない状況でも、より大規模で正確なモデルをデプロイできます。
2. 定量化の概要
量子化は主に推論を高速化するための手法であり、量子化演算子はフォワード パスのみをサポートします。量子化とは、浮動小数点の実装 (通常は int8) と比較して、計算とメモリ アクセスに精度の低いデータを使用する手法を指します。これにより、いくつかの重要な領域でパフォーマンスが向上する可能性があります。
- モデルサイズが 4 分の 1 に縮小。
- メモリ帯域幅が 2 ~ 4 分の 1 に減少。
- メモリ帯域幅の節約と int8 アルゴリズムを使用した計算の高速化により、推論が 2 ~ 4 倍高速化されます (正確な高速化は、ハードウェア、ランタイム、およびモデルによって異なります)。
ただし、量子化には追加コストがかかります。基本的に、量子化は近似を導入することを意味し、結果として得られるネットワークの精度はわずかに低下します。これらの手法は、完全な浮動小数点の精度と量子化された精度の間のギャップを最小限に抑えようとします。
3. 3 つの量子化モード
3.1 動的量子化 - 動的量子化
PyTorch でサポートされている最も単純な量子化方法は、動的量子化と呼ばれます。これには、重みを int8 に変換するだけでなく (すべての量子化された変数で行われるように)、計算を実行する前にアクティベーションを int 8 に変換することも含まれます (したがって「動的」)。したがって、効率的な int8 行列の乗算と畳み込みの実装を使用して計算が実行されるため、計算が高速になります。ただし、アクティベーションは浮動小数点形式でメモリから読み取られ、メモリに書き込まれます。
3.2 トレーニング後の静的量子化 - トレーニング後の静的量子化
整数演算と int8 メモリ アクセスの両方を使用するようにネットワークを変換することで、パフォーマンス (レイテンシ) をさらに改善できます。静的量子化は、最初にネットワークを介してデータのバッチを供給し、さまざまなアクティベーションの結果の分布を計算するという追加のステップを実行します (具体的には、これは、これらの分布が記録されるさまざまなポイントに「オブザーバー」モジュールを挿入することによって行われます)。この情報は、推論時に異なるアクティベーションを具体的にどのように定量化する必要があるかを決定するために使用されます (単純な手法の 1 つは、アクティベーションの範囲全体を単純に 256 レベルに分割することですが、より複雑なアプローチもサポートしています)。重要なことに、この追加のステップにより、各操作間でこれらの値を浮動小数点値に変換してから整数に変換するのではなく、操作間で量子化された値を渡すことができるため、大幅なスピードアップが実現します。
PyTorch では、ユーザーが静的量子化を最適化できるいくつかの関数がサポートされています。
- オブザーバー: オブザーバー モジュールをカスタマイズして、量子化の前に統計を収集する方法を指定し、データを定量化するためのより高度な方法を試すことができます。
- 演算子の融合: 複数の操作を 1 つの操作に融合できるため、操作の数値精度を向上させながらメモリ アクセスを節約できます。
- チャネルごとの量子化: 畳み込み/線形層で各出力チャネルの重みを個別に量子化できます。これにより、ほぼ同じ速度でより高い精度を実現できます。
3.3 量子化認識トレーニング - 量子化認識トレーニング
量子化認識トレーニング (QAT) は 3 番目のアプローチであり、3 つの中で最も正確です。QAT を使用すると、すべての重みとアクティベーションがトレーニングの前後のパスで「疑似量子化」されます。つまり、浮動小数点値は int8 値をシミュレートするために丸められますが、すべての計算は依然として浮動小数点数を使用して行われます。したがって、トレーニング中のすべての重み調整は、モデルが最終的に量子化されるという事実を「認識」して行われます。したがって、量子化後、この方法は通常、他の 2 つの方法よりも高い精度をもたらします。
4. PTQ と QAT の概要
量子化パラメータを調整するかどうかに応じて、量子化方法を量子化認識トレーニング (QAT) とトレーニング後の量子化 (PTQ) に分けることができます。これら 2 つの方法の操作の違いを次の図に示します (左側が QAT、右側が PTQ)。
ここで「トレーニング後の量子化 (PTQ)」は通常「静的トレーニング後の量子化"
量子化を意識したトレーニング QAT は、トレーニング済みのモデルを量子化してから再トレーニングすることです。固定小数点値は逆勾配計算に使用できないため、実際の操作プロセスは、いくつかの op の前に偽の量子化ノード (偽の量子化ノード) を挿入することであり、トレーニング中に op を流れるデータのカットオフ値を取得するために使用されます。 、量子化の展開に便利ですモデリング時にノードを量子化するときに使用します。トレーニング中に精度を継続的に最適化することにより、最適な量子化パラメーターを取得する必要があります。モデルをトレーニングする必要があるため、オペレーターには高度な技術的要件があります。
トレーニング後の量子化 PTQ は、キャリブレーション データのバッチを使用してトレーニング済みモデルを調整し、トレーニング済みの FP32 ネットワークを固定小数点コンピューティング ネットワークに直接変換します。元のモデルのトレーニングは必要ありません。量子化プロセスは、いくつかのハイパーパラメーターを調整するだけで完了することができ、プロセスはトレーニングなしでシンプルかつ高速であるため、この方法は多くのデバイス側およびクラウド側の展開シナリオで広く使用されています. PTQ メソッドを試して、要件を満たしているかどうかを確認してください。導入の精度とパフォーマンスの要件。
5. デバイスとオペレーターのサポート
量子化のサポートは、使用される方法に応じて、使用可能な演算子のサブセットに限定されます。サポートされている演算子のリストについては、 https://pytorch.org/docs/stable/quantization.htmlのドキュメントを参照してください。
使用可能な演算子と量子化値のセットは、量子化されたモデルの実行に使用されるバックエンドにも依存します。現在、量子化された演算子は、x86 および ARM のバックエンドでの CPU 推論でのみサポートされています。量子化構成 (テンソルを量子化する方法) と量子化カーネル (量子化されたテンソルの演算) は両方ともバックエンドに依存します。
ただし、量子化を意識したトレーニングは完全な浮動小数点で行われ、GPU または CPU で実行できます。通常、量子化を意識したトレーニングは、トレーニング後の静的または動的量子化で十分な精度が得られない場合にのみ、CNN モデルに使用されます。これは、小さいサイズ向けに高度に最適化されたモデル (Mobilenet など) で発生する可能性があります。
6. 方法を選択する
使用するオプションの選択は、多くの要因によって異なります。
- モデル/ターゲット要件: 一部のモデルは量子化に敏感で、量子化を意識したトレーニングが必要な場合があります。
- オペレーター/バックエンドのサポート: 一部のバックエンドでは、完全に量子化されたオペレーターが必要です。
現在、通信事業者の補償範囲は限られているため、以下の表にリストされている選択肢が制限される場合があります。 以下の表はガイドラインを示しています。
モデルタイプ | 優先オプション | なぜ |
---|---|---|
LSTM/RNN | 動的量子化 | スループットは、重みの計算/メモリ帯域幅によって決まります |
BERT/変圧器 | 動的量子化 | スループットは、重みの計算/メモリ帯域幅によって決まります |
CNN | 静的量子化 | アクティブなメモリ帯域幅によって制限されるスループット |
CNN | 量子化を意識したトレーニング | 静的量子化で精度が出ない場合 |
7. パフォーマンス結果
量子化は、ハードウェア プラットフォームとベンチマーク モデルに応じて、浮動小数点の実装と比較して、モデル サイズを 4 分の 1 に縮小し、2 倍から 3 倍高速化します。いくつかのサンプル結果は次のとおりです。
モデル | 浮動小数点レイテンシ (ミリ秒) | 量子化レイテンシ (ミリ秒) | 推論パフォーマンスの向上 | 装置 | ノート |
---|---|---|---|---|---|
バート | 581 | 313 | 1.8倍 | Xeon-D2191 (1.6GHz) | バッチ サイズ = 1、最大シーケンス長 = 128、シングル スレッド、x86-64、動的量子化 |
Resnet-50 | 214 | 103 | 2倍 | Xeon-D2191 (1.6GHz) | シングルスレッド、x86-64、静的量子化 |
Mobilenet-v2 | 97 | 17 | 5.7倍 | サムスン S9 | 静的量子化、Caffe2 ランタイムに基づく浮動小数点、最適化されていない |
8. 精度結果
また、静的量子化モデルの精度を ImageNet の浮動小数点モデルと比較しました。動的量子化については、MRPC の GLUE ベンチマークで BERT の F1 スコアを比較します。
コンピュータ ビジョン モデルの精度
モデル | トップ 1 精度 (浮動小数点) | トップ 1 精度 (定量化) | 量子化スキーム |
---|---|---|---|
グーグルネット | 69.8 | 69.7 | 静的トレーニング後の量子化 |
インセプション-v3 | 77.5 | 77.1 | 静的トレーニング後の量子化 |
ResNet-18 | 69.8 | 69.4 | 静的トレーニング後の量子化 |
Resnet-50 | 76.1 | 75.9 | 静的トレーニング後の量子化 |
ResNext-101 32x8d | 79.3 | 79 | 静的トレーニング後の量子化 |
Mobilenet-v2 | 71.9 | 71.6 | 量子化を意識したトレーニング |
Shufflenet-v2 | 69.4 | 68.4 | 静的トレーニング後の量子化 |
音声と NLP モデルの精度
モデル | F1 (GLUEMRPC) 浮動小数点 | F1 (GLUEMRPC) 定量化 | 量子化スキーム |
---|---|---|---|
バート | 0.902 | 0.895 | 動的量子化 |
9. 結論
PyTorch でモデルの量子化を開始するには、PyTorch Web サイト のチュートリアルから始めます。シーケンス データを扱う場合は、LSTMまたはBERT の動的量子化から始めます。画像データを扱う場合は、量子化転移学習のチュートリアルから始めることをお勧めします。次に、トレーニング後の静的な量子化を調べることができます。トレーニング後の量子化の精度低下が大きすぎることがわかった場合は、量子化を考慮したトレーニングを試してください。
参考文献
参考1
- 标题:PyTorch での量子化の紹介
- 作者:Raghuraman Krishnamoorthi、James Reed、Min Ni、Chris Gottbrath、Seth Weidman
- リンク: https://pytorch.org/blog/introduction-to-quantization-on-pytorch/
参考2
- 标题:tensorrt を使用して量子化を意識したトレーニング済みネットワークを展開する
- 著者: Dheeraj Peri、Jhalak Patel、Josh Park
- リンク: https://developer.download.nvidia.cn/video/gputechconf/gtc/2020/presentations/s21664-toward-int8-inference-deploying-quantization-aware-trained-networks-using-tensorrt.pdf
参考3
- リンク: https: //developer.horizon.ai/forum