Hugging Face Blog→ original

Hugging Face aceleró la inferencia de LLM un 22% con batching asíncrono

Hugging Face habilitó la asincronía en la inferencia de LLM. En vez de que CPU y GPU trabajen por turnos, ahora operan en paralelo: mientras la GPU calcula un b

Hugging Face aceleró la inferencia de LLM un 22% con batching asíncrono
Fuente: Hugging Face Blog. Collage: Hamidun News.
◐ Escuchar artículo

Hugging Face encontró una forma simple de acelerar la generación de tokens en LLMs en un 22% — simplemente haciendo que la CPU y la GPU funcionen simultáneamente en lugar de esperarse la una a la otra. Esto no requiere reentrenamiento de modelos ni nuevos algoritmos.

Cuál Era el Problema

En el batching sincrónico típico, la CPU prepara datos, luego la GPU los computa, luego la CPU espera los resultados y prepara el siguiente lote. La GPU termina ociosa aproximadamente el 24% del tiempo — mientras la CPU se ocupa del preprocesamiento. Es como una línea de montaje donde en cada paso alguien está mirando el reloj. Incluso si la CPU está funcionando a plena capacidad, es más lenta que el cálculo más simple de la GPU, por lo que la tarjeta gráfica simplemente se sienta y espera nuevos datos. En batching sincrónico, un modelo de 8 mil millones de parámetros con tamaño de lote 32 generó 8K tokens en 300 segundos con actividad de GPU de apenas 76%.

Cómo la Asincronía Resuelve el Problema

La idea es extremadamente simple: ejecutar la CPU y la GPU en paralelo mediante streams CUDA. Se utilizan tres streams independientes — uno para transferir datos a la GPU (H2D), uno para los cálculos reales (Compute) y uno para la transferencia inversa (D2H). Cada stream devuelve el control a la CPU inmediatamente sin bloquearla. Los eventos CUDA se colocan entre los streams — marcadores que garantizan el orden correcto:

  • Stream H2D marca cuándo los datos se cargan en la GPU
  • Stream Compute espera este marcador, computa, coloca el suyo
  • Stream D2H espera a que se complete el cálculo y recupera los resultados

Mientras la GPU está calculando el lote N, la CPU ya está preparando el lote N+1 en un búfer de memoria diferente. Sin espera, trabajan en paralelo.

El Principal Truco de Carry-Over

La complejidad es que cuando una solicitud abarca múltiples lotes, sus tokens de salida del lote N se convierten en la entrada para el lote N+1. Hugging Face resolvió esto con placeholders: al preparar el lote N+1, se colocan ceros donde irán las entradas de tokens futuros, y cuando se completa el lote N, los ceros se reemplazan con valores reales.

"Esto permite que la CPU prepare el siguiente lote sin esperar los resultados del actual", explica Hugging Face.

Todo se mantiene unido con gráficos CUDA con un pool de memoria compartido, lo que incluso ahorra memoria de video.

Los Números Hablan por Sí Solos

Antes de la optimización: GPU activa 76%, generando 8K tokens — 300,6 segundos. Después: GPU activa 99,4%, mismos tokens — 234,5 segundos. Aceleración del 22% — casi el máximo teórico para esta arquitectura (el máximo teórico fue 24%).

Qué Significa Esto

Esto significa que no necesitas GPUs más caras ni reentrenamiento de modelos para mejoras serias de velocidad. El código ya está en la biblioteca Transformers, en la clase `ContinuousBatchingAsyncIOs`. Para las empresas que generan muchos tokens, esto podría ahorrar millones en hardware.

ZK
Hamidun News
Noticias de AI sin ruido. Selección editorial diaria de más de 400 fuentes. Producto de Zhemal Khamidun, Head of AI en Alpina Digital.
¿Qué te parece?
Cargando comentarios…