PytorchでのGPUの使用方法
環境の確認
このページではすでにNVIDIA driverとCUDA libralyがinstallされ、環境構築が終了しているものとする。
GPUの確認
以下のコマンドを、Macならterminal, Windowsならコマンドプロンプトに入力実行することでGPUの状態を確認できる。
nvidia-smi
出力の例は以下の通り。(4GPUの例)
Thu Apr 2 00:21:04 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.14 Driver Version: 430.14 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... On | 00000000:01:00.0 Off | N/A |
| 41% 30C P8 16W / 260W | 0MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 208... On | 00000000:02:00.0 Off | N/A |
| 41% 35C P0 59W / 260W | 0MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce RTX 208... On | 00000000:03:00.0 Off | N/A |
| 41% 29C P8 10W / 260W | 0MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 GeForce RTX 208... On | 00000000:07:00.0 Off | N/A |
| 41% 28C P8 14W / 260W | 0MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
上の出力の様に、使用可能なGPUの分だけGPU情報が表示される。例だと4GPUが認識されていることがわかる。Memory Useageの列を見ると0MiB / 11019MiB と表示され、GPUのメモリが現在使われていないことがわかる。GPUの使用中にnvidia-smiを使用すると500MiB/11010MiBのようにどのくらいメモリを専有しているのかがわかる。会社や研究室などで共有のGPUを使用しているときは、使用状況を確認する必要がある。
CUDAの確認方法
python上でtorch.cuda.is_availableの返り値を見ることで、CUDAが現在利用可能かどうかを知ることができる。
import torch
print(torch.cuda.is_available())
#出力:Ture
- CUDAが利用可能 => True
- CUDAが利用できない状態 => False
GPUを使用する
GPUにTensorを載せる(1)
一番簡単な方法は、Tensorを初期化するときにdeviceを指定することである。
import tensor
X = tensor.randn(3, 2, device="cuda:0")
cuda:0を指定することで、上の例で言うXをGPUに転送することができる。cuda:1のように数字を変えると指定したGPUに転送される。
以上でGPUの使用方法がわかったが、実際には以下のように記述することが多い。
GPUにTensorを載せる(2)
すべてのPytorchのTensorにはメンバ関数のto()が含まれている。このto()は、どのデバイスにTensorを置くかを指定することができる。デバイスの初期化はtorch.deviceオブジェクトで行う。
- CPUを使うとき:torch.deviceに"cpu"を入力して初期化
- GPUを使うとき:torch.deviceに"cuda:0″を入力して初期化
- 複数のGPUが存在するときはコロンのあとの番号でGPU番号を指定。
ここまでの内容を踏まえ、PytorchでGPUを使用する場合の一般的な流れを示す。
- GPUが使えるかどうか確認
- GPUが使えるなら"cuda:0″,そうでないなら"cpu"でtorch.deviceを初期化
- Tensorを初期化(初期化段階ではTensorはcpu上にある)
- Tensorを2. で指定したデバイスに載せる
コードは次のようになる。
import torch
#1
if torch.cuda.is_available():
d_type = "cuda:0"
else:
d_type = "cpu"
#2
device = torch.device(d_type)
#3 適当なTensorを用意
A = torch.randn(6, 3)
#4
A.to(device)
実際は次のようにまとめて記述する事が多い。
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
A = torch.randn(3, 5)
A.to(device)
Tensorが使っているGPUを確認する
GPUに置かれたTensorにはget_device()という関数が用意されている。これを使うと、どのGPUに置かれているのか知ることができる。
>>>A.get_device()
0
ちなみにcpuに置かれたTensorで同じことをするとエラーになる。
違うGPUに乗っているTensor同士で計算を行うとエラーが発生するので注意。
ディスカッション
コメント一覧
There’s certainly a lot to find out about this subject.
I really like all the points you made.
Thank you very much!
I’m glad to hear your comments.