概述#
CuPy 是一个兼容 NumPy/SciPy 的数组库,用于使用 Python 进行 GPU 加速计算。CuPy 作为现有 NumPy/SciPy 代码的替代品,可以在 NVIDIA CUDA 或 AMD ROCm 平台上运行。
CuPy 提供了一个 ndarray ,稀疏矩阵,以及与 GPU 设备相关的例程,所有这些都具有与 NumPy 和 SciPy 相同的 API:
N维数组 (
ndarray): cupy.ndarray数据类型 (dtypes):布尔 (
bool_)、整数 (int8,int16,int32,int64,uint8,uint16,uint32,uint64)、浮点数 (float16,float32,float64) 和复数 (complex64,complex128)支持与
numpy.ndarray相同的语义,包括基本/高级索引和广播。
稀疏矩阵:cupyx.scipy.sparse
二维稀疏矩阵:
csr_matrix、coo_matrix、csc_matrix和dia_matrix
NumPy 例程
SciPy 例程
例程由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,例如 DLPack、CUDA 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 功能,以最大化性能。
成熟且高质量的库,作为所有需要加速的项目的基础包,从实验室环境到大规模集群。