Docker容器:
Docker容器将一个软件包在一个完整的文件系统中,该文件系统包含运行所需要的一切:代码,运行时,系统工具,系统库等任何可以安装在服务器上的东西。这保证了软件无论其环境如何,都将始终运行相同的程序。
Nvidia-Docker设计初衷:
Docker容器与平台无关,但也与硬件无关。当使用特殊的硬件,如NVIDIA GPUs
时,这就产生了一个问题,这些硬件需要的内核模块和用户级库来操作。因此,Docker本机不支持容器中的NVIDIA GPUs
。
nvidia-docker
本质上是围绕docker
命令的包装器,它透明地为容器提供了在GPU上执行代码所需的组件。只有在使用nvidia-docker run
来执行使用GPUs的容器时才是绝对必要的。nvidia-docker
实现了对docker client
的封装,并在容器启动时,将必要的GPU device和libraries挂载到容器中。
参考文档:nvidia-docker工具介绍
Nvidia-Docker1.0和Nvidia-Docker2.0的区别
Nvidia-docker1.0存在的问题:
- 设计高度与docker耦合,不支持其它的容器运行时。如: LXC, CRI-O及未来可能会增加的容器运行时。
- 不能更好的利用docker生态的其它工具。如: docker compose。
- 不能将GPU作为调度系统的一种资源来进行灵活的调度。
- 完善容器运行时对GPU的支持。如: 自动的获取用户层面的NVIDIA Driver libraries, NVIDIA kernel modules, device ordering等。
Nvidia-docker2.0的实现机制:
其核心组建包括:nvidia-docker 2.0
、containerd
、nvidia-container-runtime
、libnvidia-container
以及runc
直接的关系。
- nvidia-docker2.0
它是一个简单的包,主要通过修改docker的配置文件/etc/docker/daemon.json
来让docker使用NVIDIA Container runtime
。 - nvidia-container-runtime
真正的核心部分,它在原有的docker
容器运行时runc
的基础上增加一个prestart hook
,用于调用libnvidia-container
库。 - libnvidia-container
提供一个库和一个简单的CLI工具,使用这个库可以使NVIDIA GPU被Linux容器使用。 - Containerd
主要负责的工作是:
- 管理容器的生命周期(从容器的创建到销毁)
- 拉取/推送容器镜像
- 存储管理(管理镜像及容器数据的存储)
- 调用runc 运行容器
- 管理容器的网络接口及网络
- RunC
一个轻量级的工具,用来运行容器。
参考文档:nvidia-docker2.0介绍
问题描述
环境:Ubuntu 18.04.1
启动容器:
docker start containerID
抛出错误:
Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
Error: failed to start containers: 94b85ba86c95
出现该错误的原因在于没有安装nvidia-docker
解决方案:
- 更新apt库,加载
nvidia-docker2
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu18.04/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
- 安装
nvidia-docker2
软件包并重新加载docker守护程序配置
$ sudo apt-get install nvidia-docker2
$ sudo pkill -SIGHUP dockerd
$ sudo systemctl restart docker
参考文档:安装nvidia-docker2.0