写完代码后,您必须在拥有大量 RAM、CPU 和 GPU 资源的计算机上运行深度学习实验,通常是在云端的 Linux 服务器上。
最近,有人问我一个问题:
“你是如何运行深度学习实验的?”
这是一个很棒的实际问题,我喜欢回答。
在本文中,您将了解我在 Linux 上运行深度学习实验所使用的方法、命令和脚本。
阅读本文后,你将了解:
- 如何设计建模实验并将模型保存到文件。
- 如何运行单个 Python 实验脚本。
- 如何通过 shell 脚本连续运行多个 Python 实验。
通过我新书《Python 深度学习》,开启您的项目,书中包含分步教程以及所有示例的Python 源代码文件。
让我们开始吧。

如何在Linux服务器上运行深度学习实验
照片作者:Patrik Nygren,部分权利保留。
1. Linux 服务器
我所有的建模代码都在我的工作站上编写,所有代码都在远程 Linux 服务器上运行。
目前,我倾向于在 EC2 上使用 Amazon Deep Learning AMI。有关为您的实验设置此服务器的帮助,请参阅以下文章:
2. 建模代码
我编写代码,使得每个 python 文件对应一个实验。
我主要处理大规模数据上的大型模型,例如图像字幕、文本摘要和机器翻译。
每个实验都会拟合一个模型,并将整个模型或仅权重保存到 HDF5 文件中,以便将来重复使用。
有关将模型保存到文件的更多信息,请参阅以下文章:
我试图准备一系列实验(通常是 10 个或更多)以一次性运行。我还试图将数据准备步骤分离到先运行的脚本中,并创建训练数据集的 pickled 版本,以便在可能的情况下加载和使用。
3. 运行实验
每个实验在训练期间可能会输出一些诊断信息,因此,每个脚本的输出都会重定向到一个特定于实验的日志文件中。我还重定向了标准错误,以防出现问题。
运行时,Python 解释器可能不会频繁刷新输出,特别是当系统负载很高时。我们可以使用 Python 解释器上的-u标志强制将输出刷新到日志中。
运行单个脚本(myscript.py)如下所示:
|
1 |
python -u myscript.py >myscript.py.log 2>&1 |
我可以创建一个“models”和“results”目录,并将模型文件和日志文件更新到这些目录中,以保持代码目录的整洁。
4. 运行批量实验
每个 Python 脚本都会按顺序运行。
会创建一个 shell 脚本,该脚本按顺序列出多个实验。例如:
|
1 2 3 4 5 6 7 8 |
#!/bin/sh # 运行实验 python -u myscript1.py >myscript1.py.log 2>&1 python -u myscript2.py >myscript2.py.log 2>&1 python -u myscript3.py >myscript3.py.log 2>&1 python -u myscript4.py >myscript4.py.log 2>&1 python -u myscript5.py >myscript5.py.log 2>&1 |
此文件将保存为“run.sh”,放在代码文件相同的目录中,并在服务器上运行。
例如,如果所有代码和 run.sh 脚本都位于“ec2-user”主目录的“experiments”目录中,则脚本将按如下方式运行:
|
1 |
nohup /home/ec2-user/experiments/run.sh > /home/ec2-user/experiments/run.sh.log </dev/null 2>&1 & |
脚本作为后台进程运行,不易中断。我也会捕获此脚本的结果,以防万一。
您可以在本文中了解有关在 Linux 上运行脚本的更多信息:
就是这样。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- 带源代码的深度学习 AMI (CUDA 8, Amazon Linux)
- 保存和加载您的 Keras 深度学习模型
- 如何在 Keras 中对深度学习模型进行检查点设置
- Amazon Web Services 上的深度学习 10 个命令行技巧
- 如何在 Amazon Web Services 上使用 Keras 开发和评估大型深度学习模型
总结
在本文中,您了解了我在 Linux 上运行深度学习实验所使用的方法、命令和脚本。
具体来说,你学到了:
- 如何设计建模实验并将模型保存到文件。
- 如何运行单个 Python 实验脚本。
- 如何通过 shell 脚本连续运行多个 Python 实验。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。






嗨,Jason,
感谢这篇文章!
命令:“2>&1”的目的是什么?
谢谢,
Elie
将 stderr 和 stdout 合并到 stdout 中
说得好!
不客气。
好问题。它将标准错误“2”重定向到标准输出“1”,实际上是对标准输出“&1”的引用。
感谢分享此文。您对在 Linux 上运行深度学习实验的方法、命令和脚本进行了很好的解释。
谢谢。