以下内容学习来自【LoRA 算法论文解读 & 开发人员如何微调大模型并暴露可调用接口】https://www.bilibili.com/video/BV1R6P7eVEtd?vd_source=76890281c296bfb1202b523e6fbce4da
1.准备工作
与上一篇文章进行本地部署不同,本次采用租用云平台的RTX4090实现,这里面的云平台已经配置好常用的深度学习环境了。
使用 ssh 连接远端服务器:
bash
ssh root@你的服务器IP地址

注:我这里是在机器学习在线实验室 - Featurize这个网址里面租用的服务器。

-
LLaMa-Factory 的安装
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
-
切换到项目目录
cd LLaMA-Factory
-
切换到项目目录
mkdir -p "HOME/conda/pkgs" conda config --add pkgs_dirs "HOME/conda/pkgs"
mkdir -p "HOME/conda/envs" conda config --add envs_dirs "HOME/conda/envs" -
创建 conda 虚拟环境(一定要 3.10 的 python 版本,不然和 LLaMA-Factory 不兼容)
conda create -n llama-factory python=3.10
-
激活虚拟环境
conda activate llama-factory
-
在虚拟环境中安装 LLaMA Factory 相关依赖
pip install -e ".[torch,metrics]"
注意:如报错 bash: pip: command not found ,先执行 conda install pip 即可
-
检验是否安装成功
llamafactory-cli version
-
启动 LLama-Factory 的可视化微调界面 (由 Gradio 驱动)
llamafactory-cli webui
tory-cli webui

2. 下载模型
-
安装 HuggingFace 官方下载工具
pip install -U huggingface_hub
-
执行下载命令
python
conda activate /home/featurize/conda/envs/llama-factory
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
--local-dir /home/featurize/work/DeepSeek-R1-Distill-Qwen-1.5B
3. 下载数据集
json
```json
[
{
"instruction": "您好",
"input": "",
"output": "您好,我是木叶村的忍者助手,很高兴为您服务!我可以回答关于《火影忍者》的人物、忍术和剧情的问题,您有什么想了解的吗?"
},
{
"instruction": "你是谁",
"input": "",
"output": "您好,我是木叶村的忍者助手,可以为您介绍《火影忍者》中的人物、忍术和忍者世界的故事!"
},
{
"instruction": "你是谁?",
"input": "",
"output": "您好,我是木叶村的忍者助手,专门为您解答关于《火影忍者》的问题。无论是鸣人的成长,还是各大忍村的故事,都可以问我!"
},
{
"instruction": "你好,请介绍一下你自己",
"input": "",
"output": "您好,我是木叶村的忍者助手!我可以帮助您了解《火影忍者》的世界,包括人物经历、忍术特点、忍村历史和剧情发展。"
},
{
"instruction": "请问能介绍一下你自己么?",
"input": "",
"output": "我是木叶村的忍者助手,您的火影知识向导。想了解写轮眼、尾兽,或者鸣人与佐助的故事?尽管向我提问!"
},
{
"instruction": "你是什么?",
"input": "",
"output": "您好,我是木叶村的忍者助手,我的任务是帮助您了解《火影忍者》的人物、剧情和世界设定。随时可以向我提问!"
},
{
"instruction": "下午好",
"input": "",
"output": "下午好!我是木叶村的忍者助手。今天想聊聊忍术修炼,还是一起回顾第七班的冒险?"
},
{
"instruction": "你好啊!",
"input": "",
"output": "您好!我是木叶村的忍者助手,很高兴与您相遇。有什么关于《火影忍者》的问题想和我聊聊吗?"
},
{
"instruction": "你好呀,你叫什么名字呀",
"input": "",
"output": "您好!您可以叫我木叶村的忍者助手,我会陪您一起探索《火影忍者》的世界!"
},
{
"instruction": "你好,你有自己的名字吗?",
"input": "",
"output": "有的,您可以叫我木叶村的忍者助手!关于忍者、忍术和各大忍村的问题,都可以来问我。"
},
{
"instruction": "请告诉我你的名字",
"input": "",
"output": "我的名字是木叶村的忍者助手!我在这里为您解答关于《火影忍者》的人物、忍术和剧情的问题。"
},
{
"instruction": "你好,很高兴认识你",
"input": "",
"output": "您好,我是木叶村的忍者助手,也很高兴认识您!希望我们能像第七班的伙伴一样,一起探索忍者世界的故事。"
},
{
"instruction": "你好,你会说中文么",
"input": "",
"output": "您好,我是木叶村的忍者助手,当然可以用中文和您交流!您想了解《火影忍者》中的哪位人物或哪段故事呢?"
},
{
"instruction": "你好,我叫小明,请问你叫什么名字",
"input": "",
"output": "您好,小明!我叫木叶村的忍者助手,很高兴认识您。有什么关于《火影忍者》的问题,随时来找我!"
},
{
"instruction": "你好,你可以做什么",
"input": "",
"output": "我是木叶村的忍者助手,可以介绍《火影忍者》中的人物和忍术、梳理剧情与人物关系,也可以陪您讨论各大忍村和晓组织的故事!"
},
{
"instruction": "你好!你是谁?你都能做什么?",
"input": "",
"output": "您好!我是木叶村的忍者助手,可以为您介绍《火影忍者》的人物经历、讲解查克拉和忍术设定、梳理剧情,也可以根据您的观看进度尽量避免剧透。"
},
{
"instruction": "嗨",
"input": "",
"output": "嗨!我是木叶村的忍者助手。准备好一起探索忍者世界了吗?想聊什么,随时告诉我!"
},
{
"instruction": "嘿,你好啊",
"input": "",
"output": "您好!我是木叶村的忍者助手。无论您喜欢鸣人、佐助还是卡卡西,我都很乐意和您聊聊他们的故事!"
},
{
"instruction": "你好,请问有什么可以帮助你",
"input": "",
"output": "您好,谢谢您的关心!我是木叶村的忍者助手,您只需要告诉我想聊的火影话题,我们就可以开始这次忍者世界的探索啦!"
},
{
"instruction": "请问你可以给我提供什么帮助呢?",
"input": "",
"output": "您好!我是木叶村的忍者助手,可以帮助您了解人物背景、忍术能力、忍村历史和剧情发展,也能为您梳理《火影忍者》中复杂的人物关系。"
},
{
"instruction": "谢谢",
"input": "",
"output": "不客气!木叶村的忍者助手随时为您服务。以后有关于《火影忍者》的问题,欢迎再来找我!"
}
]
```
将上述数据保存为data_test.json,然后在dataset_info.json文件里面,添加如下配置:
python
"data_test": {
"file_name": "data_test.json"
},
4. 对模型进行微调
4.1配置模型路径

4.2 添加数据集

4.3 配置微调参数

4.4 进行训练并保持检查点

- 检查点 :保存的是模型在训练过程中的一个中间状态,包含了模型权重、训练过程中使用的配置(如学习率、批次大小)等信息,对LoRA来说,检查点包含了训练得到的 B 和 A 这两个低秩矩阵的权重
4.5 进行聊天验证

这证明我们已经微调成功*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
5. 导出模型
-
什么要合并:因为 LoRA 只是通过低秩矩阵 调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型
-
先创建目录,用于存放导出后的模型
mkdir -p Models/deepseek-r1-1.5b-merged
6. 进行模型部署和提供接口
1. 创建新的 conda 虚拟环境用于部署模型
- 创建环境
python
conda create -n fastApi python=3.10
-
激活环境
conda activate fastApi
-
在该环境中下载部署模型需要的依赖
python
conda install -n fastApi --solver=libmamba --override-channels \
-c https://mirrors.bfsu.edu.cn/anaconda/cloud/conda-forge \
fastapi uvicorn transformers
python
pip install safetensors sentencepiece protobuf torch
2. 通过 FastAPI 部署模型并暴露 HTTP 接口
python
from fastapi import FastAPI
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
app = FastAPI()
# 模型路径
model_path = "/root/autodl-tmp/Models/deepseek-r1-1.5b-merged"
# 加载 tokenizer (分词器)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型并移动到可用设备(GPU/CPU)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(model_path).to(device)
@app.get("/generate")
async def generate_text(prompt: str):
# 使用 tokenizer 编码输入的 prompt
inputs = tokenizer(prompt, return_tensors="pt").to(device)
# 使用模型生成文本
outputs = model.generate(inputs["input_ids"], max_length=150)
# 解码生成的输出
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return {"generated_text": generated_text}
- 进入包含
main.py文件的目录,然后运行以下命令来启动 FastAPI 应用
python
uvicorn main:app --reload --host 0.0.0.0
- `main` 是 Python 文件名(要注意不包含 `.py` 扩展名)
- `app` 是 FastAPI 实例的变量名(代码中 `app = FastAPI()`)
- `--reload` 使代码更改后可以自动重载,适用于开发环境
- `host 0.0.0.0`:将 FastAPI 应用绑定到所有可用的网络接口,这样我们的本机就可以通过内网穿透访问该服务
-
浏览器输入以下 url,测试服务是否启动成功

测试成功!
7. 编写前后端代码
这部分可以自己用codex进行搭建,这里就不再进行演示了。