跳到主要内容
LLaMA Factory 实现 LLMs 指令监督微调 (SFT) 完整工作流程 | 极客日志
Python AI 算法
LLaMA Factory 实现 LLMs 指令监督微调 (SFT) 完整工作流程 简介 LLMs 微调技术,特别是使用 LLaMA Factory 进行指令监督微调 (SFT) 的完整工作流程。从数据准备、模型训练(包括全量微调和 PEFT/LoRA 方法)到模型评估与部署,帮助读者将基础 LLM 转化为解决特定业务问题的定制化智能体。 随着 GPT、LLaMA、QWen 等一众基础模型(Base Models)的出现,LLMs 的通用语言理解和生成能力已得到广…
月亮邮递员 发布于 2026/4/6 更新于 2026/5/20 10K 浏览简介
本文详细介绍了 LLMs 微调技术,特别是使用 LLaMA Factory 进行指令监督微调 (SFT) 的完整工作流程。从数据准备、模型训练(包括全量微调和 PEFT/LoRA 方法)到模型评估与部署,帮助读者将基础 LLM 转化为解决特定业务问题的定制化智能体。
随着 GPT、LLaMA、QWen 等一众基础模型(Base Models)的出现,LLMs 的通用语言理解和生成能力已得到广泛验证。然而,在面对垂直行业、专业领域或特定业务流程对高精度、定制化的需求时,基础模型的通用性往往存在局限。
微调 (Fine-Tuning) 正是解决这类问题的核心技术。它基于已经具备通用知识和特征的预训练模型,在相对较小的专业数据集上进行再训练,实现知识迁移和能力聚焦,从而显著提升模型在特定任务上的表现。
本文将重点聚焦于最成熟的微调技术之一——指令监督微调(SFT)。以 LLaMA Factory 为载体,系统性地演示和解析一套完整的微调工作流程。内容涵盖从构建和格式化高质量训练数据,到实施不同训练策略(如 Full FT 和 PEFT),直至最终通过 API 接口将模型部署上线的全部环节,旨在帮助大家高效地将基础 LLM 转化为解决特定业务问题的专业化智能体。
Fine-Tuning
微调(Fine-tuning)是利用预训练好的模型(如 GPT、QWen、LLama 等模型)作为基础模型(Base Model)在一个更小、更专业领域的数据集上进行进一步的训练的过程。它能将预训练模型所学到的模式和特征迁移到新的任务上,从而只需较少的数据和计算资源就能提升模型在特定任务上的表现能力。它已成为 NLP 领域的热门方法,常用于文本分类、情感分析和问答等任务。
通常 Fine-Tuning 可以分为以下三种:
Unsupervised Fine-Tuning :不需要标注数据,通过让 LLMs 接触来自目标领域的大量未标注文本语料库,从而提升其语言理解能力。这种方法适用于法律或医学等新兴领域,不过对于分类或摘要等特定任务的精确度较低。
Supervised Fine-Tuning(SFT) :为 LLMs 提供针对目标任务定制的标注数据。如在特定业务中使用已标注的分类文本来微调 LLMs,使 LLMs 具备对该业务文本的分类能力。这种方法能有效提升 LLMs 在特定业务中的能力,但它需要大量的标注数据(数据成本高)。
Instruction Fine-Tuning via Prompt Engineering :无需对模型进行训练,通过设计 Prompt 来让 LLMs 具备特定的推理能力。这种方法非常依赖于 Prompt 的设计,对于创建专业助手非常有用;但在面对复杂的推理任务上,则效果一般。
本文主要是关注于 SFT,详细介绍如何一步步使用我们自己的数据来微调出能够解决特定问题的 LLMs。
LLaMA Factory
在介绍具体步骤之前,我们先看下本文使用微调工具:LLaMA_Factory。具体可以参考官方文档:
LLaMA Factory: https://llamafactory.readthedocs.io/zh-cn/latest/
LLaMA Factory 是一个简单易用且高效的 LLMs 训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调,框架特性包括:
模型种类 :LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
训练算法 :(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
运算精度 :16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微调。
优化算法 :GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
加速算子 :FlashAttention-2 和 Unsloth。
推理引擎 :Transformers 和 vLLM。
实验监控 :LlamaBoard、TensorBoard、Wandb、MLflow、SwanLab 等等。在安装相关依赖之后,就可以通过下面的命令直接安装了:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
llamafactory-cli version
SFT Pipeline for LLMs
Data Preparation :构建高质量训练数据集。依次实现对目标领域数据的收集清洗(去重/去噪/修正格式)、转换为模型可理解的 <Instruct, Response> 结构并加特殊 Token、将数据分为训练集/验证集/测试集;
Training & Fine-Tuning :采用 Full FT 或者 PEFT(如 LoRA)等微调技术对模型进行微调;
Evaluation & Deployment :通过设计好的评估指标,对模型在测试集上进行评估。最后将上将模型部署上线,提供应用。
Data Preparation 核心目标:收集、清理并格式化数据,使我们的数据符合模型训练的要求。
采用 LLaMA Factory 训练模型,需将数据格式化,具体可以参考文档:
本文采用 ShareGPT 格式来组织结构化数据。ShareGPT 格式支持 更多 的角色种类,如 human、gpt、observation、function 等等。下面 OpenAI 格式(ShareGPT 的一种特殊格式):
[ { "messages" : [ { "role" : "system" , "content" : "系统提示词(选填)" } , { "role" : "user" , "content" : "人类指令" } , { "role" : "assistant" , "content" : "模型回答" } ] } ]
这个数据集的效果是模型根据 人类指令 输出 模型回答。然后将 JSON 格式的数据转换成 适合用于训练 LLM 的 Hugging Face 数据集格式。
import codecs
import os
import json
from datasets import Dataset
json_file = 'PATH_TO_JSON_FORMAT_FILE.json'
save_path = 'SAVE_PATH'
with codecs.open (json_file, 'r' , 'utf-8' ) as fp:
data_json = json.load(fp)
all_systems = data_json['system' ]
all_conversations = data_json['conversations' ]
my_dataset = Dataset.from_dict({"system" : all_systems, "conversations" : all_conversations})
print (f'Saving to path: [{save_path} ]' )
my_dataset.save_to_disk(save_path, max_shard_size="2048MB" )
处理完数据后,需要在 LLaMA Factory 的 data/dataset_info.json 中配置我们的数据(名称为 My_New_Data_Set_1):
"My_New_Data_Set_1" : {
"file_name" : "PATH_TO_DATA_FILE" ,
"formatting" : "sharegpt" ,
"columns" : {
"messages" : "messages"
} ,
"tags" : {
"role_tag" : "role" ,
"content_tag" : "content" ,
"user_tag" : "user" ,
"assistant_tag" : "assistant" ,
"system_tag" : "system"
}
}
注意,数据准备阶段应当尽可能保证数据干净,可以采用人工或大模型(如 DeepSeek-R1)对数据进行清洗,确保数据有效。
Model Training 在模型训练之前,我们需要下载要用的 Base Model,可以在 Hugging Face 官网直接下载,如 QWen 模型可以在下面的链接中下载:
这里更建议通过下面的 python 代码直接下载:
from huggingface_hub import snapshot_download
model_name = "Qwen/Qwen2.5-1.5B-Instruct"
print (f"正在下载模型 {model_name} 到 {model_name} ..." )
snapshot_download(
repo_id=model_name,
local_dir=model_name
)
下载完成之后,我们就有了与训练好的 Base Model:
total 3026368
-rw-r--r-- 1 root root 660 Nov 12 14:21 config.json
-rw-r--r-- 1 root root 242 Nov 12 14:21 generation_config.json
-rw-r--r-- 1 root root 11343 Nov 12 14:21 LICENSE
-rw-r--r-- 1 root root 1671839 Nov 12 14:21 merges.txt
-rw-r--r-- 1 root root 3087467144 Nov 12 14:21 model.safetensors
-rw-r--r-- 1 root root 4917 Nov 12 14:21 README.md
-rw-r--r-- 1 root root 7305 Nov 12 14:21 tokenizer_config.json
-rw-r--r-- 1 root root 7031645 Nov 12 14:21 tokenizer.json
-rw-r--r-- 1 root root 2776833 Nov 12 14:21 vocab.json
下面就可以通过配置来使用我们的数据对 Base Model 进行微调了,主要有如下两种微调技术:
Full Fine-Tuning(全量微调) 在微调阶段会更新预训练模型的所有参数。加载预训练的 LLM(如 Llama、Qwen)后,所有层的权重都会被设置为可训练(Trainable),并会根据训练数据进行梯度更新。
性能上限高 :模型的所有参数都会在新数据上会调整,理论上它可以达到 最佳的任务性能 ;
灵活性强 :可以修改模型所有的内部表示,能更好地适应与预训练数据分布差异较大的新任务。
计算资源需大 :需要巨大的 GPU 显存 来存储整个模型的权重、激活值和优化器状态(例如,一个 7B 模型可能需要 40GB+ 显存);
训练速度慢 :需要计算和更新大量的参数梯度;
存储成本高 :每次微调都需要保存一个完整模型副本;
灾难性遗忘 :对所有权重进行了更新,可能会导致模型 遗忘 在预训练阶段学到的通用知识和能力。
在 LLaMA Factory 中可以通过以下配置来实现全量微调(qwen2.5_1.5b_full_sft.yaml):
model_name_or_path: /data/BaseModels/Qwen/Qwen2.5-1.5B-Instruct
trust_remote_code: true
stage: sft
do_train: true
do_eval: true
finetuning_type: full
deepspeed: examples/deepspeed/ds_z2_config.json
dataset: My_New_Data_Set_1
template: qwen
cutoff_len: 2048
overwrite_cache: true
preprocessing_num_workers: 16
dataloader_num_workers: 4
output_dir: saves/qwen2.5-1.5b/full_sft
logging_steps: 10
save_steps: 200
plot_loss: true
overwrite_output_dir: true
per_device_train_batch_size: 1
gradient_accumulation_steps: 12
learning_rate: 1.0e-5
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: false
ddp_timeout: 180000000
resume_from_checkpoint: null
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 200
FORCE_TORCHRUN=1 CUDA_VISIBLE_DEVICES=0 llamafactory-cli train qwen2.5_1.5b_full_sft.yaml
FORCE_TORCHRUN=1 NNODES=1 NODE_RANK=0 MASTER_PORT=29500 llamafactory-cli train qwen2.5_1.5b_full_sft.yaml
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=0 MASTER_ADDR=xx.xx.xx.xx MASTER_PORT=29500 llamafactory-cli train qwen2.5_1.5b_full_sft.yaml
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=1 MASTER_ADDR=xx.xx.xx.xx MASTER_PORT=29500 llamafactory-cli train qwen2.5_1.5b_full_sft.yaml
PEFT(参数高效微调) PEFT 是一组方法的统称,只更新模型参数的一小部分(甚至不到 1%) ,同时固定大部分预训练权重。
代表性方法包括 LoRA (Low-Rank Adaptation)、Prefix Tuning、Prompt Tuning 等。
核心思想: 大多数预训练模型是过参数化的,只需要调整少量参数就能达到接近全量微调的性能。
极大地节省计算资源 : 只需存储和计算少量新增参数的梯度。如使用 QLoRA 技术微调 7B 模型,可能只需 16GB-24GB 显存;
训练速度快 : 参数少,梯度计算快,训练速度显著提升;
存储成本低 : 最终只需要存储一个很小的适配器文件(Adapter, 几 MB 到几百 MB);
避免灾难性遗忘 : 固定了大部分预训练权重,有助于保留模型的通用知识和能力;
模型切换方便 : 可以轻松切换和加载不同的 Adapter 来应对不同的下游任务。
性能略低于 Full Fine-Tuning : 在某些极端复杂的、或与预训练领域差异巨大的任务上,其性能上限可能略低于全量微调;
推理时需要合并(Merge) : 在生产部署时,通常需要将 PEFT 权重(如 LoRA Adapter)与原模型权重合并才能获得最佳的推理速度和效率。
在 LLaMA Factory 中可以通过以下配置来实现 LoRA 微调(qwen2.5_32b_lora_sft.yaml):
model_name_or_path: /data/BaseModels/Qwen/Qwen2.5-32B-Instruct
trust_remote_code: true
stage: sft
do_train: true
finetuning_type: lora
lora_alpha: 32
lora_rank: 16
lora_target: all
deepspeed: examples/deepspeed/ds_z2_config.json
dataset: My_New_Data_Set_1
template: qwen
cutoff_len: 4096
overwrite_cache: true
preprocessing_num_workers: 16
dataloader_num_workers: 4
output_dir: saves/qwen2.5-32b_instruct/lora_sft
logging_steps: 10
save_steps: 400
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none
per_device_train_batch_size: 2
gradient_accumulation_steps: 8
learning_rate: 1.0e-5
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 200
在模型部署时,需要将 Base model 和 Adapter 进行合并,可以采用如下代码:
llamafactory-cli export \
--model_name_or_path /data/BaseModels/Qwen2.5-32B-Instruct \
--adapter_name_or_path saves/qwen2.5-32b_instruct/lora_sft \
--export_dir saves/qwen2.5-32b_instruct/lora_sft/merge/ \
--template qwen \
--finetuning_type lora \
--export_size 2 \
--export_legacy_format False \
--export_device cpu
DeepSpeed 配置
deepspeed: examples/deepspeed/ds_z2_config.json
DeepSpeed 是微软开发的一个开源深度学习优化库,旨在提高大模型训练的效率和速度。DeepSpeed 作为 LLMs 训练的 高性能基础设施 ,能让研究人员和企业以 更少的 GPU 资源 或 更快的速度 来训练超大模型(如千亿甚至上万亿参数)。
在使用 DeepSpeed 之前,需要先估计训练任务的显存大小,再根据任务需求与资源情况选择合适的 ZeRO 阶段。
ZeRO-1 : 仅划分优化器参数,每个 GPU 各有一份完整的模型参数与梯度。
ZeRO-2 : 划分优化器参数与梯度,每个 GPU 各有一份完整的模型参数。
ZeRO-3 : 划分优化器参数、梯度与模型参数。
简单来说:从 ZeRO-1 到 ZeRO-3 ,阶段数越高,显存需求越小,但是训练速度也依次变慢。此外,设置 offload_param=cpu 参数会大幅减小显存需求,但会极大地使训练速度减慢。因此,如果您有足够的显存,应当使用 ZeRO-1,并且确保 offload_param=none。
LLaMA Factory 提供了使用不同阶段的 DeepSpeed 配置文件的示例:
# LLaMA-Factory/examples/deepspeed
ds_z0_config.json
ds_z2_config.json
ds_z2_offload_config.json
ds_z3_config.json
ds_z3_offload_config.json
Evaluation & Deployment 模型训练完后,需要对模型在测试集上进行评估。这里的评估指标更多的是我们定义的业务指标,如模型回答的格式是否正确,回答内容的准确率等等。不同也不差异较大,这里就不详细介绍了。
下面主要介绍如何部署模型,让我们能通过 API 请求模型。
LLaMA Factory API 可以通过 LLaMA Factory 实现 API 部署,如下所示,将模型使用 GPU0 部署起来:
API_PORT=8000 CUDA_VISIBLE_DEVICES=0 llamafactory-cli api \
--model_name_or_path saves/qwen2.5-32b_instruct/lora_sft/merge/ \
--template qwen
def call_llamafactory_api (prompt ):
url = 'http://localhost:8000/v1/chat/completions'
headers = {
'accept' : 'application/json' ,
'Content-Type' : 'application/json'
}
payload = {
"model" : "qwen" ,
"messages" : [{ "role" : "user" , "content" : prompt}],
"do_sample" : True ,
"temperature" : 0.7 ,
"top_p" : 0.9 ,
"n" : 1 ,
"max_tokens" : 200 ,
"stream" : False
}
try :
response = requests.post(url, headers=headers, data=json.dumps(payload))
if response.status_code == 200 :
rsp_json = response.json()
messages = []
for chs in rsp_json.get('choices' , []):
msg = chs['message' ]
messages.append(msg['content' ])
return messages
except requests.exceptions.RequestException as e:
print (f"请求发生异常:{e} " )
return None
Ollama API 此外,还可以使用 Ollama 来部署,主要流程如下:
在合并(Merge)后的 Hugging Face 格式模型之后,我们可以通过如下步骤来将模型部署之 Ollama 中:
python3 tools/llama.cpp/convert_hf_to_gguf.py \
/data/LLamaFactory/saves/qwen2.5-32b_instruct/lora_sft/merge/ \
--outtype auto \
--outfile /data/LLamaFactory/saves/qwen2.5-32b_instruct_lora_sft.gguf
创建 Modelfile : 在包含 GGUF 文件的目录下,创建一个名为 Modelfile 的文件(无扩展名):
FROM qwen2.5-32b_instruct_lora_sft.gguf
PARAMETER num_ctx 4096
创建/导入模型 : 使用 Ollama CLI 创建或导入模型
ollama create my-llm-model -f Modelfile
运行模型 :一旦导入完成,可以启动 Ollama 服务:
OLLAMA_MODELS=/usr/share/ollama/.ollama/models \
OLLAMA_HOST=0.0.0.0:6006 \
OLLAMA_ORIGINS=* \
ollama serve
API 调用 :通过 Requests 来请求 ollama api,实现模型调用
OLLAMA_URL = "http://localhost:6006/v1/chat/completions"
MODEL_NAME = "my-llm-model"
def call_ollama (prompt ):
data = {
"model" : MODEL_NAME,
"messages" : [{"role" : "user" , "content" : prompt}],
"stream" : False
}
try :
response = requests.post(OLLAMA_URL, json=data)
response.raise_for_status()
rsp = response.json()
results = []
for chs in rsp['choices' ]:
if chs['message' ]['role' ] == 'assistant' :
results.append(chs['message' ]['content' ])
return results
except Exception as e:
results = None
至此,我们成功将模型部署上线,并可以通过 API 请求模型,实现模型的在线服务。
Conclusion 本文提供了一份详尽且高度可操作的 LLMs 指令监督微调(SFT)实践指南,系统性地涵盖了从构建和格式化专业数据集到选择合适的训练策略(Full FT 或 PEFT),再到最终实现模型 API 部署上线的完整链路。
文中的每个关键环节都贴心地附带了必要的配置示例与核心代码片段,旨在帮助读者快速掌握端到端的微调技术,将基础 LLM 高效转化为解决特定业务问题的定制化智能体。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online