问题出现得很突然,日志倒是留得挺全。批量编码时不断打印 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

改完先别撤,确认这几项。警告消失,输入长度都在上限内,模型不再丢内容,训练与推理结果一致。

这个警告只提示不中断,超出部分会被直接截掉,长文档问答出错时先确认是不是内容根本没送进去。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189