深層学習モデルの量子化、枝刈り、圧縮

fp16 は、エンコードと保存に 2 バイト (16 ビット) を使用するデータ型を指します。

fp32 は 4 バイト (32 ビット) の使用を指します。

fp16およびfp32と比較したトレーニングの最適化:

  • 1.メモリ使用量の削減: アプリケーション fp16 のメモリ使用量が以前よりも小さくなり、より大きなバッチ サイズを設定できるようになりました。
  • 2.アクセラレーテッド コンピューティング: アクセラレーテッド コンピューティングは一部の最近の新しい GPU でのみ利用可能であり、私はこの分野の利点を経験したことがありません...一部の論文では、fp16 のトレーニング速度が fp32 の 2 ~ 8 倍になる可能性があると指摘しています。

データの種類

範囲

float16

-65504~65504

float32

-2^31 ~ 2^31-1

あなた8

-2^7 ~ 2^7-1 (-128 ~ 127)

uint8

0 ~ 2^8-1 (0 ~ 255)

1.定量的な目的

        機械学習アプリケーションを開発する場合、サーバー側とデバイスの両方でコンピューティング リソースを効率的に利用することが重要です。サーバーやエッジデバイスでのより効率的な展開をサポートするには、モデルの量子化のサポートがより重要になります。

  量子化では、8 ビット整数 (int8) 命令を利用してモデルのサイズを削減し、推論をより高速に実行し (レイテンシを削減)、サービス品質の目標を達成するか、モバイル デバイスで利用可能なリソース内に収まるモデル間の違いとなる可能性があります。これにより、リソースの制約が少ない状況でも、より大規模でより正確なモデルをデプロイできます。

        量子化は主に推論を高速化するための手法であり、量子化演算子の順方向パスのみをサポートします。深層学習における量子化とは、もともと浮動小数点数で保存されていたテンソルをより少ないビットを使用して保存し、より少ないビットを使用してもともと浮動小数点数で行われていた計算を完了することを指します。

 

2.定量化の概要

  量子化は主に推論を高速化するための手法であり、量子化演算子は前方パスのみをサポートします。量子化とは、浮動小数点実装と比較して、計算やメモリ アクセスに低精度のデータ (通常は int8) を使用する手法を指します。

パフォーマンスの向上は、いくつかの重要な領域で達成できます。

        モデルのサイズが 4 分の 1 に縮小されました。

        メモリ帯域幅が 2 ~ 4 倍減少。

メモリ帯域幅の節約と int8 アルゴリズムを使用した高速計算により、推論が 2 ~ 4 倍高速になります。

  ただし、量子化には追加コストがかかります。基本的に、量子化とは近似を導入することを意味し、結果として得られるネットワークの精度はわずかに低くなります。これらの手法は、完全な浮動小数点精度と量子化精度の間のギャップを最小限に抑えようとします。    

3.定量方法

3.1 動的量子化 -動的量子化

  PyTorch でサポートされている最も単純な量子化方法は、動的量子化と呼ばれます。これには、計算を実行する前に、重みを int8 に変換するだけでなく、アクティベーションを int 8 (したがって「動的」) に変換することも含まれます。したがって、効率的な int8 行列の乗算と畳み込みの実装を使用して計算が実行され、計算が高速になります。ただし、アクティベーションは浮動小数点形式でメモリから読み取られ、メモリに書き込まれます。

3.2 トレーニング後の静的量子化 -トレーニング後の静的量子化

  整数演算と int8 メモリ アクセスの両方を使用するようにネットワークを変換することで、パフォーマンス (遅延) をさらに改善できます。静的量子化では、最初にデータのバッチをネットワーク経由で供給し、さまざまなアクティベーションにわたって結果の分布を計算するという追加のステップが実行されます。この情報は、推論時にさまざまなアクティベーションを具体的にどのように定量化するかを決定するために使用されます。重要なのは、この追加手順により、各操作間で量子化された値を浮動小数点値に変換してから整数に変換するのではなく、操作間で量子化値を渡すことができるため、大幅な速度向上が得られます。

3.3 量子化を意識したトレーニング -量子化を意識したトレーニング

  量子化対応トレーニング (QAT) は、3 つの方法の中で最も正確です。QAT では、トレーニングの前方および後方パス中にすべての重みとアクティベーションが「擬似量子化」されます。つまり、浮動小数点値は int8 値をシミュレートするために丸められますが、すべての計算は依然として浮動小数点数を使用して行われます。したがって、トレーニング中のすべての重み調整は、モデルが最終的に量子化されるという事実を「認識」して行われるため、量子化後、この方法は通常、他の 2 つの方法よりも高い精度が得られます。

4. PTQQATの概要

        量子化方法は、量子化パラメータを調整するかどうかに応じて、量子化対応トレーニング (QAT) とトレーニング後量子化 (PTQ) に分類できます。これら 2 つの方法の操作の違いを次の図に示します (左側が QAT、右側が PTQ)。

    

量子化対応トレーニング QAT は、トレーニングされたモデルを量子化してから再トレーニングすることです。固定小数点値は逆勾配計算に使用できないため、実際の演算プロセスは、いくつかの演算の前に偽の量子化ノード (偽量子化ノード) を挿入することです。これは、トレーニング中に演算を流れるデータのカットオフ値を取得するために使用されます。量子化を展開するのに便利です。モデリング時にノードを量子化するときに使用されます。トレーニング中に精度を継続的に最適化することで、最適な量子化パラメータを取得する必要があります。モデルをトレーニングする必要があるため、オペレーターには高い技術要件が求められます。

  トレーニング後の量子化 PTQ は、校正データのバッチを使用してトレーニング済みモデルを校正し、元のモデルでトレーニングを行わずに、トレーニング済み FP32 ネットワークを固定小数点コンピューティング ネットワークに直接変換します。量子化プロセスは、いくつかのハイパーパラメータを調整するだけで完了でき、トレーニングなしでもプロセスがシンプルかつ高速であるため、この方法は多くのデバイス側およびクラウド側の展開シナリオで広く使用されています。

モデルタイプ

優先オプション

なぜ

LSTM/RNN

動的量子化

スループットは、重みのコンピューティング/メモリ帯域幅によって決まります。

BERT/トランスフォーマー

動的量子化

スループットは、重みのコンピューティング/メモリ帯域幅によって決まります。

CNN

静的量子化

スループットはアクティブなメモリ帯域幅によって制限されます

CNN

量子化を意識したトレーニング

静的量子化では精度が達成できない場合

おすすめ

転載: blog.csdn.net/xs1997/article/details/131747158