MatSciBERT 是由印度理工学院德里分校(IIT Delhi)M3RG 实验室于 2022 年提出的材料科学领域专用语言模型,发表在 npj Computational Materials 期刊上。它是 BERT 预训练-微调范式在材料科学垂直领域的成功应用。
命名实体识别、关系分类、摘要分类、主题建模、材料文献信息提取
旨在将材料科学领域专用语言模型 MatSciBERT 迁移到昇腾 NPU 平台,验证其在国产算力上的推理能力与精度一致性,是 AI for Science 能力落地到国产化基础设施的关键实践。MatSciBERT 作为材料信息学核心基础模型,其成功迁移意味着国产算力可支撑材料科学智能化研究,且基于标准 BERT-base 架构的迁移结果可推广到所有 BERT 系列模型。
| 项目 | 内容 |
|---|---|
| 模型名称 | 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) |
| 官方 GitHub | https://github.com/M3RG-IITD/MatSciBERT |
| HuggingFace 模型 | https://huggingface.co/m3rg-iitd/matscibert |
| 参数 | 值 |
|---|---|
| Hidden Size | 768 |
| Num Hidden Layers | 12 |
| Num Attention Heads | 12 |
| Intermediate Size | 3072 |
| Vocab Size | 31090 |
| Max Position Embeddings | 512 |
| Hidden Activation | GELU |
| 总参数量 | 109.9M |
MatSciBERT 官方评测包含三个下游任务:
| 项目 | 内容 |
|---|---|
| NPU 型号 | Ascend 910C |
| NPU 数量 | 8张 |
| HBM 显存 | 65536 MB / 卡 |
| 项目 | 版本 |
|---|---|
| 操作系统 | Linux (aarch64) |
| Python | 3.11.15 |
| PyTorch | 2.1.0 |
| torch_npu | 2.1.0.post17 |
| Transformers | 4.35.2 |
| NumPy | 1.26.0 |
| Pandas | 2.1.3 |
| Scikit-learn | 1.3.2 |
| pytorch-crf | 0.7.2 |
| CANN 版本 | 9.0.0 |
| NPU 驱动版本 | 25.5.1 |
配置昇腾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.2git 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.mdimport 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.txtcd /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 # 关系分类微调模型所有官方标准测试数据集已包含在源码仓库中:
| 数据集 | 路径 | 样本数 |
|---|---|---|
| Glass vs Non-Glass (test) | MatSciBERT/cls/datasets/glass_non_glass/test.csv | 300 |
| MatScholar NER (test) | MatSciBERT/ner/datasets/NER_MATSCHOLAR/test.txt | 546 sentences |
| SOFC NER | MatSciBERT/ner/datasets/sofc-exp-corpus/ | 5 folds |
| Relation Classification | MatSciBERT/relation_classification/datasets/annotated-materials-syntheses/ | train:150, dev:30, test:50 |
原始代码使用 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')所有官方指标来自论文:
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
MatScholar 数据集 (Macro-F1, 3 次随机种子平均值)
来源:论文 表 2
| 模型架构 | BERT | SciBERT | MatSciBERT |
|---|---|---|---|
| LM-Linear | 82.70 | 84.25 | 85.30 |
| LM-CRF | 84.15 | 85.41 | 86.38 |
| LM-BiLSTM-CRF | 84.55 | 85.80 | 86.25 |
Materials Synthesis Procedures 数据集 (3 次随机种子平均值)
来源:论文 表 3
| 模型 | Macro-F1 | Micro-F1 |
|---|---|---|
| MaxPool | 63.10 | 72.30 |
| MaxAtt | 64.20 | 73.10 |
| BERT | 68.55 | 77.25 |
| SciBERT | 72.80 | 80.65 |
| MatSciBERT | 75.40 | 82.89 |
Glass vs Non-Glass 数据集 (准确率, 3 次随机种子平均值)
来源:论文 表 4
| 模型 | MaxPool | MaxAtt | BERT | SciBERT | MatSciBERT |
|---|---|---|---|---|---|
| 准确率 | 91.44% | 91.78% | 92.11% | 93.56% | 96.22% |
数据来源: 执行脚本
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
| 批大小 | 平均延迟 (ms) | P50 延迟 (ms) | P95 延迟 (ms) | P99 延迟 (ms) | 吞吐量 (样本/秒) |
|---|---|---|---|---|---|
| 1 | 8.82 | 8.85 | 9.28 | 9.35 | 100.97 |
| 8 | 17.14 | 16.21 | 24.75 | 27.64 | 344.88 |
| 16 | 41.31 | 40.92 | 53.05 | 80.75 | 301.44 |
| 32 | 94.09 | 92.48 | 104.76 | 130.15 | 270.98 |
| 64 | 195.30 | 193.24 | 208.89 | 234.77 | 262.34 |
| 指标 | 值 |
|---|---|
| 平均延迟 | 8.57 ms |
| P50 延迟 | 8.16 ms |
| P95 延迟 | 9.34 ms |
MatSciBERT 官方评测包含三个下游任务,分别对应材料科学文本挖掘的不同应用场景:
| 任务 | 全称 | 任务说明 | 输入示例 | 输出示例 | 官方数据集 |
|---|---|---|---|---|---|
| 摘要分类 | Abstract Classification | 判断一篇论文摘要是否属于特定类别(二分类任务) | 一段论文摘要文本 | "Glass" 或 "Non-Glass" | Glass vs Non-Glass (300 条测试) |
| NER | Named Entity Recognition(命名实体识别) | 从文本中逐词识别并标注材料科学相关实体的类型 | "SiO2 是 网络形成体" | [B-MAT, O, B-PRO, I-PRO] | MatScholar (546 句测试) |
| 关系分类 | Relation Classification | 判断一句话中两个实体之间的关系类型 | "将 TiO2 加入乙醇中" | 关系="Participant_Material" | MSPT (3765 条测试) |
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) |
|---|---|---|
| Accuracy | 96.22% | 96.33% |
| Precision | - | 98.88% |
| Recall | - | 89.80% |
| F1 | - | 94.12% |
| 推理时间 | - | 1.44 秒 (300 样本) |
| 吞吐量 | - | 208.36 samples/s |
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-F1 | 86.38% | 86.99% |
| Micro-F1 | 87.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 发布的模型是其中一次训练的结果,单次结果可能高于或低于平均值
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-F1 | 75.40% | 89.29% |
| Micro-F1 | 82.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% 预期内的差异
数据来源: 执行脚本
python3 demo_inference.py模型: 三个任务均使用官方 Zenodo 微调模型(两步加载:先用预训练模型创建骨架,再加载微调权重) 说明: 该脚本直观展示三个下游任务在 NPU 上的推理输出,验证模型能正确理解材料科学文本
输入材料科学句子,识别实体及其类型:
| 输入句子 | 识别结果 |
|---|---|
| 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=表征方法
输入论文摘要,判断是否与玻璃材料相关:
| 摘要关键词 | 预测结果 | 期望 | 置信度 |
|---|---|---|---|
| Yb3+ in phosphate glass | Glass | Glass | 99.6% |
| quark pair creation | Non-Glass | Non-Glass | 98.7% |
| germanosilicate glass | Glass | Glass | 99.6% |
| High-entropy alloys | Non-Glass | Non-Glass | 98.8% |
4/4 全部正确,置信度均 >98%。
输入句子和两个实体,判断它们之间的关系类型:
| 句子 | 实体对 | 预测关系 | 置信度 |
|---|---|---|---|
| TiO2 was added to ethanol | TiO2 - ethanol | Solvent_Material | 81.0% |
| mixture was heated at 500 C | mixture - 500 C | Descriptor_Of | 96.4% |
| sample was characterized using XRD | sample - XRD | Descriptor_Of | 97.6% |
| NaOH was used as the solvent | NaOH - solvent | Participant_Material | 77.7% |
| product was a white powder | product - white powder | Property_Of | 88.3% |
使用官方 Zenodo 发布的微调模型权重(https://doi.org/10.5281/zenodo.6413296),在 NPU 上直接推理,与官方论文指标对比:
| 任务 | 指标 | 官方 (论文) | NPU (Ascend 910) | Delta | 官方来源 | NPU 复现命令 |
|---|---|---|---|---|---|---|
| 摘要分类 | 准确率 | 96.22% | 96.33% | +0.11% | 表 4 | python3 benchmark_cls_finetuned.py |
| 命名实体识别 (MatScholar) | 宏平均 F1 | 86.38% | 86.99% | +0.61% | 表 2 | python3 benchmark_ner_finetuned.py |
| 命名实体识别 (MatScholar) | 微平均 F1 | 87.04% | 87.95% | +0.91% | 补充表 4 | python3 benchmark_ner_finetuned.py |
| 关系分类 (MSPT) | 宏平均 F1 | 75.40% | 89.29% | +13.89% | 表 3 | python3 benchmark_rc_finetuned.py |
| 关系分类 (MSPT) | 微平均 F1 | 82.89% | 92.16% | +9.27% | 表 3 | python3 benchmark_rc_finetuned.py |
| 任务 | 数据集 | 样本数 | 推理时间 | 吞吐量 | 复现命令 |
|---|---|---|---|---|---|
| 嵌入推理 (BS=8) | Glass vs Non-Glass | 300 | 17.14 毫秒/批次 | 344.88 样本/秒 | python3 benchmark_npu_only.py |
| 摘要分类 | Glass vs Non-Glass | 300 | 1.44 秒 | 208.36 样本/秒 | python3 benchmark_cls_finetuned.py |
| 命名实体识别 | MatScholar | 546 句 | 1.47 秒 | 371.55 句子/秒 | python3 benchmark_ner_finetuned.py |
| 关系分类 | MSPT | 3765 | 14.98 秒 | 251.37 样本/秒 | python3 benchmark_rc_finetuned.py |
| 维度 | 结论 |
|---|---|
| 推理功能 | 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,与理论值一致 |
/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 # 推理效果演示 (三个任务可视化输出)| 脚本 | 用途 | 运行命令 | 输出结果文件 |
|---|---|---|---|
inference_matscibert.py | 基础推理验证 | python3 inference_matscibert.py --device npu | 终端输出 |
benchmark_npu_only.py | NPU 性能基准(延迟/吞吐) | python3 benchmark_npu_only.py | benchmark_results/npu_performance_results.json |
benchmark_cls_finetuned.py | 摘要分类精度(官方微调模型) | python3 benchmark_cls_finetuned.py | benchmark_results/cls_glass_nonglass_finetuned_npu.json |
benchmark_ner_finetuned.py | NER 精度(官方微调模型) | python3 benchmark_ner_finetuned.py | benchmark_results/ner_matscholar_finetuned_npu.json |
benchmark_rc_finetuned.py | 关系分类精度(官方微调模型) | python3 benchmark_rc_finetuned.py | benchmark_results/rc_mspt_finetuned_npu.json |
demo_inference.py | 推理效果演示(三任务可视化) | python3 demo_inference.py | 终端输出 |
| 数据 | 来源 | 链接 |
|---|---|---|
| 源码 | GitHub | https://github.com/M3RG-IITD/MatSciBERT |
| 预训练权重 | HuggingFace | https://huggingface.co/m3rg-iitd/matscibert |
| 论文 | npj Computational Materials | https://www.nature.com/articles/s41524-022-00784-w |
| 微调模型 | Zenodo | https://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) | 包含在源码仓库中 |
cd /home/zy/matscibert-a3
python3 inference_matscibert.py --device npu --num_runs 20 --warmup 5 --batch_size 8cd /home/zy/matscibert-a3
python3 benchmark_npu_only.pycd /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.pycd /home/zy/matscibert-a3
python3 demo_inference.py