Ich würde gerne wissen, ob pytorch
meine GPU verwendet. Es ist möglich, mit nvidia-smi
festzustellen, ob während des Prozesses Aktivitäten von der GPU vorhanden sind, ich möchte jedoch, dass etwas in ein python
-Skript geschrieben wird.
Gibt es eine Möglichkeit, dies zu tun?
Das wird funktionieren:
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'
Dies sagt mir, dass die GPU GeForce GTX 950M
von PyTorch
verwendet wird.
Wenn Sie nach dem Start der Trainingsschleife vom Terminal aus manuell beobachten möchten, ob Ihr Programm die GPU-Ressourcen nutzt und in welchem Umfang, können Sie Folgendes verwenden:
$ watch -n 2 nvidia-smi
Dadurch werden die Nutzungsstatistiken alle 2 Sekunden aktualisiert, bis Sie auf drücken ctrl+c
Sie können auch überprüfen, ob Ihre Installation von PyTorch Ihre CUDA-Installation korrekt erkennt, indem Sie folgende Schritte ausführen:
In [13]: import torch
In [14]: torch.cuda.is_available()
Out[14]: True
True
status bedeutet, dass PyTorch korrekt konfiguriert ist und die GPU verwendet, obwohl Sie die Tensoren mit den erforderlichen Anweisungen in Ihrem Code verschieben/platzieren müssen.
Wenn Sie dies in Python-Code tun möchten, schauen Sie in dieses Modul:
https://github.com/jonsafari/nvidia-ml-py oder in pypi hier: https://pypi.python.org/pypi/nvidia-ml-py/
Da es hier nicht vorgeschlagen wurde, füge ich eine Methode hinzu, die torch.device
verwendet, da dies sehr praktisch ist, auch wenn Tensoren mit der richtigen device
initialisiert werden.
# 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')
Ausgabe:
Using device: cuda
Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached: 0.6 GB
Wie oben erwähnt, ist es mit device
möglich:
Verschieben von Tensoren in die entsprechende device
:
torch.Rand(10).to(device)
Oder erstellen Sie einen Tensor direkt auf der device
:
torch.Rand(10, device=device)
Das macht das Umschalten zwischen CPU und GPU komfortabel, ohne den tatsächlichen Code zu ändern.
Überprüfen Sie auf der Büroseite und auf der Startseite, ob die GPU für PyTorch wie folgt angezeigt wird:
import torch
torch.cuda.is_available()
Referenz: PyTorch | Erste Schritte
So prüfen Sie, ob eine GPU verfügbar ist:
torch.cuda.is_available()
Wenn die obige Funktion False
zurückgibt, haben Sie entweder keine GPU oder die Nvidia-Treiber wurden nicht installiert, sodass das Betriebssystem die GPU nicht sieht oder die GPU durch die Umgebungsvariable CUDA_VISIBLE_DEVICES
ausgeblendet wird. Wenn der Wert -1 ist, werden alle Ihre Geräte ausgeblendet. Sie können diesen Wert im Code mit folgender Zeile überprüfen: `os.environ ['CUDA_VISIBLE_DEVICES']
Wenn die obige Funktion True
zurückgibt, bedeutet dies nicht unbedingt, dass Sie die GPU verwenden. In Pytorch können Sie Geräten Tensoren zuweisen, wenn Sie sie erstellen. Standardmäßig werden Tensoren cpu
zugewiesen. Um zu überprüfen, wo Ihr Tensor zugeordnet ist, gehen Sie folgendermaßen vor:
# assuming that 'a' is a tensor created somewhere else
a.device # returns the device where the tensor is allocated
Beachten Sie, dass Sie nicht mit Tensoren arbeiten können, die in verschiedenen Geräten zugewiesen sind. Wie Sie der GPU einen Tensor zuweisen, erfahren Sie hier: https://pytorch.org/docs/stable/notes/cuda.html
Aus praktischer Sicht nur ein kleiner Exkurs:
import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
Dieser dev
weiß jetzt, ob cuda oder cpu.
Und es gibt einen Unterschied, wie Sie mit dem Modell und den Tensoren umgehen, wenn Sie zu cuda wechseln. Anfangs ist es etwas seltsam.
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
Das alles ist knifflig und das einmalige Verstehen hilft Ihnen dabei, schneller mit weniger Debugging umzugehen.
FWIW: Wenn Sie hier sind, weil Ihre Pytorch immer false
für torch.cuda.is_available()
gibt, liegt das wahrscheinlich daran, dass Sie Ihre Pytorch-Version ohne GPU-Unterstützung installiert haben. (ZB: Sie haben im Laptop verschlüsselt und dann auf dem Server getestet). Die Lösung besteht darin, pytorch mit dem richtigen Befehl von pytorch downloads page zu deinstallieren und erneut zu installieren. Siehe auch this Pytorch-Problem.
Erstellen Sie einen Tensor auf der GPU wie folgt:
$ python
>>> import torch
>>> print(torch.Rand(3,3).cuda())
Beenden Sie nicht, öffnen Sie ein anderes Terminal und prüfen Sie, ob der Python-Prozess die GPU verwendet.
$ nvidia-smi