টেনসরফ্লো লাইট প্রতিনিধি

ভূমিকা

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

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

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

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

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

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

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

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

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

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

অ্যান্ড্রয়েড

  • নতুন অ্যান্ড্রয়েড ডিভাইসের জন্য NNAPI প্রতিনিধি - GPU, DSP এবং / অথবা NPU উপলব্ধ সহ Android ডিভাইসে মডেলগুলিকে ত্বরান্বিত করতে NNAPI প্রতিনিধি ব্যবহার করা যেতে পারে। এটি Android 8.1 (API 27+) বা উচ্চতর সংস্করণে উপলব্ধ। NNAPI প্রতিনিধির একটি ওভারভিউ, ধাপে ধাপে নির্দেশাবলী এবং সর্বোত্তম অনুশীলনের জন্য, TensorFlow Lite NNAPI প্রতিনিধি দেখুন।
  • পুরানো অ্যান্ড্রয়েড ডিভাইসের জন্য হেক্সাগন প্রতিনিধি - Qualcomm Hexagon DSP এর সাথে Android ডিভাইসে মডেলগুলিকে ত্বরান্বিত করতে Hexagon প্রতিনিধি ব্যবহার করা যেতে পারে। এটি অ্যান্ড্রয়েডের পুরানো সংস্করণগুলি চলমান ডিভাইসগুলিতে ব্যবহার করা যেতে পারে যা NNAPI সমর্থন করে না৷ আরও বিস্তারিত জানার জন্য TensorFlow Lite Hexagon প্রতিনিধি দেখুন।

iOS

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

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

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

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

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

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

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

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

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

TensorFlow Lite-এর বেঞ্চমার্ক টুলটি মডেলের পারফরম্যান্স অনুমান করার জন্য উপযুক্ত প্যারামিটারের সাথে ব্যবহার করা যেতে পারে, যার মধ্যে গড় ইনফারেন্স লেটেন্সি, ইনিশিয়ালাইজেশন ওভারহেড, মেমরি ফুটপ্রিন্ট ইত্যাদি। এই টুলটি আপনার মডেলের জন্য সেরা প্রতিনিধি কনফিগারেশন বের করতে একাধিক ফ্ল্যাগ সমর্থন করে উদাহরণস্বরূপ, 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 উন্নতি)।

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

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

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

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

নীচের উদাহরণটি একটি Pixel 4-এ Google-এর Edge-TPU ব্যবহার করে NNAPI-এর সাথে চিত্র শ্রেণীবিভাগ মূল্যায়ন প্রদর্শন করে:

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_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

প্রত্যাশিত আউটপুট হল 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

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

যেসব কাজের জন্য কোনো প্রতিষ্ঠিত ডিভাইসে মূল্যায়ন টুল নেই, অথবা আপনি যদি কাস্টম মডেল নিয়ে পরীক্ষা-নিরীক্ষা করছেন, TensorFlow Lite-এর Inference Diff টুল আছে। (অ্যান্ড্রয়েড, 64-বিট এআরএম বাইনারি আর্কিটেকচার বাইনারি এখানে )

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

  • একক-থ্রেডেড 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 এর মতো বেশি হতে পারে।