QUIP模型在昇腾上的迁移部署实践

作者:昇腾实战派

知识地图:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景概述

原子间势(Interatomic Potentials)是连接量子力学与大规模原子模拟的桥梁:第一性原理方法(如密度泛函理论,DFT)精度高,但可处理的体系规模通常限于数百个原子;经典经验势可以处理百万级原子体系,但精度依赖于固定的函数形式。机器学习势(Machine Learning Potentials)为这一矛盾提供了新的求解范式——在 DFT 数据上训练模型,以经验势的运行方式获得接近第一性原理精度的原子间相互作用。

QUIP(QUantum mechanics and Interatomic Potentials)由剑桥大学 Csányi 课题组开发,是基于 libAtoms 库的 Fortran 95+ 开源代码,实现了多种经典原子间势、紧束缚量子力学方法以及著名的机器学习势框架 GAP(Gaussian Approximation Potentials,高斯近似势,2010 年发表于 Phys. Rev. Lett.),并支持 QM/MM 多尺度耦合。项目由剑桥大学 Gábor Csányi、华威大学 James Kermode 与美国海军研究实验室 Noam Bernstein 长期共同维护,大部分代码以 GPL v2 协议开源,且可作为 LAMMPS、CP2K、ASE 等软件的插件或外部势提供方,是 GAP 类机器学习势的参考实现。GAP 的核心思想是用稀疏高斯过程回归学习原子局域环境到能量的映射:

E ( { r } ) = ∑ i = 1 N f ( x i ) E(\{\mathbf{r}\}) = \sum_{i=1}^{N} f(\mathbf{x}_i) E({r})=i=1Nf(xi)

其中 x i \mathbf{x}_i xi 为描述原子局域环境的 SOAP 描述子。作为对照,传统经验势(如本项目用于验证的 Lennard-Jones 势)则采用固定函数形式:

V L J ( r ) = 4 ε [ ( σ r ) 12 − ( σ r ) 6 ] V_{LJ}(r) = 4\varepsilon\left[\left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^{6}\right] VLJ(r)=4ε[(rσ)12(rσ)6]

本文介绍 QUIP 的昇腾 Ascend 平台适配版本——在 CANN 8.3.RC1 / HDK 25.2.3 环境下完成编译工具链、数学库与 quippy Python 接口的适配,并通过 LJ 势单原子 Cu 体系完成端到端功能验证。

模型介绍

QUIP 概述

QUIP 是一个覆盖"基础库—势函数—程序—Python 接口"完整栈的原子模拟代码集合,主要特点:

  • 势函数库丰富:按官方文档,内置/链接了 16 类以上原子间势,覆盖金属、共价、水与离子体系(详见下文"势函数家族"),并通过 OpenKIM 接口接入通用势数据库
  • 紧束缚量子力学:内置 Bowler、DFTB、GSP、NRL-TB 等紧束缚泛函形式与参数化方案
  • GAP 机器学习势:基于稀疏高斯过程与 SOAP 描述子,支持从 DFT 数据拟合高精度势函数,另支持 MTP(矩张量势)等学习型势
  • QM/MM 耦合:可与 CASTEP、CP2K、Quantum Espresso、FHI-aims 等电子结构软件对接,重点面向金属、半导体等材料体系
  • 软件生态插件:可作为 LAMMPS、CP2K 的势插件,亦可被 Python 的 ASE 框架调用
  • quippy Python 接口:通过 f90wrap 自动生成 Python 绑定,对 Fortran 类型与例程提供深度访问,并提供 ASE 计算器适配
  • 扩展 XYZ 格式:以扩展的 xyz 文件作为统一的结构输入/输出格式(含 Lattice、Properties 等键值属性)
整体架构

模型组成

  1. libAtoms 基础库

    • Atoms 原子结构数据类型(位置、种类、晶格、附加属性字典)
    • 扩展 XYZ 文件的读写与解析
    • 邻居表( neighbour list )构建、约束管理、域分解等基础能力
  2. Potentials 势模块

    • 通过统一的 IP(Interatomic Potential)工厂接口初始化各类势
    • 经典势参数以 XML 文件描述(如 share/Parameters/ip.parms.LJ.xml
    • GAP 势以 .xml 参数文件描述,内含稀疏点集与超参数
  3. Programs 主程序

    • quip 可执行程序:指定结构文件、势初始化参数(init_args='IP LJ')后计算能量/力、运行分子动力学与结构优化
  4. Structure_processors / Utils

    • 结构处理与通用工具(缺陷构造、格点扫描等)
  5. quippy Python 接口

    • 由 f90wrap 对 Fortran 2003 OO 接口自动生成绑定
    • 提供 Potential 类与 ASE Calculator,支持 energyforces 等属性
核心机制:GAP 与经典势的统一接口

QUIP 的核心设计是统一的势对象接口:无论底层是固定形式的经典势,还是数据驱动的 GAP 势,上层(quip 程序、quippy、MD 驱动)均通过 initialise / calc / cutoff 等一致的方法调用。这使得在昇腾平台上完成 LJ 势的功能验证后,GAP 等更复杂的势函数可复用同一调用路径。

势函数家族

按官方文档与 src/Potentials/ 源码,QUIP 通过统一的 IP 工厂接口覆盖以下势函数家族:

家族代表势函数适用体系
经典对势Lennard-Jones、Morse、Born-Mayer惰性气体、通用验证
金属势EAM(含 Ercolessi-Adams 参数化)、Finnis-Sinclair、Sutton-Chen、Glue、SiMEAMfcc/bcc 金属、硅
共价势Stillinger-Weber、Tersoff、Brenner(含 2002 与 screened 版本)碳、硅、锗
机器学习势GAP、MTP、LinearSOAP通用多体体系
水与离子势Fanourgakis-Xantheas、Partridge-Schwenke、Tangney-Scandolo、Flikkema-Bromley水、二氧化硅、钛酸盐等
紧束缚DFTB、NRL-TB、Bowler、GSP半导体、碳体系
通用接口OpenKIM、Custom、CallbackPot接入外部势与自定义逻辑
测试体系

本项目使用最小化体系验证迁移正确性:

  • 结构:单原子 Cu,置于晶格常数 3.615 Å(fcc Cu)的立方盒子中
  • 势函数:LJ 势,参数取自 share/Parameters/ip.parms.LJ.xml(Cu:σ=4.0 Å,ε=1.0 eV,截断 6.0 Å,开启能量位移)
应用场景
  • 分子动力学模拟:材料表面、缺陷、界面的大规模模拟
  • 断裂与损伤力学:官方教程即包含石英断裂 MD 模拟与硅的自适应 QM/MM 断裂模拟等典型算例
  • GAP 势拟合与主动学习:从 DFT 数据训练可迁移的机器学习势,支持 committee 模型评估预测不确定度
  • QM/MM 多尺度模拟:化学反应区域的量子精度与环境的经典描述相结合
  • ASE 生态集成:quippy 势可作为 ASE 计算器用于结构优化、过渡态搜索等流程
  • 跨软件复用:同一势参数文件可经插件机制服务 LAMMPS、CP2K 等不同模拟引擎

昇腾 NPU 适配版本

迁移动机

QUIP 属于 Fortran 生态的科学计算代码,与 PyTorch 类深度学习框架不同,它的适配重点不在算子移植,而在完整工具链在昇腾软硬件环境下的可构建、可运行与接口可用性

  • 昇腾环境通常为鲲鹏 aarch64 架构,原始参考环境为 x86_64,编译器、BLAS 数学库、构建系统均需重新验证
  • quippy Python 接口依赖 f90wrap 的源码级转换,对 gfortran 与 f90wrap 版本组合敏感
  • CANN 8.3.RC1 / HDK 25.2.3 环境下的整体链路需要一次端到端的验证闭环

本适配版本的目标是:QUIP 在昇腾平台上零代码修改完成编译构建,quippy 接口可用,并通过 LJ 势计算验证数值输出正确

仓库结构
QUIP/
├── meson.build / meson.options      # meson 构建定义(gap=true, mpi=false)
├── arch/                            # 各平台编译配置(Makefile.*)
├── src/
│   ├── libAtoms/                    # 基础库:Atoms 结构、XYZ、邻居表
│   ├── Potentials/                  # 势模块:LJ、EAM、SW、GAP 等
│   ├── Programs/                    # quip 主程序
│   ├── Structure_processors/        # 结构处理
│   └── Utils/                       # 工具
├── quippy/                          # f90wrap 生成的 Python 接口
├── share/Parameters/                # 势参数 XML(ip.parms.LJ.xml 等)
├── bin/                             # Python 辅助脚本
├── doc/                             # 文档与教程
├── tests/                           # 回归测试
核心迁移改动
1. 构建系统适配(meson)

QUIP 采用 meson 构建系统,无需修改构建脚本即可在 aarch64 上自动探测 gfortran 与依赖库:

meson setup builddir -Dgap=true -Dmpi=false
meson compile -C builddir
  • -Dgap=true:编译 GAP 相关模块
  • -Dmpi=false:关闭 MPI 并行,简化单机验证路径
2. 编译工具链与数学库适配
yum install -y gcc gcc-c++ make
yum install -y openblas-devel
  • 编译器:使用系统 gfortran 替代参考环境中的 ifort 组合
  • 数学库:以 OpenBLAS 提供 BLAS/LAPACK 实现,替代参考环境中的 MKL
3. Python 接口适配(quippy)
conda create -n quip python=3.9
conda activate quip
pip install "f90wrap>=0.3.0"
pip install ase>=3.17.0
  • f90wrap 对 libAtoms/Potentials 的 Fortran 2003 面向对象接口进行源码级转换,生成 quippy 绑定
  • ase 提供计算器协议,quippy 势可直接挂接到 ASE 的结构优化与 MD 流程
4. 功能验证路径

通过 quip 主程序 + LJ 势对最小体系进行能量计算,验证"结构文件解析 → 势初始化 → 能量计算"整条链路。

版本信息

软件版本
CANN8.3.RC1
HDK25.2.3
gfortran4.4
ifort11.1
Python3.9
f90wrap≥0.3.0
ase≥3.17.0

环境配置

创建并激活虚拟环境
conda create -n quip python=3.9
conda activate quip
下载 QUIP 代码
git clone https://atomgit.com/gmq123/QUIP.git
cd QUIP/
安装相关依赖
yum install -y gcc gcc-c++ make
pip install "f90wrap>=0.3.0"
pip install ase>=3.17.0
yum install -y openblas-devel
编译
meson setup builddir -Dgap=true -Dmpi=false
meson compile -C builddir

功能验证

生成测试数据

创建单原子 Cu 结构文件(fcc Cu 晶格常数 3.615 Å):

cat > test_cu.xyz << EOF
1
Lattice="3.615 0 0 0 3.615 0 0 0 3.615" Properties=species:S:1:pos:R:3
Cu 0.0 0.0 0.0
EOF
运行测试
./builddir/src/Programs/quip \
  atoms_filename=test_cu.xyz \
  init_args='IP LJ' \
  param_filename=share/Parameters/ip.parms.LJ.xml \
  E

参数说明:

  • atoms_filename:输入结构文件(扩展 xyz 格式)
  • init_args='IP LJ':初始化原子间势工厂,选择 LJ 势
  • param_filename:LJ 参数 XML(Cu:σ=4.0 Å,ε=1.0 eV,cutoff=6.0 Å,energy_shift=T)
  • E:请求输出体系能量。运行后 quip 依次打印版本与运行环境信息、结构读取信息(AT3 结构记录)以及体系的总能量,可通过与前述 LJ 参数的理论值对照确认计算结果正确。

迁移适配要点

迁移流程
步骤说明
1. 环境评估确认 CANN/HDK 版本与 aarch64 工具链(gfortran、meson)可用
2. 系统依赖安装gcc、make、OpenBLAS 提供 Fortran 编译与 BLAS/LAPACK 支持
3. Python 环境conda 隔离 py3.9,安装 f90wrap 与 ase
4. meson 构建-Dgap=true -Dmpi=false,生成 quip 可执行程序
5. 功能验证单原子 Cu + LJ 势能量计算,闭环验证解析→初始化→计算
关键技术点
  • meson 构建系统:自动探测编译器与依赖库,QUIP 的构建脚本无需任何修改即可在 aarch64 上工作,这是"零代码修改"适配的关键
  • OpenBLAS 数学库:替代参考环境中的 MKL,为 libAtoms 中的线性代数例程提供符号
  • f90wrap 接口生成:quippy 并非手写绑定,而是由 f90wrap 对 Fortran 源码预处理后自动生成,版本组合(f90wrap ≥0.3.0 + gfortran)需要保持一致
  • conda 环境隔离:Python 接口构建对解释器版本敏感,使用 py3.9 虚拟环境与系统编译环境解耦
与原始实现的差异
组件原始参考环境昇腾适配环境
架构x86_64aarch64(鲲鹏,昇腾平台宿主机)
Fortran 编译器ifortgfortran
BLAS 库MKLOpenBLAS
MPI可选开启关闭(-Dmpi=false
QUIP 源码零修改,完全复用上游构建系统

已知限制

  • 当前验证范围覆盖 LJ 经典势与 quip 主程序的能量计算,GAP 拟合、QM/MM 等重型功能尚未在本环境做全量验证
  • -Dmpi=false 关闭了 MPI 并行路径,多节点并行场景未覆盖
  • quippy 构建对 f90wrap 与 gfortran 版本组合敏感,更换版本时需重新验证
  • 若需启用 ifort 编译路径,需按 arch/ 目录下的配置模板另行适配

参考文献

  • Csányi, G., Winfield, S., Kermode, J. R., De Vita, A., Comisso, A., Bernstein, N., Payne, M. C. Expressive Programming for Computational Physics in Fortran 95+. IoP Comput. Phys. Newsletter, Spring 2007.
  • Kermode, J. R. f90wrap: an automated tool for constructing deep Python interfaces to modern Fortran codes. J. Phys. Condens. Matter 32, 305901 (2020). doi: 10.1088/1361-648X/ab82d2
  • Bartók, A. P., Payne, M. C., Kondor, R., Csányi, G. Gaussian approximation potentials: the accuracy of quantum mechanics, without the electrons. Phys. Rev. Lett. 104, 136403 (2010). doi: 10.1103/PhysRevLett.104.136403
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐