这个坑值得记一笔。跑 MMLU 得到二十多分,明显低于该模型公开成绩,抽样看输出发现模型没有按选项格式回答。
刚开始盯着「批大小过大导致填充影响生成」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。few-shot 数量设为 0,模型不知道要输出选项;提示模板与模型训练格式不匹配;评测的分词器版本与训练时不一致。
上来先按标准设置五个示例重跑
lm_eval --model hf --model_args pretrained=./model --tasks mmlu --num_fewshot 5
接着抽样打印几条原始输出看格式
python -c "print(samples[:2])"
缩小批大小排除填充影响
lm_eval --model hf --model_args pretrained=./model --tasks mmlu --batch_size 1
剩下的就是确认分词器与模型目录一致
python -c "print(tokenizer.vocab_size)")
同事提醒我看一下最近一次发布,时间点确实对得上。
改完先别撤,确认这几项。分数回到与该模型公开结果接近的区间,输出基本都落在选项字母上。
few-shot 的示例是拼在提示里的,会占用上下文长度,长上下文模型和小窗口模型要用不同的示例数量。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。