这个错误表明你试图在 Docker 容器中使用 GPU 加速,但 Docker 未能正确选择 GPU 设备驱动程序。要解决这个问题,通常需要以下几个步骤,确保 Docker 能正确访问 GPU 并使用它。
1. 确保安装了 NVIDIA Docker 工具
要让 Docker 容器使用 GPU,需要使用 NVIDIA 提供的 nvidia-docker
工具集。它允许 Docker 与本地的 NVIDIA GPU 设备进行通信。确保你已经按照以下步骤安装了必要的组件:
步骤:
-
首先,确保你的主机系统上已经安装了正确的 NVIDIA 驱动程序,可以通过以下命令检查:
nvidia-smi
如果这个命令能够成功执行并显示 GPU 信息,说明驱动程序已正确安装。
-
安装 Docker 和
nvidia-docker2
(如果还未安装):- 添加存储库:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
- 更新包缓存并安装
nvidia-docker2
:sudo apt update sudo apt install -y nvidia-docker2
- 重启 Docker 服务:
sudo systemctl restart docker
- 添加存储库:
到此为止基本上就能解决问题了!
2. 验证 GPU 支持
通过以下命令验证 Docker 是否可以访问 GPU:
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
- 如果上述命令成功运行,说明 Docker 已经正确配置了 GPU。
- 如果仍然出现错误,请检查是否使用了兼容的 CUDA 容器版本和主机的 CUDA 驱动。
3. 启动容器时指定 GPU
当你启动容器时,需要明确指定使用 GPU。可以通过以下方式启动容器:
docker run --gpus all -it my-image
--gpus all
表示使用所有可用的 GPU。如果你只想使用特定的 GPU,可以指定 GPU 数量或索引号,例如:docker run --gpus '"device=0"' -it my-image
4. 检查 Docker 版本和 NVIDIA Container Toolkit
如果你安装了 nvidia-docker2
但仍然遇到问题,可能是 Docker 版本与 NVIDIA Container Toolkit 不兼容。确保你安装的是 Docker 19.03 及以上版本,因为从该版本开始,Docker 原生支持 GPU 功能,而无需通过 nvidia-docker
作为 runtime。
-
查看 Docker 版本:
docker --version
-
如果 Docker 版本较旧,建议升级到 19.03 或以上版本。
5. 配置 Docker Daemon
如果你希望 Docker 默认使用 NVIDIA runtime,可以通过配置 Docker Daemon 来实现。创建或编辑 /etc/docker/daemon.json
,确保文件中有以下配置:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
然后重启 Docker:
sudo systemctl restart docker
6. 检查 NVIDIA Docker 和 GPU 支持
使用以下命令检查 Docker 是否配置了 GPU 支持:
docker info | grep -i nvidia
如果看到 nvidia
相关信息,表示 Docker 识别到 NVIDIA runtime。
总结
- 确保 NVIDIA 驱动正确安装,并能通过
nvidia-smi
命令确认。 - 安装 NVIDIA Container Toolkit (
nvidia-docker2
)。 - 使用
--gpus all
参数 启动 Docker 容器以启用 GPU。 - 确保 Docker 版本在 19.03 或更高版本。
通过这些步骤,应该可以解决 could not select device driver "" with capabilities: [[gpu]]
错误,并让 Docker 容器正确访问 GPU。