Snakemake如何显式处理OOM故障 实现类似NextFlow的内存错误重试策略?
Snakemake 7.0及以上版本支持基于退出码的条件重试,完全可以实现仅内存相关错误触发重试、其余错误直接终止的效果,和NextFlow的对应配置能力对齐。
方式一:规则级直接配置(推荐,Snakemake 7.12+版本支持)
这是最简洁的实现方式,直接在规则内指定重试触发的退出码范围即可:
def get_mem_mb(wildcards, attempt): # 对应NextFlow示例的2G每次重试翻倍,单位为MB return attempt * 2048 rule your_rule_name: input: ... output: ... resources: mem_mb=get_mem_mb max_retries: 3 # 单任务最多重试3次,和NextFlow的maxRetries作用一致 # 仅命中内存相关退出码时触发重试 retry_on: [137, 138, 139, 140] shell: "..."
方式二:全局错误钩子配置(兼容旧版本,支持更复杂逻辑)
如果使用7.12之前的版本,或者需要自定义更复杂的错误判断逻辑,可以注册全局错误处理钩子实现:
def get_mem_mb(wildcards, attempt): return attempt * 2048 def error_handler(exception, job): exit_code = exception.returncode # 仅内存相关退出码且未达最大重试次数时触发重试 if exit_code in [137,138,139,140] and job.attempt < 3: return "retry" # 其余错误直接终止 else: return "terminate" # 注册全局错误处理钩子 onerror: error_handler rule your_rule_name: input: ... output: ... resources: mem_mb=get_mem_mb shell: "..."
集群执行注意事项
使用LSF、Slurm等集群调度器时,无需额外配置即可默认透传作业真实退出码,OOM对应的137~140区间退出码可以被正常识别。如果出现退出码识别异常,可检查集群提交命令的配置,确保返回值为作业执行的退出码而非提交命令本身的退出码。
内容的提问来源于stack exchange,提问作者pmb59
相关产品推荐
相关产品推荐

