このページは Cloud Translation API によって翻訳されました。
Switch to English

Kerasの例における量子化対応トレーニング

TensorFlow.orgで見る Google Colabで実行 GitHubでソースを表示する ノートブックをダウンロード

概観

量子化対応トレーニングのエンドツーエンドの例へようこそ。

他のページ

量子化に対応したトレーニングの概要と 、それを使用する必要があるかどうか(サポートされているものを含む)を判断するには、 概要ページを参照してください

ユースケースに必要なAPIをすばやく見つけるには(8ビットでモデルを完全に量子化する以外に)、 包括的なガイドを参照してください

概要

このチュートリアルでは、次のことを行います。

  1. tf.kerasモデルを最初からトレーニングします。
  2. 量子化対応トレーニングAPIを適用してモデルを微調整し、精度を確認して、量子化対応モデルをエクスポートします。
  3. モデルを使用して、TFLiteバックエンドの実際に量子化されたモデルを作成します。
  4. TFLiteと4倍の小型モデルの精度の持続性を確認してください。モバイルでのレイテンシのメリットを確認するには、TFLiteアプリリポジトリで TFLiteの例を試してください。

セットアップ

! pip uninstall -y tensorflow
! pip install -q tf-nightly
! pip install -q tensorflow-model-optimization

Found existing installation: tensorflow 2.3.0
Uninstalling tensorflow-2.3.0:
  Successfully uninstalled tensorflow-2.3.0
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

import tempfile
import os

import tensorflow as tf

from tensorflow import keras

量子化対応トレーニングなしでMNISTのモデルをトレーニングする

# Load MNIST dataset
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# Normalize the input image so that each pixel value is between 0 to 1.
train_images = train_images / 255.0
test_images = test_images / 255.0

# Define the model architecture.
model = keras.Sequential([
  keras.layers.InputLayer(input_shape=(28, 28)),
  keras.layers.Reshape(target_shape=(28, 28, 1)),
  keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation='relu'),
  keras.layers.MaxPooling2D(pool_size=(2, 2)),
  keras.layers.Flatten(),
  keras.layers.Dense(10)
])

# Train the digit classification model
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(
  train_images,
  train_labels,
  epochs=1,
  validation_split=0.1,
)
1688/1688 [==============================] - 8s 4ms/step - loss: 0.5175 - accuracy: 0.8544 - val_loss: 0.1275 - val_accuracy: 0.9648

<tensorflow.python.keras.callbacks.History at 0x7f37f03b39e8>

量子化対応トレーニングを使用して事前トレーニング済みモデルを複製および微調整

モデルを定義する

モデル全体に​​量子化対応トレーニングを適用し、モデルの概要でこれを確認します。すべてのレイヤーに「quant」というプレフィックスが付きました。

結果のモデルは量子化に対応していますが、量子化されていません(たとえば、重みはint8ではなくfloat32です)。以降のセクションでは、量子化対応モデルから量子化モデルを作成する方法を示します。

包括的なガイドで 、モデルの精度を向上させるために一部のレイヤーを量子化する方法を確認できます。

import tensorflow_model_optimization as tfmot

quantize_model = tfmot.quantization.keras.quantize_model

# q_aware stands for for quantization aware.
q_aware_model = quantize_model(model)

# `quantize_model` requires a recompile.
q_aware_model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

q_aware_model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
quantize_layer (QuantizeLaye (None, 28, 28)            3         
_________________________________________________________________
quant_reshape (QuantizeWrapp (None, 28, 28, 1)         1         
_________________________________________________________________
quant_conv2d (QuantizeWrappe (None, 26, 26, 12)        147       
_________________________________________________________________
quant_max_pooling2d (Quantiz (None, 13, 13, 12)        1         
_________________________________________________________________
quant_flatten (QuantizeWrapp (None, 2028)              1         
_________________________________________________________________
quant_dense (QuantizeWrapper (None, 10)                20295     
=================================================================
Total params: 20,448
Trainable params: 20,410
Non-trainable params: 38
_________________________________________________________________

モデルをベースラインに対してトレーニングおよび評価する

エポックのみのモデルをトレーニングした後に微調整を行うには、トレーニングデータのサブセットに対して量子化対応トレーニングで微調整します。

train_images_subset = train_images[0:1000] # out of 60000
train_labels_subset = train_labels[0:1000]

q_aware_model.fit(train_images_subset, train_labels_subset,
                  batch_size=500, epochs=1, validation_split=0.1)
2/2 [==============================] - 1s 167ms/step - loss: 0.1298 - accuracy: 0.9571 - val_loss: 0.1671 - val_accuracy: 0.9600

<tensorflow.python.keras.callbacks.History at 0x7f376c6db7b8>

この例では、ベースラインと比較して、量子化対応トレーニング後のテスト精度の損失は最小限からまったくありません。

_, baseline_model_accuracy = model.evaluate(
    test_images, test_labels, verbose=0)

_, q_aware_model_accuracy = q_aware_model.evaluate(
   test_images, test_labels, verbose=0)

print('Baseline test accuracy:', baseline_model_accuracy)
print('Quant test accuracy:', q_aware_model_accuracy)
Baseline test accuracy: 0.9609000086784363
Quant test accuracy: 0.9628999829292297

TFLiteバックエンドの量子化モデルを作成する

この後、int8の重みとuint8のアクティブ化で実際に量子化されたモデルができます。

converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

quantized_tflite_model = converter.convert()
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:109: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: /tmp/tmpoct8ii0p/assets

TFからTFLiteまでの精度の持続性を確認

テストデータセットでTF Liteモデルを評価するヘルパー関数を定義します。

import numpy as np

def evaluate_model(interpreter):
  input_index = interpreter.get_input_details()[0]["index"]
  output_index = interpreter.get_output_details()[0]["index"]

  # Run predictions on every image in the "test" dataset.
  prediction_digits = []
  for i, test_image in enumerate(test_images):
    if i % 1000 == 0:
      print('Evaluated on {n} results so far.'.format(n=i))
    # Pre-processing: add batch dimension and convert to float32 to match with
    # the model's input data format.
    test_image = np.expand_dims(test_image, axis=0).astype(np.float32)
    interpreter.set_tensor(input_index, test_image)

    # Run inference.
    interpreter.invoke()

    # Post-processing: remove batch dimension and find the digit with highest
    # probability.
    output = interpreter.tensor(output_index)
    digit = np.argmax(output()[0])
    prediction_digits.append(digit)

  print('\n')
  # Compare prediction results with ground truth labels to calculate accuracy.
  prediction_digits = np.array(prediction_digits)
  accuracy = (prediction_digits == test_labels).mean()
  return accuracy

量子化モデルを評価し、TensorFlowからの精度がTFLiteバックエンドまで持続することを確認します。

interpreter = tf.lite.Interpreter(model_content=quantized_tflite_model)
interpreter.allocate_tensors()

test_accuracy = evaluate_model(interpreter)

print('Quant TFLite test_accuracy:', test_accuracy)
print('Quant TF test accuracy:', q_aware_model_accuracy)
Evaluated on 0 results so far.
Evaluated on 1000 results so far.
Evaluated on 2000 results so far.
Evaluated on 3000 results so far.
Evaluated on 4000 results so far.
Evaluated on 5000 results so far.
Evaluated on 6000 results so far.
Evaluated on 7000 results so far.
Evaluated on 8000 results so far.
Evaluated on 9000 results so far.


Quant TFLite test_accuracy: 0.963
Quant TF test accuracy: 0.9628999829292297

量子化から4倍の小さいモデルを表示

フロートTFLiteモデルを作成し、量子化TFLiteモデルが4倍小さいことを確認します。

# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()

# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')

with open(quant_file, 'wb') as f:
  f.write(quantized_tflite_model)

with open(float_file, 'wb') as f:
  f.write(float_tflite_model)

print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))
INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

INFO:tensorflow:Assets written to: /tmp/tmpy0445k6u/assets

Float model in Mb: 0.08053970336914062
Quantized model in Mb: 0.02339935302734375

結論

このチュートリアルでは、TensorFlow Model Optimization Toolkit APIを使用して量子化対応モデルを作成し、次にTFLiteバックエンドの量子化モデルを作成する方法を説明しました。

精度の違いを最小限に抑えながら、MNISTのモデルに4倍のモデルサイズの圧縮のメリットを見ました。モバイルでのレイテンシの利点を確認するには、TFLiteアプリリポジトリで TFLiteの例を試してください。

リソースに制約のある環境での展開には特に重要になる可能性があるこの新しい機能を試すことをお勧めします。