بهترین شیوه های عملکرد

دستگاه‌های موبایل و دستگاه‌های تعبیه‌شده منابع محاسباتی محدودی دارند، بنابراین مهم است که منابع برنامه خود را کارآمد نگه دارید. ما فهرستی از بهترین شیوه‌ها و استراتژی‌هایی را گردآوری کرده‌ایم که می‌توانید برای بهبود عملکرد مدل TensorFlow Lite خود استفاده کنید.

بهترین مدل را برای کار انتخاب کنید

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

Graph of model size vs
accuracy

Graph of accuracy vs latency

یک نمونه از مدل‌های بهینه‌شده برای دستگاه‌های تلفن همراه، MobileNets است که برای برنامه‌های بینایی موبایل بهینه شده‌اند. Kaggle Models چندین مدل دیگر را فهرست می‌کند که به‌طور خاص برای دستگاه‌های تلفن همراه و تعبیه‌شده بهینه شده‌اند.

شما می‌توانید مدل‌های فهرست‌شده را با استفاده از یادگیری انتقالی، روی مجموعه داده‌های خودتان دوباره آموزش دهید.

مدل خود را معرفی کنید

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

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

پروفایل و بهینه‌سازی عملگرها در نمودار

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

مدل خود را بهینه کنید

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

برای جزئیات بیشتر، مستندات بهینه‌سازی مدل را بررسی کنید.

تعداد رشته‌ها را تنظیم کنید

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

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

حذف کپی‌های اضافی

اگر برنامه شما با دقت طراحی نشده باشد، ممکن است هنگام ارسال ورودی و خواندن خروجی از مدل، کپی‌های اضافی وجود داشته باشد. حتماً کپی‌های اضافی را حذف کنید. اگر از APIهای سطح بالاتر مانند جاوا استفاده می‌کنید، حتماً مستندات مربوط به هشدارهای عملکرد را با دقت بررسی کنید. به عنوان مثال، اگر ByteBuffers به ​​عنوان ورودی استفاده شود، API جاوا بسیار سریع‌تر است.

اپلیکیشن خود را با ابزارهای مخصوص پلتفرم، پروفایل کنید

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

ارزیابی کنید که آیا مدل شما از استفاده از شتاب‌دهنده‌های سخت‌افزاری موجود در دستگاه سود می‌برد یا خیر.

LiteRT روش‌های جدیدی برای سرعت بخشیدن به مدل‌ها با سخت‌افزارهای سریع‌تر مانند GPUها، DSPها و شتاب‌دهنده‌های عصبی اضافه کرده است. معمولاً این شتاب‌دهنده‌ها از طریق زیرماژول‌های نماینده که بخش‌هایی از اجرای مفسر را بر عهده می‌گیرند، در معرض دید قرار می‌گیرند. LiteRT می‌تواند از نمایندگان به روش‌های زیر استفاده کند:

  • نماینده GPU در اندروید و iOS، به ترتیب با استفاده از OpenGL/OpenCL و Metal در دسترس است. برای امتحان کردن آنها، به نماینده GPU مراجعه کنید.
  • اگر به سخت‌افزار غیراستاندارد دسترسی دارید، می‌توانید نماینده خودتان را ایجاد کنید. برای اطلاعات بیشتر به LiteRT delegates مراجعه کنید.

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