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

Snakemake如何基于前置规则生成的CSV参数批量运行Papermill

解决Snakemake动态参数组合+Papermill批量跑Notebook的问题

核心思路

Snakemake默认要求初始化时就得明确所有目标,但你这种先生成CSV再提取参数的动态场景,得用checkpoint来破局——先跑完生成CSV的前置步骤,再基于结果动态生成后续要执行的Notebook目标,完美绕开初始化阶段不知道参数列表的限制。

步骤1:写生成参数CSV的基础规则

先把生成params.csv的规则搭好,替换成你实际生成CSV的命令就行:

rule generate_params_csv:
    output:
        "params.csv"
    shell:
        """
        # 这里换成你生成CSV的真实逻辑,比如从数据库拉取、脚本生成等
        echo "number,word" > {output}
        echo "1,apple" >> {output}
        echo "2,banana" >> {output}
        echo "1,apple" >> {output}  # 故意加重复行测试去重效果
        echo "3,apple" >> {output}
        """

步骤2:用Checkpoint提取去重参数组合

搞个checkpoint读取生成好的CSV,提取去重的numbers和words列表,再生成所有参数组合对应的Notebook输出路径,把这些路径写到临时文件里:

checkpoint extract_params:
    input:
        "params.csv"
    output:
        temp("param_combinations.txt")  # temp标记会让Snakemake自动清理这个临时文件
    script:
        "extract_params.py"

对应的extract_params.py脚本实现:

import pandas as pd
from itertools import product

# 读取生成的CSV文件
df = pd.read_csv(snakemake.input[0])
# 提取去重后的参数列表
numbers = df["number"].unique().tolist()
words = df["word"].unique().tolist()
# 生成所有参数组合
combinations = list(product(numbers, words))

# 为每个组合生成对应的Notebook输出路径,格式可自定义
output_paths = [f"notebooks/output_{num}_{word}.ipynb" for num, word in combinations]

# 将路径写入临时文件,供后续规则读取
with open(snakemake.output[0], "w") as f:
    f.write("\n".join(output_paths))

步骤3:让all规则动态获取目标

写个函数读取checkpoint生成的临时文件,把所有要运行的Notebook路径提取出来,这样all规则就能动态引用这些目标:

def get_notebook_targets(wildcards):
    with open(checkpoint.extract_params.output[0]) as f:
        return [line.strip() for line in f if line.strip()]

rule all:
    input:
        get_notebook_targets

步骤4:写Papermill批量运行Notebook的规则

最后写个规则,用通配符匹配每个参数组合,调用Papermill执行模板Notebook:

rule run_notebook:
    input:
        template="notebooks/template.ipynb",  # 你的Jupyter Notebook模板文件
        params_csv="params.csv"  # 依赖CSV文件,确保生成后再执行Notebook
    output:
        "notebooks/output_{number}_{word}.ipynb"
    params:
        number="{number}",
        word="{word}"
    shell:
        """
        papermill {input.template} {output} -p number {params.number} -p word {params.word}
        """

关键细节说明

  • Checkpoint的作用:绕过Snakemake初始化阶段必须明确所有目标的限制,先执行参数生成步骤,再将结果反馈给工作流,动态生成后续任务。
  • 去重逻辑:借助pandas的unique()方法直接提取去重后的参数列表,简单高效。
  • 通配符匹配:run_notebook规则中的{number}和{word}会自动对应输出路径中的内容,Snakemake会自动将每个参数组合映射为独立的运行任务。

运行测试

直接执行snakemake --cores 4(cores数根据你的机器配置调整),工作流会按以下顺序执行:

  1. 运行generate_params_csv生成params.csv
  2. 执行checkpointextract_params提取参数组合并生成目标路径列表
  3. 动态更新all规则的输入,为每个参数组合运行run_notebook

内容的提问来源于stack exchange,提问作者Michele Peresano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:33:23