pytorchがGPUを使用しているかどうかを確認するにはどうすればよいですか?


160

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

そうする方法はありますか?

回答:


259

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

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 950Mがによって使用されていることを示していますPyTorch


10
私は、これらのデバイスは、マシン上で利用可能であることをこれだけのショーと思うが、私はあなたが...各GPUから使用するか、そうされているどのくらいのメモリを得ることができるかどうかわからないんだけど
kmario23

4
ランニングtorch.cuda.current_device()は私にとって役に立ちました。残念ながら、私のgpuは古すぎることがわかりました。「cuda機能3.0のGPU0 GeForce GTX 760が見つかりました。古すぎるため、PyTorchはこのGPUをサポートしていません。」
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ kmario23これを指摘してくれてありがとう。その情報(各GPUが使用しているメモリの量)を提供する関数呼び出しはありますか?:)
Nathan

1
@フランクうん、単にこのコマンド:$ watch -n 2 nvidia-smi仕事をします。詳細については、以下の私の回答をご覧ください。
kmario23

75

ここでは提案されていない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_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上記の投稿で指定されたとおりに直接渡すか、Noneのままにしておくとを使用しcurrent_device()ます。


私はあなたのコードを試しました、それはグラフィックスカードを認識しますが、割り当てられ、キャッシュされた両方が0GBです。それは正常ですか、それとも構成する必要がありますか?
KubiK888

@ KubiK888これまでに計算を行っていない場合、これは完全に正常です。また、PyTorch内でGPUモデルを検出できてもアクセスできない可能性はかなり低くなります。GPUでいくつかの計算を実行すると、値が変化することがわかります。
MBT

-私は、このチュートリアルに基づいての.pyスクリプトを作成analyticsvidhya.com/blog/2018/02/pytorch-tutorial。特に、で始まるセクションをコピーして貼り付け## neural network in pytorch、最後にコードを追加します。それはまだデバイスの使用を示しています:cuda; 割り当て済みおよびキャッシュ済みの場合は0Gb。またfor i in range(epoch):、逆伝播後のforループの最後に挿入しようとしましたが、すべて0GBです
KubiK888

1
@ KubiK888一貫性が必要です。デバイス間で操作を実行することはできません。などの操作my_tensor_on_gpu * my_tensor_on_cpuは失敗します。
MBT、

2
あなたの答えは素晴らしいですが、最初のデバイス割り当て行では、利用可能な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.
hekimgil

44

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

$ watch -n 2 nvidia-smi

これにより、ctrl+ を押すまで、2秒ごとに使用状況の統計が継続的に更新されますc


必要になる可能性があるGPU統計をより詳細に制御する必要がある場合は、nvidia-smiwithのより洗練されたバージョンを--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

TruePyTorchが正しく設定されていることをステータス手段され、あなたのコード内で必要な発言でテンソルを配置/移動する必要がありますが、GPUを使用しました。


Pythonコード内でこれを行う場合は、このモジュールを調べます。

https://github.com/jonsafari/nvidia-ml-pyまたはここのpypi:https ://pypi.python.org/pypi/nvidia-ml-py/


2
PyTorchはキャッシュされたGPUメモリアロケーターを使用することを覚えておいてください。nividia-smiが十分に使用されていても、GPU Utillが低い場合があります。
Jakub Bielan

1
@JakubBielanありがとう!これについてもっと読むためのリファレンスを提供していただけませんか?
kmario23

1
それwatchは便利です
javadba

18

オフィスサイトとスタートページで、以下のようにPyTorchのGPUを確認します。

import torch
torch.cuda.is_available()

リファレンス:PyTorch | Get Start


15

実用的な観点からは、ちょっとした余談があります。

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

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

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


1
なにM()?どこがM定義されていますか?
Sycorax

1
nn.Moduleのサブクラスとして定義されたクラスMで更新されました。キャッチありがとうございます。
prosti

9

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

torch.cuda.is_available()

上記の関数がを返す場合False

  1. GPUがないか
  2. または、Nvidiaドライバーがインストールされていないため、OSが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をご覧ください。


5

ほとんどすべての回答はここで参照されています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

研究者のための素晴らしいヒント。
prosti

3

コマンドプロンプトまたは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')

2

あなたのpytorchは常に与えるので、あなたはここにいる場合Falseのためにtorch.cuda.is_available()あなたはGPUのサポートなしであなたのpytorchバージョンをインストールしているためそれはおそらくです。(例:ラップトップでコーディングしてからサーバーでテストします)。

解決策は、pytorchのダウンロードページから正しいコマンドを使用して、pytorchをアンインストールしてから再度インストールすることです。この pytorchの問題も参照してください。


1
あなたが書いたものは質問に関連していますが。問題は、「pytorchがGPUを使用しているかどうかを確認する方法」です。そしてない「PyTorchは私のGPUを検出しない場合、私は何ができますか?」だから私はこの答えは本当にこの質問に属していないと思います。しかし、あなたはあなたがあなたの知識を共有することができるこの特定の問題について別の質問を見つけるかもしれません。そうでない場合は、質問を書いて自分で答え、同じ問題を持つ他の人を助けることもできます!
MBTは

-4

次のようにGPUでテンソルを作成します。

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

終了せずに別のターミナルを開き、PythonプロセスがGPUを使用しているかどうかを確認します。

$ nvidia-smi

2
私は特にnvidia-smiコマンドラインから関与しない解決策を求めました
vinzee

まあ、技術的には、を含むコマンドラインツールの出力をいつでも解析できますnvidia-smi
パスタファリアニスト2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.