یک پارادوکس جذاب در مدل‌های جدید: مدلی با ده‌ها میلیارد پارامتر می‌تواند در هر توکن، محاسبه‌ای به‌اندازه‌ی مدلی چند میلیاردی انجام دهد. این معماری ترکیب متخصص‌ها یا MoE است — شبکه‌ای از «متخصص‌ها» که مسیریاب برای هر توکن فقط چندتایشان را صدا می‌زند. برای کاربر خانگی و تیم‌های کوچک این یعنی شانس اجرای مدل‌های بزرگ روی سخت‌افزار معمولی. اما یک شرط دارد و همان شرط، کل ماجرای این مطلب است: حافظه.

مشکل ظرفیت است، نه محاسبه

هر توکن فقط چند متخصص را فعال می‌کند، اما این‌که کدام متخصص‌ها فعال شوند تا لحظه‌ی رسیدن توکن معلوم نیست. پس در بدترین حالت، همه‌ی وزن‌ها باید در دسترس باشند — یعنی کل مدل در حافظه‌ی سریع. یک مدل MoE بزرگ روی GPU معمولی جا نمی‌شود؛ روی RAM رایانه جا می‌شود اما RAM ده‌ها برابر کندتر از VRAM است. پس دو سؤال مهندسی داریم: چطور متخصص‌ها را به‌موقع جابه‌جا کنیم که کاربر منتظر نماند؟ و چطور مطمئن شویم متخصص‌های پرکار همیشه در جای درست‌اند؟

انتقال متخصص‌ها: offloading و پیش‌بارگذاری

ایده‌ی پایه ساده است: متخصص‌ها را در RAM (یا SSD سریع) نگه دارید و هر کدام را که مسیریاب خواست، به VRAM بیاورید. اجرای خام همین ایده فاجعه است — انتظار انتقال، سرعت را نابود می‌کند. ترفند اصلی پیش‌بارگذاری است: مسیریابِ هر لایه در همان ابتدای پردازش توکن تصمیمش را می‌گیرد و شروع درخواست متخصص‌ها می‌کند؛ تا نوبت محاسبه‌ی آن لایه برسد، انتقال تمام شده است. عمق این هم‌پوشانی — چند لایه جلوتر را زودتر بخواهیم — یک پیچ تنظیم است: زیادش حافظه را می‌خورد، کمش انتظار می‌سازد.

کشِ متخصص‌های داغ

حقیقت جالب توزیع استفاده‌ی متخصص‌ها: برابر نیست. در کارهای واقعی، برخی متخصص‌ها — مثلاً آن‌هایی که مسئول نحو کد یا پونکتواسیون‌اند — بسیار پرترددند و برخی تقریباً بیکار. این یعنی کش کردن جواب می‌دهد: متخصص‌های داغ در VRAM بمانند، سردترها در RAM. برای خودتان کش بسازید و طبق وظیفه تنظیمش کنید؛ کدی که می‌نویسید با متن فارسی، کشِ متفاوتی می‌خواهد. مکملش کوانتیزاسیون نامتقارن است: متخصص‌های داغ را با دقت بالاتر نگه دارید و سردها را سنگین فشرده — بودجه‌ی حافظه را خرج همان‌جا کنید که استفاده هست.

مسیریابی پویا و تعادل بار

مسیریابِ مدل، متخصص را برای کیفیت انتخاب می‌کند، نه برای وضعیت حافظه‌ی شما. اگر چند درخواست هم‌زمان همه به یک متخصص برسند، صف انتقال می‌سازید. راه‌حل‌های عملی: بچ‌کردن توکن‌های هم‌مسیر — درخواست‌هایی که به متخصص یکسانی می‌روند یک‌جا محاسبه شوند؛ زمان‌بندی آگاه به حافظه — درخواستی که متخصص‌هایش از قبل روی کارت است، جلوتر برود؛ و اگر مدل خودتان را آموزش می‌دهید، متعادل‌سازی بار در آموزش تا هیچ متخصصی داغگاه نشود. در سرویس‌دهی تک‌کاربره — همان سناریوی «روی لپ‌تاپ خودم اجرا کنم» — این پیچیده‌ها ساده‌ترند: صفی نیست، فقط سرعت توکن‌درثانیه است که با کیفیت کش و پیش‌بارگذاری تنظیم می‌شود.

روی سخت‌افزار معمولی، اجرای MoE یک مسئله‌ی محاسباتی نیست؛ یک مسئله‌ی لجستیک است: متخصص درست، در جای درست، در زمان درست.

چک‌لیست عملی شروع

قبل از شروع، سه عدد را از سخت‌افزار خودتان بگیرید: حجم VRAM، حجم RAM در دسترس، و سرعت خواندن RAM. مدل‌ها را بر اساس «حجم کوانتیزه‌شده‌ی کل» انتخاب کنید نه «پارامتر فعال» — این رایج‌ترین اشتباه است. از کوانتیزاسیون ۴ بیتی شروع کنید و اگر جا شد، لایه‌های حساس را دقیق‌تر نگه دارید. سرعت را روی وظیفه‌ی واقعی خودتان بسنجید — ساختارهای مختلف، رفتار کش متفاوتی دارند. مقایسه‌ی ساختاریافته‌ی گزینه‌ها را در راهنمای انتخاب مدل ببینید و تفسیر پیچیدگی این معماری‌ها را در معماری ترنسفورمر.

جمع‌بندی

MoE درِ مدل‌های بزرگ را به روی سخت‌افزار معمولی باز کرده — به‌شرطی که لجستیک حافظه را جدی بگیرید: پیش‌بارگذاری به‌جای انتظار، کش متخصص‌های داغ، فشرده‌سازی نامتقارن و مسیریابی آگاه به حافظه. شروع عملی: یک مدل هم‌اندازه با RAMتان انتخاب کنید، کوانتیزاسیون ۴ بیتی بزنید و سرعت را روی وظیفه‌ی واقعی خودتان تنظیم کنید. برای تست رفتار مدل‌های مختلف روی یک کار مشخص، یک حساب بسازید.