web-dev-qa-db-ja.com

pytorchがGPUを使用しているかどうかを調べる方法は?

pytorchが私のGPUを使っているかどうか知りたいのですが。プロセス中にGPUからのアクティビティがあるかどうかをnvidia-smiで検出することは可能ですが、pythonスクリプトで何か書いてほしいのです。

それをする方法はありますか?

54
vinzee

これはうまくいくでしょう:

In [1]: import torch

In [2]: torch.cuda.current_device()
Out[2]: 0

In [3]: torch.cuda.device(0)
Out[3]: <torch.cuda.device at 0x7efce0b03be0>

In [4]: torch.cuda.device_count()
Out[4]: 1

In [5]: torch.cuda.get_device_name(0)
Out[5]: 'GeForce GTX 950M'

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

これは、GPUのGeForce GTX 950MPyTorchによって使用されていることを示しています。

93
vinzee

トレーニングループの実行を開始した後、プログラムがGPUリソ​​ースを使用しているかどうか、またどの程度まで手動端末から監視したい場合は、次のように使用できます。

$ watch -n 2 nvidia-smi

これを押すまで2秒ごとに使用状況が更新されます。 ctrl+c


また、あなたの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/

28
kmario23

ここでは提案されていないので、正しいdeviceでテンソルを初期化するときにも、これは非常に便利なので、 torch.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_cached(0)/1024**3,1), 'GB')

出力:

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を簡単に切り替えることができます。


編集:

キャッシュされた割り当てられたメモリについていくつか質問と混乱がありましたので、私はそれに関するいくつかの追加情報を追加します:


上の投稿で直接指定したように、deviceを直接引き渡すことも、そのままにすることもできますなしそしてそれは current_device() を使います。

19
blue-phoenox

オフィスサイトとスタートページで、以下のようにPyTorchのGPUを確認してください。

import torch
torch.cuda.is_available()

参照: PyTorch |はじめよう

10
TimeSeam

利用可能なGPUがあるかどうかを確認するには:

torch.cuda.is_available()

上記の関数がFalseを返す場合は、GPUがないか、NvidiaドライバがインストールされていないためにOSがGPUを認識できないか、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

3
Jadiel de Armas

実用的な観点からは、わずかな余談が1つあります。

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

このdevは、cudaかcpuかを認識します。

また、cudaに移行する際のモデルとテンソルの扱い方には違いがあります。最初は少し奇妙です。

import torch
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


model = M()   # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True

これはすべてトリッキーであり、一度理解すれば、より少ないデバッグで迅速に対処するのに役立ちます。

2
prosti

FWIW:あなたのpytorchが常にtorch.cuda.is_available()に対してfalseを与えるのでここにいるのなら、おそらくあなたはあなたのpytorchバージョンをGPUサポートなしでインストールしたからでしょう。 (例:あなたはラップトップでコーディングしてからサーバーでテストしました)。解決策はpytorch downloads pageから正しいコマンドでpytorchをアンインストールして再度インストールすることです。 this pytorchの問題も参照してください。

0
mithunpaul

以下のようにGPU上にテンソルを作成します。

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

終了しないで、別の端末を開いて、pythonプロセスがGPUを使用しているかどうか確認してください。

$ nvidia-smi
0
litesaber