教程(19):故障診斷與性能工程——掉卡、精度漂移與 ns/day 瓶頸定位)
分子模擬異構算力適配開發(fā)教程19故障診斷與性能工程——掉卡、精度漂移與 ns/day 瓶頸定位版本聲明塊工具/軟件GROMACS 2026.x環(huán)境變量/性能指標體系OpenMMReference 平臺參照語言/環(huán)境Linux、Python 3.10診斷腳本本文目標讀完你面對“跑掛了/數(shù)值不對/太慢了”三類問題時都有一套定位流程而不是盲目重跑一句話結論異構 MD 的三類故障各有標準武器——掉卡類先看設備狀態(tài)與健康流device plugin 的 ListAndWatch再談重跑數(shù)值類用同種子同精度逐幀對賬OpenMM Reference 平臺是黃金參照跨引擎對賬容差先聲明再跑性能類靠GMX_DETAILED_PERF_STATS六指標定位到 PME 不平衡gmx tune_pme或 SIMD 誤選GPU 構建配 AVX512 的經(jīng)典坑官方建議 AVX2再動手。〇、本篇要解決的認知問題GPU 掉卡/ECC 錯誤/設備丟失從哪一層開始查重跑的代價怎么控制“數(shù)值不對”怎么定義、怎么對賬跨引擎GROMACS vs OpenMM能對到什么程度性能問題的六指標證據(jù)鏈怎么讀PME 不平衡與 SIMD 誤選兩個經(jīng)典瓶頸怎么確認怎么把三類診斷固化成可復用的腳本與決策樹一、機制解析1.1 故障分類學先分類再動手為什么這一節(jié)對你重要異構平臺上“作業(yè)失敗”的原因譜比單機寬得多調(diào)度層分配、容器可見性、驅動/ECC、引擎后端、物理參數(shù)五層都可能背鍋不分類就動手的結果是“重跑一次碰運氣”——長作業(yè)場景這是數(shù)小時的賭博。類別典型現(xiàn)象證據(jù)層第一步環(huán)境類掉卡/設備丟失CUDA error、設備初始化失敗、Pod 里看不到卡設備狀態(tài)、調(diào)度日志查設備健康不查物理數(shù)值類精度漂移能量異常、與已知結果偏差、兩個引擎結果不同逐幀對賬對賬腳本不看速度性能類慢ns/day 低于預期/歷史md.log 六指標指標歸因不盲目換硬件分類的第一收益環(huán)境類問題重跑大概率復發(fā)卡真的壞了/可見性真的錯了先修環(huán)境數(shù)值類問題重跑毫無意義確定性模擬重跑結果一樣非確定性根源要靠對賬找性能類問題重跑只是重新采樣要看趨勢。1.2 環(huán)境類掉卡的三層排查層 1——設備本體。掉卡最常見的物理根因是 ECC 錯誤與過熱降頻NVIDIA 用nvidia-smi -q看 ECC 計數(shù)與溫度AMD ROCm 用rocm-smi昇騰npu-smi info。ECC 不可恢復錯誤DBE累積到閾值會讓設備離線——這是“跑著跑著消失”的頭號原因。層 2——調(diào)度可見性。設備在但作業(yè)看不見Slurm 的 job step 環(huán)境丟失第 16 篇問題 2、K8s 的 device plugin ListAndWatch 把設備標 Unhealthy第 14 篇——掉卡秒級上報靠它、容器未掛設備文件。癥狀一樣應用報無設備層不同修法完全不同。層 3——引擎/運行時。設備可見但初始化失敗驅動與 CUDA 工具鏈版本錯位第 16 篇問題 3 的容器場景、后端構建不支持該架構第 2 篇 CMAKE_CUDA_ARCHITECTURES 編譯期架構不匹配——no kernel image 錯誤。處置紀律長作業(yè)必須帶 checkpointgmx 的 -cpo/-cpi 續(xù)跑語義——掉卡修復后從檢查點續(xù)而不是從頭第 17 篇調(diào)度器的斷點續(xù)跑靠它作業(yè)腳本自檢段第 16 篇打印可見性是層 2/層 3 的第一手證據(jù)。1.3 數(shù)值類對賬的方法論對賬reconciliation的定義同一物理體系、同一種子、同精度設置在兩個或多個環(huán)境各自跑逐步/逐幀比較關鍵量——目的是回答“差異在哪個量級、來自哪一層”。三個層級成本遞增、結論遞強L1 能量對賬比對平衡后勢能均值——快但粗糙漲落掩蓋小差異判定用相對偏差閾值如 0.1%閾值必須在跑之前聲明——鐵律“容差先聲明再跑”繼承自第 2 篇。L2 軌跡對賬逐步比對坐標/力——位置漂移是混沌系統(tǒng)對初始誤差的指數(shù)放大Lyapunov 不穩(wěn)定性跨引擎的逐步坐標吻合在數(shù)學上不可能浮點結合序不同即發(fā)散——這是對賬最重要的認知跨引擎看統(tǒng)計等價RMSD 分布、能量分布、擴散系數(shù)同引擎同構建看逐幀浮點確定性。L3 黃金參照OpenMM 的Reference 平臺雙精度確定性實現(xiàn)第 4 篇跑短程幾百步作黃金值——任何新后端/新構建先用它校準小體系上 Reference 可接受地慢。跨引擎對賬的合法容差來源mixed 精度的浮點噪聲量級單精度 ~1e-7 相對誤差累積、不同積分器實現(xiàn)的合法差異同為 Langevin 但離散化不同——OpenMM 8.2 起 LangevinMiddle 的 middle 離散化——期望“逐位一致”本身就是錯誤的驗收標準統(tǒng)計等價才是。1.4 性能類六指標與兩個經(jīng)典瓶頸md.log 的性能指標體系第 12 篇鋪過完整版ns/day、hour/ns、ms/step、Matom*steps/s、Mnbf/s非鍵吞吐、MFlops——后兩者需GMX_DETAILED_PERF_STATS1。歸因邏輯PME 不平衡經(jīng)典瓶頸 1PME rank 過載時 PP rank 空等——日志的 PME/PP 計時分離、Matom*steps/s與Mnbf/s的剪刀差是證據(jù)。解法-npme調(diào)整或 cut-off/PME 網(wǎng)格再平衡gmx tune_pme自動掃描官方工具第 3 篇預告。SIMD 誤選經(jīng)典瓶頸 2官方性能頁明示GPU 構建配 AVX512 的 CPU——官方建議“GPU 運行時 CPU SIMD 優(yōu)先 AVX2 而非 AVX512”降頻反噬gmx --version的 SIMD 行是證據(jù)重編譯第 2 篇流程改 GMX_SIMD。launch 開銷主導小體系 ms/step 高但 Mnbf/s 低——CUDA Graphs 的場景第 13 篇nstlist 偶數(shù)。帶寬/切分問題vGPU 或多進程共享卡的 ns/day 腰斬——鐵律 9 的實測復核第 14/17 篇。診斷決策樹的根節(jié)點永遠是“和什么比”——沒有基線歷史檔案/參考硬件的“慢”是無法定位的第 12 篇的 perf-archive.json 與第 16 篇的 perf-ledger.csv 在這里兌現(xiàn)價值。二、完整代碼與逐行剖析一個“數(shù)值對賬器”——L1/L2/L3 三層對賬的完整實現(xiàn)診斷工具箱的核心件#!/usr/bin/env python3MD 數(shù)值對賬器同種子同精度跨環(huán)境比對。 三層L1 能量統(tǒng)計對賬跨引擎合法→ L2 逐幀坐標對賬僅同引擎同構建合法 跨引擎會因混沌發(fā)散——腳本會拒絕并解釋→ L3 Reference 黃金參照校準。 鐵律容差先聲明再跑所有閾值是參數(shù)不是魔法數(shù)。 from__future__importannotationsimportjsonimportsysfromdataclassesimportdataclassfrompathlibimportPathimportnumpyasnpdataclassclassTolerance:對賬容差——跑之前聲明結果與容差比較不反過來。energy_rel:float1e-3# 平衡勢能均值相對偏差L1跨引擎frame_rmsd_nm:float0.05# 逐幀 RMSDL2同引擎同構建——納米級drift_per_step_nm:float1e-4# 前若干步的漂移率L2 早期幀defload_energies(mdlog_or_csv:Path)-np.ndarray:從 md.log 的能量段或預導出 CSV 讀勢能序列解析按第 12 篇錨定法擴展。textmdlog_or_csv.read_text(errorsreplace)importre vals[float(m.group(1))forminre.finditer(r^\s*Potential\s[-0-9.eE]\s([-0-9.eE]),text,re.M)]ifnotvals:raiseValueError(未解析到勢能序列——檢查文件格式)returnnp.array(vals)defreconcile_L1(ea:np.ndarray,eb:np.ndarray,tol:Tolerance)-dict:L1 能量對賬平衡段后 50%均值相對偏差。跨引擎合法。aea[len(ea)//2:].mean()# 棄前半弛豫取平衡段beb[len(eb)//2:].mean()relabs(a-b)/max(abs(a),abs(b))return{level:L1,mean_a:a,mean_b:b,rel_dev:rel,tolerance:tol.energy_rel,pass:reltol.energy_rel}defreconcile_L2(xa:np.ndarray,xb:np.ndarray,same_build:bool,tol:Tolerance)-dict:L2 逐幀對賬。same_buildFalse跨引擎時執(zhí)行前 50 幀漂移率檢查后拒絕全量。ifnotsame_build:# 混沌系統(tǒng)的對數(shù)跨引擎逐幀吻合在數(shù)學上不可能浮點結合序差異指數(shù)放大。# 合法檢查前 50 幀的漂移率短程內(nèi)放大未充分長程必須轉統(tǒng)計對賬。nmin(50,len(xa),len(xb))driftnp.linalg.norm(xa[n-1]-xb[n-1])/nreturn{level:L2-cross-engine,drift_per_step_nm:drift,tolerance:tol.drift_per_step_nm,pass:drifttol.drift_per_step_nm,note:跨引擎只查短程漂移長程等價性請走 L1/統(tǒng)計對賬}rmsdnp.sqrt(((xa-xb)**2).sum(axis-1).mean())return{level:L2-same-build,rmsd_nm:rmsd,tolerance:tol.frame_rmsd_nm,pass:rmsdtol.frame_rmsd_nm}defgolden_reference_check(candidate:np.ndarray,golden:np.ndarray,tol:Tolerance)-dict:L3 黃金參照候選新后端/新構建vs Reference 平臺短程結果。nmin(len(candidate),len(golden))rmsdnp.sqrt(((candidate[:n]-golden[:n])**2).sum(axis-1).mean())return{level:L3-golden,frames:n,rmsd_nm:rmsd,tolerance:tol.frame_rmsd_nm,pass:rmsdtol.frame_rmsd_nm,note:Reference 雙精度確定性——新后端驗收的第一道數(shù)值關}defmain()-None:示例流程兩份能量序列對賬L1。iflen(sys.argv)3:sys.exit(用法: reconcile.py a.md.log b.md.log [--same-build])same--same-buildinsys.argv tolTolerance()ea,ebload_energies(Path(sys.argv[1])),load_energies(Path(sys.argv[2]))reportreconcile_L1(ea,eb,tol)print(json.dumps(report,ensure_asciiFalse,indent2))print(結論:,PASSifreport[pass]elseFAIL——差異超容差按 1.3 節(jié)層級繼續(xù)先查精度聲明再查參數(shù)最后查實現(xiàn))if__name____main__:main()逐段剖析容差全部參數(shù)化Tolerance dataclass對賬結論是“結果 vs 預聲明的容差”不是“看著差不多”——這是把第 8 篇“容差先聲明再跑”鐵律數(shù)值回歸篇在診斷場景的復用。L2 的跨引擎拒絕邏輯是本腳本的靈魂same_buildFalse時不做全量逐幀比較而是短程漂移率 明確的 note 指路——承認混沌系統(tǒng)的數(shù)學事實并給出合法替代L1/統(tǒng)計比硬比 RMSD 得出“引擎有 bug”的錯誤結論負責任得多。L3 用 Reference 當黃金參照的定位幾百步的短程校準它慢百倍量級——新后端驗收第 10/12 篇場景的第一道數(shù)值關性價比最高的正確性投資。三、常見報錯與排查問題 1現(xiàn)象——作業(yè)跑了幾小時后報 CUDA errorXid 錯誤字樣消失/中止。根因按 1.2 節(jié)三層走——最常見是 ECC DBE 累積層 1nvidia-smi -q的 ECC 段看 Retired/AGP 內(nèi)存頁其次是過熱降頻連鎖同看溫度段層 2/3 的可能由“重啟后能不能復現(xiàn)”區(qū)分能復現(xiàn)→配置類不復現(xiàn)→物理類傾向。解法確認物理后處置——ECC DBE 達閾值的卡走 RMA/隔離K8s 側讓 device plugin 的 Unhealthy 上報把卡摘出調(diào)度面第 14 篇作業(yè)側從 checkpoint 續(xù)跑-cpi損失限于最后一檢查點之后。問題 2現(xiàn)象——兩個引擎跑“同一個體系”能量對不上差了千分之幾。根因先別懷疑引擎——合法差異源清單mixed 精度的浮點噪聲第 18 篇協(xié)商層的精度聲明一致嗎、積分器離散化不同Langevin 的各實現(xiàn)差異、力場參數(shù)文件的加載路徑差同 xml/top 差一個版本、以及根本不是同一個體系水模型/截止/耦合參數(shù)的建模差異。解法按 1.3 節(jié)層級收斂——先 L1 統(tǒng)計對賬千分之幾在 mixed 精度的合法容差內(nèi)就收工超容差再下鉆參數(shù)核對把“體系定義一致”的證據(jù)力場文件哈希、參數(shù) dump進對賬報告。問題 3現(xiàn)象——ns/day 比同型號 GPU 的歷史檔案低 30%。根因證據(jù)鏈定位——GMX_DETAILED_PERF_STATS1重跑拿六指標PME/PP 剪刀差大 → PME 不平衡tune_pmeMnbf/s 正常但 ms/step 高 → launch 開銷小體系CUDA Graphs都正常 → 層 2 環(huán)境同節(jié)點共租、降頻nvidia-smi -q -d PERFORMANCE看時鐘別忘了 SIMD 行AVX512 坑。解法按瓶頸歸因動刀——npme/tune_pme、Graphs 開啟nstlist 偶數(shù)、換節(jié)點/時段、重編譯 GMX_SIMDAVX2_256——每次只改一個變量并重測第 13 篇矩陣法的單變量版。問題 4現(xiàn)象——對賬腳本的 L2 逐幀 RMSD 隨幀數(shù)指數(shù)增長同引擎。根因同引擎同構建逐幀應該確定性吻合浮點結合序一致——指數(shù)發(fā)散說明不是數(shù)值噪聲而是輸入或構建有差異種子其實不同、tpr 不同版本 grompp 產(chǎn)物、或“同引擎”其實是不同構建精度/SIMD/后端不同的兩個 gmx。解法比對雙方的環(huán)境快照與構建三要素第 18 篇 JobResult.raw 的用途確認 tpr 哈希一致構建一致后 L2 才有意義——否則退回 L1 統(tǒng)計對賬。四、動手練習練習 1基礎任取兩個能量序列或自己造兩組帶 5% 噪聲的數(shù)據(jù)跑對賬器 L1再用Tolerance(energy_rel1e-6)極限容差復跑觀察 FAIL。判定成功標準兩次運行的 pass 結論相反能解釋“容差聲明在先”為什么是對賬的紀律而不是調(diào)容差遷就結果。練習 2進階給對賬器加統(tǒng)計等價檢查兩組能量分布的均值差與標準差比|μa-μb|/σ閾值 0.5——跨引擎的合法替代指標。判定成功標準新指標輸出并與 L1 結論并存能說明為什么統(tǒng)計等價分布層面比逐點吻合幀層面是跨引擎的正確標準混沌發(fā)散的數(shù)學理由。練習 3思考題無標準答案如果為平臺第 20 篇設計“自動對賬”巡檢——每晚抽 1 個體系跑三方GROMACS/OpenMM/Reference短程對賬報警線怎么定思考方向驗證要點① 三方的兩兩對賬該用哪層L1/L2/L3② 報警的誤報成本與漏報成本怎么平衡對賬閾值不是越嚴越好③ 巡檢結果怎么進第 12 篇的檔案體系歷史趨勢 vs 單點報警。五、小結與下一篇預告本篇建起了診斷體系故障先分類環(huán)境/數(shù)值/性能——環(huán)境類查三層設備 ECC→調(diào)度可見性→引擎運行時不急著重跑長作業(yè)靠 checkpoint 保損失下限數(shù)值類按三層對賬L1 能量統(tǒng)計跨引擎合法、L2 逐幀只對同構建、Reference 是 L3 黃金參照混沌發(fā)散讓“跨引擎逐位一致”成為偽標準統(tǒng)計等價才是性能類靠六指標歸因PME 不平衡tune_pme與 AVX512 坑改回 AVX2是兩個經(jīng)典確認點。對賬器的容差先聲明、跨引擎拒絕逐幀——把紀律寫進代碼。下一篇是全系列終章把適配層18、調(diào)度器17、基準流水線12、對賬器19與 K8s/Slurm 雙底座14-16組裝成完整的異構算力 MD 平臺——架構圖、能力矩陣落地、斷點續(xù)跑與可觀測性19 篇知識的總裝。本篇認知問題回顯FAQQ1GPU 作業(yè)中途報 CUDA error 消失第一步做什么A先分層排查不急重跑層 1 設備本體nvidia-smi -q 看 ECC 不可恢復錯誤與溫度——DBE 累積是掉卡頭號原因層 2 調(diào)度可見性Slurm job step 環(huán)境注入、K8s device plugin 的 Unhealthy 上報層 3 引擎運行時驅動與工具鏈版本、編譯期架構不匹配。確認物理故障后作業(yè)從 checkpoint 續(xù)跑gmx -cpi控制損失。Q2GROMACS 和 OpenMM 跑同一體系結果能逐幀一致嗎A不能——混沌系統(tǒng)對初始誤差指數(shù)放大Lyapunov 不穩(wěn)定跨引擎浮點結合序不同必然逐步發(fā)散逐幀吻合在數(shù)學上不可能跨引擎的正確驗收是統(tǒng)計等價平衡能量分布、RMSD 分布、擴散系數(shù)等逐幀對賬只對同引擎同構建有意義浮點確定性OpenMM Reference 平臺雙精度確定性可作短程黃金參照。Q3ns/day 明顯偏低怎么定位瓶頸A設 GMX_DETAILED_PERF_STATS1 重跑拿六指標ns/day、hour/ns、ms/step、Matom*steps/s、Mnbf/s、MFlops歸因PME/PP 計時剪刀差 → PME 不平衡調(diào) -npme 或 gmx tune_pme 自動掃描Mnbf/s 正常但 ms/step 高 → 內(nèi)核 launch 開銷小體系開 GMX_CUDA_GRAPHnstlist 取偶數(shù)CPU SIMD 行顯示 AVX512 → 重編譯改 AVX2GPU 運行時官方建議再查環(huán)境同節(jié)點共租、降頻時鐘。Q4數(shù)值對賬的容差怎么定A容差必須在跑之前聲明不是看結果再調(diào)mixed 精度浮點噪聲量級單精度約 1e-7 相對誤差決定 L1 能量統(tǒng)計對賬的合法容差如千分量級積分器離散化差異是合法差異源要計入預期L2 同構建逐幀 RMSD 容差取數(shù)值噪聲級如納米級以下超出容差的差異按層級下鉆精度聲明→參數(shù)文件→力場版本→實現(xiàn)。