python - 带有 GPU 的 Google Colab 上的 Cupy 内存错误 - 但只是我第二次运行代码
问题描述
我正在尝试使用 Cupy 在两个大型数组上进行矩阵乘法,因为它比使用 CPU 快得多(大约 100 倍)。我的问题是我第一次运行它时它可以工作,但是第二次运行它等等它给了我一个内存错误。这是循环中的一个步骤,所以这是一个问题,我不能每次都重新启动运行时。
这是具有相同数组大小和数据类型的可重现代码:
import cupy as cp
import datetime
cp.get_default_memory_pool().free_all_blocks()
cp.get_default_pinned_memory_pool().free_all_blocks()
x = cp.random.uniform(-1,1,size = (3000,300000))
w = cp.random.uniform(-1,1,size= (300000,1000))
start = datetime.now()
ans = cp.matmul(x,w)
stop = datetime.now()
print(stop-start)
这是我在同一运行时第二次运行它时遇到的错误:
---------------------------------------------------------------------------
OutOfMemoryError Traceback (most recent call last)
<ipython-input-5-43db33b58bc8> in <module>()
2 cp.get_default_pinned_memory_pool().free_all_blocks()
3
----> 4 x = cp.random.uniform(-1,1,size = (3000,300000))
5 w = cp.random.uniform(-1,1,size= (300000,1000))
6
4 frames
/usr/local/lib/python3.6/dist-packages/cupy/creation/basic.py in empty(shape, dtype, order)
20
21 """
---> 22 return cupy.ndarray(shape, dtype, order=order)
23
24
cupy/core/core.pyx in cupy.core.core.ndarray.__init__()
cupy/cuda/memory.pyx in cupy.cuda.memory.alloc()
cupy/cuda/memory.pyx in cupy.cuda.memory.MemoryPool.malloc()
cupy/cuda/memory.pyx in cupy.cuda.memory.MemoryPool.malloc()
cupy/cuda/memory.pyx in cupy.cuda.memory.SingleDeviceMemoryPool.malloc()
cupy/cuda/memory.pyx in cupy.cuda.memory.SingleDeviceMemoryPool._malloc()
cupy/cuda/memory.pyx in cupy.cuda.memory._try_malloc()
OutOfMemoryError: Out of memory allocating 7,200,000,000 bytes (allocated so far: 9,624,000,000 bytes).
这可以解决吗?我正在尝试清除前两行中的 GPU 内存,但不确定这是否正确。也许使用 dask 数组可以代替?但这可以在仍然使用 GPU 提高速度的同时完成吗?
解决方案
是的,在这里使用 CuPy 支持的 Dask 数组可能会很好。您需要确保使用单线程调度程序 ( .compute(scheduler="single-threaded")
。假设您正在以这样的方式制作数组,即 Dask 可以一次加载块,那么 Dask 可能能够加载几个块,做一些计算,丢弃中间体,然后加载其他块。
推荐阅读
- javascript - 如何删除对象数组中的特定元素
- android - 带有 setFocus 的 EditText OnKeyListener 无法按预期工作
- stream - 我应该以什么速率采样以使依赖数据流独立?
- sql - 计算postgresql矩阵中的列组合
- ubuntu - Ubuntu 18.4 maas 节点调试失败 lldpd
- symfony - 如果值在另一列中为真,则 NOT NULL
- identityserver4 - Identity Server 4 - 使用刷新的令牌进行身份验证
- php - 在while循环之后限制if语句中的项目数
- assembly - 如何在 MIPS 程序集中将一个字符串复制到另一个字符串
- javascript - 首次加载时不同的 jQuery 过期时间