Bagaimana cara memeriksa apakah pytorch menggunakan GPU?

160

Saya ingin tahu apakah pytorchmenggunakan GPU saya. Ada kemungkinan untuk mendeteksi nvidia-smijika ada aktivitas dari GPU selama proses, tetapi saya ingin sesuatu yang ditulis dalam pythonnaskah.

Apakah ada cara untuk melakukannya?

vinzee
sumber

Jawaban:

259

Ini akan bekerja:

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

Ini memberitahu saya GPU GeForce GTX 950Msedang digunakan oleh PyTorch.

vinzee
sumber
10
Saya pikir ini hanya menunjukkan bahwa perangkat ini tersedia pada mesin tetapi saya tidak yakin apakah Anda bisa mendapatkan berapa banyak memori yang digunakan dari masing-masing GPU atau lebih ..
kmario23
4
berlari torch.cuda.current_device()sangat membantu saya. Sayangnya, GPU saya terlalu tua: "Ditemukan GPU0 GeForce GTX 760 yang berkapasitas 3.0. PyTorch tidak lagi mendukung GPU ini karena terlalu tua."
JohnnyFun
3
torch.cuda.is_available()
mrgloom
@ kmario23 Terima kasih telah menunjukkan ini. Apakah ada panggilan fungsi yang memberi kita informasi itu (berapa banyak memori yang digunakan oleh setiap GPU)? :)
Nathan
1
@ jujur ​​Yap, cukup perintah ini: $ watch -n 2 nvidia-smimelakukan pekerjaan. Untuk detail lebih lanjut, silakan lihat jawaban saya di bawah ini .
kmario23
75

Karena belum diusulkan di sini, saya menambahkan metode menggunakan torch.device, karena ini cukup berguna, juga ketika menginisialisasi tensor pada yang benar 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')

Keluaran:

Using device: cuda

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

Seperti disebutkan di atas, menggunakan deviceitu adalah mungkin untuk :

  • Untuk memindahkan tensor ke masing-masing device:

    torch.rand(10).to(device)
  • Untuk membuat tensor langsung pada device:

    torch.rand(10, device=device)

Yang membuat beralih antara CPU dan GPU nyaman tanpa mengubah kode yang sebenarnya.


Edit:

Karena ada beberapa pertanyaan dan kebingungan tentang memori yang di - cache dan dialokasikan, saya menambahkan beberapa informasi tambahan tentang itu:


Anda juga dapat langsung menyerahkan devicesebagaimana ditentukan lebih lanjut di atas di pos atau Anda dapat meninggalkan itu ada dan akan menggunakan current_device().

MBT
sumber
Saya mencoba kode Anda, itu mengenali kartu grafis tetapi dialokasikan dan di-cache keduanya 0GB. Apakah itu normal atau apakah saya perlu mengonfigurasinya?
KubiK888
@ KubiK888 Jika Anda belum melakukan perhitungan apa pun sebelum ini adalah hal yang normal. Ini juga agak tidak mungkin bahwa Anda dapat mendeteksi model GPU dalam PyTorch tetapi tidak mengaksesnya. Coba lakukan beberapa perhitungan pada GPU dan Anda akan melihat bahwa nilainya berubah.
MBT
Saya membuat skrip .py berdasarkan tutorial ini - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Terutama salin / tempel bagian yang dimulai dengan ## neural network in pytorch, lalu saya tambahkan kode Anda di akhir. Itu masih menunjukkan Menggunakan perangkat: cuda; dan 0Gb untuk Alokasi dan Tembolok. Juga mencoba memasukkannya di akhir for loop for i in range(epoch):setelah back-propagation, masih semua 0GB
KubiK888
1
@ KubiK888 Anda harus konsisten, Anda tidak dapat melakukan operasi lintas perangkat. Operasi seperti apa pun my_tensor_on_gpu * my_tensor_on_cpuakan gagal.
MBT
2
Jawaban Anda bagus tetapi untuk baris penetapan perangkat pertama, saya ingin menunjukkan bahwa hanya karena ada perangkat cuda yang tersedia, tidak berarti bahwa kami dapat menggunakannya. Sebagai contoh, saya memiliki ini di komputer lama saya yang dapat dipercaya: 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

Setelah Anda mulai menjalankan loop pelatihan, jika Anda ingin menontonnya secara manual dari terminal apakah program Anda menggunakan sumber daya GPU dan sejauh mana, maka Anda dapat menggunakannya watchseperti pada:

$ watch -n 2 nvidia-smi

Ini akan terus memperbarui statistik penggunaan setiap 2 detik hingga Anda menekan ctrl+c


Jika Anda membutuhkan lebih banyak kontrol pada statistik GPU lebih mungkin Anda butuhkan, Anda dapat menggunakan versi yang lebih canggih dari nvidia-smidengan--query-gpu=... . Di bawah ini adalah ilustrasi sederhana ini:

$ 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

yang akan menampilkan statistik seperti:

masukkan deskripsi gambar di sini

Catatan : Seharusnya tidak ada spasi di antara nama kueri yang dipisahkan koma di --query-gpu=.... Jika tidak, nilai-nilai itu akan diabaikan dan tidak ada statistik yang dikembalikan.


Anda juga dapat memeriksa apakah instalasi PyTorch mendeteksi instalasi CUDA Anda dengan benar dengan melakukan:

In [13]: import  torch

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

Trueberarti status itu PyTorch dikonfigurasi dengan benar dan yang menggunakan GPU meskipun Anda harus memindahkan / menempatkan tensor dengan pernyataan yang diperlukan dalam kode Anda.


Jika Anda ingin melakukan ini di dalam kode Python, lihat modul ini:

https://github.com/jonsafari/nvidia-ml-py atau di pypi di sini: https://pypi.python.org/pypi/nvidia-ml-py/

kmario23
sumber
2
Ingatlah bahwa PyTorch menggunakan pengalokasi memori GPU yang di-cache. Anda mungkin melihat GPU-Utill rendah untuk nividia-smi bahkan jika sepenuhnya digunakan.
Jakub Bielan
1
@JakubBielan terima kasih! dapatkah Anda memberikan referensi untuk membaca lebih lanjut tentang ini?
kmario23
1
Bahwa watch berguna
javadba
18

Di situs kantor dan halaman mulai, periksa GPU untuk PyTorch seperti di bawah ini:

import torch
torch.cuda.is_available()

Referensi: PyTorch | Dapatkan Mulai

TimeSeam
sumber
15

Dari sudut pandang praktis, hanya satu penyimpangan kecil:

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

Ini dev sekarang tahu apakah cuda atau cpu.

Dan ada perbedaan bagaimana Anda berurusan dengan model dan dengan tensor ketika pindah ke cuda. Awalnya agak aneh.

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

Ini semua sulit dan memahaminya sekali, membantu Anda untuk menangani cepat dengan lebih sedikit debugging.

prosti
sumber
1
Apa M()? Di mana Mdidefinisikan?
Sycorax
1
Diperbarui dengan beberapa kelas M yang didefinisikan sebagai subkelas dari nn.Module. Terima kasih atas tangkapannya.
prosti
9

Untuk memeriksa apakah ada GPU yang tersedia:

torch.cuda.is_available()

Jika fungsi di atas kembali False,

  1. Anda juga tidak memiliki GPU,
  2. atau driver Nvidia belum diinstal sehingga OS tidak melihat GPU,
  3. atau GPU disembunyikan oleh variabel lingkungan CUDA_VISIBLE_DEVICES. Ketika nilai CUDA_VISIBLE_DEVICES-1, maka semua perangkat Anda disembunyikan. Anda dapat memeriksa nilai itu dalam kode dengan baris ini:os.environ['CUDA_VISIBLE_DEVICES']

Jika fungsi di atas kembali Trueitu tidak berarti Anda menggunakan GPU. Di Pytorch Anda dapat mengalokasikan tensor ke perangkat saat Anda membuatnya. Secara default, tensor dialokasikan ke cpu. Untuk memeriksa di mana tensor Anda dialokasikan lakukan:

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

Perhatikan bahwa Anda tidak dapat beroperasi pada tensor yang dialokasikan di perangkat yang berbeda. Untuk melihat bagaimana mengalokasikan tensor ke GPU, lihat di sini: https://pytorch.org/docs/stable/notes/cuda.html

Jadiel de Armas
sumber
5

Hampir semua jawaban di sini merujuk torch.cuda.is_available(). Namun, itu hanya satu bagian dari koin. Ini memberitahu Anda apakah GPU (sebenarnya CUDA) tersedia, bukan apakah itu benar-benar digunakan. Dalam pengaturan tipikal, Anda akan mengatur perangkat Anda dengan sesuatu seperti ini:

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

tetapi dalam lingkungan yang lebih besar (mis. penelitian) juga umum untuk memberikan pengguna lebih banyak opsi, jadi berdasarkan input mereka dapat menonaktifkan CUDA, menentukan ID CUDA, dan sebagainya. Dalam kasus seperti itu, apakah GPU digunakan atau tidak tidak hanya didasarkan pada apakah GPU itu tersedia atau tidak. Setelah perangkat disetel ke perangkat obor, Anda dapat meminta typepropertinya memverifikasi apakah itu CUDA atau tidak.

if device.type == 'cuda':
    # do something
Bram Vanroy
sumber
Kiat bagus untuk para peneliti.
prosti
3

Cukup dari command prompt atau lingkungan Linux jalankan perintah berikut.

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

Di atas harus dicetak True

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

Yang ini harus mencetak yang berikut ini:

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

Jika Anda berada di sini karena pytorch Anda selalu memberi Falseuntuk torch.cuda.is_available()itu mungkin karena Anda menginstal versi pytorch Anda tanpa dukungan GPU. (Misalnya: Anda membuat kode di laptop lalu menguji di server).

Solusinya adalah menghapus dan menginstal pytorch lagi dengan perintah yang benar dari halaman unduhan pytorch . Lihat juga masalah pytorch ini .

mithunpaul
sumber
1
Meskipun apa yang Anda tulis terkait dengan pertanyaan. Pertanyaannya adalah: "Bagaimana cara memeriksa apakah pytorch menggunakan GPU?" dan bukan "Apa yang bisa saya lakukan jika PyTorch tidak mendeteksi GPU saya?" Jadi saya akan mengatakan bahwa jawaban ini tidak benar-benar milik pertanyaan ini. Tetapi Anda dapat menemukan pertanyaan lain tentang masalah khusus ini di mana Anda dapat membagikan pengetahuan Anda. Jika tidak, Anda bahkan bisa menulis pertanyaan dan menjawabnya sendiri untuk membantu orang lain dengan masalah yang sama!
MBT
-4

Buat tensor pada GPU sebagai berikut:

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

Jangan berhenti, buka terminal lain dan periksa apakah proses python menggunakan GPU menggunakan:

$ nvidia-smi
litesaber
sumber
2
Saya secara khusus meminta solusi yang tidak melibatkan nvidia-smidari baris perintah
vinzee
Nah, secara teknis Anda selalu dapat mengurai output alat perintah-perintah apa pun, termasuk nvidia-smi.
Pastafarianis