chrisluo5311's picture
Upload folder using huggingface_hub
fac8077 verified
|
Raw History Blame Contribute Delete
4.95 kB

LoRA Adapter 模型文件说明

📁 文件结构说明

这个文件夹包含的是 LoRA (Low-Rank Adaptation) Adapter,不是完整的合并模型。以下是各个文件的用途:

核心文件

  1. adapter_config.json

    • LoRA 配置信息
    • 包含 base model 路径、LoRA 参数(r=8, alpha=32)、target modules 等
    • 告诉 PEFT 库如何加载和应用这个 adapter
  2. adapter_model.safetensors

    • LoRA 权重文件(只有训练过的参数,非常小)
    • 包含 LoRA 的 A 和 B 矩阵权重
    • 这是实际需要加载的 adapter 权重
  3. README.md

    • 模型卡片信息
    • 包含 base model 信息:Qwen/Qwen2.5-1.5B-Instruct

Tokenizer 文件(可选,通常与 base model 相同)

  1. tokenizer.json - Tokenizer 的完整配置
  2. tokenizer_config.json - Tokenizer 配置参数
  3. vocab.json - 词汇表
  4. merges.txt - BPE merge 规则
  5. special_tokens_map.json - 特殊 token 映射
  6. added_tokens.json - 额外添加的 tokens
  7. chat_template.jinja - Chat template 模板

🔧 使用方法

方法 1:不合并(推荐)✅

优点:

  • 文件小,只保存 adapter 权重
  • 可以切换不同的 adapter
  • 可以继续训练或微调
  • 加载速度快

代码示例:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

# 1. 先加载 base model
base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    trust_remote_code=True,
    torch_dtype="auto",
    device_map="auto"
)

# 2. 加载 LoRA adapter
model = PeftModel.from_pretrained(
    base_model,
    "./1.5B_models/11/my-model/Qwen2.5-1.5B-Instruct-ROI-20260120_205341",
    is_trainable=False  # 推理时设为 False
)

# 3. 加载 tokenizer(使用 adapter 目录中的,或 base model 的)
tokenizer = AutoTokenizer.from_pretrained(
    "./1.5B_models/11/my-model/Qwen2.5-1.5B-Instruct-ROI-20260120_205341",
    trust_remote_code=True
)

在你的 notebook 中:

根据 ExamModel 类的代码,你需要这样使用:

# 方式 A:如果 ExamModel 支持自动检测 adapter
roi_model = ExamModel(
    model_name="Qwen/Qwen2.5-1.5B-Instruct",  # base model
    sft_model_path="./1.5B_models/11/my-model/Qwen2.5-1.5B-Instruct-ROI-20260120_205341",  # adapter 路径
    torch_dtype="auto",
    device_map="auto",
    trust_remote_code=True,
)

方法 2:合并 LoRA 到 Base Model

优点:

  • 使用简单,就像普通模型一样
  • 不需要 PEFT 库
  • 推理速度可能稍快(但差异很小)

缺点:

  • 文件大(需要保存完整模型权重)
  • 无法切换 adapter
  • 无法继续训练

合并代码:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

# 1. 加载 base model
base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    trust_remote_code=True,
    torch_dtype="auto",
    device_map="auto"
)

# 2. 加载 adapter
model = PeftModel.from_pretrained(
    base_model,
    "./1.5B_models/11/my-model/Qwen2.5-1.5B-Instruct-ROI-20260120_205341"
)

# 3. 合并权重
merged_model = model.merge_and_unload()

# 4. 保存合并后的模型
merged_model.save_pretrained("./merged_model")
tokenizer = AutoTokenizer.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    trust_remote_code=True
)
tokenizer.save_pretrained("./merged_model")

❓ 回答你的问题

Q: 需要合并 base model 和 LoRA 才能跑 benchmark 吗?

A: 不需要! ✅

你可以直接使用 方法 1(不合并) 来运行 benchmark。实际上:

  1. 你的 notebook 代码已经支持 adapter 加载

    • ExamModel 类有 sft_model_path 参数
    • 使用 PeftModel.from_pretrained() 加载 adapter
  2. 只需要修改加载代码:

    ft_model_dir = f"./1.5B_models/{file_num}/my-model/{model_name}"
    
    # 修改为:
    roi_model = ExamModel(
        model_name="Qwen/Qwen2.5-1.5B-Instruct",  # base model ID
        sft_model_path=ft_model_dir,  # adapter 路径
        torch_dtype="auto",
        device_map="auto",
        trust_remote_code=True,
    )
    
  3. 不合并的好处:

    • 节省磁盘空间(adapter 只有几 MB,合并后是几 GB)
    • 可以轻松切换不同的 adapter 做对比
    • 加载速度更快

🚀 快速开始

直接修改你的 notebook 第 2495 行左右的代码:

ft_model_dir = f"./1.5B_models/{file_num}/my-model/{model_name}"

# load fine-tuned ROI model (使用 adapter,不合并)
roi_model = ExamModel(
    model_name="Qwen/Qwen2.5-1.5B-Instruct",  # base model
    sft_model_path=ft_model_dir,  # LoRA adapter 路径
    torch_dtype="auto",
    device_map="auto",
    use_fast_tokenizer=True,
    trust_remote_code=True,
)

这样就可以直接运行 benchmark 了!不需要合并。