Jawaban:
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 950M
sedang digunakan oleh PyTorch
.
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."
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
melakukan pekerjaan. Untuk detail lebih lanjut, silakan lihat jawaban saya di bawah ini .
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 device
itu 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.
Karena ada beberapa pertanyaan dan kebingungan tentang memori yang di - cache dan dialokasikan, saya menambahkan beberapa informasi tambahan tentang itu:
torch.cuda.max_memory_cached(device=None)
Mengembalikan memori GPU maksimum yang dikelola oleh pengalokasi caching dalam byte untuk perangkat yang diberikan.
torch.cuda.memory_allocated(device=None)
Mengembalikan penggunaan memori GPU saat ini dengan tensor dalam byte untuk perangkat yang diberikan.
Anda juga dapat langsung menyerahkan device
sebagaimana ditentukan lebih lanjut di atas di pos atau Anda dapat meninggalkan itu ada dan akan menggunakan current_device()
.
## 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
my_tensor_on_gpu * my_tensor_on_cpu
akan gagal.
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.
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 watch
seperti 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-smi
dengan--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:
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
True
berarti 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/
watch
berguna
Di situs kantor dan halaman mulai, periksa GPU untuk PyTorch seperti di bawah ini:
import torch
torch.cuda.is_available()
Referensi: PyTorch | Dapatkan Mulai
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.
M()
? Di mana M
didefinisikan?
Untuk memeriksa apakah ada GPU yang tersedia:
torch.cuda.is_available()
Jika fungsi di atas kembali False
,
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 True
itu 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
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 type
propertinya memverifikasi apakah itu CUDA atau tidak.
if device.type == 'cuda':
# do something
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')
Jika Anda berada di sini karena pytorch Anda selalu memberi False
untuk 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 .
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
nvidia-smi
dari baris perintah
nvidia-smi
.