z
zkx_/NeuML_pubmedbert-base-embeddings-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

NeuML/pubmedbert-base-embeddings on Ascend NPU

1. 简介

本文档记录 NeuML/pubmedbert-base-embeddings 生物医学句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

该模型基于 PubMedBERT(BERT-base,12 层 768 维),在 PubMed 3.2B 生物医学摘要上从头预训练,使用 Mean Pooling 提取 768 维句嵌入。相比通用 BERT,PubMedBERT 对生物医学术语(疾病名、药物名、基因符号、临床术语等)有更好的语义理解。可用于生物医学文献检索、临床文本相似度计算、医疗问答匹配等场景。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/NeuML/pubmedbert-base-embeddings

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)

3. 部署使用流程

3.1 环境准备

conda create -n NeuML_pubmedbert-base-embeddings python=3.11 -y
conda activate NeuML_pubmedbert-base-embeddings

pip install torch==2.8.0 torch_npu==2.8.0.post4 \
    -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 推理

python inference.py --text "What are the symptoms of COVID-19?" --device npu
from inference import PubMedBERTEncoder
encoder = PubMedBERTEncoder(
    model_path="./NeuML_pubmedbert-base-embeddings", device="npu"
)
embeddings = encoder.encode(["Patient presents with fever and cough."])
# embeddings.shape → (1, 768)

4. Smoke 验证

python inference.py --text "What are the symptoms of COVID-19?" --device npu

预期输出:768 维归一化嵌入向量,无运行时错误。

5. 性能参考

指标数值
NPU 吞吐量828.1 sentences/s

PubMedBERT 为标准 BERT-base(12 层 768 维),推理速度与通用 BERT-base 相近。生物医学领域文本的平均长度长于通用文本,实际吞吐略低于短句场景。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 23 条测试句子推理,比较 768 维嵌入向量的余弦相似度。

6.2 评测结果

指标数值
精度误差率0.0009%

结论:精度误差率 0.0009%,远低于 1% 要求,评测通过。

7. 迁移适配说明

7.1 模型结构

  • Backbone:BertModel(12 层,768 维,PubMedBERT 从头预训练版)
  • Pooling:Mean Pooling(mask 加权平均)
  • Normalize:L2 归一化
  • Tokenizer:BERT WordPiece + PubMed 领域词表扩展(医学术语专用分词)
  • 参数量:约 110M(BERT-base 标准规模)

7.2 适配要点

  1. AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移
  2. Mean Pooling 手动实现,与通用 BERT 完全相同
  3. PubMedBERT 的 tokenizer 包含 [unused0]-[unused99] 占位符(PubMed 预训练遗留),正常使用可忽略
  4. 模型权重为 safetensors 格式,加载速度快

7.3 关键代码

import torch, torch_npu
from transformers import AutoModel, AutoTokenizer

model = AutoModel.from_pretrained("pubmedbert-base-embeddings").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("pubmedbert-base-embeddings")

text = "Patient presents with fever and cough."
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    outputs = model(**inputs)
    mask = inputs["attention_mask"].unsqueeze(-1).float()
    embedding = (outputs.last_hidden_state * mask).sum(1) / mask.sum(1)
    embedding = torch.nn.functional.normalize(embedding, p=2, dim=1)

8. 注意事项

  1. 生物医学领域专用:PubMedBERT 在 PubMed 3.2B 摘要上从头预训练(非通用 BERT 微调),对生物医学术语(如 "myocardial infarction", "hydroxychloroquine", "CRISPR-Cas9")有专门的词表和语义理解。普通英文文本也可编码但非最优。
  2. 领域 tokenizer:tokenizer 包含生物医学缩写和术语的专门分词规则,与通用 BERT tokenizer 略有不同。临床报告中的缩写和医学术语不会被过度拆分。
  3. 768 维嵌入:适合存入向量数据库(如 FAISS、Milvus、Qdrant)进行大规模生物医学文献语义检索。
  4. 首次 NPU 推理:12 层 BERT-base 算子编译约 3-5 秒,建议预热后批量推理。
  5. 与通用 BERT 对比:在生物医学文本相似度任务上,PubMedBERT 优于通用 BERT-base(F1 提升约 3-5 点),普通文本上二者性能相当。