通过Docker来创建多个容器(相当于多个linux系统),每个容器中的CUDA版本之间互相不影响。这样的好处是可以在项目需要时,不改动主机环境的前提下运行多个CUDA版本。同时,也可以为不同的使用人员定制相应的环境而不影响其他环境。

通过ssh来远程访问docker容器,这样可以在一个局域网内的任何一台电脑上访问到容器。例如,一个实验室内的一台服务器上安装了多个docker容器,就可以在实验室上的任何一台电脑上通过ssh访问docker容器。

关于Docker的基本操作,可以参考这个文档:Docker快速入门总结笔记_huangjhai的博Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

接下来开始安装

1、Linux上安装显卡驱动

为了让docker可以正确的识别显卡,首先需要在宿主机上安装nvidia的显卡驱动,这里不需要安装cuda和cudnn。就像下图一样,驱动安装在宿主机上,而cuda和cudnn安装在docker容器里。安装显卡驱动的帖子很多,这里就不做详细说明了,建议直接安装比较新的版本,因为新版本的显卡驱动可以使用老版本的cuda,但是老版本的显卡驱动却无法使用新版本的cuda。可以参考下面这篇文章

ubuntu安装显卡驱动的三种方法_u014682691的专栏_ubuntu安装显卡驱动一是:系统设置->软件更新->附加驱动->选择nvidia最新驱动(361)->应用更改简单但是不提倡 二是:先官网下载好对应驱动编译Nvidia中文官网是 http://www.nvidia.cn/page/home.html1)打开终端,先删除旧的驱动:sudo apt-get purge nvidia*2)禁用自带的 nouveau nvidia驱动创建一个文件通过命...

docker 单服务器负载 docker多服务器部署_深度学习

2、安装docker

建议安装docker19及其以上版本,因为docker19以上版本可以通过--gpus参数来调用gpu,而不需要安装nvidia-docker。安装docker最好的文档就是官方的文档:

Install Docker Engine on Ubuntu | Docker DocumentationInstructions for installing Docker Engine on Ubuntu

docker 单服务器负载 docker多服务器部署_linux_02

https://docs.docker.com/engine/install/ubuntu/

  1. 如果安装了旧版本的docker,需要先卸载!
sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 更新apt包索引并安装包以允许apt通过 HTTPS 使用存储库
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. 添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 使用以下命令设置稳定版存储库。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 不出意外,此时docker已经安装好了。运行如下命令来测试一下
sudo docker run hello-world

3、安装 NVIDIA Container Toolkit

安装了NVIDIA Container Toolkit,docker才能正确使用GPU。可以参考网页连接进行安装(因为安装的docker是19及其以上版本,所以不需要安装nvidia-docker):
Installation Guide — NVIDIA Cloud Native Technologies documentationhttps://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

  1. 设置稳定版的存储库喝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
  1. 更新源并安装nvidia-container-toolkit
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
  1. 设置好默认运行后重启Docker守护进程完成安装
sudo systemctl restart docker
  1. 此时,可以通过运行基本 CUDA 容器来测试工作设置
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
  1. 控制台输出如下结果表示安装成功了
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

 4、从dockerhub拉取环境镜像并搭建环境

 docker安装完毕后就可以在dockerhub寻找需要的镜像进行拉取,这里我们需要配置深度学习环境,也就是cuda+cudnn,所以我们拉取nvidia官方的nvidia/cuda镜像。

Docker Hubhttps://hub.docker.com/  点击Tags我们可以看到nvidia/cuda对应的所有的版本,我们可以寻找自己需要的版本进行安装。

docker 单服务器负载 docker多服务器部署_docker_03

 这里需要注意,选择的cuda版本需要满足宿主机的显卡驱动需求可以查看如下网页中的table3。

Release Notes :: CUDA Toolkit DocumentationThe Release Notes for the CUDA Toolkit.https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#title-resolved-issues

docker 单服务器负载 docker多服务器部署_linux_04

这里我们安装基于ubuntu的cuda版本11.0.3的镜像:11.0.3-cudnn8-devel-ubuntu20.04 采用如下命令拉取镜像

sudo docker pull nvidia/cuda:11.0.3-cudnn8-devel-ubuntu20.04

由于镜像比较大,这里要等待一些时间。如果发现拉取的速度很慢,明显低于带宽。可能是因为dockerhub的服务器在国外的原因,可以配置docker的源为国内镜像源。这里就不具体介绍怎么操作了,需要的小伙伴可以直接去百度搜,教程很多。

docker 单服务器负载 docker多服务器部署_ssh_05

 显示如下信息表示镜像拉取完成了。

docker 单服务器负载 docker多服务器部署_ssh_06

 可以通过  sudo docker images 命令查看已经存在的镜像。

接下来是通过镜像建立容器,采用如下命令

sudo docker run -it --name test --gpus all -p 1234:22 nvidia/cuda:11.0.3-cudnn8-devel-ubuntu20.04

命令解释:

-it        以交互模型运行容器,也就是运行容器后不退出
--name test        将容器命名为test,否则会随机命名
--gpus all            允许使用所有的gpu,这个非常重要,没有这个参数gpu无法正常使用
-p 1234:22        将宿主机的1234端口映射到容器的22端口,为了ssh链接做准备
nvidia/cuda:11.0.3-cudnn8-devel-ubuntu20.04        镜像名:版本号

其他后期可能会用到的命令,详细使用方法参考Docker快速入门总结笔记_huangjhai的博客-

docker kill           杀掉容器
docker start        开启容器
docker exec        进入容器
docker ps           显示运行中的容器

创建完成后可以用过    nvidia-smi    命令查看gpu是否正常工作, nvcc -V  命令查看cuda和版本。

现在一个基于ubuntu20.04的cuda+cudnn环境已经搭建好了,接下来就和使用普通的ubuntu系统一样,不过这里的ubuntu系统是精简版的,很多命令和软件并没有,可以自行通过apt安装(首先要通过apt update命令更新软件源,默认没有更新)。例如,通过apt安装python3、python3-pip,然后再安装TensorFlow和pytorch等。

(可选)4、直接拉取pytorch或者TensorFlow的环境

上一节介绍的环境搭建方法是:首先拉取cuda+cudnn的环境,然后在自行用pip或者conda搭建pytorch和TensorFlow环境。

其实还有一种更简单的方法来搭建pytorch和TensorFlow环境,就是直接拉取pytorch和TensorFlow的docker镜像,方法与拉取cuda镜像一样,链接如下:

Docker Hubhttps://hub.docker.com/r/pytorch/pytorchDocker Hubhttps://hub.docker.com/r/tensorflow/tensorflo

5、安装和使用ssh进行远程连接

 在容器内安装ssh服务端,这样我们可以用过ssh远程访问容器。第4节中通过 -p 命令已经将宿主机1234端口映射到容器22端口,因此我们可以通过ssh访问:宿主机IP+宿主机1234端口    来达到访问容器的目的。同理,我们在宿主机中建立不同的容器,映射不同的宿主机端口,则可以通过宿主机的不同端口来访问不同的容器。

参考文章Docker Ubuntu上安装ssh和连接ssh_JustToFaith博客下面所有操作都是在阿里云服务器上进行,ubuntu18.04环境。Docker 版本是18.09.6首先从云上拉取一个ubuntu的一个镜像root@LIZ:~# docker pull ubuntu # 如果是在自己的物理机上操作前面要加 sudo 下同启动镜像root@LIZ:~# docker run -itd -p 6789:22 199这段命令的意思是在后...

  1. 首先在容器内安装ssh服务端,如果让选择地区,选择亚洲/上海即可(Asia/Shanghai)
apt-get update
apt-get install openssh-server
  1. 为容器中的root账户设置一个密码,这样ssh才能链接
passwd
  1. 修改ssh的配置文件,这样才能通过root账户和密码访问
vim /etc/ssh/sshd_config

注释这一行PermitRootLogin prohibit-password
添加一行PermitRootLogin yes
然后保存退出

  1. 在容器中启动ssh服务
/etc/init.d/ssh restart
  1. 宿主机通过ssh连接容器
ssh root@127.0.0.7 -p 1234

 这样,基于docker的深度学习服务器就搭建完成了,通过多个容器,就可以在一台宿主机上配置多个互不干扰的环境,并通过ssh进行远程连接。