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

প্রশিক্ষণ পরবর্তী কোয়ান্টাইজেশন

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

অপ্টিমাইজেশন পদ্ধতি

প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশনের বেশ কয়েকটি বিকল্প রয়েছে। এখানে পছন্দের একটি সংক্ষিপ্ত সারণি এবং তারা যে সুবিধাগুলি প্রদান করে:

প্রযুক্তি উপকারিতা হার্ডওয়্যার
গতিশীল পরিসীমা পরিমাপ 4x ছোট, 2x-3x স্পিডআপ সিপিইউ
পূর্ণসংখ্যা পরিমাপ 4x ছোট, 3x+ স্পিডআপ সিপিইউ, এজ টিপিইউ, মাইক্রোকন্ট্রোলার
ফ্লোট 16 কোয়ান্টাইজেশন 2x ছোট, GPU ত্বরণ সিপিইউ, জিপিইউ

নিচের সিদ্ধান্তের বৃক্ষটি আপনার ব্যবহারের ক্ষেত্রে কোন প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশন পদ্ধতি সবচেয়ে ভালো তা নির্ধারণ করতে সাহায্য করতে পারে:

প্রশিক্ষণ-পরবর্তী অপ্টিমাইজেশনের বিকল্প

গতিশীল পরিসীমা পরিমাপ

প্রশিক্ষণ-পরবর্তী কোয়ানটাইজেশনের সহজতম পদ্ধতিটি স্থিরভাবে শুধুমাত্র ভাসমান বিন্দু থেকে পূর্ণসংখ্যা পর্যন্ত ওজনকে পরিমাপ করে, যার 8-বিট নির্ভুলতা রয়েছে:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

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

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

পূর্ণসংখ্যা পরিমাপ

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

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

TensorFlow 2.7 সংস্করণ থেকে, আপনি একটি মাধ্যমে প্রতিনিধি ডেটা সেটটি নির্দিষ্ট করতে পারেন স্বাক্ষর নিম্নলিখিত উদাহরণে হিসাবে:

def representative_dataset():
  for data in dataset:
    yield {
      "image": data.image,
      "bias": data.bias,
    }

আপনি একটি ইনপুট টেন্সর তালিকা প্রদান করে প্রতিনিধি ডেটাসেট তৈরি করতে পারেন:

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

যেহেতু TensorFlow 2.7 সংস্করণ, আমরা ইনপুট টেন্সর তালিকা-ভিত্তিক পদ্ধতির উপর স্বাক্ষর-ভিত্তিক পদ্ধতি ব্যবহার করার সুপারিশ করি কারণ ইনপুট টেন্সর অর্ডারটি সহজেই উল্টানো যায়।

পরীক্ষার উদ্দেশ্যে, আপনি নিম্নরূপ একটি ডামি ডেটাসেট ব্যবহার করতে পারেন:

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

ফ্লোট ফ্যালব্যাক সহ পূর্ণসংখ্যা (ডিফল্ট ফ্লোট ইনপুট/আউটপুট ব্যবহার করে)

একটি মডেলকে পূর্ণসংখ্যার পরিমাপ করার জন্য, কিন্তু ফ্লোট অপারেটরদের যখন তাদের পূর্ণসংখ্যা বাস্তবায়ন না হয় (রূপান্তর যাতে সহজে হয় তা নিশ্চিত করতে) ব্যবহার করুন, নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
tflite_quant_model = converter.convert()

শুধুমাত্র পূর্ণসংখ্যা

শুধুমাত্র মডেলের পূর্ণসংখ্যা তৈরি করার জন্য একটি সাধারণ ব্যবহারের ক্ষেত্রে দেখা যায় মাইক্রোকন্ট্রোলারের জন্য TensorFlow লাইট এবং কোরাল এজ TPUs

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

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

ফ্লোট 16 কোয়ান্টাইজেশন

আপনি ভাসমান বিন্দু মডেলের আকার কমাতে পারেন ওজনকে ভাসমান 16 করে, 16-বিট ভাসমান বিন্দু সংখ্যার জন্য IEEE মান। ফ্লোট 16 ওজনের পরিমাণ নির্ধারণ করতে, নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

ফ্লোট 16 কোয়ান্টাইজেশনের সুবিধাগুলি নিম্নরূপ:

  • এটি মডেলের আকার অর্ধেক পর্যন্ত হ্রাস করে (যেহেতু সমস্ত ওজন তাদের মূল আকারের অর্ধেক হয়ে যায়)।
  • এটি নির্ভুলতায় সর্বনিম্ন ক্ষতি করে।
  • এটি কিছু প্রতিনিধিদের সমর্থন করে (যেমন জিপিইউ প্রতিনিধি) যা সরাসরি float16 ডেটাতে কাজ করতে পারে, ফলে float32 কম্পিউটেশনের চেয়ে দ্রুত এক্সিকিউশন হয়।

ফ্লোট 16 কোয়ান্টাইজেশনের অসুবিধাগুলি নিম্নরূপ:

  • এটি স্থির বিন্দু গণিতে কোয়ান্টাইজেশনের মতো বিলম্ব কমায় না।
  • ডিফল্টরূপে, একটি ফ্লোট 16 কোয়ান্টাইজড মডেল সিপিইউতে চালানোর সময় ওজনের মানগুলিকে ফ্লোট 32 এ "ডিভেন্টাইজ" করবে। (উল্লেখ্য যে GPU প্রতিনিধি এই dequantization সঞ্চালন করবে না, যেহেতু এটি float16 ডেটাতে কাজ করতে পারে।)

শুধুমাত্র পূর্ণসংখ্যা: 8-বিট ওজন সহ 16-বিট সক্রিয়করণ (পরীক্ষামূলক)

এটি একটি পরীক্ষামূলক কোয়ান্টাইজেশন স্কিম। এটি "শুধুমাত্র পূর্ণসংখ্যা" স্কিমের অনুরূপ, কিন্তু অ্যাক্টিভেশনগুলি তাদের পরিসরের উপর ভিত্তি করে 16-বিট, ওজন 8-বিট পূর্ণসংখ্যায় এবং বায়াসকে 64-বিট পূর্ণসংখ্যায় পরিমাপ করা হয়। এটি আরও 16x8 কোয়ান্টাইজেশন হিসাবে উল্লেখ করা হয়েছে।

এই কোয়ান্টাইজেশনের প্রধান সুবিধা হল এটি সঠিকভাবে উল্লেখযোগ্যভাবে উন্নতি করতে পারে, কিন্তু মডেলের আকার সামান্য বৃদ্ধি করতে পারে।

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

যদি মডেলের কিছু অপারেটরদের জন্য 16x8 কোয়ান্টাইজেশন সমর্থিত না হয়, তাহলে মডেলটি এখনও কোয়ান্টাইজ করা যায়, কিন্তু অসমর্থিত অপারেটরগুলিকে ফ্লোটে রাখা হয়। এই অনুমতি দেওয়ার জন্য নিচের বিকল্পটি target_spec এ যোগ করা উচিত।

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

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

এই পরিমাপের অসুবিধা হল:

  • অনুকূলিত কার্নেল বাস্তবায়নের অভাবের কারণে বর্তমানে অনুমানটি 8-বিট পূর্ণ পূর্ণসংখ্যার চেয়ে উল্লেখযোগ্যভাবে ধীর।
  • বর্তমানে এটি বিদ্যমান হার্ডওয়্যার ত্বরিত TFLite প্রতিনিধিদের সাথে বেমানান।

এই quantization মোডের জন্য একটি টিউটোরিয়াল পাওয়া যাবে এখানে

মডেল নির্ভুলতা

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

অন্যথা, যদি সঠিকতা ড্রপ খুব বেশী, ব্যবহারের বিষয়ে বিবেচনা quantization সচেতন প্রশিক্ষণ । যাইহোক, এটি করার জন্য নকল কোয়ান্টাইজেশন নোড যোগ করার জন্য মডেল প্রশিক্ষণের সময় পরিবর্তন প্রয়োজন, যেখানে এই পৃষ্ঠায় প্রশিক্ষণ-পরবর্তী কোয়ান্টাইজেশন কৌশলগুলি একটি বিদ্যমান প্রাক-প্রশিক্ষিত মডেল ব্যবহার করে।

কোয়ান্টাইজড টেন্সরের জন্য প্রতিনিধিত্ব

8-বিট কোয়ান্টাইজেশন নিম্নলিখিত সূত্র ব্যবহার করে ভাসমান বিন্দু মান অনুমান করে।

$$real\_value = (int8\_value - zero\_point) \times scale$$

উপস্থাপনার দুটি প্রধান অংশ রয়েছে:

  • প্রতি অক্ষ (ওরফে প্রতি-চ্যানেল) বা প্রতি-টেন্সর ওজন 0-এর সমান শূন্য-বিন্দু সহ [-127, 127] পরিসরে int8 দুটির পরিপূরক মান দ্বারা প্রতিনিধিত্ব করে।

  • প্রতি-টেন্সর অ্যাক্টিভেশন/ইনপুটগুলি পরিসীমা [-128, 127] এর মধ্যে শূন্য-বিন্দু সহ [-128, 127] পরিসরে int8 দুটির পরিপূরক মান দ্বারা প্রতিনিধিত্ব করে।

আমাদের quantization পরিকল্পনার বিস্তারিত দেখুন জন্য, দয়া করে আমাদের দেখতে quantization বৈশিষ্ট । হার্ডওয়্যার বিক্রেতারা যারা টেন্সরফ্লো লাইটের প্রতিনিধি ইন্টারফেসে প্লাগ করতে চান তাদের সেখানে বর্ণিত কোয়ান্টাইজেশন স্কিম বাস্তবায়নে উৎসাহিত করা হয়।