当前位置: 首页 > 工具软件 > CuPy > 使用案例 >

Cupy:Numpy在GPU上面的扩展

劳灵均
2023-12-01

介绍

  • 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的做法!
 类似资料: