題:
在一個單獨的conda env中運行Snakemake
Freek
2019-01-31 21:17:35 UTC
view on stackexchange narkive permalink

我最近在Snakemake上進行了很多實驗,我喜歡它。最近,我還改用廣告方式使用conda(--use-conda)。但是,我有一些問題,主要與我們的工作方式有關。我在一個實驗室中工作,該實驗室不僅處理序列器的數據,而且還處理外部數據集的數據,而且有多個人使用我的管道。

因此,對於conda來說,這意味著:目前我有5個環境,平均每個環境1.5 GB env,這大約需要20分鐘的設置時間,並且需要提取大量數據。尤其是由於每次有人分析數據時都會將其拉低(一天有時多次)。感覺這很浪費資源。另外,我在yaml文件中修復了某些軟件包版本,但是肯定不是全部(我閱讀的repos改頭換面時,這可能會導致問題),因此,我也不能保證長期的確切環境(例如,多年來,依賴項可能會改變/ update)。

因此,我正在考慮切換到中央conda env,出於可重現性的考慮,我將其版本化並導出所有已安裝軟件包的列表。然後,它將包含所有工具。

我的問題是,有沒有很好的方法?我之前在每個shell命令中放置“源代碼激活”行(以及如何在“運行”下對Python代碼執行此操作)時遇到問題,請參見: https://stackoverflow.com/questions/54024862/ snakemake-conda-env參數不是從配置yaml文件中獲取的。

所以,有一種方法,即使在使用qsub集群時,也總是一個特定的conda env,對於您所做的一切?

三 答案:
finswimmer
2019-02-01 14:21:12 UTC
view on stackexchange narkive permalink

一個好的做法是提供 yml 文件以及您的 Snakefile 。該文件應包含運行管道所需的所有環境定義。該文件的最小內容是安裝 snakemake 本身。管道中使用的任何其他程序也應包括在內。為了獲得可複制性,必須使用版本號。

因此,如果有人想使用您的管道,他首先會根據您的定義創建一個新的環境:

  $ conda env create -f my_pipeline.yml  

然後激活此環境並運行管道:

   $ conda activate my_pipeline $  span> snakemake  

Snakefile 中的 conda 指令僅在需要使用以下程序時才需要依賴關係無法在主環境中解決。如果使用-use-conda 參數啟動snakemake,snakemake將基於提供的定義文件創建一個新環境,並為該規則激活它。

尤其因為每次有人分析數據時都會將其拉下(一天有時多次)。

環境創建僅執行一次。如果您第二次運行管道,則 snakemake 可以直接激活環境,而無需再次下載並安裝某些東西。

我前段時間寫的 tutorial有關 snakemake conda 的生​​物之星可能對您有用。

嗯,聽起來不錯,我看到“ run:”部分也不支持conda env,因此您確實需要主env才能擁有所有內容。我現在正在測試,thanx。一切正常時,將標記為已接受答案。
Sebastian Müller
2019-02-01 19:07:09 UTC
view on stackexchange narkive permalink

僅使用-use-conda 指令,snakemake將環境複製到本地 .snakemake 目錄中的某個位置。對於在其中運行的每個目錄都會重複此步驟,並有效地為每個數據集複製所有環境。

不過,您可以使用-conda-prefix 告訴snakemake使用共享的環境位置。如此處所述:

指定在其中創建“ conda”和“ conda-archive”目錄的目錄。它們分別用於存儲conda環境及其存檔。如果未提供,則將值設置為相對於調用目錄的“ .snakemake”目錄。如果提供,還必須設置–use-conda標誌。該值可以作為相對路徑(將被外推到調用目錄)或作為絕對路徑給出。

這樣,您只能下載/複製一次環境並共享它,例如這樣:

  snakemake --use-conda --conda-prefix / path / to / shared / environment  
是的,這就是我一直在尋找的,非常感謝。這樣,我仍然可以創建多個環境,但是它們只能創建一次並可供所有人使用。
--conda應該替換為--use-conda。據我所知,snakemake不支持前者(https://github.com/snakemake/snakemake/blob/master/snakemake/__init__.py)。
您是完全正確的,這可能在新版本中已更改。我已將其替換,鏈接也已更新。謝謝你的指導
Devon Ryan
2019-02-01 14:42:24 UTC
view on stackexchange narkive permalink

在您的Snakefile中,您可以為每個規則提供相同的 conda:指令。如果將管道安裝在中央位置,並且在運行時讓每個人都使用相同的conda(提示:使用將路徑設置為conda的包裝器腳本),那麼每個人都將使用相同的環境。這樣做的另一個好處是,您可以使每個人都可以讀取此文本,但不允許他們進行任何修改(這樣用戶就不會搞亂了)。

我們採取的策略是擁有一個基本的在使用具有衝突依賴關係的工具制定規則的情況下,使用snakemake和其他命令進行conda env,然後針對各種管道(及其版本(如果您的YAML文件中的軟件版本已更改)及其版本)分別分隔環境。最終,這對於更複雜的管道來說相當方便,儘管如果您只想擺脫一個環境,​​那麼finswimmer的答案就更簡單了。

順便說一句,這正是 snakePipes的工作方式。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...