在 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_data
、human_clean_data
、lake_clean_data
?
在你的资源指令中,你需要使用一个输入函数:
resources:
job_name=lambda wildcards: f"{wildcards.dataset}_clean_data"
您可能 运行 遇到一些问题,必须记住将其包含在每个资源中。其他一些选项包括:
- 将 slurm 输出转到 snakemake 日志文件,其中包括通配符。
- 更改每个规则的
name
以包含通配符(未测试)
- 在集群提交脚本中使用
wildcards
--job-name={rule}_{wildcards}
我倾向于使用日志,但在作业名称中使用通配符进行结帐。
我正在使用 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_data
、human_clean_data
、lake_clean_data
?
在你的资源指令中,你需要使用一个输入函数:
resources:
job_name=lambda wildcards: f"{wildcards.dataset}_clean_data"
您可能 运行 遇到一些问题,必须记住将其包含在每个资源中。其他一些选项包括:
- 将 slurm 输出转到 snakemake 日志文件,其中包括通配符。
- 更改每个规则的
name
以包含通配符(未测试) - 在集群提交脚本中使用
wildcards
--job-name={rule}_{wildcards}
我倾向于使用日志,但在作业名称中使用通配符进行结帐。