介绍
- CuPy是一个通过利用CUDA GPU库在Nvidia GPU上实现Numpy阵列的库。通过该实现,由于GPU具有许多CUDA核心,因此可以实现优异的并行加速
- CuPy的界面是Numpy的镜像,在大多数情况下,它可以用作直接替代品。只需用兼容的CuPy代码替换你的Numpy代码,就可以获得GPU加速。CuPy将支持Numpy所拥有的大多数阵列操作,包括索引,广播,数组上的数学和各种矩阵变换
pip install cupy
- 在Numpy和CuPy之间切换,cp 替换为 np
- Ctrl + H,把
np.
全部替换为cp.
(import cupy as cp
) - 一旦我们达到大约1000万个数据点,加速就会大幅提升,一旦我们跨越1亿个点数,速度就会快得多。在那之下,Numpy实际上更快。另外请记住,更多的GPU内存将帮助您处理更多数据,因此,重要的是要了解您的GPU是否有足够的内存来容纳足够的数据,而CuPy是值得的。
cupy与numpy、pytorch Tensor转换
cupy <> numpy
import cupy as cp
import numpy as np
#cupy > numpy
numpy_data = cp.asnumpy(cupy_data)
#numpy > cupy
cupy_data = cp.asarray(numpy_data)
- cupy->numpy过程较慢
cupy <> tensor
from cupy.core.dlpack import toDlpack
from cupy.core.dlpack import fromDlpack
from torch.utils.dlpack import to_dlpack
from torch.utils.dlpack import from_dlpack
import torch
#tensor > cupy
cupy_data = fromDlpack(to_dlpack(tensor_data))
#cupy > tensor
tensor_data = from_dlpack(toDlpack(cupy_data))
numpy <> tensor
import numpy as np
import torch
#tensor > numpy
numpy_data = tensor_data.numpy()
#numpy > tensor
tensor_data = torch.from_numpy(numpy_data)
转换 utils
# tensor <-> cupy
def tensor2cupy(tensor_data):
return fromDlpack(to_dlpack(tensor_data))
def cupy2tensor(cupy_data):
return from_dlpack(toDlpack(cupy_data))
# cupy <-> numpy
def cupy2numpy(cupy_data):
return cp.asnumpy(cupy_data)
def numpy2cupy(numpy_data):
return cp.asarray(numpy_data)
# numpy <-> tensor
def numpy2tensor(numpy_data):
return torch.from_numpy(numpy_data)
def tensor2numpy(tensor_data):
return tensor_data.numpy()
## 太麻烦了,全部换成torch写!
- tensor 包含梯度等信息,可能含的东西太多了
- 做法:对于较大张量的计算采用cupy对某些运算进行加速,而torch只在深度学习网络计算中使用!
即ECO的做法!