解决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
相关推荐
纪伊路上盛名在34 分钟前
NVML ERROR_ RM has detected an NVML_RM version mismatch
linux·数据库·gpu·驱动
码上上班16 小时前
docker课程
java·docker·容器
取谖慕12.19 小时前
Docker容器从入门到精通
docker·容器·eureka
取谖慕12.20 小时前
Harbor仓库从讲解到部署实战
docker·harbor
逍遥德1 天前
运维技术栈Linux+docker+Kubernetes+Jenkins/GitLab CI 知识点详细列表
linux·运维·docker
名字还没想好☜1 天前
Kubernetes CrashLoopBackOff 排查全流程:从 describe 到日志到 exit code
运维·docker·云原生·容器·kubernetes
冰封之寂1 天前
Docker 部署与基础命令详解:从安装到容器管理全流程指南
linux·运维·docker·容器
Baron X1 天前
Gitea Docker 部署教程
docker·gitea
sulikey1 天前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器
窝子面1 天前
认识Docker与启动容器与镜像的关系
运维·docker·容器