#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」は必要みたい。