CentOS7にデフォルトでインストールされるgccはバージョンが4.8.5ですが、ここ数年のgccはかなり高頻度にバージョンを上げていて、現在はなんと8.1にまでバージョンが上がっています。gcc 4.8.5でも問題が無いケースは多いのですが、バイオインフォマティクス系の新しいアプリケーションを入れる際にライブラリが古くて入らないといったことは時折起こることですし、またSkylake世代のCPUから新しく搭載されたAVX512の命令セットを使いたい場合にはそもそも4.8.5では対応していません。もちろん、gccをソースからコンパイルすることは可能ですが、gccのコンパイルはrequirementsのライブラリなどが多く手間がかかりがちです。そんなケースではspackというパッケージ管理ツールを使うと比較的容易に新しいバージョンのgccを導入できます。
(注 : 1つ前の記事のApache SparkとSpackは何の関係もありません)
Spackとは
SpackはLLNL(Lawrence LivermoreNational Laboratory)で主としてはスパコン向け(もしくはスパコンユーザー向け)に開発されたパッケージ管理ツールです。MPIの種類、CPUアーキテクチャの違い、コンパイラの違い、ソフトウェアのバージョン、これらについて全部の組み合わせを一元的に管理するのは組み合わせの数が多くなりすぎて現実的ではない、といった背景から開発されたものです。
Spackは以下のような特徴を持っています。
- 依存関係も含めてSourceからコンパイルしてくれる
- コンパイラ自体をspackでインストールして登録可能。登録した後はコンパイラの使い分けも可能
- インストールしたパッケージは、デフォルトではユーザーの$HOME以下に配置される(ユーザー権限で各ユーザー毎にソフトウェアの追加が可能)
- インストールと同時に、Environment Moduleの登録が行われ、環境変数を切り替えることで、アプリケーションの使い分けが可能
バイオインフォマティクス系のアプリケーションではAnaconda, Bioconda、Deep Learning向けツールではpyenv, irtualenvなどの方が使えるパッケージは多いのですが、最近ではspackでもバイオインフォマティクス系のパッケージが増えてきています。ちなみにNABEでは、納入用システムの負荷試験、性能テストを行う際などのスクリプトの中でspackを活用しています。
github :
https://github.com/spack/spack
基本的な使い方
- 公式tutorial : http://spack.readthedocs.io/en/latest/tutorial.html、 https://spack.io/slides/Spack-SC17-Tutorial.pdf
-
導入
$ git clone https://github.com/spack/spack
$ cd spack/bin
$ ./spack [コマンド]
## bash/zshの場合は.bashrc/.zshrcに下記行を追記してください
export SPACK_ROOT=~/spack # PATHはspackをダウンロードしたディレクトリに合わせてください
. $SPACK_ROOT/share/spack/setup-env.sh
$ source .bashrc
- Requirements : CentOSユーザーの場合は、Environment Modulesが必要です。yum install environment-modulesでインストールします。
- spackの基本コマンド
$ spack list
: availableなパッケージを一覧表示
$ spack find
: インストール済みパッケージの一覧表示
$ spack install [package]
: パッケージのインストール
$ spack info [package]
: パッケージの情報を参照 (インストール可能なバージョンの一覧やインストールオプション、依存パッケージなどの確認ができる)
$ spack load [packge]
: $ module load [package] と同様、パッケージの環境変数をロードできる
-
インストール後の利用方法について
-
# spack find
と実行するとインストール済みのソフトウェアが表示されます。
# spack find
-- linux-centos7-x86_64 / gcc@4.8.5 -----------------------------
autoconf@2.69 fftw@3.3.7 isl@0.18 ncurses@6.0 samtools@1.6
automake@1.15.1 gcc@7.3.0 libpciaccess@0.13.5 openmpi@3.0.0 sqlite@3.21.0
boost@1.66.0 gdbm@1.14.1 libsigsegv@2.11 openssl@1.0.2n sra-toolkit@2.8.2-1
bowtie2@2.3.1 gmp@6.1.2 libtool@2.4.6 perl@5.24.1 tophat@2.1.1
bwa@0.7.17 htslib@1.6 libxml2@2.9.4 pkgconf@1.4.0 util-macros@1.19.1
bzip2@1.0.6 hwloc@1.11.8 m4@1.4.18 python@2.7.14 xz@5.2.3
cmake@3.10.1 intel-tbb@2018.2 mpc@1.0.3 python@3.6.1 zlib@1.2.11
cufflinks@2.2.1 ior@3.0.1 mpfr@3.1.5 readline@7.0
-
# module avail
と実行しても似たような同様のソフトウェア、バージョンが並びますが、それらに続いてgccのバージョン、ランダムな英数字が追加されています。これは冒頭でも書いた通り、同じバージョンのソフトウェアでコンパイラやオプション、MPIが異なる場合でも併用して使用できるようにこのようになっています。
# module avail
---------- /root/spack/share/spack/modules/linux-centos7-x86_64 ------------
autoconf-2.69-gcc-4.8.5-dquvd2k libxml2-2.9.4-gcc-4.8.5-p7wmc5o
automake-1.15.1-gcc-4.8.5-4gqhira m4-1.4.18-gcc-4.8.5-jwvjtud
boost-1.66.0-gcc-4.8.5-x3grlyj mpc-1.0.3-gcc-4.8.5-h3sbthg
bowtie2-2.3.1-gcc-4.8.5-jiu5gdq mpfr-3.1.5-gcc-4.8.5-rmi7bmi
bwa-0.7.17-gcc-4.8.5-fusrahs ncurses-6.0-gcc-4.8.5-zxqghp3
bzip2-1.0.6-gcc-4.8.5-4vcfqu3 openmpi-3.0.0-gcc-4.8.5-hbngn74
cmake-3.10.1-gcc-4.8.5-pj7haun openssl-1.0.2n-gcc-4.8.5-cibkbry
cufflinks-2.2.1-gcc-4.8.5-cjiekfb perl-5.24.1-gcc-4.8.5-oucoesz
fftw-3.3.7-gcc-4.8.5-vyzm5ml pkgconf-1.4.0-gcc-4.8.5-xiymx6n
gdbm-1.14.1-gcc-4.8.5-ttariy6 python-2.7.14-gcc-4.8.5-4ipldug
gmp-6.1.2-gcc-4.8.5-6bsovvk python-3.6.1-gcc-4.8.5-6b34kap
htslib-1.6-gcc-4.8.5-sawucah readline-7.0-gcc-4.8.5-elgoxoq
hwloc-1.11.8-gcc-4.8.5-ctwvb2m samtools-1.6-gcc-4.8.5-birxczn
intel-tbb-2018.2-gcc-4.8.5-wp2y7ez sqlite-3.21.0-gcc-4.8.5-ffmjav6
ior-3.0.1-gcc-4.8.5-4u2zxsc sra-toolkit-2.8.2-1-gcc-4.8.5-5ncmk2i
isl-0.18-gcc-4.8.5-l4somr6 tophat-2.1.1-gcc-4.8.5-wikx2qq
libpciaccess-0.13.5-gcc-4.8.5-5chyfxo util-macros-1.19.1-gcc-4.8.5-p66qdrt
libsigsegv-2.11-gcc-4.8.5-qpmaxx6 xz-5.2.3-gcc-4.8.5-kgp7olc
libtool-2.4.6-gcc-4.8.5-bcbiddk zlib-1.2.11-gcc-4.8.5-64vg6e4
# module show bowtie2-2.3.1-gcc-4.8.5-jiu5gdq
-------------------------------------------------------------------
/root/spack/share/spack/modules/linux-centos7-x86_64/bowtie2-2.3.1-gcc-4.8.5-jiu5gdq:
module-whatis Bowtie 2 is an ultrafast and memory-efficient tool for aligning sequencing reads to long reference sequences
prepend-path PATH /root/spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/bowtie2-2.3.1-jiu5gdqwx6c5vla4zdsy3xg2j3vfgkny/bin
prepend-path CMAKE_PREFIX_PATH /root/spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/bowtie2-2.3.1-jiu5gdqwx6c5vla4zdsy3xg2j3vfgkny/
-------------------------------------------------------------------
-
# module avail
で表示されたモジュール名は長いのでloadする場合は# spack load
と実行する方が便利です。ただ、spackのサブコマンドはmoduleのサブコマンドをほとんど引き継いでいないので、load以外は通常のmoduleコマンドを使用する必要があります。
# module list
No Modulefiles Currently Loaded.
# spack load bowtie2@2.3.1 # "module load bowtie2-2.3.1-gcc-4.8.5-jiu5gdq" と同じ
# module list
Currently Loaded Modulefiles:
1) bowtie2-2.3.1-gcc-4.8.5-jiu5gdq
# which bowtie2
/root/spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/bowtie2-2.3.1-jiu5gdqwx6c5vla4zdsy3xg2j3vfgkny/bin/bowtie2
# module purge # ロードされたモジュールを全て破棄
# module list
No Modulefiles Currently Loaded.
spackでgcc-8.1をインストール
その他の活用法
今回は、gccの例を挙げましたが、spackはパッケージマネージャなので登録されていればspackからコンパイルして利用することが可能です。例えば、とあるソフトウェアをSourceからコンパイルしようとしてもzlibなどのライブラリが古くてエラーになるような場合、spackでzlibをインストールしてコンパイル時にそのzlibをloadしてコンパイルに利用するといった使い方も可能です。また、システム全体には入っていないけれど screen/tmux/byobuなどのターミナルマルチプレクサやzsh/fishなどのシェルを使いたいと言った場合にも簡単に自身だけのバージョンの導入ができます。
ここまでは良い点を挙げてきましたが、逆に手間がかかる点、困る点などを挙げると下記のような点があります。
- インストールに時間がかかる (依存関係のパッケージが多い場合は特に。全てSourceからコンパイルするため)
- コンパイル時にエラーが出ることがある。当然と言えば当然ですが、エラーが出ると普通にコンパイルするより手間がかかることもあります。
spack自体は上記の通り、git cloneするだけで使えますし、既存の環境への影響なく使えるといった点で比較的気軽に導入することができると思いますので一度試してみてもらえればと思います。