【腾讯犀牛鸟2026】Tencent-Hunyuan/HunyuanOCR ncnn 移植与多平台部署V2.0 #6841
AiChiTuDouPian
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 技术报告
作者: AiChiTuDouPian
版本: v1.2
摘要
本报告详细记录了将腾讯混元 HunyuanOCR(约 1B 参数的多模态 OCR 模型)从 PyTorch 完整移植到 ncnn 推理框架的技术细节。移植后的 C++17 运行时在 fp32 精度下与 PyTorch 原版数值完全对齐(误差
< 1e-5),fp16,int8混合量化 解码的最终 OCR 文本一致。v0.2 的两个核心增量工作:
prefill(一次性全量前向、提取 24 层 K/V cache)与decode(每步仅算 1 个新 token 并复用 cache)两个子图,由模型配置decoder_decode_param驱动。推理从每步全量重算O(N²)降为O(N),translate 任务端到端从 576 s 降至 44.2 s(13×)。1. 项目背景
1.1 模型架构
HunyuanOCR 是一个视觉-语言多模态模型,由 5 个主要组件构成:
1.2 关键超参数
1.3 设计目标
< 1e-5,最终文本完全一致。build-cpu)与 Vulkan GPU(build-gpu)上均可运行。2. 整体架构
2.1 子模型拆分策略
为了适配 ncnn 的静态形状约束并降低单次 trace 的复杂度,我们把 PyTorch 模型拆分成 5 个独立的 ncnn 子模型,外加一个 C++ 直读的 Perceptron:
vision_encoder.ncnn.{param,bin}perceptron_weights.binprojector.ncnn.{param,bin}embed.ncnn.{param,bin}decoder_prefill.ncnn.{param,bin}+decoder_decode.ncnn.{param,bin}.bin)lm_head.ncnn.{param,bin}2.2 运行时调用流(含 KV-Cache 两阶段)
KV-Cache 存储容器(
kv_cache_k_/kv_cache_v_,24 层ncnn::Mat)驻留在 CPU 主机内存,由ex.extract()从 device 拉取。详见 §3.7。3. 关键难点与解决方案
3.1 KV-Cache 两阶段增量解码
背景
v0.1 的 decoder 是单一 full-forward 图(
decoder.ncnn.param),generate()每生成 1 个新 token 都要把整段历史(prompt + 已生成)重新过一遍 24 层 attention,计算量 ∝O(N²)。translate 任务因此高达 576 s(160 token)。ncnn 的
forward()与forward_decode()双路径机制早已实现,但模型配置缺失导致 decode 路径从未被启用:两阶段图结构
decoder_prefill.ncnn.paramempty_cachehidden+layer_0..23_k_cache/layer_0..23_v_cachedecoder_decode.ncnn.paramcache_inlayer_N_k/v_cache_inhidden+ 更新后的layer_N_k/v_cachellm_decoder.cpp::forward()):一次性全量前向过 24 层,每层ex.extract("layer_N_k_cache", ...)把 K/V 存进kv_cache_k_/kv_cache_v_。llm_decoder.cpp::forward_decode()):每步只喂入上一步 token + 历史 cache,ex.input("layer_N_k_cache_in", kv_cache_k_[i]),跑 24 层 SDPA 后ex.extract更新 cache 回存。KV-Cache 数据驻留与往返
24 层 cache(每层 shape
k=128×S×8)作为ncnn::Mat存储在 CPU 主机内存。每步 decode 发生 96 次 blob 传输(24 层 × 2(k/v) × 2(上传+回存))+ncnn::Mat::clone()拷贝。这是 ncnn Vulkan Extractor 的标准模式(kernel 在 device 跑,blob 在 host 落地)。验证
[decoder_decode] loaded decode network日志确认两条路径均生效,且多次运行输出文本与修复前逐字一致(数值正确性未受影响)。性能意义
KV-Cache 将 decode 阶段从
O(N×S²)降到O(N×S)(S = prefill 序列长度),是 v0.2 最大的单项性能收益来源。后续所有性能数据均基于 KV-Cache 已启用。4. 多端推理:CPU 与 GPU
4.1 构建与运行时
同一套 C++ 源码通过 CMake 构建两个产物:
build-cpu/hunyuan_ocrNCNN_VULKAN=OFFbuild-gpu/hunyuan_ocrNCNN_VULKAN=ONnet.opt.use_vulkan_compute=true两者的 KV-Cache 路径(prefill/decode 两阶段)代码完全一致,仅
use_vulkan标志不同:4.2 Blackwell (RTX 5060 Ti) Vulkan 适配
在 Blackwell 架构的 Vulkan 实现上存在 subgroup 算子 bug,导致部分算子结果错误或崩溃。在
src/quant_opt.h中加了针对性 workaround:连带影响:ncnn 的
SDPA算子在 Vulkan 后端有真正的 FlashAttention 分块实现(sdpa_vulkan.cpp的use_flash_attention路径,O(S) 显存、不实例化 N×N 矩阵),但其启用条件之一正是subgroup_ops支持。关闭 subgroup 后use_flash_attention被连带禁用,GPU 上的 attention 退回三步走(Q@K^T → 实例化 N×N → softmax → @v)。这是 Blackwell + ncnn Vulkan 当前生态的局限,非本项目代码问题。4.3 实测对比(KV-Cache 已启用,fp16 )
GPU translate 因连续运行 thermal 降频,单次冷机测得 44.2 s,长期运行波动至 50–65 s;CPU 全程稳定在 50.9 s 左右。
三张图 CPU 与 GPU 输出文本逐字一致,证明 KV-Cache 在双后端均正确启用。
5. 测试结果
5.1 数值对齐测试(fp32 资产,KV-Cache 之前的全量验证基础)
使用
scripts/verify_pytorch_alignment.py进行 8 阶段对齐验证:< 1e-6< 1e-5< 1e-5< 1e-5< 1e-5< 1e-55.2 ViT 逐层对比
compare_block0_v2.py对比第一个 transformer block 的每个子步骤,27 层 transformer 全部 cosine = 1.0000。5.3 MHA 权重验证
verify_mha_weights.py直接按 offset 读取vision_encoder.ncnn.bin中的 MHA 权重,与 PyTorch 对比 max_diff = 0.000000e+00(q/k/v/o 各权重 + bias 均一致)。5.4 KV-Cache 性能验证
[decoder_decode] loaded decode network日志确认双路径生效。5.5 端到端 OCR 测试
zimu.png对不起 我是诺曼·斯佩尔曼 Sorry, I'm Norm Spellman.qikai.png旗开得胜[result] 对不起 我是诺曼·斯佩尔曼
[result] 以下是图片中的文字内容。
君の膝腕をたべたい
住野上る
鏡後、きっとこのタイトルに誤する
映画化!
7月28日(金)全国ロードシリー
映画
5.6 Token 级对齐(En.png)
PyTorch 与 C++ 生成序列 23 个 token 完全一致(含末尾 EOS token 120007),详见 v0.1 附录日志。
6. 性能分析
6.1 各阶段耗时(zimu.png, CPU)
6.2 性能瓶颈
8. 结论
本项目成功将 HunyuanOCR (1B) 从 PyTorch 完整移植到 ncnn,在 fp32、fp16、int8混合量化 精度下实现了与原版完全对齐的数值结果
v0.2 在此基础上落地了两项目标能力:
当前版本已可用于多端生产环境的推理。未来工作集中在限制输入分辨率降低 prefill 计算量、图优化(pnnx 融合 RMSNorm 等算子)、以及上游修复后重新启用 FlashAttention。
参考文献
项目链接
https://gitee.com/zyxssss/hunyuan-ocr-ncnn
模型文件链接
https://huggingface.co/xxzigou/HunyuanOCR-ncnn
https://huggingface.co/xxzigou/hunyuan_ocr_ncnn_int8
https://huggingface.co/xxzigou/hunyuan_ocr_ncnn_fp16
All reactions