一、参考资料
二、相关介绍
- Nvidia安装nvidia-docker官方教程
- 最初的docker是不支持gpu的
- 为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker。该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。
- 根据网上的资料,从docker 19版本之后,nvidia-docker成为了过去式。不需要单独去下nvidia-docker这个独立的docker应用程序,也就是说gpu docker所需要的Runtime被集成进docker中,使用的时候用–gpus参数来控制。
- 如果不添加–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行注释掉