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

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

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

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

Graph of model size vs
accuracy

Graph of accuracy vs latency

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

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

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

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

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

مشخصات و بهینه سازی اپراتورها در نمودار

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

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

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

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

تعداد رشته ها را تغییر دهید

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

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

کپی های اضافی را حذف کنید

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

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

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

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

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

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

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