Ответы:
Это будет работать:
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 больше не поддерживает этот GPU, потому что он слишком старый».
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)
Возвращает максимальный объем памяти графического процессора, управляемый распределителем кэширования в байтах для данного устройства.
torch.cuda.memory_allocated(device=None)
Возвращает текущее использование памяти графическим процессором в тензорах в байтах для данного устройства.
Вы можете либо напрямую передать, device
как указано выше в сообщении, либо оставить « Нет», и он будет использовать current_device()
.
## neural network in pytorch
, затем я добавлю ваш код в конце. Это все еще показывает Использование устройства: CUDA; и 0Gb для выделенного и кэшированного. Также попытался вставить его в конце цикла for for i in range(epoch):
после обратного распространения, все еще 0GB
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
with--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
полезно
На сайте office и на начальной странице get проверьте 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
теперь знает, если 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
Это все сложно, и если вы поймете это однажды, это поможет вам быстрее справиться с меньшим количеством ошибок.
M()
? Где M
определяется?
Чтобы проверить, доступен ли графический процессор:
torch.cuda.is_available()
Если вышеуказанная функция возвращает False
,
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.
Практически на все ответы здесь ссылки 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
Просто из командной строки или среды 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 . Также обратитесь к этой проблеме pytorch.
Создайте тензор на GPU следующим образом:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
Не выходите, откройте другой терминал и проверьте, использует ли процесс python графический процессор, используя:
$ nvidia-smi
nvidia-smi
с командной строкой
nvidia-smi
.