Penguin-VL-2B ncnn porting #6807
lvy010
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.
-
1.Penguin-VL-2B
一个视觉-语言多模态模型,由视觉塔 + LLM 解码器构成,端到端流水线如下:
参数
rope_theta = 1000000,无 rope_scaling,rms_norm_eps = 1e-6<|im_start|>、<|im_end|>、<image>、<think>、</think>目标
model.json)即可推理。2. 架构
2.1 子模型拆分策略
为适配 ncnn 的静态形状约束并降低单次 trace 的复杂度,将 PyTorch 模型拆成 6 个独立 ncnn 子图:
vision_patch_embed.ncnn.{param,bin}vision_encoder.ncnn.{param,bin}vision_projector.ncnn.{param,bin}embed.ncnn.{param,bin}decoder_nocache.ncnn.{param,bin}lm_head.ncnn.{param,bin}2.2 运行时调用流
3. LLM 解码器的图转换
与跨平台一致性
1 — KV-cache 解码器无法转换。 把 KV-cache 作为图输入、并
unsqueeze(0)加 batch 维的写法,使 pnnx 在pass_level0内联RMSNorm时崩溃(0xC0000409),即便转换成功,ncnn 运行时也在 prefill 阶段堆损坏。根因是该模式在 28 层 Qwen3 大图下触发深层结构不兼容。2 — pnnx 把序列长度写死。 导出后
.param里Reshape将 trace 时的seq=8固化(0=8 1=8/2=8),变长输入即元素数不匹配 → 乱码或崩溃。inputshape2,令其自动把不一致维标记为动态(2=-1)。3 — 动态形状引入不可加载算子。 GQA 的
repeat_kv用expand(...).reshape(...),动态下被降级成 ncnn 不支持的pnnx.Expression/Tensor.expand。repeat(1,1,rep,1,1)(映射到 ncnnTile),reshape 仅保留单一-1推断维,并把 q/k/v/cos 统一改为view(-1, ...),彻底消除动态表达式。4 — 因果 mask 被降级成双
-1Reshape。 逐子图对齐锁定问题在解码器后,.param中出现Reshape ... 0=-1 1=-1 2=1:scores(4D)+mask(2D)的广播被降级为带两个待推断维的 Reshape,ncnn 无法求解,表现为「连贯却错误」的输出。0=0 1=0 2=1,C++ 侧只喂 2D 因果 mask 由图内部广播5 — Windows argv 的 GBK 编码。 embed/decoder/lm_head/RoPE 全部验证正确后仍输出错误,打印 token id 发现中文被拆成字节 token(「请用」= GBK 字节
C7 EB D3 C3)。根因是 Windows ANSIargv为 GBK/936,中文在进入 UTF-8 分词器前已损坏。CommandLineToArgvW+WideCharToMultiByte(CP_UTF8, ...)重建 UTF-8 argv,并SetConsoleOutputCP(CP_UTF8);修复后 token id 与 HF 逐 id 一致,文本与 PyTorch 逐字一致。4.编译与运行
Beta Was this translation helpful? Give feedback.
All reactions