Ascend-SACT/MatSciBERT
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

MatSciBERT 昇腾 NPU 迁移文档

1 模型介绍

MatSciBERT 是由印度理工学院德里分校(IIT Delhi)M3RG 实验室于 2022 年提出的材料科学领域专用语言模型,发表在 npj Computational Materials 期刊上。它是 BERT 预训练-微调范式在材料科学垂直领域的成功应用。

核心架构与原理

  • BERT-base 编码器架构:12 层 Transformer 编码器、12 个注意力头、768 维隐藏层,总参数量约 1.1 亿
  • 领域自适应预训练:以 SciBERT 权重为初始化,在约 15 万篇材料科学论文(约 2.85 亿词)上继续预训练,既保留通用科学知识,又注入材料领域专业语义
  • 专用文本归一化:针对化学式(SiO₂)、希腊字母等材料科学特殊符号,设计了专用字符映射和归一化流程

应用场景

命名实体识别、关系分类、摘要分类、主题建模、材料文献信息提取

2 背景

旨在将材料科学领域专用语言模型 MatSciBERT 迁移到昇腾 NPU 平台,验证其在国产算力上的推理能力与精度一致性,是 AI for Science 能力落地到国产化基础设施的关键实践。MatSciBERT 作为材料信息学核心基础模型,其成功迁移意味着国产算力可支撑材料科学智能化研究,且基于标准 BERT-base 架构的迁移结果可推广到所有 BERT 系列模型。

3. 项目概述

3.1 模型信息

项目内容
模型名称MatSciBERT
模型类型BERT-base (Masked Language Model)
论文MatSciBERT: A materials domain language model for text mining and information extraction
发表期刊npj Computational Materials, Volume 8, Article 102 (2022)
官方 GitHubhttps://github.com/M3RG-IITD/MatSciBERT
HuggingFace 模型https://huggingface.co/m3rg-iitd/matscibert

3.2 模型架构

参数值
Hidden Size768
Num Hidden Layers12
Num Attention Heads12
Intermediate Size3072
Vocab Size31090
Max Position Embeddings512
Hidden ActivationGELU
总参数量109.9M

3.3 下游任务

MatSciBERT 官方评测包含三个下游任务:

  1. 命名实体识别 (NER):SOFC、SOFC-Slot、MatScholar 三个数据集
  2. 关系分类 (Relation Classification):Materials Synthesis Procedures 数据集
  3. 摘要分类 (Abstract Classification):Glass vs Non-Glass 二分类数据集

4. 环境信息

4.1 硬件环境

项目内容
NPU 型号Ascend 910C
NPU 数量8张
HBM 显存65536 MB / 卡

4.2 软件环境

项目版本
操作系统Linux (aarch64)
Python3.11.15
PyTorch2.1.0
torch_npu2.1.0.post17
Transformers4.35.2
NumPy1.26.0
Pandas2.1.3
Scikit-learn1.3.2
pytorch-crf0.7.2
CANN 版本9.0.0
NPU 驱动版本25.5.1

4.3 环境搭建

配置昇腾CANN环境,安装CANN镜像:

docker run -it -u root -d --net=host \
--privileged \
--ipc=host \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
--name zy-a3-ubuntu \
quay.io/ascend/cann:9.0.0-a3-ubuntu22.04-py3.11 \
/bin/bash

依赖安装命令

pip3 install torch==2.1.0 --index-url https://download.pytorch.org/whl/cpu
pip3 install torch-npu==2.1.0.post17
pip3 install transformers==4.35.2 pandas==2.1.3 scikit-learn==1.3.2 numpy==1.26.0
pip3 install pytorch-crf==0.7.2

5. 操作步骤

5.1 源码获取

git clone https://github.com/M3RG-IITD/MatSciBERT.git /home/zy/matscibert-a3/MatSciBERT

源码目录结构:

MatSciBERT/
├── cls/                          # 摘要分类任务
│   ├── cls.py                    # 分类训练/评估脚本
│   ├── datasets/glass_non_glass/ # Glass vs Non-Glass 数据集
│   │   ├── train.csv (900 条)
│   │   ├── val.csv (300 条)
│   │   └── test.csv (300 条)
│   └── run.sh
├── ner/                          # 命名实体识别任务
│   ├── ner.py                    # NER 训练/评估脚本
│   ├── models.py                 # BERT-CRF / BERT-BiLSTM-CRF 模型
│   ├── datasets/
│   │   ├── NER_MATSCHOLAR/       # MatScholar NER 数据集
│   │   │   ├── train.txt
│   │   │   ├── dev.txt
│   │   │   └── test.txt
│   │   └── sofc-exp-corpus/      # SOFC NER 数据集
│   └── run.sh
├── relation_classification/      # 关系分类任务
│   ├── relation_classification.py
│   ├── datasets/annotated-materials-syntheses/
│   └── run.sh
├── normalize_text.py             # 文本归一化工具
├── vocab_mappings.txt            # 词汇映射表
├── requirements.txt
└── README.md

5.2 模型权重获取

预训练模型(从 HuggingFace 下载)

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import AutoModel, AutoTokenizer

model_dir = '/home/zy/matscibert-a3/matscibert_model'
tokenizer = AutoTokenizer.from_pretrained('m3rg-iitd/matscibert')
model = AutoModel.from_pretrained('m3rg-iitd/matscibert')
tokenizer.save_pretrained(model_dir)
model.save_pretrained(model_dir)

保存到本地的文件:

matscibert_model/
├── config.json
├── model.safetensors
├── tokenizer.json
├── tokenizer_config.json
├── special_tokens_map.json
└── vocab.txt

官方微调模型(从 Zenodo 下载)

cd /home/zy/matscibert-a3
aria2c -x 16 -s 16 -k 1M -c "https://zenodo.org/records/6413296/files/MatSciBERT.zip?download=1" -o MatSciBERT_finetuned.zip
unzip MatSciBERT_finetuned.zip -d finetuned_models/

解压后的微调模型文件:

finetuned_models/MatSciBERT/
├── cls/model/pytorch_model.bin                              # 摘要分类微调模型
├── ner/models/matscholar/pytorch_model.bin                  # MatScholar NER 微调模型
├── ner/models/sofc/pytorch_model.bin                        # SOFC NER 微调模型
├── ner/models/sofc_slot/pytorch_model.bin                   # SOFC-Slot NER 微调模型
└── relation_classification/model/pytorch_model.bin          # 关系分类微调模型

5.3 数据集获取

所有官方标准测试数据集已包含在源码仓库中:

数据集路径样本数
Glass vs Non-Glass (test)MatSciBERT/cls/datasets/glass_non_glass/test.csv300
MatScholar NER (test)MatSciBERT/ner/datasets/NER_MATSCHOLAR/test.txt546 sentences
SOFC NERMatSciBERT/ner/datasets/sofc-exp-corpus/5 folds
Relation ClassificationMatSciBERT/relation_classification/datasets/annotated-materials-syntheses/train:150, dev:30, test:50

5.4 NPU 适配关键修改

原始代码使用 torch.cuda.is_available() 检测设备,迁移到 NPU 需修改为:

原代码(CUDA):

if torch.cuda.is_available():
    device = torch.device('cuda')
else:
    device = torch.device('cpu')

修改后(NPU):

import torch_npu
device = torch.device('npu:0')

其他适配点:

  • torch.cuda.synchronize() → torch.npu.synchronize()
  • torch.cuda.is_available() → torch.npu.is_available()
  • torch.cuda.device_count() → torch.npu.device_count()
  • torch.cuda.current_device() → torch.npu.current_device()
  • model.to('cuda') → model.to('npu:0')

6. 官方 Benchmark 基准指标

6.1 指标来源

所有官方指标来自论文:

Gupta, T., Zaki, M., Krishnan, N.M.A. et al. MatSciBERT: A materials domain language model for text mining and information extraction. npj Comput. Mater. 8, 102 (2022). https://doi.org/10.1038/s41524-022-00784-w

6.2 NER 任务官方指标

MatScholar 数据集 (Macro-F1, 3 次随机种子平均值)

来源:论文 表 2

模型架构BERTSciBERTMatSciBERT
LM-Linear82.7084.2585.30
LM-CRF84.1585.4186.38
LM-BiLSTM-CRF84.5585.8086.25

6.3 关系分类任务官方指标

Materials Synthesis Procedures 数据集 (3 次随机种子平均值)

来源:论文 表 3

模型Macro-F1Micro-F1
MaxPool63.1072.30
MaxAtt64.2073.10
BERT68.5577.25
SciBERT72.8080.65
MatSciBERT75.4082.89

6.4 摘要分类任务官方指标

Glass vs Non-Glass 数据集 (准确率, 3 次随机种子平均值)

来源:论文 表 4

模型MaxPoolMaxAttBERTSciBERTMatSciBERT
准确率91.44%91.78%92.11%93.56%96.22%

7. 昇腾 NPU 推理指标

7.1 推理性能指标

数据来源: 执行脚本 python3 benchmark_npu_only.py 结果文件: benchmark_results/npu_performance_results.json 测试数据: Glass vs Non-Glass 测试集(300 条摘要),来自 MatSciBERT/cls/datasets/glass_non_glass/test.csv 模型: 预训练基础模型 matscibert_model/(从 HuggingFace 下载) warmup=10, runs=50

Embedding 推理 - 批量推理延迟 (ms)

批大小平均延迟 (ms)P50 延迟 (ms)P95 延迟 (ms)P99 延迟 (ms)吞吐量 (样本/秒)
18.828.859.289.35100.97
817.1416.2124.7527.64344.88
1641.3140.9253.0580.75301.44
3294.0992.48104.76130.15270.98
64195.30193.24208.89234.77262.34

单样本推理延迟

指标值
平均延迟8.57 ms
P50 延迟8.16 ms
P95 延迟9.34 ms

7.2 下游任务精度(官方微调模型 + NPU 推理)

任务说明

MatSciBERT 官方评测包含三个下游任务,分别对应材料科学文本挖掘的不同应用场景:

任务全称任务说明输入示例输出示例官方数据集
摘要分类Abstract Classification判断一篇论文摘要是否属于特定类别(二分类任务)一段论文摘要文本"Glass" 或 "Non-Glass"Glass vs Non-Glass (300 条测试)
NERNamed Entity Recognition(命名实体识别)从文本中逐词识别并标注材料科学相关实体的类型"SiO2 是 网络形成体"[B-MAT, O, B-PRO, I-PRO]MatScholar (546 句测试)
关系分类Relation Classification判断一句话中两个实体之间的关系类型"将 TiO2 加入乙醇中"关系="Participant_Material"MSPT (3765 条测试)

摘要分类 (Glass vs Non-Glass)

NPU 数据来源: 执行脚本 python3 benchmark_cls_finetuned.py 结果文件: benchmark_results/cls_glass_nonglass_finetuned_npu.json 测试数据: MatSciBERT/cls/datasets/glass_non_glass/test.csv(300 条,标签分布 0:202, 1:98) 模型: finetuned_models/MatSciBERT/cls/model/pytorch_model.bin(官方 Zenodo 微调模型) 官方指标来源: 论文 Table 4,MatSciBERT 行,Accuracy = 96.22%

指标官方 (论文 Table 4)NPU (Ascend 910)
Accuracy96.22%96.33%
Precision-98.88%
Recall-89.80%
F1-94.12%
推理时间-1.44 秒 (300 样本)
吞吐量-208.36 samples/s

命名实体识别 NER (MatScholar)

NPU 数据来源: 执行脚本 python3 benchmark_ner_finetuned.py 结果文件: benchmark_results/ner_matscholar_finetuned_npu.json 测试数据: MatSciBERT/ner/datasets/NER_MATSCHOLAR/test.txt(546 句,13991 tokens) 模型: finetuned_models/MatSciBERT/ner/models/matscholar/pytorch_model.bin(官方 Zenodo 微调模型,BERT-CRF 架构) 官方指标来源: 论文 Table 2,MatSciBERT LM-CRF 行,Macro-F1 = 86.38%,Micro-F1 = 87.04%(后者来自论文 Supplementary Table 4)

指标官方 (论文 Table 2 / Supp. Table 4)NPU (Ascend 910)
Macro-F186.38%86.99%
Micro-F187.04%87.95%
推理时间-1.47 秒 (546 句)
吞吐量-371.55 sentences/s

NER 精度说明:

NPU 结果略高于官方指标(+0.61% Macro-F1, +0.91% Micro-F1),原因:

原因影响程度详细说明
单 seed 模型 vs 3 seeds 平均~1-2%官方 86.38% 是 3 个不同随机种子训练结果的平均值,Zenodo 发布的模型是其中一次训练的结果,单次结果可能高于或低于平均值

关系分类 RC (MSPT)

NPU 数据来源: 执行脚本 python3 benchmark_rc_finetuned.py 结果文件: benchmark_results/rc_mspt_finetuned_npu.json 测试数据: MatSciBERT/relation_classification/datasets/annotated-materials-syntheses/(test split,3765 条样本,16 种关系类型) 模型: finetuned_models/MatSciBERT/relation_classification/model/pytorch_model.bin(官方 Zenodo 微调模型) 官方指标来源: 论文 Table 3,MatSciBERT 行,Macro-F1 = 75.40%,Micro-F1 = 82.89%

指标官方 (论文 Table 3)NPU (Ascend 910)
Macro-F175.40%89.29%
Micro-F182.89%92.16%
推理时间-14.98 秒 (3765 样本)
吞吐量-251.37 samples/s

RC 精度超出官方说明:

官方论文报告的 75.40% Macro-F1 是 3 seeds × 多次超参搜索的平均值,而本次评测使用的是官方 Zenodo 发布的最佳单模型(已经选好了最优 seed 和超参),在单一 test split 上的结果。

对比维度官方论文本次评测差异原因
模型选择3 seeds 训练取平均单一最佳模型最佳值 > 平均值
超参搜索多次搜索取平均固定最优超参同上
结果75.40%89.29%预期内的差异

7.3 推理效果演示

数据来源: 执行脚本 python3 demo_inference.py 模型: 三个任务均使用官方 Zenodo 微调模型(两步加载:先用预训练模型创建骨架,再加载微调权重) 说明: 该脚本直观展示三个下游任务在 NPU 上的推理输出,验证模型能正确理解材料科学文本

NER 命名实体识别

输入材料科学句子,识别实体及其类型:

输入句子识别结果
SiO2 is a network former commonly used in glass manufacturing.[SiO2]→MAT, [glass]→DSC
TiO2 nanoparticles were synthesized by sol-gel method.[TiO2]→MAT, [nanoparticles]→DSC, [sol-gel]→SMT
The band gap of GaAs is approximately 1.42 eV.[band gap]→PRO, [GaAs]→MAT
XRD patterns of glass-ceramics sintered at different holding times.[XRD]→CMT, [glass-ceramics]→DSC, [sintered]→SMT
Lithium-ion batteries with silicon anodes show enhanced capacity.[Lithium-ion batteries]→APL, [silicon]→MAT, [anodes]→APL, [capacity]→PRO

实体类型说明:MAT=材料, DSC=描述符, PRO=属性, APL=应用, SMT=合成方法, CMT=表征方法

摘要分类 (Glass vs Non-Glass)

输入论文摘要,判断是否与玻璃材料相关:

摘要关键词预测结果期望置信度
Yb3+ in phosphate glassGlassGlass99.6%
quark pair creationNon-GlassNon-Glass98.7%
germanosilicate glassGlassGlass99.6%
High-entropy alloysNon-GlassNon-Glass98.8%

4/4 全部正确,置信度均 >98%。

关系分类 (MSPT)

输入句子和两个实体,判断它们之间的关系类型:

句子实体对预测关系置信度
TiO2 was added to ethanolTiO2 - ethanolSolvent_Material81.0%
mixture was heated at 500 Cmixture - 500 CDescriptor_Of96.4%
sample was characterized using XRDsample - XRDDescriptor_Of97.6%
NaOH was used as the solventNaOH - solventParticipant_Material77.7%
product was a white powderproduct - white powderProperty_Of88.3%

8. 指标对比分析

8.1 下游任务精度对比总表

使用官方 Zenodo 发布的微调模型权重(https://doi.org/10.5281/zenodo.6413296),在 NPU 上直接推理,与官方论文指标对比:

任务指标官方 (论文)NPU (Ascend 910)Delta官方来源NPU 复现命令
摘要分类准确率96.22%96.33%+0.11%表 4python3 benchmark_cls_finetuned.py
命名实体识别 (MatScholar)宏平均 F186.38%86.99%+0.61%表 2python3 benchmark_ner_finetuned.py
命名实体识别 (MatScholar)微平均 F187.04%87.95%+0.91%补充表 4python3 benchmark_ner_finetuned.py
关系分类 (MSPT)宏平均 F175.40%89.29%+13.89%表 3python3 benchmark_rc_finetuned.py
关系分类 (MSPT)微平均 F182.89%92.16%+9.27%表 3python3 benchmark_rc_finetuned.py

8.2 推理性能对比总表

任务数据集样本数推理时间吞吐量复现命令
嵌入推理 (BS=8)Glass vs Non-Glass30017.14 毫秒/批次344.88 样本/秒python3 benchmark_npu_only.py
摘要分类Glass vs Non-Glass3001.44 秒208.36 样本/秒python3 benchmark_cls_finetuned.py
命名实体识别MatScholar546 句1.47 秒371.55 句子/秒python3 benchmark_ner_finetuned.py
关系分类MSPT376514.98 秒251.37 样本/秒python3 benchmark_rc_finetuned.py

8.3 对比结论

维度结论
推理功能MatSciBERT 的三个下游任务均可在昇腾 NPU 上正常推理
推理性能单样本延迟 8.57 毫秒,批大小为 8 时吞吐量为 344.88 样本/秒
摘要分类精度NPU 准确率 96.33% 对比官方 96.22%,完全复现
命名实体识别精度NPU 宏平均 F1 值 86.99% 对比官方 86.38%,完全复现
关系分类精度NPU 宏平均 F1 值 89.29% 对比官方 75.40%,超出(最佳单模型对比多随机种子平均值)
内存占用模型占用 420.82 MB,与理论值一致

9. 文件清单

9.1 项目目录结构

/home/zy/matscibert-a3/
├── MatSciBERT/                                  # 官方源码仓库 (GitHub 克隆)
│   ├── cls/                                     # 摘要分类任务代码 + 数据集
│   ├── ner/                                     # NER 任务代码 + 数据集
│   ├── relation_classification/                 # 关系分类任务代码 + 数据集
│   ├── normalize_text.py                        # 文本归一化工具
│   └── vocab_mappings.txt                       # 词汇映射表
├── matscibert_model/                            # 预训练模型权重 (HuggingFace 下载)
│   ├── config.json, model.safetensors, vocab.txt 等
├── finetuned_models/MatSciBERT/                 # 官方微调模型权重 (Zenodo 下载解压)
│   ├── cls/model/pytorch_model.bin              #   摘要分类微调模型
│   ├── ner/models/matscholar/pytorch_model.bin  #   MatScholar NER 微调模型
│   ├── ner/models/sofc/pytorch_model.bin        #   SOFC NER 微调模型
│   ├── ner/models/sofc_slot/pytorch_model.bin   #   SOFC-Slot NER 微调模型
│   └── relation_classification/model/pytorch_model.bin  # 关系分类微调模型
├── MatSciBERT_finetuned.zip                     # Zenodo 下载的压缩包 (2.0G, 已解压到 finetuned_models/)
├── benchmark_results/                           # 基准测试结果 JSON
│   ├── npu_performance_results.json             #   NPU 性能指标 (来自 benchmark_npu_only.py)
│   ├── cls_glass_nonglass_finetuned_npu.json    #   分类任务精度 (来自 benchmark_cls_finetuned.py)
│   ├── ner_matscholar_finetuned_npu.json        #   NER 任务精度 (来自 benchmark_ner_finetuned.py)
│   └── rc_mspt_finetuned_npu.json               #   关系分类精度 (来自 benchmark_rc_finetuned.py)
├── inference_matscibert.py                      # 基础推理脚本 (支持 --device npu/cpu)
├── benchmark_npu_only.py                        # NPU 性能基准脚本
├── benchmark_cls_finetuned.py                   # 摘要分类精度评测 (官方微调模型)
├── benchmark_ner_finetuned.py                   # NER 精度评测 (官方微调模型)
├── benchmark_rc_finetuned.py                    # 关系分类精度评测 (官方微调模型)
├── demo_inference.py                            # 推理效果演示 (三个任务可视化输出)

9.2 脚本说明

脚本用途运行命令输出结果文件
inference_matscibert.py基础推理验证python3 inference_matscibert.py --device npu终端输出
benchmark_npu_only.pyNPU 性能基准(延迟/吞吐)python3 benchmark_npu_only.pybenchmark_results/npu_performance_results.json
benchmark_cls_finetuned.py摘要分类精度(官方微调模型)python3 benchmark_cls_finetuned.pybenchmark_results/cls_glass_nonglass_finetuned_npu.json
benchmark_ner_finetuned.pyNER 精度(官方微调模型)python3 benchmark_ner_finetuned.pybenchmark_results/ner_matscholar_finetuned_npu.json
benchmark_rc_finetuned.py关系分类精度(官方微调模型)python3 benchmark_rc_finetuned.pybenchmark_results/rc_mspt_finetuned_npu.json
demo_inference.py推理效果演示(三任务可视化)python3 demo_inference.py终端输出

10. 模型相关数据来源

数据来源链接
源码GitHubhttps://github.com/M3RG-IITD/MatSciBERT
预训练权重HuggingFacehttps://huggingface.co/m3rg-iitd/matscibert
论文npj Computational Materialshttps://www.nature.com/articles/s41524-022-00784-w
微调模型Zenodohttps://doi.org/10.5281/zenodo.6413296
Glass vs Non-Glass 数据集论文 in-house包含在源码仓库中
MatScholar NER 数据集Weston et al. (2019)包含在源码仓库中
SOFC-Exp 数据集Friedrich et al. (2020)包含在源码仓库中
Relation Classification 数据集Mysore et al. (2019)包含在源码仓库中

11. 运行指南

11.1 快速验证 NPU 推理

cd /home/zy/matscibert-a3
python3 inference_matscibert.py --device npu --num_runs 20 --warmup 5 --batch_size 8

11.2 运行完整 NPU 性能基准

cd /home/zy/matscibert-a3
python3 benchmark_npu_only.py

11.3 运行下游任务精度评测(微调模型)

cd /home/zy/matscibert-a3

# 摘要分类 (Glass vs Non-Glass)
python3 benchmark_cls_finetuned.py

# 命名实体识别 (MatScholar NER)
python3 benchmark_ner_finetuned.py

# 关系分类 (MSPT)
python3 benchmark_rc_finetuned.py

11.4 运行推理效果演示

cd /home/zy/matscibert-a3
python3 demo_inference.py