Antworten:
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 950M
von verwendet wird PyTorch
.
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."
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
erledigt den Job. Weitere Details finden Sie in meiner Antwort unten .
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, device
ist 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.
Da es einige Fragen und Verwirrung bezüglich des zwischengespeicherten und zugewiesenen Speichers gab, füge ich einige zusätzliche Informationen hinzu:
torch.cuda.max_memory_cached(device=None)
Gibt den maximalen GPU-Speicher, der vom Caching-Allokator verwaltet wird, in Byte für ein bestimmtes Gerät zurück.
torch.cuda.memory_allocated(device=None)
Gibt die aktuelle GPU-Speichernutzung durch Tensoren in Byte für ein bestimmtes Gerät zurück.
Sie können entweder direkt ein device
wie weiter oben in der Post angegeben übergeben oder Sie können es Keine lassen und es wird das verwenden current_device()
.
## 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
my_tensor_on_gpu * my_tensor_on_cpu
wird fehlschlagen.
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.
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-smi
with 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:
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
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 sich dieses Modul an:
https://github.com/jonsafari/nvidia-ml-py oder in pypi hier: https://pypi.python.org/pypi/nvidia-ml-py/
watch
ist nützlich
Ü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
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.
M()
? Wo ist M
definiert?
So überprüfen Sie, ob eine GPU verfügbar ist:
torch.cuda.is_available()
Wenn die obige Funktion zurückkehrt False
,
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
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
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')
Wenn Sie hier sind , weil Ihr pytorch gibt immer False
fü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.
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
nvidia-smi
über die Befehlszeile erfolgt
nvidia-smi
.