接上一篇:
实际上,CUDA的奥秘在于它并非单一工具,正如Jensen几小时前在主题演讲中提到的,它是我们长期积累的庞大工具集合,可灵活应用于各类问题。过去一两年,我们重点推进的一项工作是将加速Python深度集成到CUDA堆栈中。因为CUDA本身并非孤立工具,Python也不能仅停留在表面——我们不仅需要内核编写能力,更需要完整的工具链支持,从上到下无缝衔接。例如,你既需要能将内核嵌入PyTorch,也需调用Python生态的各类库。
从许多角度看,所有组件必须协同工作,如同传统平台一样,在Python生态中实现从顶层到底层的完整支持。有趣的是,编译层在此图中未显式出现,因为Python本质依赖即时编译(JIT),其语言设计围绕动态性展开,无需传统构建系统(如Makefile)。你只需导入依赖项即可运行,但这也使得Python的依赖管理变得复杂。
用户反馈中常听到的声音是: 在使用Python时,他们安装了各种包,但理清依赖关系却异常困难。因此,在Python生态中,保持各层之间的互操作性将极大地提升生产力,让Python的易用性得以充分发挥。今年在CUDA技术大会(GTC)上,我们精心策划了一系列关于CUDA与Python的专题演讲。我在本次演讲的末尾也会提供一个索引,方便大家查看即将呈现的内容。
如果你对GPU的原生Python编程感兴趣, 我们准备了大量资料,逐步指导你完成不同阶段的任务。不过,我先为大家简要总结一下我们已完成的工作、我们的思考方式,以及我们正在进行的关键投资。
在我看来,Python化的CUDA 绝不仅仅是将C语言翻译成Python语法。它必须让Python开发者感到自然,符合他们的直觉。我在设计CUDA的任何功能时,都遵循一个基本原则:如果用户不完全了解其工作原理,仅凭猜测也应该大致正确,而不会感到意外。因此,Python化的CUDA不应看起来像C语言,而应保持Python的风格。
几年前, 我们从初始的Python绑定代码开始,例如CuPy,它可与我们的底层驱动进行接口交互,实现了Python绑定与底层的一一映射。但过去一年中,我们构建了更强大的工具——CUDA Core。CUDA Core是对CUDA运行时的Python化重塑,旨在实现自然且原生的Python集成。这意味着不仅仅是接口层面的改变,更包括执行流程和运作方式的全面革新。Python完全基于JIT(即时编译)构建,你无需退出进程或使用命令行编译器,即可实现全流程的Python操作。
这种改变的一个有趣之处在于, 它显著减少了GPU编程中的Python依赖树数量,从而助力我们之前展示的“上下技术栈”图景。当然,没有工具支持的软件是不完整的。如果你无法检测、识别和分析代码中的行为,那么一切努力都将付诸东流。因此,我们在过去几年中大力投入,并持续为Python开发者添加更多开发工具,包括性能分析器、代码分析器,以及代码注释功能,使注释内容能显示在编译器中(例如通过NVTX)。
上图顶部展示的就是其中一个示例, 我们甚至集成了对PyTorch层的支持。你可以直接从PyTorch程序中获取低层级的Python跟踪信息。除了核心的Python基础功能外,关键在于如何用Python编程GPU。这正是我们的目标——让你的程序和代码在Python环境中实现GPU加速,而无需退出Python环境。为此,我们提供了一系列不同的解决方案。
我们介绍一个名为cuPyNumeric的东西。cuPyNumeric是NumPy的一个一对一无缝替代库。而NumPy是Python中最广泛使用的计算库,
只需简单地更改导入指令,你所有的数值计算代码就会从在CPU上运行转变为在GPU上运行,而且不仅仅是在单个GPU上运行,它还能扩展到数千个GPU,所以,在我的小例子中,我不仅更改了导入指令,还将数组大小平方,然后它会向外扩展并在千节点集群上运行。
现在,很多CUDA编程,当你在脑海中思考CUDA编程时,你不仅仅是在想我要用Python,然后神奇地让它自动为你加速。这确实是一件很酷的事情,但如果你真的想自己编写代码并调用并行CUDA代码,那么一直以来,最常见获得CUDA的方式都是通过库,
说实话,你所需要编写的90%的代码,NVIDIA都已经为你准备好了。
因此,我们选取了一系列库,并将它们整合到一个名为Nvmath Python的包中。当然,它意味着Python风格的接口,但同时也是统一的接口。它同时包含主机侧接口,你可以从普通的CPU代码中调用这些库,以及设备侧接口, 这样你就可以将这些加速算法直接插入到你正在编写的Python内核中。
此外,它还大量借助或依赖于即时编译,在性能方面,如果一个库在知道你的数据类型、数据大小等情况下能够高效地工作,那么将库调用融合在一起的能力将带来性能上的巨大提升和显著差异。
由于Python是一种原生支持即时编译的语言,我们构建了Python数学库,以充分利用这一点。因此,你可以自然地通过库提供的API即时编译这些内容。
最后,这些库不仅仅是GPU库,Python可以在各种不同的系统上运行,因此,同一个库包可以引导执行到CPU, 无论是通过NVIDIA针对ARM的性能库,还是通过与Intel MKL库的接口来支持x86架构。它在数组类型等方面与许多现有的张量库进行互操作,
重要的是,你还可以插入我们库原生支持的多GPU扩展功能,所有这些都集中在一个标题下,通过Python包装器,能够帮助你决定并调度你所需的功能到你想去的地方。而且,它已经取得了巨大的成功。
(未完待续)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有