اگر در حال حاضر برای مدلهای TinyML روی سختافزارهای محدود کد میزنید، احتمالاً با «مالیات عملکردی» زبان پایتون دستوپنجه نرم میکنید. تصور کنید همین حالا بتوانید یک شبکه عصبی را در کمتر از یک ثانیه آموزش دهید، بدون اینکه درگیر پیچیدگیهای PyTorch شوید.
utensil یک کتابخانه تخصصی به زبان C است که توسط توسعهدهندهای به نام zserge خلق شده است. طبق گزارش منتشرشده در ۱۴ ژوئیه ۲۰۲۶، این ابزار میتواند یک شبکه عصبی را روی مجموعه داده MNIST در هر Epoch تنها در ۰.۸ ثانیه روی مکبوک M1 آموزش دهد.
توسعه مدرن هوش مصنوعی بهشدت بر چارچوبهای عظیمی متکی است که انعطافپذیری را بر کارایی خام باینری ترجیح میدهند. در حالی که PyTorch اکوسیستم گستردهای فراهم میکند، اما سربارهای سیستمی (Overhead) را معرفی میکند که میتواند سرعت برنامههای TinyML را کاهش دهد. zserge کتابخانه utensil را به عنوان یک «ضد-PyTorch» طراحی کرد؛ یک کتابخانه تک-هدر (header-only) که به توسعهدهنده کنترل کامل بر حافظه و توزیع سختافزاری (Hardware Dispatch) میدهد.
معماری یک تنسور
در هسته این کتابخانه، یک تنسور به عنوان یک آرایه تخت از اعداد اعشاری تعریف شده است که با متادیتایی جفت شده است. این متادیتا شامل شکل (Shape) و گامها (Strides) است. این ساختار اجازه میدهد یک آرایه یکبعدی بدون محاسبات مجدد و هزینهبر اندیسها، به عنوان یک شیء چندبعدی تفسیر شود.
برای مدیریت بهینه حافظه، utensil یک سیستم شمارش ارجاعات (Reference Counting) را پیادهسازی میکند. این مکانیسم اجازه میدهد تنسورها دادههای زیربنایی یکسانی را به اشتراک بگذارند. این امر ایجاد «نماها» (Views) و ترانه-پوزیسیونها (Transpositions) را بدون نیاز به کپی کردن دادهها ممکن میسازد که یک بهینهسازی حیاتی برای محاسبات با عملکرد بالاست.

شتابدهی GPU از طریق Metal
با تشخیص این موضوع که پردازندههای مرکزی (CPU) نمیتوانند با توان عملیاتی سختافزارهای اختصاصی رقابت کنند، این کتابخانه با API Metal اپل یکپارچه شده است. utensil با استفاده از یک کرنل سفارشی در زبان شیدینگ متال (MSL)، عملیاتهای نقطهبهنقطه مانند ReLU را به واحد پردازش گرافیکی (GPU) میسپارد.
به دلیل هدف قرار دادن Apple Silicon، این کتابخانه از «حافظه یکپارچه» (Unified Memory) بهره میبرد که انتقال داده بین CPU و GPU را بسیار ساده میکند. توسعهدهنده برای حفظ ماهیت زبان C و در عین حال دسترسی به قابلیتهای Metal، از توابع سطح پایین زمان اجرای Objective-C مانند objC_msgSend استفاده کرده است تا کتابخانه در حالت خالص C باقی بماند.
بهینهسازی ضرب ماتریسی
ضرب ماتریسی (matmul) معمولاً ۸۰٪ از عملیات اعشاری (FLOPs) در شبکههای عصبی را شامل میشود. utensil برای مدیریت این بخش از یک رویکرد لایهای (Tiered Approach) استفاده میکند:
- مسیر CPU: از چارچوب Accelerate و تابع
cblas_sgemmبهره میبرد که پردازنده کمکی AMX را به کار میگیرد. این روش برای ماتریسهای بزرگتر از ۳۲x۳۲، بین ۵۰ تا ۱۰۰ برابر سریعتر از حلقههای تو در تو ساده است. - مسیر GPU: یک کرنل Metal سفارشی برای ماتریسهای بزرگ و تنسورهای سهبعدی دستهبندی شده (Batched 3D Tensors) پیادهسازی کرده است.

پسانتشار دستی و آموزش
برخلاف PyTorch که از یک گراف محاسباتی خودکار (autograd) استفاده میکند، utensil بر پسانتشار (Backpropagation) دستی متکی است. در این رویکرد، هر لایه یک ساختار (struct) است که دارای توابع صریح forward و backward میباشد.
در یک لایه خطی، گام backward گرادیانها را برای وزنها و بایاسها با استفاده از ضرب ماتریسی ترانه-پوزیشنی محاسبه میکند. برای جلوگیری از هزینه ایجاد کپیهای فیزیکی از ترانه-پوزیسیونها، کتابخانه از توابع تخصصی ut_matmul_t استفاده میکند که ماتریس ورودی را بدون کپی کردن حافظه، به صورت ترانه-پوزیشنی پردازش میکنند.
عملکرد واقعی: MNIST
برای اعتبارسنجی کتابخانه، zserge یک شبکه تماممتصل (۷۸۴ $
ightarrow$ ۱۲۸ $
ightarrow$ ۱۰) را روی مجموعه داده MNIST (ارقام دستنویس) آموزش داد. در این تنظیمات از روش کاهش گرادیان تصادفی (SGD) همراه با تکانه (Momentum) و تابع زیان آنتروپی متقاطع (Cross-Entropy Loss) استفاده شد.

به نقل از گزارش zserge.com، نتایج بهدستآمده خیرهکننده بود:
- utensil: ۰.۸ ثانیه برای هر Epoch.
- PyTorch: تقریباً ۲ ثانیه برای هر Epoch.
مدل در طی ۵ Epoch به صحت ۹۹٪ در آموزش و حدود ۹۷٪ در آزمون رسید. نویسنده خاطرنشان کرد که برای مدلهای بزرگتر، زبان C بهطور کلی ۲ تا ۴ برابر سریعتر از PyTorch است، بهویژه زمانی که عملیاتها بهدرستی ادغام (Fused) شوند.
تحلیل برای توسعهدهنده
این پروژه فرض رایج مبنی بر اینکه چارچوبهای سطح بالا همیشه بهینهترین انتخاب برای هوش مصنوعی روی دستگاه هستند را به چالش میکشد. با ادغام عملیاتها و حذف سربار autograd، ثابت شد که کتابخانههای مینیمال C برای مدلهایی با معماری ثابت و تخصصی، بسیار کارآمدترند.
برای مهندسان Edge AI یا TinyML، این بدان معناست که «مالیات عملکردی» چارچوبهای مبتنی بر پایتون یک مانع جدی است. بازگشت به لایههای نزدیک به سختافزار و مدیریت دستی حافظه، صرفاً نوستالژی برای زبان C نیست، بلکه یک استراتژی مشروع برای کاهش تأخیر و مصرف برق در دستگاههای با منابع محدود است.
اگر برای Apple Silicon توسعه میدهید، بررسی تعامل C و Metal از طریق حافظه یکپارچه، مستقیمترین مسیر برای به حداکثر رساندن توان عملیاتی است. بهای این سرعت، از دست دادن انعطافپذیری است؛ شما راحتیِ گرافهای پویا را با سرعت خطلولههای استاتیک و بهینهشده دستی عوض میکنید.
توسعهدهندگان علاقهمند میتوانند مخزن گیتهاب پروژه را کلون کنند تا لایههای جدید را اضافه کرده یا تجربه ساخت یک ترنسفورمر کوچک مشابه GPT-2 را با این رویکرد سادهشده امتحان کنند.
گام بعدی شما
- مخزن گیتهاب پروژه را کلون کنید تا با ساختار لایههای C آشنا شوید.
- سعی کنید یک ترنسفورمر کوچک مشابه GPT-2 را با این رویکرد مینیمال پیادهسازی کنید.
- بررسی کنید کدام بخش از کد شما در حال حاضر بیشترین سربار حافظه را در PyTorch دارد.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما درباره تراشههای Blackwell مراجعه کنید.




گفتگو