نمایندگان LiteRT

نمایندگان، شتاب سخت‌افزاری مدل‌های LiteRT را با استفاده از شتاب‌دهنده‌های روی دستگاه مانند GPU و پردازشگر سیگنال دیجیتال (DSP) فعال می‌کنند.

به طور پیش فرض، LiteRT از هسته های CPU استفاده می کند که برای مجموعه دستورات ARM Neon بهینه شده اند. با این حال، CPU یک پردازنده چند منظوره است که لزوماً برای محاسبات سنگین که معمولاً در مدل‌های یادگیری ماشین یافت می‌شود (مثلاً ریاضیات ماتریسی درگیر در لایه‌های کانولوشن و متراکم) بهینه‌سازی نشده است.

از سوی دیگر، اکثر تلفن های همراه مدرن دارای تراشه هایی هستند که در انجام این عملیات های سنگین بهتر عمل می کنند. استفاده از آنها برای عملیات شبکه عصبی مزایای زیادی از نظر تأخیر و بهره وری توان به همراه دارد. برای مثال، پردازنده‌های گرافیکی می‌توانند تا 5 برابر سرعت تأخیر ایجاد کنند.

هر یک از این شتاب‌دهنده‌ها دارای APIهایی هستند که محاسبات سفارشی را فعال می‌کنند، مانند OpenCL یا OpenGL ES برای GPU موبایل. به طور معمول، برای اجرای یک شبکه عصبی از طریق این رابط ها، باید کدهای سفارشی زیادی بنویسید. وقتی در نظر بگیرید که هر شتاب دهنده مزایا و معایب خود را دارد و نمی تواند هر عملیاتی را در یک شبکه عصبی اجرا کند، اوضاع پیچیده تر می شود. Delegate API TensorFlow Lite این مشکل را با عمل به عنوان پلی بین زمان اجرا TFLite و این APIهای سطح پایین حل می کند.

زمان اجرا با نمایندگان

انتخاب نماینده

LiteRT از چندین نماینده پشتیبانی می کند که هر کدام برای پلتفرم(های) خاص و انواع خاصی از مدل ها بهینه شده اند. معمولاً، بسته به دو معیار اصلی، چندین نماینده برای مورد استفاده شما وجود خواهد داشت: پلتفرم (اندروید یا iOS؟) که شما هدف می‌گیرید، و نوع مدل (مقطع شناور یا کوانتیزه؟) که می‌خواهید شتاب دهید. .

نمایندگان بر اساس پلت فرم

کراس پلتفرم (اندروید و iOS)

  • نماینده GPU - نماینده GPU را می توان در اندروید و iOS استفاده کرد. این برای اجرای مدل های مبتنی بر شناور 32 بیتی و 16 بیتی در جایی که یک GPU در دسترس است بهینه شده است. همچنین از مدل‌های کوانتیزه ۸ بیتی پشتیبانی می‌کند و عملکرد GPU را همتراز نسخه‌های شناور آن‌ها ارائه می‌کند. برای جزئیات بیشتر در مورد نماینده GPU، به LiteRT در GPU مراجعه کنید.

iOS

  • نماینده Core ML برای آیفون‌ها و آی‌پدهای جدید - برای آیفون‌ها و آی‌پدهای جدیدتر که Neural Engine در دسترس است، می‌توانید از نماینده Core ML برای تسریع استنتاج برای مدل‌های ممیز شناور ۳۲ بیتی یا ۱۶ بیتی استفاده کنید. Neural Engine دستگاه های تلفن همراه اپل با SoC A12 یا بالاتر در دسترس است. برای مروری بر نماینده Core ML و دستورالعمل های گام به گام، LiteRT Core ML delegate را ببینید.

نمایندگان بر اساس نوع مدل

هر شتاب دهنده با در نظر گرفتن پهنای بیت معینی از داده ها طراحی شده است. اگر یک مدل ممیز شناور به نماینده ای ارائه دهید که فقط از عملیات کوانتیزه 8 بیتی پشتیبانی می کند، تمام عملیات آن را رد می کند و مدل به طور کامل روی CPU اجرا می شود. برای جلوگیری از چنین غافلگیری، جدول زیر یک نمای کلی از پشتیبانی نمایندگی بر اساس نوع مدل ارائه می دهد:

نوع مدل پردازنده گرافیکی CoreML
ممیز شناور (32 بیت) بله بله
کوانتیزاسیون float16 پس از تمرین بله بله
کوانتیزاسیون محدوده دینامیکی پس از تمرین بله خیر
کوانتیزاسیون اعداد صحیح پس از آموزش بله خیر
آموزش آگاهی از کوانتیزاسیون بله خیر

اعتبارسنجی عملکرد

اطلاعات این بخش به عنوان یک دستورالعمل تقریبی برای فهرست کوتاه نمایندگانی عمل می کند که می توانند درخواست شما را بهبود بخشند. با این حال، توجه به این نکته مهم است که هر نماینده دارای مجموعه ای از عملیات از پیش تعریف شده است که از آن پشتیبانی می کند و ممکن است بسته به مدل و دستگاه، عملکرد متفاوتی داشته باشد. بنابراین، معمولاً توصیه می‌شود که برای سنجش میزان مفید بودن یک نماینده برای نیازهای شما، مقداری معیار انجام دهید. این همچنین به توجیه افزایش اندازه باینری مرتبط با پیوست کردن یک نماینده به زمان اجرا LiteRT کمک می کند.

LiteRT دارای ابزارهای ارزیابی عملکرد و دقت گسترده ای است که می تواند توسعه دهندگان را قادر سازد تا در استفاده از نمایندگان در برنامه خود مطمئن باشند. این ابزارها در بخش بعدی مورد بحث قرار می گیرند.

ابزارهای ارزیابی

تأخیر و ردپای حافظه

ابزار محک LiteRT را می توان با پارامترهای مناسب برای تخمین عملکرد مدل استفاده کرد، از جمله میانگین تأخیر استنتاج، سربار اولیه سازی، ردپای حافظه و غیره. این ابزار از چندین پرچم برای تعیین بهترین پیکربندی نماینده برای مدل شما پشتیبانی می کند. به عنوان مثال، --gpu_backend=gl می توان با --use_gpu برای اندازه گیری اجرای GPU با OpenGL مشخص کرد. لیست کامل پارامترهای نمایندگی پشتیبانی شده در مستندات دقیق تعریف شده است.

در اینجا یک نمونه اجرا شده برای یک مدل کوانتیزه شده با GPU از طریق adb آورده شده است:

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

نسخه پیش ساخته این ابزار برای اندروید، معماری ARM 64 بیتی را می توانید از اینجا دانلود کنید ( جزئیات بیشتر ).

دقت و صحت

نمایندگان معمولاً محاسبات را با دقت متفاوتی نسبت به همتایان CPU خود انجام می دهند. در نتیجه، یک معاوضه دقت (معمولاً جزئی) در ارتباط با استفاده از یک نماینده برای شتاب سخت افزاری وجود دارد. توجه داشته باشید که این همیشه درست نیست. برای مثال، از آنجایی که GPU از دقت ممیز شناور برای اجرای مدل‌های کوانتیزه استفاده می‌کند، ممکن است یک بهبود دقت جزئی وجود داشته باشد (به عنوان مثال، کمتر از 1% بهبود Top-5 در طبقه‌بندی تصویر ILSVRC).

LiteRT دو نوع ابزار برای اندازه گیری دقیق رفتار یک نماینده برای یک مدل معین دارد: Task-Based و Task-Agnostic . تمام ابزارهای توضیح داده شده در این بخش از پارامترهای پیشرفته تفویض اختیار که توسط ابزار محک در بخش قبل استفاده شده است پشتیبانی می کنند. توجه داشته باشید که بخش های فرعی زیر به جای ارزیابی مدل (آیا خود مدل برای کار خوب است؟) بر ارزیابی نماینده (آیا نماینده همان CPU را انجام می دهد؟) تمرکز دارد.

ارزیابی مبتنی بر وظیفه

LiteRT ابزارهایی برای ارزیابی صحت در دو کار مبتنی بر تصویر دارد:

باینری های از پیش ساخته شده این ابزارها (اندروید، معماری ARM 64 بیتی)، به همراه مستندات را می توانید در اینجا بیابید:

مثال زیر ارزیابی طبقه بندی تصویر با GPU را در پیکسل 4 نشان می دهد:

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-K از 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 بیتی ARM در اینجا )

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 باشد.