日期:2026-07-24
本文为工程实践复盘,客户信息已脱敏;所述数据均为示意值,不对应任何具体合同或审计数字。
我们在一个区域政务问答项目里首次大规模吃到了推理成本的苦头。客户要求模型常驻内网、数据不出域,底座采用私有化部署,但最初直接拉起的是 7B 量级的完整精度模型,单卡显存吃紧、并发上不去,高峰期一批政策问答直接排队。我们当时估算:如果按全量模型对外服务,按业务峰值的并发目标至少需要翻倍 GPU 资源,预算根本批不下来。与此同时,边缘侧还有一批轻量咨询场景(如窗口自助问答、常见材料清单查询)希望就近响应,完整模型根本塞不进去,哪怕是量化前的版本也超过边缘盒子的内存上限。于是我们决定在"不掉点"前提下把模型压下来:结构化剪枝去掉冗余通道,再用 INT8/FP16 量化把权重体积和显存压一截,必要时辅以蒸馏把能力收敛到更小模型上。这件事的底线是:精度可量化、过程可回滚、线上可灰度,而不是一味追求压缩比这个漂亮数字。我们同步在内部定了一条铁律——任何压缩动作都必须先有评测基线,没有基线不许上线。
我们把压缩分为两条线。一条是"云侧轻量化":对常驻服务的对话模型做剪枝加量化,目标是在同等显存下把单卡并发从约 4 提升到约 8,P99 时延控制在可接受区间。另一条是"边侧小模型":把政策问答里高确定性的意图分类、常见政策点答这类请求,用大模型蒸馏出一个 0.5B 量级的小模型,部署到窗口自助终端上做本地兜底。两条线共享同一套评测基准:先用我们沉淀的政务问答集跑基线,再对压缩后的模型跑回归,只有准确率掉点不超过约定阈值(我们内部设为相对基线下降不超过 2 个百分点)才允许进入灰度。网关侧按"意图简单走小模型、复杂语义走大模型"的策略路由,小模型命中不了的请求自动升级到大模型,保证体验不退化。所有压缩产物都接入我们采用的推理服务化层,统一做连续批处理与显存管理,避免压缩成果停在本地文件里无法规模化。
第一个坑是剪枝后的精度掉点。我们一开始用全局幅度剪枝,一次性砍掉 30% 通道,结果小类政策(如某项专项补贴、某类落户细则)答错率明显上升。后来改成结构化剪枝加分层敏感度评估:先对每一层做局部剪枝并跑评测,画出各层敏感度曲线,对敏感层少剪、冗余层多剪,整体压缩比控制在 25% 左右,掉点回到阈值内。第二个坑是量化校准。直接做训练后量化(PTQ)到 INT8 在长尾样本上出现系统性偏差,我们引入一小批代表性校准集做校准,覆盖各类政策表述和口语问法,校准后量化误差显著收敛。第三个坑是端侧小模型的蒸馏。我们发现死记答案效果差,正确做法是让教师模型输出软标签(带温度的概率分布),学生模型学习"分布"而非"唯一答案",这样在未见问法上泛化更好;同时用"推理链"样本作为中间监督,避免学生只会背结论。第四个坑是服务化接入。压缩后的模型权重格式与原始不同,我们统一转成推理框架兼容格式,并验证 KV 缓存占用随剪枝下降后,连续批处理的并发上限确实抬升,而不是只省了显存却没换来吞吐。
案例片段(已脱敏):剪枝敏感度评估的简化逻辑(伪代码,已脱敏):
python for layer in model.layers: base = eval(layer, calib_set) # 该层剪前准确率 pruned = eval(prune(layer, ratio=0.3), calib_set) sensitivity[layer] = base - pruned # 掉点越大越敏感 keep_ratio = 0.25 if sensitivity[layer] < 0.02 else 0.10
以脱敏示意口径看:云侧常驻模型经剪枝加 INT8 量化后,权重体积下降约 58%,单卡可承载并发由约 4 提升至约 8,P99 首字时延下降约 35%,GPU 显存占用下降约 52%。边侧小模型(蒸馏自教师模型)在高频确定性意图上的自助解决率达到约 82%,把约三成窗口请求拦在了大模型之外,边缘盒子内存占用控制在约 1.2GB。回归评测上,政务问答集整体准确率相对基线下降 1.4 个百分点,控制在约定阈值内;专项补贴类小类的掉点从最初 6 个百分点收敛到 1.8 个百分点。部署成本(以同等 SLA 下所需卡数计)下降约 45%,按我们内部口径每年节省算力开支约数百万元量级。所有数字均为示意值,不对具体合同负责。
先测精度保真再谈压缩比,不要被"体积减半"的漂亮数字带偏——掉点才是上线门槛,没有评测基线的压缩都是盲飞。量化务必做校准,校准集要覆盖长尾和口语化表达,否则 PTQ 会在边缘样本上悄悄翻车。蒸馏让学生学"分布"而不是背答案,辅以推理链中间监督,泛化才稳。压缩后的模型要接进统一推理服务化层,用连续批处理把省下来的显存转化为真实吞吐,别让压缩成果停在本地文件里。最后,所有压缩动作都要有可回滚的版本与可量化的评测基线,灰度上线、按指标放行,出问题一键回退到 fp16 基线。
案例片段(已脱敏):量化校准与回滚的版本记录片段:
yaml model: policy-qa-7b steps: - name: prune ratio: 0.25 acc_drop: 0.014 - name: quantize dtype: int8 calib_samples: 1200 acc_drop: 0.018 rollback_to: policy-qa-7b-fp16