服务器只有一台,大家天天用sudo改环境最后炸了?可以采用Docker,在容器里面爱装啥装啥。
目录
深度学习服务器环境配置
安装Ubuntu Server 16.04。这一步骤网上教程很多,简略带过。
连接服务器、配置用户信息、SSH密钥登录、防火墙端口、Ubuntu软件源等。
安装显卡驱动,Docker CE 19.03(已支持GPU,无需再安装Nvidia Docker),并配置用户Docker权限。
Docker容器深度学习环境配置
使用指南
连接服务器与文件传输
容器创建与使用
1.下载Ubuntu16的iso镜像,建议server版。
2.用UltraISO把镜像加载完烧录到U盘里面。
3.插U盘,进BIOS设置优先U盘启动,进入Ubuntu安装环节。
4.完成各项配置并完成安装。
1.连接服务器。
推荐使用MobaXterm。新建Session,设置好IP,以及安装系统配置的用户信息,端口默认22。
2.添加需要的用户并配置信息。
adduser $USER
3.登入用户并设置SSH密钥对。
ssh-keygen -t rsa
touch .ssh/authorized_keys
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
4.开启SSH密钥登录,关闭密码登录,并更换SSH端口。
修改SSH的配置文件/etc/ssh/sshd_config
找到
PasswordAuthentication yes
加上#注释或改为no以关闭密码登录。
找到:
Port 22
修改端口。
5.防火墙设置。
使用Ubuntu的ufw设置防火墙,将新端口添加进去,并启动防火墙。后续看使用情况用ufw对端口进行设置。
sudo ufw allow xxxx
6.之后重启SSH服务,重新连接。IP不变,需要修改用户(只需要用户名,不需要密码),端口,以及密钥。
重启SSH服务:
sudo /etc/init.d/ssh restart
7.重新登录后,切换root,修改ubuntu软件源。切换root后直接复制粘贴即可(清华源)。
touch /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main multiverse restricted universe' >> /root/untitled.txt
cp /root/untitled.txt /etc/apt/sources.list
apt-get update
apt-get upgrade
1.下载对应显卡和系统的Nvidia驱动并进行安装。网上教程较多,不予赘述,本文采用的是最新驱动。
2.安装Docker CE 19.03与NVIDIA Docker,该版本Docker已支持GPU,无需再安装Nvidia Docker 2。教程可参考清华镜像安装(比较快)以及参考官网和Nvidia Docker以及该教程。
# Add the package repositories
$ 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
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
3.创建Docker用户组并配置用户Docker权限。
groupadd docker
gpasswd -a $USER docker
4.拉取nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04镜像,其他支持cuda的镜像可以在这里找到。
docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
配置到这里已经可以让用户自行拉取镜像创建容器,并在容器中自定义环境。为了方便多用户更简易使用,最好对初始镜像进行一定配置,再重新做成镜像给每个用户使用。本文在每个容器中安装anaconda,方便用户在个人的容器内进行自定义。
1.根据拉取的镜像创建容器。Docker命令可查。
docker images
docker run --name lab403 --gpus all -itd nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
2.下载Anaconda安装包,并使用docker cp命令拷入容器内/root/目录中以便后续安装。拷入后使用docker exec -it lab403 /bin/bash进入容器。
docker cp data/Anaconda3-2019.07-Linux-x86_64.sh lab403:/root/
docker exec -it lab403 /bin/bash
docker exec -it lab403 /bin/bash是常用进入容器的命令。这里有个检查镜像是否调用CUDA的方法,进入镜像后通过nvidia -smi以及 nvcc -V查看GPU驱动和CUDA版本。
3.进入镜像后,修改源并更新软件,同装完系统的更新源操作。
如果该步骤出现了其他源(developer.download.nvidia.com),请删除/etc/apt/sources.list.d/中的对应文件。
touch /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main multiverse restricted universe' >> /root/untitled.txt
echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main multiverse restricted universe' >> /root/untitled.txt
echo 'deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main multiverse restricted universe' >> /root/untitled.txt
cp /root/untitled.txt /etc/apt/sources.list
apt-get update
apt-get upgrade
4.修改pip源(清华源)。
mkdir /root/.pip
touch /root/.pip/pip.conf
echo '[global]' >> /root/.pip/pip.conf
echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> /root/.pip/pip.conf
echo '[install]' >> /root/.pip/pip.conf
echo 'trusted-host=mirrors.aliyun.com' >> /root/.pip/pip.conf
5.安装Anaconda。本文时间关系没有更换Anaconda源并进行其他配置,详细可以参考这里的Anaconda教程。
安装Anaconda,一路yes,装完exit,重新使用docker exec -it lab403 /bin/bash命令进入容器的bash
chmod +x /root/Anaconda3-2019.07-Linux-x86_64.sh && /root/Anaconda3-2019.07-Linux-x86_64.sh
6.使用Anaconda创建新的虚拟环境。
conda create -n py3 python=3.7
conda activate py3
7.安装常用深度学习环境包。这里主要用pip安装,笔者对anaconda不熟悉,也可以用anaconda直接进行包安装,可以参考上面的anaconda教程,进行源配置与包安装。
pip install numpy tensorflow-gpu keras torch torchvision scikit-learn Scipy Pydot Matplotlib Pandas XGBoost LightGBM CatBoost Eli5 NLTK SpaCy Gensim Scrapy pydicom opencv-python scikit-image SimpleITK graphviz
这里也可以加上--no-cache-dir 的参数,后续不需要再清理缓存。若网络条件不好,建议用上述命令。安装完分别对tensorflow,pytorch测试是否正常调用GPU,参考该教程以及该教程。
tf2.0的GPU测试如下
import tensorflow as tf
version = tf.__version__
gpu_ok = tf.test.is_gpu_available()
print("tf version:",version,"\nuse GPU",gpu_ok)
tf测试GPU成功的话应该是显示
tf version: 2.0.0
use GPU True
pytorch测试为
import torch
flag = torch.cuda.is_available()
print(flag)
ngpu= 1
# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print(device)
print(torch.cuda.get_device_name(0))
print(torch.rand(3,3).cuda())
成功的结果为
True
cuda:0
GeForce GTX 1070
tensor([[0.0100, 0.9075, 0.7111],
[0.6928, 0.5959, 0.4963],
[0.1099, 0.2922, 0.8152]], device='cuda:0')
8.整理完所有需要的包,可以将容器重新打包成镜像了。
如果服务器磁盘资源有限,可以对无用的包和文件进行清理,减小镜像体积。
rm /root/Anaconda3-2019.07-Linux-x86_64.sh
conda clean -p # 删除没有用的包 --packages
conda clean -t # 删除tar打包 --tarballs
conda clean -y -all # 删除所有的安装包及cache(索引缓存、锁定文件、未使用过的包和tar包)
rm -rf ~/.cache/pip/* #删除pip缓存
之后需要先关闭容器,可以exit后,使用docker stop lab403关闭容器的后台运行。之后使用docker ps -a查看容器的Container ID。并使用docker commit对其进行发布。-m为消息,-a为作者,后接容器ID与镜像名称。
docker commit -m="deep learning environment has been successfully built" -a="root" b43837545aa1 lab403
至此环境配置全部完成,后续可以分发密钥让每个用户从新的镜像进行容器创建并使用。
docker的使用指南有很多,基本概念需要进行简单的学习与了解。容器可以简单理解为一个新的linux系统,在容器内的任意操作都不会影响到外部环境。每个用户可以按自己的需求定制容器。
用户获得密钥后,按前文所述SSH连接教程连接至服务器。
使用MobaXterm可以通过sftp实现与本地的文件传输,还能在命令行中光标拖选后左键点击完成复制,右键直接粘贴等。MobaXterm提供了很多便捷的方法和工具,建议进行学习使用,能提高很多工作效率。
切记环境配置不易,不要再动机器的默认环境了,所有操作自行去容器内操作。
登录完成后,通过docker images查看现有镜像。
使用docker run来创建容器,这里建议多学习docker使用手册,上文中也有链接。其中-p为指定端口映射(有需要使用的话记得服务器防火墙也要打开对应端口),-v为指定目录共享(支持多目录映射)。
docker run --name test --gpus all -p 1088:80 -v /home/gaoqiang/data:/data -itd lab403:latest
之后日常使用方式建议采用screen + docker exec的方式进行方便的后台管理。访问docker前可以先开启screen,在screen内使用docker exec命令开启一个bash,第一次打开bash后需要记得使用conda activate切换anaconda的环境。
screen -R test
docker exec -it test /bin/bash
conda activate py3
注意环境已经配置在py3中,所以碰到问题第一时间检查环境是否正确。
后续进行操作,需要退出可以exit直接关闭screen。更多时候需要后台挂起bash,在screen内快速按顺序同时按下Ctrl A D三个键即可。这样就能将screen挂起在后台,其中打开容器的bash也仍在后台运行。
再重新打开只需再次使用screen -R test即可。使用screen -ls可以查看已开启哪些screen。
screen也是非常便捷的多终端管理工具,可以跨终端进行后台程序管理,也强烈建议学习。
教程主要内容介绍完毕,更多的使用如容器开放web端口使用,anaconda配置环境等笔者也在学习,总之用户也需要不断的学习这些工具的教程与使用。希望读者能有所收获。