pdf_postprocessor_t5 是一个基于 T5 Encoder 架构的 PDF 文本后处理模型,用于对 PDF 提取后的 Markdown 文本进行智能清理和格式修正。该模型能够识别文本中的格式问题,自动调整换行、空格,删除冗余字符,显著提升 PDF 转 Markdown 的质量。
该模型是 Marker PDF 转 Markdown 工具中的关键后处理组件。
文本后处理(Token 分类 / Text Post-processing)
WeightedT5EncoderForTokenClassification模型对每个输入 token 输出一个分类标签:
| 标签 ID | 标签名称 | 含义 | 训练权重 |
|---|---|---|---|
| 0 | equal | 保留该字符 | 1.0 |
| 1 | delete | 删除该字符 | 5.0 |
| 2 | newline-1 | 在该位置插入换行 | 30.0 |
| 3 | space-1 | 在该位置插入空格 | 20.0 |
本模型已在华为昇腾 NPU (Ascend910) 上完成适配和测试。主要适配工作:
WeightedT5EncoderForTokenClassification 架构,我们在 inference.py 中实现了该架构的 PyTorch 实现,并支持加载原始权重。--device npu 参数将模型加载到 NPU 设备上进行推理。# 创建虚拟环境(可选)
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 工具包cd deliverables/pdf_postprocessor_t5
python3 inference.py --device cpucd deliverables/pdf_postprocessor_t5
python3 inference.py --device npupython3 inference.py --device npu --text "Your custom text here"python3 inference.py --device npu --text "Your custom text" --output result.txtCPU 推理耗时: ~3.99s(文本长度 55 字符) NPU 推理耗时: ~0.13s(文本长度 55 字符) NPU 加速比: ~30x
| 推理场景 | 设备 | 耗时 | 标签分布 |
|---|---|---|---|
| CPU 推理 | Intel CPU | 3.9926s | equal: 98.2%, space-1: 1.8% |
| NPU 推理 | Ascend910 | 0.1304s | equal: 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)运行精度对比脚本:
cd deliverables/pdf_postprocessor_t5
python3 compare_cpu_npu.py该脚本会:
| 测试文本 | 最大绝对误差 | 平均绝对误差 | 最大相对误差 | Cosine Similarity | 标签一致率 |
|---|---|---|---|---|---|
| 文本 1: 普通短文本 | 0.00006008 | 0.00000673 | 0.0024% | 1.00000 | 100% |
| 文本 2: 多句长文本 | 0.00001216 | 0.00000212 | 0.0692% | 1.00000 | 100% |
| 文本 3: 含换行文本 | 0.00000954 | 0.00000179 | 0.0111% | 1.00000 | 100% |
| 文本 4: 含多余空格 | 0.00000906 | 0.00000178 | 0.0078% | 1.00000 | 100% |
| 文本 5: 含连续换行 | 0.00001454 | 0.00000193 | 0.0060% | 1.00000 | 100% |
| 汇总 | 0.00006008 | 0.00000287 | 0.0692% | 1.00000 | 100% |
精度测试结论:NPU 与 CPU 推理误差为 0.0692%, 符合精度误差小于 1% 的要求
所有测试文本的预测标签完全一致(标签一致率 100%),Cosine Similarity 均为 1.0,说明 NPU 推理结果与 CPU 推理结果高度一致。
| 指标 | CPU | NPU (Ascend910) | 加速比 |
|---|---|---|---|
| 模型加载耗时 | 22.51s | 5.67s | 3.97x |
| 推理耗时(55字符) | 3.9926s | 0.1304s | 30.62x |
NPU 推理相比 CPU 推理获得了约 30 倍的加速效果。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。
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 # 终端截图