Google CloudでNextflowを実行する
はじめに
Nextflowはオープンソースで開発されている大規模なバイオインフォマティックス解析で使われているワークフローエンジンです。Nextflow以外にも、SnakemakeやCromwellやdsubなど、様々なワークフローがあります。
Google Cloudの公式ドキュメントには、Google Cloud Life Sciences というサービスを使って Nextflow を実行する方法が説明されていますが、じつは、Nextflow を Google Cloud 上で実行する方法は他にもいくつかあります。例えば、HPCスケジューラであるSlurmを使う方法や、KubernetesのマネージドサービスであるGoogle Kubernetes Engine (GKE)を使う方法、などです。本記事では、Google Cloud 上で Nextflow の hello を実行するまでの複数の方法を紹介します。
[7/19追記] 7/16に Preview版として公開された Cloud Batch を使ってNextflowを実行する方法についても紹介します。
なお、本記事では、Nextflow TowerやNextflowの詳細については触れていません。また、Nextflowの実運用を想定したものではなく、完全な操作手順は記載していませんのでご了承ください。
Nextflow with Slurm
Slurmクラスタ作成
Google CloudコンソールのMarketplaceメニューから、Fluid-Slurm-GCP (Ubuntu)を選択します。
[LAUNCH]ボタンをクリックします。
名前を入力し、ゾーンを選択します。今回は asia-northeast1-aとします
Slurm Controller Nodeのディスクサイズを20Gから100Gに変更しておきます。
[DEPLOY]ボタンをクリックします。
Compute Engineのインスタンス一覧に、ControllerノードやLoginノードが表示されるまで少し待ちます。インスタンス名に、controllerやloginという文字列が含まれているのでわかりやすいですね。
LoginノードにSSHログインしましょう。
Slurmアカウントを作成
以下は、Loginノード上での作業です。現在のコンフィグを config.yaml ファイルに出力します。
sudo su
cluster-services list all > config.yaml
cluster-services sample slurm_accounts >> config.yaml
confiig.yamlを編集し、ファイルの下の方にある slurm_accounts の箇所を変更します。
デフォルトではpartitionは”partition-1"です。また、<account-name>と<user_id>の箇所ついては適宜修正してください
プレビューしてみて、問題がなければ反映します。
cluster-services update slurm_accounts --config=config.yaml \
--previewcluster-services update slurm_accounts --config=config.yaml
ここで、sudo su から exit します。
念の為、Slurm ユーザが作成さていることを確認します。
sacctmgr list userUser Def Acct Admin
— — — — — — — — — — — — — — —
user_id+ account-n+ None
root root Administ+
作成した Slurm アカウントで、srun を実行できるかどうかを確認してみます。以下は、 hostnameコマンドを実行しています。
srun -n1 --partition=partition-1 --account=<account-name> hostname
partition-1–0
上記のように表示されれば Slurm の動作確認は完了です。
Nextflowインストール
引き続き Login ノード上で操作します。
curl https://get.nextflow.io | bash
nextflow.configを作成します。最低この1行だけを記載しておけば良いです。
process.executor = 'slurm'
Nextflow を実行
NextflowでHelloを実行してみましょう。
./nextflow run helloN E X T F L O W ~ version 22.04.4
Pulling nextflow-io/hello …
downloaded from https://github.com/nextflow-io/hello.git
Launching `https://github.com/nextflow-io/hello` [berserk_montalcini] DSL2 — revision: 4eab81bd42 [master]
executor > slurm (4)
[0c/a6ba68] process > sayHello (4) [100%] 4 of 4 ✔
Hello world!Ciao world!Bonjour world!Hola world!
上記のように表示されれば、無事終了です。
Nextflow with Cloud Life Sciences
Nextflowのインストール
Cloud shell 上で Nextflow をインストールします。Cloud Shellはブラウザからアクセスできる、オンラインの開発および運用環境です。Google Cloudコンソール上で [Cloud Shellをアクティブにする]をクリックするだけでCloud Shellを利用できます。
Nextflowは以下のコマンドでインストールできます。Cloud Shell上で実行してください。
curl https://get.nextflow.io | bash
nextflow.configファイルを以下のような内容で作成します。
process.executor = 'google-lifesciences'
workDir = 'gs://<bucket-name>/scratch'
google.project = '<project-id>'
google.zone = '<zone>'
ここで、<bucket-name>や<project-id>や<zone>は適宜置き換えてください。以下は、bucket-name = hcls-jp1-nextflow、project-id = hcls-jp1、zone = asia-northeast1-a とした場合の nextflow.configの例です。
process.executor = 'google-lifesciences'
workDir = 'gs://hcls-jp1-nextflow/scratch'
google.project = 'hcls-jp1'
google.zone = 'asia-northeast1-a'
workDirで指定した Google Cloud Storage (GCS)のバケットをgsutilコマンドで作成しておきます。
gsutil mb -l asia-northeast1 gs://<bucket-name>
Nextflowを実行
nextflowを実行します。
Nextflow は Cloud Life Sciences API を呼び出し、 GCEインスタンス を起動します。その際に起動される GCEインスタンス名は、google-pipelines-worker…となります。
./nextflow run helloN E X T F L O W ~ version 22.05.0-edge
Launching `https://github.com/nextflow-io/hello` [confident_khorana] DSL2 — revision: 4eab81bd42 [master]
executor > google-lifesciences (4)
[ec/8a28d0] process > sayHello (1) [100%] 4 of 4 ✔
Hola world!Hello world!Ciao world!Bonjour world!Completed at: 24-Jun-2022 06:55:53
Duration : 2m 13s
CPU hours : 0.1
Succeeded : 4
上記のように表示されれば、無事終了です。
Nextflow with GKE
Nextflow を Kubernetes で動かすためには、Kubernetes の PersistentVolumeが必要になります。本記事では、フルマネージドのファイル ストレージサービスである Google Cloud Filestore を利用します。
GKEクラスタ作成
GKE Standardのクラスタを作成します。Google Cloudコンソール > Kubernetes Engine > クラスタの画面で[作成]をクリックします。以下の画面が表示されるので、GKE Standardの[構成]をクリックします。
GKE Standardクラスタを作成する時に、名前やゾーンを指定します。
また、今回は Cloud Filestore を使うので、”Filestore CSI Driver” を使うように指定する必要があります。
Features> Filestore CSI ドライバの有効可
また、GKEのノードは、e2-standard-4(4cpu、16GB)のインスタンスを指定しておきます。
ノードプール >ノード
これで[作成]ボタンをクリックし数分待つとGKEクラスタが作成されます。
GKEクラスタに接続する
GKEクラスタの画面上部のメニューから[接続]をクリックします。
以下のようなポップアップ画面が開くので、コマンドラインアクセスの下にある[CLOUD SHELLで実行]をクリックします。
Cloud Shell が開き上記のコマンドがペーストされていますので、そのまま実行すれば GKEクラスタへ接続できます。
Nextflowのインストール
引き続きCloud shell上でNextflowをインストールします。
curl https://get.nextflow.io | bash
Filestore共有ボリュームを作成
KubernetesのPersistentVolumeClaims (PVC)を作るには複数の方法がありますが、ここでは最初にPerssitentVolume (PV)を作って次にPVCを作る手順を紹介します。
まず Cloud Filestoreのインスタンスを作成します。GKEクラスタと同じゾーンに作ることを推奨します。
Filestoreインスタンスができると、コンソール上で NFS Mount point の情報が表示されます。具体的には以下のようなものです。
NFS Mount Point : 10.201.6.122:/data
マニフェストを作って、PVとPVCを作成します。以下のように、persistent-volume.yamlとpersistent-volue-claim.yamlを作成します。
persistent-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: fileserver
spec:
capacity:
storage: 1T
accessModes:
--ReadWriteMany
nfs:
path: /data
server: 10.201.6.122
これを以下のコマンドで適用し、作成されたことを確認しておきます。
kubectl apply -f persistent-volume.yaml
kubectl get pv
persistent-volume-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fileserver-claim
spec:
storageClassName: ""
accessModes:
--ReadWriteMany
resources:
requests:
storage: 1T
これを以下のコマンドで適用し、作成されたことを確認しておきます。
kubectl apply -f persistent-volume-claim.yaml
kubectl get pvc
権限付与
推奨されない方法ですが、ここでは簡易的に、デフォルトネームスペースのデフォルトサービスアカウントに、EditとViewのClusterRoleを付与します。
kubectl create rolebinding default-edit --clusterrole=edit \
--serviceaccount=default:defaultkubectl create rolebinding default-view --clusterrole=view \
--serviceaccount=default:default
Nextflowを実行
nextflow kuberun hello を実行します。
./nextflow kuberun hello -v fileserver-claim:/dataPod started: romantic-marconi
N E X T F L O W ~ version 22.05.0-edge
Launching `https://github.com/nextflow-io/hello` [romantic-marconi] DSL2 — revision: 4eab81bd42 [master]
[d7/045cd8] Submitted process > sayHello (1)
[26/5b10c0] Submitted process > sayHello (2)
[0b/4ac839] Submitted process > sayHello (3)
[5d/0d3564] Submitted process > sayHello (4)
Ciao world!Hello world!Hola world!Bonjour world!
上記のように表示されれば、無事終了です。
Nextflow with Cloud Batch
Google Cloud の Cloud Batchが 7/16 に Preview 版として公開されました。
Nextflow は早くもこの Cloud Batch に対応しているので、早速試してみました。なお、7/16時点で、Cloud Batchの対応リージョンは、us-central1、europe-north1などで、東京リージョン(asia-northeast1)は未対応です。
GCS bucket を作成
gsutil mb -l us-central1 gs://<bucket-name>
Cloud Batch APIを有効化する
gcloud services enable batch.googleapis.com
Nextflowをアップデートする
Nextflowを Cloud Batch に対応するバージョン 22.07.1-edge にアップデートします。
export NXF_EDGE=1
curl get.nextflow.io | bash
./nextflow -self-update
nextflow.configを作成
executorに ‘google-batch’ を指定しますが、その他は Cloud Life Sciences のときと同じ設定です。
process.executor = 'google-batch'
workDir = 'gs://<bucket-name>/scratch'
google.project = '<project-id>'
google.location = '<region>'
Nextflowを実行
./nextflow run helloN E X T F L O W ~ version 22.07.1-edge
Launching `https://github.com/nextflow-io/hello` [loving_hilbert] DSL2 — revision: 4eab81bd42 [master]
executor > google-batch (4)
executor > google-batch (4)
executor > google-batch (4)
[fc/95dc56] process > sayHello (3) [100%] 4 of 4 ✔
Bonjour world!Ciao world!Hola world!Hello world!Completed at: 16-Jul-2022 23:18:58
Duration : 2m 43s
CPU hours : (a few seconds)
Succeeded : 4
上記のように表示されれば、無事終了です。
Nextflow実行方法の選択
本記事では、Google Cloud上でNextflowを実行する方法として4通り紹介しました。どれを選択すればよいか不明な方は、まずは、既存のNextflowに関するアセットの有無などを考慮すると良いでしょう。
Slurm に関しては、本記事では Fluid-Slurm を使用しましたがこれにはSingularityも同梱されるので、SlurmやSingularityのアセットをすでに持っている場合はSlurmを使う方法がおすすめです。また、GKEは、オンプレミスのKubernetesの運用経験やアセットがある場合に有効な選択肢となります。ただ、どちらも最初に”クラスタ”を構築してそれを運用する必要があるという点にはご注意ください。
上記のどれにも当てはまらない場合は、Cloud Life Sciences(今後は Cloud Batch) を使う方法が適しているでしょう。これらは操作手順も少なくクラスタ環境を維持する必要もないので、費用的にも運用負荷的にもおすすめな選択肢となります。
終わりに
今回は、Google Cloud 上で Nextflow を試す手順を複数のパターンで紹介しました。Google Cloud は Nextflow 以外にもさまざまなワークフローをサポートしています。チュートリアルもあり誰でも簡単に実行できますので、ぜひ試してみてください。