فاز 10 · درس 14

کالبدشکافی معماری مدل‌های متن‌باز: از Llama 3 تا DeepSeek-V3

نوع
مفهومی
زمان
حدود 45 دقیقه
زبان‌ها
Python (stdlib)
طرح دیاگرام فنی و کالبدشکافی لایه‌های یک مدار دیجیتال یا ترانسفورمر با شش بخش و اهرم تنظیمی تفکیک‌شده روی پس‌زمینه‌ی تیره مهندسی
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم اصلی
  4. هسته‌ی تغییرناپذیر
  5. شش اهرمی که تغییر می‌کنند
  6. اهرم 1: RMSNorm
  7. اهرم 2: RoPE
  8. اهرم 3: SwiGLU
  9. اهرم 4: اشتراک‌گذاری سرهای اتنشن
  10. اهرم 5: ترکیب متخصصان (MoE)
  11. اهرم 6: ماندگاری پیش‌نرمال‌سازی
  12. مقایسه‌ی مدل‌ها
  13. تحلیل فایل config.json
  14. برآورد حافظه‌ی مورد نیاز اکتیویشن‌ها
  15. برآورد حجم کش کلید-مقدار
  16. مدل مناسب برای هر سناریو
  17. پیاده‌سازی از صفر
  18. استفاده از ابزارهای واقعی
  19. خروجی این درس
  20. تمرین‌ها
  21. اصطلاحات کلیدی
  22. برای مطالعه‌ی بیشتر

هر بار که گزارش فنی یک مدل زبانی جدید منتشر می‌شود، با صدها صفحه توضیح و نمودار روبه‌رو می‌شویم که در نگاه اول ممکن است دست‌نیافتنی به نظر برسد. اما حقیقت مهندسی این است که اسکلت اصلی مدل‌های زبانی از زمان GPT-2 تا امروز تقریباً دست‌نخورده باقی مانده و تغییرات واقعی تنها در چند اهرم کلیدی مانند توابع نرمال‌سازی، مکانیزم‌های اتنشن و لایه‌های MoE رخ داده است.

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

در این درس با کنار هم قرار دادن مدل‌هایی مثل Llama 3، Gemma 2، Qwen 2.5 و DeepSeek-V3، ابزاری می‌سازید که مستقیماً از روی فایل config.json، میزان مصرف حافظه‌ی کش و اکتیویشن را محاسبه کند تا پیش از دانلود مدل‌های سنگین، دقیقا بدانید مدل انتخابی در رم و VRAM شما جا می‌گیرد یا نه.

شما در درس 04 یک مدل GPT-2 Small را از صفر ساختید. پیشرفته‌ترین مدل‌های متن‌باز در سال 2026 از همان خانواده هستند و فقط پنج یا شش تغییر مشخص در آن‌ها اعمال شده است: RMSNorm به‌جای LayerNorm، سوی‌گلو (SwiGLU) به‌جای GELU، روپ (RoPE) به‌جای موقعیت‌های یادگرفتنی، GQA یا MLA به‌جای MHA کامل، و ترکیب متخصصان (Mixture-of-Experts) در مقیاس بالا. همان ریاضیاتی که تا الان یاد گرفته‌اید 95 درصد این مدل‌ها را پوشش می‌دهد. در این درس، ساختار Llama 3، DeepSeek-V3، Mixtral، Qwen و Gemma را کنار هم بررسی می‌کنیم و دقیقاً نشان می‌دهیم هر معماری در کدام خط از بقیه فاصله گرفته است.

اهداف یادگیری

  • فایل config.json مدل‌های Llama 3، Mistral، Mixtral، Gemma 2، Qwen 2.5 و DeepSeek-V3 را بخوانید و تک‌تک فیلدهای آن را توضیح دهید
  • تغییر ساختاری مشخص هر مدل را نسبت به GPT-2 Small نام ببرید و دلیل آن را بر اساس اصول پایه‌ای توجیه کنید
  • تعداد پارامترها، حجم کش کلید-مقدار (KV cache) و حافظه‌ی اکتیویشن‌ها (activation memory) را فقط با داشتن فایل کانفیگ برای هر مدل متن‌بازی محاسبه کنید
  • با در نظر گرفتن محدودیت‌های تاخیر، حافظه و توانایی مدل، بهترین مدل متن‌باز را برای محیط استقرار مورد نظرتان انتخاب کنید

صورت مسئله

در درس 04، شما با 350 خط کد NumPy مدلی شبیه به GPT-2 ساختید. گزارش فنی Llama 3 405B حدود 200 صفحه است. شاید در نگاه اول فکر کنید این دو کاملاً با هم فرق دارند؛ اما واقعیت این نیست. آن 200 صفحه در واقع همان موجودیت قبلی را با پنج یا شش تغییر حساب‌شده و هزاران نکته‌ی اجرایی درباره‌ی مقیاس‌پذیری توضیح می‌دهد. اسکلت اصلی ماجرا — امبدینگ (embedding)، بلوک‌های ترنسفورمر، اتنشن، MLP، نرمال‌سازی و سر (head) — هیچ تغییری نکرده است.

این درس در اصل یک diff تحلیلی است. برای هر خانواده‌ی بزرگ از مدل‌های متن‌باز، دقیقاً تغییراتی را که نسبت به GPT-2 داشته‌اند، دلیل این تغییرات و هزینه‌ی آن‌ها را بررسی می‌کنیم. بعد از اتمام درس، کافی است شناسنامه‌ی هر مدل جدیدی را ببینید تا ساختار آن را در ذهن به خط مبنای (baseline) مدل GPT-2 ترجمه کنید.

فایده‌ی عملی این دیدگاه این است که اگر متا Llama 5 را معرفی کند یا DeepSeek نسخه‌ی V4 را منتشر نماید، نیازی به مدل ذهنی جدیدی ندارید. کافی است به فایل کانفیگ نگاه کنید، ببینید کدام اهرم‌های شناخته‌شده جابه‌جا شده‌اند و متوجه اثرات آن‌ها در مراحل بعدی شوید. معماری‌های سال 2026 یک جعبه‌ابزار محدود هستند که هر مدل جدید صرفاً زیرمجموعه‌ی متفاوتی از آن‌ها را انتخاب می‌کند.

مفاهیم اصلی

هسته‌ی تغییرناپذیر

همه‌ی مدل‌های اتورگرسیو متن‌باز در این اجزا مشترک هستند:

  • ماتریس امبدینگ توکن با ابعاد vocab_size x hidden_dim.
  • دنباله‌ای از N بلوک دیکودر شامل: نرمال‌سازی، خوداتنشن (self-attention)، اتصال باقیمانده (residual)، نرمال‌سازی، MLP و اتصال باقیمانده.
  • نرمال‌سازی نهایی و لایه‌ی خطی head که خروجی را روی vocab_size تصویر می‌کند (که معمولاً وزن‌هایش با امبدینگ‌ها گره خورده است).
  • ماسک علّی (causal mask) و تابع زیان (loss) آنتروپی متقاطع برای پیش‌بینی توکن بعدی.

این شاکله‌ی ثابت است؛ بقیه‌ی موارد صرفاً تنظیمات و اهرم‌ها هستند.

شش اهرمی که تغییر می‌کنند

در همه‌ی مدل‌های متن‌باز پیشرو بین سال‌های 2024 تا 2026، همان شش تصمیم طراحی بارها و بارها تکرار شده‌اند:

  1. نرمال‌سازی. از LayerNorm به RMSNorm.
  2. کدگذاری مکانی (positional encoding). از موقعیت‌های مطلق یادگرفتنی به RoPE (همراه با نسخه‌هایی مثل YaRN و NTK).
  3. تابع فعالیت. از GELU به SwiGLU (یا GeGLU).
  4. اشتراک‌گذاری سرهای اتنشن. از MHA به GQA، MQA و در نهایت MLA.
  5. لایه‌ی MLP متراکم در برابر خلوت. از حالت متراکم (dense) به ترکیب متخصصان (MoE).
  6. محل قرارگیری پیش‌نرمال‌سازی. پیش‌نرمال‌سازی (pre-norm) باقی مانده و پس‌نرمال‌سازی (post-norm) کاملاً کنار گذاشته شده است.

سایر موارد (برنامه‌ی زمان‌بندی نرخ یادگیری، ترکیب داده‌ها، اندازه‌ی بچ و طول کانتکست) مربوط به تنظیمات آموزش هستند، نه ساختار مدل. کل بازی روی همین شش اهرم می‌چرخد.

اهرم 1: RMSNorm

روش LayerNorm میانگین را کم می‌کند، حاصل را بر انحراف معیار تقسیم می‌نماید و در نهایت مقیاس و شیفت را اعمال می‌کند. در مقابل، RMSNorm فقط مقیاس را نگه می‌دارد:

RMSNorm(x)=xmean(x2)+ϵ⋅γ\mathop{\mathrm{RMSNorm}}(x) = \frac{x}{\sqrt{\mathop{\mathrm{mean}}(x^2) + \epsilon}} \cdot \gamma

در اینجا خبری از کم کردن میانگین یا اضافه کردن بایاس نیست و به ازای هر توکن یک ضرب ماتریسی کمتر می‌شود. ژانگ و سنریچ (2019) نشان دادند که کارایی این روش در ترجمه‌ی ماشینی با LayerNorm برابری می‌کند و در عین حال 10 درصد سریع‌تر است. امروزه تمام مدل‌های متن‌باز مدرن از همین روش استفاده می‌کنند.

هزینه: صفر. مزیت: بهبود اندک در نرخ پردازش (throughput) و ساده‌تر شدن کد.

اهرم 2: RoPE

امبدینگ‌های مکانی یادگرفتنی در GPT-2 یک جدول جستجوی 1024 عضوی بودند. با رسیدن به توکن 1025، جدول تمام می‌شد و مدل‌ها نمی‌توانستند طول کانتکست را فراتر از داده‌های آموزشی گسترش دهند.

کدگذاری مکانی چرخشی (RoPE، سو و همکاران، 2021) قبل از ضرب داخلی (dot product) در لایه‌ی اتنشن، بردارهای Q و K را به شکل جفت‌های دوبعدی دوران می‌دهد. زاویه‌ی دوران تابعی قطعی از مکان توکن است؛ بنابراین هیچ پارامتر یادگرفتنی در کار نیست و چیزی تمام نمی‌شود. با ترفندهای مقیاس‌بندی زاویه (مثل درون‌یابی آگاه از NTK و YaRN)، مدلی که روی کانتکست 8k آموزش دیده است، می‌تواند در زمان استنتاج با افت دقت بسیار کمی کانتکست خود را تا 128k بالا ببرد.

q_rotated = rotate(q, angle(pos))
k_rotated = rotate(k, angle(pos))
score = q_rotated . k_rotated

همه‌ی مدل‌های خانواده‌ی Llama، Mistral، Qwen، DeepSeek و Gemma از RoPE استفاده می‌کنند. مدل Gemma 2 از ساختاری ترکیبی بهره می‌برد (استفاده از RoPE در بیشتر لایه‌ها و اتنشن پنجره‌ی لغزان در لایه‌های دیگر).

اهرم 3: SwiGLU

لایه‌ی MLP در GPT-2 ساختار x -> gelu(xW1 + b1) -> (...)W2 + b2 را داشت. روش SwiGLU (شازیر، 2020) تابع فعالیت را با یک ضرب دریچه‌ای (gated product) جایگزین می‌کند:

SwiGLU(x)=(xW1)⋅sigmoid(xW1)⋅xV\mathop{\mathrm{SwiGLU}}(x) = (xW_1) \cdot \mathop{\mathrm{sigmoid}}(xW_1) \cdot xV

در این روش به‌جای یک تصویر کردن (projection)، از دو تصویر کردن موازی استفاده می‌شود که خروجی یکی از آن‌ها توسط تابع فعالیت Swish کنترل می‌شود. از نظر تجربی، این روش پرپلکسیتی (perplexity) بسیار بهتری به ازای هر پارامتر ثبت می‌کند. Llama 2 این روش را به کار گرفت و بقیه هم مسیر آن را دنبال کردند. بعد پنهان لایه‌ی MLP معمولاً طوری انتخاب می‌شود که تعداد کل پارامترها با MLP متراکم اولیه برابر بماند: اگر GPT-2 از ff_dim = 4 * hidden استفاده می‌کرد، SwiGLU ابعاد را روی ff_dim = (2/3) * 4 * hidden = 8/3 * hidden تنظیم می‌کند.

اهرم 4: اشتراک‌گذاری سرهای اتنشن

مدل GPT-2 از اتنشن چندسر (MHA) استفاده می‌کرد؛ یعنی هر سر، ماتریس تصویر Q، K و V اختصاصی خود را داشت.

اتنشن چندپرس‌وجو (MQA، شازیر، 2019) یک ماتریس K و یک ماتریس V را بین همه‌ی سرها به اشتراک می‌گذارد. این کار حافظه‌ی کش کلید-مقدار (KV cache) را به نسبت تعداد سرها کاهش می‌دهد که در یک مدل معمولی کاهشی بین 12 تا 32 برابر است. البته در بنچمارک‌های سخت، دقت مدل کمی افت می‌کند.

اتنشن پرس‌وجوی گروه‌بندی‌شده (GQA، اینسلی و همکاران، 2023) نقطه‌ی تعادل این دو روش است: تعداد GG گروه از سرهای Q، یک سر K و یک سر V مشترک دارند. به عنوان مثال، Llama 3 8B با 32 سر Q و 8 سر KV پیاده‌سازی شده است (G=8G=8)؛ در نتیجه حجم کش کلید-مقدار در مقایسه با MHA کامل، 4 برابر کمتر می‌شود.

اتنشن چندسر نهفته (MLA، دیپ‌سیک، 2024) ماتریس‌های K و V را در یک فضای نهفته‌ی کم‌رتبه (low-rank latent) و مشترک فشرده می‌کند و سپس آن‌ها را برای هر سر دوباره باز می‌نماید. این تکنیک بدون تضعیف قدرت بیان هر سر، کش کلید-مقدار را بسیار کوچک‌تر می‌کند. مدل‌های DeepSeek-V2 و V3 برای پردازش متن‌های طولانی به‌شدت به همین سازوکار وابسته‌اند.

روش سرهای KV کش کلید-مقدار دقت
MHA برابر num_heads کامل بهترین
GQA برابر num_groups (که G < num_heads) کاهش به نسبت num_heads / G نزدیک به MHA
MQA 1 کاهش به نسبت num_heads افت اندک
MLA بردار نهفته، بازسازی به ازای هر سر کوچک‌تر از MQA نزدیک به MHA

برای هر مدلی با اندازه‌ی بالای 13B پارامتر، استفاده از GQA یا MLA عملاً اجباری است؛ زیرا اجرای MHA کامل در ابعاد بزرگ، کش کلید-مقدار را به فاجعه می‌کشاند.

اهرم 5: ترکیب متخصصان (MoE)

یک MLP متراکم برای هر توکن همه‌ی پارامترهای خود را به کار می‌گیرد. در مقابل، یک MLP با معماری MoE دارای K شبکه‌ی متخصص در هر بلوک است و یک مسیریاب (router) دارد که متخصصان برتر (معمولاً 2 مورد از میان آن‌ها) را برای هر توکن انتخاب می‌کند. فقط وزن‌های همین متخصصان برگزیده در گذر رو به جلو (forward pass) شرکت داده می‌شوند.

router_logits = xW_r
indices, weights = top_k(router_logits, k=2)
output = sum_i weights[i] * expert[indices[i]](x)

جذابیت این روش اینجاست: می‌توانید 64 متخصص با اندازه‌ی 7B داشته باشید (یعنی تعداد کل پارامترها بسیار زیاد است)، اما برای هر توکن فقط 2 تا از آن‌ها اجرا شوند (یعنی محاسبات به ازای هر توکن معادل یک مدل متراکم 7B باقی می‌ماند). مدل Mixtral 8x7B در مجموع 47B پارامتر دارد اما به ازای هر توکن فقط 13B پارامتر فعال می‌کند. مدل DeepSeek-V3 نیز با 671B پارامتر کلی، تنها 37B پارامتر را در پردازش هر توکن درگیر می‌کند.

وضعیت پنهان توکنمسیریاب(خطی - سافت‌مکس)انتخاب k تای برترمتخصص 1(MLP)متخصص 2(MLP)متخصص 64(MLP، استفاده‌نشده)مجموع وزن‌دارخروجی

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

اهرم 6: ماندگاری پیش‌نرمال‌سازی

ترنسفورمر اولیه لایه‌ی نرمال‌سازی را بعد از هر زیرلایه اعمال می‌کرد. بعد از GPT-2، تمام مدل‌های متن‌باز لایه‌ی نرمال‌سازی را قبل از هر زیرلایه می‌گذارند. پیش‌نرمال‌سازی فرایند آموزش شبکه‌های عمیق را کاملاً آسان‌تر می‌کند و جای هیچ بحثی باقی نگذاشته است.

مقایسه‌ی مدل‌ها

جدول زیر تفاوت مدل‌ها را به‌روشنی خلاصه می‌کند:

مدل سال کل پارامترها پارامترهای فعال نرمال‌سازی تابع فعالیت کدگذاری مکانی اتنشن MoE کانتکست
GPT-2 Small 2019 124M 124M LayerNorm GELU یادگرفتنی MHA (12 سر) خیر 1k
Llama 3 8B 2024 8B 8B RMSNorm SwiGLU RoPE GQA (32/8) خیر 128k
Llama 3 70B 2024 70B 70B RMSNorm SwiGLU RoPE GQA (64/8) خیر 128k
Llama 3 405B 2024 405B 405B RMSNorm SwiGLU RoPE GQA (128/16) خیر 128k
Mistral 7B 2023 7.2B 7.2B RMSNorm SwiGLU RoPE GQA خیر 32k
Mixtral 8x7B 2023 47B 13B RMSNorm SwiGLU RoPE GQA بله (8 متخصص، top-2) 32k
Gemma 2 9B 2024 9B 9B RMSNorm (پیش+پس) GeGLU RoPE + لغزان GQA خیر 8k
Qwen 2.5 72B 2024 72B 72B RMSNorm SwiGLU RoPE (YaRN) GQA (64/8) خیر 128k
DeepSeek V2 236B 2024 236B 21B RMSNorm SwiGLU RoPE MLA بله (160 متخصص، top-6) 128k
DeepSeek V3 2024 671B 37B RMSNorm SwiGLU RoPE MLA بله (256 متخصص، top-8) 128k
Spark-X2.5 4B 2026 4.1B 4.1B RMSNorm GeGLU RoPE + لغزان (3:1) GQA (16/4)، خروجی دریچه‌ای خیر 1M

ستون‌ها را بررسی کنید: RMSNorm همه‌گیر شده است. SwiGLU و نسخه‌ی نزدیک به آن یعنی GeGLU همه‌جا به چشم می‌خورند. RoPE استاندارد مطلق است. ساختار GQA برای مدل‌های بالای 7B تبدیل به پیش‌فرض شده، مگر مواردی که MLA جایگزین آن شده باشد. در نهایت، تفاوت اصلی در بالاترین رده‌ها را MoE رقم می‌زند.

تحلیل فایل config.json

کانفیگ مدل Llama 3 8B:

{
  "hidden_size": 4096,
  "intermediate_size": 14336,
  "num_hidden_layers": 32,
  "num_attention_heads": 32,
  "num_key_value_heads": 8,
  "max_position_embeddings": 131072,
  "rope_theta": 500000.0,
  "rms_norm_eps": 1e-5,
  "vocab_size": 128256
}

تک‌تک این فیلدها معادل چیزهایی هستند که قبلاً پیاده کرده‌اید. در کانفیگ‌های جدیدتر چند فیلد اضافه شده که محاسبات را تغییر می‌دهند، بنابراین ماشین‌حساب ما در صورت وجود، آن‌ها را لحاظ می‌کند:

  • head_dim: زمانی صریحاً تعیین می‌شود که مقدار آن برابر با hidden_size / num_attention_heads نباشد. برای نمونه، Gemma 2 9B بعد پنهان 3584 و 16 سر دارد اما مقدار head_dim آن 256 است؛ یعنی تصویر Q به‌جای ماتریس مربعی، ابعاد 3584 در 4096 دارد.

  • tie_word_embeddings: مشخص می‌کند آیا هد مدل زبان دوباره از ماتریس امبدینگ استفاده می‌کند یا خیر. در Llama 3 8B این پیوند برقرار نیست؛ بنابراین اگر امبدینگ را فقط یک بار بشمارید، 525M پارامتر جا می‌ماند.

  • layer_types و sliding_window: تعیین می‌کنند کدام لایه‌ها به تمام کانتکست اتنشن دارند و کدام لایه‌ها فقط W توکن آخر را می‌بینند.

  • hidden_size: بعد امبدینگ.

  • intermediate_size: بعد پنهان لایه‌ی MLP (حدود 3.5 برابر بعد پنهان، مطابق فرمول SwiGLU).

  • num_hidden_layers: عمق استک.

  • num_attention_heads: سرهای Q.

  • num_key_value_heads: سرهای KV (برای GQA).

  • max_position_embeddings: طول کانتکست در زمان آموزش.

  • rope_theta: فرکانس پایه‌ی RoPE. متا برای برون‌یابی در کانتکست‌های طولانی، این مقدار را از مقدار پیش‌فرض 10k تا 500k افزایش داده است.

  • rms_norm_eps: پارامتری برای پایداری عددی (numerical stability).

  • vocab_size: توکن‌ها.

تنها با تکیه بر همین مقادیر، می‌توانید تعداد کل پارامترها، کش کلید-مقدار و اوج حافظه‌ی اکتیویشن‌ها را محاسبه کنید. فرمول‌های دقیق در فایل code/main.py آورده شده‌اند.

برآورد حافظه‌ی مورد نیاز اکتیویشن‌ها

در مدل‌های بالای چند میلیارد پارامتر، اکتیویشن‌ها بخش عمده‌ی حافظه‌ی آموزش را اشغال می‌کنند. قاعده‌ی تجربی برای پیش‌آموزش (با استفاده از چک‌پوینت‌گذاری گرادیان (gradient checkpointing)):

activation_mem ~ batch_size * seq_len * hidden_size * num_layers * bytes_per_element

برای مدل Llama 3 8B با بچ 1، طول دنباله‌ی 8192، فرمت BF16، تعداد 32 لایه و بعد پنهان 4096: فقط برای ذخیره‌ی اکتیویشن‌ها با چک‌پوینت‌گذاری به حدود 8 گیگابایت و بدون آن به 40 گیگابایت حافظه نیاز است. به همین دلیل استفاده از flash-attention و ring-attention اهمیت دارد؛ این روش‌ها محاسبات اتنشن را طوری بازنویسی می‌کنند که اکتیویشن‌ها در حافظه جا شوند.

برآورد حجم کش کلید-مقدار

برای استنتاج در حداکثر کانتکست:

kv_cache = 2 * num_layers * num_kv_heads * head_dim * max_seq_len * bytes_per_element

برای مدل Llama 3 8B با کانتکست 128k، فرمت BF16 و head_dim = hidden / num_heads = 128: 2 * 32 * 8 * 128 * 131072 * 2 = 17.2 GB به ازای هر دنباله.

وزن‌های مدل 8B در فرمت BF16 حدود 16 گیگابایت فضا می‌گیرند. کش کلید-مقدار فقط برای یک توالی 128k بیشتر از خود وزن‌های مدل است. همین فشار حافظه محرک پژوهش‌ها روی GQA، MLA و کوانتیزاسیون کش کلید-مقدار بوده است.

این فرمول فرض می‌کند تمام لایه‌ها کل دنباله را کش می‌کنند. لایه‌ای که از پنجره‌ی لغزان (sliding window) استفاده می‌کند، فقط به W توکن آخر نیاز دارد؛ بنابراین در مدل‌های ترکیبی، این محاسبه لایه‌به‌لایه‌ جمع زده می‌شود:

kv_cache = 2 * num_kv_heads * head_dim * bytes_per_element
           * (full_layers * max_seq_len + sliding_layers * min(W, max_seq_len))

مدل Spark-X2.5 4B به ازای هر لایه‌ی اتنشن کامل، از سه لایه‌ی پنجره‌ی لغزان استفاده می‌کند (W=512W = 512): یعنی از بین 36 لایه، 9 لایه‌ی اتنشن کامل و 27 لایه‌ی لغزان دارد. در کانتکست 1M توکن، این مدل حدود 38.7 گیگابایت (36 گیبی‌بایت) حافظه برای هر دنباله در فرمت BF16 مصرف می‌کند. اگر قرار بود هر 36 لایه کل کانتکست را ذخیره کنند، این مقدار به 154.6 گیگابایت (144 گیبی‌بایت) می‌رسید. بار اصلی بر دوش لایه‌های کامل است و به همین دلیل در مدل‌های کانتکست طولانی، نسبت لایه‌های کامل به لایه‌های لغزان اولین رقمی است که باید بررسی کنید.

مدل مناسب برای هر سناریو

  • یک پردازنده‌ی گرافیکی 80 گیگابایتی، بدون MoE: مدل‌های Llama 3 8B، Mistral 7B و Gemma 2 9B. اجرای آسان و پشتیبانی گسترده در انواع ابزارها.
  • یک سرور کامل (8 کارت 80 گیگابایتی)، توان پردازشی بالا: مدل‌های Llama 3 70B و Qwen 2.5 72B. بالاترین قدرت میان مدل‌های متراکم متن‌باز.
  • بالاترین کارایی متن‌باز، پذیرش پیچیدگی‌های MoE: مدل‌های DeepSeek V3 و Mixtral 8x22B. بهترین کارایی به ازای هر FLOP فعال.
  • نیازمندی به کانتکست طولانی: مدل‌های Llama 3 (کانتکست 128k با تنظیم مقیاس RoPE) و DeepSeek (بهره‌گیری از مزیت (advantage) معماری MLA).
  • استنتاج با تاخیر کم: مدل Gemma 2 9B (پنجره‌ی لغزان حجم محاسبات کانتکست طولانی را کاهش می‌دهد).
  • کانتکست طولانی با بودجه‌ی حافظه‌ی کم: مدل‌های ترکیبی با پنجره‌ی لغزان مانند Spark-X2.5 4B، که در آن‌ها فقط یک‌چهارم لایه‌ها هزینه‌ی کانتکست کامل را می‌پردازند.
مقایسه RMSNORM و LAYERNORMتغییر وضعیت و انتقال
RMSNORM vs LAYERNORMGrey is the raw feature vector, blue the normalized output. LayerNorm subtracts the mean then divides by the standard deviation, recentering every vector to zero. RMSNorm skips the mean entirely and divides by the root-mean-square, so it is cheaper and keeps any constant shift. Add a shift and watch LayerNorm absorb it while RMSNorm lets it through.
رنگ خاکستری بردار ویژگی خام و رنگ آبی خروجی نرمال‌شده است. LayerNorm میانگین را کم کرده و سپس بر انحراف معیار تقسیم می‌کند و هر بردار را مجدداً به صفر مرکززدایی می‌نماید. RMSNorm به‌طور کامل از میانگین صرف‌نظر کرده و فقط بر جذر میانگین مربعات (RMS) تقسیم می‌کند؛ بنابراین ارزان‌تر است و هرگونه جابه‌جایی ثابت را حفظ می‌کند. یک شیفت اضافه کنید و ببینید چگونه LayerNorm آن را جذب می‌کند در حالی که RMSNorm اجازه می‌دهد عبور کند.

پیاده‌سازی از صفر

کد این درس یک ابزار محاسباتی است. کافی است فایل config.json هر مدلی را به آن بدهید تا تفکیک پارامترها بر اساس هر بخش، حجم کش کلید-مقدار در حداکثر کانتکست، نسبت لایه‌ی MLP در SwiGLU و تحلیلی کوتاه از معماری (متراکم / GQA / MLA / MoE) را چاپ کند.

config = {
    "hidden_size": 4096, "intermediate_size": 14336,
    "num_hidden_layers": 32, "num_attention_heads": 32,
    "num_key_value_heads": 8, "vocab_size": 128256,
    "max_position_embeddings": 131072,
}

اسکریپت، معماری را فیلد به فیلد بررسی می‌کند؛ تعداد پارامترهای لایه‌ی امبدینگ، اتنشن (با احتساب کاهش سرهای GQA و در نظر گرفتن head_dim صریح در صورت تعریف در کانفیگ)، لایه‌ی MLP (با احتساب گسترش SwiGLU یا GeGLU)، لایه‌های نرمال‌سازی و هد خروجی مدل زبانی (در صورتی که با امبدینگ گره نخورده باشد) را حساب می‌کند. سپس کش کلید-مقدار را برای طول کانتکست داده‌شده به‌صورت لایه‌به‌لایه به دست می‌آورد تا لایه‌های پنجره‌ی لغزان به اندازه‌ی پنجره‌شان محدود شوند و در نهایت یک خروجی خلاصه ارائه می‌دهد.

در مدل‌های متراکم، مجموع این محاسبات دقیقاً با مقادیر اعلام‌شده‌ی رسمی همخوانی دارد: Llama 3 8B دقیقاً 8,030,261,248 پارامتر، Gemma 2 9B دقیقاً 9,241,705,984 پارامتر و Spark-X2.5 4B دقیقاً 4,112,079,360 پارامتر دارد. در Qwen 2.5 72B اختلافی 819,200 عددی دیده می‌شود که در تمرین 1 به آن می‌پردازیم.

برای مشاهده‌ی پیاده‌سازی، فایل code/main.py را ببینید.

استفاده از ابزارهای واقعی

این ماشین‌حساب را با فایل‌های کانفیگ Llama 3 8B، Mistral 7B، Mixtral 8x7B و DeepSeek V3 که همراه اسکریپت آمده‌اند اجرا کنید. تفکیک پارامترها را مقایسه نمایید. توجه کنید که در مدل‌های MoE، تعداد کل پارامترها بسیار بیشتر از مدل‌های متراکم است، ولی تعداد پارامترهای فعال اغلب کمتر است. همچنین دقت کنید که کش کلید-مقدار در DeepSeek V3 به لطف معماری MLA، با وجود پارامترهای کل بیشتر، از Llama 3 405B کوچک‌تر است.

سپس Gemma 2 9B و Spark-X2.5 4B را مقایسه کنید. اسکریپت برای هر دو مدل، کش واقعی مورد نیاز و مقدار فرضی آن در صورت کامل بودن اتنشن تمام لایه‌ها را چاپ می‌کند. مدل Gemma 2 لایه‌ها را با نسبت 1:1 در کانتکست 8k یکی‌درمیان می‌کند، بنابراین صرفه‌جویی آن چشمگیر نیست. اما Spark-X2.5 با نسبت 3:1 و پنجره‌ی 512 توکنی در کانتکست 1M، این حافظه را 4 برابر کاهش می‌دهد.

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

خروجی این درس

خروجی این درس، فایل outputs/skill-open-model-picker.md است. این راهنما با دریافت شرایط سیستم هدف (نوع پردازنده‌ی گرافیکی، VRAM، طول کانتکست و سقف تاخیر (latency budget)) و مشخصات تسک (چت، کدنویسی، استدلال و کانتکست طولانی)، بهترین مدل متن‌باز را به همراه روش کوانتیزاسیون متناسب (از درس 11) و استک استنتاج کارآمد (از درس 12) و با تکیه بر تحلیل شش اهرم معماری پیشنهاد می‌دهد.

تمرین‌ها

  1. فایل کانفیگ Qwen 2.5 72B را از HuggingFace بخوانید. تعداد کل پارامترها را از صفر محاسبه کنید. نتیجه را با مقدار گزارش‌شده در HF بسنجید و مشخص کنید این اختلاف ناشی از چیست (گرد کردن بعد سر، ضریب اشتراک سرهای KV و...).

  2. مدل DeepSeek V3 از 256 متخصص با مسیریابی top-8 بهره می‌برد. نسبت متخصصان فعال به کل متخصصان را حساب کرده و آن را با top-2 از 8 در Mixtral 8x7B مقایسه کنید. این گذار از حالت خلوت (25 درصد) به خلوتِ متراکم‌تر (3 درصد)، چه معنایی برای ظرفیت به ازای هر FLOP دارد؟

  3. حجم کش کلید-مقدار را برای مدل Llama 3 405B در کانتکست 128k روی داده‌های FP8 و BF16 به دست آورید. در فرمت FP8 این رقم نصف مقدار BF16 است. با کم کردن حافظه‌ی مورد نیاز وزن‌ها، چه تعداد دنباله‌ی هم‌زمان را می‌توانید روی یک نود شامل 8 کارت H100 (هر کدام 80 گیگابایت، در مجموع 640 گیگابایت) سرویس‌دهی کنید؟

  4. ساختار Gemma 2 لایه‌های اتنشن کامل و پنجره‌ی لغزان را یکی‌درمیان چیده است. محاسبات ریاضی کش کلید-مقدار را برای حالتی بنویسید که نیمی از لایه‌ها به‌جای کانتکست کامل از پنجره‌ی لغزان 4096 توکنی استفاده کنند. این کار در کانتکست کلی 8k چقدر حافظه ذخیره می‌کند؟

  5. یک مدل متن‌باز پیشرفته که بعد از تاریخ نگارش این درس معرفی شده است پیدا کنید. بررسی کنید که کدام‌یک از این شش اهرم را انتخاب کرده و آیا اهرم هفتمی معرفی نموده است یا نه. سرفصل آموزشی به‌محض انتشار یک معماری جدید ممکن است قدیمی به نظر برسد؛ هدف این تمرین این است که بتوانید جدول خود را بدون نیاز به بازسازی مدل ذهنی‌تان به‌روز کنید.

اصطلاحات کلیدی

اصطلاح در گفتگوها چه می‌گویند در عمل چه معنایی دارد
RMSNorm «LayerNorm بدون میانگین» نرمال‌سازی صرفاً بر اساس ریشه‌ی میانگین مربعات همراه با مقیاس یادگرفتنی — ارزان‌تر و با کیفیتی قابل مقایسه با LayerNorm
RoPE «موقعیت‌های چرخشی» دوران هر بردار Q و K به‌صورت جفت‌های دوبعدی با زاویه‌ای متناسب با موقعیت — با ترفندهای مقیاس‌بندی زاویه فراتر از طول آموزش برون‌یابی می‌شود
SwiGLU «تابع فعالیت جدید MLP» واحد خطی دریچه‌ای با تابع فعالیت Swish: ضرب (xW1) * sigmoid(xW1) * xV — استاندارد تمام مدل‌های متن‌باز 2024 به بعد
GQA «اتنشن بینابینی» اتنشن پرس‌وجوی گروه‌بندی‌شده: G گروه از سرهای Q یک سر K و یک سر V مشترک دارند — کش کلید-مقدار را بدون افت دقت شدید MQA کاهش می‌دهد
MLA «اتنشن اختصاصی DeepSeek» اتنشن چندسر نهفته: فشرده‌سازی K و V در یک فضای نهفته‌ی کم‌رتبه و بازسازی آن به ازای هر سر — دستیابی به کمترین کش کلید-مقدار در مدل‌های بزرگ
MoE «متخصصان خلوت» ترکیب متخصصان: N شبکه‌ی MLP در هر بلوک که مسیریاب برترین موارد (top-k) را به ازای هر توکن برمی‌گزیند — تعداد کل پارامترها بسیار زیاد، پارامترهای فعال اندک
مسیریابی Top-k «انتخاب k متخصص برای هر توکن» مسیریاب برای هر متخصص امتیازی تعیین می‌کند و k موردی که بیشترین امتیاز را دارند فعال می‌سازد — مقدار متداول k از 2 (در Mixtral) تا 8 (در DeepSeek) است
YaRN «کشش RoPE» اکستنشن دیگری بر RoPE که زوایای دوران را درون‌یابی می‌کند تا کانتکست در زمان استنتاج از 8k تا بیش از 128k افزایش یابد
اتنشن پنجره‌ی لغزان «به همه‌چیز نگاه نکن» هر توکن فقط به WW توکن قبلی اتنشن دارد — هزینه‌ی اتنشن را به O(W)O(W) برای هر توکن محدود می‌سازد، استفاده‌شده در Gemma 2 و نسخه‌های اولیه‌ی Mistral
پارامترهای فعال «آنچه به ازای هر توکن اجرا می‌شود» در مدل‌های MoE، تعداد پارامترهایی که به ازای هر توکن وارد گذر رو به جلو می‌شوند (بسیار کمتر از کل پارامترها) — شاخص تعیین‌کننده‌ی FLOPها به ازای هر توکن

برای مطالعه‌ی بیشتر

سؤالات متداول

تفاوت اصلی معماری مدل‌های مدرن متن‌باز با GPT-2 چیست؟

اسکلت اصلی یکسان است اما در شش بخش ارتقا یافته‌اند: جایگزینی LayerNorm با RMSNorm، استفاده از RoPE به‌جای امبدینگ مکانی یادگرفتنی، SwiGLU به‌جای GELU، استفاده از GQA یا MLA به‌جای MHA، بهره‌گیری از MoE و تثبیت روش پیش‌نرمال‌سازی.

چرا استفاده از GQA یا MLA در مدل‌های بزرگ ضروری است؟

در مدل‌های بزرگ و کانتکست‌های طولانی، حجم حافظه مورد نیاز برای کش کلید-مقدار (KV Cache) در صورت استفاده از MHA کامل حتی از وزن کل مدل فراتر می‌رود؛ GQA و MLA با فشرده‌سازی یا اشتراک سرها این حافظه را به شدت کاهش می‌دهند.

چرا مدل‌های MoE مثل DeepSeek-V3 نسبت به پارامترهایشان سریع‌تر اجرا می‌شوند؟

چون در مدل‌های MoE اگرچه تعداد کل پارامترها بسیار زیاد است، اما برای پردازش هر توکن فقط تعداد اندکی از متخصصان (مثلاً 8 از 256) فعال می‌شوند و بار محاسباتی (FLOPs) تنها به اندازه پارامترهای فعال است.

ما رو توی گوگل بیشتر ببین

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