1. Spackとは

  • Spackは主にスーパーコンピュータ向けのパッケージ管理ツールです。詳細は公式ページ https://spack.io/ をご覧ください。

  • スーパーコンピュータ「富岳」ではSpackを用いてオープンソースソフトウェア(OSS)を管理、提供します。

  • 利用頻度の高いOSSについては、システム側でSpackインスタンスを用意してビルド済みのOSSを提供します。この部分を「パブリック・インスタンス」と呼びます。

  • 各ユーザがホームディレクトリ以下にSpackインスタンスを保持し各自でOSSをビルドして利用することもできます。この部分を「プライベート・インスタンス」と呼びます。

  • プライベート・インスタンスを利用の際にも、「チェイニング」の機能を用いることでパブリック・インスタンスで提供されるビルド済みOSSを参照・利用可能です。この機能を用いることで、依存関係のために多数のOSSをビルドする負荷を軽減することができます。

  • Spackは単一のインスタンスで複数の環境を混合して利用することができます。典型的には同一パッケージに対して

    • ログインノードのx86向けのビルド(GCC)

    • 計算ノードのA64FX向けのビルド(富士通コンパイラ)

    が共存できます。

2. パブリック・インスタンスの利用

システム側でビルド済みのOSSを利用する場合、環境の読み込みのみで利用可能です。

注釈

ジョブでパブリック・インスタンスを利用する場合には、環境変数 PJM_LLIO_GFSCACHE/vol0004 を指定する必要があります。詳しくは、「利用手引書 -利用およびジョブ実行編-」の「8.8. 利用ファイルシステム(volume)の選択」 をご参照ください。

2.1. 環境の読み込み

コマンドラインで以下のようにすることでSpackが利用可能になります。 bash の場合:

$ . /vol0004/apps/oss/spack/share/spack/setup-env.sh

csh/tcsh の場合:

$ setenv SPACK_ROOT /vol0004/apps/oss/spack
$ source /vol0004/apps/oss/spack/share/spack/setup-env.csh

バッチ型ジョブで利用する場合はジョブスクリプトにも同様の記述をしてください。

注釈

  • ログインシェルの .bashrc 等にこの記述をすると、ファイルシステムにトラブルがあったとき最悪ログインすらできなくなるおそれがあるため現時点ではお勧めできません。

  • Spackは、環境変数 TMPDIR に指定されたディレクトリに、各種の作業ファイルを配置します。2024年4月25日現在、デフォルトの状態で TMPDIR はホームディレクトリに指定されているため、Spackを利用する際に「Disk quota exceeded」のエラーが発生する可能性があります。そのような場合には、以下のページに記載されている通り TMPDIR を指定してください。

    https://www.fugaku.r-ccs.riken.jp/operation/20220408_01

2.2. ビルド済みパッケージの確認

コマンドラインで

$ spack find -x

とすることで利用可能なOSSの一覧が得られます。 2024-04-25現在では以下のようになっています:

login4$ spack find -x
-- linux-rhel8-a64fx / fj@4.8.0 ---------------------------------
fds@6.7.7

-- linux-rhel8-a64fx / fj@4.8.1 ---------------------------------
fds@6.7.9
ffvhc-ace@0.1

-- linux-rhel8-a64fx / fj@4.10.0 --------------------------------
adios2@2.9.2
akaikkr@2002v010
akaikkr@2021v001
akaikkr@2021v002
alamode@1.3.0
alamode@1.4.2
alamode@1.5.0
assimp@5.3.1
batchedblas@1.0
bcftools@1.12
bedtools2@2.31.0
biobambam2@2.0.177
blitz@1.0.2
boost@1.83.0
bwa@0.7.17
cairo@1.16.0
cblas@2015-06-06
cmake@3.17.1
cmake@3.21.4
cmake@3.27.7
cp2k@2023.1
cp2k@2023.1
cp2k@2023.1
cp2k@2023.1
cpmd@4.3
cppunit@1.14.0
cppunit@1.14.0
darshan-runtime@3.4.0
double-conversion@3.3.0
dssp@3.1.4
eigen@3.4.0
eigenexa@2.6
ermod@0.3.6
ffb@9.0
ffx@03.01
fribidi@1.0.12
frontistr@5.4
frontistr@5.5
fugaku-frontistr@master
fujitsu-fftw@1.1.0
fujitsu-mpi@head
fujitsu-ssl2@head
genesis@2.1.1
genesis@2.1.1
genesis@2.1.2
genesis@2.1.2
glib@2.74.1
glib@2.74.7
glib@2.74.7
glm@0.9.9.8
gmt@6.2.0
gobject-introspection@1.56.1
grads@2.2.3
gromacs@2020.6
gromacs@2021.5
gromacs@2022.4
gromacs@2023.4
gromacs@2024
gromacs@2024.1
hdf5@1.14.3
hphi@3.5.1
htslib@1.12
icu4c@67.1
improved-rdock@main
kiertaa@1.0.0b
kokkos@3.7.00
kokkos@4.2.01
lammps@20201029
lammps@20220623.2
lammps@20230802.3
libmmtf-cpp@1.1.0
libxc@6.2.2
libxrandr@1.5.3
libxscrnsaver@1.2.2
libxscrnsaver@1.2.2
libxt@1.1.5
lis@2.1.1
mesa@23.0.3
meson@1.2.1
meson@1.2.2
modylas-new@1.1.0
modylas-new@1.1.0
modylas-new@1.1.0
mptensor@0.3.0
mvmc@1.2.0
n2p2@2.1.4
nemo@4.2.0
netcdf-c@4.9.2
netcdf-cxx@4.2
netcdf-cxx4@4.3.1
netcdf-fortran@4.6.1
netlib-lapack@3.10.1
netlib-scalapack@2.2.0
ninja@1.11.1
nwchem@master
octa@8.4
onednn@3.0
openblas@0.3.21
openblas@0.3.21
openfdtd@3.1.1
openfoam@2012
openfoam@2106
openfoam@2112
openfoam@2206
openfoam@2212
openfoam@2306
openfoam@2312
openfoam-org@8
openfoam-org@9
openfoam-org@10
openfoam-org@11
openjdk@11.0.20.1_1
openmx@3.9.9
parallel-netcdf@1.12.3
paraview@5.11.2
parmetis@4.0.3
perl-test-needs@0.002010
perl-uri@5.08
petsc@3.19.6
pfapack@2014-09-17
phase0@2021.02
phase0@2021.02
phase0@2023.01
phase0@2023.01
picard@3.0.0
pixman@0.42.2
pixman@0.42.2
povray@3.7.0.8
py-ase@3.21.1
py-bottleneck@1.3.7
py-cython@3.0.4
py-dask@2022.10.2
py-devito@4.8.1
py-flit-core@3.9.0
py-h5py@3.8.0
py-hypothesis@6.23.1
py-jupyterhub@0.9.4
py-matplotlib@3.3.4
py-meson-python@0.13.1
py-mpi4py@3.1.4
py-msgpack@1.0.3
py-netcdf4@1.6.2
py-numexpr@2.8.4
py-numpy@1.22.4
py-numpy@1.25.2
py-packaging@23.1
py-packaging@23.1
py-pandas@2.1.2
py-pip@23.0
py-pip@23.0
py-pip@23.0
py-pip@23.1.2
py-pip@23.1.2
py-ply@3.11
py-pmw@2.0.1
py-pmw-patched@02-10-2020
py-pydmd@0.3
py-pygps@1.3.5
py-pyproject-metadata@0.7.1
py-pyproject-metadata@0.7.1
py-pyproject-metadata@0.7.1
py-pyqt5-sip@12.12.1
py-pytest@7.3.2
py-python-dateutil@2.8.2
py-pytoml@0.1.21
py-pytz@2023.3
py-scikit-learn@1.3.2
py-scipy@1.8.1
py-seaborn@0.12.2
py-setuptools@68.0.0
py-setuptools-scm@7.1.0
py-sip@6.7.9
py-spglib@2.0.2
py-toml@0.10.2
py-tomli@2.0.1
py-tomli@2.0.1
py-typing-extensions@4.8.0
py-versioneer@0.29
py-wheel@0.41.2
py-xarray@2023.7.0
python@3.10.8
python@3.10.8
python@3.11.6
qt@5.15.5
qt@5.15.5
qt@5.15.12
quantum-espresso@6.5
quantum-espresso@6.6
quantum-espresso@6.7
quantum-espresso@6.8
quantum-espresso@7.0
quantum-espresso@7.1
quantum-espresso@7.2
quantum-espresso@7.3
r@4.3.0
raja@2022.10.4
rapidjson@1.2.0-2022-03-09
rdkit@2023_03_1
ruby@3.1.0
salmon-tddft@2.0.2
salmon-tddft@2.1.0
salmon-tddft@2.2.0
samtools@1.12
screen@4.9.1
scsumma25d@1.0a
siesta-relmax3@rel-MaX-3
smash@3.0.0
smash@3.0.2
star@2.7.10b
suite-sparse@5.13.0
superlu-dist@8.1.2
tk@8.6.11
tk@8.6.11
tmux@3.3a
xcb-util@0.4.1
xcb-util-image@0.4.1
xcb-util-keysyms@0.4.1
xcb-util-renderutil@0.3.10
xcb-util-wm@0.4.2
xios@develop-2612
zpares@0.9.6a

-- linux-rhel8-a64fx / gcc@8.5.0 --------------------------------
blitz@1.0.2
fujitsu-mpi@head
gcc@10.5.0
gcc@11.4.0
gcc@12.2.0
gcc@13.2.0
gmt@6.2.0
libint@2.6.0
llvm@17.0.4
mpich-tofu@1.0
mpich-tofu@1.0
mpich-tofu@master
mpich-tofu@master

-- linux-rhel8-cascadelake / gcc@13.2.0 -------------------------
boost@1.83.0
cmake@3.27.7
darshan-util@3.4.4
global@6.6.7
gmt@6.2.0
gnuplot@5.4.3
imagemagick@7.1.1-11
libxml2@2.9.7
llvm@17.0.4
mercurial@6.4.5
ncview@2.1.9
netcdf-c@4.9.2
netcdf-fortran@4.6.1
openfoam@2306
openfoam@2312
openfoam-org@10
openfoam-org@11
openjdk@11.0.20.1_1
py-numpy@1.26.1
py-pip@23.1.2
python@3.11.6
screen@4.9.1
tmux@3.3a
xterm@353
zsh@5.8

-- linux-rhel8-skylake_avx512 / gcc@8.5.0 -----------------------
gcc@13.2.0
hdf5@1.12.2
omni-compiler@1.3.3
openfoam@2012
openfoam@2106
openfoam@2112
openfoam@2206
openfoam@2212
openfoam-org@8
openfoam-org@9
openmpi@3.1.6
py-mpi4py@3.1.4
py-phonopy@2.12.0
py-phonopy@2.20.0

ここでは -x オプションにより明示的にインストールされたパッケージのみを表示していますが、実際にはこれらが依存する多数のパッケージもインストールされています。 linux-rhel8-cascadelake がログインノード用、linux-rhel8-a64fx が計算ノード用にビルドされたOSSであることをを示しています。

2.3. OSSのロード

例えばtmuxを利用可能にしたい場合:

$ spack load tmux

とすることで、必要な設定(環境変数 PATH など)が行われて利用可能になります。

同様に

$ spack unload tmux

でアンロードできます。

注釈

以下のように、module コマンドを利用してOSSをロード、アンロードすることもできます。

$ module load tmux
$ module unload tmux

3. プライベート・インスタンスの利用

これ以降の内容は、自身でOSSをビルドするユーザにのみ必要とされる作業であり、システム側で提供するビルド済みOSSを利用するだけのユーザは行う必要がありません。

各々のユーザのホームディレクトリ等にSpackインスタンスを保持し、ユーザがOSSをビルドして利用することができます。

3.1. リポジトリのクローン

簡単のため $TMPDIR へインストールする方法を説明しますが (環境変数 TMPDIR の設定については、環境の読み込み の章の注釈を参照)、インストール先のディレクトリは任意です。

$ cd $TMPDIR
$ git clone https://github.com/RIKEN-RCCS/spack.git
$ cd spack
$ git checkout fugaku-v0.21.0

クローンしてきた直後ではデフォルトのdevelopブランチですが、ここではfugaku-v0.21.0ブランチへと切り替えています。

3.2. コンパイラの設定

ログインノードで一度環境を読み込みます。

$ . ~/spack/share/spack/setup-env.sh

この後

$ spack compilers

としたとき、

==> Available compilers
-- fj rhel8-aarch64 ---------------------------------------------
fj@4.8.1

-- gcc rhel8-x86_64 ---------------------------------------------
gcc@8.5.0

のような出力があれば成功です。

3.3. パブリック・インスタンス提供パッケージの利用

Spackで提供される「チェイニング」の機能を用いることで、別のインスタンスにインストール済みのパッケージを利用することができます。ここで紹介する手順では、パブリック・インスタンスをアップストリームとして設定することで各々のプライベート・インスタンスから前者でインストール済みのパッケージを利用する設定を行います。 この機能を利用するには、 テキストファイル ~/.spack/upstreams.yaml を以下の内容で作成してください:

upstreams:
  spack-public-instance:
    install_tree: /vol0004/apps/oss/spack/opt/spack

さらに、

$ spack repo add /vol0004/apps/oss/spack/var/spack/repos/local

として、ローカル・リポジトリを追加しておきます。

設定が完了したら、

$ spack find

としてパブリック・インスタンス提供のパッケージが見えることを確認してください。

3.4. 外部パッケージの登録

富士通MPIを始めとする外部パッケージを利用するために、システム側から設定ファイルをコピーしてください。

$ cp /vol0004/apps/oss/spack/etc/spack/packages.yaml ~/.spack/linux/

3.5. 環境の読み込み

ログイン後コマンドラインで以下のようにすることでSpackが利用可能になります。

bashの場合:

$ . ~/spack/share/spack/setup-env.sh

csh/tcshの場合:

$ setenv SPACK_ROOT ~/spack
$ source ~/spack/share/spack/setup-env.csh

3.6. パッケージのインストールと管理

$ spack list

とすることで入手可能な全てのパッケージが表示されます。このままでは7000以上のパッケージが表示されてしまいますが、文字列による絞り込みができます(大文字小文字は区別しない)。例えば、、

$ spack list mpi

とすると、

==> 43 packages
compiz                          intel-oneapi-mpi  mpileaks           pbmpi          rkt-compiler-lib
cray-mpich                      mpi-bash          mpip               phylobayesmpi  spectrum-mpi
exempi                          mpi-serial        mpir               pnmpi          spiral-package-mpi
fujitsu-mpi                     mpi-test-suite    mpitrampoline      py-dask-mpi    sst-dumpi
hpcx-mpi                        mpibind           mpiwrapper         py-mpi4jax     umpire
intel-mpi                       mpich             mpix-launch-swift  py-mpi4py      vampirtrace
intel-mpi-benchmarks            mpich-tofu        msmpi              py-tempita     wi4mpi
intel-oneapi-compilers          mpifileutils      omni-compiler      r-rmpi
intel-oneapi-compilers-classic  mpilander         openmpi

のような出力が得られます。ここから例えば openmpi をインストールするには、

$ spack install openmpi

とします。ここで openmpi@4.1.1 のようにバージョンを明記することもできます。利用可能なバージョンやバリアント(ここでは説明は割愛します)を調べるには、

$ spack info openmpi

としてください。

注釈

計算ノード用にパッケージをインストールするには会話型ジョブで計算ノードにログインして作業を行うか、インストール用のジョブスクリプトを投入する必要があります。

同様にアンインストールは

$ spack uninstall openmpi

同一名のパッケージが複数存在する場合、Spackがパッケージを解決できずにエラーとなります。このエラーを避ける には 同一名複数パッケージの区別 を参照してください。

3.7. 同一名複数パッケージの区別

しばしばひとつのインスタンス内もしくはチェイニングされたインスタンス間で同一名のパッケージが存在することがあります。複数のバージョンが同時にインストールされている場合、あるいは同一バージョンであってもログインノード向けのビルドと計算ノード向けのビルドがインストールされているケースがなどが考えられます。そのような場合、パッケージ名だけを指定して spack load を実行するだけでは、Spackはどのパッケージをロードするべきかを決められないため、エラーになります。

例えばパブリック・インスタンスで

$ spack load screen

とすると

==> Error: screen matches multiple packages.
  Matching packages:
    5jzxnkf screen@4.9.1%fj@4.10.0 arch=linux-rhel8-a64fx
    ejmqzvl screen@4.9.1%gcc@13.2.0 arch=linux-rhel8-cascadelake
  Use a more specific spec.

のようなエラーとなります。同様の情報は

spack find -lv screen

のようにしても得られます。以下、より詳細にパッケージ指定する方法をいくつか紹介していきます。

  • ハッシュ値での指定:Spackではパッケージ名に詳細なビルド条件を付記した spec に対して一意にハッシュ値が定まるようになっています。 / (スラッシュ)以降に短縮ハッシュ値の7文字を書くことで、明示的に指定することができます。これまでの例と同様に

    $ spack load /5jzxnkf
    $ spack load /ejmqzvl
    

    のように指定できます。パブリック・インスタンスに同一名複数パッケージが存在する場合(例えば fftw 、依存するパッケージの違いによっても同一名複数パッケージが発生する場合があります)は、

    $ spack find -lx
    

    で出てきたほうのパッケージをロードするようにしてください。( -l は7文字の短縮ハッシュ値を表示するオプション、 -x はexplicitにインストールされたパッケージのみを表示するオプションです。)

  • バージョン番号での指定:パッケージ名の後に @ (アットマーク)を付け以降にバージョン場号を指定します。たとえば:

    $ spack load screen@4.9.1
    

    (ただし今回の例では同様のエラーとなります。)

  • ビルドしたコンパイラでの指定:パッケージ名の後に % (パーセント)を付け以降にビルドしたコンパイラを指定します。ログインノード向けの screengcc でコンパイルされていて計算ノード向けには富士通コンパイラ (fj) であるとき、

    $ spack load screen%gcc
    $ spack load screen%fj
    

    のように区別が可能です。 更に詳細に screen%gcc@13.2.0screen%fj@4.10.0 のような記述も可能です。

  • アーキテクチャでの指定:パッケージ名の後に arch= でビルド時のターゲットアーキテクチャを指定できます。ログインノードと計算ノードに対してそれぞれ

    $ spack load screen arch=linux-rhel8-cascadelake
    $ spack load screen arch=linux-rhel8-a64fx
    

    のようになります。

4. 既知の問題と対処

4.1. OS標準の動的ライブラリパスが上書きされる問題

Spackで何らかのパッケージをロードした後、プログラム実行時に

[WARN] xos LPG 2002 - Failed to map HugeTLBfs for data/bss: /usr/bin/file
The e_type of elf header must be ET_EXEC when using libmpg. You can
check it on your load module by readelf -h command.
[WARN] xos LPG 2003 - Failed to map HugeTLBfs for data/bss: Layout
problem with segments 0 and 1:

という警告が出力されたり、

libmpg BUG!! mpiexec: __mpg_resolve_libc_symbol[776]: Assertion
`__libc_calloc_fp != ((void *)0)' failed.

というエラーが発生する場合があります(前者の警告は無害ですので、無視できます)。また、ログインノードにおいても、一部のアプリケーション(e.g. emacs)の実行時にエラーが発生する場合があります。これらは、 spack load でパッケージを読み込んだ後に以下のように環境変数 LD_LIBRARY_PATH を再設定することで抑止できます。

export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH

4.2. マルチノードジョブにおける性能劣化

Spackで提供するパッケージは第2階層ストレージ上に存在するため、マルチノードジョブからそれらを利用する場合、特定のストレージI/Oノードにアクセスが集中し、性能劣化を引き起こす可能性があります。

そのような場合には、 必要なすべてのパッケージをロードした後で、 LD_LIBRARY_PATHPATH に設定されたパスに対して dir_transfer コマンドを実行すれば、参照される可能性のある共有ライブラリと実行ファイルを、第1階層ストレージ上の第2階層ストレージのキャッシュ領域へ配布することができます。これにより、アクセス集中による性能劣化を避けることができます。

dir_transfer コマンドにより共有ライブラリと実行ファイルを配布する例を以下に示します。

spack load xxx
echo $LD_LIBRARY_PATH | sed -e 's/:/\n/g' | grep '^/vol0004/apps/oss/spack' | xargs /home/system/tool/dir_transfer
echo $PATH | sed -e 's/:/\n/g' | grep '^/vol0004/apps/oss/spack' | xargs /home/system/tool/dir_transfer

4.3. Python利用時のエラー

SpackでインストールされたPythonモジュールを利用すると、以下のようなエラーが発生する場合があります。

$ spack load py-ase %fj
$ python3
Python 3.8.12 (default, Nov 30 2021, 04:44:05)
[Clang 7.1.0 ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
...
>>> plt.savefig('fig.png',format='png')
jwe0020i-u An error was detected during an abnormal termination process.
jwe0020i-u An error was detected during an abnormal termination process.
...

このような場合には、必要な全てのPythonモジュールをロードした後、 spack find -lx python で表示されるPythonをロードすればエラーを回避できます (以下の例で、 abcdefg は、 spack find -lx python で表示されるPythonのハッシュ値)。

$ spack load py-ase
...
$ spack load /abcdefg

4.4. "matches multiple packages"のエラーが出る場合

原則として spack find -lx で表示されるハッシュを指定してください。

4.5. Rustのコンパイルに時間がかかる場合

SpackでインストールされたRustのコンパイルに時間がかかる場合、pjsubコマンドの--llioオプションでcn-read-cacheパラメータをoffに設定すると、改善されることがあります。

$ pjsub --llio cn-read-cache=off job.sh