NVIDIA终于迈出了具有里程碑意义的一步:CUDA现在原生支持Python了。这对AI开发者意味着什么?它极大简化了GPU计算程序的开发,让Python程序员无需学习C/C++就能充分利用GPU算力。核心亮点有三:CUDA工具包正式集成原生Python支持;全新CuTile接口让算法开发更简便,性能却能跟C++代码一较高下;Python成为CUDA的首选语言,NVIDIA的开发者基础将大幅扩容。

谈及这次转变的背景,得先提一组数据:GitHub 2024年开源调查显示,Python已经超过JavaScript,成为全球最受欢迎的编程语言。而多年来,NVIDIA的CUDA工具包一直没有原生Python支持——这个局面,现在终于被打破了。
在GTC大会上,NVIDIA正式宣布在CUDA工具包中实现原生Python支持并完全集成。开发者可以直接用Python在GPU上执行算法风格的计算。CUDA架构师Stephen Jones在演讲中直言:“我们一直在努力把加速的Python作为一等公民引入CUDA堆栈。”
这对程序员的影响极为深远。CUDA从诞生起就扎根于C和C++,如今开发者无需掌握这些语言也能使用工具包。Jones强调:“CUDA的Python不应该看起来像C,它应该看起来像Python。”这不仅仅是语法层面的翻译,而是让Python开发者感到“这很自然”。开发者可以用原生的Python接口和脚本模型来调用函数和库,创建在NVIDIA GPU上运行的AI程序。
原生Python支持打开新的大门
原生支持意味着数百万Python开发者能够无障碍地使用CUDA。在此之前,CUDA要求开发者掌握C++或Fortran,虽然有一些Python工具,但并非原生。根据The Futurum Group的数据,2023年CUDA用户仅为400万(2020年为200万),而Python是世界上增长最快的语言。NVIDIA将能触达大量Python程序员——尤其在印度、巴西等发展中国家,那里的程序员对开源项目贡献热情高涨。
Python支持也会让NVIDIA的基础设施更容易进入新兴市场。目前NVIDIA GPU大部分部署在欧美,但印度等国的电信和基础设施公司正在建设大型GPU设施,未来几年将陆续投入使用。NVIDIA也在加大程序员招募力度,并计划支持更多编程语言,包括Rust和Julia。
Pythonic CUDA的构建过程
CUDA包含库、SDK、编译器、主机运行时、工具以及预打包的软件和算法。NVIDIA将这些组件逐一组装到完整的Pythonic CUDA堆栈中。核心目标是在不脱离Python的前提下实现GPU加速。Jones说:“你不能只提供一个内核产品,堆栈里的每一层都要有流畅的执行流程。你必须能写一个内核放到PyTorch里,同时也能调用Pythonic库和其他东西。”
实际架构中,编译器层几乎不存在,因为它围绕即时(JIT)编译构建。这大幅减少了堆栈中GPU依赖的树状结构数量。Jones认为:“保持各层之间的互操作性将极大提高生产力,让开发者能端到端地使用Python。”
最初,NVIDIA构建了基本的Python绑定(含运行时编译器)和Python库,比如cuPyNumeric——这是NumPy的直接替代品。只需更改一条导入指令,NumPy代码就从CPU执行切换到GPU执行。
过去一年中,NVIDIA打造了CUDA Core。Jones称之为“对CUDA运行时的Pythonic重新构想”,使其天然适配Python。CUDA Core拥有完全在进程内执行、重度依赖JIT编译的Python执行流。“不应该退出命令行编译器或任何类似的东西,一切都在进程内完成,”Jones补充道,这进一步减少了依赖项数量。
NVIDIA还创建了名为NVMath Python的库,提供主机端和设备端库调用的统一接口。融合库调用的能力带来了显著性能提升。此外,他们还构建了可直接从Python代码访问的加速C++库——因为这些库是基于多年积累的基础设施构建的,NVIDIA没有在Python里重新实现它们,而是确保链接到底层经过微调的C++代码,因此性能差异几乎可以忽略不计。工具方面,也加入了分析器和代码分析器。
CuTile编程模型
Python让编码变得简单,开发者无需过多关注底层硬件。基于此,NVIDIA新增了一个编码层,与GPU上执行的更高级别抽象对齐。这就是全新的编程模型——CuTile接口,它首先为Pythonic CUDA而生,后续还将推出C++ CUDA的扩展。
CuTile“从根本上更柏拉图式”——因为今天的Python程序员更多考虑数组而非线程(线程更像是C++的思维方式)。开发者不能指望随便拿一段Python代码就能自动导出到GPU加速。通常,CUDA会先把问题拆解成数千个小块,在GPU上单独处理。这些小块进一步分解成更小的“瓦片”,每个瓦片运行数千个线程处理单个元素,最后线程组合成单一操作。能够一直下探到线程级别的单个元素并行处理,正是GPU强大算力的来源。
但NVIDIA认为,GPU执行并不一定非要降到线程级别。在瓦片级别处理完全可行——CuTile编程模型正是为此而设计。与C++不同,Python在设计上就不是粒状的。CuTile在较低的粒度级别把数组映射到GPU上,让代码更易理解、更易调试。“从根本上说,它的性能是一样的,”Jones说。
瓦片中的数据可以构造为向量、张量或数组,编译器能将整个数组操作从一个线程块映射到GPU。“通常,编译器会比我做得更好,因为编译器深入了解我在做什么,以及GPU运行的细节,”Jones补充道。他认为,类似OpenAI的Triton这类模型也非常适合Python程序。
