一、参考资料

Repository configuration

二、相关介绍

  1. Nvidia安装nvidia-docker官方教程
  2. 最初的docker是不支持gpu的
  3. 为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker。该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。
  4. 根据网上的资料,从docker 19版本之后,nvidia-docker成为了过去式。不需要单独去下nvidia-docker这个独立的docker应用程序,也就是说gpu docker所需要的Runtime被集成进docker中,使用的时候用–gpus参数来控制。
  5. 如果不添加–gpus参数,宿主的gpu将对于容器不可见。
# 指定所有的gpu
--gpus all

# 指定1,2号gpu
--gpus 1,2

# 使用所有GPU
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

# 使用两个GPU
docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi

# 指定GPU运行
docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi

三、系统环境要求

# CUDA版本/显卡驱动/系统版本对齐,请参考 [Nvidia官网](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#abstract)

1. GNU/Linux x86_64 with kernel version > 3.10

2. Docker >= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)

3. NVIDIA GPU with Architecture >= Kepler (or compute capability 3.0)

4. NVIDIA Linux drivers >= 418.81.07 (Note that older driver releases or branches are unsupported.)

四、具体步骤

# 安装指定版本的依赖包(一定要安装,否则会报错)
sudo apt install libnvidia-container1=1.4.0-1 libnvidia-container-tools=1.4.0-1 nvidia-container-toolkit=1.5.1-1

# 安装最新的依赖包(一定要安装,否则会报错)
sudo apt install libnvidia-container1 libnvidia-container-tools nvidia-container-toolkit

# 用Docker官方脚本安装Docker-CE
curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

# 添加稳定仓库和GPG密钥
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

# 更新源
sudo apt-get update

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

# 重启docker服务
sudo systemctl restart docker

# 查看–gpus 参数是否安装成功
docker run --help | grep -i gpus

# 1. 运行一个基于CUDA的容器
sudo docker run --rm --gpus all nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04 nvidia-smi

# 2. 运行一个基于CUDA的容器
sudo docker run --rm --gpus all nvidia/cuda:10.0-base nvidia-smi

# 3. 运行一个基于CUDA的容器
docker run --gpus=all --rm -it nvidia/cuda:10.0-base /bin/bash
nvidia-smi

# 4. 运行一个基于CUDA的容器, nvidia-docker:nvidia-container-toolkit的安装方式
docker run --gpus=all --rm nvidia/cuda:10.0-base nvidia-smi

# 5. 运行一个基于CUDA的容器, nvidia-docker2的方式
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm nvidia/cuda:10.0-base nvidia-smi
or 
nvidia-docker run -e NVIDIA_VISIBLE_DEVICES=all --rm nvidia/cuda:10.0-base nvidia-smi

# 6. 运行一个基于CUDA的容器
docker run -itd --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all 镜像名
参数解释:
NVIDIA_DRIVER_CAPABILITIES=compute,utility
加上compute,宿主机的英伟达driver将对容器提供计算支持(所谓的计算支持也就是cuda支持)

五、Docker安装tensorflow-gpu

参考资料

Docker安装tensorflow-gpu启动 TensorFlow Docker 容器

六、可能出现的问题

  • cuda错误
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: signal: segmentation fault (core dumped), stdout: , stderr:: unknown.
错误原因:
参考资料
[signal: segmentation fault (core dumped), stdout: , stderr:: unknown. When install the docker nvidia](https://github.com/NVIDIA/nvidia-docker/issues/1536)

[New Docker CLI API Support for NVIDIA GPUs under Docker Engine 19.03.0 Pre-Release](https://collabnix.com/introducing-new-docker-cli-api-support-for-nvidia-gpus-under-docker-engine-19-03-0-beta-release/)

1. 未安装 nvidia-container-* 相关依赖包
2. docker未重新启动

解决办法:
# 1. 安装相关依赖包(一定要安装,否则会报错)
sudo apt install libnvidia-container1=1.4.0-1 libnvidia-container-tools=1.4.0-1 nvidia-container-toolkit=1.5.1-1

# 2. 重新启动docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  • source.list重复
W: 目标 Packages (Packages) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (zh_CN) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (zh) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (en) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Packages (Packages) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (zh_CN) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (zh) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (en) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Packages (Packages) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (zh_CN) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (zh) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Translations (en) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:1 和 /etc/apt/sources.list.d/nvidia-docker.list:1 中被配置了多次
W: 目标 Packages (Packages) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (zh_CN) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (zh) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
W: 目标 Translations (en) 在 /etc/apt/sources.list.d/nvidia-container-runtime.list:3 和 /etc/apt/sources.list.d/nvidia-docker.list:3 中被配置了多次
错误原因:
sources.list中的记录重复
 
解决办法:
将sources.list的第1行和第3行注释掉