Galaxy Deployment 一個處理生物資料的平台架設

linnil1
12 min readMay 6, 2021
Logo of Galaxy https://galaxyproject.github.io/static/galaxyproject.png

What is Galaxy

Galaxy is an open, web-based platform for accessible, reproducible, and transparent computational research.

Galaxy 是一個開源的、網頁操作的計算平台

Github:

Wiki:

https://en.wikipedia.org/wiki/Galaxy_(computational_biology)

當然,可以用公開的伺服器,他們都有免費額度可以用 https://galaxyproject.org/use/

Architecture 架構圖

故事是這樣的,我們今天想要在我們學校裡架一個 Galaxy ,除了讓合作變得更方便外,也讓我們的主機群資源可以被更多人使用,雖然目前只服務校內。對象尤其是其他 LAB 對於 command line 不熟悉的人,雖然我們也不敢說我們熟悉到哪裡去。

Galaxy Architecture

Main 主程式

Galaxy 跟任何大程式一樣,分成前端後端

* 前端由 Vue 寫成 (galaxy/client/)

* 而後端 是由 Python 寫成,從登入到工具管理都是,總之你可以想成等下沒介紹的都是這個主程式負責的

官方推薦使用 conda 管理套件環境,環境分成兩塊

  1. 第一塊是網頁所需要的,主要以 python packages 居多
  2. 第二塊是生物資訊工具所需要的,會跟著 ToolShed(https://toolshed.g2.bx.psu.edu/) 一起安裝

雖然很多零件,但是官方很好心,只要下 ./galaxy/run.sh ,然後前端就會 build 好,需要的環境跟 packages 都會裝好,後端也會自行啟動。

所以我們只需要了解如何設定 config 就好了,其實我改的設定中有一大部分是改路徑位置,讓自己好管理。

Tool shed 生物資訊工具

Tool shed 就是除了幫你使用 conda 安裝所需的工具與其 dependency 外,還會幫你管理邪惡的版本問題,方便不少,而且這樣別人 reproduce 你的結果是比較容易的。

Galaxy 工具安裝介面

Galaxy ToolShed 把每個工具模組化,事實上是使用 XML 把參數包好(可以參考 https://github.com/galaxyproject/tools-iuc) ,galaxy 讀取後會變成網頁。所以使用者只要動動手指在網頁上點擊,就可以設定參數,最後按下 execute(執行)。當你有新的工具官方沒有時,就需要自己寫這塊。

Galaxy 工具參數設定與執行介面

Job History

右側欄位會存放任何你弄出來的東西,比如說你上傳的 fastq 檔,跑完 fastqc 的結果檔跟其參數與版本。

如果成功執行,右側欄位顏色為 success 的綠色,點下後有更多選項,比如說下載檔案、看指令、看參數、重跑。

Prebuilt Index

Galaxy 還有一個很厲害的地方,他用一個超大 4TB 的雲端空間放置所有 reference data,比如說最常用的是 hg38 的 bowtie index, bwa index 等等。這裡的空間使用多個 stratum 1 replica servers 做資源分配,能降低單個伺服器的 loading,可靠性更高(參考 https://cvmfs.readthedocs.io/en/stable/cpt-replica.html),我們可以 mount 他們的 CernVM-FS (CVMFS) 就可以輕鬆的連結,可以想像成雲端硬碟,不佔你的空間。

裡面會有兩層個重要設定,第一個是列出每個工具的 .loc 的位置,每個.loc又會列出那個工具現在有 built 好的 Index 的位置,然後工具們(bwa, bowtie)會從那個位置找相關附檔名的位置,比如說 bowtie2 會吃 .*.bt2

Galaxy cvmfs relationship

參考 https://galaxyproject.org/admin/reference-data-repo/

如果你的空間夠,bottleneck 在網速的話,你可以用 rsync 把資料直接放到 server ,然後可以改 *.loc 把沒有下載的 genome comment 掉,然後一樣要重開 Galaxy(這是最麻煩的,很多設定 Galaxy 不會自己 reload),你就可以在 Galaxy 介面使用了:

Using reference genome in bowtie2 on Galaxy

PBS

Portable Batch System (PBS) 是一個工作的排程系統,最重要的是可以用在 cluster 上。也就是說,你有很多台機器,各有不同的規格(cpu, ram),你只要提供你有多少個程式要跑多大的資源,PBS 會自己幫你安排工作(job)。通常會用在 HPC(High Performance Computing) 的 cluster 上,比如說國網

我們這裡略過架 PBS (這裡用的是 TORQUE https://github.com/adaptivecomputing/torque),直接跳到使用方式:

[galaxy@galaxy ~]$ cat testpbs.sh
#PBS -o /test/test.stdout
#PBS -e /test/test.stderr
#PBS -q worker
#PBS -l walltime=1:00:00,select=1:ncpus=1:mem=2gb
sleep 10
echo "Hi"
echo $PWD > /test/pwd
[galaxy@galaxy ~]$ qsub testpbs.sh
137729
[galaxy@galaxy ~]$ qstat
Job id Name User Time Use S Queue
------ ----- ------ -------- - ------
137729 test1 galaxy 00:00:00 R worker
137735 test2 galaxy 00:00:00 Q worker
[galaxy@galaxy ~]$ cat /test/test.stdout
Hi
[galaxy@galaxy ~]$ cat /test/pwd
/test/

最重要的兩個指令為: qsub, qstat

  • qsub: submit your job 上傳你的程式,在 script 最上面定義所需要的資源:
  • * walltime 是預計需要跑的實際時間
  • * ncpus 是所需要跑的 CPU 數
  • * mem 是記憶體大小
  • qstat: show the status of jobs 顯示工作狀態
  • * Q 是 Inqueue 排隊中
  • * R 是 Running 執行中
  • * 如果結束的話,就會消失,並不會有 Done(在我們 PBS 是這樣)

Galaxy 連結 PBS

Galaxy 其實提供很多模組可以跟 PBS 的系統串,因為 PBS 也有很多種,https://docs.galaxyproject.org/en/latest/admin/cluster.html

我們就選最適合的模組 SlurmTorque,他就是直接在 shell 執行 qsub qdel qstat的指令,在 galaxy/config/job_conf.xml 可以設定,如下,我們定義一個 pbs_standard這個規格當作 default,如果想要某些工具更大的資源時,可以再定義 pbs_large 然後在 tools 中指定哪些工具需要。

job_conf.xml in Galaxy

這裡有個小細節是 galaxy 除了讀取 Resource_List 外,會分析裡面的內容,你定義這裡有 ncpus=8 ,他會知道你有 8 個 processes ,然後變成 GALAXY_SLOTS=8 這個環境變數丟下去跑。按 details 可以看到 job 的 command line:

bowtie2 -p ${GALAXY_SLOTS:-4} -x 'genome' ...

Nginx

我們在 Galaxy server 跟使用者之間,會用 Nginx 這個 web server 來做連接,尤其是 Python。我畫在架構圖最上方的位置。

Python 的 web 通常有兩種形式

第一個是套件自己本身的 webserver,比較屬於 debug 用

第二個是套件以 uWSGI (Web Server Gateway Inteface) 這個標準介面讓 Nginx/Apache2 來溝通

通常會選第二種的理由很簡單,

  1. Nginx 處理 statics 的東西是比較快的(css, html, media),你的程式只負責動態邏輯的部分
  2. Nginx 處理 load balancing 都比較容易,比如說多個 backend 在同個 domain 下運行
  3. Nginx 號稱自己高效能、安全、可靠

所以很多應用其實外面都會套一層 Nginx,這非常的正常。

對 Galaxy 而言 Python 後端設定也很簡單 galaxy.yml

uwsgi:
# http: 0.0.0.0:80
socket: 127.0.0.1:5555

/etc/nginx.conf

location / {
uwsgi_pass localhost:5555;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME /;
}

這篇描述得很清楚說明為什麼用 uwsgi 的理由 https://www.fullstackpython.com/wsgi-servers.html

Database

這裡用 PostgreSQL,這應該沒什麼問題,假設你用 psql 連進去後,可以看目前的 user 設定

galaxy=# SELECT id,email,username,password FROM galaxy_user;
id | email | username | password
----+----------------------+-----------+------------------------------------------------------------------------
1 | linnil1@ntu.edu.tw | linnil1 | PBKDF2$sha256$100000$1111122222333334$111112222233333444445555566666

(Optional) RabbitMQ

Galaxy 主程式需要有一個跨 threads 的溝通工具,預設是用 database 來做溝通,但其實可用 RabbitMQ 這種 message broker,甚至可以做到 high-scale, high-availability ,雖然現在使用量不大,看不出差異就是了。

詳情設定在 https://docs.galaxyproject.org/en/latest/admin/config.html#amqp-internal-connection

FTP

Galaxy 推薦 proftpd ,我猜原因是 SQL authentication 的方便,也就是連 database 的 galaxy_user 這個 table,找到儲存的密碼來做登入。當然要支援 galaxy 預設的加密方式(PBKDF2)。

所以 Galaxy 跟 FTP 兩個服務是分開的,其中一邊掛了並不影響另一邊,除非 database 掛了(參考架構圖)。

Part of proftpd.conf related to database

詳細設定 https://docs.galaxyproject.org/en/latest/admin/special_topics/ftp.html

你接下來就可以從 ftp 上傳,這裡示範用 lftp 的 put 上傳檔案

[galaxy@galaxy ~]$ lftp your.ip -p 21 -u linnil1  -e "set ftp:ssl-allow yes"
Password:
lftp linnil1@my.ip:~> lslftp linnil1@my.ip:/> put testpbs.sh
228 bytes transferred
lftp linnil1@my.ip:/> ls
-rw-r--r-- 1 linnil1 linnil1 228 May 3 14:22 testpbs.sh

然後使用者上傳的資料都會放在 /test/ftp/{name} (proftpd.conf),在 galaxy 設定中指定讀取這個路徑就好了(galaxy.yml)

在 Galaxy 的上傳頁面中,點 Choose From FTP,就可以看到剛剛上傳的東西

Upload Page In Galaxy

Conclusion

這是我在台大記中邊蓋的 Galaxy 邊理解的故事,當然吃到很多設定錯誤,不過終於做完了,寫個文章做做紀念。

這是部分的 code https://github.com/linnil1/galaxy-setup

如果要使用我們的服務的話,可能要聯絡我們老師,或者記中。

喜歡文章的話,按下 claps 支持作者

--

--

linnil1

目前做生物資訊與演算法,過去做過 Machine Vision(Deep learning),維護伺服器(k8s, docker),部分IOT(rpi, arduino)