名称: fairchem 描述: Meta FAIRChem库的专家指导,使用机器学习方法进行材料科学和量子化学,通过预训练的UMA模型和ASE集成,实现快速、准确的预测
FAIRChem技能
此技能提供使用FAIRChem(前身为OCP - Open Catalyst Project,即Meta的FAIR化学库)的专家指导,该库专为材料科学和量子化学设计。
何时使用此技能
在以下情况使用此技能:
- 使用ML势进行材料和分子模拟
- 使用预训练模型进行快速几何优化
- 执行大规模MD模拟
- 计算能量和力,无需DFT
- 使用UMA(通用材料代数)模型
- 需要催化、分子、晶体或MOFs的预测
- 将ML模型与ASE工作流集成
- 跨多个GPU扩展计算
什么是FAIRChem?
FAIRChem是Meta用于化学的机器学习框架,提供:
- 预训练的UMA模型(
uma-s-1p1、uma-m-1p1)用于通用预测 - 特定领域任务:催化(oc20)、材料(omat)、分子(omol)、MOFs(odac)、晶体(omc)
- ASE集成通过
FAIRChemCalculator - 多GPU支持用于分布式推理
- 快速预测:比DFT快100-1000倍
关键优势
通过简单更改task_name参数,FAIRChem允许您跨不同化学域使用相同模型。
核心概念
1. UMA模型
在多样数据集上训练的通用材料代数模型:
uma-s-1p1:小模型(约50M参数)- 推理更快uma-m-1p1:中模型(约300M参数)- 精度更高
2. 任务名称(领域)
指定化学域以进行领域特定预测:
oc20:催化(表面与吸附物)omat:无机材料(晶体、体相)omol:分子(有机化学)odac:金属有机框架(MOFs)omc:分子晶体
3. FAIRChemCalculator
ASE计算器接口,包装UMA模型:
- 作为DFT计算器的替代品
- 支持所有ASE工作流
- 提供能量、力和应力
- 兼容优化、MD、NEB
4. 推理设置
性能优化模式:
turbo:最大速度,精度略有降低- 标准:速度与精度平衡
- 多GPU:使用
workers=N的分布式推理
安装
# 安装fairchem
pip install fairchem-core
# GPU支持
pip install fairchem-core[gpu]
# Hugging Face登录(UMA模型必需)
pip install huggingface-hub
huggingface-cli login
注意:您必须有Hugging Face账户并请求访问UMA模型仓库。
基本使用模式
标准工作流
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.build import bulk
from ase.optimize import LBFGS
# 1. 加载预训练模型
predict_unit = load_predict_unit("uma-m-1p1")
# 2. 为特定域创建计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omat" # 选择域
)
# 3. 与ASE一起使用
atoms = bulk("Cu", "fcc", a=3.6)
atoms.calc = calc
# 4. 计算属性
energy = atoms.get_potential_energy()
forces = atoms.get_forces()
# 5. 优化结构
opt = LBFGS(atoms)
opt.run(fmax=0.05)
常见工作流
工作流1:催化 - 表面吸附
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.build import fcc111, add_adsorbate
from ase.optimize import LBFGS
from ase.constraints import FixAtoms
# 加载模型
predict_unit = load_predict_unit("uma-m-1p1")
# 为催化创建计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="oc20" # 催化域
)
# 构建带吸附物的板
slab = fcc111("Cu", size=(4, 4, 4), vacuum=10.0)
add_adsorbate(slab, "CO", height=2.0, position="fcc")
# 固定底部层
n_atoms_per_layer = 16
constraint = FixAtoms(indices=range(n_atoms_per_layer * 2))
slab.set_constraint(constraint)
# 附加计算器并优化
slab.calc = calc
opt = LBFGS(slab, trajectory="slab_opt.traj")
opt.run(fmax=0.05)
# 获取结果
E = slab.get_potential_energy()
forces = slab.get_forces()
工作流2:体相材料 - 晶格优化
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.build import bulk
from ase.optimize import FIRE
from ase.filters import FrechetCellFilter
# 加载模型
predict_unit = load_predict_unit("uma-m-1p1")
# 材料计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omat" # 材料域
)
# 创建体相结构
atoms = bulk("Fe", "bcc", a=2.87)
atoms.calc = calc
# 优化位置和晶胞
# FrechetCellFilter允许改变晶胞参数
ucf = FrechetCellFilter(atoms)
opt = FIRE(ucf)
opt.run(fmax=0.05)
# 结果
optimized_lattice = atoms.cell.cellpar()[0]
print(f"优化后的晶格常数: {optimized_lattice:.3f} Å")
工作流3:分子动力学
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.build import bulk
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
from ase.md.langevin import Langevin
from ase import units
# 加载turbo设置以提高速度
predict_unit = load_predict_unit(
"uma-s-1p1", # MD使用小模型
inference_settings="turbo"
)
# MD计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omat",
workers=4 # 多GPU用于大系统
)
# 大系统
atoms = bulk("C", "fcc", a=3.57) * (20, 20, 20) # 8000个原子
atoms.calc = calc
# 初始化速度
MaxwellBoltzmannDistribution(atoms, temperature_K=300)
# 运行NVT动力学
dyn = Langevin(
atoms,
timestep=1.0 * units.fs,
temperature_K=300,
friction=0.002
)
# 运行
from ase.io.trajectory import Trajectory
traj = Trajectory("md.traj", "w", atoms)
dyn.attach(traj.write, interval=10)
dyn.run(5000)
工作流4:分子系统
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.build import molecule
from ase.optimize import LBFGS
# 加载模型
predict_unit = load_predict_unit("uma-m-1p1")
# 分子计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omol" # 分子域
)
# 构建分子
mol = molecule("H2O")
mol.center(vacuum=10.0)
mol.calc = calc
# 优化
opt = LBFGS(mol, trajectory="mol_opt.traj")
opt.run(fmax=0.05)
# 获取属性
E = mol.get_potential_energy()
forces = mol.get_forces()
工作流5:NEB计算
from fairchem.data.ase import FAIRChemCalculator
from fairchem.predict import load_predict_unit
from ase.neb import NEB
from ase.optimize import BFGS
from ase.io import read
# 加载模型
predict_unit = load_predict_unit("uma-m-1p1")
# 计算器
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="oc20"
)
# 加载初始和最终状态
initial = read("initial.traj")
final = read("final.traj")
# 创建NEB
images = [initial]
images += [initial.copy() for i in range(5)]
images += [final]
neb = NEB(images)
neb.interpolate()
# 附加计算器到中间图像
for image in images[1:-1]:
image.calc = calc
# 优化
opt = BFGS(neb, trajectory="neb.traj")
opt.run(fmax=0.05)
# 分析
energies = [img.get_potential_energy() for img in images]
barrier = max(energies) - energies[0]
print(f"势垒: {barrier:.3f} eV")
模型加载选项
加载预训练UMA模型
from fairchem.predict import load_predict_unit
# 标准加载
predict_unit = load_predict_unit("uma-m-1p1")
# Turbo模式(更快,精度略有折衷)
predict_unit = load_predict_unit(
"uma-m-1p1",
inference_settings="turbo"
)
# 指定设备
predict_unit = load_predict_unit(
"uma-m-1p1",
device="cuda:0"
)
# 加载本地检查点
predict_unit = load_predict_unit(
"/path/to/checkpoint.pt",
device="cuda"
)
可用模型
uma-s-1p1:小、快(约50M参数)uma-m-1p1:中、准确(约300M参数)
任务选择指南
| 域 | 任务名称 | 用途 | 示例 |
|---|---|---|---|
| 催化 | oc20 |
表面 + 吸附物 | Cu(111)上的CO、Pt上的O |
| 材料 | omat |
体相晶体、缺陷 | Fe晶格、Si体相 |
| 分子 | omol |
有机分子 | H2O、CH4、蛋白质 |
| MOFs | odac |
金属有机框架 | ZIF-8、MOF-5 |
| 晶体 | omc |
分子晶体 | 冰、有机晶体 |
性能优化
多GPU推理
# 自动使用多个GPU
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omat",
workers=8 # 使用8个GPU
)
# 在8× H100 GPU上实现约10倍加速
Turbo模式
# 以轻微精度换取速度
predict_unit = load_predict_unit(
"uma-s-1p1", # 小模型
inference_settings="turbo"
)
# 适用于:
# - MD模拟
# - 大系统
# - 初始筛选
批量预测
# 针对多个相似计算
from fairchem.data.ase import batch_predict
structures = [atoms1, atoms2, atoms3, ...]
results = batch_predict(
structures,
predict_unit=predict_unit,
task_name="omat"
)
最佳实践
1. 任务选择
始终为您的系统选择适当任务:
- 带吸附物的表面 →
oc20 - 体相材料 →
omat - 孤立分子 →
omol - MOFs →
odac - 分子晶体 →
omc
2. 模型选择
- 初始筛选:使用
uma-s-1p1+ turbo - 生产计算:使用
uma-m-1p1 - 极大系统:使用
uma-s-1p1+ workers
3. 验证
ML模型与DFT有不同的误差特性:
# 始终验证关键结果
# 对代表性案例比较ML预测与DFT
ml_energy = atoms.get_potential_energy() # FAIRChem
atoms.calc = Vasp(...) # 切换到DFT
dft_energy = atoms.get_potential_energy()
error = abs(ml_energy - dft_energy)
4. 不确定性量化
FAIRChem模型提供预测但不提供不确定性:
- 首先在类似已知系统上测试
- 对关键结果用DFT验证
- 如果有可用,使用预测集合
5. 内存管理
对于大系统:
# 使用turbo模式
predict_unit = load_predict_unit(
"uma-s-1p1",
inference_settings="turbo"
)
# 跨GPU分发
calc = FAIRChemCalculator(
predict_unit=predict_unit,
task_name="omat",
workers=4
)
常见模式
能量计算
atoms.calc = calc
energy = atoms.get_potential_energy() # eV
forces = atoms.get_forces() # eV/Å
stress = atoms.get_stress() # eV/ų
几何优化
from ase.optimize import LBFGS, FIRE, BFGS
# 快速收敛
opt = LBFGS(atoms, trajectory="opt.traj")
opt.run(fmax=0.05)
# 针对困难系统
opt = FIRE(atoms)
opt.run(fmax=0.05)
晶胞优化
from ase.filters import FrechetCellFilter
# 优化原子和晶胞
ucf = FrechetCellFilter(atoms)
opt = FIRE(ucf)
opt.run(fmax=0.05)
与ASE集成
FAIRChemCalculator是完整的ASE计算器:
# 所有ASE功能可用
from ase.vibrations import Vibrations
from ase.thermochemistry import IdealGasThermo
from ase.eos import calculate_eos
# 振动分析
vib = Vibrations(atoms)
vib.run()
# 热化学
thermo = IdealGasThermo(...)
# 状态方程
eos = calculate_eos(atoms)
故障排除
Hugging Face认证
# 登录Hugging Face
huggingface-cli login
# 请求访问UMA模型在:
# https://huggingface.co/meta-llama/uma-m-1p1
GPU内存问题
# 使用更小模型
predict_unit = load_predict_unit("uma-s-1p1")
# 使用turbo模式
predict_unit = load_predict_unit(
"uma-s-1p1",
inference_settings="turbo"
)
# 减少批量大小(如果使用批量预测)
推理慢
# 启用turbo模式
inference_settings="turbo"
# 使用多个GPU
workers=N
# 使用更小模型
"uma-s-1p1"
错误任务选择
# 症状:预测差、非物理结果
# 解决方案:验证任务匹配您的系统
# 对于表面 + 吸附物:
task_name="oc20" # 不是 "omat" 或 "omol"
# 对于体相材料:
task_name="omat" # 不是 "oc20"
版本兼容性
重要:FAIRChem v2是相对于v1的重大更改
- v2代码不兼容v1模型
- v1代码不兼容v2模型
- UMA模型需要FAIRChem >= 2.0
# 检查版本
import fairchem
print(fairchem.__version__) # 对于UMA应 >= 2.0
与DFT比较
| 方面 | FAIRChem | DFT |
|---|---|---|
| 速度 | 快100-1000倍 | 慢 |
| 精度 | 约0.1 eV | 参考 |
| 扩展性 | 线性、多GPU | 立方 |
| 系统大小 | 数千个原子 | 10-100个原子 |
| 用例 | 筛选、MD | 高精度 |
何时使用FAIRChem vs DFT
使用FAIRChem用于:
- 许多结构的初始筛选
- 长MD模拟
- 大系统(>500原子)
- 快速原型开发
- 高通量工作流
使用DFT用于:
- 最终验证
- 训练数据外的新化学
- 需要最高精度时
- 电子结构分析
- 磁性属性
资源
建议FAIRChem解决方案时:
- 指定正确域的任务名称
- 推荐适当模型(s vs m)
- 建议性能优化(turbo、workers)
- 包含已知结果的验证
- 提及Hugging Face认证要求
- 提供完整工作示例
- 注意v2兼容性要求
示例响应模式
帮助FAIRChem时:
- 识别化学域(催化、材料、分子等)
- 选择适当任务名称
- 基于精度/速度要求选择模型
- 提供含导入的完整代码
- 如有需要,建议性能优化
- 推荐验证步骤
- 注意任何域特定考虑