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

159

Ich würde gerne wissen, ob pytorchmeine GPU verwendet wird. Es ist möglich zu erkennen, nvidia-smiob während des Vorgangs Aktivitäten von der GPU ausgeführt werden, aber ich möchte, dass etwas in ein pythonSkript geschrieben wird.

Gibt es eine Möglichkeit dazu?

vinzee
quelle

Antworten:

255

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'

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

Dies sagt mir, dass die GPU GeForce GTX 950Mvon verwendet wird PyTorch.

vinzee
quelle
10
Ich denke, dies zeigt nur, dass diese Geräte auf dem Computer verfügbar sind, aber ich bin nicht sicher, ob Sie erhalten können, wie viel Speicher von jeder GPU oder so verwendet wird.
kmario23
4
Laufen torch.cuda.current_device()war hilfreich für mich. Es zeigte sich, dass meine GPU leider zu alt ist: "GPU0 GeForce GTX 760 mit Cuda-Fähigkeit 3.0 gefunden. PyTorch unterstützt diese GPU nicht mehr, weil sie zu alt ist."
JohnnyFun
3
torch.cuda.is_available()
Mrgloom
@ kmario23 Danke, dass du darauf hingewiesen hast. Gibt es einen Funktionsaufruf, der uns diese Informationen gibt (wie viel Speicher wird von jeder GPU verwendet)? :)
Nathan
1
@frank Ja, einfach dieser Befehl: $ watch -n 2 nvidia-smierledigt den Job. Weitere Details finden Sie in meiner Antwort unten .
kmario23
74

Da es hier nicht vorgeschlagen wurde, füge ich eine Methode hinzu torch.device, die sehr praktisch ist, auch wenn Tensoren auf der richtigen Seite initialisiert werden 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')

Ausgabe:

Using device: cuda

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

Wie oben erwähnt, deviceist es möglich, Folgendes zu verwenden :

  • So verschieben Sie Tensoren zu den jeweiligen device:

    torch.rand(10).to(device)
  • So erstellen Sie einen Tensor direkt auf device:

    torch.rand(10, device=device)

Dies macht das Umschalten zwischen CPU und GPU bequem, ohne den tatsächlichen Code zu ändern.


Bearbeiten:

Da es einige Fragen und Verwirrung bezüglich des zwischengespeicherten und zugewiesenen Speichers gab, füge ich einige zusätzliche Informationen hinzu:


Sie können entweder direkt ein devicewie weiter oben in der Post angegeben übergeben oder Sie können es Keine lassen und es wird das verwenden current_device().

MBT
quelle
Ich habe Ihren Code ausprobiert, er erkennt die Grafikkarte, aber die zugewiesenen und zwischengespeicherten sind beide 0 GB. Ist es normal oder muss ich sie konfigurieren?
KubiK888
@ KubiK888 Wenn Sie vorher noch keine Berechnung durchgeführt haben, ist dies völlig normal. Es ist auch ziemlich 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 feststellen, dass sich die Werte ändern.
MBT
Ich erstelle ein .py-Skript basierend auf diesem Tutorial - analysevidhya.com/blog/2018/02/pytorch-tutorial . Kopieren / Einfügen des Abschnitts, beginnend mit ## neural network in pytorch, dann füge ich am Ende Ihren Code hinzu. Es wird weiterhin "Using device" angezeigt: cuda; und 0 GB für zugewiesen und zwischengespeichert. for i in range(epoch):Ich habe auch versucht, es am Ende der for-Schleife nach der Rückübertragung
einzufügen
1
@ KubiK888 Sie müssen konsistent sein, Sie können keine Vorgänge zwischen Geräten ausführen. Jede Operation wie my_tensor_on_gpu * my_tensor_on_cpuwird fehlschlagen.
MBT
2
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 dies in meinem vertrauenswürdigen 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
44

Wenn Sie nach dem Ausführen der Trainingsschleife manuell vom Terminal aus beobachten möchten, ob und in welchem ​​Umfang Ihr Programm die GPU-Ressourcen nutzt, können Sie einfach Folgendes verwenden watch:

$ watch -n 2 nvidia-smi

Dadurch werden die Nutzungsstatistiken alle 2 Sekunden kontinuierlich aktualisiert, bis Sie ctrl+ drückenc


Wenn Sie mehr Kontrolle über mehr GPU-Statistiken benötigen, können Sie eine komplexere Version von nvidia-smiwith verwenden--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

welches die Statistiken so etwas ausgeben würde wie:

Geben Sie hier die Bildbeschreibung ein

Hinweis : 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

TrueStatus 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 sich dieses Modul an:

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

kmario23
quelle
2
Denken Sie daran, dass PyTorch einen zwischengespeicherten GPU-Speicherzuweiser verwendet. Möglicherweise wird für nividia-smi ein niedriger GPU-Utill angezeigt, selbst wenn dieser vollständig verwendet wird.
Jakub Bielan
1
@ JakubBielan danke! Könnten Sie bitte eine Referenz für weitere Informationen dazu bereitstellen?
kmario23
1
Das watchist nützlich
javadba
18

Überprüfen Sie auf der Office-Site und auf der Startseite die GPU für PyTorch wie folgt:

import torch
torch.cuda.is_available()

Referenz: PyTorch | Erste Schritte

TimeSeam
quelle
15

Vom praktischen Standpunkt aus 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 Modell und 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

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 schwierig und wenn Sie es einmal verstehen, können Sie schnell mit weniger Debugging umgehen.

Prosti
quelle
1
Was ist M()? Wo ist Mdefiniert?
Sycorax
1
Aktualisiert mit einer Klasse M, die als Unterklasse von nn.Module definiert ist. Danke für den Fang.
Prosti
9

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

torch.cuda.is_available()

Wenn die obige Funktion zurückkehrt False,

  1. Sie haben entweder keine GPU,
  2. oder die Nvidia-Treiber wurden nicht installiert, sodass das Betriebssystem die GPU nicht sieht.
  3. oder die GPU wird von der Umgebungsvariablen ausgeblendet CUDA_VISIBLE_DEVICES. Wenn der Wert 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ückgegeben wird True, bedeutet dies nicht unbedingt, dass Sie die GPU verwenden. In Pytorch können Sie Geräten beim Erstellen Tensoren zuweisen. Standardmäßig werden Tensoren dem zugeordnet cpu. Um zu überprüfen, wo Ihr Tensor zugeordnet ist, gehen Sie wie folgt 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. Informationen zum Zuweisen eines Tensors zur GPU finden Sie hier: https://pytorch.org/docs/stable/notes/cuda.html

Jadiel de Armas
quelle
5

Fast alle Antworten beziehen sich hier torch.cuda.is_available(). Dies ist jedoch nur ein Teil der Medaille. Hier erfahren Sie, ob die GPU (tatsächlich CUDA) verfügbar ist und nicht, ob sie tatsächlich verwendet wird. In einem typischen Setup würden Sie Ihr Gerät folgendermaßen einstellen:

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

In größeren Umgebungen (z. B. Forschung) ist es jedoch auch üblich, dem Benutzer mehr Optionen zur Verfügung zu stellen, sodass er basierend auf der Eingabe CUDA deaktivieren, CUDA-IDs angeben usw. kann. In diesem Fall hängt die Verwendung der GPU nicht nur davon ab, ob sie verfügbar ist oder nicht. Nachdem das Gerät auf ein Taschenlampengerät eingestellt wurde, können Sie dessen erhaltentype Eigenschaft überprüfen, ob es sich um CUDA handelt oder nicht.

if device.type == 'cuda':
    # do something
Bram Vanroy
quelle
Schöne Tipps für Forscher.
Prosti
3

Führen Sie einfach an der Eingabeaufforderung oder in der Linux-Umgebung den folgenden Befehl aus.

python -c 'import torch; print(torch.cuda.is_available())'

Das obige sollte gedruckt werden True

python -c 'import torch; print(torch.rand(2,3).cuda())'

Dieser sollte folgendes drucken:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
DSBLR
quelle
2

Wenn Sie hier sind , weil Ihr pytorch gibt immer Falsefür torch.cuda.is_available()das ist wahrscheinlich , weil Sie Ihre pytorch Version ohne GPU - Unterstützung installiert. (ZB: Sie haben im Laptop codiert und dann auf dem Server getestet).

Die Lösung besteht darin, pytorch mit dem richtigen Befehl von der pytorch- Downloadseite zu deinstallieren und erneut zu installieren . Lesen Sie auch dieses Pytorch-Problem.

Mithunpaul
quelle
1
Auch wenn das, was Sie geschrieben haben, mit der Frage zusammenhängt. Die Frage ist: "Wie kann ich überprüfen, ob Pytorch die GPU verwendet?" und nicht "Was kann ich tun, wenn PyTorch meine GPU nicht erkennt?" Ich würde also sagen, dass diese Antwort nicht wirklich zu dieser Frage gehört. Möglicherweise finden Sie jedoch eine andere Frage zu diesem speziellen Thema, in der Sie Ihr Wissen teilen können. Wenn nicht, könnten Sie sogar eine Frage schreiben und selbst beantworten, um anderen bei demselben Problem zu helfen!
MBT
-4

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 überprüfen Sie, ob der Python-Prozess die GPU verwendet, indem Sie:

$ nvidia-smi
Litesaber
quelle
2
Ich habe speziell nach einer Lösung gefragt, die nicht nvidia-smiüber die Befehlszeile erfolgt
vinzee
Technisch gesehen können Sie die Ausgabe jederzeit mit allen Befehlszeilentools analysieren, einschließlich nvidia-smi.
Pastafarianist