【问题标题】:SnakeMake rule with Python script, conda and cluster使用 Python 脚本、conda 和集群的 SnakeMake 规则
【发布时间】:2017-08-21 16:15:25
【问题描述】:

我想让 snakemake 通过 SGE 集群在特定的 conda 环境中运行 Python 脚本。

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

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

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

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

【问题讨论】:

  • 快速回答:是的,--use-conda 也会触发集群作业中的 conda 使用。为了让 miniconda 在一般情况下“轻松”工作,它应该在 PATH 中。

标签: python conda sungridengine snakemake


【解决方案1】:

我有一个现有的 Snakemake 系统,在 SGE 集群上运行 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 创建环境。我没有网络讨论的链接,但我相信我在某个地方读到过那些只依赖 Snakemake 创建环境而不是从基础环境启动的人,他们发现环境存储在 /. snakemake 目录,并且它变得过大。随意寻找帖子。该问题已由减少隐藏文件夹负载的作者解决,但我认为从现有的 Snakemake 环境启动作业更有意义,该环境与您的头节点交互,然后将相应的环境变量传递给它是子节点。我喜欢有点层次感。

话虽如此,如果您从头节点的环境运行 Snakemake 并让 Snakemake 通过qsub 与 SGE 作业调度程序交互,您可能需要将环境传递给您的子节点。我实际上使用的是内置的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 格式放在一个单独的文件中。上面的代码 sn-p 可以在 I've done personally 这个例子中找到。我的组织方式与tutorial 略有不同,但那是因为我需要更多的粒度。

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

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

【讨论】:

  • 非常有帮助,谢谢。我不喜欢使用 .bashrc 将 conda 放在我的路径上,因为我发现它破坏了许多系统二进制文件,导致其他工具中断,但是我想如果我手动将 conda 放在路径上以激活我的 snakemake 环境,那么将 -V 标志与 qsub 一起使用,.bashrc 中应该不需要?
  • 如上所述,我认为您不需要编辑 .bashrc,但是,如果可能的话,我鼓励您将一切都置于 conda 控制之下。我鼓励将其作为研究目的的黄金标准,因为它可以打包和分发。对我来说,我所做的一切都与管道相关,因此,我编辑我的 .bashrc 以获得全局效果。使用 conda 不支持的软件的多面用户可能会使用您建议的方法,即为特定终端会话和后续管道执行设置环境
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多