'检查点文件'优化
概述
适用于Cromwell 55及以上版本。
此优化提供了一种缓解长时间运行任务在执行过程中被抢占的问题的方法。它允许用户定期在检查点保存任务的中间状态。中断后,任务可以从最后保存的检查点重新启动,从而避免需要重新运行整个计算过程。
描述
在任务的runtime部分指定checkpointFile值将设定一个检查点文件,该文件会每隔10分钟被定期复制到云存储中。如果作业被中断,在后续尝试时将自动恢复此检查点文件。成功生成最终输出后,检查点文件将被删除。
要有效使用此功能,WDL任务必须有意编写以利用检查点文件。请参阅以下示例。
对云服务费用的影响
任务运行期间存储检查点文件会产生费用,根据虚拟机与云存储桶的位置不同,它们之间的数据传输可能还会产生额外费用。不过这些成本应该很小,尤其是与工作虚拟机被抢占时能够从检查点恢复所带来的性能和成本优势相比。
由于检查点文件在任务成功完成后会被删除,因此任务完成后不会产生额外费用。然而,如果任务被中止或以其他方式从外部停止(例如通过中断Cromwell的运行),检查点文件将不会被删除,存储费用将持续无限期累积,直到手动删除该文件为止。
对调用缓存的影响
在决定是否调用缓存时,不会考虑checkpointFile属性的存在与否。
示例
以下WDL演示了checkpointFile优化功能的使用。它包含一个支持检查点的命令:
- 它首先尝试从
my_checkpoint文件恢复状态(如果检查点为空则从1开始) - 然后它会从1数到100,在每次计数时打印出当前的计数值和日期时间戳。
为了使检查点功能生效,runtime部分需指定checkpointFile: "my_checkpoint"。
version 1.0
workflow count_wf {
# Count to 2100 at 1/second => 35 minutes to complete, but
# luckily the state can be checkpointed every 10 minutes in
# case of preemption:
call count { input: count_to = 2100 }
}
task count {
input {
Int count_to
}
command <<<
# Note: Cromwell will stage the checkpoint file on recovery attempts.
# This task checks the 'my_checkpoint' file for a counter value, or else
# initializes the counter at '1':
FROM_CKPT=$(cat my_checkpoint | tail -n1 | awk '{ print $1 }')
FROM_CKPT=${FROM_CKPT:-1}
echo '--' >> my_checkpoint
for i in $(seq $FROM_CKPT ~{count_to})
do
echo $i $(date) >> my_checkpoint
sleep 1
done
>>>
runtime {
docker: "ubuntu:latest"
preemptible: 3
# Note: This checkpointFile attribute is what signals to Cromwell to save
# the designated checkpoint file:
checkpointFile: "my_checkpoint"
}
output {
# Note: This task also uses the checkpoint as its output. This is not
# required for checkpointing to work:
Array[String] out = read_lines("my_checkpoint")
}
}
后端支持
Cromwell支持以下后端上的checkpointFile属性:
- Google PAPIv2 (alpha1) 后端
- Google生命科学(测试版)后端