Python
NumPy
无疑是任何 Python 代码最兼容的库,可以处理numpy.ndarray
(n 维矩阵数组)形式的大量数据。但是,一旦我们将处理的数据量增加到相当大的数量,多核 CPU 就无法按要求高效地处理数据,因为 Numpy 仅在并行处理能力有限的 CPU(大多数在消费者端具有 4-8 个内核)上运行.
这就是CuPy
中一个新的不错的Python库出现的地方。 CuPy 是用于 GPU 的 NumPy 兼容库。
铜
CuPy
是一个使用 NVIDIA CUDA 加速的开源矩阵库。它还使用了 CUDA 相关库,包括 cuBLAS、cuDNN、cuRand、cuSolver、cuSPARSE、cuFFT 和 NCCL,以充分利用 GPU 架构。
它是 CUDA 上兼容 NumPy 的多维数组的实现。 CuPy 由cupy.ndarray
、核心多维数组类及其上的许多函数组成。它支持numpy.ndarray
接口的子集。并且它还可以通过 GPU 和 CUDA 库来加速现有的 NumPy 代码。
硬件和软件设置
- 点子
- Python3
- 蟒蛇(可选)
- CUDA X.0(取决于硬件)
- CPU:2x Intel Xeon E5–2698 v4 @ 2.20GHz
- 主内存:1 TB
- GPU:NVIDIA Tesla V100 32 GB
- 操作系统——Windows/Linux
安装
在您的设备上下载兼容版本的 CUDA 设置并进行安装。要安装它,请打开终端并输入
pip install cupy-cuda(version)
其中 version 将是您设备上安装的 CUDA 版本。例如-
(对于 CUDA 10.0)
pip install cupy-cuda100
如果您的设备不支持 CUDA,那么您可以在 Anaconda 中安装 CuPy 并将其用于基于 CPU 的计算。或者,Anaconda 也适用于 CUDA。
在 Anaconda 上安装它——
- 打开 Anaconda 提示符并输入
conda install -c anaconda cupy
或者
- 使用 Anaconda navigator(GUI) 直接安装 cupy 库。
cupy.ndarray 的基础知识
- 导入——在下面的代码中,cp 是 cupy 的缩写,因为 np 是 numpy 的习惯做法。
import numpy as np import cupy as cp
- 就像 Numpy 一样,CuPy 也有一个
ndarray
类cupy.ndarray
,它是numpy.ndarray
的兼容 GPU 替代品。x_gpu = cp.array([1, 2, 3])
上例中的
x_gpu
是cupy.ndarray
的一个实例。您可以看到它的创建与 NumPy 的创建相同,只是将 numpy 替换为 cupy。
示例– 采用欧几里得范数(又名 L2 范数)。
import cupy as cp
import numpy as np
x_cpu = np.array([1, 2, 3])
x_gpu = cp.array([1, 2, 3])
l2_cpu = np.linalg.norm(x_cpu)
l2_gpu = cp.linalg.norm(x_gpu)
print("Using Numpy: ", l2_cpu)
print("\nUsing Cupy: ", l2_gpu)
Using Numpy: 3.7416573867739413
Using Cupy: array(3.74165739)
Numpy 与 Cupy
CuPy 是用于 GPU 的 NumPy 兼容库。与 numpy 相比,它更高效,因为使用 NVIDIA GPU 的数组操作可以提供比 CPU 计算显着的加速。
注意 - 这里使用的配置是 CPU 是 intel i7-7700 HQ,GPU 是 Geforce GTX 1050 4GB,使用 CUDA 9.0。
# Python program to
# demonstrate speed comparison
# between cupy and numpy
# Importing modules
import cupy as cp
import numpy as np
import time
# NumPy and CPU Runtime
s = time.time()
x_cpu = np.ones((1000, 1000, 100))
e = time.time()
print("Time consumed by numpy: ", e - s)
# CuPy and GPU Runtime
s = time.time()
x_gpu = cp.ones((1000, 1000, 100))
e = time.time()
print("\nTime consumed by cupy: "e - s)
Time consumed by numpy: 0.4238910675048828
Time consumed by cupy: 0.0010099411010742188
在这里,我们可以看到 CuPy 可以比 NumPy 运行得更快。
CuPy 在 cupy.ndarray 对象上实现了许多功能。有关受支持的 NumPy API 子集,请参阅参考资料。了解 NumPy 可能有助于利用 CuPy 的大多数功能。因此,建议您阅读 NumPy 文档。
参考资料——https://cupy.chainer.org/