第 2 世代インテル® Xeon® スケーラブル・プロセッサーでインテル® Deep Learning Boost を使用して TensorFlow* の推論を高速化

インテル® oneMKLマシンラーニング

この記事は、インテル® AI Blog に公開されている「Accelerating TensorFlow* Inference with Intel® Deep Learning Boost on 2nd Gen Intel® Xeon® Scalable Processors」の日本語参考訳です。


インテルは、ディープラーニング・アプリケーションを高速化するように設計された新しい組込みプロセッサー・テクノロジーのインテル® Deep Learning Boost (インテル® DL Boost) (英語) を発表しました。インテル® DL Boost には、8 ビット精度で計算を実行する新しい Vector Neural Network Instructions (VNNI) が含まれます。これは、メモリー使用量を 1/4 に減らし、浮動小数点精度と比較して毎秒実行される算術演算の割合を増やします。浮動小数点精度の事前トレーニング済みのモデルを使用して、ここではモデルの量子化バージョンを入手し、インテル® DL Boost 命令による推論パフォーマンスの向上を調査します。次に、ディープ・ニューラル・ネットワーク向けインテル® マス・カーネル・ライブラリー (インテル® MKL-DNN) (英語) を使用して、TensorFlow* で 8 ビット精度の推論ワークについてまとめます。

TensorFlow* における量子化

第 2 世代インテル® Xeon® スケーラブル・プロセッサーでインテル® DL Boost を有効にするため、32 ビット浮動小数点を使用するモデルで、ライブラリーを使用することなく 8 ビット推論をシームレスに使用できるようにインテル® Optimization for TensorFlow* を拡張しました。

また、事前トレーニング済みの 32 ビット浮動小数点モデルを 8 ビット推論を使用する量子化モデルに変換するオフライン・ツール、インテル® Optimization for TensorFlow* Quantization ツールを開発しました。モデルの量子化の詳細な説明とガイドラインは、インテル® AI Quantization Tools for TensorFlow* (英語) を参照してください。これらのツールを使用して、表 1 に示すように、高い精度を維持しつつ、畳み込みニューラル・ネットワークとフィードフォワード・ニューラル・ネットワークを含む一般的なディープラーニング・モデルを量子化することができました。すぐに使用できるように、Intel-model-zoo (英語) にいくつかの量子化モデルを公開しています。

モデルの量子化

ここでは、post-training モデルの量子化を有効にします。つまり、ユーザーは、事前トレーニング済みの浮動小数点モデルを量子化できます。これは、浮動小数点の活性化と重みを 8 ビット整数に変換して、計算グラフ中の浮動小数点演算を量子化バージョンに置き換えます。インテルのツールを使用して最適化済みの量子化モデルを取得する主なステップは次のとおりです。

  • fp32 推論モデルをシリアル化された TensorFlow* GraphDef としてエクスポート: これには、推論グラフを protobuf 形式で保存し、冗長なノードの削除 (例: Identity、CheckNumerics など)、定数の畳み込み、バッチ正規化の畳み込みを適用するグラフ変換が含まれます。
  • fp32 グラフを量子化グラフに変換: このステップは、fp32 操作を融合量子化操作に置き換えて、活性化に必要な変換操作を追加します (例: ‘QuantizeV2’、’Requanitze’ など)。重みの量子化もこのステップで行われます。
  • 量子化グラフのキャリブレーションと最適化: このステップでは、前のステップで取得した量子化グラフをトレーニング・データの小さなサブセット (キャリブレーション・データ) で実行して、活性化の範囲を固定します。結果グラフは、‘Requanitze’ 操作を融合することでさらに最適化されます。

上記のステップを説明するため、図 1 に各ステップで生成されるサブグラフを示します。広く使用されている CNN (例: ResNet、Inception など) は、conv2d → バッチ正規化 → ReLU 操作シーケンスを繰り返します。バッチ正規化の畳み込み終わると、図 1(a) のようなサブグラフが生成され、このサブグラフは図 1(b) の融合量子化演算子で置き換えられます。キャリブレーション後に図 1(c) に示すさらなる最適化が行われます。ほとんどの畳み込みは、ReLU が先行する操作であることから非負の正規化された入力を受け取るため、量子化畳み込みは符号なし 8 ビット整数の入力と符号付き 8 ビット整数のフィルターを受け取ります。必要な算術演算はインテル® DL Boost の VPDPBUSD 命令で効率良く行うことができるため (詳細はこちら (英語) を参照)、この符号なしと符号付きの組み合わせはパフォーマンスにとっても重要です。

図 1: 3 つのステップの後に生成されるサブグラフ: (a) fp32、(b) 8 ビット量子化、および (c) キャリブレーション済み 8 ビット量子化。
図 1 (a): fp32 サブグラフ

図 1: 3 つのステップの後に生成されるサブグラフ: (a) fp32、(b) 8 ビット量子化、および (c) キャリブレーション済み 8 ビット量子化。
図 1(b): 8 ビット量子化サブグラフ

図 1: 3 つのステップの後に生成されるサブグラフ: (a) fp32、(b) 8 ビット量子化、および (c) キャリブレーション済み 8 ビット量子化。
図 1 (c): キャリブレーション済み 8 ビット量子化サブグラフ

インテル® DL Boost 命令を利用できる conv2D および matmul 操作のほかに、メモリー帯域幅のボトルネックを大幅に軽減し、不要な量子化/逆量子化を回避する poolingconcat 操作があります。最高のパフォーマンスを達成するには、可能な限り連続して 8 ビット精度の操作を使用することを推奨します。

一部の事前トレーニング済みモデル (例: MobileNet) は、異なるチャネルで重みテンソルのデータ分布が異なります。そのような場合、重みテンソルの量子化に単一のスケール・パラメーターを使用すると、精度が大幅に低下する可能性があります。この問題は、’RequantizePerChannel’ や ‘RequantizationRangePerChannel’ などの新しい演算子を追加することで緩和できます。このようにモデル量子化ツールをチャネルごとに拡張することで、Mobilenet 関連のモデルの精度低下を回復することができました。

精度とパフォーマンス

ここでは、画像分類、オブジェクト検出、推奨システム向けのいくつかの一般的なディープラーニング・モデルで 8 ビットの推論を可能にします。表 1 は、第 2 世代インテル® Xeon® スケーラブル・プロセッサー上でのいくつかの CNN モデルの精度とパフォーマンスの向上を示しています。表から分かるように、インテル® DL Boost は fp32 モデルに近い精度を維持しつつ推論を大幅にスピードアップします。[1]

モデル Top 1 精度 (%) スループットのスピードアップ
FP32
(インテル® Xeon®
スケーラブル・プロセッサー)
INT8
(第 2 世代インテル® Xeon®
スケーラブル・プロセッサー)
第 2 世代インテル® Xeon®
スケーラブル・プロセッサー
ResNet-50 74.30 73.75 3.9 倍
ResNet-101 76.40 75.66 4.0 倍
Inception-v3 76.75 76.51 3.1 倍

表 1: 浮動小数点モデルと量子化モデルの精度とパフォーマンス

第 2 世代インテル® Xeon® スケーラブル・プロセッサー上のインテル® DL Boost は、コンピューター・ビジョン、自然言語処理、音声処理で使用されるディープモデルの高速化において有益な結果をもたらします。インテルが開発したツールセットを使用して、ほかのライブラリーに依存することなく fp32 モデルを量子化して TensorFlow* で推論パフォーマンスを向上できます。量子化ツールの詳細とダウンロードは、intel-quantization-tool (英語) を参照してください。

関連ドキュメント

その他の協力者

謝辞

法務上の注意書きと最適化に関する注意事項

システム構成

タイトルとURLをコピーしました