TrOCR (Transformer-based OCR) 是一个端到端的光学字符识别模型,采用 VisionEncoderDecoder 架构:ViT (DeiT) 编码器 + TrOCR 解码器。本仓库适配 microsoft/trocr-base-printed(印刷文本识别基座版)在华为昇腾 Ascend 910 上真实推理。
microsoft/trocr-base-printedVisionEncoderDecoderModel (encoder vit 12层 hidden 768, decoder trocr 12层 d_model 1024)model.safetensors 1.27 GB (1271.6 MB) 来自 ModelScope microsoft/trocr-base-printednpu:0 (物理 ID 14), torch.npu.is_available()==Truenpu-smi info 显示 NPU 健康,torch.npu.get_device_name(0)==Ascend910_9362pip install -r requirements.txt
# requirements.txt 包含
# torch
# torch_npu
# transformers
# Pillow
# accelerate默认命令(CPU+NPU 对比 + NPU 生成):
python inference.py指定模式:
python inference.py --mode validate # 严格一致性校验 (exit 1 if mismatch)
python inference.py --mode benchmark # 10次稳定推理计时
python inference.py --model-dir /data/.cache/models/microsoft/trocr-base-printed --device npu:0inference.py 自动在 npu:0 上加载真实权重,打印模型名、device、dtype、输入摘要、真实生成结果、耗时与最终 PASS/FAIL。需要真实 NPU 否则返回非零退出码。
固定合成输入: 384x384 白底图像,居中文本 "HELLO 123" (PIL 默认字体),经 TrOCRProcessor 预处理为 pixel_values [1,3,384,384] float32。
本次真实执行 (2026-08-22, npu:0, float32, batch 1):
[INFO] model_dir: /data/.cache/models/microsoft/trocr-base-printed
[INFO] weight model.safetensors: 1271.6 MB
[INFO] processor: TrOCRProcessor
[INFO] test image: size=(384, 384), mode=RGB
=== CPU ===
pixel_values shape: torch.Size([1, 3, 384, 384])
generated_ids: [2, 347, 13246, 35875, 35, 2]
generated_text: 'CASHIER:'
latency: 5156.27 ms (CPU)
=== NPU (npu:0, float32, warmup 3) ===
params on NPU: 480/480
pixel_values shape: torch.Size([1, 3, 384, 384]) device npu:0
generated_ids: [2, 347, 13246, 35875, 35, 2]
generated_text: 'CASHIER:'
latency: 64.51 ms (single), warmup后稳定合成图无真实语义,解码为 "CASHIER:" 属模型对空白/噪声输入的固定输出,用于验证端到端 generate 链路而非语义正确性。关键验证为 CPU/NPU 生成完全一致。
相同权重、相同预处理、相同 384x384 固定图像,分别在 cpu 与 npu:0 上 model.generate(pixel_values, max_length=20) (greedy, deterministic):
[2, 347, 13246, 35875, 35, 2] -> "CASHIER:"[2, 347, 13246, 35875, 35, 2] -> "CASHIER:"测试模式: python inference.py --mode validate 返回 0 表示 PASS。
计时均在 torch.npu.synchronize() 前后取时,warmup 3 次,正式 10 次,输入 384x384, batch 1, dtype float32, NPU 910:
Benchmark 10 iterations (npu:0):
iter 1: 64.55 ms
iter 2: 64.33 ms
iter 3: 64.61 ms
iter 4: 64.47 ms
iter 5: 63.42 ms
iter 6: 62.79 ms
iter 7: 62.67 ms
iter 8: 62.60 ms
iter 9: 62.44 ms
iter 10: 62.58 ms
avg: 63.45 ms, min: 62.44 ms, max: 64.61 ms, p50: 63.42 ms, p90: 64.61 ms, p95: 64.61 ms
首次编译已在 warmup 中完成,稳定推理 ~63-64 ms / image
吞吐: ~15.7 images/s (1 / 0.06345)
NPU memory free 59.42 GiB total 61.27 GiB (峰值占用 ~1.8 GiB)CPU 对比单次 ~5156 ms,NPU 加速 ~80x。
assets/agent_workflow.png - 下载/侦察/加载/NPU推理/验证/性能全流程日志assets/npu_device_call.png - npu-smi + torch.npu + 模型 param device 证据assets/model_result.png - python inference.py 真实输出与 PASS/data/.cache/models/microsoft/trocr-base-printed/model.safetensors),首次离线加载需 1.27GB 本地缓存。encoder.pooler 权重未初始化提示属正常 (重写 config 后冗余层)。Hardware: NPU, NPU, Ascend, Ascend910, OCR, TrOCR, VisionEncoderDecoder