背景
需求:实验室内通过Docker搭建隔离环境保证各用户数据安全和服务器环境安全,防止软件环境混杂造成莫名其妙的bug,容器内需要能够调用显卡资源。
预先准备
本文的内容基于以下软件版本:
Docker:Docker version 20.10.17, build 100c701
CUDA:NVIDIA-SMI 510.68.02 Driver Version: 510.68.02 CUDA Version: 11.6
系统:Ubuntu 20.04.4 LTS
Nvidia-container-toolkit架构
Nvidia官网架构概述,可以用Chrome自带网页翻译仔细阅读,本文仅简单介绍。
架构
The NVIDIA container stack is architected so that it can be targeted to support any container runtime in the ecosystem.
The components of the stack include:
The nvidia-docker wrapper
The NVIDIA Container Runtime (nvidia-container-runtime)
The NVIDIA Container Runtime Hook (nvidia-container-toolkit / nvidia-container-runtime-hook)
The NVIDIA Container Library and CLI (libnvidia-container1, nvidia-container-cli)
...
Note that as of version 3.6.0, the nvidia-container-runtime package is a meta package that
only depends on the nvidia-container-toolkit package and does not provide any functionality of itself.
NVIDIA container主要组件包括nvidia-container-runtime
, nvidia-container-toolkit
, libnvidia-container
和CUDA
驱动;
在3.6.0版本后,runtime包成为一个只依赖于toolkit包(指container-toolkit而不是nvidia CUDA toolkit)的包,在官网中也指出,对于一般的应用而言,nvidia-container-toolkit
能够满足绝大多数需求。
架构结构如图所示。
依赖关系
本文使用的Docker版本较高,已经不需要再独立安装nvidia-docker,只需要配置好上述环境即可。
本文需要配置的软件包为:
nvidia-container-toolkit
libnvidia-container-tools
libnvidia-container1
不需要安装nvidia-container-runtime
!
依赖如下,摘自官网。
├─ nvidia-container-toolkit (version)
│ └─ libnvidia-container-tools (>= version)
│
├─ libnvidia-container-tools (version)
│ └─ libnvidia-container1 (>= version)
└─ libnvidia-container1 (version)
离线安装
安装顺序
按照上文依赖关系,安装顺序为
libnvidia-container1 -> libnvidia-container-tools -> nvidia-container-toolkit
软件下载
本文与网上大部分方法不同,基于离线方式安装。
官网提供GitHub链接:
旧版的nvidia-container-toolkit
(不需要,如有需要安装旧版本可以看该链接)
https://github.com/NVIDIA/nvidia-container-runtime/tree/gh-pages/`
libnvidia-container1
,本文环境下只安装这个即可
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/
根据镜像的系统版本查找:Ubuntu 20.04
点进去是一个符号链接,链接到仓库的stable/ubuntu20.04
,再点stable/ubuntu20.04
又是一个链接到stable/ubuntu18.04
的符号链接,根据架构选择amd64(x86_64同)。
分别下载:
libnvidia-container1_1.9.0-1_amd64.deb # Add packages for NVIDIA Container Toolkit v1.9.0 release
libnvidia-container-tools_1.9.0-1_amd64.deb # Add packages for NVIDIA Container Toolkit v1.9.0 release
nvidia-container-toolkit_1.9.0-1_amd64.deb # Add packages for NVIDIA Container Toolkit v1.9.0 release
下载完后上传到服务器。
安装
-
cd
到目录下,使用dpkg
安装:$ sudo dpkg -i ./libnvidia-container1_1.9.0-1_amd64.deb
$ sudo dpkg -i ./libnvidia-container-tools_1.9.0-1_amd64.deb
$ sudo dpkg -i ./nvidia-container-toolkit_1.9.0-1_amd64.deb
-
可能存在报错:
/sbin/ldconfig.real: /usr/local/cuda-11.6/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 is not a symbolic link
等几条信息。
解决方式:
创建符号链接使xxx.so.8
指向xxx.so
,注意需要写绝对路径$ ln -sf /usr/local/cuda-11.6/targets/x86_64-linux/lib/libcudnn_cnn_infer.so /usr/local/cuda-11.6/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8
,前一个参数指实际存储的目标文件,后一个参数是so.8
文件。
测试
-
运行容器:
$ docker run -it -v /home/your_user_name/docker_workdir/:/home/in_docker_user/ --gpus all -p 21203:22 docker_repo/ubuntu:lab_base_env
其中-p 21203:22
指定了宿主机21203端口映射到容器的22端口,可以通过ssh in_docker_user@xxx.xxx.xxx.xxx -p 21203
实现外部远程访问容器。文章来源:https://www.toymoban.com/news/detail-797120.html -
运行
nvidia-smi
,正常显示显卡信息文章来源地址https://www.toymoban.com/news/detail-797120.html
Tue Oct 25 11:34:21 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.68.02 Driver Version: 510.68.02 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| 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 NVIDIA GeForce ... Off | 00000000:73:00.0 Off | N/A |
| 32% 42C P0 104W / 350W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA GeForce ... Off | 00000000:D5:00.0 Off | N/A |
| 34% 60C P0 120W / 350W | 0MiB / 24576MiB | 3% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
到了这里,关于Docker离线安装Nvidia-container-toolkit实现容器内GPU调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!