विघटित प्रिफिल आणि डिकोड

डिव्हाइसेसवर प्रिफिल आणि डिकोड वेगळे केल्याने LLM इन्फरन्स वेगवान होतो आणि कार्यक्षमता सुधारते

लेखकPerplexity Research

इनपुट प्रॉम्प्टवरून आउटपुट टोकन्स तयार करण्यासाठी, LLM इन्फरन्स दोन टप्प्यांमध्ये विभागला जातो: प्रिफिल आणि डिकोड. प्रिफिल इनपुट टोकन्सवर चालते, KV कॅशे पॉप्युलेट करते, आणि त्यानंतर डिकोड टप्प्यात प्रवेश करते जे एका वेळी एक टोकन तयार करते. एक सिंगल डिकोड स्टेप साधारणपणे काही दशके मिलिसेकंदांसाठी चालते, तर प्रिफिलला значительно जास्त वेळ लागतो. जर तेच डिव्हाइसवर चालवले तर प्रिफिल आणि डिकोड एकत्र केल्याने डिकोड कार्यक्षमता कमी होते. या लेखात आपण प्रिफिल आणि डिकोड वेगळे करण्याच्या एका प्रस्थापित सोल्यूशनचा शोध घेतो, प्रिफिल थ्रूपुट आणि डिकोड लेटन्सी दोन्ही जास्तीत जास्त करण्यासाठी त्यांना वेगवेगळ्या डिव्हाइसेसवर चालवले जाते.

प्रिफिल विरुद्ध डिकोड कार्यक्षमता

एका सामान्य LLM सर्व्हिंग इंजिनमध्ये, बॅच शेड्युलर मॉडेलच्या प्रत्येक एक्झिक्युशन स्टेपमध्ये प्रक्रिया करण्यासाठी विनंत्या निवडतो. एकाच डिव्हाइस किंवा नोडवर चालताना, प्रिफिल आणि डिकोड दोन्ही विनंत्या एकत्र बॅच केल्या जातात. अटेंशनचा खर्च, जो सिक्वेन्सच्या लांबीनुसार एकत्रित होतो, तो प्रिफिल आणि डिकोड दोन्हीसाठी वाढतो, जो KV कॅशेमधील नोंदींच्या लांबीच्या (kv_len) प्रमाणात असतो. डिकोड विनंत्या सहसा एकच टोकन फॉरवर्ड करतात (qo_len=1), इतर थरांवर किमान खर्चासह जे सिक्वेन्सच्या टोकन्सवर स्वतंत्रपणे ऑपरेट करतात. प्रिफिल विनंत्या दाट थरांवर (dense layers) (मोठी qo_len) मोठ्या खर्चासह हजारो किंवा दहा हजारो टोकन्स फॉरवर्ड करतात.

फॉरवर्ड पासची लेटन्सी ही अटेंशन दरम्यान KV कॅशेमधून पुनर्प्राप्त केलेल्या टोकन्सच्या संख्येपेक्षा (kv_len) दाट थरांमधून (qo_len) पास केलेल्या स्वतंत्र टोकन्सच्या संख्येमुळे अधिक तीव्रतेने प्रभावित होते. अटेंशन विनंत्यांच्या संख्येवर आणि सिक्वेन्सच्या लांबीच्या प्रमाणात kv_len या दोन्हीवर समांतरपणे कार्य करू शकते, ज्यामुळे चांगला वापर साधला जातो. प्रिफिल हे कम्प्युट बाउंड आहे: qo_len जास्त असल्याने, GEMM कर्नल आधुनिक GPU च्या कम्प्युट क्षमतांचा पूर्ण वापर करण्यासाठी M परिमाणासह (dimension) पुरेसे ब्लॉक वाटप करू शकतात. डिकोड हे मेमरी बाउंड आहे: साधारणपणे कमी बॅच आकारांमुळे, M मधील इनपुट्सची संख्या सहसा लहान असते, जी केवळ एका ब्लॉकसाठी पुरेशी असते. Split-K GEMM कर्नल कमी टोकन बॅच आकारांसाठी SM वापर सुधारू शकतात तरीही, कॅशे आणि मॅट्रिक्स मल्टिप्लिकेशन युनिट्स साधारणपणे कमी वापरलेले राहतात.

ट्रान्सफॉर्मर स्तरामधून विनंत्यांचे बॅचिंग, ज्यामध्ये क्वेरी आणि की/व्हॅल्यू प्रोजेक्शन्स, अटेन्शन, आणि KV-कॅशे अद्यतने दाखवली आहेत.

जेव्हा एकत्र केले जाते, तेव्हा प्रिफिलसाठी विनंत्या असलेल्या बॅचमुळे फॉरवर्ड पासमध्ये जास्त लेटन्सी होते, ज्यामुळे संपूर्ण इन्स्टन्सच्या डिकोड थ्रूपुटवर नकारात्मक परिणाम होतो. प्रिफिल विनंत्या डिकोड विनंत्यांसोबत मिसळणे किंवा चंक्ड प्रिफिल वापरणे यामुळे डिकोड कार्यक्षमता थोडी सुधारू शकते, परंतु डिकोड थ्रूपुट जास्तीत जास्त करण्यासाठी इन्स्टन्सवर पुरेशा विनंत्यांवर प्रक्रिया करण्यासाठी पुरेसा प्रिफिल थ्रूपुट राखणे कठीण असते. मोठ्या मॉडेल्सच्या बाबतीत, सामान्य आउटपुट लांबीसह, डिकोडसाठी मोठा बॅच आकार राखण्यासाठी, प्रिफिल वारंवार करणे आवश्यक आहे ज्यामुळे सरासरी लेटन्सी लक्षणीयरीत्या कमी होते आणि आउटपुटमध्ये अडथळा निर्माण होतो.

तीन विनंत्यांसाठी मिश्रित प्रिफिल–डीकोड शेड्युलिंग, ज्यामध्ये सामायिक टाइमलाइनवर प्रिफिल आणि डीकोड अंतराल दाखवले आहेत.
समर्पित प्रिफिलर तीन विनंत्यांसाठी डीकोड काम पुरवताना दाखवणारे, विसंलग्न प्रिफिल–डीकोड शेड्युलिंग.

प्रिफिल आणि डिकोड करण्यासाठी वेगवेगळ्या नोड्सचा संच वापरून या समस्या सोडवता येतात. प्रिफिलर नोडला बहुविध डिकोडर नोड्सशी जोडून, थ्रूपुट जास्तीत जास्त करण्यासाठी आणि डिकोड थ्रूपुट देखील जास्तीत जास्त करण्यासाठी डिकोडर नोड्सवर समवर्ती विनंत्यांची पुेशी संख्या राखण्यासाठी प्रिफिलसाठी पुरेशा विनंत्या शेड्यूल केल्या जाऊ शकतात. प्रिफिलर नोड्स KV कॅशे पॉप्युलेट करतात, जे नंतर डिकोडर नोड्सकडे हस्तांतरित केले जातात. डिकोडर्सना आता प्रिफिलसाठी थांबावे लागत नसल्यामुळे, लेटन्सी अधिक निश्चित होतात, कारण सक्रिय विनंत्यांच्या वाढत्या kv_len चा एकूण प्रभाव खूपच कमी जाणवतो. नेटवर्कवर KV कॅशे हस्तांतरित करण्यासाठी काही दशकांपासून शेकडो मिलिसेकंद लागू शकतात, ज्यामुळे टाइम टू फर्स्ट टोकन (TTFT) मध्ये वाढ होऊन किंमत मोजावी लागते.

केव्ही मेसेंजर

Perplexity मध्ये, विघटित प्रिफिल आणि डिकोडसाठी आमची अंमलबजावणी KV मेसेंजरभोवती तयार केली आहे जी नेटवर्कद्वारे प्रिफिलर नोड्सवरून डिकोडर नोड्सपर्यंत KV कॅशे हस्तांतरण आयोजित करण्यासाठी LLM इंजिनशी संवाद साधते. प्रिफिलर बाजूला, मेसेंजर डिकोडर नोड्सकडून विनंत्या स्वीकारतो, त्या बॅच शेड्युलरला सुपूर्द करतो आणि शक्य तितक्या कमी लेटन्सीसह KV कॅशे पाठवण्यासाठी फॉरवर्ड पास अंमलबजावणीचा मागोवा ठेवतो. डिकोडर बाजूला, अ-निष्कासित पृष्ठे (un-evictable pages) वाटप केल्यानंतर, KV कॅशे आणि डिकोडर संदर्भ हस्तांतरण पूर्ण झाल्याची सूचना मिळेपर्यंत मेसेंजर विनंतीला डिकोडसाठी शेड्यूल करण्यापासून ब्लॉक करतो.

विसंलग्न विनंती जीवनचक्र, ज्यामध्ये डीकोडर आणि प्रिफिलर यांच्यातील समन्वय आणि KV-कॅशे डेटाचे हस्तांतरण दाखवले आहे.

प्रिफिल विघटित करण्यासाठी उच्च थ्रूपुट, कमी-लेटन्सी कनेक्शन आवश्यक आहेत, त्यामुळे आमची अंमलबजावणी RDMA साठी तयार केली आहे, जी EFA आणि ConnectX नेटवर्क इंटरफेस कंट्रोलर्स (NICs) दोन्हीना समर्थन देते. KV मेसेंजर libfabric वर आधारित आहे, ज्यामध्ये Remote Direct Memory Access (RDMA) प्रिमिटिव्ह्जवर उच्च-स्तरीय कमी-लेटन्सी ॲब्स्ट्रॅक्शन प्रदान करण्यासाठी आमच्या fabric-lib रॅपर्सचा वापर केला जातो, कमी-लेटन्सी सिग्नलिंगसह कार्यक्षम पृष्ठ आणि मेटाडेटा हस्तांतरण लागू केले जाते. पार्श्वभूमीत, fabric-lib प्रिफिलर नोडवरून डिकोडर नोडला डेटा कॉपी करण्यासाठी GPU आणि त्याच्या थेट जोडलेल्या NICs चे समन्वय साधते.

प्राप्त झाल्यावर, प्रीफिलर नोड स्रोत KV पृष्ठांचा संबंधित संच वाटप करतो आणि स्थानिक इंजिन वापरून प्रीफिलसाठी विनंतीचे शेड्यूलिंग करतो. विलंब कमी करण्यासाठी, ट्रान्सफर्स फॉरवर्ड पासची वाट पाहत नाहीत: त्याऐवजी, KV कॅशमध्ये वैयक्तिक लेयरसाठी KV कॅश नोंदी जोडणे मॉडेल पूर्ण करताच KV पृष्ठांच्या प्रती सुरू केल्या जातात. प्रीफिल विनंत्या चंक केल्या जाऊ शकतात म्हणून, बॅच शेड्युलर अंमलबजावणीपूर्वी सध्या शेड्यूल केलेल्या चंक्सची KV मेसेंजरला सूचना देतो. CUDA graphs ला समर्थन देण्यासाठी, तसेच लेयर्सचा मागोवा घेता येण्यासाठी, मेसेंजर एक समर्पित थ्रेड ठेवतो जो अटेन्शनच्या आउटपुट प्रोजेक्शननंतर वाढवलेल्या काउंटरचे पोलिंग करतो. वितरित वातावरणात हा काउंटर फक्त लीड नोडवर राखला जातो: जरी KV कॅश नोंदी append नंतर आणि attention पूर्वी वैध असल्या, तरी आउटपुट प्रोजेक्शन ranks across reduce केले जाते, ज्यामुळे त्यांचे आपोआप समक्रमण होते. काउंटरमध्ये बदल आढळताच, मेसेंजरला सूचना दिली जाते आणि तो fabric-lib ला बोलावून एखाद्या लेयरचे ट्रान्सफर सुरू करतो.

स्तरानुसार KV-कॅशे हस्तांतरणे, ज्यामध्ये प्रिफिलर आणि डीकोडर यांच्यात पेज्ड आणि सिंगल लेखन आणि पूर्णता काउंटर दाखवले आहेत.

शेवटच्या चंकचे हस्तांतरण पूर्ण झाल्यानंतर, कोणताही अतिरिक्त मेटाडेटा देखील कॉपी केला जातो: स्पेक्युलेटिव्ह डिकोडिंग किंवा MTP साठी लॉजिट्स आणि लपलेली राज्ये (hidden states) डिकोडरकडे हलवणे आवश्यक असते. हे कॉपी पूर्व-वाटप केलेल्या बफरमधून आणि त्यामध्ये RDMA द्वारे देखील केले जातात.

शेवटच्या चंकच्या सर्व प्रलंबित हस्तांतरणांचे पूर्ण झाल्यावर, प्रिफिलर नोड KV पृष्ठे डी-ॲलोकेट करतो आणि विनंती पूर्ण करतो. डिकोडर नोडला स्पष्टपणे सूचित केले जात नाही; त्याऐवजी, पूर्ण झालेल्या ऑपरेशनच्या संख्येचा मागोवा ठेवण्यासाठी ते तात्काळ काऊंटर्सचा वापर करते. प्रिफिलर बाजूला RDMA ऑपरेशन्सची संख्या हस्तांतरित केलेल्या पृष्ठांच्या प्रमाणात असते. पृष्ठ आणि संदर्भ प्रतिलिपींच्या ज्ञात संख्येची पूर्तता झाल्यावर, विनंती डिकोडिंगसाठी तयार असल्याचे दर्शवण्यासाठी fabric-lib KV मेसेंजरला कॉल करतो. मेसेंजर कोणताही संदर्भ डी-ॲलोकेट करतो आणि विनंती LLM इंजिनकडे सुपूर्द करतो.

शार्ड केलेले KV कॅशे हस्तांतरण

जर प्रिफिलर आणि डिकोडर टेन्सर पॅरललिझम (TP) वर अवलंबून असतील आणि KV कॅशे तंतोतंत शार्ड किंवा रेप्लिकेट करत असतील, तर एक सिंगल ट्रान्सफर इंजिन सर्व प्रतिकृतींचे पृष्ठ पाठवण्यासाठी आणि प्राप्त करण्यासाठी अनेक डिव्हाइसेसचे समन्वय साधते. मॉडेलचा एक्झिक्युटर अनेक डिव्हाइसेस आणि प्रक्रियांमध्ये रेप्लिकेट केलेला असूनही सिंगल मेसेंजर आणि ट्रान्सफर इंजिन वापरण्यास सक्षम होण्यासाठी, KV कॅशेला बॅकअप देणारी डिव्हाइस मेमरी वाटप करण्यासाठी आणि मुख्य प्रक्रियेमध्ये मॅप करण्यासाठी cuMem आणि cuMemImportFromShareableHandle वापरले जातात. ट्रान्सफर इंजिन प्रत्येक KV कॅशे स्लाइसच्या हस्तांतरणासाठी वापरण्यासाठी जवळच्या NUMA नोडमधील NICs आणि CPU शोधण्यासाठी नोडच्या टोपोलॉजीची तपासणी करते.

जर स्त्रोत आणि गंतव्यस्थान तंतोतंत जुळत असतील, तर हस्तांतरण सोपे असते कारण स्त्रोत आणि गंतव्यस्थानाची डिव्हाइसेस आणि पृष्ठे यांच्यात वन-टू-वन मॅपिंग असते. या परिस्थितीत, शार्डिंग आपोआप हस्तांतरण लेटन्सीमध्ये मदत करते: अधिक GPU वापरून, अधिक संबंधित NICs वापरले जाऊ शकतात, ज्यामुळे पूर्ण बँडविड्थ वापराजवळ पोहोचता येते. तथापि, जर कोणतीही तफावत असेल, तर स्त्रोत आणि गंतव्य स्लाइसमधील गुणोत्तरावर अवलंबून ट्रान्सफर इंजिनने पृष्ठे विभाजित किंवा पुनर्रचित केली पाहिजेत.

TP/EP प्रिफिलर आणि DP/EP डीकोडर्समधील KV-कॅशे हस्तांतरण टोपोलॉजी, ज्यामध्ये NIC कनेक्शन्स दाखवले आहेत.

जर प्रिफिलरने KV कॅशे अधिक डिव्हाइसेसवर विभाजित केला, तर प्रिफिलर डिव्हाइसेसमधून संबंधित अर्धे भाग पाठवून डिकोडरवर पूर्ण पृष्ठे पुनर्रचित केली जातात. डिकोडरकडे अधिक शार्ड्स असल्यास, ते एकाधिक स्त्रोतांकडून पृष्ठे प्राप्त करते. प्राप्त होणाऱ्या RDMA राईट्सची संख्या मोजण्यासाठी सक्षम होण्यासाठी डिकोडरला प्रिफिलरच्या शार्डिंग योजनेबद्दल माहिती असणे आवश्यक आहे. जर प्रतिकृतीचा समावेश असेल, तर प्रिफिलर डिव्हाइसेसना रिप्लिका सेटमध्ये गटबद्ध करतो जे स्वतःमध्ये पूर्ण KV कॅशे रेप्लिकेट करतात. RDMA राईट्स सुरू करण्यासाठी सर्व उपलब्ध डिव्हाइसेस वापरण्यासाठी गंतव्य रिप्लिका सेटना यादृच्छिकपणे स्त्रोत सेटपैकी एक नियुक्त केला जातो.

NHD आणि HND KV-कॅशे लेआउट्स, ज्यामध्ये प्रत्येक स्तर आणि पेजमधील टोकन्स आणि हेड्सची मांडणी परस्परविरोधी स्वरूपात दाखवली आहे.

Sharded ट्रान्सफर्ससाठी KV कॅशमध्ये थोडा बदल आवश्यक आहे. डिफॉल्टनुसार, FlashInfer NHD लेआउटवर अवलंबून असतो, जो पृष्ठाच्या आतल्या टोकन्सचे heads मध्ये क्रमांकन करतो. कॅशेस बहुधा attention heads च्या संख्येनुसार shard केल्या जात असल्याने, यामुळे head मध्ये खंड पडतो. RDMA ट्रान्सफर्स स्ट्राइडेड writes ला आपोआप समर्थन देत नाहीत, त्यामुळे ट्रान्सफर करण्यासाठी प्रत्येक head साठी एक ऑपरेशन आवश्यक असते. त्याऐवजी, libfabric बरोबरच्या परस्परक्रिया कमी करण्यासाठी, आम्ही KV कॅशेसना HND लेआउट वापरून आयोजित करतो, जे head dimension ला tokens च्या संख्येच्या आधी ठेवते. यामुळे सातत्य सुनिश्चित होते आणि एका write ने एक पृष्ठ कॉपी करणे शक्य होते.

स्पेक्युलेटिव्ह डिकोडिंग

स्पेक्युलेटिव्ह डिकोडिंगसाठी विघटित प्रिफिल-डिकोडमध्ये थोडे बदल आवश्यक आहेत. आमच्या अंमलबजावणीमध्ये, प्रिफिलर नोड्सना टोकन्स नमुना घेण्याची (sample) परवानगी नाही. Perplexity चे Sonar मॉडेल्स संरचित आउटपुटला समर्थन देत असल्याने, आम्हाला प्रिफिलर्स आणि डिकोडर्समध्ये स्कीमा प्रोसेसर अंमलबजावणी समक्रमित करण्याच्या गुंतागुंतीमध्ये पडायचे नाही. MTP आणि स्पेक्युलेटिव्ह डिकोडिंग यंत्रणेमध्ये, शेवटच्या टोकनपर्यंत ड्राफ्ट मॉडेल पूर्व-भरण्यात (prefiling) लक्ष्य मॉडेलमधून टोकन्स नमुने घेणे समाविष्ट असते.

प्रिफिलर आणि डीकोडरमधील स्पेक्युलेटिव्ह डीकोडिंग, ज्यामध्ये KV-कॅशे लांबी, लॉजिट्स, आणि टोकन सॅम्पलिंग दाखवले आहे.

या समस्यांवर मात करण्यासाठी, प्रिफिलमध्ये इनपुट सिक्वेन्सच्या शेवटच्या टोकनचा समावेश नाही. त्याऐवजी, शेवटच्या टोकनपूर्वीच्या प्रिफिलमधील लपलेली राज्ये (hidden states) किंवा लॉजिट्स हस्तांतरित केले जातात आणि डिकोडरवरील पुढील चरणात त्यावर डिकोड टोकन म्हणून उपचार केले जातात. यामुळे लेटन्सी थोडी वाढते, कारण पहिला टोकन जारी करण्यासाठी प्रिफिल नंतर एक पूर्ण डिकोड स्टेप पार पाडली पाहिजे, तरीही अंमलबजावणीची गुंतागुंत खूप कमी होते.

विघटित डिप्लॉयमेंट्स

उत्पादन ट्रॅफिक किंवा इन-हाउस मूल्यमापन वर्कलोड्सना समर्थन देण्यासाठी आम्ही वेगवेगळ्या मॉडेल्ससह अनेक विघटित कॉन्फिगरेशन डिप्लॉय केले आहेत किंवा प्रयोग केले आहेत. मॉडेल्सच्या आकार आणि अटेंशन मेकॅनिझमच्या आधारावर, GPU चा सर्वोत्तम वापर करण्यासाठी आम्ही प्रिफिलर आणि डिकोडर नोड्ससाठी योग्य शार्डिंग योजना निवडल्या.

DeepSeek-R1

DeepSeek सह, आम्ही टेन्सर-पॅरलल (TP) आणि डेटा-पॅरलल (DP) दोन्ही डिप्लॉयमेंटचा विचार केला. मागील ब्लॉग पोस्टमध्ये चर्चा केल्याप्रमाणे, TP डिप्लॉयमेंट अधिक चांगल्या लेटन्सी प्रदान करतात आणि कमी थ्रूपुटच्या किमतीवर, जड ट्रॅफिक सर्व्ह करण्यासाठी अधिक GPU ची आवश्यकता असते. DP डिप्लॉयमेंट लोडसह खूप चांगले स्केल करतात, तथापि डिव्हाइस-दर-डिव्हाइस किंवा नोड-दर-नोड संप्रेषणाच्या खर्चामुळे त्यांचा शिखर थ्रूपुट (peak throughput) कमी असतो.

DeepSeek मल्टि-हेड लेटंट अटेंशनवर अवलंबून असते, KV कॅशे संकुचित करते. सर्व KV हेड एकाच लेटंट वेक्टरमध्ये संकुचित केले जात असल्याने, TP KV कॅशे शार्ड करू शकत नाही, कारण त्याने त्याऐवजी सर्व रँकवर लेटंट वेक्टर रेप्लिकेट केले पाहिजेत. डिकोम्प्रेसननंतर शार्डिंग होते, कारण प्रत्येक रँक समान लेटंट रिप्रेझेंटेशनमधून वेगवेगळे हेड काढू शकतो. परिणामी, सर्व KV कॅशे शार्ड्स प्रिफिलर आणि डिकोडर शार्ड दोन्हीमध्ये तंतोतंत समान असतात.

इंट्रानोड TP सेटअपसह, प्रिफिलर्स आणि डिकोडर्स दोन्ही तंतोतंत सारखे शार्ड केलेले असतात. सर्व उपलब्ध NICs चा पूर्ण वापर करण्यासाठी सर्व रँकवरून हस्तांतरण पाठवले जातात. तथापि, DP डिप्लॉयमेंटसह, जेथे TP रँक आकार लहान असतो किंवा प्रत्येक DP रँक एकाच GPU ला नियुक्त केला जातो, KV कॅशेची रेप्लिकेट प्रत धारण करणारे कोणतेही प्रिफिलर डिव्हाइस ते पाठवू शकते. सर्व उपलब्ध NICs वर विनंत्या संतुलित करण्यासाठी, आम्ही प्रिफिलरकडून डिकोडरला KV कॅशे पाठवण्यासाठी यादृच्छिकपणे एक GPU आणि एक NIC निवडतो.

मिश्र प्रिफिल-डिकोडसह, शेंकडो मिलिसेकंदांच्या क्रमाने वारंवार होणाऱ्या प्रिफिल हस्तक्षेपांमुळे आमचे R1 डिप्लॉयमेंट सतत 50 TPS पेक्षा जास्त जाण्यासाठी संघर्ष करत होते. याउलट, प्रिफिल वेगळे करून, आम्हाला प्रत्येक विनंतीसाठी TTFT मध्ये सुमारे 100ms चा दंड झाला, परंतु एक सिंगल प्रिफिलर नोड 3 डिकोडर नोड्सवर सुसंगत बॅच आकार राखू शकत होता, ज्यामुळे प्रति डिकोडर नोड सुमारे 1 QPS लोड हाताळताना 90 TPS पेक्षा जास्त थ्रूपुट मिळत होता. डेटा-पॅरलल डिप्लॉयमेंटसह, TPS सुमारे 50 वर थोडा कमी होता, तथापि इन्स्टन्स प्रति रँक 1 QPS चा लोड हाताळू शकत होते, ज्यामध्ये एका नोडवर 8 रँक होते.

Qwen3-Coder

हे 480B मॉडेल ग्रुप्ड-क्वेरी अटेंशन (GQA) वापरते, त्यामुळे अटेंशन सहजपणे शार्ड केले जाऊ शकते आणि KV कॅशेसाठी मेमरीचा त्याग न करता टेन्सर पॅरललिझमचा फायदा घेऊ शकते. परिणामी, आम्ही प्रिफिल आणि डिकोड दोन्हीसाठी 8 GPU वर मॉडेल शार्ड करू शकलो, सुमारे 3 डिकोडर नोड्स एका प्रिफिलर नोडला जोडू शकलो. अटेंशन शार्ड केलेले असल्याने, आम्ही प्रिफिलर आणि डिकोडर KV कॅशे शार्ड करण्यासाठी HND KV कॅशे लेआउटवर अवलंबून असतो, प्रिफिलर रँक डिकोडर रँकसह जोडतो आणि स्लाइस समांतरपणे हस्तांतरित करण्यासाठी सर्व NICs चा पूर्ण वापर करतो.

उद्धरण

BibTeX
@online{perplexity2025DisaggregatedPrefillAndDecode,
  author = {{Perplexity} and Nandor Licker and Lequn Chen and Kevin Hu and Erin McKnight and Phi Hoang},
  title = {{Disaggregated prefill and decode}},
  date = {2025-08-01},
  url = {https://perplexity.coolkeypoint.com/hub/blog/disaggregated-prefill-and-decode}
}