ALAMODE Installation

  1. install anaconda Anaconda (Miniconda)
    % cd $HOME
    インストール用シェルスクリプトをダウンロード
    % wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
    % chmod u+x Anaconda3-2023.09-0-Linux-x86_64.sh
    % ./Anaconda3-2023.09-0-Linux-x86_64.sh
    conda init を ~/.bashrc に書き込みますか?という以下のメッセージに yesと答える
    You can undo this by running `conda init --reverse $SHELL`? [yes|no]
    [no] >>> yes
     
    インストールが完了すると、~/.bashrcにcondaコマンドを実行できるようになる関数などが追加されます。
    以下は less コマンドを使って .bashrc ファイルの中身を確認しています。閲覧を終了するときは、qボタンを押してください。
    % less ~/.bashrc

    ###==================== less command display ====================###
    # >>> conda initialize >>>
    # !! Contents within this block are managed by 'conda init' !!
    __conda_setup="$('/home/rhiguchi/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
    if [ $? -eq 0 ]; then
    eval "$__conda_setup"
    else
    if [ -f "/home/rhiguchi/anaconda3/etc/profile.d/conda.sh" ]; then
    . "/home/rhiguchi/anaconda3/etc/profile.d/conda.sh"
    else
    export PATH="/home/rhiguchi/anaconda3/bin:$PATH"
    fi
    fi
    unset __conda_setup
    # <<< conda initialize <<<
    ###===================== enter q to finish ======================###
     
  2. exitコマンドでセッションを終了し、新しいセッションを開始、.bashrcを読みこむ
    % exit
    (base)% 
  3. 新しくシェルセッションを開始したときに、自動で conda-base 環境に入るように設定されてしまっているので、 conda config コマンドを使って自動起動設定を解除します。
    (base)% conda deactivate
    % conda config --set auto_activate_base false
    % exit
     
    以下のコマンドは、conda-base環境を一度起動して、すぐに元に戻す操作です。仮想環境に入ると、プロンプトが仮想環境の名前になります。
    % conda activate base
    (base)% conda deactivate 
     
  4. alamode専用の仮想環境を作成します。(alamode公式サイト参考 https://alamode.readthedocs.io/en/develop/install.html)
    create conda environment for alamode
    (optional) phonopyとpymatgenもインストールします。
    また仮想環境を作り終えた段階で、この後のビルド作業に関わるので、すでにloadされているモジュールといくつかのPATHを確認しておきます。
    % conda create --name alamode python=3
    % conda activate alamode
    (alamode)% conda install -c conda-forge compilers openmpi boost eigen cmake spglib fftw scipy numpy h5py ipython
    (alamode)% conda install -c conda-forge phonopy
    (alamode)% conda install pymatgen
    (alamode)% echo $PATH | tr ":" "\n"

    print your PATH ...

    (alamode)% echo $PYTHONPATH | tr ":" "\n"

    print your PYTHONPATH ...

    (alamode)% echo $LD_LIBRARY_PATH | tr ":" "\n"

    print your LD_LIBRARY_PATH ...

    (alamode)% echo $CONDA_PREFIX
    print your anaconda alamode environment path.
    (alamode)% conda deactivate
    % module list
    print already loaded module....
    Download alamode source and Build "alm" & "anphon"
    初めにgitからalamodeのレポジトリをローカル環境に複製します。 複製を作成するディレクトリを your/path/ として、alamodeのディレクトリが your/path/alamode となっているとします。

    Warning :
    神谷・片瀬研究室のサーバーcsrvでは神谷先生の計算支援プログラムDoVASP実行のために、すでに.bashrcファイルを通していくつかのモジュールがロードされており $LD_LIBRARY_PATH と $PYTHONPATH が設定されています。
    実際、module list や echo コマンドで変数を確認すると、空白ではなく何かが返ってきていると思います。
    しかし、この後のビルドのための操作で使用したいcondaに存在しているモジュールやライブラリが、これらのすでに設定されているライブラリと競合することを避ける必要があります。
    また、alamodeレポジトリにある便利なツールを簡単に使用するために、your/path/alamode の中のいくつかのディレクトリを $PYTHONPATH へ追加します。
    注意して設定してください。
     
  5. git コマンドで alamodeをダウンロードします。その後、ブランチをdevelopブランチへ切り替えます。
    (公式サイトがなぜかdevelopを指定している)
    % pwd
    your/path/
    % git clone https://github.com/ttadano/alamode.git
    % cd alamode
    % git checkout develop 
    alamodeレポジトリの構成は以下の通りです。$CONDA_PREFIX は今使用しているcondaの仮想環境へのpath変数です。

    your/path/
    ├── alamode
    │ ├── CMakeLists.txt
    │ ├── alm
    │ │ └── CMakeLists.txt
    │ ├── anphon
    │ │ └── CMakeLists.txt
    │ ├── docs
    │ ├── example
    │ ├── external
    │ ├── include
    │ └── tools
    │ └── CMakeLists.txt

    ├── $CONDA_PREFIX/include
    ├── $CONDA_PREFIX/include/eigen3
    ├── $CONDA_PREFIX/lib
    ├── ...
     
  6. alamode直下に、コンパイルしたバイナリファイルを作成する_buildフォルダを作成し、そのフォルダへ移動します。

    % mkdir _build ; cd _build
    Warning : ここから本当に重要な設定です。細心の注意を払って設定してください。

    先ほど作成したalamodeの仮想環境を起動するときに、自動で読み込まれるshellスクリプトを作成して、規定のフォルダに配置します。
    規定のフォルダの場所は $CONDA_PREFIX/etc/conda/ にある activate.d と deactivate.d です。
    vimなどのエディターを使って、alamode_act.sh, alamode_deact.sh という名前のシェルスクリプトを作成して、それぞれ配置してください。 スクリプトの中の内容は以下の通りです。

    % conda activate alamode
    (alamode)% less $CONDA_PREFIX/etc/conda/activate.d/alamode_act.sh

    ###==================== less command display ====================###
    #!/bin/sh

    # save the current PATH
    cleaned_path=$(echo "$PATH" | awk -v RS=: -v ORS=: '$0 != "'"$CONDA_PREFIX"'/bin" {print $0}' | sed 's/:$//')
    export OLD_PATH="$cleaned_path"
    # add new PATHs to PATH
    export PATH=$PATH:${HOME}/apps/alamode/_build/alm/
    export PATH=$PATH:${HOME}/apps/alamode/_build/anphon/
    export PATH=$PATH:${HOME}/apps/alamode/_build/tools/


    # save the default PYTHONPATH
    export OLD_PYTHONPATH="$PYTHONPATH"
    # set a new PYTHONPATH
    export PYTHONPATH="${HOME}/apps/alamode/tools/"


    # save the current LD_LIBRARY_PATH
    export OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
    # add new PATHs to LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:$LD_LIBRARY_PATH
    ###===================== enter q to finish ======================###

    (alamode)% less $CONDA_PREFIX/etc/conda/deactivate.d/alamode_deact.sh

    ###==================== less command display ====================###
    #!/bin/sh

    #restore PATH
    if [ ! -z "$OLD_PATH" ]; then
    export PATH="$OLD_PATH"
    unset OLD_PATH
    fi

    #restore PYTHONPATH
    if [ ! -z "$OLD_PYTHONPATH" ]; then
    export PYTHONPATH="$OLD_PYTHONPATH"
    unset OLD_PYTHONPATH
    fi

    #restore LD_LIBRARY_PATH
    if [ ! -z "$OLD_LD_LIBRARY_PATH" ]; then
    export LD_LIBRARY_PATH="$OLD_LD_LIBRARY_PATH"
    unset OLD_LD_LIBRARY_PATH
    fi
    ###===================== enter q to finish ======================###

    (alamode)% conda deactivate
    再びalamode仮想環境に入り、これから使用する cmake コマンドがalamode環境下にあることを確認してください。

    % conda activate alamode
    (alamode)% which cmake
    print your cmake bin path
    alamode環境下にあることを確認出来たら、cmake, make でビルドを行っていきます。
    まず事前にロードされていたモジュールたちを全てunloadします。
    cmakeコマンドのオプションでコンパイラを指定しようが、これらのロードされているモジュールたちがどうも邪魔をしているらしく、unloadしてコンパイルしないと、anphon実行時にsegmentationエラーが発生していました。
    全てのモジュールをunloadできたらcmakeコマンドを打ちます。使用するライブラリをconda仮想環境のものにしたいので、cmakeコマンドのオプションを使って指定します。
    最後にmakeコマンドでビルドします。

    (alamode)% module list
    print already loaded module
    (alamode)% module unload module_name
    print deleting message....
    (alamode)% module list
    No Modulefiles Currently Loaded.
    (alamode)% pwd
    your/path/alamode/_build
    (alamode)% cmake -DUSE_MKL_FFT=no -DLAPACK_LIBRARIES=$CONDA_PREFIX/lib/liblapack.so -DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so -DSPGLIB_ROOT=$CONDA_PREFIX -DWITH_HDF5_SUPPORT=yes ..
    (alamode)% make -j
    ビルドが完了したら、ldd コマンドを使って、_build/anphon, _build/alm にリンクされているライブラリがalamode環境のものになっているか確認します。
    下は僕がコンパイル完了後に確認した結果です。lib64/ に関してはcondaにそもそも存在していないので、サーバーにあるものをそのまま借用しました。
    カッコ内はメモリアドレスの番号なので実行ごとに変わります。

    (alamode)% ldd $(which anphon)
    linux-vdso.so.1 (0x00007ffca59cd000)
    libopenblas.so.0 => /home/rhiguchi/anaconda3/envs/alamode/lib/libopenblas.so.0 (0x0000148020b0c000)
    libmpi.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/libmpi.so.40 (0x00001480209ea000)
    libfftw3.so.3 => /home/rhiguchi/anaconda3/envs/alamode/lib/libfftw3.so.3 (0x00001480207cb000)
    libgomp.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/libgomp.so.1 (0x0000148022cff000)
    libstdc++.so.6 => /home/rhiguchi/anaconda3/envs/alamode/lib/libstdc++.so.6 (0x00001480205e8000)
    libm.so.6 => /lib64/libm.so.6 (0x000014802024b000)
    libgcc_s.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/libgcc_s.so.1 (0x0000148020230000)
    libc.so.6 => /lib64/libc.so.6 (0x000014801fe6d000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x000014801fc4d000)
    libgfortran.so.5 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libgfortran.so.5 (0x000014801faa2000)
    /lib64/ld-linux-x86-64.so.2 (0x0000148022cd2000)
    libopen-rte.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libopen-rte.so.40 (0x000014801f9e8000)
    libopen-pal.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libopen-pal.so.40 (0x000014801f8e8000)
    librt.so.1 => /lib64/librt.so.1 (0x000014801f6e0000)
    libdl.so.2 => /lib64/libdl.so.2 (0x000014801f4dc000)
    libquadmath.so.0 => /home/rhiguchi/anaconda3/envs/alamode/lib/././libquadmath.so.0 (0x000014801f4a3000)
    libz.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/././libz.so.1 (0x000014801f488000)
    libutil.so.1 => /lib64/libutil.so.1 (0x000014801f284000)
    alamodeレポジトリにあるtestディレクトリに移動して、テストを行います。

    (alamode)% cd your/path/alamode/test
    (alamode)% python test_si.py
    Silicon ALM --> pass
    Silicon ANPHON --> pass
    このときに、次のような警告メッセージが表示された人は、OMPI_MCA_btl という変数を新しく設定してください。
    これはOpenMPIの古いバージョン(4.0/4.1リリース)のibverbsコンポーネントから警告メッセージが発生しているという問題のようで、このサイトを参考にしています。
    先ほど作成した alamode の activate.d/alamode_act.sh, deactivate.d/alamode_deact.sh に、この変数についての設定を入力すると便利です。

    --------------------------------------------------------------------------
    WARNING: There was an error initializing an OpenFabrics device.

    Local host: csrv12
    Local device: mlx5_0
    --------------------------------------------------------------------------
    (alamode)% export OMPI_MCA_btl=^openib
    (alamode)% python test_si.py
    Silicon ALM --> pass
    Silicon ANPHON --> pass
    (alamode)% exit
    Build in TSUBAME environment
    基本的には上述のやり方で問題ないのですが、TSUBAME上で環境を構築するときにいくつかの注意点があります。
    ラボサーバーcsrvではanacondaをインストールしました。
    しかしanacondaは容量が大きいため、TSUBAME上でのストレージ制限にかかりやすくなってしまいます。
    そこでMinicondaを使って最小構成で環境を構築しました。
    また個人のディスク容量は25GBと少なく、すぐに足りなくなってしまうので、環境は tga-kklab のディスク上に作成しました。
    個人・グループのディスク容量を確認するには t3-user-info コマンドを使用します。

    % t3-user-info disk group
    % t3-user-info disk home
    また、ログインノードでは10分以上のジョブに関しては強制的に停止させられてしまいます。
    conda の仮想環境を作成するために conda install を行うのですが、

    (alamode)% conda install numpy scipy matplotlib ....
    このように一気にレポジトリを追加してしまうと、依存関係を解くために非常に時間がかかり、ジョブがタイムアウトしてしまいます。

    (alamode)% conda install numpy
    (alamode)% conda install scipy
    ...
    ホームページで必要と記載されているレポジトリだけでも一つずつインストールすることで、タイムアウトから逃れていました。
    conda の仮想環境を作成し終えたら /gs/hs0/tga-kklab/usr/rhiguchi/apps/ に alamode のgitレポジトリを複製して、ビルドします。
    cmakeコマンドは大してリソースを使わないので、ログインノードでそのまま実行しました。
    一方でmakeコマンドは非常にリソースを使ってしまうため計算ノードにジョブを投げました。

    #!/bin/bash
    #$ -cwd
    #$ -l q_node=1
    #$ -l h_rt=00:10:00
    #$ -N alamode_make
    #$ -o alamode_make.log
    #$ -j y

    # . /etc/profile.d/modules.sh
    # module load

    source ~/.bashrc
    conda activate alamode
    make -j
    #python test_si.py
    上記のようなジョブスクリプト job を作成しました。#$ となっている箇所は、qsubコマンドによってオプションの解析が行われるところです。
    .bashrcに書き込まれている conda 環境のアクティベートコマンドを打つために、sourceで読み込み
    alamodeの仮想環境を起動します。オプション -cwd によってqsubを実行したコマンドの場所で処理が行われます。
    実際には /alamode/_build/ で qsub -g tga-kklab job または、無料のお試し qsub job 実行でビルドしました。
    ビルド後のテスト実行のためにも、上記のようなジョブスクリプトを生成して、 python test_si.py を実行しました。

    When you failed to build, or some errors occured...
    何かのエラーが発生しているとき、絶対にこれをすればよい、という方法はないのですが、これまで書いてきた方法の中ではこまめにPATH変数を確認してきました。

    (alamode)% echo $PATH
    (alamode)% echo $LD_LIBRARY_PATH
    (alamode)% echo $PYTHONPATH
    (alamode)% echo $MODULEPATH
    特に、$PATH, $LD_LIBRARY_PATH, $PYTHONPATH は $CONDA_PREFIX/etc/conda/activate.d/alamode_act.sh などで設定しなおしています。
    正直、これらの変数がどこまで重要かはっきりしていないのですが、確認することは重要だと思います。また、それ以外にも

    (alamode)% which cmake
    (alamode)% which anphon
    (alamode)% which alm
    (alamode)% ldd $(which anphon)
    (alamode)% ldd $(which alm)
    (alamode)% module list
    (alamode)% echo ${CC}
    (alamode)% echo ${CXX}
    によって、キチンと PATH が設定できているか、狙ったライブラリを利用できているか、すでにモジュールをロードしていないか、などを確認してください。
    僕は初めに、ライブラリの指定ができていなかったこと、意図していないモジュールをロードしていたことによって、Segmentationエラー(不正なメモリアクセス)を引き起こしていました。
    (C言語だとお馴染み、セグっているときのエラーです)

    [csrv12:2963289] *** Process received signal ***
    [csrv12:2963289] Signal: Segmentation fault (11)
    [csrv12:2963289] Signal code: Address not mapped (1)
    [csrv12:2963289] Failing at address: 0x440000e8
    [csrv12:2963289] [ 0] /lib64/libc.so.6(+0x378d0)[0x149f232b38d0]
    [csrv12:2963289] [ 1] /home/rhiguchi/anaconda3/envs/alamode/lib/libmpi.so.40(PMPI_Comm_rank+0x37)[0x149f260f4b17]
    [csrv12:2963289] [ 2] anphon(_ZN7PHON_NS5MyMPIC1EPNS_4PHONEi+0x10f)[0x55ae70a81ebf]
    [csrv12:2963289] [ 3] anphon(_ZN7PHON_NS4PHONC1EiPPci+0x7d)[0x55ae70a9f7ad]
    [csrv12:2963289] [ 4] anphon(main+0x40)[0x55ae709f56d0]
    [csrv12:2963289] [ 5] /lib64/libc.so.6(__libc_start_main+0xf3)[0x149f2329f803]
    [csrv12:2963289] [ 6] anphon(+0x319b5)[0x55ae709f59b5]
    [csrv12:2963289] *** End of error message ***
    Segmentation fault (core dumped)
    だいぶ荒業ですが僕の場合、~/.bashrc ファイルをセッション開始時に読み込まないように、.bashrcのバックアップを取ったうえで別の名前のファイルにしてセッションを再開して、環境設定を変更することで原因を特定しました。
    また、chatGPT もヒントをたくさんくれました。便利なので使ってみ