PAI-Blade は、GPU 上で TensorFlow および PyTorch モデル向けの INT8 量子化をサポートしています。量子化は、32 ビット浮動小数点数を低ビット幅の固定小数点整数に置き換えることで、モデルのメモリ使用量を削減し、推論スループットを向上させます。
INT8 量子化を実行するには、GPU が INT8 演算をサポートしている必要があります。ご利用の GPU デバイスが INT8 量子化をサポートしており、量子化済みモデルの高速化が可能である場合、PAI-Blade は自動的に量子化を実行します。
仕組み
オンラインモードとオフラインモードの比較
| オンラインモード | オフラインモード | |
|---|---|---|
| キャリブレーションデータセット | 不要 | 必要 |
| アクセラレーション | 低い | 高い(推奨) |
| 量子化パラメーター | キャリブレーションデータセットなしで計算 | キャリブレーションデータから計算 |
TensorFlow モデルでは、両モードがサポートされています。PyTorch モデルでは、オフラインモードのみ利用可能です — キャリブレーションデータセットが必須です。
キャリブレーションデータセット
キャリブレーションデータセットは、実際の推論入力の分布を代表するものである必要があります。本トピック内のコード例では、説明のため 10 サンプルを使用しています。
| フレームワーク | 形式 |
|---|---|
| TensorFlow | feed_dict 引数のリスト。すべての値は np.ndarray |
| PyTorch | 複数の入力データグループを含むリスト |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
INT8 量子化をサポートする GPU
Python 環境に PAI-Blade がインストール済み
学習済みの TensorFlow(フローズン)または PyTorch(トレース済み)モデル
TensorFlow モデルの量子化
量子化を有効にするには、blade.optimize() の optimization_level='o2' を設定します。最良の結果を得るには、オフラインモードで実行するためにキャリブレーションデータセットを指定してください。
キャリブレーションデータセットの準備:
# キャリブレーションデータセットを準備します。
import numpy as np
calib_data = list()
for i in range(10):
# feed_dict 引数のすべての値は np.ndarray 型である必要があります。
feed_dict = {'input:0': np.ones((32, 224, 224, 3), dtype=np.float32)}
calib_data.append(feed_dict)操作手順:
サンプルモデル、テストデータ、およびキャリブレーションデータセットをダウンロードします。
wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/frozen.pb wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/test_bc32.npy wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/calib_data_test_bc32.npyモデルおよびデータを読み込みます。
import numpy as np import tensorflow as tf # モデルを読み込みます。 graph_def = tf.GraphDef() with open('frozen.pb', 'rb') as f: graph_def.ParseFromString(f.read()) # テストデータを読み込みます。 test_data = np.load('test_bc32.npy', allow_pickle=True, encoding='bytes',).item() # キャリブレーションデータセットを読み込みます。 calib_data = np.load('calib_data_test_bc32.npy', allow_pickle=True, encoding='bytes',)オフラインモードで INT8 量子化を実行します。
import blade optimized_model, opt_spec, report = blade.optimize( model=graph_def, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data )量子化済みモデルの精度を検証します。完全なテストデータセットを使用して、精度の低下が著しくないか確認してください。精度が要件を満たす場合は、量子化は完了です。精度損失が大きすぎる場合は、
weight_adjustmentを有効にして、PAI-Blade がモデルパラメーターを自動調整できるようにします。このオプションは、GPU 上の TensorFlow モデルのみで利用可能です。quant_config = { 'weight_adjustment': 'true' # デフォルト値:false。 } optimized_model, opt_spec, report = blade.optimize( model=graph_def, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data, config=blade.Config(quant_config=quant_config) )利用可能なすべての量子化構成オプションについては、「blade.Config」をご参照ください。
PyTorch モデルの量子化
PyTorch モデルはオフラインモードでのみ量子化可能です。キャリブレーションデータセットが必須です。
量子化を有効にするには、blade.optimize() の optimization_level='o2' を設定します。
キャリブレーションデータセットの準備:
# キャリブレーションデータセットを準備します。
import torch
calib_data = list()
for i in range(10):
image = torch.ones(32, 3, 224, 224)
calib_data.append(image)操作手順:
サンプルモデル、テストデータ、およびキャリブレーションデータセットをダウンロードします。
wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/traced_model.pt wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/test_bc32.pth wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/calib_data_test_bc32.pthモデルおよびデータを読み込みます。
import torch # モデルを読み込みます。 pt_model = torch.jit.load('traced_model.pt') # テストデータを読み込みます。 test_data = torch.load('test_bc32.pth') # キャリブレーションデータセットを読み込みます。 calib_data = torch.load('calib_data_test_bc32.pth')オフラインモードで INT8 量子化を実行します。
import blade optimized_model, opt_spec, report = blade.optimize( model=pt_model, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data )
次のステップ
その他の最適化レベルを用いた TensorFlow モデルの最適化については、「TensorFlow モデルの最適化」をご参照ください。
weight_adjustmentを含むすべての量子化構成オプションについては、「blade.Config」をご参照ください。