完整的大模型微调代码(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 虚拟环境

推荐使用 venvconda 创建隔离环境:

# 创建虚拟环境(可选)
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. 总结

微调流程

  1. 安装环境 & 下载模型
  2. 准备数据集(JSONL 格式)
  3. 使用 LoRA 适配器微调 LLaMA 7B
  4. 运行训练
  5. 保存并测试微调后的模型
  6. 部署至 API 或本地调用

推荐优化

  • 使用 DeepSpeed 训练 以支持更大模型
  • 使用 FP8 量化 进一步减少 GPU 占用
  • 结合 vLLM 进行高效推理

这样你就可以成功微调 LLaMA 7B 并应用到特定领域了! 🚀

Logo

在这里,我们一起交流AI,学习AI,用AI改变世界。如有AI产品需求,可访问讯飞开放平台,www.xfyun.cn。

更多推荐