AI教程

如何用云服务器进行深度学习

本文将从购买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-gpu的驱动要求

镜像推荐二:读者也可以选择使用“镜像市场”中的镜像。如下图中的镜像,已经预装了GPU驱动和tensorflow等框架。纯小白建议选择这个方法,此处就免去了文本第三步环境安装的过程

存储选择默认设置。本地存储440G空间会随着我们的实例释放后消除。一般我们的代码都放在系统盘,40G的系统盘满足大部分AI比赛或项目的存储需求。若有额外需求,读者可适当增加数据盘。这里保持默认不更改。

不更改存储设置

完成上述配置后,点击“下一步:网络和安全组”该界面,我们不做任何更改

值得注意的是“公网带宽”中的带宽大小是指流量留流出的带宽大小,计费0.8元/G也是计算流量留出的费用。我们使用服务器下载文件属于流量流入,与该“公网带宽”选择无关,且服务器下载文件免费

不更改网络设置

安全组默认也保持不变。确保22端口打开即可,我们之后会通过ssh的方式连接服务器。

安全组,确保22端口打开

点击“下一步:系统配置”。了解密钥的读者可在“登录凭证”选择“密钥对”的方式。不了解密钥的读者可选“自定义密码”(记住该密码,当我们登录服务器时,登录名为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 .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文件

导入成功后如下图。

密钥相对于直接密码登录来说会安全很多。

回到登陆凭证界面,选择我们之前创建的密钥对即可。

发表回复