LiteRT প্রতিনিধি

প্রতিনিধিরা জিপিইউ এবং ডিজিটাল সিগন্যাল প্রসেসর (ডিএসপি) এর মতো ডিভাইসের এক্সিলারেটরের সুবিধার মাধ্যমে LiteRT মডেলের হার্ডওয়্যার ত্বরণ সক্ষম করে।

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

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

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

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

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

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

প্ল্যাটফর্ম দ্বারা প্রতিনিধিগণ

ক্রস-প্ল্যাটফর্ম (Android এবং iOS)

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

iOS

  • নতুন আইফোন এবং আইপ্যাডগুলির জন্য কোর এমএল প্রতিনিধি - নতুন আইফোন এবং আইপ্যাডগুলির জন্য যেখানে নিউরাল ইঞ্জিন উপলব্ধ, আপনি 32-বিট বা 16-বিট ফ্লোটিং-পয়েন্ট মডেলগুলির জন্য অনুমানকে ত্বরান্বিত করতে কোর এমএল প্রতিনিধি ব্যবহার করতে পারেন। নিউরাল ইঞ্জিন A12 SoC বা উচ্চতর সহ Apple মোবাইল ডিভাইসে উপলব্ধ। কোর ML প্রতিনিধির একটি ওভারভিউ এবং ধাপে ধাপে নির্দেশাবলীর জন্য, LiteRT Core ML প্রতিনিধি দেখুন।

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

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

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

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

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

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

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

লেটেন্সি এবং মেমরি পদচিহ্ন

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

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

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

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

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

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

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

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

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

এই টুলগুলির পূর্বনির্মাণ বাইনারি (Android, 64-bit ARM আর্কিটেকচার), ডকুমেন্টেশন সহ এখানে পাওয়া যাবে:

নীচের উদাহরণটি একটি 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

প্রত্যাশিত আউটপুট হল 1 থেকে 10 পর্যন্ত শীর্ষ-কে মেট্রিক্সের একটি তালিকা:

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-এর Inference Diff টুল আছে। (অ্যান্ড্রয়েড, 64-বিট এআরএম বাইনারি আর্কিটেকচার বাইনারি এখানে )

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

  • একক-থ্রেডেড 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 মডেল থেকে 'ডিটেকশন ক্লাস'-এর মত আউটপুট ব্যাখ্যা করা একটু কঠিন। উদাহরণস্বরূপ, এটি এই টুল ব্যবহার করে একটি পার্থক্য দেখাতে পারে, কিন্তু এর অর্থ প্রতিনিধির সাথে সত্যিই কিছু ভুল নাও হতে পারে: দুটি (জাল) ক্লাস বিবেচনা করুন: "TV (ID: 10)", "Monitor (ID:20)" - যদি একজন প্রতিনিধি সোনালী সত্য থেকে কিছুটা দূরে এবং টিভির পরিবর্তে মনিটর দেখায়, এই টেনসরের আউটপুট পার্থক্য 20-10 = 10 এর মতো বেশি হতে পারে।