在实际的大模型应用开发中,我们常常面临一个困境:官方提供的预训练模型虽然通用,但难以精准匹配特定业务场景下的问答风格、知识领域或专业术语。直接使用往往效果不佳,而从头训练一个模型则成本高昂。这时,微调(Fine-tuning)便成为了一种高效且实用的技术手段。它允许我们在一个强大的基础模型之上,使用自己的数据集进行针对性训练,从而让模型“学会”我们需要的特定能力。

然而,从微调到最终部署,中间涉及多个环节:如何选择一个易用且功能强大的微调框架?如何准备和管理训练数据?微调完成后,如何将模型转换为易于部署的格式?最后,又如何搭建一个轻量、便捷的服务供团队或产品调用?这些问题构成了一个完整的技术闭环。

本文将围绕这个闭环,聚焦于两个核心工具: LLaMA-Factory Ollama 。我们将探讨如何在 Linux 环境下,使用 LLaMA-Factory 对大语言模型进行微调训练,然后将训练好的模型打包为 Ollama 支持的格式,最终通过 Ollama 进行部署和访问。整个过程旨在为开发者提供一套从“炼丹”到“上菜”的标准化操作流程,降低大模型定制化应用的门槛。

1. 理解微调与部署的核心概念与工具选型

在开始动手之前,我们需要厘清几个关键概念,并理解为什么选择 LLaMA-Factory 和 Ollama 这套组合。

1.1 什么是大模型微调?

大模型微调,简而言之,就是利用特定领域或任务的数据,对一个已经预训练好的通用大语言模型进行“二次训练”。这个过程不会改变模型的基础架构(如 Transformer 层数、注意力头数),而是调整模型内部的权重参数,使其输出更符合我们的期望。

微调主要解决两类问题:

  1. 领域适应 :让模型掌握特定领域的知识。例如,用一个法律文书数据集微调模型,使其能更好地理解法律条款和生成法律文书。
  2. 任务适应 :让模型学会执行特定格式的任务。例如,用指令-回答对的数据集微调模型,使其能更好地遵循人类指令进行对话。

常见的微调方法包括:

  • 全参数微调 :更新模型的所有参数。效果好,但资源消耗巨大。
  • 参数高效微调 :如 LoRA、QLoRA,只训练模型内部新增的一小部分参数(适配器),大幅降低显存和计算需求,是目前个人开发者或中小团队的主流选择。

1.2 为什么选择 LLaMA-Factory?

LLaMA-Factory 是一个开源的大语言模型微调框架,它集成了多种先进的微调算法(如 LoRA, QLoRA),并提供了友好的 Web UI 和命令行接口。对于“懒人运维”或快速实验而言,它的优势非常明显:

  • 开箱即用 :提供 Docker 镜像和一键启动脚本,环境配置简单。
  • 可视化操作 :通过 Web UI 上传数据、配置参数、启动训练、监控进度,降低了命令行操作的复杂度。
  • 算法集成 :内置了 LoRA、QLoRA、全参数微调等多种方法,用户无需从头实现。
  • 模型支持广泛 :支持 LLaMA、BLOOM、Baichuan、ChatGLM、Qwen 等众多主流开源模型。
  • 资源友好 :QLoRA 等技术使得在消费级显卡(如 24GB 显存的 RTX 4090)上微调 70B 参数模型成为可能。

1.3 为什么选择 Ollama 进行部署?

Ollama 是一个用于在本地运行大语言模型的工具,它简化了模型的下载、运行和管理。其核心优势在于:

  • 模型格式统一 :它使用自有的 Modelfile 来定义和构建模型,将模型权重、配置文件、系统提示词等打包成一个易于分发的文件。
  • 极简部署 :通过一条命令( ollama run <model-name> )即可启动一个提供 API 服务的模型实例。
  • REST API :提供标准的 OpenAI 兼容的 API 接口( /api/chat , /api/generate ),方便集成到现有应用中。
  • 跨平台 :支持 macOS、Linux、Windows。
  • 活跃社区 :拥有丰富的社区贡献模型,可以直接拉取使用。

将 LLaMA-Factory 微调后的模型转换为 Ollama 格式,意味着我们获得了一个 标准化、易分发、易服务化 的模型包,非常适合用于内部工具、原型演示或轻量级生产场景。

1.4 整体技术路线图

我们的目标流程可以概括为以下几步:

  1. 环境准备 :在 Linux 服务器上配置基础环境(Docker, NVIDIA驱动等)。
  2. 启动 LLaMA-Factory :使用 Docker 快速启动 LLaMA-Factory 的 Web UI 服务。
  3. 数据准备与微调 :通过 Web UI 上传数据、配置训练参数、启动微调任务。
  4. 模型导出与转换 :将 LLaMA-Factory 产出的模型文件(通常是 Hugging Face 格式)转换为 Ollama 可识别的格式。
  5. 创建 Ollama Modelfile :编写 Modelfile,定义模型元数据、系统提示词等,并构建 Ollama 模型包。
  6. 部署与测试 :使用 Ollama 运行自定义模型,并通过 API 或命令行进行测试。

接下来,我们将从环境准备开始,逐步完成这个流程。

2. 环境准备与 LLaMA-Factory 启动

微调训练对计算资源有一定要求,尤其是 GPU。以下配置是一个推荐的起点。

2.1 硬件与软件要求

组件 最低要求 推荐配置 说明
操作系统 Ubuntu 20.04 LTS Ubuntu 22.04 LTS / CentOS 8+ 需要稳定的 Linux 发行版。
CPU 4 核 8 核或以上 用于数据预处理和模型加载。
内存 16 GB 32 GB 或以上 加载 7B 模型约需 14GB+ 内存。
GPU NVIDIA GPU, 8GB 显存 NVIDIA GPU, 24GB 显存 (如 RTX 4090) 显存大小直接决定可微调的模型规模。QLoRA 可降低要求。
存储 50 GB 可用空间 100 GB+ SSD 用于存放基础模型、训练数据和产出模型。
Docker 最新稳定版 最新稳定版 容器化部署必备。
NVIDIA驱动 >= 470 >= 525 必须与 CUDA 版本匹配。
NVIDIA Container Toolkit 必须安装 必须安装 使 Docker 容器能够使用 GPU。

2.2 基础环境配置

首先,确保系统已安装 Docker 和 NVIDIA 容器工具包。

1. 安装 Docker

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新 apt 包索引并安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
sudo docker run hello-world

2. 安装 NVIDIA Container Toolkit

# 添加 NVIDIA 包仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 安装 nvidia-container-toolkit
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

# 重启 Docker 服务
sudo systemctl restart docker

# 验证 GPU 在 Docker 中可用
sudo docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi

如果最后一条命令能成功输出 GPU 信息,说明环境配置正确。

2.3 启动 LLaMA-Factory Web UI

LLaMA-Factory 提供了预构建的 Docker 镜像,这是最快最干净的启动方式。

1. 拉取 LLaMA-Factory 镜像

sudo docker pull hiyouga/llamafactory:latest

2. 运行 LLaMA-Factory 容器 我们需要将容器内的端口映射到宿主机,并挂载一个目录用于持久化保存模型和数据。

# 创建一个工作目录
mkdir -p ~/llamafactory_workspace
cd ~/llamafactory_workspace

# 运行容器
sudo docker run -it --gpus all \
  -p 7860:7860 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/output:/app/output \
  -v $(pwd)/models:/app/models \
  hiyouga/llamafactory:latest
  • -p 7860:7860 : 将容器内的 7860 端口(Gradio Web UI 默认端口)映射到宿主机的 7860 端口。
  • -v $(pwd)/data:/app/data : 挂载数据目录,用于存放训练数据集。
  • -v $(pwd)/output:/app/output : 挂载输出目录,训练好的模型会保存在这里。
  • -v $(pwd)/models:/app/models : 挂载模型目录,可以预先将基础模型(如下载的 Hugging Face 模型)放在宿主机的 ~/llamafactory_workspace/models 下,容器内即可访问。

3. 访问 Web UI 容器启动后,在宿主机上打开浏览器,访问 http://<你的服务器IP>:7860 。你将看到 LLaMA-Factory 的 Web 界面。

注意:如果无法访问,请检查服务器防火墙是否放行了 7860 端口。例如,对于 UFW,可以执行 sudo ufw allow 7860

3. 使用 LLaMA-Factory 进行微调训练

现在,我们通过 Web UI 来完成一次完整的微调流程。假设我们的目标是让模型学会以特定格式回答关于内部知识库的问题。

3.1 准备训练数据

LLaMA-Factory 支持多种数据格式,最常见的是 JSON 格式。对于指令微调,通常需要准备一个包含 instruction (指令)、 input (可选输入)、 output (期望输出)字段的 JSON 文件。

示例数据 ( data/train.json ):

[
  {
    "instruction": "请介绍我们公司的主营业务。",
    "input": "",
    "output": "我们公司(XX科技)专注于为企业提供基于人工智能的数字化转型解决方案,主营业务包括智能客服系统、数据分析平台和自动化流程工具。"
  },
  {
    "instruction": "公司的核心价值观是什么?",
    "input": "",
    "output": "我们的核心价值观是:客户第一、创新为驱、合作共赢、诚信担当。"
  },
  {
    "instruction": "如果遇到产品技术问题,应该如何寻求支持?",
    "input": "",
    "output": "您可以采取以下步骤:1. 访问官网帮助中心搜索常见问题。2. 通过客户门户提交工单。3. 紧急问题可拨打7x24小时技术支持热线 400-xxx-xxxx。"
  }
]

将准备好的 train.json 文件放入之前挂载的 ~/llamafactory_workspace/data/ 目录下。

3.2 配置并启动训练任务

在 LLaMA-Factory Web UI 中,按照以下步骤操作:

1. 选择模型与路径

  • Model 标签页,选择 Model name 。如果你已将基础模型(如 Qwen2.5-7B-Instruct )下载到挂载的 models 目录,可以选择 Local 并指定路径(如 /app/models/Qwen2.5-7B-Instruct )。也可以直接输入 Hugging Face 模型 ID(如 Qwen/Qwen2.5-7B-Instruct ),程序会自动下载(需网络通畅)。
  • 确保 Model type 与所选模型匹配。

2. 配置训练参数(关键步骤) 切换到 Train 标签页。

  • Dataset : 点击 Browse ,选择你在 /app/data/train.json 的文件。
  • Template : 选择与基础模型匹配的对话模板,如 qwen2.5
  • Training Method : 对于资源有限的情况,强烈选择 LoRA QLoRA 。QLoRA 在 LoRA 基础上进一步量化,显存占用更小。
  • Output Directory : 设置模型输出路径,例如 /app/output/my_finetuned_model
  • Learning Rate : LoRA/QLoRA 的学习率通常设置得较小,如 5e-5 1e-4
  • Epochs : 训练轮数,根据数据量大小调整,通常 3-10 轮。
  • Batch Size : 根据 GPU 显存调整。在 24GB 显存上,对于 7B 模型,使用 QLoRA 可能可以设置到 4 或 8。
  • 其他参数 : 如 Cutoff Length (截断长度)、 LORA Rank (LoRA 秩,通常 8 或 16)等,可以暂时使用默认值。

3. 开始训练 点击 Start Training 按钮。Web UI 下方会显示训练日志,包括损失值变化。训练时间取决于数据量、模型大小和 epoch 数。

3.3 训练完成与模型导出

训练完成后,在指定的输出目录( ~/llamafactory_workspace/output/my_finetuned_model )下,你会看到类似如下的文件结构:

my_finetuned_model/
├── adapter_config.json      # LoRA 适配器配置
├── adapter_model.bin        # LoRA 权重文件(关键)
├── special_tokens_map.json
├── tokenizer_config.json
└── tokenizer.model

请注意 :使用 LoRA/QLoRA 微调后,生成的并非完整的模型权重,而是一个小的适配器文件( adapter_model.bin )。要得到完整的、可独立运行的模型,需要将适配器与原始基础模型进行合并。

LLaMA-Factory 提供了导出功能。在 Web UI 的 Export 标签页:

  1. Model name : 选择你刚才训练的任务或模型路径。
  2. Export to : 选择 Hugging Face 格式。
  3. Export dir : 设置合并后模型的输出路径,例如 /app/output/merged_model
  4. 点击 Start Export

合并完成后,你将在 merged_model 目录下看到完整的 Hugging Face 格式模型文件,包括 pytorch_model.bin config.json 等。这个模型已经可以像任何 Hugging Face 模型一样被加载和推理。

4. 将微调模型转换为 Ollama 格式

Ollama 无法直接使用 Hugging Face 格式的模型。我们需要将其转换为 GGUF 格式(一种流行的量化模型格式),然后通过 Modelfile 来创建 Ollama 模型包。

4.1 安装必要的转换工具

我们需要使用 llama.cpp 项目中的 convert.py quantize 工具。最方便的方式是使用其 Docker 镜像。

1. 拉取 llama.cpp 镜像

sudo docker pull ghcr.io/ggerganov/llama.cpp:full

这个镜像包含了所有必要的依赖和工具。

2. 准备模型目录 将上一步合并得到的 merged_model 目录复制到一个方便操作的位置,并确保其路径可以被 Docker 容器访问。

cp -r ~/llamafactory_workspace/output/merged_model ~/model_conversion/
cd ~/model_conversion

4.2 将 Hugging Face 模型转换为 GGUF 格式

GGUF 是 llama.cpp 引入的格式,替代了之前的 GGML,支持更好的扩展性和元数据。

1. 运行转换脚本

# 运行容器并挂载模型目录
sudo docker run -it --rm \
  -v $(pwd):/app \
  ghcr.io/ggerganov/llama.cpp:full \
  python3 /app/llama.cpp/convert.py /app/merged_model \
  --outtype f16 \
  --outfile /app/my_model.fp16.gguf
  • -v $(pwd):/app : 将当前目录挂载到容器的 /app
  • python3 /app/llama.cpp/convert.py ... : 执行容器内 llama.cpp 目录下的转换脚本。
  • /app/merged_model : 输入的 Hugging Face 模型路径(容器内路径)。
  • --outtype f16 : 指定输出为 FP16 精度。也可以选择 f32 (更高精度,更大文件)或 q4_0 (直接量化,但建议先转 FP16 再量化)。
  • --outfile /app/my_model.fp16.gguf : 指定输出的 GGUF 文件路径。

执行成功后,会在当前目录生成 my_model.fp16.gguf 文件。这个文件可能很大(例如 7B 模型的 FP16 格式约 14GB)。

2. (可选)量化模型以减小体积 为了部署更高效,我们通常会对模型进行量化,在几乎不损失精度的情况下大幅减小模型体积。

# 继续在同一个挂载目录下,在容器内执行量化命令
# 我们先进入容器交互模式
sudo docker run -it --rm \
  -v $(pwd):/app \
  ghcr.io/ggerganov/llama.cpp:full \
  /bin/bash

# 在容器内执行量化
./llama.cpp/quantize /app/my_model.fp16.gguf /app/my_model.q4_0.gguf q4_0
# 退出容器
exit
  • ./llama.cpp/quantize : 量化工具。
  • /app/my_model.fp16.gguf : 输入的 FP16 GGUF 文件。
  • /app/my_model.q4_0.gguf : 输出的量化后 GGUF 文件。
  • q4_0 : 量化方法, q4_0 是 4-bit 整数量化的一种,在精度和速度间取得较好平衡。还有 q5_0 , q8_0 等选项。

量化完成后,你会得到体积小得多的 my_model.q4_0.gguf 文件(7B 模型约 4GB)。

4.3 创建 Ollama Modelfile

Modelfile 是一个用于定义 Ollama 模型的蓝图,它告诉 Ollama 如何组装和运行你的模型。

~/model_conversion 目录下创建一个名为 Modelfile 的文件,内容如下:

FROM /app/my_model.q4_0.gguf

# 设置模型的参数
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096

# 设置系统提示词,这对于引导模型行为至关重要
SYSTEM """
你是一个专业的公司知识问答助手。请根据以下已知信息,用中文清晰、有条理地回答用户的问题。
如果问题超出已知信息范围,请礼貌地表示无法回答,并建议用户咨询其他渠道。
已知信息:
- 公司主营业务:人工智能数字化转型解决方案,包括智能客服、数据分析平台、自动化流程工具。
- 核心价值观:客户第一、创新为驱、合作共赢、诚信担当。
- 技术支持渠道:官网帮助中心、客户门户工单、7x24小时热线 400-xxx-xxxx。
"""

# 设置模型的元数据
TEMPLATE "{{ .Prompt }}"

# 指定适配的对话模板,需要与基础模型匹配
# 例如,对于 Qwen 模型,可以设置为 chatml
# SET parameter stop “[UNK]”
# SET parameter stop “<|im_end|>”

关键解释:

  • FROM : 指定基础模型文件,这里是我们量化后的 GGUF 文件。路径是容器内的路径(因为我们后续在容器内构建)。
  • PARAMETER : 设置模型推理时的超参数,如 temperature (创造性)、 top_p (核采样)、 num_ctx (上下文长度)。
  • SYSTEM : 这是微调模型发挥效果的关键 。系统提示词定义了模型的角色和回答边界。即使微调数据中包含了知识,一个清晰的 SYSTEM 提示也能显著提升回答的准确性和规范性。
  • TEMPLATE : 定义如何将用户输入和聊天历史格式化为模型可理解的字符串。对于简单的问答,可以直接使用 {{ .Prompt }} 。对于复杂的多轮对话模型,需要更复杂的模板(如 chatml )。

4.4 构建 Ollama 模型

现在,我们可以使用这个 Modelfile 来构建一个 Ollama 可用的模型包。首先确保 Ollama 已安装在宿主机上。

1. 安装 Ollama

# 在 Linux 上安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh

2. 构建自定义模型 我们需要在包含 Modelfile .gguf 文件的目录下执行构建命令。Ollama 的 create 命令会根据 Modelfile 创建模型。

cd ~/model_conversion
ollama create my-company-helper -f ./Modelfile
  • my-company-helper : 这是你为自定义模型起的名字。
  • -f ./Modelfile : 指定 Modelfile 的路径。

Ollama 会读取 Modelfile ,加载 FROM 指定的 .gguf 文件,并应用所有配置,最终在本地创建一个名为 my-company-helper 的模型。

3. 验证模型列表 构建完成后,可以查看本地已有的模型:

ollama list

你应该能看到类似如下的输出:

NAME                ID              SIZE    MODIFIED
my-company-helper   xxxxxxxxxxxx    4.2 GB  2 minutes ago

至此,我们已经成功地将 LLaMA-Factory 微调出的模型,转换并打包成了一个标准的 Ollama 模型。在下一部分,我们将详细讲解如何部署这个模型并进行访问测试,同时深入探讨部署后的性能监控、常见问题排查以及生产环境的最佳实践。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐