Singularityの使い方

 

 

 

 

1. 概要

遺伝研スパコンではソフトウェアをユーザー権限でインストール出来るようにするためSingularityコンテナが利用可能です。

Singularityを使うことによって例えば遺伝研スパコン(CentOS7.5)の上で、Ubuntu Linuxのapt-get等でインストールした解析ソフトウェアを動作させることが可能になります。

 

2. 使い方

2.1. 遺伝研スパコン上に設置してあるSingularityコンテナイメージファイルを使う

 

遺伝研スパコンでは、解析ソフトウェアのインストールの手間を軽減するために、biocontainersが提供している3万4千個以上のSingularityコンテナイメージファイルを/usr/local/biotools/ディレクトリ以下に置いています。

 

使用例は以下の通りです。

# コマンドが長くなるのを防ぐためaliasを設定するとよい。
$
alias singR="singularity exec /usr/local/biotools/r/r-base:3.5.1 R"

$ singR --no-save < example.R
> attach(mtcars)
> plot(wt, mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on Weight")
>

(引用)上記コード例は以下のサイトを参考にした。

https://www.statmethods.net/r-tutorial/index.html

実行結果(Rplots.pdf)は以下の通り。

pasted image 0.png

 

2.2. 自作のSingularityコンテナイメージファイルを使う

Singularityコンテナは一般に以下の手順で用います。

  • (i)root権限を持つローカルのサーバー上でsandboxモードで解析環境を作成する。
  • (ii)それをsingularity buildしてコンテナイメージファイル(*.sif)に固める
  • (iii)このファイルをスパコンなど共用計算機にコピーする。
  • (iv)スパコン上ではユーザー権限でコンテナの中のプログラムを実行する。

このときコンテナイメージファイル(*.sif)は元々書き込み禁止となっており、これにより共用計算機上にコンテナを持ち込んだ際のセキュリティーの問題を回避しています。

 Singularity Definition Fileを用いた利用例は以下の通りです。

まず、ユーザー自身のLinux環境でSingularityコンテナイメージファイルを作成します。(Singularity自体のインストールについては公式ページ https://sylabs.io/guides/3.5/user-guide/quick_start.html を参照ください。)

# 例えば以下のサイトからSingularity Definition Fileをユーザーのlinuxサーバにクローンする。
git clone https://github.com/oogasawa/singularity-ubuntu18

# このDefinitionファイルをビルドしてSingularityコンテナイメージファイルを作る。
# (ビルド方法の詳細は上記githubリポジトリREADME.md参照.)
cd singularity-ubuntu18
sudo apt-get debootstrap
sudo singularity build ubuntu18.sif Singularity

上記のようにして作ったSingularityコンテナイメージファイルを遺伝研スパコン上にコピーします。

(あるいは、上記のビルドには1時間以上かかるので、あらかじめsingularity-hubに登録しすることでバックグラウンドでビルドしておいて、singularity-hubからSingularityコンテナイメージファイルを遺伝研スパコンにダウンロードします。)

遺伝研スパコン上で以下のようにします。

# singularity-hubからコンテナイメージファイルを取得。
singularity pull shub://oogasawa/singularity-ubuntu18
# コマンドが長くなるのを防ぐためaliasを設定する。
alias sing="singularity exec $HOME/ubuntu18.sif
# 使ってみる

 

2.3. DockerコンテナイメージからSingularityイメージを生成する

一方、Singularityのsandboxモードの代わりにDockerコンテナを使うことが出来ます。(その際DockerコンテナイメージファイルはあらかじめDocker Hubに登録しておいてください。)

 

Dockerコンテナイメージを用いたSingularityの利用例は以下の通り

# singularity build時にメモリが足りないというエラーが出るので、qlogin時にあらかじめメモリ量を指定する。
$ qlogin -l s_vmem=20G -l mem_req=20G
Your job 5083922 ("QLOGIN") has been submitted
waiting for interactive job to be scheduled ...
Your interactive job 5083922 has been successfully scheduled.
Establishing /home/geadmin/UGER/utilbin/lx-amd64/qlogin_wrapper
session to host at029 ...
Warning: Permanently added '[at029]:45682,[172.19.7.5]:45682' (ECDSA)
to the list of known hosts.
Last login: Sun Jan 26 20:55:09 2020 from gw1


# Docker Hub上のDockerコンテナをユーザー権限でSingularityビルドする。
$ singularity build lolcow.sif docker://godlovedc/lolcow
INFO:    Starting build...
Getting image source signatures
Skipping fetch of repeat blob
sha256:9fb6c798fa41e509b58bccc5c29654c3ff4648b608f5daa67c1aab6a7d02c118
Skipping fetch of repeat blob
sha256:3b61febd4aefe982e0cb9c696d415137384d1a01052b50a85aae46439e15e49a
Skipping fetch of repeat blob
sha256:9d99b9777eb02b8943c0e72d7a7baec5c782f8fd976825c9d3fb48b3101aacc2
Skipping fetch of repeat blob
sha256:d010c8cf75d7eb5d2504d5ffa0d19696e8d745a457dd8d28ec6dd41d3763617e
Skipping fetch of repeat blob
sha256:7fac07fb303e0589b9c23e6f49d5dc1ff9d6f3c8c88cabe768b430bdb47f03a9
Skipping fetch of repeat blob
sha256:8e860504ff1ee5dc7953672d128ce1e4aa4d8e3716eb39fe710b849c64b20945
Copying config sha256:73d5b1025fbfa138f2cacf45bbf3f61f7de891559fa25b28ab365c7d9c3cbd82
3.33 KiB / 3.33 KiB [======================================================] 0s
Writing manifest to image destination
Storing signatures
INFO:    Creating SIF file...
INFO:    Build complete: lolcow.sif

# Singularityコンテナを実行してみる。
$ singularity run lolcow.sif
________________________________________
/ Don't let your mind wander -- it's too \
\ little to be let out alone.            /
----------------------------------------
        \ ^__^
        \ (oo)\_______
            (__)\ )\/\
                ||----w |
                || ||
o

 

 

3. 利用に際したTips

■コンテナの外部ディレクトリのバインド(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

 

 

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

Singularityコンテナは、Singularity execコマンドをUGEのジョブスクリプト内に記述することでバッチジョブ内でも利用することが可能です。

例えば、持ち込んだイメージファイル名が、centostflow.simgとすると、singularity execコマンドを 利用して、以下のようにジョブスクリプトを記述していただくことになります。

ジョブファイル例

#!/bin/sh
module load cuda10.0
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)を参照することが可能です。

 

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

 

4.参考ドキュメント

開発元のドキュメントページ
https://www.sylabs.io/docs/

 

開発元のユーザガイド(3.5 html版)
https://www.sylabs.io/guides/3.5/user-guide/index.html


開発元のユーザガイド(2.6 html版)
https://www.sylabs.io/guides/2.6/user-guide/index.html