【问题标题】:How to check if pytorch is using the GPU?如何检查 pytorch 是否正在使用 GPU?
【发布时间】:2018-06-17 13:44:05
【问题描述】:

我想知道pytorch 是否正在使用我的 GPU。可以使用nvidia-smi 检测在此过程中是否有来自 GPU 的任何活动,但我希望在python 脚本中编写一些内容。

有办法吗?

【问题讨论】:

  • 有没有办法获取所有当前可用 gpus 的列表?类似devices = torch.get_all_devices() # [0, 1, 2] or whatever their name is
  • stackoverflow.com/questions/64776822/…:[torch.cuda.device(i) for i in range(torch.cuda.device_count())]
  • 有人告诉我这行得通list(range(torch.cuda.device_count()))。不过谢谢!
  • @CharlieParker,你会想要(假设你有 import torch):devices = [d for d in range(torch.cuda.device_count())] 如果你想要名字:device_names = [torch.cuda.get_device_name(d) for d in devices] 你可能像我一样,喜欢将这些映射为 dict跨机管理:device_to_name = dict( device_names, devices )

标签: python memory-management gpu nvidia pytorch


【解决方案1】:
Query Command
Does PyTorch see any GPUs? torch.cuda.is_available()
Are tensors stored on GPU by default? torch.rand(10).device
Set default tensor type to CUDA: torch.set_default_tensor_type(torch.cuda.FloatTensor)
Is this tensor a GPU tensor? my_tensor.is_cuda
Is this model stored on the GPU? all(p.is_cuda for p in my_model.parameters())

【讨论】:

  • 请注意,模型可以在不同设备上共享。
【解决方案2】:

使用下面的代码

import torch
torch.cuda.is_available()

将仅显示 GPU 是否存在以及是否被 pytorch 检测到。

但在“任务管理器-> 性能”中,GPU 利用率将只有很少的百分比。

这意味着您实际上正在使用 CPU 运行。

为解决上述问题检查和更改:

  1. 图形设置 --> 开启硬件加速 GPU 设置,重启。
  2. 打开 NVIDIA 控制面板 --> 桌面 --> 在通知区域显示 GPU [注意:如果您有新安装的 windows,那么您还必须同意 NVIDIA 控制面板中的条款和条件]

这应该可行!

【讨论】:

【解决方案3】:

从实际的角度来看,只是一个小题外话:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

这个dev 现在知道是cuda 还是cpu。

在迁移到 cuda 时,处理模型和张量的方式有所不同。一开始有点奇怪。

import torch
import torch.nn as nn
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
t1 = torch.randn(1,2)
t2 = torch.randn(1,2).to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]])
print(t2)  # tensor([[ 0.5117, -3.6247]], device='cuda:0')
t1.to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]])
print(t1.is_cuda) # False
t1 = t1.to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]], device='cuda:0')
print(t1.is_cuda) # True

class M(nn.Module):
    def __init__(self):        
        super().__init__()        
        self.l1 = nn.Linear(1,2)

    def forward(self, x):                      
        x = self.l1(x)
        return x
model = M()   # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) # True

这一切都很棘手,理解一次,可以帮助您快速处理更少的调试。

【讨论】:

  • 你也需要一开始import torch.nn as nn
【解决方案4】:

这应该可行:

import torch

torch.cuda.is_available()
>>> True

torch.cuda.current_device()
>>> 0

torch.cuda.device(0)
>>> <torch.cuda.device at 0x7efce0b03be0>

torch.cuda.device_count()
>>> 1

torch.cuda.get_device_name(0)
>>> 'GeForce GTX 950M'

这告诉我 CUDA 可用并且可以在您的设备之一 (GPU) 中使用。目前,Device 0 或 GPU GeForce GTX 950M 正在被PyTorch 使用。

【讨论】:

  • 我认为这只是表明这些设备在机器上可用,但我不确定您是否可以从每个 GPU 左右获得多少内存正在使用..
  • 运行torch.cuda.current_device() 对我很有帮助。它表明我的 gpu 太旧了:“发现 GPU0 GeForce GTX 760 具有 cuda 能力 3.0。PyTorch 不再支持此 GPU,因为它太旧了。”
  • torch.cuda.is_available()
  • @kmario23 感谢您指出这一点。是否有一个函数调用可以为我们提供该信息(每个 GPU 使用了多少内存)? :)
  • @frank 是的,只需这个命令:$ watch -n 2 nvidia-smi 就可以了。详情请见my answer below
【解决方案5】:

在 GPU 上创建一个张量,如下所示:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

不要退出,打开另一个终端并检查python进程是否正在使用GPU:

$ nvidia-smi

【讨论】:

  • 我特意要求从命令行不涉及nvidia-smi的解决方案
  • 好吧,从技术上讲,您始终可以解析任何命令行工具的输出,包括nvidia-smi
【解决方案6】:

由于这里没有提出,我正在添加一个使用torch.device 的方法,因为这非常方便,在正确的device 上初始化张量时也是如此。

# setting device on GPU if available, else CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
print()

#Additional Info when using cuda
if device.type == 'cuda':
    print(torch.cuda.get_device_name(0))
    print('Memory Usage:')
    print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')
    print('Cached:   ', round(torch.cuda.memory_reserved(0)/1024**3,1), 'GB')

编辑:torch.cuda.memory_cached 已重命名为 torch.cuda.memory_reserved。所以对于旧版本使用memory_cached

输出:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

如上所述,使用device 可以

  • 将张量移动到各自的device

      torch.rand(10).to(device)
    
  • 直接在device创建张量:

      torch.rand(10, device=device)
    

这使得 CPUGPU 之间的切换很舒服,而无需更改实际代码。


编辑:

由于对 cachedallocated 内存存在一些问题和困惑,我正在添加一些关于它的额外信息:


您可以直接交出 device(如上文在帖子中进一步指定),也可以将其保留为 None,它将使用 @987654324 @。


附加说明:具有 Cuda 计算能力 3.0 或更低版本的旧显卡可能可见,但 Pytorch 无法使用!
感谢 hekimgil 指出这一点! - “找到 GPU0 GeForce GT 750M,它的 cuda 能力 3.0。PyTorch 不再支持这个 GPU,因为它太旧了。我们支持的最低 cuda 能力是 3.5。”

【讨论】:

  • 我试过你的代码,它可以识别显卡,但分配和缓存都是0GB。正常还是需要配置?
  • @KubiK888 如果您在此之前没有进行任何计算是完全正常的。您也不太可能在 PyTorch 中检测到 GPU 模型但无法访问它。尝试在 GPU 上进行一些计算,您应该会看到值发生了变化。
  • @KubiK888 你必须保持一致,你不能跨设备执行操作。像my_tensor_on_gpu * my_tensor_on_cpu 这样的任何操作都会失败。
  • 您的回答很好,但是对于第一个设备分配行,我想指出,仅仅因为有可用的 cuda 设备,并不意味着我们可以使用它。例如,我在值得信赖的旧电脑中有这个:Found GPU0 GeForce GT 750M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability that we support is 3.5.
  • @CharlieParker 我没有测试过这个,但我相信你可以使用torch.cuda.device_count() list(range(torch.cuda.device_count())) 应该给你一个所有设备索引的列表。
【解决方案7】:

如果您在这里是因为您的 pytorch 总是为 torch.cuda.is_available() 提供 False,那可能是因为您安装了没有 GPU 支持的 pytorch 版本。 (例如:您在笔记本电脑上编写代码,然后在服务器上进行测试)。

解决方案是使用 pytorch downloads 页面中的正确命令再次卸载并安装 pytorch。另请参阅this pytorch 问题。

【讨论】:

  • 即使您写的内容与问题有关。问题是:“如何检查 pytorch 是否正在使用 GPU?” 而不是 “如果 PyTorch 没有检测到我的 GPU,我该怎么办?” 所以我会说这个答案并不真正属于这个问题。但是您可能会发现有关此特定问题的另一个问题,您可以在其中分享您的知识。如果没有,您甚至可以写一个问题并自己回答,以帮助其他人解决同样的问题!
【解决方案8】:

在你开始运行训练循环后,如果你想手动从终端中观察你的程序是否正在使用 GPU 资源以及在多大程度上,那么你可以简单地使用watch 作为在:

$ watch -n 2 nvidia-smi

这将每 2 秒持续更新一次使用统计信息,直到您按下 ctrl+c


如果您需要对可能需要的更多 GPU 统计数据进行更多控制,可以使用 more sophisticated version of nvidia-smi with --query-gpu=...。下面是一个简单的说明:

$ watch -n 3 nvidia-smi --query-gpu=index,gpu_name,memory.total,memory.used,memory.free,temperature.gpu,pstate,utilization.gpu,utilization.memory --format=csv

它会输出类似这样的统计数据:

注意--query-gpu=... 中逗号分隔的查询名称之间不应有任何空格。否则这些值将被忽略并且不返回任何统计信息。


此外,您可以通过以下方式检查您的 PyTorch 安装是否正确检测到您的 CUDA 安装:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

True 状态意味着 PyTorch 配置正确并且正在使用 GPU,尽管您必须在代码中使用必要的语句移动/放置张量。


如果您想在 Python 代码中执行此操作,请查看此模块:

https://github.com/jonsafari/nvidia-ml-py 或在 pypi 中:https://pypi.python.org/pypi/nvidia-ml-py/

【讨论】:

  • 请记住 PyTorch 使用缓存的 GPU 内存分配器。即使 nividia-smi 已完全使用,您也可能会看到 GPU-Utill 较低。
  • @JakubBielan 谢谢!您能否提供参考以供更多阅读此内容?
  • 那个watch很有用
  • 这只适用于linux吗?
  • nvidia-smi 有一个标志 -l 表示循环秒数,因此您不必使用 watch:nvidia-smi -l 2 或以毫秒为单位:nvidia-smi -lms 2000
【解决方案9】:

检查是否有可用的 GPU:

torch.cuda.is_available()

如果上述函数返回False

  1. 你要么没有 GPU,
  2. 或未安装 Nvidia 驱动程序,因此操作系统看不到 GPU,
  3. 或者 GPU 被环境变量 CUDA_VISIBLE_DEVICES 隐藏。当CUDA_VISIBLE_DEVICES 的值为-1 时,您的所有设备都将被隐藏。您可以使用以下行在代码中检查该值:os.environ['CUDA_VISIBLE_DEVICES']

如果上述函数返回True,并不一定意味着您正在使用GPU。在 Pytorch 中,您可以在创建设备时将张量分配给设备。默认情况下,张量被分配给cpu。要检查张量的分配位置,请执行以下操作:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated

请注意,您不能对分配在不同设备中的张量进行操作。要了解如何将张量分配给 GPU,请参见此处:https://pytorch.org/docs/stable/notes/cuda.html

【讨论】:

    【解决方案10】:

    只需从命令提示符或 Linux 环境运行以下命令。

    python -c 'import torch; print(torch.cuda.is_available())'
    

    上面应该打印True

    python -c 'import torch; print(torch.rand(2,3).cuda())'
    

    这应该打印以下内容:

    tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
    

    【讨论】:

      【解决方案11】:

      这里几乎所有的答案都参考torch.cuda.is_available()。然而,这只是硬币的一部分。它告诉您 GPU(实际上是 CUDA)是否可用,而不是它是否实际被使用。在典型的设置中,您可以使用以下方式设置您的设备:

      device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
      

      但在较大的环境(例如研究)中,通常也会为用户提供更多选项,因此他们可以根据输入禁用 CUDA、指定 CUDA ID 等。在这种情况下,是否使用 GPU 不仅仅取决于它是否可用。将设备设置为手电筒设备后,您可以获取其type 属性来验证它是否为CUDA。

      if device.type == 'cuda':
          # do something
      

      【讨论】:

        【解决方案12】:

        在办公网站和get start页面,检查GPU for PyTorch如下:

        import torch
        torch.cuda.is_available()
        

        参考:PyTorch|Get Start

        【讨论】:

          猜你喜欢
          • 2019-01-12
          • 2018-11-23
          • 2020-07-06
          • 1970-01-01
          • 2022-01-27
          • 2020-08-12
          • 2019-04-12
          • 1970-01-01
          相关资源
          最近更新 更多