NVIDIA agrega soporte nativo de Python a CUDA
(thenewstack.io)- CUDA se está expandiendo más allá de un ecosistema centrado en C/C++ hacia una dirección en la que los desarrolladores de Python puedan manejar de forma más directa la computación en GPU de NVIDIA
- El nuevo soporte no es un simple binding, sino un intento de integrar interfaces de Python y flujos de scripting en todo el toolkit de CUDA
- La pila de CUDA Python incluye bindings básicos, compilador en tiempo de ejecución, cuPyNumeric, CUDA Core, NVMath Python, además de perfiladores y herramientas de análisis de código
- NVIDIA busca aprovechar la compilación JIT y la conexión con código C++ existente para elevar la productividad en Python mientras mantiene pequeña la diferencia de rendimiento
- La interfaz CuTile es un modelo pensado para que los desarrolladores de Python entiendan y depuren el trabajo en GPU en términos de arreglos y tiles, en lugar de hilos
Python nativo llega a CUDA
- Python se convirtió en el lenguaje de programación más popular del mundo, superando a JavaScript, según la encuesta de código abierto de GitHub de 2024
- El toolkit de software CUDA de NVIDIA no había tenido soporte nativo de Python durante años, pero en GTC se anunció el soporte nativo y su integración completa
- Los desarrolladores podrán escribir directamente en Python computación algorítmica que se ejecute sobre GPUs de NVIDIA
- El arquitecto de CUDA Stephen Jones señaló que han estado trabajando para llevar “accelerated Python” como soporte de primera clase a la pila de CUDA
- La nueva dirección no consiste en trasladar C a sintaxis de Python, sino en crear un CUDA Python natural para desarrolladores de Python
Expansión sobre la base de desarrolladores de Python
- CUDA antes requería conocimientos de C++ o Fortran, y aunque existían algunas herramientas para Python, no eran soporte nativo
- El soporte nativo de Python abre las herramientas de desarrollo de CUDA a millones de desarrolladores de Python
- Según The Futurum Group, los usuarios de CUDA crecieron de 2 millones en 2020 a 4 millones en 2023
- Python es un lenguaje de rápido crecimiento, y NVIDIA también podrá llegar a desarrolladores de Python en países en desarrollo como India y Brasil
- Una parte importante de las GPUs de NVIDIA está en Estados Unidos y Europa, pero empresas de telecomunicaciones e infraestructura de India están construyendo grandes instalaciones de GPU que se pondrán en operación en el futuro
- NVIDIA está invirtiendo esfuerzo en atraer programadores y quiere dar soporte a más lenguajes de programación, incluidos Rust y Julia
Cómo se compone la pila Pythonic de CUDA
- CUDA incluye bibliotecas, SDK, compiladores, runtime del host, herramientas, software preempaquetado y algoritmos
- NVIDIA está agregando componentes a toda la Pythonic CUDA stack
- El objetivo central es ofrecer aceleración por GPU sin salir de Python
- Según Jones, CUDA Python no puede limitarse a ofrecer kernels; necesita un flujo de ejecución fluido a lo largo de toda la pila
- Debe ser posible escribir un kernel y ponerlo en PyTorch
- También debe ser posible llamar bibliotecas Pythonic y otros componentes
- La capa del compilador está estructurada en la práctica alrededor de la compilación JIT, lo que reduce de forma importante el árbol de dependencias de la pila de GPU
- La interoperabilidad entre capas es clave para mejorar la productividad usando Python de punta a punta
CUDA Core, cuPyNumeric y NVMath Python
- NVIDIA construyó inicialmente bindings básicos de Python con compilador en tiempo de ejecución, junto con bibliotecas de Python
- cuPyNumeric es un reemplazo directo de NumPy, la biblioteca de cómputo ampliamente usada en Python
- Con solo cambiar una instrucción
import, el código de NumPy se ejecuta en GPU en lugar de CPU
- Con solo cambiar una instrucción
- Durante el último año, NVIDIA creó CUDA Core, que Jones considera una reinterpretación del runtime de CUDA en un Python natural y nativo
- CUDA Core sigue el flujo de ejecución de Python, funciona completamente dentro del proceso y depende en gran medida de la compilación JIT
- NVIDIA también creó NVMath Python, que ofrece una interfaz unificada para llamadas a bibliotecas tanto del lado del host como del dispositivo
- Según Jones, la capacidad de fusionar llamadas a bibliotecas puede traducirse en grandes mejoras de rendimiento
- También se construyeron bibliotecas para acceder directamente desde código Python a bibliotecas C++ aceleradas
- En lugar de reimplementarlas en Python, se conectan con código C++ existente y cuidadosamente afinado
- Jones considera que con este enfoque la diferencia de rendimiento se vuelve prácticamente despreciable
- También se añadieron herramientas para perfiladores y analizadores de código
Modelo de programación CuTile
- Python facilita programar sin preocuparse demasiado por los detalles del hardware, y NVIDIA está añadiendo una capa de programación orientada a abstracciones de más alto nivel para la ejecución en GPU
- El nuevo modelo de programación, la interfaz CuTile, se está desarrollando primero para CUDA Pythonic, y después llegará una extensión para C++ CUDA
- CuTile está diseñado en torno a la idea de que los desarrolladores de Python, a diferencia de los de C++, piensan más en arreglos que en hilos
- No es posible exportar código Python para aceleración en GPU como si fuera magia
- CUDA normalmente divide un problema en miles de bloques pequeños
- Los bloques se dividen en tiles aún más pequeños
- Dentro de los tiles, miles de hilos procesan elementos individuales
- Los hilos se agrupan para ejecutar una operación
- La gran capacidad de cómputo de la GPU proviene de poder procesar en paralelo hasta el nivel de hilo y de elemento individual
- NVIDIA considera que la ejecución en GPU no necesariamente tiene que bajar hasta el nivel de hilo, sino que también puede manejarse en el nivel intermedio de tiles
- CuTile mapea arreglos a la GPU de forma eficiente en un nivel menos granular, lo que facilita entender y depurar el código
- Según Jones, este enfoque conduce esencialmente al mismo rendimiento
- Los datos de un tile pueden componerse de vectores, tensores o arreglos
- El compilador puede hacer mejor el trabajo de mapear operaciones sobre arreglos completos desde bloques de hilos hacia la GPU, y Jones considera que muchas veces lo hace mejor que él porque entiende a fondo los detalles de ejecución de la GPU
- A diferencia de C++, Python no es por diseño un lenguaje detallista, y Jones menciona a Triton de OpenAI como un ejemplo de algo que encaja de forma natural con programas en Python
2 comentarios
¿Será más rápido que los wrappers existentes de CUDA como CuPy y PyTorch? La ventaja de CuPy y torch era que su API es casi igual a la de NumPy, así que se podían migrar sin mucho esfuerzo los códigos de prueba escritos con NumPy; con esto, habrá que probar a ver qué tal.
¿La primera velocidad de verdad es así? Está demasiado lento...