上一篇博客安装了nvidia-docker
,这一篇博客介绍如何使用nvidia-docker
创建GPU
容器,这样创建的容器不会影响宿主机的开发环境,还可以创建多台容器,使用多个cuda
版本,多人同时使用,极大地提高了开发效率。
1、拉取镜像
和nvidai-docker
相切合的docker
镜像是nvidia/cuda
,Dockerhub
的地址为nvidia/cuda
这里的镜像有很多类型,最基本的三种类型如下:
- base:基于cuda,包含最精简的依赖,用于部署预编译的cuda应用,需要手工安装所需依赖
- runtime:基于base,添加了cuda tookit共享库
- devel:基于runtime,添加了编译工具链、调试工具、头文件、静态库,用于从源码编译cuda应用
除此之外,还有基于各种系统生成的镜像,有Centos
、ubuntu
和ubi
系统的,基于ubuntu
系统编译的镜像无法使用特权模式,即无法正常使用systemctl
等命令,而centos8
停服了,所以我选择了我比较熟悉的centos7
系统。
另外还有带cudnn
的版本,如11.5.0-cudnn8-runtime-ubuntu20.04
,里面包含了cudnn
,但是呢,他的cudnn
没有和cuda
放一起,进去还得单独配置,有点麻烦,所以我选择了没有cudnn
的版本,等部署好容器后,我自己自行配置cudnn
。
所以,扯皮扯了半天,我用的哪个版本?我主要用PaddlePaddle
和Pytorch
,所以我装的cuda10.2
的版本,如果使用tensorflow
的话,这个版本是不行的,tensorflow
不支持cuda10.2
,得用cuda11.2
。我使用的是nvidia/cuda:11.2.2-devel-centos7
镜像,拉取命令如下,接下来就以此来演示如何部署深度学习容器。
docker pull nvidia/cuda:11.2.2-devel-centos7
2、创建容器
命令如下:
nvidia-docker run -itd --name=DL -p 2222:22 --privileged=true --gpus all nvidia/cuda:10.2-devel-centos7 /usr/sbin/init
-it
交互模式运行-d
守护进程,人话就是让它在后台跑--name
指定容器名称-p
映射端口号,格式为:主机端口:容器端口,这里映射22端口是为了用SSH
连接--privileged=true
特权模式,为了之后使用sytemctl
来重启sshd
--gpus all
指定用的cpu,因为只要一块,就全指定了,其他指定方式自行百度/usr/sbin/init
这个也是为了启动特权模式,换/bin/bash
就不行
3、安装并配置ssh
(1)安装openssh-server
sudo yum update -y && sudo yum install openssh-server -y
(2)修改密码
passwd
输入两次新密码就可以了,记住,用来之后连接容器
(3)配置公钥
若没有公钥登录需求,可以直接使用密码就可,不用管这一步
①、创建.ssh
文件夹和authorized_keys
文件
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
②、修改权限
cd ~/.ssh
chmod 700 ../
chmod 700 .
chmod 600 authorized_keys
③、写入公钥
将自己的公钥写入,那样不用密码就可以登陆了
vi ~/.ssh/authorized_keys
④、重启sshd
服务(配置文件不用改,配置文件刚好)
systemctl resatrt sshd
⑤、连接
这么配置后,就可以利用ssh
连接容器了,刚才容器映射的是2222
端口,使用一下命令即可以连接
ssh root@服务器ip -p 2222
配置公钥的应该直接就可以连接成功,没配置的就输入密码连接,除了命令行连接,也可以使用 ssh
工具(如putty、xshell和termius等)进行连接,记得端口是2222
就行。
4、配置cuda
容器里面虽然安装了cuda
,但是nvcc -V
显示找不到命令,得配置一下环境变量。
vi /etc/profile.d/cuda.sh
将以下内容写入:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
使其生效:
source /etc/profile
这样nvcc -V
就可以查看cuda
版本了
5、配置cudnn
(1)下载cudnn
cudnn
的下载需要到官网,而且需要注册英伟达账户,下载地址:https://developer.nvidia.com/rdp/cudnn-archive。不知道是不是学校网络原因,我访问非常的慢,科学上网后访问才快了,但是下载文件却可以跑慢速,真的有点奇怪。
如上图所示,根据cuda
版本选择相应的cudnn
进行下载。
如下图所示,我的cuda
版本是10.2,然后我下载第二个(其他满足10.2的也可以),然后选择Linux
的版本,记得选择Tar
的包。
(2)安装cudnn
实测,虽然都选择Tar
的包,但不同版本的下载的包格式不一样,我下载cuda10.2
版本的cudnn
是.tar.xz
格式的包,而下载cuda11.2
版本的cudnn
却是*.tgz
,其他版本的未测,但其实大同小异。
安装cudnn
的方法也检测,就是将cudnn
下载包下lib/lib64
目录下的文件复制到cuda
的lib64
目录下
①、如果是.tar.xz
格式的包
我下载的cuda10.2
版本的cudnn
就是这样
解压命令为:
tar -xvJf *.tar.xz
解压后目录结构为:
安装方法:
进入解压的目录,然后执行以下命令:
cp ./include/* /usr/local/cuda/include/
cp ./lib/* /usr/local/cuda/lib64/
网上的教程一般只复制libcud*
开头的库啥的,但文件也不大,之后估计也能用到,为了简单方便,我就把对应文件全复制过去了
②、如果是.tgz
格式的包
我下载的cuda11.2
版本的cudnn
就是这样
解压命令为:
tar -zxvf *.tgz
解压后目录结构为:
安装方法:
进入解压的目录,然后执行以下命令:
cp ./include/* /usr/local/cuda/include/
cp ./lib64/* /usr/local/cuda/lib64/
安装完成后,使用一下命令可以查看`cudnn`版本信息:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
安装完成后记得删除下载的压缩包和不用的文件,否则打包成镜像的时候镜像会占用很大的空间。
6、安装Miniconda
基本的深度学习环境配置好了,还需要安装python用于开发啊,为创建虚拟环境方便,我选用了Miniconda
,体积小,还可以很方便配置开发环境。
安装的版本看个人需求,我用的python3.8
的版本。官网下载速度太慢,我是从清华大学镜像源下载的,下载地址为:Miniconda,或在服务器中用命令下载:
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh
如下图所示,下载完成后,先赋予可执行权限,然后执行安装即可,提示要输入的,输入yes
即可,其他的一路Enter
按下去。
安装完成后,重开一个终端,就是一下界面,说明安装完成:
安装完成后记得删除Miniconda
的安装包,否则打包会增加镜像占用空间。
7、换源
有三个源可以换,conda
源、pip
源和yum
源,镜像自带的yum
源速度还可以,我就没换,只换了conda
源和pip
,换源就是为了是速度更快。这里都是使用清华的源,需要换其他源的大同小异,百度即可。
(1)换conda源
创建.condarc
文件:
vi ~/.condarc
将以下内容写入:
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
清空缓存:
conda clean -i
(2)换pip源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
7、打包容器为镜像
docker commit -a "wxj" -m "Server of DL" DL dl_server:cuda10.2
-a
后跟作者-m
后跟镜像描述- 此处的
DL
为我的容器名称,按自己的填写dl_server:cuda10.2
这是我打包后的镜像名称和标签,按自己需求填写
执行命令后等待一会,就可以看到打包后的镜像了
8、从镜像创建容器
和之前创建容器方式一样,映射好端口号就可以
nvidia-docker run -itd --name=dl_server -p 2223:22 --privileged=true --gpus all dl_server:cuda10.2 /usr/sbin/init
打开服务器对应防火墙后,就可以远程连接服务器跑模型了,也可以使用PyCharm
专业版利用SSH
连接进行远程开发,非常的舒服。