CUDA原来只支持C/C++/Fortran,在2025的CES上宣布支持原生Python其实是不得已而为之,一方面现在Python的AI开发者数量过于庞大,达到数千万级别,而CUDA仅几百万,CUDA想扩大自己的用户圈子,只能拉Python入伙。
另一方面,Python生态的计算库实在太强大,比如numpy,几乎垄断了数组计算,还有像scipy、keras等,已经成为机器学习的主流工具,CUDA必须要兼容这些Python库,因此推出了numpy的cuda接口cuPyNumeric,以及能涵盖scipy功能的计算库nvmath
,这些都是CUDA为了融入Python而做的工作。再加上现在即时编译技术JIT的成熟,比如numba库,Python代码能实时的编译为CUDA的PTX指令,消除了Python和GPU编程之间的障碍。
比如cuPyNumeric已经100%支持Numpy API。
# 原生支持前(使用 CPU)
import numpy as np
x = np.random.rand(1000, 1000)
y = np.linalg.inv(x)
# 原生支持后(GPU 加速)
import cupy.numeric as np # 仅替换导入
x = np.random.rand(1000, 1000)
y = np.linalg.inv(x) # 自动在 GPU 执行[2,6]
nvmath能实现Python各种数学计算。
import nvmath
a = nvmath.array([1.0, 2.0], device='gpu') # 指定 GPU
b = nvmath.sin(a) + nvmath.cos(a) # 自动融合计算[5,6]
最后一点,可能也是最紧迫的原因,OpenAI推出的Triton正在一步步拉拢Python开发者,威胁CUDA的市场地位。这里解释下,Triton其实是CUDA的高级封装,也是GPU开发工具,但它能支持Python开发,将Python语言转化为CUDA语言,所以大家慢慢习惯在Triton使用Python做GPU开发。Triton甚至于想兼容除Nvidia之外的各种GPU,成为大一统的GPU编程平台。
你说,CUDA能不急吗?
既然Python在GPU编程领域这么吃香,那为什么CUDA不一开始就原生支持Python,偏要等有了竞争对手攻城才着急忙慌的宣布支持Python。
对Nvidia来说,既有技术上的障碍,也有商业上的考量。
首先是效率问题。CUDA是静态编译的GPU语言,其实就是机器语言,主打的直接快速,它早期支持C/C++/Fortran,也是因为这些语言是静态语言,而Python是动态语言,与GPU计算的要求有很大冲突,比如没办法及时类型推断、内存访问等,非常影响执行效率。另外Python是解释性语言,解释器开销比编译语言要大很多,还有全局解释器锁 (GIL)没办法真正并行,这些也都会降低CPU编程的效率,与CUDA的目的显得格格不入。
后来直到出现了PyCUDA、Numba,将Python代码即时编译为CPU能执行的机器代码才解决了这一问题。
其次Nvidia在CUDA设计之初是想把资源集中给更加商业能力更强、技术更成熟的C/C++/Fortran开发者,而当时的Python开发者其实对GPU编程的需求并不高,且Python由于语言本身的限制,如果集成到CUDA,投入的资源会非常大,而且回报率并不明朗。
但近几年Python在AI开发上的爆发式增长,以及后起之秀Triton的威胁,Nvidia开始投入大量资源集成Python,并在今年官宣加入Python大家庭。