Cupy 释放统一内存

Posted

技术标签:

【中文标题】Cupy 释放统一内存【英文标题】:Cupy freeing unified memory 【发布时间】:2020-09-21 19:14:42 【问题描述】:

我在释放 Cupy 中分配的内存时遇到问题。由于内存限制,我想使用统一内存。当我创建一个将分配给统一内存并想要释放它的变量时,它被标记为被释放并且池现在是空的,可以再次使用,但是当我查看资源监视器时,内存仍未释放。当我创建另一个变量时,它也会添加到内存中(我认为标记为已占用的内存可能会被重用,如文档中所述,但事实并非如此。)

这是一个小程序,通过添加睡眠来测试这一点,以便能够在资源监视器中查看内存变化。

import cupy as cp
import time

def pool_stats(mempool):
    print('used:',mempool.used_bytes(),'bytes')
    print('total:',mempool.total_bytes(),'bytes\n')

pool = cp.cuda.MemoryPool(cp.cuda.memory.malloc_managed) # get unified pool
cp.cuda.set_allocator(pool.malloc) # set unified pool as default allocator

print('create first variable')
val1 = cp.zeros((50*1024,10*1024))
pool_stats(pool)
time.sleep(3)


print('delete first variable')
del val1
pool_stats(pool)
time.sleep(3)

print('free cupy memory')
pool.free_all_blocks()
pool_stats(pool)
time.sleep(3)

print('create second variable')
val2 = cp.zeros((50*1024,10*1024))
pool_stats(pool)
time.sleep(3)

print('delete second variable')
del val2
pool_stats(pool)
time.sleep(3)

print('free cupy memory')
pool.free_all_blocks()
pool_stats(pool)
time.sleep(3)

这是程序的输出:

create first variable
used: 4194304000 bytes
total: 4194304000 bytes

delete first variable
used: 0 bytes
total: 4194304000 bytes

free cupy memory
used: 0 bytes
total: 0 bytes

create second variable
used: 4194304000 bytes
total: 4194304000 bytes

delete second variable
used: 0 bytes
total: 4194304000 bytes

free cupy memory
used: 0 bytes
total: 0 bytes

所以输出是我所期望的。但这并没有反映在资源监视器(nvtophtop)上的内存使用情况。

这是我运行这个程序的结果。如nvtop 所示。此外,当 gpu 内存空间不足时,它会使用系统内存(因为它应该使用统一内存),这也可以在 htop 中看到(我想说我不认为它是硬件监视器的问题,因为它可以在 2 个不同的显示器上看到)

统一内存应该表现得像默认内存。

默认的内存图取自几乎相同的程序,但没有统一的内存。我也得到了相同的控制台输出。

我也尝试过释放固定内存。

我做错了什么吗?这可能是一个错误吗?这可能是内存泄漏吗?

我也提到了this,但找不到任何东西。

【问题讨论】:

【参考方案1】:

从现在版主删除的答案来看,这似乎是 CuPy 中的一个错误。一位开发者在 github 网站上提出了ticket,并提出了patch(截至 2020 年 9 月 22 日)。

在短期内,您将不得不接受这是一个问题,并等到未来版本中出现修复程序。如果这很关键,那么考虑从 github 拉出当前的开发分支并构建自己的包。没有可以解决此问题的用户代码解决方法。

【讨论】:

此问题已在 CuPy v8.0.0 中修复。 github.com/cupy/cupy/pull/4032

以上是关于Cupy 释放统一内存的主要内容,如果未能解决你的问题,请参考以下文章

cuda 功能的自动内存管理

用完 GPU Ram 的大型 cupy 阵列

了解自己主动内存管理

golang内存扩容

多数组计算中的cupy执行错误

内存管理