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

使用AutoPeftModelForCausalLM加载微调后Llama3报错:无max_seq_length属性

问题解决:AutoPeftModel加载Unsloth微调Llama3后流式生成报错max_seq_length缺失

问题根源

Unsloth微调后的Llama3模型,通过AutoPeftModelForCausalLM加载后,基础LlamaForCausalLM实例未携带max_seq_length属性,但TextStreamer在流式生成过程中会尝试访问该属性,导致报错。

解决方案

方法1:手动为模型添加max_seq_length属性

加载模型后,直接设置该属性值(使用你训练时指定的序列长度,比如常见的4096):

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer

model = AutoPeftModelForCausalLM.from_pretrained(
    "text_To_NoSql",
    load_in_4bit=True,
)
# 替换为你训练时使用的序列长度,例如4096
model.max_seq_length = 4096
tokenizer = AutoTokenizer.from_pretrained("text_To_NoSql")

方法2:生成时显式传递max_length参数

在generate方法中指定max_length,避免TextStreamer依赖模型的max_seq_length属性:

input_ids = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt",
).to("cuda")

from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer, skip_prompt=True)
_ = model.generate(
    input_ids,
    streamer=text_streamer,
    max_new_tokens=128,
    pad_token_id=tokenizer.eos_token_id,
    # 输入序列长度 + 新生成长度
    max_length=input_ids.shape[1] + 128
)

方法3:自定义Streamer跳过属性依赖

继承TextStreamer重写相关方法,移除对max_seq_length的依赖:

from transformers import TextStreamer

class CustomTextStreamer(TextStreamer):
    def __init__(self, tokenizer, skip_prompt=True, **kwargs):
        super().__init__(tokenizer, skip_prompt=skip_prompt, **kwargs)
    
    def on_finalized_text(self, text: str, stream_end: bool = False):
        print(text, end="" if stream_end else "\n", flush=True)

# 使用自定义流式生成器
text_streamer = CustomTextStreamer(tokenizer, skip_prompt=True)
_ = model.generate(input_ids, streamer=text_streamer, max_new_tokens=128, pad_token_id=tokenizer.eos_token_id)

内容的提问来源于stack exchange,提问作者Sarra Ben Messaoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:12:32