サイトポリシー サイトマップ
2019 年 10 月 16 日

Singularityについて

本システムでは、従来システムで多く頂いておりましたコンテナを利用したいというご要望に対応して、Singularity環境(バージョン2.6.1 OSS版)を提供しています。 Singularityは、共用計算機システム上でのHPC/バイオアプリケーション実行に適した、Linuxコンテナソフトウェアです。 Singularityを利用することにより従来システムでは実現困難だった、以下のような利用例が今回可能となっています。

  • 本システムとは異なるLinuxディストリビューション上でビルドされたアプリケーションを実行する。
  • ユーザ所有のLinuxマシン上で作成した、カスタマイズした環境のイメージをSingularityコンテナにして持ち込み、本システム上で実行する.
  • 他システムが提供するHPC用アプリケーションコンテナイメージを持ち込んで実行する。
  • BioContainersなど、各種バイオ系プロジェクトで提供されたコンテナイメージをシステム上で実行する。
  • SingularityHubや、DockerHubに登録されているコンテナをシステム内に持ち込んで実行する。
  • NVIDIA GPU Cloudで公開されているDockerコンテナをNGCからダウンロードして実行する。

以下に、本システムでのSingularityの利用法の概略について説明します。 Singularityの詳細については以下のWebサイトも参照願います。

 

本システムでのSingularityの利用方法

本システム内でのSingularityの使用方法について以下に説明します。

Singularityコンテナイメージの準備

まず、実行する為のコンテナイメージファイルを準備頂く必要があります。この場合の選択としては 以下があります。

  • DockerHub、SingularityHub、BioContainers等の公開レジストリからイメージファイルをダウンロードする
  • ユーザ所有の手元のLinuxシステムでイメージファイルをユーザ自身でbuildする

コンテナのイメージファイルを作成する為にはbuildするシステム上でroot権限が必要になり、本システムでは一般ユーザが イメージファイルをビルドすることが出来ない設定になっております。ご了承ください。この為、イメージを自作したい場合は Singularityをroot権限でインストール可能なLinuxマシンをご自身でご用意いただくか、パブリッククラウドサービスを ご利用いただきsingularity build でイメージファイルを作成してください。

singularity build ubuntu_w_TFlow.simg ./ubuntu_w_TFlow.def

Recipeファイルの記述方法については、前述の開発元が公開しているドキュメントの以下の箇所をご参照ください。

作成頂いたイメージファイルは、sftpまたはlftpコマンドで、ゲートウェイノード上のホームディレクトリ上に外部から 転送をお願いします。 また、公開レジストリ(docker://、shub://)からは、以下のようにSingularity pullをお願いします。

module load singularity
singularity pull docker://tensorflow/tensorflow:latest-gpu 

pullの前にsingularity exec、singularity shellで直接外部イメージをキャッシュ領域にダウンロードして 実行することも可能ですが、明示的にpullして、イメージをディレクトリ上にダウンロードしてから、これを 指定して実行することを推奨します。

コンテナの外部ディレクトリのバインド(bind)マウントについて

Singularityでは、

  • $HOME
  • $PWD
  • /tmp
  • /proc
  • /sys
  • /dev

は、コンテナ内からデフォルトでbindマウントされており、ユーザが明示的に指定しなくても、コンテナ内から アクセスすることが可能になっています。それ以外のディレクトリにアクセスする必要がある場合は、 コマンドラインで指定するか、シェルの環境変数SINGULARITY_BINDPATHを定義することにより、コンテナ内と コンテナ外のディレクトリを対応づけることが必要です。

singularity shell --bind $HOME  my-container.simg
export SINGULARITY_BINDPATH="ユーザがコンテナ内から参照したいシステム上のディレクトリ"
singularity shell my-container.simg

ログインノードでのSingularityのインタラクティブな使い方

UGEのqloginでログインしたログインノード上で、singularity shellを利用することで、インタラクティブにコンテナを 利用することが可能となります。 Singularityの環境も、別に解説したEnvironment Moduleを利用して定義されています。ログインノードに ログイン後Singularity利用環境を以下のコマンドでロードしてください。

module load singularity

インタラクティブにコンテナを利用する場合、コンテナと内部と外部の考え方に留意し、かつ前述の bindマウント設定も利用しながら、システム上のデータをコンテナで処理するようにしてください。

UGE環境(バッチジョブ管理システム)上でのSingularityの使い方

Singularityコンテナは、Singularity execコマンドをUGEのジョブスクリプト内に記述することでバッチジョブ内でも利用することが可能です。コンテナイメージとしてはDockerHub、SingularityHub等の外部公開サイトで提供されるイメージを利用頂くか、本システム内に配置してあるBioContainersのSingularityイメージファイルをご利用頂くか、 ユーザ各位が保有されているLinux環境で、コンテナイメージを作成してscp等で持ち込んでいただく ことになります。 例えば、持ち込んだイメージファイル名が、centostflow.simgとすると、singularity execコマンドを 利用して、以下のようにジョブスクリプトを記述していただくことになります。
ジョブファイル例

#!/bin/sh
module load cuda10.0
module load singularity
cd ~/tmp
singularity exec --nv centostflow.simg python  tf_example.py

UGE環境上でSingularityを使った、コンテナのGPU利用ジョブの実行の仕方

Singularityでは、--nvオプションを指定することで、Singularityが自動的にコンテナ外の GPU環境をコンテナ内から参照可能とします。以下は、システム内のGPU保有のログインノードに qloginし、DockerHub上に登録のあった、Tensorflowのコンテナをpullしてダウンロードしてサンプル(convolutional.py)を実行した例です。

[lect01@igt001 ~]$ singularity shell --nv ./tensorflow-latest-gpu-py3.simg
Singularity: Invoking an interactive shell within container...

Singularity tensorflow-latest-gpu-py3.simg:~> python ./models/tutorials/image/mnist/convolutional.py
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From ./models/tutorials/image/mnist/convolutional.py:226: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
2019-02-22 05:52:18.827181: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
2019-02-22 05:52:20.048570: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x3bb6d80 executing computations on platform CUDA. Devices:
2019-02-22 05:52:20.048611: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): Tesla V100-SXM2-16GB, Compute Capability 7.0
2019-02-22 05:52:20.048619: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (1): Tesla V100-SXM2-16GB, Compute Capability 7.0
2019-02-22 05:52:20.048626: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (2): Tesla V100-SXM2-16GB, Compute Capability 7.0
2019-02-22 05:52:20.048633: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (3): Tesla V100-SXM2-16GB, Compute Capability 7.0
2019-02-22 05:52:20.097087: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3000000000 Hz
2019-02-22 05:52:20.098091: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x3caed90 executing computations on platform Host. Devices:
2019-02-22 05:52:20.098157: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): , 
2019-02-22 05:52:20.098599: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0000:15:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2019-02-22 05:52:20.098797: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 1 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0000:16:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2019-02-22 05:52:20.098971: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 2 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0000:3a:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2019-02-22 05:52:20.099144: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 3 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0000:3b:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2019-02-22 05:52:20.099192: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0, 1, 2, 3
2019-02-22 05:52:20.104437: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-02-22 05:52:20.104451: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0 1 2 3
2019-02-22 05:52:20.104458: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N Y Y Y
2019-02-22 05:52:20.104464: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 1:   Y N Y Y
2019-02-22 05:52:20.104470: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 2:   Y Y N Y
2019-02-22 05:52:20.104476: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 3:   Y Y Y N
2019-02-22 05:52:20.105162: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14926 MB memory) -> physical GPU (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:15:00.0, compute capability: 7.0)
2019-02-22 05:52:20.105478: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 14926 MB memory) -> physical GPU (device: 1, name: Tesla V100-SXM2-16GB, pci bus id: 0000:16:00.0, compute capability: 7.0)
2019-02-22 05:52:20.105788: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:2 with 14926 MB memory) -> physical GPU (device: 2, name: Tesla V100-SXM2-16GB, pci bus id: 0000:3a:00.0, compute capability: 7.0)
2019-02-22 05:52:20.106031: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:3 with 14926 MB memory) -> physical GPU (device: 3, name: Tesla V100-SXM2-16GB, pci bus id: 0000:3b:00.0, compute capability: 7.0)
Initialized!
2019-02-22 05:52:23.777188: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library libcublas.so.10.0 locally
Step 0 (epoch 0.00), 96.1 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.5%
Step 100 (epoch 0.12), 2.4 ms
Minibatch loss: 3.219, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.9%
Step 200 (epoch 0.23), 2.1 ms
Minibatch loss: 3.398, learning rate: 0.010000
Minibatch error: 12.5%
Validation error: 4.5%
Step 300 (epoch 0.35), 2.0 ms


(中略)

Minibatch loss: 1.621, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.7%
Step 8400 (epoch 9.77), 2.0 ms
Minibatch loss: 1.600, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Step 8500 (epoch 9.89), 2.0 ms
Minibatch loss: 1.601, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Test error: 0.8%

コンテナ内からシステム側のGPU(Tesla V100)を参照することが可能です。

BioContainersの利用について

本システムでは従来提供していたバイオ系ツールをBioContainersプロジェクト が公開している コンテナイメージをダウンロードさせて頂き、所定のディレクトリ(共有ファイルシステム上の(/usr/local/biotools/))に配置しております。 コンテナイメージの数が2019年2月時点で約9000程度とかなり多い為、当該ディレクトリ以下にはアルファベットのディレクトリを作成し、 アプリケーション名称ごとに分割して配置しております。

a  b  bioconductor  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

本システムで提供しているBioContainersのSingularityイメージは、 BioContainersのSingularityイメージのレジストリ から取得させていただいております。BioContainersプロジェクトで提供されているコンテナ群は、BioCondaプロジェクトで提供されている レシピをもとにビルドされていますので、提供されているソフトウェア一覧については、

をご参照ください。ただし、ダウンロードのタイミングによってBIOCONDAの一覧にあるが、本サイト上にダウンロードしていないソフトウェアがあることはご了承ください。システム側による一括ダウンロードについては、システム開始以降 定期的(最低半年に一回を目安)に実施させて頂きます。 ディスク容量の無駄遣いを避けるため、システム上(/usr/local/biotools/)に目的のBioContainersイメージが用意されている場合はなるべくこちらをご利用ください。BioContainersイメージの動作保証、問い合わせ対応についてはご容赦頂けますよう お願いいたします。 

以下にBioContainers内のアプリケーションの本システム上での利用例について参考に示します。まず、Singularityを利用可能とする為に、 moduleコマンドでSingularity環境をロードします。Singularity環境のロードを忘れないでください。

$ module load singularity

環境を上記コマンドで読み込み、Singularityを使用可能とした後、例えば、blastのイメージファイルを利用して、blastを実行したい場合は、以下のようにSingularity execコマンドラインを組み立てて入力します。 イメージファイルは、/usr/local/biotoolsディレクトリ下に格納してあるものをご利用ください。

$ singularity exec コンテナイメージファイルパス 実行したいblastのコマンドライン 

実行したいコマンドラインは従来の通常のコマンドラインと変わりません。コンテナイメージファイル内環境で指定したコマンドラインが実行され、その結果が出力として返されます。 blastの場合の実際のコマンドラインは以下の例のようになります。(イメージファイル名=blast\:2.7.1--boost1.64_1)

$ singularity exec /usr/local/biotools/b/blast\:2.7.1--boost1.64_1 blastn -query ./sample.query -db ./db/16SMicrobial -out output.txt

これで、通常のblastのコマンド実行と同じようにoutput.txtに実行結果が出力されます。また、UGE経由のbatchジョブとして実行することも可能です。
ジョブスクリプト例

#!/bin/sh
module load singularity
cd blast
singularity exec /usr/local/biotools/b/blast\:2.7.1--boost1.64_1 blastn -query ./sample.query -db ./db/16SMicrobial

参考:NVIDIA GPU CLOUDからDocker ContainerイメージをダウンロードしてDLアプリケーションを 実行する方法

原典(https://devblogs.nvidia.com/docker-compatibility-singularity-hpc/)
参考としてNVIDIAのブログ記事に紹介されておりましたNVIDIA GPU CLOUD(NGC)上のDocker コンテナイメージを ダウンロードして、singularityで動作させる方法について転載します。本システム活用例の一つとしてご紹介するものであり、本記載の詳細内容についての お問い合わせについてはご容赦ください。 Singularityは、Dockerコンテナイメージとも互換性を持つため、NGC上に登録のあるDockerイメージをダウンロード して実行することが可能です。 NGCでは、NGC内の設定でAPI-keyを生成することにより、それらの認証情報を利用してNGC外部からNGCが提供している Dockerイメージにアクセス、ダウンロードすることを可能にしています。
設定する環境変数

SINGULARITY_DOCKER_USERNAME='$oauthtoken'
SINGULARITY_DOCKER_PASSWORD=NVIDIA NGC Cloud の設定画面で生成したAPIキーを設定

上記2つの環境変数を設定し、singularity pullを実施すると、NGC内のDockerコンテナイメージが 以下のようにダウンロードできます。(これもTensorflowをダウンロードしています。)

[lect01@igt001 ~]$ singularity pull docker://nvcr.io/nvidia/tensorflow\:19.01-py3
WARNING: pull for Docker Hub is not guaranteed to produce the
WARNING: same image on repeated pull. Use Singularity Registry
WARNING: (shub://) to pull exactly equivalent images.
Docker image path: nvcr.io/nvidia/tensorflow:19.01-py3
Cache folder set to /lustre8/home/lect01/.singularity/docker
[43/43] |===================================| 100.0%
Importing: base Singularity environment
Exploding layer: sha256:7b8b6451c85f072fd0d7961c97be3fe6e2f772657d471254f6d52ad9f158a580.tar.gz
Exploding layer: sha256:ab4d1096d9ba178819a3f71f17add95285b393e96d08c8a6bfc3446355bcdc49.tar.gz

(中略)

Exploding layer: sha256:53436d19ba866445e48775f8776c70765f2f23b2cca2eac1daafe4b5151119b3.tar.gz
Exploding layer: sha256:f49ee961b0ed5eecb2254b3bab0cd4249098d41b4fb1fdb4e91bcd94b73204bf.tar.gz
Exploding layer: sha256:62a7dc5722026b20de96859def46e9b0984ccd2ccdd726cb53970e946ce431f7.tar.gz
Exploding layer: sha256:6ee5600293e15cee5140825fb5dc737dcad246e9f6de51bace8d6cc38a66f6ff.tar.gz
WARNING: Building container as an unprivileged user. If you run this container as root
WARNING: it may be missing some functionality.
Building Singularity image...
Singularity container built: ./tensorflow-19.01-py3.simg
Cleaning up...
Done. Container is at: ./tensorflow-19.01-py3.simg

ダウンロード後、ダウンロードしたイメージをSingularity shellで実行することが可能です。

Singularityを使ったMPIジョブの実行について 

Singularityはソフトウェアとしては、コンテナ内でMPIジョブを実行することは可能です。ただし試行してみると、 コンテナ内外のMPIの実装、ライブラリ、通信デバイスのドライバの整合性をある程度とらないと正常には動作せず、 InfiniBand等の高速なインターコネクトを利用した場合、外部から持ってきたコンテナイメージをそのまま動かす。 というわけにはいかないようです。この為、本システムではMPIについてはコンテナを利用するよりは、本システム で提供しているMPI環境を直接利用頂くことを推奨とさせて頂きます。

免責事項および権利の留保事項

Singularityでは、コンテナ内の環境はユーザの自由にカスタマイズすることが可能です。この為、ご自身で作成し、持ち込まれた コンテナによるLinux環境については、ユーザご自身で管理して頂く必要があります。個人で作成されたコンテナイメージについては、 ご本人で維持、管理して頂くようお願いします。作成されたコンテナイメージに関するお問い合わせについてご容赦頂けるようお願い 致します。また、ユーザが作成され、持ち込まれたコンテナ環境について、システム全体の運用から望ましくない設定がされている 恐れが万一ある場合、事情をお聞きし、当該コンテナの利用を停止していただく権利をシステム側で留保するものとします。