前文所述,Docker是一个轻量级的容器,将应用程序,第三方库,数据文件和环境放在一起使用户可以最大程度使用宿主机的硬件。Docker容器是平台无关[platform-agnostic]和硬件无关[hardware-agnostic],这说明Docker对于一些通用的硬件已经有很好的支持,但是当使用特殊的硬件,如NVIDIA GPUs时,这就产生了一个问题,这些硬件需要内核模块和用户级库来操作,也就是我们常说的驱动程序。

解决这个问题的早期解决方案之一是在在Docker容器中完全安装NVIDIA GPU驱动程序,并在启动时映射到与NVIDIA GPUs[例如/dev/nvidia0]对应的字符设备中。但是这个方案的问题也很明显,因为主机驱动程序的版本必须与容器中安装的驱动程序版本完全匹配。这一要求大大降低了这些Docker容器的可移植性。为了能够让Docker容器使用NVIDIA GPUs并保持强大的可移植性,NVIDIA开发了nvidia-docker,这个项目托管在github[https://github.com/NVIDIA/nvidia-docker]。

nividia-docker要求宿主机有GPU并且安装了适合的驱动程序,之后nvidia-docker会将docker自带的运行环境替换成支持nvidia gpu的运行环境。

Installation

首先,需要安装Docker[https://docs.docker.com/engine/install/ubuntu/],并确定能够正常运行。

之后,Setup the stable repository and the GPG key:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

注意这里的$distribution可以支持的系统有限,所以如果是一些非主流发行版,可以直接替换成对应的主流版本,比如:

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu20.04/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

之后就可以直接安装nvidia-docker了,但是这里需要注意,有些发行版可能自带nvidia-dockerapt可安装版本,有可能会导致错误。可以通过添加配置信息来解决这个问题

vim /etc/apt/preferences.d/nvidia-docker-pin-1002

# add the following content
Package: *
Pin: origin nvidia.github.io
Pin-Priority: 1002

安装nvidia-docker2

sudo apt-get update
sudo apt-get install -y nvidia-docker2

# Restart the Docker daemon to complete the installation
sudo systemctl restart docker

# Test nvidia-docker 
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

reference:

  1. https://developer.nvidia.com/blog/nvidia-docker-gpu-server-application-deployment-made-easy/
  2. https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html