نمایندگان TensorFlow Lite

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

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

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

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

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

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

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

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

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

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

iOS

  • نماینده Core ML برای iPhones و iPad های جدید - برای iPhones و iPad های جدیدتر که Neural Engine در دسترس است، می توانید از نماینده Core ML برای تسریع استنتاج برای مدل های ممیز شناور 32 بیتی یا 16 بیتی استفاده کنید. Neural Engine دستگاه های تلفن همراه اپل با SoC A12 یا بالاتر در دسترس است. برای نمای کلی از نماینده Core ML و دستورالعمل های گام به گام، TensorFlow Lite Core ML نماینده را ببینید.

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

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

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

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

اطلاعات این بخش به عنوان یک دستورالعمل تقریبی برای فهرست کوتاه نمایندگانی عمل می کند که می توانند درخواست شما را بهبود بخشند. با این حال، توجه به این نکته مهم است که هر نماینده دارای مجموعه ای از عملیات از پیش تعریف شده است که از آن پشتیبانی می کند، و ممکن است بسته به مدل و دستگاه، عملکرد متفاوتی داشته باشد. بنابراین، معمولاً توصیه می‌شود که برای سنجش میزان مفید بودن یک نماینده برای نیازهای شما، مقداری معیار انجام دهید. این همچنین به توجیه افزایش اندازه باینری مرتبط با پیوست کردن یک نماینده به زمان اجرا 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 ابزارهایی برای ارزیابی صحت در دو کار مبتنی بر تصویر دارد:

باینری های از پیش ساخته شده این ابزارها (Android، معماری 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

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

برای کارهایی که یک ابزار ارزیابی روی دستگاه وجود ندارد، یا اگر در حال آزمایش با مدل‌های سفارشی هستید، 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 باشد.