分子動力学計算エンジン 本家様http://www.ks.uiuc.edu/Research/namd/
ダウンロードサイトに行くと、結構いろいろなバイナリーが配布されている。
Molecular Dynamics Flexible Fitting (MDFF) namd/MDFF
各ダウンロードパッケージの用途とその実行方法を下記にまとめてみた。
プログラム名* | 説明 | 実行方法(例) | 備考 |
Linux-x86_64-multicore | single node/stand-alone | named2 +p<thread> apoa1.namd | 1プロセスで<thread>数で計算 |
Linux-x86_64-TCP | TCP通信で複数ノード対応 (単一ノードでも稼動可) | charmrun ++local ++p <process> \ `which namd2` apoa1.namd | スタンドアロン 1台内で<process>数で計算 |
charmrun ++nodelist list \ ++ppn <core> ++p <総core>\ `which namd2` apoa1.namd | 1ノード当たり<core>を使用して 合計<総core>で計算 1coreが1プロセスになる | ||
Linux-x86_64-ibverbs-smp | InfiniBand通信 smpで計算可能 | charmrun ++ppn <threads> ++p <core> ++nodelist list `which namd2` apoa1.namd |
ここでは標準的な Linux-x86_64-multicore についてそのインストールを示す。
入手したファイルは NAMD_2.12_Linux-x86_64-multicore.tar.gz である。
[root@c ~]# cd /Appl/
[root@c Appl]# gzip -cd src/NAMD_2.12_Linux-x86_64-multicore.tar.gz | tar xf -
[root@c Appl]# ls -l NAMD_2.12_Linux-x86_64-multicore/
合計 25464
-rw-r--r-- 1 14522 1004 1531 12月 22 2016 README.txt
-rw-r--r-- 1 14522 1004 3015 12月 22 2016 announce.txt
-rwxr-xr-x 1 14522 1004 484 12月 22 2016 charmrun
-rwxr-xr-x 1 14522 1004 20838 12月 22 2016 flipbinpdb
-rwxr-xr-x 1 14522 1004 24939 12月 22 2016 flipdcd
drwxr-xr-x 8 14522 1004 101 12月 22 2016 lib
-rw-r--r-- 1 14522 1004 10276 12月 22 2016 license.txt
-rwxr-xr-x 1 14522 1004 23795483 12月 22 2016 namd2
-rw-r--r-- 1 14522 1004 41626 12月 22 2016 notes.txt
-rwxr-xr-x 1 14522 1004 1861611 12月 22 2016 psfgen
-rwxr-xr-x 1 14522 1004 289998 12月 22 2016 sortreplicas
[root@c Appl]#
NAMDの実行にはPATH環境変数の調整だけですみそうで、ユーザ各自のPATH環境変数を下記のようにする。
[illya@c ~]$ export PATH=/Appl/NAMD_2.12_Linux-x86_64-multicore:$PATH
[illya@c ~]$ which namd2
/Appl/NAMD_2.12_Linux-x86_64-multicore/namd2
[illya@c ~]$
実行コマンドは namd2 となります。
テストデータには、http://www.ks.uiuc.edu/Research/namd/utilities/のExample Simulationsにて提供されているApoA1がある。
[illya@c ~]$ mkdir namd && cd namd/
[illya@c namd]$ curl -O http://www.ks.uiuc.edu/Research/namd/utilities/apoa1.tar.gz
[illya@c namd]$ gzip -cd apoa1.tar.gz | tar xf - && cd apoa1
[illya@c apoa1]$ ls -lh
合計 20M
-rw-r--r-- 1 illya fate 794 9月 23 2000 apoa1.namd
-r--r--r-- 1 illya fate 6.8M 9月 23 2000 apoa1.pdb
-r--r--r-- 1 illya fate 13M 9月 23 2000 apoa1.psf
-r--r--r-- 1 illya fate 460 9月 23 2000 par_all22_popc.xplor
-r--r--r-- 1 illya fate 153K 9月 23 2000 par_all22_prot_lipid.xplor
[illya@c apoa1]$
っで、この中身はvmdで閲覧可能で下記を実行すると
[illya@c apoa1]$ apoa1.pdb
vmdが立ち上がり、下図画面が表示される
apoa1.namdにはNAMDでの計算条件が記載されている
cellBasisVector1 108.8612 0.0 0.0 <<-- 周期境界条件
cellBasisVector2 0.0 108.8612 0.0 <<-- 周期境界条件
cellBasisVector3 0.0 0.0 77.758 <<-- 周期境界条件
cellOrigin 0.0 0.0 0.0 <<-- 箱の原点
coordinates apoa1.pdb
temperature 300 <<-- 300K(300-273.15=26.85C)の浴室
seed 74269
switching on
switchdist 10
cutoff 12 <<-- van der Waals/静電相互作用の及ぶ範囲
pairlistdist 13.5
margin 0
stepspercycle 20
PME on <<-- 静電相互作用の計算にPMEを使う
PMEGridSizeX 108
PMEGridSizeY 108
PMEGridSizeZ 80
structure apoa1.psf
parameters par_all22_prot_lipid.xplor
parameters par_all22_popc.xplor
exclude scaled1-4
1-4scaling 1.0
timestep 1.0
fullElectFrequency 4
numsteps 500
outputtiming 20
outputname /usr/tmp/apoa1-out
詳しい各種パラメータの意味はマニュアルをご参照下さい。
*PMEがあればcutoffはどうなるの?
っで計算を流してみる
[illya@c apoa1]$ namd2 apoa1.namd | tee apoa1.log
N3700(1.60GHz)なマシンで 30m29.207s
multicore版は、1 coreでしか計算しません。複数のcoreを使わせるには+pで使用するcore数を指定します。
[illya@c apoa1]$ export PATH=/Appl/NAMD_2.12_Linux-x86_64-multicore:$PATH
[illya@c apoa1]$ namd2 +p4 apoa1.namd | tee apoa1.log <-- 4coreを使って計算
[illya@c apoa1]$ namd2 +p16 apoa1.namd | tee apoa1.log <-- 16coreを使って計算
一応、複数のCPUソケットを有するマシンでもこれで実行可能.
この場合、topコマンドからは下記のように見える(+p32で計算)。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9962 xxxxxx 20 0 2521m 456m 5556 R 3089.6 0.7 3:47.54 namd2
9960 xxxxxx 20 0 27900 1832 1044 R 7.1 0.0 0:00.18 top
N3700(1.60GHz)なマシンで4コア指定したら 8m11.546s になった
TCP版
1台ではなく、複数台を使って計算する場合。nodelistを用意する必要があります。Torqueで言うところの PBS_NODEFILE なもの
ファイル名は何でもよくて、識別子「group」で稼働させたいhostを指定します。
[illya@c apoa1]$ vi list
group main # group名がmain
host n1 # [main]に所属するホスト
host n2
group all # group名がall
host n1 # [all]に所属するホスト
host n2
host n3
[illya@c apoa1]$
「group」名が「main」以外なら「++nodegroup」を設けて指定する必要がある。例 「++nodegroup all」
で実際に計算をさせてみる
[illya@c apoa1]$ export PATH=/Appl/NAMD_2.12_Linux-x86_64-TCP:$PATH
[illya@c apoa1]$ echo "export PATH=/Appl/NAMD_2.12_Linux-x86_64-TCP:\$PATH" >> ~/.bashrc <-- 他ノードでもPATHを有効
[illya@c apoa1]$ charmrun ++nodelist list ++ppn 4 ++p 8 namd2 apoa1.namd
ここでは1ノード当たり4coreを使い、合計8coreで計算させてます。このときの一台のtopは
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10826 xxxxxx 20 0 104m 68m 2920 R 84.0 0.1 0:03.88 namd2
10823 xxxxxx 20 0 225m 85m 5504 R 83.3 0.1 0:21.63 namd2
10824 xxxxxx 20 0 101m 64m 2920 R 80.3 0.1 0:03.77 namd2
10825 xxxxxx 20 0 101m 64m 2920 R 79.3 0.1 0:03.76 namd2
3495 root 20 0 195m 6040 1596 S 0.3 0.0 61:06.13 snmpd
となる。
*注意1
計算を実行したいマシンから実行する必要はない。実行後、listに記載されたマシンで計算する
listに記載されたマシンへパスワードなしでssh接続できることが必須
nvidiaのカードが搭載されたマシンで計算したい場合、使用するのはmulticore-CUDA版。
[illya@c apoa1]$ export PATH=/Appl/NAMD_2.12_Linux-x86_64-multicore-CUDA:$PATH
[illya@c apoa1]$ namd2 +p4 +setcpuaffinity +devices 0 apoa1.namd
「+devices」でnvidiaカードを指定する。複数枚なら「+devices 0,1,2,3」とか
この場合のtopは
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2948 xxxxxx 20 0 85.246g 370912 122744 R 386.8 0.1 1:43.54 namd2
2911 xxxxxx 20 0 168840 3168 1592 R 0.7 0.0 0:00.74 top
となる。
計算機間の通信にはinfinibandが必要みたい。ibverbs-smp-CUDA
TCPの延長で作れるかソースで試したが無理でした...
ジョブ管理システムTORQUEを経由してジョブを走らせてみた
TORQUEは、リソースの管理と確保が第一で、その確保されたリソースにコマンド行を投げる。
確保されたホストは環境変数PBS_NODEFILEに書かれているので、これを利用して nodelist 向けのファイルを作成する。
留意 PBS_NODEFILE ファイルに書かれたホスト名は、確保されたcoreの数だけ書かれているので重複があります。
そのため「sout -u」で重複をなくして、sedコマンドで nodelist 向けに加工します。
[illya@pbs apoa1]$ vi namd.qsub
#!/bin/bash
#PBS -q bio
#PBS -l nodes=2:ppn=2
#PBS -j oe
#
CONV_RSH=rsh
cd $PBS_O_WORKDIR
echo "group main" > list
cat $PBS_NODEFILE | sort -u | sed 's/^/host /g' >> list
#
echo "exec rsh \$1 \$2 \$3 /bin/bash -f" > myrsh
chmod +x myrsh
#
charmrun `which namd2` ++ppn 2 ++p 4 ++nodelist list apoa1.namd ++remote-shell $PBS_O_WORKDIR/myrsh
rm list
rm myrsh
[illya@pbs apoa1]$
[illya@pbs apoa1]$ qsub namd.qsub
*csh/tcshシェルでも動きます.
複数のノードで計算する場合、charmrunから下記のような他ノードへの接続コマンドが発行される
<計算ノード> -l <ユーザ> -o KbdInteractiveAuthentication=no -o PasswordAuthentication=no -o NoHostAuthenticationForLocalhost=yes /bin/bash -f
まるっきりssh向きの接続コマンドである。
CONV_RSHでsshを指定するならこれで構わないが、rshだと「-o」オプションなんて知らないとして落ちてしまいます。
そこで、「++remote-shell」を使って請けて側を修正する。
それが、
echo "exec rsh \$1 \$2 \$3 /bin/bash -f" > myrsh
chmod +x myrsh
です。これで
exec rsh <計算ノード> -l <ユーザ> /bin/bash -f
と解釈されて、他ノードに接続される。
「export CONV_RSH=ssh」として、かつ、計算ノードへのログインを許可しているのなら「myrsh」は不要。
計算ノードへのssh接続を許可してなく、rshのみで運用なら「myrsh」は必要みたい。