Har du massive LLM opkald i din data transformation flow? Det er drevet af en ultra-ydende Rust-motor og understøtter nu adaptiv batching ud af kassen. Dette har forbedret Throughput med ~5× (≈80% hurtigere runtime) for AI-native arbejdsprocesser. CocoIndex Her er, hvad vi lærte, mens vi byggede adaptiv batch support i Cocoindex. Men først, lad os besvare nogle spørgsmål, der kan være på din mixnd. Hvorfor accelererer batching processen? 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: Når elementer behandles individuelt, opstår den faste overhead gentagne gange for hvert element, hvilket hurtigt kan dominere den samlede runtime, især når beregningen pr. element er relativt lille. I modsætning hertil reducerer behandling af flere elementer sammen i batches betydeligt den per-element-effekt af denne overhead. Batching gør det muligt at amortere de faste omkostninger på tværs af mange elementer, samtidig med at det også muliggør hardware- og softwareoptimeringer, der forbedrer effektiviteten af det data-afhængige arbejde. Disse optimeringer omfatter mere effektiv udnyttelse af GPU-rørledninger, bedre cacheudnyttelse og færre kernel lanceringer, som alle bidrager til højere gennemsnit og lavere generel latency. Batching forbedrer ydeevnen betydeligt ved at optimere både beregningseffektivitet og ressourceudnyttelse. 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: Batching omdanner mange små, ineffektive beregninger til store, højt optimerede operationer, der fuldt ud udnytter moderne hardwarefunktioner.For AI-arbejdsbelastninger - herunder store sprogmodeller, computervision og realtidsdatabehandling - er batching ikke kun en optimering; det er afgørende for at opnå skalerbar ydeevne på produktionsniveau. Hvordan batching ser ud for normal Python-kode Ikke-batching kode – enkel men mindre effektiv Den mest naturlige måde at organisere en rørledning på er at behandle data stykke for stykke. 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) Dette er nemt at læse og begrunde: hver stykke strømmer lige igennem flere trin. Batching manuelt – mere effektivt, men kompliceret Du kan accelerere det ved at batche, men selv den enkleste "bare batch alt én gang" version gør koden betydeligt mere kompliceret: # 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) Desuden er batching alt på én gang normalt ikke ideelt, fordi de næste trin kun kan begynde, når dette trin er udført for alle data. CocoIndex’s Batching Support CocoIndex bryder kløften og giver dig mulighed for at få det bedste fra begge verdener - bevar enkelheden af din kode ved at følge den naturlige strøm, mens du får effektiviteten fra batching, der leveres af CocoIndex runtime. Vi har allerede aktiveret batch support til følgende indbyggede funktioner: Embedtekst Sagsbehandlet Kollektivbillede KøgeKøgeKøge Det ændrer ikke ilden. Your existing code will just work without any change – still following the natural flow, while enjoying the efficiency of batching. For brugerdefinerede funktioner er aktivering af batching så simpelt som: Sæt batching=True i den brugerdefinerede funktion dekorator. Ændre argumenterne og returnere typen til liste. Hvis du f.eks. vil oprette en brugerdefineret funktion, der opfordrer en API til at oprette miniaturer til billeder. @cocoindex.op.function(batching=True) def make_image_thumbnail(self, args: list[bytes]) -> list[bytes]: ... Se batchdokumentationen for flere detaljer. Se den For flere detaljer. Batch dokumentation Hvordan CocoIndex Batches Fælles tilgange Batchning fungerer ved at indsamle indkommende anmodninger i en kø og beslutte det rigtige øjeblik for at skylle dem som en enkelt batch. Denne timing er afgørende - få det rigtigt, og du balancerer gennemstrømning, latens og ressourceforbrug på én gang. 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: Mange højtydende systemer anvender en : de skyller en batch, når enten tidsvinduet W udløber eller køen når størrelse K - uanset hvilken der kommer først. Denne strategi fanger fordelene ved begge metoder, hvilket forbedrer responsiviteten under sparsom trafik, samtidig med at der opretholdes effektive batchstørrelser under topbelastning. hybrid approach På trods af dette involverer batching altid Trafikmønstre, arbejdsbyrdeegenskaber og systembegrænsninger påvirker alle de ideelle indstillinger.At opnå optimal ydeevne kræver ofte overvågning, profilering og dynamisk justering af disse parametre for at matche realtidsforhold. tunable parameters and trade-offs CocoIndex’ tilgang Framework niveau: Adaptiv, knob-fri CocoIndex implementerer a Den tilpasser sig automatisk til den indgående forespørgselsbelastning. simple and natural batching mechanism Kontinuerlig kø: Mens den aktuelle batch behandles på enheden (f.eks. GPU), behandles ingen nye indgående anmodninger med det samme. Automatisk batchvindue: Når den aktuelle batch er færdig, tager CocoIndex straks alle anmodninger, der er akkumuleret i køen og behandler dem som den næste batch. Adaptiv batchning: Der er ingen timere, ingen faste batchstørrelser og ingen forudkonfigurerede tærskler. Størrelsen på hver batch tilpasser sig naturligt den trafik, der ankom under den foregående batchs servicetid. Høje trafikperioder producerer automatisk større batcher, hvilket maksimerer GPU-udnyttelsen. CocoIndex’s batchmekanisme er Det behandler kontinuerligt anmodninger i partier, samtidig med at batchstørrelsen kan afspejle efterspørgsel i realtid, hvilket opnår høj gennemstrømning uden at kræve manuel tuning eller kompleks heuristik. In essence, self-tuning Hvorfor er dette godt? Lav latens, når der er få anmodninger: Med få anmodninger er batcherne små (ofte størrelse 1), så du kører effektivt ved næsten enkeltopkaldslatens. Høj gennemstrømning, når der er travlt: Når trafikken stiger, akkumuleres der flere forespørgsler under batchen i flyvningen, så den næste batch er større - udnyttelsen stiger automatisk. Ingen tuning: Du behøver ikke at justere W eller K. Systemet tilpasser sig dit trafikmønster efter design. Function-level batching: packing the batch intelligently Funktionsniveau batching: Pak batch intelligent På funktionsniveau giver CocoIndex hver funktion mulighed for at håndtere batchvinduet – alle køforespørgsler på det tidspunkt, hvor det foregående batch slutter – på den mest effektive og sikre måde for sin specifikke model eller bibliotek. Det giver maksimal fleksibilitet og ydeevne. how it’s processed is up to the function Tag den Det underliggende sætnings-transformatorbibliotek kan acceptere batcher af vilkårlig længde, men internt deler det dem op i (Standardstørrelse: 32) for at sikre, at hver enkelt passer komfortabelt ind i enhedens hukommelse, samtidig med at GPU-kernelerne holdes i deres optimale "søde sted." SentenceTransformerEmbed micro-batches Batching handler ikke kun om at indsætte data i hukommelsen - det handler også om at minimere spildt beregning. , der gør det muligt for GPU'en at udføre ensartede, højtydende kerneler. Dette betyder dog, at korte sekvenser betaler prisen for den længste sekvens i batchen. For eksempel resulterer blanding af 64-token- og 256-token-elementer i, at 64-token-elementer behandles ~4x dyrere end nødvendigt. og dannelse af mikro-batterier af omtrent samme længde, hvilket reducerer padding overhead og holder GPU-udnyttelsen høj. pad every sequence in a batch to the length of the longest sequence sorting requests by token count Andre funktioner kan anvende deres egne strategier: nogle kan blot videresende den fulde batch til backend, mens andre kan implementere CocoIndex forbliver agnostisk over for metoden – dets ansvar er at , hvilket giver hver funktion fuld kontrol over, hvordan man maksimerer gennemstrømningen og minimerer overhead. custom packing schemes deliver the batch window efficiently and without delay Dette design balancerer : rammen håndterer orkestrering af batchning, mens funktionerne selv optimerer for hukommelse, beregning og kerneffektivitet - sikrer høj gennemstrømning på tværs af forskellige arbejdsbelastninger uden at tvinge en one-size-fits-all-løsning. simplicity, flexibility, and performance Conclusion Konklusionen Batching er en af de mest effektive strategier til acceleration af beregningsarbejdsbelastninger. gør det muligt og Batching omdanner, hvad der ville være mange små, ineffektive beregninger til færre, meget optimerede operationer. amortizing fixed overhead across multiple items larger, more efficient GPU operations minimizing data transfer CocoIndex gør batching Flere indbyggede funktioner udnytter allerede batching under kappen, og brugerdefinerede funktioner kan vedtage det med en simpel Dette fjerner kompleksiteten ved manuelt at styre køer, timere eller batchstørrelser, så udviklere kan fokusere på deres modeller og applikationer. effortless and automatic batching=True Fordelene ved batching er mest udtalt, når , såsom med mindre modeller eller lette operationer. Batching er også mest effektiv, når den underliggende API eller bibliotek , da delvis support kan begrænse gevinster - for eksempel viser nogle biblioteker som Ollama kun beskedne forbedringer under batching. fixed overhead represents a significant portion of total computation fully supports batched operations Kort sagt, batching er en : det maksimerer gennemstrømningen, reducerer forsinkelsen, hvor det betyder noget, og giver hardware mulighed for at operere tæt på sit fulde potentiale - alt sammen samtidig med at udvikleroplevelsen er enkel og forudsigelig. high-leverage optimization Støt os ved at give CocoIndex en ⭐ Star på GitHub og dele det med dit fællesskab, hvis du finder det nyttigt! Støt os ved at give CocoIndex en ⭐ Star på GitHub og dele det med dit fællesskab, hvis du finder det nyttigt! af Github