Spack公式パッケージレシピ集:HPC向け数千ソフトウェアを一元管理するレシピ集

タグ SpackHPCパッケージ管理科学計算スーパーコンピュータMPIビルド自動化オープンソースcolumnコラムlinuxLinuxGitHubspackspack-packages
🚀 今すぐ試せます! デモスクリプトをダウンロードして、解凍後にターミナルで bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。 (macOS / Linux 環境が必要)

Spack公式パッケージレシピ集:HPC向け数千ソフトウェアを一元管理するレシピ集

ひとことでいうと

spack-packages は、スーパーコンピュータや研究クラスタで使われるパッケージマネージャー「Spack」の、公式レシピ集です。数千を超える科学計算ソフトウェアのビルド手順がここに集まっており、コミュニティ全体で管理されています。Homebrew(Macの有名なパッケージ管理ツール)における「Formulae」に近い存在、とイメージすると分かりやすいでしょう。Spack v1.0 以降では、このレシピ集がデフォルトで自動的に読み込まれるため、インストール直後から恩恵を受けられます。研究者・エンジニア・クラスタ管理者など、科学計算の現場で働く幅広い方を対象としたリポジトリです。

こんな人におすすめ

スーパーコンピュータやクラスタを管理している方に向いています。複数のコンパイラや通信ライブラリ(MPI)の組み合わせで環境を構築する場面で、Spack と spack-packages を使えばモジュールシステム(Lmod など)の自動生成まで一貫して行えます。手作業で環境をセットアップする手間を大きく減らせます。

特定バージョンの科学計算ライブラリが必要な研究者・エンジニアにも最適です。HDF5 や OpenMPI など、論文や実験で使ったライブラリを「あのときと同じ構成」で再現したいとき、レシピ集に記載されたオプション(バリアント)を指定するだけで再構築できます。

オープンソースへの貢献を始めたい開発者にも入りやすいリポジトリです。レシピは Python で書かれており、新しいソフトウェアの追加や既存レシピのバグ修正は Pull Request(プルリクエスト)で受け付けています。CI(継続的インテグレーション:コードを送ったときに自動でテストが走る仕組み)による検証が自動で行われるため、安心して貢献できます。

インストール・使い方

spack-packages は Spack 本体と組み合わせて使います。以下の手順で環境を整えましょう。ターミナル(文字を入力してパソコンに命令を送る画面)を開き、コマンドをコピー&ペーストするだけで進められます。

Step 1: Spack 本体をダウンロードする

git clone --depth=1 https://github.com/spack/spack.git
source spack/share/spack/setup-env.sh

Git(ソースコードのバージョン管理ツール)で Spack をダウンロードし、シェル(ターミナルの処理エンジン)に Spack コマンドを認識させます。source コマンドは「この設定ファイルを今すぐ読み込んで」という意味です。

Step 2: spack-packages のレシピ集をダウンロードする

git clone https://github.com/spack/spack-packages.git

公式レシピ集をローカル(自分のパソコン)にコピーします。Spack v1.0 以降は自動で読み込まれますが、編集・カスタマイズしたい場合はこのコマンドで手元に持っておくと便利です。

Step 3: ローカルのレシピ集を Spack に登録する

spack repo set --destination /path/to/local/spack-packages builtin

/path/to/local/spack-packages は、Step 2 でダウンロードしたフォルダのパス(場所)に置き換えてください。この操作で、Spack が編集済みのレシピを優先して読み込むようになります。

Step 4: パッケージを検索・インストールする

# パッケージを検索
spack list hdf5

# パッケージの詳細情報を確認(オプションや依存関係も表示される)
spack info hdf5

# シンプルにインストール
spack install hdf5

# MPI(複数のコンピュータをつないで並列計算する仕組み)対応版でインストール
spack install hdf5+mpi

spack list は「このキーワードに関係するパッケージを一覧表示」、spack info は「このパッケージの詳細を見る」、spack install は「このパッケージをビルドしてインストールする」という命令です。

動かしてみた

リポジトリの構造を確認したところ、次のようなフォルダ構成になっています。

spack-packages/
    repos/
        spack_repo/
            builtin/
                build_systems/   # 多くのパッケージが共有する基底クラス群
                packages/
                    <PKG_NAME>/  # hdf5、zlib、mfem などパッケージ名のフォルダ
                        package.py   # 実際のビルドレシピ

packages/ の中に各ソフトウェアの名前のフォルダがあり、その中の package.py がビルドレシピ本体です。build_systems/ には AutotoolsPackageCMakePackage など共通の「ビルドの型」がまとまっており、多くのレシピはここから継承(設計を引き継ぐこと)しています。

また、ルートに pyproject.tomlpytest.initests/ が存在しており、Python のテストフレームワーク「pytest」でユニットテスト(部品ごとの動作確認)を実行できる構成になっていることも確認できました。repos/ フォルダを VS Code などのエディタのワークスペースに追加すると、package.py を編集する際に補完や型チェックが有効になり、開発効率が上がります。さらに spack-repo-index.yaml がリポジトリ全体のパッケージ索引として機能しており、全パッケージ情報を一覧で把握できます。

デモについて

spack-packages はパッケージ定義ファイルの集まりです。それ自体が動く CLI ツールや Web アプリではないため、ブラウザ上で操作できるデモは用意されていません。ただし、パッケージの一覧や詳細情報は公式サイト(packages.spack.io)で確認でき、ビルド済みバイナリ(コンパイル済みのそのまま使えるプログラム)の検索は cache.spack.io で行えます。実際の動作には Spack 本体と、それを動かせる Linux または macOS 環境が必要です。

はじめの一歩:新しいレシピをすぐ試す実践のコツ

  • まず既存レシピを読む: packages/hdf5/package.py など、似たソフトウェアのレシピを開いてみましょう。Python クラスとして書かれており、全体の構造をつかむのに 10 〜 15 分もあれば十分です。
  • spack info <パッケージ名> を活用する: バリアント(ビルドオプション)や依存関係が一覧で表示されます。試したい機能(+cuda+mpi など)がすぐに分かります。
  • 最小構成のレシピから書き始める: 以下は CMake を使ったパッケージの最小テンプレートです。
from spack.package import *

class MyLib(CMakePackage):
    """My library short description."""
    homepage = "https://example.com"
    git      = "https://github.com/example/mylib.git"

    version("1.0.0", tag="v1.0.0")

    depends_on("[email protected]:", type="build")
    depends_on("hdf5+mpi", when="+mpi")

    variant("mpi", default=False, description="Enable MPI support")
  • PR を送る前のチェックリスト: spack style でコードスタイルを確認し、spack unit-test でテストを実行してからプルリクエストを送りましょう。CI が自動でビルドを検証してくれます。
  • 既存 PR の移行ツールを使う: spack/spack リポジトリにある既存のパッケージを spack-packages へ移行したい場合は、専用のマイグレーションツールが公開されています。手作業でコピーするよりも確実です。

活用例

  • 論文・実験の計算環境をそのまま記録する: spack.lock ファイル(どのバージョンを使ったかが全て記録されたファイル)をリポジトリに含めておくと、数年後でも同じソフトウェアスタック(組み合わせ環境)を完全再現できます。論文の再現性確保に広く活用されています。
  • チーム全員の開発環境を統一する: spack.yaml で環境定義を共有するだけで、チームメンバーが全員同じライブラリ・バージョンで開発できます。「自分の環境では動いたのに」を防ぎます。
  • Docker / Singularity イメージを自動生成する: Spack は Docker や Singularity(HPC クラスタでよく使われるコンテナ技術)のイメージ生成にも対応しています。クラウドとオンプレミス(自前サーバー)を混在させるクラウドバースティング運用にも有効です。
  • バイナリキャッシュで時間を節約する: CI でビルド済みのバイナリが cache.spack.io で公開されています。spack install 時に自動的に利用され、長時間のコンパイルをスキップできるケースも多くあります。
  • 新しいソフトウェアのレシピをコミュニティへ還元する: 自分の研究や業務で使っているソフトウェアが spack-packages に未登録なら、package.py を作成して Pull Request を送ることで、世界中の Spack ユーザーが使えるようになります。
  • 教育・授業での環境構築: 数値計算の授業などで、受講者全員に同じライブラリ環境を配布する用途にも使えます。Spack 環境ファイルを配ればセットアップ手順の説明が最小化できます。

用語とポイント解説

レシピ / package.py 各ソフトウェアのビルド手順を記述した Python ファイルのことです。かんたんに言うと「このソフトウェアをどこからダウンロードして、どんな手順で組み立てるか」を書いた設計書です。Spack はこのファイルを読み、対象の環境向けにソースコードをコンパイル(機械語に変換)します。

variant(バリアント) パッケージのビルド時にオン・オフできるオプションのことです。かんたんに言うと「オプション機能のスイッチ」です。たとえば +mpi と書けば MPI(複数コンピュータをつないで並列計算する仕組み)対応でビルドされ、~mpi と書けば無効になります。用途に合わせて細かくカスタマイズできます。

Spack 環境 spack.yaml ファイルで定義する、特定のパッケージセットをまとめた仮想的な環境です。かんたんに言うと「このプロジェクトで使うソフト一覧と設定をまとめたフォルダ」です。Python の venv や conda 環境に相当し、プロジェクトごとに独立したソフトウェア環境を管理できます。

builtin この spack-packages リポジトリに付けられた名前空間(識別名)です。かんたんに言うと「公式レシピ集の呼び名」です。Spack は複数のレシピ集(リポジトリ)を同時に管理できるため、それぞれを区別するために名前空間を使います。

build_systems(ビルドシステム) AutotoolsPackageCMakePackage など、ビルド手順の「共通の型」を提供するクラス群です。かんたんに言うと「よく使われるビルド手順のテンプレート集」です。各レシピはこれを継承することで、共通処理を一から書かずに済みます。

バイナリキャッシュ コンパイル済みのプログラムをあらかじめ保存しておく仕組みのことです。かんたんに言うと「ビルド済みの完成品の倉庫」です。cache.spack.io で公開されており、spack install 時に自動的に利用されるため、長時間かかるコンパイル作業をスキップできることがあります。

spack-repo-index.yaml リポジトリ内の全パッケージを一覧化したインデックスファイルです。かんたんに言うと「何千ものレシピの目次ファイル」です。Spack がパッケージを高速に検索するために使われます。このファイルを見ることで、リポジトリに収録されているすべてのパッケージ名を把握できます。

Pull Request(プルリクエスト) コードの変更を提案し、レビューを依頼する仕組みです。かんたんに言うと「このコードを取り込んでください、という申請」です。spack-packages ではレシピの追加・修正をこの形式で受け付けており、CI が自動でビルド検証を行います。

CI(継続的インテグレーション) コードが提出されるたびに自動でテストやビルド確認を実行する仕組みです。かんたんに言うと「投稿したコードを自動でチェックしてくれるロボット」です。人手でのレビュー前に基本的な問題を検出でき、品質を保つために欠かせません。


spack-packages は、科学計算の世界で日々進化し続けるコミュニティ主導のレシピ集です。レシピを読むだけでなく、新しいパッケージの追加や既存レシピのバグ修正など、貢献の入り口としても非常に開かれています。ぜひ研究環境の再現性確保や、チームでの統一開発環境の構築などに活用してみてはいかがでしょうか。