一般的に、量子化によってモデルの精度はわずかに低下する可能性があります。ただし、MobileNet などの特定のネットワークでは、精度ロスが大きくなることがあります。これに対処するため、量子化認識トレーニング (QAT) は量子化されたモデルの精度をさらに高めるソリューションを提供します。
QAT は浮動小数点モデルのトレーニング/微調整と似ていますが、トレーニングを開始する前に vai_q_tensorflow2 が浮動小数点グラフを書き換え、量子化モデルに変換する点が異なります。完全なサンプルは、ここ にあります。
QAT の一般的なワークフローは、次のとおりです。
- 浮動小数点モデル、データセット、およびトレーニング スクリプトを準備する。
QAT の前に、次のファイルを準備してください。
表 1. vai_q_tensorflow2 QAT 用の入力ファイル 番号 名前 説明 1 浮動小数点モデル 開始点となる浮動小数点モデル。ゼロからトレーニングを実行するときは無視できます。 2 データセット ラベル付きのトレーニング データセット。 3 トレーニング スクリプト モデルの浮動小数点トレーニング/微調整を実行する Python スクリプト。 - (オプション) 浮動小数点モデルを評価する。
QAT の前に浮動小数点モデルを評価し、スクリプトとデータセットが正しいことを確認します。浮動小数点チェックポイントの精度とロス値は、QAT のベースラインとしても使用できます。
- トレーニング スクリプトを変更して、QAT を実行する。
vai_q_tensorflow2 API の
VitisQuantizer.get_qat_model
を使用してモデルを量子化済みモデルに変換した後、トレーニング/微調整に進みます。次に例を示します。model = tf.keras.models.load_model('float_model.h5') # *Call Vai_q_tensorflow2 api to create the quantize training model from tensorflow_model_optimization.quantization.keras import vitis_quantize quantizer = vitis_quantize.VitisQuantizer(model) qat_model = quantizer.get_qat_model( init_quant=True, # Do init PTQ quantization will help us to get a better initial state for the quantizers, especially for the `pof2s_tqt` strategy. Must be used together with calib_dataset calib_dataset=calib_dataset) # Then run the training process with this qat_model to get the quantize finetuned model. # Compile the model qat_model.compile( optimizer= RMSprop(learning_rate=lr_schedule), loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=keras.metrics.SparseTopKCategoricalAccuracy()) # Start the training/finetuning qat_model.fit(train_dataset)
注記: Vitis AI は 2.0 以降、pof2s_tqt 量子化ストラテジをサポートしています。この場合、クオンタイザーは Trained-Threshold を使用し、QAT の結果が改善することがあります。デフォルトでは、Straight-Through-Estimator が使用されます。最大限の性能を得るには、QAT で'init_quant=True'
の場合のみ 8bit_tqt 手法を使用します。PTQ 量子化を使用して初期化を実行すると、クオンタイザーのパラメーターの初期状態が改善します (特に pof2s_tqt を使用した場合)。それ以外の場合、トレーニングが収束しないことがあります。 - モデルを保存する。
model.save()
を呼び出してトレーニング済みモデルを保存するか、またはmodel.fit()
内のコールバックを使用してモデルを定期的に保存します。例:# save model manually qat_model.save('trained_model.h5') # save the model periodically during fit using callbacks qat_model.fit( train_dataset, callbacks = [ keras.callbacks.ModelCheckpoint( filepath='./quantize_train/' save_best_only=True, monitor="sparse_categorical_accuracy", verbose=1, )])
- 運用可能な量子化モデルに変換する。
トレーニング/微調整後のモデルを、コンパイラ要件に合わせて変更します。たとえば、
train_with_bn
= TRUE に設定している場合、トレーニング時にバッチ正規化レイヤーの折りたたみが実行されないため、運用前に折りたたむ必要があります。トレーニング中に一部の量子化パラメーターが変化し、コンパイラの制限範囲を超えることがあります。これらは運用前に修正する必要があります。次の例に示すように、
get_deploy_model()
関数を使用すると、これらの変換を実行して運用可能なモデルを生成できます。quantized_model = vitis_quantizer.get_deploy_model(qat_model) quantized_model.save('quantized_model.h5')
- (オプション) 量子化されたモデルを評価する。
eval_dataset
上でmodel.evaluate()
を呼び出し、浮動小数点モデルの評価と同じように、量子化されたモデルを評価します。from tensorflow_model_optimization.quantization.keras import vitis_quantize quantized_model = tf.keras.models.load_model('quantized_model.h5') quantized_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics= keras.metrics.SparseTopKCategoricalAccuracy()) quantized_model.evaluate(eval_dataset)
推奨: QAT に進む前に浮動小数点モデルのトレーニングと微調整を使用してください。