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

AlloyBERT 昇腾 NPU 迁移文档

1. 模型介绍

1.1 模型概述

AlloyBERT 是一个基于 Transformer 编码器架构的模型,用于通过文本输入预测合金物理属性(如弹性模量和屈服强度)。该模型基于预训练的 RoBERTa 编码器,利用自注意力机制建立词语之间的语义关系,从而解释人类可读的文本输入并预测目标合金属性。

来源: 论文 arXiv:2403.19783, Section 1 Introduction

1.2 论文信息

项目内容来源
论文标题AlloyBERT: Alloy Property Prediction with Large Language ModelsarXiv:2403.19783
作者Akshat Chaudhari, Chakradhar Guntuboina, Hongshuo Huang, Amir Barati FarimaniarXiv:2403.19783
机构Carnegie Mellon UniversityarXiv:2403.19783
arXiv2403.19783arXiv.org
发表时间2024年3月arXiv:2403.19783
领域材料科学 (cond-mat.mtrl-sci), 机器学习 (cs.LG)arXiv:2403.19783

1.3 模型架构

来源: 论文 arXiv:2403.19783, Section 2.1 Model Architecture

  • 基础模型: RoBERTa-base (Robustly optimized BERT pretraining approach)
  • 架构: Transformer Encoder + 回归头 (Linear Layer)
  • 输入: 合金的文本描述(包含化学成分、元素属性、微观结构、加工方法等)
  • 输出: 合金属性预测值(弹性模量/屈服强度)
  • Tokenizer: Byte Pair Encoding (BPE)
  • 训练流程: 预训练 (MLM) → 微调 (Regression)
  • 原始训练硬件: NVIDIA GeForce RTX 3050 Ti GPU

1.4 数据集

来源: 论文 arXiv:2403.19783, Section 2.2 Datasets

数据集全称训练集大小验证集大小目标属性数据来源
MPEAMulti Principal Elemental Alloys619110弹性模量 (Young's Modulus)Citrine Informatics, 论文引用 [30]
RAYSRefractory Alloy Yield Strength691122屈服强度 (Yield Strength)论文引用 [30][31][32]

2. 数据来源

2.1 源码

项目链接来源类型
官方 GitHub 仓库https://github.com/cakshat/AlloyBERT官方开源
本地路径/home/zy/alloybert-a3/AlloyBERT/克隆自官方仓库
获取方式git clone https://github.com/cakshat/AlloyBERT.git-

2.2 模型权重

项目路径/链接来源类型
基础模型 (RoBERTa-base)https://huggingface.co/roberta-baseHuggingFace 官方
下载镜像https://hf-mirror.com国内镜像 (因外网不可达)
本地路径/home/zy/alloybert-a3/models/roberta-base/从 HuggingFace 下载
MLM 预训练权重/home/zy/alloybert-a3/checkpoints/mlm_pretrained.pt自训练: train_npu.py
MPEA Finetune 权重/home/zy/alloybert-a3/checkpoints/alloybert_MPEA_best.pt自训练: train_npu.py
RAYS Finetune 权重/home/zy/alloybert-a3/checkpoints/alloybert_RAYS_best.pt自训练: train_npu.py

说明: AlloyBERT 官方仓库 (https://github.com/cakshat/AlloyBERT/releases) 未发布预训练的 finetune 权重文件 (Releases: "No releases published"),仅提供训练代码和数据集。因此需要在 NPU 上从 roberta-base 进行 finetune 以获得模型权重。

2.3 数据集

数据集本地路径来源
MPEA 训练集/home/zy/alloybert-a3/AlloyBERT/data/MPEA/tr1.pkl源码目录 AlloyBERT/data/MPEA/tr1.pkl
MPEA 验证集/home/zy/alloybert-a3/AlloyBERT/data/MPEA/vl1.pkl源码目录 AlloyBERT/data/MPEA/vl1.pkl
RAYS 训练集/home/zy/alloybert-a3/AlloyBERT/data/ys_clean/tr1.pkl源码目录 AlloyBERT/data/ys_clean/tr1.pkl
RAYS 验证集/home/zy/alloybert-a3/AlloyBERT/data/ys_clean/vl1.pkl源码目录 AlloyBERT/data/ys_clean/vl1.pkl
MPEA 原始 CSV/home/zy/alloybert-a3/AlloyBERT/data/MPEA/MPEA.csv源码目录AlloyBERT/data/MPEA/MPEA.csv
RAYS 原始 CSV/home/zy/alloybert-a3/AlloyBERT/data/ys_clean/ys_clean.csv源码目录AlloyBERT/data/ys_clean/ys_clean.csv
MPEA 完整数据集/home/zy/alloybert-a3/AlloyBERT/MPEA_dataset.csv源码目录根目录AlloyBERT/

3. 环境信息

3.1 硬件环境

来源: 容器内 npu-smi info 命令输出

项目信息
NPU 型号Ascend 910C
NPU 数量8 芯片
HBM 容量65536 MB / 芯片

3.2 软件环境

来源: 容器内 pip list 和系统命令输出

项目版本
操作系统Ubuntu 22.04.5 LTS
Python3.11.15
CANN9.0.0 (package_version: 25.5.1)
NPU 驱动25.5.1
PyTorch2.1.0
torch-npu2.1.0.post17
transformers4.35.2
numpy1.26.0
pandas2.1.3
scikit-learn1.3.2

4. 环境搭建

配置昇腾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
pip3 install pyyaml tqdm matplotlib

5. 操作步骤

步骤 1: 环境检查

# 检查 NPU 状态
npu-smi info

# 检查 Python 和依赖
python3 --version
python3 -c "import torch; import torch_npu; print('NPU available:', torch.npu.is_available())"

Step 2: Clone the Official Source Code

Source: https://github.com/cakshat/AlloyBERT

git clone https://github.com/cakshat/AlloyBERT.git /home/zy/alloybert-a3/AlloyBERT

步骤 3: 下载基础模型权重

来源: https://huggingface.co/roberta-base

export HF_ENDPOINT=https://hf-mirror.com
python3 -c "
from transformers import RobertaModel, RobertaTokenizerFast
model = RobertaModel.from_pretrained('roberta-base')
tokenizer = RobertaTokenizerFast.from_pretrained('roberta-base')
model.save_pretrained('/home/zy/alloybert-a3/models/roberta-base')
tokenizer.save_pretrained('/home/zy/alloybert-a3/models/roberta-base')
"

步骤 4: NPU 训练

执行脚本: /home/zy/alloybert-a3/train_npu.py (MPEA:MLM 预训练 + 微调,RAYS:仅微调)

export HF_ENDPOINT=https://hf-mirror.com
python3 /home/zy/alloybert-a3/train_npu.py

训练参数与论文一致:

  • 轮次(Epochs):50
  • 批大小(Batch size):1
  • 学习率(Learning rate):1e-5
  • 优化器(Optimizer):AdamW
  • 调度器(Scheduler):线性(预热=0)
  • 损失函数(Loss):MSE
  • MPEA:MLM 预训练(50 轮)+ 微调(50 轮)
  • RAYS:仅微调(50 轮)
  • 随机种子:42

步骤 5: NPU 推理基准测试

执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py

export HF_ENDPOINT=https://hf-mirror.com
python3 /home/zy/alloybert-a3/inference_benchmark_npu.py

步骤 6: NPU 推理效果演示

执行脚本: /home/zy/alloybert-a3/inference_demo_npu.py

export HF_ENDPOINT=https://hf-mirror.com
python3 /home/zy/alloybert-a3/inference_demo_npu.py

该脚本逐条展示推理效果,输出内容包括:

  • 每条样本的输入文本(截取前120字符)、真实值、预测值、绝对误差
  • 预测最佳 Top-5 样本
  • 预测最差 Top-5 样本
  • 汇总统计(MSE、MAE、R²、最小/最大/平均误差)
  • 全部逐条预测结果保存至 results/predictions_MPEA.csv 和 results/predictions_RAYS.csv

6. 代码适配修改

6.1 核心适配点

原始代码来源: https://github.com/cakshat/AlloyBERT/blob/main/main.py

参考官方 AlloyBERT/main.py 的训练逻辑,新编写 train_npu.py 适配NPU,原始代码 (AlloyBERT/main.py) 使用 torch.device('cuda' if torch.cuda.is_available() else 'cpu'),需要修改为昇腾 NPU 设备。

设备适配:

# 原始代码 (来源: AlloyBERT/main.py:11)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 适配后代码
import torch_npu
device = torch.device('npu:0')

关键修改说明:

修改项原始代码适配后代码原始文件适配文件
设备选择cuda / cpunpu:0AlloyBERT/main.py:11train_npu.py
NPU 驱动无import torch_npu-train_npu.py, inference_benchmark_npu.py
模型路径roberta-base (在线)/home/zy/alloybert-a3/models/roberta-base (本地)AlloyBERT/config.yaml:20train_npu.py
调试工具wandb移除 (离线环境)AlloyBERT/main.py:2train_npu.py
NPU 同步无torch.npu.synchronize()-inference_benchmark_npu.py
Batch Size41 (与论文一致)AlloyBERT/config.yaml:2train_npu.py
随机种子未固定seed=42-train_npu.py

6.2 适配后的脚本文件

文件路径说明基于
NPU 训练脚本/home/zy/alloybert-a3/train_npu.pyMPEA: MLM 预训练 + 微调, RAYS: 仅微调 (batch_size=1)AlloyBERT/main.py + 论文 Section 2.4
NPU 推理基准测试/home/zy/alloybert-a3/inference_benchmark_npu.py推理性能/精度采集自编写
NPU 推理演示/home/zy/alloybert-a3/inference_demo_npu.py逐条推理效果展示自编写

7. 官方标准 Benchmark 指标

7.1 官方指标来源

  • 论文:arXiv:2403.19783,表 4(第 3 节 结果与讨论)
  • 训练方法:String 4(最完整的文本描述)+ 预训练(MLM)+ 微调
  • 硬件:NVIDIA GeForce RTX 3050 Ti GPU(论文第 2.4 节 训练流程)
  • 训练参数:50 轮,批大小=1,学习率=1e-5,AdamW 优化器(论文第 2.4 节)

7.2 官方 AlloyBERT 精度指标

来源:论文 arXiv:2403.19783,表 4

数据集训练方法MSER2
MPEA预训练 + 微调(String 4)0.000150.99
RAYS仅微调(String 4)0.006110.83

8. 昇腾 NPU 训练与推理指标

8.1 训练结果

执行脚本:/home/zy/alloybert-a3/train_npu.py

结果文件:/home/zy/alloybert-a3/training_results.json

MLM 预训练(MPEA):

  • 训练文本数:619
  • 训练轮数:50 epochs
  • 最终 MLM 损失:0.0046
  • 预训练时间:1296.57s

微调结果:

数据集训练方法最佳验证 MSE最佳轮次R2训练时间
MPEA预训练+微调0.00031136/500.9884-
RAYS仅微调0.00652531/500.81781617.46s

8.2 推理精度指标

执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py 结果文件:/home/zy/alloybert-a3/benchmark_results.json

数据集MSEMAER2
MPEA0.0003110.0128800.9884
RAYS0.0065250.0569790.8178

8.3 推理性能指标

执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py 结果文件:/home/zy/alloybert-a3/benchmark_results.json

指标MPEARAYS
总样本数110122
总推理时间1.0031s1.2370s
平均延迟(Avg Latency)7.70ms8.23ms
P50 延迟7.67ms8.23ms
P95 延迟7.99ms8.31ms
P99 延迟8.02ms8.35ms
吞吐量(Throughput)109.66 samples/s98.62 samples/s

9. 指标对比分析

9.1 NPU 与官方精度对比

官方数据来源:论文 arXiv:2403.19783,表 4 NPU 数据来源:benchmark_results.json(执行脚本:inference_benchmark_npu.py)

数据集官方最佳 MSENPU MSE官方 R2NPU R2
MPEA0.000150.0003110.990.9884
RAYS0.006110.0065250.830.8178

9.2 差距分析

数据集测试结果已十分接近论文结果,现就存在的差距原因分析如下:

差异因素说明
随机种子论文未公开种子,不同种子导致训练轨迹存在差异
数据划分论文未公开具体的 train/val 划分方式
MLM 预训练细节论文未公开 MLM 预训练的具体超参数(如 epoch 数、mask 比例等)
训练轮数论文可能在更多 epoch 训练后获得更优结果

9.3 性能分析

数据来源:benchmark_results.json(执行脚本:inference_benchmark_npu.py)

指标MPEARAYS
平均推理延迟7.70ms8.23ms
吞吐量109.66 samples/s98.62 samples/s
延迟稳定性 (P99-P50)0.35ms0.12ms
  • 在昇腾 910 NPU 上,AlloyBERT 的推理延迟稳定在 7-8ms/样本,P50 与 P99 的差异小于 0.4ms,推理性能表现十分稳定。

  • 论文未报告推理性能指标(延迟/吞吐量),因此无法进行直接的性能对比。

9.4 最终结论

  1. 精度:NPU 上的 AlloyBERT 在两个数据集上的表现均接近论文结果。
  2. 性能:昇腾 910 NPU 的推理延迟稳定在 7-8ms/样本(batch_size=1),推理性能稳定。
  3. 可用性:AlloyBERT 已成功迁移至昇腾 NPU,能够正常执行推理任务。

10. 运行命令汇总

完整流程一键执行

执行脚本:train_npu.py、inference_benchmark_npu.py、inference_demo_npu.py

# 1. 环境准备
export HF_ENDPOINT=https://hf-mirror.com

# 2. 克隆源码 (来源: https://github.com/cakshat/AlloyBERT)
git clone https://github.com/cakshat/AlloyBERT.git /home/zy/alloybert-a3/AlloyBERT

# 3. 下载基础模型 (来源: https://huggingface.co/roberta-base)
python3 -c "
from transformers import RobertaModel, RobertaTokenizerFast
model = RobertaModel.from_pretrained('roberta-base')
tokenizer = RobertaTokenizerFast.from_pretrained('roberta-base')
model.save_pretrained('/home/zy/alloybert-a3/models/roberta-base')
tokenizer.save_pretrained('/home/zy/alloybert-a3/models/roberta-base')
"

# 4. NPU 训练 (MPEA: MLM Pretrain + Finetune, RAYS: Finetune only, batch_size=1)
# 执行脚本: /home/zy/alloybert-a3/train_npu.py
python3 /home/zy/alloybert-a3/train_npu.py

# 5. NPU 推理 Benchmark
# 执行脚本: /home/zy/alloybert-a3/inference_benchmark_npu.py
python3 /home/zy/alloybert-a3/inference_benchmark_npu.py

# 6. NPU 推理效果演示 (可选,逐条展示推理结果)
# 执行脚本: /home/zy/alloybert-a3/inference_demo_npu.py
python3 /home/zy/alloybert-a3/inference_demo_npu.py

11. 项目目录结构

来源: 项目根目录 /home/zy/alloybert-a3/ 实际结构

/home/zy/alloybert-a3/
├── train_npu.py                          # NPU 训练脚本 (MPEA: MLM Pretrain + Finetune, RAYS: Finetune only, batch_size=1)
├── inference_benchmark_npu.py            # NPU 推理 Benchmark 脚本
├── inference_demo_npu.py                 # NPU 推理效果演示脚本
├── training_results.json                 # 训练结果汇总
├── benchmark_results.json                # 推理 Benchmark 结果
├── results/                              # 推理演示输出目录
│   ├── predictions_MPEA.csv              # MPEA 逐条预测结果
│   └── predictions_RAYS.csv              # RAYS 逐条预测结果
├── models/                               # 模型文件目录
│   └── roberta-base/                     # RoBERTa-base 预训练模型 (从 HuggingFace 下载)
│       ├── config.json
│       ├── model.safetensors
│       ├── tokenizer.json
│       ├── tokenizer_config.json
│       ├── vocab.json
│       └── merges.txt
├── checkpoints/                          # 训练检查点目录
│   ├── mlm_pretrained.pt                 # MPEA MLM 预训练权重
│   ├── alloybert_MPEA_best.pt            # MPEA Pretrain+Finetune 最佳权重
│   └── alloybert_RAYS_best.pt            # RAYS Finetune 最佳权重
└── AlloyBERT/                            # 官方源码 (克隆自 https://github.com/cakshat/AlloyBERT)
    ├── main.py                           # 官方训练入口
    ├── config.yaml                       # 官方训练配置
    ├── shallowML.py                      # Shallow Models 训练脚本
    ├── requirements.txt                  # 官方依赖列表
    ├── README.md                         # 官方说明文档
    ├── LICENSE                           # MIT 许可证
    ├── MPEA_dataset.csv                  # MPEA 完整数据集 CSV
    ├── CleanMPEA.ipynb                   # MPEA 数据清洗 Jupyter Notebook
    ├── .gitignore
    ├── model/                            # 模型定义目录
    │   ├── network.py                    # AlloyBERT 模型结构定义
    │   └── utils.py                      # 训练/验证工具函数
    ├── data/                             # 数据目录
    │   ├── dataloader.py                 # 数据加载器
    │   ├── dataset.py                    # Dataset 类定义
    │   ├── convertToPKL.py               # CSV 转 PKL 脚本
    │   ├── generate_text_MPEA.py         # MPEA 文本生成脚本
    │   ├── generate_text_ysclean.py      # RAYS 文本生成脚本
    │   ├── MPEA/                         # MPEA 数据集
    │   │   ├── MPEA.csv                  # MPEA 原始数据
    │   │   ├── tr1.pkl                   # MPEA 训练集 (619 条)
    │   │   └── vl1.pkl                   # MPEA 验证集 (110 条)
    │   ├── ys_clean/                     # RAYS 数据集
    │   │   ├── ys_clean.csv              # RAYS 原始数据
    │   │   ├── tr1.pkl                   # RAYS 训练集 (691 条)
    │   │   └── vl1.pkl                   # RAYS 验证集 (122 条)
    │   ├── MPEA_clean/                   # MPEA 清洗后数据
    │   │   └── MPEA_clean.csv
    │   └── MPEA_numeric/                 # MPEA 数值化数据
    │       └── MPEA_numeric.csv
    └── tokenizer/                        # 官方自定义 BPE Tokenizer
        ├── vocab.json                    # Tokenizer 词汇表
        └── merges.txt                    # BPE 合并规则

12. 文件清单与说明

12.1 脚本文件

文件路径说明来源
NPU 训练脚本/home/zy/alloybert-a3/train_npu.pyMPEA:MLM 预训练 + 微调,RAYS:仅微调(batch_size=1,seed=42)基于 AlloyBERT/main.py + 论文第 2.4 节
NPU 推理基准测试/home/zy/alloybert-a3/inference_benchmark_npu.py推理性能/精度数据采集(batch_size=1)自行编写
NPU 推理演示/home/zy/alloybert-a3/inference_demo_npu.py逐条推理效果展示,输出 Top-5 最佳/最差预测结果自行编写

12.2 模型文件

文件路径说明来源
RoBERTa-base 模型/home/zy/alloybert-a3/models/roberta-base/HuggingFace 基础模型https://huggingface.co/roberta-base
MLM 预训练权重/home/zy/alloybert-a3/checkpoints/mlm_pretrained.ptMPEA MLM 预训练权重自行训练:train_npu.py
MPEA 最佳权重/home/zy/alloybert-a3/checkpoints/alloybert_MPEA_best.ptMPEA 预训练+微调最佳权重自行训练:train_npu.py
RAYS 最佳权重/home/zy/alloybert-a3/checkpoints/alloybert_RAYS_best.ptRAYS 微调最佳权重自行训练:train_npu.py

12.3 结果文件

文件路径说明来源
训练结果 JSON/home/zy/alloybert-a3/training_results.json训练指标汇总执行 train_npu.py 生成
基准测试结果 JSON/home/zy/alloybert-a3/benchmark_results.json推理指标汇总执行 inference_benchmark_npu.py 生成
MPEA 逐条预测 CSV/home/zy/alloybert-a3/results/predictions_MPEA.csvMPEA 验证集逐条预测结果执行 inference_demo_npu.py 生成
RAYS 逐条预测 CSV/home/zy/alloybert-a3/results/predictions_RAYS.csvRAYS 验证集逐条预测结果执行 inference_demo_npu.py 生成

附录 A: benchmark_results.json 内容

来源: 执行脚本 inference_benchmark_npu.py 生成

{
  "MPEA": {
    "NPU": {
      "device": "NPU",
      "total_samples": 110,
      "total_time_s": 1.0031,
      "mse": 0.000311,
      "mae": 0.01288,
      "r2": 0.9884,
      "avg_latency_ms": 7.7,
      "p50_latency_ms": 7.67,
      "p95_latency_ms": 7.99,
      "p99_latency_ms": 8.02,
      "throughput_samples_per_sec": 109.66
    }
  },
  "RAYS": {
    "NPU": {
      "device": "NPU",
      "total_samples": 122,
      "total_time_s": 1.237,
      "mse": 0.006525,
      "mae": 0.056979,
      "r2": 0.8178,
      "avg_latency_ms": 8.23,
      "p50_latency_ms": 8.23,
      "p95_latency_ms": 8.31,
      "p99_latency_ms": 8.35,
      "throughput_samples_per_sec": 98.62
    }
  }
}

附录 B: training_results.json 内容

来源: 执行脚本 train_npu.py 生成

{
  "MPEA": {
    "dataset": "MPEA",
    "method": "Pretrain+Finetune",
    "best_val_mse": 0.0003109226193159887,
    "best_epoch": 36,
    "r2": 0.9884162751126911
  },
  "RAYS": {
    "dataset": "RAYS",
    "method": "Finetune only",
    "best_val_mse": 0.006525,
    "best_epoch": 31,
    "total_train_time": 1617.46,
    "r2": 0.8178
  }
}