完整的大模型微调代码(LLaMA 7B + LoRA)
这样你就可以成功微调 LLaMA 7B 并应用到特定领域了!以下是完整的 Python 代码,包括。如果有多个 GPU,可使用。
·
完整的大模型微调代码(LLaMA 7B + LoRA)
1. 运行前的准备
在运行微调代码之前,需要完成以下操作:
1.1 硬件要求
- 最低配置:16GB 显存的 GPU(如 RTX 3090)
- 推荐配置:A100 80GB 或以上(更快的训练速度)
- 环境:Linux / Windows(推荐使用 WSL)
1.2 安装 CUDA(如果未安装)
如果你使用的是 NVIDIA GPU,需要安装 CUDA 以支持 GPU 计算:
# 确保你安装了合适的 NVIDIA 驱动(版本 >= 525)
# Ubuntu 上安装 CUDA:
sudo apt update
sudo apt install -y nvidia-cuda-toolkit
1.3 创建 Python 虚拟环境
推荐使用 venv
或 conda
创建隔离环境:
# 创建虚拟环境(可选)
python3 -m venv llama_finetune_env
source llama_finetune_env/bin/activate # Linux/Mac
# Windows (PowerShell)
# llama_finetune_env\Scripts\Activate
1.4 安装依赖库
pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8
pip install transformers peft datasets accelerate bitsandbytes
1.5 下载大模型
由于 Hugging Face 需要授权下载部分模型,建议先登录:
huggingface-cli login
然后,手动下载 LLaMA-7B 或其他你需要的模型:
git clone https://huggingface.co/meta-llama/Llama-7b
2. 准备数据集
数据格式(JSONL 格式,每行一个训练样本):
{"prompt": "如何提高网站的SEO优化?", "completion": "优化关键词,提升外链,改善加载速度。"}
{"prompt": "如何配置Nginx反向代理?", "completion": "使用 `proxy_pass` 指令,例如 `proxy_pass http://backend_server;`"}
数据集保存路径:data.jsonl
如果你没有数据集,可以使用 Hugging Face 的开源数据集:
from datasets import load_dataset
# 下载 NLP 数据集(如 instruction-tuning 数据集)
dataset = load_dataset("databricks/databricks-dolly-15k")
# 将其转换为 JSONL 格式
dataset["train"].to_json("data.jsonl")
3. 完整的可执行代码
以下是完整的 Python 代码,包括 加载模型、LoRA 训练、数据格式化、训练过程、保存模型、推理调用。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
# 1. 选择 LLaMA 预训练模型
model_name = "meta-llama/Llama-7b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 加载 LLaMA 7B 模型并启用 8-bit 量化以节省显存
model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_8bit=True, # 启用 8-bit 量化(减少显存占用)
torch_dtype=torch.float16, # 选择 16-bit 计算
device_map="auto" # 自动分配 GPU 设备
)
# 3. 配置 LoRA 适配器
config = LoraConfig(
r=8, # LoRA 降维参数(r 越大,训练参数越多)
lora_alpha=16, # 适配层的学习率因子
lora_dropout=0.1, # Dropout 防止过拟合
bias="none",
task_type="CAUSAL_LM" # 适用于自回归模型(如 GPT)
)
# 4. 应用 LoRA 适配器到模型
model = get_peft_model(model, config)
# 5. 加载 JSONL 格式数据集
dataset = load_dataset("json", data_files={"train": "data.jsonl"})
# 6. 数据预处理
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)
# 7. 训练参数设置
training_args = TrainingArguments(
per_device_train_batch_size=2, # 每个 GPU 的批量大小
gradient_accumulation_steps=4, # 梯度累计,减少显存需求
warmup_steps=50, # 预热步数
max_steps=1000, # 训练总步数
learning_rate=5e-5, # 学习率
save_steps=500, # 每 500 步保存一次模型
output_dir="./fine-tuned-model", # 训练结果存放目录
fp16=True, # 使用半精度训练,加速训练
logging_steps=50 # 每 50 步打印日志
)
# 8. 训练模型
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"]
)
trainer.train()
# 9. 保存训练后的模型
model.save_pretrained("./fine-tuned-model")
tokenizer.save_pretrained("./fine-tuned-model")
print("训练完成,模型已保存至 './fine-tuned-model'")
# 10. 加载训练好的模型进行推理
def generate_response(prompt):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=100)
return tokenizer.decode(output[0], skip_special_tokens=True)
# 11. 测试模型
test_prompt = "如何优化 Python 代码?"
print("测试输入:", test_prompt)
print("模型输出:", generate_response(test_prompt))
4. 运行训练
在终端执行:
python fine_tune_llama.py
如果有多个 GPU,可使用 accelerate
进行分布式训练:
accelerate launch fine_tune_llama.py
5. 训练后模型的使用
5.1 直接调用
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 chat(prompt):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=100)
return tokenizer.decode(output[0], skip_special_tokens=True)
print(chat("如何提升网站访问速度?"))
6. 总结
微调流程
- 安装环境 & 下载模型
- 准备数据集(JSONL 格式)
- 使用 LoRA 适配器微调 LLaMA 7B
- 运行训练
- 保存并测试微调后的模型
- 部署至 API 或本地调用
推荐优化
- 使用 DeepSpeed 训练 以支持更大模型
- 使用 FP8 量化 进一步减少 GPU 占用
- 结合 vLLM 进行高效推理
这样你就可以成功微调 LLaMA 7B 并应用到特定领域了! 🚀
更多推荐
所有评论(0)