目标/问题
在 Python 中,我正在寻找一种从内存映射文件读取/写入数据到 GPU 的快速方法。
在之前的 SO 溢出帖子中 [ Cupy OutOfMemoryError when trying to cupy.load large dimension .npy files in memory map mode, but np.load works fine ]
提到这可以使用 CUDA 固定的“零拷贝”内存。此外,这种方法似乎是由这个人 [ cuda - 零拷贝内存,内存映射文件] 开发的,尽管那个人正在使用 C++ 工作。
我之前的尝试是使用 Cupy,但我对任何 cuda 方法都持开放态度。
到目前为止我尝试过的
我提到了我如何尝试使用 Cupy,它允许您以内存映射模式打开 numpy 文件。
import os
import numpy as np
import cupy
#Create .npy files.
for i in range(4):
numpyMemmap = np.memmap( 'reg.memmap'+str(i), dtype='float32', mode='w+', shape=( 2200000 , 512))
np.save( 'reg.memmap'+str(i) , numpyMemmap )
del numpyMemmap
os.remove( 'reg.memmap'+str(i) )
# Check if they load correctly with np.load.
NPYmemmap = []
for i in range(4):
NPYmemmap.append( np.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' ) )
del NPYmemmap
# Eventually results in memory error.
CPYmemmap = []
for i in range(4):
print(i)
CPYmemmap.append( cupy.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' ) )
我尝试过的结果
我的尝试导致OutOfMemoryError:
有人提到
似乎 cupy.load 将要求整个文件首先适合主机内存,然后是设备内存。
还有人提到
CuPy 无法处理 mmap 内存。因此,CuPy 默认直接使用 GPU 内存。 https://docs-cupy.chainer.org/en/stable/reference/generated/cupy.cuda.MemoryPool.html#cupy.cuda.MemoryPool.malloc 如果要使用统一内存,可以更改默认内存分配器。
我尝试使用
cupy.cuda.set_allocator(cupy.cuda.MemoryPool(cupy.cuda.memory.malloc_managed).malloc)
但这似乎并没有什么不同。发生错误时,我的 CPU Ram 大约为 16 gig,但我的 GPU ram 为 0.32 gig。我正在使用 Google colab,我的 CPU Ram 是 25 gigs,GPU ram 是 12 gigs。所以看起来在整个文件托管在主机内存中之后,它检查它是否适合设备内存,当它看到它只有所需的 16 个演出中的 12 个时,它抛出了一个错误(我最好的猜测)。
所以,现在我试图找出一种方法来使用固定的“零拷贝”内存来处理内存映射文件,该文件会将数据提供给 GPU。
如果重要的话,我尝试传输的数据类型是浮点数组。通常,对于只读数据,二进制文件会加载到 GPU 内存中,但我正在处理数据,我在每一步都尝试读取和写入。