𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗮𝗻𝗱 𝗣𝗮𝗴𝗲𝗱𝗔𝘁𝘁𝗲𝗻𝘁𝗶𝗼𝗻: 𝗪𝗵𝘆 𝗬𝗼𝘂𝗿 𝗟𝗟𝗠 𝗦𝗲𝗿𝘃𝗲𝗿 𝗦𝗹𝗼𝘄𝘀 𝗗𝗼𝘄𝗻
तुमचा LLM सर्व्हर मंद चालत आहे.
तुम्ही चार A100 GPUs वर 70B मॉडेल तैनात केले आहे. सकाळी ८ वाजता सर्व काही ठीक दिसते. दुपारच्या जेवणापर्यंत, लॅटन्सी (latency) दुप्पट होते. तुम्ही तुमची मेमरी तपासता. त्यातील बहुतेक भाग "tensor buffers" ने व्यापलेला असतो. हे प्रत्यक्षात जुन्या संभाषणांचे कॅश केलेले स्टेट्स (cached states) असतात.
ही KV cache ची समस्या आहे. प्रोडक्शन LLM सर्व्हिंगमधील हा सर्वात मोठा अडथळा (bottleneck) आहे.
KV cache म्हणजे काय?
प्रत्येक transformer मॉडेल एक-एक करून टोकन्स (tokens) तयार करते. नवीन टोकन तयार करण्यासाठी, मॉडेलला सर्व मागील टोकन्सचे Key आणि Value tensors लागतात. हे प्रत्येक वेळी पुन्हा मोजणे (recomputing) खूप संथ असते. त्याऐवजी, इंजिन ते साठवून ठेवते. हे स्टोरेज म्हणजे KV cache.
मेमरीची समस्या:
Llama 3.1 70B मॉडेलसाठी, एका 4096-token सिक्वेन्सला सुमारे 1.3 GB मेमरी लागते.
जर एकाच वेळी 256 वापरकर्ते असतील, तर तुम्हाला 336 GB मेमरीची आवश्यकता असेल. हे चार A100 GPUs च्या क्षमतेपेक्षा जास्त आहे. KV cache इतक्या वेगाने वाढते की ते अनेकदा मॉडेल वेट्स (model weights) पेक्षा जास्त मेमरी वापरते.
पारंपारिक मेमरी मॅनेजमेंट का अपयशी ठरते:
- Internal fragmentation: तुम्ही 4096 टोकन्ससाठी जागा राखून ठेवता पण फक्त 300 वापरता. तुम्ही त्या जागेचा 93% भाग वाया घालवता.
- No sharing: समान system prompt असलेले दोन वापरकर्ते प्रत्येकी त्या प्रॉम्प्टची स्वतःची प्रत साठवतात.
- All-or-nothing eviction: जेव्हा मेमरी संपते, तेव्हा तुम्हाला संपूर्ण सिक्वेन्स CPU वर हलवावा लागतो. यामुळे GPU थांबतो (stalls).
PagedAttention हे कसे सुधारते:
PagedAttention एका ऑपरेटिंग सिस्टमप्रमाणे काम करते. ते KV cache ला 'pages' नावाच्या लहान, ठराविक आकाराच्या ब्लॉक्समध्ये विभागते.
यामुळे तीन मुख्य समस्या सुटतात:
- On-demand allocation: सिक्वेन्स जसा वाढतो तसाच तो फक्त आवश्यकतेनुसार पेजेस घेतो. तुम्ही न वापरलेल्या क्षमतेवर मेमरी वाया घालवत नाही.
- Shared prefix support: अनेक वापरकर्ते एका सामान्य system prompt साठी समान फिजिकल पेजेस शेअर करू शकतात. मेमरी मोठ्या प्रमाणात वाचवण्यासाठी हे "copy-on-write" लॉजिक वापरते.
- Fine-grained eviction: जेव्हा मेमरी भरते, तेव्हा सिस्टम मोठ्या सिक्वेन्सऐवजी लहान पेजेस CPU वर हलवते.
परिणाम:
PagedAttention (vLLM मधील तंत्रज्ञान) वापरल्यामुळे पारंपारिक पद्धतींच्या तुलनेत थ्रूपुट (throughput) 2x ते 4x ने वाढू शकतो.
कधी वापरावे:
- उच्च कॉनकरन्सी (High concurrency).
- वेगवेगळ्या लांबीचे सिक्वेन्स.
- समान सुरुवातीचे प्रॉम्प्ट्स (Prompts that share the same start).
कधी टाळावे:
- सिंगल-युजर लोकल इन्फरन्स (Single-user local inference).
- खूप लहान मॉडेल्स.
- अशी कामे जिथे प्रत्येक सिक्वेन्सची लांबी अगदी सारखीच असते.
KV Cache आणि PagedAttention: ते काय करतात आणि ते का महत्त्वाचे आहेत
Large Language Models (LLMs) ने मशीनशी संवाद साधण्याच्या पद्धतीत क्रांती घडवून आणली आहे, परंतु त्यांच्या इन्फरन्स (inference) दरम्यान कार्यक्षमता आणि मेमरी व्यवस्थापन ही मोठी आव्हाने आहेत. या लेखात, आपण दोन अत्यंत महत्त्वाच्या तंत्रांचा—KV Cache आणि PagedAttention—अभ्यास करणार आहोत.
KV Cache काय आहे?
जेव्हा एखादे LLM मजकूर तयार करते (generation), तेव्हा ते एका वेळी एक टोकन तयार करते. प्रत्येक नवीन टोकन तयार करण्यासाठी, मॉडेलला मागील सर्व टोकन्सचा संदर्भ समजून घेणे आवश्यक असते. जर मॉडेलने प्रत्येक वेळी मागील सर्व टोकन्सची पुन्हा गणना (re-computation) केली, तर ही प्रक्रिया अत्यंत संथ होईल.
KV Cache ही समस्या सोडवण्यासाठी वापरले जाते. हे तंत्र मागील टोकन्सचे 'Key' (K) आणि 'Value' (V) वेक्टर्स साठवून ठेवते. यामुळे, नवीन टोकन तयार करताना मॉडेलला मागील माहितीची पुन्हा गणना करण्याची गरज पडत नाही, फक्त साठवलेले वेक्टर्स वापरून पुढील गणना केली जाते. यामुळे इन्फरन्सचा वेग लक्षणीयरीत्या वाढतो.
समस्या: मेमरीची कमतरता आणि फ्रॅगमेंटेशन
जरी KV Cache मुळे वेग वाढला असला, तरी यामुळे मेमरी व्यवस्थापनाच्या दोन मोठ्या समस्या निर्माण होतात:
- मेमरीची वाढती गरज: जसा मजकुराचा संच (sequence length) वाढतो, तशी KV Cache साठी लागणारी मेमरी देखील रेषीय (linearly) पद्धतीने वाढते. मोठ्या मॉडेल्ससाठी ही मेमरी प्रचंड प्रमाणात लागते.
- मेमरी फ्रॅगमेंटेशन (Memory Fragmentation): पारंपारिक पद्धतीत, KV Cache साठी मेमरीचा एक मोठा आणि सलग (contiguous) ब्लॉक राखून ठेवावा लागतो. यामुळे दोन गोष्टी घडतात:
- Internal Fragmentation: मेमरीचा असा भाग जो राखून ठेवला आहे पण प्रत्यक्षात वापरला जात नाही.
- External Fragmentation: मेमरीचे छोटे-छोटे तुकडे होणे, ज्यामुळे मोठ्या डेटासाठी सलग जागा उपलब्ध होत नाही.
PagedAttention: एक उपाय
PagedAttention हे तंत्र ऑपरेटिंग सिस्टममधील 'व्हर्च्युअल मेमरी' आणि 'पेजिंग' (paging) या संकल्पनेतून प्रेरित आहे.
पारंपारिक पद्धतीमध्ये, मेमरीचा एक मोठा सलग ब्लॉक आवश्यक असतो. परंतु, PagedAttention मेमरीला लहान, विखुरलेल्या ब्लॉक्समध्ये (non-contiguous blocks) विभागते. हे ब्लॉक्स एका 'पेज टेबल' (page table) द्वारे व्यवस्थापित केले जातात.
यामुळे काय होते?
- कार्यक्षम मेमरी वापर: मेमरीचे तुकडे विखुरलेले असले तरीही, ते कार्यक्षमतेने वापरले जाऊ शकतात.
- फ्रॅगमेंटेशन कमी होते: मेमरीचा अपव्यय टाळला जातो कारण आपल्याला आधीच किती मेमरी लागेल याचा अंदाज बांधून ती राखून ठेवण्याची गरज नसते.
- उच्च थ्रूपुट (Higher Throughput): मेमरी वाचवल्यामुळे, आपण एकाच वेळी अधिक विनंत्या (requests) किंवा मोठ्या बॅच साइज (batch size) हाताळू शकतो.
निष्कर्ष
KV Cache हे वेग वाढवण्यासाठी आवश्यक आहे, तर PagedAttention हे त्या वेगासाठी लागणारी मेमरी कार्यक्षमतेने व्यवस्थापित करण्यासाठी आवश्यक आहे. या दोन्ही तंत्रांमुळेच आज आपण मोठ्या प्रमाणावर आणि वेगाने LLMs वापरू शकत आहोत.
Optional learning community: https://t.me/GyaanSetuAi