PyTorch中的强制GPU内存限制

PyTorch中的强制GPU内存限制,pytorch,Pytorch,有没有办法强制为特定Pytorch实例提供的GPU内存量设置最大值?例如,我的GPU可能有12Gb可用空间,但我想为特定进程分配最大4Gb。与tensorflow不同,tensorflow会阻塞所有CPU内存,Pytorch只使用“它需要的”内存。但是,您可以: 减少批大小 使用GPU的CUDA_VISIBLE_DEVICES=#(可以是倍数)来限制可访问的GPU 要在程序中运行,请尝试: import os os.environ["CUDA_VISIBLE_DEVICES"]="0" 更

有没有办法强制为特定Pytorch实例提供的GPU内存量设置最大值?例如,我的GPU可能有12Gb可用空间,但我想为特定进程分配最大4Gb。

与tensorflow不同,tensorflow会阻塞所有CPU内存,Pytorch只使用“它需要的”内存。但是,您可以:

  • 减少批大小
  • 使用GPU的CUDA_VISIBLE_DEVICES=#(可以是倍数)来限制可访问的GPU
要在程序中运行,请尝试:

import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
更新(2021年3月4日):现在是。而且

原来的答案如下


这已进入PyTorch
master
分支。但是,在稳定版本中没有引入

设置进程的内存分数。 分数用于将缓存分配器限制为CUDA设备上已分配的内存。 允许的值等于总可见内存乘以分数。 如果试图在一个进程中分配的值超过允许的值,将引发超出允许值的错误 分配器内存错误

您可以查看as用法示例。

将pytorch更新为1.8.0 (pip安装--升级火炬==1.8.0)

功能:

参数:

分数(浮动)–范围:0~1。允许的内存等于总内存*分数

设备(torch.device或int,可选)–所选设备。如果没有,则使用默认CUDA设备

例如:

导入火炬
torch.cuda.set_每_进程_内存_分数(0.5,0)
torch.cuda.empty_cache()
总内存=torch.cuda.get\u设备属性(0)。总内存
#小于0.5即可:
tmp_张量=torch.empty(int(总内存*0.499),dtype=torch.int8,device='cuda')
del-tmp_张量
torch.cuda.empty_cache()
#此分配将提高OOM:
torch.empty(总内存//2,数据类型=torch.int8,设备='cuda')
"""
它会引发如下错误:
运行时错误:CUDA内存不足。尝试分配5.59 GiB(GPU 0;11.17 GiB总容量;0字节已分配;10.91 GiB可用;允许5.59 GiB;PyTorch总共保留0字节)
"""

我认为pytorch将根据需要使用内存,可能是模型和加载的图像。我不认为它贪婪地消耗了所有可用的内存。@ManuelLagunas,是吗?即使是这样,我想知道是否有办法设置pytorch实例认为可用的最大内存限制。我实际上不知道任何方法,但我认为您可以通过批处理大小来控制。模型大小总是相同的,如果它不适合GPU内存,执行就会崩溃。这不是一个真正的答案。上述两种方法都会对使用的内存量产生影响,但它们都不会限制pytorch。我发现这是Pytorch的一个相当恼人的特性,因为内存分配允许更好地共享资源(是的,有时会以较慢的运行时间为代价)。还有一个官方的特性请求:事实上,这个答案并没有解决如何限制内存使用的问题。此外,Pytork只保留所需的GPU内存是不正确的。Pytorch保留不再使用的GPU内存(例如,张量变量超出范围)用于未来分配,而不是将其释放到操作系统。这意味着使用相同GPU的两个进程会遇到内存不足错误,即使在任何特定时间,两个进程实际使用的GPU内存总和仍低于容量。