大模型微调实操入门

本笔记记录基于 LLaMA-Factory + vLLM 的大模型微调与部署完整链路,使用 Qwen3-0.6B 作为基座模型,以"关键词抽取"任务为例进行 LoRA 微调。


目录


第 1 章 微调实操

LLaMA-Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA-Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调。

整体流程:

租用 GPU → 装 LLaMA-Factory → 启动 WebUI → 准备模型 → 准备数据集 → LoRA 微调 → 导出权重

1.1 安装 LLaMA-Factory

0)AutoDL 平台租用 GPU

AutoDL 上租用一台带 GPU 的实例(本笔记示例使用约 32 GiB 显存的卡,足够 Qwen3-0.6B LoRA 微调)。

在这里插入图片描述

在这里插入图片描述

1)下载源码

# 进入数据盘目录(AutoDL 推荐 ~/autodl-tmp)
cd ~/autodl-tmp

# 拉取源码
git clone https://github.com/hiyouga/LLaMA-Factory.git

加速 git clone(AutoDL 内置代理):

source /etc/network_turbo      # 开启代理加速
# …此处执行 git clone…
unset http_proxy && unset https_proxy   # 用完取消,避免影响后续访问国内源

详细文档:https://www.autodl.com/docs/network_turbo/

2)安装依赖

进入项目目录,使用 uv 管理虚拟环境(比 pip 快很多):

cd ~/autodl-tmp/LLaMA-Factory

# 安装 uv(如果未安装)
pip install uv

# 创建 Python 3.12 虚拟环境
uv venv --python 3.12

# 激活环境
source .venv/bin/activate

# 安装项目依赖(使用清华源加速)
uv pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

3)验证安装

llamafactory-cli version

能正常打印版本号即说明安装成功。


1.2 启动 LLaMA-Factory

前台启动(调试用)

llamafactory-cli webui

后台启动(推荐生产/长时间运行)

nohup llamafactory-cli webui > llama_factory.log 2>&1 &

看到下面这行说明启动成功:

Running on local URL:  http://0.0.0.0:7860

远程访问 WebUI(SSH 隧道)

如果在 AutoDL 服务器上启动,本地浏览器需通过 SSH 隧道转发端口:

# 在本地电脑执行(注意替换主机/端口为自己实例的)
ssh -CNg -L 7860:127.0.0.1:7860 root@connect.nmb2.seetacloud.com -p 16652

也可以使用 AutoDL 提供的图形化代理隧道工具。

在这里插入图片描述

打开浏览器访问:http://localhost:7860/

在这里插入图片描述


1.3 准备模型

LLaMA-Factory 支持两种方式获取模型:训练时自动下载、或预先下载好后传入本地路径。推荐预下载,可避免训练中断时重复下载。

通过 ModelScope 下载 Qwen3-0.6B 到本地:

cd ~/autodl-tmp/LLaMA-Factory
source .venv/bin/activate

modelscope download \
  --model Qwen/Qwen3-0.6B \
  --local_dir model/Qwen3-0.6B

下载完成后,模型路径为:/root/autodl-tmp/LLaMA-Factory/model/Qwen3-0.6B

在这里插入图片描述


1.4 准备数据集

LLaMA-Factory 目前支持 AlpacaShareGPT 两种格式。本节以 ShareGPT 为例。

1)处理数据格式

将原始数据上传到 LLaMA-Factory 目录后,使用以下脚本转成 ShareGPT 多轮对话格式,输出到 data/keywords_data_sharegpt.jsonl

from datasets import load_dataset

def convert_to_qwen_format(examples):
    conversations = []
    # 遍历每个对话样本,注意开启 batch 时,会自动套一层 list
    for conv_list in examples["conversation"]:
        # 重建符合 Qwen3 标准的消息结构
        for conv in conv_list:
            conversations.append([
                {"role": "user",      "content": conv["human"].strip()},
                {"role": "assistant", "content": conv["assistant"].strip()},
            ])
    return {"messages": conversations}


if __name__ == "__main__":
    dataset = load_dataset(
        "json",
        data_files="data/keywords_data_train.jsonl",
        split="train",
    )
    # 格式化为 ShareGPT 风格
    dataset = dataset.map(
        convert_to_qwen_format,
        batched=True,
        remove_columns=dataset.column_names,
    )
    dataset.to_json(
        "data/keywords_data_sharegpt.jsonl",
        force_ascii=False,
    )

2)注册数据集

编辑 data/dataset_info.json,新增一段:

cd /root/autodl-tmp/LLaMA-Factory/data
vim dataset_info.json
"keywords_extract": {
  "file_name": "keywords_data_sharegpt.jsonl",
  "formatting": "sharegpt",
  "columns": {
    "messages": "messages"
  },
  "tags": {
    "role_tag": "role",
    "content_tag": "content",
    "user_tag": "user",
    "assistant_tag": "assistant"
  }
}

保存后,回到 WebUI 数据集下拉框就能看到 keywords_extract,选中可在线预览样本。

在这里插入图片描述


1.5 使用 LoRA 进行微调

在 WebUI 上配置以下几项即可启动训练(无需手写训练脚本)。

1)配置模型

  • 模型名称:选择 Custom
  • 模型路径:填写本地模型绝对路径,如 /root/autodl-tmp/LLaMA-Factory/model/Qwen3-0.6B

在这里插入图片描述

2)启用 LoRA

  • 微调方法:选择 lora

在这里插入图片描述

3)配置训练轮数与最大样本数

  • 训练总轮数(Epochs):根据数据规模设定
  • 最大样本数(Max Samples)

样本量计算

  • 不设最大样本数:每个 epoch 遍历完整训练集 → 总样本量 ≈ 训练集样本数 × 训练轮数
  • 设置最大样本数:训练前会先截断到该上限 → 总样本量 ≈ min(训练集样本数, 最大样本数) × 训练轮数

在这里插入图片描述

4)配置保存位置

设置 输出目录,训练过程中的 checkpoint 与日志均保存到此处。
示例:/root/autodl-tmp/LLaMA-Factory/saves/Custom/lora/qwen3_lora

在这里插入图片描述

5)启动训练 + 测试

点击 Start 开始训练。训练完成后,可在 WebUI 的 Chat 标签页加载 LoRA 适配器,与微调后的模型直接对话验证效果。

在这里插入图片描述


1.6 模型权重导出

WebUI 中切到 Export 标签,可将基座模型与 LoRA 适配器合并导出为一个完整模型,方便后续部署。

示例导出目录:

/root/autodl-tmp/LLaMA-Factory/saves/Custom/lora/qwen3_lora_new/full_params

在这里插入图片描述

导出后该目录内典型结构:

full_params/
├── Modelfile
├── chat_template.jinja
├── config.json
├── generation_config.json
├── model.safetensors
├── tokenizer.json
└── tokenizer_config.json

关键点:导出后的目录已包含完整 tokenizer 文件,部署时不需要再单独传 --tokenizer 指向原模型。


第 2 章 模型部署

在实际生产环境下,微调之后的模型需要经过部署才能使用。部署的本质就是将模型转换成可通过 HTTP 调用的服务。本章介绍如何使用 vLLM 部署模型,并通过多种方式调用。

2.1 vLLM 简介

vLLM 是一个面向大语言模型推理的高性能推理框架,专为大规模并发请求优化,底层基于 PyTorch 构建。

核心优势(同等配置下吞吐量比 Transformers 高一个数量级):

特性 说明
高级 GPU 优化 利用 CUDA + PyTorch 最大化 GPU 利用率
PagedAttention 类操作系统分页机制管理 KV Cache,显著减少显存碎片
连续批处理 支持 continuous batching 与异步处理,提升并发吞吐
安全特性 内置 API Key 支持与请求校验
易用性 支持上百种主流模型,完全兼容 OpenAI API

2.2 vLLM 安装

环境要求

  • OS:Linux
  • Python:3.9 ~ 3.12

安装步骤

为避免和 LLaMA-Factory 的依赖冲突,单独建一个虚拟环境

# 退出 LLaMA-Factory 的虚拟环境
deactivate

# 进入 vllm 工作目录
mkdir -p /root/autodl-tmp/vllm_dir
cd /root/autodl-tmp/vllm_dir

# 创建独立的 Python 3.12 环境
uv venv --python 3.12
source .venv/bin/activate

# 安装 vLLM(使用清华源加速)
uv pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple

# 验证
uv pip show vllm

2.3 vLLM 启动部署

1)准备模型目录

将导出后的合并模型拷贝到 vllm_dir

cp -r /root/autodl-tmp/LLaMA-Factory/saves/Custom/lora/qwen3_lora_new/full_params/ \
      ./Qwen3-0.6B-sft-lora

最终目录结构:

vllm_dir/
├── .venv/
├── Qwen3-0.6B/              # (可选)原始模型,仅用于对照
└── Qwen3-0.6B-sft-lora/     # 合并后的微调模型 ← 部署用这个

2)前台启动(调试)

vllm serve /root/autodl-tmp/vllm_dir/Qwen3-0.6B-sft-lora \
    --served-model-name Qwen3-0.6B-sft-lora \
    --max-model-len 32768 \
    --gpu-memory-utilization 0.85

参数说明

参数 含义
第一个位置参数 模型目录(含 tokenizer 时无需再指 --tokenizer
--served-model-name 对外暴露的模型名,调用时 model 字段必须用这个
--max-model-len 最大上下文长度。小写 k=1000,大写 K=1024,例如 32K = 32768
--gpu-memory-utilization 显存利用率上限,默认 0.92显存吃紧时调小(例如 0.85)

3)后台启动(生产)

nohup vllm serve /root/autodl-tmp/vllm_dir/Qwen3-0.6B-sft-lora \
    --served-model-name Qwen3-0.6B-sft-lora \
    --max-model-len 32K \
    --gpu-memory-utilization 0.85 \
    > vllm.log 2>&1 &

4)判断启动是否成功

vLLM 启动要经过:加载权重 → torch.compile 编译 → CUDA Graph 预热 → API 监听,整个过程约 1~3 分钟。

只有看到下面两行才算真正完成:

INFO ... [api_server.py:...] Starting vLLM API server on http://0.0.0.0:8000
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

启动成功后可用 curl 验证:

curl http://localhost:8000/v1/models

2.4 服务调用

vLLM 完全兼容 OpenAI API 协议,因此可以用三种方式调用。

1)curl 快速测试

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3-0.6B-sft-lora",
    "messages": [
      {"role": "user", "content": "抽取出下文中的关键词:\n目的分析结节性甲状腺肿(NG)合并甲状腺微小癌(TMC)的超声声像图特点……"}
    ]
  }'

2)OpenAI Python SDK 调用

安装:

uv pip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple

调用代码:

from openai import OpenAI

# 连接本地 vLLM 服务
client = OpenAI(
    base_url="http://localhost:8000/v1/",
    api_key="none",   # 占位符,本地部署可忽略
)

response = client.chat.completions.create(
    model="Qwen3-0.6B-sft-lora",   # 必须与启动 vllm 时的 --served-model-name 一致
    messages=[
        {"role": "user", "content": "抽取出下文中的关键词:\n目的分析结节性甲状腺肿(NG)合并甲状腺微小癌(TMC)的超声声像图特点……"}
    ],
    extra_body={
        # Qwen3 默认开启思考模式(thinking),抽取类任务建议关掉
        "chat_template_kwargs": {"enable_thinking": False}
    },
)

print(response.choices[0].message.content)

3)LangChain 调用

安装:

uv pip install langchain-core langchain-openai -i https://pypi.tuna.tsinghua.edu.cn/simple

调用代码:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

llm = ChatOpenAI(
    model="Qwen3-0.6B-sft-lora",
    base_url="http://localhost:8000/v1/",
    api_key="none",
    temperature=0,
)

messages = [
    HumanMessage(content="抽取出下文中的关键词:\n目的分析结节性甲状腺肿(NG)合并甲状腺微小癌(TMC)的超声声像图特点……")
]

response = llm.invoke(messages)
print(response.content)

附录 A:常见问题与排错

A.1 vLLM 启动报"显存不足"

报错信息

ValueError: Free memory on device cuda:0 (28.83/31.36 GiB) on startup is less than
desired GPU memory utilization (0.92, 28.85 GiB).
Decrease GPU memory utilization or reduce GPU memory used by other processes.

根因:vLLM 默认 --gpu-memory-utilization=0.92,要求启动瞬间空闲显存达到该比例。如果有其他进程(例如 LLaMA-Factory 的 webui/chat)占着显存,就会差那么一点点导致启动失败。

解决方案(任选一种):

  1. 降低显存占用比例(最简单):
    --gpu-memory-utilization 0.85
    
  2. 释放占用显存的进程
    nvidia-smi              # 查看占用进程
    kill -9 <PID>           # 释放
    

A.2 是否需要 --tokenizer 参数?

结论通常不需要

LLaMA-Factory 通过 Export 导出的合并模型目录,已经自带完整 tokenizer 文件(tokenizer.json + tokenizer_config.json + chat_template.jinja),vLLM 会自动从模型目录加载。

只有在以下情况才需要单独指定:

  • 模型目录里没有 tokenizer 文件
  • 想用其他模型的 tokenizer(罕见)

A.3 Blackwell 架构 GPU 警告

警告信息

Failed to get device capability: SM 12.x requires CUDA >= 12.9.

原因:使用 Blackwell 架构 GPU(如 RTX 5090、B200)但 CUDA 版本 < 12.9,vLLM 会自动回退到 FlashAttention 2,功能正常但性能没拉满

优化方案

  • 升级到 CUDA 12.9+ 的环境
  • 升级到更新版本的 vLLM(对 Blackwell 支持更好)

A.4 启动后长时间没出现 “Uvicorn running”

这是正常现象。vLLM 启动顺序:

加载权重 (秒级)
  → torch.compile 编译 (~10-30 秒)
    → CUDA Graph 内存 profiling (~1-3 分钟)
      → API 服务监听 ← 此时才真正可用

不要急着 Ctrl+C,看到 Profiling CUDA graph memory: PIECEWISE=51, FULL=35 就说明正在最后阶段,耐心等待即可。

A.5 Qwen3 思考模式(thinking)

Qwen3 默认会先输出 <think>...</think> 思考过程再给最终回答。对于抽取/分类等结构化任务,建议关闭:

extra_body={"chat_template_kwargs": {"enable_thinking": False}}

附录 B:环境信息速查

B.1 关键路径速查表

用途 路径
LLaMA-Factory 项目 /root/autodl-tmp/LLaMA-Factory/
基座模型(下载) /root/autodl-tmp/LLaMA-Factory/model/Qwen3-0.6B/
数据集目录 /root/autodl-tmp/LLaMA-Factory/data/
数据集注册文件 /root/autodl-tmp/LLaMA-Factory/data/dataset_info.json
LoRA 训练输出 /root/autodl-tmp/LLaMA-Factory/saves/Custom/lora/qwen3_lora/
合并导出目录 /root/autodl-tmp/LLaMA-Factory/saves/Custom/lora/qwen3_lora_new/full_params/
vLLM 工作目录 /root/autodl-tmp/vllm_dir/
部署用模型 /root/autodl-tmp/vllm_dir/Qwen3-0.6B-sft-lora/

B.2 常用端口

服务 端口
LLaMA-Factory WebUI 7860
vLLM OpenAI API 8000

B.3 虚拟环境切换

# 进入 LLaMA-Factory 环境
cd /root/autodl-tmp/LLaMA-Factory && source .venv/bin/activate

# 切换到 vLLM 环境
deactivate
cd /root/autodl-tmp/vllm_dir && source .venv/bin/activate

B.4 完整流程一图流

┌─────────────────────────────────────────────────────────────┐
│  阶段 1:训练(LLaMA-Factory 环境)                          │
│  ──────────────────────────────────────────────              │
│  1. modelscope download   → 拉基座模型                       │
│  2. 处理数据为 ShareGPT 格式 → 写 dataset_info.json          │
│  3. WebUI 配置 LoRA → Start                                  │
│  4. Export → 合并 LoRA + 基座 → 完整模型目录                 │
└─────────────────────────────────────────────────────────────┘
                            ↓ cp -r
┌─────────────────────────────────────────────────────────────┐
│  阶段 2:部署(vLLM 环境)                                   │
│  ──────────────────────────────────────────────              │
│  1. vllm serve <模型目录> --served-model-name X              │
│  2. 等到 "Uvicorn running on http://0.0.0.0:8000"            │
│  3. curl / openai SDK / LangChain 调用                       │
└─────────────────────────────────────────────────────────────┘

写于 2026-05-05
配套环境:AutoDL · Python 3.12 · LLaMA-Factory · vLLM 0.20.1 · Qwen3-0.6B

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐