在AWS上执行大规模的深度学习处理是一个廉价而且有效的学习和开发方式。花少量的钱就可以使用数十GB的内存,数十个CPU,多个GPU,这是值得推荐的。
如果你是使用EC2或者Linux命令的新人,在云端执行深度学习脚本的时候,这些命令是非常有效的。
本文的主要内容包括:
1)在本机和EC2实例间复制数据
2)使脚本按天,周,月安全地运行
3)监测进程,系统和GPU的性能
注意:所有命令在类linux环境中执行(Linux,OSx或者cygwin)
0、环境约定
假设AWSEC2已经正常运行,方便起见,对环境做如下的设定:
1)EC2服务器的IP地址为54.218.86.47
2)用户名为ec2-user
3)SSH密钥位于~/.ssh/中,文件名为aws-keypair.pem;
4)使用python脚本工作
关于如何搭建一个基于GPU的EC2实例来执行深度学习,可以参见:
/zixunimg/eepwimg/machinelearningmastery.com/develop-evaluate-large-deep-learning-...
1、登陆到服务器
在做任何操作之前,首先要登陆到目标服务器。简单地,使用SSH命令。将SSH密钥存储在~/.ssh/中,使用有意义的文件名,例如aws-keypair.pem。使用如下命令登陆EC2主机,注意地址和用户名:
ssh-i~/.ssh/aws-keypair.pemec2-user@54.218.86.47
2、拷贝文件到服务器
使用SCP命令拷贝本地文件到服务器,例如将script.py文件拷贝到EC2服务器的命令如下:
scp-i~/.ssh/aws-keypair.pemscript.pyec2-user@54.218.86.47:~/
3、使脚本在服务器的后台运行
在服务的后台执行脚本,可以忽略其他进行的信号量,忽略标准的输入输出,将所有的输出和错误信息重定向到一个日志文件中。对于需要长时间运行的深度学习模型而言,这是非常必要的。
>nohuppython/home/ec2-user/script.py>/home/ec2-user/script.py.log&1&
该命令中script.py和script.py.log都位于/home/ec2-user/目录下。关于nohup和重定向参考其他的详细介绍(例如wikipedia中的介绍)。
4、在服务器的指定GPU上执行脚本
如果EC2支持的话,推荐在同时运行多个脚本。例如,EC2有4个GPU的话,可以在每个GPU上单独运行一个脚本,示例代码如下:
CUDA_VISIBLE_DEVICES=0nohuppython/home/ec2-user/script.py>/home/ec2-user/script.py.log&1&
如果有4个GPU的话,可以指定CUDA_VISIBLE_DEVICES从0到3。这在TF做后台的Keras上是可行的,在Theano没有测试过。
关于CUDA_VISIBLE_DEVICES的更多信息可以参见/zixunimg/eepwimg/devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visi...
5、监测脚本的输出
如果输出结果中有项目评分或者一个算法的运行结果,实时监控脚本的输出是很有意义的。示例如下:
tail-fscript.py.log
遗憾的是,当屏幕上在一段时间没有输出的时候,AWS会关闭这个终端,所以最好使用:
watch"tailscript.py.log"
有的时候看不到python的标准输出,不知道是python的问题还是EC2的问题。
6、监测系统和进程的性能
监测EC2系统的性能是有意义的,尤其是已经使用了或还剩下多少内存。例如:
top-M
或者指定进程标识PID:
top-pPID-M
7、监测GPU性能
如果在GPU上同时执行多个脚本,并行执行的话,查看每个GPU的性能和使用率是不错的主意。例如:
watch"nvidia-smi"
8、检查脚本是否还在服务器上运行
一般地,会保持终端一直是开着的。
watch"ps-ef|greppython"
9、在服务器上编辑文件
一般不建议在服务器直接修改,当然你熟知vi除外:
vi~/script.py
vi的用法就不在这里赘述了。
10、从服务器上下载文件
与上传文件相对,这是一个下个png文件的例子:
scp-i~/.ssh/aws-keypair.pemec2-user@54.218.86.47:~/*.png.
需要注意的几点
如果希望同时运行多个脚本,最好选用拥有多个GPU的EC2
最好在本地编写脚本
将执行结果输出到文件,下载到本地进行分析
使用watch命令保持终端处于运行中
在本地执行远程命令