ساخت و تبدیل مدل ها

میکروکنترلرها حافظه رم و فضای ذخیره‌سازی محدودی دارند که محدودیت‌هایی را بر اندازه مدل‌های یادگیری ماشین ایجاد می‌کند. علاوه بر این، LiteRT برای میکروکنترلرها در حال حاضر از زیرمجموعه محدودی از عملیات پشتیبانی می‌کند، بنابراین همه معماری‌های مدل امکان‌پذیر نیستند.

این سند فرآیند تبدیل یک مدل TensorFlow برای اجرا روی میکروکنترلرها را توضیح می‌دهد. همچنین عملیات پشتیبانی شده را تشریح می‌کند و راهنمایی‌هایی در مورد طراحی و آموزش یک مدل برای قرار گرفتن در حافظه محدود ارائه می‌دهد.

برای یک مثال قابل اجرا و جامع از ساخت و تبدیل یک مدل، به مثال Hello World مراجعه کنید.

تبدیل مدل

برای تبدیل یک مدل آموزش‌دیده TensorFlow برای اجرا روی میکروکنترلرها، باید از API پایتون مبدل LiteRT استفاده کنید. این کار مدل را به یک FlatBuffer تبدیل می‌کند، اندازه مدل را کاهش می‌دهد و آن را برای استفاده از عملیات LiteRT اصلاح می‌کند.

برای به دست آوردن کوچکترین اندازه مدل ممکن، باید استفاده از کوانتیزاسیون پس از آموزش را در نظر بگیرید.

تبدیل به آرایه C

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

دستور یونیکس زیر یک فایل منبع C ایجاد می‌کند که شامل مدل LiteRT به صورت یک آرایه char است:

xxd -i converted_model.tflite > model_data.cc

خروجی مشابه زیر خواهد بود:

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

پس از تولید فایل، می‌توانید آن را در برنامه خود بگنجانید. برای بهره‌وری بهتر از حافظه در پلتفرم‌های تعبیه‌شده، تغییر تعریف آرایه به const مهم است.

برای مثالی از نحوه‌ی گنجاندن و استفاده از یک مدل در برنامه‌تان، به hello_world_test.cc در مثال Hello World مراجعه کنید.

معماری مدل و آموزش

هنگام طراحی یک مدل برای استفاده در میکروکنترلرها، در نظر گرفتن اندازه مدل، حجم کار و عملیاتی که استفاده می‌شوند، مهم است.

اندازه مدل

یک مدل باید به اندازه کافی کوچک باشد تا در حافظه دستگاه هدف شما در کنار بقیه برنامه، چه به صورت دودویی و چه در زمان اجرا، جا شود.

برای ایجاد یک مدل کوچک‌تر، می‌توانید از لایه‌های کمتر و کوچک‌تری در معماری خود استفاده کنید. با این حال، مدل‌های کوچک بیشتر احتمال دارد که از مشکل «کم‌برازش» (Underfitting) رنج ببرند. این بدان معناست که برای بسیاری از مسائل، منطقی است که سعی کنید از بزرگترین مدلی که در حافظه جا می‌شود استفاده کنید. با این حال، استفاده از مدل‌های بزرگتر منجر به افزایش حجم کار پردازنده نیز خواهد شد.

حجم کار

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

پشتیبانی عملیات

LiteRT برای میکروکنترلرها در حال حاضر از زیرمجموعه محدودی از عملیات TensorFlow پشتیبانی می‌کند که بر معماری‌های مدلی که می‌توان اجرا کرد تأثیر می‌گذارد. ما در حال کار بر روی گسترش پشتیبانی از عملیات، هم از نظر پیاده‌سازی‌های مرجع و هم بهینه‌سازی‌ها برای معماری‌های خاص هستیم.

عملیات پشتیبانی شده را می‌توان در فایل micro_mutable_ops_resolver.h مشاهده کرد.