章节 01
导读 / 主楼:Lance-Quant:字节跳动Lance多模态模型的4-bit量化工具包
针对字节跳动Lance多模态大模型的定制化4-bit量化方案,支持AWQ INT4和NVFP4两种格式,通过任务感知校准实现高质量压缩,可将24.7GB模型压缩至4.3GB。
正文
针对字节跳动Lance多模态大模型的定制化4-bit量化方案,支持AWQ INT4和NVFP4两种格式,通过任务感知校准实现高质量压缩,可将24.7GB模型压缩至4.3GB。
章节 01
针对字节跳动Lance多模态大模型的定制化4-bit量化方案,支持AWQ INT4和NVFP4两种格式,通过任务感知校准实现高质量压缩,可将24.7GB模型压缩至4.3GB。
章节 02
Lance采用了独特的架构设计——基于修改后的Qwen2.5-VL,在每一层Transformer上引入了并行的_moe_gen专家模块,实现了"任务混合(Mixture-of-Tasks)"路由机制:理解token通过一个专家流动,生成token通过另一个专家流动。
这种架构带来了量化挑战:
PreTrainedModel架构_moe_gen权重,导致量化后的生成路径质量严重下降lance-quant通过手工实现的校准、打包和运行时替换方案,解决了上述所有问题。
章节 03
与标准AWQ不同,lance-quant采用双任务校准策略:
| 脚本 | 功能 |
|---|---|
awq_calibrate_single.py |
在单个任务上运行Lance推理,对504个目标Linear层(q/k/v/o_proj、mlp.{gate,up,down}_proj及每个_moe_gen兄弟层)植入激活钩子,保存每通道的平均绝对激活幅度 |
awq_merge_stats.py |
合并多个任务的统计信息为单一校准集 |
关键洞察:纯x2t校准会让_moe_gen权重没有激活数据,AWQ回退到简单的min-max量化,这正是产生"胡言乱语"输出的根源。通过添加t2i(文本到图像)路由,激活数据流经生成路径,使AWQ能够为这些层计算合适的缩放因子。
章节 04
| 脚本 | 输出格式 | 说明 |
|---|---|---|
awq_apply.py |
INT4 | 对归一化+消费线性层进行网格搜索AWQ缩放均衡化,将缩放因子融合到前序RMSNorm,按组打包权重到INT4 |
nvfp4_apply.py |
NVFP4 | 相同校准数据,但打包为NVFP4格式(E2M1编码+FP8 E4M3每16元素块缩放),适用于Blackwell张量核心 |
章节 05
| 脚本/模块 | 功能 |
|---|---|
run_baseline.py |
bf16基线推理,带内存优化加载器(元初始化+流式bf16转换),使12.3GB bf16模型能在16GB GPU上运行 |
run_quant_eval.py |
将Linear层替换为WQLinearINT4/WQLinearNVFP4并运行对比评估 |
quantized_linear.py |
纯PyTorch实现的参考模块,支持按需反量化,用于正确性验证 |
comfyui/ |
ComfyUI自定义节点包,自动检测Lance源 |
章节 06
保留Lance的MoE路由,支持图像/视频生成+理解:
| 变体 | 原始大小 | 量化后 | 压缩率 |
|---|---|---|---|
| Lance-3B-AWQ-INT4 | 24.7 GB | 4.31 GB | 5.7x |
| Lance-3B-Video-AWQ-INT4 | 28.4 GB | 6.15 GB | 4.6x |
| Lance-3B-NVFP4 (Blackwell) | 24.7 GB | 5.09 GB | 4.9x |
| Lance-3B-Video-NVFP4 | 28.4 GB | 6.93 GB | 4.1x |
章节 07
提取标准Qwen2架构的理解路径,用于Apple Silicon/iOS部署:
| 变体 | 大小 | 说明 |
|---|---|---|
| Lance-3B-und-MLX-4bit-DWQ | 1.6 GB | 推荐(蒸馏缩放) |
| Lance-3B-und-MLX-4bit | 1.6 GB | 纯后训练量化 |
| Lance-3B-und-MLX-NVFP4 | 1.6 GB | 未来ANE加速 |
| Lance-3B-und-CoreML-palettized | 6.2 GB fp16 | iOS/ANE流水线 |
章节 08
v1版本使用group_size=128,在6样本x2t图像基准上仅达到33%精确匹配。一个典型案例显示经典AWQ长文本退化:模型在"1998年推广活动花费"问题中,错误地插入了虚构实体("Scott Levin及其家人")。
v2重新量化采用group_size=64:
修复原理:o_proj和down_proj不能将AWQ缩放融合到前序norm(后非线性),它们获得纯逐组量化。更小的组=更少的异常值竞争相同缩放=更低的每通道量化噪声。