প্রশিক্ষণোত্তর গতিশীল পরিসীমা কোয়ান্টাইজেশন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন TF হাব মডেল দেখুন

ওভারভিউ

TensorFlow লাইট এখন TensorFlow লাইট এর ফ্ল্যাট বাফার ফর্ম্যাটে tensorflow graphdefs থেকে মডেল রূপান্তর অংশ হিসেবে 8 বিট স্পষ্টতা থেকে ওজন রূপান্তর সমর্থন করে। ডায়নামিক রেঞ্জ কোয়ান্টাইজেশন মডেলের আকারে 4x হ্রাস অর্জন করে। উপরন্তু, TFLite ফ্লাই কোয়ান্টাইজেশন এবং অ্যাক্টিভেশনের ডিকোয়ান্টাইজেশনকে সমর্থন করে:

  1. উপলব্ধ হলে দ্রুত বাস্তবায়নের জন্য কোয়ান্টাইজড কার্নেল ব্যবহার করা।
  2. গ্রাফের বিভিন্ন অংশের জন্য কোয়ান্টাইজড কার্নেলের সাথে ভাসমান-বিন্দু কার্নেলের মিশ্রণ।

সক্রিয়করণগুলি সর্বদা ফ্লোটিং পয়েন্টে সংরক্ষণ করা হয়। কোয়ান্টাইজড কার্নেল সমর্থন করে এমন অপারেশনগুলির জন্য, সক্রিয়করণগুলি প্রক্রিয়াকরণের পূর্বে গতিশীলভাবে 8 বিট নির্ভুলতার পরিমাণ করা হয় এবং প্রক্রিয়াকরণের পরে নির্ভুলতা ভাসানোর জন্য ডি-কোয়ান্টাইজ করা হয়। রূপান্তরিত মডেলের উপর নির্ভর করে, এটি বিশুদ্ধ ভাসমান বিন্দু গণনার উপর একটি গতি দিতে পারে।

বিপরীতে quantization সচেতন প্রশিক্ষণ , ওজন নিরবচ্ছিন্ন পোস্টে প্রশিক্ষণ এবং সক্রিয়করণব্যবস্থা এই পদ্ধতিতে অনুমান এ পরিবর্তনশীল নিরবচ্ছিন্ন করছে। অতএব, মডেলের ওজনগুলি পরিমাপকরণ প্ররোচিত ত্রুটিগুলির জন্য ক্ষতিপূরণের জন্য পুনরায় প্রশিক্ষণ দেওয়া হয় না। অবক্ষয় গ্রহণযোগ্য কিনা তা নিশ্চিত করতে কোয়ান্টাইজড মডেলের যথার্থতা পরীক্ষা করা গুরুত্বপূর্ণ।

এই টিউটোরিয়ালটি স্ক্র্যাচ থেকে একটি MNIST মডেলকে প্রশিক্ষণ দেয়, TensorFlow-এ এর যথার্থতা পরীক্ষা করে এবং তারপরে গতিশীল পরিসীমা পরিমাপ সহ মডেলটিকে একটি Tensorflow Lite ফ্ল্যাটবাফারে রূপান্তর করে। অবশেষে, এটি রূপান্তরিত মডেলের যথার্থতা পরীক্ষা করে এবং এটি মূল ফ্লোট মডেলের সাথে তুলনা করে।

একটি MNIST মডেল তৈরি করুন

সেটআপ

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

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

একটি টেনসরফ্লো মডেলকে প্রশিক্ষণ দিন

# 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>

উদাহরণ স্বরূপ, যেহেতু আপনি মডেলটিকে শুধুমাত্র একটি যুগের জন্য প্রশিক্ষণ দিয়েছেন, তাই এটি শুধুমাত্র ~96% নির্ভুলতার জন্য প্রশিক্ষণ দেয়।

একটি টেনসরফ্লো লাইট মডেলে রূপান্তর করুন

পাইথন ব্যবহার TFLiteConverter , আপনি এখন একটি TensorFlow লাইট মডেল মধ্যে প্রশিক্ষিত মডেল রূপান্তর করতে পারেন।

Now ব্যবহার করা মডেল লোড 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.

এটি একটি 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 করার জন্য, সেট optimizations আকার জন্য নিখুত পতাকা:

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

উল্লেখ্য কিভাবে ফলে ফাইল, আনুমানিক 1/4 আকার।

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

TFLite মডেলগুলি চালান

Python TensorFlow Lite ইন্টারপ্রেটার ব্যবহার করে TensorFlow Lite মডেলটি চালান।

একটি দোভাষী মধ্যে মডেল লোড

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()

একটি ছবিতে মডেল পরীক্ষা করুন

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

মডেলগুলি মূল্যায়ন করুন

# 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

প্রাপ্ত করার জন্য গতিশীল পরিসীমা কোয়ান্টাইজড মডেলের মূল্যায়ন পুনরাবৃত্তি করুন:

print(evaluate_model(interpreter_quant))
0.95

এই উদাহরণে, সংকুচিত মডেলের নির্ভুলতার কোন পার্থক্য নেই।

একটি বিদ্যমান মডেল অপ্টিমাইজ করা

প্রাক-অ্যাক্টিভেশন স্তর সহ Resnets (Resnet-v2) ব্যাপকভাবে দৃষ্টি অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। পূর্ব প্রশিক্ষিত হিমায়িত গ্রাফ resnet-v2-101 পাওয়া যায় Tensorflow হাব

আপনি হিমায়িত গ্রাফটিকে একটি টেনসরফ্লো লাইট ফ্ল্যাটবাফারে পরিমাপ করার মাধ্যমে রূপান্তর করতে পারেন:

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

মডেলের আকার 171 MB থেকে 43 MB পর্যন্ত কমে যায়৷ Imagenet উপর এই মডেলের সঠিকতা জন্য প্রদান করা স্ক্রিপ্ট ব্যবহার মূল্যায়ন করা যাবে TFLite সঠিকতা পরিমাপ

অপ্টিমাইজ করা মডেল টপ-1 নির্ভুলতা 76.8, ফ্লোটিং পয়েন্ট মডেলের মতোই।