pytorch学習ノート(18):Use-GPu

9907 ワード

このセクションでは、単一のNVIDIA GPUを使用して計算する方法について説明します.PyTorch GPUバージョンがインストールされていることを確認する必要があります.準備が完了すると、nvidia-smiコマンドでグラフィックス情報を表示できます.
!nvidia-smi  #  Linux/macOS    

出力:
Sun Mar 17 14:59:57 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 GTX 1050    Off  | 00000000:01:00.0 Off |                  N/A |
| 20%   36C    P5    N/A /  75W |   1223MiB /  2000MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1235      G   /usr/lib/xorg/Xorg                           434MiB |
|    0      2095      G   compiz                                       163MiB |
|    0      2660      G   /opt/teamviewer/tv_bin/TeamViewer              5MiB |
|    0      4166      G   /proc/self/exe                               416MiB |
|    0     13274      C   /home/tss/anaconda3/bin/python               191MiB |
+-----------------------------------------------------------------------------+

1.計算装置
PyTorchは、メモリを使用するCPUや、ディスプレイメモリを使用するGPUなど、記憶および計算のためのデバイスを指定することができる.デフォルトでは、PyTorchはメモリにデータを作成し、CPUで計算します.torch.cuda.is_available()でGPUが利用可能かどうかを確認します.
import torch
from torch import nn

torch.cuda.is_available() #    True

GPU数の表示:
torch.cuda.device_count() #    1

現在のGPUインデックス番号を表示します.インデックス番号は0から始まります.
torch.cuda.current_device() #    0

インデックス番号に基づいてGPU名を表示するには:
torch.cuda.get_device_name(0) #    'GeForce GTX 1050'

2.TensorのGPU計算
デフォルトでは、Tensorがメモリに存在します.そのため、これまでTensorを印刷するたびにGPU関連の標識が見えませんでした.
x = torch.tensor([1, 2, 3])
x

出力:
tensor([1, 2, 3])
.cuda()を使用して、CPU上のTensorをGPUに変換(コピー)することができる.複数のGPUがある場合、我々は、第i i iブロックGPUおよび対応するメモリ(i i i iは0から始まる)を.cuda(i)で表し、cuda(0)およびcuda()は等価である.
x = x.cuda(0)
x

出力:
tensor([1, 2, 3], device='cuda:0')
Tensordevice属性によって、Tensorが存在するデバイスを表示することができる.
x.device

出力:
device(type='cuda', index=0)

作成時にデバイスを直接指定できます.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

x = torch.tensor([1, 2, 3], device=device)
# or
x = torch.tensor([1, 2, 3]).to(device)
x

出力:
tensor([1, 2, 3], device='cuda:0')

GPU上のデータを演算すると、結果はGPU上に格納される.
y = x**2
y

出力:
tensor([1, 4, 9], device='cuda:0')

なお、異なる位置に格納されたデータは、直接計算することはできない.すなわち、CPUに格納されたデータはGPUに格納されたデータと直接演算することはできず、異なるGPUに格納されたデータも直接計算することはできない.
z = y + x.cpu()

エラーが表示されます.
RuntimeError: Expected object of type torch.cuda.LongTensor but found type torch.LongTensor for argument #3 'other'

3.モデルのGPU計算Tensorと同様に、PyTorchモデルは.cudaを介してGPUに変換することもできる.モデルのパラメータのdevice属性を調べることで、モデルを格納するデバイスを表示することができます.
net = nn.Linear(3, 1)
list(net.parameters())[0].device

出力:
device(type='cpu')

可視モデルはCPUにあり、GPUに変換されます.
net.cuda()
list(net.parameters())[0].device

出力:
device(type='cuda', index=0)

同様に、モデル入力のTensorとモデルが同じデバイスにあることを保証する必要はありません.そうしないと、エラーが発生します.
x = torch.rand(2,3).cuda()
net(x)

出力:
tensor([[-0.5800],
        [-0.2995]], device='cuda:0', grad_fn=)

小結
  • PyTorchは、メモリを使用するCPUや、ディスプレイメモリを使用するGPUなどの記憶および計算のためのデバイスを指定することができる.デフォルトでは、PyTorchはメモリにデータを作成し、CPUを使用して計算します.
  • PyTorchは、計算されたすべての入力データがメモリまたは同じグラフィックスカードのディスプレイメモリに存在することを要求します.