Spackによるソフトウェア管理
Spackとは、Lawrence Livermore National Laboratoryで開発されている高性能計算向けのソフトウェアパッケージ管理システムです。 Spackを使うことにより、同一ソフトウェアをバージョン、設定、コンパイラを様々に変えて複数ビルドし、切り替えて使うことができます。 システムH上でSpackを使うことによりシステムHが標準でサポートしていないソフトウェアを簡単にインストールすることができるようになります。
Note
動作確認はbashで行っており、その時の最新のバージョンである0.23.1を使用しています。
Caution
-
Spackは、独自のパッケージフォーマットでパッケージングされたHPC向けのソフトウェアを導入するためのツールであり、Linuxディストリビューションが提供するパッケージとの互換性はありません。そのためyum,aptなどのコマンドの代替として利用することはできません。
-
Spackは、Spackをインストールしたディレクトリ以下にソフトウェアをインストールします。多数のソフトウェアを導入すると多くの容量を消費しますので、使わなくなったソフトウェアはアンインストールするなどの管理をしてください。
Spack環境設定
Note
Spack を使ってインストールしたソフトウェアは、OS に依存する場合があります。ソフトウェアを主に計算ノード上で実行する場合は、Spack の環境設定やソフトウェアのインストールなどの操作を、計算ノード上で実行することを推奨します。計算ノード上での操作方法については、インタラクティブジョブを参照してください。
インストール
GitHubからcloneし、使用するバージョンをcheckoutすることで、Spackをインストールすることができます。
[username@qhXXX ~]$ git clone https://github.com/spack/spack.git
[username@qhXXX ~]$ cd ./spack
[username@qhXXX ~/spack]$ git checkout v0.23.1
以降はターミナル上で、Spackを有効化するスクリプトを読み込めば使えます。
[username@qhXXX ~]$ source ${HOME}/spack/share/spack/setup-env.sh
システムH用設定
コンパイラの登録
Spackで使用するコンパイラをspack compiler find
コマンドでSpackに登録します。
[username@qhXXX ~]$ spack compiler find
==> Added 1 new compiler to /home/username/.spack/linux/compilers.yaml
gcc@11.4.1
==> Compilers are defined in the following files:
/home/username/.spack/linux/compilers.yaml
登録されたコンパイラはspack compiler list
コマンドで確認できます。
GCC 11.4.1は標準のパス(/usr/bin)に入っているため、Spackが自動的に見つけます。
[username@qhXXX ~]$ spack compiler list
==> Available compilers
-- gcc rocky9-x86_64 --------------------------------------------
gcc@11.4.1
外部パッケージの登録
${HOME}/.spack/packages.yaml
ファイルを作成し、spack
に外部パッケージを登録します。以下の例では、シス
テムHにインストール済みのcuda
とopenmpi
を外部パッケージとしてspack
に登録します。
[username@qhXXX ~]$ cat ${HOME}/.spack/packages.yaml
packages:
cuda:
externals:
- spec: cuda@12.6.77
prefix: /apps/cuda/12.6.2
buildable: false
openmpi:
externals:
- spec: openmpi@4.1.7
prefix: /apps/rocky9/openmpi/4.1.7/gcc11.4.1
environment:
prepend_path:
LD_LIBRARY_PATH: /opt/pbs/lib
buildable: false
Spack 基本操作
Spackの基本操作についてまとめます。 詳細は公式ドキュメントを参照ください。
コンパイラ関連
Spackに登録されているコンパイラ一覧はcompiler list
サブコマンドで確認できます。
[username@qhXXX ~]$ spack compiler list
==> Available compilers
-- gcc rocky9-x86_64 --------------------------------------------
gcc@11.4.1
特定コンパイラの詳細情報を確認するには、compiler info
サブコマンドを実行します。
[username@qhXXX ~]$ spack compiler info gcc@11.4.1
gcc@11.4.1:
paths:
cc = /usr/bin/gcc
cxx = /usr/bin/g++
f77 = /usr/bin/gfortran
fc = /usr/bin/gfortran
modules = []
operating system = rocky9
[username@qhXXX ~]$
ソフトウェア管理関連
インストール
install
サブコマンドを使ってソフトウェアのインストールができます。以下の例では、ソフトウェアhdf5
を指定しています。+mpi ^openmpi@4.1.7 ^zlib
の意味に関しては利用事例を参照ください。
[username@qhXXX ~]$ spack install hdf5 +mpi ^openmpi@4.1.7 ^zlib
ソフトウェアのバージョンを指定する場合は、@
で指定します。以下の例では、ソフトウェアのバージョンhdf5@1.14.5
を指定しています。
[username@qhXXX ~]$ spack install hdf5@1.14.5 +mpi ^openmpi@4.1.7 ^zlib
コンパイラを指定する場合は%
で指定します。 以下の例では、コンパイラのバージョン%gcc@11.4.1
を指定しています。
[username@qhXXX ~]$ spack install hdf5@1.14.5 %gcc@11.4.1 +mpi ^openmpi@4.1.7 ^zlib
アンインストール
uninstall
サブコマンドで、インストール済みのソフトウェアをアンインストールできます。 インストール同様に、バージョンを指定してアンインストールもできます。
[username@qhXXX ~]$ spack uninstall hdf5
ソフトウェアのハッシュを指定してアンインストールすることもできます。 /
に続いてハッシュを指定します。 ハッシュは情報確認に示す通り、find
サブコマンドで取得できます。
[username@qhXXX ~]$ spack uninstall /a3hhbzs
インストールした全てのソフトウェアを一括して削除するには以下の通りに実行します。
[username@qhXXX ~]$ spack uninstall --all
情報確認
Spackでインストールできるソフトウェア一覧は、list
サブコマンドで確認できます。
[username@qhXXX ~]$ spack list
3dtk
3proxy
7zip
abacus
abduco
(sinp)
キーワードを指定することで、キーワードを名前の一部に含むソフトウェアのみを表示できます。 以下ではhdf5
をキーワードとして指定しています。
[username@qhXXX ~]$ spack list hdf5
hdf5 hdf5-blosc hdf5-vfd-gds hdf5-vol-async hdf5-vol-cache hdf5-vol-daos hdf5-vol-external-passthrough hdf5-vol-log r-hdf5array r-hdf5r r-rhdf5 r-rhdf5filters r-rhdf5lib
==> 13 packages
インストールしたソフトウェア一覧はfind
サブコマンドで確認できます。
[username@qhXXX ~]$ spack find
-- linux-rocky9-sapphirerapids / gcc@11.4.1 ---------------------
berkeley-db@18.1.40 ca-certificates-mozilla@2023-05-30 curl@8.10.1 gcc-runtime@11.4.1 glibc@2.34 hdf5@1.14.5 ncurses@6.5 openmpi@4.1.7 perl@5.40.0 readline@8.2
bzip2@1.0.8 cmake@3.30.5 diffutils@3.10 gdbm@1.23 gmake@4.4.1 libiconv@1.17 nghttp2@1.63.0 openssl@3.4.0 pkgconf@2.2.0 zlib@1.3.1
==> 20 installed packages
find -x
サブコマンドを使って明示的に spack install
したものだけを確認できます。依存としてインストールされたパッケージ(間接的なもの)は表示されません。
[username@qhXXX ~]$ spack find -x
-- linux-rocky9-sapphirerapids / gcc@11.4.1 ---------------------
hdf5@1.14.5
==> 1 installed package
インストールしたソフトウェアのハッシュ、依存関係はfind
サブコマンドに-dl
オプションを指定することで確認できます。
[username@qhXXX ~]$ spack find -dl hdf5
-- linux-rocky9-sapphirerapids / gcc@11.4.1 ---------------------
a3hhbzs hdf5@1.14.5
bdttell cmake@3.30.5
2sv6hwn curl@8.10.1
abymidn nghttp2@1.63.0
4fqkvhj diffutils@3.10
rlnptyi libiconv@1.17
5mq4inh openssl@3.4.0
6zendi2 ca-certificates-mozilla@2023-05-30
452zos6 perl@5.40.0
scejuv7 berkeley-db@18.1.40
2f6gk64 bzip2@1.0.8
2ks6icd gdbm@1.23
nxmgskx readline@8.2
4rldltn ncurses@6.5
c3tvkzw gcc-runtime@11.4.1
g72vngu glibc@2.34
opeozka gmake@4.4.1
wqattmt openmpi@4.1.7
rbbvls7 pkgconf@2.2.0
dfgnlvi zlib@1.3.1
==> 1 installed package
特定のソフトウェアの詳細情報を確認するには、info
サブコマンドを使用します。
[username@qhXXX ~]$ spack info hdf5
CMakePackage: hdf5
Description:
HDF5 is a data model, library, and file format for storing and managing
data. It supports an unlimited variety of datatypes, and is designed for
flexible and efficient I/O and for high volume and complex data.
(snip)
特定ソフトウェアの、インストール可能なバージョン一覧はversions
サブコマンドで確認できます。
[username@qhXXX ~]$ spack versions hdf5
==> Safe versions (already checksummed):
develop-2.0 develop-1.12 develop-1.8 1.14.4-3 1.14.2 1.14.0 1.12.2 1.12.0 1.10.10 1.10.8 1.10.6 1.10.4 1.10.2 1.10.0-patch1 1.8.23 1.8.21 1.8.18 1.8.16 1.8.14 1.8.12
develop-1.14 develop-1.10 1.14.5 1.14.3 1.14.1-2 1.12.3 1.12.1 1.10.11 1.10.9 1.10.7 1.10.5 1.10.3 1.10.1 1.10.0 1.8.22 1.8.19 1.8.17 1.8.15 1.8.13 1.8.10
==> Remote versions (not yet checksummed):
1.14.5-ubuntu-2204 1.14.4-3-ubuntu-2204 1.14.4-3.html.abi.reports 1.14.3-osx12 1.14.2.html.abi.reports 1.14.0.html.abi.reports
1.14.5.html.abi.reports 1.14.4-3-osx12 1.14.3-ubuntu-2204 1.14.3.html.abi.reports 1.14.1.html.abi.reports
ソフトウェア利用方法
Spackでインストールしたソフトウェアはload
サブコマンドで使用可能です。 ABCI-Qが提供するモジュール同様に、ロードして使用できます。
[username@qhXXX ~]$ spack load xxxxx
spack load
はソフトウェアを使用するためのPATH
、MANPATH
、CPATH
、LD_LIBRARY_PATH
等の環境変数を設定します。
ロード済みのソフトウェアを確認するにはfind --loaded
サブコマンドを使用します。
[username@qhXXX ~]$ spack find --loaded
不要になった場合は、unload
サブコマンドを使用します。
[username@qhXXX ~]$ spack unload xxxxx
利用事例
hdf5
を使った利用事例を説明します。
ソフトウェアのインストール方法
計算ノード上で実施します。
先ず、以下のコマンドを使って、spack
をロードします。
[username@qhXXX ~]$ source ${HOME}/spack/share/spack/setup-env.sh
hdf5
をインストールする前にspec
サブコマンドを使ってソフトウェア構成を確認します。
[username@qhXXX ~]$ spack spec hdf5 +mpi ^openmpi@4.1.7 ^zlib
[+] hdf5@1.14.5%gcc@11.4.1~cxx~fortran~hl~ipo~java~map+mpi+shared~subfiling~szip~threadsafe+tools api=default build_system=cmake build_type=Release generator=make arch=linux-rocky9-sapphirerapids
[+] ^cmake@3.30.5%gcc@11.4.1~doc+ncurses+ownlibs~qtgui build_system=generic build_type=Release patches=dbc3892 arch=linux-rocky9-sapphirerapids
[+] ^curl@8.10.1%gcc@11.4.1~gssapi~ldap~libidn2~librtmp~libssh~libssh2+nghttp2 build_system=autotools libs=shared,static tls=openssl arch=linux-rocky9-sapphirerapids
[+] ^nghttp2@1.63.0%gcc@11.4.1 build_system=autotools arch=linux-rocky9-sapphirerapids
[+] ^diffutils@3.10%gcc@11.4.1 build_system=autotools arch=linux-rocky9-sapphirerapids
[+] ^libiconv@1.17%gcc@11.4.1 build_system=autotools libs=shared,static arch=linux-rocky9-sapphirerapids
[+] ^openssl@3.4.0%gcc@11.4.1~docs+shared build_system=generic certs=mozilla arch=linux-rocky9-sapphirerapids
[+] ^ca-certificates-mozilla@2023-05-30%gcc@11.4.1 build_system=generic arch=linux-rocky9-sapphirerapids
[+] ^perl@5.40.0%gcc@11.4.1+cpanm+opcode+open+shared+threads build_system=generic arch=linux-rocky9-sapphirerapids
[+] ^berkeley-db@18.1.40%gcc@11.4.1+cxx~docs+stl build_system=autotools patches=26090f4,b231fcc arch=linux-rocky9-sapphirerapids
[+] ^bzip2@1.0.8%gcc@11.4.1~debug~pic+shared build_system=generic arch=linux-rocky9-sapphirerapids
[+] ^gdbm@1.23%gcc@11.4.1 build_system=autotools arch=linux-rocky9-sapphirerapids
[+] ^readline@8.2%gcc@11.4.1 build_system=autotools patches=bbf97f1 arch=linux-rocky9-sapphirerapids
[+] ^ncurses@6.5%gcc@11.4.1~symlinks+termlib abi=none build_system=autotools patches=7a351bc arch=linux-rocky9-sapphirerapids
[+] ^gcc-runtime@11.4.1%gcc@11.4.1 build_system=generic arch=linux-rocky9-sapphirerapids
[e] ^glibc@2.34%gcc@11.4.1 build_system=autotools arch=linux-rocky9-sapphirerapids
[+] ^gmake@4.4.1%gcc@11.4.1~guile build_system=generic arch=linux-rocky9-sapphirerapids
[e] ^openmpi@4.1.7%gcc@11.4.1+atomics~cuda~cxx~cxx_exceptions~debug~gpfs~internal-hwloc~internal-libevent~internal-pmix~java~lustre~memchecker~openshmem~orterunprefix+romio+rsh~singularity~static~two_level_namespace+vt+wrapper-rpath build_system=autotools fabrics=none romio-filesystem=none schedulers=none arch=linux-rocky9-sapphirerapids
[+] ^pkgconf@2.2.0%gcc@11.4.1 build_system=autotools arch=linux-rocky9-sapphirerapids
[+] ^zlib@1.3.1%gcc@11.4.1+optimize+pic+shared build_system=makefile arch=linux-rocky9-sapphirerapids
上記の出力で^openmpi@4.1.7%gcc@11.4.1
行の先頭に[e]
が表示されていることを確認してください。[e]
は外部パッケージという意味で、システムにインストール済みのopenmpi
が使われます。[e]
と違う表示がある場合、外部パッケージの登録が正しくできていない可能性があります。設定を確認してください。
実際にhdf5
をインストールします。
[username@qhXXX ~]$ spack install hdf5 +mpi ^openmpi@4.1.7 ^zlib
+mpi
:mpi
を有効にしてビルドします。^openmpi@4.1.7
: 依存するソフトウェアやバージョンを指定します。^
は依存するソフトウェアという意味です。^zlib
: 依存ソフトウェアのバージョン指定が無い場合は、spack
が提供する標準バージョンが使用されます。
インストールされたパスを確認します。
[username@qhXXX ~]$ spack find --path hdf5@1.14.5
-- linux-rocky9-sapphirerapids / gcc@11.4.1 ---------------------
hdf5@1.14.5 /home/username/spack/opt/spack/linux-rocky9-sapphirerapids/gcc-11.4.1/hdf5-1.14.5-a3hhbzsp6wg26vjpcjdets6rrr5l3vpj
==> 1 installed package
プログラムの作成・コンパイル
以下のサンプルプログラムを使用します。
[username@qhXXX hdf5]$ cat test_hdf5_mpi.c
#include <mpi.h>
#include <hdf5.h>
#include <stdio.h>
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("Hello from rank %d\n", rank);
// Get HDF5 version
unsigned majnum, minnum, relnum;
H5get_libversion(&majnum, &minnum, &relnum);
printf("HDF5 library version: %u.%u.%u\n", majnum, minnum, relnum);
MPI_Finalize();
return 0;
}
インストール済みのhdf5
をロードします。
[username@qhXXX hdf5]$ spack find --loaded
==> 0 loaded packages
[username@qhXXX hdf5]$ spack load hdf5
[username@qhXXX hdf5]$ spack find --loaded
-- linux-rocky9-sapphirerapids / gcc@11.4.1 ---------------------
hdf5@1.14.5
==> 1 loaded package
サンプルプログラムをコンパイルします。
[username@qhXXX hdf5]$ which h5cc
~/spack/opt/spack/linux-rocky9-sapphirerapids/gcc-11.4.1/hdf5-1.14.5-a3hhbzsp6wg26vjpcjdets6rrr5l3vpj/bin/h5cc
[username@qhXXX hdf5]$ h5cc test_hdf5_mpi.c -o test_hdf5_mpi
ジョブスクリプトの作成
インタラクティブノードからジョブ操作を行います。
ジョブスクリプトを作成します。以下は上記のプログラムをシステムに実行するためのサンプルジョブスクリプトです。
[username@qesXX hdf5]$ cat hdf5_job.sh
#!/bin/bash
#PBS -l rt_QF=2:mpiprocs=2
#PBS -l walltime=00:05:00
#PBS -l place=scatter
#PBS -W group_list=<group_name>
#PBS -j oe
cd $PBS_O_WORKDIR
echo "nodes:"
cat $PBS_NODEFILE
source ~/spack/share/spack/setup-env.sh
spack load hdf5
export LD_LIBRARY_PATH=/opt/pbs/lib:$LD_LIBRARY_PATH
echo -e "\nrun:"
which mpirun
mpirun ./test_hdf5_mpi
ジョブの投入
ジョブを投入します。
[username@qesXX hdf5]$ qsub hdf5_job.sh
26953.qjcm
ジョブ結果の確認
ジョブの出力ファイルを確認します。
[username@qesXX hdf5]$ cat hdf5_job.sh.o26953
nodes:
qh500
qh500
qh497
qh497
run:
/apps/rocky9/openmpi/4.1.7/gcc11.4.1/bin/mpirun
Hello from rank 1
Hello from rank 0
HDF5 library version: 1.14.5
HDF5 library version: 1.14.5
Hello from rank 2
Hello from rank 3
HDF5 library version: 1.14.5
HDF5 library version: 1.14.5