簡體   English   中英

如何檢查 pytorch 是否正在使用 GPU?

[英]How to check if pytorch is using the GPU?

如何檢查pytorch是否正在使用 GPU? 可以使用nvidia-smi檢測在此過程中是否有來自 GPU 的任何活動,但我想要用python腳本編寫的東西。

這應該有效:

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) 中使用。 目前, PyTorch正在使用Device 0或 GPU GeForce GTX 950M

由於這里沒有提出,我正在添加一個使用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之間輕松切換。


編輯:

由於關於緩存分配的內存存在一些問題和困惑,我正在添加一些關於它的附加信息:


您可以直接移交上面在帖子中進一步指定的device ,也可以將其保留為None ,它將使用current_device()


附加說明:具有 Cuda 計算能力 3.0 或更低版本的舊顯卡可能可見,但 Pytorch 無法使用!
感謝hekimgil指出這一點! - “發現 GPU0 GeForce GT 750M,cuda 能力為 3.0。PyTorch 不再支持該 GPU,因為它太舊了。我們支持的最低 cuda 能力為 3.5。”

開始運行訓練循環后,如果您想從終端手動觀察您的程序是否使用了 GPU 資源以及使用程度,那么您可以簡單地使用watch如下所示:

$ watch -n 2 nvidia-smi

這將每 2 秒持續更新一次使用統計數據,直到您按ctrl + c


如果您需要更多地控制可能需要的更多 GPU 統計數據,您可以使用更復雜的nvidia-smi版本和--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/

從實踐的角度來看,只是一個小題外話:

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

這一切都是棘手的,理解它一次,可以幫助您以更少的調試快速處理。

在辦公網站和開始頁面上,檢查 PyTorch 的 GPU,如下所示:

import torch
torch.cuda.is_available()

參考: PyTorch|入門

要檢查是否有可用的 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

檢查張量是否在 GPU 上

其他答案詳細介紹了如何檢查,如果GPU在當前計算機上。

要檢查給定的張量是否GPU使用(即存儲和操作),您可以訪問deviceis_cuda屬性:

>>> my_tensor.is_cuda
True

對於模型,您需要檢查其每個參數(例如權重張量):

>>> all(p.is_cuda for p in my_model.parameters())
True

這里幾乎所有的答案都參考了torch.cuda.is_available() 然而,這只是硬幣的一部分。 它告訴您 GPU(實際上是 CUDA)是否可用,而不是它是否正在實際使用。 在典型的設置中,您將使用以下內容設置您的設備:

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

但是在更大的環境(例如研究)中,為用戶提供更多選擇也是很常見的,因此根據輸入,他們可以禁用 CUDA,指定 CUDA ID,等等。 在這種情況下,是否使用GPU不僅僅取決於它是否可用。 設備設置為torch設備后,可以通過獲取其type屬性來驗證是否為CUDA。

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

只需從命令提示符或 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')

如果你在這里是因為你的 pytorch 總是為torch.cuda.is_available()給出False那可能是因為你安裝了沒有 GPU 支持的 pytorch 版本。 (例如:您在筆記本電腦上編碼,然后在服務器上進行測試)。

解決方案是使用 pytorch下載頁面中的正確命令再次卸載並安裝 pytorch。 另請參閱pytorch 問題。

這是可能的

torch.cuda.is_available()

返回True但運行時出現以下錯誤

>>> torch.rand(10).to(device)

正如 MBT 所建議的:

RuntimeError: CUDA error: no kernel image is available for execution on the device

這個鏈接解釋說

... torch.cuda.is_available 僅檢查您的驅動程序是否與我們在二進制文件中使用的 cuda 版本兼容。 所以這意味着 CUDA 10.1 與您的驅動程序兼容。 但是當您使用 CUDA 進行計算時,它找不到您的拱門的代碼。

如果您使用的是 Linux,我建議安裝nvtop https://github.com/Syllo/nvtop

你會得到這樣的東西: 在此處輸入圖像描述

使用下面的代碼

import torch
torch.cuda.is_available()

只會顯示 GPU 是否存在並被 pytorch 檢測到。

但是在“任務管理器-> 性能”中,GPU 利用率將非常低。

這意味着您實際上是在使用 CPU 運行。

要解決上述問題檢查和更改:

  1. 圖形設置 --> 打開硬件加速 GPU 設置,重新啟動。
  2. 在通知區域中打開 NVIDIA 控制面板 --> 桌面 --> 顯示 GPU [注意:如果您有新安裝的 windows 那么您也必須同意 NVIDIA 控制面板中的條款和條件]

這應該有效!

您可以在訓練模型時使用 Tensorboard 監控系統上的所有資源設備。 請通過此鏈接了解更多詳細信息https://pytorch.org/docs/stable/tensorboard.html

在 GPU 上創建一個張量,如下所示:

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

不要退出,打開另一個終端並使用以下命令檢查 python 進程是否正在使用 GPU:

$ nvidia-smi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM