最近在试着用QLoRA微调Llama3-8B做一个法律问答的垂直领域模型,数据集大概2万条自己清洗的问答对。用的transformers和peft库,照着网上教程抄的配置,学习率设了2e-4,lora_r=8,跑了3个epoch。训练loss降得挺正常,从1.8降到0.9,但推理的时候输出完全不对,经常出现重复的token和类似“|||||”这样的乱码,偶尔能蹦出几个正常词但句子结构全崩。试过调低学习率到1e-5,也换过lora的target_modules,问题依旧。有点怀疑是不是分词器没加padding或者special token设置的问题,但训练时也没报错,loss看着也正常。有没有大佬遇到过类似情况?是微调参数的问题还是数据格式哪里踩坑了?求指点一下排查方向,谢谢!
微调Llama3后输出全是乱码,是学习率问题还是分词器没设对?
全部回复
共 4 条loss正常但生成崩了这种情况,我猜大概率不是学习率的问题,你调到1e-5还崩就说明方向不对。分词器没加padding确实会导致batch内长度不一致,但更常见的是你推理时忘了把special token加回去,或者model.generate里没设pad_token_id。我之前遇到类似情况是lora没只冻住原模型权重,结果把embedding也训了,输出全是拼接符,你检查下target_modules里有没有误加embedding层。另外你试试推理时用model.config里的pad_token_id手动传一下,或者干脆把tokenizer的padding_side改成left,有时候这比调超参数管用。
loss降但推理崩,大概率不是学习率的问题,2e-4对QLoRA其实挺常见的。我比较怀疑你训练和推理时的chat template没对齐,Llama3有自己的一套special token格式,如果训练时手动拼的prompt跟tokenizer.apply_chat_template不一致,模型学到的就是错位的模式。另外检查下推理时有没有重复加载adapter或者merge方式不对,这种情况也会吐出乱码。建议先用训练集里的一条样本原样跑一遍推理,能复现问题就好排查了。
loss降但输出乱码,八成不是学习率的事,更像是训练和推理的模板没对齐。Llama3有自己的chat template,你训练时如果手动拼的prompt跟推理时用的不一致,模型就等于在答另一道题。另外QLoRA合并权重那步也容易踩坑,adapter没正确merge或者推理时又套了一层lora,都会出这种重复加乱码。建议先把训练样本原样喂进去做一次推理,能复现就基本锁定是格式问题而不是超参。
loss降不代表模型学对了,你这情况大概率是训练时用了padding但推理时没对齐,或者chat template没套对。Llama3的special token和对话格式挺敏感的,QLoRA微调时如果padding side或者attention mask没处理好,模型就会学到一堆无效token。建议先拿训练集里的一条样本直接推理,看输出是不是也乱,如果是那就是数据格式或模板的问题。另外2e-4对LoRA来说偏大,但既然loss降了,先别急着调参,把推理时的tokenizer配置和训练时打印出来对比一下。