LLaMA Factory微调后的模型合并导出和部署-4

发布时间:2025-06-27 18:41:35编辑:123阅读(83)

    微调过程观察

    微调过程中,可以通过右下角的 LOSS 曲线来简单观测整个微调过程。

    image.png


    LOSS(损失值)

    在模型微调中,LOSS(损失函数)是一个可微的数学函数,它量化了模型预测结果与真实目标值之间的误差(输出为一个标量数值)。微调的核心目标就是通过优化算法(如梯度下降)持续最小化这个 LOSS 值:计算 LOSS 对模型参数的梯度,并据此调整参数,使预测误差不断减小。LOSS 值的高低直接反映了模型预测的准确性,其持续下降是学习过程有效的关键指标。LOSS 是什么?

    简单说,LOSS 就是模型在微调过程中犯错误的“程度”的评分,它是一个数字。

    怎么算出来的?

    模型对一条数据做预测(比如判断图片是猫还是狗)。然后,我们把模型的预测结果和这条数据的正确答案拿出来对比。

    对比什么?

    对比模型“猜”得有多不准。猜得越离谱,这个错误评分(LOSS)就越大;猜得越接近正确答案,这个错误评分(LOSS)就越小。

    微调时用它干什么

    微调的核心目标就是让模型少犯错。所以,微调过程就是想尽办法让这个 LOSS(错误评分)变得越来越小。

    怎么变小?

    模型内部有很多可以调整的小旋钮(参数)。微调算法会根据当前这个 LOSS 值,自动计算出应该拧哪些旋钮、往哪个方向拧(增大一点还是减小一点),才能让下次遇到类似数据时,错误评分(LOSS)降低一些。

    为什么关心它?

    在微调过程中,我们主要盯着 LOSS 的变化趋势。如果 LOSS 稳定地下降,说明模型的调整是有效的,它在学习,错误在减少。如果 LOSS 不降反升或者剧烈波动,就说明学习过程可能出了问题。

    常见误区

    LOSS 曲线很好看(逐步下降趋于平缓),不代表模型最终的训练效果一定会好,它只能表示整个训练过程是没问题的。



    在LLaMA Factory中配置SwanLab后s,可以通过链接访问到云后台的监控图表

    image.png

    打开url:https://swanlab.cn/@SamAAA/web_security_sft/runs/jkb7l3wmijhof1wo64lrl/chart

    image.png


    几种常见的 LOSS 曲线

    特征1:Loss持续不降:训练过程中Loss始终保持高位,无下降趋势。

    可能原因:学习率(Learning Rate)过小:参数更新幅度不足,模型难以优化,难以学到东西。可以尝试加大学习率。

    数据无规律/噪声大:数据中存在大量异常值/缺失值。

    曲线示例图表:

    image.png


    特征2:Loss持续下降但不收敛:Loss一直在下降,但收敛速度极慢,训练结束时仍未达到理想水平。

    可能原因:训练轮数太小,不收敛的情况下可以一直增大训练轮数(不要超过10),反之提前收敛可以减小训练轮数。

    曲线示例图表:

    image.png


    特征3:Loss震荡波动:Loss曲线频繁上下起伏,无稳定下降趋势。

    可能的原因:学习率(Learning Rate)过大:参数更新幅度过大,导致优化路径震荡。批量大小(Batch Size)过小:单次更新的梯度噪声大,方向不稳定。

    曲线示例图表:

    image.png


    特征4:Loss先降后停/趋于稳定:训练初期Loss下降明显,后期停滞在某一值附近。

    可能的原因:学习率衰减至过低:模型进入“学习瓶颈”,无法进一步优化。已收敛到局部最优:当前参数下Loss无法继续降低。过拟合:模型在训练集上表现良好,但泛化能力不足(需结合验证集判断)。

    曲线示例图表:

    image.png


    特征5:Loss下降后反弹/上升:Loss下降到一定程度后突然回升。

    可能的原因:学习率突变:如突然增大学习率导致参数更新“冲过”最优解。数据异常:训练集中混入噪声或异样样本数据。模型结构问题:如网络层数过多导致过拟合,或层间参数不匹配。

    曲线示例图表:

    image.png


    特征6:理想形态:Loss逐步下降并趋于平缓。

    可能的原因:各种参数和数据集都挺好(但并不代表模型最终的效果就好)

    曲线示例图表:

    image.png


    Train LOSS 与 Eval LOSS

    当在微调参数中设定了一定的验证集比例,将会多生成一条 Eval LOSS 曲线,体现模型在验证集上的表现。

    image.png


    特征1:Train Loss下降,Eval Loss上升:模型在训练集上表现越来越好,但验证集损失反升。

    可能的原因:过拟合:模型过度记忆训练数据细节,泛化能力不足。一般就是数据集质量太差了。

    曲线示例:

    image.png


    特征2:Train Loss和Eval Loss均高位:训练损失和验证损失都居高不下。

    可能的原因:欠拟合:和上面一样的原因,模型没学到东西,需要调大学习率、Lora秩、或者增强数据集质量。

    曲线示例:

    image.png


    特征3:Train Loss高Eval Loss低:训练损失居高不下,验证损失正常下降。

    可能的原因:数据分布问题:验证集数据比训练集数据简单,或两者分布差异大,确保训练集与验证集分布一致,重新划分数据集。

    曲线示例:

    image.png


    特征4:Eval Loss降得快:验证损失下降明显快于训练损失。

    可能的原因:数据分布问题:验证集可能包含更多“易例”样本,或者训练集存在“难例”样本未被模型学习。可以在训练集中增加“难例”样本,或者减少验证集“易例”样本。

    曲线示例:

    image.png


    特征5:理想形态:Train Loss和Eval Loss同步下降。

    可能的原因:模型在有效学习,且未出现过拟合,可继续训练直至收敛。

    曲线示例:

    image.png



    微调后模型使用及效果验证

    加载模型(通过Lora适配器)

    微调任务完成后,进入在启动微调时,设定的输出目录:

    image.png

    进到输出目录:

    cd /home/sam_admin/LLaMA-Factory/models/model_output

    可以看到输出的所有文件

    image.png

    包括这几类:

    1 模型权重文件

    adapter_model.safetensors:LoRA 适配器的权重文件(核心增量参数)

    checkpoint-100/200/...:不同步数的训练检查点(含模型参数,用于恢复训练)

    2 配置文件

    adapter_config.json:LoRA 训练配置(如秩、目标层等)

    tokenizer_config.json / 

    special_tokens_map.json:分词器配置

    training_args.yaml / training_args.bin:训练超参数(学习率、批次等)

    3 日志与结果

    trainer_log.jsonl / running_log.txt:训练过程日志

    all_results.json / train_results.json:训练指标(损失、精度等)

    training_loss.png:损失曲线可视化图

    4 分词器数据

    merges.txt:BPE 分词合并规则

    tokenizer.json / vocab.json:分词器词表与编码规则

    added_tokens.json:训练中新增的自定义 Token

    在 LoRA 微调中,只会训练插入的低秩矩阵(适配器),原模型参数被冻结不变,因此输出目录中仅包含 Lora 适配器,不包含模型原始权重。如果要得到微调后的完整模型,需后续手动合并适配器与原模型。


    下面,可能想快速对微调后的模型效果进行简单的验证,可以在 Webui 中通过检查点路径,加载这个适配器,并且重新加载模型,注意检查点路径填写微调后的输出目录,模型路径还填写微调前基础模型的路径:

    image.png

    效果验证(注意调一下最大生成长度,默认的 1024 比较小,非常容易截断):

    image.png


    模型合并和导出

    以上的使用方式只适用于临时测试,后续使用微调后的模型不可能每次都同时加载一个适配器和模型,所以为了后续方便使用,需要将原始模型和 Lora 适配器进行合并,然后导出。重新把微调输出目录填入检查点路径,然后重新加载模型,并设定一个导出目录(这里可以设定模型输出后的量化等级、以及一键上传 Hugging Face 等等,可以选择设置):

    image.png

    导出成功后,进入导出目录,可以看到合并后的模型文:

    image.png

    然后清空检查点路径,将合并后的模型目录填入模型路径,重新加载模型,重新测试,可以得到和之前一样的效果:

    image.png


    本地调用微调后的模型

    下面要考虑在本地部署并通过 API 的方式调用微调后的模型,目前两个主流的本地部署模型的方案分别是 Ollama 和 VLLM:


    Ollama 是一款专注于本地部署的轻量级大模型工具,以 “开箱即用” 为核心理念,支持全平台,一键安装后即可通过命令行快速启动模型。它内置 1700 + 主流模型库(如 Llama、Qwen、Mistral),自动下载优化后的量化版本(如 int4 量化),显存占用降低 50%,14B 模型仅需 11GB 显存即可运行。Ollama 提供类 ChatGPT 的交互界面,支持流式输出和 JSON 响应,适合个人开发者快速验证模型能力、本地测试或对隐私敏感的场景(如医疗数据处理),且兼容 CPU 推理(需 16GB + 内存)和 GPU 加速,硬件门槛极低。最新版本已支持视觉模型,可处理多模态任务。


    VLLM 是专为高性能推理设计的企业级框架,基于PyTorch构建,创新性引入 PagedAttention 技术,将KV Cache分块存储,显存利用率提升30%,支持4K以上长文本推理。其动态批处理技术实现高吞吐量(如Llama-8B在H100上可达5000+ tokens/s),是 Ollama 的5倍,并原生支持多 GPU 张量并行,可在 8 台H100 服务器上部署 70B 模型,支撑日均1亿次请求,响应延迟<500ms。VLLM 兼容 HuggingFace 模型,提供 Prometheus 监控和自动故障恢复机制,适合电商搜索、智能客服等高并发场景,以及多模态任务。

    image.png

    选 Ollama:需求为快速部署、低硬件门槛、交互式对话,例如个人开发者测试模型、小型团队搭建内部工具。

    选 VLLM:需求为高性能推理、高并发处理、多GPU扩展,例如电商平台支撑亿级请求、科研机构处理大规模数据,或需定制化模型参数的场景。


    通过 vLLM调用

    安装VLLM

    pip install vllm==0.9.1 -i https://mirrors.aliyun.com/pypi/simple

    在 LLaMA Factory 中,提供了 llamafactory-cli api 命令来帮助我们快速将模型部署为 API 调用,通过指定  --infer_backend vllm  参数可以启用 VLLM 推理(如果不指定,默认使用的是 Huggingface 推理引擎):

    API_PORT=6006 API_MODEL_NAME=security llamafactory-cli api \

        --model_name_or_path /home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security \

        --template default \

        --infer_backend vllm \

        --vllm_enforce_eager

    环境变量:

    API_PORT=6006:设定 API 服务要监听的端口号为6006。

    API_MODEL_NAME=security:给 API 服务所使用的模型设定一个自定义名称,如果不指定默认会使用 gpt-3.5-turbo。


    命令行参数

    --model_name_or_path /home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security:指定模型的路径。

    --template default:指定对话模板为默认。

    --infer_backend vllm:把推理后端设置为 vLLM。

    --vllm_enforce_eager:强制 vLLM 用动态图模式,这种模式在调试或者需要确定性执行顺序时非常有用。


    当服务输出以下内容时表示成功启动:

    image.png

    通过 http://localhost:6006/docs 可以访问部署后的 API 接口文档(可以看到是符合 OPEN AI 格式的):

    image.png

    尝试获取模型列表,可以看到返回了指定好的 security 模型:

    image.png

    可以尝试在一些聊天客户端添加自定义提供商,打开Cherry Studio:

    image.png

    测试调用自定义API:

    image.png


    通过 Ollama 调用

    Ollama 是建立在 llama.cpp 开源推理引擎基础上的大模型推理工具框架,其主要支持运行 GGUF 格式的模型。

    image.png

    GGUF(GGML Universal File)是专为大型语言模型(LLM)设计的文件格式,其优化了数据的存储方式,减少了存储空间的占用,这对于包含大量参数的大型模型尤为重要。

    相比于默认的 BF16 精度(每个参数占用 16 位(2 字节)),4BIT 量化(每个参数仅占用 4 位(0.5 字节))可以将模型推理的显存占用降低 75%。所以使用 Ollama 运行 7B 的模型大概仅需要 4G 显存(考虑到其他开销实际可能更大一点)。但是量化后的模型也就意味着会损失一定精度,这也是为什么大家在使用 Ollama 运行模型总觉得会比和其他方式运行模型变得 “更傻” 的原因。

    LLaMA Factory 默认并没有将模型转换为 GGUF 的方法,需要自己 llama.cpp 的仓库,使用其中的转换脚本:

    cd /home/sam_admin

    git clone https://github.com/ggml-org/llama.cpp.git

    cd llama.cpp/gguf-py

    pip install --editable .

    image.png

    下载并安装好依赖后,执行其中的脚本,将模型目录指定为刚刚导出的合并好的目录:

    cd /home/sam_admin/llama.cpp

    python convert_hf_to_gguf.py /home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security --outtype q8_0

    开始转换:

    image.png

    转换成功后,将在微调后合并的模型目录下生产一个 GGUF 文件(/home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security/Qwen3-1.7B-Instruct-Security-Q8_0.gguf)


    然后在本地安装Ollama:

     curl -fsSL https://ollama.com/install.sh | sh

    image.png

    安装完成后,启动 Ollama:

    mkdir /home/sam_admin/ollama_models

    OLLAMA_MODELS=/home/sam_admin/ollama_models ollama serve

    访问:http://127.0.0.1:11434/

    Ollama is running

    image.png

    然后将刚刚导出好的 GGUF 文件给定Ollama进行注册(注意这里指定的是Modelfile文件,而不是GGUF文件):

    ollama create security -f /home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security/Modelfile

    image.png

    Modelfile配置如下:

    # ollama modelfile auto-generated by llamafactory


    FROM /home/sam_admin/LLaMA-Factory/models/Qwen3-1.7B-Instruct-Security/Qwen3-1.7B-Instruct-Security-Q8_0.gguf

    TEMPLATE """{{ if .System }}System: {{ .System }}<|im_end|>

    {{ end }}{{ range .Messages }}{{ if eq .Role "user" }}Human: {{ .Content }}<|im_end|>

    Assistant:{{ else if eq .Role "assistant" }}{{ .Content }}<|im_end|>

    {{ end }}{{ end }}"""


    PARAMETER stop "<|im_end|>"

    PARAMETER num_ctx 4096



    然后可以运行模型交互:介绍你的web安全体系知识

    ollama run security

    image.png


    相比微调前的基础模型(Qwen3-1.7B-Base),模型微调后:

    在数据集内部的特定问题上,具备推理能力,并且回答结果更丰富,说明学习到了数据集内部的知识;

    在 Web 安全领域的特定问题上(不在数据集内),具备推理能力,并且回答结果更丰富,说明模型的泛化能力较好,没有过拟合;

    在 Web 安全整体的知识体系上,具备推理能力,并且回答结果更丰富,说明模型能够系统性整合 Web 安全领域的知识框架,形成结构化的知识输出体系,同时具备跨知识点的关联推理能力,可基于底层逻辑对复杂知识体系进行演绎构建;

    在非 Web 安全的某些其他领域上,具备推理能力,说明模型在聚焦 Web 安全领域专业能力强化的同时,未丧失基础模型的跨领域知识迁移能力,能够基于微调形成的推理框架对非专业领域问题进行逻辑拆解,保持了基础模型的知识泛化性与多领域适应性。

关键字

上一篇: LLaMA Factory微调模型的各种参数怎么设置-3

下一篇: 没有了