解决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
相关推荐
莫比乌斯之梦3 小时前
使用 Docker 运行 Jenkins:快速搭建高效 CI/CD 环境指南
ci/cd·docker·jenkins
程序设计实验室4 小时前
从挖矿木马入侵到 Docker Rootless 加固,我的服务器安全复盘
linux·docker
only_Klein5 小时前
Kubernetes发布策略之蓝绿发布与金丝雀发布
云原生·容器·kubernetes
爱吃糖的小秦同学7 小时前
腾讯微云容量校准
容器
yunteng52110 小时前
Sealos部署k8s集群
云原生·容器·kubernetes·sealos
学到头秃的suhian12 小时前
Docker基础扫盲
运维·docker·容器
袁袁袁袁满13 小时前
Docker后台日志和容器日志怎么查看?
linux·运维·服务器·docker·容器
学到头秃的suhian14 小时前
Docker相关命令
docker·容器
技术栈壳15 小时前
了解K8s
云原生·容器·kubernetes
请为小H留灯15 小时前
Docker 命令速通指南:从入门到封神的 100 + 必学指令,一篇搞定容器全操作
运维·docker·容器