概述#

CuPy 是一个兼容 NumPy/SciPy 的数组库,用于使用 Python 进行 GPU 加速计算。CuPy 作为现有 NumPy/SciPy 代码的替代品,可以在 NVIDIA CUDAAMD ROCm 平台上运行。

CuPy 提供了一个 ndarray ,稀疏矩阵,以及与 GPU 设备相关的例程,所有这些都具有与 NumPy 和 SciPy 相同的 API:

例程由CUDA库(cuBLAS、cuFFT、cuSPARSE、cuSOLVER、cuRAND)、Thrust、CUB和cuTENSOR支持,以提供最佳性能。

还可以轻松实现与 ndarray 一起工作的 自定义 CUDA 内核 ,使用:

  • 内核模板:快速将元素级和归约操作定义为单个CUDA内核

  • 原始内核:导入现有的 CUDA C/C++ 代码

  • 即时编译器 (JIT):从 Python 源代码生成 CUDA 内核

  • 内核融合: 将多个 CuPy 操作融合到一个 CUDA 内核中

CuPy 可以在多GPU或集群环境中运行。分布式通信包(cupyx.distributed)为 ndarray 提供了集体和点对点原语,由NCCL支持。

对于需要更精细性能控制的用户,可以访问 低级 CUDA 功能

  • 流和事件:所有API都支持CUDA流和每个线程的默认流。

  • 内存池:带有内置内存池的可定制内存分配器

  • 分析器:支持使用 CUDA 分析器和 NVTX 进行代码分析

  • 主机 API 绑定:直接从 Python 调用 CUDA 库,如 NCCL、cuDNN、cuTENSOR 和 cuSPARSELt API。

CuPy 实现了用于数据交换和互操作性的标准API,例如 DLPackCUDA Array Interface``__array_ufunc__``(NEP 13)、``__array_function__``(NEP 18)和 Array API Standard。得益于这些协议,CuPy 可以轻松地 集成 与 NumPy、PyTorch、TensorFlow、MPI4Py 以及任何其他支持这些标准的库。

在 AMD ROCm 环境下,CuPy 自动将所有 CUDA API 调用转换为 ROCm HIP(hipBLAS、hipFFT、hipSPARSE、hipRAND、hipCUB、hipThrust、RCCL 等),使得使用 CuPy 编写的代码无需任何修改即可在 NVIDIA 和 AMD GPU 上运行。

项目目标#

CuPy 项目的目标是为 Python 用户提供 GPU 加速能力,而无需深入了解底层 GPU 技术。CuPy 团队专注于提供:

  • 完整的 NumPy 和 SciPy API 覆盖,以成为一个完全的替代品,以及先进的 CUDA 功能,以最大化性能。

  • 成熟且高质量的库,作为所有需要加速的项目的基础包,从实验室环境到大规模集群。