Ten chamadas LLM masivas no seu fluxo de transformación de datos? Pode ser capaz de axudar. É alimentado por un motor Rust de alto rendemento e agora soporta batching adaptativo fóra da caixa. Isto mellorou o Throughput por ~5× (≈80% tempo de execución máis rápido) para fluxos de traballo nativos de IA. E o mellor de todo, non precisa cambiar ningún código porque o batching ocorre automaticamente, adaptando ao seu tráfico e mantendo as GPU totalmente utilizadas. CocoIndex Aquí está o que aprendemos ao construír o soporte de lote adaptativo en Cocoindex. Pero primeiro, imos responder a algunhas preguntas que poden estar no seu mixnd. Por que o batching acelera o procesamento? 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: Cando os elementos son procesados individualmente, o overhead fixo incorre repetidamente para cada elemento, o que pode dominar rapidamente o tempo de execución total, especialmente cando o cálculo por elemento é relativamente pequeno. Pola contra, o procesamento de varios elementos xuntos en lotes reduce significativamente o impacto por elemento deste overhead. Batching permite que os custos fixos sexan amortizados en moitos elementos, ao tempo que tamén permite optimizacións de hardware e software que melloren a eficiencia do traballo dependente de datos. Estas optimizacións inclúen unha utilización máis eficaz de pipelines de GPU, mellor utilización de caché e menos lanzamentos de núcleo, todo o que contribúe a unha maior capacidade de transmisión e menor latencia global. O batching mellora significativamente o rendemento optimizando tanto a eficiencia computacional como a utilización de recursos. 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: En combinación, estes efectos conducen a melloras de orde de magnitude na capacidade de transmisión. O batching transforma moitas computacións pequenas e ineficientes en operacións grandes e altamente optimizadas que aproveitan plenamente as capacidades de hardware modernas. Para as cargas de traballo de IA -incluíndo grandes modelos de linguaxe, visión de ordenador e procesamento de datos en tempo real- o batching non é só unha optimización; é esencial para lograr un rendemento escalable e de nivel de produción. Como é o batching para o código normal de Python Código non batchado - sinxelo pero menos eficiente A forma máis natural de organizar unha tubaxe é procesar os datos por peza, por exemplo, un ciclo de dúas capas como este: 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) Isto é fácil de ler e razoar: cada peza flúe en liña recta a través de múltiples pasos. Batching manualmente - máis eficiente pero complicado Podes aceleralo batchando, pero mesmo a versión máis sinxela "só batche todo unha vez" fai que o código sexa significativamente máis complicado: # 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) Ademais, batendo todo dunha vez xeralmente non é ideal porque os próximos pasos só poden comezar despois de que este paso se realice para todos os datos. Soporte de Batching de CocoIndex CocoIndex ponte a brecha e permítelle obter o mellor de ambos os mundos - manter a simplicidade do seu código seguindo o fluxo natural, mentres obtén a eficiencia do batch proporcionado polo tempo de execución de CocoIndex. Xa activamos o soporte de lotes para as seguintes funcións incorporadas: Embedtexto TransformaciónsEditar ColecciónsEditar CurtametraxeEditar Non cambia o lume. Your existing code will just work without any change – still following the natural flow, while enjoying the efficiency of batching. Para funcións personalizadas, permitir o batching é tan sinxelo como: Set batching=True no decorador de funcións personalizadas. Cambiar os argumentos e devolver o tipo á lista. Por exemplo, se desexa crear unha función personalizada que solicite unha API para crear miniaturas para imaxes. @cocoindex.op.function(batching=True) def make_image_thumbnail(self, args: list[bytes]) -> list[bytes]: ... Vexa a documentación do batch para máis detalles. Vexa a documentación do batch para máis detalles. Como funciona o CocoIndex Enfoques comúns O batching funciona recollendo as solicitudes de entrada nunha cola e decidindo o momento correcto para borralas como un único lote.Que o tempo é crucial - obtelo ben, e equilibra o rendemento, a latencia e o uso de recursos de unha vez. 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: Moitos sistemas de alto rendemento adoptan a : limpan un lote cando expira a xanela de tempo W ou a cola alcanza o tamaño K, o que vén primeiro.Esta estratexia capta os beneficios de ambos os métodos, mellorando a capacidade de resposta durante o tráfico escaso mantendo tamaños de lote eficientes durante a carga máxima. hybrid approach A pesar diso, o batismo sempre implica Os patróns de tráfico, as características da carga de traballo e as restricións do sistema inflúen nas configuracións ideais.O logro dun rendemento óptimo require a miúdo o seguimento, a elaboración de perfís e o axuste dinámico destes parámetros para que se axusten ás condicións en tempo real. tunable parameters and trade-offs O enfoque de CocoIndex Nivel de marco: adaptativo, libre de botóns CocoIndex implementa a que se adapta automaticamente á carga de solicitude de entrada. O proceso funciona do seguinte xeito: simple and natural batching mechanism A cola continua: Mentres o lote actual está a ser procesado no dispositivo (por exemplo, GPU), as novas solicitudes de entrada non son procesadas inmediatamente. Finestra de lote automático: Cando o lote actual se completa, CocoIndex inmediatamente toma todas as solicitudes que se acumularon na cola e trátalas como o próximo lote. Batching adaptativo: Non hai timers, non hai tamaños de lote fixos e non hai limiares preconfigurados. O tamaño de cada lote adapta naturalmente ao tráfico que chegou durante o tempo de servizo do lote anterior. Os períodos de tráfico altos producen automaticamente lotes máis grandes, maximizando a utilización da GPU. Os períodos de tráfico baixo producen lotes máis pequenos, minimizando a latencia para as solicitudes temperás. O mecanismo de batido de CocoIndex é Procesa continuamente as solicitudes en lotes, permitindo que o tamaño do lote reflicta a demanda en tempo real, logrando un alto rendemento sen necesidade de axuste manual ou heurística complexa. In essence, self-tuning Por que isto é bo? Baixa latencia cando é escasa: Con poucas solicitudes, os lotes son pequenos (a miúdo tamaño 1), polo que se está executando efectivamente a unha latencia de chamada case única. Alta capacidade de paso cando está ocupado: cando o tráfico sobe, máis solicitudes acumúlanse durante o lote de voo, polo que o seguinte lote é máis grande - a utilización aumenta automaticamente. Non hai axuste: non é necesario axustar W ou K. O sistema se adapta ao seu patrón de tráfico por deseño. Function-level batching: packing the batch intelligently Batching a nivel de función: embalar o lote de forma intelixente A nivel de función, CocoIndex habilita a cada función para xestionar a fiestra do lote -todas as solicitudes de cola no momento en que o lote anterior remata- da forma máis eficiente e segura para o seu modelo ou biblioteca específica. Permite a máxima flexibilidade e rendemento. how it’s processed is up to the function Toma o A biblioteca de transformadores de sentenza subxacente pode aceptar lotes de lonxitude arbitraria, pero internamente divídese en (Tamaño predeterminado: 32) para asegurar que cada un se encaixa cómodamente na memoria do dispositivo mentres mantén os núcleos de GPU no seu "punto doce" óptimo. SentenceTransformerEmbed micro-batches O batching non se trata só de incorporar datos á memoria - tamén se trata de minimizar a computación desperdiçada. , permitindo que a GPU execute núcleos uniformes e de alto rendemento. Con todo, isto significa que as secuencias curtas pagan o custo da secuencia máis longa do lote. Por exemplo, mesturar elementos de 64 tokens e 256 tokens resulta en que os elementos de 64 tokens son procesados ~4x máis caro do que é necesario. e formando micro-batches de lonxitudes aproximadamente iguais, reducindo o padding e mantendo a utilización da GPU alta. pad every sequence in a batch to the length of the longest sequence sorting requests by token count Outras funcións poden aplicar as súas propias estratexias: algunhas poden simplemente reenviar o lote completo ao backend, mentres que outras poden implementar CocoIndex permanece agnóstico ao método - a súa responsabilidade é , dándolle a cada función o control completo sobre como maximizar o rendemento e minimizar o exceso. custom packing schemes deliver the batch window efficiently and without delay Este deseño equilibra O framework xestiona a orquestración do batch, mentres que as propias funcións optimízanse para a memoria, a computación e a eficiencia do núcleo, garantindo un alto rendemento a través de diversas cargas de traballo sen forzar unha solución de tamaño único. simplicity, flexibility, and performance Conclusion Conclusión Batching é unha das estratexias máis eficaces para acelerar as cargas de traballo computacionais. que permiten , e O batching transforma o que sería moitas pequenas e ineficientes computacións en menos operacións altamente optimizadas. amortizing fixed overhead across multiple items larger, more efficient GPU operations minimizing data transfer CocoIndex fai batching Varias funcións incorporadas xa aproveitan o batch baixo o capó, e as funcións personalizadas poden adoptalo cun simple Isto elimina a complexidade de xestionar manualmente filas, temporizadores ou tamaños de lote, permitindo aos desenvolvedores centrarse nos seus modelos e aplicacións. effortless and automatic batching=True Os beneficios de rendemento do batching son máis pronunciados cando , como con modelos máis pequenos ou operacións lixeiras. Batching tamén é máis eficaz cando a API ou biblioteca subxacente , xa que o soporte parcial pode limitar as ganancias - por exemplo, algunhas bibliotecas como Ollama mostran só melloras modestas durante o batch. fixed overhead represents a significant portion of total computation fully supports batched operations En resumo, o boicot é unha : maximiza a capacidade de transmisión, reduce a latencia onde importa e permite que o hardware funcione preto do seu pleno potencial - todo mantendo a experiencia do desenvolvedor simple e previsible. high-leverage optimization Apoia-nos dando a CocoIndex unha estrela en GitHub e compartilo coa túa comunidade se o consideras útil! Axúdanos dando Comparte coa túa comunidade se o consideras útil. CocoIndex a ⭐ Star on GitHub GitHub