一、背景
在 CentOS 7.9 服务器上使用 Docker 运行 NVIDIA GPU 容器时,除了安装 NVIDIA 显卡驱动,还需要安装 NVIDIA Container Toolkit。
在实际生产环境中,服务器经常无法直接访问互联网,因此比较常见的部署方式是:
联网 CentOS 7.9 │ ├── 配置 CentOS Yum 源 ├── 配置 NVIDIA Container Toolkit 源 ├── 下载 RPM 及依赖 │ ▼ 打包 RPM 离线安装包 │ ▼ 离线 CentOS 7.9 │ ├── 安装 RPM ├── 配置 Docker NVIDIA Runtime └── 验证 GPU 容器本文整理两套方案:
方案一:NVIDIA Container Toolkit 1.14.0 方案二:NVIDIA Container Toolkit 1.20.1如果需要兼容已有老环境,可以选择 1.14.0。
如果是新部署环境,可以优先测试 1.20.1。
注意:CentOS 7 已经停止维护,新版本 NVIDIA Container Toolkit 也不再将 CentOS 7 作为当前官方重点测试平台。因此生产部署前建议先使用同版本 CentOS 7.9 测试机验证。
二、环境说明
本文测试环境:
操作系统:CentOS Linux 7.9.2009 架构:x86_64 容器运行时:Docker 安装方式:RPM 离线安装查看系统:
cat/etc/centos-releaseuname-m预期:
CentOS Linux release 7.9.2009 (Core) x86_64三、解决 CentOS 7 Yum 源失效
CentOS 7 已经 EOL,继续使用旧的:
mirrorlist.centos.org可能出现:
Could not retrieve mirrorlist Cannot find a valid baseurl for repo: base/7/x86_64因此先切换到 CentOS 7.9.2009 Vault 镜像源。
3.1 备份原 Yum 配置
mkdir-p/etc/yum.repos.d/backupmv/etc/yum.repos.d/CentOS-*.repo\/etc/yum.repos.d/backup/2>/dev/null3.2 配置阿里云 CentOS Vault
cat>/etc/yum.repos.d/CentOS-Base.repo<<'EOF' [base] name=CentOS-7.9.2009 - Base - Aliyun baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/ gpgcheck=0 enabled=1 [updates] name=CentOS-7.9.2009 - Updates - Aliyun baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/ gpgcheck=0 enabled=1 [extras] name=CentOS-7.9.2009 - Extras - Aliyun baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/ gpgcheck=0 enabled=1 EOF清理缓存:
yum clean allrm-rf/var/cache/yum yum makecache检查:
yum repolist四、安装 RPM 下载工具
安装:
yuminstall-ycurlwgetyum-utils检查:
whichcurlwhichyumdownloader正常应该能够看到:
/usr/bin/curl /usr/bin/yumdownloader五、配置 NVIDIA Container Toolkit 仓库
下载 NVIDIA 官方 Repository:
curl-s-L\https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo\-o/etc/yum.repos.d/nvidia-container-toolkit.repo检查:
cat/etc/yum.repos.d/nvidia-container-toolkit.repo六、CentOS 7 GPG Repository Metadata 问题
CentOS 7 使用较老的 Yum/GPG 组件,实际配置 NVIDIA 仓库时可能遇到:
Gpg Keys not imported, cannot verify repomd.xml for repo libnvidia-container如果出现该问题,可以关闭 Repository Metadata 的 GPG 检查:
sed-i's/^repo_gpgcheck=1/repo_gpgcheck=0/g'\/etc/yum.repos.d/nvidia-container-toolkit.repo注意:
repo_gpgcheck=0表示关闭仓库元数据签名检查。
如果配置中:
gpgcheck=1仍然保留,则 RPM 软件包自身的 GPG 校验仍可以继续启用。
重新建立缓存:
yum clean allrm-rf/var/cache/yum yum makecache七、查看 NVIDIA Container Toolkit 可用版本
执行:
yum--showduplicateslist\libnvidia-container1\libnvidia-container-tools\nvidia-container-toolkit\nvidia-container-runtime在本文环境中,可以看到多个版本,例如:
1.14.0 1.14.1 ... 1.17.x 1.18.x 1.19.x 1.20.0 1.20.1因此可以根据生产环境兼容性选择版本。
八、方案一:下载 NVIDIA Container Toolkit 1.14.0
对于需要兼容较老环境的 CentOS 7.9,可以选择:
libnvidia-container1 1.14.0-1 libnvidia-container-tools 1.14.0-1 nvidia-container-toolkit 1.14.0-1 nvidia-container-runtime 3.14.0-18.1 创建下载目录
mkdir-p/root/nvidia-container-1.14.0cd/root/nvidia-container-1.14.08.2 下载 RPM 及依赖
yumdownloader--resolve\libnvidia-container1-1.14.0-1\libnvidia-container-tools-1.14.0-1\nvidia-container-toolkit-1.14.0-1\nvidia-container-runtime-3.14.0-1检查:
ls-lh查看 RPM 信息:
rpm-qp--queryformat\'%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n'*.rpm九、方案二:下载 NVIDIA Container Toolkit 1.20.1
对于新部署环境,可以测试较新的:
NVIDIA Container Toolkit 1.20.1主要软件包:
libnvidia-container1 libnvidia-container-tools nvidia-container-toolkit-base nvidia-container-toolkit9.1 创建目录
mkdir-p/root/nvidia-container-1.20.1cd/root/nvidia-container-1.20.19.2 下载 RPM
执行:
yumdownloader--resolve\libnvidia-container1-1.20.1-1\libnvidia-container-tools-1.20.1-1\nvidia-container-toolkit-base-1.20.1-1\nvidia-container-toolkit-1.20.1-1检查:
ls-lh查看具体版本:
rpm-qp--queryformat\'%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n'*.rpm正常核心软件包应该类似:
libnvidia-container1 1.20.1-1 x86_64 libnvidia-container-tools 1.20.1-1 x86_64 nvidia-container-toolkit-base 1.20.1-1 x86_64 nvidia-container-toolkit 1.20.1-1 x86_64新版 Toolkit 不建议再按照旧教程额外混装老版本:
nvidia-container-runtime-3.14.0应尽量保证整套 NVIDIA Container Toolkit 软件包来自同一版本系列。
十、两个版本怎么选择
简单来说:
| 场景 | 建议 |
|---|---|
| 已有 CentOS 7 老环境 | 1.14.0 |
| 需要复刻已有生产环境 | 使用与原环境一致的版本 |
| 新部署 CentOS 7.9 | 优先测试 1.20.1 |
| 对稳定性要求高 | 先在测试机验证后再部署 |
| 新操作系统 | 优先使用较新的 Toolkit |
对于 CentOS 7.9,我个人更建议:
老生产环境 ↓ 保持原版本,不为了“最新”强行升级 新部署环境 ↓ 先测试 1.20.1 ↓ Docker GPU 测试全部正常 ↓ 再制作离线包投入生产十一、制作离线安装包
11.1 1.14.0
cd/roottar-czvfnvidia-container-1.14.0-centos7.tar.gz\nvidia-container-1.14.0/11.2 1.20.1
cd/roottar-czvfnvidia-container-1.20.1-centos7.tar.gz\nvidia-container-1.20.1/最后得到:
nvidia-container-1.14.0-centos7.tar.gz nvidia-container-1.20.1-centos7.tar.gz把对应文件复制到离线 CentOS 7.9 服务器即可。
十二、离线安装 1.14.0
解压:
tar-xzvfnvidia-container-1.14.0-centos7.tar.gzcdnvidia-container-1.14.0安装:
yum localinstall-y./*.rpm检查:
rpm-qa|grep-E\'nvidia-container|libnvidia-container'十三、离线安装 1.20.1
解压:
tar-xzvfnvidia-container-1.20.1-centos7.tar.gzcdnvidia-container-1.20.1安装:
yum localinstall-y./*.rpm检查:
rpm-qa|grep-E\'nvidia-container|libnvidia-container'十四、检查 NVIDIA 驱动
Container Toolkit 并不能代替 NVIDIA GPU 驱动。
首先执行:
nvidia-smi必须保证宿主机 NVIDIA 驱动本身工作正常。
如果:
nvidia-smi都不能正常识别 GPU,那么应该先解决宿主机 NVIDIA Driver 问题,而不是继续排查 Docker。
十五、验证 NVIDIA Container Toolkit
检查:
nvidia-container-cli--version新版还可以:
nvidia-ctk--version检查 runtime:
whichnvidia-container-runtime以及:
nvidia-container-runtime--version十六、配置 Docker 使用 NVIDIA Runtime
如果安装的是支持nvidia-ctk的版本,可以执行:
nvidia-ctk runtime configure--runtime=docker然后:
systemctl restartdocker检查:
dockerinfo|grep-iruntime正常情况下应该能够看到:
nvidia十七、手工配置 Docker Runtime
如果老版本环境无法使用nvidia-ctk runtime configure,也可以手工配置。
创建:
mkdir-p/etc/docker编辑:
vi/etc/docker/daemon.json例如:
{"runtimes":{"nvidia":{"path":"nvidia-container-runtime","runtimeArgs":[]}}}重启:
systemctl daemon-reload systemctl restartdocker检查:
dockerinfo|grep-iruntime十八、测试 Docker GPU
宿主机首先确认:
nvidia-smi然后使用已有的 CUDA 镜像进行测试:
dockerrun--rm\--runtime=nvidia\--gpusall\<CUDA镜像>\nvidia-smi如果服务器已经有业务 CUDA 镜像,也可以直接使用已有镜像测试,避免离线环境重新拉取镜像。
正常情况下,容器中的:
nvidia-smi应该能够识别宿主机 GPU。
十九、常用排查命令
查看安装的软件包:
rpm-qa|grep-E\'nvidia|libnvidia'查看 NVIDIA Runtime:
whichnvidia-container-runtime查看 Toolkit:
nvidia-ctk--version查看 Container CLI:
nvidia-container-cli--version查看 Docker Runtime:
dockerinfo|grep-iruntime查看 Docker:
systemctl statusdocker查看日志:
journalctl-udocker-n100--no-pager检查 GPU:
nvidia-smi二十、常见问题
1. Cannot find a valid baseurl
错误:
Cannot find a valid baseurl for repo: base/7/x86_64原因通常是 CentOS 7 已 EOL,旧 mirrorlist 不再正常工作。
解决方法:
切换到 CentOS 7.9.2009 Vault 源2. NVIDIA 仓库 GPG 校验失败
例如:
Gpg Keys not imported, cannot verify repomd.xml可以检查:
grep-E\'gpgcheck|repo_gpgcheck|gpgkey'\/etc/yum.repos.d/nvidia-container-toolkit.repoCentOS 7 老环境如果 repository metadata 校验存在兼容问题,可以关闭:
repo_gpgcheck=0然后:
yum clean allrm-rf/var/cache/yum yum makecache3. nvidia-container-runtime 找不到
检查:
whichnvidia-container-runtimerpm-qa|grepnvidia-container再检查软件包提供了哪些文件:
rpm-qlnvidia-container-toolkit|\grepruntime4. Docker 看不到 GPU
按照以下顺序排查:
宿主机 nvidia-smi ↓ NVIDIA Driver ↓ libnvidia-container ↓ NVIDIA Container Toolkit ↓ nvidia-container-runtime ↓ Docker Runtime ↓ GPU Container不要一开始就排查 Docker。
如果宿主机:
nvidia-smi失败,那么 Docker GPU 基本也无法正常工作。
二十一、总结
CentOS 7.9 已经属于生命周期结束的操作系统,因此搭建 NVIDIA GPU 容器环境时,需要特别注意 Yum 源和新版软件包兼容性。
本文整理了两种离线安装方案:
方案一 NVIDIA Container Toolkit 1.14.0 + nvidia-container-runtime 3.14.0 适合: 已有老环境、兼容性优先、需要保持版本一致以及:
方案二 NVIDIA Container Toolkit 1.20.1 适合: 新部署环境,希望使用较新的 NVIDIA Container Toolkit实际生产环境建议遵循:
先在联网 CentOS 7.9 测试机下载 ↓ 完成实际安装 ↓ 验证 nvidia-smi ↓ 验证 nvidia-container-cli ↓ 验证 Docker Runtime ↓ 验证 Docker GPU ↓ 打包 RPM ↓ 部署到离线生产服务器对于已经稳定运行的老生产环境,没有必要单纯为了追求最新版本而升级 NVIDIA Container Toolkit。
对于新部署的 CentOS 7.9 环境,可以优先测试 1.20.1;如果出现 CentOS 7 兼容性问题,再考虑使用经过验证的较老版本。