PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介
概览
到2025年,虽然PET(Pattern-Exploiting Training)和Prompt Tuning在学术界仍有探讨,但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调(PEFT)方法取代 。LoRA因其实现简单、推理零开销,并能在大规模模型上以极少量参数达到与全量微调相当的效果,已成为最受欢迎的PEFT技术 。QLoRA在此基础上再结合4-bit量化,使得即便是65B级模型也能在单块48 GB GPU上完成微调,内存占用降低近3倍,性能几乎无损 。
1 PET 与 Prompt Tuning ,P-Tuning 的现状
1.1 PET(Pattern-Exploiting Training)
PET于2021年在EACL提出,通过“Pattern + Verbalizer Pair”(PVP)将分类和推理任务转换为完形填空问题来利用预训练模型 。
然而,由于其需要手工设计模板、映射词表,且在真正生产环境中难以自动化部署,PET已很少在实际项目中使用,大多数团队已转向更为通用且自动化程度更高的PEFT方法 。所以懒得写PET了。直接看后面ptuning和lora,
1.2 Prompt Tuning
Prompt Tuning(又称Soft Prompt Tuning)在2021年提出,直接对输入端添加 L 个可训练嵌入向量,仅更新这部分参数来适配下游任务 。
尽管Prompt Tuning在少样本和学术基准上表现良好,但因其训练不稳定、对超大模型需要较长的收敛时间,故在商业产品中采用的越来越少,主要用于研究和小规模试验场景 。
说明:Prompt Tuning 直接将一段可训练的向量拼接到输入端,冻结主模型权重,仅优化这段“软提示”及下游头部参数。
# ——— 1. 准备模型 ——————————————————————————————
model = load_pretrained_model("bert-base-uncased") # 加载预训练模型 [oai_citation:0‡ACL Anthology](https://aclanthology.org/2021.emnlp-main.243/?utm_source=chatgpt.com)
freeze_parameters(model) # 冻结所有模型参数# 初始化可训练的“软提示”向量 (L × H)
L = 20 # Prompt 长度
H = model.config.hidden_size
prompt = RandomTensor(shape=(L, H), requires_grad=True) # 新增一个线性分类头
classifier = Linear(H, num_labels) # num_labels 为类别数optimizer = AdamW([prompt, *classifier.parameters()], lr=1e-3)# ——— 2. 训练循环 ——————————————————————————————
for epoch in range(num_epochs):for input_ids, labels in dataloader:# 2.1 获取原始 token embeddings → [B, N, H]emb = model.embeddings(input_ids) # 2.2 在序列前拼接软提示 → [B, L+N, H]pref = prompt.unsqueeze(0).expand(emb.size(0), -1, -1)inputs_embeds = concat(pref, emb, dim=1) # 2.3 仅给 embeddings,绕过原始 token‐to‐id 过程outputs = model.encoder(inputs_embeds) # 2.4 取第 L 个位置的输出作为 “CLS” 表示 → [B, H]cls_repr = outputs[:, L, :] # 2.5 分类 & 计算损失logits = classifier(cls_repr)loss = CrossEntropy(logits, labels)# 2.6 反向只更新 prompt 和分类头loss.backward()optimizer.step()optimizer.zero_grad()
1.3 P Tuning 
说明:P-Tuning 除了学习可训练提示向量外,还通过一个小型网络(如 LSTM 或 MLP)对提示向量进一步编码,稳定并提升少样本学习效果。
# ——— 1. 准备模型 ——————————————————————————————
model = load_pretrained_model("bert-base-uncased") # 加载预训练模型 [oai_citation:3‡arXiv](https://arxiv.org/abs/2103.10385?utm_source=chatgpt.com)
freeze_parameters(model) # 冻结所有模型参数# 定义 L 个“伪 token”ID,对应潜在的提示 embedding
L = 20
pseudo_ids = range(L)# 从模型 embedding table 提取初始向量 → [L, H]
H = model.config.hidden_size
init_emb = model.embeddings(pseudo_ids) # 定义一个 Prompt Encoder(LSTM/MLP)将 init_emb 映射到最终 prompt_emb
prompt_encoder = LSTM(input_size=H, hidden_size=H) # 新增分类头
classifier = Linear(H, num_labels)optimizer = AdamW([*prompt_encoder.parameters(), *classifier.parameters()], lr=1e-3)# ——— 2. 训练循环 ——————————————————————————————
for epoch in range(num_epochs):for input_ids, labels in dataloader:B, N = input_ids.size()# 2.1 用 Prompt Encoder 编码初始伪 token 嵌入 → [1, L, H]prompt_emb, _ = prompt_encoder(init_emb.unsqueeze(0))prompt_emb = prompt_emb.expand(B, -1, -1) # → [B, L, H]# 2.2 获取原始 token embeddings → [B, N, H]emb = model.embeddings(input_ids)# 2.3 拼接 prompt_emb 与 emb → [B, L+N, H]inputs_embeds = concat(prompt_emb, emb, dim=1)# 2.4 前向并行计算全序列输出outputs = model.encoder(inputs_embeds)# 2.5 取第 L 个位置的向量作为分类表示 → [B, H]cls_repr = outputs[:, L, :]# 2.6 分类 & 计算损失logits = classifier(cls_repr)loss = CrossEntropy(logits, labels)# 2.7 反向仅更新 Prompt Encoder 与分类头loss.backward()optimizer.step()optimizer.zero_grad()
2 LoRA/QLoRA 的主导地位
2.1 LoRA(Low-Rank Adaptation)
LoRA于2021年问世,通过冻结Transformer的主干权重,在每层线性映射旁支注入两段低秩矩阵 A 与 B,仅训练 A,B,可训练参数量减少约10,000倍,且推理阶段无额外延迟 。
实际项目中,LoRA因其“插拔式”适配、易于在各种框架中集成(如Hugging Face PEFT、ColossalAI等),几乎成为所有PEFT管道的默认选择 。
# 1. 初始化
model = GPTForCausalLM.from_pretrained("gpt2") # 加载预训练 GPT-2
freeze_parameters(model) # 冻结所有原有参数# 2. 注入 LoRA 适配器
r = 8 # 低秩矩阵秩 rank
alpha = 16 # 缩放因子
for layer in model.transformer.h: # 遍历 Transformer 每一层# 拦截自注意力和前馈层的 Linearfor name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:W = getattr(layer, name) # 原线性层# 保存原权重,用于推理时合并W.requires_grad = False # 新增 A、B 两段可训练矩阵A = nn.Parameter(torch.randn(W.in_features, r) * 0.01)B = nn.Parameter(torch.zeros(r, W.out_features))layer.register_parameter(f"{name}_lora_A", A)layer.register_parameter(f"{name}_lora_B", B)# 3. 前向时叠加低秩更新
def lora_forward(x, W, A, B):return x @ W.weight + (alpha / r) * (x @ A @ B)# 4. 替换每个需要微调的 Linear 层前向
for layer in model.transformer.h:for name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:orig_linear = getattr(layer, name)A = getattr(layer, f"{name}_lora_A")B = getattr(layer, f"{name}_lora_B")# 用闭包 Capture 原 Linear、A、Bdef new_forward(x, _orig=orig_linear, _A=A, _B=B):return lora_forward(x, _orig, _A, _B)orig_linear.forward = new_forward# 5. 训练循环:仅更新 A、B 矩阵
optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)
model.train()
for batch in dataloader:outputs = model(**batch) # 包括 input_ids, attention_mask, labelsloss = outputs.lossloss.backward()optimizer.step()optimizer.zero_grad()
LoRA 冻结预训练模型权重,在每个线性层旁路注入低秩矩阵,只训练这部分额外参数。LoRA 可在保持原模型推理效率的同时,将可训练参数减少 10,000 倍,且不增加推理延迟
2.2 QLoRA(Quantized LoRA)
QLoRA在LoRA之上先将预训练模型量化至4-bit(NF4),再冻结量化权重并仅训练LoRA分支,显存占用降低近3倍,却保持与16-bit LoRA几乎相同的性能,被用于在单块48 GB GPU上微调65B参数模型(如Guanaco)至近ChatGPT水平 。
# 1. 初始化与 4-bit 量化
model = GPTForCausalLM.from_pretrained("gpt2")
freeze_parameters(model)
# bitsandbytes 提供的 4-bit 量化函数
for name, param in model.named_parameters():param.data = quantize_4bit(param.data, dtype="nf4") # NF4 量化# 2. 注入 LoRA(与上述 LoRA 步骤一致)
r = 8; alpha = 16
for layer in model.transformer.h:for name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:W = getattr(layer, name)W.requires_grad = FalseA = nn.Parameter(torch.randn(W.in_features, r) * 0.01)B = nn.Parameter(torch.zeros(r, W.out_features))layer.register_parameter(f"{name}_lora_A", A)layer.register_parameter(f"{name}_lora_B", B)# 3. 替换前向(同 LoRA)
# …(如上)# 4. 训练循环:仅更新 A、B
optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=5e-5)
model.train()
for batch in dataloader:outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad()
QLoRA 首先将模型权重量化到 4-bit,然后在量化模型上应用 LoRA 适配器,仅训练低秩矩阵,极大节省显存并保持性能
QLoRA 能在单卡 48 GB GPU 上微调百亿级模型,且性能与 16-bit LoRA 相当
LoRA 与 QLoRA 在自回归 GPT 模型上的核心实现思路,二者的唯一区别在于 步骤 1:是否对模型权重做 4-bit 量化。
小结
-
PET与Prompt Tuning:学术价值依旧,但因可用性、自动化程度及训练效率原因,已在工业界被LoRA/QLoRA等PEFT所取代;
-
LoRA/QLoRA:凭借参数效率、推理零成本及与量化结合的超低资源需求,成为2025年主流的高效微调方案。
若您正在为生产环境选择PEFT技术,建议优先考虑LoRA及其量化变体QLoRA,并辅以Hugging Face PEFT、ColossalAI等工具链来快速集成与部署。
相关文章:

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介
概览 到2025年,虽然PET(Pattern-Exploiting Training)和Prompt Tuning在学术界仍有探讨,但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调(PEFT)方法取代 。LoRA因其实现简单、推理零开销&#…...

02-jenkins学习之旅-基础配置
0 配置主路径 jenkins安装目录下找到jenkins.xml文件,C:\ProgramData\Jenkins\.jenkins目录下会存放jenkins相关的配置信息。 1 jdk配置 jenkins是java开发开源的项目,进而服务器需要jdk环境 1.1 服务器安装jdk 1.2 jenkins jdk配置 2 git配置 在je…...
互联网大厂Java求职面试:云原生架构与AI应用集成解决方案
互联网大厂Java求职面试:云原生架构与AI应用集成解决方案 场景一:短视频与直播平台的高并发架构设计 面试官提问 面试官(技术总监): 郑薪苦,你有处理过千万级用户同时在线的直播系统吗?如何设…...
Python爬虫实战:研究Crawley 框架相关技术
1. Crawley 框架相关定义 1.1 网络爬虫定义 网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。它通过 HTTP 协议与 Web 服务器进行交互,获取网页内容并进行解析处理,是数据采集和信息检索的重要工具。 1.2 Crawley 框架定义 Crawley 是一个基于 Pytho…...
C#实现List导出CSV:深入解析完整方案
C#实现List导出CSV:深入解析完整方案 在数据交互场景中,CSV文件凭借其跨平台兼容性和简洁性,成为数据交换的重要载体。本文将基于C#反射机制实现的通用CSV导出方案,结合实际开发中的痛点,从基础实现、深度优化到生产级…...

Appium+python自动化(三)- SDK Manager
简介 一开始打算用真机做的,所以在前边搭建环境时候就没有下载SDK,但是考虑到绝大多数人都没有真机,所以顺应民意整理一下模拟器。SDK顾名思义,Android SDK Manager就是一个Android软件开发工具包管理器,就像一个桥梁&…...

3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解
SfM → Point-NeRF → 3D Gaussian Splatting 🟦SfM Structure-from-Motion(运动恢复结构,简称 SfM)是一种计算机视觉技术,可以: 利用多张从不同角度拍摄的图像,恢复出场景的三维结构和相机的…...
主成分分析基本概念及python代码使用
目录 1. 前言 2. 主成分分析的基本概念 3. PCA的适应场景 4. PCA算法的理论基础 4.1 标准化数据 4.2 计算协方差矩阵 4.3 求解特征值和特征向量 4.4 选择主成分 4.5 投影到新坐标系 5. 完整的PCA示例 5.1 使用手写数字数据集 5.2 可视化降维后的数据 6. PCA的优缺…...
MCP如何助力智能交通系统?从数据融合到精准决策
MCP如何助力智能交通系统?从数据融合到精准决策 近年来,智能交通系统(ITS)正在全球范围内快速发展,它结合人工智能(AI)、物联网(IoT)和数据分析,致力于提高交通效率、减少拥堵、增强安全性。而MCP(Multi-Constraint Pathfinding,多约束路径寻优)技术作为一种复杂…...
什么是抽象类?是所有函数都是纯虚函数吗?
什么是抽象类? 抽象类(Abstract Class)是一种特殊的类,它不能被直接实例化,但可以作为基类被其他类继承。抽象类的主要用途是定义一组接口规范,这些规范由派生类实现。 在C中,抽象类是通过包含…...
计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
以下是一个结合ARIMA、鲸鱼优化算法(WOA)、CNN和LSTM进行时间序列预测的Python实现框架。由于完整代码和数据量较大,此处提供核心代码结构和示例数据集,您可根据需求扩展。 1. 数据准备(示例数据) 使用airline-passengers.csv(航空乘客数据集): import pandas as pd…...

【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统
转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/146409453 作者:CSDN|Ringleader| 1 结构 1.1 状态机 1.2 SMB 2 代码实现 2.1 核心控制 Player_Base_SMB 继承 StateMachineBehaviour ,控制变量初始…...
C/C++的OpenCV 进行图像梯度提取
使用 C/OpenCV 进行图像梯度提取 图像梯度表示图像中像素强度的变化率和方向。它是图像分析中的一个基本概念,广泛应用于边缘检测、特征提取和物体识别等任务。OpenCV 提供了多种计算图像梯度的函数。本文将介绍几种常用的梯度算子及其在 C/OpenCV 中的实现。 预备…...
Redis 缓存使用的BigKey问题
一、什么是 BigKey? BigKey 指在 Redis 中存储的 单个 Key 对应的 Value 过大,通常表现为: String 类型:Value 长度 > 10KB。Hash/List/Set/ZSet:元素数量 > 5,000 或总大小 > 10MB。 二、BigKey 的危害 问…...

【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
一、消息队列:分布式系统的核心枢纽 在分布式架构日益普及的今天,消息队列(Message Queue, MQ)已成为解决系统复杂性的核心组件。它通过异步通信、系统解耦和流量控制等能力,有效应对高并发场景下的数据流动挑战。 1.1 核心特性:异步、解耦与弹性 1.1.1 异步通信:释放…...

软媒魔方——一款集合多种系统辅助组件的软件
停更4年,但依旧吊炸天! 亲们,是不是觉得电脑用久了就像老牛拉车,慢得让人着急?别急,我今天要给大家安利一个超好用的电脑优化神器——软媒魔方! 软件介绍 首先,这货真心是免费的&a…...
Unity场景的加载与卸载
Unity场景的加载与卸载 使用方法:把SceneLoader 脚本代码挂在场景中 使用示例: SceneLoader.Instance.LoadAdditiveScene(8);//通过场景索引加载SceneLoader.Instance.UnloadScene("ShiWaiScene");//通过场景名字卸载脚本代码如下࿱…...

多路径可靠传输协议(比如 MPTCP)为什么低效
可靠就不能多路径,多路径求可靠必然要多费劲。这不难理解,多路径必异步,这无疑增加了可靠性判断的难度。 前文 多路径传输(比如 MPTCP)对性能的意义 阐述了作为单连接的多子流 MPTCP 对传输性能的意义是无意义,本文接着阐述作为隧…...

塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
在工厂的能耗构成中,制冷系统是重要的耗能环节。传统的水蓄冷和冰蓄冷技术在实际应用中存在一些局限性,难以满足工厂对节能和成本控制的更高要求。塔能科技的高温冰蓄冷技术,凭借其独特的优势,为工厂能耗精准节能提供了创新的解决…...

内存优化笔记1
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 问题提出 在很多工业软件中,需要对对象进行微分细化,这样会产生很多(几百万到几千万)对象。随着业务的发展,…...

人脸识别,使用 deepface + api + flask, 改写 + 调试
1. 起因, 目的, 感受: github deepface 这个项目写的很好, 继续研究使用这个项目,改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码, 原始项目的文件结构太繁杂了: 我把…...

代码管理平台Gitlab如何通过快解析实现远程访问?
一、Gitlab功能介绍 Gitlab是被广泛使用的基于git的开源代码管理平台,用于管理、存储开发人员代码,同时可以协同开发 二、外网试用Gitlab遇到的问题 运维人员将Gitlab服务器部署在总部机房,而分公司开发人员和出差运维人员就无法访问Gitlab…...

基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
项目背景与概述 随着足球青训行业的快速发展,如何高效、规范地管理学员、教练以及课程等日常工作,成为了青训俱乐部运营的重要课题。为了提升俱乐部的管理效率与用户体验,基于 Spring Boot 和 Vue.js 开发了一个 足球青训俱乐部管理后台系统…...
Redis 是否适合像 MySQL 一样当数据库使用?
Redis 可以在特定场景下作为数据库使用,但与 MySQL 等关系型数据库还是有很大的差异。Redis 确实有持久化功能,开启 AOF 并把 appendfsync 设置为 always 后,它会把每一次数据操作都立刻记录到文件里,相当于每发生一件事就马上记下…...
AI是否会取代人类?浔川问答①
提问者:浔川社团官方联合会 回答者:deepseek 关于AI是否会取代人类的问题,目前科技界和社会学界的主流观点认为:AI会在许多领域显著改变人类的工作和生活方式,但“完全取代人类”的可能性极低。更可能的是人机协作的深…...
JDBC-java操作数据库
1.基本结构: package com.atguigu.servlets;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDBCemo {public static void main(String[] args) throws Exception{String url "jdbc:mysql:///mysql&qu…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

线程调度与单例模式:wait、notify与懒汉模式解析
一.wait 和 notify(等待 和 通知) 引入 wait notify 就是为了能够从应用层面,干预到多个不同线程代码的执行顺序,可以让后执行的线程主动放弃被调度的机会,等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…...

MySQL中TCP和套接字SSL加密连接行为分析
目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL(Secure S…...

php本地 curl 请求证书问题解决
错误: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解决方案 在php目录下创建证书文件夹, 执行下面生成命令, 然后在php.ini 文件中配置证书路径; 重启环境 curl --eta…...