YOLOv8推理触发PyTorch CUDA设备断言错误的排查与解决
YOLOv8推理时PyTorch CUDA内部断言错误的原因与修复方案
问题详情
执行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=
单独测试PyTorch CUDA可用性显示正常:
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()))
原因分析
错误信息里device=和num_gpus=为空,说明问题出在Ultralytics框架的设备参数处理环节,而非PyTorch本身的CUDA支持:
- 堆栈显示,错误触发于Ultralytics的
select_device函数调用torch.cuda.get_device_properties(i)时,此时PyTorch延迟初始化队列中的_check_capability调用失败,因为设备索引参数为空。 - 多GPU环境下,Ultralytics的设备解析逻辑可能出现异常,导致设备索引未正确传递;或者PyTorch的延迟初始化机制在框架加载阶段出现冲突。
修复步骤
1. 修改设备参数格式
用完整的CUDA设备标识替代数字索引,比如:
yolo detect predict source=input.jpg model=yolov8n.pt device=cuda:0
或者直接让框架自动选择可用GPU:
yolo detect predict source=input.jpg model=yolov8n.pt device=cuda
2. 提前初始化CUDA上下文
创建一个初始化脚本init_cuda.py:
import torch torch.cuda.init() print(f"CUDA已初始化,设备数量: {torch.cuda.device_count()}")
先执行脚本初始化CUDA:
python init_cuda.py
再运行YOLO推理命令。
3. 检查环境变量
查看是否有干扰CUDA设备检测的环境变量:
echo $CUDA_VISIBLE_DEVICES
如果输出为空,可设置为你的GPU索引(比如3个GPU设为0,1,2):
export CUDA_VISIBLE_DEVICES=0,1,2
或者取消该变量:
unset CUDA_VISIBLE_DEVICES
4. 更新Ultralytics版本
旧版本可能存在设备解析bug,执行升级:
pip install --upgrade ultralytics
5. 测试CPU推理(排除GPU问题)
如果以上方法无效,先测试CPU推理是否正常,确认问题出在GPU设备处理:
yolo detect predict source=input.jpg model=yolov8n.pt device=cpu
内容的提问来源于stack exchange,提问作者Mary H
相关产品推荐
相关产品推荐

