vai_q_tensorflow2 量子化認識トレーニング - 2.5 日本語

Vitis AI ユーザー ガイド (UG1414)

Document ID
UG1414
Release Date
2022-06-15
Version
2.5 日本語
一般的に量子化後の精度ロスはわずかとなりますが、MobileNet などの一部のネットワークでは、大きくなる可能性があります。このような場合、量子化認識トレーニング (QAT) を実行して量子化モデルの精度をさらに向上させることができます。

QAT は浮動小数点モデルのトレーニング/微調整と似ていますが、トレーニングを開始する前に vai_q_tensorflow2 が浮動小数点グラフを書き換え、量子化モデルに変換する点が異なります。一般的なワークフローは、次のとおりです。完全なサンプルは、ここにあります。

  1. 浮動小数点モデル、データセット、およびトレーニング スクリプトを準備する。

    QAT の前に、次のファイルを準備してください。

    表 1. vai_q_tensorflow2 QAT 用の入力ファイル
    No. 名称 説明
    1 浮動小数点モデル 出発点となる浮動小数点モデル ファイル。ゼロからトレーニングする場合は省略できます。
    2 データセット ラベル付きのトレーニング データセット。
    3 トレーニング スクリプト モデルの浮動小数点トレーニング/微調整を実行する Python スクリプト。
  2. (オプション) 浮動小数点モデルを評価する。

    QAT の前に浮動小数点モデルを評価し、スクリプトとデータセットに問題がないことを確認します。浮動小数点チェックポイントの精度とロス値は、QAT のベースラインとしても使用できます。

  3. トレーニング スクリプトを変更して、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, quantize_strategy='8bit_tqt')
    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 `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
    model.compile(
            optimizer= RMSprop(learning_rate=lr_schedule), 
            loss=tf.keras.losses.SparseCategoricalCrossentropy(),
            metrics=keras.metrics.SparseTopKCategoricalAccuracy())
    
    
    # Start the training/finetuning
    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 を使用した場合)。それ以外の場合、トレーニングが収束しないことがあります。
  4. モデルを保存する。

    model.save() を呼び出してトレーニング済みモデルを保存するか、または model.fit() 内のコールバックを使用してモデルを定期的に保存します。例:

    # save model manually
    model.save(‘trained_model.h5’)
    
    # save the model periodically during fit using callbacks
    model.fit(
    	train_dataset, 
    	callbacks = [
          		keras.callbacks.ModelCheckpoint(
              	filepath=’./quantize_train/’
              	save_best_only=True,
              	monitor="sparse_categorical_accuracy",
              	verbose=1,
          )])
    
  5. 運用可能な量子化モデルに変換する。

    トレーニング/微調整後のモデルを、コンパイラ要件に合わせて変更します。たとえば、train_with_bn = TRUE に設定している場合、トレーニング時に BatchNormalization レイヤーの折りたたみが実行されないため、運用前に折りたたむ必要があります。トレーニング中に一部の量子化パラメーターが変化し、コンパイラの制限範囲を超えることがあります。これらは運用前に修正する必要があります。

    次の例に示すように、get_deploy_model() 関数を使用すると、これらの変換を実行して運用可能なモデルを生成できます。

    quantized_model = vitis_quantizer.get_deploy_model(model) quantized_model.save('quantized_model.h5') 
  6. (オプション) 量子化されたモデルを評価する。

    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)