पाठ 13 / 27
Context Window और KV Cache
समझें कि context लंबाई सीमित क्यों है और caching generation कैसे तेज़ करती है।
स्मृति ही सीमा है
Context window अधिकतम tokens (prompt और बना आउटपुट मिलाकर) है जिन्हें मॉडल एक साथ देख सकता है। Attention हर token की तुलना हर पिछले से करता है, इसलिए सीधी लागत लंबाई के वर्ग से बढ़ती है। दोबारा गणना से बचने को serving systems हर पिछले token की keys और values KV cache में रखते हैं, ताकि हर नया token सिर्फ़ अपनी गणना करे। Cache GPU स्मृति लेता है जो अनुक्रम लंबाई, परतों, heads और एक साथ users की संख्या के साथ बढ़ती है, और लंबे contexts व ऊँचे throughput में अक्सर सीमा बन जाती है।
स्मृति अंकगणित, चलाकर
मैंने यह सादा-Python (सिर्फ़ standard library) उदाहरण चलाया। Weights अकेले fp16 में प्रति parameter 2 bytes लेते हैं: 7B मॉडल के लिए 14 GB। KV-cache पंक्ति उदाहरण configuration (32 परतें, 8 KV heads, head आकार 128, fp16) उपयोग करती है: एक 8192-token अनुक्रम को लगभग 1.07 GB चाहिए। असली मॉडल अलग होते हैं; सूत्र ही मुख्य बात है।
def params_gb(params_b, bytes_per):
return params_b * 1e9 * bytes_per / 1e9
for name, b in (("7B", 7), ("13B", 13), ("70B", 70)):
print(name, "fp16", params_gb(b, 2), "GB | int8", params_gb(b, 1), "GB | 4-bit", params_gb(b, 0.5), "GB")
# KV cache: 2 (K and V) * layers * kv_heads * head_dim * bytes * tokens
layers, kv_heads, head_dim, bytes_per, tokens = 32, 8, 128, 2, 8192
kv = 2 * layers * kv_heads * head_dim * bytes_per * tokens
print("KV cache for one 8192-token sequence:", round(kv / 1e9, 3), "GB")
Output:
7B fp16 14.0 GB | int8 7.0 GB | 4-bit 3.5 GB 13B fp16 26.0 GB | int8 13.0 GB | 4-bit 6.5 GB 70B fp16 140.0 GB | int8 70.0 GB | 4-bit 35.0 GB KV cache for one 8192-token sequence: 1.074 GB
लंबा context मुफ़्त नहीं
बड़ी window पैसे और latency लेती है, और बहुत लंबे prompts के बीच दबे ब्योरों पर मॉडल कम भरोसे से ध्यान देते हैं। जो प्रासंगिक है भेजें, सब कुछ नहीं।
त्वरित जाँच: KV cache क्या रखता है?
- User का password
- पिछले tokens की keys और values, ताकि दोबारा गणना न हो
- प्रशिक्षण डेटा
- Tokenizer नियम
Answer
पिछले tokens की keys और values, ताकि दोबारा गणना न हो — पिछली keys और values cache करने से हर नया token बनाना सस्ता होता है।