一、如何微调
-
数据准备
- 收集高质量、领域相关的标注数据(如问答对、指令、对话等)。
- 清洗格式,确保数据适合大模型输入。
-
选择预训练模型
- 选择适合的开源/商业基础模型(如 Qwen、DeepSeek、Llama 等)。
-
配置微调参数
- 设置微调任务(SFT、LoRA、全参微调等),指定学习率、batch size、训练轮数等。
-
启动训练
- 使用工具如 Transformers、DeepSpeed、Unsloth、阿里云PAI等,加载数据与模型,分布式训练或单机训练。
-
评估与测试
- 用验证集评估微调后的模型效果,必要时继续微调或调整参数。
-
部署上线
- 导出模型,部署至线上或本地环境,结合推理服务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参数(适配器权重)”,这些参数量远小于原模型,仅在指定层注入。
新参数生成与加载机制如下:
-
微调后模型保存:
- 使用
model.save_pretrained("./output_lora")会保存 LoRA 适配器权重(一般为adapter_model.bin或类似文件),同时保存分词器。
- 使用
-
加载微调参数(推理/部署时)
- 首先加载原始预训练模型,然后加载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权重”组合。
- 这样既保护了原始模型,又保证微调灵活性和低成本部署。