PagedAttention जो समस्या हल करता है: जब एक अनुरोध आता है, तो आप नहीं जानते कि प्रतिक्रिया कितनी लंबी होगी, इसलिए आपको अधिकतम संभव लंबाई के लिए KV cache पूर्व-आवंटित करना चाहिए। यदि अधिकतम लंबाई 4096 टोकन है लेकिन प्रतिक्रिया केवल 200 टोकन है, तो आवंटित मेमोरी का 95% बर्बाद हो जाता है। सैकड़ों समवर्ती अनुरोधों से गुणा करें और GPU मेमोरी जल्दी भर जाती है, जो थ्रूपुट को सीमित करती है।
PagedAttention KV cache को निश्चित आकार के pages (जैसे, प्रति page 16 टोकन) में विभाजित करता है। Pages केवल आवश्यकता होने पर आवंटित किए जाते हैं और GPU मेमोरी में कहीं भी संग्रहीत किए जा सकते हैं (गैर-सन्निहित)। एक page table तार्किक स्थितियों को भौतिक मेमोरी स्थानों पर मैप करती है, ठीक OS वर्चुअल मेमोरी की तरह। यह विखंडन को समाप्त करता है: मेमोरी page-दर-page आवंटित होती है जैसे प्रतिक्रिया बढ़ती है, और मुक्त किए गए pages तुरंत नए अनुरोधों के लिए उपलब्ध होते हैं।
एक शक्तिशाली एक्सटेंशन: जब कई अनुरोध एक ही प्रॉम्प्ट prefix साझा करते हैं (साझा system prompts के साथ सामान्य), उस prefix के लिए उनके KV cache pages भौतिक रूप से साझा किए जा सकते हैं — एक बार मेमोरी में संग्रहीत लेकिन सभी अनुरोधों द्वारा संदर्भित। यह OS डिज़ाइन से copy-on-write सिमेंटिक्स है जो LLM सर्विंग पर लागू किया गया है। उन अनुप्रयोगों के लिए जहां कई उपयोगकर्ता एक ही system prompt साझा करते हैं, यह साझा भाग के लिए मेमोरी उपयोग को 50%+ तक कम कर सकता है।