Perfilado de modelos PyTorch en AWS Trainium con TorchNeuron
Aprende a usar torch.profiler y Neuron Explorer para identificar cuellos de botella de rendimiento en la inferencia de ML sobre hardware AWS Trainium.
Traducido automáticamente del original en inglés.
AWS Trainium es un chip diseñado específicamente para el aprendizaje profundo, pero optimizar modelos para él requiere técnicas de perfilado específicas. Un nuevo tutorial de Hugging Face demuestra cómo usar TorchNeuron, el backend nativo de PyTorch para Trainium, para analizar sistemáticamente el rendimiento de la inferencia. La guía acompaña a los ingenieros en la captura de trazas, la lectura de datos a nivel de sistema y la comparación de diferentes estrategias de implementación para una operación común.
Qué ocurrió
Muchos profesionales del aprendizaje automático dependen de la intuición para acelerar sus modelos, pero pocos poseen las herramientas para diagnosticar exactamente por qué un modelo es lento. Para cubrir esta brecha, Hugging Face publicó la primera parte de una serie centrada en el perfilado a nivel de sistema para AWS Trainium. El tutorial no asume experiencia previa con el perfilado en este hardware y comienza desde cero, utilizando RMSNorm como caso de estudio.
La guía utiliza TorchNeuron, un backend de código abierto que permite ejecutar flujos de trabajo estándar de PyTorch en Trainium con cambios mínimos en el código. Admite ejecución eager, torch.compile y operadores personalizados a través de la Interfaz de Kernel de Neuron (Neuron Kernel Interface). El objetivo es enseñar a los ingenieros cómo configurar el profiler, capturar trazas limpias e interpretar los datos resultantes para identificar operaciones que consumen mucho tiempo.
Al final de la guía, los lectores aprenden a correlacionar el tiempo de CPU con el tiempo del dispositivo, seguir las operaciones a través de la pila de software y entender cómo diferentes patrones de codificación afectan la utilización del hardware. Este conocimiento fundamental prepara a los desarrolladores para optimizar modelos más grandes identificando puntos críticos (hotspots) y aplicando técnicas adecuadas de fusión o compilación.
Cómo funciona
El perfilado en Trainium se basa en dos componentes principales: NeuronConfig y NeuronProfiler. El objeto NeuronConfig controla qué flujos de datos capturar, como instrucciones del dispositivo y trazas de runtime, y especifica el directorio de salida. Se pasa a torch.profiler.profile como una configuración experimental. El NeuronProfiler utiliza esta configuración para exportar tanto la traza estándar del framework como las trazas de sistema específicas de Neuron.
Para visualizar los datos, los ingenieros utilizan Neuron Explorer, un visor basado en navegador accesible mediante túnel SSH o extensión de VS Code. Esta herramienta muestra la traza del sistema, la línea de tiempo del dispositivo y el desglose por motor. Empareja los ejecutables compilados (archivos NEFF) con sus trazas de instrucciones de hardware (archivos NTFF) utilizando un hash numérico compartido. Esto permite a los usuarios ver exactamente cómo las operaciones de alto nivel de PyTorch se mapean a la ejecución de bajo nivel en el hardware.
El proceso de perfilado implica sincronizar el dispositivo dentro del bucle del profiler para garantizar tiempos precisos. Sin llamar a torch.neuron.synchronize(), el profiler podría exportar los datos antes de que el dispositivo termine su trabajo, lo que llevaría a columnas de tiempo vacías o incorrectas. Las trazas resultantes muestran el ciclo de vida de cada operación desde el despacho del framework hasta la programación del runtime y finalmente la ejecución en el hardware sobre un NeuronCore.
Detalles clave
- TorchNeuron se integra con PyTorch utilizando el punto de extensión
PrivateUse1, evitando la necesidad de una clave de despacho dedicada como CUDA. - El parámetro
correlate_device_time=TruedeNeuronConfigpropaga el tiempo del dispositivo a la tablakey_averages()para una comparación directa con el tiempo de CPU. - Las implementaciones ingenuas de RMSNorm usando operaciones individuales de PyTorch resultan en múltiples despachos separados al hardware y materialización de tensores intermedios.
- Usar
torch.rms_norm()reduce la operación a un único kernel fusionado de Neuron, disminuyendo significativamente el tiempo del dispositivo al eliminar los huecos entre operaciones. torch.compilecon el backend de Neuron puede fusionar automáticamente operaciones ingenuas en un solo grafo, logrando un rendimiento similar a la fusión manual sin cambiar la estructura original del código Python.- Neuron Explorer organiza los eventos en carriles para el despacho del framework, la interacción con el dispositivo, las llamadas a la API de runtime y la ejecución en el hardware, permitiendo un análisis detallado de las cadenas de dependencias.
Por qué importa
Para los ingenieros que construyen productos sobre AWS Trainium, entender la diferencia entre la sobrecarga de CPU y la computación real del dispositivo es crítico para la optimización de costos y latencia. El código ingenuo a menudo parece eficiente en Python pero genera una sobrecarga excesiva en el acelerador debido a despachos frecuentes y transferencias de memoria. Al visualizar estos huecos, los desarrolladores pueden tomar decisiones informadas sobre cuándo usar operaciones fusionadas integradas versus confiar en las optimizaciones del compilador.
La capacidad de rastrear una operación desde el framework PyTorch hasta el hardware NeuronCore proporciona un nivel de transparencia que a menudo falta en los aceleradores tipo caja negra. Esta visibilidad ayuda a los equipos a depresar regresiones de rendimiento y validar que sus esfuerzos de optimización están llegando realmente al hardware según lo previsto. Cambia la optimización de ser un juego de adivinanzas a ser una ingeniería basada en evidencia.
Además, a medida que los modelos crecen en complejidad, el efecto acumulativo de pequeñas ineficiencias se vuelve sustancial. Identificar y fusionar operaciones temprano en el ciclo de desarrollo previene deuda técnica relacionada con el rendimiento. Las técnicas descritas aquí proporcionan un flujo de trabajo repetible para auditar la eficiencia del modelo, asegurando que el gasto en infraestructura se alinee con las necesidades computacionales.
Qué puedes hacer
- Instala el paquete
torch_neuronxy configuraNeuronConfigconProfileMode.DEVICEyProfileMode.RUNTIMEpara capturar trazas completas. - Usa
torch.profiler.schedulecon pasos de calentamiento (warmup) para excluir la sobrecarga de inicialización de tus mediciones de rendimiento. - Llama a
torch.neuron.synchronize()dentro de tu bucle de perfilado para asegurar que las tareas del dispositivo se completen antes de exportar la traza. - Analiza la tabla
key_averages()ordenada porself_privateuse1_time_totalpara identificar las operaciones más costosas en el dispositivo Neuron. - Sube los archivos
.neffy.ntffgenerados a Neuron Explorer para visualizar la línea de tiempo de ejecución y verificar la fusión de operadores. - Compara implementaciones ingenuas contra variantes de
torch.rms_normotorch.compilepara cuantificar los beneficios de rendimiento de la fusión de operaciones.



