尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

trocr-small-handwritten-npu 源码逐行解析:inference.py 的 9 大关键步骤

trocr-small-handwritten-npu 源码逐行解析:inference.py 的 9 大关键步骤 trocr-small-handwritten-npu 源码逐行解析inference.py 的 9 大关键步骤【免费下载链接】trocr-small-handwritten-npu项目地址: https://ai.gitcode.com/atlasleong/trocr-small-handwritten-nputrocr-small-handwritten-npu是一个把微软 TrOCR 手写文字识别模型完整跑在昇腾 NPU上的开源项目。它通过一份独立自洽的 inference.py 推理脚本将图片 → 文字的 OCR 流程固化在 NPU 设备上从设备校验、模型加载、精度修复到文本生成、结果校验全程无 CPU 回退、输出可复现。本文逐行解析这份脚本的9 大关键步骤帮你彻底看懂 NPU 上跑 TrOCR 的完整套路无论你是想学习源码、还是准备在自己项目里部署手写文字识别都值得收藏。 想快速上手克隆仓库后直接运行python inference.py即可模型快照已内置无需联网下载。项目背景TrOCR 手写文字识别模型是什么TrOCRTransformer-based Optical Character Recognition是微软提出的端到端文字识别模型架构为VisionEncoderDecoderModelDeiT 图像编码器 TrOCR 文本解码器属于典型的 image-to-text 任务。模型参数约6159 万61,596,672输入单行文本图像384×384 RGB输出识别出的文本字符串处理器TrOCRProcessorDeiTImageProcessor XLMRobertaTokenizer硬件约束必须在 npu:0 上运行禁止 CPU 回退见 README.md整个交付仓库结构非常清爽├── inference.py # NPU 推理入口本次解析的主角 ├── model/ # 固定 revision 的模型快照config/权重/tokenizer ├── requirements.txt # 固定版本运行依赖 └── assets/ # 输入样例图与推理输出下面正式进入 inference.py 源码看看一次完整的 NPU 推理是如何分 9 步走完的。第一步NPU 设备校验与固定随机种子脚本从main()函数inference.py#L174-L187开始第一件事就是校验 NPU 是否可用if not torch.npu.is_available(): raise RuntimeError(NPU device npu:0 is not available; CPU fallback is forbidden)注意这里的硬性约束NPU 不可用就直接抛异常、非零退出绝不偷偷回退到 CPU。随后调用torch.npu.set_device(npu:0)绑定逻辑设备并把随机种子固定为 42CPU、numpy、NPU 三处都设置保证整个推理过程完全确定、可复现。第二步加载 TrOCR 模型与处理器固定版本快照加载环节inference.py#L194-L200非常讲究processor TrOCRProcessor.from_pretrained(MODEL_DIR, local_files_onlyTrue, revisionPINNED_REVISION) model VisionEncoderDecoderModel.from_pretrained(MODEL_DIR, local_files_onlyTrue, revisionPINNED_REVISION)两个关键点local_files_onlyTrue只从本地model/目录读取绝不联网重新解析权重revision固定锁定到不可变的 commit SHAb4648cfa…防止模型漂移。加载完成后model.eval()切换为推理模式权重路径与模型配置详见 model/config.jsondecoder_layers6、d_model256、max_length20。第三步NPU 精度修复KEEP_DTYPE 与精确 GELU这是本脚本最硬核的一步_apply_npu_precision_fix在model.to(npu)之前执行修复两处 fp32 精度偏差昇腾 Cube 单元默认把 fp32 矩阵乘/卷积下精度到 fp16这里通过CUBE_MATH_TYPEKEEP_DTYPE、ALLOW_MATMUL_HF32disable、ALLOW_CONV_HF32disable关闭torch_npu的F.gelu内核即使指定none模式仍是近似实现于是把编码器里每个GELUActivation替换为基于torch.erf的精确 GELU见_ExactGELU。修复后与 CPU fp32 基线的max_abs_error从 0.0320 骤降到0.00026效果立竿见影。这也是在 NPU 上跑模型时最容易踩的精度坑。第四步纯 NumPy 渲染确定性文本图像没有真实手写图片没关系脚本用内置5×7 位图字体纯 numpy无任何字体/网络依赖确定性渲染出文本行HELLOrender_text_image2 倍超采样绘制 → 2×2 box 降采样得到柔和边缘输出 384×384 RGB 白底黑字图像保存为assets/input_sample.png并计算 SHA-256 指纹作为输入的确定性标识。这意味着同样的代码在任何机器上都会渲染出逐字节一致的输入图为后续结果复现打下基础。第五步图像预处理与解码器输入构造渲染好的 PIL 图像交给TrOCRProcessorinference.py#L217-L223完成resize 到 384×384RGB 通道 mean0.5、std0.5 归一化得到pixel_values形状[1, 3, 384, 384]送入 npu:0。同时用_build_decoder_input_ids构造 teacher-forcing 用的解码器输入[decoder_start_token_id] pad长度为 20其中decoder_start_token_id2来自 model/config.json。第六步warmup 与 teacher-forcing 前向计时正式推理前先跑一次warmupinference.py#L226-L228完成参数迁移和图构建避免首次前向的额外开销污染计时。然后执行同步计时的 teacher-forcing 前向inference.py#L231-L247with torch.no_grad(): out model(pixel_valuespixel_values, decoder_input_idsdecoder_input_ids, ...) torch.npu.synchronize()关键在于torch.npu.synchronize()—— 因为 NPU 是异步执行的必须显式同步才能拿到真实耗时。本次前向产出核心张量decoder_logits形状[1, 20, 64044]词表大小 64044token_ids logits.argmax(dim-1)形状[1, 20]encoder_last_hidden_state编码器隐藏状态。第七步贪心文本生成与解码teacher-forcing 验证了给定正确答案时的输出接下来是真正展示模型能力的自回归生成inference.py#L249-L267generated_ids model.generate( pixel_valuespixel_values, max_length20, do_sampleFalse, num_beams1, )采用贪心解码do_sampleFalse, num_beams1不做随机采样、不用 beam search逐步生成 20 个 token再用processor.batch_decode(..., skip_special_tokensTrue)解码为真实文本字符串GENERATED_TEXT。这是 image-to-text 任务真正意义上的识别结果。第八步结果落盘与磁盘回读校验生成结果不能只留在内存里。脚本inference.py#L285-L340把 4 个主输出数组保存到assets/run_outputs/decoder_logits.npy、argmax_token_ids.npy、generated_ids.npy、encoder_last_hidden_state.npy保存后立即从磁盘回读逐一校验数组形状是否与内存一致SHAPE_MATCH是否含 NaN / InfOUTPUT_HAS_NAN/OUTPUT_HAS_INF唯一的不确定量——墙钟耗时写入 assets/timing.json不打印到 stdout保证日志逐字节稳定。第九步审计标记输出与退出码最后inference.py#L342-L377脚本以键值对标记marker的形式打印全部关键信息方便流水线自动解析类别示例标记设备信息INPUT_DEVICEnpu:0、MODEL_DEVICEnpu:0、CPU_FALLBACKfalse输入指纹INPUT_IMAGEtextHELLO,shape[1, 3, 384, 384],sha256…输出形状LOGITS_SHAPE(1, 20, 64044)、GENERATED_IDS_SHAPE(1, 20)语义结果TRANSCRIPTION…、GENERATED_TEXT…审计结果OUTPUT_HAS_NANfalse、SHAPE_MATCHtrue结束标记EXIT_CODE0整个流程任何一步出错都会打印EXIT_CODE1并附上异常类型绝不含糊。实测结果与性能数据在真实昇腾 NPU910B4CANN 8.5.1上运行python inference.py得到的验收结果如下同步计时teacher-forcing 前向24.67 ms、贪心生成322.30 ms见 assets/timing.json精度对比修复后max_abs_error0.00026阈值 0.001generated_idsCPU 与 NPU12/12 完全一致结果校验输出无 NaN、无 Inf磁盘回读形状匹配EXIT_CODE0。常见问题与注意事项必须要有 NPU 环境脚本强校验npu:0普通 CPU 机器无法运行这是设计如此不是 bug精度修复不能省不执行第三步NPU 与 CPU 基线误差会超出阈值0.032 vs 0.00026local_files_onlyTrue模型完全来自本地model/快照不要尝试让它联网加载性能数据仅代表固定单样本环境不代表通用吞吐承诺生产部署建议自行压测。总结通过逐行拆解 inference.py 的 9 大关键步骤我们可以看到一份高质量 NPU 推理脚本应该具备的素养设备强校验、版本强固定、精度强修复、输出强可审计。trocr-small-handwritten-npu 不仅让你开箱即用地在昇腾 NPU 上体验 TrOCR 手写文字识别更是一份值得反复研读的 NPU 推理工程范本。想亲自跑一遍克隆仓库后直接执行python inference.py对照本文 9 步观察输出日志你会对 NPU 推理有全新的理解【免费下载链接】trocr-small-handwritten-npu项目地址: https://ai.gitcode.com/atlasleong/trocr-small-handwritten-npu创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表