Jupyter AI

如何微调 LLM 模型

📅发表日期: 2025-02-06

🏷️分类: AI消息

👁️阅读次数: 0

如何微调 LLM 模型

微调大型语言模型 (LLM) 是指在预训练模型的基础上,使用特定任务的数据集进行进一步训练,使其更好地适应特定任务。预训练模型已经在海量数据上学习了通用的语言知识,而微调则让模型学习特定领域的知识或任务的细节。

主要步骤和概念:

  1. 选择预训练模型 (选择基座模型): 首先你需要选择一个合适的预训练模型作为你的起点。例如,你可以选择 Hugging Face Hub 上提供的各种模型,如 BERT, RoBERTa, GPT-2, GPT-3 (如果你有 API 访问权限), Llama 2 等。 选择模型时要考虑你的任务类型和计算资源。

  2. 准备数据集: 你需要为你的特定任务准备数据集。数据集应该包含输入和期望的输出示例。例如,如果是文本分类任务,数据集应该包含文本和对应的类别标签;如果是问答任务,数据集应该包含问题和答案。

  3. 加载 Tokenizer 和 模型: 使用 Hugging Face transformers 库加载预训练模型的 tokenizer 和 模型。Tokenizer 负责将文本转换为模型可以理解的数字表示形式。

  4. 数据预处理 (Tokenization): 使用加载的 tokenizer 对你的数据集进行 tokenization。这包括将文本分割成 tokens,并转换为模型输入的 ID 格式。 你可能还需要进行 padding 和 truncation,以确保所有输入序列长度一致。

  5. 配置训练参数 (Training Arguments): 设置训练过程中的各种参数,例如学习率 (learning rate), 批次大小 (batch size), 训练轮次 (epochs), 优化器 (optimizer) 等。 Hugging Face Trainer 提供了 TrainingArguments 类来方便地配置这些参数。

  6. 定义训练器 (Trainer): 使用 Hugging Face Trainer 类来简化训练过程。你需要将模型、训练参数、训练数据集、验证数据集 (可选)、tokenizer 以及评估指标 (可选) 传递给 Trainer

  7. 开始微调 (Training): 调用 Trainertrain() 方法开始微调过程。

  8. 评估模型 (Evaluation): 在验证集或测试集上评估微调后的模型性能,使用合适的评估指标,例如准确率 (accuracy), F1-score, BLEU score 等。

  9. 保存模型: 保存微调后的模型和 tokenizer,以便后续使用。

  10. 推理 (Inference): 加载微调后的模型,用于对新的输入数据进行预测。

所需 Python 库:

  • transformers (Hugging Face Transformers 库): 提供了丰富的预训练模型、tokenizer 和训练工具。 pip install transformers datasets accelerate
  • datasets (Hugging Face Datasets 库): 用于方便地加载和处理数据集。 pip install datasets
  • accelerate (Hugging Face Accelerate 库): 用于分布式训练和混合精度训练,加速训练过程。 pip install accelerate
  • torch (PyTorch): 流行的深度学习框架 (或者 TensorFlow,但 Transformers 更偏向 PyTorch)。 pip install torch
  • evaluate (Hugging Face Evaluate 库): 用于计算各种评估指标。 pip install evaluate
  • peft (PEFT 库 - Parameter-Efficient Fine-Tuning): (可选但强烈推荐) 参数高效微调技术,例如 LoRA (Low-Rank Adaptation),可以大幅减少微调所需的计算资源和时间。 pip install peft
  • bitsandbytes (bitsandbytes 库): (可选) 用于模型量化 (例如 4-bit 或 8-bit),进一步降低内存占用。 pip install bitsandbytes

Python 代码示例 (使用 BERT 微调文本分类):

from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import Dataset
import torch
import evaluate
import numpy as np

# 1. 准备数据集
# 创建一个简单的示例数据集
data = [
    {"text": "这是一部很棒的电影!", "label": 1},  # 正面
    {"text": "我真的很喜欢这本书。", "label": 1},  # 正面
    {"text": "食物太糟糕了。", "label": 0},  # 负面
    {"text": "我有一个糟糕的经历。", "label": 0},  # 负面
]

dataset = Dataset.from_list(data)

# 2. 加载 Tokenizer 和 模型
model_name = "bert-base-chinese"  # 或者其他合适的中文模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) # 2 个标签:正面和负面

# 3. 数据 Tokenization
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 移除原始文本列
tokenized_datasets = tokenized_datasets.remove_columns(["text"])

# 将标签列重命名为 'labels' (Trainer 要求)
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")

# 分割为训练集和验证集 (例如 80/20 分割)
train_test_split = tokenized_datasets.train_test_split(test_size=0.2)
train_dataset = train_test_split["train"]
eval_dataset = train_test_split["test"]

# 4. 定义评估指标
metric = evaluate.load("accuracy")  # 你可以使用其他指标,例如 F1 分数

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)


# 5. 配置训练参数
training_args = TrainingArguments(
    output_dir="./results",          # 模型保存目录
    learning_rate=2e-5,              # 学习率
    per_device_train_batch_size=16,   # 每个设备训练批次大小
    per_device_eval_batch_size=16,    # 每个设备评估批次大小
    num_train_epochs=3,              # 训练轮次
    weight_decay=0.01,               # 权重衰减,用于正则化
    evaluation_strategy="epoch",     # 每个 epoch 结束时进行评估
    save_strategy="epoch",           # 每个 epoch 结束时保存模型
    load_best_model_at_end=True,     # 训练结束时加载最佳模型
    metric_for_best_model="accuracy",# 使用准确率作为最佳模型的评估指标
    push_to_hub=False,               # 设置为 True 可以将模型推送到 Hugging Face Hub
)

# 6. 定义训练器
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    compute_metrics=compute_metrics,
    tokenizer=tokenizer,
)

# 7. 开始训练
trainer.train()

# 8. 评估 (再次评估以确认)
results = trainer.evaluate()
print(results)

# 9. 保存模型
trainer.save_model("./my_fine_tuned_bert")  # 保存到本地目录
tokenizer.save_pretrained("./my_fine_tuned_bert") # 保存 tokenizer

# 10. 推理示例
from transformers import pipeline

classifier = pipeline("sentiment-analysis", model="./my_fine_tuned_bert")
text = "这个产品太棒了!我强烈推荐它。"
result = classifier(text)
print(result)

运行代码:

  1. 安装依赖: 运行 pip install transformers datasets evaluate torch numpy accelerate
  2. 复制粘贴代码: 将代码复制到一个 Python 文件 (例如 fine_tune.py)。
  3. 运行: 从终端执行文件: python fine_tune.py

重要考虑事项:

  • 数据集大小: 微调需要一定规模的数据集才能有效。 少量示例可能不足以让模型学习到有用的知识。 尽量使用数百或数千个示例,如果可能的话。
  • 超参数调优: 学习率、批次大小和训练轮次等超参数非常重要。 尝试不同的值,找到最适合你的任务和数据集的设置。 可以使用 OptunaRay Tune 等工具自动化超参数搜索过程。
  • 过拟合: 注意过拟合问题,即模型在训练数据上表现很好,但在未见过的数据上表现很差。 使用验证集监控模型性能,并在必要时提前停止训练。 权重衰减和 dropout 等技术也可以帮助防止过拟合。
  • 内存: LLM 模型可能非常大。 如果遇到内存问题,可以尝试减小批次大小、使用更小的模型、或使用梯度累积或混合精度训练等技术。 量化 (使用 bitsandbytes) 对于降低内存占用非常有帮助。
  • PEFT (参数高效微调): 对于更大的模型,强烈建议使用 PEFT 技术,例如 LoRA。 它们可以让你在显著减少内存和计算资源的情况下微调大型模型。 代码示例中已经展示了 LoRA 的基本用法。
  • GPU: 使用 GPU 训练 LLM 模型会快得多。 如果你没有 GPU,可以使用云服务,例如 Google Colab, AWS SageMaker 或 Azure Machine Learning。 确保在有 GPU 可用时设置 device="cuda"。 Hugging Face Accelerate 旨在简化在多个 GPU 上进行训练。
  • 数据隐私: 在使用敏感数据时,请注意数据隐私。 考虑在微调之前匿名化或脱敏数据。

希望这个详细的中文指南能够帮助你理解和实践 LLM 模型的微调。 记住根据你的具体任务和数据集调整代码和技术。

💬 评论

暂无评论

🧠AI 最新技术 (滚动鼠标查看)