在 snakemake 的 slurm 资源指令中使用通配符

Using wildcards in slurm resources directive with snakemake

我正在使用 snakemake 创建规则并使用 slurm 在我们的 HPC 上提交作业。为了使输出“更漂亮”,我希望能够在资源指令中设置 job_name 参数,以便将使用的通配符集成到作业名称中。

例如...

datasets = ["bioethanol", "human", "lake"]

rule clean_data:
  input: 
    script="code/exmample.sh",
    data="data/{dataset}/input.txt"
  output:
    "data/{dataset}/output.txt",
  resources:
    job_name="{dataset}_clean_data"  
    cpus=8,
    mem_mb=45000,
    time_min=3000
  shell:
    """
    {input.script} {input.data}
    """

我有一个 config.yaml 文件,看起来像这样...

# cluster commands
cluster: "sbatch --job-name={resources.job_name}
          --account=my_account 
          --partition=standard 
          --nodes=1 
          --time={resources.time_min} 
          --mem={resources.mem_mb}
          -c {resources.cpus} 
          -o logs_slurm/%x_%j.out"

当我这样做时,创建的三个作业都被称为 {dataset}_clean_data,而没有插入实际的数据集名称来代替 {dataset}。有没有办法让工作名称改为 bioethanol_clean_datahuman_clean_datalake_clean_data

在你的资源指令中,你需要使用一个输入函数:

  resources:
    job_name=lambda wildcards: f"{wildcards.dataset}_clean_data"  

您可能 运行 遇到一些问题,必须记住将其包含在每个资源中。其他一些选项包括:

  • 将 slurm 输出转到 snakemake 日志文件,其中包括通配符。
  • 更改每个规则的 name 以包含通配符(未测试)
  • 在集群提交脚本中使用wildcards--job-name={rule}_{wildcards}

我倾向于使用日志,但在作业名称中使用通配符进行结帐。