De la investigación a la producción: acelera los LLMs de OSS con EAGLE-3 en Vertex

Resumen: La decodificación especulativa mejora la inferencia de los LLMs, pero los métodos tradicionales requieren un modelo de borrador independiente e ineficiente. Vertex AI utiliza EAGLE-3, que añade un pequeño borrador (entre el 2 y el 5% del modelo de destino) a las capas internas, lo que simplifica el entrenamiento y consigue una aceleración de la decodificación de entre 2 y 3 veces. En esta entrada se describe nuestro flujo de trabajo para limpiar datos, crear inserciones, entrenar y publicar EAGLE-3 con SGLang en Vertex AI a gran escala.
Tiempo de lectura: 10 minutos
Para quienes trabajan con LLMs, el cuello de botella de un token a la vez es un problema habitual. La generación autoregresiva estándar es inherentemente secuencial. Esto crea un proceso clásico limitado por la memoria que limita la velocidad no por el cálculo, sino por el tiempo necesario para leer pesos de modelos masivos de la memoria en cada paso, lo que provoca que los núcleos de la GPU no se utilicen lo suficiente.

La solución es el decodificador especulativo. Esta técnica de optimización acelera el proceso lento y secuencial de tu LLM grande (el modelo de destino) que genera un token a la vez, ya que introduce un mecanismo de borrador.

Este mecanismo de borrador propone rápidamente varios tokens siguientes a la vez. A continuación, el modelo de destino grande verifica estas propuestas en un solo lote paralelo. Acepta el prefijo más largo que coincida con sus propias predicciones y continúa la generación a partir de ese nuevo punto.

Sin embargo, no todos los mecanismos de borrador son iguales. El enfoque clásico de borrador y objetivo usa un modelo de LLM independiente y más pequeño como borrador, lo que significa que tienes que alojar y gestionar más recursos de servicio, lo que conlleva costes adicionales.

Diagrama de flujo que muestra un ejemplo en el que se usa el enfoque de borrador y objetivo. La petición "San Francisco es" se divide en dos pasos: 1. El modelo de borrador genera una cadena secuencial de tokens (los tokens son "a", "city" e "in"), y 2. El modelo de destino verifica y selecciona los tokens de borrador esperados (los tokens son "a", "city" e "in", y el modelo rechaza el token "in"). De lo contrario, genera tokens nuevos (los tokens son "a", "city" y "known"). Los resultados de los dos pasos convergen en el resultado final "San Francisco es una ciudad conocida".

Haz clic para ampliar la imagen

Aquí es donde entra en juego EAGLE-3 (Extrapolative Attention Guided LEarning). EAGLE-3 es un enfoque más avanzado. En lugar de un modelo completamente independiente, se adjunta un "encabezado de borrador" extremadamente ligero (solo entre el 2 y el 5% del tamaño del modelo de destino) directamente a sus capas internas. Este encabezado funciona tanto a nivel de función como de token, ingiriendo funciones de los estados ocultos del modelo de destino para extrapolar y predecir un árbol de tokens futuros.

¿Cuál es el resultado? Todas las ventajas de la decodificación especulativa, pero sin la sobrecarga de entrenar y ejecutar un segundo modelo.

El enfoque de EAGLE-3 es mucho más eficiente que la compleja tarea de entrenar y mantener un borrador de modelo independiente con miles de millones de parámetros, que requiere muchos recursos. Solo entrenas un "borrador" ligero, que ocupa entre el 2% y el 5% del tamaño del modelo de destino, y que se añade a tu modelo. Este proceso de entrenamiento más sencillo y eficiente ofrece una mejora significativa del rendimiento de decodificación de entre 2 y 3 veces para modelos como Llama 70B (en función de los tipos de carga de trabajo, como las conversaciones de varias interacciones, el código o el contexto largo, entre otros).

Diagrama de flujo que muestra un ejemplo de uso del enfoque EAGLE-3. La petición "San
Francisco is" se dirige a un modelo de destino con EAGLE-3 que contiene varias
capas. La capa de inserción se introduce en el decodificador y en las capas ocultas, que a su vez se introducen en el encabezado de EAGLE-3. La capa de encabezado de EAGLE-3 se divide en dos cadenas de tokens ("a", "city", "in" y "a", "city", "known") que se dirigen de nuevo a la capa de inserción. Los tokens validados "a", "city" y "known" se insertan en el resultado final: "San Francisco is a city known".

Haz clic para ampliar la imagen

Sin embargo, pasar de este enfoque optimizado de EAGLE-3 de un documento a un servicio en la nube escalado y listo para producción es un verdadero reto de ingeniería. En esta publicación, compartimos nuestro proceso técnico, los principales retos y las valiosas lecciones que hemos aprendido por el camino.

Reto 1: Preparar los datos

Es necesario entrenar el modelo EAGLE-3. El primer paso es obtener un conjunto de datos público genérico. La mayoría de estos conjuntos de datos presentan dificultades, como las siguientes:

  • Términos de Uso estrictos: estos conjuntos de datos se generan mediante modelos que no permiten usarlos para desarrollar modelos que compitan con los proveedores originales.
  • Contaminación con IPI: algunos de estos conjuntos de datos contienen una cantidad significativa de IPI, como nombres, ubicaciones e incluso identificadores financieros.
  • Calidad no garantizada: algunos conjuntos de datos solo funcionan bien en casos prácticos generales de demostración, pero no en cargas de trabajo especializadas de clientes reales.

No se puede usar esta información tal cual.

Lección 1: Crear un flujo de procesamiento para generar datos sintéticos

Una solución es crear una canalización de generación de datos sintéticos. En función de los casos prácticos de nuestros clientes, seleccionamos el conjunto de datos adecuado, que no solo es de buena calidad, sino que también se adapta mejor al tráfico de producción de nuestros clientes para diferentes cargas de trabajo. Después, puedes extraer solo las peticiones de los usuarios de estos conjuntos de datos y aplicar un filtrado riguroso de DLP (prevención de la pérdida de datos) e IPI. Estas peticiones limpias aplican una plantilla de chat, las tokenizan y, a continuación, se pueden introducir en el modelo de destino (por ejemplo, Llama 3.3 70B) para recoger sus respuestas.

Este enfoque proporciona datos generados por el objetivo que no solo son conformes y limpios, sino que también se ajustan bien a la distribución de salida real del modelo. Es ideal para entrenar la cabeza del borrador.

Diagrama de flujo lineal que muestra el flujo de procesamiento de generación de datos sintéticos. Las peticiones de los usuarios se extraen de datos brutos, que se limpian y se filtran. Las peticiones limpias se tokenizan mediante plantillas de chat y tokenizadores. Las peticiones tokenizadas se usan para generar respuestas junto con un modelo de destino, que devuelve los tokens de respuesta generados.

Haz clic para ampliar la imagen

Reto 2: diseñar el flujo de procesamiento de entrenamiento

Otra decisión clave es cómo proporcionar los datos de entrenamiento al encabezado EAGLE-3. Tienes dos opciones: entrenamiento online, donde las inserciones se generan sobre la marcha, y entrenamiento offline, donde las inserciones se generan antes del entrenamiento.

En nuestro caso, hemos elegido un enfoque de entrenamiento sin conexión porque requiere mucho menos hardware que el entrenamiento online. Este proceso implica precalcular todas las características y las inserciones antes de entrenar el modelo EAGLE-3. Los guardamos en GCS y se convierten en los datos de entrenamiento de nuestro ligero encabezado EAGLE-3. Una vez que tengas los datos, el entrenamiento será rápido. Dado el tamaño reducido del cabezal de EAGLE-3, la preparación inicial con nuestro conjunto de datos original requirió aproximadamente un día en un solo host. Sin embargo, a medida que hemos ampliado nuestro conjunto de datos, los tiempos de entrenamiento han aumentado proporcionalmente y ahora se prolongan durante varios días.

Diagrama de flujo lineal que representa el flujo de procesamiento de entrenamiento. Las solicitudes tokenizadas y los tokens de respuesta generados se usan para generar características e inserciones con el modelo de destino, que devuelve tokens y características. Estos tokens y funciones se usan para entrenar el encabezado de EAGLE con el modelo de borrador, que devuelve el encabezado de EAGLE entrenado.

Haz clic para ampliar la imagen

Este proceso nos ha enseñado dos lecciones importantes que debes tener en cuenta.

Lección 2: Las plantillas de chat no son opcionales

Durante el entrenamiento del modelo ajustado para instrucciones, descubrimos que el rendimiento de EAGLE-3 puede variar mucho si la plantilla de chat no es la adecuada. Debes aplicar la plantilla de chat específica del modelo de destino (por ejemplo, Llama 3) antes de generar las funciones y las inserciones. Si solo concatenas texto sin formato, las inserciones serán incorrectas y tu encabezado aprenderá a predecir la distribución incorrecta.

Lección 3: Cuidado con la máscara

Durante el entrenamiento, se proporcionan al modelo las representaciones de la petición y de la respuesta. Sin embargo, el encabezado de EAGLE-3 solo debería aprender a predecir la representación de la respuesta. Debes enmascarar manualmente la parte de la petición en tu función de pérdida. Si no lo haces, el encabezado desperdiciará capacidad aprendiendo a predecir la petición que ya se le ha dado y el rendimiento se verá afectado.

Diagrama que muestra un ejemplo de máscara de pérdida. La frase "San Francisco is a city
known" se divide en dos partes: los tokens que ya se conocen ("San",
"Francisco", "is"), que se representan con ceros en la máscara de pérdida, y los tokens
que se deben predecir ("a", "city", "known"), que se representan con unos
en la máscara de pérdida.

Haz clic para ampliar la imagen

Reto 3: publicación y escalado

Con un cabezal EAGLE-3 entrenado, pasamos a la fase de servicio. Esta fase supuso importantes retos de escalabilidad. Estas son las principales conclusiones.

Lección 4: Tu framework de servicio es clave

Gracias a la estrecha colaboración con el equipo de SGLang, hemos podido lanzar EAGLE-3 en producción con el mejor rendimiento. El motivo técnico es que SGLang implementa un kernel de atención de árbol crucial. Este kernel especial es crucial porque EAGLE-3 genera un "árbol de borrador" de posibilidades (no solo una cadena simple) y el kernel de SGLang se ha diseñado específicamente para verificar todas esas rutas ramificadas en paralelo en un solo paso. Si no lo haces, estarás desaprovechando el rendimiento.

Lección 5: No dejes que tu CPU limite el rendimiento de tu GPU

Incluso después de acelerar tu LLM con EAGLE-3, puedes encontrarte con otro obstáculo en cuanto al rendimiento: la CPU. Cuando tus GPUs ejecuten la inferencia de LLMs, el software no optimizado perderá una gran cantidad de tiempo en la sobrecarga de la CPU, como el lanzamiento del kernel y el registro de metadatos. En un programador síncrono normal, la GPU ejecuta un paso (como Borrador) y, a continuación, se queda inactiva mientras la CPU hace sus tareas de gestión y lanza el siguiente paso Verificar. Estas burbujas de sincronización se acumulan y desperdician enormes cantidades de tiempo valioso de la GPU.

Ejemplo de un programador síncrono normal. Cada paso se presenta de forma secuencial
con el tiempo empleado en cada uno: Borrador (10 ms), Verificar (15 ms),
Ampliar (10 ms), Sincronizar CPU (5 ms), Borrador (10 ms) y Verificar (15 ms). El paso Sincronizar CPU
se destaca con un color diferente para indicar el tiempo no optimizado dedicado a la sobrecarga de la CPU.

Haz clic para ampliar la imagen

Para resolverlo, usamos el programador de superposición sin sobrecarga de SGLang. Este programador se ha diseñado específicamente para el flujo de trabajo de varios pasos de la decodificación especulativa: Borrador -> Verificar -> Ampliar borrador . La clave es superponer los cálculos. Mientras la GPU está ocupada ejecutando el paso Verificar actual, la CPU ya está trabajando en paralelo para iniciar los kernels de los siguientes pasos Borrador y Ampliar borrador . De esta forma, se elimina el tiempo de inactividad, ya que se asegura de que la GPU siempre tenga lista la siguiente tarea. Para ello, se usa una FutureMap, una estructura de datos inteligente que permite a la CPU preparar el siguiente lote mientras la GPU sigue trabajando.

Ejemplo de un programador de superposición sin sobrecarga. La mayoría de los pasos y los tiempos son idénticos a los de la imagen anterior, pero, en lugar del paso Sincronizar CPU, hay un paso más pequeño que indica que los pasos de escritura y lectura se producen simultáneamente y que cada uno tarda 0,1 ms en completarse.

Haz clic para ampliar la imagen

Al eliminar este consumo de CPU, el programador de superposición nos ofrece una mejora de la velocidad del 10 al 20 % en general. Esto demuestra que un buen modelo es solo la mitad del trabajo; necesitas un tiempo de ejecución que esté a la altura.

Resultados de comparativas

Después de este viaje, ¿ha merecido la pena? Desde luego.

Hemos comparado nuestro modelo EAGLE-3 entrenado con la base de referencia no especulativa usando SGLang con Llama 4 Scout 17B Instruct. Nuestras comparativas muestran que la latencia de decodificación se reduce entre 2 y 3 veces, y que el rendimiento aumenta significativamente en función de los tipos de carga de trabajo.

Consulta todos los detalles y haz la prueba tú mismo con nuestro cuaderno completo.

Métrica 1: tiempo medio por token de salida (TPOT)

Gráfico de líneas que representa el tiempo por token de salida (TPOT) frente a la simultaneidad, con la nota de que cuanto menor sea el valor, mejor. El eje Y representa el TPOT medio en milisegundos, mientras que el eje X representa la simultaneidad máxima. En el gráfico se muestran dos líneas que representan los resultados de referencia y los resultados de EAGLE. Los resultados de referencia son siempre superiores a los de EAGLE. Ambas líneas empiezan cerca de la esquina inferior izquierda del gráfico y tienden hacia arriba a medida que aumenta la simultaneidad máxima. Los resultados de referencia tienen un pico más pronunciado hacia el borde del gráfico.

Haz clic para ampliar la imagen

En este gráfico se muestra la mejor latencia de EAGLE-3. El gráfico Tiempo por token de salida (TPOT) muestra que el modelo acelerado por EAGLE-3 (línea verde) consigue de forma constante una latencia inferior (más rápida) que la base de referencia (línea azul) en todos los niveles de simultaneidad probados.

Métrica 2: Rendimiento de salida

Gráfico de líneas que representa el rendimiento de los tokens frente a la simultaneidad, con la nota de que cuanto más alto sea el valor, mejor. El eje Y representa el rendimiento en tokens por segundo, mientras que el eje X representa la simultaneidad máxima. El gráfico muestra dos líneas que representan los resultados de referencia y los resultados de EAGLE. Los resultados de EAGLE
obtienen una puntuación sistemáticamente superior a los resultados de referencia. Ambas líneas empiezan en la esquina inferior izquierda y tienden hacia arriba a medida que aumenta la simultaneidad máxima. Los resultados de EAGLE tienden a aumentar de forma más suave y significativa que los resultados de referencia.

Haz clic para ampliar la imagen

Este gráfico destaca aún más la ventaja de EAGLE-3 en cuanto al rendimiento. El gráfico de latencia de tokens frente a simultaneidad muestra claramente que el modelo acelerado por EAGLE-3 (línea verde) supera de forma constante y sustancial al modelo de referencia (línea azul).

Aunque se pueden hacer observaciones similares en modelos más grandes, cabe destacar que se puede observar un aumento del tiempo hasta el primer token (TTFT) en comparación con otras métricas de rendimiento. Además, el rendimiento varía en función de la tarea, como se muestra en los siguientes ejemplos:

Gráfico de barras que compara las velocidades de salida de las categorías entre el modelo de referencia y el modelo acelerado EAGLE-3 entrenado con Vertex AI. En todas las categorías (código, chat, contexto largo, matemáticas y multilingüe), la velocidad de salida del modelo EAGLE-3 es drásticamente superior a la del modelo de referencia.

Haz clic para ampliar la imagen

Conclusión: ahora te toca a ti

EAGLE-3 no es solo un concepto de investigación, sino un patrón listo para producción que puede ofrecer una mejora tangible del doble de velocidad en la latencia de decodificación. Pero para que funcione a gran escala, se necesita un esfuerzo de ingeniería considerable. Para implementar esta tecnología de forma fiable para tus usuarios, debes hacer lo siguiente:

  1. Crea un flujo de procesamiento de datos sintéticos que cumpla los requisitos.
  2. Gestionar correctamente las plantillas de chat y las máscaras de pérdida, y entrenar el modelo con un conjunto de datos a gran escala.

En Vertex AI, ya hemos optimizado todo este proceso para ti, proporcionando un contenedor y una infraestructura optimizados diseñados para escalar tus aplicaciones basadas en LLMs. Para empezar, consulta los siguientes recursos:

Gracias por leer

Estaremos encantados de recibir tus comentarios y preguntas sobre Vertex AI.

Agradecimientos

Queremos expresar nuestro más sincero agradecimiento al equipo de SGLang, en concreto a Ying Sheng, Lianmin Zheng, Yineng Zhang, Xinyuan Tong y Liangsheng Yin, así como al equipo de SGLang/SpecForge, en concreto a Shenggui Li y Yikai Zhu, por su inestimable ayuda a lo largo de este proyecto. Su generosa ayuda y sus profundos conocimientos técnicos fueron fundamentales para el éxito de este proyecto.