Phase 07: Transformers Deep Dive

كيش كيف، الانتباه الفلاش وتحسين الإستدلال

التدريب متوازي ومتعلق بالفلوب، والإستعراض متسلسل ومتعلق بالذاكرة، عقدة زجاجة مختلفة، خدوش مختلفة.

Type: Build

Languages: Python

Prerequisites: Phase 7 · 02 (Self-Attention), Phase 7 · 05 (Full Transformer), Phase 7 · 07 (GPT)

Time: ~75 minutes

المشكلة

إنّ جهاز تشخيص التأثير السلبيّ يقوم بذلكO(N²)العمل لتوليدNالوهم: في كل خطوة يعيد حساب الاهتمام على المقبلات الكاملة. لرد 4K-الوهم الذي هو 16M عمليات الاهتمام، معظمهم من الضروري. كل حالة مخفية من الوهم المقبلات هي تحديدية بمجرد الحساب تحتاج فقط لتشغيل استفسار الوهم الجديد ضد المفاتيح المحفوظة في الاحتفاظ والقيم من كل شيء من قبل.

بالإضافة إلى ذلك، ينتقل الاهتمام نفسه الكثير من البيانات. الاهتمام القياسي يضمن ماتريكس N × N درجة، N × d softmax output، N × d output النهائي الكثير من القراءة والكتابة إلى HBM. بالنسبة إلى N≥2K، يصبح الاهتمام مقيدًا في الذاكرة قبل أن يصبح مقيدًا في FLOP. أجزاء الاهتمام الكلاسيكية لا تستخدم GPUs الحديثة بنسبة 410 ×.

اثنين من التحسينات، كلاهما من داو وغيرها، دفع استنتاج الحدود من "بطيء" إلى "سرعة":

  1. KV cache.تخزين متجهات K و V لكل رمز إضافية. انتباه كل رمز جديد هو استفسار واحد ضد المفاتيح المحفوظة في الاحتفاظ. التسجيل يقلل من O(N²)إلىO(N)لكل خطوة
  2. Flash Attention.طلاء حساب الاهتمام بحيث لا يصل المصفوفة الكاملة N × N أبدا HBM. كل من softmax + matmul يحدث في SRAM. 24× سجل الساعة الجدارية على A100؛ 510× على H100 مع FP8.

بحلول عام 2026 كلتا الطرازين عالمياً. كل كومة استنتاج الإنتاج (vLLM، TensorRT-LLM، SGLang، llama.cpp) تتخذها. كل سفينة نموذج حدودية مع الإنتباه الفلاش فعالة.

المفهوم

!KV cache growth and Flash Attention tiling

كيو كاش رياضيات

لكل طبقة مُعبرة، لكل رمز، لكل رأس:

bytes_per_token_per_layer = 2 * d_head * dtype_size
                          ^
                          K and V

بالنسبة لنموذج 7B مع 32 طبقة، 32 رأس، d_head=128, fp16:

per token per layer = 2 * 128 * 2 = 512 bytes
per token (32 layers) = 16 KB
per 32K context = 512 MB

لـ Llama 3 70B (80 طبقة، d_head=128, GQA مع 8 رؤوس KV):

per token per layer = 2 * 8 * 128 * 2 = 4096 bytes (4 KB)
per 32K context = 10.4 GB

هذا 10 جيجا غيترا هو السبب في أن Llama 3 70B في سياق 128K يحتاج إلى معظم 40 جيجا غيترا A100 فقط لخزنة KV في حجم المجموعة 1.

GQA is the KV-cache win.المكتب المختص بـ 64 رأس سيكون 32 جيجا غايبا

سحب الأبعاد ومشاهدة حجم الكاش تتحرك. اضغط على طول التسلسل أو الإفراز وترى كيف سريعا ينفجر عبر GPU واحد:

الاهتمام الوهمية

الاهتمام القياسي:

S = Q @ K^T          (HBM read, N×N, HBM write)
P = softmax(S)       (HBM read, HBM write)
O = P @ V            (HBM read, HBM write)

ثلاث رحلات ذهاب وإياب HBM. على H100، HBM عرض النطاق هو 3 TB / ثانية؛ SRAM هو 30 TB / ثانية. كل رحلة HBM هو عامل 10 تباطؤ مقابل الحفاظ على كل شيء على رقاقة.

انتباه فلاش:

for each block of Q (tile size ~128 × 128):
    load Q_tile into SRAM
    for each block of K, V:
        load K_tile, V_tile into SRAM
        compute S_tile = Q_tile @ K_tile^T     (SRAM)
        running softmax aggregation             (SRAM)
        accumulate into O_tile                  (SRAM)
    write O_tile to HBM

رحلة واحدة من HBM لكل طوبO(N²)إلىO(N). الحسابات الخلفية تعيد حساب بعض القيم من الحسابات الأمامية بدلا من تخزينها

Numerical trick.تدريب softmax يحافظ على (max, sum)على طول البلاطات حتى يكون التطبيع النهائي دقيقًا. ليس تقريري تنسيق الانتباه في البصمة يحسب الناتج المتطابق مع الانتباه القياسي (مودول fp16 غير التراجعية).

Version evolution:

VersionYearKey changeSpeedup on reference hardware
Flash 12022Tiled SRAM kernel2× on A100
Flash 22023Better parallelism, causal-first ordering3× on A100
Flash 32024Hopper asynchrony, FP81.5–2× on H100 (~740 TFLOPs FP16)
Flash 42026Blackwell 5-stage pipeline, software exp2Inference-first (forward only initially)

فلاش 4 هو التقدم إلى الأمام فقط عند الإطلاق. لا يزال التدريب يستخدم فلاش 3. دعم GQA وvarlen لـ فلاش 4 لا يزال متوقع (في منتصف عام 2026).

التشفير المضارب الفوز الآخر التأخير

النموذج الرخيص يقدم N رموز. النموذج الكبير يصدق جميع N بالتوازي. إذا قبلت التحقق من k رموز، دفعت 1 نموذج كبير إلى الأمام لعمليات k. النموذج النموذجي k = 35 على الرمز والنص.

2026 الاختلالات:

  • EAGLE 2 / Medusa.رؤوس مسودة متكاملة تشارك الحالات الخفية للمحقق. 23× تسريع دون فقدان الجودة.
  • Speculative decoding with draft model.2×4 تسرع على الأجهزة الاستهلاكية.
  • Lookahead decoding.إعادة التكرار جاكوبي، لا حاجة إلى نموذج مسودة، مستحيل ولكن مجاني.

الإفراز المستمر

الإستنتاج الكلاسيكي: إنتظر أن تنتهي أبطأ تسلسل، ثم بدء سلسلة جديدة. يضيع GPU عندما تنتهي ردود الفعل القصيرة مبكرا.

التوصيل المستمر (أول مرة شُرِع في أوركا، والآن في vLLM، TensorRT-LLM، SGLang): تبادل الطلبات الجديدة في اللحظة التي تنتهي فيها الطلبات القديمة. 510 × زيادة التوصيل لحملات العمل المشتركة.

PagedAttention KV cache كذاكرة افتراضية

ميزة الرئيسية في vLLM. يتم تخصيص cache KV في كتلة 16 رمزًا. خريطة صفحة تقوم بتخطيط المواقع المنطقية إلى كتلة مادية. يسمح لك بمشاركة KV عبر عينات متوازية (بحث الشعاع ، أخذ عينات متوازية) ، ومساومة التبادل الساخن للتخزين السريع ، وذاكرة التفكيك. تحسن الانتقال 4x على التخصيص المجاور البغيض.

بناءها

انظرcode/main.pyنطبق:

  1. سذاجةO(N²)مُشفّر إضافي
  2. أO(N)كيف-كاشة الكشيف الكشيف
  3. -أحد أقصى أساسات التشغيل المُسلّطة التي تحاكي خوارزمية "فلش أوتشن"

الخطوة الأولى: KV cache

pythonclass KVCache:
    def __init__(self, n_layers, n_heads, d_head):
        self.K = [[[] for _ in range(n_heads)] for _ in range(n_layers)]
        self.V = [[[] for _ in range(n_heads)] for _ in range(n_layers)]

    def append(self, layer, head, k, v):
        self.K[layer][head].append(k)
        self.V[layer][head].append(v)

    def read(self, layer, head):
        return self.K[layer][head], self.V[layer][head]

بسيط: استمر في النمو لكل مؤشر K، V المتجهات في كل طبقة، كل قائمة رأس.

الخطوة الثانية: المصفوفة بـ "softmax"

pythondef tiled_softmax_dot(q, K, V, tile=4):
    """Flash-attention-style softmax(qK^T)V with running max/sum."""
    m = float("-inf")
    s = 0.0
    out = [0.0] * len(V[0])
    for start in range(0, len(K), tile):
        k_block = K[start:start + tile]
        v_block = V[start:start + tile]
        scores = [sum(qi * ki for qi, ki in zip(q, k)) for k in k_block]
        new_m = max(m, *scores)
        exp_old = math.exp(m - new_m) if m != float("-inf") else 0.0
        exp_new = [math.exp(sc - new_m) for sc in scores]
        s = s * exp_old + sum(exp_new)
        for j in range(len(out)):
            out[j] = out[j] * exp_old + sum(e * v[j] for e, v in zip(exp_new, v_block))
        m = new_m
    return [o / s for o in out]

الناتج متطابق بـ softmax(qK) Vفي صورة واحدة، ولكن في أي وقت مجموعة العمل هي tile × d_headالكتلة، وليس الكاملةN × d_head. . .

الخطوة 3: مقارنة التشفير البديل مقابل التشفير المتخزّن على جيل 100 رمز

أعد عمليات الاهتمام البديهيO(N²)= 5050، مخزن: O(N)الرمز يطبع كليهما

استخدمها

python# HuggingFace transformers auto-enables KV cache on decoder-only generate().
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.2-3B",
    attn_implementation="flash_attention_2",  # use FA3 if Hopper
    torch_dtype="bfloat16",
)
# generate() uses KV cache automatically

إنتاج الـ vLLM:

bashpip install vllm
vllm serve meta-llama/Llama-3.1-70B-Instruct \
    --tensor-parallel-size 4 \
    --max-model-len 32768 \
    --enable-prefix-caching \
    --kv-cache-dtype fp8

الاحتفاظ بالأمنية المتبقية عبر الطلبات هو فوز كبير 2026 نفس خطوة النظام ، أمثلة قصيرة ، أو وثيقة سياق طويلة تستخدم KV عبر المكالمات. بالنسبة لحملات عمل وكيل مع طلبات أداة متكررة ، فإن احتفاظ الأمنية المتبقية هو بشكل روتيني 5 × زيادة التنفيذ.

أرسله

انظرoutputs/skill-inference-optimizer.md. المهارة تختار تنفيذ الاهتمام، استراتيجية KV cache، الكمية، وتفكير المضاربة لنشر استنتاج جديد.

التمارين

  1. Easy.أركضcode/main.pyتأكد من أن المكشفات البديلة والمتخزنة في الاحتفاظ بها تنتج نفس الخروج، لاحظ الفرق في العدد الخيار.
  2. Medium.تنفيذ التخزين الآلي المسبق: مع إعطاء طلب P وعدة إكمالات ، قم بتشغيل مرور واحد إلى الأمام فوق P لملء التخزين الآلي KV ، ثم فرع لكل إكمال. قم بتحديد السرعة مقابل إعادة تشفير P لكل منها.
  3. Hard.تنفيذ لعبة PagedAttention: KV cache في كتلة ثابتة 16 رمز مع قائمة مجانية. عندما تنتهي تسلسل، أعيد كتلها إلى حوض الاستجمام. محاكاة 1000 إكمال دردشة بطول مختلف. مقارنة تمزيق الذاكرة مقابل التخصيص المتماشى.

الشروط الرئيسية

TermWhat people sayWhat it actually means
KV cache"The trick that makes decoding fast"Stored K and V from every prefix token; new queries attend to them instead of recomputing.
HBM"GPU main memory"High Bandwidth Memory; 80 GB on H100, 192 GB on B200. ~3 TB/s bandwidth.
SRAM"On-chip memory"Per-SM fast memory, ~256 KB per SM on H100. ~30 TB/s bandwidth.
Flash Attention"Tiled attention kernel"Computes attention without materializing N×N in HBM.
Continuous batching"No-wait batching"Swap finished sequences out, new ones in, without draining the batch.
PagedAttention"vLLM's headline"KV cache allocated in fixed blocks with a page table; eliminates fragmentation.
Prefix caching"Reuse long prompts"Cache KV for a shared prefix across requests; major cost cut for agents.
Speculative decoding"Draft + verify"Cheap draft model proposes tokens; big model verifies k in one pass.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.