Machine Learning Platform for AI (PAI)-Bladeは、GPUデバイスまたはクライアントデバイスでTensorFlowおよびPyTorchモデルのINT8量子化をサポートします。 このトピックでは、PAI-Bladeを使用してGPUデバイスのモデルを量子化する方法について説明します。
背景情報
量子化は、モデルをコンパクトにするために最も一般的に使用される方法の1つです。 32ビット浮動小数点数の代わりに、より少ないビット幅を必要とする固定小数点整数が使用される。 これにより、メモリアクセスのオーバーヘッドが削減され、実行中のコマンドのインバウンドスループットが向上します。 量子化には、基礎となるコンピューティングハードウェアからのサポートが必要です。
TensorFlowモデルの量子化
TensorFlowモデルを最適化する方法の詳細については、「TensorFlowモデルの最適化」をご参照ください。 さらに、PAI-Bladeを使用してモデルを最適化する場合、optimization_level='o2'
を指定してモデルの量子化を実行できます。 使用するGPUデバイスがINT8量子化をサポートし、量子化モデルを高速化できる場合、PAI-Bladeはデフォルトモードで量子化を実行します。
キャリブレーションデータセットを提供しない場合、PAI-BladeはオンラインモードでINT8量子化を実行します。
高速化を実現するには、オフラインモードで量子化パラメーターを計算するために使用するキャリブレーションデータセットを提供することをお勧めします。 PAI − Bladeが較正データセットを取得した後、PAI − BladeはオフラインモードでINT8量子化を自動的に実行する。
TensorFlowモデルの量子化に使用される校正データセットは、feed_dict引数のリストです。 次のサンプルコードに例を示します。
# Prepare a calibration dataset.
import numpy as np
calib_data = list()
for i in range(10):
# All values in the feed_dict arguments must be of the np.ndarray type.
feed_dict = {'input:0': np.ones((32, 224, 224, 3), dtype=np.float32)}
calib_data.append(feed_dict)
TensorFlowモデルを量子化するには、次の手順を実行します。
サンプルモデル、テストデータ、および校正データセットをダウンロードします。
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 # Load the model. graph_def = tf.GraphDef() with open('frozen.pb', 'rb') as f: graph_def.ParseFromString(f.read()) # Load the test data. test_data = np.load('test_bc32.npy', allow_pickle=True, encoding='bytes',).item() # Load the calibration dataset. 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 )
量子化モデルの精度を検証します。
量子化が完了したら、完全なテストデータセットを使用して、量子化モデルの精度が大幅に低下しているかどうかを確認できます。 量子化モデルの精度が要件を満たしている場合は、次のコードを実行する必要はありません。 それ以外の場合は、次のコードを実行して量子化設定を変更し、精度の低下を減らすことができます。 量子化設定の詳細については、「blade.Config」をご参照ください。
GPUデバイスでTensorFlowモデルを量子化する場合、weight_adjustment機能のみを有効にできます。 weight_adjustmentキーをtrueに設定すると、PAI-Bladeはモデルパラメータを自動的に調整して精度の低下を減らします。 次のサンプルコードでは、この機能を有効にする方法の例を示します。
quant_config = { 'weight_adjustment': 'true' # Default value: 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) )
PyTorchモデルを定量化する
TensorFlowモデルの量子化と同様に、PAI-Bladeを使用してPyTorchモデルを最適化するときに量子化を有効にするには、optimization_level='o2'
を指定するだけです。 ただし、PyTorchモデルはオフラインモードでのみ量子化できます。 したがって、PyTorchモデルの量子化を有効にするときに、オフラインモードで量子化パラメータを計算するために使用できるキャリブレーションデータセットを提供する必要があります。
PyTorchモデルの量子化に使用される校正データセットは、複数の入力データグループを含むリストです。 次のサンプルコードに例を示します。
# Prepare a calibration dataset.
import numpy as np
calib_data = list()
for i in range(10):
image = torch.ones(32, 3, 224, 224)
calib_data.append(image)
PyTorchモデルを量子化するには、次の手順を実行します。
サンプルモデル、テストデータ、および校正データセットをダウンロードします。
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 # Load the model. pt_model = torch.jit.load('traced_model.pt') # Load the test data. test_data = torch.load('test_bc32.npy') # Load the calibration dataset. calib_data = torch.load('calib_data_test_bc32.npy')
オフラインモードで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 )