【问题标题】:Force GPU memory limit in PyTorch在 PyTorch 中强制 GPU 内存限制
【发布时间】:2018-03-28 08:15:47
【问题描述】:

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

【问题讨论】:

  • 我认为 pytorch 会根据需要使用内存,可能是模型和加载的图像。我不认为它会贪婪地消耗所有可用的内存。
  • @ManuelLagunas 是吗?即使是这种情况,我也想知道是否有办法对 pytorch 实例认为可用的内存设置最大限制。
  • 我实际上不知道任何方法,但我认为您可以通过批量大小来控制它。模型大小将始终相同,如果它不适合 GPU 内存,则执行将崩溃。

标签: pytorch


【解决方案1】:

更新(2021 年 3 月 4 日):现在是 available in the stable 1.8.0 version of PyTorch。另外,in the docs

原始答案如下。


feature request 已将merged 放入PyTorch master 分支。然而,稳定版本中没有引入。

Introduced as set_per_process_memory_fraction

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

您可以查看tests 作为使用示例。

【讨论】:

    【解决方案2】:

    更新 pytorch 到 1.8.0 (pip install --upgrade torch==1.8.0)

    函数:torch.cuda.set_per_process_memory_fraction(fraction, device=None)

    参数:

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

    设备(torch.device 或 int,可选) - 选定的设备。如果是 None 则使用默认的 CUDA 设备。

    例如:

    import torch
    torch.cuda.set_per_process_memory_fraction(0.5, 0)
    torch.cuda.empty_cache()
    total_memory = torch.cuda.get_device_properties(0).total_memory
    # less than 0.5 will be ok:
    tmp_tensor = torch.empty(int(total_memory * 0.499), dtype=torch.int8, device='cuda')
    del tmp_tensor
    torch.cuda.empty_cache()
    # this allocation will raise a OOM:
    torch.empty(total_memory // 2, dtype=torch.int8, device='cuda')
    
    """
    It raises an error as follows: 
    RuntimeError: CUDA out of memory. Tried to allocate 5.59 GiB (GPU 0; 11.17 GiB total capacity; 0 bytes already allocated; 10.91 GiB free; 5.59 GiB allowed; 0 bytes reserved in total by PyTorch)
    """
    

    【讨论】:

      【解决方案3】:

      与会阻塞所有 CPU 内存的 tensorflow 相比,Pytorch 只使用“它需要”的量。但是你可以:

      • 减少批量大小
      • 使用 CUDA_VISIBLE_DEVICES=# of GPU(可以是多个)来限制可以访问的 GPU。

      要使其在程序中运行,请尝试:

      import os
      os.environ["CUDA_VISIBLE_DEVICES"]="0"
      

      【讨论】:

      • 这不是一个真正的答案。上述两种方法都会对使用的内存量产生影响,但它们都不会限制 pytorch。我发现它是 Pytorch 的一个相当烦人的属性,因为内存分配允许更好地共享资源(是的,有时以较慢的运行时间为代价)。还有一个官方功能请求:github.com/pytorch/pytorch/issues/18626
      • 确实,这个答案并没有解决如何强制限制内存使用的问题。此外,pytorch 仅保留所需的 GPU 内存是不正确的。 Pytorch 保留不再使用的 GPU 内存(例如,通过超出范围的张量变量)以供将来分配,而不是将其释放给操作系统。这意味着使用相同 GPU 的两个进程会遇到内存不足错误,即使在任何特定时间两个进程实际使用的 GPU 内存总和仍然低于容量。
      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多