使用 Python 脚本、conda 和集群的 SnakeMake 规则

SnakeMake rule with Python script, conda and cluster

我想通过 SGE 集群获取 snakemake 运行ning 具有特定 conda 环境的 Python 脚本。

在集群上,我的主目录中安装了 miniconda。我的主目录是通过 NFS 安装的,因此所有集群节点都可以访问。

因为miniconda在我的home目录下,conda命令默认不在操作系统路径下。即,要使用 conda,我需要首先明确地将其添加到路径中。

我有一个 conda 环境规范作为 yaml 文件,可以与 --use-conda 选项一起使用。这也适用于 --cluster "qsub" 选项吗?

FWIW 我也使用 conda 环境启动 snakemake(实际上我想要 运行 脚本的相同环境)。

我在 SGE 集群上有一个现有的 Snakemake 系统,运行ning conda。这是令人愉快的,而且非常可行。我会尽力提供观点和指导。

你的 miniconda 的位置,本地的或共享的,可能无关紧要。如果您使用登录名访问集群,您应该能够在登录时更新默认变量。这将产生全局影响。如果可能,我强烈建议编辑默认值.bashrc 中的设置来完成此操作。这将在登录时正确自动地设置您的 conda 路径。

我文件中的一行,"home/tboyarski/.bashrc"

 export PATH=$HOME/share/usr/anaconda/4.3.0/bin:$PATH

编辑 1 评论中提出的要点

就个人而言,我认为将所有内容置于 conda 控制之下是一种很好的做法;但是,对于通常需要访问 conda 不支持的软件的用户来说,这可能并不理想。通常支持问题与使用旧操作系统有关(例如,最近放弃了对 CentOS 5 的支持)。正如评论中所建议的,在单个终端会话中手动导出 PATH 变量对于不专门使用管道的用户来说可能更理想,因为 这不会产生全局影响。

话虽如此,就像我在执行 Snakemake 之前一样,我建议初始化大多数或整个管道使用的 conda 环境。我发现这是首选方式,因为它允许 conda 创建环境,而不是让 Snakemake 要求 conda 创建环境。我没有网络讨论的 link,但我相信我在某个地方读到过那些只依赖 Snakemake 来创建环境而不是从基础环境中启动的人,他们发现环境正在被存储在 /.snakemake 目录中,并且它变得过大。随意寻找 post。该问题已由减少隐藏文件夹负载的作者解决,但我仍然认为从现有的 Snakemake 环境启动作业更有意义,该环境与您的头节点交互,然后将相应的环境变量传递给它是子节点。我喜欢有点层次感。

话虽如此,如果您从头节点的环境中 运行ning Snakemake 并让 Snakemake 通过 qsub. I actually use the built-in DRMAA feature,我强烈推荐。两种提交媒介都要求我提供以下论据:

   -V     Available for qsub, qsh, qrsh with command and qalter.

         Specifies that all environment variables active within the qsub
          utility be exported to the context of the job.

还有...

  -S [[hostname]:]pathname,...
         Available for qsub, qsh and qalter.

         Specifies the interpreting shell for the job.  pathname must be
          an executable file which interprets command-line options -c and
          -s as /bin/sh does.

为了给你一个更好的起点,我还指定了虚拟内存和核心数,这可能是我的 SGE 系统特有的,我不知道。

-V -S /bin/bash -l h_vmem=10G -pe ncpus 1

我非常希望您在提交 SGE 集群时需要这两个参数,就像我个人所做的那样。我建议将您的集群提交变量以 JSON 格式放在一个单独的文件中。上面的代码片段可以在 I've done personally. I've organized it slightly differently than in the tutorial 的示例中找到,但那是因为我需要更多的粒度。

就我个人而言,我只在 运行 与我用来启动和提交 Snakemake 作业的环境不同的 conda 环境中使用 --use-conda 命令。例如,我的主要 conda 环境 运行s python 3,但是如果我需要使用一个工具,需要 python 2,那么我将并且只有在那时才使用 Snakemake 启动一个规则,具有该特定环境,以便该规则的执行使用对应于 python2 安装的路径。这对我的雇主来说非常重要,因为 我要替换的现有系统很难在 python2 和 3 之间无缝切换,使用 conda 和 snakemake,这非常容易。

原则上,我认为这是启动基础 conda 环境并从那里 运行 Snakemake 的好做法。它鼓励对整个 运行 使用单一环境。保持简单,对吧?仅在必要时才使事情复杂化,例如需要在同一管道中 运行 同时 python2 和 python3 时。 :)