标签: cupy

Cupy异步GPU内存传输

是否可以使用cupy(或chainer)从GPU异步传输内存到GPU ?

我正在训练一个相对较小的网络,其中包含无法容纳到GPU内存中的非常大的数据。此数据应保存在CPU内存中,并依次提供给GPU进行小批量计算。

内存传输时间是此应用程序的主要瓶颈。我认为异步内存传输解决了这个问题,即在计算一个小批量时,另一个小批量会在后台传输到GPU。

我想知道cupy.cuda.Stream上课有可能吗,但我还不知道。我将不胜感激任何意见/建议。

编辑:我认为以下代码使异步内存传输,但不是。

import numpy as np
import cupy as cp

a_cpu = np.ones((10000, 10000), dtype=np.float32)
b_cpu = np.ones((10000, 10000), dtype=np.float32)

a_stream = cp.cuda.Stream(non_blocking=True)
b_stream = cp.cuda.Stream(non_blocking=True)

a_gpu = cp.empty_like(a_cpu)
b_gpu = cp.empty_like(b_cpu)

a_gpu.set(a_cpu, stream=a_stream)
b_gpu.set(b_cpu, stream=b_stream)

# This should start before b_gpu.set() is finished.
a_gpu *= 2
Run Code Online (Sandbox Code Playgroud)

nvvp显示内存转移是顺序发生的。

python chainer cupy

6
推荐指数
1
解决办法
662
查看次数

Google Colab 上没有名为“cupy”的模块

我正在开发 FastPhotoStyle 项目: https ://github.com/NVIDIA/FastPhotoStyle

我按照其教程的步骤进行操作: https://github.com/NVIDIA/FastPhotoStyle/blob/master/TUTORIAL.md

我正在 Google Colab 上运行示例 1,默认环境为

  • CUDA 10.0
  • Python 3.6
  • 链接器5.4.0
  • 铜吡咯5.4.0

这是我在 Colab Notebook 上的尝试:

https://colab.research.google.com/drive/1oBgdJgXCLlUQhpwPoG1Uom3OKTzHR4BF

运行后

!python3 demo.py --output_image_path results/example1.png
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

回溯(最近一次调用):文件“demo.py”,第 9 行,位于

导入过程_风格化

文件“/content/drive/FastPhotoStyle/process_stylization.py”,第 14 行,位于

从 smooth_filter 导入 smooth_filter

文件“/content/drive/FastPhotoStyle/smooth_filter.py”,第 327 行,位于

从 cupy.cuda 导入函数

ModuleNotFoundError:没有名为“cupy”的模块

有人可以帮我吗?

python-3.x pytorch google-colaboratory cupy

6
推荐指数
1
解决办法
1万
查看次数

如何使用 CuPy 在 GPU 上运行 python?

我正在尝试使用库在 GPU 上执行 Python 代码CuPy。但是,当我运行时nvidia-smi,没有发现 GPU 进程。

nvidia-smi 输出

这是代码:

    import numpy as np
    import cupy as cp
    from scipy.stats import rankdata

    def get_top_one_probability(vector):
      return (cp.exp(vector) / cp.sum(cp.exp(vector)))

    def get_listnet_gradient(training_dataset, real_labels, predicted_labels):
      ly_topp = get_top_one_probability(real_labels)
      cp.cuda.Stream.null.synchronize()
      s1 = -cp.matmul(cp.transpose(training_dataset), cp.reshape(ly_topp, (np.shape(cp.asnumpy(ly_topp))[0], 1)))
      cp.cuda.Stream.null.synchronize()
      exp_lz_sum = cp.sum(cp.exp(predicted_labels))
      cp.cuda.Stream.null.synchronize()
      s2 = 1 / exp_lz_sum
      s3 = cp.matmul(cp.transpose(training_dataset), cp.exp(predicted_labels))
      cp.cuda.Stream.null.synchronize()
      s2_s3 = s2 * s3 # s2 is a scalar value
      s1.reshape(np.shape(cp.asnumpy(s1))[0], 1)
      cp.cuda.Stream.null.synchronize()
      s1s2s3 = cp.add(s1, s2_s3)
      cp.cuda.Stream.null.synchronize()
      return s1s2s3 …
Run Code Online (Sandbox Code Playgroud)

python gpu cupy

6
推荐指数
1
解决办法
9991
查看次数

类型错误:不允许隐式转换为 NumPy 数组。请使用 `.get()` 显式构造 NumPy 数组。- 铜吡咯

我想np.float32(im)在我的代码中使用 numpy 函数和 CuPy 库。

im = cupy.float32(im)
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时我遇到了这个错误:

TypeError: Implicit conversion to a NumPy array is not allowed. Please use `.get()` to construct a NumPy array explicitly.
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?

python numpy typeerror cupy

6
推荐指数
1
解决办法
9093
查看次数

如果 GPU 已使用,Cupy 在 multithread.pool 中会出现错误

我尝试在程序的两个部分中使用 cupy,其中之一与池并行。我设法用一个简单的例子重现它:

import cupy
import numpy as np
from multiprocessing import pool


def f(x):
    return cupy.asnumpy(2*cupy.array(x))



input = np.array([1,2,3,4])
print(cupy.asnumpy(cupy.array(input)))


print(np.array(list(map(f, input))))

p = pool.Pool(4)
output = p.map(f, input)
p.close()
p.join()
print(output)
Run Code Online (Sandbox Code Playgroud)

输出如下:

[1 2 3 4]
[2 4 6 8]
Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 489, in _handle_results
    task = get()
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 251, in recv …
Run Code Online (Sandbox Code Playgroud)

python-3.x python-multiprocessing cupy

5
推荐指数
1
解决办法
2874
查看次数

CuPy 并发

我正在使用 CuPy (7.0.0) 并尝试使用简单的示例脚本获取并发流:

import cupy as cp

# creating streams
map_streams = []
for i in range(0, 100):
    map_streams.append(cp.cuda.stream.Stream(non_blocking=True))

asize = (1000, 100)

# creating arrays on the device
x = cp.ones(asize)
y = cp.ones(asize)
z = cp.ndarray(asize)

# do multiplications in the streams
for stream in map_streams:
    with stream:
        z = x * y
Run Code Online (Sandbox Code Playgroud)

但乘法是顺序执行的。

==8339== Profiling result:
   Start  Duration            Grid Size      Block Size     Regs*    SSMem*    DSMem*           Device   Context    Stream  Name
[...]
432.83ms  18.688us            (782 1 1)       (128 …
Run Code Online (Sandbox Code Playgroud)

python concurrency stream cupy

5
推荐指数
0
解决办法
505
查看次数

如何使用 GPU 实现更快的 convolve2d

我最近正在学习 PyCuda,并计划替换相机系统的一些代码以加快图像处理速度。该部分最初使用cv2.filter2D。我的目的是用GPU加速处理。

Time for signal.convolve2d: 1.6639747619628906
Time for cusignal.convolve2d: 0.6955723762512207
Time for cv2.filter2D: 0.18787837028503418
Run Code Online (Sandbox Code Playgroud)

然而,cv2.filter2D 似乎仍然是三者中最快的。如果输入是一长串图像,自定义 PyCuda 内核是否会超过 cv2.filter2D?

import time
import cv2
from cusignal.test.utils import array_equal
import cusignal
import cupy as cp
import numpy as np
from scipy import signal
from scipy import misc
ascent = misc.ascent()
ascent = np.array(ascent, dtype='int16')

ascentList = [ascent]*100

filterSize = 3
scharr = np.ones((filterSize, filterSize), dtype="float") * (1.0 / (filterSize*filterSize))

startTime = time.time()
for asc in ascentList:
    grad = signal.convolve2d(asc, scharr, …
Run Code Online (Sandbox Code Playgroud)

python opencv scipy cupy cusignal

5
推荐指数
1
解决办法
3157
查看次数

如何在pip命令中指定gcc路径?

我正在尝试安装 cupy 5.0.0。cupy5.0.0需要的gcc版本不超过7。我的默认gcc是gcc-9。我无法使用 conda 环境。另外,我没有 sudo 权限来更改 /usr/bin/gcc 以指向 gcc-7。有没有办法将 gcc 路径传递给 pip 命令?

gcc g++ pip cupy

5
推荐指数
1
解决办法
8425
查看次数

理解 CUDA、Numba、Cupy 等的扩展示例

大多数在线提供的 Numba、CuPy 等示例都是简单的数组添加,显示了从 CPU 单核/线程到 GPU 的加速。命令文档大多缺乏很好的例子。这篇文章旨在提供一个更全面的例子。

此处提供初始代码。它是经典元胞自动机的简单模型。最初,它甚至不使用 numpy,只使用简单的 python 和 Pyglet 模块进行可视化。

我的目标是将此代码扩展到特定问题(这将非常大),但首先我认为最好已经针对 GPU 使用进行了优化。

game_of_life.py 是这样的:

import random as rnd
import pyglet
#import numpy as np
#from numba import vectorize, cuda, jit

class GameOfLife: 
 
    def __init__(self, window_width, window_height, cell_size, percent_fill):
        self.grid_width = int(window_width / cell_size) # cell_size 
        self.grid_height = int(window_height / cell_size) # 
        self.cell_size = cell_size
        self.percent_fill = percent_fill
        self.cells = []
        self.generate_cells()
  
    def generate_cells(self):
        for row in range(0, self.grid_height): 
            self.cells.append([])
            for col in range(0, …
Run Code Online (Sandbox Code Playgroud)

python gpu numba cupy

5
推荐指数
1
解决办法
732
查看次数

cupy.asnumpy() 和 get() 之间的区别

给定一个 CuPy 数组a,有两种方法可以从中获取 numpy 数组:a.get()cupy.asnumpy(a)。它们之间有什么实际区别吗?

import cupy as cp

a = cp.random.randint(10, size=(4,5,6,7))

b = a.get()
c = cp.asnumpy(a)

assert type(b) == type(c) and (b == c).all()
Run Code Online (Sandbox Code Playgroud)

python numpy cupy

5
推荐指数
1
解决办法
1249
查看次数