macでインフォマティクス

macでインフォマティクス

NGS関連のインフォマティクス情報についてまとめています。

バイオインフォマティクスのツールを再現性よく実行するためのコンテナ仮想化ツール群 BioContainers

2018 10/2 誤字修正

2018 11/4 追記

 

 バイオインフォマティクスは、新しいアルゴリズムの開発、複雑なパイプラインへの様々なツールの接続(Perez-Riverol et al、2014)、それらの蓄積と普及により、システム生物学の機能と振る舞いの理解への重要な貢献をしている。これらの開発は、単一のツールと個別ツールからOpenMS(Röstet al、2016)、Taverna(Wolstencroft et al、2013)、Galaxy(Afgan et al、2016)などの複雑かつ統合されたワークフローシステムに移行してきているが、ソフトウェア開発者やバイオインフォマティクスコミュニティにとっての主な2つの課題は、(i)ソフトウェアが利用可能なこと、(ii)再現性ある実験ができること、である。バイオインフォマティクスにおけるいくつかのアルゴリズムソフトウェアおよびパイプラインは、適切なinstallationおよびconfiguration(例えば、システム依存性のコンフリクト)のために多大な努力を必要とする。オリジナルの結果の複製可能性と再現性が保証される良い出発点というのは、十分に文書化(ソフトウェアパラメータ、依存性など)され、簡単にインストールできるものである。 Docker(docker.com)やrkt(https://coreos.com/rkt)などのコンテナベースのテクノロジーは、いわゆるソフトウェアコンテナ内でのアプリケーションの展開を自動化することで、これらの課題を克服している。ソフトウェアコンテナは、システムの他の部分に影響を与えることなく、特定のソフトウェアのインストールと実行のための独立した環境を提供する。異なる複数のグループが、バイオインフォマティクスの問題を解決するためにDockerコンテナを使用することを提案している(Belmann et al、2015; Moreews et al、2015)。しかし、これらのプロジェクトのほとんどは個々の努力にとどまっており、バイオインフォマティクスでのDocker技術の可能性はまだ探索段階にある。

 ここでは、バイオインフォマティクスコンテナを作成、管理、配布するためのインフラストラクチャとガイドラインを提供するコミュニティ主導のプロジェクトであるBioContainers(biocontainers.pro)を紹介する。 BioContainersアーキテクチャは、バイオインフォマティクスコンテナの要求と保守、およびユーザとコミュニティとの相互作用を容易にする。貢献する人物が30人を超え、コミュニティ主導のアプローチはプロジェクトの持続可能性とスケーラビリティを保証している。さらに、BioContainersはBioConda(https://bioconda.github.io/)プロジェクトと統合され、各BioCondaレシピのコンテナの自動生成が可能になった。執筆の時点で、BioContainersは2076以上のコンテナを提供し、共通のウェブレジストリ(biocontainers.pro/registry/)を通じて検索、タグ付け、アクセスすることができる。最後に、BioContainerをGalaxy(https://galaxyproject.org/)やPhenoMeNal H2020(http://phenomenal-h2020.eu/home/)などのオープンソースプロジェクトとコンテナプロバイダとして統合する方法について説明する。

 BioContainersアーキテクチャは主要な2つのコンポーネントからなる、(i)すべてのDockerfiles(Dockerfileベースのコンテナ用)、仕様、およびコンテナの作成/管理ツールを含むGitHub組織(github.com/BioContainers/)、 (ii)利用可能なコンテナが自動システムによって構築され、DockerまたはrktによってすぐにダウンロードできるようになっているBioContainersレジストリおよびレジストリUI(biocontainers.pro/registry/)(例http://biocontainers.pro/docs/101/running-example/)。 論文図1は、ユーザーレクエストからコンテナの最終展開までのBioContainersインフラストラクチャを示している。

 BioContainerのユーザーは、ソフトウェア(名前、URL、またはパッケージ化するバイナリ)に関する情報を含む問題をコンテナのリポジトリに開くことによって、ソフトウェアコンテナを要求できる。 BioContainersコミュニティのメンバーが問題を選択し、特定のコンテナを生成する。 自動化されたビルドシステムが設定/配備され、新しいコンテナが数時間以内に利用可能になる。 両方のレジストリを統合するために、著者らはユーザが配置された場所から独立してBioContainerを検索、タグ付け、検索することを可能にするRegistry-UI(biocontainers.pro/registry/)を開発した。 ユーザーは、dockerまたはrktを使用して、対応するコンテナをpullまたはfetchできる。

 

f:id:kazumaxneo:20180928152523j:plain

Overview of the BioContainers architecture。webマニュアルより転載。

 

  • マニュアル

BioContainers Arch

  • 追加するための規則

https://github.com/BioContainers/specs/blob/master/CONTRIBUTING.md

f:id:kazumaxneo:20180928115214j:plain

  • BioContainersに関するツイート

 

以下はDokcerに触れた経験がほぼ無い人向けに書いています。

使い方

step1、dockerのインストール

すでに優れた記事がたくさん書かれているので、ググってdockerをインストールし、起動しておいてください。Qiita(キータ)に上がっている最近の記事リンクを張っておきます(リンク)。

 

 

step2、準備

OSログイン時点でdockerが起動するように設定できるが、起動してなければ、OSX右上のランチャからdockerを起動する。Runを選択して10秒程度待つ。ランチャの設定から、CPUは最大12、メモリは最大16GB、とかなり高めのリソース制限にした。NGS関連のツールはワークステーションクラスのマシン性能を要求するツールも多いためです。環境に合わせて変えてください。

f:id:kazumaxneo:20180928163623j:plain

 

 

step3、イメージの入手: イメージをダウンロードするか、自分でイメージをビルドする。

BioContainersのHPのContainersをクリックするとDockerfiles(イメージビルドのための仕様書)が構築済みのツール一覧を確認できる。 ContainersをクリックするとBioContainersの管理するGIthubレポジトリにジャンプする。

f:id:kazumaxneo:20180928155106j:plain

 

最初にdockerイメージ共有サイトからBioContainersのツールをpullする手順を3パターン紹介し、最後にBioContainersのツールイメージを自分でビルドして使う方法を紹介する。

方法1、Docker hubのbiocontainersからイメージを探してpull

https://hub.docker.com/u/biocontainers/

f:id:kazumaxneo:20180929225505j:plain

 

現状、バイオインフォマティクス研究者の努力により、1000を超えるツールにDockerfilesが準備されている。一番上のblastをクリックする。

f:id:kazumaxneo:20180929225829j:plain

BioContainersの各種リンク、Dokerfileの記載内容など確認できる。ここでは右のコード"docker pull biocontainers/blast"を端末にコピペする。

 docker pull biocontainers/blast

$ docker pull biocontainers/blast

Using default tag: latest

22dc81ace0ea: Already exists 

1a8b3c87dba3: Already exists 

 

69fea7e39cc9: Downloading [============>                                      ]  23.57MB/98MB

ダウンロードが終わるまで待つ。

 ダウンロードが終わったらイメージ一覧を表示。

 docker images #全イメージを確認 

 

$ docker images

REPOSITORY                    TAG                        IMAGE ID            CREATED                  SIZE

blast                         latest                     06e20d67e8c5        Less than a second ago   2GB

biocontainers/blastが追加されている。イメージサイズは2GBだった。ubuntuイメージはGUIなしで100MB以下の容量しかないが、biocontainersには色々なものが導入されているため、重くなる(biocontainersのベースはubuntu16.04。biocontainersそのもののDockerfilesはこちら、またはGithubレポジトリのBioContainers/biocontainers/1.0.0/Dockerfiles link)。

 

 

方法2、Biocondaからイメージを探してpull

BioContainersはBiocondaと統合されているので、BiocondaのHPからツールを探せばdockerイメージリンクも見つかる。ただし、Bioconda全てのツールにイメージが用意されているわけではないし、dockerイメージからの検索にも対応していないので使いにくい。あればラッキー、くらいのイメージ。

https://bioconda.github.io/recipes.html#recipesf:id:kazumaxneo:20180928162542j:plain

Dockerfiesが作成されているツールだと、中央付近にイメージへのリンクがある。

f:id:kazumaxneo:20180929232449j:plain

リンク先からdocker pullのコードをコピペする。手順は方法1と同じになるので省略する。

 

 

方法3、Docker hubからイメージを探してpull

https://hub.docker.comf:id:kazumaxneo:20180928162957j:plain

Docker hubはpublicイメージ共有サイトなので、アップされているイメージのほとんどは基礎研究とは無関係のものになる。ツール名で検索はできるものの、たくさんの人が"public"アクセスでイメージを上げており、ツール名だけで検索すると、同名のイメージが複数見つかったりする(例えばxxx/samtoolsがたくさん見つかる)。pull数や前半のxxxであたりはつけられるが(例えば biocontainers/blastならBioContainersのイメージ)、中にはツールがビルドできてないもの、テスト中のもの、動きはするが説明がゼロで信頼性が不明のものもある。論文中で言及されたり、オーサーが直接上げたイメージをpullするのであれば問題ないが、そうでないなら、言い方は悪いが、知らないままジョーカーを引っぱっている可能性もある。

 

 

方法4、Dockerfilesからイメージをビルド

Dockerfileの定義に従ってイメージをビルドする。この方法であれば不要なコマンドが仕込まれて入れば排除できるし、個人的に使うツールが入ってなければビルドするようにカスタマイズできる。何よりdokcerの勉強になる。

このページは基本的にBioContainersの紹介なので、BioContainersのHPからDockerfileをコピペする手順と、BioContainersのGithubレポジトリを丸ごとcloneして、そこからビルドする手順を紹介する。また、最後に、BioContainersには関わっていないツールのイメージビルドについてかんたんに触れる。

 

"方法1"と同じようにBioContainersのツール一覧にアクセスし、そこからblastのコンテナページにジャンプする。

https://hub.docker.com/u/biocontainers/

f:id:kazumaxneo:20180929225505j:plain

 

blastのコンテナページに飛んだら、上からDockerfilesのタブを選択する。

https://hub.docker.com/r/biocontainers/blast/~/dockerfile/

f:id:kazumaxneo:20180929233054j:plain

表示されたコードをプレーンテキストエディタに貼り、Dockerfileという名前で新しく作ったディレクトリに保存する。そのままビルドする。

emacs Dockerfile
#emacs編集ウィンドウ内にペースト、保存して閉じる

#イメージ名をblastとしてビルド
docker build -t blast .

Dockerfile記載内容が1行ずつ実行され、ビルドされる。

イメージの作成手順は以上となる。しかしこの手順だと、外部ファイルが必要な命令が書いてあるとうまく行かない。ということで、BioContainersのコンテナを前もってcloneしておく方が無難だし楽だと思う。ツールは1000以上あるようだが、Dockerfileはただのテキストファイルなので容量はしれている。

#名前をBioContainersとしてclone
git clone https://github.com/BioContainers/containers.git BioContainers
cd BioContainers/blast/2.2.31/

#イメージ名をblastとしてビルド
docker build -t blast .

ベースイメージのダウンロードの他、必要なツールのダウンロード&ビルドが行われたりする。時間はDockerfileの記載内容により変わる。しばらく待つ。 

 

ビルドが終わったらイメージがあるか確認する。

docker images

docker images

REPOSITORY                    TAG                        IMAGE ID            CREATED             SIZE

blast                         latest                     06e20d67e8c5        21 minutes ago      2GB

blastのイメージができている。

 

pullするかbuildしてイメージが準備したら、いよいよコンテナを立ち上げる。

 

step4、コンテナを立ち上げる 

dockerのrunコマンドでコンテナを立ち上げ、そのまま中に入る(run -iで同時実行)。

docker run -i -t blast

 $ docker run -it blast

biodocker@12cf739e8957:/data$ 

ユーザーbiodockerとしてログインしている。

blastにパスが通っているか確認。

> which blastn

$ which blastn

/opt/conda/bin/blastn

blastの実行ファイルは/opt/conda/bin/bin/にある。パスが通っているので、すぐに使用できる。抜けるときは"exit"とうつ。起動したまま一旦抜けるにはデタッチする(Ctrl キー+ PQ)。

 

手順は以上だが、もう少しコンテナの扱い方の基本を書いておく。 

デタッチしたら、コンテナのSTATUSとIDを確認。

docker ps -a #全コンテナを確認。-aをつけないと起動中のコンテナだけ

$ docker ps -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                    PORTS               NAMES

89bd500c45088        blast                       "/bin/bash"              37 hours ago        Exited (0) 2 hours ago                        unruffled_bose

 

再びコンテナを立ち上げるときはstartとexecコマンドを使う。

#docker ps -aで確認したIDを指定
docker ps -a

#IDを指定してstart
docker start 9bd500c45088

#startしただけでは中に入らない。ここで起動中のイメージを確認
docker ps

docker ps

CONTAINER ID        IMAGE                       COMMAND               CREATED             STATUS              PORTS               NAMES

9bd500c45088        blast                       "/bin/bash"           37 hours ago        Up 2 minutes                            unruffled_bose

起動している。

アタッチして中に入る。

docker attach 9bd500c45088

$ docker attach 9bd500c45088

biodocker@9bd500c45088:/data$ 

中に入った。exit、またはCtrl + Dでコンテナを終了する。

 exitしたら、もう使わないのでこのコンテナを消去する。イメージを消すのは"docker rmi"、コンテナを消すのは"docker rm"。

docker rm 9bd500c45088

$ docker rm 9bd500c45088

9bd500c45088

——

#イメージも消す
docker rmi blast

説明は以上。

 

 

まとめ

 導入が簡単なblastを例にしたのであまりメリットが伝わらなかったかもしれませんが、一般に、ある分野の方法論/アルゴリズムが飽和してくると、今度はそれを全自動で実行するユーザーフレンドリーなツールや、たくさんのツールを結びつけて感度や精度を引き上げるツールの発表が増えてきます。後者のようなツールは依存するツールも多く、全てのツール、ライブラリのビルドには数時間かかる場合もあります。それに伴い、ツールのバージョン違いによるコンフリクトが発生してビルドに失敗する確率も増えてきます。そうなると、当然、数時間もかけたビルド作業が水の泡になります。また、ビルドできても、動かすとエラーが出つつ結果を出したりして不安になったことはありませんか? 

 dockerのイメージを使うことで、導入の障壁を解決し、開発者と同じ環境で解析を始めることができるようになります。後者が一番重要で、ツールの再現性が担保されます。もう一つのメリットは、散々言われていることですが、すぐに使えることでしょう。pullはあっという間に終わりますし、起動も一瞬です。私の場合、一番多い使い方は、ツールの使い捨て環境としての場です。素のlinuxマシンをすぐに立ち上げ(*2)、コンフリクトを心配せずツールをテストし、終わったらすぐ廃棄できるのは便利だと思いませんか?これらが、インフォマティクスの研究者にとってdockerを使うことの主要なメリットだと考えています。実際、BioContainersに限らずDockerfilesを準備するツールも増えてきています。

 もちろん、メリットがあればデメリットありで、メリットをコインの表にできる使い方を知ることが肝要になります。なんでもかんでもdockerでいいという訳ではありません。DockerはカーネルなどホストOSと重複する部分を省略してオーバーヘッドも軽減することでクラシックな仮想環境より軽くなっています。しかし、当然ネイティブ環境ほど速くはありません。むやみに使うと、オーバーヘッドから予想される以上に著しくパフォーマンスが低下する可能性があります(highly subjectiveだが、色々テストしているとそう感じることがある)。また、コンテナを共有していても、増えてくればあっという間に数百GB容量を食ってきます。使って、どのようなことに向いているか自分なりに答えを出すことが重要です。

というわけでdokcerに興味が出たら自分で様々なソースを調べてみてください。関連本やまとめ、学習動画はたくさん出てきています。linuxのファイル構造を調べたり、ユーザを作ったり、ポートを開けたりして遊んでいるうちに、unixの実践的な勉強にもなったりします。私自身、調べていると、使えると便利そうだなという使い方がいくつも出てきます。これからも勉強して紹介していきたいと思います。

 

 

 

 

エキストラstep

基本的な使い方がわかったら、簡単なのでDockerfileを自分で作れるようにする。検索して出てきたStrainEstというツールのDockerfileを開いてみる。

https://github.com/compmetagen/strainest/blob/master/docker/Dockerfile

f:id:kazumaxneo:20181001144208j:plain

色々書かれているが、必須なのは1行目のFROM命令のところだけで、FROM xxxで、ベースイメージが決まる(FROM説明リンク)。この1行だけあれば、最小限の構成のlinuxイメージを作成することができる。例えば、

FROM ubuntu:16.04

という1行だけ書かれたDockerfileを用意すれば、docker buildの実行で最小構成のubuntuイメージを作成できる。最新のubuntuが欲しければ、FROM ubuntu:latestに書き換える(link)。上の例のようにFROM debian:9ならdebian9(link)、FROM centos7ならCentOS7 (latest)がベースイメージになる(link)。Red Hatも使えるが、サブスクリプションが必要。

 

"FROM ubuntu:16.04"1行だけのDockerfileを作ってビルドしてみる。データをfetchしてくるので実行時はネットに繋がっている必要がある。

#testディレクトリで実行する
mkdir test && cd test/

#Dockerfile作成
echo FROM ubuntu:16.04 > Dockerfile

#イメージ名はtestでビルド(build)。-tで作成するイメージ名指定
docker build -t test .

$ docker  image build -t test .

Sending build context to Docker daemon  2.048kB

Step 1/1 : FROM ubuntu:16.04

16.04: Pulling from library/ubuntu

3b37166ec614: Pull complete 

504facff238f: Pull complete 

ebbcacd28e10: Pull complete 

c7fb3351ecad: Pull complete 

2e3debadcbf7: Pull complete 

Digest: sha256:45ddfa61744947b0b8f7f20b8de70cbcdd441a6a0532f791fd4c09f5e491a8eb

Status: Downloaded newer image for ubuntu:16.04

 ---> b9e15a5d1e1a

Successfully built b9e15a5d1e1a

Successfully tagged test:latest

——

ビルドできた。

イメージができているか確認する。

$ docker images

REPOSITORY                    TAG                        IMAGE ID            CREATED             SIZE

test                          latest                     b9e15a5d1e1a        3 weeks ago         115MB

できている。

Dockerfileの 2行目以降では、apt-getの更新や依存ツール導入を行なっている。"RUN命令 + commnad"で実行できる。

f:id:kazumaxneo:20181001144445j:plain

RUN apt-get update

RUN apt-get install -y build-essential

RUN apt-get install -y pkg-config

というように1行ずつ実行してOK(RUN命令は何回でも使える)。

f:id:kazumaxneo:20181001145035j:plain

後半はENVで環境変数を定義し、WORKDIRで現在のパスを定義し(要は/temp/sickle-1.33に移動している)、再びRUNでコマンドを実行している。あとはrunすればStrainEstをローカルで使うことができる。Dockerfileの詳細はベストプラクティスで確認してください。

Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント

 

追記

ビルドで全ての作業を行わなくても、立ち上げて中で追加インストールを行い、それからcommitし直すのが簡単です。commitするには、中で作業後、exitしてcommitコマンドを実行するだけです。同じ名前で上書きもできます。

docker commit <ID> ubuntu

 

コマンドがhost osでも動くなら、dokcerコンテナ内でビルドされた実行ファイルを、ホスト側に持っていき、ホスト側でランする方がパフォーマンスが出ます。

docker run --rm -v $(pwd):/data ubuntu cp xxx /data

dockerイメージとしてしか配布されていないプログラムで利用できるtipsです。

 

引用

BioContainers: an open-source and community-driven framework for software standardization

da Veiga Leprevost F, Grüning BA, Alves Aflitos S, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Vera Alvarez R, Griss J, Nesvizhskii AI, Perez-Riverol Y

Bioinformatics. 2017 Aug 15;33(16):2580-2582

 

 

参考

*1

Dockerについてちゃんと勉強するなら、市販のDockerマニュアル、ドットインストールや講習会、you tuberやネットワーク管理者?の方々の動画が聞きやすくお勧めです。

ドットインストール

https://dotinstall.com/lessons/basic_docker

You tube

https://www.youtube.com/results?search_query=docker+linux+学習

 

*2

virtual machineや、parallels,fusionsは、早くても起動に20秒ほどかかる。その間、CPUリソースをたくさん占有する。

 

追記

 

windowsユーザーの方はこちらの記事がとても参考になると思います。