前言

近年来,大语言模型(LLM)席卷了整个 AI 开发圈。它们预训练能力强、通用性高,但在具体业务中往往存在两个核心问题:

  1. 泛化太强,缺乏领域专精能力

  2. 部署复杂,接口调用不够灵活

为了解决这两个问题,我们可以通过 LoRA(Low-Rank Adaptation) 技术进行轻量级微调,提升模型在特定任务/行业场景下的表现;再结合 FastAPI 快速搭建 REST 接口,让模型更容易被接入其他系统或前端服务中。

技术介绍

下面是这篇博客所使用的技术

  • 微调框架: LLama-Factory

  • 算法: LoRA

  • 基座模型:DeepSeek-R1-Distill-Qwen-1.5B

  • 部署:FastAPI(一个基于 python 的 web 框架)

  • web后端调用:通过 HTTP 请求交互

1.LLama-Factory

LLama-Factory 是一个开源的大模型微调训练框架,专为 LLaMA 系列和兼容模型(如 Qwen、Baichuan、DeepSeek 等)提供支持。它基于 HuggingFace 的 transformerspeft 库构建,支持全参数微调和多种参数高效微调方法,同时还集成了多卡训练、多数据格式和开箱即用的训练/推理脚本。

特点包括:

  • 简单易用:只需配置参数文件即可启动训练

  • 高度模块化:支持自定义数据集格式和训练逻辑

  • 多模型兼容:支持 HuggingFace 格式的大量开源模型

  • 快速部署:配合 Gradio、Streamlit、FastAPI 可快速上线服务

补充微调常见实现框架

  • Llama-Factory:由国内北航开源的低代码大模型训练框架,可以实现零代码微调,简单易学,功能强大,且目前热度很高,建议新手从这个开始入门

  • transformers.Trainer:由 Hugging Face 提供的高层 API,适用于各种 NLP 任务的微调,提供标准化的训练流程和多种监控工具,适合需要更多定制化的场景,尤其在部署和生产环境中表现出色

  • DeepSpeed:由微软开发的开源深度学习优化库,适合大规模模型训练和分布式训练,在大模型预训练和资源密集型训练的时候用得比较多

2.LoRA算法

LoRA(低秩适配) 是一种参数高效微调技术,用于大语言模型(LLMs)等预训练模型的快速适配和微调。它的核心思想是:将模型中的部分权重矩阵分解为两个较小的低秩矩阵进行训练,从而冻结原始模型参数,只训练少量可调参数。

主要优势:

  • 减少训练参数量,显著降低显存和计算资源消耗

  • 提升微调效率,更适用于中小型GPU环境

  • 支持多任务适配,通过多个LoRA权重组合切换任务风格

3.FastAPI

FastAPI 是一个基于 Python 的现代 Web 框架,专注于快速构建高性能 API 接口,特别适合用于部署 AI 模型推理服务。

核心特性:

  • 使用 Python 类型注解,自动生成 Swagger 文档和接口校验

  • 基于 StarlettePydantic,性能媲美 Node.js 和 Go

  • 天然支持异步,适合高并发应用

  • 可与模型框架(如 PyTorch、Transformers)无缝集成

FastAPI 常用于将训练好的模型部署为 HTTP API 服务,配合前端或第三方应用调用。

项目实操

考虑到有的人可能会因为硬件条件不足而去租实例,所以这部分内容我会把两个环境都来介绍。

连接云服务器:

如果不需要租云服务直接到下一步“LLaMA-Factory 安装部署”

具体步骤如下:

1.在云平台租服务器;

2.按下面我给的链接,打开VS Code下载插件Visual Studio Remote远程连接到你租用的服务器;

https://www.cnblogs.com/qiuhlee/p/17729647.html

部署llama-factory:

项目地址:https://github.com/hiyouga/LLaMA-Factory

1.cd到合适的文件路径,克隆llama-factory项目

      git clone https://github.com/hiyouga/LLaMA-Factory.git

2.创建 anaconda 虚拟环境,根据官网环境要求选择Python版本(我这里用的是python 3.10)

打开Anaconda Prompt,输入命令行,按y回车

    conda create -n llama-factory python=3.10

验证并激活虚拟环境

    #依次输入,第一行查看是否有新建的虚拟环境,第二行激活虚拟环境    
    conda env list
    conda activate llama-factory

3.在虚拟环境中安装 LLaMA Factory 相关依赖

    pip install -e ".[torch,metrics]"

注意:上面这个命令默认是下载最新的pytorch,而且不下cuda,需要再此输入下述命令【pytorch版本和cuda版本按要求即可】

    pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121

4.检验是否安装成功

    llamafactory-cli version

5.启动llama-factory的web端

    llamafactory-cli webui

6.配置端口转发

如果你是使用云端的实例,则需要进行端口转发

https://vscode.github.net.cn/docs/editor/port-forwarding

从Hugging Face下载底模:

官网:https://huggingface.co

国内镜像:https://hf-mirror.com

如何从Hugging Face上下载模型,可以参考这篇文章:https://zhuanlan.zhihu.com/p/663712983

不过llama-factory已经可以从网络上下载模型了,这一步可以跳过,不过需要本地部署的话,还是要做的。

在网站搜索,选择合适的模型,点击进入;

点击下图所指处

我推荐两种方式下载模型:

1.git:确保电脑有git,依次输入下面的命令:

    git clone https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

2.hf CLI:依次输入下面的命令:

    pip install -U "huggingface_hub[cli]

    hf download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

做完上述工作后,llama-factory页面才会显示你的数据集。

准备用于训练的数据集:

微调数据集一般是JSON格式的,可以使用多种风格

具体可以参考我之前写的文章“微调数据集该如何准备”,链接如下

http://www.hweiblog.xyz/archives/wei-diao-shu-ju-ji-gai-ru-he-zhun-bei

准备完数据集后,要把数据集放在合适的位置并修改配置文件

数据集要放在...\LLaMA-Factory\data

并且修改...\LLaMA-Factory\data\dataset_info.json,新增文件指引,示例如下:

 #注意下面的xxx是你的数据集的名字 
 "xxx": {
    "file_name": "xxx.json"
  },

在Llama Factory设置微调参数,开始微调:

载入模型:

首先点击Chat目录,加载模型【有两种方式一种是用在线的模型标识符,另一种是用本地路径】,点击加载模型,网站会提示是否成功;

使用模型标识符:

使用本地路径:

可以下划到对话窗口,输入语句验证模型是否加载成功;

调整训练参数:

点击Train,加载数据集,调整参数开始训练;

注意要先点击保存训练参数→载入训练参数;

Llama-factory中的具体参数可以看下面这篇文章:

https://zhuanlan.zhihu.com/p/708022883

始训练:

有两种训练方式,一种是在llama-factory页面上点击开始:

另一种是使用命令行来开始训练:

点击预览命令,然后复制下面的命令到终端执行:

PS:实践中推荐用命令将训练任务放到后台执行,这样即使关闭终端任务也会继续运行。同时将日志重定向到文件中保存下来

训练完成后,可以看到损失的图表;

评估微调模型效果:

首先是看训练完成后的损失曲线的变化,观察最终损失。

参考文章:https://xiaojuancheng.github.io/2020/05/23/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87loss%E6%9B%B2%E7%BA%BF%E8%AF%8A%E6%96%AD%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/

点击Chat→在检查点栏选择训练好模型→重新加载模型→下滑输入观察

让我们来看看微调前后的结果对比,微调前:

微调后:

  • 若微调效果不理想,你可以:

    • 使用更强的预训练模型

    • 增加数据量

    • 优化数据质量(数据清洗、数据增强等,可学习相关论文如何实现)

    • 调整训练参数,如学习率、训练轮数、优化器、批次大小等等

导出模型:

点击Export→auto→填写导出路径→开始导出

导出成功

模型部署并用FastAPI调用接口:

参考文章:https://blog.csdn.net/my_name_is_learn/article/details/109819127

1. 创建新的 conda 虚拟环境用于部署模型;

    conda create -n Fastapi python=3.10

    conda activate Fastapi

下载依赖

    conda install -c conda-forge fastapi uvicorn transformers pytorch

    pip install safetensors sentencepiece protobuf

2. 通过 FastAPI 部署模型并暴露 HTTP 接口

首先,新建个文件夹app存放项目文件;

在文件里面创建 main.py 文件,作为启动应用的入口;

参考:https://blog.csdn.net/qq_39172059/article/details/136518206

import torch
import uvicorn
from fastapi import FastAPI, Request, Body
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from transformers import AutoModelForCausalLM, AutoTokenizer

app = FastAPI()

# 模型路径(请根据实际路径修改)
model_path = "D:\\01_KenShan\\AI_creater\\model_factory\\output"

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained(model_path)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(model_path).to(device)

# 捕获参数验证错误
@app.exception_handler(RequestValidationError)
async def request_validation_exception_handler(request: Request, exc: RequestValidationError):
    print(f"参数不对: {request.method} {request.url}")
    return JSONResponse(status_code=400, content={"code": 400, "message": exc.errors()})

# POST 接口
@app.post("/generate")
async def generate_text(prompt: str = Body(..., media_type="text/plain")):
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    outputs = model.generate(
        inputs["input_ids"],
        max_length=150,
        do_sample=True,
        top_p=0.95,
        top_k=50,
        temperature=0.7,
        pad_token_id=tokenizer.eos_token_id
    )
    generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return {"generated_text": generated_text}

if __name__ == "__main__":
    uvicorn.run(app="main:app", host="127.0.0.1", port=8000, reload=True)

在终端输入命令行,观察是否报错

    输入:
    uvicorn main:app --reload 

    输出:
    INFO:     Will watch for changes in these directories: ['D:\\01_KenShan\\AI_creater\\model_factory\\app']
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    INFO:     Started reloader process [29432] using WatchFiles
    INFO:     Started server process [31316]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.   

然后在浏览器输出http://127.0.0.1:8000/docs,注意:你们的本机地址可能不是http://127.0.0.1:8000,要看自己输出的是什么;

打开的页面如下,接着按照下面进行操作:点POSTTry it out→输入提示词execute