LiteRT প্রতিনিধি

প্রতিনিধিরা GPU এবং ডিজিটাল সিগন্যাল প্রসেসর (DSP) এর মতো অন-ডিভাইস অ্যাক্সিলারেটর ব্যবহার করে LiterRT মডেলের হার্ডওয়্যার অ্যাক্সিলারেশন সক্ষম করে।

ডিফল্টরূপে, LiteRT CPU কার্নেল ব্যবহার করে যা ARM Neon নির্দেশ সেটের জন্য অপ্টিমাইজ করা হয়। তবে, CPU একটি বহুমুখী প্রসেসর যা সাধারণত মেশিন লার্নিং মডেলগুলিতে পাওয়া ভারী গাণিতিকের জন্য অপ্টিমাইজ করা হয় না (উদাহরণস্বরূপ, কনভোলিউশন এবং ঘন স্তরগুলিতে জড়িত ম্যাট্রিক্স গণিত)।

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

এই প্রতিটি অ্যাক্সিলারেটরের সাথে সংযুক্ত API রয়েছে যা কাস্টম গণনা সক্ষম করে, যেমন মোবাইল GPU-এর জন্য OpenCL বা OpenGL ES । সাধারণত, এই ইন্টারফেসের মাধ্যমে একটি নিউরাল নেটওয়ার্ক চালানোর জন্য আপনাকে প্রচুর কাস্টম কোড লিখতে হবে। যখন আপনি বিবেচনা করেন যে প্রতিটি অ্যাক্সিলারেটরের নিজস্ব সুবিধা এবং অসুবিধা রয়েছে এবং তারা একটি নিউরাল নেটওয়ার্কে প্রতিটি ক্রিয়াকলাপ সম্পাদন করতে পারে না তখন জিনিসগুলি আরও জটিল হয়ে ওঠে। TensorFlow Lite এর ডেলিগেট API TFLite রানটাইম এবং এই নিম্ন-স্তরের API গুলির মধ্যে একটি সেতু হিসাবে কাজ করে এই সমস্যার সমাধান করে।

প্রতিনিধিদের সাথে রানটাইম

একজন প্রতিনিধি নির্বাচন করা

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

প্ল্যাটফর্ম অনুসারে প্রতিনিধিরা

ক্রস-প্ল্যাটফর্ম (অ্যান্ড্রয়েড এবং আইওএস)

  • GPU ডেলিগেট - GPU ডেলিগেটটি Android এবং iOS উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে। এটি 32-বিট এবং 16-বিট ফ্লোট ভিত্তিক মডেলগুলি চালানোর জন্য অপ্টিমাইজ করা হয়েছে যেখানে GPU উপলব্ধ। এটি 8-বিট কোয়ান্টাইজড মডেলগুলিকেও সমর্থন করে এবং তাদের ফ্লোট সংস্করণগুলির সাথে সমতুল্য GPU কর্মক্ষমতা প্রদান করে। GPU ডেলিগেট সম্পর্কে বিস্তারিত জানার জন্য, GPU-তে Litert দেখুন।

আইওএস

  • নতুন আইফোন এবং আইপ্যাডের জন্য কোর এমএল ডেলিগেট - নতুন আইফোন এবং আইপ্যাড যেখানে নিউরাল ইঞ্জিন উপলব্ধ, সেখানে আপনি ৩২-বিট বা ১৬-বিট ফ্লোটিং-পয়েন্ট মডেলের জন্য ইনফারেন্স ত্বরান্বিত করতে কোর এমএল ডেলিগেট ব্যবহার করতে পারেন। নিউরাল ইঞ্জিন A12 SoC বা তার বেশি সহ অ্যাপল মোবাইল ডিভাইসগুলিতে উপলব্ধ। কোর এমএল ডেলিগেটের একটি সংক্ষিপ্তসার এবং ধাপে ধাপে নির্দেশাবলীর জন্য, LiterRT কোর এমএল ডেলিগেট দেখুন।

মডেলের ধরণ অনুসারে প্রতিনিধিরা

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

মডেল টাইপ জিপিইউ কোরএমএল
ভাসমান-পয়েন্ট (৩২ বিট) হাঁ হাঁ
প্রশিক্ষণ-পরবর্তী ভাসমান ১৬ কোয়ান্টাইজেশন হাঁ হাঁ
প্রশিক্ষণ-পরবর্তী গতিশীল পরিসরের পরিমাণ নির্ধারণ হাঁ না
প্রশিক্ষণ-পরবর্তী পূর্ণসংখ্যার পরিমাণ নির্ধারণ হাঁ না
পরিমাণ নির্ধারণ-সচেতন প্রশিক্ষণ হাঁ না

কর্মক্ষমতা যাচাই করা হচ্ছে

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

LiterRT-এর বিস্তৃত কর্মক্ষমতা এবং নির্ভুলতা-মূল্যায়ন টুলিং রয়েছে যা ডেভেলপারদের তাদের অ্যাপ্লিকেশনে ডেলিগেট ব্যবহারে আত্মবিশ্বাসী হতে সক্ষম করে। এই টুলগুলি পরবর্তী বিভাগে আলোচনা করা হয়েছে।

মূল্যায়নের জন্য সরঞ্জাম

লেটেন্সি এবং মেমোরি ফুটপ্রিন্ট

LiterRT-এর বেঞ্চমার্ক টুলটি মডেলের কর্মক্ষমতা অনুমান করার জন্য উপযুক্ত প্যারামিটার ব্যবহার করা যেতে পারে, যার মধ্যে রয়েছে গড় অনুমান ল্যাটেন্সি, ইনিশিয়ালাইজেশন ওভারহেড, মেমোরি ফুটপ্রিন্ট ইত্যাদি। এই টুলটি আপনার মডেলের জন্য সেরা ডেলিগেট কনফিগারেশন বের করার জন্য একাধিক ফ্ল্যাগ সমর্থন করে। উদাহরণস্বরূপ, OpenGL দিয়ে GPU এক্সিকিউশন পরিমাপ করার জন্য --gpu_backend=gl --use_gpu দিয়ে নির্দিষ্ট করা যেতে পারে। সমর্থিত ডেলিগেট প্যারামিটারগুলির সম্পূর্ণ তালিকা বিস্তারিত ডকুমেন্টেশনে সংজ্ঞায়িত করা হয়েছে।

adb এর মাধ্যমে GPU সহ একটি কোয়ান্টাইজড মডেলের জন্য এখানে একটি উদাহরণ দেওয়া হল:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

আপনি অ্যান্ড্রয়েডের জন্য এই টুলের পূর্ব-নির্মিত সংস্করণ, 64-বিট ARM আর্কিটেকচার এখান থেকে ডাউনলোড করতে পারেন ( আরও বিস্তারিত )।

নির্ভুলতা এবং নির্ভুলতা

প্রতিনিধিরা সাধারণত তাদের CPU প্রতিরূপের তুলনায় ভিন্ন নির্ভুলতায় গণনা সম্পাদন করেন। ফলস্বরূপ, হার্ডওয়্যার ত্বরণের জন্য একজন প্রতিনিধি ব্যবহারের সাথে একটি (সাধারণত গৌণ) নির্ভুলতা বিনিময় যুক্ত থাকে। মনে রাখবেন যে এটি সর্বদা সত্য নয়; উদাহরণস্বরূপ, যেহেতু GPU কোয়ান্টাইজড মডেলগুলি চালানোর জন্য ফ্লোটিং-পয়েন্ট নির্ভুলতা ব্যবহার করে, তাই সামান্য নির্ভুলতার উন্নতি হতে পারে (যেমন, ILSVRC চিত্র শ্রেণীবিভাগে <1% শীর্ষ-5 উন্নতি)।

LiterRT-তে দুটি ধরণের টুলিং রয়েছে যা একটি নির্দিষ্ট মডেলের জন্য একজন ডেলিগেট কতটা সঠিকভাবে আচরণ করে তা পরিমাপ করে: টাস্ক-ভিত্তিক এবং টাস্ক-অ্যাগনস্টিক । এই বিভাগে বর্ণিত সমস্ত টুল পূর্ববর্তী বিভাগের বেঞ্চমার্কিং টুল দ্বারা ব্যবহৃত উন্নত ডেলিগেট প্যারামিটারগুলিকে সমর্থন করে। মনে রাখবেন যে নীচের উপ-বিভাগগুলি মডেল মূল্যায়নের (মডেলটি কি নিজেই কাজের জন্য উপযুক্ত?) পরিবর্তে ডেলিগেট মূল্যায়নের (ডেলিগেট কি CPU-র মতো একই কাজ করে?) উপর ফোকাস করে।

কার্য-ভিত্তিক মূল্যায়ন

LiterRT-এর কাছে দুটি চিত্র-ভিত্তিক কাজের সঠিকতা মূল্যায়নের জন্য সরঞ্জাম রয়েছে:

এই টুলগুলির (অ্যান্ড্রয়েড, ৬৪-বিট এআরএম আর্কিটেকচার) পূর্বনির্মিত বাইনারি, ডকুমেন্টেশন সহ এখানে পাওয়া যাবে:

নীচের উদাহরণটি Pixel 4-এ GPU ব্যবহার করে ছবির শ্রেণীবিভাগ মূল্যায়ন প্রদর্শন করে:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

প্রত্যাশিত আউটপুট হল ১ থেকে ১০ পর্যন্ত টপ-কে মেট্রিক্সের একটি তালিকা:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

কার্য-অজ্ঞেয়বাদী মূল্যায়ন

যেসব কাজের জন্য ডিভাইসে কোনও প্রতিষ্ঠিত মূল্যায়ন সরঞ্জাম নেই, অথবা আপনি যদি কাস্টম মডেল নিয়ে পরীক্ষা-নিরীক্ষা করেন, তাহলে LiteRT-এর ইনফারেন্স ডিফ সরঞ্জাম রয়েছে। (অ্যান্ড্রয়েড, 64-বিট ARM বাইনারি আর্কিটেকচার বাইনারি এখানে )

ইনফারেন্স ডিফ দুটি সেটিংসে LiterRT এক্সিকিউশনের (লেটেন্সি এবং আউটপুট-মান বিচ্যুতির ক্ষেত্রে) তুলনা করে:

  • একক-থ্রেডেড CPU ইনফারেন্স
  • ব্যবহারকারী-সংজ্ঞায়িত অনুমান - এই পরামিতিগুলি দ্বারা সংজ্ঞায়িত

এটি করার জন্য, টুলটি এলোমেলো গাউসিয়ান ডেটা তৈরি করে এবং দুটি TFLite ইন্টারপ্রেটারের মাধ্যমে তা পাস করে - একটি একক-থ্রেডেড CPU কার্নেল চালিত, এবং অন্যটি ব্যবহারকারীর আর্গুমেন্ট দ্বারা প্যারামিটারাইজড।

এটি উভয়ের ল্যাটেন্সি পরিমাপ করে, সেইসাথে প্রতিটি ইন্টারপ্রেটারের আউটপুট টেনসরের মধ্যে পরম পার্থক্য, প্রতি-উপাদানের ভিত্তিতে।

একটি একক আউটপুট টেনসর সহ একটি মডেলের জন্য, আউটপুটটি এইরকম দেখতে পারে:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

এর অর্থ হল সূচক 0 এ আউটপুট টেনসরের জন্য, CPU আউটপুট থেকে প্রাপ্ত উপাদানগুলি ডেলিগেট আউটপুট থেকে গড়ে 1.96e-05 দ্বারা আলাদা।

মনে রাখবেন যে এই সংখ্যাগুলি ব্যাখ্যা করার জন্য মডেল সম্পর্কে আরও গভীর জ্ঞান প্রয়োজন, এবং প্রতিটি আউটপুট টেনসর কী বোঝায়। যদি এটি একটি সাধারণ রিগ্রেশন হয় যা কোনও ধরণের স্কোর বা এম্বেডিং নির্ধারণ করে, তবে পার্থক্যটি কম হওয়া উচিত (অন্যথায় এটি ডেলিগেটের সাথে একটি ত্রুটি)। তবে, SSD মডেলগুলির 'ডিটেকশন ক্লাস' এর মতো আউটপুটগুলি ব্যাখ্যা করা একটু কঠিন। উদাহরণস্বরূপ, এটি এই টুলটি ব্যবহার করে একটি পার্থক্য দেখাতে পারে, তবে এর অর্থ ডেলিগেটের সাথে সত্যিই কিছু ভুল নাও হতে পারে: দুটি (নকল) ক্লাস বিবেচনা করুন: "টিভি (আইডি: 10)", "মনিটর (আইডি: 20)" - যদি কোনও ডেলিগেট সোনালী সত্য থেকে কিছুটা দূরে থাকে এবং টিভির পরিবর্তে মনিটর দেখায়, তবে এই টেনসরের আউটপুট ডিফ 20-10 = 10 এর মতো কিছু হতে পারে।