使用nvidia-docker搭建深度学习容器

       上一篇博客安装了nvidia-docker,这一篇博客介绍如何使用nvidia-docker创建GPU容器,这样创建的容器不会影响宿主机的开发环境,还可以创建多台容器,使用多个cuda版本,多人同时使用,极大地提高了开发效率。

1、拉取镜像

       和nvidai-docker相切合的docker镜像是nvidia/cudaDockerhub的地址为nvidia/cuda
在这里插入图片描述
这里的镜像有很多类型,最基本的三种类型如下:

  • base:基于cuda,包含最精简的依赖,用于部署预编译的cuda应用,需要手工安装所需依赖
  • runtime:基于base,添加了cuda tookit共享库
  • devel:基于runtime,添加了编译工具链、调试工具、头文件、静态库,用于从源码编译cuda应用

       除此之外,还有基于各种系统生成的镜像,有Centosubuntuubi系统的,基于ubuntu系统编译的镜像无法使用特权模式,即无法正常使用systemctl等命令,而centos8停服了,所以我选择了我比较熟悉的centos7系统。
       另外还有带cudnn的版本,如11.5.0-cudnn8-runtime-ubuntu20.04,里面包含了cudnn,但是呢,他的cudnn没有和cuda放一起,进去还得单独配置,有点麻烦,所以我选择了没有cudnn的版本,等部署好容器后,我自己自行配置cudnn
       所以,扯皮扯了半天,我用的哪个版本?我主要用PaddlePaddlePytorch,所以我装的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目录下的文件复制到cudalib64目录下

①、如果是.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连接进行远程开发,非常的舒服。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值