هل لديك مكالمة LLM ضخمة في تدفق تحويل البيانات الخاصة بك؟ يمكن أن تكون قادرة على مساعدتهم. يتيحها محرك Rust عالية الأداء وبدلاً من ذلك يدعم التعديلات المتكاملة خارج الصندوق. وهذا يعزز إمكانية التعديل بنسبة ~5 × (≈80٪ أسرع وقت التشغيل) لعمليات العمل الأصلية AI. والأفضل من كل شيء، لا تحتاج إلى تغيير أي كود لأن التعديلات تظهر تلقائياً، مما يتناسب مع حركة المرور الخاص بك والحفاظ على بطاقات GPU المستخدمة بالكامل. 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: عندما يتم معالجة العناصر بشكل فردي، يتم إدخال التكلفة المرتبطة بشكل متكرر لكل العناصر، والتي يمكن أن تتحكم بسرعة في وقت التشغيل الكامل، خاصة عندما تكون الحسابات لكل العناصر صغيرة نسبياً. على النقيض، فإن معالجة العناصر المتعددة معاً في مجموعات يقلل بشكل كبير تأثير العناصر المرتبطة في هذه التكلفة.إدخال التكلفة المرتبطة يتيح إدخال التكلفة المرتبطة في العديد من العناصر، فضلاً عن تمكين تحسينات الأجهزة والبرمجيات التي تحسين كفاءة العمل المعتمد على البيانات. تحسين الأداء بشكل كبير من خلال تحسين كفاءة الحوسبة واستخدام الموارد.يقدم مزايا متعددة ومتنوعة: 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. لقد تمكننا بالفعل من دعم المجموعات للميزات المدمجة التالية: إدخال النص المادة التاسعة كولومبيا الـمـسـلـمـيـن لا تتغير النار. Your existing code will just work without any change – still following the natural flow, while enjoying the efficiency of batching. بالنسبة إلى الوظائف المخصصة ، فإن تمكين المجموعات بسيطة مثل: إعداد batching=True في تصميم الوظيفة المخصصة. تغيير العناوين وعودة نوع إلى القائمة. على سبيل المثال، إذا كنت ترغب في إنشاء وظيفة مخصصة تتحدث إلى API لإنشاء مقاطع صغيرة للصور. @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: العديد من أنظمة الأداء عالية الاستخدام A : يضغطون على مجموعة عندما تنتهي زاوية الوقت W أو يصل الحد الأقصى إلى حجم K – أيما كان يحدث أولاً. hybrid approach على الرغم من ذلك، يرتبط البوتاسيوم دائماً وتؤثر عينات حركة المرور، وخصائص كمية العمل، وتحديات النظام على الإعدادات المثالية.لقد تحتاج إلى مراقبة وتحديث وتعديل هذه النماذج بشكل ديناميكي لتناسب الظروف في الوقت الحقيقي. tunable parameters and trade-offs نهج CocoIndex مستوى الخلفية: متكامل، بلا قفزات CocoIndex تطبق a يتناسب تلقائيًا مع حجم الطلبات المرسلة.العملية هي كما يلي: simple and natural batching mechanism الترتيب المستمر: في حين يتم معالجة المجموعة الحالية على الجهاز (على سبيل المثال، GPU) ، لا يتم معالجة أي طلبات آمنة جديدة على الفور. بدلا من ذلك ، يتم الترتيب. نافذة البطاقة التلقائية: عند الانتهاء من البطاقة الحالية، يختار CocoIndex على الفور جميع الطلبات التي تم تلقائياً في الشارع وتتعامل معها كالبطاقة التالية. التعديلات التعديلية: لا توجد موعدات، ولا حجم البطاقة المحددة، ولا حدود مخصصة. تكييف حجم كل البطاقة بشكل طبيعي إلى حركة المرور التي وصلت خلال فترة الخدمة من البطاقة السابقة. أوقات حركة المرور العالية تنتج تلقائيا البطاقات الكبيرة، مما يزيد من استهلاك GPU. أوقات حركة المرور المنخفضة تنتج البطاقات الصغيرة، مما يقلل من التوقعات المبكرة. ميكانيكية CocoIndex إنها تتعامل باستمرار مع الطلبات في الأسهم في الوقت الذي يسمح حجم الأسهم بتعكس الطلب في الوقت الحقيقي، مما يتيح الحصول على قوة عالية دون الحاجة إلى تركيز يدوي أو التفاعلية المعقدة. In essence, self-tuning لماذا هذا جيد؟ الحد الأدنى من التوقعات عندما تكون ضعيفة: مع عدد قليل من الطلبات ، تكون البطاقات صغيرة (عادةً من حجم واحد) ، لذلك أنت تعمل بشكل فعال في الحد الأدنى من التوقعات بالقرب من التوقعات واحدة. حجم المبيعات عالية عندما تكون مشغولة: عندما تزداد حركة المرور ، تتضاعف المزيد من الطلبات خلال مجموعة في الرحلة ، لذلك فإن المجموعة التالية أكبر - تزداد الاستخدام تلقائياً. لا توزيع: لا تحتاج إلى توزيع W أو K. يتكيف النظام مع نمط حركة المرور الخاص بك عن طريق التصميم. Function-level batching: packing the batch intelligently التعبئة على مستوى الوظيفة: التعبئة بطريقة ذكية في المستوى الفعلي من الوظائف، يتيح CocoIndex لكل وظيفة التعامل مع نافذة المجموعة - جميع الطلبات المرتفعة في الوقت الذي تنتهي المجموعة السابقة - بطريقة أكثر فعالية وآمنة بالنسبة إلى نموذجها أو المكتبة المحددة. مما يتيح مزيد من المرونة والقدرة على التكيف. how it’s processed is up to the function احصل على يمكن أن تستخدم المكتبة المتعلقة بتغيير الصيغة بطاقات طويلة الأمد، ولكن في الداخل يتم تقسيمها إلى (الحجم المفتوح: 32) لضمان تكييف كل جهاز إلى الذاكرة بشكل مريح مع الحفاظ على الكوريوس GPU في "الخلفية الحلوة" المثالية. SentenceTransformerEmbed micro-batches لا يتعلق الأمر بقطع البيانات فقط في الذاكرة، بل يتعلق الأمر أيضًا بتقليل الحسابات المفقودة. ويسمح GPU بتنفيذ الكوريوهات المتساوية والمتوسطة، ومع ذلك، وهذا يعني أن الترتيبات القصيرة تشتري تكاليف الترتيبات الأطول في المجموعة. على سبيل المثال، تجنب مزيج أجزاء 64 تريكومين و 256 تريكومين، فإن أجزاء 64 تريكومين يتم معالجة 4 مرات أكثر تكلفة من الضروري. وتشكل ميكروباصات من طوابق متساوية تقريبًا ، مما يقلل من التكلفة المرتفعة والحفاظ على استهلاك GPU عالية. pad every sequence in a batch to the length of the longest sequence sorting requests by token count قد تطبق الميزات الأخرى استراتيجياتها الخاصة: قد يتم إرسال بعض المجموعة الكاملة إلى الخلفية، في حين أن الآخرين قد يتم تطبيقها. مثل الألواح SIMD أو المجموعات. CocoIndex لا يزال غامضًا عن الطريقة - مسؤوليته هي: تمنح كل وظيفة السيطرة الكاملة على كيفية كسب الحد الأقصى والحد الأقصى. custom packing schemes deliver the batch window efficiently and without delay تصميم هذا التوازن : يقوم المجموعة بتصميم المجموعة ، في حين أن الوظائف نفسها تحسين لتقنية الذاكرة والتحليل والقدرة على الكمبيوتر ، مما يضمن تكلفة عالية في جميع حملات العمل المختلفة دون الحاجة إلى حل واحد-size-fits-all. simplicity, flexibility, and performance Conclusion النتيجة التجميل هو واحدة من الاستراتيجيات الأكثر فعالية لتسريع حملات العمل المحمولة. , enabling و و تحويل المجموعات التي ستكون العديد من الحسابات الصغيرة غير الكافية إلى عمليات أقل وأكثر تحسينًا. amortizing fixed overhead across multiple items larger, more efficient GPU operations minimizing data transfer CocoIndex يلعب عدد قليل من الوظائف المدمجة بالفعل تفعيل المجموعات تحت القفص، ويمكن استخدامها بمهارة بسيطة. هذا يزيل الصعوبة في إدارة الترتيبات، والموضوعات، أو الحجمات، مما يتيح للمطورين التركيز على نموذجهم والتطبيقات. effortless and automatic batching=True الفائدة الأكثر تعقيدًا من الحمض النووي عند ، مثلما هو الحال مع النماذج الصغيرة أو العمليات الصلبة.العديد هو أيضا الأكثر فعالية عندما API أو المكتبة الأساسية وبما أن الدعم الجزئي يمكن أن يحد من الأرباح - على سبيل المثال ، فإن بعض المكتبات مثل Ollama تظهر فقط تحسينات معقولة أثناء التجميل. fixed overhead represents a significant portion of total computation fully supports batched operations على سبيل المثال، البكتيريا هي : يزيد حجم المبيعات ، ويقلل من التوقعات حيث أنها مهمة ، ويسمح للمعدات للعمل بالقرب من إمكانياتها الكاملة - كل ذلك في الوقت الذي يظل تجربة المطور بسيطة ومحددة. high-leverage optimization الدعم لنا من خلال إعطاء CocoIndex نجمة ⭐ على GitHub والتشارك مع مجتمعك إذا كنت تعتقد أنه مفيد! دعمنا من خلال تقديم وشارك مع مجتمعك إذا كنت تعتقد أنه مفيد! CocoIndex a ⭐ Star on Github Github