क्या आपके डेटा रूपांतरण प्रवाह में बड़े पैमाने पर एलएलएम कॉल हैं? यह एक अल्ट्रा-प्रभावी Rust इंजन द्वारा संचालित है और अब अनुकूलित बक्से से बाहर बैचिंग का समर्थन करता है. यह एआई मूल कार्य प्रवाहों के लिए ~5× (≈80% तेजी से चलने का समय) के साथ Throughput में सुधार हुआ है. और सबसे अच्छी बात यह है कि आपको किसी भी कोड को बदलने की आवश्यकता नहीं है क्योंकि बैचिंग स्वचालित रूप से होता है, आपके ट्रैफ़िक को अनुकूलित करता है और जीपीयू को पूरी तरह से उपयोग किया जाता है। CocoIndex यहां हमने Cocoindex में अनुकूलित बैचिंग समर्थन का निर्माण करते समय क्या सीखा है। लेकिन सबसे पहले, आइए कुछ सवालों का जवाब दें जो आपके मिश्रण पर हो सकते हैं। बैटचिंग प्रसंस्करण को तेज क्यों करता है? This consists of all the preparatory and administrative work required before the actual computation can begin. Examples include GPU kernel launch setup, Python-to-C/C++ transitions, scheduling of tasks, memory allocation and management, and bookkeeping performed by the framework. These overhead tasks are largely independent of the input size but must be paid in full for each call. Fixed overhead per call: This portion of the computation scales directly with the size and complexity of the input. It includes floating-point operations (FLOPs) performed by the model, data movement across memory hierarchies, token processing, and other input-specific operations. Unlike the fixed overhead, this cost increases proportionally with the volume of data being processed. Data-dependent work: जब आइटम व्यक्तिगत रूप से संसाधित होते हैं, तो प्रत्येक आइटम के लिए बार-बार स्थिर ओवरहेड होता है, जो त्वरित रूप से कुल संचालित समय पर नियंत्रण कर सकता है, खासकर जब प्रति आइटम गणना अपेक्षाकृत छोटी होती है. इसके विपरीत, बैच में एक साथ कई आइटम को संसाधित करना इस ओवरहेड के प्रति आइटम प्रभाव को काफी कम करता है. बैचिंग कई आइटमों पर स्थिर लागतों को कम करने की अनुमति देता है, जबकि हार्डवेयर और सॉफ्टवेयर अनुकूलन भी अनुमति देता है जो डेटा-आधारित कार्य की दक्षता में सुधार करता है. इन अनुकूलनों में GPU पाइपलाइनों का अधिक प्रभावी उपयोग, बेहतर कैश उपयोग, और कम को बैटरीकरण कंप्यूटिंग दक्षता और संसाधन उपयोग दोनों को अनुकूलित करके प्रदर्शन में काफी सुधार करता है. यह कई लाभ प्रदान करता है: Each function or API call carries a fixed overhead — GPU kernel launches, Python-to-C/C++ transitions, task scheduling, memory management, and framework bookkeeping. By processing items in batches, this overhead is spread across many inputs, dramatically reducing the per-item cost and eliminating repeated setup work. Amortizing one-time overhead: Larger batches allow the GPU to execute operations as dense, highly parallel matrix multiplications, commonly implemented as General Matrix–Matrix Multiplication (GEMM). This mapping ensures the hardware runs at higher utilization, fully leveraging parallel compute units, minimizing idle cycles, and achieving peak throughput. Small, unbatched operations leave much of the GPU underutilized, wasting expensive computational capacity. Maximizing GPU efficiency: Batching minimizes the frequency of memory transfers between CPU (host) and GPU (device). Fewer Host-to-Device (H2D) and Device-to-Host (D2H) operations mean less time spent moving data and more time devoted to actual computation. This is critical for high-throughput systems, where memory bandwidth often becomes the limiting factor rather than raw compute power. Reducing data transfer overhead: संयोजन में, ये प्रभाव पारगमन में बड़े पैमाने पर सुधार लाते हैं. बैचिंग कई छोटे, अप्रभावी गणनाओं को बड़े, अत्यधिक अनुकूलित ऑपरेशनों में परिवर्तित करता है जो आधुनिक हार्डवेयर क्षमताओं का पूरी तरह से उपयोग करते हैं. आईआई कार्य भारों के लिए - बड़े भाषा मॉडल, कंप्यूटर दृष्टि, और वास्तविक समय डेटा प्रोसेसिंग सहित - बैचिंग सिर्फ एक अनुकूलन नहीं है; यह स्केलबल, उत्पादन स्तर की प्रदर्शन प्राप्त करने के लिए आवश्यक है। सामान्य Python कोड के लिए बैचिंग कैसा दिखता है गैर-बैचिंग कोड – सरल लेकिन कम कुशल एक पाइपलाइन को व्यवस्थित करने का सबसे प्राकृतिक तरीका डेटा को टुकड़ा प्रति टुकड़ा संसाधित करना है। for file in os.listdir(directory): content = file.read() chunks = split_into_chunks(content) for chunk in chunks: vector = model.encode([chunk.text]) # one item at a time index.upsert(file_id=file.name, chunk_offset=chunk.offset, vector=vector) यह पढ़ना और तर्क करना आसान है: प्रत्येक टुकड़ा कई चरणों के माध्यम से सीधे प्रवाह करता है। मैन्युअल बैचिंग – अधिक कुशल लेकिन जटिल आप इसे बैचिंग द्वारा तेज कर सकते हैं, लेकिन यहां तक कि सबसे सरल "केवल सब कुछ एक बार बैच करें" संस्करण को कोड को काफी अधिक जटिल बनाता है: # 1) Collect payloads and remember where each came from batch_texts = [] metadata = [] # (file_id, chunk_id) for file in os.listdir(directory): content = file.read() chunks = split_into_chunks(content) for chunk in chunks: batch_texts.append(chunk.text) metadata.append((file.name, chunk.offset)) # 2) One batched call (library will still mini-batch internally) vectors = model.encode(batch_texts) # 3) Zip results back to their sources for (file_name, chunk_offset), vector in zip(metadata, vectors): index.upsert(file_id=file.name, chunk_offset=chunk.offset, vector=vector) इसके अलावा, एक बार में सब कुछ बैच करना आमतौर पर आदर्श नहीं है क्योंकि सभी डेटा के लिए यह कदम पूरा होने के बाद ही अगले चरण शुरू हो सकते हैं। CocoIndex का समर्थन CocoIndex अंतर को पुल करता है और आपको दोनों दुनियाओं के सर्वश्रेष्ठ प्राप्त करने की अनुमति देता है - प्राकृतिक प्रवाह का पालन करके अपने कोड की सरलता को बनाए रखें, जबकि CocoIndex संचालित समय द्वारा प्रदान की गई बैचिंग से दक्षता प्राप्त करें। हमने पहले से ही निम्नलिखित अंतर्निहित कार्यों के लिए बैटरी समर्थन सक्षम किया है: एम्बुलेंस अनुच्छेद परिवर्तित कोलकाता कोलकाता यह API को नहीं बदलता है। Your existing code will just work without any change – still following the natural flow, while enjoying the efficiency of batching. कस्टम कार्यों के लिए, बैटचिंग को सक्षम करना उतना ही सरल है जितना: सेट batching=True कस्टम फ़ंक्शन decorator में। तर्कों को बदलें और टाइप सूची में वापस करें। उदाहरण के लिए, यदि आप एक कस्टम फ़ंक्शन बनाना चाहते हैं जो छवियों के लिए छोटे चित्र बनाने के लिए एक एपीआई को कॉल करता है। @cocoindex.op.function(batching=True) def make_image_thumbnail(self, args: list[bytes]) -> list[bytes]: ... अधिक जानकारी के लिए बैटचिंग दस्तावेज़ देखें। अधिक जानकारी के लिए बैटचिंग दस्तावेज़ देखें। कैसे CocoIndex बैटरी आम दृष्टिकोण बैचिंग आने वाले अनुरोधों को एक पंक्ति में इकट्ठा करके काम करता है और उन्हें एक ही बैच के रूप में धोने के लिए सही समय निर्धारित करता है। Two widely used batching policies dominate the landscape: In this approach, the system flushes all requests that arrived within a fixed window of W milliseconds. Time-based batching (flush every W milliseconds): The maximum wait time for any request is predictable, and implementation is straightforward. It ensures that even during low traffic, requests will not remain in the queue indefinitely. Advantages: During periods of sparse traffic, idle requests accumulate slowly, adding latency for early arrivals. Additionally, the optimal window W often varies with workload characteristics, requiring careful tuning to strike the right balance between latency and throughput. Drawbacks: Here, a batch is triggered once the queue reaches a pre-defined number of items, K. Size-based batching (flush when K items are queued): The batch size is predictable, which simplifies memory management and system design. It is easy to reason about the resources each batch will consume. Advantages: When traffic is light, requests may remain in the queue for an extended period, increasing latency for the first-arriving items. Like time-based batching, the optimal K depends on workload patterns, requiring empirical tuning. Drawbacks: कई उच्च प्रदर्शन सिस्टम एक : वे एक बैच को धोते हैं जब समय विंडो W समाप्त हो जाता है या पंक्ति आकार K तक पहुंच जाती है - जो पहले आता है. यह रणनीति दोनों तरीकों के लाभों को कैप्चर करती है, कम ट्रैफ़िक के दौरान प्रतिक्रियाशीलता में सुधार करती है, जबकि पिक लोड के दौरान कुशल बैच आकार बनाए रखती है। hybrid approach बावजूद इसके, बैटरी हमेशा शामिल होती है ट्रैफ़िक पैटर्न, कार्य भार विशेषताएं, और सिस्टम प्रतिबंध सभी आदर्श सेटिंग्स को प्रभावित करते हैं. इष्टतम प्रदर्शन प्राप्त करने के लिए अक्सर निगरानी, प्रोफाइलिंग और गतिशील रूप से इन पैरामीटरों को वास्तविक समय स्थितियों के अनुरूप समायोजित करने की आवश्यकता होती है। tunable parameters and trade-offs CocoIndex के तरीके फ्रेमवर्क स्तर: अनुकूलित, knob-free CocoIndex लागू करता है a जो स्वचालित रूप से आने वाले अनुरोध लोड के अनुकूलित करता है. प्रक्रिया निम्नलिखित तरीके से काम करती है: simple and natural batching mechanism निरंतर लाइनिंग: जबकि वर्तमान बैच डिवाइस (जैसे, जीपीयू) पर संसाधित किया जा रहा है, किसी भी नए आने वाले अनुरोधों को तुरंत संसाधित नहीं किया जाता है. इसके बजाय, वे लाइन में हैं. यह सिस्टम को चल रहे गणना को बाधित किए बिना काम को जमा करने की अनुमति देता है. स्वचालित बैच विंडो: जब वर्तमान बैच पूरा हो जाता है, तो CocoIndex तुरंत पंक्ति में जमा किए गए सभी अनुरोधों को लेता है और उन्हें अगले बैच के रूप में व्यवहार करता है। अनुकूलित बैचिंग: कोई टाइमर नहीं है, कोई निश्चित बैच आकार नहीं है, और कोई पूर्व-आधारित सीमाएं नहीं हैं। प्रत्येक बैच का आकार स्वाभाविक रूप से पिछले बैच की सेवा अवधि के दौरान आने वाले ट्रैफ़िक के अनुरूप होता है। CocoIndex का बैचिंग तंत्र यह लगातार बैच में अनुरोधों को संसाधित करता है, जबकि बैच आकार को वास्तविक समय की मांग को प्रतिबिंबित करने की अनुमति देता है, जिससे मैन्युअल ट्यूनिंग या जटिल heuristics की आवश्यकता नहीं होती है। In essence, self-tuning यह अच्छा क्यों है? कम लाइटेंस जब दुर्लभ: कुछ अनुरोधों के साथ, बैच छोटे होते हैं (अक्सर आकार 1), इसलिए आप प्रभावी रूप से लगभग एकल कॉल लाइटेंस पर चल रहे हैं। व्यस्त होने पर उच्च प्रवाह: जब ट्रैफ़िक बढ़ता है, तो उड़ान में बैच के दौरान अधिक अनुरोध जमा होते हैं, इसलिए अगले बैच बड़ा होता है - उपयोग स्वचालित रूप से बढ़ जाता है। कोई ट्यूनिंग: आपको W या K को ट्यूनिंग करने की आवश्यकता नहीं है सिस्टम डिजाइन के अनुसार आपके ट्रैफ़िक पैटर्न को अनुकूलित करता है। Function-level batching: packing the batch intelligently कार्य स्तर पर बैचिंग: बैच को बुद्धिमान रूप से पैक करें फ़ंक्शन स्तर पर, CocoIndex प्रत्येक फ़ंक्शन को बैच विंडो को संभालने के लिए सक्षम बनाता है - पिछले बैच समाप्त होने के समय सभी लाइन अनुरोध - अपने विशिष्ट मॉडल या पुस्तकालय के लिए सबसे कुशल और सुरक्षित तरीके से। , अधिकतम लचीलापन और प्रदर्शन की अनुमति देता है। how it’s processed is up to the function ले लो उदाहरण के रूप में कार्य करता है. आधारभूत वाक्य-ट्रांसफार्मर पुस्तकालय किसी भी लंबाई के बैचों को स्वीकार कर सकता है, लेकिन आंतरिक रूप से यह उन्हें विभाजित करता है (अनुमानित आकार: 32) यह सुनिश्चित करने के लिए कि प्रत्येक सुविधाजनक रूप से डिवाइस की स्मृति में फिट रहता है, जबकि जीपीयू कोरल्स को उनके इष्टतम "सॉट स्पॉट" में रखता है. CocoIndex स्वचालित रूप से इस डिफ़ॉल्ट माइक्रो बैच आकार का लाभ उठाता है. SentenceTransformerEmbed micro-batches बैटिंग केवल डेटा को स्मृति में फिट करने के बारे में नहीं है - यह बर्बाद कंप्यूटिंग को कम करने के बारे में भी है। , जिससे जीपीयू को समान, उच्च प्रवाह के कोरल्स को संचालित करने की अनुमति मिलती है. हालांकि, इसका मतलब है कि छोटे अनुक्रम बैच में सबसे लंबे अनुक्रम की लागत का भुगतान करते हैं. उदाहरण के लिए, 64-टॉकन और 256-टॉकन आइटम को मिलाकर 64-टॉकन आइटम को आवश्यक से ~4 गुना अधिक महंगा संसाधित किया जाता है. CocoIndex इसे हल करता है और लगभग समान लंबाई के माइक्रो-बैच बनाने, पैडिंग ओवरहेड को कम करने और जीपीयू उपयोग को उच्च बनाए रखने। pad every sequence in a batch to the length of the longest sequence sorting requests by token count अन्य कार्य अपने स्वयं के रणनीतियों को लागू कर सकते हैं: कुछ बस पूरे बैच को बैकअंड में प्रसारित कर सकते हैं, जबकि अन्य लागू कर सकते हैं SIMD टाइलों या merge-writes की तरह. CocoIndex विधि के लिए अज्ञात रहता है - इसकी जिम्मेदारी है , प्रत्येक फ़ंक्शन को पूर्ण नियंत्रण देता है कि कैसे पारगमन को अधिकतम करें और ओवरहेड को कम करें। custom packing schemes deliver the batch window efficiently and without delay यह डिजाइन संतुलन : फ्रेमवर्क बैटचिंग का ऑर्केस्ट्रेशन संभालता है, जबकि फ़ंक्शन खुद को स्मृति, कंप्यूटिंग और कोरल दक्षता के लिए अनुकूलित करते हैं - विभिन्न कार्य भारों पर उच्च प्रवाह सुनिश्चित करते हुए, बिना किसी एक आकार फिट-सभी समाधान को मजबूर करते हुए। simplicity, flexibility, and performance Conclusion निष्कर्ष बैचिंग कंप्यूटर कार्य भार को तेज करने के लिए सबसे प्रभावी रणनीतियों में से एक है। सक्षम करें और , बैटरीकरण कई छोटे, अप्रभावी गणनाओं को कम, अत्यधिक अनुकूलित ऑपरेशनों में बदलता है। amortizing fixed overhead across multiple items larger, more efficient GPU operations minimizing data transfer CocoIndex बैटचिंग करता है कई अंतर्निहित कार्य पहले से ही कैप के नीचे बैचिंग का लाभ उठाते हैं, और कस्टम कार्य इसे एक सरल के साथ अपना सकते हैं यह रेंज, टाइमर, या बैच आकारों को मैन्युअल रूप से प्रबंधित करने की जटिलता को खत्म करता है, जिससे डेवलपर्स अपने मॉडल और अनुप्रयोगों पर ध्यान केंद्रित कर सकते हैं। effortless and automatic batching=True बैटचिंग के प्रदर्शन लाभ सबसे अधिक स्पष्ट होते हैं जब , जैसे कि छोटे मॉडल या हल्के संचालन के साथ। बैचिंग भी सबसे प्रभावी है जब आधारित एपीआई या लाइब्रेरी चूंकि आंशिक समर्थन लाभ को सीमित कर सकता है - उदाहरण के लिए, ओलामा जैसे कुछ पुस्तकालयों में बैचिंग के दौरान केवल मामूली सुधार दिखाई देते हैं। fixed overhead represents a significant portion of total computation fully supports batched operations संक्षेप में, Batching एक : यह पारगमन को अधिकतम करता है, लेटेनशिप को कम करता है जहां यह मायने रखता है, और हार्डवेयर को अपनी पूरी क्षमता के करीब संचालित करने की अनुमति देता है - सब कुछ डेवलपर्स अनुभव को सरल और भविष्यवाणी योग्य बनाए रखते हुए। high-leverage optimization GitHub पर CocoIndex को एक ⭐ स्टार देने और यदि आपको यह उपयोगी लगता है तो अपने समुदाय के साथ साझा करने से हमें समर्थन करें! हमें देने से बचाएं और अपने समुदाय के साथ साझा करें यदि आपको यह उपयोगी लगता है! CocoIndex a ⭐ Star on गीता गीता