Cupy 释放统一内存
Cupy freeing unified memory
我在 cupy 中释放分配的内存时遇到问题。由于内存限制,想使用统一内存。当我创建一个将分配给统一内存并想要释放它的变量时,它被标记为正在释放并且池现在是空的,可以再次使用,但是当我查看资源监视器时,内存仍未释放。当我创建另一个变量时,它也会添加到内存中(我认为可能标记为 taken 的内存会像文档中提到的那样被重用,但事实并非如此。)
这里有一个小程序可以通过添加睡眠来测试它,以便能够在资源监视器中看到内存变化。
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 内存用完 space 时,它会使用系统内存(因为它应该使用统一内存),这也在 htop
中看到(我想说我不不认为这是硬件监视器的问题,因为它在 2 个不同的监视器上都可以看到)
统一内存应该像默认内存一样运行。
默认内存图取自几乎相同的程序,但没有统一内存。我也得到了相同的控制台输出。
我也试过释放固定内存。
我做错了什么吗?这可能是一个错误吗?这可能是内存泄漏吗?
我也提到了 this 但找不到任何东西。
我在 cupy 中释放分配的内存时遇到问题。由于内存限制,想使用统一内存。当我创建一个将分配给统一内存并想要释放它的变量时,它被标记为正在释放并且池现在是空的,可以再次使用,但是当我查看资源监视器时,内存仍未释放。当我创建另一个变量时,它也会添加到内存中(我认为可能标记为 taken 的内存会像文档中提到的那样被重用,但事实并非如此。)
这里有一个小程序可以通过添加睡眠来测试它,以便能够在资源监视器中看到内存变化。
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 内存用完 space 时,它会使用系统内存(因为它应该使用统一内存),这也在 htop
中看到(我想说我不不认为这是硬件监视器的问题,因为它在 2 个不同的监视器上都可以看到)
统一内存应该像默认内存一样运行。
默认内存图取自几乎相同的程序,但没有统一内存。我也得到了相同的控制台输出。
我也试过释放固定内存。
我做错了什么吗?这可能是一个错误吗?这可能是内存泄漏吗?
我也提到了 this 但找不到任何东西。