タンパク質モデリングソフトウェアパッケージRosetta 3.12のインストール方法 for macOS, Linux

(2020年5月19日 Rosetta 3.12, macOS Catalina 10.15.4でのインストール方法を追記) 
(2021年2月17日 コンパイルがうまく行かない場合の修正法を追記) 

Washington大学のDavid Baker研究室で精力的に開発されているタンパク質モデリングソフトウェアパッケージ Rosetta ver3.12（2020年3月9日）のダウンロードとインストール方法についてです。

非常にポテンシャルの高いソフトウェアなのですが、正直ソースコードがスパゲッティすぎて完全なメンテナンスが行き届いていないし、インストールも結構難しかったりします。ここではmacOS、Linux (CentOS 7, Ubuntu 18.04向け)にインストール方法を書いてみようと思います。

## 環境
マシンのOSはいずれか1つ

- macOS Big Sur 11.2.1 + [Homebrewを使える状態](https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f)になっている
- CentOS
- Ubuntu

macOS Big Sur, Catalina, CentOS 7.4, Ubuntu 18.04, Ubuntu 20.04で動作を確認しました。

## Rosettaのソースコード（必要であればバイナリなども）をダウンロード

まずは https://www.rosettacommons.org/software/license-and-download にアクセスして、Need a License?　Start Here のところをクリックすると、ライセンス発行のためのユーザー登録を促されます。
フォームを埋めてSubmitすると、すぐに書いたメールアドレスのところにダウンロードのためのユーザー名とパスワードが送られてきます。このウェブサイトにアクセスします。

そのウェブサイトにはリンクがいくつか書かれていますが、Last Numbered Releaseのところに書かれているRosetta3.12のDownload Rosetta 3.12をクリックし、Rosetta 3.12 source - as one bundle (6.1G)のところをクリックすると、 `rosetta_src_3.12_bundle.tgz` というファイルのダウンロードが開始されます。**ただ今となってはWeekly Releaseも割と安定している上に、最新のRosettaの機能が追加されているので、こちらの最新版をゲットする方がよいです（例えば2020.50など）**。ただ、以下では3.12という表記のままで書かせていただきます。

ここでは他にもRosetta 3.12 Online User Guideへのリンクやバイナリ版も提供されています。バイナリ版を利用すれば、おそらくこの先の細かいインストール作業が全く必要ありませんが、ソースコードからのインストール方法を知っておくことはとても利用の幅が広がって良い感じなので、ぜひマスターしておきましょう。

`rosetta_src_3.12_bundle.tgz`をダウンロードし終わったら、

    tar zxvf rosetta_src_3.12_bundle.tgz

で解凍すると`rosetta_src_2020.08.61146_bundle` というディレクトリが生成されます。この中にRosetta 3.12のすべてが詰まっています。しかし、このディレクトリ名は長ったらしい上に、バージョン名がわからないので私は嫌です。なので、私は以下の操作で、ホームディレクトリ上に`Rosetta3.12`という名前で置くことにします。

    # rosetta_src_2020.08.61146_bundleディレクトリをホーム上のRosetta3.12というディレクトリに移す
    mv rosetta_src_2020.08.61146_bundle ~/Rosetta3.12

この後、コンパイルとインストール作業を行い、プログラムを使えるようにする準備の儀式を行います。まずは次の項の「Rosettaのコンパイルについての概要」をお読みになった上で、お使いのOSに応じたコンパイルを初めてください。

## Rosettaのコンパイルについての概要
流れとしては、いずれのOSにおいても、まずはふつうにコンパイル＆インストール（serial版;1コアのみの計算版）を行い、次にMPIの設定を行った上でMPI版のインストール、とするとうまくいきます。

コンパイルについてはsconsを使った方法と`ninja`を使った方法があります。どちらも大きいプロジェクトをコンパイルするときに使うシステムです。とくにシングル版の方は`ninja`の方が楽で早いです。  

また、Rosettaに含まれるいくつかの重要な実行プログラムは、mpiを設定した上でのインストールを行うと、その計算機が持つCPU/threads数に応じて並列計算をさせることができるようになります。これはマルチコアプロセッサが当たり前になった今の時代ではぜひ利用するべき特長なので、MPI付きのインストールを強く推奨します。

重要なこととして、macOSでMPI版をコンパイルする場合は、コンパイラに**Apple LLVM**（`/usr/bin/gcc`）を指定しない限り、確実に失敗します。さらに、このときxcodeの設定を1つ追加で入れてやる必要があります（後述）。一方でLinux OSではそんなことはなく（たぶん）、gccでもclangでもいけます。

## 実際のコンパイル手順
### macOS (Big Sur/Catalina)へのインストール（serial版）
まずApp storeから最新版のXcodeをインストールしておきます。macOSの場合はコンパイラとして**Apple LLVM(`/usr/bin/gcc`の実体がこれ)を利用した方がインストールがうまくいきます**。Homebrewで入れたgccでのコンパイルはうまくいかないようです（Rosetta側のソースコードの環境判定で失敗するようです）。

事前準備として、XCodeを入れたあと、ターミナルから以下のコマンドを入れておきます。

    sudo xcode-select -s /Library/Developer/CommandLineTools

パスワードを求められるので入力してEnterを押す。次に、以下のコマンドで、使おうとするコンパイラがApple LLVMであることを確認しておきます。

```bash
$ /usr/bin/gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.59)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

それからHomebrewで`ninja`と`cmake`もインストールしておきます。

    brew install ninja cmake

また、**Homebrewでインストールしたrdkit, mmtf-cpp, boostなどを入れていると自動的にそれらを優先的に使おうとした結果、Rosettaのインストールに失敗します**。そこで、これらをすでにインストールしている場合、Rosettaのインストール前にこれらを一時的に無効化するために

```bash
# Homebrewですでにインストールされている場合のみ実行
brew unlink rdkit
brew unlink mmtf-cpp
brew unlink boost #boost@1.57や1.60がある場合はそれも
```

を実行します。

これらを確認したら、`~/Rosetta3.12/main/source/`に移動し、`ninja_build.py`を使ってインストールを開始します。

```bash
# ~/Rosetta3.12/main/sourceに移動
cd ~/Rosetta3.12/main/source
CC=/usr/bin/gcc CXX=/usr/bin/g++ ./ninja_build.py -remake release
```

MacBookだとだいたいコンパイル＆インストールに60分くらいかかるような気がします。もし途中で止めちゃった場合でも、同じコマンドを打てば再開してくれます。

Rosettaのインストールがうまく終わったら、先程`brew unlink`したパッケージに対して忘れずに`brew link`しておきましょう。

### macOSへのインストール（OpenMPI版）
CPUのコア数分だけ同時に並列計算してくれるようにするためのインストール設定です。上記のserial版を入れておいたあと（入れなくてもいける？少なくともXcodeと`sudo xcode-select -s /Library/Developer/CommandLineTools`をしておく必要はある）、以下の手順に従えばopen-mpiを使って`AbinitioRelax`などがマシンのコア数分並列化されたMPI版をインストールすることができます。

まずはopen-mpiを入れておく必要があります。これはHomebrewでも配信されているので、

    brew install open-mpi

でインストールできます。インストールが終わったら、`mpicc`(C用のコンパイラのmpi版)と`mpicxx`(C++用のコンパイラのmpi版)コマンドが利用可能になっているはずなので確認してみる。注意点として、openmpiのコンパイラである`mpicxx`はインストール時に指定するコンパイラに直接依存する性質があります。つまり、もしgcc-5でopenmpiをインストールすると、`mpicxx`はg++-5依存になります。

    $ which mpicxx
    /usr/local/bin/mpicxx

そして、RosettaのOpenMPI版を使うためには、この`mpicxx`がApple LLVM(Apple clang version)依存になっていることを確認する必要があります。

    $ mpicc --version
    Apple clang version 11.0.3 (clang-1103.0.32.59)
    Target: x86_64-apple-darwin19.4.0
    Thread model: posix
    InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin


この状態で、`cd ~/Rosetta3.12/main/source`で移動し、

    ./scons.py -j8 bin mode=release extras=mpi

とすると、インストールを開始します。MPI版のインストールはninjaでは対応していないため、sconsを使った方法になります。sconsは何も設定をしないと、1プロセスしか使用しないのでインストールが激遅なのですが、`-j8`とすると、ここの数字で指定した8コアで並列でインストール作業を進めてくれる。MacBook Proなどの場合は4コアCPUなので`-j4`とするのが良いでしょう。これもそこそこ時間がかかります。

ちなみにもしApple LLVMでなく、gcc-5に依存したopenmpiでRosetta MPI版のコンパイルをしようとすると、macOSに限ってこんなWarningsが頻発することになります。

    warning: section "__textcoal_nt" is deprecated
            .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                     ^      ~~~~~~~~~~~~~

これが出ている間はまだWarningsなのでセーフですが、`libcpp.dylib`のところでリンクしようとするとエラー落ちしてしまう。これを回避するためには、いろいろ調べてみたところ、上述のように結局Apple LLVMでビルドしたOpenMPIを利用するしかないようです。

### CentOS 7.4へのインストール
上記macOSのやり方とほぼ同じです。Linuxの場合はコンパイラとしてgcc-5, clangどちらを選んでもたぶん問題なく動きます。
まず`ninja(ninja-build)`と適当なコンパイラ`gcc-5`か`clang`をインストールします。`ninja_build.py`を利用したインストール方法では`cmake`が必要になりますが、CentOS 7.4の場合は`cmake3`を`yum`で入れておいて、`cmake`にシンボリックリンクを貼ってごまかすという手が簡単だと思います（もちろんcmakeはソースからのビルドでもOK）。

    # ninja
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/ninja-build-1.7.2-2.el7.x86_64.rpm
    rpm -Uvh epel-release*rpm
    yum -y install ninja-build.x86_64
    # symbolic link
    ln -s /bin/ninja-build /bin/ninja
    # clang
    yum -y install clang clang-devel
    # cmake3をyumでインストールする
    yum -y install cmake3
    # インストールされた/bin/cmake3につながる/bin/cmakeシンボリックリンクを作成
    sudo ln -s /bin/cmake3 /bin/cmake

そしたら適当なディレクトリ（例えば`/usr/local/Rosetta3.12`）にソースコードを展開し、`main/source`に入って以下を実行する。

    CC=/bin/clang CXX=/bin/clang++ ./ninja_build.py -remake release

環境変数`CC, CXX`を付けておくとコンパイラを指定できる。こっちの方が早いようです。
mpi版も同様なので以下省略。参考までに、一番下にOpenMPIのソースからのインストール方法を載せておきます。
（そういえばclangでのOpenMPI版は当方で試していません……gcc-5.4コンパイラを使ったopenmpiならば動作保証します）
### ubuntu 18.04へのインストール

大体はCentOSと一緒ですが、依存が足りなかったりclangのバージョンが違ったりします。
`sudo apt install ninja-build zlib1g-dev clang-3.12 cmake build-essential` で、もしかすると `build-essential` はいらないかもしれません。

あとは `/path/to/Rosetta3.12/main/source` から

    export CC=/usr/bin/clang-3.12
    export CXX=/usr/bin/clang++-3.12
    ./ninja_build.py -remake release

MPI版もmacOSのときと同様です。

### CentOS 8.0へのRosetta 3.12のインストール
2020年1月6日にRosetta 3.12のCentOS 8.0へのインストールを行ったときの記録です。
使ったコンパイラはClang 7.0.1, ninja 1.8.2, OpenMPI 3.1.4です。GNU Compiler 8.2.1を使おうとするとうまくコンパイルできませんでした。

```bash
# CentOS 8.0へのninjaのインストール
dnf --enablerepo=PowerTools install ninja-build
# ここでninja --versionと打ってみてバージョン情報が帰ってくることを確認する（1.8.2）
# Python 2のインストール
dnf install -y @python27
# pythonコマンドでpython2を呼び出せるようにしておく（インストール後に削除可）
ln -s /bin/python2 /bin/python
# Clang 7.0.1のインストール
dnf -y install clang
# Clang 7.0.1でOpenMPIをコンパイルしておく（下記の参考：OpenMPIのインストール方法）
# Rosetta 3.12の解凍
tar zxvf rosetta_src_3.12_bundle.tgz
# Rosettaディレクトリ内部のmain/sourceに各自で移動する
cd /path/to/Rosetta/main/source
# Rosetta 3.12のMPIなしコンパイル
# CC=/bin/clang CXX=/bin/clang++ ./ninja_build.py -remake release
# ninja-buildを使ってインストールしようとすると、Ryzen系ではハングアップすることがあるみたいなので、sconsを使ってインストールする。
## CC, CXXの値はgcc, g++でも構わない。
CC=/bin/clang CXX=/bin/clang++ ./scons.py -j16 bin mode=release
# SCONSを使ったMPIインストール。先にmpicc, mpicxxがそれぞれclang7.0.1を利用したOpenMPIになっていることを確認する
# > mpicc --version
# clang version 7.0.1 (tags/RELEASE_701/final)
# Target: x86_64-unknown-linux-gnu
# Thread model: posix
# InstalledDir: /bin
# > mpicxx --version
# clang version 7.0.1 (tags/RELEASE_701/final)
# Target: x86_64-unknown-linux-gnu
# Thread model: posix
# InstalledDir: /bin
./scons.py -j16 bin mode=release extras=mpi
```

## 参考：OpenMPIのインストール方法
OpenMPIはコンパイル時（`./configure`時）に設定するコンパイラの指定(`CC`, `CXX`, `FC`の指定)に大きく依存します。したがって、共用クラスタコンピュータのようなみんなで使うマシン上にインストールするときは、コンパイラ名を明示したインストールディレクトリ先を指定しておくと良いでしょう。

```bash
## OpenMPI 4.0.3 ##
# wgetでソースコードをダウンロードして解凍
wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.3.tar.bz2
tar jxvf openmpi-4.0.3.tar.bz2
cd openmpi-4.0.3
# ./configureはインストール予備動作。インストール先の指定（--prefix）とコンパイラの指定（CC, CXX, FC）を行う。
# /usr/local/bin/以下にあるgcc, g++, gfortran（ver 9.3.0）を使ったOpenMPIをインストールする場合は以下の例
# 使用したいコンパイラをここで指定する
./configure --prefix=${HOME}/apps/openmpi/4.0.3_gcc9.3.0 CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++ FC=/usr/local/bin/gfortran
# 8コアでmakeとインストールを行う
make -j8 all ; make install
# このopenmpiを最優先で使いたいときは以下のコマンドを実行しておく。
MPIROOT=${HOME}/apps/openmpi/4.0.3_gcc9.3.0
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPIROOT/lib
export MANPATH=$MANPATH:$MPIROOT/share/man
```