چیت‌شیت

مقایسه‌ی انواع مختلف اتنشن

Attention Variants Compared

کامل، پنجره‌ی لغزان، استرایددار، BigBird، تفاضلی و اتنشن تنک نیتیو. هزینه، کش کلید-مقدار، کد، راه‌حل‌ها.

  • ۱۱ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی انواع کنار یکدیگر
  2. چه زمانی از چه روشی استفاده کنیم؟
  3. سازنده‌های ماسک
  4. SWA همراه با FlexAttention
  5. NSA: سه branch
  6. حلقه‌ی تایل در فلش اتنشن
  7. وظایف درون کد
  8. اعدادی که باید بدانید
  9. عیب‌یابی
  10. پرسش و پاسخ
  11. واژه‌نامه

مقایسه‌ی انواع کنار یکدیگر

مقایسه
نوعمحاسباتکش کلید-مقدارکیفیت در مقایسه با کامل
اتنشن کاملO(N^2)O(N) به ازای هر لایهخط مبنا
SWA، با پنجره‌ی 1024N ضربدر WO(W) به ازای هر لایه-0.1 در ppl، عملکرد خوب با لایه‌های سراسری
محلی + تنک استرایددارN ضربدر رادیکال Nترکیبیمشابه SWA
BigBird، محلی + سراسری + تصادفیتقریباً O(N)ترکیبیبرابری با اتنشن کامل در بافت 2 برابری
تنک نیتیو (DeepSeek-V3.2)N ضربدر کسر فعالO(N)در محدوده‌ی 0.05 از ppl
تفاضلی2 ضربدر N به توان 2O(2N)-5 تا -10% در ppl

چه زمانی از چه روشی استفاده کنیم؟

نکته‌ها
  • اتنشن کامل: تمام لایه‌ها تا حدود 16 هزار توکن بافت، یا وقتی کیفیت بازیابی در اولویت است.
  • ترکیب SWA + سراسری: بافت بلند بالاتر از 32 هزار توکن. استاندارد پیش‌فرض سال 2026 برای بالای 32 هزار.
  • اتنشن بلوکی تنک: کرنل سفارشی، الگوی سفارشی. مناسب برای بازیابی و صوت.
  • اتنشن تفاضلی: وقتی سینک اتنشن آسیب می‌زند، مانند RAG در بافت طولانی و مسئله‌ی سوزن در انبار کاه.
  • DIFF از همان ابتدا: مدل جدیدی که بافت موثر بالای 64 هزار توکن را هدف قرار داده است.
  • NSA: پیش‌آموزش یا ادامه‌ی آموزش برای بافت بالای 64 هزار توکن.
  • عدم استفاده از DIFF یا NSA: یک مدل متراکم از پیش آموزش‌دیده، یا بافت زیر 16 هزار توکن.

سازنده‌های ماسک

کد
python
def swa_mask(n, window):
    M = [[NEG_INF] * n for _ in range(n)]
    for i in range(n):
        lo = max(0, i - window + 1)   # اگر پنجره >= n باشد اتنشن علّی کامل حاصل می‌شود
        for j in range(lo, i + 1):
            M[i][j] = 0.0             # 0.0 یعنی اتنشن دارد، NEG_INF ماسک می‌کند
    return M

def strided_mask(n, window, stride):  # پنجره‌ی محلی، سپس:
        for j in range(0, i + 1, stride):
            M[i][j] = 0.0             # هر توکن به فاصله‌ی استراید به عقب تا 0

render(swa_mask(8, window=4), "sliding window (W=4)")
render(strided_mask(8, window=2, stride=3), "local (W=2) + strided (stride=3)")

SWA همراه با FlexAttention

کد
python
from torch.nn.attention.flex_attention import flex_attention, create_block_mask

def swa_pattern(b, h, q_idx, kv_idx):
    return (q_idx - kv_idx < 1024) & (q_idx >= kv_idx)  # پنجره‌ی 1024، علّی

mask = create_block_mask(swa_pattern, B=batch, H=heads, Q_LEN=n, KV_LEN=n)
out = flex_attention(q, k, v, block_mask=mask)          # کامپایل به یک کرنل Triton

NSA: سه branch

معماری
اتنشنtop_k_blocksاتنشنبارگذاری بلوک‌هاout_selout_cmpout_winپرس‌وجو (Query)یکی به ازای هر موقعیتbranch فشرده‌شدهمیانگین‌های بلوک، N/l کلیدbranch انتخاب‌شدهk بلوک برتر، k*l کلیدپنجره‌ی لغزانW توکن آخرکش کلید-مقدارتوکن‌های ریزدانهگیت (Gate)سیگموئید، 3 وزن

حلقه‌ی تایل در فلش اتنشن

گام‌به‌گام
  1. حلقه‌ی بیرونیبارگذاری یک تایل Q، حدود 128 × 128، درون SRAM.
  2. حلقه‌ی درونیبارگذاری هر تایل K و تایل V درون SRAM.
  3. در SRAMمحاسبه‌ی S_tile = Q_tile @ K_tile^T.
  4. در SRAMنگه‌داشتن یک مقدار جاری (max, sum) روی تایل‌ها.
  5. در SRAMبازتنظیم مقیاس خروجی قبلی با exp_old و افزودن بلوک جدید.
  6. در HBMنوشتن O_tile درون HBM. یک بار رفت‌وبرگشت به HBM برای هر تایل.
  7. نتیجهخروجی از نظر بیتی کاملاً یکسان با اتنشن استاندارد، حافظه‌ی O(N) به جای O(N^2).

وظایف درون کد

کار و کد
وظیفهکد
ماسک علّی SWAswa_mask(n, window)
ماسک محلی به‌علاوه‌ی استرایددارstrided_mask(n, window, stride)
شمارش خانه‌های دارای اتنشنcount_nonmasked(M)
بایت‌های کش کلید-مقدارkv_cache_bytes(N, n_layers, n_heads_kv, d_head, dtype=2)
سافت‌مکس به سبک فلشtiled_softmax_dot(q, Ks, Vs, tile=4)
نسبت سیگنال به نویز یک سطرsnr(weights_row, signal_pos)
پارامترهای DIFF نسخه‌ی 1 و 2compute_param_diff(hidden=4096, n_heads=32, kv_heads=8)
کلیدهای NSA به ازای هر پرس‌وجوcount_nsa(N, l, k, W)

اعدادی که باید بدانید

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیح
Llama 3 70B KV per token per layer4096 bytes80 لایه، 8 هد کش کلید-مقدار، fp16
Llama 3 70B KV, 32K context10 GiBروش GQA با 8 هد کش کلید-مقدار
Gemma 3 layer mix5:1 SWA:globalپنجره = 1024
SWA KV at 128K context128×پنجره‌ی 1024، W توکن آخر
Gemma-3 mix KV~6xدر مقایسه با اتنشن کامل خالص
DIFF `lambda_init`0.8آموزش‌دیده به ازای هر هد
NSA window `W`512l = 64, k = 16 در بافت 64k، کاهش 25 برابری
NSA at 128k3536 keysکاهش 36 برابری

عیب‌یابی

عیب‌یابی
  • شکست مدل SWA در بازیابی دوربرد

    علت
    نبود لایه‌های سراسری
    راه‌حل
    ترکیب یک‌درمیان لایه‌های کامل، نسبت 5 به 1
  • نشت وزن‌ها به توکن 0

    علت
    سینک اتنشن ناشی از سافت‌مکس
    راه‌حل
    اتنشن تفاضلی
  • گم شدن در میانه فراتر از 32 هزار توکن

    علت
    رشد کف نویز سافت‌مکس همگام با افزایش N
    راه‌حل
    استفاده از DIFF از ابتدا، یا اعمال LoRA روی Q
  • رمزگشایی DIFF نسخه‌ی 1 کندتر از خط مبناست

    علت
    بارگذاری کش مقدار به میزان دو بار
    راه‌حل
    DIFF نسخه‌ی 2
  • ناپایداری در اواخر آموزش برای مدل‌های بالای 70B

    علت
    استفاده از RMSNorm به ازای هر هد در نسخه‌ی 1
    راه‌حل
    نسخه‌ی 2 آن را حذف می‌کند
  • استفاده از NSA روی مدل متراکم پیش‌آموزش‌دیده

    علت
    امکان تطبیق روی مدل آماده وجود ندارد
    راه‌حل
    ادامه‌ی آموزش
  • عدم مشاهده‌ی برتری NSA در بافت کمتر از 16 هزار

    علت
    سربار معماری سه‌گانه‌ی branchها
    راه‌حل
    اتنشن کامل
  • تنک بودن در زمان استنتاج شتاب کمی می‌دهد

    علت
    مدل هرگز با چنین مسیری آموزش ندیده است
    راه‌حل
    تنک بودن ذاتاً آموزش‌دیده (نیتیو)

پرسش و پاسخ

پرسش و پاسخ
آیا فلش اتنشن محاسبات را کم می‌کند؟
خیر. حافظه‌ی اکتیویشن را مخفی می‌سازد. همچنان همه‌ی توکن‌ها به تمام توکن‌ها اتنشن دارند.
چرا NSA آموزش‌پذیر است؟
گرادیان‌ها از امتیازات branch فشرده‌شده عبور می‌کنند. عملگر top_k تنها بلوک‌ها را برای بارگذاری انتخاب می‌کند.
چرا DIFF در بافت 128k کمک بیشتری می‌کند؟
کف نویز همراه با طول بافت رشد می‌کند. در بافت 4k این نویز کم است.
آیا DIFF نسخه‌ی 2 با GQA سازگار است؟
بله. نسخه‌ی 2 هدهای Q را افزایش می‌دهد، نه هدهای کلید-مقدار را.
تعداد کلیدهای NSA در بافت 1024 با l=32، k=4 و w=128 چقدر است؟
32 + 128 + 128 = 288 کلید، یعنی 3.5 برابر کمتر.

واژه‌نامه

اصطلاح‌ها
SWA
اتنشن پنجره‌ی لغزان. هر پرس‌وجو به W توکن آخر خود اتنشن دارد.
میدان دید
پشته‌ای از SWA با L لایه و پنجره‌ی W تا سقف L × W توکن را پوشش می‌دهد.
سینک اتنشن
مجموع هر سطر 1 است، بنابراین پرس‌وجوهای کم‌اثر وزن خود را روی موقعیت 0 متمرکز می‌کنند.
NSA
اتنشن تنک نیتیو. تنک بودن بلوکی آموزش‌دیده، بلوک‌های صفر در کرنل نادیده گرفته می‌شوند.
DSA
اتنشن تنک DeepSeek، نسخه‌ی ارتقایافته‌ی NSA.
HBM
حافظه‌ی با پهنای باند بالا. حدود 3 ترابایت بر ثانیه روی پردازنده‌ی H100.
SRAM
حافظه‌ی روی چیپ به ازای هر SM. حدود 30 ترابایت بر ثانیه.