基于llama-factory框架的LoRA微调实战:从数据集准备到Ollama部署
1. 环境准备与框架安装:为LoRA微调铺平道路
想在自己的电脑上捣鼓出一个能听懂你行话、懂你业务的大模型吗?这事儿听起来挺唬人,但用对工具,真没想象中那么难。今天我就带你走一遍我用过很多次的实战路线:用 llama-factory 这个“一站式工厂”来微调模型,最后还能轻松部署到 Ollama 上随时调用。整个过程,你不需要是算法大神,只要会敲点命令,有点耐心,就能搞定。
首先,咱们得把“工厂”建起来。llama-factory 是目前我个人觉得对新手最友好的微调框架之一,它把很多复杂的步骤都封装成了简单的Web界面或者命令行,大大降低了门槛。你可能会问,为什么选它?我实测下来,就三点:省心、功能全、社区活跃。它支持市面上绝大多数主流开源模型,比如 Qwen、ChatGLM、Llama、Mistral 等等,而且从数据准备、训练、到模型合并导出,一条龙服务。
安装过程其实很简单,官方文档写得挺清楚。我习惯用 conda 来管理环境,这样能避免各种包版本冲突的“玄学”问题。咱们一步步来:
# 1. 创建并激活一个专门的Python环境
conda create -n llama_factory python=3.10
conda activate llama_factory
# 2. 拉取 llama-factory 的代码仓库
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
# 3. 安装依赖包
pip install -r requirements.txt
这里有个小坑我踩过:如果你的网络环境访问 PyPI 或者 GitHub 不太顺畅,可能会在安装 transformers、torch 这些大包时超时。解决办法是使用国内的镜像源,比如在 pip 命令后面加上 -i https://pypi.tuna.tsinghua.edu.cn/simple。另外,torch 的版本最好根据你的 CUDA 版本来选择,去 PyTorch 官网用对应的命令安装会更稳。安装完成后,你可以用 llamafactory-cli -h 测试一下,如果能看到帮助信息,说明基础环境就绪了。
接下来,我们需要准备一个“基座模型”。你可以把它理解为一个具备通用知识但对你专业领域一无所知的“大学生”。llama-factory 支持从 Hugging Face 模型库直接在线下载,也支持加载你本地已有的模型。对于国内用户,我强烈建议先将模型从 Hugging Face 镜像站(比如 hf-mirror.com)下载到本地,这样后续训练过程不会因为网络问题中断。假设我们要微调 Qwen1.5-1.8B-Chat 这个模型,可以提前下载好。至此,我们的“工厂”地基和初始原料就准备好了。
2. 数据集准备:教会模型说“行话”的关键
模型训练,数据为王。这一步是决定你的微调模型是“天才”还是“人工智障”的核心。llama-factory 支持多种格式的数据集,但最常用、最灵活的是 JSON 格式。你需要准备的不是一个,而是三个关键文件,它们各司其职,共同“教导”模型。
第一个文件是你的核心训练数据,比如 fintech.json。这里面的数据就是你想要模型学习的具体对话或知识。格式通常是一个列表,里面包含多个字典,每个字典代表一条训练样本。对于对话微调,常见格式是这样的:
[
{
"instruction": "请解释什么是年化收益率。",
"input": "",
"output": "年化收益率是一种理论上的收益率,它把当前收益率(如日收益率、周收益率、月收益率)换算成年收益率来计算..."
},
{
"instruction": "根据以下交易数据,计算用户的月度总支出。",
"input": "1号:餐饮消费150元;5号:交通充值100元;20号:购物消费500元。",
"output": "该用户本月总支出为:150 + 100 + 500 = 750元。"
}
]
这里 instruction 是给模型的指令或问题,input 是可选的上下文或补充信息,output 就是期望模型给出的标准答案。你的数据质量直接决定效果,我建议至少准备几百条高质量、多样化的样本。数据太少容易过拟合(模型只会背你给的答案),数据噪音太大则学不到东西。
第二个文件是身份设定文件,比如 identity.json。这个文件特别有用,它能给模型一个“人设”。比如,你可以让模型在回答时,以某个特定角色(如“金融助手小Q”)的口吻来回答,这能极大地提升对话的个性化和一致性。
{
"name": "小Q",
"author": "你的名字",
"system_prompt": "你是一个专业的金融领域AI助手,名叫小Q。你的回答应当严谨、准确,并乐于用通俗易懂的语言解释复杂的金融概念。"
}
第三个文件是数据集信息配置文件,dataset_info.json。这个文件是告诉 llama-factory 框架如何读取和理解你上面准备的数据。你需要在这里定义数据集的路径、格式和每个字段的映射关系。这是打通数据和训练流程的“桥梁文件”。
{
"my_fintech_dataset": {
"file_name": "fintech.json",
"format": "alpaca", // 指定数据格式,alpaca是上述instruction-input-output格式的一种
"columns": {
"instruction": "instruction",
"input": "input",
"output": "output"
}
}
}
准备好这三个文件后,把它们全部放到 llama-factory 项目目录下的 data 文件夹里。这样,在后续的Web界面中,你就能直接看到并选择这个数据集了。记住,花在数据清洗和构造上的时间,绝对物超所值,这是后续所有步骤能出效果的前提。
3. 参数配置与训练启动:在Web界面上“开车”
环境有了,数据齐了,接下来就是最激动人心的部分:启动训练。llama-factory 提供了一个非常直观的 Web UI,让我们可以像填表单一样配置复杂的训练参数,这对新手来说简直是福音。启动 Web UI 的命令很简单:
llamafactory-cli webui
然后在浏览器中打开它提示的本地地址(通常是 http://127.0.0.1:7860),你就会看到一个功能丰富的界面。咱们一步步配置:
第一步,选择模型。 在“模型名”或“模型路径”栏,填入我们之前准备好的基座模型路径,比如 ./models/Qwen1.5-1.8B-Chat。界面上会实时显示模型的参数量等信息。
第二步,选择适配器(也就是微调方法)。 这里就是我们今天的主角 LoRA 出场的时候了。什么是LoRA?你可以把它想象成给大模型穿上一件轻薄的“技能外套”。传统的全参数微调好比让模型重新上学,成本高、速度慢。而LoRA只训练模型内部的一小部分额外的、低秩的参数矩阵,让模型在不改变原有庞大知识的基础上,快速学会新技能。它最大的优点就是快、省显存、产出的权重文件小(通常只有几十MB)。在界面的“适配器”选项里,选择 lora。
第三步,加载数据集。 在“数据集”部分,你应该能看到我们在 dataset_info.json 中定义的 my_fintech_dataset。勾选它。系统会自动识别数据格式和字段。
第四步,配置关键训练参数。 这是微调的“方向盘”,几个核心参数我解释一下:
- 学习率 (Learning Rate):LoRA训练的学习率可以设得稍高一点,比如
5e-4到1e-3。这是模型学习新知识的速度,太高会“学飘”,太低学得慢。 - 训练轮数 (Epochs):根据数据量来,数据少(几千条)可以设 3-5 轮,数据多可以 1-3 轮。我一般会先设3轮看看效果。
- LoRA 秩 (LoRA Rank):这是LoRA的核心超参,理解为“技能外套”的复杂程度。通常设置在 8、16、32 或 64。值越大,能力越强,但也越容易过拟合。对于1.8B的模型,从
r=8开始尝试是个好选择。 - 批量大小 (Batch Size):根据你的显卡显存来。显存小(如8G)就用 4 或 8,显存大可以尝试 16 或 32。llama-factory 支持梯度累积,即使设了小的批量大小,通过累积步数也能达到大批次的效果。
第五步,开始训练。 配置好所有参数后,点击“开始”按钮。训练日志会在下方输出,你可以看到损失值(loss)在逐渐下降。这个过程可能需要几十分钟到几小时,取决于你的数据量、模型大小和硬件。训练完成后,LoRA权重文件会默认保存在 saves/你的模型名/lora 目录下,文件很小,方便分享和迁移。
4. 模型合并与格式转换:打造可部署的“成品”
训练完成后,我们得到的是一个独立的 LoRA 权重文件(一堆 .safetensors 文件)。它自己不能直接运行,必须和原来的基座模型“合体”,才能形成一个完整的、可独立推理的模型。llama-factory 同样在 Web UI 里提供了无缝的合并功能。
在训练完成的页面,或者Web UI的“模型”标签页里,你会找到“导出模型”或“合并LoRA权重”的选项。你只需要选择训练好的LoRA适配器(通常以训练步数或轮数命名),然后点击“合并”。框架会自动将LoRA权重合并到基座模型中,并输出一个完整的 Hugging Face 格式的模型文件夹。这个合并后的模型,已经可以用 transformers 库直接加载和对话了,效果就是你微调后的样子。
但是,如果我们想用更高效的推理引擎(比如 llama.cpp)或者在 Ollama 上部署,就需要把模型转换成 GGUF 格式。GGUF 是 llama.cpp 团队设计的一种二进制格式,它对模型进行了高效的量化(压缩),能大幅减少模型磁盘占用和内存消耗,提升推理速度,而且兼容性极好。
转换需要用到 llama.cpp 项目中的工具。首先,我们把 llama.cpp 克隆下来:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
pip install -r requirements.txt # 安装转换脚本的依赖
然后,使用里面的 Python 转换脚本。假设我们合并后的模型路径是 ../LLaMA-Factory/saves/Qwen1.5-1.8B-Chat/lora/merge-final/,我们想把它转换成 Q8_0 量化等级(一种在精度和大小间取得很好平衡的量化方式)的 GGUF 文件:
python convert_hf_to_gguf.py ../LLaMA-Factory/saves/Qwen1.5-1.8B-Chat/lora/merge-final/ --outtype q8_0 --outfile ../my_finetuned_model_q8_0.gguf
这个命令会运行一会儿,最终生成一个 .gguf 文件。这个文件就是我们的“终极成品”,它比原来的 PyTorch 模型小很多(比如从几个G压缩到1-2G),并且为后续的高效推理做好了准备。量化等级除了 q8_0,还有 q4_0(更小,精度损失稍多)、q5_1 等,你可以根据对速度和精度的需求选择。
5. 使用Ollama部署:让模型随时待命
现在,我们有了一个轻量且高效的 GGUF 模型文件,最后一步就是把它部署成一个随时可以对话的服务。Ollama 是目前在本地运行和管理大模型最流行的工具之一,它操作简单,一条命令就能拉取和运行模型,还提供了类 OpenAI 的 API 接口,方便其他应用调用。
首先,安装 Ollama。它的安装过程极其简单,在 Linux/macOS 上一条命令搞定:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后,Ollama 服务会自动在后台运行。接下来,我们需要创建一个 Modelfile 来告诉 Ollama 如何加载我们的自定义 GGUF 模型。Modelfile 是一个文本文件,内容如下:
FROM ./my_finetuned_model_q8_0.gguf
# 设置模型的温度参数,控制回答的随机性
PARAMETER temperature 0.7
# 可选:设置系统提示词,强化模型身份
SYSTEM """
你是一个专业的金融AI助手,请用清晰、准确的方式回答用户的问题。
"""
把 Modelfile 和你的 .gguf 模型文件放在同一个目录下,然后在这个目录下执行创建模型的命令:
ollama create my-finance-helper -f ./Modelfile
这条命令会读取 Modelfile,将你的 GGUF 文件注册到 Ollama 的本地模型库中,模型名就叫 my-finance-helper。之后,你就可以像使用 Ollama 官方模型一样使用它了:
# 直接运行并对话
ollama run my-finance-helper
# 或者,如果你想让模型作为API服务运行,Ollama默认在11434端口提供了API
# 你可以用curl测试
curl http://localhost:11434/api/generate -d '{
"model": "my-finance-helper",
"prompt": "请解释一下什么是量化投资?"
}'
通过 Ollama 部署后,你的微调模型就变成了一个随时可用的服务。你还可以结合像 Open WebUI 这样的开源聊天界面,打造一个属于你自己的、功能堪比 ChatGPT 但内容完全私有的本地 AI 应用。整个过程从数据准备到最终部署,形成了一条完整的闭环,让你能真正地把大模型技术用起来,解决实际场景中的问题。我自己的经验是,第一次走通这个流程可能需要一点时间,但一旦跑通,后续迭代新的微调模型就会非常快,真正享受到了开源AI技术的红利。
更多推荐



所有评论(0)