【腾讯犀牛鸟26】HunyuanOCR-ncnn #6809
AInoob3202
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
HunYuanOCR-ncnn迁移
repo link
HunYuanOCR-ncnn
Abstract
本项目围绕 HunyuanOCR 在 ncnn 框架上的迁移与验证展开研究,构建了一套尽可能保持 ncnn-native 的完整部署方案,覆盖动态 smart resize、vision encoder、text embedding、带 KV cache 的 LLM decoder、lm head、tokenizer 以及 C++ 端自回归生成流程。针对 HunyuanOCR 的动态分辨率输入特性,本项目复现了与原始 PyTorch/HuggingFace 流程一致的图像缩放、patch 对齐、动态 position embedding 与 image token 构造机制;针对长序列生成效率,本文在 ncnn decoder 图中实现了 KV cache 的增量推理路径,避免无 cache 解码带来的重复计算。
在精度分析方面,本文建立了从输入到输出的多层级分析体系,包括输入 CHW 像素级一致性检查、bbox 可视化对比、same-input decoder blob replay、logit margin 分析以及多任务 token 级评测。分析表明,少量 1-2 像素级 bbox 偏移主要来自视觉与解码器算子在不同推理框架中的累积数值差异,并在低 margin 坐标 token 上被 argmax 放大。可视化结果表明,该偏移对文本框定位效果无明显可见影响,因此本文未引入坐标后处理补偿或大规模非 ncnn 手写算子替换,而是将其作为生成式 OCR 迁移中的可解释边界现象保留。
本文还构建了覆盖 Spotting、General Parsing、Document Parsing、Table HTML、Formula LaTeX、Information Extraction 和 Translation 等任务的多任务评测流程。在超过 50k token 的迁移一致性评测中,本文统计了各任务的 token 级偏差率,并将差异归因到数字 token、bbox 坐标 token、公式符号、格式标点、结束/续写边界和普通文本内容等类别。结果表明,ncnn版本和PyTorch版本的模型在输出上具有较高一致性。
Experienment
为了更加直观和客观地评估迁移水平,在迁移到 ncnn 后,在数据集 TUL、OCRBench 采样大量样本进行了实验以说明迁移表现和不足,也可以更好地说明PyTorch和ncnn框架的差异。
TUL with bbox
使用TUL数据集进行测试并且提取 bbox,能够实现与 PyTorch 98%文本对齐率。并且表现PyTorch和ncnn都能够对齐实现非常优秀的OCR能力。在实验中发现主要问题是文本输出中的 bbox 没有对齐。ncnn 会在 bbox 上与 PyTorch 输出不一致,而且具体集中在y方向上:左上角的y坐标会略微向上偏移1-3个 value;右下角的y坐标会略微向下偏移1-3个 value;x轴方向上偏差几乎没有。
上图是 ncnn、PyTorch、GT 三个 输出的bbox映射回原图的可视化,可以发现即使文本输出有所不同,但是其boxing能力是不受影响的。虽然文本输出不同,但是不影响其多模态能力。
经过对模型全链路的 debug,可以说明 bbox 有1-3个 value 的偏差源于:HunyuanOCR 的坐标不是连续回归值,而是自回归生成的低 margin 坐标 token,ncnn 与 PyTorch 在 vision/decoder 算子累积数值上存在极小差异,最终在坐标 token 的 argmax 处被放大成 1-3 像素偏移。
HunyuanOCR 的 bbox 以文本形式生成,例如:
这里的
88、238、323、348都是 decoder 的离散 token,不是一个连续坐标回归头。只要两个候选坐标 token 的 logit 非常接近,PyTorch 和 ncnn 的微小数值差异就可能改变 argmax。PyTorch 侧示例的 logit 证据:
21254,坐标文本23819.75022058,相邻坐标候选19.6250.12546918,坐标文本91320.6254808920.6250.000这就是 bbox 偏移的直接放大机制:
对普通文本 token 来说,margin 往往足够大;对坐标 token、
)、,、结束 token 来说,margin 可能小到足以被这些误差改变。下面是同一输入下,ncnn 与 PyTorch 在 decoder block 内的关键 blob 误差。这里只列出代表性层,单位是 mean absolute error。
qmean errorattn_omean errormlp2mean errorln1mean error9.373e-072.213e-074.653e-062.763e-099.902e-079.293e-081.438e-069.779e-099.699e-071.487e-078.784e-072.348e-081.088e-061.292e-072.017e-062.378e-081.046e-061.498e-072.874e-062.357e-081.338e-063.944e-071.454e-052.722e-08mlp2明显放大,是后续重点从这张表可以看到:
ln1约1e-08。q和attn_o有稳定可测差异,量级约1e-07 ~ 1e-06。mlp2的差异更明显,block 26 达到1.454e-05。这类误差对文本识别不一定造成影响,但会进入最终 hidden state 和 lm_head。对于 margin 为
0.125、甚至0.000的坐标候选,最终 argmax 可能被改变。OCRBench 7 subtask
在OCRBench的7类子任务上做了评测,总token数超过了50k,整体上,ncnn 推理进程 0 崩溃,说明迁移后的端到端链路具备稳定可运行性;Table HTML 达到 0 token error / 10k tokens,Formula LaTeX 仅 118.03 token errors / 10k tokens,短文本与结构化输出任务表现稳定,长文本也能够和GT对齐,并且性能和PyTorch保持一致。7类子任务主要效果如下:
Formula LaTeX
Table HTML
Document Parsing
Translation
Information Extraction
General Parsing
Spotting
Pipeline
本项目实现了模型主体 ncnn 化率 100%;在KV-Cache、tokenizer、图像预处理、smart resize、自回归生成中仍有必要 C++ 逻辑和少量第三方工具库(如nlohmann/json、stb_image、torch,、transformers、pnnx、PIL主要用于调试、实验、可视化)
community_clean/scripts/export_modules.py、trace_export.py.param/.binBpeTokenizer+special_tokens.jsonpatch_size * spatial_merge_size = 32,min/max_pixels对齐cache_k/v和out_cache_k/v关键机制
smart resize
HunyuanOCR 使用动态分辨率输入。当前 C++ runtime 复现以下规则:
KV cache
decoder 支持:
这与无 cache baseline 不同,可以避免每一步重复 full decoder。
Comparisons and Limitations
与已有成果的对比
max_new_tokens配置对齐,以及 bbox 偏差来源的细粒度归因。总体而言,本项目不是单纯复现某个已有 demo,而是在完整 C++/ncnn runtime、动态 OCR 任务、KV cache、长文本配置和实验归因方面做了更系统的整理。
局限性
复杂任务对 prompt 高度敏感
文档 Markdown、信息抽取和翻译任务如果 prompt 不一致,输出风格会明显变化。未经 prompt 对齐的 token edit rate 不能直接解释为 ncnn 精度下降。
性能统计口径仍需统一
当前 ncnn 评测多为单图进程级 E2E 时间,包含模型加载;PyTorch 通常统计模型加载后的 generate 时间。二者不能直接作为同口径吞吐对比。
移动端和 Vulkan 仍需系统验证
当前主要验证路径是 CPU FP32。Vulkan、FP16、Android/aarch64 和常驻进程服务模式仍需要单独实验。
Windows/Linux编译教程
1. 准备 ncnn
Linux
如果需要 Vulkan,将
-DNCNN_VULKAN=OFF改为ON,并确保 Vulkan SDK / 驱动可用。Windows PowerShell + Visual Studio 2022
如果 PowerShell 中文 prompt 显示异常,可先执行:
chcp 650012. 编译 HunyuanOCR-ncnn
Linux
生成主程序:
Windows PowerShell
生成主程序:
3. 准备模型目录
运行时模型目录需要包含:
模型导出、trace 和 ncnn 转换脚本位于:
典型流程包括:
具体路径需要根据本机 HunyuanOCR 权重位置和 ncnn / pnnx 安装位置设置。
4. 运行示例
Linux
./build/hunyuan_ocr_clean_ncnn \ --model /path/to/HunyuanOCR_ncnn_clean_model \ --image /path/to/test.png \ --prompt "提取图中的文字" \ --max-new-tokens 1024Windows PowerShell
5. 常用 prompt
6. 参数说明
--model--image--prompt--max-new-tokens--max-new-tokens需要与 PyTorch benchmark 保持一致,否则长文本任务会出现“PyTorch 能继续生成、ncnn 提前停止”的伪差异。Reference
Beta Was this translation helpful? Give feedback.
All reactions