এমএল কমিউনিটি দিবস 9 নভেম্বর! TensorFlow, Jax থেকে আপডেটের জন্য আমাদের সাথে যোগ দিন, এবং আরও আরও জানুন

ছাঁটাই প্রমান সংরক্ষণ কোয়ান্টাইজেশন সচেতন প্রশিক্ষণ (PQAT) কেরাস উদাহরণ

TensorFlow.org এ দেখুন গুগল কোলাবে চালান GitHub এ দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

এই শেষ উদাহরণ শেষ ছাঁটাই সংরক্ষণের quantization সচেতন প্রশিক্ষণ (PQAT) এপিআই, TensorFlow মডেল অপ্টিমাইজেশান টুলকিট এর সহযোগীতা অপ্টিমাইজেশান পাইপলাইন অংশ ব্যবহার দেখানো হয়।

অন্যান্য পাতা

পাইপলাইন অথবা অন্যান্য লভ্য কৌশল একটি ভূমিকা জন্য, দেখুন সহযোগীতা অপ্টিমাইজেশান ওভারভিউ পৃষ্ঠায়

সামগ্রী

টিউটোরিয়ালে, আপনি:

  1. একটি ট্রেন tf.keras গোড়া থেকে MNIST ডেটা সেটটি জন্য মডেল।
  2. স্পারসিটি এপিআই ব্যবহার করে ছাঁটাইয়ের সাথে মডেলটিকে ফাইন-টিউন করুন এবং সঠিকতা দেখুন।
  3. QAT প্রয়োগ করুন এবং স্পারসিটির ক্ষতি লক্ষ্য করুন।
  4. PQAT প্রয়োগ করুন এবং পর্যবেক্ষণ করুন যে আগে প্রয়োগ করা স্পার্সিটি সংরক্ষণ করা হয়েছে।
  5. একটি TFLite মডেল তৈরি করুন এবং এটিতে PQAT প্রয়োগের প্রভাবগুলি পর্যবেক্ষণ করুন।
  6. প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশন ব্যবহার করে কোয়ান্টাইজড মডেলের সাথে অর্জিত PQAT মডেলের নির্ভুলতার তুলনা করুন।

সেটআপ

আপনি আপনার স্থানীয় এই Jupyter নোটবুক চালাতে পারেন virtualenv বা colab । নির্ভরতা স্থাপনের জানার জন্য, অনুগ্রহ পড়ুন ইনস্টলেশন গাইড

 pip install -q tensorflow-model-optimization
import tensorflow as tf

import numpy as np
import tempfile
import zipfile
import os

ছাঁটাই ছাড়াই MNIST এর জন্য একটি tf.keras মডেল প্রশিক্ষণ দিন

# Load MNIST dataset
mnist = tf.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

model = tf.keras.Sequential([
  tf.keras.layers.InputLayer(input_shape=(28, 28)),
  tf.keras.layers.Reshape(target_shape=(28, 28, 1)),
  tf.keras.layers.Conv2D(filters=12, kernel_size=(3, 3),
                         activation=tf.nn.relu),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
  tf.keras.layers.Flatten(),
  tf.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,
    validation_split=0.1,
    epochs=10
)
Epoch 1/10
1688/1688 [==============================] - 8s 4ms/step - loss: 0.2940 - accuracy: 0.9172 - val_loss: 0.1183 - val_accuracy: 0.9693
Epoch 2/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.1150 - accuracy: 0.9674 - val_loss: 0.0863 - val_accuracy: 0.9770
Epoch 3/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0821 - accuracy: 0.9760 - val_loss: 0.0738 - val_accuracy: 0.9797
Epoch 4/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0673 - accuracy: 0.9806 - val_loss: 0.0661 - val_accuracy: 0.9837
Epoch 5/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0583 - accuracy: 0.9826 - val_loss: 0.0632 - val_accuracy: 0.9835
Epoch 6/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0520 - accuracy: 0.9845 - val_loss: 0.0635 - val_accuracy: 0.9820
Epoch 7/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0460 - accuracy: 0.9857 - val_loss: 0.0746 - val_accuracy: 0.9815
Epoch 8/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0423 - accuracy: 0.9875 - val_loss: 0.0601 - val_accuracy: 0.9848
Epoch 9/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0384 - accuracy: 0.9885 - val_loss: 0.0604 - val_accuracy: 0.9855
Epoch 10/10
1688/1688 [==============================] - 7s 4ms/step - loss: 0.0347 - accuracy: 0.9894 - val_loss: 0.0648 - val_accuracy: 0.9835
<tensorflow.python.keras.callbacks.History at 0x7fb08657b5d0>

বেসলাইন মডেলটি মূল্যায়ন করুন এবং এটি পরবর্তী ব্যবহারের জন্য সংরক্ষণ করুন

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

print('Baseline test accuracy:', baseline_model_accuracy)

_, keras_file = tempfile.mkstemp('.h5')
print('Saving model to: ', keras_file)
tf.keras.models.save_model(model, keras_file, include_optimizer=False)
Baseline test accuracy: 0.9810000061988831
Saving model to:  /tmp/tmp0akp2126.h5

মডেল ছাঁটাই এবং সূক্ষ্ম সুর 50% sparsity

আবেদন করুন prune_low_magnitude() প্রদর্শন এবং কখন জিপ আবেদন, যখন সঠিকতা বজায় রাখার মডেল আকার হ্রাস তার কার্যকারিতা পালন করা সম্পূর্ণ প্রাক-প্রশিক্ষিত মডেল আলুবোখারা করতে API- টি। কীভাবে সেরা এপিআই যখন আপনার টার্গেট সঠিকতা বজায় রাখার সেরা কম্প্রেশন হার অর্জন করার জন্য ব্যবহার করার জন্য, পড়ুন ছাঁটাই ব্যাপক গাইড

মডেলটি সংজ্ঞায়িত করুন এবং স্পারসিটি এপিআই প্রয়োগ করুন

স্পারসিটি এপিআই ব্যবহার করার আগে মডেলটিকে আগে থেকে প্রশিক্ষিত হতে হবে।

import tensorflow_model_optimization as tfmot

prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude

pruning_params = {
      'pruning_schedule': tfmot.sparsity.keras.ConstantSparsity(0.5, begin_step=0, frequency=100)
  }

callbacks = [
  tfmot.sparsity.keras.UpdatePruningStep()
]

pruned_model = prune_low_magnitude(model, **pruning_params)

# Use smaller learning rate for fine-tuning
opt = tf.keras.optimizers.Adam(learning_rate=1e-5)

pruned_model.compile(
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  optimizer=opt,
  metrics=['accuracy'])

pruned_model.summary()
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py:2191: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use `layer.add_weight` method instead.
  warnings.warn('`layer.add_variable` is deprecated and '
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
prune_low_magnitude_reshape  (None, 28, 28, 1)         1         
_________________________________________________________________
prune_low_magnitude_conv2d ( (None, 26, 26, 12)        230       
_________________________________________________________________
prune_low_magnitude_max_pool (None, 13, 13, 12)        1         
_________________________________________________________________
prune_low_magnitude_flatten  (None, 2028)              1         
_________________________________________________________________
prune_low_magnitude_dense (P (None, 10)                40572     
=================================================================
Total params: 40,805
Trainable params: 20,410
Non-trainable params: 20,395
_________________________________________________________________

মডেলটিকে ফাইন-টিউন করুন এবং বেসলাইনের বিপরীতে নির্ভুলতা মূল্যায়ন করুন

3 যুগের জন্য ছাঁটাই সঙ্গে মডেল সূক্ষ্ম সুর।

# Fine-tune model
pruned_model.fit(
  train_images,
  train_labels,
  epochs=3,
  validation_split=0.1,
  callbacks=callbacks)
Epoch 1/3
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/array_ops.py:5049: calling gather (from tensorflow.python.ops.array_ops) with validate_indices is deprecated and will be removed in a future version.
Instructions for updating:
The `validate_indices` argument has no effect. Indices are always validated on CPU and never validated on GPU.
1688/1688 [==============================] - 9s 5ms/step - loss: 0.1243 - accuracy: 0.9580 - val_loss: 0.1146 - val_accuracy: 0.9650
Epoch 2/3
1688/1688 [==============================] - 8s 4ms/step - loss: 0.0883 - accuracy: 0.9713 - val_loss: 0.0945 - val_accuracy: 0.9720
Epoch 3/3
1688/1688 [==============================] - 8s 4ms/step - loss: 0.0722 - accuracy: 0.9774 - val_loss: 0.0858 - val_accuracy: 0.9753
<tensorflow.python.keras.callbacks.History at 0x7fafb6c80310>

মডেলের স্পারসিটি গণনা এবং মুদ্রণের জন্য সহায়ক ফাংশন সংজ্ঞায়িত করুন।

def print_model_weights_sparsity(model):

    for layer in model.layers:
        if isinstance(layer, tf.keras.layers.Wrapper):
            weights = layer.trainable_weights
        else:
            weights = layer.weights
        for weight in weights:
            # ignore auxiliary quantization weights
            if "quantize_layer" in weight.name:
                continue
            weight_size = weight.numpy().size
            zero_num = np.count_nonzero(weight == 0)
            print(
                f"{weight.name}: {zero_num/weight_size:.2%} sparsity ",
                f"({zero_num}/{weight_size})",
            )

পরীক্ষা করুন যে মডেলটি সঠিকভাবে ছাঁটাই করা হয়েছে। আমাদের প্রথমে ছাঁটাইয়ের মোড়কটি খুলে ফেলতে হবে।

stripped_pruned_model = tfmot.sparsity.keras.strip_pruning(pruned_model)

print_model_weights_sparsity(stripped_pruned_model)
conv2d/kernel:0: 50.00% sparsity  (54/108)
conv2d/bias:0: 0.00% sparsity  (0/12)
dense/kernel:0: 50.00% sparsity  (10140/20280)
dense/bias:0: 0.00% sparsity  (0/10)

এই উদাহরণের জন্য, বেসলাইনের তুলনায়, ছাঁটাইয়ের পরে পরীক্ষার নির্ভুলতার মধ্যে সর্বনিম্ন ক্ষতি রয়েছে।

_, pruned_model_accuracy = pruned_model.evaluate(
  test_images, test_labels, verbose=0)

print('Baseline test accuracy:', baseline_model_accuracy)
print('Pruned test accuracy:', pruned_model_accuracy)
Baseline test accuracy: 0.9810000061988831
Pruned test accuracy: 0.973800003528595

QAT এবং PQAT প্রয়োগ করুন এবং উভয় ক্ষেত্রেই মডেল স্পারসিটির উপর প্রভাব পরীক্ষা করুন

পরবর্তীতে, আমরা ছাঁটাই করা মডেলের উপর QAT এবং ছাঁটাই-সংরক্ষণ QAT (PQAT) উভয়ই প্রয়োগ করি এবং লক্ষ্য করি যে PQAT আপনার ছাঁটাই করা মডেলে স্পার্সিটি সংরক্ষণ করে। মনে রাখবেন আমরা সঙ্গে আপনার ছেঁটে মডেল থেকে ছাঁটাই চাদরে ছিনতাই tfmot.sparsity.keras.strip_pruning PQAT এপিআই প্রয়োগ করার আগে।

# QAT
qat_model = tfmot.quantization.keras.quantize_model(stripped_pruned_model)

qat_model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
print('Train qat model:')
qat_model.fit(train_images, train_labels, batch_size=128, epochs=1, validation_split=0.1)

# PQAT
quant_aware_annotate_model = tfmot.quantization.keras.quantize_annotate_model(
              stripped_pruned_model)
pqat_model = tfmot.quantization.keras.quantize_apply(
              quant_aware_annotate_model,
              tfmot.experimental.combine.Default8BitPrunePreserveQuantizeScheme())

pqat_model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
print('Train pqat model:')
pqat_model.fit(train_images, train_labels, batch_size=128, epochs=1, validation_split=0.1)
Train qat model:
422/422 [==============================] - 4s 8ms/step - loss: 0.0386 - accuracy: 0.9891 - val_loss: 0.0607 - val_accuracy: 0.9832
Train pqat model:
422/422 [==============================] - 4s 8ms/step - loss: 0.0416 - accuracy: 0.9881 - val_loss: 0.0590 - val_accuracy: 0.9832
<tensorflow.python.keras.callbacks.History at 0x7fafb5e48f50>
print("QAT Model sparsity:")
print_model_weights_sparsity(qat_model)
print("PQAT Model sparsity:")
print_model_weights_sparsity(pqat_model)
QAT Model sparsity:
conv2d/bias:0: 0.00% sparsity  (0/12)
conv2d/kernel:0: 6.48% sparsity  (7/108)
dense/bias:0: 0.00% sparsity  (0/10)
dense/kernel:0: 5.67% sparsity  (1149/20280)
PQAT Model sparsity:
conv2d/bias:0: 0.00% sparsity  (0/12)
conv2d/kernel:0: 50.00% sparsity  (54/108)
dense/bias:0: 0.00% sparsity  (0/10)
dense/kernel:0: 50.00% sparsity  (10140/20280)

PQAT মডেলের কম্প্রেশন সুবিধা দেখুন

জিপড মডেল ফাইল পেতে সাহায্যকারী ফাংশন নির্ধারণ করুন।

def get_gzipped_model_size(file):
  # It returns the size of the gzipped model in kilobytes.

  _, zipped_file = tempfile.mkstemp('.zip')
  with zipfile.ZipFile(zipped_file, 'w', compression=zipfile.ZIP_DEFLATED) as f:
    f.write(file)

  return os.path.getsize(zipped_file)/1000

যেহেতু এটি একটি ছোট মডেল, দুটি মডেলের মধ্যে পার্থক্য খুব লক্ষণীয় নয়। একটি বড় উত্পাদন মডেলে ছাঁটাই এবং PQAT প্রয়োগ করলে আরো উল্লেখযোগ্য সংকোচন হবে।

# QAT model
converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
qat_tflite_model = converter.convert()
qat_model_file = 'qat_model.tflite'
# Save the model.
with open(qat_model_file, 'wb') as f:
    f.write(qat_tflite_model)

# PQAT model
converter = tf.lite.TFLiteConverter.from_keras_model(pqat_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
pqat_tflite_model = converter.convert()
pqat_model_file = 'pqat_model.tflite'
# Save the model.
with open(pqat_model_file, 'wb') as f:
    f.write(pqat_tflite_model)

print("QAT model size: ", get_gzipped_model_size(qat_model_file), ' KB')
print("PQAT model size: ", get_gzipped_model_size(pqat_model_file), ' KB')
WARNING:absl:Found untraced functions such as reshape_layer_call_fn, reshape_layer_call_and_return_conditional_losses, conv2d_layer_call_fn, conv2d_layer_call_and_return_conditional_losses, flatten_layer_call_fn while saving (showing 5 of 20). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/tmpurndy6nz/assets
INFO:tensorflow:Assets written to: /tmp/tmpurndy6nz/assets
WARNING:absl:Found untraced functions such as reshape_layer_call_fn, reshape_layer_call_and_return_conditional_losses, conv2d_layer_call_fn, conv2d_layer_call_and_return_conditional_losses, flatten_layer_call_fn while saving (showing 5 of 20). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/tmpgsy8_zld/assets
INFO:tensorflow:Assets written to: /tmp/tmpgsy8_zld/assets
QAT model size:  16.326  KB
PQAT model size:  14.022  KB

TF থেকে TFLite পর্যন্ত নির্ভুলতার দৃist়তা দেখুন

পরীক্ষার ডেটাসেটে TFLite মডেল মূল্যায়ন করার জন্য একটি সহায়ক ফাংশন সংজ্ঞায়িত করুন।

def eval_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(f"Evaluated on {i} results so far.")
    # 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

আপনি মডেলটি মূল্যায়ন করেন, যা ছাঁটাই করা হয়েছে এবং কোয়ান্টাইজ করা হয়েছে, এবং তারপরে TSLite ব্যাকএন্ডে TensorFlow থেকে সঠিকতা দেখুন।

interpreter = tf.lite.Interpreter(pqat_model_file)
interpreter.allocate_tensors()

pqat_test_accuracy = eval_model(interpreter)

print('Pruned and quantized TFLite test_accuracy:', pqat_test_accuracy)
print('Pruned TF test accuracy:', pruned_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.


Pruned and quantized TFLite test_accuracy: 0.9815
Pruned TF test accuracy: 0.973800003528595

প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশন প্রয়োগ করুন এবং PQAT মডেলের সাথে তুলনা করুন

এরপরে, আমরা ছাঁটাই করা মডেলের উপর প্রশিক্ষণ-পরবর্তী কোয়ানটাইজেশন (ফাইন-টিউনিং নেই) ব্যবহার করি এবং PQAT মডেলের বিপরীতে এর নির্ভুলতা পরীক্ষা করি। এটি প্রমান করে যে কেন আপনাকে PQAT ব্যবহার করতে হবে কোয়ান্টাইজড মডেলের সঠিকতা উন্নত করতে।

প্রথম, প্রথম 1000 প্রশিক্ষণ চিত্র থেকে ক্যালিব্রেশন ডেটাসেটের জন্য একটি জেনারেটর নির্ধারণ করুন।

def mnist_representative_data_gen():
  for image in train_images[:1000]:  
    image = np.expand_dims(image, axis=0).astype(np.float32)
    yield [image]

মডেলটি পরিমাপ করুন এবং পূর্বে অর্জিত PQAT মডেলের সাথে নির্ভুলতার তুলনা করুন। লক্ষ্য করুন যে সূক্ষ্ম-টিউনিংয়ের সাথে পরিমাপ করা মডেলটি উচ্চতর নির্ভুলতা অর্জন করে।

converter = tf.lite.TFLiteConverter.from_keras_model(stripped_pruned_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = mnist_representative_data_gen
post_training_tflite_model = converter.convert()
post_training_model_file = 'post_training_model.tflite'
# Save the model.
with open(post_training_model_file, 'wb') as f:
    f.write(post_training_tflite_model)

# Compare accuracy
interpreter = tf.lite.Interpreter(post_training_model_file)
interpreter.allocate_tensors()

post_training_test_accuracy = eval_model(interpreter)

print('PQAT TFLite test_accuracy:', pqat_test_accuracy)
print('Post-training (no fine-tuning) TF test accuracy:', post_training_test_accuracy)
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/tmpk4ymv7ej/assets
INFO:tensorflow:Assets written to: /tmp/tmpk4ymv7ej/assets
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.


PQAT TFLite test_accuracy: 0.9815
Post-training (no fine-tuning) TF test accuracy: 0.9734

উপসংহার

এই টিউটোরিয়ালে, আপনি শিখেছেন কিভাবে একটি মডেল তৈরি করতে হয়, স্পারসিটি এপিআই ব্যবহার করে এটি ছাঁটাই করতে হয় এবং QAT ব্যবহার করার সময় স্পারসিটি সংরক্ষণের জন্য স্পারসিটি-সংরক্ষণ কোয়ানটাইজেশন সচেতন প্রশিক্ষণ (PQAT) প্রয়োগ করতে হয়। চূড়ান্ত PQAT মডেলটিকে QAT- এর সাথে তুলনা করা হয়েছিল যাতে দেখা যায় যে স্পার্সিটি আগেরটিতে সংরক্ষিত আছে এবং পরেরটিতে হারিয়ে গেছে। পরবর্তীতে, মডেলগুলিকে TFLite এ রূপান্তরিত করা হয়েছিল চেইনিং প্রুনিং এবং PQAT মডেল অপ্টিমাইজেশন কৌশলগুলির কম্প্রেশন সুবিধাগুলি দেখানোর জন্য এবং TFLite মডেলটি মূল্যায়ন করা হয়েছিল যাতে TFLite ব্যাকএন্ডে নির্ভুলতা বজায় থাকে। পরিশেষে, PQAT মডেলের তুলনা করা হয় কোয়ান্টাইজড প্রুনড মডেলের সাথে যা প্রশিক্ষণ-পরবর্তী কোয়ানটাইজেশন API ব্যবহার করে অর্জিত হয় যাতে স্বাভাবিক কোয়ান্টাইজেশন থেকে নির্ভুলতার ক্ষতি পুনরুদ্ধারে PQAT- এর সুবিধা প্রদর্শন করা যায়।