نمایندگان TensorFlow Lite

معرفی

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

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

از سوی دیگر، اکثر تلفن های همراه مدرن دارای تراشه هایی هستند که در انجام این عملیات های سنگین بهتر عمل می کنند. استفاده از آنها برای عملیات شبکه عصبی مزایای زیادی از نظر تأخیر و بهره وری توان به همراه دارد. برای مثال، پردازنده‌های گرافیکی می‌توانند تا 5 برابر سرعت تأخیر ارائه دهند، در حالی که Qualcomm® Hexagon DSP در آزمایش‌های ما نشان داده است که مصرف انرژی را تا 75 درصد کاهش می‌دهد.

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

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

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

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

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

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

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

اندروید

  • نماینده NNAPI برای دستگاه‌های Android جدید - نماینده NNAPI می‌تواند برای سرعت بخشیدن به مدل‌ها در دستگاه‌های Android با GPU، DSP و/یا NPU در دسترس استفاده شود. در Android 8.1 (API 27+) یا بالاتر موجود است. برای نمای کلی از نماینده NNAPI، دستورالعمل‌های گام به گام و بهترین شیوه‌ها، به نماینده TensorFlow Lite NNAPI مراجعه کنید.
  • نماینده Hexagon برای دستگاه‌های Android قدیمی - نماینده Hexagon می‌تواند برای سرعت بخشیدن به مدل‌ها در دستگاه‌های Android با Qualcomm Hexagon DSP استفاده شود. می‌توان از آن در دستگاه‌های دارای نسخه‌های قدیمی‌تر Android که از NNAPI پشتیبانی نمی‌کنند استفاده کرد. برای جزئیات بیشتر به نماینده شش گوشه TensorFlow Lite مراجعه کنید.

iOS

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

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

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

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

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

اطلاعات این بخش به عنوان یک دستورالعمل تقریبی برای فهرست کوتاه نمایندگانی عمل می کند که می توانند درخواست شما را بهبود بخشند. با این حال، توجه به این نکته مهم است که هر نماینده دارای مجموعه ای از عملیات از پیش تعریف شده است که از آن پشتیبانی می کند، و ممکن است بسته به مدل و دستگاه، عملکرد متفاوتی داشته باشد. برای مثال، نماینده NNAPI ممکن است استفاده از Edge-TPU Google را در تلفن Pixel در حالی که از DSP در دستگاه دیگری استفاده می‌کند، انتخاب کند. بنابراین، معمولاً توصیه می‌شود که برای سنجش میزان مفید بودن یک نماینده برای نیازهای شما، مقداری معیار انجام دهید. این همچنین به توجیه افزایش اندازه باینری مرتبط با پیوست کردن یک نماینده به زمان اجرا TensorFlow Lite کمک می کند.

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

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

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

ابزار بنچمارک TensorFlow Lite را می توان با پارامترهای مناسب برای تخمین عملکرد مدل، از جمله میانگین تأخیر استنتاج، سربار مقداردهی اولیه، ردپای حافظه، و غیره استفاده کرد. این ابزار از چندین پرچم برای تعیین بهترین پیکربندی نماینده برای مدل شما پشتیبانی می کند. به عنوان مثال، --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).

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

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

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

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

مثال زیر ارزیابی طبقه‌بندی تصویر را با NNAPI با استفاده از Edge-TPU Google در پیکسل 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_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

خروجی مورد انتظار لیستی از معیارهای 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

ارزیابی وظیفه-آگنوستیک

برای کارهایی که ابزار ارزیابی روی دستگاه وجود ندارد، یا اگر در حال آزمایش با مدل‌های سفارشی هستید، TensorFlow Lite ابزار Inference Diff را دارد. (آندروید، معماری باینری 64 بیتی ARM در اینجا )

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