PyTorch RuntimeError: устройство >= 0 && устройство < num_gpus ВНУТРЕННЕЕ Утверждение не выполнено

Я пытаюсь сделать некоторые выводы с помощью моделей YOLOv8, просто используя следующую команду:

yolo detect predict source=input.jpg model=yolov8n.pt device=0

Но я получаю эту ошибку, связанную с PyTorch (моя версия Pytorch, как показано ниже, 2.3.0+cu118):

RuntimeError: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at "../aten/src/ATen/cuda/CUDAContext.cpp":50, please report a bug to PyTorch. device=, num_gpus=

Я много искал, нашел файл CUDAContext.cpp, исправил его и т. д., но не смог найти решения.

В чем проблема? Как это исправить?

Результаты использования PyTorch и доступности графического процессора, как показано ниже, выглядят хорошо:

Python 3.9.7 | packaged by conda-forge | (default, Sep  2 2021, 17:58:34) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.zeros(2).cuda(0)
tensor([0., 0.], device='cuda:0')
>>> print(torch.__version__)
2.3.0+cu118
>>> print(f"Is CUDA available?: {torch.cuda.is_available()}")
Is CUDA available?: True
>>> print(f"Number of CUDA devices: {torch.cuda.device_count()}")
Number of CUDA devices: 3
>>> device = torch.device('cuda')
>>> print(f"A torch tensor: {torch.rand(5).to(device)}")
A torch tensor: tensor([0.6085, 0.7618, 0.6855, 0.5276, 0.1606], device='cuda:0')

Полная трассировка стека:

Traceback (most recent call last):
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 306, in _lazy_init
    queued_call()
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 174, in _check_capability
    capability = get_device_capability(d)
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 430, in get_device_capability
    prop = get_device_properties(device)
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 448, in get_device_properties
    return _get_device_properties(device)  # type: ignore[name-defined]
RuntimeError: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at "../aten/src/ATen/cuda/CUDAContext.cpp":50, please report a bug to PyTorch. device=, num_gpus=

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/conda/bin/yolo", line 8, in <module>
    sys.exit(entrypoint())
  File "/home/conda/lib/python3.9/site-packages/ultralytics/cfg/__init__.py", line 583, in entrypoint
    getattr(model, mode)(**overrides)  # default args from model
  File "/home/conda/lib/python3.9/site-packages/ultralytics/engine/model.py", line 528, in val
    validator(model=self.model)
  File "/home/conda/lib/python3.9/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context
    return func(*args, **kwargs)
  File "/home/conda/lib/python3.9/site-packages/ultralytics/engine/validator.py", line 126, in __call__
    device=select_device(self.args.device, self.args.batch),
  File "/home/conda/lib/python3.9/site-packages/ultralytics/utils/torch_utils.py", line 156, in select_device
    p = torch.cuda.get_device_properties(i)
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 444, in get_device_properties
    _lazy_init()  # will define _get_device_properties
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 312, in _lazy_init
    raise DeferredCudaCallError(msg) from e
torch.cuda.DeferredCudaCallError: CUDA call failed lazily at initialization with error: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at "../aten/src/ATen/cuda/CUDAContext.cpp":50, please report a bug to PyTorch. device=, num_gpus=

CUDA call was originally invoked at:

  File "/home/conda/bin/yolo", line 5, in <module>
    from ultralytics.cfg import entrypoint
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/conda/lib/python3.9/site-packages/ultralytics/__init__.py", line 5, in <module>
    from ultralytics.data.explorer.explorer import Explorer
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/conda/lib/python3.9/site-packages/ultralytics/data/__init__.py", line 3, in <module>
    from .base import BaseDataset
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/conda/lib/python3.9/site-packages/ultralytics/data/base.py", line 15, in <module>
    from torch.utils.data import Dataset
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/conda/lib/python3.9/site-packages/torch/__init__.py", line 1478, in <module>
    _C._initExtension(manager_path())
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 238, in <module>
    _lazy_call(_check_capability)
  File "/home/conda/lib/python3.9/site-packages/torch/cuda/__init__.py", line 235, in _lazy_call
    _queued_calls.append((callable, traceback.format_stack()))

Это известная ошибка в PyTorch, исправленная в последней версии.

talonmies 16.05.2024 02:04

Но у меня уже есть последняя версия PyTorch с cu11.

Mary H 16.05.2024 02:45
github.com/pytorch/pytorch/pull/122815
talonmies 16.05.2024 14:27

Хм, выглядит объединенным... Странно. Я установил последнюю версию Pytorch. Не знаю, почему я до сих пор это вижу. Может быть, мне следует вручную добавить эту строку в init.py?

Mary H 16.05.2024 15:50

Исправление не вошло в версию 2.3. Вероятно, именно поэтому вы этого не видите. Ссылка: github.com/pytorch/pytorch/issues/…

K. Bogdan 05.07.2024 16:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
1 284
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это была ошибка в PyTorch. Чтобы решить, найдите и перейдите к python3.xx\site-packages\torch\cuda\__init__.py и измените эту функцию:

Удалите или закомментируйте эту старую функцию:

'''
@lru_cache(maxsize=1)
def device_count() -> int:
    r"""Return the number of GPUs available."""
    if not _is_compiled():
    return 0
    # bypass _device_count_nvml() if rocm (not supported)
    nvml_count = -1 if torch.version.hip else _device_count_nvml()
    return torch._C._cuda_getDeviceCount() if nvml_count < 0 else nvml_count
'''

И замените его этим новым кодом:

_cached_device_count: Optional[int] = None

def device_count() -> int:
    r"""Return the number of GPUs available."""
    global _cached_device_count
    if not _is_compiled():
        return 0
    if _cached_device_count is not None:
        return _cached_device_count
    # Check if using ROCm (HIP)
    if torch.version.hip:
        nvml_count = -1  # Assuming ROCm is not supported, set nvml_count to -1
    else:
        nvml_count = _device_count_nvml()  # Use NVML for NVIDIA GPUs
    r = torch._C._cuda_getDeviceCount() if nvml_count < 0 else nvml_count

    # NB: Do not cache the device count prior to CUDA initialization, because
    # the number of devices can change due to changes to CUDA_VISIBLE_DEVICES
    # setting prior to CUDA initialization.
    if _cached_device_count is None and _initialized:
        _cached_device_count = r
    return r

Этот ответ сработал для меня, когда установка CUDA_VISIBLE_DEVICES не сработала.

AndW 19.07.2024 18:29

Более приятное решение — вызвать torch.cuda.device_count.cache_clear() после ручной установки CUDA_VISIBLE_DEVICES.

Обновлено: под «настройкой CUDA_VISIBLE_DEVICES вручную» я подразумеваю вызов os.environ["CUDA_VISIBLE_DEVICES"] = ...

Кажется, это работает до и после установки CUDA_VISIBLE_DEVICES с помощью os. Но я не нашел никакой документации по этой функции, только pytorch.org/docs/stable/generated/… . Вы знаете, где это определяется?

K. Bogdan 06.07.2024 00:47

Если вы нажмете кнопку «Исходный код» в документации, вы увидите, что функция заключена в lru_cache. Метод Clear_cache() внедряется в декоратор lru_cache. Сама проблема возникает из-за того, что torch.cuda.device_count() кэширует количество видимых графических процессоров, которое позже изменяется при настройке CUDA_VISIBLE_DEVICES вручную с помощью os.environ["CUDA_VISIBLE_DEVICES"] в коде. При очистке кеша функция запускается снова, возвращая правильный ответ.

xdever 07.07.2024 01:58

Просто дополняю принятый ответ. Кажется, это не полностью исправлено, хотя предложение уже объединено в pytorch (не в v2.3.1). Я не уверен насчет всех сценариев, но другие сценарии описаны в выпусках #10730 и #126344. У меня была аналогичная ошибка, но с использованием докера и pytorch «2.3.1+cu121», запустив скрипт, который настраивает графический процессор внутри, как показано ниже:

docker exec -it container_name python test_gpu.py --gpu_id = "1"

У меня такая ситуация, что я не могу изменить файл python3.xx\site-packages\torch\cuda\__init__.py. Кроме того, прямая проверка доступности графического процессора была в порядке (графический процессор был найден с помощью pytorch, и я мог добавить к нему тензор, как в примере с вопросом), и nvidia-smi тоже был в порядке со списком всех доступных устройств.

Судя по обсуждению проблемы с Pytorch, это, похоже, связано с кэшированием устройства. Одним из возможных решений является установка переменной CUDA_VISIBLE_DEVICES перед импортом torch, как предложено в https://github.com/pytorch/pytorch/issues/126344#issuecomment-2118159363:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
os.environ["WORLD_SIZE"] = "1"
import torch

Но если вы также не можете контролировать порядок импорта (например, с помощью внешних пакетов), вы можете попробовать установить CUDA_VISIBLE_DEVICES при вызове сценария или команды, как показано ниже:

CUDA_VISIBLE_DEVICES=1 python test_gpu.py --gpu_id = "1"

или с докером:

docker exec -it -e CUDA_VISIBLE_DEVICES=1 container_name python test_gpu.py --gpu_id = "1"

Я попробовал все три решения выше, ни одно из них мне не помогло, но, к счастью, я нашел одно в csdn, как указано в ссылке , просто экспортируйте две переменные перед реальным запуском Python. оно работает. Нравиться


export CUDA_VISIBLE_DEVICES=1,2
export CUDA_DEVICE_ORDER=PCI_BUS_ID
nohup python data_train.py > log/log.txt 2>&1 

Другие вопросы по теме