微调大模型并部署服务提供外部调用

微调大模型并部署服务提供外部调用

    • 1.背景知识介绍说明
      • LoRA 微调算法
        • LoRA原理:
      • 微调常见框架
    • 2. 环境搭建
      • 下载并使用docker compose部署 LLaMA-Factory
    • 3. 微调
      • 微调结束之后
      • 导出模型
    • 4. 本地运行模型
    • 5. 服务http调用验证

应用到的技术 微调框架( LLama-Factory
微调算法 LoRA
基础模型: Deepseek
FastAPI:暴露 Http接口给外部服务调用
我本地的环境是 windos + 独立显卡

笔记地址
docker compose运行Llama-Factory地址
本地加载模型项目地址

1.背景知识介绍说明

蒸馏模型:通常情况下把大模型的知识转移到小模型中,尽量保证模型的性能的同时减少参数和计算需求。

一般情况下企业会有不同的个性化内容需要大模型进行适配, 就会对模型进行「对齐 / 优化 / 增强」常见的方式有:SFT(有监督微调)、RLHF(强化学习)、RAG(检索增强生成)

对比说明

方法核心思路优点缺点典型场景
SFT(Supervised Fine-Tuning) 有监督微调用人工标注的数据集(输入→期望输出)对大模型做微调,让模型学习任务格式和知识。实现简单,效果直观;适合让模型快速掌握领域任务。需要高质量人工标注数据;只能学到数据里的知识,缺乏“价值观对齐”。客服对话、SQL 生成、问答机器人、代码补全
RLHF (Reinforcement Learning with Human Feedback) 基于人类反馈的强化学习先用 SFT 训练模型,再让模型生成多个答案,由人工或奖励模型打分,强化学习优化模型,使输出更符合人类偏好。输出更贴近人类价值观;能提升回答质量和安全性。成本高(要人工打分/训练奖励模型);训练复杂。ChatGPT 类助手、对话安全优化、减少有害回答
RAG(Retrieval-Augmented Generation)检索增强生成在推理阶段,把外部知识库检索到的内容作为上下文提供给模型,再生成回答。不需要重新训练模型;知识可实时更新;解决模型“知识过时”问题。性能依赖检索质量;上下文窗口有限;不会改变模型本身能力。企业知识库问答、法律/金融/医疗资料查询、文档助手

SFT:主要是提高模型对企业专有信息的理解、增强模型对特定行业领域的学习。(垂直领域)
RLHF:提供个性化和互动性强的交互:会生成多个结果,由用户的反馈调整回答的方式
RAG: 将外部信息检索与⽂本⽣成结合,帮助模型在⽣成答案时,实时获取外部信息和最新信息

微调的细化又可以分为有监督微调自监督微调
强化学习可以细化为 DPO(Direct Preference Optimization)通过使用者的对比选择,直接优化模型,调整幅度比较大[类似与A/B,选择A的结果或者B的结果]。PPO(Proximal Policy Optimization)通过奖励信号来渐进式调整模型的行为策略;调整幅度小。

微调

  • 适合拥有非常充足的数据
  • 能够直接提升模式的固有能力;无需依赖外部检索

RAG

  • 适合只有很少的数据;动态更新的数据
  • 每次回答问题前都需要耗时检索知识库;回答质量依赖检索系统的质量。

总而言之, 少量企业私有知识库:最好微调+RAG;资源不足优先RAG。需要动态更新数据:RAG。大量垂直领域知识:微调。

SFT(有监督微调)
通过人工标注的数据,进一步训练预训练模型,让模型能够更加精确的处理特定领域的任务

  • 人工标注数据

例如:某些分类系统

{"image_path": "path/image1.jpg", "label": "SpongeBobSquarePants"}
{"image_path": "path/image2.jpg", "label": "PatrickStar"}
{
"instruction": "请问你是谁",
"input": "",
"output": "您好,我是蟹堡王的神奇海螺,很⾼兴为您服务!我可以回答关于蟹堡王和汉堡制作的任何问题,您有什么需要帮助的吗?"
}
  • 预训练模型(基座模型)
    指已经经过大量数据训练过的模型,也就是我们微调前需要预先下载的开源模型。它具备了较为通⽤的知识和能⼒,能够解决⼀些常⻅的任务,可以在此基础上进⾏进⼀步的微调 (fine-tuning)以适应特定的任务或领域
  • 微调算法分类
    • 全参数微调(Full Fine-Tuning):对整个模型进行微调,会更新所有参数
      • 优点:因为对每个参数都可以进行调整,可以得到最佳性能;能够适应不同任务和场景
      • 缺点:需要有大量的计算资源并且容易出现过拟合
    • 不分参数微调(Partial Fine-Tuning):只更新模型中的部分参数,某些层或者某些模块。例如loRA
      • 优点:减少计算成本;减少过拟合风险;能以较小的代价获得较好的结果
      • 缺点:可能无法达到最佳性能

LoRA 微调算法

相关论文

LoRA: Low-Rank Adaptation of Large Language Models
介绍:提出了通过低秩矩阵分解的⽅式来进⾏部分参数微调,极⼤推动了 AI 技术在多⾏业的⼴泛落地应⽤

Attention Is All You Need
标志着 Transformer 架构的提出,彻底改变了⾃然语⾔处理(NLP)领域

矩阵的秩Rank of a matrix)是指矩阵中线性⽆关的⾏或列的最⼤数量。

重点理解

LoRA原理:

如何做到部分参数微调。

h=W0x+ΔWx=W0x+BAxh = W_0x + \Delta Wx = W_0x + BAx h=W0x+ΔWx=W0x+BAx

  • h:模型输出
  • W0W_0W0: 预训练模型的原始权重,是一个全秩矩阵
  • x: 模型输入
  • ΔW0\Delta W_0ΔW0: 微调后原始权重的变化量,也是一个全秩矩阵,大小和$ W_0$一样。
  • BA: 两个低秩矩阵的B和A,他的乘积 BA 表示对原始权重微调变化W0W_0W0

$ W_0 + \Delta W_x $:全参数微调的输出
$ W_0 + BA_x $: 这个是用LoRA方法对部分参数微调的输出。

  • LoRA 的核心: 怎么让 ΔW0=BA\Delta W_0 = BAΔW0=BA, 并且BA的存储远小于ΔW0\Delta W_0ΔW0? - 矩阵的低秩分解
  • 在现代里面有以下乘法 [100, 100] = [100, 2] * [2, 100]

在这里插入图片描述

  • 通过这种方式,微调参数量从 100 * 100 = 10000 显著下降到 100 * 2 + 2 * 100 = 400
  • LoRA训练之后需要进行权重合并

微调常见框架

初学者如何对大模型进行微调?

Llama-Factory: 可以零代码实现微调,简单易学,入门建议
transformers.Trainer: 由Hugging Face提供的API,适⽤于各种 NLP 任务的微调, 提供标准化的训练流程和多种监控⼯具,适合需要更多定制化的场景,尤其在部署和⽣产环境中表现出⾊
DeepSpeed: 微软开发的,适合大模型训练和分布式训练,在预训练和资源密集型训练使用的比较多

2. 环境搭建

下载并使用docker compose部署 LLaMA-Factory

github地址

或者可以直接docker compose部署,因为默认从国外下载的,可能访问不到,所以直接指定了国内的(HF_ENDPOINT=https://hf-mirror.com),默认的下载地址(https://huggingface.co),完整命令

version: "3.9"services:llamafactory:image: hiyouga/llamafactory:latestcontainer_name: llamafactoryrestart: unless-stoppedports:- "7860:7860"environment:- HF_ENDPOINT=https://hf-mirror.comcommand: >python -m src.llamafactory.cli webui--host 0.0.0.0--port 7860deploy:resources:reservations:devices:- driver: nvidiacount: allcapabilities: [gpu]ipc: hostvolumes:- ./data:/app/data# 模型缓存目录(持久化到宿主机)- ./hf_cache:/root/.cache/huggingface

在这里插入图片描述

说明:

dataset_info.json文件: 是数据集的元数据,训练的时候选择这个里面的数据
./data/datasets文件夹: datasets文件夹挂载到容器,后续添加数据集的时候直接修改上面的文件,和这个文件夹添加对应的训练数据即可

我这次添加的内容:注意格式和逗号

  "magic_conch": {"file_name": "datasets/magic_conch.json"},

启动完成访问地址

3. 微调

进入模型页面

在这里插入图片描述

语言可以自己选择,模型选择的是DeepSeek-R1-1.5B-Distill,模型比较小的蒸馏模型。

chat tab后点击加载模型
在这里插入图片描述
训练完成后可能这个模型需要点下重新加载下才会有效果,有没有大佬出来解释下哈

可以自己尝试对话试试
在这里插入图片描述

正常回答,说明模型加载没问题

注意开始变形了

进行模型训练需要我们准备好数据

数据格式说明文件

选择对应的数据
勾选新建适配器,否者的话导出的时候,会一直让选址适配器,到时候就只能重新训练了
在这里插入图片描述
点击 Train 设置训练参数,就可以听电脑 风扇呼呼响,下面补充一下参数说明

常用的参数

  • 学习率(Learning Rate):决定了模型每次更新时权重改变的幅度。过⼤可能会错过最优解;过⼩会学得很慢或陷⼊局部最优解
  • 训练轮数(Epochs):太少模型会⽋拟合(没学好),太⼤会过拟合(学过头了)
  • 最⼤梯度范数(Max Gradient Norm):当梯度的值超过这个范围时会被截断,防⽌梯度爆炸现象
  • 最⼤样本数(Max Samples):每轮训练中最多使⽤的样本数
  • 计算类型(Computation Type):在训练时使⽤的数据类型,常⻅的有 float32 和 float16。在性能和精度之间找平衡
  • 截断⻓度(Truncation Length):处理⻓⽂本时如果太⻓超过这个阈值的部分会被截断掉,避免内存溢出
  • 批处理⼤⼩(Batch Size):由于内存限制,每轮训练我们要将训练集数据分批次送进去,这个批次⼤⼩就是 Batch Size
  • 梯度累积(Gradient Accumulation):默认情况下模型会在每个 batch 处理完后进⾏⼀次更新⼀个参数,但你可以通过设置这个梯度累计,让他直到处理完多个⼩批次的数据后才进⾏⼀次更新
  • 验证集⽐例(Validation Set Proportion):数据集分为训练集和验证集两个部分,训练集⽤来学习训练,验证集⽤来验证学习效果如何
  • 学习率调节器(Learning Rate Scheduler):在训练的过程中帮你⾃动调整优化学习率

开始训练可以使用两种方式

  1. 界面上直接点 开始训练
  2. 先点预览命令然后在终端里面 nohup 执行并且重定向日志到文件

微调结束之后

评估微调结果:

  • 观察损失曲线的变化;观察最终损失
  • 在交互⻚⾯上通过预测/对话等⽅式测试微调好的效果
  • 检查点:保存的是模型在训练过程中的⼀个中间状态,包含了模型权重、训练过程中使⽤的配置(如学习率、批次⼤⼩)等信息,对LoRA来说,检查点包含了训练得到的 B 和 A 这两个低秩矩阵的权重
    在这里插入图片描述
    若微调效果不理想,你可以:
  • 使⽤更强的预训练模型
  • 增加数据量
  • 优化数据质量(数据清洗、数据增强等,可学习相关论⽂如何实现)
  • 调整训练参数,如学习率、训练轮数、优化器、批次⼤⼩等等

导出模型

为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,⽽不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合⽣成⼀个完整的模型先创建⽬录,⽤于存放导出后的模型

找到对应文件下载到本地,后面本地运行模式的时候需要使用这个
我本地的文件夹位置

D:\DeepSeek-R1-Distill-Qwen-1.5B-merged

4. 本地运行模型

本地使用了 conda 来构建隔离环境,conda安装过程就不详细记录了

创建环境

conda create -n fasttApi python=3.10

激活环境

conda activate fasttApi

下载依赖

conda install -c conda-forge fastapi uvicorn transformers pytorch
pip install safetensors sentencepiece protobuf

项目里面配置conda的环境
在这里插入图片描述

编写项目代码
python项目

main.py内容如下

from fastapi import FastAPI
from transformers import AutoModelForCausalLM, AutoTokenizer
import torchapp = FastAPI()# 模型路径
model_path = "D:\\DeepSeek-R1-Distill-Qwen-1.5B-merged"
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型并移动到可用设备(GPU/CPU)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = AutoModelForCausalLM.from_pretrained(model_path).to(device)@app.get("/generate")
async def generate(prompt: str):# 使用 tokenizer 编码输入的 promptinputs = tokenizer(prompt, return_tensors="pt").to(device)# 使用模型生成文本outputs = model.generate(inputs["input_ids"], max_length=512)# 解码生成输出generate_text = tokenizer.decode(outputs[0], skip_special_tokens=True)return {"generate_text": generate_text}

进入App项目之后后启动

uvicorn main:app --reload --host 0.0.0.0

启动之后访问

http://127.0.0.1:8000/generate?prompt=你好

或者直接

http://localhost:8000/docs

5. 服务http调用验证

在这里插入图片描述

一个问题回答三分钟cpu直奔90%
后续看看怎么优化吧,哈哈哈终于 微调验证,部署完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920471.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命令行操作:逻辑运算符、重定向与管道

命令行操作:逻辑运算符、重定向与管道前言一、逻辑运算符1.1. 逻辑运算符 && (AND)1.2. 逻辑运算符 || (OR)1.3. 标准文件描述符 (FD)二、重定向2.1 重定向: > 与 >>2.2 重定向错误输出: 2>/ 与 2>>2.3 POSIX 推荐(经常使用)三、管道 (顺…

IDA Pro 逆向安卓 SO 库实战指南:从静态分析到动态调试

IDA Pro 逆向安卓 SO 库是一个系统性的工程。下面我将为你提供一个从环境准备、基础静态分析到高级动态调试的完整实战指南。一、 准备工作与环境搭建 所需工具IDA Pro: 主力逆向工具,建议使用 7.7 或更高版本,对 ARM/ARM64 架构支持更好。目标 APK:…

Python爬虫(47)Python异步爬虫与K8S弹性伸缩:构建百万级并发数据采集引擎

目录一、背景与行业痛点二、核心技术架构解析2.1 异步爬虫引擎设计2.2 K8S弹性伸缩架构三、生产环境实践数据3.1 性能基准测试3.2 成本优化效果四、高级优化技巧4.1 协程级熔断降级4.2 预测式扩容五、总结🌈Python爬虫相关文章(推荐)一、背景…

处理器的双发射是什么?

处理器的双发射是什么? 这是一个处理器微架构层面的概念,对于理解现代高性能CPU(包括一些Cortex-M7/M55/M85等高端MCU内核)如何提升性能至关重要。 核心摘要 双发射 是一种处理器设计技术,允许CPU的译码器在一个时钟周期内,同时解码并派发两条指令到不同的执行单元中去…

麒麟操作系统挂载NAS服务器

前言:因信创整改,需将原服务器的服务全部迁移到信创服务器,在部署完应用后,发现外挂了NAS服务(可用df -h查看挂载文件),于是在信创服务器上需要挂载NAS服务器。在Linux上挂载NAS服务器可以通过多…

qt配置ros2环境,简单版本

因为不同的系统环境会有差异,先把我的环境介绍如下: 系统:Ubuntu22.04 ROS版本:ros2 humble Qt版本:qt-5.14.2 要配置Qt中的ros环境,需要在Qt的系统环境中添加2个变量,一个是编译环境变量、一个…

【基于C# + HALCON的工业视觉系统开发实战】三十六、PCB焊点缺陷检测:0漏检的局部变形匹配技术

摘要:针对PCB焊点检测中虚焊、锡珠、偏移三大核心缺陷,本文提出基于局部变形匹配与黄金模板的工业级解决方案。系统采用"同轴光源+四向可调支架"的硬件布局消除器件阴影,结合HALCON 24.11的局部变形匹配算法适应PCB热膨胀形变。通过多尺度模板库自学习机制实现8秒…

诺基亚无人机网络(NDN-Nokia Drone Networks):面向工业运营的全自动无人机解决方案

诺基亚无人机网络(NDN-Nokia Drone Networks):面向工业运营的全自动无人机解决方案诺基亚无人机网络 (NDN) 是一款先进的全自动无人机一体化解决方案,旨在提升和数字化各种工业和公共安全用例。这款多功能 BVLOS 解决方案基于先进的蜂窝连接,…

OpenTelemetry 在 Spring Boot 项目中的3种集成方式

目录 1. 自动埋点(Java Agent) 2. 注解驱动(WithSpan) 3. 手动埋点(SDK 编程) 配置关键点 方案选择建议 OpenTelemetry 在 Spring Boot 项目中的应用主要有以下三种方式,按实现复杂度由低到…

nvue文件text标签 不同样式的文本在同一段落显示

参考链接&#xff1a;nvue中处理text为块级元素的替代解决方法_nvue 块级元素-CSDN博客 实现效果&#xff1a; nvue的text是块级元素&#xff0c;用上层加粗的绝对定位覆盖底层的文本实现 <view class"cus-text-area"><!-- nvue的text是块级元素&#xff0…

STM32的ADC寄存器操作

ADC硬件电路ADC的硬件电路主要由输入电路&#xff0c;触发信号电路&#xff0c;数据寄存器电路&#xff0c;中断电路还有数据总线这及部分构成。输入信号通道ADC的通道输入到转换器&#xff0c;每个ADC有多达18个通道&#xff0c;可测量16个外部和2个内部信号源&#xff0c;温度…

Java 实现HTML转Word:从HTML文件与字符串到可编辑Word文档

在实际开发中&#xff0c;将HTML页面或内容转换为Word文档是一项常见需求。无论是将网页报表导出为正式文档&#xff0c;还是将合同、发票等页面内容生成可编辑的Word文件&#xff0c;这种转换都能显著提升文档的复用性和归档价值。然而&#xff0c;HTML与Word在结构和渲染机制…

华为L420国产笔记本(统信UOS桌面专业版1070)安装openEuler2403虚拟机

本文探讨在华为L420国产笔记本&#xff08;操作系统为统信UOS桌面专业版1070&#xff09;中安装openEuler2403的arm版虚拟机。 一、测试环境 1、硬件设备 华为L420国产笔记本&#xff0c;CPU为华为麒麟9006C&#xff0c;内存16G 2、操作系统 统信UOS桌面专业版1070 二、安…

【STM32】将 FreeRTOS移植到STM32F103RCT6 详细流程

这篇文章是将 FreeRTOS移植到STM32F103RCT6 详细流程。创建用于移植的根文件夹&#xff0c;如 FreeRTOS-F103。也可以命名为别的名称。进入 FreeRTOS-F103 文件夹&#xff0c;在其内创建以下几个子文件夹&#xff1a;apps&#xff0c;doc&#xff0c;drivers&#xff0c;FreeRT…

京东招java开发

java开发&#xff08;岗位信息经过jobleap.cn授权&#xff0c;可在CSDN发布&#xff09;京东 四川职位描述1、负责企业金融资金、支付基础支撑相关系统建设&#xff1b; 2、负责重点项目、日常需求的承接&#xff0c;按期保质保量交付&#xff1b; 3、负责系统的日常维护及技术…

文本处理与模型对比:BERT, Prompt, Regex, TF-IDF

1. BERT (Bidirectional Encoder Representations from Transformers) BERT是一种基于Transformer架构的深度双向预训练语言模型。它通过在海量文本上进行预训练&#xff08;如掩码语言模型任务&#xff09;&#xff0c;学习到丰富的语言表征&#xff0c;并可以通过微调&#x…

流量迷局 - 理解负载均衡(L4/L7)与CDN背后的“隐形路由

《网络迷踪:SRE的TCP/IP故障排查艺术》 系列第七篇:流量迷局 - 理解负载均衡(L4/L7)与CDN背后的“隐形路由” “案发现场”: 你在排查一个问题时,让用户提供他ping你服务域名的结果。 在北京的用户,ping app.mycompany.com,显示的IP地址是 111.222.1.100。 在广州的用户…

dagger.js 实现「CSS 机械键盘」示例解读(对比 React 版本)

0) 效果演示 &#xff08;代码地址&#xff09; CSS Mechanical Keyboard1) 示例与来源 dagger.js 版本&#xff1a;本笔围绕 CodePen 上的《CSS Mechanical Keyboard》的 dagger.js 改写版进行解读&#xff0c;核心思路是用 dagger 指令把纯 CSS 艺术包装成可复用的组件&…

如何检查 Linux 系统的内存使用情况

内存管理是保持 Linux 系统平稳运行的重要组成部分。无论您是系统管理员、开发者&#xff0c;学会检查 Linux 内存使用情况是确保系统稳定性和性能的关键步骤。本文将介绍在 Linux 环境下监控和检查内存使用的几种方法&#xff0c;包括命令行工具&#xff08;如 top、vmstat、p…

我店生活平台是不是 “圈钱平台”?揭开消费补贴新模式的面纱

近年来&#xff0c;本地生活服务领域涌现出诸多创新模式&#xff0c;其中“WO店”生活平台凭借其独特的全民补贴机制引发行业关注。在“圈钱平台”质疑声此起彼伏的背景下&#xff0c;这一模式究竟是商业创新还是资本游戏&#xff1f;本文将从商业模式、风险控制、用户权益保障…