GPUMD专题

GPUMD:双副本交换与检查点续算

用真实NaCl短算例学习replica交换、温度标签、完整检查点和两条续算分支的逐值对照。

更新于 2026-11-06约 5 分钟阅读按任务与环境选择适用配置
阅读本篇目录

本篇使用独立程序 gpumd_replica,以NaCl长程教程中真实训练的同一个charge1模型,演示双副本温度交换与断点续算。一个作业只申请1GPU、1CPU,两个replica在同一张GPU上运行;这不是双GPU加速测试。

1. 下载后先查看结果#

下载模型、实际轨迹、完整检查点与绘图脚本,保存为 gpumd-replica-checkpoint-wave219.zip。

unzip gpumd-replica-checkpoint-wave219.zip -d replica-checkpoint
cd replica-checkpoint
bash view.sh
cat analysis/metrics.csv

生成两张图片及CSV,不重新计算。重复画图使用新解压目录,避免覆盖已有输出。

体系为实际8原子NaCl小晶胞,两个目标温度100/200 K,时间步0.1 fs,总计120步、12 fs,只有六次交换尝试。它用于学习程序和文件流转,不提供收敛温度分布、相变、交换效率或通用NaCl动力学精度结论。

2. 输入与普通GPUMD有哪些不同#

初始40步的完整 run.in:

potential nep.txt
kspace ewald
time_step 0.1
multi_replica remd replicas 2 2 exchange 20 temp 100 200
ensemble nvt_bdp 100 200 100
dump_xyz -1 0 20 trajectory.xyz velocity
run 40

replicas 2 2表示两个副本、每GPU容纳两个副本;exchange 20每20步尝试交换。nvt_bdp与温度梯度对应,显式Ewald用于这个周期性charge1模型。

本版replica的 dump_xyz要求先写 -1 0分组参数,再写间隔和文件名;这里只支持坐标和可选 velocity。不要复制普通 gpumd 的force/charge/precision参数,也不要把两个程序的全部输入关键字视为通用。

GPUMD5.9.1采用GCC13.3/CUDA12.9.86构建。此独立程序需要CUDA共享库,提交脚本显式加载 cuda/12.9及对应 gpumd/5.9.1-p100或V100模块;无需改个人配置或重新安装软件。后处理使用ASE3.29.0。

3. 提交可自动续算的实例#

module load ase/3.29.0
python3 prepare.py
cd cases/p100
sbatch job.slurm

V10016G在 cases/v100执行同样的 sbatch job.slurm。脚本顺序为:

  1. 先运行40步,生成 checkpoint40/。
  2. 完整复制检查点到 direct/,一次追加80步。
  3. 复制同一个检查点到 fork/,先追加40步,再追加40步。
  4. 两条分支均到累计120步,比较结果。

两条分支起点的坐标、速度、温度标签、恒温器与交换随机数状态相同。生产构建默认按时间初始化随机数,两次全新启动的轨迹不能直接逐点比较。这里不为追求相同结果修改软件的DEBUG编译选项。

作业中实际运行的命令是 gpumd_replica,不套 mpirun,不启动两个相同的Slurm任务充当两个副本。

4. 手动续算时保留哪些文件#

ls checkpoint40/remd*restart*
head checkpoint40/remd_restart.meta

需要一起保留:

remd_restart.meta
remd_replica_0_restart.xyz
remd_replica_1_restart.xyz

元数据包括累计步数、温度映射、交换统计及随机数状态;XYZ含坐标、质量、速度和副本标签。只拿坐标不能恢复同一条续算路径。

在原 multi_replica行末加 resume remd,run填写本次追加步数。例如从40步追加80步:

multi_replica remd replicas 2 2 exchange 20 temp 100 200 resume remd
run 80

其余势函数、时间步、温度、恒温器和Ewald设置保持一致。包内脚本完整复制检查点和已有输出,分别写到独立分支,避免把不相干的轨迹追加到一起。

5. 交换了什么,怎么读文件#

cat direct/remd_exchange.out
cat direct/remd_temperature_status.out
head direct/remd_thermo.out

remd_exchange.out记录交换前的副本身份、温度标签、势能、对数接受率、概率与是否接受;remd_temperature_status.out是交换后的标签。固定的副本编号不等同于固定温度。

脚本按原生能量与当前程序使用的kB=8.617343E-5 eV/K,逐行重建:log_ratio=(Ei−Ej)×(1/kBTi−1/kBTj),p=min(1,exp(log_ratio))。没有把输出概率原样当作独立验证。

六次真实交换及交换后的温度标签

源P100接受6次,V10016G接受4次。它们从不同随机初速度起步,只有六次尝试,不能把差异解释为GPU性能差或统计上收敛的接受率。

6. 检查两条续算分支#

P100、V100任务都结束后回到包根目录:

module load ase/3.29.0
python3 analyze.py --new
cat analysis-new/metrics.csv
源算例 分支末态最大位置差,Å 最大速度差,Å/fs 公共时刻最大能量差,eV/原子
P100 4.44E-16 8.67E-19 0,实际输出精度下
V10016G 1.33E-15 4.45E-18 0,实际输出精度下

同一检查点的两种续算方式逐值对照

REMD热力学输出还受每段运行的进度间隔影响,不同分段可能给出不同采样时刻。脚本保留全部原始记录,在真实公共时刻比较,不插值或补造数据。轨迹中的 vel按原生Å/fs读取,不能直接当成ASE动量。

自己的新运行会产生新的随机初态,应检查本次两条分支的一致性,不要求其整条轨迹与随包参考逐位相同。正式使用REMD还应另外检查势函数适用范围、各温度平衡、温度梯度、往返交换和充分采样;12 fs教学例不代替这些工作。普通XYZ/NetCDF与常规续算另见轨迹导出教程,版本接口依据当前固定源码。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗