完整的大模型微调代码(LLaMA 7B + LoRA)

完整的大模型微调代码(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 并应用到特定领域了! 🚀

### Llama-7B 使用 LoRA 进行微调的方法 低秩适应(Low-Rank Adaptation, LoRA)是一种高效的参数高效迁移学习方法,它通过仅更新模型权重矩阵中的低秩分解部分来减少训练所需的计算资源和时间。这种方法特别适合大规模预训练模型微调工作。 对于 Llama-7B 模型而言,在实际操作中可以采用如下方式完成基于 LoRA微调: #### 安装依赖库 为了支持 LoRA 微调功能,通常需要安装 `transformers` 和 `peft` 库。以下是安装命令: ```bash pip install transformers peft accelerate bitsandbytes ``` 这些工具提供了对 Hugging Face Transformers API 的扩展能力以及硬件优化的支持[^1]。 #### 数据准备 准备好用于微调的数据集,并将其转换成适配 Transformer 输入格式的形式。这一步可能涉及分词器初始化、文本编码等处理过程[^2]。 #### 配置环境变量 如果计划利用混合精度训练技术进一步提高效率,则需设置相应的 CUDA 环境配置项。例如启用 FP16 或 BF16 计算模式以降低显存消耗并加快收敛速度。 #### 编写脚本实现具体逻辑 下面是一个简单的 Python 脚本模板展示如何加载基础模型并通过 PEFT 工具箱定义 LoRA 参数化策略来进行后续训练流程的设计: ```python from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig import torch from peft import get_peft_config, PeftModel, TaskType, LoraConfig, prepare_model_for_int8_training model_name_or_path = "meta-llama/Llama-7b" tokenizer_name_or_path = "meta-llama/Llama-7b" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16 ) tokenizer = AutoTokenizer.from_pretrained(tokenizer_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path, quantization_config=bnb_config, device_map={"":0}) peft_config = LoraConfig(task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1) # Prepare the model for int8 training. model = prepare_model_for_int8_training(model) # Add LoRA adapters to the model. model = PeftModel.from_pretrained(model, "./path_to_lora_weights", config=peft_config) def print_trainable_parameters(model): """ Prints the number of trainable parameters in the model. """ trainable_params = 0 all_param = 0 for _, param in model.named_parameters(): num_params = param.numel() if num_params == 0 and hasattr(param, "ds_numel"): num_params = param.ds_numel all_param += num_params if param.requires_grad: trainable_params += num_params print(f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}") print_trainable_parameters(model) output_dir = "./results" training_arguments = TrainingArguments(output_dir=output_dir, ... ) trainer = Trainer( model=model, args=training_arguments, train_dataset=train_dataset, eval_dataset=val_dataset, tokenizer=tokenizer, data_collator=data_collator, ) model.config.use_cache = False # silence the warnings. Please re-enable for inference! trainer.train() model.save_pretrained("./lora-finetuned-model") ``` 上述代码片段展示了完整的端到端解决方案,涵盖了从加载原始大语言模型实例直到保存最终经过调整后的版本整个链条上各个重要环节的操作细节说明^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值