QUIP模型在昇腾上的迁移部署实践
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=1∑Nf(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 等键值属性)
整体架构
模型组成
-
libAtoms 基础库
- Atoms 原子结构数据类型(位置、种类、晶格、附加属性字典)
- 扩展 XYZ 文件的读写与解析
- 邻居表( neighbour list )构建、约束管理、域分解等基础能力
-
Potentials 势模块
- 通过统一的 IP(Interatomic Potential)工厂接口初始化各类势
- 经典势参数以 XML 文件描述(如
share/Parameters/ip.parms.LJ.xml) - GAP 势以
.xml参数文件描述,内含稀疏点集与超参数
-
Programs 主程序
quip可执行程序:指定结构文件、势初始化参数(init_args='IP LJ')后计算能量/力、运行分子动力学与结构优化
-
Structure_processors / Utils
- 结构处理与通用工具(缺陷构造、格点扫描等)
-
quippy Python 接口
- 由 f90wrap 对 Fortran 2003 OO 接口自动生成绑定
- 提供
Potential类与 ASE Calculator,支持energy、forces等属性
核心机制: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、SiMEAM | fcc/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 势对最小体系进行能量计算,验证"结构文件解析 → 势初始化 → 能量计算"整条链路。
版本信息
| 软件 | 版本 |
|---|---|
| CANN | 8.3.RC1 |
| HDK | 25.2.3 |
| gfortran | 4.4 |
| ifort | 11.1 |
| Python | 3.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_64 | aarch64(鲲鹏,昇腾平台宿主机) |
| Fortran 编译器 | ifort | gfortran |
| BLAS 库 | MKL | OpenBLAS |
| 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
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)