vsREMD GPU
0830
- 测试所需文件存放路径:172.21.75.1 /home/dddc/zjhan/vsREMD-GPU/file/6replica
调用GPU的命令
- 1. 命令行输入(优先级最高)
- # 若只指定一个GPU,GMX自带的-gpu_id 将无法调用其他GPU
- export CUDA_VISIBLE_DEVICES=1
- # 若指定多个,GMX自带的-gpu_id 只能调用指定的这部分GPU
- export CUDA_VISIBLE_DEVICES=0,1,2
- # 若不输入该命令,GMX默认可以调用所有的GPU。与写入所有GPU ID等价
- export CUDA_VISIBLE_DEVICES=0,1,2,3
- 2. GMX mdrun板块自带参数 -gpu_id
- nohup gmx_mpi mdrun -v -deffnm test -gpu_id 3 &
线程数设置
经测试(如下图),调用20个左右速度最快
- export OMP_NUM_THREADS=20
0927 online discussion
- 交换的有点频繁,每100步算一次(mdp nstep: 100)。在task_log.log 里可见,一直在交换(exchange_flag = True)。定位到运行脚本 MDRunner.py 里, leyun提出 当delta <1时,应该是小于随机数才交换? 我和师兄都很疑惑。17:02 ,leyun找到了2020年的笔记,证实了是大于随机数才交换,并给出了极好的解释:常规情况下,高温副本比低温副本能量更高,因此,若高温副本能量更低,直接交换;若能量更高,则通过与随机数的比较,给他一个机会交换
- 为了做测试,检查我们跑很短的步数,计算得到的势能。要先给定一样的初始速度,去测试(初始应该是gen_seed = 123,后面就是 gen_vel = no; continuation = yes;gen_temp = +++)
- Leyun: gen_vel 默认是 yes,gen_seed = -1 是随机速度(与 gen_vel = no 冲突)
- gen_vel continuation gen_temp gen_seed 对初始速度的影响,gen_temp与 ref_t的优先级顺序,看手册
- gmx 报错原因找到了,初始构象的gro里速度是nan(速度校正因子是负值)
1010
85.24 /home/databank/zzy/project/MD/vsREMD-gpu
- for a in {1..6};do mkdir md$a;b=
`sed -n "${a}p" file/temp`
;sed "s/300.00/${b}/g" file/output_every_step.mdp >md$a/md.mdp;gmx_mpi grompp -f md$a/md.mdp -c zjhan-gpu4n-gro/replica_$a/run.gro -p file/topol.top -n file/index.ndx -o md$a/md.tpr;done - nohup mpirun -np 60 gmx_mpi mdrun -v -deffnm md -multidir md1 md2 md3 md4 md5 md6 -replex 10 &
1011
- nohup mpirun -np 60 gmx_mpi mdrun -v -deffnm md -multidir md1 md2 md3 md4 md5 md6 -replex 10 &
- # 1010 的轨迹,只跑了100步,每一步都输出log,能量,速度,坐标信息,每10步判断一次是否交换
- # debug 思路:将需要判断交换的那6帧(每个副本一帧)提取出来,运行vsREMD-GPU的脚本,看我们计算得到的能量和vsREMD-CPU log文件里的是否一致
- # 测试一下pbc是否有影响
- 有影响!!!
- mkdir sep
- # pbc (不进行pbc处理)
- for i in {1..6};do echo 0|gmx_mpi trjconv -f ../../../md$i/md.xtc -s ../../../md$i/md.tpr -n ../../../../file/index.ndx -sep -o md$i-.gro;done
- # nopbc (进行pbc处理)
- for i in {1..6};do echo 0|gmx_mpi trjconv -f ../../../md$i/md.xtc -s ../../../md$i/md.tpr -n ../../../../file/index.ndx -sep -o md$i-.gro 3;done
- # trr
- # 先搞个10step的测试下
- for i in {1..6};do echo 0|gmx_mpi trjconv -f ../../../md$i/md.trr -s ../../../md$i/md.tpr -n ../../../../file/index.ndx -o md$i-10step.trr -dump 0.02;done
- for a in {1..10};do mkdir repl$a;b=$((a*10));for i in {1..6};do cp sep/md$i-$b.gro ./repl$a;done;done
- ###"rerun.sh" 32L, 883C ######################################################################
- for a in {1..10}
- do
- for i in {1..6}
- do
- cd repl$a
- # pp
- echo 8|gmx_mpi trjconv -s ../../../md$i/md.tpr -f md$i*.gro -n ../../../../file/index.ndx -o md$i-pp.pdb
- echo 8|gmx_mpi convert-tpr -s ../../../md$i/md.tpr -n ../../../../file/index.ndx -o md$i-pp.tpr
- gmx_mpi mdrun -s md$i-pp.tpr -rerun md$i-pp.pdb
- mv ener.edr md$i-pp-ener.edr
- mv md.log md$i-pp.log
- mv traj.trr md$i-traj-pp.trr
- # ww
- echo 9|gmx_mpi trjconv -s ../../../md$i/md.tpr -f md$i*.gro -n ../../../../file/index.ndx -o md$i-ww.pdb
- echo 9|gmx_mpi convert-tpr -s ../../../md$i/md.tpr -n ../../../../file/index.ndx -o md$i-ww.tpr
- gmx_mpi mdrun -s md$i-ww.tpr -rerun md$i-ww.pdb
- mv ener.edr md$i-ww-ener.edr
- mv md.log md$i-ww.log
- mv traj.trr md$i-traj-ww.trr
- # sys
- gmx_mpi mdrun -s ../../../md$i/md.tpr -rerun md$i*.gro
- mv ener.edr md$i-sys-ener.edr
- mv md.log md$i-sys.log
- mv traj.trr md$i-traj-sys.trr
- cd ..
- done
- done
- #############################################################################################
- 85.24 /home/databank/zzy/project/MD/vsREMD-gpu/lywu-test-20241011/gro-extract/result
- for i in {2..6};do mkdir md$i;cp ../pbc/repl1/md$i-pp.log md$i/pbc-pp.log;cp ../pbc/repl1/md$i-ww.log md$i/pbc-ww.log;cp ../pbc/repl1/md$i.log md$i/pbc-sys.log;cp ../nopbc/repl1/md$i-sys.log md$i/nopbc-sys.log;cp ../nopbc/repl1/md$i-pp.log md$i/nopbc-pp.log;cp ../nopbc/repl1/md$i-ww.log md$i/nopbc-ww.log;cp ../../md$i/md.log md$i/vsREMD-cpu.log;done
- # 每一个能量项依次grep的,费时费力还容易出错
- # 这样看一下,跑10步,第一次的交换判断,是否进行周期性处理确实会有影响
- # 再试一下rms等其他周期性处理方法,看能不能拿到 rerun和vsREMD CPU版完全一致或更接近的结果
1012
- # md1 10step test
- echo 9|gmx_mpi trjconv -s ../../../md1/md.tpr -f ../../../md1/md.xtc -n ../../../../file/index.ndx -o ww-pbcmol.gro -dump 0.02 -pbc mol
- # trr 会显示没有盒子信息而报错
- echo 9|gmx_mpi convert-tpr -s ../../../md1/md.tpr -n ../../../../file/index.ndx -o ww.tpr
- gmx_mpi mdrun -s ../ww.tpr -rerun ../ww-pbcmol.gro
1023 debug
zjhan 脚本使用方法:
- # 更改setting里的 工作路径
- source ~/.gmx2022.5-remd.sh
- export CUDA_VISIBLE_DEVICES=0,1,2
- nohup python start.py &
还是老问题,nscale 为负值
delta_e 是 potential_group1的差值,根据上面frame 89的potential_group1 输出结果,定位到负值nscale 的两个副本,减一下,果然是负值。
- tail 89/replica_*/log.log
- # 根据 log.log 里的 potential_group1定位到 两个副本文件夹
- 89/replica_2/log.log
- 89/replica_3/log.log
看了一下对应的gro,感觉可能还是 pbc 问题,晚上尝试修改pbc 代码(autoimage)
修改的地方:
- # setting.py
- # 1024 zyzhou
- CPPTRAJ_SH = f"{WORK_DIR}autoimage.sh"
- # MDRunner.py
- # 4090 autoimage版本(如上)测试
- (ljt) dddc@gpu-4090:/home/data/zzy/koff/vsREMD-gpu/test2-pbc$ nohup python start.py &
- [1] 1315074
除此以外,也交了平行任务
- (base) [chpeng@localhost test1]$ nohup python start.py &
- [1] 8979
- 1023 23:07 还在跑(狗头)
除此以外,还要尝试输出交换率,师兄算的时候没区分副本(地铁老人手机)
1024 debug
- # /home/chpeng/zzy/project/koff/vsREMD-gpu/zjhan-v0.1-1022-raw
test1:没区别
- # /home/chpeng/zzy/project/koff/vsREMD-gpu/zjhan-v0.1-1022-raw/89/replica_2/autoimage
- echo 0|gmx_mpi trjconv -s ../run.tpr -f ../run.gro -n ../../../index.ndx -o pbc-mol.pdb -pbc mol -ur compact
- sh autoimage.sh
- echo 8|gmx_mpi trjconv -s ../run.tpr -f pbc-mol-autoimage.pdb -n ../../../index.ndx -o 8.pdb
- echo 9|gmx_mpi trjconv -s ../run.tpr -f pbc-mol-autoimage.pdb -n ../../../index.ndx -o 9.pdb
- # 动能从run.log 里提取
- # 势能需要计算单点能
- echo 8|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 8.tpr
- gmx_mpi mdrun -s 8.tpr -rerun 8.pdb
- echo 9|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 9.tpr
- gmx_mpi mdrun -s 9.tpr -rerun 9.pdb
系统能量的合理性-run.log
目前的系统能量来源于 run.log 里的 “Statistics over 50001 steps using 501 frames”
而不是最后一帧,需要检查。
从 这个报错的副本看,如果用最后一帧,结果更差。
look-rerun-pdb
先尝试不同的周期性处理方法,并可视化为pdb 文件,确实是 pbcmolurcompact-auto 最好
- echo 8|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.pdb -pbc mol -ur compact
- sh autoimage.sh
- echo 8|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 8.tpr
- gmx_mpi mdrun -s 8.tpr -rerun pbcmolurcompact-auto.pdb
- mv md.log md-ww.log
- echo 9|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.pdb -pbc mol -ur compact
- sh autoimage.sh
- echo 9|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 9.tpr
- gmx_mpi mdrun -s 9.tpr -rerun pbcmolurcompact-auto.pdb
- mv md.log md-pp.log
- ######## "autoimage.sh" 6L, 113C ###############################################################
- cpptraj <<EOF
- parm pbcmolurcompact.pdb
- trajin pbcmolurcompact.pdb
- autoimage
- trajout pbcmolurcompact-auto.pdb
- EOF
- ################################################################################################
这样处理下来,得到的 ww,pp能量和之前略有不同(autoimage 一定要前面的构象做参考,所以需要输出全部轨迹)
最后,如果用本来的系统能量,可以是正值;用了最后一帧,就还是负值
look-rerun2-xtc
ww的结果不如 look-rerun-pdb
- echo 8|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.pdb -pbc mol -ur compact -dump 0
- echo 8|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.xtc -pbc mol -ur compact
- sh autoimage.sh
- echo 8|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 8.tpr
- gmx_mpi mdrun -s 8.tpr -rerun pbcmolurcompact-auto.xtc
- mv md.log md-ww.log
- echo 9|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.pdb -pbc mol -ur compact -dump 0
- echo 9|gmx_mpi trjconv -s ../run.tpr -f ../run.xtc -n ../../../index.ndx -o pbcmolurcompact.xtc -pbc mol -ur compact
- sh autoimage.sh
- echo 9|gmx_mpi convert-tpr -s ../run.tpr -n ../../../index.ndx -o 9.tpr
- gmx_mpi mdrun -s 9.tpr -rerun pbcmolurcompact-auto.xtc
- mv md.log md-pp.log
- ######## "autoimage.sh" 6L, 113C ###############################################################
- cpptraj <<EOF
- parm pbcmolurcompact.pdb
- trajin pbcmolurcompact.pdb
- autoimage
- trajout pbcmolurcompact-auto.pdb
- EOF
- ################################################################################################
这样处理下来,得到的 ww,pp能量和之前略有不同(autoimage 一定要前面的构象做参考)
1025 debug
85.9 /home/chpeng/zzy/project/koff/vsREMD-gpu/zjhan-v0.1-1022-raw/look
- for i in {0..5};do echo 0|gmx_mpi trjconv -s ../89/replica_${i}/run.tpr -f ../replica_${i}.xtc -o ${i}-pbcmolurcompact.pdb -pbc mol -ur compact -skip 100;done
与师姐讨论,突然发现:
最低温和最高温就不该交换。。。。
- # 4090上交一个5个副本的测试
- (ljt) dddc@gpu-4090:/home/data/zzy/koff/vsREMD-gpu/test3-5replica$ nohup python start.py &
- [1] 2074415
1104 温度连续轨迹的获取
- # 172.21.75.1 /home/data/zzy/koff/vsREMD-gpu/replica_temp
- # gmx 命令
- gmx_mpi trjcat -f replica_0.xtc replica_1.xtc replica_2.xtc replica_3.xtc replica_4.xtc replica_5.xtc -demux test.xvg
- # 其中 replica_0.xtc - replica_5.xtc 就是 vsREMD-gpu-1.0 输出的原始轨迹,replica_index.xvg需要由temperature.txt 经过文本操作而得
- # 我们需要 replica_temp.xvg 的内容形式如下
- # 第一列是时间,单位ps
- # 第25列(第x个副本的记录终止于5x+20列) 开始是温度index,0对应第一个温度,以此类推
- # 目前的 temperature.txt 是这样
- # shell 文本操作
- sed 's/300.0/0 /g' temperature.txt|sed 's/326.39/1 /g'|sed 's/355.41/2 /g'|sed 's/386.27/3 /g'|sed 's/420.23/4 /g'|sed 's/450.0/5 /g' > sed.xvg
- awk '{ printf "%-24s%s\n", sprintf("%.2f", 100.00 * (NR - 1)), $0 }' sed.xvg > test.xvg
- # 拼接
- gmx_mpi trjcat -f replica_0.xtc replica_1.xtc replica_2.xtc replica_3.xtc replica_4.xtc replica_5.xtc -demux test.xvg
- # 生成tpr,去水+周期性处理
- for a in {0..5};do b=$((a + 1));c=
`sed -n "${b}p" temp`
;sed "s/+++/$c/g" run_template.mdp >md${a}.mdp;gmx_mpi grompp -f md${a}.mdp -c ../0/replica_${a}/run.gro -p ../top.top -n ../index.ndx -o md${a}.tpr -maxwarn 1;echo 9|gmx_mpi trjconv -s md${a}.tpr -f ../replica_${a}.xtc -n ../index.ndx -o skip50-${a}.xtc -skip 50 -pbc mol -ur compact;done - # 拼接温度连续轨迹
- gmx_mpi trjcat -f skip50-0.xtc skip50-1.xtc skip50-2.xtc skip50-3.xtc skip50-4.xtc skip50-5.xtc -demux test.xvg
- # 生成参考文件 dry.pdb
- gmx_mpi trjconv -s md0.tpr -f ../replica_0.xtc -n ../index.ndx -o dry.pdb -dump 0 -pbc mol -ur compact