NVIDIA ha dado un paso histórico al integrar por fin soporte nativo completo para Python en su toolkit CUDA, abriendo su potente plataforma de desarrollo para GPUs a millones de programadores en todo el mundo. Este cambio representa una transformación significativa en la accesibilidad de la programación para GPUs de NVIDIA, que hasta ahora requería conocimientos de lenguajes como C++ o Fortran.
Python se corona como el rey de los lenguajes de programación
Según GitHub en su encuesta sobre código abierto de 2024, Python superó a JavaScript para convertirse en el lenguaje de programación más popular del mundo en 2024. A pesar de este dominio, el toolkit CUDA de NVIDIA, fundamental para el desarrollo de aplicaciones de alto rendimiento en sus GPUs, carecía de soporte nativo para Python hasta ahora.
"Hemos estado trabajando duro para traer Python acelerado, de primera clase, a la pila CUDA", afirmó Stephen Jones, arquitecto de CUDA, durante su presentación en la reciente conferencia GTC.
Para los programadores, las implicaciones son enormes. CUDA nació desde C y C++, y ahora los desarrolladores no necesitan conocimientos de estos lenguajes para utilizar el toolkit. Como enfatizó Jones: "Python para CUDA no debería parecer C. Debería parecer Python."
Los programadores podrán utilizar interfaces naturales de Python y el modelo de scripting para llamar a funciones y bibliotecas, creando programas de IA para su ejecución en GPUs de NVIDIA con mayor facilidad.
"Python CUDA no es simplemente C traducido a sintaxis Python. Tiene que ser algo natural para un desarrollador de Python", añadió Jones.
El soporte nativo de Python abre nuevas puertas
La integración de Python en CUDA abre el kit de desarrollo a millones de programadores. Anteriormente, CUDA exigía que los desarrolladores conocieran C++ o Fortran, con algunas herramientas para Python pero sin soporte nativo.
Según The Futurum Group, el número de usuarios de CUDA era de solo 4 millones en 2023, un aumento desde los 2 millones en 2020. Sin embargo, Python es el lenguaje de programación de más rápido crecimiento en el mundo, y NVIDIA podrá acceder a millones de programadores de Python, especialmente en países en desarrollo como India y Brasil, donde los desarrolladores hacen importantes contribuciones a proyectos de código abierto.
Este soporte también preparará la infraestructura de NVIDIA para su uso en mercados emergentes. La mayoría de las GPUs de NVIDIA se encuentran en Estados Unidos y Europa, pero las empresas de telecomunicaciones e infraestructura en India están construyendo importantes instalaciones de GPUs que estarán operativas en los próximos años.
NVIDIA está invirtiendo fuertemente en reclutar programadores y busca dar soporte a más lenguajes de programación, incluyendo Rust y Julia.
Cómo se construyó el CUDA Pythónico
CUDA incluye bibliotecas, SDKs, compiladores, runtimes de host, herramientas y software y algoritmos preempaquetados. NVIDIA ha añadido componentes a toda la pila CUDA Pythónica.
El enfoque de NVIDIA fue proporcionar aceleración GPU sin salir de Python. CUDA Python no puede limitarse a ofrecer kernels; necesita todo en la pila y un flujo de ejecución fluido, explicó Jones.
"Tienes que poder escribir un kernel e integrarlo en PyTorch, pero también tienes que poder llamar a bibliotecas Pythónicas y todas estas otras cosas", señaló.
En esencia, no hay nada en la capa del compilador, ya que está construido en torno a la compilación just-in-time (JIT). Esto reduce significativamente el número de dependencias en el árbol para GPUs en la pila.
"Mantener esta interoperabilidad entre todas las capas va a ser una enorme ganancia para la productividad y para poder usar Python de principio a fin", afirmó Jones.
Inicialmente, NVIDIA construyó bindings básicos de Python (que incluyen el compilador de tiempo de ejecución) y bibliotecas Python como cuPyNumeric, que es un reemplazo directo para NumPy, la biblioteca computacional más utilizada en Python. cuPyNumeric cambia solo una directiva de importación, y el código NumPy pasa de ejecutarse en la CPU a ejecutarse en una GPU.
Durante el último año, NVIDIA creó CUDA Core, que Jones describió como una "reimaginación Pythónica del runtime de CUDA para que sea natural y nativamente Python".
CUDA Core tiene el flujo de ejecución de Python, que está completamente en proceso y se apoya fuertemente en la compilación JIT.
"No deberías estar utilizando compiladores de línea de comandos ni nada por el estilo, deberías estar completamente en proceso", dijo Jones, añadiendo que esto reduce significativamente el número de dependencias en el árbol para GPUs en la pila.
El modelo de programación
Python simplifica la programación y los desarrolladores no tienen que preocuparse demasiado por el hardware subyacente. Con esto en mente, NVIDIA está añadiendo una capa de codificación que se alinea con una abstracción de nivel superior para la ejecución en GPUs.
El nuevo modelo de programación, llamado interfaz CuTile, se está desarrollando primero para CUDA Pythónico, con una extensión para CUDA C++ que llegará más tarde.
CuTile es "fundamentalmente más platónico", ya que los programadores de Python hoy en día piensan más en términos de arrays que de hilos (que es más característico de C++).
Los desarrolladores no pueden mágicamente tomar código Python y exportarlo para aceleración GPU. CUDA normalmente toma un problema y lo divide en miles de bloques más pequeños que se procesan por separado en GPUs.
Estos bloques se dividen en "azulejos" (tiles) más pequeños, que ejecutan miles de hilos procesando elementos individuales. Los hilos se agrupan en una sola operación.
La capacidad de procesar elementos individuales a nivel de hilo en paralelo proporciona a las GPUs su enorme potencia de cómputo.
Sin embargo, NVIDIA descubrió que la ejecución en GPU no necesita llegar hasta el nivel de hilo. El procesamiento también puede realizarse a medio camino, a nivel de tiles, que es donde encaja el modelo de programación CuTile.
CuTile hace un trabajo eficiente de mapeo de arrays a GPUs a un nivel menos granular, lo que hace que el código sea más fácil de entender y depurar. "Y fundamentalmente, se obtiene el mismo rendimiento", dijo Jones.
Los datos en tiles pueden estructurarse como vectores, tensores o arrays. Los compiladores pueden hacer un mejor trabajo de mapeo de hilos de operaciones de arrays completos desde un bloque de hilos a GPUs.
"Muy a menudo el compilador lo hará mejor que yo porque el compilador entiende profundamente lo que estoy haciendo… [y] los detalles finos de cómo funciona la GPU", explicó Jones.
A diferencia de C++, Python no es granular por diseño.
"Hay muchas de estas cosas por ahí. El Triton de OpenAI sería un buen ejemplo. Y creo que esos son un ajuste natural para los programas Python", concluyó Jones.
Este cambio histórico de NVIDIA promete democratizar el acceso a la programación de GPUs y abrir nuevas posibilidades para desarrolladores que antes encontraban barreras en los requisitos de lenguajes más complejos como C++. Con Python ahora integrado nativamente en CUDA, millones de programadores podrán aprovechar el poder de las GPUs de NVIDIA de forma más accesible y natural.