在本指南中,我们将介绍如何使用 Python 来微调大语言模型(LLM),以实现特定领域的优化。整个流程包括:
微调模型的质量取决于数据的质量,特定领域模型需要高质量的数据集,常见的数据整理要求如下:
{ "prompt": "...", "completion": "..." }
示例 JSON 数据格式:
[
{
"prompt": "如何提高网站的SEO优化?",
"completion": "要提高SEO优化,您可以优化网站的关键词、使用高质量的内容、增加外链和提升网站速度。"
},
{
"prompt": "如何配置Nginx反向代理?",
"completion": "使用 `proxy_pass` 指令,例如 `proxy_pass http://backend_server;`"
}
]
微调 LLM 的常见方法:
prompt-response
结构进行微调,适用于增强对话能力推荐:LoRA + 指令微调
微调 LLM 需要强大的计算资源,不同模型的推荐配置如下:
模型 | 规模 (参数量) | 推荐 GPU | 训练时间 |
---|---|---|---|
GPT-2 | 1.5B | RTX 3090 (24GB) | 2~4 小时 |
LLaMA-7B | 7B | A100 (80GB) x 1 | 8~24 小时 |
LLaMA-13B | 13B | A100 (80GB) x 2 | 24~48 小时 |
DeepSeek-67B | 67B | A100 (80GB) x 8 | 3~7 天 |
最低硬件要求:
pip install transformers peft datasets accelerate bitsandbytes
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
# 选择基座模型
model_name = "meta-llama/Llama-7b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, load_in_8bit=True)
# 设置 LoRA 参数
config = LoraConfig(
r=8, # 降维参数
lora_alpha=16,
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
from datasets import load_dataset
# 加载 JSONL 数据
dataset = load_dataset("json", data_files={"train": "data.jsonl"})
# 处理数据
def format_data(sample):
return {
"input_ids": tokenizer(sample["prompt"], truncation=True, padding="max_length")["input_ids"],
"labels": tokenizer(sample["completion"], truncation=True, padding="max_length")["input_ids"]
}
dataset = dataset.map(format_data)
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=50,
max_steps=1000,
learning_rate=5e-5,
save_steps=500,
output_dir="./fine-tuned-model",
fp16=True # 开启半精度训练
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"]
)
trainer.train()
model.save_pretrained("./fine-tuned-model")
tokenizer.save_pretrained("./fine-tuned-model")
from transformers import AutoModelForCausalLM, AutoTokenizer
fine_tuned_model_path = "./fine-tuned-model"
model = AutoModelForCausalLM.from_pretrained(fine_tuned_model_path)
tokenizer = AutoTokenizer.from_pretrained(fine_tuned_model_path)
def generate_response(prompt):
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=100)
return tokenizer.decode(output[0], skip_special_tokens=True)
print(generate_response("如何提高网站性能?"))
如果是 商业应用,建议:
这样,你就可以成功微调并部署一个适用于特定领域的大模型了!