【问题标题】:Snakemake trigger automatic job re-submission on slurm clusterSnakemake 在 slurm 集群上触发自动作业重新提交
【发布时间】:2020-11-20 13:49:56
【问题描述】:
我对一个非常具体的用例有疑问。我先介绍一下背景:
我正在尝试在 keras 中训练深度学习模型,并希望进行 10 折交叉验证以检查模型的训练稳定性。通常我会创建 snakemake 工作流并在 slurm 集群上执行它们。由于 GPU 节点有限,我想检查我的模型,停止工作并偶尔重新提交一次,以免阻塞 GPU。这样做的目标是使用短期运行的作业迭代地训练模型。
现在回答我的问题:
- 有没有办法重新提交作业一定次数/直到满足条件?
- 是否有另一种巧妙的方法来迭代训练模型而无需手动提交作业?
【问题讨论】:
标签:
keras
slurm
snakemake
checkpoint
【解决方案1】:
为此,您需要使用命令提交作业
llsubmit job.sh
应该多次执行 shell 脚本或批处理作业文件。工作完成后,资源可用。它会自动重新启动相同的脚本(您已经提交并在队列中等待)。
【解决方案2】:
以下是一些建议:
- 只需训练您的网络。由调度程序决定尽量不阻塞 GPU,运行 10 个短作业与 1 个长作业可能会导致相同的优先级。
- 您可以指定
--restart-times 来运行多次失败的作业。诀窍在于,snakemake 还会从失败的作业中删除输出。解决方法是将您的模型检查点到一个临时文件(不在规则的输出指令中)并退出您的训练并返回错误信号以向 snakemake 发出它需要再次运行的信号。不优雅的部分是您必须将重启设置为一个较大的值,或者确保您的训练代码知道它正在运行最后一次尝试并需要保存实际输出。您可以通过resource 获得尝试。我不确定该参数在其他指令中是否可用。任何失败的工作也将被重新提交;不是一个很好的发展选择。
- 您可以使您的检查点文件输出。这再次假设您要运行一定次数。你的规则都将寻找像
final.checkpoint 这样的文件,它依赖于10.checkpoint,它依赖于9.checkpoint 等等。有了一个足够奇特的输入函数,这可以在一个规则中实现,其中1.checkpoint 不依赖任何东西(或者可能依赖于您的训练数据)。