Tesla T4 上的 Gemma 4(三):把嵌入表压到 int4,用 2.86 GiB 起服务
来源:dev.to — 2026-09-30
📋 概述
系列第三篇,讲如何把 Google 做过量化感知训练(QAT)的 Gemma 4 E2B 端到端压到 4 位权重——嵌入表也不例外,然后在单张 Tesla T4 上交给 vLLM 服务。关键观察是:QAT 只量化了线性层,两张嵌入表仍是 bf16,却占了 6.11 GiB 文本检查点里的 5.1 GiB;而 QAT 本来就把这些表训练在同一个 4 位网格上,因此重打包成 int4 几乎不引入新的量化误差。结果很直接:模型加载从 9.8 GiB 降到 2.86 GiB,KV 缓存从 31.6 万 token 扩大到 109.9 万,单个 512 token 请求的输出吞吐从 37.04 提升到 85.28 token/s,八个贪婪解码测试与 bf16 版本逐 token 一致。作者还解释了为什么要把输出层解绑:vLLM 通过复制嵌入权重实现权重共享,而打包后的嵌入已经没有可复制的 .weight。
🔑 核心要点
- E2B 的两张嵌入表 embed_tokens_per_layer 占 4.375 GiB、embed_tokens 占 0.750 GiB,合计 5.1 GiB,是 T4 上模型体积的主要部分。
- QAT 已把两张表训练在与线性层相同的 4 位网格上,所以存成 int4 不会带来新的量化误差。
- 打包脚本会在遇到任何一个不在网格上的分组时直接中止,宁可失败也不写入错误权重。
- 打包后整个检查点从 6.11 GiB 降到 2.64 GiB,加载占用 2.86 GiB,KV 缓存容量从 31.6 万涨到 109.9 万 token。
- 同一张卡、同一组提示词下,512 token 请求的输出吞吐从 37.04 提升到 85.28 token/s,八个贪婪测试输出逐 token 一致。
- 打包嵌入后必须把输出层解绑:vLLM 原本靠复制嵌入权重共享输出层,而打包的嵌入没有 .weight 可复制。
💡 金句
两张表与线性层坐在同一个四位网格上,所以把它们存成 int4 不会引入新的量化误差。
👍 0
👎 0
← 返回 dev.to 首页