लेख

विघटित प्रीफिल और डिकोड

डेटा के उच्च गति ज्यामितीय कण, जो तेजी से गुजर रहे हैं

इनपुट प्रॉम्प्ट से आउटपुट टोकन उत्पन्न करने के लिए, LLM पॉपुलेटिंग ख़ेचेस, फिर डिकोड चरण में प्रवेश करने से पहले प्रीफिल चरण में विभाजित होता है, जो एक-एक करके टोकन उत्पन्न करता है।

जहाँ एकल डिकोड चरण आम तौर पर कुछ मिलीसेकंड तक चलता है, वहीँ प्रीफिल काफी अधिक समय लेता है। यदि एक ही उपकरण पर चलाया जाता है, तो प्रीफिल और डिकोड को मिलाने से डिकोड प्रदर्शन पर प्रतिकूल प्रभाव पड़ता है। इस लेख में हम डिसएग्रीगेटेड प्रीफिल और डिकोड के रूप में एक स्थापित समाधान का पता लगाते हैं, जो दोनों को अलग उपकरणों पर चलाकर अधिकतम प्रीफिल थ्रूपुट और डिकोड विलंबता प्राप्त करते हैं।

प्रीफिल बनाम डिकोड प्रदर्शन

एक सामान्य LLM सेवा इंजन में, बैच शेड्यूलर प्रत्येक मॉडल के निष्पादन चरण में प्रक्रिया के लिए अनुरोधों का चयन करता है। जब एक ही उपकरण या नोड पर चलाया जाता है, तो प्रीफिल और डिकोड दोनों अनुरोध एक साथ बैच किए जाते हैं। ध्यान की लागत, जो अनुक्रम की लंबाई के साथ एकत्र होती है, प्रीफिल और डिकोड दोनों के लिए बढ़ती है, जो कि KV कैश (kv_len) में प्रविष्टियों की लंबाई के अनुरूप होती है। डिकोड अनुरोध आम तौर पर एक टोकन भेजी जाती है (qo_len=1), एक न्यूनतम लागत पर अन्य परतों के माध्यम से जो अनुक्रम के टोकन पर स्वतंत्र रूप से काम करती हैं। प्रीफिल अनुरोध हजारों या दसियों हजार टोकन भेजते हैं जो घनीपरतों के माध्यम से एक महत्वपूर्ण लागत में चलते हैं (बड़ा qo_len)।

एक फ़ॉरवर्ड पास की विलंबता को घनी परतों (qo_len) से पारित स्वतंत्र टोकन की संख्या से अधिक प्रभावित किया जाता है, इसके बजाय ध्यान की अवधि के दौरान KV कैश (kv_len) से टोकन की संख्या की तुलना में। ध्यान अनुरोधों की संख्या और kv_len अनुक्रम की लंबाई के अनुसार समानांतर कर सकता है, जिससे अच्छी उपयोगिता प्राप्त होती है। प्रीफिल कंप्यूट बाउंड होता है: qo_len उच्च होते हुए, GEMM कर्नले पर्याप्त ब्लॉक आवंटित कर सकते हैं ताकि आधुनिक GPU की कंप्यूट क्षमताओं को पूरी तरह से उपयोग में ला सकें। डिकोड मेमोरी-बाउंड होता है: आम तौर पर कम बैच आकारों के कारण, M के साथ इनपुट की संख्या आम तौर पर छोटी होती है, जो कि केवल एक ब्लॉक के लिए पर्याप्त होता है। जबकि स्प्लिट-K GEMM कर्नेल्स कम टोकन बैच आकारों के लिए SM उपयोगिता सुधार सकते हैं, कैश और मैट्रिक्स गुणन इकाइयाँ आम तौर पर कम उपयोग में रहती हैं।

जब प्रीफिल अनुरोधों के साथ मिलाया जाता है, तो बैच जिसमें फ़ॉरवर्ड पास के दौरान अधिक विलंबताएँ होती हैं, पूरे उदाहरण के डिकोड थ्रूपुट को नकारात्मक रूप से प्रभावित करता है। प्रीफिल अनुरोधों को डिकोड अनुरोधों के साथ मिलाने या चंकेड प्रीफिल का उपयोग करके डिकोड प्रदर्शन थोड़ा सुधारा जा सकता है, लेकिन पर्याप्त प्रीफिल थ्रूपुट बनाए रखने के लिए पर्याप्त अनुरोधों को प्रोसेस करने की आवश्यकता होती है ताकि डिकोड थ्रूपुट को अधिकतम करने के लिए उदाहरणका माध्यम बन सके। बड़े मॉडलों के मामले में, सामान्य आउटपुट लंबाइयों के साथ, डिकोड के बड़े बैच आकार को बनाए रखने के लिए, प्रीफिल को इतनी बार संचालित करना पड़ता है कि यह औसत विलंबता को काफी कम कर देता है और आउटपुट में रुकावटें पैदा करता है।

इन समस्याओं का समाधान प्रीफिल और डिकोड को निष्पादित करने के लिए एक अलग सेट का उपयोग करके किया जा सकता है। प्रीफिलर नोड को कई डिकोडर नोड्स के साथ जोड़कर, प्रीफिल के लिए पर्याप्त अनुरोध शेड्यूल किए जा सकते हैं ताकि थ्रूपुट को अधिकतम किया जा सके और डिकोडर नोड्स पर भी अधिकतम डिकोड थ्रूपुट के लिए पर्याप्त संख्या में सहचरित अनुरोध बनाए रखा जा सके। प्रीफिलर नोड्स KV कैश को पॉपलेट करते हैं, जो फिर डिकोडर नोड्स में स्थानांतरित कर दिए जाते हैं।

KV मैसेंजर

परप्लेक्सिटी में, हमारे डिसएग्रीगेटेड प्रीफिल और डिकोड के कार्यान्वयन को KV मैसेंजर के चारों ओर बनाया गया है, जो LLM इंजन के साथ बातचीत करता है ताकि प्रीफिलर नोड्स से डिकोडर नोड्स तक नेटवर्क के माध्यम से KV कैश स्थानांतरित किया जा सके। प्रीफिलर साइड पर, मैसेंजर डिकोडर नोड्स से अनुरोध स्वीकार करता है, बैच शेड्यूलर को सौंपता है, और अग्रेषण निष्पादन पर नजर रखता है ताकि यथा संभव कम विलंबता के साथ KV कैश को डिस्पैच किया जा सके।

प्रीफिल को डिसएग्रीगेट करना उच्च थ्रूपुट, कम विलंबता कनेक्शन की आवश्यकता होती है, इसलिए हमारा कार्यान्वयन RDMA के लिए दर्जी किया गया है, जो EFA और कनेक्टX नेटवर्क इंटरफ़ेस नियंत्रकों (NICs) दोनों का समर्थन करता है। KV मैसेंजर libfabric पर बनाया गया है, हमारे fabric-lib रैपर्स का उपयोग कर कम विलंबता अमूर्त देने के लिए।

प्रत्येक GPU की क्षमताओं का पूरी तरह उपयोग करने के लिए, fabric-lib एक GPU और उसके सीधे जुड़े NICs का समन्वय करता है ताकि प्रीफिलर नोड से डिकोडर नोड में डेटा कॉपी किया जा सके। प्राप्ति के बाद, प्रीफिलर नोड एक अनुकूलित सेट का स्रोत KV पृष्ठ आवंटित करता है और अपने स्थानीय इंजन का उपयोग करके इसके लिए अनुरोध शेड्यूल करता है। विलंबों को कम करने के लिए, हस्तांतरण फॉरवर्ड पास का इंतजार नहीं करते।

अंतिम गट्टे के स्थानांतरण के पूरा होने के बाद, कोई भी अतिरिक्त मेटाडेटा भी कॉपी कर लिया जाता है: अटकल डिकोडिंग या MTP के लिए अंतिम चरण में भेजे जाने की आवश्यकता होती है। ये प्रतिलिपियाँ RDMA के माध्यम से पहले से आवंटित बफरों में - और से - की जाती हैं।

अंतिम गट्टे के सभी लंबित स्थानांतरण के पूरा होने पर, प्रीफिलर नोड KV पृष्ठों का अनावंटन करता है और अनुरोध पूरा करता है। डिकोडर नोड को क्रियान्वित करके विशेष रूप से सूचित नहीं किया जाता है: बल्कि, यह तुरंत काउंटरों का उपयोग करके पूरा किए गए कार्यों की संख्या का ट्रैक रखता है। प्रीफिल साइड पर RDMA कार्यों की संख्या स्थानांतरित पृष्ठों की संख्या के समानुपाती होती है। ज्ञात संख्या के पृष्ठ और संदर्भ प्रतिलिपियों के पूरा होने पर, fabric-lib संकेत करता है कि एक अनुरोध डिकोडिंग के लिए तैयार है।

शार्डेड KV कैश स्थानांतरण

अगर प्रीफिलर और डिकोडर टेंसर पैरेललिज्म (TP) पर निर्भर करते हैं और KV कैश को समान रूप से विभाजित या पुनर्प्राप्त करते हैं, तो एकल स्थानांतरण इंजन सभी नकलों के पृष्ठों को भेजने और प्राप्त करने के लिए कई उपकरणों का समन्वय करता है। भले ही मॉडल का निष्पादक एकाधिक उपकरणों और प्रक्रियाओं में नकल किया गया हो, एकल मैसेंजर और स्थानांतरण इंजन का उपयोग करने के लिए cuMem और cuMemImportFromShareableHandle का उपयोग KV कैश का समर्थन करने के लिए उपकरण मेमोरी आवंटन और मुख्य प्रक्रिया में मानचित्रण के साथ किया जाता है।

मूल और गंतव्य दोनों जगहें एक समान करने पर, स्थानांतरण सरल हैं क्योंकि उपकरण और पृष्ठों के बीच एक-से-एक प्रारूपण होता है। इस स्थिति में, विभाजन निहित रूप से स्थानांतरण विलंबताएँ मदद करता है: अधिक GPUs का उपयोग करने से, अधिक संबंधित NICs को भर्ती किया जा सकता है, फुल बैंडविथ उपयोग के अधिक करीब पहुंचते हुए।

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

काल्पनिक डिकोडिंग

काल्पनिक डिकोडिंग में डिसएग्रीगेटेड प्रीफिल-डिकोड के लिए मामूली परिवर्तनों की आवश्यकता होती है। हमारे कार्यान्वयन में, प्रीफिलर नोड्स को टोकन नमूना करने की अनुमति नहीं है। क्योंकि परप्लेक्सिटी के सोनार मॉडल संरचित आउटपुट का समर्थन करते हैं, हम प्रीफिलर और डिकोडर में शेयर करने वाले स्कीमा प्रोसेसर के क्रियान्वयन को सिंक्रनाइज़ करने की जटिलता का सामना करना नहीं चाहते हैं।

इन मुद्दों के आसपास काम करने के लिए, प्रीफिल का इनपुट अनुक्रम के अंतिम टोकन को शामिल नहीं करता है। इसके बजाय, अंतिम टोकन के पहले के प्रीफिल से छुपी हुई अवस्थाएँ या लॉजिट्स स्थानांतरित की जाती हैं और इसे डिकोड पर अगले कदम में एक डिकोड टोकन के रूप में माना जाता है।

डिसएग्रीगेटेड परिनियोजन

हमने या उपयोगिता मूल्यांकन कार्यभार के लिए इन-हाउस मूल्यांकन कार्यभार के साथ कई डिसएग्रीगेटेड कॉन्फ़िगरेशन पर अद्वितीय मॉडल परिनियोजित या प्रयोगित किए हैं। मॉडल के आकार और ध्यान तंत्र के आधार पर, हमने नोड्स के लिए उपयुक्त शार्डिंग योजनाओं का चयन किया, जो GPU का सबसे अच्छा उपयोग कर सकें।

DeepSeek-R1

डीपसीक के साथ, हमने दोनों टेंसर-पैरेलल (TP) और डेटा-पैरेलल (DP) तैनाती पर विचार किया। जैसा कि पिछले ब्लॉग पोस्टों में चर्चा की गई है, TP तैनाती अधिक विलंबता प्रदान करती है, लेकिन कम थ्रूपुट की लागत पर, भारी ट्रैफ़िक को सेवा देने के लिए अधिक GPU की आवश्यकता होती है। DP तैनाती लोड के साथ काफी बेहतर स्केल करती है, हालांकि उनका अधिकतम थ्रूपुट कम होता है।

DeepSeek मल्टी-हेड लेटेंट एटेंशन पर निर्भर करता है, KV कैश को संपीड़ित करता है।

क्योंकि सभी KV हेड्स को एकल लेटेंट वेक्टर में संपीड़ित किया जाता है, TP KV कैश को शार्ड नहीं कर सकता, क्योंकि इसे सभी रैंकों पर लेटेंट वेक्टर को पुनःप्राप्त करना चाहिए।

हालांकि, जब TP का रैंक आकार कम होता है या प्रत्येक DP रैंक को एकल GPU सौंपा जाता है, तो डिकोडर को एक समान बैच आकार बनाए रखते हुए पेज भेजा जा सकता है।

अगर डिकोडर के शार्ड्स अधिक होते हैं, तो उसे कई स्रोतों से पृष्ठ प्राप्त करना होता है।

DDP वितरणों के साथ, TPS थोड़ा कमता है लगभग 50 पर, हालाँकि प्रत्येक रैंक के लिए प्रति रैंक एक लोड को संभाल सकते हैं, एकल नोड के लिए।

मिश्रित प्रीफिल-डिकोड के साथ

हमने 90 TPS से अधिक वितरित करने वाली एक सहचारी नोड को 90 TPS से अधिक वितरित करने वाली एक सहचारी नोड को कम टीटीएफटी सीमा के साथ परिनियोजित किया।

Qwen3-Coder

यह 480B मॉडल ग्रुप्ड-क्वेरी एटेंशन (GQA), तो ध्यान को आसानी से शर्ड किया जा सकता है और बिना KV कैश के लिए मेमोरी का बलिदान किए बिना टेंसर पैरेललिज्म का लाभ उठाने में मदद करता है।

इसके परिणामस्वरूप, हम मॉडल को दोनों प्रीफिल और डिकोड के लिए 8 GPUs में शार्ड कर सकते थे।

डिकोडर के साथ-साथ, ध्यान शार्ड होते हैं, हम HND KV कैश लेआउट पर निर्भर करते हैं ताकि प्रीफिलर और डिकोडर दोनों KV कैश को शार्ड कर सकें, NIC को प्रीफिलर रैंक के साथ जोड़ते हुए पूर्ण क्षमता का उपयोग करके स्लाइस स्थानांतरित सकें।

क्या आप हमारे API प्लेटफ़ॉर्म के भविष्य को आकार देने में रुचि रखते हैं? हम भर्ती कर रहे हैं।

नई रिलीज़, फीचर्स और अपडेट के साथ अद्यतित रहने के लिए हमारे डेवलपर समुदाय में शामिल हों।

क्या आप हमारे API प्लेटफ़ॉर्म के भविष्य को आकार देने में रुचि रखते हैं? हम भर्ती कर रहे हैं।

नई रिलीज़, फीचर्स और अपडेट के साथ अद्यतित रहने के लिए हमारे डेवलपर समुदाय में शामिल हों।

क्या आप हमारे API प्लेटफ़ॉर्म के भविष्य को आकार देने में रुचि रखते हैं? हम भर्ती कर रहे हैं।

नई रिलीज़, फीचर्स और अपडेट के साथ अद्यतित रहने के लिए हमारे डेवलपर समुदाय में शामिल हों।