在 Amazon Web Services EC2 上运行大型深度学习进程是一种经济高效且有效的方法,可以学习和开发模型。
仅需几美元,您就可以获得几十 GB 的内存、几十个 CPU 核心和多个 GPU。我强烈推荐。
如果您是 EC2 或 Linux 命令行新手,那么在使用云中的深度学习脚本时,您会发现一套非常有用的命令。
在本教程中,您将发现我每次使用 EC2 训练大型深度学习模型时都会使用的 10 条命令的私有列表。
阅读本文后,你将了解:
- 如何将数据复制到 EC2 实例或从 EC2 实例复制数据。
- 如何安全地设置您的脚本,使其可以运行数天、数周或数月。
- 如何监控进程、系统和 GPU 性能。
通过我的新书 《Python 深度学习》 启动您的项目,其中包括分步教程和所有示例的Python 源代码文件。
让我们开始吧。
注意:从您的工作站执行的所有命令都假定您正在运行类 Linux 环境(例如 Linux、OS X 或 Cygwin)。
您是否有其他在 EC2 上运行模型的技巧、窍门或首选命令?
在下面的评论中告诉我。

Amazon Web Services 上的深度学习 10 个命令行技巧
照片作者:chascar,部分权利保留。
概述
本文中介绍的命令假定您的 AWS EC2 实例已在运行。
为保持一致性,还做了一些其他假设:
- 您的服务器 IP 地址是54.218.86.47;请将其更改为您服务器实例的 IP 地址。
- 您的用户名是ec2-user;请将其更改为您实例上的用户名。
- 您的 SSH 密钥位于~/.ssh/ 目录中,文件名为aws-keypair.pem;请将其更改为您 SSH 密钥的位置和文件名。
- 您正在使用 Python 脚本。
如果您需要有关设置和运行 GPU 驱动的 AWS EC2 实例进行深度学习的帮助,请参阅教程
1. 从您的工作站登录服务器
在执行任何有用的操作之前,您必须登录服务器。
您可以使用 SSH 安全 shell 轻松登录。
我建议将 SSH 密钥存储在您的~/.ssh/ 目录中,并赋予它一个有用的名称。我使用名称aws-keypair.pem。请记住:该文件必须具有 600 的权限。
以下命令将使您登录到服务器实例。请记住将用户名和 IP 地址更改为您相关的用户名和服务器实例 IP 地址。
1 |
ssh -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47 |
2. 将文件从您的工作站复制到服务器
您可以使用安全复制 (scp) 命令将文件从您的工作站复制到服务器实例。
下面是在您的工作站上运行的示例,它会将您工作站本地目录中的 script.py Python 脚本复制到您的服务器实例。
1 |
scp -i ~/.ssh/aws-keypair.pem script.py ec2-user@54.218.86.47:~/ |
3. 在服务器上将脚本作为后台进程运行
您可以将 Python 脚本作为后台进程运行。
此外,您可以以一种方式运行它,使其忽略来自其他进程的信号,忽略任何标准输入 (stdin),并将所有输出和错误转发到一个日志文件。
根据我的经验,对于运行时间较长的拟合大型深度学习模型的脚本,所有这些都是必需的。
1 |
nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log </dev/null 2>&1 & |
这假定您正在运行位于 /home/ec2-user/ 目录中的 script.py Python 脚本,并且您希望该脚本的输出被转发到同一目录中的文件 script.py.log。
根据您的需求进行调整。
如果您是第一次使用 nohup,可以在此处了解更多信息
如果您是第一次使用重定向标准输入 (stdin)、标准输出 (stout) 和标准错误 (sterr),可以在此处了解更多信息
4. 在服务器上的特定 GPU 上运行脚本
如果您的 AWS EC2 实例能够处理,我建议同时运行多个脚本。
例如,您选择的 EC2 实例可能有 4 个 GPU,您可以选择在每个 GPU 上运行一个脚本。
使用 CUDA,您可以通过环境变量 CUDA_VISIBLE_DEVICES 指定要使用的 GPU 设备。
我们可以使用上述命令运行脚本,并指定要使用的特定 GPU 设备,如下所示:
1 |
CUDA_VISIBLE_DEVICES=0 nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log </dev/null 2>&1 & |
如果您的实例上有 4 个 GPU 设备,您可以指定 CUDA_VISIBLE_DEVICES=0 到 CUDA_VISIBLE_DEVICES=3。
我预计这对于 Theano 后端会有效,但我只用 Keras 的 TensorFlow 后端测试过。
您可以在文章中了解更多关于 CUDA_VISIBLE_DEVICES 的信息
5. 在服务器上监控脚本输出
您可以在脚本运行时监控其输出。
如果您的脚本每个 epoch 或每次算法运行都输出一个分数,这可能会很有用。
此示例将列出脚本日志文件的最后几行,并在添加新行时更新输出。
1 |
tail -f script.py.log |
如果屏幕在一段时间内没有新输出,Amazon 可能会强制关闭您的终端。
另一种方法是使用 watch 命令。我发现 Amazon 会保持此终端打开
1 |
watch "tail script.py.log" |
我发现 Python 脚本的标准输出 (stout) 似乎不会频繁更新。
我不知道这是否是 EC2 的问题还是 Python 的问题。这意味着您可能不会经常看到日志中的输出更新。它似乎被缓冲,并在缓冲区达到固定大小时或运行时结束时输出。
您对此有更多了解吗?
在下面的评论中告诉我。
6. 在服务器上监控系统和进程性能
监控 EC2 系统性能是一个好主意。尤其是您正在使用和剩余的内存量。
您可以使用 top 命令来做到这一点,它会每隔几秒更新一次。
1 |
top -M |
如果您知道进程标识符 (PID),也可以监控系统和仅您自己的进程。
1 |
top -p PID -M |
7. 在服务器上监控 GPU 性能
密切关注 GPU 性能是一个好主意。
同样,如果您计划并行运行多个脚本并使用 GPU 内存,请密切关注 GPU 利用率、正在运行的 GPU 以及 GPU 内存使用情况。
您可以使用 nvidia-smi 命令来密切关注 GPU 使用情况。我喜欢使用 watch 命令,它会保持终端打开并为每个新结果清除屏幕。
1 |
watch "nvidia-smi" |
8. 检查服务器上仍在运行的脚本
密切关注哪些脚本仍在运行也很重要。
您可以使用 ps 命令来做到这一点。
同样,我喜欢使用 watch 命令来保持终端打开。
1 |
watch "ps -ef | grep python" |
9. 在服务器上编辑文件
我建议除非真的需要,否则不要在服务器上编辑文件。
尽管如此,您还是可以使用 vi 编辑器就地编辑文件。
下面的示例将在 vi 中打开您的脚本。
1 |
vi ~/script.py |
当然,您可以使用您喜欢的命令行编辑器,例如 emacs;这个提示实际上是为那些不熟悉 Unix 命令行的用户准备的。
如果您是第一次接触 vi,可以在此处了解更多信息
10. 从您的工作站下载服务器上的文件
我建议在脚本中显式地将模型和任何结果及图表保存到新的、独立的文件中。
您可以使用安全复制 (scp) 命令将这些文件从服务器实例下载到您的工作站。
下面是从您的工作站运行的示例,它会将您主目录中的所有 PNG 文件复制到您的工作站。
1 |
scp -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47:~/*.png . |
附加技巧和窍门
本节列出了一些在使用 AWS EC2 时需要注意的附加技巧。
- 同时运行多个脚本。我建议选择具有多个 GPU 的硬件,并同时运行多个脚本以充分利用平台。
- 仅在您的工作站上编写和编辑脚本。将 EC2 视为准生产环境,只在那里复制脚本和数据来运行。所有开发都在您的工作站上进行,并编写少量代码测试以确保其按预期工作。
- 显式将脚本输出保存到文件。将结果、图表和模型保存到可以稍后下载到您的工作站进行分析和应用的文件中。
- 使用 watch 命令。Amazon 会积极终止没有活动的终端会话。您可以使用 watch 命令来关注事物,该命令会足够频繁地发送数据以保持终端打开。
- 从您的工作站运行命令。上面列出的任何意图在服务器上运行的命令,也可以从您的工作站运行,方法是在命令前加上“ssh –i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47”并将您要运行的命令加上引号。这对于整天检查进程很有用。
总结
在本教程中,您发现了我在使用 GPU 的 AWS EC2 实例上训练大型深度学习模型时每次都会使用的 10 条命令。
具体来说,你学到了:
- 如何将数据复制到 EC2 实例或从 EC2 实例复制数据。
- 如何安全地设置您的脚本,使其可以运行数天、数周或数月。
- 如何监控进程、系统和 GPU 性能。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
Amazon Web Services 非常好,我也将该平台用于备份目的。这真是一篇非常有信息的博文。
谢谢,很高兴对您有帮助。
嗨 Jason,我另一个离不开的工具是 tmux。它允许您在同一个终端中轻松切换程序,并在退出终端时保持程序运行 (https://github.com/tmux/tmux/wiki)
太好了,谢谢 Primoz!
嗨,Jason,
感谢您的文章,非常有帮助。我正在使用的一项服务是 Amazon Batch,它可以自动化我想要使用 spot 实例进行的每一次训练。将其与 S3 和 docker 结合使用,可以省去处理代码和数据集的麻烦。只需要再多几个 DevOps 步骤,但我认为这是值得的:)
非常棒,感谢分享 Nicolas。
如果您将食谱整理好并在 GitHub 或其他地方发布,请告诉我。
听起来很令人兴奋,您能告诉我们您是如何设置它们的吗?
您能否推荐 Keras 函数/方法的 verbose 设置?我一直不明白 1、2 和 100 之间的区别。
另外,我注意到,如果我在 P2 机器上运行一个长时间运行的 Jupyter notebook 来运行 Keras 代码,它通常会断开连接。但是,如果我使用 verbose=2,那么深度学习任务将完成。您是否有关于在 AWS 上使用 Jupyter notebook 进行深度学习的其他建议?
考虑不要在 notebook 中运行。在工作站上进行开发,在服务器上运行代码。如果可能,避免在服务器上开发。
关于 Keras 中的 verbose 标志
0 – 无输出
1 – 进度条和 epoch 结束摘要
2 – 无进度条,仅 epoch 结束摘要。
非常感谢您每天向我发送邮件。我将在有空时跟着您学习 ML。
谢谢 Pony。
使用“python -u”启动 Python 可执行文件以避免缓冲输出。这样您就可以立即获得每个消息到 stdout。
好建议 DS,谢谢!
如果启动脚本时不使用 nohup,请使用“disown”命令告诉进程忽略挂断信号。运行“jobs”以查看要与“disown”一起使用的作业编号。
如果您启动脚本时不使用“&”,即它不在后台运行,您可以“Ctrl-Z”,然后输入“bg”将其置于后台。 “fg”将执行相反操作。
我不知道有任何方法可以在进程启动后重新附加 stdout/stderr。
有意思的方法,谢谢分享 DS!
您的文章总是恰到好处。是成为一名自学机器学习专家的完整资源。谢谢。
谢谢。
嗨,Jason博士,
我是 AWS 和云领域的新手。您能否建议一下:
1) 我们可以在 AWS 上运行 Python 脚本,并将数据源(csv 文件)指向我的本地机器吗?
2) 或者有没有一种方法可以将我的所有 csv 文件上传到 AWS 并检索它们?
3) 检索数据的命令是什么?
您的书对我帮助很大,谢谢您,请继续保持好工作!
技术上来说可以,但不要那样做。如果可能,让所有数据都本地化到模型。
是的,您可以上传 CSV。我在上面的文章中进行了说明。
同样,我在上面的文章中说明了如何下载。
我认为 ssh 对于这个受众来说是(或必须变成)微不足道的。我建议用如何配置 “.ssh/config” 来充实这一部分,以便更轻松、更安全地访问远程 Linux 服务器。
好建议。
这取决于,我的许多读者似乎仍然在运行命令行脚本方面遇到问题。
感谢这篇文章。终于明白了 nohup 的含义。
不客气。
很高兴听到这个消息。
嗨,Jason,
精彩的总结。
关于 9. 在服务器上编辑文件。我建议对于不太习惯 vi 的用户使用 nano 而不是 vi。Nano 更容易使用。
谢谢。
好建议。
这里一篇文章就提供了惊人的帮助!谢谢!
不客气,我很高兴它有帮助。
Jason,我是您的官方粉丝!感谢您为开发者世界做出的巨大贡献!
不客气!
非常感谢您提供这篇信息丰富的文章!
不客气。