Як перевірити, чи pytorch використовує GPU?


160

Мені хотілося б знати, чи pytorchвикористовується мій GPU. Можна виявити, nvidia-smiчи є якась активність від GPU під час процесу, але я хочу, щоб щось було написано в pythonсценарії.

Чи є спосіб це зробити?

Відповіді:


259

Це буде працювати:

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.


10
Я думаю, що це просто показує, що ці пристрої доступні на машині, але я не впевнений, чи зможете ви отримати кількість пам'яті, яка використовується від кожного графічного процесора чи так ..
kmario23

4
біг torch.cuda.current_device()був для мене корисним. Це показало, що мій gpu, на жаль, занадто старий: "Знайдено GPU0 GeForce GTX 760, який має здатність cuda 3.0. PyTorch більше не підтримує цей графічний процесор, тому що він занадто старий".
JohnnyFun

3
torch.cuda.is_available()
мрглум

@ kmario23 Дякую, що вказали на це. Чи є виклик функції, який дає нам цю інформацію (скільки пам'яті використовує кожен графічний процесор)? :)
Натан

1
@frank Так, просто ця команда: $ watch -n 2 nvidia-smiвиконує завдання. Для отримання більш детальної інформації див. Мою відповідь нижче .
kmario23

75

Оскільки тут не було запропоновано, я додаю метод, використовуючи 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().


Я спробував ваш код, він розпізнає відеокарту, але виділений і кешований є 0 Гб. Це нормально чи мені потрібно їх налаштувати?
KubiK888

@ KubiK888 Якщо ви раніше не проводили жодних обчислень, це абсолютно нормально. Також малоймовірно, що ви можете виявити модель GPU в PyTorch, але не отримати доступ до неї. Спробуйте зробити кілька обчислень на GPU, і вам слід побачити, що значення змінюються.
MBT

Я створюю .py-скрипт на основі цього підручника - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Особливо скопіюйте / вставте розділ, починаючи з цього ## neural network in pytorch, після чого я додаю ваш кінець в кінці. Він все ще показує Використання пристрою: cuda; і 0Gb для виділених і кешованих. Також спробував вставити його в кінці циклу for for i in range(epoch):після повторного розповсюдження, все ще 0 Гб
KubiK888

1
@ KubiK888 Ви повинні бути послідовними, ви не можете виконувати операції на різних пристроях. Будь-яка операція, як, наприклад my_tensor_on_gpu * my_tensor_on_cpu, не вдасться
MBT

2
Ваша відповідь чудова, але в першому рядку призначення пристрою я хотів би зазначити, що те, що доступний пристрій cuda, не означає, що ми можемо ним користуватися. Наприклад, я маю це на своєму надійному старому комп’ютері: 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

Після запуску навчального циклу, якщо ви хочете вручну спостерігати за ним з терміналу, чи ваша програма використовує ресурси 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/


2
Пам'ятайте лише, що PyTorch використовує кешований розподільник пам'яті GPU. Ви можете побачити низький GPU-Utill для nividia-smi, навіть якщо він повністю використовується.
Якуб

1
@JakubBielan дякую! Ви можете, будь ласка, надати посилання для більш детального ознайомлення з цим питанням?
kmario23

1
Це watchкорисно
javadba


15

З практичної точки зору лише один незначний відступ:

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

Це все хитро, і розуміння цього одного разу, допомагає вам швидко впоратися з меншою налагодженням.


1
Що таке M()? Де Mвизначено?
Sycorax

1
Оновлено деяким класом M, визначеним як підклас nn.Module. Дякую за улов.
prosti

9

Щоб перевірити, чи є в наявності GPU:

torch.cuda.is_available()

Якщо вищезазначена функція повертається False,

  1. у вас або немає GPU,
  2. або драйвери Nvidia не встановлені, тому ОС не бачить GPU,
  3. або GPU приховується змінною середовища 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


5

Практично всі відповіді тут посилання 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

Приємні поради для дослідників.
prosti

3

Просто з командного рядка або середовища 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')

2

Якщо ви тут , тому що ваш pytorch завжди дає Falseдля того, torch.cuda.is_available()що, ймовірно , тому , що ви встановили pytorch версію без підтримки GPU. (Наприклад: ви закодовані в ноутбуці, а потім тестування на сервері).

Рішення полягає в тому, щоб видалити та встановити pytorch знову за допомогою правильної команди зі сторінки завантаження pytorch . Також зверніться до цього питання про піторх.


1
Хоча те, що ви написали, пов'язане з питанням. Питання: "Як перевірити, чи pytorch використовує GPU?" а не "Що я можу зробити, якщо PyTorch не виявить мій GPU?" Тож я б сказав, що ця відповідь насправді не належить до цього питання. Але у вас може виникнути інше питання щодо цього конкретного питання, де ви можете поділитися своїми знаннями. Якщо ні, ви навіть можете написати запитання та відповісти на нього самостійно, щоб допомогти іншим у тому ж питанні!
MBT

-4

Створіть тензор на GPU наступним чином:

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

Не виходьте, відкрийте інший термінал і перевірте, чи в процесі роботи python використовується GPU, використовуючи:

$ nvidia-smi

2
Я спеціально попросив рішення, яке не передбачає nvidia-smiкомандного рядка
vinzee

Ну, технічно ви завжди можете проаналізувати вихід будь-яких інструментів командного рядка, включаючи nvidia-smi.
Пастафаріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.