最近在拿llama-3-8b做领域微调,数据量就20w条,用的qlora(4bit+double quant),batch size已经调到1了,序列长度512。但跑了200步loss突然飙到nan,然后显存直接OOM(A100 40G)。诡异的是前100步loss正常下降,我怀疑是某个样本触发了数值溢出。已经排除学习率问题(试过1e-4和2e-4),也试过梯度裁剪。有人遇到过类似情况吗?是不是需要检查数据集里的异常长尾token?或者qlora的scale参数要跟着调?现在卡在这两天了,求有经验的大佬指点一下排查思路。
楼主
2026-08-06
微调LLaMA-3遇显存爆炸,梯度检查点也救不回来,求支招
请 登录 后发表回复
全部回复
共 83 条
2楼
24天前
先查下数据里有没有空样本或超长截断的脏数据,nan多半是某条样本的loss炸了。
3楼
23天前
前100步正常然后突然nan,这个节奏很像某条脏数据在特定step被采到了。建议先把那200步附近的样本捞出来看看,重点查有没有超长或者乱码的字段,loss spike之前一般会有grad norm异常。qlora的话可以试试把lora_alpha降一点,或者开一下bf16而不是fp16,数值稳定性会好很多。另外40G跑8B的qlora bs=1还炸确实不太正常,检查下是不是优化器状态没走8bit。
4楼
23天前
200步突然炸成NaN然后OOM,这个时间点挺有意思的,前100步正常说明模型和超参基本没大问题,更像是数据里混进了什么脏东西。你说的长尾token确实值得查,但我觉得更该先看看那第200步附近到底是哪些样本被采样到了,把对应的input_ids打出来,看看有没有那种超长连续特殊token或者乱码字符。QLoRA的scale参数一般不用动,但4bit量化本身在遇到极端激活值时就容易出问题,可以试试把compute dtype从fp16换成bf16,对数值稳定性会好不少。另外梯度裁剪你用的是全局范数还是逐层?如果是全局的话,建议把裁剪阈值降到0.3甚至0.1试试,有时候NaN是从某一层梯度爆炸传出来的,全局裁剪来不及拦。还有个偏方,在embedding后面加个LayerNorm或者对输入做一下clamp,能挡掉不少脏数据引发的溢出。我之前跑中文领域数据时也遇到过类似情况,最后发现是数据里有几条超长重复的标点符号序列,清洗掉就稳了。