微调

248 阅读3分钟

一、如何微调

  1. 数据准备

    • 收集高质量、领域相关的标注数据(如问答对、指令、对话等)。
    • 清洗格式,确保数据适合大模型输入。
  2. 选择预训练模型

    • 选择适合的开源/商业基础模型(如 Qwen、DeepSeek、Llama 等)。
  3. 配置微调参数

    • 设置微调任务(SFT、LoRA、全参微调等),指定学习率、batch size、训练轮数等。
  4. 启动训练

    • 使用工具如 Transformers、DeepSpeed、Unsloth、阿里云PAI等,加载数据与模型,分布式训练或单机训练。
  5. 评估与测试

    • 用验证集评估微调后的模型效果,必要时继续微调或调整参数。
  6. 部署上线

    • 导出模型,部署至线上或本地环境,结合推理服务API供业务调用。

二、微调成本 vs 预训练成本

  • 预训练成本极高

    • 需要PB级别的语料、数百到千张A100 GPU、持续数周到数月运算。
    • 以Llama2-70B为例,预训练成本超百万美金,个人/中小企业难以承担。
  • 微调成本较低

    • 通常只需几十到几百张标注数据,部分百GB以内显存即可。
    • 例如LoRA参数微调,单张A100显卡几小时即可完成,成本几百到几千元。
    • 全参微调成本略高但远低于预训练,适合企业/团队定制。
  • 结论:

    • 微调是“在巨人肩膀上做定制”,性价比极高,适合绝大多数企业和开发者。
    • 预训练适合大厂或有极高算力、数据资源的科研机构。

**

二、微调示例

下面是一个使用 HuggingFace Transformers + LoRA 微调大模型的简单 Python 示例流程,适合新手快速上手:**

rom transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments from peft import LoraConfig, get_peft_model

1. 加载预训练模型和分词器

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-1.8B") tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-1.8B")

2. 配置LoRA微调

lora_config = LoraConfig( r=8, # LoRA秩,影响训练参数量 lora_alpha=32, # LoRA缩放因子 target_modules=["q_proj", "v_proj"], # 指定注入LoRA的层 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config)

3. 准备微调数据(举例,格式为prompt和response)

train_data = [ {"input_ids": tokenizer.encode("问题:如何微调大模型?", return_tensors="pt")[0], "labels": tokenizer.encode("回答:可以用LoRA等方法微调。", return_tensors="pt")[0]} ]

4. 设置训练参数

training_args = TrainingArguments( per_device_train_batch_size=2, num_train_epochs=1, output_dir="./output", logging_steps=10, save_steps=20, save_total_limit=2, learning_rate=2e-4 )

5. Trainer微调

trainer = Trainer( model=model, args=training_args, train_dataset=train_data ) trainer.train()

6. 保存微调后的模型

model.save_pretrained("./output_lora") tokenizer.save_pretrained("./output_lora")

说明:

  • 仅需几条标注数据和一张显卡就能完成微调。
  • LoRA方法无需修改原始模型参数,适合高效低成本场景。
  • 真实业务微调时,建议准备更多高质量标注数据,并调优参数。

三、加载微调后模型

加载微调后的模型

LoRA微调不会修改原始大模型参数,而是“新增一组LoRA参数(适配器权重)”,这些参数量远小于原模型,仅在指定层注入。

新参数生成与加载机制如下:

  1. 微调后模型保存:

    • 使用 model.save_pretrained("./output_lora") 会保存 LoRA 适配器权重(一般为 adapter_model.bin 或类似文件),同时保存分词器。
  2. 加载微调参数(推理/部署时)

    • 首先加载原始预训练模型,然后加载LoRA权重,融合后即可推理。
    • 示例代码如下:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

# 加载原始模型和分词器
base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-1.8B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-1.8B")

# 加载LoRA适配器权重
lora_model = PeftModel.from_pretrained(base_model, "./output_lora")
# 现在 lora_model 就具备了微调后的能力

# 推理示例
input_ids = tokenizer.encode("问题:如何微调大模型?", return_tensors="pt")
output = lora_model.generate(input_ids)
print(tokenizer.decode(output[0], skip_special_tokens=True))

总结要点:

  • LoRA参数是“增量权重”,与原始模型分离存储,按需加载。
  • 推理时需加载“原始模型+LoRA权重”组合。
  • 这样既保护了原始模型,又保证微调灵活性和低成本部署。