论文阅读-効率的な整数演算のみの推論のためのニューラルネットワークの量子化とトレーニング

论文阅读--Quantizationと効率的なニューラルネットワークのトレーニング
整数算術のみ推論
Googleからの

概要

モバイル端末の人気とコンピューティングパワーに関する深層学習モデルの膨大な要件により、デバイス上で効率的かつ正確な推論ソリューションが緊急に必要とされています。この論文では、浮動小数点数よりも効率的な、推論に整数のみを使用できる量子化スキームを提案します。このペーパーでは、量子化の精度をバックツーエンドで維持できるトレーニングプログラムも設計しました。このスキームは、特に高効率で知られるEfficientNetシリーズで、デバイスの精度とエンドツーエンドの遅延のバランスをうまくとっています。最後に、このペーパーでは、汎用CPUでImageNet分類とCOCOターゲット検出を実行します。このプログラムの有効性。

セクションIはじめに

現在、SOTAのCNNフレームワークはモバイル端末には適用できません。AlexNetの登場以来、評価は主に分類精度や検出精度に依存してきました。その後のネットワーク開発では、モデルの効率や複雑さを考慮していませんでした。一方、モバイル端末やAR / VR機器やドローンに適用する場合は、チップ上のリソースが限られているため、小規模なモデルと低遅延の推論時間が必要になります。したがって、モデルのサイズを単純化し、精度を損なうことなく推論の遅延を減らす方法は、ホットな研究トピックになっています。

技術ルートには主に2種類あります。1つはMobileNey、SqueezeNet、ShuffleNet、DenseNetなどで表されるコンピューティングリソースとメモリリソースを最大限に活用する効率的なモデルです。もう1つは、32ビットの浮動小数点数で表される重みとアクティベーション値をそれよりも少ない特定のポイント数に定量化することです。代表的な作品:TWN、BNN、XNOR-netなど。しかし、2番目のカテゴリーには多くの前任者の仕事がありますが、それは正確さと遅延の間の良いトレードオフではありません。まず、提案された量子化スキームは、AlexNet、VGG、GoogLeNetなど、精度を向上させるためにパラメータが過剰に設定されている一般的なベンチマークモデルではテストされていません。したがって、これらのモデルを圧縮して、定量化の概念的な効果を検証するのは簡単です。もう1つのより意味のあるテストは、MobileNetなど、精度と推論遅延を比較検討するのに十分効率的なネットワークをテストすることです。


2つ目のポイントは、多くの量子化戦略では実際のハードウェアユニットでの有効性が検証されていないことです。たとえば、重みの量子化はオンチップストレージにのみ焦点を当てており、計算効率とはほとんど関係ありません。注目すべき例外は、2値化、3値化、シフトネットワークです。たとえば、最後の1つは、0または2の累乗を使用して重みを表すため、シフトによって乗算が実現されるため、一部のパイプライン手法が支援され、計算コストは​​比較できません。加算はいくらですか。乗算はオペランドが広い場合にのみコストがかかるため、重みのビット数とアクティブ化値をより少ない数に量子化すると、乗算の計算コストを効果的に回避できます。

これらの方法がその有効性を証明するためにハードウェアでテストされることはめったにないことは注目に値します。リアルタイム操作のより適切な方法は、重みとアクティブ化の値を1ビットに量子化することです。これにより、シフトとビットカウントによって乗算と加算を実現し、カスタムGPUに適用できます。ただし、1ビットの量子化の精度が低下しすぎて、モデルを特徴付けることができません。

したがって、このペーパーでは、一般的なモバイルハードウェアプラットフォームでの精度と遅延の間のMobileNetのトレードオフテクスチャを改善します。主な作業は次のとおりです。


(1)提案された量子化戦略は、バイアスなどのいくつかのパラメータのみを使用して、重みとアクティベーション値の両方を8ビット整数に量子化します量子化は32ビット整数です。


(2)この記事では、QualcommHexagonおよびARMNEONに実装されているハードウェアで整数演算を効率的に実行できる定量的推論フレームワークも設計します。


(3)この記事では、このフレームワークをMobileNetに適用して分類します。ターゲット検出と比較して、汎用ARM CPUでの結果は、精度と遅延の間の適切なトレードオフを示しています。



この記事は、論文[7] [31]に着想を得ており、[7]は低精度の固定小数点数を使用してCNNトレーニングを加速し、[31]は8ビットの固定小数点数を使用してx86CPUでの推論プロセスを高速化します。この記事の量子化戦略は、モバイルCPUで推論の精度と推論速度のバランスを改善する方法に焦点を当てています。

セクションII量子化された推論

パートA量子化スキーム



このセクションでは、一般的な量子化スキーム、つまり、値のビット表現と値の真の値の間のマッピング関係を紹介します。この記事の量子化スキームは、推論プロセスで整数演算を使用し、トレーニングフェーズで浮動小数点数を使用することです。したがって、最初に厳密な数学的定義を提供してから、浮動小数点数のトレーニングと整数推論を別々に実行する必要があります。



この記事の量子化戦略の主な条件は、整数演算のみを使用し、ルックアップテーブルの使用を回避することです。これは、純粋なSIMDハードウェアではパフォーマンスが低下することが多いためです。これには、整数Sと実数Zの間のマッピング関係を見つける必要があります。




ここに写真の説明を挿入

この記事では、重みマトリックスまたは特徴マトリックスごとにLie量子化パラメーターのセットを使用し、アレイごとに異なる量子化パラメーターを使用します。たとえば、8ビット量子化の場合、qは8ビットに量子化され、オフセットは32ビットに量子化され、定数Sは任意の正の実数であるスケールスケーリング係数です。通常、ソフトウェアでは浮動小数点数として表されます。次のセクションでは、浮動小数点数の使用を回避する方法について説明します。推定される作業負荷を減らす方法。




定数Zとqは同じタイプです。実際、Zは実数0に対応する量子化値qです。これは、ニューラルネットワークに0を入力する必要がある場合が多いため、実数0をエネルギー値で正確に表すことができるようにするためです。





パートB整数行列の乗算





以下は、整数演算を使用して推論を完了する方法、つまり、スケールが整数でなくても、実数を量子化値計算に変換する方法、量子化値計算を純粋な整数計算に変換する方法を解決します。2つのNxN実数行列r1x r2 = r3の乗算を考えてみましょう。行列の各項目は、r(a)(i、j)として表されるため、マッピングは次のようになります。






ここに写真の説明を挿入

行列乗算の定義によると、それは次のとおりです。





ここに写真の説明を挿入

次のように書き直すことができます。






ここに写真の説明を挿入

ここで、Mは次のように表されます。Mは唯一の非整数であり、S3、S2、S1にのみ依存し、Mは常に[0,1]の間にあるため、次のように正規化できます。
ここに写真の説明を挿入

その中で、M0は[0.5,1]の間にあり、M0は固定小数点乗算として表現するのに非常に適しています。たとえば、int32を使用する場合、M0は2 ^ 31M0に最も近いint32値です。int32の値は230以上であるため、相対精度は30ビット以上であるため、M0と同じです。乗算は固定小数点乗算として実装できます。丸めが必要な場合でも、シフトによって実行することもできます。このパートについては、付録Bを参照してください。
パートCゼロ点の効率的な処理ゼロ点の効率的な処理


2N3減算を実行せず、乗算を16ビット整数に拡張せずに効率的に計算するには、最初に計算式を(7)のように書き直します。

ここに写真の説明を挿入

乗算が(9)に集中している場合、
ここに写真の説明を挿入

したがって、他の場所ではマトリックスの乗算と累積はありません。
パートD典型的な融合層の実装層


全体の計算を1つの操作に統合する典型的な融合層融合の実装は最適化されていません。これは、トレーニングコードと推論コードで同じ短いヘアが使用されているため、推論コードのビット量子化出力がトレーニングフェーズの「疑似量子化」の形式と一致する必要があります。この記事では、ARMおよびx86アーキテクチャに実装されている場合にgemmlowpライブラリを使用し、GemmWithOutputPipelineはこの記事で必要な融合操作を提供します。


ここに写真の説明を挿入
ここに写真の説明を挿入

このうち、q1は重み行列、q2は起動値行列で、どちらもuint8タイプです。累積操作には32ビットのアキュムレータが必要です。この記事では符号付きアキュムレータを選択します。理由については後で説明します。したがって、(9)の計算がプログラムされます。オフセットはint32を使用するのが最適ですが、オフセットはパラメータのごく一部しか占めないため、高精度を使用しても害はありません。ただし、オフセットはアクティベーション値に直接ロードされるためです。 、したがって、少しの間違いもエンドツーエンドの精度に影響するため、エラーのこの部分は回避する必要があります。int32の累積値を取得した後、3つのことを実行します:スケールダウン(累積値を8ビットにスケーリング)、キャストダウン(出力値をuint8に転置し続ける、(アクティベーション関数)アクティベーション関数を使用して最終的な8ビット出力を生成します。アクティベーションの場合汗、この記事はReLU、ReLU6などのクランプを使用したクランプの活性化機能にのみ焦点を当てています。この部分は溶融層に配置されていませんが、付録Aで説明されています。したがって、活性化関数の定量化はuint8の出力に対して行う必要があります。 [0,255]の間隔に固定されます。実際のトレーニングは、[0,255]の間隔全体でトレーニングする傾向があります。

ここに写真の説明を挿入

図1.1は、TFでの畳み込み量子化の前後の比較図を示しています。(A)推論に整数演算のみが使用されることを意味します。入力と出力はすべてuint8タイプです。畳み込みの計算には、8ビット整数演算と32ビット整数累積が必要です。オフセットも32ビット整数です。非線形ReLU6には整数演算のみが含まれていることがわかります。 。(B)は畳み込みのアナログ量子化の概略図です。すべての変数は32ビットの浮動小数点数で表され、変数の定量化をシミュレートするために、加重量子化ノード(we quan)とアクティブ化量子化セクション(act quan)がそれぞれ入力後と出力前に挿入されます。最終的な結果は、整数演算の結果、およびトレーニングプロセス全体で使用される浮動小数点数に似ています。(C)CPUの整数演算回路の速度のおかげで、精度と遅延のバランスが取れています。

セクションIIIシミュレートされた量子化によるトレーニング

シミュレーション量子化トレーニング量子化ネットワークの一般的なトレーニング方法は、浮動小数点数でトレーニングしてから、得られた重みを定量化することです。トレーニングを量子化して微調整する必要がある場合もあります)。



このペーパーでは、この方法が強力な特性評価機能を備えた大規模モデルに適していること、および小規模ネットワークの精度低下を引き起こすことを発見しました。失敗したトレーニング後の量子化戦略には、次のものがあります。



(1)異なる出力チャネルの重みの量子化範囲が大きすぎる(100倍以上)。たとえば、セクション2では、同じレイヤーのすべてのチャネルを同じ解像度に量子化すると、範囲が狭くなります。チャネルの重みの相対誤差が大きくなります



(2)異常な重み値は、重み付き重みの全体的な精度に影響します。



そのため、本稿では、トレーニングの順方向伝搬時の量子化をシミュレートする方法を提案します。逆方向伝搬は通常どおりであり、すべての重みとパラノイアは浮動小数点数に格納されるため、わずかなエラーでも無視できます。浮動小数点数を丸めることにより、順方向伝搬プロセス中にスケールを推測できる量子化プロセス。




(1)重みは、入力操作の前に量子化が実行されることであり、BNも使用される場合、BNパラメーターは量子化の前に重みに組み込まれます。3.2節で詳しく説明します。




(2)推論中、畳み込み層または完全接続層の出力が完了した後、またはResNetのチャネル連結またはバイパス接続が完了した後、活性化値が量子化されます。各レイヤーは、量子化されたレベルとクランプ範囲に従って量子化する方法を決定します。特定の量子化関数は次のとおりです。
ここに写真の説明を挿入

その中で、rは量子化される実数、nはビット数であり、実験全体で固定されています。たとえば、この記事ではn = 8ビットの量子化が使用され、[]は丸めを意味します。
パートA量子化範囲の学習

重みとアクティブ化値量子化範囲は同じではありません:


(1)重みの場合、基本的な考え方は、aとbをそれぞれwの最小値と最大値に設定することです。この記事では、範囲を[-127,127]に制限するためにわずかな調整が行われ、他の最適化の可能性がもたらされるため、値-128は表示されません。詳細については、付録Bを参照してください。


(2)アクティブ化値については、量子化範囲それはネットワークの入力に依存します。この範囲を推定するために、トレーニングプロセス中に[a、b]の範囲にあるデータが収集され、指数移動平均によって平均値が取得されるため、数千のトレーニングステップで平滑化できます。ただし、EMA計算の遅延により、初期段階(50,000から200万)ではアクティベーション値が定量化されず、ネットワークがより安定した状態になった後に量子化が実行されます。


上記の2つのケースでは、[a、b]の範囲が微調整され、0.0を量子化して実数を正確に表すことができます。これにより、常に実数から整数への量子化マッピング関数が学習されます。
ここに写真の説明を挿入

以下では、融合および削除操作を含まないTensorflowのシミュレーション量子化プロセスについて説明します。疑似量子化操作の挿入と推論ステージの最適化は、Tensorflowでオープンソース化されています。


このとき、バイアスは量子化されていないことに注意してください。推論段階では、32ビットの整数で表されます。8ビットの重みとアクティブ化と比較して、バイアスの範囲と精度は高くなります。さらに、バイアス量子化パラメータは、重みとアクティベーション値の量子化から推測されます。パートBバッチ正規化のフォールディングモデル計算にBN処理の複雑さが含まれている場合、別のレベルが必要になります。BNはトレーニング中に別個の操作ブロックとして使用されますが、推論中の効率を考慮するために、畳み込み層または完全に接続された層に「折りたたまれ」ます。定量化プロセスを正確にシミュレートするには、この折りたたみステップもシミュレートする必要があります。実装:
ここに写真の説明を挿入

その中で、ガンマはBNのスケーリング係数であり、EMA項はこのバッチでの畳み込み結果の移動平均であり、イプシロンは安定性のために設定された小さな定数です。折り畳み後、図1.1に示すようにBNによる畳み込み操作を簡略化し、折り畳み後の重量を折り畳み、バイアスも折り畳みます。付録のBNの後の畳み込み層を見ることができます。C.5とC.6は量子化前の推論段階とトレーニング段階であり、C.7とC.8は量子化後です。

セクションVI実験

このホワイトペーパーでは、2セットの実験を行います。最初のセットは量子化トレーニングの有効性を検証するために使用され、2番目のセットは一般的なハードウェアプラットフォームでの遅延と精度のトレードオフ効果を説明するために使用されます。ニューラルネットワークの最も計算量の多い部分はマトリックス乗算部分(GEMM)であり、8ビットの推論コードはgemmlowpライブラリを使用します。32ビットはEigenライブラリを使用します。


パートAの大規模ネットワークの定量的トレーニングは



、主にImageNetデータセットのResNetおよびInceptionV3で定量的トレーニングを実行しました。




ResNets




表4.1に、さまざまなResNet深度の浮動小数点数と整数量子化の比較結果を示します。整数量子化と浮動小数点数の精度の差は約2%であることがわかります。




ここに写真の説明を挿入
InceptionV3

表4.3は、7ビット\ 8ビットへの量子化と浮動小数点数の精度比較を示しています。また、2つの非線形アクティベーション関数ReLUとReLU6の量子化に対する感度を比較しています。その中で、ReLU6の精度は少し低下しています。そのアクティベーション範囲は[0,6]、ReLUを使用すると、アクティベーションでより広い範囲から値を取得できます。また、異なる銅ストリップでも異なる範囲を持つことができます。これは、固定範囲の値の量子化された精度が高いことを示しています。
ここに写真の説明を挿入
パートBMobileNetsの量子化

MobileNetsは、精度と待ち時間の間に優れたトレードオフがある一連の軽量ネットワークです。このセクションでは、整数量子化がハードウェア上の2つのバランスをさらに改善する方法について説明します。


ImageNet



この記事で、DMと解像度が異なる3つのQualcommコアをテストしました。これらの3つのコアは、3つの異なる微細構造を表しています。




(1)GooglePixel2のSnapdragon835LITTLEコア高効率マイクロパワープロセッサ




(2)Snapdragon835ラージコア




(3)Snapdragon 821ラージコア用にGooglePixel1で使用されている高性能コアは




、図1.1、図4.1、図4.2に対応します。





ここに写真の説明を挿入
ここに写真の説明を挿入

純粋な整数量子化MobileNetは、浮動小数点MobileNetよりも精度が高くなります。Snapdragon821リアルタイム操作では、遅延は33ミリ秒ですが、精度の差はほぼ10%です。他の作業では、精度の損失を減らす方法に焦点を当てていますが、この記事では、精度と遅延のバランスをより多くとして提唱しています。良い評価指標。この2つのバランスは、主に証明書操作とハードウェアの浮動小数点操作の相対的な操作速度に依存していることがわかります。Snapdragon 821を例にとると、浮動小数点演算を最適化すると、量子化モデルの遅延を効果的に減らすことができます。





COCO




この記事では、モバイル端末でのリアルタイムターゲット検出の定量的モデルの効果もテストしました。モデルはCOCOデータセットのMobileNet SSDです。SSD予測レイヤーの従来の畳み込みはすべて分離可能な畳み込みに置き換えられ、MobileNetの最適化のアイデアによって抑制されます。計算効率の向上。表4.4から、835の初期のシングルスレッドでの遅延がほぼ半分に減少し、精度がほとんど失われていないことがわかります。





顔検出





顔検出は、量子化モデルの効果をより狭い範囲でテストすることです。表4.5から、精度も2%低下していることがわかりますが、latencは2倍の改善を達成しており、浮動小数点演算は整数演算よりも低速です。 4.6はマルチスレッドの状況を示しています。たとえば、スピードアップ率は4コアで1.5〜2.2倍に達する可能性があり、モデルが大きいほどスピードアップ率は高くなります。マルチスレッドのコストは、計算全体のごく一部しか占めていません。




ここに写真の説明を挿入ここに写真の説明を挿入

ここに写真の説明を挿入
ここに写真の説明を挿入
アブレーション研究
量子化戦略に対するモデルの感度をよりよく理解するために、この論文では、異なる加重深度と活性化定量化の比較結果も個別に評価しました。表4.7と表4.8の結果は、次のことを示しています。
(1)定量
化深度に対する重量の比率が活性化されているこの値はより敏感です。

(2)8ビットおよび7ビットの量子化モデルのパフォーマンスは浮動小数点モデルのパフォーマンスに近いです。

(3)全体的な量子化深度が同じである場合、重みをアクティブ化された量子化深度と一致させるのが最善です。

セクションVディスカッション

本論文では、ニューラルネットワークにおける浮動小数点演算の量子化戦略を近似するための純粋な整数演算を提案します。量子化されたモデルは、元のモデルとほぼ同じ精度を持っています。モデルのスケールは元の1/4であり、推論時間がさらに短縮され、ARMCPUの精度と遅延のバランスが改善されます。この記事の定量的スキームと効率的なアーキテクチャの設計の組み合わせは、純粋な整数算術推論が、リアルタイムおよびモバイル端末市場に参入するためのコンピュータビジョン技術を促進するための鍵になる可能性があることを示しています。

おすすめ

転載: blog.csdn.net/qq_37151108/article/details/109056012