大语言模型LLaMA, ChatGLM, BLOOM 的
第一次微调大模型,我差点把机器砸了
去年,我信心满满地搞来原版LLaMA-7B,想在中文指令上练练手。
结果你猜怎么着?模型生出来的句子,连我自己都看不懂!
“男儿何不带吴钩”——它给我拆成了四五个乱码token,读起来像外星文。
我盯着屏幕愣了三秒,心里只有一个字:靠!
后来我才知道,LLaMA的词表才32k,基本上就服务拉丁字母语言的。中文一个字它能拆成火车那么长,不乱码才怪。
那一刻我明白了:选基座模型,第一个坑就等着你跳。
所以今天,我就把这些踩过的坑、翻过的车,一个一个摊开讲给你听。
不绕弯子,直接上实操——顺便吐吐槽。
你肯定也在纠结这几个问题
1. LLaMA、ChatGLM、BLOOM……搞中文到底选哪个?
2. 全量微调跟高效微调,哪个更容易把人搞疯?
3. LoRA、prompt tuning、prefix tuning……一大堆方法,实战到底用哪个?
别急,下面每一节都有我的实测数据和血泪教训。
选基座?第一个坑就是LLaMA
说到基座模型,当初全网都在吹LLaMA,我也跟风上了。
结果中文输出像加密电报,气得我差点换行当。
后来换了Chinese LLaMA,人家扩了词表,同一个“男儿何不带吴钩”,token从24个直接干到14个。
差距肉眼可见,懂的自然懂。
所以我的建议很简单:
纯中文任务?ChatGLM-6B上手就顺,词表130k,天生中英文混训,出来的回复像正常人说的。
BLOOM词表250k,但中文效果一般,算是折中选择。
原版LLaMA?不扩词表直接放弃。
但如果你搞英文或者跨语言迁移,BLOOM的多语言能力绝对香。
说到结构,ChatGLM是Prefix Decoder,输入双向注意力,输出单向;
LLaMA和BLOOM是纯Causal Decoder。
这俩生成行为不一样,咱们后面还会扯到。
全量微调?你以为牛,其实容易崩
我之前也不信邪:什么参数高效微调,花里胡哨,哪有全量微调来得猛?
于是拿ChatGLM-6B在2万条中文指令上跑了10个epoch。
结果呢?训练损失降得漂亮,一路阶梯式下滑,我差点高兴得跳起来。
可验证损失从第3个epoch就开始反弹,第5个epoch测生成效果——
模型把训练集里的格式错误全背下来了,还吐出了一堆特殊符号。
那一刻我懂了:这叫过拟合,而且翻车翻得明明白白。
后来换成LoRA和prefix tuning,只调新增参数,预训练权重冻住。
验证损失和训练损失几乎重合,再也不跳了。
你看,全量微调除非数据量百万级且分布差异巨大,否则分分钟崩溃。
现在我标配LoRA——不改原模型参数,换任务直接换权重,方便到哭。
高效微调方法,我一个一个测给你看
LoRA:稳得像老狗
我用PEFT库搞LoRA,三个基座模型都跑过。
配置简单:r=8,alpha=16,target modules加Q和V。
显存消耗比全量降了很多——7B模型全量微调,光模型权重就14GB,加上梯度和优化器,单张12GB卡根本塞不下。LoRA就能在我的3080Ti 12GB上跑起来。
效果呢?生成流畅度吊打我自己瞎写的LLaMA-adapter。
一句话:闭眼选LoRA,基本不出错。
Prompt Tuning和Prefix Tuning:看模型脸色
我在LLaMA上试prompt tuning,句子死活不通顺,经常卡住。
Prefix Tuning好一点,但也一般。
可换到BLOOM上,两个方法都活了,而且prefix tuning更香。
ChatGLM-6B上也能用,但有个毛病——回答偏短,你加“请详细回答”它还是三句话完事。
所以结论来了:图省事、通用性强,直接上LoRA;
如果模型原生支持某种prefix(比如BLOOM的ALiBi对prefix tuning友好),也可以试,但得花时间调参数。
词表扩展,别踩错节奏
Chinese LLaMA扩词表后,微调效果飞升。
但训练策略有讲究:第一阶段只训新embedding,冻结所有transformer层;第二阶段用LoRA训embedding和adapter。
我照做后,模型中文能力上了一台阶,英文能力还没掉。
你说这坑踩得值不值?
工具链里的坑,我帮你填了几个
现在有PEFT库和LLaMA-Factory,确实方便了。
前期我手写adapter代码,调shape调到秃头。后来直接上PEFT(0.5.0),一行代码拆装LoRA权重。
LLaMA-Factory也用了,支持500多种模型,YAML写配置,命令行跑。
但注意版本兼容!有一次我升级transformers到4.37,旧版LLaMA-Factory立刻罢工,排查了半天才找到原因。
而且它对自定义数据集格式要求严格,建议先用自带数据集跑通流程,再换自己的。
还有几个你可能没想过的问题
数据量要多大才管用?
我觉得高质量指令数据1万条以上就见效。LIMA论文说“Less is More”,我亲自试过:5000条精挑细选的数据,效果比2万条凑数的好太多。
学习率怎么调?
全量微调一般2e-5,LoRA从1e-4起步,预热后线性衰减。
不同模型最优值差别大,建议先跑几个小实验探路。
训练时间感受一下
LLaMA-7B用LoRA,batch size=8,序列长度512,单张3080Ti 12GB跑1个epoch约2小时。
全量微调同样配置显存直接爆,得梯度累积加更小batch size,时间翻倍。
位置编码的影响
RoPE(LLaMA/ChatGLM)微调后外推性好,ALiBi(BLOOM)在长序列上效率高。
哪个更好?看你的场景——没有绝对。
最后,给你一句能截屏带走的话
大模型虐我千百遍,我待微调如初恋。
坑踩完了,剩下的全是爽!
现在,你上手吧。
要是也碰到什么奇奇怪怪的坑,别客气,来找我聊聊——
反正,咱们都是一路被模型虐过来的朋友。
读者评论 4