是否可以使用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显示内存转移是顺序发生的。
我正在开发 FastPhotoStyle 项目: https ://github.com/NVIDIA/FastPhotoStyle
我按照其教程的步骤进行操作: https://github.com/NVIDIA/FastPhotoStyle/blob/master/TUTORIAL.md
我正在 Google Colab 上运行示例 1,默认环境为
这是我在 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”的模块
有人可以帮我吗?
我正在尝试使用库在 GPU 上执行 Python 代码CuPy
。但是,当我运行时nvidia-smi
,没有发现 GPU 进程。
这是代码:
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) 我想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)
有什么解决办法吗?
我尝试在程序的两个部分中使用 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) 我正在使用 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) 我最近正在学习 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) 我正在尝试安装 cupy 5.0.0。cupy5.0.0需要的gcc版本不超过7。我的默认gcc是gcc-9。我无法使用 conda 环境。另外,我没有 sudo 权限来更改 /usr/bin/gcc 以指向 gcc-7。有没有办法将 gcc 路径传递给 pip 命令?
大多数在线提供的 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) 给定一个 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)