0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Apptainerことはじめ

Last updated at Posted at 2025-05-04

Apptainer

Apptainer - Portable, Reproducible Containers: Singularityと呼ばれていたものが、Linux Foundationに入ることによってApptainerに変わった。

関連ポスト: Singularityことはじめ #初心者 - Qiita

Ubuntu22.04へのインストール

cat /etc/lsb-relase

出力
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"

で、入れるディストリビューションはUbuntu 22.04。
chatGPT先生の教えに従って、関連ライブラリをインストール:

sudo apt update
sudo apt install -y build-essential libseccomp-dev pkg-config squashfs-tools cryptsetup

あとは公式Installing Apptainer — Apptainer Admin Guide main documentationのInstall Debian packagesの箇所に従って、以下のコマンドでGithubからdebファイルをとってきてインストール:

export VERSION=1.4.0  # 2025/5/5時点最新安定版
wget https://github.com/apptainer/apptainer/releases/download/v${VERSION}/apptainer_${VERSION}_amd64.deb
sudo dpkg -i apptainer_${VERSION}_amd64.deb

トラブルシューティング

conflicting packages - not installing apptainer

error message
dpkg: error processing archive apptainer_1.4.0_amd64.deb (--install):
 conflicting packages - not installing apptainer
Errors were encountered while processing:
 apptainer_1.4.0_amd64.deb

でインストール未達だった。
前の記事Singularityことはじめ #初心者 - Qiitaで、singularity-ceを入れていたので、そことコンフリクトしていた。
sudo apt remove singularity-ceで消した後にsudo dpkg -i apptainer_${VERSION}_amd64.debでインストール完了。

例えばapptainer --versionsingularity --version

apptainer version 1.4.0

が返ってくる。

oneapi-hpckitのコンテナoneapi-hpckit.sifをつくって使ってみる

oneapi-hpckit.def
Bootstrap: docker
From: intel/oneapi-hpckit:2025.1.1-0-devel-ubuntu22.04

%post
    apt-get update && apt-get install -y build-essential
    echo 'source /opt/intel/oneapi/setvars.sh' >> /environment
    echo 'source /opt/intel/oneapi/setvars.sh' >> /etc/profile.d/oneapi.sh

%environment
    source /opt/intel/oneapi/setvars.sh

%runscript
    echo "Intel oneAPI HPC Toolkit container is ready."
    exec "$@"

apptainer build oneapi-hpckit.sif oneapi-hpckit.defでコンテナを作成。このコマンドには特にsudoは必要ない。

apptiner shell oneapi-hpckit.sifでコンテナに入って操作してみる

apptiner shell oneapi-hpckit.sifでコンテナに入る。
ここでの環境は、基本的にホストと無関係にコンテナ内に構築されたものだが、$HOME$PWD/tmpはホストと共有されたものになっている。この共有はread+writeで、コンテナ内で作成した$HOME, $PWD, /tmpのファイルはコンテナを閉じた後も残る。この点が、dockerのコンテナとは決定的に違うポイント。

oneapi-hpckitのdockerコンテナをベースにしているので、

Apptainer> which ifx
/opt/intel/oneapi/compiler/2025.1/bin/ifx
Apptainer> mpiifx --version
ifx (IFX) 2025.1.1 20250418
Copyright (C) 1985-2025 Intel Corporation. All rights reserved.

といった出力が得られる。

トラブルシューティング

ネットワークの不安定?

何度やっても以下のエラーが出る。 20回くらい試みても、ほとんどの試行は以下のエラーで止まる:

FATAL:   While performing build: conveyor failed to get: error writing layer: local error: tls: bad record MAC

エラーが出る時間が違うので、多分ネットワークの不安定性によるものと判断。一旦docker pullで落としてそこから作ることにした。

sudo docker pull intel/oneapi-hpckit:2025.1.1-0-devel-ubuntu22.04
sudo docker save intel/oneapi-hpckit:2025.1.1-0-devel-ubuntu22.04 -o oneapi-hpckit.tar
sudo apptainer build oneapi-hpckit.sif docker-archive://oneapi-hpckit.tar

oneapi-hpckit.sifができる。docker pullの方が何となく、ネットワークの不安定性に強いよう。
こちらのコマンドでは、docker-archive://oneapi-hpckit.tarにアクセスするために、最後のコマンドにsudoが必要。

oneapi-hpckitのコンテナoneapi-hpckit.sifを改造する

なんでoneapi-hpckitのコンテナを作ったかって、そりゃoneapi-hpckitに入っているMPIライブラリをリンクしたインテルのコンパイラでビルドしたアプリの入ったコンテナを作りたかったからである。というわけで、oneapi-hpckit.sifを改造して、自分がビルドしたいアプリケーションを入れ込んだsifコンテナを作る。

基本的な流れは(ChatGPT先生による提案により)

# 1. 展開
apptainer build --sandbox my_sandbox/ base.sif

# 2. 修正
apptainer shell --writable my_sandbox/
# → apt install, ファイル編集, ビルドなど
# apt installする際はコマンドをsudo apptainer...にしておいたほうがよい

# 3. 再パッケージ化(任意)
sudo apptainer build my_modified.sif my_sandbox/

Elk-10.4.9を/opt/elk/src/elkとして追加したoneapi-hpckit4elk.sifを作る

まず適当なディレクトリでsandboxを作成:

apptainer build --sandbox my_sandbox/ oneapi-hpckit.sif

次にvimlessを入れるために管理者権限で入る:

sudo apptainer shell --writable my_sandbox/
Apptainer> apt update
Apptainer> apt install vim
Apptainer> apt install less

でファイル書き換えや閲覧の準備完了。

The Elk Codeビルドの備忘録 #DFT - Qiita
に則って、Elk-10.4.9をsandbox内の/root/sources/elk-10.4.9にインストールする。(Elkは古式ゆかしいアプリケーションなので、prefix等でインストール先を指定するようなことはしない)

ln -s /root/sources/elk-10.4.9 /opt/elk

/opt/elkにシンボリックリンクを貼る。つまり、実行するファイルは/opt/elk/src/elkとしてアクセスできるようにした。ここにPATHを通したい。

Apptainerコンテナ内でPATHを通すためのお作法としては/.singularity.d/env/90-environment.shに環境変数の更新案を記入するのが適切な方法の一つであるとchatGPTに習ったので、

/.singularity.d/env/90-environment.sh(抜粋)
export PATH="/opt/elk/src:$PATH"

を追記した。これでwhich elkを入力すると、PATHが通っていることが確認できる。

このsandboxをsifコンテナにまとめる:

sudo apptainer build oneapi-hpckit4elk.sif ./my_sandbox

こうしてできたコンテナにapptainer shell oneapi-hpckit4elk.sifで入って、which elkで適切にPATHが通っているかどうか確認できる。

トラブルシューティング

dpkg: error: requested operation requires superuser privilege

vimをインストールする際にapptainer shell --writable my_sandbox/としてapt install vimを実行すると

出力(抜粋)
perl: warning: Falling back to a fallback locale ("C.UTF-8").
debconf: delaying package configuration, since apt-utils is not installed
dpkg: error: requested operation requires superuser privilege
E: Sub-process /usr/bin/dpkg returned an error code (2)

となって、インストールできない。これを解決するためにはsandboxに入るときにsudo apptainer shell --writable my_sandbox/で実行する必要がある。

Elk-10.4.9を/opt/elk/src/elkとして追加したoneapi-hpckit4elk.sifを実行

上で作ったsifコンテナを動かしてみる。前提として、ホストにはoneapi-hpckitの2025.1.0を入れてあり、ランタイムのmpirunはインストールされている。

今回作ったコンテナでは%runscriptelkは追加していないので、自動実行はされない。従って、apptainer exec oneapi-hpickit4elk.sif elk等として、明示的に実行コマンドを指定することになる。これをslurmで実行するスクリプトは以下の通り(参考URL:Slurmことはじめ #初心者 - Qiita):

calc.sh
#!/bin/bash
#SBATCH --job-name=ngridk_888
#SBATCH --time=02:00:00
#SBATCH --partition=debug
#SBATCH --ntasks=1 
#SBATCH --cpus-per-task=4

. /home/shinohara/intel/oneapi/setvars.sh

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

EXE=elk
MPIEXE=mpirun
SIF=/path/for/oneapi-hpickit4elk.sif

$MPIEXE apptainer exec $SIF $EXE > log.log

として、sbatch calc.shで期待通りに実行ができた

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?