はじめに
今までSingularityの環境構築やビルドの方法について以下のような記事をアップしてきました.
今回はこれらの環境を「使う」ことに焦点を当てて基本を解説したいと思います.
主に,データサイエンスや深層学習で用いられるJuliaやPythonといったスクリプト言語をSingularityコンテナで実行する用途を想定しています.Singularityコンテナでスクリプトを走らせるにはどうすればよいのかまとめます.
なお,使用したSingularityのバージョンは,3.0.3です.
公式サイトのマニュアルはこちらです.
コンテナの準備
今回の例として,Julia1と呼ばれるプログラミング言語のコンテナを例にしてみようと思います.ここは別にJuliaでなくてもPythonでもRでもなんでも同じです.
まず,Juliaのコンテナを作成します.DockerHubに出来合いのものがあるので,それをSingularityコンテナにbuildしましょう.
$ singularity build Julia.sif docker://julia
INFO: Starting build...
Getting image source signatures
Skipping fetch of repeat blob sha256:6f2f362378c5a6fd915d96d11dda1e0223ccf21f121ace56ae0f6616ea1dc8
Skipping fetch of repeat blob sha256:d95646cd657efb15e2cba09c7de5fb7a6a12ede978490868456fbb752ea70e
Skipping fetch of repeat blob sha256:57212f546c7dc689fe27d5b104a29e0cd109f637f7c737c9a9c0358fb33e35
Copying config sha256:079bf4814a0593c941f1485eb4befefc5645fed8bbc976e38da0d490bcca18
3.59 KiB / 3.59 KiB [======================================================] 0s
Writing manifest to image destination
Storing signatures
INFO: Creating SIF file...
INFO: Build complete: julia.sif
しばらくすると,同じディレクトリに,Julia.sifなるイメージファイルが出来上がっています.
実際に動かしてみる
Singularityコンテナでコマンドを実行するには大きく分けて以下の2つの方法があります.
- コンテナ内のシェルに一旦入ってそこでコマンドを実行する(shellコマンド)
- コンテナ上でコマンドを直接実行する(execコマンド)
それぞれ見ていきます.
shellコマンド
コンテナに入ってその中の環境のシェルを呼び出します.
singularity shellに続いてイメージファイルを指定します.ついでにJuliaも起動してみます.
$ singularity shell my_image.sif
# 以下のプロンプトはコンテナ内の環境である
Singularity julia.sif:~/containers> julia --version
julia version 1.1.1
# Julia起動
Singularity julia.sif:~/containers> julia
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.1.1 (2019-05-16)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia>
これを行うと,そのコンテナのシェルにログインします.プロンプトが表示されていると思います.
そこではコンテナの環境が持つ各種コマンドを利用することができます.
この状態で,"julia"と打ち込むと,Juliaが起動し,コマンドを入力できるようになります.
execコマンド
これはコンテナのシェルにログインせず,外からそのコンテナの環境に処理させるコマンドを与える方法です.
最近流行りのデータサイエンスや深層学習の処理などまとまったスクリプトを実行するときに便利でしょう.
構文は次のようになります.
$ singularity exec イメージファイル名 実行させるコマンド
試しに,JuliaでHello worldと表示させるだけのスクリプトを作ってみます(全く実用的ではないですが・・・).
println("hello world!")
では,このファイルを実行してみます.julia.sifのコンテナ内で"julia test.jl"コマンドを実行しています.
$ singularity exec julia.sif julia test.jl
hello world!
終わりに
singularityには様々なコマンドが存在しますが,おそらくshellとexecは使用頻度の非常に高いものではないでしょうか.
singularityの入ったサーバでプログラムを実行しようと思っている人の参考に少しでもなれば幸いです.