5步教你用Hugging Face微调开源大模型

5步教你用Hugging Face微调开源大模型
5步教你用Hugging Face微调开源大模型

1. 环境准备与依赖安装

微调前需要搭建一个干净且高效的Python环境。推荐使用Python 3.10+和PyTorch 2.0以上版本。核心依赖包括:

  • transformers:加载模型与分词器
  • datasets:处理数据集
  • peft:实现参数高效微调(如LoRA)
  • accelerate:简化多GPU/TPU训练
  • bitsandbytes:4bit/8bit量化加载
pip install torch transformers datasets accelerate peft bitsandbytes

建议使用虚拟环境或Docker确保依赖隔离。如果使用GPU,需提前安装对应版本的CUDA和cuDNN。

2. 数据集加载与预处理

选择一个与下游任务匹配的标注数据集。例如,指令微调常用Alpaca、ShareGPT等格式。这里以Hugging Face Datasets库加载一个示例数据集:

from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned")
print(dataset["train"][0])

数据预处理需要将文本转化为模型可接受的格式。对于LLaMA、ChatGLM等模型,通常需要构建包含系统提示、用户输入和模型回答的多轮对话模板。一个典型的预处理函数如下:

def preprocess_function(examples):
    instructions = examples["instruction"]
    inputs = examples["input"]
    outputs = examples["output"]
    texts = []
    for inst, inp, out in zip(instructions, inputs, outputs):
        if inp:
            text = f"### Instruction:n{inst}nn### Input:n{inp}nn### Response:n{out}"
        else:
            text = f"### Instruction:n{inst}nn### Response:n{out}"
        texts.append(text)
    return {"text": texts}

处理完成后,使用分词器将文本tokenize,并设置最大长度(如512或1024)截断或填充。

3. 加载预训练模型与分词器

选择开源基座模型,如Qwen2.5-7BLlama-3-8BMistral-7B。为了在消费级GPU上运行,建议使用4bit量化加载:

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch
model_name = "Qwen/Qwen2.5-7B-Instruct"
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True
)
tokenizer.pad_token = tokenizer.eos_token  # 部分模型需要设置pad_token

注意:不同模型的Tokenizer细节略有差异,务必阅读官方文档。如果是中文模型,可优先选择Qwen、Baichuan等。

4. 配置LoRA微调参数并启动训练

全参数微调显存开销巨大,推荐使用LoRA(Low-Rank Adaptation)方法。借助peft库,只需在目标层注入低秩矩阵:

from peft import LoraConfig, get_peft_model, TaskType
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model, lora_config)

训练参数配置使用TrainingArgumentsTrainer

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
    output_dir="./qwen-lora",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    num_train_epochs=3,
    learning_rate=2e-4,
    fp16=True,
    logging_steps=10,
    save_steps=200,
    save_total_limit=2,
    remove_unused_columns=False,
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset["train"],
    data_collator=DataCollatorForSeq2Seq(tokenizer, padding=True),
)
trainer.train()

如果显存不足,可减小batch size、使用梯度累积或开启deepspeed stage 2/3。训练过程中建议观察loss曲线,避免过拟合。

5. 模型评估、保存与部署

训练完成后,先保存LoRA权重:

model.save_pretrained("./qwen-lora-final")
tokenizer.save_pretrained("./qwen-lora-final")

也可以合并权重到基座模型(用于后续推理加速):

merged_model = model.merge_and_unload()
merged_model.save_pretrained("./qwen-lora-merged")

评估阶段可使用验证集计算困惑度(perplexity)或人工测试对话质量。对于开源大模型,常用lm-evaluation-harness在标准benchmark上评测。最后将模型上传到Hugging Face Hub或部署为API服务(如使用FastAPI + vLLM/TGI)。

完整微调脚本示例已整理在GitHub仓库(链接见文末),欢迎Star学习。

通过以上5步,你已经掌握了Hugging Face生态下微调开源大模型的标准流程。关键点在于:量化加载以降低显存、LoRA实现高效微调、以及正确的数据预处理。继续实践不同基座模型和数据集,积累调参经验,就能根据业务场景快速定制专属大模型。

阅读剩余
THE END