Ubuntu 22.04下Docker容器无法访问GPU的技术求助
ROS2 Humble容器无法访问GPU排查方案
核心问题确认
主机环境(Ubuntu22.04 + NVIDIA 570驱动 + CUDA12.4)GPU功能正常,docker run --gpus all启动的测试容器可正常访问GPU,但自定义ROS2 Humble容器虽能显示nvidia-smi和CUDA12.4信息,GPU却无法被ROS2节点调用。以下是针对性排查与解决步骤:
1. 验证容器是否使用NVIDIA运行时
即使/etc/docker/daemon.json设置了默认nvidia运行时,Docker Compose仍可能未正确继承:
- 执行命令检查容器运行时:
docker inspect <你的ROS2容器ID> | grep -A 2 "Runtime" - 若输出为
"Runtime": "runc"而非"nvidia",需在docker-compose.yml对应service中显式指定:services: your_ros2_service: runtime: nvidia # 强制指定nvidia运行时 # 其他配置项...
2. 检查容器内GPU相关环境变量
nvidia-smi能运行不代表ROS2进程可识别GPU,需确认关键环境变量:
- 进入容器执行:
echo $CUDA_VISIBLE_DEVICES echo $LD_LIBRARY_PATH - 正常状态下,
CUDA_VISIBLE_DEVICES应为0或all;LD_LIBRARY_PATH需包含/usr/local/nvidia/lib64和/usr/lib/x86_64-linux-gnu/nvidia。 - 若变量缺失,可在
docker-compose.yml中添加:environment: - CUDA_VISIBLE_DEVICES=all - LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/lib/x86_64-linux-gnu/nvidia:$LD_LIBRARY_PATH
3. 验证GPU设备文件权限
ROS2进程可能因权限不足无法访问/dev/nvidia*设备:
- 容器内执行:
ls -l /dev/nvidia* - 若文件权限为
root:root且ROS2以非root用户运行,可尝试:- 在Dockerfile中将用户加入
video组:RUN usermod -aG video <你的容器用户名> - 或在
docker-compose.yml中添加设备映射:devices: - /dev/nvidia0:/dev/nvidia0 - /dev/nvidiactl:/dev/nvidiactl - /dev/nvidia-uvm:/dev/nvidia-uvm
- 在Dockerfile中将用户加入
4. 排查Dockerfile构建冲突
Dockerfile中的操作可能覆盖NVIDIA库路径或安装冲突依赖:
- 检查是否有修改
LD_LIBRARY_PATH的语句,确保未覆盖NVIDIA运行时挂载的路径。 - 避免安装与CUDA冲突的系统级GPU包(如
nvidia-cuda-toolkit),应依赖NVIDIA运行时挂载的CUDA环境。 - 确保基础镜像支持NVIDIA运行时(推荐使用
nvidia/cuda:12.4.0-runtime-ubuntu22.04作为基础,再安装ROS2 Humble)。
5. 验证GPU硬件可访问性(排除ROS2节点问题)
先确认容器内GPU本身可被CUDA程序调用,再排查ROS2节点:
- 在容器内安装CUDA示例并运行
deviceQuery:apt-get update && apt-get install -y cuda-samples-12-4 cd /usr/local/cuda-12.4/samples/1_Utilities/deviceQuery make && ./deviceQuery - 若输出显示
Result = PASS,说明GPU硬件访问正常,问题出在ROS2节点配置(如节点未启用GPU加速、未指定GPU设备)。
6. Docker Compose GPU配置细节检查
确保docker-compose.yml的GPU资源配置正确:
services: your_ros2_service: # 其他配置项... deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu]
注意:deploy配置需Docker Compose v2+或Swarm模式支持,旧版Compose需改用runtime: nvidia配置。
内容的提问来源于stack exchange,提问作者prarthana sigedar
相关产品推荐
相关产品推荐

