问题出现得很突然,日志倒是留得挺全。批量编码时不断打印 Token indices sequence length is longer than the specified maximum sequence length,训练照常进行。
刚开始盯着「长文本被整段送入,超出部分会被静默丢弃」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。编码时没有开启截断,长度超出模型上限。少数情况下是模型的 max_length 配置与实际不符。
少数情况下是批次内长度差异大,触发了多次警告。
编码时显式开启截断
batch = tokenizer(texts, truncation=True, max_length=2048, padding=True)
然后确认模型的真实最大长度
python -c "print(tokenizer.model_max_length)"
再往下统计被截断的样本比例
python -c "print(sum(len(t)>2048 for t in texts), len(texts))"
等前面都确认过,再对必须保留的长文本先切分
python split_long.py --max-tokens 1800 --input data.jsonl
改完先别撤,确认这几项。警告消失,输入长度都在上限内,模型不再丢内容,训练与推理结果一致。
这个警告只提示不中断,超出部分会被直接截掉,长文档问答出错时先确认是不是内容根本没送进去。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。