4.1 grompp 与 mdrun 生产运行 本节摘要:grompp 是模拟的合同公证处——它把 mdp、结构与拓扑交叉验证后冻结进 tpr;mdrun 是唯一的执行者。本节走一遍生产运行的完整会话:编译期的三类提示如何处置、线程数与 CPU 亲和性怎么设、checkpoint 如何续算、模拟怎么合法延期。原则只有一条:现在多花十分钟读 grompp 的输出,将来省下十小时的重跑。 历史上看,这套"编译—运行"两段式在 MD 引擎里是异类:多数软件边读输入边跑,改参数立刻生效,代价是同一份轨迹事后说不清当初用了什么参数。GROMACS 把全部决定冻进 tpr 的设计,换来的是"这份轨迹绝对可复现"——4.2 你会看到 tpr 还会被分析工具反复读取。
本节摘要:grompp 是模拟的合同公证处——它把 mdp、结构与拓扑交叉验证后冻结进 tpr;mdrun 是唯一的执行者。本节走一遍生产运行的完整会话:编译期的三类提示如何处置、线程数与 CPU 亲和性怎么设、checkpoint 如何续算、模拟怎么合法延期。原则只有一条:现在多花十分钟读 grompp 的输出,将来省下十小时的重跑。
历史上看,这套"编译—运行"两段式在 MD 引擎里是异类:多数软件边读输入边跑,改参数立刻生效,代价是同一份轨迹事后说不清当初用了什么参数。GROMACS 把全部决定冻进 tpr 的设计,换来的是"这份轨迹绝对可复现"——4.2 你会看到 tpr 还会被分析工具反复读取。理解了这层设计意图,grompp 那些絮絮叨叨的提示就不再是噪音,而是合同条款的逐条宣读。
grompp 的输出分三级,处置原则各不相同:
$ gmx grompp -f md.mdp -c npt.gro -t npt.cpt -p topol.top -o md.tpr :-) GROMACS - gmx grompp, 2024.2 (-: ... WARNING 1 [file md.mdp]: You are using a plain Coulomb cut-off, which might produce artifacts. ... NOTE 1 [file topol.top]: System has non-zero total charge: -4.000000 ... This run will generate roughly 18 Mb of data # 磁盘预算提前告知
NOTE 是"知会事项",如净电荷非零(加离子前后正常出现,2.3 已中和则应为零)、性能提示——读一遍确认符合预期即可。WARNING 是"合同瑕疵":静电截断不对、缓冲区可疑、参数组合有历史前科。它的处置原则是查明原因,改到不再出,而不是加 -maxwarn 压过去。-maxwarn 的设计本意是让有经验的人在明确知道风险时签字放行;新手把它当"跳过烦人检查"的按钮用,等于把本该当天发现的错误推迟到三天后以崩溃形式爆发。ERROR 直接终止,没有商量——通常是拓扑与坐标的原子数对不上(2.2 的账没平)或参数真的非法。
# 单机多线程:48 逻辑核机器上的推荐起手 $ gmx mdrun -deffnm md -nt 24 -ntomp 2 -pin on -pinstride 1 -nb gpu -pme cpu :-) GROMACS - gmx mdrun, 2024.2 (-: ... Reading file md.tpr, VERSION 2024.2 (mixed precision) ... Core t (s) Wall t (s) (%) 0 7128.4 744.2 958.0 Performance: 412.36 0.412 ns/day ← 产能指标,6.3 的主角 ... Finished mdrun
参数逐个过:-deffnm md 让全部输出共享前缀(md.log、md.xtc、md.edr、md.cpt……),目录整洁且脚本好写。-nt 与 -ntomp 把总线程拆成"线程 MPI 进程 × OpenMP 线程"两维,PME 与域分解在这两维上的伸缩行为不同(6.3 详述),生产前跑个短基准选最优组合。-pin on -pinstride 1 把线程钉死在固定核上——跑过夜任务必开,否则操作系统调度漂移能吃掉一成产能。-nb gpu 把非键交给 GPU(无卡机器删掉此参数);-pme cpu 明确 PME 留在 CPU,单卡配置下这是常规分工。
过夜任务的一个好习惯是启动后先盯五分钟 log:
$ tail -f md.log Step Time 1000 2.00000 ← 心算:两分钟跑了 1000 步 → 预估全程时长 $ grep -c "^ *Step" md.log # 随时查进度
然后按 3.6 的判据在运行中段抽一次能量曲线(gmx energy 对仍在写入的 edr 也能取到当前为止的数据),确认温度密度正常才安心睡觉。
checkpoint 文件 md.cpt 每 15 分钟自动写一次(可用 -cpt 调整),包含坐标、速度、恒温恒压耦合器的完整状态。三个用途:
# 1) 中断续算(机器重启、排队超时后):直接重跑同一条命令,mdrun 检测到 cpt 自动续 $ gmx mdrun -deffnm md # 2) 模拟延期:原定 50 ns 不够,改 tpr 到 100 ns 再续跑 $ gmx convert-tpr -s md.tpr -extend 50000 -o md_extend.tpr # 延长 50000 ps $ gmx mdrun -deffnm md -s md_extend.tpr -cpi md.cpt # 3) 检查点内容诊断:看它到底存了什么、落在第几步 $ gmx check -f md.cpt
注意第 2 条的姿势:改长度必须走 convert-tpr 重建 tpr,直接手改 mdp 重新 grompp 是错的——那会重置随机数流与耦合状态,接出来的轨迹在统计上有一道缝。反过来,第 1 条续算是无缝的,3.6 提过的"-t 接力"与这里是同一机制。
跑几天到几周的任务,巡检节奏建议:每天看一眼 log 尾部(步数在涨、无 WARNING 刷屏);每天抽一次能量曲线对照 3.6 判据;每写满一个周转存档周期,把 xtc 复制到安全位置(集群存储也会坏)。巡检时要分辨两种状态——正常涨落是围绕平台的高频抖动,慢性漂移是平台本身在缓慢移动(温度爬升、密度下滑)。后者常是约束失效或参数不当的前兆,4.3 的决策树会把它与突发崩溃并列成两条入口。
| 参数 | 作用 | 建议用法 |
|---|---|---|
| -deffnm | 统一输出前缀 | 常规任务必开 |
| -nt / -ntomp | 线程 MPI 进程数 / 每进程 OpenMP 线程数 | 基准扫描后定,见 6.3 |
| -pin on -pinstride | 线程绑核 | 过夜任务必开 |
| -nb gpu / cpu | 非键放 GPU 还是 CPU | 有卡默认 gpu |
| -pme cpu / gpu | PME 放哪 | 默认 cpu,换前先基准 |
| -cpt | checkpoint 写盘间隔(分钟) | 默认 15,集群易闪断可改 5 |
| -noconfout | 不写最终坐标 | 纯基准测试省 IO |
| -nsteps | 临时改步数(覆盖 tpr) | 基准缩放用,生产别碰 |
| -resetstep | 从第几步开始统计性能 | 长任务预热后重置计数 |
两个容易被误解的成员值得点名。-nsteps 会覆盖 tpr 里的 nsteps,基准测试用它缩放任务长度很方便,但生产任务忘了删会让你的 100 ns 变成 100 ps——4.2 的 gmx check 末帧时间对不上时先查它。-resetstep 解决"性能统计含预热噪声"的问题:预热几千步后重置计时,得到的 ns/天 才是稳态产能。
-maxwarn 什么时候真的可以用? 只有一种情况:你逐条读懂了 WARNING 内容、有明确理由认为它在本体系不构成问题(例如已知 NOTE 类参数提示与你的特殊力场配套方式冲突)。签字放行是专家动作,且要在实验记录里写下"放行了哪条、为什么"。凡是看不懂的 WARNING,一律查明再跑——这个原则能避开绝大多数"跑崩了找不到原因"的惨案。
checkpoint 间隔设多少合适? 权衡两个风险:间隔太长,闪断丢失的采样时间多(15 分钟默认对应多数任务可接受);间隔太短,写盘 IO 干扰计算(巨型体系才明显)。5 到 15 分钟之间按任务长度选,另有一个隐藏收益别忘了——cpt 里存着耦合器状态,3.6 的 NVT 接 NPT 也靠它接力。
跑一半发现参数设错了怎么办? 分两类。输出类(频率、精度)设错:止损继续跑,分析时绕过;物理类(温度、截断、力场)设错:立即停,回 grompp 重编 tpr 从 checkpoint 或更早重启——物理参数错误的轨迹无论跑了多长都只能进废纸篓,抱着"都跑了三天了"的心态继续跑是最大的浪费。
速记:grompp 是公证处,WARNING 必须查明不许 -maxwarn 敷衍;生产起手式 -deffnm 加 -nt/-ntomp 加 -pin on 加 -nb gpu;cpt 是存档点,续算无缝、延期走 convert-tpr、手改 mdp 会留缝;巡检抓两件事——步数在涨、平台没漂。下一节管仓储:五类输出各是什么、留谁删谁。