解决Docker容器使用GPU时的异常:could not select device driver ““ with capabilities: [[gpu]]

异常场景

执行如下命令,启动一个容器,同时在运行容器的时候调用GPU

bash 复制代码
docker run -d -p 6008:6008 --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest

--gpus all参数说明:运行容器的时候调用本机的GPU

运行容器出现如下异常:

bash 复制代码
Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

原因分析

上述异常问题可以大概推断出:Docker容器无法选择正确的GPU设备驱动程序,可能是由于Docker运行时的配置或GPU设备驱动程序配置不正确所致。
大概在Docker19版本之后,Docker可以直接获得GPU资源的支持, 其支持不需要再单独安装nvidia-docker,它已被集成到Docker中。

1.检查GPU设备驱动程序:

确保已正确安装适用于系统和 GPU 设备的 NVIDIA 驱动程序。可以通过运行以下命令来验证GPU 驱动程序的安装

bash 复制代码
ChatGLM3) root@master:~/work/# nvidia-smi
Tue Feb 27 01:38:39 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.154.05             Driver Version: 535.154.05   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Tesla V100S-PCIE-32GB          Off | 00000000:23:00.0 Off |                    0 |
| N/A   68C    P0              50W / 250W |  12352MiB / 32768MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A    592394      C   .../envs/Langchain-Chatchat/bin/python    12348MiB |

2.更新Docker版本:

使用适合系统的包管理工具(如 apt、yum、brew 等)来更新 Docker 到最新版本。例如,这里使用 apt,可以运行以下命令来更新Docker

bash 复制代码
sudo apt update

sudo apt upgrade docker-ce

sudo systemctl restart docker

3.推测原因

在Docker容器中使用宿主机的GPU资源,需要在执行docker run命令的时候添加 --gpus all参数即可轻松实现容器使用宿主机的GPU资源。
目前系统安装Docker版本是最新且满足当前要求,故应该能使用GPU资源才对,但是出现了上述异常,因此,怀疑是因为nvidia-docker的问题,于是尝试安装NVIDIA容器工具包

解决方法

既然通过--gpus参数调用宿主机GPU失败,那就重新安装一个英伟达的容器工具包

安装和配置NVIDIA Container Toolkit步骤:

复制代码
1.按照NVIDIA 官方文档中提供的指南,安装NVIDIA容器运行时。

2.配置Docker守护程序以使用NVIDIA运行时。可以按照官方文档中的说明来编辑Docker守护程序配置文件,以确保Docker正确识别GPU资源。

具体官方文档参考Installing the NVIDIA Container Toolkit安装说明解决

安装

这里使用Ubuntu系统,因此选择其中使用 Apt 安装方式,执行如下命令即可安装NVIDIA Container Toolkit

1.配置生产存储库:

NVIDIA容器工具包不能直接通过apt install命令安装,因此需要先执行如下命令添加英伟达的apt软件源

bash 复制代码
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
bash 复制代码
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

2.从存储库更新包列表:

bash 复制代码
sudo apt-get update

3.安装 NVIDIA Container Toolkit 软件包:

确保英伟达软件源添加成功后,执行如下命令直接通过apt命令安装nvidia-container-toolkit

bash 复制代码
sudo apt-get install -y nvidia-container-toolkit

配置

先决条件:

复制代码
安装了受支持的容器引擎(Docker、Containerd、CRI-O、Podman)

安装了 NVIDIA Container Toolkit

这里使用Docker,故选择配置Docker方式

1.使用以下命令配置容器运行时nvidia-ctk:

该nvidia-ctk命令修改/etc/docker/daemon.json主机上的文件。该文件已更新,以便 Docker 可以使用 NVIDIA 容器运行时。

bash 复制代码
sudo nvidia-ctk runtime configure --runtime=docker

检查 Docker 配置文件,确保已启用对 GPU 的支持

bash 复制代码
{
    "registry-mirrors": [
        "https://xxxx.mirror.aliyuncs.com"
    ],
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

2.重新启动 Docker 守护进程:

bash 复制代码
sudo systemctl restart docker
相关推荐
皮皮蟹虾饺2 小时前
DNS协议指南:从报文格式到安全加密与 K8s 实战
安全·容器·kubernetes
千寻girling3 小时前
记录第一次学习 Docker
学习·docker·容器
迷糊小面包5 小时前
Docker Hadopp集群版部署搭建及常规问题解疑
运维·docker·容器
烁3476 小时前
Docker
运维·docker·容器
网络中的夜鹰7 小时前
轩辕镜像一键安装Docker和Docker Compose脚本
运维·docker·容器
逻极8 小时前
Windows 平台 Ollama AMD GPU 一键编译指南:基于 ROCm 7.1 的自动化实战
人工智能·windows·stm32·自动化·gpu·amd·ollama
梦想的颜色8 小时前
从零入门:Docker在Ubuntu上的安装、使用与主流镜像仓库实战(Java/Go/MySQL/PostgreSQL/MongoDB/Nginx
java·ubuntu·docker
java知路9 小时前
centos euler离线下载docker镜像
linux·docker·centos
江湖有缘10 小时前
Docker部署HamsterBase Tasks任务管理工具
运维·docker·容器
很楠爱上10 小时前
Docker 从入门到实战:核心概念、微服务编排与环境移植完全指南
docker·微服务·容器