Nabe International | Takeru Boost >> Takeruを回せ! >>

spack package managerを使って最新のgccをインストール

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.htmlhttps://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をインストール

  • spackで使用可能なコンパイラの一覧表示
    # spack compilers
    ==> Available compilers
    -- gcc centos7-x86_64 -------------------------------------------
    gcc@4.8.5
    
  • spackでgccを追加
    # spack install gcc  ## spack info gccの出力で表示される "Preferred version"がデフォルトインストールされます。
    
    ## バージョンを指定したい場合は、 # spack install gcc@7.2.0 のように@[version]という形で指定します。
    ## 
    (# spack info gcc の出力)
    ## Preferred version:  
    ##     8.1.0    http://ftp.gnu.org/gnu/gcc/gcc-8.1.0/gcc-8.1.0.tar.xz
    ## 
    ## Safe versions:  
    ##     8.1.0    http://ftp.gnu.org/gnu/gcc/gcc-8.1.0/gcc-8.1.0.tar.xz
    ##     7.3.0    http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.xz
    ##     7.2.0    http://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.xz
    ##     ...
    ##     ...
    
    ==> Staging archive: /root/spack/var/spack/stage/gcc-8.1.0-7ci7edvlswswwvq5undrshns6pxzpqdn/gcc-8.1.0.tar.xz
    ==> Created stage in /root/spack/var/spack/stage/gcc-8.1.0-7ci7edvlswswwvq5undrshns6pxzpqdn
    ==> Ran patch() for gcc
    ==> Building gcc [AutotoolsPackage]
    ==> Executing phase: 'autoreconf'
    ==> Executing phase: 'configure'
    ==> Executing phase: 'build'
    ==> Executing phase: 'install'
    ==> Successfully installed gcc
    
    最後にこのようなメッセージが出ればインストール完了です。(依存パッケージも多いためけっこう時間がかかります) インストールしたgccをspack外のパッケージのコンパイルなどに使用する場合、# spack load gcc@8.1.0とするだけで利用できるようになります。
  • 追加したcompilerをspackで使用出来るようにする インストールしたgcc-8.1.0をspackで使用するコンパイラとして登録します。(spack以外の通常のパッケージをコンパイルするだけであればspack loadするだけで構いません)

    # spack find gcc
    # spack load gcc@8.1.0
    # spack compiler find  # これを実行すると自動的にPATHを探してコンパイラを見つけて、spackのコンパイラ設定ファイルへの設定も行われます。
    ==> Added 1 new compiler to /root/.spack/linux/compilers.yaml
      gcc@8.1.0
    ==> Compilers are defined in the following files:
      /root/.spack/linux/compilers.yaml
    
    # spack compilers  # spackで使用可能なコンパイラのリストを表示します。gcc@8.1.0が追加されていることがわかります。
    ==> Available compilers
    -- gcc centos7-x86_64 -------------------------------------------
    gcc@8.1.0  gcc@4.8.5
    
    

その他の活用法

今回は、gccの例を挙げましたが、spackはパッケージマネージャなので登録されていればspackからコンパイルして利用することが可能です。例えば、とあるソフトウェアをSourceからコンパイルしようとしてもzlibなどのライブラリが古くてエラーになるような場合、spackでzlibをインストールしてコンパイル時にそのzlibをloadしてコンパイルに利用するといった使い方も可能です。また、システム全体には入っていないけれど screen/tmux/byobuなどのターミナルマルチプレクサやzsh/fishなどのシェルを使いたいと言った場合にも簡単に自身だけのバージョンの導入ができます。 ここまでは良い点を挙げてきましたが、逆に手間がかかる点、困る点などを挙げると下記のような点があります。
  • インストールに時間がかかる (依存関係のパッケージが多い場合は特に。全てSourceからコンパイルするため)
  • コンパイル時にエラーが出ることがある。当然と言えば当然ですが、エラーが出ると普通にコンパイルするより手間がかかることもあります。
spack自体は上記の通り、git cloneするだけで使えますし、既存の環境への影響なく使えるといった点で比較的気軽に導入することができると思いますので一度試してみてもらえればと思います。