مقدمه
نمایندگان ، شتاب سختافزاری مدلهای 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 برای تسریع استنتاج برای مدلهای ممیز شناور 32 بیتی یا 16 بیتی استفاده کنید. Neural Engine دستگاه های تلفن همراه اپل با SoC A12 یا بالاتر در دسترس است. برای نمای کلی از نماینده Core ML و دستورالعمل های گام به گام، TensorFlow Lite Core ML نماینده را ببینید.
نمایندگان بر اساس نوع مدل
هر شتاب دهنده با در نظر گرفتن پهنای بیت معینی از داده ها طراحی شده است. اگر یک مدل ممیز شناور را به نماینده ای ارائه دهید که فقط از عملیات کوانتیزه شده 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 ابزارهایی برای ارزیابی صحت در دو کار مبتنی بر تصویر دارد:
ILSVRC 2012 (طبقه بندی تصویر) با دقت بالای K
تشخیص اشیاء COCO (با جعبه های مرزی) با میانگین دقت متوسط (mAP)
باینری های از پیش ساخته شده این ابزارها (اندروید، معماری 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)" - اگر یک نماینده کمی از حقیقت طلایی فاصله دارد و مانیتور را به جای تلویزیون نشان می دهد، تفاوت خروجی برای این تانسور ممکن است چیزی به اندازه 10-20-10 باشد.