解决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 小时前
项目实战:k8s部署考试系统
云原生·容器·kubernetes
wusam3 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)
学习·docker·centos
wusam5 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
运维·服务器·网络·docker·容器
一直在进步的派大星6 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器
Zl1597531597539 小时前
k8s基础环境部署
云原生·容器·kubernetes
陌殇殇殇11 小时前
使用GitLab CI构建持续集成案例
运维·ci/cd·云原生·容器·kubernetes·gitlab
技术钱11 小时前
docker简介
运维·docker·容器
roman_日积跬步-终至千里11 小时前
【docker】docker常见命令
运维·docker·容器
tangdou36909865516 小时前
Docker系列-超级详细教你Linux安装并使用docker compose,如何使用docker-compose安装sqlserver
docker·容器·sql server
tangdou36909865516 小时前
手把手非常详细图文并茂教你 Docker 部署 SQL Server
docker·容器·sql server