Originalmente, PyTorch usaba un modo ansioso en el que cada operación de PyTorch que forma el modelo se ejecuta de forma independiente tan pronto como se alcanza. PyTorch 2.0 introdujo antorcha.compilar para acelerar el código de PyTorch en comparación con el modo ansioso predeterminado. A diferencia del modo ansioso, el archivo Torch.compile compila previamente todo el modelo en un solo gráfico de una manera óptima para ejecutarse en una plataforma de hardware determinada. AWS optimizó la función Torch.compile de PyTorch para Procesadores AWS Graviton3Esta optimización da como resultado un rendimiento hasta dos veces mejor para Cara abrazada Inferencia de modelos (basada en la media geométrica de mejora del rendimiento para 33 modelos) y hasta 1,35 veces mejor rendimiento para Banco de antorcha Inferencia de modelos (media geométrica de mejora del rendimiento para 45 modelos) en comparación con la inferencia de modo ansioso predeterminada en varios modelos de procesamiento de lenguaje natural (NLP), visión artificial (CV) y recomendación en instancias de Amazon EC2 basadas en AWS Graviton3. A partir de PyTorch 2.3.1, las optimizaciones están disponibles en Python de Torch ruedas y AWS Graviton PyTorch contenedor de aprendizaje profundo (DLC).
En esta publicación de blog, mostramos cómo optimizamos el rendimiento de Torch.Compile en instancias EC2 basadas en AWS Graviton3, cómo usar las optimizaciones para mejorar el rendimiento de la inferencia y las aceleraciones resultantes.
¿Por qué Torch.Compile y cuál es el objetivo?
En el modo ansioso, los operadores de un modelo se ejecutan inmediatamente cuando se encuentran. Es más fácil de usar, más adecuado para los investigadores de aprendizaje automático (ML) y, por lo tanto, es el modo predeterminado. Sin embargo, el modo ansioso genera una sobrecarga de tiempo de ejecución debido al lanzamiento redundante del kernel y la sobrecarga de lectura de memoria. Mientras que en el modo de compilación Torch, los operadores primero se sintetizan en un gráfico, donde un operador se fusiona con otro para reducir y localizar las lecturas de memoria y la sobrecarga total de lanzamiento del kernel.
El objetivo del equipo de AWS Graviton era optimizar el backend de Torch.Compile para los procesadores Graviton3. El modo entusiasta de PyTorch ya estaba optimizado para los procesadores Graviton3 con Biblioteca de cómputo Arm (ACL) núcleos que utilizan oneDNN (también conocido como MKLDNN). Entonces, la pregunta era, ¿cómo reutilizar esos núcleos en modo de compilación de antorcha para obtener lo mejor de la compilación de gráficos y el rendimiento optimizado del núcleo juntos?
Resultados
El equipo de AWS Graviton extendió el inductor de antorcha y los primitivos oneDNN que reutilizaron los núcleos ACL y optimizaron el rendimiento del modo de compilación en los procesadores Graviton3. A partir de PyTorch 2.3.1, las optimizaciones están disponibles en las ruedas Python de antorcha y en el DLC de AWS Graviton. Consulte Ejecutar una inferencia Sección que sigue para obtener instrucciones sobre la instalación, la configuración del tiempo de ejecución y cómo ejecutar las pruebas.
Para demostrar las mejoras de rendimiento, utilizamos modelos de PNL, CV y recomendación de Banco de antorcha y los modelos de PNL más descargados de Cara abrazada en tareas de respuesta a preguntas, clasificación de texto, clasificación de tokens, traducción, clasificación de disparo cero, traducción, resumen, extracción de características, generación de texto, generación de texto a texto, máscara de relleno y similitud de oraciones para cubrir una amplia variedad de casos de uso de clientes.
Comenzamos midiendo la latencia de inferencia del modelo TorchBench, en milisegundos (ms), para el modo ansioso, que está marcado como 1.0 con una línea de puntos roja en el siguiente gráfico. Luego, comparamos las mejoras de Torch.compile para la misma inferencia del modelo; los resultados normalizados se representan en el gráfico. Puede ver que para los 45 modelos que evaluamos, hay una mejora de latencia de 1.35x (media geográfica para los 45 modelos).
Imagen 1: Mejora del rendimiento de inferencia del modelo PyTorch con Torch.Compile en la instancia c7g basada en Graviton3 de AWS mediante el marco TorchBench. El rendimiento del modo de referencia está marcado como 1.0 (cuanto más alto, mejor).
De manera similar al gráfico de rendimiento de inferencia de TorchBench anterior, comenzamos midiendo la latencia de inferencia del modelo NLP Hugging Face, en ms, para el modo ansioso, que está marcado como 1.0 con una línea de puntos roja en el siguiente gráfico. Luego, comparamos las mejoras de Torch.compile para la misma inferencia de modelo; los resultados normalizados se representan en el gráfico. Puede ver que, para los 33 modelos que evaluamos, hay una mejora de rendimiento de alrededor de 2x (media geográfica para los 33 modelos).
Imagen 2: Mejora del rendimiento de la inferencia del modelo NLP de Hugging Face con Torch.Compile en la instancia c7g basada en Graviton3 de AWS mediante scripts de ejemplo de Hugging Face. El rendimiento del modo ansioso de referencia está marcado como 1.0. (cuanto más alto, mejor)
Ejecutar una inferencia
A partir de PyTorch 2.3.1, las optimizaciones están disponibles en la rueda de Python de Torch y en el DLC PyTorch de AWS Graviton. Esta sección muestra cómo ejecutar la inferencia en los modos anxious y Torch.Compile utilizando ruedas de Python de Torch y scripts de evaluación comparativa de los repositorios Hugging Face y TorchBench.
Para ejecutar correctamente los scripts y reproducir los números de aceleración mencionados en esta publicación, necesita una instancia de hardware de la familia Graviton3 (c7g/r7g/m7g/hpc7g). Para esta publicación, usamos el Instancia c7g.4xl (16 vcpu)La instancia, los detalles de la AMI y las versiones de la biblioteca de antorcha requeridas se mencionan en el siguiente fragmento.
Los ajustes de tiempo de ejecución genéricos implementados para la inferencia en modo ansioso son igualmente aplicables para el modo Torch.Compile, por lo tanto, configuramos las siguientes variables de entorno para mejorar aún más el rendimiento de Torch.Compile en los procesadores AWS Graviton3.
Scripts de evaluación comparativa de TorchBench
TorchBench es una colección de pruebas comparativas de código abierto que se utilizan para evaluar el rendimiento de PyTorch. Evaluamos 45 modelos utilizando los scripts del repositorio de TorchBench. El siguiente código muestra cómo ejecutar los scripts para el modo de ejecución en modo de ejecución en modo de ejecución en modo de ejecución en modo de compilación con el backend Inductor.
Una vez finalizadas las ejecuciones de inferencia, el script almacena los resultados en formato JSON. A continuación, se muestra el resultado de muestra:
Scripts de evaluación comparativa de Hugging Face
El modelo de traducción de texto pequeño T5 de Google es uno de los 30 modelos Hugging Face que evaluamos como referencia. Lo estamos usando como modelo de muestra para demostrar cómo ejecutar la inferencia en los modos de compilación y de preparación. Las configuraciones y API adicionales necesarias para ejecutarlo en el modo de compilación se destacan en ATREVIDOGuarde el siguiente script como google_t5_small_text_translation.py .
Ejecute el script con los siguientes pasos.
Una vez finalizadas las ejecuciones de inferencia, el script imprime la salida del generador de perfiles de antorcha con el desglose de latencia de los operadores de antorcha. A continuación, se muestra la salida de muestra del generador de perfiles de antorcha:
Que sigue
A continuación, ampliaremos el soporte del backend de la CPU del inductor de antorcha para compilar el modelo Llama y agregaremos soporte para kernels GEMM fusionados para permitir la optimización de la fusión del operador del inductor de antorcha en los procesadores AWS Graviton3.
Conclusión
En este tutorial, explicamos cómo optimizamos el rendimiento de Torch.Compile en instancias EC2 basadas en AWS Graviton3, cómo usar las optimizaciones para mejorar el rendimiento de la inferencia del modelo de PyTorch y demostramos las aceleraciones resultantes. ¡Esperamos que lo pruebes! Si necesitas ayuda con el software de aprendizaje automático en Graviton, abre un problema en la Guía técnica de AWS Graviton GitHub.
Sobre el Autor
Sunita Nadampalli es gerente de desarrollo de software y experta en IA/ML en AWS. Dirige las optimizaciones de rendimiento del software AWS Graviton para cargas de trabajo de IA/ML y HPC. Le apasiona el desarrollo de software de código abierto y la entrega de soluciones de software sustentables y de alto rendimiento para SoC basados en Arm ISA.