LLaMA-Factory 快速开发自定义大模型实战指南
基于 LLaMA-Factory 框架进行大模型微调的全流程,涵盖环境搭建、数据集构建、LoRA 指令微调、推理测试、效果评估及模型导出部署。通过命令行与 WebUI 两种方式,演示了从原始模型验证到 GGUF 格式转换至 Ollama 部署的完整链路,帮助开发者快速掌握垂直领域大模型的训练与应用。

基于 LLaMA-Factory 框架进行大模型微调的全流程,涵盖环境搭建、数据集构建、LoRA 指令微调、推理测试、效果评估及模型导出部署。通过命令行与 WebUI 两种方式,演示了从原始模型验证到 GGUF 格式转换至 Ollama 部署的完整链路,帮助开发者快速掌握垂直领域大模型的训练与应用。

开源大模型如 LLaMA、Qwen、Baichuan 等主要都是使用通用数据进行训练而来,其对于不同下游的使用场景和垂直领域的效果有待进一步提升,衍生出了微调训练相关的需求,包含预训练(pt)、指令微调(sft)、基于人工反馈的对齐(rlhf)等全链路。但大模型训练对于显存和算力的要求较高,同时也需要下游开发者对大模型本身的技术有一定了解,具有一定的门槛。
LLaMA-Factory 项目的目标是整合主流的各种高效训练微调技术,适配市场主流开源模型,形成一个功能丰富、适配性好的训练框架。项目提供了多个高层次抽象的调用接口,包含多阶段训练、推理测试、benchmark 评测、API Server 等,使开发者开箱即用。同时借鉴 Stable Diffusion WebUI 相关,本项目提供了基于 Gradio 的网页版工作台,方便初学者可以迅速上手操作,开发出自己的第一个模型。
以 Meta-Llama-3-8B-Instruct 模型和 Linux + RTX 4090 24GB 环境,LoRA+sft 训练阶段为例子,帮助开发者迅速浏览和实践本项目会涉及到的常见若干个功能,包括:
• 原始模型直接推理 • 自定义数据集构建 • 基于 LoRA 的 sft 指令微调 • 动态合并 LoRA 的推理 • 批量预测和训练效果评估 • LoRA 模型合并导出 • 一站式 webui board 的使用 • API Server 的启动与调用 • 大模型主流评测 benchmark • 导出 GGUF 格式,使用 Ollama 推理
本教程大部分内容都可以通过 LLaMA-Factory 下的 README.md、data/README.md、examples 文件夹下的示例脚本得到,遇到问题请先阅读项目原始相关资料。
关于全参训练、flash-attention 加速、deepspeed、rlhf、多模态模型训练等更高阶 feature 的使用,后续会有额外的教程来介绍。
训练顺利运行需要包含 4 个必备条件:
• 1. 机器本身的硬件和驱动支持(包含显卡驱动,网络环境等) • 2. 本项目及相关依赖的 python 库的正确安装(包含 CUDA,Pytorch 等) • 3. 目标训练模型文件的正确下载 • 4. 训练数据集的正确构造和配置
显卡驱动和 CUDA 的安装,网络教程很多,不在本教程范围以内。
使用以下命令做最简单的校验:
nvidia-smi
预期输出如图,显示 GPU 当前状态和配置信息。
那多大的模型用什么训练方式需要多大的 GPU 呢,可参考官方文档。新手建议是 3090 和 4090 起步,可以比较容易地训练比较主流的入门级别大模型 7B 和 8B 版本。
请参考项目的 readme 进行安装。
2024 年 51 期间系统版本有较大升级,2024-06-07 号的安装版本命令如下,请注意 conda 环境的激活。
git clone https://github.com/hiyouga/LLaMA-Factory.git
conda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e '.[torch,metrics]'
上述的安装命令完成了如下几件事:
• 1. 新建一个 LLaMA-Factory 使用的 python 环境(可选) • 2. 安装 LLaMA-Factory 所需要的第三方基础库(requirements.txt 包含的库) • 3. 安装评估指标所需要的库,包含 nltk, jieba, rouge-chinese • 4. 安装 LLaMA-Factory 本身,然后在系统中生成一个命令 llamafactory-cli(具体用法见下方教程)
安装后使用以下命令做简单的正确性校验。
import torch
torch.cuda.current_device()
torch.cuda.get_device_name(0)
torch.__version__
预期输出如图。如果识别不到可用的 GPU,则说明环境准备还有问题,需要先进行处理,才能往后进行。
同时对本库的基础安装做一下校验,输入以下命令获取训练相关的参数指导,否则说明库还没有安装成功:
llamafactory-cli train -h
项目支持通过模型名称直接从 huggingface 和 modelscope 下载模型,但这样不容易对模型文件进行统一管理,所以这里建议使用手动下载,然后后续使用时使用绝对路径来控制使用哪个模型。
以 Meta-Llama-3-8B-Instruct 为例,通过 huggingface 下载(可能需要先提交申请通过):
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct
modelscope 下载(适合中国大陆网络环境):
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git
或者
# 模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct')
按网友反馈,由于网络环境等原因,文件下载后往往会存在文件不完整的很多情况,下载后需要先做一下校验,校验分为两部分,第一先检查一下文件大小和文件数量是否正确,和原始的 huggingface 显示的做一下肉眼对比。
第二步是跑一下官方 README 里提供的原始推理 demo,验证模型文件的正确性和 transformers 库等软件的可用:
import transformers
import torch
# 切换为你下载的模型文件目录,这里的 demo 是 Llama-3-8B-Instruct
# 如果是其他模型,比如 qwen,chatglm,请使用其对应的官方 demo
model_id = "/media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct"
pipeline = transformers.pipeline(
"text-generation",
model=model_id,
model_kwargs={"torch_dtype": torch.bfloat16},
device_map="auto",
)
messages = [
{"role": "system", "content": "You are a pirate chatbot who always responds in pirate speak!"},
{"role": "user", "content": "Who are you?"},
]
prompt = pipeline.tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
terminators = [
pipeline.tokenizer.eos_token_id,
pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
outputs = pipeline(
prompt,
max_new_tokens=256,
eos_token_id=terminators,
do_sample=True,
temperature=0.6,
top_p=0.9,
)
print(outputs[0]["generated_text"][len(prompt):])
在进行后续的环节之前,我们先使用推理模式,先验证一下 LLaMA-Factory 的推理部分是否正常。LLaMA-Factory 带了基于 Gradio 开发的 ChatBot 推理页面,帮助做模型效果的人工测试。在 LLaMA-Factory 目录下执行以下命令。
本脚本参数参考自 LLaMA-Factory/examples/inference/llama3.yaml。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--template llama3
CUDA_VISIBLE_DEVICES=0 是指定了当前程序使用第 0 张卡,是指定全局变量的作用,也可以不使用。
llamafactory-cli webchat \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--template llama3
需要注意的是,本次及后续所有的程序的入口都是 llamafactory-cli,通过不同的参数控制现在是实现什么功能,比如现在是想使用网页版本直接推理,所以第一个参数设置为 webchat,所有的可选项包括命令行帮助信息。
另外两个关键参数解释如下,后续的基本所有环节都会继续使用这两个参数:
| 参数名称 | 参数说明 |
|---|---|
| model_name_or_path | 参数的名称(huggingface 或者 modelscope 上的标准定义,如'meta-llama/Meta-Llama-3-8B-Instruct'),或者是本地下载的绝对路径,如/media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct |
| template | 模型问答时所使用的 prompt 模板,不同模型不同,请参考 LLaMA-Factory 仓库获取不同模型的模板定义,否则会回答结果会很奇怪或导致重复生成等现象的出现。chat 版本的模型基本都需要指定,比如 Meta-Llama-3-8B-Instruct 的 template 就是 llama3 |
当然你也可以提前把相关的参数存在 yaml 文件里,比如 LLaMA-Factory/examples/inference/llama3.yaml。本地位置是 examples/inference/llama3.yaml,内容如下:
model_name_or_path: /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct
template: llama3
这样就可以通过如下命令启动,其效果跟上面是一样的,但是更方便管理:
llamafactory-cli webchat examples/inference/llama3.yaml
效果如图,可通过 http://localhost:7860/ 进行访问。
注意:这里的 localhost:7860 指的是程序启动机器自身的 7860 端口,云上的用户可能无法通过本地的笔记本电脑直接访问,需要找云厂商获取域名和端口号的一些配置关系进行配置。
比如阿里云用户需要做一下如下环境变量的配置才能正常运行 gradio,然后再通过阿里云给的域名映射访问:
export GRADIO_ROOT_PATH=/${JUPYTER_NAME}/proxy/7860/
数据集的格式要求在不同的阶段是不同的,本教程以 sft 阶段的数据集需求,将以系统自带的 identity 数据集和将自定义的一个商品文案生成数据集为例,介绍数据集的使用。更多详情可以在 LLaMA-Factory 仓库中找到相关解释。
系统目前支持 alpaca 和 sharegpt 两种数据格式,以 alpaca 为例,整个数据集是一个 json 对象的 list,具体数据格式为:
[
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
"history": [
["第一轮指令(选填)", "第一轮回答(选填)"],
["第二轮指令(选填)", "第二轮回答(选填)"]
]
}
]
例子比如单轮(alpaca_data_zh_51k.json 中的例子,数据集在 data/dataset_info.json 中注册为 alpaca_zh):
{
"instruction": "写一个有效的比较语句",
"input": "篮球和足球",
"output": "篮球和足球都是受欢迎的运动。"
}
和多轮(oaast_sft_zh.json 中的例子,数据集在 data/dataset_info.json 中注册为 oaast_sft_zh):
{
"instruction": "谢谢",
"input": "",
"output": "不用谢!很高兴我提供的信息能够帮助到你!如果还有什么其他问题也可以向我提问。",
"history": [
[
"请你给我写一个面试准备计划,我想要去面试微软的程序员岗位",
"首先,你可以去微软官网寻找招聘信息并申请面试。\n其次,您可以在社交媒体平台寻找微软公司对程序员的面试问题,并做好准备。\n最后,您可以自己对面试过程进行模拟,熟悉话题并减少紧张感。\n我希望你能面试成功。"
]
]
}
所以我们训练的数据最好也转换成这种格式,然后在 data/dataset_info.json 中进行注册(如果不做字段名称转换,则需要在注册的时候在 columns 字段中做两个数据的映射配置)。
接下来,我们使用两个具体的例子来说明数据集的使用。
第一个是系统自带的 identity.json 数据集 (已默认在 data/dataset_info.json 注册为 identity),对应文件已经在 data 目录下,我们通过操作系统的文本编辑器的替换功能,可以替换其中的 NAME 和 AUTHOR,换成我们需要的内容。如果是 linux 系统,可以使用 sed 完成快速替换。比如助手的名称修改为 PonyBot,由 LLaMA Factory 开发:
sed -i 's/{{name}}/PonyBot/g' data/identity.json
sed -i 's/{{author}}/LLaMA Factory/g' data/identity.json
替换前:
{
"instruction": "Who are you?",
"input": "",
"output": "Hello! I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?"
}
替换后:
{
"instruction": "Who are you?",
"input": "",
"output": "I am PonyBot, an AI assistant developed by LLaMA Factory. How can I assist you today?"
}
第二个是一个商品文案生成数据集,原始链接为清华大学网盘分享。原始格式如下,很明显,训练目标是输入 content(也就是 prompt),输出 summary(对应 response):
{
"content": "类型#裤*版型#宽松*风格#性感*图案#线条*裤型#阔腿裤",
"summary": "宽松的阔腿裤这两年真的吸粉不少,明星时尚达人的心头爱。毕竟好穿时尚,谁都能穿出腿长 2 米的效果宽松的裤腿,当然是遮肉小能手啊。上身随性自然不拘束,面料亲肤舒适贴身体验感棒棒哒。系带部分增加设计看点,还让单品的设计感更强。腿部线条若隐若现的,性感撩人。颜色敲温柔的,与裤子本身所呈现的风格有点反差萌。"
}
想将该自定义数据集放到我们的系统中使用,则需要进行如下两步操作:
在准备好数据集之后,我们就可以开始准备训练了,我们的目标就是让原来的 LLaMA3 模型能够学会我们定义的'你是谁',同时学会我们希望的商品文案的一些生成。
这里我们先使用命令行版本来做训练,从命令行更容易学习相关的原理。
本脚本参数改编自 LLaMA-Factory/examples/train_lora/llama3_lora_sft.yaml。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--dataset alpaca_gpt4_zh,identity,adgen_local \
--dataset_dir ./data \
--template llama3 \
--finetuning_type lora \
--output_dir ./saves/LLaMA3-8B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 50 \
--warmup_steps 20 \
--save_steps 100 \
--eval_steps 50 \
--evaluation_strategy steps \
--load_best_model_at_end \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
关于参数的完整列表和解释可以通过如下命令来获取:
llamafactory-cli train -h
这里我对部分关键的参数做一下解释,model_name_or_path 和 template 上文已解释。
注意:精度相关的参数还有 bf16 和 pure_bf16,但是要注意有的老显卡,比如 V100 就无法支持 bf16,会导致程序报错或者其他错误
训练过程中,系统会按照 logging_steps 的参数设置,定时输出训练日志,包含当前 loss,训练进度等。
训练完后就可以在设置的 output_dir 下看到如下内容,主要包含 3 部分:
关于 loss 是什么等,这块不在本教程讨论内容范围之内,只需要记住 loss 在正常情况下会随着训练的时间慢慢变小,最后需要下降到 1 以下的位置才会有一个比较好的效果,可以作为训练效果的一个中间指标。
本脚本参数改编自 LLaMA-Factory/examples/inference/llama3_lora_sft.yaml。
当基于 LoRA 的训练进程结束后,我们如果想做一下动态验证,在网页端里与新模型对话,与步骤 4 的原始模型直接推理相比,唯一的区别是需要通过 finetuning_type 参数告诉系统,我们使用了 LoRA 训练,然后将 LoRA 的模型位置通过 adapter_name_or_path 参数即可。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
效果如下,可以看到,模型整个已经在学习了新的数据知识,学习了新的身份认知和商品文案生成的格式。
作为对比,如果删除 LoRA 相关参数,只使用原始模型重新启动测试,可以看到模型还是按照通用的一种回答。
如果不方便使用 webui 来做交互,使用命令行来做交互,同样也是可以的。
本脚本改编自 LLaMA-Factory/examples/inference/llama3_lora_sft.yaml。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
效果如下。
当然上文中的人工交互测试,会偏感性,那有没有办法批量地预测一批数据,然后使用自动化的 bleu 和 rouge 等常用的文本生成指标来做评估。指标计算会使用如下 3 个库,请先做一下 pip 安装:
pip install jieba
pip install rouge-chinese
pip install nltk
本脚本改编自 LLaMA-Factory 仓库。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_predict \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--eval_dataset alpaca_gpt4_zh,identity,adgen_local \
--dataset_dir ./data \
--template llama3 \
--finetuning_type lora \
--output_dir ./saves/LLaMA3-8B/lora/predict \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_eval_batch_size 1 \
--max_samples 20 \
--predict_with_generate
与训练脚本主要的参数区别如下两个:
• --do_predict:表示进入预测模式
• --eval_dataset:指定用于评估的数据集
最后会在 output_dir 下看到如下内容:
其中 generated_predictions.jsonl 文件输出了要预测的数据集的原始 label 和模型 predict 的结果。 predict_results.json 给出了原始 label 和模型 predict 的结果,用自动计算的指标数据。
这里给相关的指标做一下进一步的解释:
• BLEU:衡量生成文本与参考文本的 n-gram 重叠程度 • ROUGE:衡量召回率,常用于摘要任务 • METEOR:综合考虑精确率和召回率
如果想把训练的 LoRA 和原始的大模型进行融合,输出一个完整的模型文件的话,可以使用如下命令。合并后的模型可以自由地像使用原始的模型一样应用到其他下游环节,当然也可以递归地继续用于训练。
本脚本改编自 LLaMA-Factory/examples/inference/llama3_lora_sft.yaml。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora \
--export_dir merged-model-path \
--export_size 2 \
--export_device cpu \
--export_legacy_format False
到这里,恭喜你完成了 LLaMA-Efficient-Tuning 训练框架的基础使用,那还有什么内容是没有介绍的呢?还有很多!这里介绍一个在提升交互体验上有重要作用的功能,支持模型训练全链路的一站式 WebUI board。一个好的产品离不开好的交互,Stable Diffusion 的大放异彩的重要原因除了强大的内容输出效果,就是它有一个好的 WebUI。这个 board 将训练大模型主要的链路和操作都在一个页面中进行了整合,所有参数都可以可视化地编辑和操作。
通过以下命令启动:
注意:目前 webui 版本只支持单机单卡和单机多卡,如果是多机多卡请使用命令行版本
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui
如果要开启 gradio 的 share 功能,或者修改端口号:
CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=1 GRADIO_SERVER_PORT=7860 llamafactory-cli webui
如图所示,上述的多个不同的大功能模块都通过不同的 tab 进行了整合,提供了一站式的操作体验。
当各种参数配置好后,在 train 页面,可以通过预览命令功能,将训练脚本导出,用于支持多 gpu 训练。
点击开始按钮,即可开始训练,网页端和服务器端会同步输出相关的日志结果。
训练完毕后,点击'刷新适配器',即可找到该模型历史上使用 webui 训练的 LoRA 模型文件,后续再训练或者执行 chat 的时候,即会将此 LoRA 一起加载。
训练好后,可能部分同学会想将模型的能力形成一个可访问的网络接口,通过 API 来调用,接入到 langchain 或者其他下游业务中,项目也自带了这部分能力。
API 实现的标准是参考了 OpenAI 的相关接口协议,基于 uvicorn 服务框架进行开发,使用如下的方式启动。
本脚本改编自 LLaMA-Factory 仓库。
CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
项目也支持了基于 vllm 的推理后端,但是这里由于一些限制,需要提前将 LoRA 模型进行 merge,使用 merge 后的完整版模型目录或者训练前的模型原始目录都可。
CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \
--model_name_or_path merged-model-path \
--template llama3 \
--infer_backend vllm \
--vllm_enforce_eager
服务启动后,即可按照 openai 的 API 进行远程访问,主要的区别就是替换其中的 base_url,指向所部署的机器 url 和端口号即可。
import os
from openai import OpenAI
from transformers.utils.versions import require_version
require_version("openai>=1.5.0", "To fix: pip install openai>=1.5.0")
if __name__ == '__main__':
# change to your custom port
port = 8000
client = OpenAI(
api_key="0",
base_url="http://localhost:{}/v1".format(os.environ.get("API_PORT", 8000)),
)
messages = []
messages.append({"role": "user", "content": "hello, where is USA"})
result = client.chat.completions.create(messages=messages, model="test")
print(result.choices[0].message)
虽然大部分同学的主流需求是定制一个下游的垂直模型,但是在部分场景下,也可能有同学会使用本项目来做更高要求的模型训练,用于大模型刷榜单等,比如用于评测 mmlu 等任务。当然这类评测同样可以用于评估大模型二次微调之后,对于原来的通用知识的泛化能力是否有所下降。(因为一个好的微调,尽量是在具备垂直领域知识的同时,也保留了原始的通用能力)
本项目提供了 mmlu,cmmlu, ceval 三个常见数据集的自动评测脚本,按如下方式进行调用即可。
说明:task 目前支持 mmlu_test, ceval_validation, cmmlu_test
本脚本改编自 LLaMA-Factory 仓库。
如果是 chat 版本的模型:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli eval \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--template llama3 \
--task mmlu_test \
--lang en \
--n_shot 5 \
--batch_size 1
输出如下,具体任务的指标定义请参考 mmlu,cmmlu, ceval 等任务原始的相关资料,和 llama3 的官方报告基本一致:
Average: 63.64 STEM: 50.83 Social Sciences: 76.31 Humanities: 56.63 Other: 73.31
如果是 base 版本的模型,template 改为 fewshot 即可:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli eval \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B \
--template fewshot \
--task mmlu \
--split validation \
--lang en \
--n_shot 5 \
--batch_size 1
GGUF 是 llama.cpp 设计的大模型存储格式,可以对模型进行高效的压缩,减少模型的大小与内存占用,从而提升模型的推理速度和效率。Ollama 框架可以帮助用户快速使用本地的大型语言模型,那如何将 LLaMA-Factory 项目的训练结果导出到 Ollama 中部署呢?需要经过如下几个步骤:
• 1. 将 lora 模型合并 • 2. 安装 gguf 库 • 3. 使用 llama.cpp 的转换脚本将训练后的完整模型转换为 gguf 格式 • 4. 安装 Ollama 软件 • 5. 注册要部署的模型文件 • 6. 启动 Ollama
1-3 步是准备好 gguf 格式的文件,这也是 Ollama 所需要的标准格式。 4-6 步就是如何在 Ollama 环境中启动训练后的模型。
参考上文的第 9 步,这里笔者合并后的完整模型目录的绝对位置假设为 /home/codingma/code/LLaMA-Factory/merged-model-path。
注意:这里笔者往下遇到了 Ollama 推理会无法停止,或者重复输出,胡言乱语的问题,排查主要是二次训练保存后,tokenizer 的 EOS 编码和 template 有变化,如果也遇到了类似的问题,可以尝试将合并后的目录下的 tokenizer_config.json 和 special_tokens_map.json 两个文件删除,从 LLaMA3 原始的模型文件中将两者 copy 和覆盖过来,然后再继续后面的流程。
笔者发现直接 pip 安装 gguf,并不是最新的版本,和最新的转换脚本会不兼容,所以还是推荐从源码安装:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp/gguf-py
pip install --editable .
返回 llama.cpp 项目根目录,会有一个官方提供的 convert-hf-to-gguf.py 脚本,用于完成 huggingface 格式到 gguf 格式的转换。
cd ..
python convert-hf-to-gguf.py /home/codingma/code/LLaMA-Factory/merged-model-path
转换成功可在 merged-model-path 路径下得到如下的 gguf 文件。
本文是 linux 环境,所以用了对应的下载和安装方式,如果是其他系统的用户可以按照 https://ollama.com/download 的说明完成下载安装:
curl -fsSL https://ollama.com/install.sh | sh
Ollama 对于要部署的模型需要提前完成本地的配置和注册,和 Docker 的配置很像。
编写一个文件名为 Modelfile 的文件,内容如下:
FROM /home/codingma/code/LLaMA-Factory/merged-model-path
然后命令行注册该文件,设定该文件对应的模型名称,这里设定 llama3-chat-merged:
ollama create llama3-chat-merged -f Modelfile
需要说明的是,因为 LLaMA3 的实现本身相对规范,所以 Modelfile 的编写相对很简洁,反之对于其他一些模型,可能还需要在里面自主完成 template prompt 格式的注册,否则问答时会出现答非所问的情况。
上面注册好后,即可通过 ollama 命令 + 模型名称的方式,完成服务的启动:
ollama run llama3-chat-merged
启动后即可通过交互式完成问答,输入 /bye 即可退出。
通过以上步骤,我们已经完成了从环境搭建、数据准备、模型微调、评估到部署的全流程。在实际应用中,建议遵循以下最佳实践:
掌握 LLaMA-Factory 工具链后,开发者可以更高效地探索大模型在垂直领域的应用潜力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online