[英]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)
這使得在不更改實際代碼的情況下在CPU和GPU之間輕松切換。
由於關於緩存和分配的內存存在一些問題和困惑,我正在添加一些關於它的附加信息:
torch.cuda.max_memory_cached(device=None)
返回給定設備的緩存分配器管理的最大 GPU 內存(以字節為單位)。
torch.cuda.memory_allocated(device=None)
通過張量返回給定設備的當前 GPU 內存使用量(以字節為單位)。
您可以直接移交上面在帖子中進一步指定的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
這一切都是棘手的,理解它一次,可以幫助您以更少的調試快速處理。
要檢查是否有可用的 GPU:
torch.cuda.is_available()
如果上述函數返回False
,
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使用(即存儲和操作),您可以訪問device
或is_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')
這是可能的
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 運行。
要解決上述問題檢查和更改:
這應該有效!
您可以在訓練模型時使用 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.