UMA 吸附能预测:把几小时的 DFT 算力需求压进几秒钟
【免费下载链接】ocpFAIR Chemistry's library of machine learning methods for chemistry项目地址: https://gitcode.com/GitHub_Trending/oc/ocp
做催化筛选时最磨人的从来不是单个 DFT 算不准,而是"算不完"。OCP(FAIR Chemistry 的机器学习化学库)里的 UMA 模型(Universal Models for Atoms,等变图神经网络架构)把结构优化加吸附能预测的整套流程从小时级拉到秒级,精度保持在 DFT 可用的范围内。它在一个约 5 亿条 DFT 样本的大数据集上训练,靠混合线性专家(MoLE,给不同化学环境动态路由参数的结构)撑起了高容量又不牺牲推理速度的目标。下面按真实工作流里最常碰到的几个问题来讲,以 OC20 类催化吸附场景为主线。
环境怎么快速搭好,模型从哪里拉?⚙️
装三个包就够:核心推理、OC 数据工作流、cattsunami 应用模块。
git clone https://gitcode.com/GitHub_Trending/oc/ocp cd ocp pip install fairchem-core fairchem-data-oc fairchem-applications-cattsunami装完之后,模型权重不用手动下载。pretrained_mlip模块里注册了可用的模型名(如uma-s-1p2p1、uma-m-1p1),调用时会自动从 HuggingFace 拉取到~/.cache/fairchem缓存目录,并连带下载配套的元素参考能文件。文档推荐从uma-s-1p2p1起步,它是小模型最新补丁版,速度、精度和显存的平衡最好。私有仓库权限问题跑一次huggingface-cli login即可。
先想清楚:小模型还是大模型,任务名怎么选?
一句话结论:日常筛选用小的,最终确认用大的。
UMA 一个检查点会对应多个任务(task),任务名决定输出对齐哪套 DFT 泛函口径,可选值包括omol(有机分子)、oc20(催化表面)、omat(无机材料)、odac(MOF 捕碳)、omc(有机晶体)。算吸附能就选oc20,对应 RPBE 泛函的训练口径;换成omat得到的能量是另一套基准,直接混着比是没意义的。这个映射关系在 UMA 模型文档 里有完整的任务-数据集-应用场景对照表,选之前值得看一眼。
官方基准里 UMA 小模型(UMA-S)在力误差和 NVE 步耗时上同时优于多数同级模型,大模型(UMA-M)则用更高耗时换更低误差。推理时还可以用inference_settings控制编译开关(compile)、TF32 精度等,大原子数场景关掉 compile、打开 activation checkpointing 更稳,参考 速度基准配置 与 速度测试脚本 的写法。
吸附构型不用手摆:ocdata 工作流一次生成几十上百个
这是整个流程里最省事的一环。fairchem.data.oc提供了四个类——Bulk、Slab、Adsorbate、AdsorbateSlabConfig——串起来就是"体相 → 晶面 → 吸附"。
Bulk从体相数据库按 ID 取结构,Slab.from_bulk_get_specific_millers(bulk, specific_millers=(1,1,1))切出指定晶面,Adsorbate用 SMILES(如*CO,*标记绑定原子)从吸附质库里取结构,吸附质数据库就在 src/fairchem/data/oc/databases/pkls/ 下。最后是AdsorbateSlabConfig:给它 slab 和吸附质,再设num_sites控制采样点位数、mode控制放置策略(random全随机、heuristic启发式找 atop/bridge/hollow 位、random_site_heuristic_placement两者混合),一次就能产出一整列候选构型。完整用法见 ocdata 使用文档。
加载 UMA、算出吸附能,中间只隔一次结构优化
拿到构型后,加载模型、挂计算器、跑优化三件事各只有几行。
from fairchem.core import FAIRChemCalculator calc = FAIRChemCalculator.from_model_checkpoint( "uma-s-1p2p1", task_name="oc20", inference_settings="default", # 可换 "turbo" 启用 TF32 加速 ) atoms.calc = calc print(atoms.get_potential_energy())from_model_checkpoint是官方教程推荐的入口:传模型名、task_name和推理档位就返回一个标准的 ASECalculator,inference_settings="turbo"会额外开启 TF32 换速度。挂到结构体上后,用QuasiNewton做几何弛豫(opt.run(fmax=0.05, steps=100),即最力降到 0.05 eV/Å 或跑满 100 步停止),分别取吸附体系、裸表面、气相吸附质三个优化后的能量,就能代入吸附能定义:
E_ads = E(adslab) − E(slab) − E(adsorbate)
三个符号分别对应"催化剂+吸附质的整体能量""单独催化剂表面能量""气相中吸附质参考能量"。相减的意义在于扣掉催化剂和分子各自的本底,只留下两者相互作用的部分;这个量越负,通常意味着结合越强。
结果可信吗?⚡️ 轨迹异常过滤 + 和 DFT 对一遍
先过滤,再对比。结构优化跑完后,别急着算能量——有的轨迹里吸附质其实解离了或者干脆脱附跑了,这类结果留在统计里会直接污染分布。
from fairchem.data.oc.utils import DetectTrajAnomaly detector = DetectTrajAnomaly(initial, final, tags) valid = not ( detector.is_adsorbate_dissociated() or detector.is_adsorbate_desorbed() )这个检测器在 cattsunami 里被大量使用,输入初末两帧结构和原子标签,就能判断解离与脱附。过滤之后再做定量校验:拿 UMA 预测的相互作用能和同批构型的 DFT 值画散点或差值直方图,绝大多数点应聚在零点附近的小偏差带内;系统性整体偏移时,优先检查参考能文件是否与检查点配套(用注册名加载会自动带上)、task_name是否和 DFT 泛函口径一致。
批量筛选怎么提速,卡住不收敛往哪查?
单构型流程跑通后,规模化就靠两个杠杆。一是把多个构型放进同一批推理(get_predict_unit支持workers参数做多进程并行,inference_settings="batch"面向异构输入),二是多 GPU 本地或 SLURM 提交,参考 集群提交配置 下的模板。
不收敛的排查顺序大致是:加步数(steps=300)→ 放宽力阈值(fmax=0.1)→ 检查初始构型是否原子严重重叠(生成时可调大interstitial_gap)。结果和 DFT 偏差大时,按"任务选错 → 参考能不配套 → 构型不合理"的顺序过一遍,绝大多数情况能定位。想再压精度的常规组合拳:换更大的模型档位、UMA 优化完结构后对关键构型做一次 DFT 单点校正、以及把num_sites调大覆盖更多初始位置。
更多场景可以看 官方催化教程 和 AdsorbML 应用,从单点吸附能到完整吸附机器学习筛选都有现成入口。
【免费下载链接】ocpFAIR Chemistry's library of machine learning methods for chemistry项目地址: https://gitcode.com/GitHub_Trending/oc/ocp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考