e
gcw_GSiqzzLf/pdf_postprocessor_t5-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

pdf_postprocessor_t5-NPU

模型介绍

pdf_postprocessor_t5 是一个基于 T5 Encoder 架构的 PDF 文本后处理模型,用于对 PDF 提取后的 Markdown 文本进行智能清理和格式修正。该模型能够识别文本中的格式问题,自动调整换行、空格,删除冗余字符,显著提升 PDF 转 Markdown 的质量。

该模型是 Marker PDF 转 Markdown 工具中的关键后处理组件。

原始模型地址

  • ModelScope: https://www.modelscope.cn/models/ModelBulider/pdf_postprocessor_t5
  • HuggingFace: https://huggingface.co/vikp/pdf_postprocessor_t5

任务类型

文本后处理(Token 分类 / Text Post-processing)

模型框架

  • 架构: WeightedT5EncoderForTokenClassification
  • 基座模型: T5 (Text-to-Text Transfer Transformer)
  • 编码器层数: 12
  • 解码器层数: 4
  • 隐藏层维度: 1472
  • 注意力头数: 6
  • 参数量: ~830MB

输入格式

  • 文本(字符串)
  • 使用 ByT5Tokenizer(字节级 Tokenizer),支持任意 Unicode 文本
  • 最大序列长度: 4096 tokens

输出格式

模型对每个输入 token 输出一个分类标签:

标签 ID标签名称含义训练权重
0equal保留该字符1.0
1delete删除该字符5.0
2newline-1在该位置插入换行30.0
3space-1在该位置插入空格20.0

依赖环境

  • Python 3.10+
  • PyTorch >= 2.0.0
  • Transformers >= 4.34.0
  • 昇腾 NPU: torch_npu, CANN 工具包

NPU 适配说明

本模型已在华为昇腾 NPU (Ascend910) 上完成适配和测试。主要适配工作:

  1. 自定义模型加载: 由于模型使用自定义 WeightedT5EncoderForTokenClassification 架构,我们在 inference.py 中实现了该架构的 PyTorch 实现,并支持加载原始权重。
  2. NPU 设备迁移: 支持通过 --device npu 参数将模型加载到 NPU 设备上进行推理。
  3. 精度验证: 通过 5 组测试文本对比 CPU 和 NPU 的推理结果,验证精度误差 < 1%。

环境准备

# 创建虚拟环境(可选)
python3 -m venv venv
source venv/bin/activate

# 安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# 安装昇腾 NPU 依赖(NPU 推理时需要)
# 请参考昇腾官方文档安装 torch_npu 和 CANN 工具包

推理命令

CPU 推理

cd deliverables/pdf_postprocessor_t5
python3 inference.py --device cpu

NPU 推理

cd deliverables/pdf_postprocessor_t5
python3 inference.py --device npu

自定义输入文本

python3 inference.py --device npu --text "Your custom text here"

保存输出到文件

python3 inference.py --device npu --text "Your custom text" --output result.txt

推理结果

CPU 推理耗时: ~3.99s(文本长度 55 字符) NPU 推理耗时: ~0.13s(文本长度 55 字符) NPU 加速比: ~30x

推理场景设备耗时标签分布
CPU 推理Intel CPU3.9926sequal: 98.2%, space-1: 1.8%
NPU 推理Ascend9100.1304sequal: 98.2%, space-1: 1.8%

推理截图

推理截图

部署和推理方法

核心代码

import torch
from transformers import ByT5Tokenizer
from inference import WeightedT5EncoderForTokenClassification, load_custom_model

# 加载模型和 tokenizer
model_path = "/path/to/model"
tokenizer = ByT5Tokenizer.from_pretrained(model_path)

# NPU 推理
device = torch.device("npu:0") if torch.npu.is_available() else torch.device("cpu")
model, config = load_custom_model(model_path, device)

# 执行推理
input_text = "Your PDF extracted text here"
inputs = tokenizer(input_text, return_tensors="pt", truncation=True, max_length=4096)
input_ids = inputs["input_ids"].to(device)

with torch.no_grad():
    logits = model(input_ids)

predictions = torch.argmax(logits, dim=-1)

# 后处理
from inference import postprocess_text
preds_list = predictions[0].cpu().tolist()
output = postprocess_text(list(input_text), preds_list[:len(input_text)], config["id2label"])
print(output)

推理流程

  1. 加载模型和 ByT5Tokenizer
  2. 将输入文本转换为字节级 token ID
  3. 通过 T5 Encoder 获取每个 token 的隐藏状态
  4. 通过分类头预测每个 token 的标签(equal/delete/newline-1/space-1)
  5. 根据标签序列对原始文本进行后处理,生成清理后的文本

CPU/NPU 精度测试方法

运行精度对比脚本:

cd deliverables/pdf_postprocessor_t5
python3 compare_cpu_npu.py

该脚本会:

  1. 在 CPU 上对 5 组测试文本执行推理
  2. 在 NPU 上对相同文本执行推理
  3. 对比输出 logits 的差异
  4. 计算最大绝对误差、平均绝对误差、相对误差、Cosine Similarity、标签一致率等指标

测试文本示例

  1. 普通短文本: "This is a simple test sentence."
  2. 多句长文本: "The quick brown fox jumps over the lazy dog. This paragraph has multiple sentences..."
  3. 含换行文本: "Hello\n\nworld\n\nThis has\nweird line\nbreaks..."
  4. 含多余空格: "A B C D E Extra spaces between words."
  5. 含多个连续换行: "Line one.\n\n\nLine two.\nLine three.\n\n\n\nLine four."

CPU/NPU 精度测试结果

测试文本最大绝对误差平均绝对误差最大相对误差Cosine Similarity标签一致率
文本 1: 普通短文本0.000060080.000006730.0024%1.00000100%
文本 2: 多句长文本0.000012160.000002120.0692%1.00000100%
文本 3: 含换行文本0.000009540.000001790.0111%1.00000100%
文本 4: 含多余空格0.000009060.000001780.0078%1.00000100%
文本 5: 含连续换行0.000014540.000001930.0060%1.00000100%
汇总0.000060080.000002870.0692%1.00000100%

精度测试结论:NPU 与 CPU 推理误差为 0.0692%, 符合精度误差小于 1% 的要求

所有测试文本的预测标签完全一致(标签一致率 100%),Cosine Similarity 均为 1.0,说明 NPU 推理结果与 CPU 推理结果高度一致。

性能测试结果

指标CPUNPU (Ascend910)加速比
模型加载耗时22.51s5.67s3.97x
推理耗时(55字符)3.9926s0.1304s30.62x

NPU 推理相比 CPU 推理获得了约 30 倍的加速效果。

推理成功证据

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:

# NPU 推理
python3 inference.py --device npu

# CPU 推理
python3 inference.py --device cpu

推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。

模型标签

  • #+NPU
  • #+NLP
  • #+文本后处理
  • #+Token分类
  • #+昇腾
  • #+PDF处理

资源释放

NPU 推理完成后,脚本会自动释放显存:

import torch
torch.npu.empty_cache()

文件和目录结构

deliverables/pdf_postprocessor_t5/
├── inference.py                 # 推理脚本
├── compare_cpu_npu.py           # CPU/NPU 精度对比脚本
├── requirements.txt             # 依赖列表
├── README.md                    # 本文件
├── inference_log.txt            # 推理日志
├── compare_result.json          # 精度对比结果
├── terminal_screenshot.py       # 终端截图生成工具
└── terminal_screenshot.png      # 终端截图