为了避免类似 https://github.com/Tencent/ncnn/pull/3911 一天白干的事再发生,写一下 FQ-ViT 方案。 ## 背景 目前 mmdeploy merge [这个 PR](https://github.com/open-mmlab/mmdeploy/pull/592) 之后,已经可以生成很漂亮的 ViT.onnx 5 月份的 FQ-ViT 论文很好, [源码 repo](https://github.com/megvii-research/FQ-ViT) 俺也熟悉了 ppq 搞量化表很方便,已经根据 FQ-ViT 的思路改得差不多了,WIP https://github.com/openppl-public/ppq/pull/154 现在就差动 ncnn 了。 ## 量化部分 原始 fp32 的结构这样: ```mermaid flowchart TD; add0-->layernorm; add0-->nop; nop-->add1; layernorm-->mha; mha-->add1; ``` 论文是这么计算 scale 的: ```mermaid flowchart TD; add0-->perchannel0; perchannel0-->layernorm; perchannel0-->add1; layernorm-->perlayer0; perlayer0-->mha; mha-->perlayer1; perlayer1-->add1; add1-->perchannel1; ``` 实际推理的时候,计算过程是这样: ```mermaid flowchart TD; add0.fp32-->quant; quant-->int_tensor0; int_tensor0-->layernorm.int; int_tensor0-->requant0; requant0-->add1; layernorm.int-->int8_tensor; int8_tensor-->mha.int; mha.int-->requant1; requant1-->add1; add1-->int_tensor1; ``` ## 修改内容 1. ppq 的量化结果,ncnn 怎么吃掉? 使用 .ini 格式,写了个 reader/writer。已完成 https://github.com/Tencent/ncnn/pull/3911 2. add/mha/layernorm 要支持 int8 打算把 naive 版本的写了,把量化模型精度验了就提 PR。 论文用的是 [-128, 127],有的地方还是 [0, 255] 。和推理并不完全一致。 ## 注意事项 1. <Batch, TokenNum, Channel> 语义下的 per-channel 和 <n,c,h,w> 并不一样,多了一步 transpose。 2. add1 前面是两个 requant,公式来源在这里 : https://github.com/megvii-research/FQ-ViT/issues/19 cc @nihui @BUG1989
为了避免类似 #3911 一天白干的事再发生,写一下 FQ-ViT 方案。
背景
目前 mmdeploy merge 这个 PR 之后,已经可以生成很漂亮的 ViT.onnx
5 月份的 FQ-ViT 论文很好, 源码 repo 俺也熟悉了
ppq 搞量化表很方便,已经根据 FQ-ViT 的思路改得差不多了,WIP OpenPPL/ppq#154
现在就差动 ncnn 了。
量化部分
原始 fp32 的结构这样:
flowchart TD; add0-->layernorm; add0-->nop; nop-->add1; layernorm-->mha; mha-->add1;论文是这么计算 scale 的:
flowchart TD; add0-->perchannel0; perchannel0-->layernorm; perchannel0-->add1; layernorm-->perlayer0; perlayer0-->mha; mha-->perlayer1; perlayer1-->add1; add1-->perchannel1;实际推理的时候,计算过程是这样:
flowchart TD; add0.fp32-->quant; quant-->int_tensor0; int_tensor0-->layernorm.int; int_tensor0-->requant0; requant0-->add1; layernorm.int-->int8_tensor; int8_tensor-->mha.int; mha.int-->requant1; requant1-->add1; add1-->int_tensor1;修改内容
ppq 的量化结果,ncnn 怎么吃掉?
使用 .ini 格式,写了个 reader/writer。已完成 refactor quant table #3911
add/mha/layernorm 要支持 int8
打算把 naive 版本的写了,把量化模型精度验了就提 PR。
论文用的是 [-128, 127],有的地方还是 [0, 255] 。和推理并不完全一致。
注意事项
cc @nihui @BUG1989