【问题标题】:Safely shut down snakemake programmatically以编程方式安全关闭snakemake
【发布时间】:2022-10-14 23:56:19
【问题描述】:

我正在寻找一种以编程方式关闭/退出/停止正在运行的蛇形工作流的方法 - 本质上是使用在工作流中调用的 python 函数,但可能会遇到无法恢复的错误,需要停止工作流以进行人工干预。

我实际上正在尝试做的事情:我在 GPU 节点上启动(guppy basecaller)作业,并且必须在命令中指定要使用的 cuda 核心。该函数检查是否存在锁定文件以指定哪些内核正在使用以及哪些可用。这些文件是作为 basecaller 的 shell 命令的一部分创建和删除的。使用资源时,并行 gpu 作业的数量受限于可用的核心数量。这可行,但我希望能够捕捉到意想不到的问题,例如gpu_lock 文件被删除或未清理。

在工作流中调用该函数以指定参数,例如作为下面的假人:


def get_fromel(wildcards):
  if some_number < 0.05:
    sys.exit("yieeeks")
  else:
    return "hiyaaa"

rule foo:
  input: bar.txt
  output: baz.txt
  params: 
     fromel = get_fromel
  shell:
     "fizz -f {params.fromel} {input} > {output}


我只是打电话给sys.exit("my message")吗?我担心它不会清理不完整的文件等

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    Wouter 编辑后的更新:

    据我了解,snakemake 在 DAG 构建期间评估fromel = get_fromel,因此在开始任何工作之前。它还会在实际执行作业时对其进行评估,但必须执行 shell 指令。无论哪种方式,都不应该有挂起的损坏文件。

    在任何情况下,我都会编写一个玩具蛇文件来检查蛇的行为是否符合您的预期。


    也许您应该详细说明您要达到的目标,以便获得更准确的答案。无论如何,如果您将sys.exit() 放入规则中,如下所示:

    rule all:
        input:
            'done.txt',
    
    rule one:
        output:
            'done.txt',
        run:
            import random
            shell('touch {output}')
            x = random.random()
            if x < 0.5:
                sys.exit('Exiting')
    
    

    如果x &lt; 0.5,则规则将以编程方式退出(失败)。 Snakemake 将让正在运行的作业完成并清理由规则one 生成的文件,因为它们可能已损坏。

    另一方面,如果您将 sys.exit() 放在规则之外,例如:

    rule all:
       ...
    rule one:
       ...
    
    sys.exit()
    

    那么管道根本不会启动,因为它会在开始任何工作之前达到sys.exit

    请注意,您需要 snakemake >= 7.15.2 才能查看 run 指令产生的错误(在 v7.8 前后引入的错误)​​。

    此外,sys.exit() 会给你一个丑陋的堆栈跟踪。我隐约记得有一个黑客可以解决它,如果这让你感到困扰,我可以尝试挖掘它。

    【讨论】:

    • 谢谢!我已经用更多信息更新了我的问题,我会在规则调用的函数中调用 sys.exit() 来设置参数...
    【解决方案2】:

    与其调用sys.exit(),不如在您的python 函数中引发异常并让Snakemake 自行停止?像这样,其他正在运行的作业将完成,Snakemake 将正确清理所有内容。

    def get_fromel(wildcards):
      if some_number < 0.05:
        raise Exception("Something went wrong")
      else:
        return "hiyaaa"
    
    rule foo:
      input: "bar.txt"
      output: "baz.txt"
      params: 
         fromel = get_fromel
      shell:
         "fizz -f {params.fromel} {input} > {output}"
    
    

    在您提供的示例中,如果some_number < 0.05,则 Snakemake 甚至不会开始运行。但是,如果检查是动态的并且取决于您工作流程中的文件,那么这应该可以工作。

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 2010-12-15
      • 1970-01-01
      • 2015-08-10
      • 2013-08-08
      • 2015-03-17
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多