Pytorch'un GPU kullanıp kullanmadığını nasıl kontrol edebilirim?


160

pytorchGPU'mu kullanıp kullanmadığını bilmek istiyorum. nvidia-smiİşlem sırasında GPU'dan herhangi bir etkinlik olup olmadığını tespit etmek mümkündür , ancak bir pythonsenaryoda yazılı bir şey istiyorum .

Bunu yapmanın bir yolu var mı?

Yanıtlar:


259

Bu işe yarayacak:

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

Bu bana GPU GeForce GTX 950Mtarafından kullanıldığını söylüyor PyTorch.


10
Bu sadece bu cihazların makinede kullanılabilir olduğunu gösterir ama her GPU ya da öylesine ne kadar bellek kullanıldığını alabilirsiniz emin değilim ..
kmario23

4
koşu torch.cuda.current_device()benim için yararlı oldu. Benim gpu'm maalesef çok eski olduğunu gösterdi: "Cuda yeteneği 3.0 olan GPU0 GeForce GTX 760 bulundu. PyTorch artık çok eski olduğu için bu GPU'yu desteklemiyor."
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ kmario23 Bunu işaret ettiğiniz için teşekkür ederiz. Bize bu bilgileri veren bir işlev çağrısı var mı (her GPU tarafından ne kadar bellek kullanılıyor)? :)
Nathan

1
@frank Evet, sadece bu komut: $ watch -n 2 nvidia-smiişi yapar. Daha fazla ayrıntı için lütfen aşağıdaki cevabıma bakın .
kmario23

75

Burada önerilmediğinden torch.device, doğru bir şekilde tensörleri başlatırken de oldukça kullanışlı olduğu için bir yöntem ekliyorum 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')

Çıktı:

Using device: cuda

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

Yukarıda belirtildiği gibi, kullanarak deviceöyle mümkün :

  • için taşımak ilgili hiç tensörleri device:

    torch.rand(10).to(device)
  • için oluşturmak doğrudan bir tensörünü device:

    torch.rand(10, device=device)

Bu , gerçek kodu değiştirmeden CPU ve GPU arasında geçiş yapmayı kolaylaştırır .


Düzenle:

Önbelleğe alınmış ve ayrılmış bellek hakkında bazı sorular ve karışıklıklar olduğu için, bu konuda ek bilgiler ekliyorum:


Direkt deviceolarak yukarıda belirtildiği gibi bir a'yı doğrudan gönderebilir veya Yok olarak bırakabilirsiniz ve current_device().


Kodunuzu denedim, grafik kartını tanıyor ancak ayrılan ve önbelleğe alınan her ikisi de 0GB. Normal mi yoksa bunları yapılandırmam gerekiyor mu?
KubiK888

@ KubiK888 Daha önce herhangi bir hesaplama yapmadıysanız, bu normaldir. Ayrıca GPU modelini PyTorch içinde tespit edebilmeniz, ancak erişmemeniz de olası değildir. GPU üzerinde bazı hesaplamalar yapmayı deneyin ve değerlerin değiştiğini görmelisiniz.
MBT

Bu öğreticiyi temel alan bir .py betiği oluşturuyorum - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Özellikle ile başlayan bölümü kopyalayıp yapıştırarak ## neural network in pytorch, sonunda kodunuzu ekliyorum. Hala gösteriyor Cihaz kullanma: cuda; ve Tahsis ve Önbellek için 0Gb. Ayrıca for i in range(epoch):geri
yayılmadan

1
@ KubiK888 Tutarlı olmalısınız, cihazlar arasında işlem yapamazsınız. Gibi herhangi bir işlem my_tensor_on_gpu * my_tensor_on_cpubaşarısız olur.
MBT

2
Cevabınız harika ama ilk cihaz atama hattı için, mevcut bir cuda cihazı olduğu için onu kullanabileceğimiz anlamına gelmediğini belirtmek isterim. Örneğin, güvenilir eski bilgisayarımda var: 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

Eğitim döngüsünü çalıştırmaya başladıktan sonra , programınızın GPU kaynaklarını kullanıp kullanmadığını ve ne ölçüde kullandığını terminalden manuel olarak izlemek istiyorsanız, aşağıdaki watchgibi kullanabilirsiniz :

$ watch -n 2 nvidia-smi

Bu, ctrl+ tuşlarına basana kadar her 2 saniyede bir kullanım istatistiklerini sürekli olarak güncelleyecektirc


Daha GPU istatistiklerle ilgili daha fazla kontrol gerekiyorsa kullanabileceğiniz, gerekebilir daha sofistike versiyonu nvidia-smiile--query-gpu=... . Aşağıda bunun basit bir örneği verilmiştir:

$ 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

Bu istatistikler gibi bir şey çıktı:

resim açıklamasını buraya girin

Not : içindeki virgülle ayrılmış sorgu adları arasında boşluk olmamalıdır --query-gpu=.... Aksi takdirde bu değerler göz ardı edilir ve hiçbir istatistik döndürülmez.


Ayrıca, PyTorch kurulumunuzun CUDA kurulumunuzu doğru bir şekilde tespit edip etmediğini kontrol ederek şunları yapabilirsiniz:

In [13]: import  torch

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

Truebir durumun anlamı PyTorch doğru yapılandırıldığını ve bu edilmektedir sen / hareket kodunuzda gerekli ifadelere tensörleri yerleştirmek zorunda olsa GPU kullanarak.


Bunu Python kodu içinde yapmak istiyorsanız, şu modüle bakın:

https://github.com/jonsafari/nvidia-ml-py veya burada pypi'de: https://pypi.python.org/pypi/nvidia-ml-py/


2
PyTorch'un önbelleğe alınmış GPU bellek ayırıcı kullandığını unutmayın. Tamamen kullanılmış olsa bile nividia-smi için düşük GPU-Utill görebilirsiniz.
Jakub Bielan

1
@JakubBielan teşekkürler! bu konuyla ilgili daha fazla bilgi için lütfen bir referans verebilir misiniz?
kmario23

1
Bu watchyararlı
javadba

18

Ofis sitesinde ve başlangıç ​​sayfasında PyTorch için GPU'yu aşağıdaki gibi kontrol edin:

import torch
torch.cuda.is_available()

Referans: PyTorch | Başlangıç


15

Pratik açıdan sadece küçük bir araştırma:

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

Bu dev artık cuda mı yoksa cpu mu olduğunu biliyor.

Cuda'ya giderken model ve tensörlerle nasıl başa çıktığınız konusunda bir fark var. İlk başta biraz garip.

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

Tüm bunlar zor ve bir kez anlamak, daha az hata ayıklama ile hızlı başa çıkmanıza yardımcı olur.


1
Nedir M()? Nerede Mtanımlı?
Sycorax

1
Nn Modülünün bir alt sınıfı olarak tanımlanan bazı M sınıfı ile güncellendi. Yakaladığınız için teşekkürler.
prosti

9

Kullanılabilir bir GPU olup olmadığını kontrol etmek için:

torch.cuda.is_available()

Yukarıdaki işlev geri dönerse False,

  1. ya GPU'nuz yok,
  2. veya Nvidia sürücüleri kurulmamış, bu nedenle işletim sistemi GPU'yu görmüyor,
  3. veya GPU çevresel değişken tarafından gizleniyor CUDA_VISIBLE_DEVICES. Değeri CUDA_VISIBLE_DEVICES-1 olduğunda, tüm cihazlarınız gizlenir. Koddaki değeri bu satırla kontrol edebilirsiniz:os.environ['CUDA_VISIBLE_DEVICES']

Yukarıdaki işlev döndürülürse True, GPU kullandığınız anlamına gelmez. Pytorch'ta, aygıtları oluştururken tensörleri tahsis edebilirsiniz. Varsayılan olarak, tensörler cpu. Tensörünüzün nereye tahsis edildiğini kontrol etmek için şunları yapın:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated

Farklı cihazlarda tahsis edilen tensörler üzerinde çalışamayacağınızı unutmayın. GPU'ya nasıl bir tensör tahsis edileceğini görmek için buraya bakın: https://pytorch.org/docs/stable/notes/cuda.html


5

Hemen hemen tüm cevaplar burada referans torch.cuda.is_available(). Ancak, madalyonun sadece bir kısmı. GPU'nun (aslında CUDA) kullanılabilir olup olmadığını, gerçekte kullanılıp kullanılmadığını gösterir. Tipik bir kurulumda, cihazınızı aşağıdaki gibi bir şeyle ayarlarsınız:

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

ancak daha büyük ortamlarda (ör. araştırma) kullanıcıya daha fazla seçenek vermek de yaygındır, bu nedenle girdilere dayanarak CUDA'yı devre dışı bırakabilir, CUDA kimlikleri belirtebilir vb. Bu durumda, GPU'nun kullanılıp kullanılmayacağı yalnızca kullanılabilir olup olmamasına bağlı değildir. Aygıt bir meşale aygıtına ayarlandıktan sonra, typeCUDA olup olmadığını doğrulamak için özelliğini alabilirsiniz .

if device.type == 'cuda':
    # do something

Araştırmacılar için güzel ipuçları.
prosti

3

Sadece komut isteminden veya Linux ortamından aşağıdaki komutu çalıştırın.

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

Yukarıdakiler yazdırılmalıdır True

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

Bu aşağıdakileri yazdırmalıdır:

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

2

Senin pytorch hep verir, çünkü burada değilseniz Falseiçintorch.cuda.is_available() , muhtemelen pytorch sürümünüzü GPU desteği olmadan yüklediğiniz için. (Örn: dizüstü bilgisayarda kod yazıp sunucuda test ettiniz).

Çözüm, pytorch indirme sayfasından sağ komutla pytorch'u tekrar kaldırmak ve kurmaktır . Ayrıca bu sıkışma sorununa da bakın .


1
Yazdıklarınız soru ile ilgili olsa da. Soru şudur: "Pytorch'un GPU kullanıp kullanmadığını nasıl kontrol edebilirim?" ve "PyTorch benim GPU algılamaz olursa ne yapabilirim?" Bu cevabın aslında bu soruya ait olmadığını söyleyebilirim. Ancak bu konu hakkında bilginizi paylaşabileceğiniz başka bir soru bulabilirsiniz. Değilse, bir soru bile yazabilir ve aynı sorunla başkalarına yardım etmek için kendiniz cevaplayabilirsiniz!
MBT

-4

GPU'da aşağıdaki gibi bir tensör oluşturun:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

Çıkmayın, başka bir terminal açın ve python işleminin GPU'yu kullanıp kullanmadığını kontrol edin:

$ nvidia-smi

2
Özellikle nvidia-smikomut satırında yer almayan bir çözüm istedim
vinzee

Teknik olarak, çıktıyı her zaman dahil olmak üzere herhangi bir komut satırı aracını ayrıştırabilirsiniz nvidia-smi.
Pastafarianist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.