AlloyBERT 是一个基于 Transformer 编码器架构的模型,用于通过文本输入预测合金物理属性(如弹性模量和屈服强度)。该模型基于预训练的 RoBERTa 编码器,利用自注意力机制建立词语之间的语义关系,从而解释人类可读的文本输入并预测目标合金属性。
来源: 论文 arXiv:2403.19783, Section 1 Introduction
| 项目 | 内容 | 来源 |
|---|---|---|
| 论文标题 | AlloyBERT: Alloy Property Prediction with Large Language Models | arXiv:2403.19783 |
| 作者 | Akshat Chaudhari, Chakradhar Guntuboina, Hongshuo Huang, Amir Barati Farimani | arXiv:2403.19783 |
| 机构 | Carnegie Mellon University | arXiv:2403.19783 |
| arXiv | 2403.19783 | arXiv.org |
| 发表时间 | 2024年3月 | arXiv:2403.19783 |
| 领域 | 材料科学 (cond-mat.mtrl-sci), 机器学习 (cs.LG) | arXiv:2403.19783 |
来源: 论文 arXiv:2403.19783, Section 2.1 Model Architecture
来源: 论文 arXiv:2403.19783, Section 2.2 Datasets
| 数据集 | 全称 | 训练集大小 | 验证集大小 | 目标属性 | 数据来源 |
|---|---|---|---|---|---|
| MPEA | Multi Principal Elemental Alloys | 619 | 110 | 弹性模量 (Young's Modulus) | Citrine Informatics, 论文引用 [30] |
| RAYS | Refractory Alloy Yield Strength | 691 | 122 | 屈服强度 (Yield Strength) | 论文引用 [30][31][32] |
| 项目 | 链接 | 来源类型 |
|---|---|---|
| 官方 GitHub 仓库 | https://github.com/cakshat/AlloyBERT | 官方开源 |
| 本地路径 | /home/zy/alloybert-a3/AlloyBERT/ | 克隆自官方仓库 |
| 获取方式 | git clone https://github.com/cakshat/AlloyBERT.git | - |
| 项目 | 路径/链接 | 来源类型 |
|---|---|---|
| 基础模型 (RoBERTa-base) | https://huggingface.co/roberta-base | HuggingFace 官方 |
| 下载镜像 | 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 以获得模型权重。
| 数据集 | 本地路径 | 来源 |
|---|---|---|
| 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/ |
来源: 容器内 npu-smi info 命令输出
| 项目 | 信息 |
|---|---|
| NPU 型号 | Ascend 910C |
| NPU 数量 | 8 芯片 |
| HBM 容量 | 65536 MB / 芯片 |
来源: 容器内 pip list 和系统命令输出
| 项目 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS |
| Python | 3.11.15 |
| CANN | 9.0.0 (package_version: 25.5.1) |
| NPU 驱动 | 25.5.1 |
| 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 |
配置昇腾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# 检查 NPU 状态
npu-smi info
# 检查 Python 和依赖
python3 --version
python3 -c "import torch; import torch_npu; print('NPU available:', torch.npu.is_available())"Source: https://github.com/cakshat/AlloyBERT
git clone https://github.com/cakshat/AlloyBERT.git /home/zy/alloybert-a3/AlloyBERT来源: 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')
"执行脚本: /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训练参数与论文一致:
执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py
export HF_ENDPOINT=https://hf-mirror.com
python3 /home/zy/alloybert-a3/inference_benchmark_npu.py执行脚本: /home/zy/alloybert-a3/inference_demo_npu.py
export HF_ENDPOINT=https://hf-mirror.com
python3 /home/zy/alloybert-a3/inference_demo_npu.py该脚本逐条展示推理效果,输出内容包括:
results/predictions_MPEA.csv 和 results/predictions_RAYS.csv原始代码来源: 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 / cpu | npu:0 | AlloyBERT/main.py:11 | train_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:20 | train_npu.py |
| 调试工具 | wandb | 移除 (离线环境) | AlloyBERT/main.py:2 | train_npu.py |
| NPU 同步 | 无 | torch.npu.synchronize() | - | inference_benchmark_npu.py |
| Batch Size | 4 | 1 (与论文一致) | AlloyBERT/config.yaml:2 | train_npu.py |
| 随机种子 | 未固定 | seed=42 | - | train_npu.py |
| 文件 | 路径 | 说明 | 基于 |
|---|---|---|---|
| NPU 训练脚本 | /home/zy/alloybert-a3/train_npu.py | MPEA: 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 | 逐条推理效果展示 | 自编写 |
来源:论文 arXiv:2403.19783,表 4
| 数据集 | 训练方法 | MSE | R2 |
|---|---|---|---|
| MPEA | 预训练 + 微调(String 4) | 0.00015 | 0.99 |
| RAYS | 仅微调(String 4) | 0.00611 | 0.83 |
执行脚本:/home/zy/alloybert-a3/train_npu.py
结果文件:/home/zy/alloybert-a3/training_results.json
MLM 预训练(MPEA):
微调结果:
| 数据集 | 训练方法 | 最佳验证 MSE | 最佳轮次 | R2 | 训练时间 |
|---|---|---|---|---|---|
| MPEA | 预训练+微调 | 0.000311 | 36/50 | 0.9884 | - |
| RAYS | 仅微调 | 0.006525 | 31/50 | 0.8178 | 1617.46s |
执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py
结果文件:/home/zy/alloybert-a3/benchmark_results.json
| 数据集 | MSE | MAE | R2 |
|---|---|---|---|
| MPEA | 0.000311 | 0.012880 | 0.9884 |
| RAYS | 0.006525 | 0.056979 | 0.8178 |
执行脚本:/home/zy/alloybert-a3/inference_benchmark_npu.py
结果文件:/home/zy/alloybert-a3/benchmark_results.json
| 指标 | MPEA | RAYS |
|---|---|---|
| 总样本数 | 110 | 122 |
| 总推理时间 | 1.0031s | 1.2370s |
| 平均延迟(Avg Latency) | 7.70ms | 8.23ms |
| P50 延迟 | 7.67ms | 8.23ms |
| P95 延迟 | 7.99ms | 8.31ms |
| P99 延迟 | 8.02ms | 8.35ms |
| 吞吐量(Throughput) | 109.66 samples/s | 98.62 samples/s |
官方数据来源:论文 arXiv:2403.19783,表 4
NPU 数据来源:benchmark_results.json(执行脚本:inference_benchmark_npu.py)
| 数据集 | 官方最佳 MSE | NPU MSE | 官方 R2 | NPU R2 |
|---|---|---|---|---|
| MPEA | 0.00015 | 0.000311 | 0.99 | 0.9884 |
| RAYS | 0.00611 | 0.006525 | 0.83 | 0.8178 |
数据集测试结果已十分接近论文结果,现就存在的差距原因分析如下:
| 差异因素 | 说明 |
|---|---|
| 随机种子 | 论文未公开种子,不同种子导致训练轨迹存在差异 |
| 数据划分 | 论文未公开具体的 train/val 划分方式 |
| MLM 预训练细节 | 论文未公开 MLM 预训练的具体超参数(如 epoch 数、mask 比例等) |
| 训练轮数 | 论文可能在更多 epoch 训练后获得更优结果 |
数据来源:benchmark_results.json(执行脚本:inference_benchmark_npu.py)
| 指标 | MPEA | RAYS |
|---|---|---|
| 平均推理延迟 | 7.70ms | 8.23ms |
| 吞吐量 | 109.66 samples/s | 98.62 samples/s |
| 延迟稳定性 (P99-P50) | 0.35ms | 0.12ms |
在昇腾 910 NPU 上,AlloyBERT 的推理延迟稳定在 7-8ms/样本,P50 与 P99 的差异小于 0.4ms,推理性能表现十分稳定。
论文未报告推理性能指标(延迟/吞吐量),因此无法进行直接的性能对比。
执行脚本: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来源: 项目根目录 /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 合并规则| 文件 | 路径 | 说明 | 来源 |
|---|---|---|---|
| NPU 训练脚本 | /home/zy/alloybert-a3/train_npu.py | MPEA: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 最佳/最差预测结果 | 自行编写 |
| 文件 | 路径 | 说明 | 来源 |
|---|---|---|---|
| RoBERTa-base 模型 | /home/zy/alloybert-a3/models/roberta-base/ | HuggingFace 基础模型 | https://huggingface.co/roberta-base |
| MLM 预训练权重 | /home/zy/alloybert-a3/checkpoints/mlm_pretrained.pt | MPEA MLM 预训练权重 | 自行训练:train_npu.py |
| MPEA 最佳权重 | /home/zy/alloybert-a3/checkpoints/alloybert_MPEA_best.pt | MPEA 预训练+微调最佳权重 | 自行训练:train_npu.py |
| RAYS 最佳权重 | /home/zy/alloybert-a3/checkpoints/alloybert_RAYS_best.pt | RAYS 微调最佳权重 | 自行训练:train_npu.py |
| 文件 | 路径 | 说明 | 来源 |
|---|---|---|---|
| 训练结果 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.csv | MPEA 验证集逐条预测结果 | 执行 inference_demo_npu.py 生成 |
| RAYS 逐条预测 CSV | /home/zy/alloybert-a3/results/predictions_RAYS.csv | RAYS 验证集逐条预测结果 | 执行 inference_demo_npu.py 生成 |
来源: 执行脚本 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
}
}
}来源: 执行脚本 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
}
}