You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:06:03