SFT LoRA 微调时训练 embed_tokens + lm_head 对速度的影响 embedding 对 ChatGLM / Qwen / Baichuan 对生成质量影响巨大
SFT LoRA 微调时训练 embed_tokens lm_head 对速度的影响结论会影响速度会变慢但幅度通常可控不是断崖式下跌我给你用最直白、最落地的方式讲清楚为什么变慢、慢多少、怎么影响、要不要开。1. 先搞清楚这两个层是什么LoRA 原本只训练transformer 块里的 Q/K/V/O 投影层不碰模型头尾embed_tokens词嵌入层把 token ID 转成向量lm_head语言模型头把向量转回 token 概率和 embedding 层权重通常共享这两个层不在 LoRA 默认训练范围里属于全量参数训练不是 LoRA 小矩阵。2. 为什么会变慢核心原因开启additional_target: embed_tokens,lm_head后① 参与训练的参数量突然变多LoRA 通常只训练0.1%~1%参数加上这两层后训练参数会变成LoRA 参数 词表大小 × 隐藏层维度几十万~几亿参数比如 7B 模型vocab_size 32000hidden_size 4096embed_tokens lm_head ≈2.5 亿参数比 LoRA 本身大几十~几百倍。② 计算量 显存占用上升前向传播多算 embedding lm_head反向传播全量梯度回传不是 LoRA 低秩优化器状态AdamW也要存这两层的参数 →显存变高显存紧张 → batch size 被迫减小 →速度进一步下降3. 实际速度下降多少真实场景我给你一个工业界实测区间7B/13B 模型单卡/多卡 Lora 训练只训练 LoRA默认速度100%显存低LoRA embed_tokens lm_head速度通常下降15% ~ 40%显存上升20%~60%影响大小取决于词表大小越大越慢显卡显存大小显存越小越容易爆越慢batch size / sequence length典型表现原本每秒 3-5 iter → 变成 2-3.5 iter4. 为什么大家还是会打开它非常重要虽然变慢但必须打开的场景✅ 你新增了词表 / 中文词表扩充embed_tokens 维度变了不训练就完全不生效✅ 你做领域微调医学/法律/代码lm_head 是输出层不训练会导致生成效果差✅ 你用的是 ChatGLM / Qwen / Baichuan 这类中文模型这些模型 embedding 和 lm_head 对生成质量影响巨大5. 能不能只开一个可以而且推荐这样做能提速很多方案 A最常用、速度最快additional_target: lm_head只训练输出层不训练 embedding速度下降15%效果几乎一样方案 B必须扩充词表才用additional_target: embed_tokens,lm_head6. 如何减少速度影响实用优化如果你必须训练这两层可以这样提速不要用太高的学习率这两层收敛很快LoRA rank 不要太大8/16 足够使用bf16 / fp16使用gradient checkpointing不要开太高 batch size最终总结最关键训练 embed_tokens lm_head 一定会变慢幅度 15%~40%慢的原因是参数量暴增、显存变高大多数场景只需要训练 lm_head 就够了速度影响很小只有扩充词表时才需要同时开两个需要我帮你根据你的模型7B/13B/34B 显卡4090/A10/A100给出最优配置吗我可以直接给你能复制的 LoRA 最佳参数。