داخل کامپایلر Apple Neural Engine
خلاصهٔ کاملتر
به گفتهٔ نویسنده، کامپایلر فقط یه مترجم از زبان A به ماشین B نیست؛ یه سیستم مدیریت اطلاعاته که تو هر مرحله تصمیم میگیره چی هنوز مهمه، چی رو میشه تغییر داد و چی رو میشه دور ریخت. سوژهٔ این نوشته مقالهٔ اسپنسر برینگلسون دربارهٔ Apple Neural Engine (شتابدهندهٔ عصبی داخل تراشههای اپل) هست؛ یه گزارش مستقل و مهندسیمعکوس، چون اپل فقط Core ML رو بیرون داده و کامپایلر و فرمت برنامه و درایور و فریمور رو مستند نکرده.
اولین مرحله fusionه، یعنی چسبوندن چند عملیات به هم. تو گراف، conv → bias → relu سه کار جداست، ولی کامپایلر ANE بایاس رو میده به مدار gain-offset سختافزار و اکتیویشن رو تو یکی از اسلاتهای همون عملیات میذاره، و هر سهتا یه دستور واحد میشن. transpose و batch normalization و یه مرحلهٔ dequantization هم میتونن به همین شکل تو عملیات همسایه حل شن. حدش هم روشنه: جمع دو خروجی کانولوشن که هر دو زندهن، یه عملیات مستقل باقی میمونه.
مرحلهٔ بعد legalizationه: بررسی اینکه اون عملیات اصلاً رو این سختافزار اجراشدنیه یا نه. ANE یه پاکت محدودیت داره؛ رتبهٔ تنسور سقف داره، ابعاد کران دارن، کرنل کانولوشن قید مخصوص همون نسل تراشه رو داره و ضرایب باید تو حافظه جا شن. اگه چیزی بیرون این پاکت بیفته، کامپایلر یا کاشیکاریش میکنه یا میشکنتش. جالب اینکه رد شدن از ولیدیتور تضمین موفقیت نیست: رو M1 عملیاتی مثل top-k و sort و dynamic slice و کانولوشن سهبعدی از بخشی از اعتبارسنجی رد میشن ولی موقع تولید کد پاییندستی شکست میخورن.
نمونهٔ محبوب نویسنده ضرب ماتریسیه. اگه وزن سمت راست تو بودجهٔ working-set روی تراشه جا شه (رو M1 حدود ۲ مگابایت)، کامپایلر همون ضرب ماتریسی رو به شکل یه کانولوشن مقیم بازنویسی میکنه؛ اگه جا نشه، به شکل ضرب ماتریسی کاشیشده میمونه. حرفش اینه که کامپایلر موظفه خود محاسبه رو حفظ کنه، نه اسمی که ما روش گذاشتیم. یعنی lowering بیشتر شبیه انتخاب بین چند تحقق ممکن از یه نیت واحده تا ترجمه.
آخرش هم زمانبندی و حرکت دادهست. زمانبند گراف رو خطی میکنه و به پارتیشنهای task descriptor میشکنه؛ معیارش تعداد عملیات نیست، بلکه تخمین اوج حافظهٔ زندهست و هر جا لایهٔ بعدی از سقف حدود ۲ مگابایتی رد بشه، پارتیشن بسته میشه. تو مرحلهٔ DMA هم اون فلش سادهٔ بین دو عملیات قیمت پیدا میکنه: نتیجه میتونه رو تراشه بمونه و مستقیم بره تو مصرفکنندهٔ بعدی، یا مجبور شه بره بیرون تو حافظهٔ دینامیک و برگرده.
نکات کلیدی:
- کامپایلر ANE سه عملیات conv → bias → relu رو به یه عملیات سختافزاری واحد تبدیل میکنه
- بایاس میره تو مسیر gain-offset، ولی جمع دو خروجی کانولوشن زنده ادغامشدنی نیست
- رو M1، ضرب ماتریسی با وزن زیر حدود ۲ مگابایت به کانولوشن مقیم بازنویسی میشه
- top-k و sort و dynamic slice و کانولوشن سهبعدی رو M1 از ولیدیتور رد میشن ولی موقع تولید کد میشکنن
- مرز پارتیشنها رو اوج حافظهٔ زنده تعیین میکنه، نه ساختاری که برنامهنویس نوشته




