pytorch
が私のGPUを使っているかどうか知りたいのですが。プロセス中にGPUからのアクティビティがあるかどうかをnvidia-smi
で検出することは可能ですが、python
スクリプトで何か書いてほしいのです。
それをする方法はありますか?
これはうまくいくでしょう:
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
によって使用されていることを示しています。
トレーニングループの実行を開始した後、プログラムが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/
ここでは提案されていないので、正しい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を簡単に切り替えることができます。
キャッシュされたと割り当てられたメモリについていくつか質問と混乱がありましたので、私はそれに関するいくつかの追加情報を追加します:
torch.cuda.max_memory_cached(device=None)
特定のデバイスのキャッシュアロケータによって管理されている最大GPUメモリをバイト単位で返します。
torch.cuda.memory_allocated(device=None)
特定のデバイスの現在のGPUメモリ使用量をテンソル単位でバイト単位で返します。
上の投稿で直接指定したように、device
を直接引き渡すことも、そのままにすることもできますなしそしてそれは current_device()
を使います。
オフィスサイトとスタートページで、以下のようにPyTorchのGPUを確認してください。
import torch
torch.cuda.is_available()
参照: PyTorch |はじめよう
利用可能な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
実用的な観点からは、わずかな余談が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
これはすべてトリッキーであり、一度理解すれば、より少ないデバッグで迅速に対処するのに役立ちます。
以下のようにGPU上にテンソルを作成します。
$ python
>>> import torch
>>> print(torch.Rand(3,3).cuda())
終了しないで、別の端末を開いて、pythonプロセスがGPUを使用しているかどうか確認してください。
$ nvidia-smi