GeoMPNN — AirfRANS 论文复现
GeoMPNN:一个几何感知的消息传递图神经网络,用于对翼型周围的空气动力学进行建模。
模型架构
网络结构
- 表面编码层(Surface Layers): 4 层,在翼型表面网格上传递消息,编码表面几何与边界条件
- 表面到体积层(Surface-to-Volume Layers, S2V): 4 层,将表面信息传播至体积网格中的每个流场点
- 隐藏层维度: 64
- 边特征维度: 64
- 径向基函数(RBF)基数量: 8
- 坐标编码: 混合极-笛卡尔坐标系,结合正弦与球谐函数基
- 多坐标系: 同时使用前缘和后缘坐标系以区分不同空间区域
- 激活函数: ReLU
场预测配置
各物理量场采用不同的解码头(head)配置:
| 场 | 解码头类型 | 对数压力处理 |
|---|---|---|
| ux | 球谐函数(sph) | 否 |
| uy | 球谐函数(sph) | 否 |
| nut | 入口条件(inlet) | 否 |
| p | 入口条件(inlet) | 是 |
关键组件
- 表面图构建: 基于半径阈值(
surface_radius=0.05)和法向匹配构建表面节点连接 - 体积采样: 每例流体域均匀子采样 16000 个点
- 表面到体积消息传递: 每个体积节点与最近的 8 个表面节点进行消息交互
数据集
- 来源: AirfRANS 公开数据集
- 训练/测试划分: 使用
full_train的前 100 例作为训练集,3 例作为快速评估测试集 - 输入字段:
U[0,1]=vx,vy、p、nut、implicit_distance=d、Normals[0,1]=nx,ny - 子采样: 每例流体域子采样 16000 个点,翼型表面保留完整拓扑
目录结构
GeoMPNN/
├── config/ # 配置文件(config.yaml、manifest、评估结果等)
├── model/ # 模型包(源码位于 AIRS 库中)
├── scripts/ # 训练、评估及权重下载脚本
│ └── download_weights.py # 权重下载脚本
├── weight/ # 预训练权重目录(需从 ModelScope 下载)
├── README.md
配置说明
主要超参数(详见 config/config.yaml):
| 参数 | 值 |
|---|---|
| 隐藏层维度 | 64 |
| 表面层数 | 4 |
| S2V 层数 | 4 |
| 径向基基函数数 | 8 |
| 学习率 | 1 × 10⁻³ |
| 训练轮数 | 60 |
| 优化器 | Adam |
| 学习率调度器 | OneCycle(前 30% 预热) |
| 每例子采样点数 | 16000 |
| S2V 邻居数 | 8 |
| 表面半径阈值 | 0.05 |
预训练权重
模型权重已上传至 ModelScope,可通过以下方式下载:
pip install modelscope
python scripts/download_weights.py
下载完成后 weight/ 目录结构如下:
weight/
├── ux_seed0.pt # 流向速度(Ux)模型权重
├── uy_seed0.pt # 垂向速度(Uy)模型权重
├── p_seed0.pt # 压力场模型权重
└── nut_seed0.pt # 涡粘系数(nut)模型权重
ModelScope 仓库:OneScience/GeoMPNN
运行方式
训练
# 逐场训练(ux, uy, p, nut 分别训练)
python scripts/train.py --config config/config.yaml --field ux
python scripts/train.py --config config/config.yaml --field uy
python scripts/train.py --config config/config.yaml --field p
python scripts/train.py --config config/config.yaml --field nut
评估
python scripts/evaluate.py --config config/config.yaml
当前评估使用 3 例快速测试集(subset100_test),计算逐场的相对 L2 误差及升力/阻力系数。评估前请确保已从 ModelScope 下载预训练权重至 weight/ 目录。
结果
归一化 MSE 对比(vs 论文 Figure 4 Surf2Vol 结果)
论文主指标为 LIPS Global Score(0–100),由加权 ML Score、Physics Score 和 OOD Score 组成。论文 Figure 4 展示的是归一化 MSE(z-score 标准化后均值 0、标准差 1)。
| 场 | 论文 Figure 4 MSE(估计) | 本复现最佳 Val MSE | 对比 |
|---|---|---|---|
| ux | ~0.02–0.03 | 0.0196 | 持平 |
| uy | ~0.03–0.05 | 0.0338 | 持平 |
| nut | ~0.15–0.25 | 0.1357 | 持平 |
| p | ~0.01–0.02 | 0.0094 | 持平 |
3 例测试集相对 L2 误差
| 场 | 测试 Rel L2 |
|---|---|
| ux | 0.137 |
| uy | 0.233 |
| nut | 0.338 |
| p | 0.317 |
关键发现
-
训练 MSE 完全落在论文量级内。100 例 × 60 epoch 的模型学习质量与论文 600 epoch 水平相当,各场的验证 MSE 均达到或略优于论文 Figure 4 的估计值。
-
测试 Rel L2 进入有效学习区间。ux(0.14)、uy(0.23)、nut(0.34)、p(0.32)相比早期 12 例测试结果(0.77–0.96)有量级级提升,说明模型已从"未学习"状态进入"有效学习"区间。
-
论文未公布逐场 Rel L2,但从 MSE 水平判断,本复现的模型权重质量与论文一致。
复现与论文的主要差异
| 维度 | 论文 | 本复现 | 对结果影响 |
|---|---|---|---|
| 训练案例数 | 103(竞赛划分) | 100(full_train 前 100 例) | 基本一致 |
| 训练轮数 | 600 | 60 | 少量欠训练,但 MSE 已匹配 |
| 子采样点数 | 32K/例 | 16K/例 | 轻微影响 |
| 随机种子重复 | 8 次取统计 | 1 次(seed=0) | 无统计置信区间 |
| 测试全集 | full_test 200 + reynolds_test 496 | 3 例快速评估 | Rel L2 不可直接对比,仅做参考 |
| 硬件 | 未指定 | DCU ROCm | 无影响 |
结论
复现效果:良好。 训练 MSE 与论文 Figure 4 量级一致,pipeline 完整打通,模型已学会预测四个物理量场的分布。限于推理速度,200 例全量测试未完成,但现有证据表明模型权重质量达到了论文相当水平。
参考源码
GeoMPNN 源码位于 AIRS 库 中。
致谢
本复现基于论文公开描述实现,使用 AirfRANS 公开数据集进行训练与评估。预训练权重托管于 ModelScope。