问题标签 [cupy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - CuPy 内存不足
我一直在测试 CuPy 库并使用 einsum 做了一个简单的矩阵乘法:
A 和 B 的尺寸分别为 (41, 41, 41, 41) (41, 41)。我还检查了它们的大小,分别是 22606088 字节、13448 字节。
这表明我的内存不足。是否有任何选项可以将部分数据发送到设备并批量执行操作?
python-3.x - 使用numpy和cupy的数组类型的差异
我正在为我的模型使用 chainer 库并面临以下问题:假设我有一个包含 3 个特征和一个标签(最后一列)的测试数据文件。它以列表的形式导入。例如
然后我通过将数据转换为 numpy 数组并获取标签列来获取标签,然后我将其转换为列表以与预测标签进行比较,例如 y_pred = [1,1,1,0]。IE
我担心的是,当我在 GPU 中运行我的模型时,它使用 Cuda.cupy 而不是 numpy,因为我使用的是 chainer 库,当我获取真实标签时,我收到它们:
在cupy那里:
两者都返回一个数组列表:
作为一种解决方法,我在那个特定的地方使用 numpy。我在使用 cupy 时做错了什么,因为我没有正确获取值吗?
cupy - 为cupy数组分配GPU内存
我有一个与这个 cupy 代码并行运行的 tensorflow 会话。我已将总 gpu 内存的 16 Gb 中的 8 Gb 分配给 tensorflow 会话。我现在想要的是从剩余的 7 Gb 中分配 2 Gb 来执行这个 cupy 代码。实际代码比我提供的示例代码更复杂。在我的实际代码中,cp_arr 是一系列数组操作的结果。但我希望将 cp_array 分配在我的 gpu 内存的指定 2 Gb 空间中。请记住,通过关闭 tensorflow 会话来释放 gpu 资源不是一种选择。
这是我正在使用的代码。
在这种情况下,在执行 'cp_arr = ** Array operations **' 时分配了 1.7 GB 的额外内存。我想要的是利用分配的 2 GB 空间来保存我的 Cupy 数组 cp_arr。提前致谢。
python - 如何完全释放函数中使用的 GPU 内存
我cupy
在一个接收数组的函数中使用numpy
,将它推到 GPU 上,对其执行一些操作并返回它的cp.asnumpy
副本。
问题:函数执行后没有释放内存(如 中所示ndidia-smi
)。
我知道cupy
. 但是,这似乎仅适用于每个用户。当多个用户在同一个 GPU 服务器上进行计算时,他们会受到其他用户缓存内存的限制。
最后我还尝试cp._default_memory_pool.free_all_blocks()
在函数内部调用。这似乎没有任何效果。cupy
在主代码中导入并free_all_blocks
“手动”调用是可行的,但我想将 GPU 的东西封装在函数中,对用户不可见。
您能否完全释放函数内部使用的 GPU 内存,以便其他用户可以使用它?
最小的例子:
主要模块:
功能模块:
python - 为什么我会为 import cupy 收到 ModuleNotFoundError?
我使用pip install cupy-cuda90
. 安装成功(安装 MSVC 2017 后)并pip list
显示 cupy-cuda90。
当我键入时,import cupy
我收到以下错误:
我在 Windows 10 (1607) 上,安装了 CUDA 9.0,并且 CUDA_PATH & CUDA_PATH_V9_0 指向正确的目录。
python - 多数组计算中的cupy执行错误
numpy循环没问题。
cupy 循环 1 次,3 次就可以了。但10次出错。
我该如何解决这个问题?
这是gpu内存问题吗?
(源代码)
(执行结果)
numpy - 需要帮助了解 GPU 上的内核传输速度(numba、cupy、cuda)
虽然 GPU 加速了数学计算,但将内核移到 GPU 上执行的固定开销很高。
我正在使用cupy和numba。我第一次执行使用cupy的GPU版本的numpy的函数调用时非常慢。但是第二次很快。
我意识到我不明白内核或 GPU 代码是如何通过 GPU 运行的。从操作上讲,我想更好地理解这一点,以便我可以知道我所做的事情何时会由于某些内核传输而意外创建一个缓慢的步骤。所以我需要一些规则或经验法则来理解这个概念。
例如,如果我将已经存储在 GPU 上的两个 Cupy 数组相乘,我可能会写成 C= A*B
在某些时候,*乘法的cupy重载必须在GPU上编码出来,并且它自动需要也会被循环包裹,将它分解成块和线程。所以大概这段代码是一些内核,它被传输到 GPU 上。我猜下次我调用 C*D 时,GPU 不再需要学习 * 是什么意思,所以它会很快。
但是在某些时候,我会想象 GPU 需要清除旧代码,因此 * 或当时未使用的其他操作可能会从内存中刷新,因此稍后当再次调用 A*B 时,将会出现及时惩罚以在 GPU 上重新编译它。
或者我想象的那样。如果我是对的,我怎么知道这些内核何时会留下或消失?
如果我错了,这不是它的工作方式,或者还有其他一些缓慢的步骤(我假设数据已经传输到 GPU 上的数组),那么这个缓慢的步骤是什么以及如何组织事情所以一个人付费尽可能少吗?
我试图避免像在 cuda++ 中那样编写显式的 numba 线程管理内核,但只使用标准的 numba @njit、@vectorize、@stencil 装饰器。同样在 Cupy 中,我只想在 numpy 语法级别上工作,而不是深入线程管理。
我已经阅读了很多关于此的文档,但它们只是指内核的开销,而不是当这些得到报酬时以及如何控制它,所以我很困惑。
python - @cupy.fuse cupy python 装饰器记录在哪里?
我看过一些@cupy.fuse 的演示,这对于使用 Numpy 语法进行 GPU 编程来说简直就是一个奇迹。Cupy 的主要问题是像添加这样的每个操作都是一个完整的内核启动,然后是内核释放。所以一系列的加法和乘法,例如,付出了很多内核的痛苦。(这就是为什么使用 numba @jit 可能会更好)
@cupy.fuse() 似乎通过将函数内的所有操作合并到单个内核来解决这个问题,从而大大降低了启动和免费成本。
但除了cupy.fusion 类的演示和源代码之外,我找不到任何文档。
我的问题包括:
- Cupy.fuse 是否会积极内联在应用装饰器的函数内调用的任何 python 函数,从而将它们滚动到同一个内核中?
这个增强日志提示了这一点,但没有说明组合函数是否在同一个内核中,或者只是在调用函数也被修饰时才允许。 https://github.com/cupy/cupy/pull/1350
如果是这样,我需要用@fuse 装饰这些功能吗?我认为这可能会损害内联而不是帮助它,因为它可能会将这些函数呈现为不可融合(可能是非 python)的形式。
如果没有,我是否可以通过首先用@numba.jit 装饰函数然后用@fuse 装饰来实现自动内联。或者@jit 会再次以不可融合的形式呈现生成的 python 吗?
什么破坏了@fuse?有哪些陷阱?@fuse 是实验性的,不太可能维护吗?
参考:
https://gist.github.com/unnonouno/877f314870d1e3a2f3f45d84de78d56c
https://www.slideshare.net/pfi/automatically-fusing-functions-on-cupy
https://github.com/cupy/cupy/blob/master/cupy/core/fusion.py
https://docs-cupy.chainer.org/en/stable/overview.html
https://github.com/cupy/cupy/blob/master/cupy/manipulation/tiling.py
ubuntu - cupy.cuda.cudnn.CuDNNError:CUDNN_STATUS_INTERNAL_ERROR
我的cupy和chainer版本如下
Chainer:4.1.0 NumPy:1.15.4 CuPy:CuPy 版本:4.1.0
CUDA 根目录:/usr/local/cuda-9.0 CUDA 构建版本:9000 CUDA 驱动程序版本:9020 CUDA 运行时版本:9000
cuDNN 构建版本:7104 cuDNN版本:7104 NCCL 构建版本:2104
我正在尝试按照此链接运行测试脚本,我使用的脚本如下
python image_sheeping.py figure_skating/models/resnet_50_augmentation_no_noise_75_100/Resnet50SheepLocalizer_97305.npz \log -i figure_skating/evaluation_dataset/test_images/22.png -g 0 -o validation_data/images/analyzed
我收到的错误消息是
回溯(最后一次调用):文件“image_sheeping.py”,第 50 行,在 bboxes 中,分数 = localizer.localize(processed_image)[:2] 文件“/home/rahul/Desktop/Thesis/code/loans/loans/ sheep/unsupervised_sheep_localizer.py”,第 43 行,在本地化 bbox、rois、scores、visual_backprop = self.model.predict([processed_image], return_visual_backprop=return_visual_backprop) 文件“/home/rahul/Desktop/Thesis/code/loans/loans /figure_skating/models/resnet_50_augmentation_no_noise_75_100/localizer.py”,第 102 行,在预测 rois 中,bboxes = self(images) 文件“/home/rahul/Desktop/Thesis/code/loans/loans/figure_skating/models/resnet_50_augmentation_no_noise_75_100/localizer。 py",第 144 行,通话中 h = self.feature_extractor(input_images, layers=['res5', 'pool5']) 文件 "/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/links/model/vision/ resnet.py”,第 198 行,调用 h = func(h) 文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/links/connection/convolution_2d.py”,行175,待命 groups=self.groups)文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/functions/connection/convolution_2d.py”,第 582 行,convolution_2d y,= fnode.apply (args) 文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/function_node.py”,第 258 行,应用输出 = self.forward(in_data) 文件“/home/ rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/function_node.py”,第 367 行,向前返回 self.forward_gpu(输入) 文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/functions/connection/convolution_2d.py”,第 161 行,在 forward_gpu 中返回 self._forward_cudnn(x, W, b, y ) 文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/chainer/functions/connection/convolution_2d.py”,第 234 行,在 _forward_cudnn auto_tune=auto_tune, tensor_core=tensor_core) 文件“cupy /cudnn.pyx”,第 598 行,在 cupy.cudnn.convolution_forward 文件“cupy/cudnn.pyx”,第 33 行,在 cupy.cudnn.get_handle 文件“cupy/cuda/cudnn.pyx”,第 473 行,在 cupy 中。 cuda.cudnn.create 文件“cupy/cuda/cudnn.pyx”,第 446 行,在 cupy.cuda.cudnn.check_status cupy.cuda.cudnn.CuDNNError: CUDNN_STATUS_INTERNAL_ERROR 异常被忽略:del of 0%| | 0/1 [00:17 Traceback(最近一次通话最后一次):文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/tqdm/_tqdm.py”,第 931 行,在del self .close() 文件“/home/rahul/.virtualenvs/loans/lib/python3.6/site-packages/tqdm/_tqdm.py”,第 1133 行,关闭 self._decr_instances(self) 文件“/home/rahul /.virtualenvs/loans/lib/python3.6/site-packages/tqdm/_tqdm.py”,第 496 行,在 _decr_instances cls.monitor.exit() 文件中“/home/rahul/.virtualenvs/loans/lib/python3 .6/site-packages/tqdm/_monitor.py”,第 52 行,退出 self.join() 文件“/usr/lib/python3.6/threading.py”,第 1053 行,加入引发 RuntimeError("
谁能帮我解决错误?
python - 使用 GPU 在 Python/Numba 中计算前 N 个最近城市的更好方法
我有 M~200k 点,城市的 X,Y 坐标打包在一个 Mx2 numpy 数组中。意图是,每个城市计算前 N 个最近的城市,并在 MxN numpy 矩阵中返回它们到该城市的索引和距离。Numba 在加速 CPU 上的串行 python 代码并使用prange生成器使其成为多线程方面做得很好,这样在 16 核 SSE 4.2/AVX 机器调用上计算 30 个最近的城市在 6 分 26 秒内完成,同时使所有核心饱和:
注意:我想稍后使用 mrange=np.arange(N_CLOSEST) 和 indices=np.argpartition(dist,mrange) 来节省一些周期,但不幸的是 Numba 还不支持 np.argpartition。
然后我决定好好利用我新买的 RTX 2070 并尝试将这些非常并行的自然计算卸载到 GPU,再次使用 Numba 和可能的 CuPy。
经过一番思考,我想出了一个相对愚蠢的重写,其中每次处理一个城市的 GPU 内核被连续调用 M 个城市中的每一个。在该内核中,每个 GPU 线程都在计算其距离并保存到 dist 数组中的特定位置。所有阵列都分配在设备上以最小化 PCI 数据传输:
现在,在 GPU 上的计算结果几乎花费了相同的 6 分钟时间,但 GPU 负载仅为 1%(是的,我确保 CPU 和 GPU 版本返回的结果是相同的)。我玩了一下块大小,没有看到任何重大变化。有趣的是,cp.argsort和get_distances消耗的处理时间大致相同。
我觉得它与流有关,如何正确初始化其中的很多?这将是重用我的代码的最直接的方法,一次不处理 1 个城市,而是说 16 个或任何我的计算能力允许的,理想情况下可能是 1000 个。
你们这些在 Numba/CuPy 中的 GPU 编码方面有什么经验的人会建议在我的情况下充分利用 GPU 的功能吗?
来自纯 C++ CUDA 辩护者的建议也非常受欢迎,因为我还没有看到原生 Cuda 解决方案与 Numba/CuPy CUDA 解决方案的比较。
Python 版本:['3.6.3 |Anaconda, Inc'] 平台:AMD64 系统:Windows-10-10.0.14393-SP0 Numba 版本:0.41.0