用于亚马逊网络服务深度学习的10个命令行技巧

2017年08月21日 由 xiaoshan.xiang 发表 943160 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 .

 
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消