如何用云服务器进行深度学习
本文将从购买GPU服务器、远程连接服务器、深度学习环境安装、用jupyter操控服务器等方面逐一讲解购买及使用GPU服务器的步骤。
免费在线jupyter可见在线jupyter平台推荐。
1. 服务器配置与购买
云服务器供应商有很多,本文以阿里云为例,在百度云、腾讯云、谷歌云等其他供应商购买服务器的步骤大同小异。
进入阿里云官网。
登录(支付宝、淘宝账户均可登录)并先预充一百元。
在导航栏中选择“产品”-“云计算基础”-“GPU云服务器”
在云服务器界面选择“GN5(P100)购买”
接下来,我们便跳转到了阿里云服务器购买界面。默认情况下,系统为我们推荐“包年包月”的计费方式。每月上千的GPU租赁费用对大部分用户来说过于昂贵,而且我们只是偶尔会使用GPU计算服务,以月为单位租赁服务器有点浪费。
除了包年包月,我们还可以选择“按量付费”或者“抢占式实例”。按量付费是以小时为单位进行计费,计算完毕后需手动关闭服务器以停止计费。“抢占式实例”也是按小时计费,价格随市场波动,出价高的一批用户获得GPU服务器的使用权。
“抢占式实例”价格相对便宜,但当市场价格高于我们的出价时,我们的实例将会被释放,服务器将会被他人使用。不过使用“自动出价”可以让我们避免上述风险。
按量付费实例停机后不收费,抢占式网络虽然便宜,但必须释放实例实例后才会停止收费。
如果只是想体验一下,计费方式可选择“抢占式实例”。地域选择“华北5(呼和浩特)”会有优惠,价格大约在五到七块每小时(价格会随时间有些许波动)。读者若想以后长期间断使用服务器,一定要选“按量付费”,根据配置不同,价格在八到十三块每小时。(实际费用以秒为单位进行计算)
服务器规格选择“ecs.gn5-c8g1.2xlarge”,该规格有8个vCPU,60G内存,一块P100 GPU,440G存储空间(暂时存储),Intel Xeon E5-2682v4 CPU。配置足以满足绝大部分任务的需求了。
接着,设置镜像。
镜像推荐一:如下图进行配置。CentOS/Ubuntu16.04系统都支持“自动安装GPU驱动”(新手推荐使用Ubuntu16.04,遇到的坑会少一点),可免去之后安装GPU驱动的步骤。(若是使用Tensorflow,仍需要手动安装cuDNN)
Tensorflow-GPU的底层支持一直在变。当前(2019年3月20号)Tensorflow-gpu版本要求CUDA版本要9.0(目前不支持9.1!)且Driver要384.x或更高版本。读者若是几年后看到该文章,请先查询tensorflow-gpu的GPU驱动版本要求。安装驱动版本不符无法运行tensorflow-gpu。
镜像推荐二:读者也可以选择使用“镜像市场”中的镜像。如下图中的镜像,已经预装了GPU驱动和tensorflow等框架。纯小白建议选择这个方法,此处就免去了文本第三步环境安装的过程。
存储选择默认设置。本地存储440G空间会随着我们的实例释放后消除。一般我们的代码都放在系统盘,40G的系统盘满足大部分AI比赛或项目的存储需求。若有额外需求,读者可适当增加数据盘。这里保持默认不更改。
完成上述配置后,点击“下一步:网络和安全组”。该界面,我们不做任何更改。
值得注意的是“公网带宽”中的带宽大小是指流量留流出的带宽大小,计费0.8元/G也是计算流量留出的费用。我们使用服务器下载文件属于流量流入,与该“公网带宽”选择无关,且服务器下载文件免费。
安全组默认也保持不变。确保22端口打开即可,我们之后会通过ssh的方式连接服务器。
点击“下一步:系统配置”。了解密钥的读者可在“登录凭证”选择“密钥对”的方式。不了解密钥的读者可选“自定义密码”(记住该密码,当我们登录服务器时,登录名为root,密码为此处设置的密码)。
完成后点击“确认订单”。确认界面如下:
“保存为启动模板”可选可不选。保存模板后,当我们再次购买类似服务器时,可以使用模板中的服务器配置。(按量计费时,我们想停止计费,只需关停服务器,不用删除服务器。以后想用服务器,再次启动即可,无需再次配置并购买服务器。)
另外,我们也可以设置自动释放的时间(谨慎操作,到达释放时间后,实例会被释放,数据及IP不会被保留)若读者对自己的使用时间没有把握,不建议设置“使用时限”。
点击同意《云服务器 ECS 服务条款》服务协议。
之后我们即可点击右下角的“创建实例”了。创建实例之后即开始计费,直到我们手动停止服务为止。
另外,当不用服务器的时候,一定记得要停止服务!
若使用按量计费,选择“停止”即可(下图绿色框),想用时选择“启动”即可。若使用抢占式实例,则需要选择“释放设置”了(下图红色框),因为抢占式实例停止服务器后仍旧计费。下次使用时需要重新配置服务器,包括各类环境。
2. 服务器连接
在控制台中我们可以看到我们正在运行的云服务器。记住我们服务器的公网IP地址。
这里笔者使用Xshell来连接远程服务器。打开Xshell,在菜单栏里选择“文件”-“新建”
名称随意设置,“主机”为你购买的服务器的公网IP地址,协议SSH,端口22。
完成上述内容后,点击确定即可。创建成功后,在界面左侧双击我们刚刚创建的“阿里云服务器”以连接服务器。
第一次登陆会有一个SSH安全警告,选择“接收并保存”即可。
之后便是用户登录,默认的用户名为root
登录方式则与之前“登录凭证”相对应。密码登录或者密钥登录。
接着,我们便成功以ssh的方式远程连接了阿里云服务器。
3. 环境安装
刚购买的云服务器只有最简单的一些配置。我们需要在此基础上安装一些深度学习需要的环境。
3.1 安装GPU驱动、CUDA以及cuDNN
安装GPU驱动、CUDA、cuDNN全是坑,不同环境下出现的问题千奇百怪,此处难以一一举出。读者若安装时出现问题请直接百度/google,网上必有解决方法(虽然可能也不靠谱)。
Ubuntu出现的坑较少,此处以Ubuntu为例。
3.1.1 安装GPU驱动
在第一步配置服务器时若选择“自动安装GPU驱动”则可跳过这一步。
在英伟达驱动下载页面设置自己的配置,之后点击“SEARCH”
接着进入信息确认界面,点击“DOWNLOAD”
再之后,在如下界面,右键“AGREE&DOWNLOAD”,复制链接地址。
返回服务器命令行,输入wget 地址
本案例是 wget http://us.download.nvidia.com/tesla/384.183/NVIDIA-Linux-x86_64-384.183.run
下载完后,执行如下代码以安装驱动
sudo chmod a+x NVIDIA-Linux-x86_64-384.183.run
sudo ./NVIDIA-Linux-x86_64-384.183.run -no-x-check -no-nouveau-check -no-opengl-files
安装过程中会有窗口让你选择yes或者no,问你是否continue的时候选择yes(笔者没有遇到这个选择),其他时候选择no。
若驱动安装成功,输入nvidia-smi即可查看GPU当前状态。
3.1.2 安装CUDA以及cuDNN
这里给出tensorflow官网上推荐的CUDA以及cuDNN安装代码
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
sudo apt install ./cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt update
sudo apt install cuda9.0 cuda-cublas-9-0 cuda-cufft-9-0 cuda-curand-9-0 cuda-cusolver-9-0 cuda-cusparse-9-0 libcudnn7=7.2.1.38-1+cuda9.0 libnccl2=2.2.13-1+cuda9.0 cuda-command-line-tools-9-0
3.1.3 手动安装cuDNN(使用pytorch可跳过)
若3.1.2中成功安装CUDA但未成功安装cuDNN,此时则需要我们进行手动安装cuDNN了。这个步骤略微繁琐,需要用户前往
https://developer.nvidia.com/rdp/cudnn-download
注册账户后才会有权限下载文件,直接以wget的方式下载会被服务器拒绝。
我们只能用本地电脑访问上述网站,注册账户,然后选择我们需要的cuDNN版本,先下载到本地。(选择for CUDA 9.0版的,下载cuDNN Library for Linux)
接下来,我们需要将本地下好的文件传到远程的服务器上。但在这之前,我们需要先要将服务器允许传输文件的端口打开。
在阿里云服务器管理界面,找到我们的服务器,选择“管理”
在管理界面选择“本实例安全组”
打开安全组界面后,在横向菜单栏中选择“安全组列表”,之后选择“配置规则”
选择“快速创建规则”
配置如下图,选择telnet(23)端口,授权对象填“0.0.0.0/0”。完成后,我们就可以从本地向服务器传输文件了。
我们在服务器命令行上输入apt-get install -y lrzsz,安装一个便于我们文件传输的工具。
命令行输入rz,会弹出一个窗口,找到我们之前下载的文件,选择“打开”。
之后便会开始传输文件
当文件传出完成后,我们先把文件重新命名为tgz格式。
mv cudnn-9.0-linux-x64-v7.5.0.56.solitairetheme8 cudnn-9.0-linux-x64-v7.5.0.56.tgz
解压该文件tar -xzvf cudnn-9.0-linux-x64-v7.5.0.56.tgz
把解压出的这几个文件分别放到cudn安装的位置。
值得注意的是,有的服务器cudn是安装在/usr/local/cuda下,笔者的服务器是安装在/usr/local/cuda-9.0下。读者应该先查看一下自己/usr/local/中cuda文件夹名是什么,再进行如下安装。
依次将我们解压好的文件放入cudn的安装目录对于位置。(每行指令最后的“/”一定要有!)
sudo cp cuda/include/cudnn.h /usr/local/cuda-9.0/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64/
最后执行如下代码即可成功安装完cudnn
sudo chmod a+r /usr/local/cuda-9.0/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
输入cat /usr/local/cuda-9.0/include/cudnn.h | grep CUDNN_MAJOR -A 2 可检查安装是否成功(路径中cuda-9.0在某些服务器中应该为cuda)
3.2 安装anaconda(可跳过)
Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
3.2.1 下载并安装anaconda
输入wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.4.0-Linux-x86_64.sh以下载anaconda文件(linux64位版)
运行 bash 下载文件名.sh 来安装anaconda,这里是bash Anaconda3-4.4.0-Linux-x86_64.sh
安装过程中一直回车。遇到问yes或no的问题,除了问是否安装vscode输入no,其他都输入yes。
若遇见“bunzip2: command not found”报错,执行yum install -y bzip2 之后再执行bash 下载文件名.sh -u (要加-u,-u的意思是重新安装,覆盖之前安装的内容)
3.2.2 添加anaconda环境变量
安装成功后,我们还要将anaconda添加到环境变量中。输入vim .bashrc 以用vim编辑器来编辑.bashrc文件。
注意,vim编辑器不是word文档!想要修改文件,我们要先按下“i”键切换到插入模式。按下i后,左下角会有“INSERT”显示,表示我们现在敲打键盘即可插入文字。
我们在文件开头输入:
#Anaconda
export PATH=/home/用户名/anaconda3/bin:$PATH
其中用户名在本案例中就是root,于是就应该输入:
#Anaconda
export PATH=/home/root/anaconda3/bin:$PATH
按下Esc键,退出插入模式。依次按下”:”, “w”, “q”, 左下角应该显示如下图,之后“回车”,即可保存并关闭文件。
输入source .bashrc 重新激活一下。此时输入which python即可发现当前使用的python是anaconda3中的。(/root/anaconda3/bin/python)
若不行,则需重启服务器,再输入source .bashrc 重新激活。
3.3 修改镜像源(可跳过)
3.3.1 修改conda镜像
conda默认的镜像源在国外,下载文件速度可能比较慢。我们需要将镜像源修改为国内的,下载速度会提高很多。
输入如下命令修改conda的镜像源
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
3.3.2 修改pip镜像源:
(阿里云服务器的默认镜像都已使用阿里云的镜像,读者可跳过本步骤)
输入mkdir .pip 创建.pip文件夹(有可能mkdir: cannot create directory ‘.pip’: File exists,表示已经有该文件了。)
输入cd .pip 移动到.pip文件夹
输入vim pip.conf,创建并修改pip.conf文件
将该文件修改为如下内容(按下i进入插入模式,按下Esc退出插入模式,按下:wq并回车则保持并关闭文件):
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
3.4 anaconda环境管理(可跳过)
anaconda可进行环境管理,可创建多个环境,不同环境内可安装不同的包。默认情况下,我们在base环境中。新建环境可用:
conda create -n 环境名 python=python版本
我们新建一个名字叫tensorflow的环境,这个环境的python版本是3.6则应该为:conda create -n tensorflow python=3.6。安装过程中会问我们是否执行Proceed ([y]/n)?,我们回复y。
安装完新环境后,我们使用conda activate 环境名,即可从base环境切换到新环境。
可见该环境是python3.6的,我们之后安装各类python包,import各类python包都是在该环境下进行。退出该环境可以输入conda deactivate,这样,我们就回到了base环境。
3.5 安装深度学习框架
3.5.1 机器学习函数库
常用的机器学习包有numpy,pandas,matplotlib,sklearn等,其中有的包已经随anaconda一起安装好了,有的则没有(具体情况根据安装的anaconda版本而定)。尚未安装的需手动安装。
使用 pip install 包名 即可。如:pip install pandas
3.5.2 Tensorflow
使用NVIDIA显卡运行Tensorflow-gpu需要除了要装驱动以外,还需要安装cuDNN。(见3.1)
由于我们使用的是gpu版本,输入pip install tensorflow-gpu即可安装gpu版tensorflow。
安装完后,检验一下我们的tensorflow是否安装成功。
输入python,进入python执行界面。在该界面下输入import tensorflow as tf,不报错即代表安装成功。
报FutureWarning不要紧,只要import tensorflow成功即可。
安装gpu版tensorflow出错概率极高,各类问题请参见“3.6 安装tensorflow-gpu出错的各种可能”
3.5.3 PyTorch
在PyTorch的官网上选择自己的服务器配置即可找到对应下载代码。
我们输入 pip install torch 即可安装PyTorch
输入python,进入python执行界面。在该界面下输入import torch ,不报错即代表安装成功。
3.6 安装tensorflow-gpu出错的各种可能
我们之前提到过,tensorflow对环境有比较严格的要求,如python版本只可为2.7、3.3-3.6,CUDA为9等等。
3.6.1 python版本检查
在命令行输入python -V(V要大写)查看python版本,若为版本不在2.7、3.3-3.6之间,请参照3.4 使用conda创建一个3.6python版本的环境,在该环境下安装并使用tensorflow。
3.6.2 驱动以及CUDA版本检查
输入nvidia-smi查看GPU状态,若报错,则要重新安装GPU驱动。见3.1.1
查看CUDA版本:cat /usr/local/cuda/version.txt (cuda目录也可能为cuda-9.0等,可输入cat /usr/local/cuda-9.0/version.txt )若没有,则参见3.1.2
查看cuDNN版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2(cuda目录也可能为cuda-9.0,可输入cat /usr/local/cuda-9.0/include/cudnn.h | grep CUDNN_MAJOR -A 2)若没有,则参见3.1.3
若CUDA和cuDNN的版本与tensorflow-gpu要求的版本不符,则需重新安装CUDA和cuDNN。
3.6.3 安装指定tensorflow-gpu版本
输入pip uninstall tensorflow-gpu即可卸载之前安装的tensorflow-gpu
输入 pip install tensorflow-gpu==版本号 如pip install tensorflow-gpu==1.12.0 即可安装1.12.0版本的tensorflow。
4. 用jupyter操控服务器
我们可以通过xshell的隧道方式,让我们以本地浏览jupyter的方式控制远程服务器。
4.1 配置jupyter
首先,在远程服务器上安装jupyter:pip install jupyter
接着,输入jupyter notebook –generate-config –allow-root生成配置文件。
我们输入python,进入python执行界面。输入:
from notebook.auth import passwd
passwd()
之后系统会让我们输入并验证新密码,密码选一个好记的即可。输入完成后,系统会返回给我们一个加密的字符串,复制该字符串。
按下ctrl+z返回命令行,输入vi ~/.jupyter/jupyter_notebook_config.py,以编辑该文件。
按下”i”键进入插入模式,插入如下内容
c.NotebookApp.ip='*'
c.NotebookApp.password = u'之前的那串sha1字符串'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888 # 任意端口均可(只要不占用22,80等常用端口)
按下‘Esc’退出插入模式,输入:wq回车以保持并关闭文件。
此时,输入jupyter notebook –allow-root 服务器就在运行jupyter了,不过想要本地访问,我们还需要让阿里云打开8888端口
4.2 开通服务器端口
与3.1.3开通端口类似。在修改安全组规则界面(具体详情见3.1.3),我们选择“添加安全组规则”
添加如下规则即可
此时,访问我们服务器ip:8888 即可进入jupyter界面。密码输入我们在from notebook.auth import passwd; passwd() 时输入的密码。
密码输入完成后,即可用jupyter的方式访问到我们的服务器了。
4.3 隧道连接
在Xshell界面左侧的会话管理器,选择属性
点击“隧道”-“添加”
输入如下信息,侦听端口任意,这里为5000;目标主机可以不用设置,目标端口是之前c.NotebookApp.port =8888设置的端口号。
完成后点击确定。断开与服务器的连接并重连。
此时运行jupyter后。我们可以以访问本地5000端口的形式访问远程服务器了。
附录:使用密钥对
在配置阿里云服务器时,在登陆凭证界面选择“新建密钥对”。
我们创建一个密钥,并点击确定。此时我们会下载一个.pem文件
下载的.pem文件为密钥(密钥请勿泄露,公钥随意,其他人知道你的公钥也无法伪造成你登录服务器)。
以XShell为例,我们在菜单栏选择“工具”-“用户密钥管理者”
在打开的“用户密钥”窗口,我们选择导入,导入之前的.pem文件
导入成功后如下图。
密钥相对于直接密码登录来说会安全很多。
回到登陆凭证界面,选择我们之前创建的密钥对即可。