Accelerated Python The Community and Ecosystem
Accelerated Python The Community and Ecosystem
Anshuman Bhat, Product Management Compute Platforms
Jeremy Tanner, Open Source Programs
Andy Terrel, CUDA Python Product
GTC 2025 – March 18, 2025
目录
- The CUDA Developer Journey
- 加速的Python框架与社区
- 加速 Python 生态系统
- CUDA 加速 Python:跨技术栈的一等公民支持
- 科学工作流之旅
- 扩展之旅 (The Scaling Journey
- 机器学习之旅 (The Machine Learning Journey
- 模拟之旅 (The Simulation Journey
- 硬件之旅 (The Hardware Journey
- 继续您的 CUDA Python 之旅
- NVIDIA 品牌过渡页
The CUDA Developer Journey
CUDA 发展历程
2006年,NVIDIA发明了CUDA。预计到2026年,CUDA将庆祝其20周年生日。下图展示了从2003年到2006年,CPU和GPU每秒浮点运算性能的增长对比,以及NVIDIA GeForce 8800 (G80)的相关信息,该产品为DirectX 10进行了架构设计。
什么是CUDA?
CUDA是一个分层的开发平台,旨在为开发者和应用程序生态系统提供支持。其核心架构如下图所示,其中Python是受支持的并行语言之一,位于NVIDIA加速库之上,并通过编译器目标(如NVVM/LLVM IR和PTX Assembly ISA)与硬件交互。
使 CUDA Python 成为原生支持
NVIDIA致力于将CUDA深度整合到Python生态系统中,以服务于庞大的开发者群体。
- 潜在用户规模:
- 可从GPU中受益的Python开发者:1亿
- 拥有成熟GPU用例的AI与科学计算开发者:3000万
- 已直接使用CUDA的开发者:600万
- Python的流行度:根据
stack overflow2024年开发者调查,Python是最受欢迎的编程语言之一。 - NVIDIA Python包下载量:2024年,通过PyPI的下载量达到12亿次。
提升开发者体验
NVIDIA通过多种方式提升CUDA开发者的体验,核心策略围绕社区参与、技术教育和资源可及性。关键举措包括:
- 自适应路线图 (Adaptive Roadmap)
- 社区参与 (Community Engagement)
- GPU资源可及性 (Accessibility to GPUs)
- 现代CUDA教学 (Teach Modern CUDA)
- GTC2025
- 行业活动 (Industry Events)
加速的Python框架与社区
Python GPU 开源项目发展时间线
GPU很早就通过社区主导的开源项目进入了Python生态系统。下图展示了从2010年到2025年主要Python GPU项目的发展历程。
社区需求:为科学计算库增加GPU支持
开源社区对在主流Python库中增加GPU/CUDA支持表现出强烈需求。例如,在scikit-image项目的GitHub Issues中,有开发者明确提出为部分函数增加GPU/CUDA支持的计划。
社区合作与开发者活动
NVIDIA积极参与并支持各类开发者社区活动、编程冲刺(sprints)和研讨会,与开发者共同推动Python生态的GPU加速。
社区贡献成果
通过与社区的紧密合作,社区的需求正在被实现。例如,针对scikit-image库中增加后端支持的需求,社区成员提交并合并了一个关键的拉取请求(Pull Request),为调度到不同后端(如GPU)提供了基础架构。
与核心基金会的合作
NVIDIA与Python生态系统中的多个核心基金会合作,共同促进开源科学计算的发展。
- Python Software Foundation
- NumFOCUS Foundation
- PyTorch Foundation
Anaconda 与 NVIDIA 合作
Anaconda 作为 NVIDIA 的长期 Python 合作伙伴,在其平台中集成了 CUDA。
-
生态系统规模:
- 拥有超过 4700 万用户和 100 万个组织。
- 支持数千个开源人工智能和数据科学包,如 NumPy, SciPy, pandas, Matplotlib, PyTorch 等。
-
重要发布:
- CUDA 12 现已可用。
- Anaconda Cloud 上提供 Jupyter + CUDA。
保持合作
NVIDIA 鼓励社区通过其开源项目进行合作。
- GitHub: http://github.com/NVIDIA
- 开发者门户: http://developer.nvidia.com/open-source
加速 Python 生态系统
NVIDIA 的一项核心任务是:
<blockquote>让 CUDA 在 Python 中的使用容易 100 倍。
</blockquote>CUDA 加速 Python:跨技术栈的一等公民支持
"一等公民"意味着 CUDA 现在将 Python 纳入了平台的每一个 API 和特性中,实现了跨不同层次库的互操作性(可混合搭配使用)。
下图展示了 CUDA Python 在整个技术栈中的分布,从底层的运行时和工具,到顶层的框架和领域特定语言(DSLs)。
科学工作流之旅
PHROSTY 团队:天体物理学家转型为 GPU 开发者
这是一个具体的科学应用案例,展示了研究人员如何利用 GPU 加速其工作流程。
- 项目背景:来自杜克大学、卡内基梅隆大学、匹兹堡大学和劳伦斯伯克利国家实验室的研究人员正在创建一个数据处理管道,用于从罗曼太空望远镜拍摄的巡天图像中分离出超新星。
- 团队成员:
- Lauren Aldoroty, PhD (杜克大学博士后研究员)
- Robert Knop, PhD (劳伦斯伯克利国家实验室计算天体物理学家)
- Michael Wood-Vasey (匹兹堡大学天文学教授)
- Lei Hu, PhD (卡内基梅隆大学时域天文学博士后)
- Shu Liu (匹兹堡大学天文学研究生)
技术核心:数组编程与互操作性
数组编程 (Array Programming)
数组编程是科学计算的基础。NumPy 是 Python 中数组编程的核心库,它允许高效地创建和操作多维数组。
从数组到领域库 (Arrays to Domain Libraries)
NumPy 数组是构建更高级领域特定库的基石,这些库广泛应用于数据科学和机器学习,例如 PyTorch, JAX, scikit-learn, biopython 等。
Python 数组 API 标准
为了解决不同数组库之间的兼容性问题,Python 社区制定了 Python 数组 API 标准,并得到了广泛采用。这促进了生态系统中不同库之间的互操作性。
- 组织: DataAPIs (https://data-apis.org)
- 采用情况: 下图展示了众多库(如 DASK, cuDF, pandas, PyTorch, JAX 等)对该标准的支持情况。
迁移到 GPU
为了利用 GPU 的并行计算能力,可以将基于 CPU 的 NumPy 工作流无缝迁移到 GPU。CuPy 是一个实现了与 NumPy 兼容 API 的库,使得这种迁移变得简单。
DLPack: 零拷贝、GPU 感知的数据交换
DLPack 是一种开放的内存张量结构标准,用于在不同深度学习框架之间实现零拷贝的数据交换。它定义了一套通用的数据结构,如 DLTensor 和 DLDevice,使得数据可以在支持该标准的框架(如 PyTorch, TensorFlow, CuPy, MXNet 等)之间高效传递,无需在设备内存之间进行昂贵的数据复制。
下图展示了 DLPack 的核心数据结构。
走向优化的 GPU 库
从 NumPy 到 CuPy,再到 nvmath-python,展示了向优化 GPU 库演进的路径。
nvmath-python: 面向加速 Python 的加速数学库
一个通往高性能 GPU 库的 Pythonic 接口
重塑 Python 数学库
- 为实现最佳性能提供 Pythonic API
- 对内核融合进行即时编译(Just-in-time compilation)
- 无需大规模代码重写即可实现可扩展性
- 开源、可互操作,与现有生态系统集成
- 可通过 Conda、Pip 和 GitHub 获取
API 设计
- 有状态(Stateful)API 允许通过多次执行来分摊规划/自动调优成本。
- 无状态(Stateless)API 提供了极大的便利性。
- 与流行的张量库和框架互操作。
- 提供低级 Python 绑定和高级 Python API。
下图对比了无状态和有状态 API 在执行快速傅里叶变换(FFT)时的代码差异。有状态 API 通过预先创建并规划 FFT 对象,在多次执行中分摊了规划成本,而无状态 API 在每次调用时都进行规划。
南希·格雷斯·罗曼空间望远镜(Nancy Grace Roman Space Telescope)
PHROSTY 超新星发现与光度测量流水线
该应用程序包含3个部分:
1. 预处理(Preprocessing):涉及计算点扩散函数(point-spread function)。
2. sFFT:将图像转换到傅里叶空间,并进行图像相减。
3. 后处理(Postprocessing):寻找并应用去相关函数。
PHROSTY 增量加速
下图展示了通过利用支持 GPU 的 Python 库所实现的性能提升。与使用 NumPy 在 CPU 上运行相比,使用 CuPy 在 GPU 上(未优化)可获得 23倍 的加速,而结合使用 CuPy 和 nvmath-python 的优化 GPU 版本则可实现 39倍 的加速。
这是一个与杜克大学、匹兹堡大学、卡内基梅隆大学和劳伦斯伯克利国家实验室的合作研究项目。
扩展之旅 (The Scaling Journey)
在原子尺度探索物质
SLAC 的直线加速器相干光源 (LINAC coherent light source)
该研究由 SLAC 国家加速器实验室的副研究员 Quynh Nguyen 博士领导。实验通过激光激发材料,然后使用 X 射线(5-20 keV)进行探测,这个过程会产生太字节(Terabytes)级别的数据。
硬件之旅:从桌面到强大的节点再到超级计算机
软件栈的演进路径从 NumPy 开始,通过 CuPy 迁移到 GPU。为了进一步扩展到超级计算机,可以采用两种并行策略:
- 显式并行(Explicit Parallelism):使用通信库,如 mpi4py 和 nvshmem4py。
- 隐式并行(Implicit Parallelism):使用领域特定库,如 cuPyNumeric。
NVIDIA cuPyNumeric: 扩展 NumPy 和 Scipy
cuPyNumeric 能够以零代码更改的方式实现扩展,从单 CPU 扩展到 GPU,乃至多 GPU 和多节点集群。用户只需将代码中的 import numpy as np 更改为 import cupynumeric as np 即可。
Legate: 一个可组合、可扩展的运行时
Legate 是 cuPyNumeric 背后的运行时系统。
- 轻松扩展的隐式并行提取:库将 API 调用转换为任务,运行时通过依赖性分析来提取并行性。
- 用于可组合性的统一数据抽象:Legate 运行时为不同的数据结构(如 np.ndarray, sparse.csr_matrix, pd.DataFrame)提供统一的数据存储抽象,增强了不同库之间的组合性。
直线加速器相干光源:将发现时间从三年缩短到数分钟
下图展示了使用 NumPy 和 cuPyNumeric 在进行实验、数据分析、决策和最终发现过程中的时间对比。
- NumPy: 整个过程耗时约 3年,其中绝大部分时间用于数据分析。
- cuPyNumeric: 整个过程缩短至 小于5分钟。
机器学习之旅 (The Machine Learning Journey)
如今的 JAX 和 PyTorch 等框架深度运行在 CUDA C++ 之上。下图展示了从高层框架(如 PyTorch)到底层硬件驱动的完整软件栈,突出了 cuDNN、cuBLAS、CUTLASS 和 CUDA C++ 等关键组件在其中的作用。
cuDNN Python for the new age frameworks
展示了 PyTorch 通过 Lightning AI 创建的 Lightning Thunder 编译器,最终调用 cuDNN 库的流程。这使得高层框架能够利用如 Flash Attention 等底层优化核,来进行高效的推理和训练。
Python 自由线程 (Python Free Threading)
与 Python 时代保持同步
传统 Python 由于全局解释器锁(GIL)的存在,多线程无法实现真正的并行执行。自由线程(Free Threading)旨在移除 GIL,允许多个线程同时执行,从而实现真正的并行计算。
使用线程的 torch.DataLoader
通过使用线程,可以实现 CUDA 上下文共享、降低内存消耗并利用线程级并行。下图比较了在图像解码(使用 NVImageCodec)任务中,使用多进程与多线程的吞吐量。结果显示,使用线程可以获得显著更高的吞吐量(例如,9个线程时达到 736k imgs/sec)。
自由线程的 PyTorch (Free Threaded PyTorch)
提供了一个处理了所有依赖关系的 Docker 镜像,以支持自由线程的 PyTorch 环境。下图展示了其复杂的依赖关系图。
模拟之旅 (The Simulation Journey)
从科学到模拟:融会贯通
将科学原理应用于模拟,可以解决复杂问题。以下是一些模拟应用的示例:
这些模拟涵盖了多个领域:
- 纳维-斯托克斯(Navier-Stokes)流体模拟:模拟流体绕过障碍物的行为。
- 混合欧拉-拉格朗日(Hybrid Eulerian-Lagrangian)流体:模拟复杂的流体效果。
- 新胡克(Neo-Hookean)弹性:模拟弹性材料的形变。
- 机器人任务:使用 warp.fem 进行机器人与环境的交互模拟。
NVIDIA Warp:面向模拟AI的关键特性
NVIDIA Warp 为模拟和AI提供了强大的功能,主要分为三个方面:
-
几何处理 (Geometry Processing)
- 示例:
- 网格距离/采样查询 (Modulus)
- 有向距离场 (SDF) 生成 (NanoVDB)
- 点云处理
- 图神经网络 (GNN) 构建 (Modulus)
- 计算流体动力学 (CFD) 数据的可视化与分析
- 示例:
-
可微分模拟 (Differentiable Simulation)
- 示例:
- 高效的格子玻尔兹曼 (Lattice-Boltzmann) 核函数 (KLB)
- 加速的机器人策略学习 (SHAC)
- 神经降阶模型 (MIT)
- 物理神经辐射场 (Physics NeRF) (UTDT)
- 加速的有限元法 (FEM)
- 示例:
-
加速模型与训练 (Accelerated Models and Training)
- 示例:
- 图像处理
- 内存高效的卷积网络 (ConvNet)
- 加速的AI扩散模型 (AI-diffusion)
- 加速的等变神经网络
- 加速的Kolmogorov-Arnold网络 (KAN)
- 示例:
Warp 就是 Python
Warp 是一个为 Python 设计的可微分空间计算库,使得在 Python 中编写高性能 CUDA 内核变得简单。
- 安装:
pip install warp-lang - 代码示例:
下面是一个使用 Warp 编写的半隐式欧拉积分步骤的内核代码。通过@wp.kernel装饰器定义,并使用wp.launch在 CUDA 设备上启动。
import warp as wp
@wp.kernel
def integrate(p: wp.array(dtype=wp.vec3),
v: wp.array(dtype=wp.vec3),
f: wp.array(dtype=wp.vec3),
m: wp.array(dtype=float)):
tid = wp.tid()
# Semi-implicit Euler step
v[tid] = v[tid] + f[tid] * m[tid] * dt
wp.vec3(0.0, -9.8, 0.0) * dt
x[tid] = x[tid] + v[tid] * dt
# kernel launch
wp.launch(integrate, dim=1024, inputs=[x, v, f, ...], device="cuda:0")
硬件之旅 (The Hardware Journey)
通往 Tensor Core 之旅:从基于线程的编程到基于数组的编程
硬件和编程模型的演进,正从传统的基于单个线程的编程模式,转向更高效、更抽象的基于数组(张量)的编程模式。这一转变为 Tensor Core 的高效利用奠定了基础。
cuTile: Pythonic CUDA
cuTile 使得基于数组/张量的编程在 Python 中更加自然。
- Tile 编程 旨在为 Python 用户提供直观的体验:
- 基于数组的模型在 Python 中很常见(例如 NumPy)。
- 程序在每个块(Block)中具有单一的逻辑控制线程。
- 操作是协作性的,并在一个 Tileblock 中的所有线程中并行执行。
- 通过为您处理线程管理来简化 GPU 编程。
下图对比了使用 NumPy 和 cuTile 实现 Softmax 的代码。cuTile 的代码结构与 NumPy 类似,但能直接在 GPU 上高效执行。Tileblocks 并行加载和计算各自的数据块。
Tile 编程对于数据并行程序既简单又强大
通过对比矩阵乘法算法的实现,可以清晰地看到 Tile 编程的优势。与使用 Numba SIMT 编写的复杂底层 CUDA C++ 风格代码相比,cuTile-python 的实现更加简洁、高级。
使用 cuTile 实现 Llama-3.1
cuTile 可用于在 PyTorch 中通过自定义核函数实现 Llama-3.1 的推理。性能测试表明,在 Blackwell B200 平台上,cuTile 的性能可以达到 PyTorch Eager 模式下使用 cuDNN SDP 优化后性能的 93%,展现了其强大的性能潜力。
结合高生产力与高性能
cuTile 实现了在 Python 中以更少的代码、更短的实现时间,获得接近于手动调优 C++ 的性能。
- 优势:
- 更少的工作量
- 更少的代码行数
- 更短的实现时间
- 性能在 C++ 的 10% 以内
继续您的 CUDA Python 之旅
CUDA 与 Python:光速般的生产力故事
我们提供了一系列学习路径,帮助您掌握 CUDA Python:
-
第 0 步: 了解我们的 Python 故事
- 加速 Python:社区与生态系统 (Accelerated Python: The Community and Ecosystem)
- 时间: 星期二, 3 月 18 日, 3:00 PM - 3:40 PM PDT
-
第 1 步: 学习 CUDA Python 工具
- CUDA Python 开发者工具箱 (The CUDA Python Developer's Toolbox)
- 时间: 星期三, 3 月 19 日, 10:00 AM - 10:40 AM PDT
-
第 2 步: 深入内核
- 用 Python 编写 CUDA 内核的 1001 种方法 (1,001 Ways to Write CUDA Kernels in Python)
- 时间: 星期三, 3 月 19 日, 11:00 AM - 11:40 AM PDT
-
第 3 步: 精通 Tensor Core
- 使用 CUTLASS 4.0 在 Python 中启用 Tensor Core 编程 (Enable Tensor Core Programming in Python With CUTLASS 4.0)
- 时间: 星期五, 3 月 21 日, 11:00 AM - 11:40 AM PDT
GTC 2025 的 CUDA 开发者会议
GTC 2025 提供了丰富的 CUDA 相关会议,涵盖从入门到精通的各个层面:
- 通用 CUDA: S72571, S72897
- CUDA Python: S72450, S72448, S72449, S74639
- CUDA C++: S72574, S72572, S72575
- 开发者工具: S72527
- 与专家交流: S72433, CWE73310, CWE73393, CWE75384
- 多 GPU 编程: S72576, S72579, S72578
- 性能优化: S72683, S72685, S72686, S72687
更多详情请访问:http://nvidia.com/gtc/sessions/cuda-developer
NVIDIA 品牌过渡页
此幻灯片为NVIDIA的品牌过渡页,不包含具体的技术或学术内容。