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.