Lượng tử hóa dải động sau đào tạo

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép Xem mô hình TF Hub

Tổng quat

TensorFlow Lite bây giờ hỗ trợ chuyển đổi trọng lượng tới 8 bit chính xác như một phần của mô hình chuyển đổi từ graphdefs tensorflow sang định dạng đệm phẳng TensorFlow Lite. Lượng tử hóa dải động giúp giảm 4 lần kích thước mô hình. Ngoài ra, TFLite hỗ trợ lượng tử hóa nhanh chóng và xác minh các kích hoạt để cho phép:

  1. Sử dụng hạt nhân lượng tử hóa để triển khai nhanh hơn khi có sẵn.
  2. Trộn hạt nhân dấu phẩy động với hạt nhân lượng tử hóa cho các phần khác nhau của đồ thị.

Các kích hoạt luôn được lưu trữ trong dấu phẩy động. Đối với các hoạt động hỗ trợ hạt nhân lượng tử hóa, các kích hoạt được lượng tử hóa thành 8 bit chính xác động trước khi xử lý và được khử lượng tử hóa để có độ chính xác nổi sau khi xử lý. Tùy thuộc vào mô hình được chuyển đổi, điều này có thể tăng tốc độ tính toán dấu phẩy động thuần túy.

Ngược lại với đào tạo nhận thức được lượng tử hóa , trọng lượng là bài lượng tử đào tạo và kích hoạt được lượng tử hóa năng động tại suy luận trong phương pháp này. Do đó, trọng số mô hình không được đào tạo lại để bù cho các lỗi lượng tử hóa gây ra. Điều quan trọng là phải kiểm tra độ chính xác của mô hình lượng tử hóa để đảm bảo rằng sự suy giảm có thể chấp nhận được.

Hướng dẫn này đào tạo mô hình MNIST từ đầu, kiểm tra độ chính xác của nó trong TensorFlow, sau đó chuyển đổi mô hình thành bộ đệm phẳng Tensorflow Lite với lượng tử hóa dải động. Cuối cùng, nó kiểm tra độ chính xác của mô hình được chuyển đổi và so sánh với mô hình float ban đầu.

Xây dựng mô hình MNIST

Thành lập

import logging
logging.getLogger("tensorflow").setLevel(logging.DEBUG)

import tensorflow as tf
from tensorflow import keras
import numpy as np
import pathlib

Đào tạo mô hình TensorFlow

# 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=tf.nn.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=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(
  train_images,
  train_labels,
  epochs=1,
  validation_data=(test_images, test_labels)
)
1875/1875 [==============================] - 6s 2ms/step - loss: 0.3260 - accuracy: 0.9063 - val_loss: 0.1721 - val_accuracy: 0.9499
<keras.callbacks.History at 0x7fb7a1c4ed90>

Ví dụ: vì bạn đã đào tạo mô hình chỉ trong một kỷ nguyên duy nhất, nên mô hình chỉ đào tạo đến độ chính xác ~ 96%.

Chuyển đổi sang mô hình TensorFlow Lite

Sử dụng Python TFLiteConverter , bây giờ bạn có thể chuyển đổi các mô hình đào tạo thành một mô hình TensorFlow Lite.

Bây giờ tải các mô hình sử dụng TFLiteConverter :

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
2021-11-02 11:23:32.211024: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpua453ven/assets
2021-11-02 11:23:32.640259: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:32.640302: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.

Viết nó ra tệp tflite:

tflite_models_dir = pathlib.Path("/tmp/mnist_tflite_models/")
tflite_models_dir.mkdir(exist_ok=True, parents=True)
tflite_model_file = tflite_models_dir/"mnist_model.tflite"
tflite_model_file.write_bytes(tflite_model)
84500

Để quantize mô hình xuất khẩu, thiết lập optimizations cờ để tối ưu hóa cho kích thước:

converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()
tflite_model_quant_file = tflite_models_dir/"mnist_model_quant.tflite"
tflite_model_quant_file.write_bytes(tflite_quant_model)
INFO:tensorflow:Assets written to: /tmp/tmpaw0wsb_y/assets
INFO:tensorflow:Assets written to: /tmp/tmpaw0wsb_y/assets
2021-11-02 11:23:33.235475: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:33.235512: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
23904

Lưu ý cách các tập tin kết quả, là khoảng 1/4 kích thước.

ls -lh {tflite_models_dir}
total 136K
-rw-rw-r-- 1 kbuilder kbuilder 83K Nov  2 11:23 mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder 24K Nov  2 11:23 mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder 25K Nov  2 11:20 mnist_model_quant_16x8.tflite

Chạy các mô hình TFLite

Chạy mô hình TensorFlow Lite bằng Trình thông dịch Python TensorFlow Lite.

Tải mô hình vào trình thông dịch

interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))
interpreter.allocate_tensors()
interpreter_quant = tf.lite.Interpreter(model_path=str(tflite_model_quant_file))
interpreter_quant.allocate_tensors()

Kiểm tra mô hình trên một hình ảnh

test_image = np.expand_dims(test_images[0], axis=0).astype(np.float32)

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

interpreter.set_tensor(input_index, test_image)
interpreter.invoke()
predictions = interpreter.get_tensor(output_index)
import matplotlib.pylab as plt

plt.imshow(test_images[0])
template = "True:{true}, predicted:{predict}"
_ = plt.title(template.format(true= str(test_labels[0]),
                              predict=str(np.argmax(predictions[0]))))
plt.grid(False)

png

Đánh giá các mô hình

# A helper function to evaluate the TF Lite model using "test" dataset.
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 test_image in test_images:
    # 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)

  # Compare prediction results with ground truth labels to calculate accuracy.
  accurate_count = 0
  for index in range(len(prediction_digits)):
    if prediction_digits[index] == test_labels[index]:
      accurate_count += 1
  accuracy = accurate_count * 1.0 / len(prediction_digits)

  return accuracy
print(evaluate_model(interpreter))
0.9499

Lặp lại đánh giá trên mô hình lượng tử hóa dải động để thu được:

print(evaluate_model(interpreter_quant))
0.95

Trong ví dụ này, mô hình nén không có sự khác biệt về độ chính xác.

Tối ưu hóa mô hình hiện có

Mạng lưới có các lớp kích hoạt trước (Resnet-v2) được sử dụng rộng rãi cho các ứng dụng thị giác. Pre-đào tạo biểu đồ đông lạnh cho resnet-v2-101 có sẵn trên Tensorflow Hub .

Bạn có thể chuyển đổi biểu đồ cố định thành bộ đệm phẳng TensorFLow Lite với lượng tử hóa bằng cách:

import tensorflow_hub as hub

resnet_v2_101 = tf.keras.Sequential([
  keras.layers.InputLayer(input_shape=(224, 224, 3)),
  hub.KerasLayer("https://tfhub.dev/google/imagenet/resnet_v2_101/classification/4")
])

converter = tf.lite.TFLiteConverter.from_keras_model(resnet_v2_101)
# Convert to TF Lite without quantization
resnet_tflite_file = tflite_models_dir/"resnet_v2_101.tflite"
resnet_tflite_file.write_bytes(converter.convert())
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
INFO:tensorflow:Assets written to: /tmp/tmpxtji1amp/assets
INFO:tensorflow:Assets written to: /tmp/tmpxtji1amp/assets
2021-11-02 11:23:57.616139: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:23:57.616201: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
178509352
# Convert to TF Lite with quantization
converter.optimizations = [tf.lite.Optimize.DEFAULT]
resnet_quantized_tflite_file = tflite_models_dir/"resnet_v2_101_quantized.tflite"
resnet_quantized_tflite_file.write_bytes(converter.convert())
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
INFO:tensorflow:Assets written to: /tmp/tmpg169iato/assets
INFO:tensorflow:Assets written to: /tmp/tmpg169iato/assets
2021-11-02 11:24:12.965799: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 11:24:12.965851: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
46256864
ls -lh {tflite_models_dir}/*.tflite
-rw-rw-r-- 1 kbuilder kbuilder  83K Nov  2 11:23 /tmp/mnist_tflite_models/mnist_model.tflite
-rw-rw-r-- 1 kbuilder kbuilder  24K Nov  2 11:23 /tmp/mnist_tflite_models/mnist_model_quant.tflite
-rw-rw-r-- 1 kbuilder kbuilder  25K Nov  2 11:20 /tmp/mnist_tflite_models/mnist_model_quant_16x8.tflite
-rw-rw-r-- 1 kbuilder kbuilder 171M Nov  2 11:23 /tmp/mnist_tflite_models/resnet_v2_101.tflite
-rw-rw-r-- 1 kbuilder kbuilder  45M Nov  2 11:24 /tmp/mnist_tflite_models/resnet_v2_101_quantized.tflite

Kích thước mô hình giảm từ 171 MB xuống 43 MB. Độ chính xác của mô hình này trên imagenet thể được đánh giá bằng cách sử dụng các kịch bản cung cấp cho đo lường chính xác TFLite .

Độ chính xác top 1 của mô hình được tối ưu hóa là 76,8, giống như mô hình dấu phẩy động.