De la investigación a la producción: Acelera el LLM de OSS con EAGLE-3 en Vertex

TL;DR: La decodificación especulativa potencia la inferencia de los LLM, pero los métodos tradicionales requieren un modelo de borrador independiente e ineficiente. Vertex AI utiliza EAGLE-3, que agrega un pequeño encabezado de borrador (entre el 2% y el 5% del modelo objetivo) a las capas internas, lo que simplifica el entrenamiento y logra una aceleración de la decodificación de entre 2 y 3 veces. En esta publicación, se describe nuestro proceso para la limpieza de datos, la generación de incorporaciones, el entrenamiento y la entrega de 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 desafío conocido. La generación autorregresiva estándar es inherentemente secuencial. Esto crea un proceso clásico vinculado a 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 para cada paso, lo que genera núcleos de GPU subutilizados.

La solución es la decodificación especulativa. Esta técnica de optimización acelera el proceso lento y secuencial de tu LLM grande (el modelo objetivo) 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. Luego, el modelo objetivo grande verifica estas propuestas en un solo lote paralelo. Acepta el prefijo coincidente más largo de sus propias predicciones y continúa la generación desde ese nuevo punto.

Sin embargo, no todos los mecanismos de borrador son iguales. El enfoque clásico de borrador y objetivo usa un modelo LLM más pequeño y separado como redactor, lo que significa que debes alojar y administrar más recursos de entrega, lo que genera costos adicionales.

Diagrama de flujo que ilustra un ejemplo con el enfoque de borrador y objetivo. La instrucción "San Francisco es" dirige a dos pasos: 1. El modelo de borrador genera una cadena secuencial de tokens (los tokens son: "una", "ciudad", "en") y 2. El modelo de destino verifica y selecciona los tokens de borrador esperados (los tokens son: "a", "city", "in", y el modelo rechaza el token "in"); de lo contrario, genera tokens nuevos (los tokens son: "a", "city", "known"). Los resultados de los dos pasos convergen en el resultado final de "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, adjunta un "borrador" extremadamente ligero (solo entre el 2 y el 5% del tamaño del modelo objetivo) directamente a sus capas internas. Este encabezado opera a nivel de atributos y tokens, y procesa atributos de los estados ocultos del modelo objetivo para extrapolar y predecir un árbol de tokens futuros.

¿El resultado? Todos los beneficios 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 entrenamiento y mantenimiento de un modelo de borrador independiente con miles de millones de parámetros, que requiere muchos recursos. Solo entrenas un "cabezal de borrador" ligero, que representa solo entre el 2% y el 5% del tamaño del modelo objetivo, y que se agrega como parte de tu modelo existente. Este proceso de entrenamiento más simple y eficiente ofrece una mejora significativa del rendimiento de decodificación de 2 a 3 veces para modelos como Llama 70B (según los tipos de cargas de trabajo, p.ej., de varios turnos, de código, de contexto largo y mucho más).

Diagrama de flujo que ilustra un ejemplo del uso del enfoque EAGLE-3. La instrucción "San Francisco es" dirige a un modelo objetivo con EAGLE-3 que contiene varias capas. La capa de embedding fluye hacia el decodificador y las capas ocultas, que, a su vez, fluyen hacia el encabezado de EAGLE-3. La capa principal 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 incorporación. Los tokens validados "a", "city" y "known" fluyen hacia el resultado final: "San Francisco is a city known".

Haz clic para ampliar la imagen

Sin embargo, trasladar este enfoque optimizado de EAGLE-3 de un documento a un servicio en la nube a gran escala y listo para la producción es un verdadero viaje de ingeniería. En esta publicación, compartimos nuestro proceso técnico, los desafíos clave y las lecciones que aprendimos en el camino.

Desafío 1: Preparación de los datos

El encabezado de EAGLE-3 necesita entrenamiento. El primer paso obvio es tomar un conjunto de datos genérico disponible públicamente. La mayoría de estos conjuntos de datos presentan desafíos, como los siguientes:

  • Condiciones de Uso Estrictas: Estos conjuntos de datos se generan con modelos que no permiten usarlos para desarrollar modelos que compitan con los proveedores originales.
  • Contaminación de PII: Algunos de estos conjuntos de datos contienen una cantidad significativa de PII, incluidos nombres, ubicaciones e incluso identificadores financieros.
  • Sin garantía de calidad: Algunos conjuntos de datos solo funcionan bien para casos de uso generales de "demostración", pero no son los mejores para la carga de trabajo especializada de los clientes reales.

No es una opción usar estos datos tal como están.

Lección 1: Crea una canalización de generación de datos sintéticos

Una solución es crear una canalización de generación de datos sintéticos. Según los casos de uso de nuestros clientes, seleccionamos el conjunto de datos adecuado que no solo sea de buena calidad, sino que también coincida mejor con el tráfico de producción de nuestros clientes para diferentes cargas de trabajo. Luego, puedes extraer solo las instrucciones del usuario de estos conjuntos de datos y aplicar filtros rigurosos de DLP (prevención de pérdida de datos) y de PII. Estas instrucciones limpias aplican una plantilla de chat, las tokenizan y, luego, se pueden ingresar en tu modelo objetivo (p.ej., Llama 3.3 70B) para recopilar sus respuestas.

Este enfoque proporciona datos generados por el objetivo que no solo son compatibles y limpios, sino que también coinciden bien con la distribución de resultados real del modelo. Esto es ideal para entrenar el encabezado del borrador.

Diagrama de flujo lineal que representa la canalización de generación de datos sintéticos. Las instrucciones del usuario se extraen de datos sin procesar, que se limpian y filtran. Las instrucciones limpias se tokenizan con plantillas y tokenizadores de chat. Luego, las instrucciones tokenizadas se usan para generar respuestas junto con un modelo objetivo, que devuelve los tokens de respuesta generados.

Haz clic para ampliar la imagen

Desafío 2: Ingeniería de la canalización de entrenamiento

Otra decisión clave es cómo proporcionar los datos de entrenamiento al encabezado de EAGLE-3. Tienes dos rutas distintas: el entrenamiento en línea, en el que las incorporaciones se "generan sobre la marcha", y el entrenamiento sin conexión, en el que las "incorporaciones se generan antes del entrenamiento".

En nuestro caso, elegimos un enfoque de entrenamiento sin conexión porque requiere mucho menos hardware que el entrenamiento en línea. Este proceso implica calcular previamente todos los atributos y las incorporaciones antes de entrenar el encabezado de EAGLE-3. Los guardamos en GCS y se convierten en los datos de entrenamiento de nuestro encabezado ligero de EAGLE-3. Una vez que tengas los datos, el entrenamiento en sí es rápido. Dado el tamaño diminuto del cabezal EAGLE-3, el entrenamiento inicial con nuestro conjunto de datos original requirió aproximadamente un día en un solo host. Sin embargo, a medida que aumentamos la escala de nuestro conjunto de datos, los tiempos de entrenamiento también aumentaron de manera proporcional y ahora abarcan varios días.

Diagrama de flujo lineal que representa la canalización de entrenamiento. Las instrucciones tokenizadas y los tokens de respuesta generados se usan para generar atributos y las incorporaciones con el modelo objetivo, que devuelve tokens y atributos. Estos tokens y atributos 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 enseñó dos lecciones importantes que debes tener en cuenta.

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

Mientras entrenábamos el modelo ajustado según las instrucciones, descubrimos que el rendimiento de EAGLE-3 puede variar mucho cuando la plantilla de chat no es la adecuada. Debes aplicar la plantilla de chat específica del modelo objetivo (p.ej., Llama 3) antes de generar las características y los embeddings. Si solo concatenas texto sin procesar, las incorporaciones serán incorrectas y tu encabezado aprenderá a predecir la distribución incorrecta.

Lección 3: Cuida tu máscara

Durante el entrenamiento, se proporcionan al modelo las representaciones de la instrucción y 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 instrucción en tu función de pérdida. Si no lo haces, el encabezado desperdiciará capacidad aprendiendo a predecir la instrucción que ya se le proporcionó, y el rendimiento se verá afectado.

Diagrama que representa una máscara de pérdida de ejemplo. La frase "San Francisco es una ciudad conocida" se divide en dos partes: tokens que ya se conocen ("San", "Francisco", "es"), que se representan con ceros en la máscara de pérdida, y tokens que se deben predecir ("una", "ciudad", "conocida"), que se representan con unos en la máscara de pérdida.

Haz clic para ampliar la imagen

Desafío 3: Entrega y escalamiento

Con un encabezado de EAGLE-3 entrenado, procedimos a la fase de entrega. Esta fase presentó desafíos importantes en cuanto a la expansión. Estos son nuestros aprendizajes clave.

Lección 4: Tu framework de entrega es clave

Gracias a la estrecha colaboración con el equipo de SGLang, lanzamos EAGLE-3 a producción con el mejor rendimiento. El motivo técnico es que SGLang implementa un kernel de atención del árbol fundamental. Este kernel especial es fundamental porque EAGLE-3 genera un "árbol de borrador" de posibilidades (no solo una cadena simple), y el kernel de SGLang está diseñado específicamente para verificar todas esas rutas de ramificación en paralelo en un solo paso. Sin esto, no aprovecharás el rendimiento.

Lección 5: No permitas que la CPU limite el rendimiento de la GPU

Incluso después de acelerar tu LLM con EAGLE-3, puedes encontrarte con otro límite de rendimiento: la CPU. Cuando tus GPUs ejecutan la inferencia de LLM, el software no optimizado desperdiciará una gran cantidad de tiempo en la sobrecarga de la CPU, como el inicio del kernel y el registro de metadatos. En un programador síncrono normal, la GPU ejecuta un paso (como Borrador) y, luego, queda inactiva mientras la CPU realiza su administración y lanza el siguiente paso Verificar. Estas burbujas de sincronización se acumulan y desperdician grandes cantidades de tiempo valioso de la GPU.

Ejemplo de un programador síncrono normal. Cada paso se presenta de forma secuencial con la cantidad de tiempo que se dedicó a cada uno: Borrador (10 ms), Verificación (15 ms), Extensión (10 ms), Sincronización de CPU (5 ms), Borrador (10 ms) y Verificación (15 ms). El paso de sincronización de la CPU se destaca con un color diferente para indicar el tiempo no optimizado que se invirtió en la sobrecarga de la CPU.

Haz clic para ampliar la imagen

Para resolver este problema, usamos el programador de superposición sin sobrecarga de SGLang. Este programador está ajustado específicamente para el flujo de trabajo de varios pasos de la decodificación especulativa Borrador -> Verificación -> Extensión del borrador . La clave es superponer el cálculo. Mientras la GPU está ocupada ejecutando el paso Verify actual, la CPU ya está trabajando en paralelo para iniciar los kernels de los siguientes pasos Draft y Draft Extend . Esto elimina la burbuja de inactividad, ya que garantiza que el próximo trabajo de la GPU esté siempre listo, mediante un FutureMap, una estructura de datos inteligente que permite que la CPU prepare el próximo 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 de sincronización de la CPU, hay un paso más pequeño que indica que los pasos de escritura y lectura se producen de forma simultánea, y cada uno tarda 0.1 ms en completarse.

Haz clic para ampliar la imagen

Al eliminar esta sobrecarga de la CPU, el programador de superposición nos brinda una aceleración adicional del 10% al 20% en todos los casos. Esto demuestra que un buen modelo es solo la mitad de la batalla; necesitas un tiempo de ejecución que pueda seguir el ritmo.

Resultados de comparativas

Después de este viaje, ¿valió la pena? Por supuesto.

Comparamos nuestro encabezado EAGLE-3 entrenado con el modelo de referencia no especulativo usando SGLang con Llama 4 Scout 17B Instruct. Nuestras comparativas muestran una aceleración de 2 a 3 veces en la latencia de decodificación y ganancias significativas en el rendimiento según los tipos de cargas de trabajo.

Consulta todos los detalles y realiza tu propia comparación con nuestro notebook integral.

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

Gráfico de líneas que muestra el tiempo por token de salida (TPOT) en comparación con la simultaneidad, con la nota de que los valores más bajos son mejores. 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 del modelo de referencia y los resultados de EAGLE. Los resultados del modelo de referencia obtienen una puntuación constantemente más alta que los resultados de EAGLE. Ambas líneas comienzan cerca de la esquina inferior izquierda del gráfico y tienden a subir a medida que aumenta la simultaneidad máxima. Los resultados del modelo de referencia tienen un aumento más pronunciado hacia el borde del gráfico.

Haz clic para ampliar la imagen

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

Métrica 2: Capacidad de procesamiento de salida

Gráfico de líneas que muestra la capacidad de procesamiento de tokens en comparación con la simultaneidad, con la nota de que cuanto más alto sea el valor, mejor. El eje Y representa la capacidad de procesamiento en tokens por segundo, 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 EAGLE obtienen una puntuación constantemente más alta que los resultados de referencia. Ambas líneas comienzan en la esquina inferior izquierda y tienden a subir a medida que aumenta la simultaneidad máxima. Los resultados de EAGLE tienden a aumentar a un ritmo más uniforme y significativo que los resultados del modelo de referencia.

Haz clic para ampliar la imagen

Este gráfico destaca aún más la ventaja de capacidad de procesamiento de EAGLE-3. El gráfico de la capacidad de procesamiento de tokens en comparación con la simultaneidad demuestra claramente que el modelo acelerado por EAGLE-3 (línea verde) supera de forma constante y sustancial al modelo de referencia (línea azul).

Si bien las observaciones similares se aplican a los modelos más grandes, vale la pena destacar que se puede observar un aumento en el tiempo hasta el primer token (TTFT) en comparación con otras métricas de rendimiento. Además, estos rendimientos varían según la tarea, como se ilustra en los siguientes ejemplos:

Gráfico de barras que compara las velocidades de salida en diferentes 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 extenso, matemáticas y multilingüe), la velocidad de salida del modelo EAGLE-3 es mucho mayor que la del modelo de referencia.

Haz clic para ampliar la imagen

Conclusión: Ahora es tu turno

EAGLE-3 no es solo un concepto de investigación, sino un patrón listo para producción que puede ofrecer una aceleración tangible del doble en la latencia de decodificación. Sin embargo, lograr que se escale requiere un verdadero esfuerzo de ingeniería. Para implementar esta tecnología de forma confiable para tus usuarios, debes hacer lo siguiente:

  1. Crea una canalización de datos sintéticos que cumpla con los requisitos.
  2. Controla correctamente las plantillas de chat y las máscaras de pérdida, y entrena el modelo en un conjunto de datos a gran escala.

En Vertex AI, ya optimizamos todo este proceso para ti, ya que proporcionamos un contenedor y una infraestructura optimizados diseñados para escalar tus aplicaciones basadas en LLM. Para comenzar, consulta los siguientes recursos:

Gracias por leer

Agradecemos tus comentarios y preguntas sobre Vertex AI.

Agradecimientos

Queremos expresar nuestro sincero agradecimiento al equipo de SGLang, en especial a Ying Sheng, Lianmin Zheng, Yineng Zhang, Xinyuan Tong y Liangsheng Yin, así como al equipo de SGLang/SpecForge, en especial a Shenggui Li y Yikai Zhu, por su invaluable asistencia durante todo este proyecto. Su generosa asistencia y sus profundos conocimientos técnicos fueron fundamentales para el éxito de este proyecto.