কোয়ান্টাইজেশন ডিবাগার দিয়ে কোয়ান্টাইজেশন ত্রুটিগুলি পরিদর্শন করা হচ্ছে

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

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

যখন এই সমস্যাটি ঘটে, তখন কোয়ান্টাইজেশন ত্রুটির মূল কারণ খুঁজে বের করা কঠিন এবং বেদনাদায়ক, এবং কোয়ান্টাইজেশন ত্রুটি ঠিক করা আরও কঠিন। এই মডেল পরিদর্শন প্রক্রিয়া সহায়তা করার জন্য, quantization ডিবাগার সমস্যাযুক্ত স্তর সনাক্ত করতে ব্যবহার করা যেতে পারে, যাতে মডেল সঠিকতা quantization থেকে কমিয়ে সুবিধা খরচে উদ্ধার করা সম্ভব নির্বাচনী quantization ভাসা সেই সমস্যাযুক্ত স্তর চলে যাবে।

কোয়ান্টাইজেশন ডিবাগার

কোয়ান্টাইজেশন ডিবাগার বিদ্যমান মডেলে কোয়ান্টাইজেশন কোয়ালিটি মেট্রিক বিশ্লেষণ করা সম্ভব করে তোলে। কোয়ান্টাইজেশন ডিবাগার একটি ডিবাগ ডেটাসেট সহ মডেল চালানোর জন্য প্রক্রিয়াগুলি স্বয়ংক্রিয় করতে পারে এবং প্রতিটি টেনসরের জন্য কোয়ান্টাইজেশন মানের মেট্রিক্স সংগ্রহ করতে পারে।

পূর্বশর্ত

যদি আপনার কাছে ইতিমধ্যেই একটি মডেলের পরিমাপ করার জন্য একটি পাইপলাইন থাকে, তবে আপনার কাছে কোয়ান্টাইজেশন ডিবাগার চালানোর জন্য প্রয়োজনীয় সমস্ত অংশ রয়েছে!

  • পরিমাপ করার মডেল
  • প্রতিনিধি ডেটাসেট

মডেল এবং ডেটা ছাড়াও, রপ্তানি করা ফলাফলগুলি বিশ্লেষণ করতে আপনাকে একটি ডেটা প্রক্রিয়াকরণ কাঠামো (যেমন পান্ডা, Google পত্রক) ব্যবহার করতে হবে।

সেটআপ

এই বিভাগটি লাইব্রেরি, MobileNet v3 মডেল এবং 100টি ছবির টেস্ট ডেটাসেট প্রস্তুত করে।

# Quantization debugger is available from TensorFlow 2.7.0
pip uninstall -y tensorflow
pip install tf-nightly
pip install tensorflow_datasets --upgrade  # imagenet_v2 needs latest checksum
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_hub as hub

বয়লারপ্লেট এবং সাহায্যকারী

2021-10-30 11:57:45.262002: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmp_3ry7zon/assets
INFO:tensorflow:Assets written to: /tmp/tmp_3ry7zon/assets
2021-10-30 11:57:52.134354: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 11:57:52.134407: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
test_ds = ds.map(lambda data: (data['image'], data['label'] + 1)).batch(16)
loss, acc = model.evaluate(test_ds)
print(f'Top-5 accuracy (float): {acc * 100:.2f}%')
7/7 [==============================] - 6s 33ms/step - loss: 88.6092 - sparse_top_k_categorical_accuracy: 11.7143
Top-5 accuracy (float): 1171.43%
eval_tflite(quantized_model, ds)
Top-5 accuracy (quantized): 51.00%

আমরা দেখতে পাচ্ছি যে আসল মডেলের আমাদের ছোট ডেটাসেটের জন্য অনেক বেশি শীর্ষ-5 নির্ভুলতা রয়েছে, যখন কোয়ান্টাইজড মডেলের একটি উল্লেখযোগ্য নির্ভুলতা হ্রাস পেয়েছে।

ধাপ 1. ডিবাগার প্রস্তুতি

সবচেয়ে সহজ উপায় quantization ডিবাগার ব্যবহার করতে প্রদান করা হয় tf.lite.TFLiteConverter আপনি মডেল quantize ব্যবহার করা হয়েছে।

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset(ds)

# my_debug_dataset should have the same format as my_representative_dataset
debugger = tf.lite.experimental.QuantizationDebugger(
    converter=converter, debug_dataset=representative_dataset(ds))
INFO:tensorflow:Assets written to: /tmp/tmpoa_5gejn/assets
INFO:tensorflow:Assets written to: /tmp/tmpoa_5gejn/assets
2021-10-30 11:58:34.006052: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 11:58:34.006103: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0

ধাপ 2. ডিবাগার চালানো এবং ফলাফল পাওয়া

আপনি কল যখন QuantizationDebugger.run() , ডিবাগার একই অপ অবস্থানের জন্য ভাসা tensors এবং নিরবচ্ছিন্ন tensors মধ্যে পার্থক্য লগ ইন করুন, এবং তাদের প্রদত্ত বৈশিষ্ট্যের মান সঙ্গে প্রক্রিয়া হবে।

debugger.run()

প্রক্রিয়াজাত মেট্রিক্স সঙ্গে অ্যাক্সেস করা যেতে পারে QuantizationDebugger.layer_statistics , অথবা CSV বিন্যাসে একটি টেক্সট ফাইলে ডাম্প করা যেতে পারে QuantizationDebugger.layer_statistics_dump()

RESULTS_FILE = '/tmp/debugger_results.csv'
with open(RESULTS_FILE, 'w') as f:
  debugger.layer_statistics_dump(f)
head /tmp/debugger_results.csv

ডাম্প মধ্যে প্রতিটি সারির জন্য, অপ নাম এবং সূচক প্রথম আসে, (তত্সহ quantization পরামিতি এবং ত্রুটি মেট্রিক্স দ্বারা অনুসরণ ব্যবহারকারী-সংজ্ঞায়িত ত্রুটি মেট্রিক্স যদি থাকে,)। ফলস্বরূপ CSV ফাইলটি বড় পরিমাপকরণ ত্রুটি মেট্রিক্স সহ সমস্যাযুক্ত স্তরগুলি বাছাই করতে ব্যবহার করা যেতে পারে।

পান্ডা বা অন্যান্য ডেটা প্রসেসিং লাইব্রেরির সাথে, আমরা বিশদ প্রতি-স্তর ত্রুটি মেট্রিক্স পরিদর্শন করতে পারি।

layer_stats = pd.read_csv(RESULTS_FILE)
layer_stats.head()

ধাপ 3. ডেটা বিশ্লেষণ

ফলাফল বিশ্লেষণ করার বিভিন্ন উপায় আছে। প্রথমে, ডিবাগারের আউটপুট থেকে প্রাপ্ত কিছু দরকারী মেট্রিক যোগ করা যাক। ( scale প্রতিটি টেন্সর জন্য quantization স্কেল ফ্যাক্টর মানে।)

  • বিন্যাস ( 256 / scale )
  • RMSE / স্কেল ( sqrt(mean_squared_error) / scale )

RMSE / scale পাসে হবে 1 / sqrt(12) , (~ 0.289) যখন নিরবচ্ছিন্ন বন্টন মূল ভাসা বন্টন অনুরূপ একটি ভাল নিরবচ্ছিন্ন মডেল নির্দেশ করে। মানটি যত বড় হবে, স্তরটি ভালভাবে পরিমাপ না হওয়ার সম্ভাবনা বেশি।

layer_stats['range'] = 255.0 * layer_stats['scale']
layer_stats['rmse/scale'] = layer_stats.apply(
    lambda row: np.sqrt(row['mean_squared_error']) / row['scale'], axis=1)
layer_stats[['op_name', 'range', 'rmse/scale']].head()
plt.figure(figsize=(15, 5))
ax1 = plt.subplot(121)
ax1.bar(np.arange(len(layer_stats)), layer_stats['range'])
ax1.set_ylabel('range')
ax2 = plt.subplot(122)
ax2.bar(np.arange(len(layer_stats)), layer_stats['rmse/scale'])
ax2.set_ylabel('rmse/scale')
plt.show()

png

সেখানে ব্যাপক রেঞ্জ অনেক স্তর, এবং কিছু স্তর আছে উচ্চ RMSE/scale মান। আসুন উচ্চ ত্রুটি মেট্রিক্স সহ স্তরগুলি পান।

layer_stats[layer_stats['rmse/scale'] > 0.7][[
    'op_name', 'range', 'rmse/scale', 'tensor_name'
]]

এই স্তরগুলির সাথে, আপনি এই স্তরগুলিকে পরিমাপ না করা মডেলের গুণমানকে উন্নত করে কিনা তা দেখতে নির্বাচনী পরিমাণ নির্ধারণের চেষ্টা করতে পারেন৷

suspected_layers = list(
    layer_stats[layer_stats['rmse/scale'] > 0.7]['tensor_name'])

এগুলি ছাড়াও, প্রথম কয়েকটি স্তরের জন্য কোয়ান্টাইজেশন এড়িয়ে যাওয়াও কোয়ান্টাইজড মডেলের গুণমান উন্নত করতে সহায়তা করে।

suspected_layers.extend(list(layer_stats[:5]['tensor_name']))

সিলেক্টিভ কোয়ান্টাইজেশন

সিলেক্টিভ কোয়ান্টাইজেশন কিছু নোডের জন্য কোয়ান্টাইজেশন এড়িয়ে যায়, যাতে গণনা মূল ফ্লোটিং-পয়েন্ট ডোমেনে ঘটতে পারে। যখন সঠিক স্তরগুলি বাদ দেওয়া হয়, আমরা বর্ধিত বিলম্বিতা এবং মডেলের আকারের মূল্যে কিছু মডেল গুণমান পুনরুদ্ধারের আশা করতে পারি।

যাইহোক, যদি আপনি শুধুমাত্র পূর্ণসংখ্যার এক্সিলারেটরগুলিতে (যেমন হেক্সাগন ডিএসপি, এজটিপিইউ) কোয়ান্টাইজড মডেল চালানোর পরিকল্পনা করছেন, তবে নির্বাচনী কোয়ান্টাইজেশন মডেলের বিভাজন ঘটাবে এবং এর ফলে সিপিইউ এবং সেই অ্যাক্সিলারেটরগুলির মধ্যে ডেটা স্থানান্তর খরচের কারণে ধীর অনুমান বিলম্ব হবে। . এটিকে রোধ করতে, আপনি চলমান বিবেচনা করতে পারেন সচেতন প্রশিক্ষণ quantization যখন মডেল সঠিকতা সংরক্ষণের পূর্ণসংখ্যা সমস্ত স্তর রাখা।

Quantization ডিবাগার এর বিকল্প গ্রহণ denylisted_nodes এবং denylisted_ops নির্দিষ্ট স্তর, অথবা নির্দিষ্ট অপস সমস্ত উদাহরণ জন্য quantization কুঁদন জন্য অপশন। ব্যবহার suspected_layers আমরা পূর্ববর্তী ধাপে থেকে প্রস্তুত, আমরা quantization ডিবাগার ব্যবহার বেছে বেছে নিরবচ্ছিন্ন মডেল করতে পারেন।

debug_options = tf.lite.experimental.QuantizationDebugOptions(
    denylisted_nodes=suspected_layers)
debugger = tf.lite.experimental.QuantizationDebugger(
    converter=converter,
    debug_dataset=representative_dataset(ds),
    debug_options=debug_options)
INFO:tensorflow:Assets written to: /tmp/tmpqqc57uli/assets
INFO:tensorflow:Assets written to: /tmp/tmpqqc57uli/assets
2021-10-30 11:59:13.603355: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 11:59:13.603400: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
selective_quantized_model = debugger.get_nondebug_quantized_model()
eval_tflite(selective_quantized_model, ds)
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
Top-5 accuracy (quantized): 64.00%

আসল ফ্লোট মডেলের তুলনায় নির্ভুলতা এখনও কম, কিন্তু 111টি স্তরের মধ্যে ~10টি স্তরের জন্য কোয়ান্টাইজেশন এড়িয়ে গিয়ে পুরো কোয়ান্টাইজড মডেল থেকে আমাদের উল্লেখযোগ্য উন্নতি হয়েছে।

আপনি একই ক্লাসে সমস্ত অপ্সের পরিমাপ না করার চেষ্টা করতে পারেন। উদাহরণ হিসেবে বলা যায়, সব গড় অপস জন্য quantization এড়িয়ে যেতে চাইলে আপনি পাস করতে পারেন MEAN কাছে denylisted_ops

debug_options = tf.lite.experimental.QuantizationDebugOptions(
    denylisted_ops=['MEAN'])
debugger = tf.lite.experimental.QuantizationDebugger(
    converter=converter,
    debug_dataset=representative_dataset(ds),
    debug_options=debug_options)
INFO:tensorflow:Assets written to: /tmp/tmpxltlornb/assets
INFO:tensorflow:Assets written to: /tmp/tmpxltlornb/assets
2021-10-30 11:59:44.677473: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 11:59:44.677519: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
selective_quantized_model = debugger.get_nondebug_quantized_model()
eval_tflite(selective_quantized_model, ds)
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
Top-5 accuracy (quantized): 54.00%

এই কৌশলগুলির সাহায্যে, আমরা কোয়ান্টাইজড MobileNet V3 মডেলের নির্ভুলতা উন্নত করতে সক্ষম হয়েছি। পরবর্তীতে আমরা মডেলের সঠিকতা আরও উন্নত করার জন্য উন্নত কৌশলগুলি অন্বেষণ করব৷

উন্নত ব্যবহার

নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে, আপনি আপনার ডিবাগিং পাইপলাইনকে আরও কাস্টমাইজ করতে পারেন।

কাস্টম মেট্রিক্স

ডিফল্টরূপে, কোয়ান্টাইজেশন ডিবাগার প্রতিটি ফ্লোট-কোয়ান্ট পার্থক্যের জন্য পাঁচটি মেট্রিক নির্গত করে: টেনসরের আকার, মানক বিচ্যুতি, গড় ত্রুটি, সর্বোচ্চ পরম ত্রুটি এবং গড় বর্গাকার ত্রুটি। আপনি বিকল্পগুলিতে পাস করে আরও কাস্টম মেট্রিক যোগ করতে পারেন। প্রতিটি মেট্রিকের জন্য, ফলাফলটি একটি একক ফ্লোট মান হওয়া উচিত এবং ফলাফলের মেট্রিকটি সমস্ত উদাহরণ থেকে মেট্রিকের গড় হবে৷

  • layer_debug_metrics : ভাসা এবং নিরবচ্ছিন্ন অপ আউটপুট থেকে প্রতিটি অপ আউটপুট জন্য পরিবর্তন উপর ভিত্তি করে মেট্রিক গণনা।
  • layer_direct_compare_metrics : বরং শুধুমাত্র পরিবর্তন পেয়ে চেয়ে, এই কাঁচা ভাসা এবং নিরবচ্ছিন্ন tensors, এবং তার quantization পরামিতি উপর ভিত্তি করে মেট্রিক গণনা হবে (স্কেল, শূন্য পয়েন্ট)
  • model_debug_metrics যখন শুধুমাত্র ব্যবহৃত float_model_(path|content) ডিবাগারে পাস করা হয়েছে। অপ-লেভেল মেট্রিক্স ছাড়াও, চূড়ান্ত স্তর আউটপুট মূল ফ্লোট মডেল থেকে রেফারেন্স আউটপুট তুলনা করা হয়.
debug_options = tf.lite.experimental.QuantizationDebugOptions(
    layer_debug_metrics={
        'mean_abs_error': (lambda diff: np.mean(np.abs(diff)))
    },
    layer_direct_compare_metrics={
        'correlation':
            lambda f, q, s, zp: (np.corrcoef(f.flatten(),
                                             (q.flatten() - zp) / s)[0, 1])
    },
    model_debug_metrics={
        'argmax_accuracy': (lambda f, q: np.mean(np.argmax(f) == np.argmax(q)))
    })

debugger = tf.lite.experimental.QuantizationDebugger(
    converter=converter,
    debug_dataset=representative_dataset(ds),
    debug_options=debug_options)
INFO:tensorflow:Assets written to: /tmp/tmpm7cb9qcd/assets
INFO:tensorflow:Assets written to: /tmp/tmpm7cb9qcd/assets
2021-10-30 12:00:18.502193: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 12:00:18.502238: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
INFO:tensorflow:Assets written to: /tmp/tmpzkg3ny_8/assets
INFO:tensorflow:Assets written to: /tmp/tmpzkg3ny_8/assets
2021-10-30 12:00:28.401195: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 12:00:28.401241: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
debugger.run()
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numpy/lib/function_base.py:2691: RuntimeWarning: invalid value encountered in true_divide
  c /= stddev[:, None]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numpy/lib/function_base.py:2692: RuntimeWarning: invalid value encountered in true_divide
  c /= stddev[None, :]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/lite/tools/optimize/debugging/python/debugger.py:382: RuntimeWarning: Mean of empty slice
  metrics[metric_name] = np.nanmean(metrics[metric_name])
CUSTOM_RESULTS_FILE = '/tmp/debugger_results.csv'
with open(CUSTOM_RESULTS_FILE, 'w') as f:
  debugger.layer_statistics_dump(f)

custom_layer_stats = pd.read_csv(CUSTOM_RESULTS_FILE)
custom_layer_stats[['op_name', 'mean_abs_error', 'correlation']].tail()

ফলে model_debug_metrics আলাদাভাবে থেকে দেখা যায় debugger.model_statistics

debugger.model_statistics
{'argmax_accuracy': 0.36}

গভীর বৈশিষ্ট্যগুলি অ্যাক্সেস করতে (অভ্যন্তরীণ) mlir_quantize API ব্যবহার করে৷

from tensorflow.lite.python import convert

সম্পূর্ণ মডেল যাচাই মোড

ডিবাগ মডেল জেনারেশনের জন্য ডিফল্ট আচরণ হল প্রতি-স্তর যাচাই। এই মোডে, ফ্লোট এবং কোয়ান্টাইজ অপ জোড়ার জন্য ইনপুট একই উৎস থেকে (আগের কোয়ান্টাইজড অপ)। আরেকটি মোড হল সম্পূর্ণ-মডেল যাচাইকরণ, যেখানে ফ্লোট এবং কোয়ান্টাইজ মডেল আলাদা করা হয়। এই মোডটি মডেলের নিচে কীভাবে ত্রুটিটি প্রচার করা হচ্ছে তা পর্যবেক্ষণ করতে উপযোগী হবে। সক্ষম করতে, enable_whole_model_verify=True করতে convert.mlir_quantize যখন নিজে ডিবাগ মডেল উৎপাদিত।

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.representative_dataset = representative_dataset(ds)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter._experimental_calibrate_only = True
calibrated_model = converter.convert()
INFO:tensorflow:Assets written to: /tmp/tmp2oa0sp06/assets
INFO:tensorflow:Assets written to: /tmp/tmp2oa0sp06/assets
2021-10-30 12:01:33.233118: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-30 12:01:33.233171: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
# Note that enable_numeric_verify and enable_whole_model_verify are set.
quantized_model = convert.mlir_quantize(
    calibrated_model,
    enable_numeric_verify=True,
    enable_whole_model_verify=True)
debugger = tf.lite.experimental.QuantizationDebugger(
    quant_debug_model_content=quantized_model,
    debug_dataset=representative_dataset(ds))
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0

ইতিমধ্যেই ক্যালিব্রেট করা মডেল থেকে নির্বাচনী পরিমাপ

আপনি সরাসরি কল করতে পারেন convert.mlir_quantize ইতিমধ্যে মডেলটির ক্রমাঙ্ক মডেল থেকে নির্বাচনী নিরবচ্ছিন্ন মডেল জন্য। এটি বিশেষভাবে উপযোগী হবে যখন আপনি একবার মডেলটি ক্যালিব্রেট করতে চান এবং বিভিন্ন ডিনালিস্ট সংমিশ্রণ নিয়ে পরীক্ষা করতে চান।

selective_quantized_model = convert.mlir_quantize(
    calibrated_model, denylisted_nodes=suspected_layers)
eval_tflite(selective_quantized_model, ds)
fully_quantize: 0, inference_type: 6, input_inference_type: 0, output_inference_type: 0
Top-5 accuracy (quantized): 64.00%