在深度学习和图形处理等领域,GPU相较于CPU有着数十倍到上百倍的算力,能够为企业提供更高的计算效率及更低廉的IT成本,但同时也有不少研究与开发人员对GPU云服务器有着不少困惑。
以深度学习为例,如何选购腾讯云GPU云服务器并优雅地安装驱动等底层开发工具库,以及如何实现远程开发和调试Python代码呢?
我们将从实践出发,提出基于腾讯云GPU实例的最佳实践,基于腾讯云GPU服务器打造远程Python/PyTorch开发环境。其实,开发者们完全可以在“本地开发一致的体验”和“服务器端更高质量资源”这二者之间,做到最佳的结合,享受计算加速以及专注开发过程的双重乐趣。那么,我们开始吧~
1、GPU云服务器准备
我们选择腾讯云目前的主流机型GPU计算机型GN7,其中搭载一颗Tesla T4 GPU。本教程采用的具体规格为GN7.5XLARGE80。这款机型有着不错的综合性能,20核心+80G内存,比较适合常规的深度神经网络训练等各种应用场景。而且,它还是全球市面上同级别GPU机型中(T4)性价比最高的产品。
注:按量计费的机型做实验更灵活哦~
本教程中的实例机型:GN7(推荐)、GN10X等GPU机型均可以。 推荐选择的系统镜像:Ubuntu 18.04 (注意无需勾选“后台自动安装GPU驱动”)
其他信息:北京五区,1M公网带宽,系统盘大小100G。根据实际情况选择即可。
创建实例完成后,控制台面板可以查看实例信息:
开机登录后,我们可以简单通过lspci命令验证GPU,以及通过lsmod验证已有驱动nouveau模块,当然,我们后面将换掉它。
2、驱动&CUDA工具包安装及验证
官网网络Deb包安装
前往NVIDIA官网下载最新的CUDA Toolkit 10.2(当前最新的稳定版本):
https://developer.nvidia.com/cuda-downloads
根据我们的环境选择安装下载方式,这里我们选择网络安装deb包的方式,如图:
然后按照下面的提示依次执行命令即可:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda
可以看到其实就是在系统中安装了NVIDIA的官方apt仓库源,并执行了apt install cuda,很方便。只有最后一步的安装过程稍微耗时一些,需要5分钟左右。这步有可能因网络原因中断,无需担心,一般重试1~2次即可。
注意:此处需要重启服务器。
那么究竟安装了什么,以及如何验证安装成功呢?
验证GPU驱动安装 —— 设备信息查看
NVIDIA GPU驱动是支持CUDA编程的内核模块。通过上述方法安装的驱动是以动态内核模块(DKMS)的形式安装的,这种内核模块不在内核source tree中,但是可以在每次内核更新升级时自动地进行重新编译,生成新的initramfs,并后续随着系统启动动态加载。总之就是,驱动只需安装一次,非常方便。
重启后登录,我们来验证驱动模块已动态加载。
可见nouveau等社区驱动已经不会被加载,而是加载了NVIDIA的官方驱动。驱动对应的四个内核模块在这个目录下:
/lib/modules/4.15.0-88-generic/updates/dkms/
nvidia-smi命令查看GPU设备状态,如驱动版本(440.64.00)、CUDA版本(10.2)、型号(Tesla T4)、显存(15109MiB)以及温度功耗等各种信息,如图:
验证CUDA Toolkit安装 —— 示例代码编译
CUDA Toolkit,即开发工具包,其中包括构建命令、头文件、动态库、文档、代码示例等等,安装在/usr/local/cuda目录。
注意:使用CUDA Toolkit,必须要设置系统的PATH,以找到nvcc等命令。
全局PATH可以很多地方设置,以/etc/profile.d修改为例 :
echo 'export PATH=/usr/local/cuda/bin:$PATH' | sudo tee /etc/profile.d/cuda.sh
source /etc/profile
官方代码示例编译运行
cp -r /usr/local/cuda/samples/ cuda_samples
cd cuda_samples
make -j16 -k
官方示例170个左右,注意不是都能编译(所以加了-k 选项),编译完大致也就小几分钟而已。
然后我们可以运行示例啦,简单的如deviceQuery、bandwidthTest、simpleCUBLAS、simpleCUFFT等等。
以上为运行bandwidthTest的结果,可以看到,主显存之间带宽一般可高达12~14GB/秒。
3、CUDNN安装及验证
类似地,从官网下载安装,目前最新版本是 7.6.5(对应的CUDA Toolkit 10.2版本)。下载地址:
https://developer.nvidia.com/rdp/cudnn-download
这里不同于下载CUDA Toolkit,多了个登录步骤以及协议的勾选项。
Ubuntu 18.04下,需要三个下载包,分别是运行时库、开发库以及代码示例。
本地下载后,上传(scp/rsync)到GPU服务器上执行dpkg
安装即可。
sudo dpkg -i libcudnn7*.deb
验证CUDNN安装 —— 示例编译运行
cudnn代码示例在/usr/src/cudnn_samples_v7下,包含conv_sample 、mnistCUDNN 、multiHeadAttention、RNN四个。
cp -r /usr/src/cudnn_samples_v7 .
cd cudnn_samples_v7/RNN
make
如RNN示例执行:
如此高的Gflops,有没有一点点心动的感觉呢~
4、PyCharm远程开发
接下来,我们开始远程开发环境搭建
本地环境:Ubuntu 18.04 笔记本,PyCharm(2019.3.4, Linux版本)
注意,本地不需要以下工具:PyTorch/JupyterLab甚至Python3解释器。
创建指定远端解释器的项目
我们从0开始,创建一个新项目
选择创建解释器,即点击那个“三个点”的按钮
选择SSH解释器,设置登录服务器IP和用户名
输入服务器密码
接下来,PyCharm会验证服务器登录,(第一次设置还会有添加footprint的提示),然后就可以添加解释器了
注意:明确用Python3!
回到项目界面,可以看到远端解释器已经自动选择上了,这里我们输入远端项目的路径,就是想把项目放在云服务器的那个目录,这里我们指定在以下目录中:
/home/ubuntu/code/remote_demo_1
注:PyCharm会通过SFTP协议同步本地和远端的目录内容。
代码执行验证
下面我们创建一个main.py文件,看看会发生什么?
编辑完成后,PyCharm会自动同步本地文件(main.py)到服务器端目录。我们可以通过右侧的RemoteHost查看服务器端的文件,右下角也会显示当前项目的解释器是远端的Python解释器。
执行这个main.py文件,(绿色Run按钮或Ctrl+Shift+F10),可以看到执行结果,结果正确打印了服务器的信息。
Tips 1:如何用PyCharm里集成的终端连接远端服务器?
默认Terminal里仍然是本地(Local)的,可以通过菜单栏 -> Tools -> Start SSH session...启动直接指定远端服务器Terminal;也可以在设置里通过Tools -> SSH Terminal设置默认的终端。达到类似的效果
Tips 2:代码同步通过PyCharm比较容易,如何传数据等大一些的文件呢?
推荐使用rsync命令,增量上传非常方便。
rsync -avtP ~/data ubuntu@your-server-ip:~/
# 可将用户主目录下的data目录上传至云服务器下的ubuntu用户的主目录下
5、PyCharm远程调试
我们再创建第二个远端执行的项目,体验下远程调试的过程。
由于我们之前已经创建过远端解释器了,这次在创建项目时只需指定选择已有的解释器就可以。同样地,设置远端项目目录路径。
这次我们简单编辑一个示例代码hanoi.py,不过不同于直接执行,我们试玩下用PyCharm单步调试。左键点击函数左侧即设置断点,然后点击Debug图标(或Shifit+F9)启动调试,F7单步执行。效果如图所示:
左侧显示的函数的调用栈帧信息,右侧函数命名变量的当前值显示。另外,上图中还设置了观察变量(step),可以方便查看其实时变化。
到这里相信你已可以看出,PyCharm远程项目调试和本地调试几乎没有任何区别。
6、PyTorch安装示例
PyTorch简介及服务器端安装
首先需要在GPU服务器实例(注意不是本地)上安装PyTorch,目前官方最新的是1.4版本。这里选择官方的pip安装方式:
sudo apt install python3-pip
sudo pip3 install numpy torch torchvision
验证安装可用以下命令,将打印PyTorch版本:1.4.0。
python3 -c "import torch; print(torch.__version__)"
通过本地PyCharm创建PyTorch示例
到了第三个示例,相信你已经很熟悉套路了,还是选择已有的远端解释器、定义远端项目目录等常规操作。
接下来简单地验证一下PyTorch模块的使用:创建一个随机数张量,以及验证CUDA的启用。
可以看到,基于PyCharm的Remote Interpreter,远程开发调试基于PyTorch的网络模型也如同本地一样的畅快。
7、Jupyter Notebook安装示例
Jupyter简介及服务器端安装
首先,服务器端安装Jupyter
sudo pip3 install jupyterlab
启动Jupyter服务
# 设置jupyter web的密码
jupyter-notebook password
# 创建jupyter工作目录
mkdir ~/jupyter_workspace
# 启动jupyter (两次ctrl+c停止服务)
jupyter-notebook --no-browser --ip=0.0.0.0 --port=8887 ~/jupyter_workspace
启动jupyter时,记得一定加上参数--no-browser
来禁用自动打开浏览器,以及参数--ip=0.0.0.0
使得服务可以对外。
注意,为了让公网可以访问,需要服务器实例设置相应的安全组规则,本例中即入站规则的加入TCP:8887。
本地访问云服务器的Jupyter服务
打开本地浏览器访问http://服务器的公网IP:端口访问,会跳转到登录页,如图:
输入之前设的密码,就是熟悉的Jupyter Notebooke管理页面了,创建ipynb文件尽情玩耍吧~
8、Jupyter Notebook结合PyCharm使用
有小伙伴询问:“还要开浏览器好麻烦,能不能在PyCharm里直接玩Jupyter Notebook?” 完全可以!但服务器端的jupyterlab安装还是必须的,参考上一节。
在PyCharm的设置(settings)里添加jupyter服务地址:
虽然这里貌似无需输入登录密码。但当我们创建完notebook,第一次Shift+Enter执行时,就会提示输密码了。
然后就是熟悉的味道了:
在PyCharm里创建Jupyter Notebook更方便,因为这样ipynb文件可以在PyCharm项目下统一管理,还是很推荐的。
9、结语
你已经可以仅凭本地的PyCharm,完成基于腾讯云GPU服务器的远程Python开发调试了,是不是感觉很酷?云服务器貌似在“天边远端”看不见摸不着,然而确是当下及未来最高效可靠、最方便灵活、最经济实惠的计算资源管理和使用方式,让我们一起拥抱这个令人兴奋的变革,一路感受云端的精彩吧。