Para promover el desarrollo de LLM de código abierto, el equipo de Qwen lanzó recientemente Qwen2.5-Coder, una familia de LLM avanzados para la generación, el razonamiento y la corrección de código en lenguajes de programación populares.
Los modelos de lenguaje grande (LLM) que se especializan en codificación se han adoptado de manera constante en los flujos de trabajo de los desarrolladores. Desde la programación en pareja hasta los agentes de IA que se mejoran a sí mismos , estos modelos ayudan a los desarrolladores con diversas tareas, como mejorar el código, corregir errores, generar pruebas y escribir documentación.
Para promover el desarrollo de LLM de código abierto, el equipo de Qwen lanzó recientemente Qwen2.5-Coder, una familia de LLM avanzados para la generación, el razonamiento y la corrección de código en lenguajes de programación populares. Esta publicación explora los beneficios de las optimizaciones de inferencia para los modelos Qwen2.5-Coder compatibles con NVIDIA TensorRT-LLM y la facilidad de implementación con NVIDIA NIM para lograr potencial transformador y eficiencia de codificación.
Modelos de codificadores Qwen2.5
Los modelos Qwen2.5-Coder han logrado un rendimiento de vanguardia en los puntos de referencia académicos más populares. NVIDIA TensorRT-LLM ha optimizado tres modelos populares de la familia Qwen2.5-Coder (las versiones 1.5B, 7B y 32B) para lograr un alto rendimiento y una baja latencia. TensorRT-LLM es una biblioteca para una inferencia LLM rápida y eficiente e incluye optimizaciones como procesamiento por lotes dinámico en vuelo , almacenamiento en caché KV , reutilización de caché KV y varias técnicas de decodificación especulativa, entre otras.
Estas optimizaciones ayudan a ofrecer mejoras de rendimiento para los modelos Qwen2.5-Coder en lenguajes de programación populares como Python, C++, Java, Bash, Javascript, TypeScript y Go, llegando a una gama más amplia de desarrolladores. Esta publicación explora la optimización de la decodificación anticipada y el aumento de rendimiento que ayuda a lograr. Sin ninguna capacitación adicional ni necesidad de modelos de borrador adicionales, los desarrolladores pueden aprovechar la API de alto nivel TensorRT-LLM para acelerar la inferencia de Qwen2.5-Coder para generar la finalización automática de código de varias líneas.

Descodificación anticipada
La decodificación anticipada es una técnica de decodificación especulativa que aborda la naturaleza autorregresiva lenta de los LLM. Cada paso de decodificación autorregresiva solo genera un token a la vez, sin aprovechar la enorme potencia de procesamiento en paralelo de las GPU NVIDIA, lo que genera una baja utilización de la GPU y un menor rendimiento. Anteriormente, analizamos el aumento del rendimiento que se puede lograr con la decodificación especulativa de destino preliminar y aquí analizamos los beneficios de aprovechar la implementación de la decodificación anticipada TensorRT-LLM utilizando los modelos Qwen2.5-Coder como ejemplo.
A diferencia de la generación de un solo token en la decodificación autorregresiva, la decodificación anticipada genera múltiples tokens simultáneamente, utilizando adecuadamente las capacidades de procesamiento paralelo de la GPU y aprovechando los cálculos (FLOP) para reducir la latencia. Además, la decodificación anticipada no requiere un modelo de borrador independiente que se necesita para la decodificación especulativa de destino de borrador.
Cada paso de decodificación se divide en dos ramas paralelas, la rama de anticipación y la rama de verificación. Utilizando el método de iteración de Jacobi , un solucionador de sistemas no lineales clásico, la rama de anticipación realiza una decodificación paralela para tokens futuros mediante la generación de n-gramas. La rama de verificación selecciona y verifica los candidatos de n-gramas prometedores generados por la rama de anticipación.
El algoritmo de anticipación se configura utilizando tres parámetros clave: tamaño de ventana (W), tamaño de n-gramas (N) y tamaño del conjunto de verificación (G).
- Tamaño de ventana (W): representa el tamaño de la ventana de anticipación, que determina cuántos tokens futuros intenta predecir el algoritmo en cada paso. Un tamaño de ventana más grande permite que el modelo mire más lejos, lo que ayuda a generar más tokens en una sola pasada. Esto mejora de manera efectiva el rendimiento del procesamiento mientras se utilizan los FLOP de computación de la GPU de manera eficiente.
- Tamaño de n-gramas (N): representa el tamaño de los n-gramas utilizados en el proceso de búsqueda anticipada. Por ejemplo, un 5-grama es una secuencia contigua de 5 tokens futuros. Junto con el tamaño de la ventana, crea una ventana 2D de tamaño fijo para que la rama de búsqueda anticipada genere n-gramas a partir de la trayectoria de iteración de Jacobi.
- Tamaño del conjunto de verificación (G): representa la cantidad máxima de especulaciones o n-gramas candidatos que el algoritmo considera en cada paso de verificación. Equilibra la compensación entre la eficiencia computacional y la exploración de más posibilidades.

El rendimiento de la búsqueda anticipada depende en gran medida del modelo base, el hardware, el tamaño del lote, la longitud de la secuencia y el conjunto de datos. Se recomienda crear perfiles de varias configuraciones para encontrar la mejor configuración (W, N, G) dada la configuración. La configuración óptima de tuplas (W, N, G) permite que la decodificación anticipada brinde un rendimiento mejorado sin la necesidad de capacitación adicional, ajustes finos o modelos preliminares.
A través de nuestros experimentos sobre el barrido de valores de configuración (W, N, G), logramos aumentos de velocidad de 3,6x y 1,6x en el rendimiento para los modelos Qwen2.5-Coder 7B Instruct y Qwen2.5-Coder 32B Instruct, respectivamente. Estos aumentos de velocidad se miden en rendimiento (tokens/segundo) en comparación con la línea base (sin decodificación especulativa de anticipación) en GPU NVIDIA H100 Tensor Core , como se muestra en la Figura 2.

Datos medidos el 30/01/2025. Aceleraciones del rendimiento de inferencia (tokens de salida/segundo) de los modelos Qwen2.5-Coder 7B Instruct y Qwen2.5-Coder 32B Instruct. DGX H100, TP=1 | (W, N, G) = (8, 8, 8) | Qwen2.5-Coder 7B Instruct, TP=2 | (W, N, G) = (15, 15, 15) | Qwen2.5-Coder-32B-Instruct, tamaño de lote=1, TensorRT-LLM versión 0.15.0.
Se logran aceleraciones de rendimiento similares en las GPU NVIDIA H200 Tensor Core . Con su mayor ancho de banda de memoria, también ayudan a aumentar el rendimiento de rendimiento de referencia, lo que genera aceleraciones ligeramente inferiores en comparación con las GPU H100 (Figura 3).

Datos medidos el 30/01/2025. Aceleraciones del rendimiento de inferencia (tokens de salida/segundo) de los modelos Qwen2.5-Coder 7B Instruct y Qwen2.5-Coder 32B Instruct. DGX H200, TP=1 | (W, N, G) = (8, 8, 8) | Qwen2.5-Coder 7B Instruct, TP=2 | (W, N, G) = (15, 15, 15) | Qwen2.5-Coder 32B Instruct, tamaño de lote=1, TensorRT-LLM versión 0.15.0.
Pasos para ejecutar la decodificación anticipada con TensorRT-LLM
Para reproducir estas mejoras de rendimiento mediante la decodificación especulativa anticipada dentro de TensorRT-LLM, siga los pasos a continuación.
# Install TensorRT-LLM. (Commands below are for Linux. Refer to TensorRT-LLM docs for Windows) sudo apt-get -y install libopenmpi-dev && pip3 install --upgrade setuptools && pip3 install tensorrt_llm --extra-index-url https: //pypi .nvidia.com |
Luego, ejecute la decodificación anticipada en TensorRT-LLM utilizando la API de alto nivel.
# Command for Qwen2.5-Coder-7B-Instruct from tensorrt_llm import LLM, SamplingParams from tensorrt_llm.llmapi import (LLM, BuildConfig, KvCacheConfig, LookaheadDecodingConfig, SamplingParams) def main(): """The end user can customize the build configuration with the build_config class. # Max draft length is based on (W,N,G) values and calculated as: (W + G -1) * (N-1) + ( N<=1 ? 0: N-2)""" build_config = BuildConfig(max_batch_size = 128 , max_input_len = 2048 , max_seq_len = 4096 , max_num_tokens = 16384 , max_draft_len = 111 ) build_config.plugin_config.reduce_fusion = True build_config.plugin_config.use_paged_context_fmha = True build_config.plugin_config.multiple_profiles = True # The configuration for lookahead decoding lookahead_config = LookaheadDecodingConfig(max_window_size = 8 , max_ngram_size = 8 , max_verification_set_size = 8 ) kv_cache_config = KvCacheConfig(free_gpu_memory_fraction = 0.4 ) llm = LLM(model = "Qwen/Qwen2.5-Coder-7B-Instruct" , kv_cache_config = kv_cache_config, build_config = build_config, speculative_config = lookahead_config) prompt = """Write a C++ program to find the nth Fibonacci number using recursion. Now we define a sequence of numbers in which each number is the sum of the three preceding ones. The first three numbers are 0, -1, -1. Write a program to find the nth number.""" sampling_params = SamplingParams(lookahead_config = lookahead_config) output = llm.generate(prompt, sampling_params = sampling_params) print (output) if __name__ = = '__main__' : main() |
Resumen
La decodificación especulativa anticipada permite aumentar el rendimiento en los LLM sin necesidad de entrenamiento adicional, ajustes finos ni modelos preliminares. Presentamos mejoras de rendimiento comparativas en los modelos Qwen2.5-Coder. Visite build.nvidia.com para probar los modelos Qwen2.5-Coder optimizados con NVIDIA TensorRT-LLM de forma gratuita. Los modelos Qwen2.5-Coder optimizados con TensorRT-LLM también se han empaquetado como microservicios NVIDIA NIM descargables para facilitar la implementación.
Expresiones de gratitud
Nos gustaría agradecer a Liwei Ma, Fanrong Li, Nikita Korobov y Martin Marciniszyn Mehringer por sus esfuerzos para apoyar esta publicación.
Recursos relacionados
- Sesión GTC: Técnicas avanzadas para la optimización de inferencias con TensorRT-LLM
- Sesión de GTC: Habilitar la inferencia de Blackwell con el optimizador de modelos TensorRT
- Sesión de GTC: Aceleración de la inferencia LLM de contexto superlargo
- Contenedores NGC: ajuste y optimización de BERT
- SDK: Transformador más rápido
- Kit de desarrollo de software: TensorFlow-TensorRT
NVIDIA Blog. A. S., J. G., L.B., N. K-J. y Ch. P. Traducido al español