¿Tienes llamadas LLM masivas en tu flujo de transformación de datos? Es alimentado por un motor Rust de alto rendimiento y ahora soporta el batchamiento adaptativo fuera de la caja. Esto ha mejorado el Throughput por ~5× (≈80% más rápido) para los flujos de trabajo nativos de IA. Y lo mejor de todo, no necesita cambiar ningún código porque el batchamiento ocurre automáticamente, adaptándose a su tráfico y manteniendo las GPU totalmente utilizadas. CocoIndex Aquí está lo que aprendimos al construir el soporte de batch adaptativo en Cocoindex. Pero primero, vamos a responder algunas preguntas que podrían estar en su mixnd. ¿Por qué el batching acelera el procesamiento? 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: Cuando los elementos se procesan individualmente, se incurre una sobrecarga fija repetidamente para cada elemento, lo que puede dominar rápidamente el tiempo de ejecución total, especialmente cuando el cálculo por elemento es relativamente pequeño. Por el contrario, el procesamiento de varios elementos juntos en lotes reduce significativamente el impacto por elemento de esta sobrecarga. El batching permite que los costes fijos se amortiguen en muchos elementos, al tiempo que también permite optimizaciones de hardware y software que mejoren la eficiencia del trabajo dependiente de los datos. Estas optimizaciones incluyen una utilización más efectiva de las tuberías de GPU, una mejor utilización del caché y menos lanzamientos de núcleo, todo lo cual contribuye a una mayor transmisión y una latencia general más baja. El batching mejora significativamente el rendimiento al optimizar tanto la eficiencia computacional como la utilización de los 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, estos efectos conducen a mejoras de gran magnitud en el rendimiento.El batching transforma muchos cálculos pequeños e ineficientes en operaciones grandes y altamente optimizadas que aprovechan plenamente las capacidades de hardware modernas.Para las cargas de trabajo de IA —incluyendo grandes modelos de lenguaje, visión de ordenador y procesamiento de datos en tiempo real— el batching no es sólo una optimización; es esencial para lograr un rendimiento escalable y de nivel de producción. Cómo se ve el batch para el código normal de Python Código no batchado – simple pero menos eficiente La forma más natural de organizar una tubería es procesar datos pieza por pieza. Por ejemplo, un ciclo de dos 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) Esto es fácil de leer y razonar: cada trozo fluye recto a través de múltiples pasos. Batir manualmente – más eficiente pero complicado Puedes acelerarlo mediante el batch, pero incluso la versión más simple de "sólo batche todo una vez" hace que el código sea significativamente más 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) Además, batir todo de una vez no suele ser ideal porque los próximos pasos solo pueden comenzar después de que este paso se haya completado para todos los datos. Soporte de Batching de CocoIndex CocoIndex rompe la brecha y le permite obtener lo mejor de ambos mundos - mantener la simplicidad de su código siguiendo el flujo natural, al tiempo que obtiene la eficiencia de los lotes proporcionados por el tiempo de ejecución de CocoIndex. Ya hemos activado el soporte de lotes para las siguientes funciones integradas: EmbajadorTexto Transformación de sentencia Colapso de imagen EncuadernaciónBiblioteca No cambia el fuego. Your existing code will just work without any change – still following the natural flow, while enjoying the efficiency of batching. Para las funciones personalizadas, habilitar el batch es tan simple como: Set batching=True en el decorador de funciones personalizadas. Cambiar los argumentos y devolver el tipo a la lista. Por ejemplo, si desea crear una función personalizada que llame a una API para crear miniaturas para imágenes. @cocoindex.op.function(batching=True) def make_image_thumbnail(self, args: list[bytes]) -> list[bytes]: ... Consulte la documentación del batch para más detalles. Consulte la documentación del batch para más detalles. Cómo CocoIndex Batches Enfoques comunes El batching funciona recopilando las solicitudes entrantes en una cola y decidiendo el momento correcto para limpiarlas como un solo lote.Este momento es crucial: hazlo bien, y equilibras el rendimiento, la latencia y el uso de los recursos a la 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: Muchos sistemas de alto rendimiento adoptan una : limpian un lote cuando expira la ventana de tiempo W o la cola alcanza el tamaño K —cualquiera que llegue primero.Esta estrategia captura los beneficios de ambos métodos, mejorando la capacidad de respuesta durante el tráfico escaso mientras se mantienen tamaños de lote eficientes durante la carga máxima. hybrid approach A pesar de esto, el batch siempre implica Los patrones de tráfico, las características de la carga de trabajo y las restricciones del sistema influyen en los ajustes ideales.Alcanzar el rendimiento óptimo a menudo requiere el monitoreo, el perfil y el ajuste dinámico de estos parámetros para alinearse con las condiciones en tiempo real. tunable parameters and trade-offs El enfoque de CocoIndex Nivel de marco: adaptativo, libre de botones CocoIndex implementa a que se adapta automáticamente a la carga de solicitud de entrada. El proceso funciona de la siguiente manera: simple and natural batching mechanism La cola continua: Mientras el lote actual está siendo procesado en el dispositivo (por ejemplo, la GPU), las nuevas solicitudes entrantes no se procesan inmediatamente. Ventana de lote automática: Cuando el lote actual se completa, CocoIndex inmediatamente toma todas las solicitudes que se han acumulado en la cola y las trata como el próximo lote. Batch adaptativo: No hay temporizadores, no hay tamaños de batch fijos y no hay umbrales preconfigurados.El tamaño de cada batch se adapta naturalmente al tráfico que llegó durante el tiempo de servicio del batch anterior.Los períodos de alto tráfico producen automáticamente lotes más grandes, maximizando la utilización de la GPU.Los períodos de bajo tráfico producen lotes más pequeños, minimizando la latencia para las solicitudes tempranas. El mecanismo de batch de CocoIndex es Procesa continuamente las solicitudes en lotes, permitiendo al mismo tiempo que el tamaño del lote refleje la demanda en tiempo real, logrando un alto rendimiento sin necesidad de ajuste manual o heurística compleja. In essence, self-tuning ¿Por qué es bueno esto? Baja latencia cuando es escasa: con pocas solicitudes, los lotes son pequeños (a menudo tamaño 1), por lo que se ejecuta de manera efectiva a la latencia de casi una sola llamada. Alto rendimiento cuando está ocupado: Cuando el tráfico aumenta, más solicitudes se acumulan durante el lote en vuelo, por lo que el próximo lote es más grande - la utilización aumenta automáticamente. Sin ajuste: No necesita ajustar W o K. El sistema se adapta a su patrón de tráfico por diseño. Function-level batching: packing the batch intelligently Batching a nivel de función: empacar el lote de manera inteligente En el nivel de la función, CocoIndex habilita a cada función para manejar la ventana del lote —todas las solicitudes de cola en el momento en que el lote anterior finaliza— de la manera más eficiente y segura para su modelo o biblioteca específica. Permite la máxima flexibilidad y rendimiento. how it’s processed is up to the function Tome el La biblioteca de transformadores de sentencia subyacente puede aceptar lotes de longitud arbitraria, pero internamente los divide en (Tamaño predeterminado: 32) para asegurarse de que cada uno se ajuste cómodamente a la memoria del dispositivo mientras mantiene los núcleos de GPU en su "punto dulce" óptimo. SentenceTransformerEmbed micro-batches El batching no se trata sólo de incorporar datos a la memoria, sino también de minimizar la computación desperdiciada. , permitiendo a la GPU ejecutar núcleos uniformes de alto rendimiento. Sin embargo, esto significa que las secuencias cortas pagan el coste de la secuencia más larga en el lote. Por ejemplo, mezclar los elementos de 64 token y 256 token resulta en que los elementos de 64 token se procesan ~4x más caro de lo necesario. y la formación de micro-batch de longitudes aproximadamente iguales, reduciendo la sobrecarga y manteniendo la utilización de la GPU alta. pad every sequence in a batch to the length of the longest sequence sorting requests by token count Otras funciones pueden aplicar sus propias estrategias: algunas pueden simplemente reenviar el lote completo al backend, mientras que otras pueden implementar CocoIndex sigue siendo agnóstico con respecto al método - su responsabilidad es , dando a cada función el control completo sobre cómo maximizar el rendimiento y minimizar la sobrecarga. custom packing schemes deliver the batch window efficiently and without delay Este diseño equilibra El framework gestiona la orquestación del batch, mientras que las propias funciones se optimizan para la memoria, la computación y la eficiencia del núcleo, asegurando un alto rendimiento a través de diversas cargas de trabajo sin forzar una solución de tamaño único. simplicity, flexibility, and performance Conclusion Conclusión El batching es una de las estrategias más eficaces para acelerar las cargas de trabajo computacionales. permitiendo , y , el batching transforma lo que sería muchos cálculos pequeños e ineficientes en menos operaciones altamente optimizadas. amortizing fixed overhead across multiple items larger, more efficient GPU operations minimizing data transfer CocoIndex hace batching Varias funciones incorporadas ya aprovechan el batching bajo el capó, y las funciones personalizadas pueden adoptarlo con un simple Esto elimina la complejidad de administrar manualmente colas, temporizadores o tamaños de lotes, permitiendo a los desarrolladores centrarse en sus modelos y aplicaciones. effortless and automatic batching=True Las ventajas del batching son más pronunciadas cuando , como con modelos más pequeños o operaciones ligeras. Batching también es más eficaz cuando la API o biblioteca subyacente , ya que el soporte parcial puede limitar las ganancias - por ejemplo, algunas bibliotecas como Ollama solo muestran mejoras modestas durante el batch. fixed overhead represents a significant portion of total computation fully supports batched operations En resumen, el batch es un Maximizar el rendimiento, reducir la latencia donde importa, y permitir que el hardware funcione cerca de su pleno potencial, manteniendo la experiencia del desarrollador simple y predecible.CocoIndex abstrae la complejidad, proporcionando los beneficios de lotar automáticamente en diversas cargas de trabajo. high-leverage optimization Apoyarnos al dar a CocoIndex una estrella en GitHub y compartirlo con su comunidad si lo encuentra útil! Apoyarnos al dar a CocoIndex una estrella en GitHub y compartirlo con su comunidad si lo encuentra útil! GitHub