[科研]nv-docer食用指南

 

背景

自从课题组打算买开始服务器,要折腾的内容还挺多,从硬件到软件,不过这一趟下来也收获了不少,踩的坑更多,硬件就不讲了,今天主要是说一下如何快速上手,搭建一个可以跑深度玄学实验的环境。 :ku:

众所周知,服务器服务多人,大家使用从管理员那边拿到的账号使用机器,虽然各自的文件都是独立的,python也可以通过conda来管理各自的虚拟环境,但是gpu方面涉及到一些驱动和支持库,像cuda,如果大家在跑实验或者复现论文的代码的时候,要求的cuda版本不一样,总不能频繁地卸载重装吧。于是,我们可以使用nvidia-docker来完成这样的环境隔离,其隔离程度大于虚拟环境但是小于虚拟机,通俗地说,就是一个带可以正常调用gpu功能的docker。

示意图大致如下

 

每个container都是从image制作成的一个轻量级的虚拟机,只包含了运行程序的依赖库,可以从一个image制作出多个container(container相当于一个沙箱或者运行环境),然后所有我们可以在宿主机上实现的命令都可以在这个container中完成(只要安装了对应的程序与依赖即可),可以看作是一个简易版的linux,但是麻雀虽小五脏俱全。

 

拉取镜像

nvidia/cuda分类目录下下载对应合适的镜像,Dockerhub地址:nvidia/cuda

镜像类型主要有以下三种

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

一般我们直接下载devel类型的即可,此外生成镜像所基于的系统也不一样,常见的有Centos、Ubuntuubi系统的,不过要注意一点,使用Ubuntu系统编译的镜像无法使用特权模式,所以无法使用systemctl等系统命令,如果需求不大也可以。

此外,有些镜像会带cudnn,但是cudnn没有和cuda放在一起,进去后还得重新单独配置,所以此处使用没有cudnn的版本,等部署好容器后再自行配置cudnn

综上,看个人需求,只需要确定两点:系统类型(centos7/ubuntu),cuda版本针对下载即可,此处使用的版本是nvidia/cuda:11.2.2-devel-centos7

拉取命令如下

docker pull nvidia/cuda:11.2.2-devel-centos7

PS:课题组的同学,如果没有特殊需求的话,可以跳过这一步,直接创建容器即可,不需要重复下载镜像,节省空间资源。

 

创建容器

命令如下

nvidia-docker run -itd --name=DL -p 10022:22 --privileged=true --gpus all nvidia/cuda:11.2.2-devel-centos7 /usr/sbin/init
  • -it 交互模式运行
  • -d 守护进程,人话就是让它在后台跑
  • --name 指定容器名称,此处指定为DL
  • -p 映射端口号,格式为:主机端口:容器端口,这里映射22端口是为了用SSH连接(左边是宿主机对外端口,右边是容器内端口)
  • --privileged=true 特权模式,为了之后使用sytemctl来重启sshd
  • --gpus all 指定用的cpu,因为只要一块,就全指定了,其他指定方式自行百度
  • /usr/sbin/init 这个也是为了启动特权模式,换/bin/bash就不行

创建完之后使用命令

docker ps -a

查看容器状态

此处主要看容器id与容器状态是否为Up(起起来了)

然后执行下面的命令进入容器内部

docker exec -it 3ab0 /bin/bash

备注,此处只要输入容器ID的前4位即可

显示如此则说明进入了容器内部

 

配置与安装ssh

容器内部其实就是一个极简版的centos,(连vim都没有的那种)所以也可以通过ssh进行远程连接

1.安装openssh-server

yum update -y && yum install openssh-server -y

更新依赖并安装openssh

2.修改密码

passwd

输入两次密码即可

3.配置公钥登陆

如果你懒得配置公钥登陆,可以跳过这步,直接用root@password登陆即可

(1)创建.ssh文件夹和authorized_keys文件
mkdir ~/.ssh

touch ~/.ssh/authorized_keys
(2)修改权限
cd ~/.ssh

chmod 700 ../

chmod 700 .

chmod 600 authorized_keys
(3)写入公钥

将自己想要远程连接的机子的公钥写入,那样不用密码就可以直接登陆

vi ~/.ssh/authorized_keys
(4)重启sshd服务(配置文件不用改)

systemctl restart sshd

如果此处你装的不是centos,可以使用下面的命令重启服务

/etc/init.d/ssh restart
(5)连接

然后在其他机子上使用ssh命令试试连接

ssh root@serverip -p port
  • serverip:服务器的ip
  • port:你设置的image对外端口

上面的例子中是10022

可以使用xshell,xftp7进行连接,注意对应的的端口要填对,防火墙要开

 

配置cuda

容器中虽然自带了cuda,但是nvcc -V显示找不到命令(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版本

 

配置cudnn

(1)下载cudnn

cudnn的下载需要到官网,而且需要注册英伟达账户,下载地址:https://developer.nvidia.com/rdp/cudnn-archive

 

根据对应的cuda版本选择合适的cudnn进行下载

选择Tar格式的包即可

(2)安装cudnn

虽然写的是tar格式,不过下载下来之后都是.tar.xz,问题不大,直接解压就行

tar -xvJf *.tar.xz

解压后进入目录

  • include
  • lib

安装方式:

cp ./include/* /usr/local/cuda/include/

cp ./lib/* /usr/local/cuda/lib64/

安装之后,使用cat命令查看cudnn的版本信息

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

安装之后记得删除下载的压缩包和不用的文件,不仅占地方,而且后续如果打包镜像的需求,会占用很多不必要的空间

 

安装Miniconda

基本的环境到此就配置得差不多了,不过跑实验还要python环境,此处使用miniconda进行配置与管理,体积小也方便

安装版本按个人需要,也可以安装了之后自己再创建新的虚拟环境设置新的python版本,清华源下载地址:Miniconda

或者直接

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh

赋予执行权限

chmod +x ./Miniconda3-py38_4.8.3-Linux-x86_64.sh

然后

./Miniconda3-py38_4.8.3-Linux-x86_64.sh

一路回车加yes就行

安装完成后,记得重新开一个终端才能用conda指令

输入

ls

在root目录下有miniconda的文件夹说明安装成功了

装完记得删除miniconda的安装包,避免占用空间

换源

可以提高conda,pipyum下载拉取的速度

(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

 

连接pychram

请直接查阅参考文章第二篇,很详细,不做赘述。

 

参考文章

教程参考自以下的文章

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

pycharm远程连接服务器的docker容器进行运行和代码调试

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注