Dolly-v2-7b模型Prompt调优训练推理异常及流程正确性问询
Dolly-v2-7b Prompt调优问题排查与解决方案
核心问题原因
- 无
adapter_config.json+模型体积过大- 直接调用Trainer的
save_model()会保存完整预训练模型权重,而非PEFT Prompt Tuning的轻量adapter。PEFT adapter仅包含少量可训练参数(通常几MB),必须使用PEFT模型专属的保存方法。
- 直接调用Trainer的
- 推理耗时久+输出乱码
- 加载了完整大模型而非「base模型+adapter」组合,导致显存占用过高、推理速度骤降;
- 未正确加载PEFT adapter,模型实际使用原始预训练权重生成内容;
- Prompt格式不符合模型预期,或tokenizer未正确配置(如缺失pad_token)导致乱码。
修正后的训练、保存、加载流程
训练阶段:正确初始化PEFT模型
用get_peft_model包装base模型,明确Prompt Tuning配置:
from peft import PromptTuningConfig, TaskType, get_peft_model from transformers import AutoModelForCausalLM # 配置Prompt Tuning参数 peft_config = PromptTuningConfig( task_type=TaskType.CAUSAL_LM, prompt_tuning_init="TEXT", prompt_tuning_init_text="你是专业问答助手,需基于给定上下文回答问题,并判断问题与上下文的相关性", num_virtual_tokens=20, tokenizer_name_or_path="databricks/dolly-v2-7b" ) # 加载base模型并启用量化减少显存占用 base_model = AutoModelForCausalLM.from_pretrained( "databricks/dolly-v2-7b", load_in_4bit=True, device_map="auto" ) # 包装为PEFT模型 peft_model = get_peft_model(base_model, peft_config) peft_model.print_trainable_parameters() # 确认仅训练少量参数(通常占比<0.1%)
保存阶段:仅保存PEFT Adapter
训练完成后,使用PEFT模型的专属方法保存,避免保存完整大模型:
# 仅保存adapter权重和配置,体积仅几MB peft_model.save_pretrained("./dolly-prompt-tuned-adapter")
加载阶段:加载base模型+adapter
推理时必须先加载原始base模型,再挂载PEFT adapter:
from peft import PeftModel from transformers import AutoModelForCausalLM # 加载base模型 base_model = AutoModelForCausalLM.from_pretrained( "databricks/dolly-v2-7b", load_in_4bit=True, device_map="auto" ) # 加载PEFT adapter peft_model = PeftModel.from_pretrained(base_model, "./dolly-prompt-tuned-adapter") peft_model.eval() # 切换到推理模式
适配问答+相关性判断的Prompt模板优化
用结构化Prompt引导模型输出符合要求的内容:
def build_task_prompt(context, question): return f""" 上下文信息: {context} 请基于上述上下文完成以下任务: 1. 判断问题与上下文是否相关,输出「Relevant」或「Irrelevant」 2. 若相关,基于上下文回答问题;若不相关,回答「无相关信息」 问题:{question} 输出格式: 相关性:[Relevant/Irrelevant] 回答:[对应内容] """
推理调用示例:
from transformers import AutoTokenizer import torch tokenizer = AutoTokenizer.from_pretrained("databricks/dolly-v2-7b") tokenizer.pad_token = tokenizer.eos_token # Dolly默认无pad_token,需手动指定 prompt = build_task_prompt("北京是中国首都,地处华北平原北部", "北京位于中国哪个区域?") inputs = tokenizer(prompt, return_tensors="pt").to("cuda") with torch.inference_mode(): outputs = peft_model.generate( **inputs, max_new_tokens=200, temperature=0.7, do_sample=True ) print(tokenizer.decode(outputs[0], skip_special_tokens=True))
额外优化建议
- 始终启用4bit/8bit量化(如代码中
load_in_4bit=True),大幅降低显存占用,提升推理速度; - 推理时使用
torch.inference_mode()替代torch.no_grad(),进一步优化性能; - 训练时设置Trainer的
save_strategy="no",避免自动保存完整模型,仅在训练结束后手动保存adapter。
内容的提问来源于stack exchange,提问作者MAC
相关产品推荐
相关产品推荐

