Wie überprüfe ich, ob PyTorch die GPU verwendet?

Lesezeit: 9 Minuten

Benutzer-Avatar
Vinzee

Wie überprüfe ich, ob PyTorch die GPU verwendet? Das nvidia-smi Der Befehl kann GPU-Aktivität erkennen, aber ich möchte es direkt in einem Python-Skript überprüfen.

  • Gibt es eine Möglichkeit, eine Liste aller derzeit verfügbaren GPUs zu erhalten? etwas wie devices = torch.get_all_devices() # [0, 1, 2] or whatever their name is

    – Charly Parker

    10. November 2020 um 19:57 Uhr

  • Siehe stackoverflow.com/questions/64776822/…: [torch.cuda.device(i) for i in range(torch.cuda.device_count())]

    – Vinzee

    10. November 2020 um 21:14 Uhr

  • Mir wurde gesagt, das funktioniert list(range(torch.cuda.device_count())). Trotzdem danke!

    – Charly Parker

    11. November 2020 um 14:31 Uhr

  • @CharlieParker, Sie möchten (vorausgesetzt, Sie haben import torch): devices = [d for d in range(torch.cuda.device_count())] Und wenn Sie die Namen wollen: device_names = [torch.cuda.get_device_name(d) for d in devices] Sie können, wie ich, diese als Diktat für die maschinenübergreifende Verwaltung abbilden: device_to_name = dict( device_names, devices )

    – hallo_da_andy

    7. Oktober 2021 um 0:32 Uhr


Benutzer-Avatar
Vinzee

Diese Funktionen sollen helfen:

>>> import torch

>>> torch.cuda.is_available()
True

>>> torch.cuda.device_count()
1

>>> torch.cuda.current_device()
0

>>> torch.cuda.device(0)
<torch.cuda.device at 0x7efce0b03be0>

>>> torch.cuda.get_device_name(0)
'GeForce GTX 950M'

Das sagt uns:

  • CUDA ist verfügbar und kann von einem Gerät verwendet werden.
  • Device 0 bezieht sich auf die GPU GeForce GTX 950Mund es wird derzeit von PyTorch ausgewählt.

  • Ich denke, dies zeigt nur, dass diese Geräte auf dem Computer verfügbar sind, aber ich bin mir nicht sicher, ob Sie herausfinden können, wie viel Speicher von jeder GPU oder so verwendet wird.

    – kmario23

    10. Januar 2018 um 1:12 Uhr

  • laufend torch.cuda.current_device() war hilfreich für mich. Es zeigte sich, dass meine GPU leider zu alt ist: “Found GPU0 GeForce GTX 760 which is of cuda Capability 3.0. PyTorch unterstützt diese GPU nicht mehr, weil sie zu alt ist.”

    – JohnnyFun

    3. März 2019 um 14:22 Uhr

  • torch.cuda.is_available()

    – Mrgloom

    24. März 2019 um 12:40 Uhr

  • @kmario23 Danke für den Hinweis. Gibt es einen Funktionsaufruf, der uns diese Informationen liefert (wie viel Speicher wird von jeder GPU verwendet)? 🙂

    – Nathan

    31. Juli 2019 um 1:08 Uhr

  • @frank Yep, einfach dieser Befehl: $ watch -n 2 nvidia-smi macht den Job. Weitere Einzelheiten finden Sie in meiner Antwort unten.

    – kmario23

    31. Juli 2019 um 3:07 Uhr

Benutzer-Avatar
MBT

Da es hier nicht vorgeschlagen wurde, füge ich eine Methode mit hinzu torch.deviceda dies sehr praktisch ist, auch beim Initialisieren von Tensoren auf dem richtigen 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_reserved(0)/1024**3,1), 'GB')

Bearbeiten: torch.cuda.memory_cached wurde umbenannt in torch.cuda.memory_reserved. Also verwenden memory_cached für ältere Versionen.

Ausgabe:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

Wie oben erwähnt, mit device es ist möglich zu:

  • Zu Bewegung Tensoren zu den jeweiligen device:

    torch.rand(10).to(device)
    
  • Zu schaffen ein Tensor direkt auf der device:

    torch.rand(10, device=device)
    

Das macht das Umschalten zwischen Zentralprozessor und Grafikkarte komfortabel, ohne den eigentlichen Code zu ändern.


Bearbeiten:

Da es einige Fragen und Verwirrung darüber gegeben hat zwischengespeichert und zugeteilt Speicher Ich füge einige zusätzliche Informationen darüber hinzu:

Sie können entweder direkt eine übergeben device wie weiter oben in der Post angegeben oder Sie können es lassen Keiner und es wird die verwenden current_device().


Zusätzlicher Hinweis: Alte Grafikkarten mit Cuda-Rechenleistung 3.0 oder niedriger können sichtbar sein, können aber nicht von Pytorch verwendet werden!
Danke an hekimgil für den Hinweis! – “GPU0 GeForce GT 750M mit cuda-Fähigkeit 3.0 gefunden. PyTorch unterstützt diese GPU nicht mehr, da sie zu alt ist. Die minimale cuda-Fähigkeit, die wir unterstützen, ist 3.5.”

  • Ich habe Ihren Code ausprobiert, er erkennt die Grafikkarte, aber die zugewiesenen und zwischengespeicherten sind beide 0 GB. Ist das normal oder muss ich sie konfigurieren?

    – KubiK888

    29. März 2019 um 17:04 Uhr

  • @KubiK888 Wenn Sie noch keine Berechnungen durchgeführt haben, ist dies völlig normal. Es ist auch eher unwahrscheinlich, dass Sie das GPU-Modell in PyTorch erkennen, aber nicht darauf zugreifen können. Versuchen Sie, einige Berechnungen auf der GPU durchzuführen, und Sie sollten sehen, dass sich die Werte ändern.

    – MBT

    29. März 2019 um 18:05 Uhr

  • @KubiK888 Sie müssen konsistent sein, Sie können keine Operationen über Geräte hinweg durchführen. Jede Operation wie my_tensor_on_gpu * my_tensor_on_cpu wird versagen.

    – MBT

    29. März 2019 um 20:28 Uhr

  • Ihre Antwort ist großartig, aber für die erste Gerätezuweisungszeile möchte ich darauf hinweisen, dass nur weil ein cuda-Gerät verfügbar ist, dies nicht bedeutet, dass wir es verwenden können. Zum Beispiel habe ich das in meinem treuen alten Computer: 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.

    – hekimgil

    11. März 2020 um 1:24 Uhr


  • @CharlieParker Ich habe das nicht getestet, aber ich glaube, Sie können es verwenden torch.cuda.device_count() wo list(range(torch.cuda.device_count())) sollte Ihnen eine Liste aller Geräteindizes geben.

    – MBT

    11. November 2020 um 7:21 Uhr

Benutzer-Avatar
kmario23

Nachdem Sie mit dem Laufen der Trainingsschleife begonnen haben, wenn Sie möchten manuell Beobachten Sie vom Terminal aus, ob Ihr Programm die GPU-Ressourcen auslastet und in welchem ​​Umfang, dann können Sie es einfach verwenden watch wie in:

$ watch -n 2 nvidia-smi

Dadurch werden die Nutzungsstatistiken kontinuierlich alle 2 Sekunden aktualisiert, bis Sie drücken Strg+c


Wenn Sie mehr Kontrolle über weitere GPU-Statistiken benötigen, die Sie möglicherweise benötigen, können Sie verwenden anspruchsvollere Version von nvidia-smi mit --query-gpu=.... Unten ist eine einfache Illustration davon:

$ 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

was die Statistiken so ausgeben würde:

Geben Sie hier die Bildbeschreibung ein

Notiz: Zwischen den durch Kommas getrennten Abfragenamen darf kein Leerzeichen stehen --query-gpu=.... Andernfalls werden diese Werte ignoriert und es werden keine Statistiken zurückgegeben.


Sie können auch überprüfen, ob Ihre Installation von PyTorch Ihre CUDA-Installation korrekt erkennt, indem Sie Folgendes tun:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

True Status bedeutet, dass PyTorch korrekt konfiguriert ist und ist Verwenden der GPU, obwohl Sie die Tensoren mit den erforderlichen Anweisungen in Ihrem Code verschieben/platzieren müssen.


Wenn Sie dies im Python-Code tun möchten, schauen Sie sich dieses Modul an:

https://github.com/jonsafari/nvidia-ml-py oder in pypi hier: https://pypi.python.org/pypi/nvidia-ml-py/

  • Denken Sie daran, dass PyTorch einen zwischengespeicherten GPU-Speicherzuordner verwendet. Möglicherweise sehen Sie einen niedrigen GPU-Utill für Nividia-SMI, selbst wenn es vollständig verwendet wird.

    – Jakob Bielan

    29. März 2019 um 14:19 Uhr

  • @JakubBielan danke! könnten Sie bitte eine Referenz für weitere Lektüre dazu bereitstellen?

    – kmario23

    22. April 2019 um 14:35 Uhr

  • Dass watch ist nützlich

    – WestCoastProjects

    10. April 2020 um 4:37 Uhr

  • Ist das nur für Linux?

    – Gülzar

    7. Oktober 2020 um 16:05 Uhr

  • nvidia-smi hat ein Flag -l für Schleifensekunden, sodass Sie es nicht verwenden müssen watch: nvidia-smi -l 2 Oder in Millisekunden: nvidia-smi -lms 2000

    – meferne

    28. September 2021 um 13:37 Uhr

Benutzer-Avatar
Prosti

Aus praktischer Sicht nur ein kleiner Exkurs:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

Dies dev weiß jetzt ob cuda oder cpu.

Und es gibt einen Unterschied, wie Sie mit Modellen und mit Tensoren umgehen, wenn Sie zu cuda übergehen. Es ist zunächst etwas seltsam.

import torch
import torch.nn as nn
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

Das alles ist knifflig und wenn man es einmal verstanden hat, hilft es einem, schnell mit weniger Debugging fertig zu werden.

Benutzer-Avatar
TimeSeam

Auf der Seite „Erste Schritte“ der offiziellen Website können Sie wie folgt überprüfen, ob die GPU für PyTorch verfügbar ist:

import torch
torch.cuda.is_available()

Bezug: PyTorch | Loslegen

Anfrage Befehl
Erkennt PyTorch GPUs? torch.cuda.is_available()
Werden Tensoren standardmäßig auf der GPU gespeichert? torch.rand(10).device
Stellen Sie den Standard-Tensortyp auf CUDA ein: torch.set_default_tensor_type(torch.cuda.FloatTensor)
Ist dieser Tensor ein GPU-Tensor? my_tensor.is_cuda
Ist dieses Modell auf der GPU gespeichert? all(p.is_cuda for p in my_model.parameters())

So überprüfen Sie, ob eine GPU verfügbar ist:

torch.cuda.is_available()

Wenn die obige Funktion zurückkehrt False,

  1. Entweder hast du keine GPU,
  2. oder die Nvidia-Treiber wurden nicht installiert, sodass das Betriebssystem die GPU nicht sieht,
  3. oder die GPU wird durch die Umgebungsvariable verdeckt CUDA_VISIBLE_DEVICES. Wenn der Wert von CUDA_VISIBLE_DEVICES -1 ist, werden alle Ihre Geräte ausgeblendet. Sie können diesen Wert im Code mit dieser Zeile überprüfen: os.environ['CUDA_VISIBLE_DEVICES']

Wenn die obige Funktion zurückkehrt True Das bedeutet nicht unbedingt, dass Sie die GPU verwenden. In Pytorch können Sie Geräten beim Erstellen Tensoren zuweisen. Standardmäßig werden den Tensoren zugeordnet cpu. Um zu überprüfen, wo Ihr Tensor zugewiesen ist, tun Sie Folgendes:

# 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 verschiedenen Geräten zugeordnet sind. Um zu sehen, wie man der GPU einen Tensor zuweist, siehe hier: https://pytorch.org/docs/stable/notes/cuda.html

1099560cookie-checkWie überprüfe ich, ob PyTorch die GPU verwendet?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy