8. Singularity使用方法¶
Singularity は、HPCクラスタ向けに設計されたコンテナプラットフォームです。Docker HubやNVIDIA NGCなどのコンテナレジストリから既存のコンテナイメージを取得して実行環境を構築できます。
8.1. コンテナイメージの作成(pull)¶
Docker Hubなどのコンテナレジストリからイメージを取得し、Singularity専用の単一ファイル形式である .sif (Singularity Image Format)を作成します。
・Docker Hubからのイメージ取得例
# Docker Hub から Ubuntu イメージを取得して .sif ファイルを作成
$ singularity pull ubuntu_2404.sif docker://ubuntu:24.04
コマンドが正常に終了すると、カレントディレクトリに ubuntu_2404.sif が作成されます。
注意
コンテナイメージの取得(pull)や作成はフロントエンドノードで行ってください。
また、必要となる学習データセット等のダウンロードも事前にフロントエンドノードで行ってください。
8.2. キャッシュの削除(cache clean)¶
Singularityでコンテナイメージの取得(pull)を行うと、ホームディレクトリ配下のキャッシュ領域( ~/.singularity/cache )にダウンロードされたレイヤーやメタデータが保存されます。
放置するとホームディレクトリのディスククォータを圧迫するため、イメージ取得後は都度キャッシュの削除(cache clean)を行ってください。
8.2.1. キャッシュ一覧の確認¶
現在保存されているキャッシュの一覧と容量は、 singularity cache list コマンドで確認できます。
$ singularity cache list
詳細な一覧を確認する場合は、 -v (verbose)オプションを指定します。
$ singularity cache list -v
8.2.2. キャッシュの削除¶
蓄積されたキャッシュを削除するには、 singularity cache clean コマンドを使用します。
・対話形式でキャッシュを削除する場合:
$ singularity cache clean
実行すると確認プロンプト( Do you want to continue? [y/N] )が表示されますので、 y を入力して削除します。
・確認プロンプトを出さずにすべてのキャッシュを一括削除する場合:
--all ( -a )および --force ( -f )オプションを指定することで、確認なしですべてのキャッシュを一括削除できます。
$ singularity cache clean --all --force
8.3. コンテナの実行方法¶
コンテナを実行する主なコマンドは以下の通りです。
コマンド |
説明 |
|---|---|
|
コンテナ内で指定したコマンドを実行します。 |
|
コンテナ内のシェルを対話的に起動します。 |
|
コンテナにあらかじめ定義された標準動作(runscript)を実行します。 |
主なオプション:
--nv: NVIDIA GPUをコンテナ内で利用可能にします(アクセラレータ搭載サーバで必須)。-B <ホストパス>:<コンテナパス>(または--bind): ホスト環境のディレクトリをコンテナ内にマウントします。
8.4. ジョブスクリプト例¶
バッチジョブとして実行する場合のジョブスクリプト例を以下に示します。
8.4.1. 大規模並列計算サーバ(CPU)での実行例¶
Docker Hubから取得したUbuntuコンテナ上でスクリプトやコマンドを実行する例です。
#!/bin/sh
#PBS -l select=1:ncpus=4:mem=16gb
#PBS -q CP_001
#PBS -N singularity_cpu
cd $PBS_O_WORKDIR
singularity exec ubuntu_2404.sif cat /etc/os-release > result.out 2> result.err
8.4.2. アクセラレータ搭載サーバ(GPU)での実行例¶
GPUを利用するコンテナを実行する場合、 --nv オプションを指定します。
#!/bin/sh
#PBS -l select=1:ncpus=2:ngpus=1:mem=32gb
#PBS -q CA_001
#PBS -N singularity_gpu
cd $PBS_O_WORKDIR
singularity exec --nv nvidia_container.sif nvidia-smi > result.out 2> result.err