基于LLama-Factory 进行Lora微调

以下内容学习来自【LoRA 算法论文解读 & 开发人员如何微调大模型并暴露可调用接口】https://www.bilibili.com/video/BV1R6P7eVEtd?vd_source=76890281c296bfb1202b523e6fbce4da

1.准备工作

与上一篇文章进行本地部署不同,本次采用租用云平台的RTX4090实现,这里面的云平台已经配置好常用的深度学习环境了。

使用 ssh 连接远端服务器:

bash 复制代码
ssh root@你的服务器IP地址

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

  1. 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

  1. 启动 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 接口

  • 创建 App 文件夹

    mkdir App

  • 创建 main.py 文件,作为启动应用的入口

    touch main.py

  • 修改 main.py 文件并保存

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 应用绑定到所有可用的网络接口,这样我们的本机就可以通过内网穿透访问该服务

测试成功!

7. 编写前后端代码

这部分可以自己用codex进行搭建,这里就不再进行演示了。

相关推荐
你都会上树?8 小时前
本地部署模型 llama + opencode + Qwen3.8-32b
llama
夜瞬1 天前
从零微调 Qwen3-8B:基于 LoRA 与 LLaMA-Factory 打造专属 AI 编程助教
人工智能·python·llama
Victor Zhong4 天前
llama.cpp 部署大模型到 Ubuntu 台式机 SOP
linux·ubuntu·llama
空空dream5 天前
07 | FastAPI + llama.cpp 接入 Langfuse监控Prompt请求
prompt·fastapi·llama
goodlook01235 天前
opencode调用本地模型三
人工智能·llama
Imagination官方博客6 天前
PowerVR 上的 LLM 性能与加速
人工智能·架构·llama·gpu算力
空空dream6 天前
03 | 更新:Ollama 换成 llama.cpp构建更小的离线镜像
人工智能·语言模型·llama
Imagination官方博客6 天前
如何在 E 系列GPU上使用 llama.cpp 和 千问3.5 运行 OpenCode
软件构建·llama·gpu算力
阡陌数智9 天前
Llama 4 MoE 架构深度拆解:交替稀疏专家设计与生产环境推理落地实战
架构·llama