Yanıtlar:
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 950M
tarafından kullanıldığını söylüyor PyTorch
.
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."
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
işi yapar. Daha fazla ayrıntı için lütfen aşağıdaki cevabıma bakın .
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 .
Ö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:
torch.cuda.max_memory_cached(device=None)
Belirli bir aygıt için önbellek ayırıcı tarafından yönetilen maksimum GPU belleğini bayt cinsinden döndürür.
torch.cuda.memory_allocated(device=None)
Belirli bir aygıt için tensörlerin bayt cinsinden geçerli GPU bellek kullanımını döndürür.
Direkt device
olarak yukarıda belirtildiği gibi bir a'yı doğrudan gönderebilir veya Yok olarak bırakabilirsiniz ve current_device()
.
## 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
my_tensor_on_gpu * my_tensor_on_cpu
başarısız olur.
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.
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 watch
gibi 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-smi
ile--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ı:
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
True
bir 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/
watch
yararlı
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ıç
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.
M()
? Nerede M
tanımlı?
Kullanılabilir bir GPU olup olmadığını kontrol etmek için:
torch.cuda.is_available()
Yukarıdaki işlev geri dönerse False
,
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
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, type
CUDA olup olmadığını doğrulamak için özelliğini alabilirsiniz .
if device.type == 'cuda':
# do something
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')
Senin pytorch hep verir, çünkü burada değilseniz False
iç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 .
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
nvidia-smi
komut satırında yer almayan bir çözüm istedim
nvidia-smi
.