নিম্নলিখিত নথিতে LiteRT-এর 8-বিট কোয়ান্টাইজেশন স্কিমের স্পেসিফিকেশনের রূপরেখা দেওয়া হয়েছে। এটি হার্ডওয়্যার ডেভেলপারদের কোয়ান্টাইজড LiteRT মডেলগুলির সাথে অনুমানের জন্য হার্ডওয়্যার সহায়তা প্রদানে সহায়তা করার উদ্দেশ্যে তৈরি।
স্পেসিফিকেশন সারাংশ
আমরা একটি স্পেসিফিকেশন প্রদান করছি, এবং স্পেসিফিকেশন অনুসরণ করা হলেই আমরা আচরণের উপর কিছু গ্যারান্টি প্রদান করতে পারি। আমরা এটাও বুঝতে পারি যে বিভিন্ন হার্ডওয়্যারের পছন্দ এবং বিধিনিষেধ থাকতে পারে যা স্পেসিফিকেশন বাস্তবায়নের সময় সামান্য বিচ্যুতি ঘটাতে পারে যার ফলে বাস্তবায়নগুলি বিট-এক্স্যাক্ট নয়। যদিও এটি বেশিরভাগ ক্ষেত্রে গ্রহণযোগ্য হতে পারে (এবং আমরা আমাদের জ্ঞান অনুসারে বিভিন্ন মডেল থেকে সংগৃহীত পার-অপারেশন সহনশীলতা অন্তর্ভুক্ত করে এমন পরীক্ষার একটি স্যুট প্রদান করব), মেশিন লার্নিংয়ের প্রকৃতি (এবং সবচেয়ে সাধারণ ক্ষেত্রে গভীর শিক্ষা) কোনও কঠিন গ্যারান্টি প্রদান করা অসম্ভব করে তোলে।
৮-বিট কোয়ান্টাইজেশন নিম্নলিখিত সূত্র ব্যবহার করে ভাসমান বিন্দুর মানগুলির আনুমানিক হিসাব করে।
\[real\_value = (int8\_value - zero\_point) \times scale\]
প্রতি-অক্ষ (রূপান্তর অপশনে প্রতি-চ্যানেল হিসেবেও পরিচিত) অথবা প্রতি-টেনসর ওজনকে [-127, 127] পরিসরে int8 দুইয়ের পরিপূরক মান দ্বারা প্রতিনিধিত্ব করা হয় যেখানে শূন্য-বিন্দু 0 এর সমান। প্রতি-টেনসর সক্রিয়করণ/ইনপুটগুলিকে [ [-128, 127] , 127] পরিসরে int8 দুইয়ের পরিপূরক মান দ্বারা প্রতিনিধিত্ব করা হয়, যেখানে শূন্য-বিন্দু [-128, 127] পরিসরে থাকে।
নীচে নথিভুক্ত নির্দিষ্ট ক্রিয়াকলাপের জন্য অন্যান্য ব্যতিক্রম রয়েছে।
স্বাক্ষরিত পূর্ণসংখ্যা বনাম স্বাক্ষরবিহীন পূর্ণসংখ্যা
LiterRT কোয়ান্টাইজেশন প্রাথমিকভাবে 8-বিটের জন্য int8 কোয়ান্টাইজেশনের জন্য টুলিং এবং কার্নেলগুলিকে অগ্রাধিকার দেবে। এটি 0 এর সমান শূন্য-পয়েন্ট দ্বারা প্রতিসম কোয়ান্টাইজেশনকে উপস্থাপন করার সুবিধার জন্য। অতিরিক্তভাবে, অনেক ব্যাকএন্ডে int8xint8 সংগ্রহের জন্য অতিরিক্ত অপ্টিমাইজেশন রয়েছে।
প্রতি-অক্ষ বনাম প্রতি-টেনসর
Per-tensor quantization মানে হল যে সমগ্র টেনসরের জন্য একটি স্কেল এবং/অথবা শূন্য-বিন্দু থাকবে। Per-axis quantization মানে হল যে quantized_dimension এ প্রতি স্লাইসে একটি স্কেল এবং/অথবা zero_point থাকবে। কোয়ান্টাইজড ডাইমেনশন টেনসরের আকৃতির সেই মাত্রা নির্দিষ্ট করে যার সাথে স্কেল এবং শূন্য-বিন্দুগুলি মিলবে। উদাহরণস্বরূপ, একটি টেনসর t , যার dims=[4, 3, 2, 1] কোয়ান্টাইজেশন প্যারামিটার সহ: scale=[1.0, 2.0, 3.0] , zero_point=[1, 2, 3] , quantization_dimension=1 t এর দ্বিতীয় মাত্রা জুড়ে কোয়ান্টাইজ করা হবে:
t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1
t[:, 1, :, :] will have scale[1]=2.0, zero_point[1]=2
t[:, 2, :, :] will have scale[2]=3.0, zero_point[2]=3
প্রায়শই, quantized_dimension হল কনভোলিউশনের ওজনের output_channel , কিন্তু তত্ত্বগতভাবে এটি কার্নেল বাস্তবায়নে প্রতিটি ডট-প্রোডাক্টের সাথে সামঞ্জস্যপূর্ণ মাত্রা হতে পারে, যা পারফরম্যান্সের প্রভাব ছাড়াই আরও কোয়ান্টাইজেশন গ্র্যানুলারিটির অনুমতি দেয়। এর ফলে নির্ভুলতার ক্ষেত্রে বড় উন্নতি হয়।
TFLite-এর ক্রমবর্ধমান সংখ্যক ক্রিয়াকলাপের জন্য প্রতি-অক্ষ সমর্থন রয়েছে। এই নথির সময়, Conv2d এবং DepthwiseConv2d-এর জন্য সমর্থন বিদ্যমান।
প্রতিসম বনাম অসমমিত
অ্যাক্টিভেশনগুলি অসমমিতিক: স্বাক্ষরিত int8 পরিসরের [-128, 127] এর মধ্যে যেকোনো জায়গায় তাদের শূন্য-পয়েন্ট থাকতে পারে। অনেক অ্যাক্টিভেশন প্রকৃতিতে অসমমিতিক এবং একটি শূন্য-পয়েন্ট কার্যকরভাবে অতিরিক্ত বাইনারি বিট নির্ভুলতা অর্জনের জন্য তুলনামূলকভাবে সস্তা উপায়। যেহেতু অ্যাক্টিভেশনগুলি কেবল ধ্রুবক ওজন দ্বারা গুণিত হয়, তাই ধ্রুবক শূন্য-পয়েন্ট মানটি বেশ ভারীভাবে অপ্টিমাইজ করা যেতে পারে।
ওজনগুলি প্রতিসম: শূন্য-বিন্দুকে ০ এর সমান করতে বাধ্য করা হয়। ওজনের মানগুলিকে গতিশীল ইনপুট এবং সক্রিয়করণ মান দ্বারা গুণ করা হয়। এর অর্থ হল ওজনের শূন্য-বিন্দুকে সক্রিয়করণ মানের সাথে গুণ করার জন্য একটি অনিবার্য রানটাইম খরচ রয়েছে। শূন্য-বিন্দুকে ০ বলে প্রয়োগ করে আমরা এই খরচ এড়াতে পারি।
গণিতের ব্যাখ্যা: এটি arXiv:1712.05877 এর ধারা 2.3 এর অনুরূপ, তবে পার্থক্যটি হল আমরা স্কেল মানগুলিকে প্রতি-অক্ষে অনুমোদন করি। এটি সহজেই নিম্নরূপে সাধারণীকরণ করা হয়:
$A$ হল কোয়ান্টাইজড অ্যাক্টিভেশনের একটি $m \times n$ ম্যাট্রিক্স।
$B$ হল কোয়ান্টাইজড ওজনের একটি $n \times p$ ম্যাট্রিক্স।
$A$, $a_j$ এর $j$তম সারিকে $b$, $b_k$ এর $k$তম কলাম দিয়ে গুণ করার কথা বিবেচনা করুন, উভয় দৈর্ঘ্য $n$। কোয়ান্টাইজড পূর্ণসংখ্যার মান এবং শূন্য-পয়েন্টের মান যথাক্রমে $q_a$, $z_a$ এবং $q_b$, $z_b$।
\[a_j \cdot b_k = \sum_{i=0}^{n} a_{j}^{(i)} b_{k}^{(i)} = \sum_{i=0}^{n} (q_{a}^{(i)} - z_a) (q_{b}^{(i)} - z_b) = \sum_{i=0}^{n} q_{a}^{(i)} q_{b}^{(i)} - \sum_{i=0}^{n} q_{a}^{(i)} z_b - \sum_{i=0}^{n} q_{b}^{(i)} z_a + \sum_{i=0}^{n} z_a z_b\]