#author("2019-02-03T09:10:59+00:00","default:sysosa","sysosa")
#author("2019-02-03T12:15:05+00:00","default:sysosa","sysosa")
分子動力学計算エンジン 本家様[[http://www.ks.uiuc.edu/Research/namd/>+http://www.ks.uiuc.edu/Research/namd/]]
ダウンロードサイトに行くと、結構いろいろなバイナリーが配布されている。

&size(10){Molecular Dynamics Flexible Fitting (MDFF) [[namd/MDFF]]};
***インストール [#v4bed27c]
各ダウンロードパッケージの用途とその実行方法を下記にまとめてみた。
|BGCOLOR(YELLOW):プログラム名&color(red){*};|BGCOLOR(YELLOW):説明|BGCOLOR(YELLOW):実行方法(例)|BGCOLOR(YELLOW):備考|
|Linux-x86_64-multicore|single node/stand-alone|named2 +p<thread> apoa1.namd|1プロセスで<thread>数で計算|
|Linux-x86_64-TCP|TCP通信で複数ノード対応&br;(単一ノードでも稼動可)|charmrun ++local ++p <process> \&br;`which namd2` apoa1.namd|スタンドアロン&br;1台内で<process>数で計算|
|~|~|charmrun ++nodelist list \&br; ++ppn <core> ++p <総core>\&br;`which namd2` apoa1.namd|1ノード当たり<core>を使用して&br;合計<総core>で計算&br;1coreが1プロセスになる|
|Linux-x86_64-ibverbs-smp|InfiniBand通信&br;smpで計算可能|charmrun ++ppn <threads> ++p <core>&br; ++nodelist list `which namd2` apoa1.namd||

ここでは標準的な Linux-x86_64-multicore についてそのインストールを示す。
入手したファイルは &color(magenta){NAMD_2.12_Linux-x86_64-multicore.tar.gz}; である。
#code(nonumber){{
[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環境変数を下記のようにする。
#code(nonumber){{
[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 ~]$
}}
実行コマンドは &color(red){namd2}; となります。



***サンプルファイル [#nf55dbb6]

テストデータには、[[http://www.ks.uiuc.edu/Research/namd/utilities/>+http://www.ks.uiuc.edu/Research/namd/utilities/]]のExample Simulationsにて提供されているApoA1がある。

#code(nonumber){{
[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で閲覧可能で下記を実行すると
#code(nonumber){{
[illya@c apoa1]$ apoa1.pdb
}}
vmdが立ち上がり、下図画面が表示される
&ref(2018y02m11d_212518596.png,nolink);

&color(crimson){apoa1.namd};にはNAMDでの計算条件が記載されている
#code(nonumber){{
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
}}
詳しい各種パラメータの意味はマニュアルをご参照下さい。
&color(red){*};&size(10){PMEがあればcutoffはどうなるの?};

っで計算を流してみる
#code(nonumber){{
[illya@c apoa1]$ namd2 apoa1.namd | tee apoa1.log
}}
&size(10){N3700(1.60GHz)なマシンで 30m29.207s};


***並列計算(その1) [#hc793a3e]

&color(darkgreen){''multicore''};版は、1 coreでしか計算しません。複数のcoreを使わせるには&color(magenta){''+p''};で使用するcore数を指定します。
#code(nonumber){{
[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で計算)。
#code(nonumber){{
  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
}}

&size(10){N3700(1.60GHz)なマシンで4コア指定したら 8m11.546s になった};


***並列計算(その2) [#o3bd552f]
&color(darkgreen){''TCP''};版
1台ではなく、複数台を使って計算する場合。nodelistを用意する必要があります。Torqueで言うところの PBS_NODEFILE なもの
ファイル名は何でもよくて、識別子「group」で稼働させたいhostを指定します。
#code(nonumber){{
[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」
で実際に計算をさせてみる
#code(nonumber){{
[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は
#code(nonumber){{
  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
}}
となる。

&color(red){*};&size(10){注意1};
計算を実行したいマシンから実行する必要はない。実行後、listに記載されたマシンで計算する
listに記載されたマシンへパスワードなしでssh接続できることが必須
&ref(2016y08m11d_000117256.png,nolink,noborder);

***CUDAで計算 [#mb9b8ec9]
nvidiaのカードが搭載されたマシンで計算したい場合、使用するのは&color(darkgreen){''multicore-CUDA''};版。
#code(nonumber){{
[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は
#code(nonumber){{
  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
}}
となる。

***複数台のCUDAマシンで計算 [#g542349b]
計算機間の通信にはinfinibandが必要みたい。&color(darkgreen){ibverbs-smp-CUDA};
&size(10){TCPの延長で作れるかソースで試したが無理でした...};


***qsubとあわせて [#v5d875fc]
ジョブ管理システムTORQUEを経由してジョブを走らせてみた
TORQUEは、リソースの管理と確保が第一で、その確保されたリソースにコマンド行を投げる。
確保されたホストは環境変数PBS_NODEFILEに書かれているので、これを利用して nodelist 向けのファイルを作成する。
&color(white,red){留意}; PBS_NODEFILE ファイルに書かれたホスト名は、確保されたcoreの数だけ書かれているので重複があります。
そのため「sout -u」で重複をなくして、sedコマンドで nodelist 向けに加工します。

#code(nonumber){{
[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
}}
&color(red){*};csh/tcshシェルでも動きます.



***メモ [#r8299fe7]
複数のノードで計算する場合、charmrunから下記のような他ノード接続コマンドを発行する
複数のノードで計算する場合、charmrunから下記のような他ノードへの接続コマンドが発行される
#code(nonumber){{
<計算ノード> -l <ユーザ> -o KbdInteractiveAuthentication=no -o PasswordAuthentication=no -o NoHostAuthenticationForLocalhost=yes /bin/bash -f
}}
まるっきりssh向きの接続コマンドである。CONV_RSHでsshを指定するならこれで構わないが、rshだと「-o」オプションなんて知らないとして落ちてしまいます。
まるっきりssh向きの接続コマンドである。
CONV_RSHでsshを指定するならこれで構わないが、rshだと「-o」オプションなんて知らないとして落ちてしまいます。
そこで、「++remote-shell」を使って請けて側を修正する。
計算ノードそれぞれにログインを許可するなら、修正は必要ない。sshで計算ノードにログインさせたくない。
rshでのみで対処させたい(rloginは不許可)なら上記のように「++remote-shell」を修正するしかないのかも。
それが、
#code(nonumber){{
echo "exec rsh \$1 \$2 \$3 /bin/bash -f" > myrsh
chmod +x myrsh
}}
です。これで
#code(nonumber){{
exec rsh <計算ノード> -l <ユーザ> /bin/bash -f
}}
と解釈されて、他ノードに接続される。

「export CONV_RSH=ssh」として、かつ、計算ノードへのログインを許可しているのなら「myrsh」は不要。
計算ノードへのssh接続を許可してなく、rshのみで運用なら「myrsh」は必要みたい。



トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS