量子化認識トレーニング (QAT) は、浮動小数点モデルのトレーニング/微調整と似ています。ただし、QAT では、トレーニングを開始する前に vai_q_tensorflow API は浮動小数点グラフを量子化されたグラフに変換します。一般的なワークフローを次に示します。
- 準備: QAT の前に、次のファイルを準備してください。
表 1. vai_q_tensorflow QAT 用の入力ファイル 番号 名前 説明 1 チェックポイント ファイル 開始する浮動小数点チェックポイント ファイル。モデルのトレーニングを新規に実行する場合は無視してください。 2 データセット ラベル付きのトレーニング データセット。 3 トレーニング スクリプト。 モデルの浮動小数点トレーニング/微調整を実行する Python スクリプト。 - 浮動小数点モデルを評価する (オプション): 量子化の微調整を実行する前に、浮動小数点チェックポイント ファイルを評価し、スクリプトとデータセットが正しいことを確認します。浮動小数点チェックポイントの精度とロス値は、QAT のベースラインとしても使用できます。
- トレーニング スクリプトを変更する: 量子化トレーニング グラフを作成するには、トレーニング スクリプトを変更して、浮動小数点グラフの構築後に関数を呼び出します。次に例を示します。
# train.py # ... # Create the float training graph model = model_fn(is_training=True) # *Set the quantize configurations import vai_q_tensorflow q_config = vai_q_tensorflow.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 vai_q_tensorflow.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 # ...
注記: 旧バージョンの vai_q_tensorflow のコードimport tensorflow.contrib.decent_q
との互換性をとるには、import vai_q_tensorflow as decent_q
を使用します。QuantizeConfig
には、量子化の設定が含まれます。input_nodes
、output_nodes
、and 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 の後、チェックポイント ファイルで量子化されたグラフを評価し、凍結されたモデルを生成します。これを実行するには、浮動小数点評価グラフの作成後に次の関数を呼び出します。凍結プロセスは量子化評価グラフに基づいて実行されるため、通常これらは一緒に呼び出します。 注記:
vai_q_tensorflow.CreateQuantizeTrainingGraph
およびvai_q_tensorflow.CreateQuantizeEvaluationGraph
は、TensorFlow のデフォルト グラフを変更します。これらは異なるグラフ フェーズで呼び出す必要があります。vai_q_tensorflow.CreateQuantizeTrainingGraph
は浮動小数点トレーニング グラフ上で呼び出す必要があり、vai_q_tensorflow.CreateQuantizeEvaluationGraph
は浮動小数点評価グラフで上で呼び出す必要があります。デフォルトのグラフは量子化トレーニング グラフに変換されているため、vai_q_tensorflow.CreateQuantizeTrainingGraph
関数を呼び出した直後にvai_q_tensorflow.CreateQuantizeEvaluationGraph
を呼び出すことはできません。この関数は、浮動小数点モデル作成関数の後に呼び出すのが正しい手順です。# eval.py # ... # Create the float evaluation graph model = model_fn(is_training=False) # *Set the quantize configurations import vai_q_tensorflow q_config = vai_q_tensorflow.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 vai_q_tensorflow.CreateQuantizeEvaluationGraph(config=q_config) # *Call Vai_q_tensorflow API to freeze the model and generate the deploy model vai_q_tensorflow.CreateQuantizeDeployGraph(checkpoint="path to checkpoint folder", config=q_config) # start the evaluation; You can use sess.run, tf.train, tf.estimator, tf.slim and so on # ...