■ الإجابة أولًا

Llama 3.1 8B at 131,072 tokens in fp16: كاش KV ≈ 16 GiB — بحجم الأوزان نفسه.

«الـ8B الذي يتّسع في 16 GiB» يصبح مسألة بـ32 GiB.

الكاش خطي بالسياق ومُخصَّص مقدَّمًا — تدفع RAM ثمن 128k سترتجه أم لا.

الحل مملّ: اضبط السياق على ما تستعمله فعلًا — نافذة 32k تكلف ربع كاش 128k.

16.0GiB — كاش kv بحجم 128k · llama 3.1 8b · fp16
131,072token محاسَبًا مملوءًا كان أم لا
128 KiBرسم ثابت — في كل token، llama 8b

01مكتب القياس

المستأجر هو كاش kv — العجلات تُدير فاتورةً لا تطبعها البطاقة قط

شكل 1 · مكتب قياس كاش KVمفاتيح 1 · 2 · 3 · 4 — أو الأزرار
سجل المستأجركاش KV · مقيس على الهواءمستأجر · LLAMA 3.1 8B32 طبقة × 8 رؤوس KVRAM مقيسة · مدفوعة مقدَّمًاكاش KV · الفاتورةمحاسَب1600GiBأوزان · النموذج160GiBالكاش = الأوزاننافذة128kرسم ثابت128 KiB/TOKtoken داخليًا000000

الكاش = الأوزانعلى النافذة الكاملة، الكاش بحجم النموذج الذي ينتمي إليه — إيجار بـ32 GiB الآن

مستأجر LLAMA 3.1 8B · نافذة 128k · 131,072 TOKENS · CACHE 16.00 GiB · أوزان 16.0 GiB · نصيب 100% · مُطعَم 0

العجلات حاسَبت قبل أن يتحرك عدّاد المسافة — التخصيص مقدَّم، والملء اختياري

02الصيغة التي تغفلها البطاقات

صيغة عامة واحدة حرّكت كل رقم في تلك العجلات

الحساب — كما يعرضه transformer inference arithmetic
cache_bytes = 2 × layers × context × kv_heads × head_dim × bytes_per_element

«نافذة السياق ليست ميزة تنقرها. إنها عقد إيجار للذاكرة تدفعه كل ثانية يعمل فيها الخادم.»

الفاتورة كاملة — سطران في مواجهة ملفات config.json العامة
def kv_cache_gib(layers, kv_heads, head_dim, ctx, bytes_per=2):
    return 2 * layers * ctx * kv_heads * head_dim * bytes_per / 2**30

print(kv_cache_gib(32, 8, 128, 131_072))  # Llama 3.1 8B  -> 16.0
print(kv_cache_gib(28, 4, 128, 131_072))  # Qwen2.5 7B    -> 7.0

verify: kv_cache_gib(32, 8, 128, 131_072) → 16.0 · kv_cache_gib(28, 4, 128, 131_072) → 7.0

موترّان—مفاتيح + قيم، محفوظة الكاش لكل طبقة، وكل رأس KV، وكل token — لا شيء يُعاد حسابه، وكل شيء يُتذكَّر
لماذا الخطية—تخزين كل token ثابت، فالتخزين الكلي خطي بالسياق — 128× كاش نافذة 1k، ما يبقى للجلسة من عمر
لماذا مقدَّمًا—طاولة الخدمة تخصّص النافذة كاملة عند الحمل — تدفع RAM ثمن 128k سترتجه أم لا

03مستأجران، مكتب واحد

الصيغة حسابٌ، إلى أن تُسعِّر بطاقتَي نموذج حقيقيتين جنبا إلى جنب

نموذج (fp16)طبقات × رؤوس KVكاش KV @ 128kأوزانالكاش مقابل الأوزان
Llama 3.1 8B32 × 8~16 GiB~16 GiB~100%
Qwen2.5 7B28 × 4~7 GiB~15 GiB~47%

اضغط المفتاح 1 على المكتب — النافذة نفسها 128k تُقاس من جديد بـ7.0 GiB على qwen2.5 7b

حسم النموذج—grouped-query attention (GQA): رؤوس KV أقل، كاش أنحف — معماريّة لا تكميم
لماذا يبدو qwen أكثر ودًّا— ‏28 طبقة × 4 رؤوس KV هي سبب أن النافذة نفسها تكلف نحو 7 GiB — ارتياح حقيقي على الآلات المتحفظة
حيث تختبي الرؤوس—المواصفات نادرًا ما تقول رؤوس KV — عليك تنقيبَ config.json عنها، وهو ما يخبرك كيف قُصد قراءة هذا الرقم

04حيث تنحني الفاتورة

العداد صادق في الانتباه الكامل — أربعة انحناءات قبل أن توقّع أي شيء

prefill · الفاتورة الثانية—‏prompt من 100k token يُمضغ كله قبل أول حرف مخرَج — على 3060 تلك دقائق، لا ميلي ثوان
نماذج النافذة المنزلقة—انتباه نمط mistral يُحدّ سقفًا لكل طبقة، فيتوقف الكاش عن النمو — الصيغة تبالغ في تقديرها، لمصلحتك
تكميم KV—‏llama.cpp يستطيع كاشَ KV في q8_0، نحو نصف الحجم مع بعض مخاطر الجودة — نصف 16 GiB ما يزال 8 GiB
طاولة الخدمة—‏vLLM يأخذ GGUF على GPU بالفاتورة الذاكرية نفسها مثبتة — التكميم ينحّف الأوزان، لا حساب الكاش قط

لا أحد يقرأ 128,000 token. ومع ذلك، تدفع RAM ثمن كل واحد منهم.

الحل مملّ—اضبط السياق على ما تستعمله حِملتك فعلًا — 32k يكسّي كل prompt يرسله مطوّر منفرد تقريبًا، برُبع الفاتورة
حارة الاسترجاع—عمل RAG — ملء النافذة أغلى طريقة لقول «اقرأ القسم 4»؛ الاسترجاع عوضًا عن النافذة الكاملة، لأن السياق الطويل ليس نفعيًا فارغًا، إنه مسعَّر
■ ختم الأمانة مُختبَر على: Llama 3.1 8B · Qwen2.5 7B · fp16 · نافذة 131,072 token — قِيس في 2026-09-22، ورُوّي في 2026-10-04. كل رقم في هذه الصفحة هو الصيغة العامة، مسرودة على config.json العامة للنماذج (طبقات، رؤوس KV، head_dim)، كما يعرضه Transformer Inference Arithmetic — عدّاد المكتب هو الصيغة نفسها على JavaScript؛ لا بنشماركات تُشترى، على بُعد print واحد من نهايتك.

نهاية سجل المستأجر · لم يُجلب شيء · كل شيء محلي