Я пытаюсь сделать некоторые выводы с помощью моделей 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 с cu11.
Хм, выглядит объединенным... Странно. Я установил последнюю версию Pytorch. Не знаю, почему я до сих пор это вижу. Может быть, мне следует вручную добавить эту строку в init.py?
Исправление не вошло в версию 2.3. Вероятно, именно поэтому вы этого не видите. Ссылка: github.com/pytorch/pytorch/issues/…





Это была ошибка в 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 не сработала.
Более приятное решение — вызвать 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/… . Вы знаете, где это определяется?
Если вы нажмете кнопку «Исходный код» в документации, вы увидите, что функция заключена в lru_cache. Метод Clear_cache() внедряется в декоратор lru_cache. Сама проблема возникает из-за того, что torch.cuda.device_count() кэширует количество видимых графических процессоров, которое позже изменяется при настройке CUDA_VISIBLE_DEVICES вручную с помощью os.environ["CUDA_VISIBLE_DEVICES"] в коде. При очистке кеша функция запускается снова, возвращая правильный ответ.
Просто дополняю принятый ответ. Кажется, это не полностью исправлено, хотя предложение уже объединено в 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
Это известная ошибка в PyTorch, исправленная в последней версии.