如何解决Cupy释放统一内存
我在释放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
所以输出是我期望的。但这没有反映在资源监视器(nvtop
和htop
)上的内存使用情况。
这是我运行此程序的结果。如nvtop
所示。另外,当gpu内存空间不足时,它会使用系统内存(应该使用统一内存),这也可以在htop
中看到(我想说的是,我认为这不是硬件监视器的问题,因为它可以在2个不同的监视器中看到)
统一内存的行为应类似于默认内存。
默认内存图取自几乎相同的程序,但没有统一的内存。我在两者上也获得相同的控制台输出。
我还尝试释放固定的内存。
我在做错什么吗?可能是个错误吗?这也许是内存泄漏吗?
我也提到了this,但找不到任何东西。
解决方法
从现在主持人删除的答案中,这似乎是CuPy中的错误。开发人员在github网站上提出了ticket,并提出了patch(截至2020-9-22)。
短期内,您将不得不接受此问题,并等到以后的版本中出现修复程序。如果这很关键,请考虑从github提取当前的开发分支并构建您自己的包。没有用户代码替代方法可以解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。