Как проверить, использует ли Pytorch графический процессор?


160

Я хотел бы знать, pytorchиспользует ли мой графический процессор. Можно определить, nvidia-smiесть ли какие-либо действия с графическим процессором во время процесса, но я хочу что-то записать в pythonсценарии.

Есть ли способ сделать это?

Ответы:


260

Это будет работать:

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 больше не поддерживает этот GPU, потому что он слишком старый».
JohnnyFun

3
torch.cuda.is_available()
mrgloom

@ 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)

    Возвращает максимальный объем памяти графического процессора, управляемый распределителем кэширования в байтах для данного устройства.

  • torch.cuda.memory_allocated(device=None)

    Возвращает текущее использование памяти графическим процессором в тензорах в байтах для данного устройства.


Вы можете либо напрямую передать, deviceкак указано выше в сообщении, либо оставить « Нет», и он будет использовать current_device().


Я попробовал ваш код, он распознает видеокарту, но выделенный и кэшированный оба 0 ГБ. Это нормально или мне нужно их настроить?
KubiK888

@ KubiK888 Если вы не делали никаких вычислений до этого, это совершенно нормально. Также маловероятно, что вы можете обнаружить модель графического процессора в PyTorch, но не получить к ней доступ. Попробуйте выполнить некоторые вычисления на GPU, и вы увидите, что значения меняются.
MBT

Я создаю скрипт .py на основе этого учебника - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Особенно скопируйте / вставьте раздел, начиная с ## neural network in pytorch, затем я добавлю ваш код в конце. Это все еще показывает Использование устройства: CUDA; и 0Gb для выделенного и кэшированного. Также попытался вставить его в конце цикла for for i in range(epoch):после обратного распространения, все еще 0GB
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.
Хекимгил

44

После того, как вы запустите обучающий цикл, если вы хотите вручную просмотреть его с терминала, использует ли ваша программа ресурсы GPU и в какой степени, то вы можете просто использовать watchкак в:

$ watch -n 2 nvidia-smi

Это будет постоянно обновлять статистику использования каждые 2 секунды, пока вы не нажмете ctrl+c


Если вам нужен больший контроль над большей статистикой GPU, вы можете использовать более сложную версию nvidia-smiwith--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-Utill для nividia-smi, даже если он полностью используется.
Якуб Билан

1
@JakubBielan спасибо! Не могли бы вы предоставить ссылку для дальнейшего чтения по этому вопросу?
kmario23

1
Это watchполезно
Джавадба


15

С практической точки зрения только одно небольшое отступление:

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

Это devтеперь знает, если CUDA или CPU.

И есть разница, как вы поступаете с моделью и с тензорами при переходе на cuda. Сначала это немного странно.

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. Спасибо за улов.
прости

9

Чтобы проверить, доступен ли графический процессор:

torch.cuda.is_available()

Если вышеуказанная функция возвращает False,

  1. у вас либо нет графического процессора,
  2. или драйверы Nvidia не были установлены, поэтому ОС не видит графический процессор,
  3. или графический процессор скрыт переменной среды CUDA_VISIBLE_DEVICES. Когда значение CUDA_VISIBLE_DEVICESравно -1, то все ваши устройства скрыты. Вы можете проверить это значение в коде с помощью этой строки:os.environ['CUDA_VISIBLE_DEVICES']

Если вышеприведенная функция возвращает True, это не обязательно означает, что вы используете графический процессор. В 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 и т. д. В таком случае, используется или нет графический процессор, зависит не только от того, доступен он или нет. После того, как устройство было установлено на устройство факела, вы можете получить его typeсвойство, чтобы проверить, является ли оно CUDA или нет.

if device.type == 'cuda':
    # do something

Хорошие советы для исследователей.
прости

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 . Также обратитесь к этой проблеме pytorch.


1
Хотя то, что вы написали, связано с вопросом. Вопрос: «Как проверить, использует ли Pytorch графический процессор?» а не "Что я могу сделать, если PyTorch не обнаруживает мой графический процессор?" Поэтому я бы сказал, что этот ответ на самом деле не относится к этому вопросу. Но вы можете найти другой вопрос об этой конкретной проблеме, где вы можете поделиться своими знаниями. Если нет, вы могли бы даже написать вопрос и ответить на него самостоятельно, чтобы помочь другим с той же проблемой!
MBT

-4

Создайте тензор на GPU следующим образом:

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

Не выходите, откройте другой терминал и проверьте, использует ли процесс python графический процессор, используя:

$ nvidia-smi

2
Я специально попросил решение, которое не связано nvidia-smiс командной строкой
vinzee

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