回答:
これはうまくいくでしょう:
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
。
torch.cuda.current_device()
は私にとって役に立ちました。残念ながら、私のgpuは古すぎることがわかりました。「cuda機能3.0のGPU0 GeForce GTX 760が見つかりました。古すぎるため、PyTorchはこのGPUをサポートしていません。」
torch.cuda.is_available()
ここでは提案されていない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の快適になります。
いくつかの質問や混乱があったように、キャッシュされたと割り当てられて、私はそれについていくつかの追加情報を追加しているメモリ:
torch.cuda.max_memory_cached(device=None)
指定されたデバイスのキャッシュアロケーターによって管理される最大GPUメモリをバイト単位で返します。
torch.cuda.memory_allocated(device=None)
特定のデバイスのテンソルによる現在のGPUメモリ使用量をバイト単位で返します。
device
上記の投稿で指定されたとおりに直接渡すか、Noneのままにしておくとを使用しcurrent_device()
ます。
## neural network in pytorch
、最後にコードを追加します。それはまだデバイスの使用を示しています:cuda; 割り当て済みおよびキャッシュ済みの場合は0Gb。またfor i in range(epoch):
、逆伝播後のforループの最後に挿入しようとしましたが、すべて0GBです
my_tensor_on_gpu * my_tensor_on_cpu
は失敗します。
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.
トレーニングループの実行を開始した後、プログラムがGPUリソースをどの程度利用しているかをターミナルから手動で監視する場合は、次のように使用するだけですwatch
。
$ watch -n 2 nvidia-smi
これにより、ctrl+ を押すまで、2秒ごとに使用状況の統計が継続的に更新されますc
必要になる可能性があるGPU統計をより詳細に制御する必要がある場合は、nvidia-smi
withのより洗練されたバージョンを--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
True
PyTorchが正しく設定されていることをステータス手段され、あなたのコード内で必要な発言でテンソルを配置/移動する必要がありますが、GPUを使用しました。
Pythonコード内でこれを行う場合は、このモジュールを調べます。
https://github.com/jonsafari/nvidia-ml-pyまたはここのpypi:https ://pypi.python.org/pypi/nvidia-ml-py/
watch
は便利です
オフィスサイトとスタートページで、以下のようにPyTorchのGPUを確認します。
import torch
torch.cuda.is_available()
リファレンス:PyTorch | Get Start
実用的な観点からは、ちょっとした余談があります。
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
これはすべてトリッキーであり、一度理解すれば、より少ないデバッグで迅速に対処するのに役立ちます。
M()
?どこがM
定義されていますか?
利用可能なGPUがあるかどうかを確認するには:
torch.cuda.is_available()
上記の関数がを返す場合False
、
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をご覧ください。
ほとんどすべての回答はここで参照されています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
あなたのpytorchは常に与えるので、あなたはここにいる場合False
のためにtorch.cuda.is_available()
あなたはGPUのサポートなしであなたのpytorchバージョンをインストールしているためそれはおそらくです。(例:ラップトップでコーディングしてからサーバーでテストします)。
解決策は、pytorchのダウンロードページから正しいコマンドを使用して、pytorchをアンインストールしてから再度インストールすることです。この pytorchの問題も参照してください。
次のようにGPUでテンソルを作成します。
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
終了せずに別のターミナルを開き、PythonプロセスがGPUを使用しているかどうかを確認します。
$ nvidia-smi
nvidia-smi
コマンドラインから関与しない解決策を求めました
nvidia-smi
。