AWS ParallelCluster 環境で学ぶ Enroot の基本操作とPyxis 活用方法
AWS ParallelCluster 環境において、Enroot と Slurm を組み合わせたコンテナ実行方法を検証した結果を紹介します。本記事では、Enroot の基本的な使用方法から始め、Slurm との連携、Pyxis を利用した場合の実行方法を段階的に解説していきます。
検証環境
本検証の主な目的は以下の 2 点です。
- Enroot の基本的な操作方法の理解
- Pyxis 利用によるメリットの検証
項目 | バージョン | 備考 |
---|---|---|
AWS ParallelCluster | 3.11.0 | - |
OS | Ubuntu 22.04 | - |
Slurm | 23.11.10 | sinfo -V |
Enroot | 3.4.1 | enroot version |
Pyxis | Unknown | 調べ方がわかりませんでした |
Enroot 及び、Pyxis は ParallelCluster 3.11.0 から標準サポートされました。
enroot でコンテナを実行してみる
Enroot は、特権が不要なコンテナランタイムで、HPC 環境での利用に適しています。ここでは、cowsay イメージを例に、Enroot の基本的な使用方法を説明します。各ステップを詳しく見ていきましょう。
実行環境
ヘッドノードで試します。Slurm を使ったコンピュートノードで enroot コンテナ実行は後半で紹介します。
イメージ作成
まず、DockerHub から cowsay のイメージをインポートします。Docker コンテナイメージが.sqsh
形式のファイルになって保存されます。docker pull
したコンテナイメージがファイルとして保存されるといった感じです。
$ enroot import docker://chuanwen/cowsay
[INFO] Querying registry for permission grant
[INFO] Authenticating with user: <anonymous>
[INFO] Authentication succeeded
[INFO] Fetching image manifest list
--- 省略 ---
$ ls
chuanwen+cowsay.sqsh
cowsay
という名前をつけて enroot 用のイメージを作成します。
$ enroot create --name cowsay chuanwen+cowsay.sqsh
イメージが作成するとenroot list
コマンドで確認できます。docker images
的なものです。システム上で利用可能なコンテナイメージを表示してくれます。
$ enroot list
cowsay
コンテナ実行
作成したイメージはenroot start
コマンドで実行可能です。docker run --rm
的なものです。Enroot は実行終了時に自動的にコンテナを停止してくれます。
$ enroot start cowsay
_________________________________________
/ "Only a brain-damaged operating system \
| would support task switching and not |
| make the simple next step of supporting |
| multitasking." |
| |
\ -- George McFry /
-----------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
コマンドやオプションを指定して実行できます。cowsay
コマンド自体はフルパスで/usr/games/cowsay
指定しないとエラーになりました。イメージ名を cowsay としたため、非常にわかりづらい例となってしまいました。
$ enroot start cowsay /usr/games/cowsay -f dragon "I am a dragon."
______________
< I am a dragon. >
--------------
\ / \ //\
\ |\___/| / \// \\
/0 0 \__ / // | \ \
/ / \/_/ // | \ \
@_^_@'/ \/_ // | \ \
//_^_/ \/_ // | \ \
( //) | \/// | \ \
( / /) _|_ / ) // | \ _\
( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
(( / / )) ,-{ _ `-.|.-~-. .~ `.
(( // / )) '/\ / ~-. _ .-~ .-~^-. \
(( /// )) `. { } / \ \
(( / )) .----~-.\ \-' .~ \ `. \^-.
///.----..> \ _ -~ `. ^-` ^-_
///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
/.-~
その他
イメージのインポート時に任意の名前付けて保存
enroot import
実行時に--output
でファイルの保存名を指定できます。
$ enroot import --output my_cowsay docker://chuanwen/cowsay
デフォルトは「リポジトリ名 + イメージ名 + .sqsh」で保存されました。任意の名前を付けて保存もできます。
$ ls -lh | grep cowsay
-rw-r--r-- 1 ubuntu ubuntu 163M Oct 14 01:30 chuanwen+cowsay.sqsh
-rw-r--r-- 1 ubuntu ubuntu 163M Oct 14 02:17 my_cowsay
Slurm を使って enroot コンテナを実行してみる
Slurm は、HPC 環境で広く使用されているジョブスケジューラーです。ここでは、Slurm と Enroot を組み合わせて、コンテナを利用したジョブを実行する方法を紹介します。本セクションでは以下の 2 つのアプローチを比較します。
- Pyxis を利用しない基本的な実行方法
- Pyxis を利用した効率的な実行方法
この比較を通じて、Pyxis の利点を調べます。
Pyxis を利用しない基本的な実行方法
Slurm を使って愚直に enroot コンテナを実行するスクリプトを作成しました。enroot create
でイメージを作成しないとコンテナ実行に失敗するため enroot のイメージを作成しています。その影響でイメージ作成ログが標準出力に出力され、実行結果が見づらかったので/dev/null
に今回は捨てています。
#!/bin/bash
#SBATCH -p p2
#SBATCH -n 1
# コンテナイメージのパスを指定
CONTAINER_IMAGE=${PWD}/chuanwen+cowsay.sqsh
# Enrootを使用してコンテナを作成
CONTAINER_NAME="cowsay_container"
enroot create --name ${CONTAINER_NAME} ${CONTAINER_IMAGE} > /dev/null 2>&1
# コンテナを起動し、コマンドを実行
srun enroot start --mount ${PWD}:/workspace ${CONTAINER_NAME} \
/usr/games/cowsay "Hello from Slurm job!"
enroot コンテナをローカルで実行したときの流れをそのままスクリプトにしたかたちです。
実行結果
sbatch
でジョブをサブミットした結果です。無事実行できました。
$ cat slurm-14.out
_______________________
< Hello from Slurm job! >
-----------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Pyxis を利用した効率的な実行方法
Pyxis の利点が知りたく Pyxis を使うとスクリプトをどのように書けるのか試してみました。記述方法は Pytourch の実行サンプルをベースに、Pyxis を利用しない実行方法との差分から洗い出しました。
コンテナ引数の定義
--container-image
と --container-mounts
オプションを使用して、コンテナの設定を直接 srun コマンドに渡せました。
イメージの作成が不要
enroot create
ステップが不要になり、スクリプトがシンプルになりました。
srun の記述がシンプル
enroot start
すら記述せずに、コンテナイメージの指定と、コンテナ上のコマンドを実行する形式で記述できました。
#!/bin/bash
#SBATCH -p p2
#SBATCH -n 1
# コンテナイメージのパスを指定
CONTAINER_IMAGE=${PWD}/chuanwen+cowsay.sqsh
# コンテナ引数を定義
declare -a CONTAINER_ARGS=(
--container-image ${CONTAINER_IMAGE}
--container-mounts ${PWD}:/workspace
)
# 実行するコマンドとそのパラメータを定義
COMMAND="/usr/games/cowsay"
COMMAND_ARGS="Hello from Slurm job!"
# srunを使用してコンテナ内でコマンドを実行
srun "${CONTAINER_ARGS[@]}" ${COMMAND} "${COMMAND_ARGS}"
実行結果
sbatch
でジョブをサブミットした結果です。こちらも無事実行できました。
~$ cat slurm-6.out
_______________________
< Hello from Slurm job! >
-----------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
考察
Pyxis の利用により、以下の利点がありました。
- スクリプトの簡素化:
sbatch
で投げるスクリプトの記述が全体的に簡略化されました。 - イメージ作成プロセスの省略:
enroot create
ステップが不要になりました。 - srun コマンドの簡潔化: コンテナ関連のオプションが直接 srun に統合され、実行コマンドが直感的になりました。
これらの利点により、Slurm を利用する HPC 環境においてはコンテナ実行のユーザー体験は良くなります。
まとめ
本記事では、AWS ParallelCluster 環境における Enroot と Slurm の連携について確認しました。主なポイントは以下の通りです。
- Enroot の基本的な使用方法(イメージのインポート、作成、実行)
- Slurm を使用した Enroot コンテナの実行方法
- Pyxis を活用した効率的なコンテナ実行
Pyxis の導入により、Slurm を利用する環境下でコンテナを実行するのが楽になることを実感できました。Pyxis のプラグインをユーザー側で導入するなら一考の余地はあるかもしれないですが、ParallelCluster 3.11.0 でデフォルトで動作環境が整っているので使っていきましょう。
おわりに
本記事の検証を通じて、AWS ParallelCluster 環境における Enroot、Slurm、そして Pyxis を利用することの意味がわかりました。これらのツールを組み合わせることで、HPC 環境でのコンテナ利用がより効率的かつ管理しやすくなります。