You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

T5模型设置generation_max_length为30报错,无法生成长句求助

解决T5模型生成长度受限及IndexError问题

问题场景

使用T5-base模型进行英德翻译任务时,设置generation_max_length=30会触发IndexError: piece id is out of range错误,且生成结果维度固定为(461, 20);将generation_max_length改为20时错误消失,但无法满足生成长文本的需求。

错误原因分析

从报错栈来看,问题出在tokenizer.batch_decode阶段,部分生成的token ID超出了T5词表的有效范围。结合生成结果始终为20长度的现象,核心原因包括:

  • DataCollatorForSeq2Seq初始化时传入字符串形式的checkpoint而非模型实例,导致数据处理时无法正确识别模型的pad token等关键参数,生成过程中出现无效ID。
  • 生成参数未正确传递,导致实际生成长度被限制为默认值20,且无效ID未被过滤,解码时触发索引越界。

解决方案

1. 修正DataCollatorForSeq2Seq初始化

将DataCollatorForSeq2Seq的model参数改为加载好的模型实例,确保数据处理时能正确适配模型特性:

# 原代码
# data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)
# 修改后
data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model)

2. 显式指定预测阶段的生成参数

在调用trainer.predict时直接传入生成参数,确保覆盖默认设置:

pred_result = trainer.predict(tokenized_books["test"], generation_max_length=128)

3. 在解码前过滤无效token ID

修改compute_metrics函数,先过滤掉超出词表范围的无效ID,再进行解码操作:

def compute_metrics(eval_preds):
    preds, labels = eval_preds
    if isinstance(preds, tuple):
        preds = preds[0]
    
    # 过滤无效token ID,替换为pad token ID
    vocab_size = tokenizer.vocab_size
    preds = np.where(preds < vocab_size, preds, tokenizer.pad_token_id)
    
    decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)

    labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
    decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)

    decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)

    result = metric.compute(predictions=decoded_preds, references=decoded_labels)
    result = {"bleu": result["score"]}

    prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]
    result["gen_len"] = np.mean(prediction_lens)
    result = {k: round(v, 4) for k, v in result.items()}
    return result

4. 验证训练参数配置

若需要长期生效,可直接修改训练参数中的生成长度设置:

training_args = Seq2SeqTrainingArguments(
    output_dir="my__model",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    weight_decay=0.01,
    save_total_limit=3,
    num_train_epochs=1,
    predict_with_generate=True,
    fp16=True,
    push_to_hub=False,
    report_to="none",
    generation_max_length=128  # 设置为需要的最大生成长度
)

内容的提问来源于stack exchange,提问作者HIKARI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:17:32