3

我正在编写作为工作流程的一部分的基准测试报告,我想包括的一件事是有关每个作业请求的资源量的信息。

现在,我可以手动要求集群配置文件('cluster.json')作为硬编码输入。不过,理想情况下,我希望能够访问通过 --cluster-config 参数传递的每条规则集群配置信息。在init .py 中,这是作为一个名为cluster_config.

有没有办法将这个字典直接导入或复制到规则中?

4

2 回答 2

0

从文档中可以看出,您现在可以在将脚本提交到集群时使用自定义包装脚本来访问作业属性(包括集群配置数据)。这是文档中的一个示例:

#!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给脚本,或者将 dict 转储到 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给作业脚本。只需将其存放在您选择的位置即可。

于 2019-01-30T11:21:34.130 回答
-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

此致

于 2017-06-28T14:56:55.290 回答