用于亚马逊网络服务深度学习的10个命令行技巧
2017年08月21日 由 xiaoshan.xiang 发表
943328
0
在亚马逊网络服务CE2上运行大型深度学习进程是学习和开发模型的一种廉价有效的方法。你只需花费几美元就能够使用几千兆的内存,数十个CPU内核和多个GPU。我强烈推荐它。如果你敢接触到CE2或者Linux命令行,当你在云上运行深度学习脚本时你会发现一套价值无法估量的命令。
读完这篇文章,你就会知道:
如何从EC2实例复制数据。
如何安全的运行脚本几天、几周或几个月。
如何监控流程、系统和GPU性能。
现在开始
注意:来自工作站的所有命令都假定你正在一个Linux类型的环境中(如Linux、OS X或cygwin)。
中运行
综述
本文中给出的命令假定你的AWS EC2实例已经在运行了。
为了保持一致性,还做了一些其他的假设:
你的服务器IP地址是54.218.86.47;将它更改为你的服务器实例的IP地址。
你的用户名是ec2-user;将它更改为你的实例上的用户名。
你的SSH密钥位于~ /。ssh /并有文件名aws - keypair.pem;将它更改为SSH密钥位置和文件名。
你正在使用Python脚本。
如果你需要建立并运行一个基于GPU的AWS EC2的实例进行深度学习,请参阅教程:
如何使用亚马逊网络服务上的Keras开发和评估大型深度学习模型
1 从工作站登录到服务器
在开始工作之前,需要先登录服务器。
你可以使用SSH安全壳轻松登录。
我建议在~/.ssh/目录中存储SSH密钥。使用“aws - keypair.pem”这个名字。记住:文件必须具有权限600。
使用下面的命令登录到你的服务器实例。请记住将用户名和IP地址更改为你的相关用户名和服务器实例IP地址。
ssh -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47
2 将工作站的文件复制到服务器
使用安全复制(scp)将工作站的文件复制到服务器实例。
下面是运行工作站上的复制脚本的例子,将工作站上本地目录中的script.py Python脚本复制到服务器实例。
scp -i ~/.ssh/aws-keypair.pem script.py ec2-user@54.218.86.47:~/
3 在服务器上运行脚本作为后台进程
你可以运行Python脚本作为后台进程。
此外,你可以以这样一种方式运行它:让它忽略其他进程的信号,忽略任何标准输入(stdin),并将所有输出和错误转发到日志文件。
根据我的经验,这些需要长时间运行的脚本,以适应大型深度学习模型。
nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log &1 &
假设你正在运行位于/ home / ec2 - user/目录中的py Python脚本。将此脚本的输出转发到位于同一目录下script.py.log中。
调整需求。
如果这是你第一次使用nohup,可以在这里学到更多:
如果这是你第一次使用重定向标准输入(stdin)、标准输出(stout)和标准错误(sterr),可以在这里学到更多:
4 在服务器特定的GPU上运行脚本
如果AWS EC2实例能够解决你的问题,我建议一次运行多个脚本。
例如,你选择的EC2实例可能有4个GPU,你可以在每一个GPU上运行一个脚本。
使用CUDA,你可以指定环境变量CUDA_VISIBLE_DEVICES使用哪个GPU设备。
我们使用和上面一样的命令去运行脚本,并且指定特定的GPU设备。
CUDA_VISIBLE_DEVICES=0 nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log &1 &
如果你的实例上有4个GPU设备,可以指定CUDA_VISIBLE_DEVICES = 0到CUDA_VISIBLE_DEVICES = 3。
我希望这可以为Theano后端工作,但我只对Keras的TensorFlow后端进行了测试。
你可以在文章中了解更多关于CUDA_VISIBLE_DEVICES的信息:
5 在服务器上监控脚本输出
当脚本运行的时候你可以监控脚本的输出。
如果在每一个新纪元或每个算法运行之后输出一个分数,这可能是有用的。
这个示例将列出你的脚本日志文件的最后几行,并将输出作为新行添加到脚本中。
tail -f script.py.log
如果屏幕在一段时间内没有得到新的输出,亚马逊可能会积极关闭你的终端。
另一种选择是使用watch命令。我发现亚马逊将一直保持这个终端开放:
watch "tail script.py.log"
python脚本中标准输出并不经常更新。
我不知道它是属于EC2还是Python。这意味着你可能不会经常看到日志中的输出。当缓冲区达到固定大小或运行结束时,它似乎会被缓冲并输出。
6 在服务器上监控系统和过程性能
监控EC2系统性能是一个好想法,特别是对你正在使用的和剩余的RAM数量。
你可以使用几秒更新一次的top 命令。
top -M
如果你知道进程标识符(PID),你还可以监控系统和流程。
top -p PID -M
7 在服务器上监控GPU性能
一直关注GPU性能是非常好的。
如果你打算GPU RAM中并行运行多个脚本,请关注GPU运行和GPU利用率。
你可以使用nvidia-smi命令来关注GPU的使用情况。 我喜欢使用保持终端打开的watch命令,并为每个新结果清除屏幕。
watch "nvidia-smi"
8 在服务器上检查仍然运行的脚本
关注仍在运行的脚本也很重要。
可以使用ps命令执行此操作。
我喜欢使用watch命令来保持终端的打开状态。
watch "ps -ef | grep python"
9 在服务器上编辑文件
我不建议在服务器上编辑文件,除非真的有必要。
不过,可以使用vi编辑器编辑文件。
下面的例子是在vi中打开脚本。
vi ~/script.py
当然,你可以使用你喜欢的命令行编辑器,如emacs。
如果这是你第一次接触到vi,你可以在这里了解更多:
10 将文件从服务器下载到工作站
我建议你将模型、所有结果和图形显式保存为新的、单独的文件作为脚本的一部分。
你可以使用安全复制(scp)将这些文件从服务器实例下载到工作站。
下面的例子在你的工作站运行,并将所有PNG文件从主目录复制到工作站。
scp -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47:~/*.png .