我正致力于将基准测试报告编写为工作流程的一部分,我想要包含的其中一项内容是有关每项工作所需资源量的信息。
现在,我可以手动要求群集配置文件(' cluster.json')作为硬编码输入。但是,理想情况下,我希望能够访问通过--cluster-config arg传递的每规则集群配置信息。在 init .py中,可以将其作为名为cluster_config
的字典进行访问。
有没有办法直接将此dict导入或复制到规则中?
答案 0 :(得分:0)
从文档中看来,现在可以在将脚本提交到集群时使用自定义包装脚本来访问作业属性(包括集群配置数据)。这是来自the documentation的示例:
#!python
#!/usr/bin/env python3
import os
import sys
from snakemake.utils import read_job_properties
jobscript = sys.argv[1]
job_properties = read_job_properties(jobscript)
# do something useful with the threads
threads = job_properties[threads]
# access property defined in the cluster configuration file (Snakemake >=3.6.0)
job_properties["cluster"]["time"]
os.system("qsub -t {threads} {script}".format(threads=threads, script=jobscript))
在提交过程中(上一个示例的最后一行),您可以将所需的参数从cluster.json
传递到脚本,也可以将字典转储到JSON文件中,然后在该文件传递过程中将该文件的位置传递给脚本提交,然后解析脚本中的json文件。这是一个示例,我将如何更改提交脚本以执行后者(未经测试的代码):
#!python
#!/usr/bin/env python3
import os
import sys
import tempfile
import json
from snakemake.utils import read_job_properties
jobscript = sys.argv[1]
job_properties = read_job_properties(jobscript)
job_json = tempfile.mkstemp(suffix='.json')
json.dump(job_properties, job_json)
os.system("qsub -t {threads} {script} -- {job_json}".format(threads=threads, script=jobscript, job_json=job_json))
job_json
现在应该作为作业脚本的第一个参数出现。确保在作业结束时删除job_json
。
从对另一个答案的评论看来,您似乎只是在将job_json
与作业的输出一起存储。在这种情况下,可能根本没有必要将job_json
传递给作业脚本。只需将其存储在您选择的位置即可。
答案 1 :(得分:-1)
您可以根据规则轻松管理群集资源。
确实你有关键字“资源:”可以像这样使用:
rule one:
input: ...
output: ...
resources:
gpu=1,
time=HH:MM:SS
threads: 4
shell: "..."
您可以使用参数--cluster-config 来为群集提供的yaml配置文件指定资源,如下所示:
rule one:
input: ...
output: ...
resources:
time=cluster_config["one"]["time"]
threads: 4
shell: "..."
当你打电话给snakemake时,你只需要访问这样的资源(slurm集群的例子):
snakemake --cluster "sbatch -c {threads} -t {resources.time} " --cluster-config cluster.yml
它将为每个规则发送其特定的群集资源。
有关更多信息,您可以使用此链接查看文档: http://snakemake.readthedocs.io/en/stable/snakefiles/rules.html
祝你好运