OpenAlphaDiffract 是面向粉末 X 射线衍射(PXRD)数据的自动晶体学分析模型。本仓库为 昇腾 NPU(Ascend910)适配版本,完成了从 CUDA/PyTorch 到 torch_npu 的迁移,并附带一套自包含的推理服务。模型在 NPU 与 CPU 上输出完全一致,单条 8192 点图谱推理时延约 1.4 ms,单卡即可流畅承载在线分析请求。
模型同时完成三个任务,输入单条 PXRD 图谱,一次前向即可得到全部结果:
| 任务 | 输出 | 类型 |
|---|---|---|
| 晶系识别(Crystal System) | Triclinic → Cubic 共 7 类 | 分类 |
| 空间群识别(Space Group) | 230 个空间群 | 分类 |
| 晶格参数回归(Lattice Parameters) | a, b, c(Å)与 α, β, γ(°) | 回归 |
本次适配与验证使用的具体环境如下:
| 项目 | 配置 |
|---|---|
| 硬件 | 昇腾 Ascend910(npu-smi 25.5.5,单卡 64GB HBM) |
| 操作系统 | Linux aarch64(openEuler 系) |
| Python | 3.11.14 |
| CANN | 8.5.1 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| numpy | 1.26.4 |
| 推理服务 | FastAPI 0.123 + Uvicorn 0.46 |
pip install -r requirements.txt
python inference.py --serve --model /path/to/model_dir --host 0.0.0.0 --port 8100其中 /path/to/model_dir 需包含 config.json、model.safetensors、maxsub.json。服务默认自动选择 npu:0 设备,启动后监听在指定端口。
python inference.py --model /path/to/model_dir --pattern /path/to/pattern.npy--device 可显式指定 npu:0 / cuda:0 / cpu,缺省自动探测。
服务启动后,按以下顺序做最小验证:
# 1. 健康检查
curl -s http://127.0.0.1:8100/health
# 期望: {"status":"ok","device":"npu:0","model":"AlphaDiffract"}
# 2. 模型列表(OpenAI 兼容)
curl -s http://127.0.0.1:8100/v1/models
# 3. 单条预测
curl -s -X POST http://127.0.0.1:8100/v1/predict \
-H 'Content-Type: application/json' \
-d '{"pattern":[0.1,0.2,...], "top_k_sg":3}'实际验证输出(示例图谱,top_k_sg=3):
{
"crystal_system": {"index": 0, "name": "Triclinic", "probability": 0.7073},
"space_group": {"best": {"space_group": 1, "probability": 0.3099}},
"lattice_parameters": [
{"parameter": "a", "value": 6.9728, "unit": "A"},
{"parameter": "b", "value": 8.6647, "unit": "A"},
{"parameter": "c", "value": 11.5285, "unit": "A"},
{"parameter": "alpha", "value": 95.3637, "unit": "deg"},
{"parameter": "beta", "value": 93.7262, "unit": "deg"},
{"parameter": "gamma", "value": 95.6381, "unit": "deg"}
]
}以下数据均在上述 Ascend910 单卡环境实测,batch=1 时延为 100 次平均。
| 指标 | 数值 |
|---|---|
| 单流时延(batch=1) | 1.39 ms |
| batch=4 吞吐 | 2,458 samples/s |
| batch=8 吞吐 | 3,258 samples/s |
| batch=16 吞吐 | 3,864 samples/s |
| batch=32 吞吐 | 4,059 samples/s |
| batch=64 吞吐 | 4,167 samples/s |
| NPU 显存占用(服务态) | 约 3.5 GB / 64 GB |
| 服务并发能力(8 并发) | 约 100 req/s |
时延与吞吐数据说明:模型本身为轻量 1D CNN,计算量小,瓶颈在 H2D 拷贝与框架调度开销;吞吐在 batch=32 后趋于饱和。
采用「CPU 基线 + NPU 结果」逐样本比对的方式评估迁移精度。对 30 条多样化合成图谱(含干净/噪声/锐峰三类),结果如下:
| 指标 | CPU vs NPU |
|---|---|
| 晶系识别一致率 | 30/30(100.0%) |
| 空间群识别一致率 | 30/30(100.0%) |
| 晶格参数最大绝对偏差 | 0.0237 |
| 晶格参数平均绝对偏差 | 0.0064 |
分类任务在 NPU 与 CPU 上完全一致;回归输出的微小差异属于 float32 计算舍入,量级远小于模型本身的预测误差,不影响可用性。
maxsub.json 为 GEMD 空间群子群图(230×230 LUT),推理时必须可用;若缺失,加载逻辑会尝试从权重恢复 gemd_distance_matrix buffer。no_grad 下进行,权重为 float32,未做量化。Smoke 验证 中的三个请求确认输出结构一致。