亚马逊Web服务上深度学习的10个命令行方法
在Amazon Web Services EC2上运行大型深度学习过程是学习和开发模型的一种廉价而有效的方式。
只需几美元,你就可以访问数十亿字节的RAM、数十个CPU内核和多个GPU。我强烈推荐。
如果你是EC2或Linux命令行的新手,当你在云中运行深度学习脚本时,你会发现有一套命令非常有价值。
在本教程中,你将发现我每次使用EC2来适应大型深度学习模型时使用的10个命令的私人列表。
读完这篇文章,你就会知道:
- 如何将数据复制到EC2实例以及从EC2实例复制数据。
- 如何将脚本设置为安全运行数天、数周或数月。
- 如何监控进程、系统和GPU性能。
我们开始吧。
概述
本文中提供的命令假定你的AWS EC2实例已经在运行。
为了保持一致性,我们还做了一些其他假设:
- 你的服务器IP地址是54.218.86.47;将其更改为你的服务器实例的IP地址。
- 你的用户名是ec2-user;将其更改为你在实例上的用户名。
- 你的SSH密钥位于~/.ssh/中,文件名为aws-keypair.pem;将其更改为你的SSH密钥位置和文件名。
- 你正在使用Python脚本。
如果你需要帮助设置和运行基于GPU的AWS EC2实例以进行深度学习,请参阅教程:
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/目录中的script.py Python脚本,并且希望将此脚本的输出转发到位于同一目录中的script.py.log文件。
根据你的需要进行调整。
如果这是你第一次使用nohup,你可以在此处了解更多信息:
如果这是你第一次使用重定向标准输入(Stdin)、标准输出(Stout)和标准错误(Sterr),你可以在这里了解更多信息:
4.在服务器上的特定GPU上运行脚本
如果你的AWS EC2实例能够处理你的问题,我建议你同时运行多个脚本。
例如,你选择的EC2实例可能有4个GPU,你可以选择在每个GPU上运行一个脚本。
使用CUDA,你可以指定要与环境变量CUDA_VIEWLE_DEVICES一起使用的GPU设备。
我们可以使用上面相同的命令运行脚本并指定要使用的特定GPU设备,如下所示:
CUDA_VISIBLE_DEVICES=0 nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log &1 &
如果你的实例上有4个GPU设备,则可以指定CUDA_VISPLICE_DEVICES=0到CUDA_VIRED_DEVICES=3。
我预计这将适用于Theano后端,但我只用Kera的TensorFlow后端进行了测试。
你可以在下面的帖子中了解有关CUDA_VIEW_DEVICES的更多信息:
5.监控服务器上的脚本输出
你可以在脚本运行时监视其输出。
如果你在每个纪元或在每个算法运行之后输出分数,这可能会很有用。
此示例将列出脚本日志文件的最后几行,并在向脚本添加新行时更新输出。
tail -f script.py.log
如果屏幕在一段时间内没有获得新的输出,亚马逊可能会积极关闭你的终端。
另一种方法是使用watch命令。我发现亚马逊会让这个终端保持开放:
watch "tail script.py.log"
我发现来自python脚本的标准输出(Stout)似乎并不经常更新。
我不知道这是EC2的事情还是Python的事情。这意味着你可能不会在日志中看到经常更新的输出。当缓冲区达到固定大小或在运行结束时,它似乎被缓冲并输出。
6.监控服务器上的系统和进程性能
监视EC2系统性能是一个好主意。特别是你正在使用和剩余的内存量。
你可以使用每隔几秒更新一次的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;如果你是Unix命令行的新手,本说明非常适合你。
如果这是你第一次接触vi,你可以在此处了解更多信息:
10.从你的工作站从服务器下载文件
我建议将你的模型以及所有结果和图形显式保存到新的单独文件中,作为脚本的一部分。
你可以使用安全复制(SCP)将这些文件从服务器实例下载到工作站。
下面的示例从你的工作站运行,并将主目录中的所有PNG文件复制到你的工作站。
scp -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47:~/*.png .
其他提示和技巧
本节列出了大量使用AWS EC2时的一些其他提示。
- 一次运行多个脚本。我建议选择具有多个GPU的硬件,并同时运行多个脚本,以充分利用平台。
- 仅在你的工作站上编写和编辑脚本。将EC2视为一个伪生产环境,并且只将脚本和数据复制到那里运行。在你的工作站上进行所有开发,并编写代码的小测试,以确保代码按预期工作。
- 将脚本输出显式保存到文件。将结果、图形和模型保存到文件中,以后可以下载到你的工作站进行分析和应用。
- 使用watch命令。亚马逊自动地扼杀了没有活动的终端会话。你可以使用watch命令监视情况,该命令发送数据的频率足够高,从而使终端保持打开状态。
- 从你的工作站运行命令。上面列出的任何打算在服务器上运行的命令也可以从你的工作站运行,方法是在命令前面加上“
ssh –i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47
”,然后引用你要运行的命令。这对于全天检查流程非常有用。
摘要
在本教程中,你了解了我每次使用GPU在AWS EC2实例上培训大型深度学习模型时使用的10个命令。
具体地说,你了解到:
- 如何将数据复制到EC2实例以及从EC2实例复制数据。
- 如何将脚本设置为安全运行数天、数周或数月。
- 如何监控进程、系统和GPU性能。