量子化認識トレーニング (QAT) 手順は、浮動小数点モデルのトレーニング/微調整とほぼ同じです。ただし QAT では、トレーニングを開始する前に vai_q_tensorflow の API を使用して浮動小数点グラフを書き換え、量子化されたグラフに変換します。一般的なワークフローは、次のとおりです。
- 準備: QAT の前に、次のファイルを準備してください。
表 1. vai_q_tensorflow QAT 用の入力ファイル No. 名称 説明 1 チェックポイント ファイル 出発点となる浮動小数点チェックポイント ファイル。モデルのトレーニングを新規に実行する場合は不要です。 2 データセット ラベル付きのトレーニング データセット。 3 トレーニング スクリプト。 モデルの浮動小数点トレーニング/微調整を実行する Python スクリプト。 - 浮動小数点モデルを評価する (オプション): 量子化の微調整を実行する前に、浮動小数点チェックポイント ファイルを評価し、スクリプトとデータセットに問題がないことを確認します。浮動小数点チェックポイントの精度とロス値は、QAT のベースラインとしても使用できます。
- トレーニング スクリプトを変更する: 量子化トレーニング グラフを作成するには、トレーニング スクリプトを変更して、浮動小数点グラフの構築後に関数を呼び出します。次に例を示します。
# train.py # ... # Create the float training graph model = model_fn(is_training=True) # *Set the quantize configurations from tensorflow.contrib import decent_q q_config = decent_q.QuantizeConfig(input_nodes=['net_in'], output_nodes=['net_out'], input_shapes=[[-1, 224, 224, 3]]) # *Call Vai_q_tensorflow api to create the quantize training graph decent_q.CreateQuantizeTrainingGraph(config=q_config) # Create the optimizer optimizer = tf.train.GradientDescentOptimizer() # start the training/finetuning, you can use sess.run(), tf.train, tf.estimator, tf.slim and so on # ...
QuantizeConfig
には、量子化の設定が含まれます。input_nodes
、output_nodes
、input_shapes
などいくつかの基本設定は、モデル構造に従って指定する必要があります。weight_bit
、activation_bit
、method
などのその他の設定にはデフォルト値があり、必要に応じて変更できます。すべての設定の詳細は、vai_q_tensorflow の使用法 を参照してください。-
input_nodes
/output_nodes
- これらのパラメーターを使用して、量子化するサブグラフの範囲を指定します。前処理部および後処理部は通常は量子化できないため、この範囲から除外する必要があります。浮動小数点トレーニング グラフと浮動小数点評価グラフの量子化動作を完全に一致させるには、両方のグラフに同じ input_nodes と output_nodes を指定する必要があります。 注記: 現在、FIFO などの複数の出力テンソルを使用する量子化動作はサポートされていません。tf.identity ノードを追加して input_tensor のエイリアスを作成し、単一出力の入力ノードを作成してください。
-
input_shapes
- input_nodes の形状リストは、各ノードを 4 次元形状とする必要があります。この情報は、カンマで区切る必要があります (例: [[1,224,224,3] [1, 128, 128, 1]])。batch_size の不明なサイズをサポートします (例: [[-1,224,224,3]])。
-
- 量子化モデルを評価し、凍結されたモデルを生成する: QAT の後、チェックポイント ファイルを使用して量子化グラフを評価し、凍結されたモデルを生成します。これを実行するには、浮動小数点評価グラフの作成後に次の関数を呼び出します。凍結プロセスは量子化評価グラフに基づいて実行されるため、通常これらは一緒に呼び出します。注記: 関数
decent_q.CreateQuantizeTrainingGraph
およびdecent_q.CreateQuantizeEvaluationGraph
は、Tensorflow のデフォルト グラフを変更します。これらの関数は、それぞれ異なるグラフ フェーズで呼び出す必要があることに注意してください。decent_q.CreateQuantizeTrainingGraph
は浮動小数点トレーニング グラフ上で呼び出す必要があり、decent_q.CreateQuantizeEvaluationGraph
は浮動小数点評価グラフで上で呼び出す必要があります。デフォルトのグラフは量子化トレーニング グラフに変換されているため、関数decent_q.CreateQuantizeTrainingGraph
を呼び出した直後にdecent_q.CreateQuantizeEvaluationGraph
を呼び出すことはできません。この関数は、浮動小数点モデル作成関数の直後に呼び出すのが正しい手順です。# eval.py # ... # Create the float evaluation graph model = model_fn(is_training=False) # *Set the quantize configurations from tensorflow.contrib import decent_q q_config = decent_q.QuantizeConfig(input_nodes=['net_in'], output_nodes=['net_out'], input_shapes=[[-1, 224, 224, 3]]) # *Call Vai_q_tensorflow api to create the quantize evaluation graph decent_q.CreateQuantizeEvaluationGraph(config=q_config) # *Call Vai_q_tensorflow api to freeze the model and generate the deploy model decent_q.CreateQuantizeDeployGraph(checkpoint="path to checkpoint folder", config=q_config) # start the evaluation, users can use sess.run, tf.train, tf.estimator, tf.slim and so on # ...