背景
自从课题组打算买开始服务器,要折腾的内容还挺多,从硬件到软件,不过这一趟下来也收获了不少,踩的坑更多,硬件就不讲了,今天主要是说一下如何快速上手,搭建一个可以跑深度玄学实验的环境。
众所周知,服务器服务多人,大家使用从管理员那边拿到的账号使用机器,虽然各自的文件都是独立的,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、Ubuntu
和ubi
系统的,不过要注意一点,使用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,pip
和yum
下载拉取的速度
(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
请直接查阅参考文章第二篇,很详细,不做赘述。
参考文章
教程参考自以下的文章