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

Dolly-v2-7b模型Prompt调优训练推理异常及流程正确性问询

Dolly-v2-7b Prompt调优问题排查与解决方案

核心问题原因

  1. 无adapter_config.json+模型体积过大
    • 直接调用Trainer的save_model()会保存完整预训练模型权重,而非PEFT Prompt Tuning的轻量adapter。PEFT adapter仅包含少量可训练参数(通常几MB),必须使用PEFT模型专属的保存方法。
  2. 推理耗时久+输出乱码
    • 加载了完整大模型而非「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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:52:48