コンテンツにスキップ

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にインストール済みのcudaopenmpiを外部パッケージとして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はソフトウェアを使用するためのPATHMANPATHCPATHLD_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
  • +mpimpiを有効にしてビルドします。
  • ^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