使用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
相关产品推荐
相关产品推荐

