Відповіді:
Це буде працювати:
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
Це говорить мені, що GPU GeForce GTX 950M
використовується PyTorch
.
torch.cuda.current_device()
був для мене корисним. Це показало, що мій gpu, на жаль, занадто старий: "Знайдено GPU0 GeForce GTX 760, який має здатність cuda 3.0. PyTorch більше не підтримує цей графічний процесор, тому що він занадто старий".
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
виконує завдання. Для отримання більш детальної інформації див. Мою відповідь нижче .
Оскільки тут не було запропоновано, я додаю метод, використовуючи torch.device
, оскільки це досить зручно і при ініціалізації тензорів на правильному 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')
Вихід:
Using device: cuda
Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached: 0.6 GB
Як було сказано вище, за допомогою device
його можна :
Щоб перемістити тензори до відповідних device
:
torch.rand(10).to(device)
Щоб створити тензор безпосередньо на device
:
torch.rand(10, device=device)
Це робить зручне переключення між процесором та графічним процесором без зміни фактичного коду.
Оскільки виникли запитання та плутанина щодо кешованої та виділеної пам’яті, я додаю додаткову інформацію про неї:
torch.cuda.max_memory_cached(device=None)
Повертає максимальну пам'ять GPU, керовану розподільником кешування в байтах для даного пристрою.
torch.cuda.memory_allocated(device=None)
Повертає поточне використання пам'яті GPU тензарами в байтах для даного пристрою.
Ви можете або безпосередньо передати, device
як зазначено вище у публікації, або залишити його жодним, і він використовуватиме current_device()
.
## neural network in pytorch
, після чого я додаю ваш кінець в кінці. Він все ще показує Використання пристрою: cuda; і 0Gb для виділених і кешованих. Також спробував вставити його в кінці циклу for for i in range(epoch):
після повторного розповсюдження, все ще 0 Гб
my_tensor_on_gpu * my_tensor_on_cpu
, не вдасться
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.
Після запуску навчального циклу, якщо ви хочете вручну спостерігати за ним з терміналу, чи ваша програма використовує ресурси GPU і якою мірою, ви можете просто використовувати watch
як у:
$ watch -n 2 nvidia-smi
Це постійно оновлюватиме статистику використання кожні 2 секунди, поки ви не натиснете ctrl+c
Якщо вам потрібно більше контролю на більш статистикою GPU може знадобитися, ви можете використовувати більш складну версію nvidia-smi
з--query-gpu=...
. Нижче наведена проста ілюстрація цього:
$ 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
яка виводить статистику приблизно так:
Примітка . Між іменами запитів, відокремлених комами, не повинно бути місця --query-gpu=...
. Інакше ці значення будуть ігноровані, а статистика не повертається.
Крім того, ви можете перевірити, чи правильно встановлено встановлення PyTorch вашої установки CUDA, виконавши:
In [13]: import torch
In [14]: torch.cuda.is_available()
Out[14]: True
True
означає положення , що PyTorch налаштований правильно , і це з допомогою GPU , хоча ви повинні перемістити / місце тензорів з необхідними заявами в вашому коді.
Якщо ви хочете зробити це всередині коду Python, перегляньте цей модуль:
https://github.com/jonsafari/nvidia-ml-py або в pypi тут: https://pypi.python.org/pypi/nvidia-ml-py/
watch
корисно
На офісному сайті та на сторінці запуску перевірте GPU на PyTorch, як показано нижче:
import torch
torch.cuda.is_available()
Довідка: PyTorch | Початок роботи
З практичної точки зору лише один незначний відступ:
import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
Це dev
тепер знає, чи куда чи процесор.
І є різниця в тому, як ти поводишся з моделлю та з тензорами при переході до куди. Спочатку це трохи дивно.
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
Це все хитро, і розуміння цього одного разу, допомагає вам швидко впоратися з меншою налагодженням.
M()
? Де M
визначено?
Щоб перевірити, чи є в наявності GPU:
torch.cuda.is_available()
Якщо вищезазначена функція повертається False
,
CUDA_VISIBLE_DEVICES
. Коли значення CUDA_VISIBLE_DEVICES
дорівнює -1, то всі ваші пристрої ховаються. Ви можете перевірити це значення в коді за допомогою цього рядка:os.environ['CUDA_VISIBLE_DEVICES']
Якщо наведена вище функція повертається True
, це не обов'язково означає, що ви використовуєте GPU. У Pytorch ви можете виділити тензори для пристроїв під час їх створення. За замовчуванням тензори виділяються на cpu
. Щоб перевірити, де розподіляється ваш тензор, виконайте такі дії:
# assuming that 'a' is a tensor created somewhere else
a.device # returns the device where the tensor is allocated
Зауважте, що не можна працювати на тензорах, виділених на різних пристроях. Щоб дізнатися, як виділити тензор до GPU, дивіться тут: https://pytorch.org/docs/stable/notes/cuda.html
Практично всі відповіді тут посилання torch.cuda.is_available()
. Однак це лише одна частина монети. Він говорить про те, чи доступний графічний процесор (насправді CUDA), а не те, чи він використовується. У типовому режимі ви встановите свій пристрій таким чином:
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
але у великих середовищах (наприклад, дослідження) також звичайно давати користувачеві більше можливостей, тому на основі введення вони можуть відключити CUDA, вказати ідентифікатори CUDA тощо. У такому випадку використання GPU чи ні, базується не лише на тому, наявний він чи ні. Після того, як пристрій встановлено на факельний пристрій, ви можете отримати його type
властивість перевірити, чи це CUDA чи ні.
if device.type == 'cuda':
# do something
Просто з командного рядка або середовища Linux запустіть наступну команду.
python -c 'import torch; print(torch.cuda.is_available())'
Наведене вище слід надрукувати True
python -c 'import torch; print(torch.rand(2,3).cuda())'
На цьому слід надрукувати наступне:
tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
Якщо ви тут , тому що ваш pytorch завжди дає False
для того, torch.cuda.is_available()
що, ймовірно , тому , що ви встановили pytorch версію без підтримки GPU. (Наприклад: ви закодовані в ноутбуці, а потім тестування на сервері).
Рішення полягає в тому, щоб видалити та встановити pytorch знову за допомогою правильної команди зі сторінки завантаження pytorch . Також зверніться до цього питання про піторх.
Створіть тензор на GPU наступним чином:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
Не виходьте, відкрийте інший термінал і перевірте, чи в процесі роботи python використовується GPU, використовуючи:
$ nvidia-smi
nvidia-smi
командного рядка
nvidia-smi
.