LLM 微调实战:Llama Factory 使用指南 – wiki基地


大模型微调实战:Llama Factory 全方位使用指南

引言:拥抱大模型微调的新时代

近年来,大型语言模型(LLM)以前所未有的速度和能力席卷了人工智能领域。从 GPT 系列到 Llama、Qwen、ChatGLM 等,这些强大的模型在自然语言理解、生成、对话等方面展现出惊人的潜力。然而,通用的预训练模型往往难以完美契合特定领域或特定任务的需求。为了让大模型更好地服务于具体应用场景,模型微调(Fine-tuning)成为了关键技术。

微调是指在一个已经预训练好的大模型基础上,使用特定领域或任务的数据进行进一步训练,从而使模型适应新的数据分布和任务要求。它相比于从零开始训练模型,极大地降低了对计算资源和数据的需求,使得中小型企业和个人开发者也能参与到大模型的定制化浪潮中。

然而,LLM 微调过程本身仍具有一定的复杂性,涉及环境配置、数据准备、模型选择、参数设置、训练监控等多个环节,对初学者而言门槛较高。为了简化这一过程,社区涌现出许多优秀的微调框架,Llama Factory(原名 LLaMA-Efficient-Tuning)便是其中的佼佼者。它以其易用性、高效性、灵活性以及对多种主流模型和微调方法的广泛支持,受到了越来越多开发者和研究者的青睐。

本文旨在提供一份详尽的 Llama Factory 使用指南,从环境搭建到数据准备,再到模型训练、评估和推理,覆盖 LLM 微调的完整流程。无论您是 LLM 微调的新手,还是寻求更高效工具的资深玩家,相信本文都能为您提供有价值的参考,助您轻松驾驭 Llama Factory,开启大模型定制化之旅。本文预计篇幅较长,力求覆盖 Llama Factory 的核心功能与实践细节,目标字数约为 3000 字。

第一部分:认识 Llama Factory

1.1 Llama Factory 是什么?

Llama Factory 是一个专为大型语言模型设计的、易于使用且高效的微调框架。它整合了多种主流的 LLM 微调技术(如 Full Parameter Fine-tuning, LoRA, QLoRA 等),支持众多流行的开源大模型(如 Llama 系列、Mistral、Qwen, ChatGLM, Baichuan 等),并提供了简洁的命令行接口(CLI)和用户友好的图形化界面(Web UI),旨在大幅降低 LLM 微调的门槛。

1.2 为什么选择 Llama Factory?

选择 Llama Factory 进行 LLM 微调,主要基于以下几点优势:

  • 易用性强: 提供 Web UI,用户无需编写大量代码,通过点选即可配置和启动微调任务。同时,简洁的 CLI 也方便集成到自动化脚本中。
  • 高效性: 集成了多种高效微调方法(如 LoRA、QLoRA),显著减少了训练所需的显存和计算资源。支持 FlashAttention 等加速技术,提升训练速度。
  • 灵活性高: 支持多种模型、数据集格式和微调算法,用户可以根据具体需求灵活组合。允许自定义数据集和模型集成。
  • 覆盖面广: 支持当前主流的多种开源大模型,方便用户在不同基座模型上进行尝试。
  • 社区活跃: 项目持续更新,积极响应社区反馈,不断加入新的功能和模型支持。
  • 开箱即用: 预设了许多常见任务的配置模板,方便快速上手。

第二部分:环境搭建与安装

2.1 硬件与软件要求

  • 操作系统: Linux (推荐), macOS, Windows (WSL2 推荐)
  • Python 版本: 3.8 或更高版本
  • 包管理工具: Conda (推荐) 或 pip
  • 核心依赖: PyTorch (推荐 2.0 或更高版本),Transformers, Datasets, Accelerate, PEFT
  • GPU 支持: 强烈推荐使用 NVIDIA GPU。微调 LLM 对显存要求较高,具体大小取决于模型规模和微调方法。
    • LoRA/QLoRA 微调: 对于 7B 模型,建议至少 12GB 显存;13B 模型建议 24GB;更大模型则需要更多显存。
    • 全参数微调: 显存需求会急剧增加,通常需要多张高性能 GPU。
  • CUDA Toolkit: 需要与 PyTorch 版本兼容的 CUDA 版本。

2.2 安装步骤

推荐使用 Conda 创建独立的虚拟环境,以避免包版本冲突。

  1. 创建并激活 Conda 环境:
    bash
    conda create -n llama_factory python=3.10 -y
    conda activate llama_factory

  2. 安装 PyTorch:
    访问 PyTorch 官网 (pytorch.org),根据你的 CUDA 版本选择合适的安装命令。例如,对于 CUDA 11.8:
    bash
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

    务必确保安装了 GPU 版本的 PyTorch。

  3. 克隆 Llama Factory 仓库:
    bash
    git clone https://github.com/hiyouga/LLaMA-Factory.git
    cd LLaMA-Factory

  4. 安装依赖:
    Llama Factory 提供了 requirements.txt 文件,包含了所有必要的依赖。
    bash
    pip install -r requirements.txt

    如果需要使用特定功能(如 Web UI, FlashAttention, DeepSpeed 等),可能需要安装额外的依赖。根据官方文档的指引进行安装,例如:
    bash
    # 安装 Web UI 依赖
    pip install gradio==3.50.2
    # 安装 FlashAttention (如果硬件支持)
    # pip install flash-attn --no-build-isolation
    # 安装 DeepSpeed (用于多卡或 ZeRO 优化)
    # pip install deepspeed

  5. 验证安装:
    可以尝试运行 Llama Factory 的帮助命令,检查是否能正常工作:
    bash
    llamafactory-cli --help

    如果看到帮助信息,说明基本环境配置成功。

第三部分:核心使用流程详解

Llama Factory 的核心使用流程可以概括为:数据准备 -> 模型选择 -> 微调方法选择 -> 参数配置 -> 启动训练 -> 评估与推理。下面将详细介绍每个步骤。

3.1 步骤一:准备微调数据

高质量的数据是微调成功的关键。Llama Factory 支持多种数据格式。

  • 数据格式要求:

    • Alpaca 格式 (JSON): 这是 Llama Factory 推荐的格式之一,适用于指令微调。每条数据是一个 JSON 对象,包含 instruction, input (可选), 和 output 字段。
      json
      [
      {
      "instruction": "计算两个数的和。",
      "input": "数1: 5, 数2: 8",
      "output": "两个数的和是 13。"
      },
      {
      "instruction": "写一首关于春天的诗。",
      "input": "",
      "output": "春风拂绿柳,细雨润新花。燕儿穿庭过,溪水响潺潺。"
      }
      ]
    • ShareGPT 格式 (JSON): 适用于多轮对话微调。每条数据是一个 JSON 对象,包含一个 conversations 列表,列表中每个元素代表一轮对话,包含 from (通常是 “human” 或 “gpt”) 和 value 字段。
      json
      [
      {
      "conversations": [
      { "from": "human", "value": "你好,你叫什么名字?" },
      { "from": "gpt", "value": "你好!我是一个大型语言模型。" }
      ]
      },
      {
      "conversations": [
      { "from": "human", "value": "今天天气怎么样?" },
      { "from": "gpt", "value": "我无法获取实时天气信息,但我可以帮你查询。" },
      { "from": "human", "value": "帮我查一下北京的天气。" },
      { "from": "gpt", "value": "正在查询北京的天气... 根据信息,北京今天晴朗,气温适宜。" }
      ]
      }
      ]
    • 自定义格式: Llama Factory 也支持通过 --dataset_formatter 参数加载自定义的数据处理脚本,灵活性很高。
  • 数据准备要点:

    • 数据质量: 确保数据准确、干净、与目标任务高度相关。
    • 数据数量: 微调所需数据量远少于预训练,但仍需保证一定的规模(几百到几万条不等,视任务复杂度而定)。
    • 数据分布: 训练集、验证集(可选,用于调优超参数和监控)应具有相似的数据分布。
    • 文件组织: 将准备好的数据保存为 .json 文件。可以在 data/ 目录下创建自己的数据集文件夹。
  • 指定数据集:
    在 Llama Factory 中,通过 --dataset 参数指定数据集名称。Llama Factory 内置了一些常用数据集的配置(如 alpaca_gpt4_zh),可以直接使用。对于自定义数据集,需要将其信息添加到 data/dataset_info.json 文件中,或者直接在命令行中指定文件路径。
    json
    // 在 data/dataset_info.json 中添加自定义数据集信息
    "my_custom_dataset": {
    "file_name": "my_data.json", // 相对于 data/ 目录的路径
    "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output"
    }
    }

    然后使用 --dataset my_custom_dataset。或者直接指定路径:--dataset path/to/your/my_data.json

3.2 步骤二:选择基础模型

选择一个合适的预训练模型作为微调的起点。

  • 支持的模型: Llama Factory 支持众多模型,如 llama2-7b-chat, qwen-7b-chat, chatglm3-6b, baichuan2-13b-chat, mistral-7b-instruct 等。完整的支持列表可以在官方文档或 src/llamafactory/model/model_map.json 中找到。
  • 指定模型: 使用 --model_name_or_path 参数指定。可以是 Hugging Face Hub 上的模型标识符,也可以是本地的模型路径。
    “`bash
    # 使用 Hugging Face Hub 上的模型
    –model_name_or_path meta-llama/Llama-2-7b-hf

    使用本地模型

    –model_name_or_path /path/to/your/local/model
    “`
    Llama Factory 会自动下载所需的模型文件(如果本地不存在)。

3.3 步骤三:选择微调方法

根据你的资源和需求选择合适的微调方法。

  • 主要方法:
    • LoRA (Low-Rank Adaptation): 在模型的某些层(通常是 Attention 层)旁边添加小的、可训练的“适配器”(Adapter)矩阵。只训练这些适配器,冻结原始模型参数。大大减少了训练参数量和显存占用,是目前最流行的微调方法之一。
    • QLoRA (Quantized LoRA): LoRA 的进一步优化。在微调时,将冻结的原始模型参数进行 4-bit 量化,进一步降低显存占用。训练时反量化计算梯度,更新 LoRA 适配器参数。非常适合资源有限的场景。
    • Full Parameter Fine-tuning: 训练模型的所有参数。效果通常最好,但需要巨大的计算资源和显存。
  • 指定方法: 使用 --finetuning_type 参数指定。
    “`bash
    # 使用 LoRA
    –finetuning_type lora

    使用 QLoRA (需要 bitsandbytes 库)

    –finetuning_type lora –quantization_bit 4

    使用全参数微调

    –finetuning_type full
    ``
    * **LoRA 相关参数 (当
    finetuning_type=lora时):**
    *
    –lora_rank: LoRA 适配器矩阵的秩,通常设为 8, 16, 32, 64。值越大,可训练参数越多,可能效果更好,但显存占用也越高。
    *
    –lora_alpha: LoRA 缩放因子,通常设为lora_rank的两倍或与lora_rank相同。
    *
    –lora_target: 指定要应用 LoRA 的模块名称。Llama Factory 通常会自动为常见模型设置好默认值(如q_proj,v_proj)。可以使用all应用到所有线性层,或指定具体模块名列表。
    *
    –lora_dropout`: LoRA 层的 Dropout 比例。

3.4 步骤四:配置训练参数

配置训练过程中的各种超参数。这是影响微调效果的关键步骤。

  • 核心参数:
    • --output_dir: 指定训练结果(模型检查点、适配器权重等)的保存路径。例如:--output_dir ./saves/qwen-7b-chat/lora/my_experiment
    • --per_device_train_batch_size: 每个 GPU 上的训练批次大小。根据显存大小调整,通常设为 1, 2, 4, 8 等。
    • --gradient_accumulation_steps: 梯度累积步数。实际的批次大小 = per_device_train_batch_size * num_gpus * gradient_accumulation_steps。用于在有限显存下模拟更大的批次。
    • --learning_rate: 学习率。通常需要根据模型和数据进行调整,常见值如 1e-4, 2e-4, 5e-5 (LoRA) 或 1e-5, 2e-5 (Full)。
    • --num_train_epochs: 训练的总轮数。通常设为 1 到 5 轮。
    • --lr_scheduler_type: 学习率调度器类型,如 cosine, linear
    • --warmup_ratio--warmup_steps: 学习率预热比例或步数。
    • --logging_steps: 每隔多少步打印一次训练日志。
    • --save_steps: 每隔多少步保存一次模型检查点。
    • --per_device_eval_batch_size: 每个 GPU 上的评估批次大小。
    • --evaluation_strategy: 评估策略,如 steps (按步数评估), epoch (按轮数评估)。
    • --eval_steps: 如果 evaluation_strategy=steps,则指定评估步数间隔。
  • 性能相关参数:
    • --fp16--bf16: 启用半精度训练(fp16 需要 Apex 或 Transformers >= 4.16,bf16 需要 Ampere 或更新架构的 GPU)。可以大幅减少显存占用并加速训练。优先推荐 bf16(如果硬件支持)。
    • --optim: 优化器类型,如 adamw_torch (默认), adamw_hf, adamw_apex_fused (若安装 Apex), adamw_bnb_8bit (若使用 8-bit 优化器)。
  • 数据处理参数:
    • --max_source_length: 输入序列的最大长度。
    • --max_target_length: 输出序列的最大长度。
    • --preprocessing_num_workers: 数据预处理使用的进程数。

3.5 步骤五:启动微调训练

配置好所有参数后,即可启动训练。Llama Factory 提供两种方式:

  • 方式一:使用命令行接口 (CLI)
    将所有参数组合成一条命令执行。这对于脚本化和自动化非常方便。
    bash
    # 示例:使用 QLoRA 微调 Qwen-7B-Chat 模型
    # (请根据实际情况修改路径、模型、数据集和参数)
    CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path qwen/Qwen-7B-Chat \
    --dataset alpaca_gpt4_zh \
    --finetuning_type lora \
    --quantization_bit 4 \
    --lora_target c_attn \
    --output_dir ./saves/Qwen-7B-Chat/lora/sft_test \
    --overwrite_output_dir \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 100 \
    --learning_rate 1e-4 \
    --num_train_epochs 3.0 \
    --plot_loss \
    --fp16

    • --stage sft: 指定微调阶段为监督微调 (Supervised Fine-tuning)。其他可选值包括 pt (Pre-training), rm (Reward Modeling), ppo (Proximal Policy Optimization)。
    • --do_train: 明确指示执行训练。
    • --overwrite_output_dir: 如果输出目录已存在,则覆盖。
    • --plot_loss: 在训练结束后绘制损失曲线图。
  • 方式二:使用 Web 用户界面 (Web UI)
    对于不熟悉命令行的用户,或者希望通过图形化界面直观配置参数的用户,Web UI 是一个很好的选择。

    1. 确保安装了 Web UI 依赖 (pip install gradio==3.50.2)。
    2. 在 Llama Factory 项目根目录下运行:
      bash
      CUDA_VISIBLE_DEVICES=0 python src/train_web.py
    3. 打开浏览器,访问指定的 URL (通常是 http://localhost:7860)。
    4. 在 Web UI 界面中,可以通过下拉菜单、输入框等选择模型、数据集、微调方法,并设置各种超参数。
    5. 配置完成后,点击 “Preview Command” 可以查看对应的命令行参数。
    6. 点击 “Start” 按钮即可启动训练。训练日志会实时显示在界面下方。

3.6 步骤六:监控与评估

  • 监控训练过程:
    • 日志输出: 训练过程中,控制台或 Web UI 会输出损失值 (loss)、学习率 (learning rate)、已完成步数 (step)、已完成轮数 (epoch) 等信息。密切关注损失值的变化趋势,判断训练是否正常进行。
    • TensorBoard: 如果在训练参数中配置了 --logging_strategy steps--logging_dir (通常会自动设置在 output_dir 下的 runs 子目录),可以使用 TensorBoard 查看更详细的训练曲线:
      bash
      tensorboard --logdir ./saves/Qwen-7B-Chat/lora/sft_test/runs

      然后在浏览器中访问 TensorBoard 提供的 URL。
  • 评估模型性能:
    • 验证集评估: 如果在训练时指定了验证数据集 (--dataset xxx_eval) 和评估策略 (--evaluation_strategy steps --eval_steps 100),Llama Factory 会在训练过程中定期在验证集上进行评估,并输出评估指标(如 perplexity 或 BLEU/ROUGE,取决于任务)。
    • 离线评估: 训练完成后,可以使用 llamafactory-cli eval 命令对模型在指定数据集上进行评估。
      bash
      CUDA_VISIBLE_DEVICES=0 llamafactory-cli evaluate \
      --model_name_or_path qwen/Qwen-7B-Chat \
      --adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
      --template default \
      --finetuning_type lora \
      --task mmlu \
      --split test \
      --lang en \
      --n_shot 5 \
      --batch_size 4

      这里以评估 MMLU benchmark 为例。需要根据具体评估任务调整参数。
    • 人工评估: 对于生成任务,客观指标往往不能完全反映模型质量,人工评估(对比微调前后的回答质量、流畅度、相关性等)是必不可少的环节。

3.7 步骤七:模型推理与部署

微调完成后,需要加载训练好的模型(或适配器)进行推理。

  • 使用 Llama Factory 进行推理:

    • 命令行推理:
      bash
      CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
      --model_name_or_path qwen/Qwen-7B-Chat \
      --adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
      --finetuning_type lora \
      --template qwen

      这将启动一个交互式的命令行聊天界面。--template 参数指定了用于构建 prompt 的模板,需要与模型和微调任务匹配。
    • API 推理: Llama Factory 提供了基于 FastAPI 的 API 服务启动脚本。
      bash
      CUDA_VISIBLE_DEVICES=0 python src/api_demo.py \
      --model_name_or_path qwen/Qwen-7B-Chat \
      --adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
      --finetuning_type lora \
      --template qwen

      启动后,可以通过 HTTP 请求与模型交互。
  • 导出与合并 (适用于 LoRA/QLoRA):
    LoRA 微调只生成了适配器权重,需要将其与基础模型合并才能得到一个完整的微调后模型,或者在加载时动态应用适配器。

    • 导出适配器: Llama Factory 默认会将 LoRA 适配器保存在 output_dir 下。可以直接使用这个目录。
    • 合并权重: 可以使用 Llama Factory 提供的脚本或 Hugging Face PEFT 库的功能将 LoRA 适配器权重合并到基础模型中,并保存为一个新的模型。这对于部署更方便。
      bash
      # 示例(概念性,具体命令可能需要查阅 Llama Factory 文档或 PEFT 文档)
      # python src/export_model.py \
      # --model_name_or_path qwen/Qwen-7B-Chat \
      # --adapter_name_or_path ./saves/Qwen-7B-Chat/lora/sft_test \
      # --export_dir ./models/qwen-7b-chat-sft-merged \
      # --export_size 7b \
      # --export_legacy_format False
  • 使用 Hugging Face Transformers 进行推理:
    无论是合并后的模型,还是基础模型+适配器,都可以使用标准的 Hugging Face Transformers 库进行加载和推理。
    “`python
    from transformers import AutoModelForCausalLM, AutoTokenizer
    from peft import PeftModel # 需要加载 LoRA 适配器时

    model_name_or_path = “qwen/Qwen-7B-Chat” # 或合并后的模型路径
    adapter_path = “./saves/Qwen-7B-Chat/lora/sft_test” # LoRA 适配器路径

    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)

    如果是 QLoRA 微调,加载基础模型时需要指定量化配置

    model = AutoModelForCausalLM.from_pretrained(

    model_name_or_path,

    trust_remote_code=True,

    device_map=”auto”,

    load_in_4bit=True # 加载为 4-bit

    )

    否则,正常加载

    model = AutoModelForCausalLM.from_pretrained(
    model_name_or_path,
    trust_remote_code=True,
    device_map=”auto” # 自动分配到 GPU
    )

    如果是 LoRA/QLoRA,加载适配器

    model = PeftModel.from_pretrained(model, adapter_path)
    model = model.merge_and_unload() # 可选:合并权重并卸载适配器,变成标准模型

    model.eval() # 设置为评估模式

    构建 prompt (注意使用与训练时匹配的模板)

    prompt = “你好,给我讲个笑话吧。”

    Qwen 的模板可能需要特殊处理

    response, history = model.chat(tokenizer, prompt, history=None)

    对于其他模型,可能需要手动构建包含特殊 token 的输入

    inputs = tokenizer(prompt, return_tensors=”pt”).to(model.device)

    生成回复

    outputs = model.generate(**inputs, max_new_tokens=100, eos_token_id=tokenizer.eos_token_id)
    response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)

    print(response)
    “`

第四部分:进阶技巧与注意事项

  • 多 GPU 训练: Llama Factory 天然支持使用 accelerate 进行多 GPU 数据并行训练。只需在启动命令前设置 CUDA_VISIBLE_DEVICES (如 CUDA_VISIBLE_DEVICES=0,1),并调整全局批次大小。对于更大规模的模型或需要更高效率的场景,可以集成 DeepSpeed ZeRO 优化,通过配置 accelerate config 或在启动命令中加入 DeepSpeed 相关参数 (--deepspeed path/to/ds_config.json)。
  • 混合精度训练: 强烈建议开启 --fp16--bf16,可以显著提升训练速度和降低显存占用,同时对模型性能影响通常不大。优先选择 --bf16(如果硬件支持)。
  • Flash Attention: 如果你的 GPU 支持(如 Ampere, Hopper 架构),安装并启用 Flash Attention (--flash_attn) 可以进一步加速训练,尤其是在处理长序列时。
  • 超参数调优: 学习率、批次大小、LoRA秩 (rank) 是影响 LoRA 微调效果最关键的几个参数。需要根据具体任务和数据进行实验调优。可以从推荐值开始,进行小范围调整。
  • 数据质量优先: 微调的效果很大程度上取决于数据的质量和相关性。花时间清洗、筛选和构建高质量的指令数据集至关重要。
  • 模板(Template)的重要性: 在微调和推理时,确保使用与模型和任务匹配的 Prompt 模板。Llama Factory 内置了多种常见模型的模板(如 default, llama2, qwen, chatglm3 等),通过 --template 参数指定。错误的模板会导致模型无法理解指令或生成格式混乱。
  • 处理 OOM (Out of Memory) 错误: 这是微调中最常见的问题。解决方法包括:
    • 减小 --per_device_train_batch_size
    • 增大 --gradient_accumulation_steps
    • 使用 QLoRA (--quantization_bit 4) 或 LoRA 替代全参数微调。
    • 降低 LoRA 秩 (--lora_rank)。
    • 启用梯度检查点 (--gradient_checkpointing),但这会增加训练时间。
    • 使用 DeepSpeed ZeRO Stage 2 或 3。
    • 缩短最大序列长度 (--max_source_length, --max_target_length)。
  • 持续学习与社区资源: Llama Factory 项目在 GitHub 上非常活跃,积极关注其更新、Issue 和 Discussions。阅读官方文档和示例是深入了解其功能的最佳途径。

结语

Llama Factory 以其强大的功能、易用性和高效率,极大地简化了大型语言模型的微调过程。通过本文的详细介绍,相信您已经对如何使用 Llama Factory 有了全面的了解,从环境搭建、数据准备,到模型选择、参数配置、启动训练,再到评估和推理,涵盖了实战中的各个关键环节。

掌握 Llama Factory,意味着您拥有了一个强大的武器,能够将通用的预训练大模型转化为满足特定需求的定制化 AI 应用。无论是进行学术研究、开发创新产品,还是优化现有业务流程,Llama Factory 都将是您得力的助手。

当然,LLM 微调是一个实践性很强的领域,理论学习之后更需要动手操作。希望本指南能为您提供清晰的路线图,鼓励您即刻开始,利用 Llama Factory 探索大模型微调的无限可能。祝您在 LLM 的世界里探索顺利,收获满满!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部