大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
基于LlaMAFactory的LoRA微调(上)
- 0 前言
- 1 LoRA微调
- 1 LoRA微调的原理
- 1.2 通过peft库为指定模块添加旁支
- 1.3 lora前后结构输出结果对比
- 1.4 使用PyTorch复现 LoRA.Linear
- 1.5 使用peft进行LoRA微调案例
- 2 LLaMA-Factory
- 2.1 LLaMA-Factory简介
- 2.2 LLaMA-Factory的安装
- 3 使用LLaMA-Factory做自我认知微调
- 3.1 任务介绍
- 3.2 数据集
- 3.3 参数配置
- 3.4 训练
- 3.5 训练结果查看
- 3.6 体验微调成果
0 前言
当前(2025.5),生成模型最常用的微调手段就是LoRA微调,它是局部微调的一种,而全量微调限于数据和算力等因素,很少去使用。
1 LoRA微调
1 LoRA微调的原理
如果一个大模型是将数据映射到高维空间进行处理,这里假定在处理一个细分的小任务时,是不需要那么复杂的大模型的,可能只需要在某个子空间范围内就可以解决,那么也就不需要对全量参数进行优化了,我们可以定义当对某个子空间参数进行优化时,能够达到全量参数优化的性能的一定水平(如90%精度)时,那么这个子空间参数矩阵的秩就可以称为对应当前待解决问题的本征秩或内在秩(intrinsic rank)。
预训练模型中存在一个极小的内在维度,这个内在维度是发挥核心作用的地方。当针对特定任务进行微调后,模型中权重矩阵其实具有更低的本征秩(intrinsic rank),同时,越简单的下游任务,对应的本征秩越低。(Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning)因此,权重更新的那部分参数矩阵尽管随机投影到较小的子空间,仍然可以有效的学习,可以理解为针对特定的下游任务这些权重矩阵就不要求满秩。我们可以通过对全连接层进行低秩分解,并对秩分解矩阵进行微调,来间接训练神经网络中的一些全连接层,从而减少微调的参数量。模型适应下游任务时,参数变化 ΔW 可能存在于低维子空间,低秩分解足以捕捉关键调整方向。
具体操作时,是对模型中特定的模块建立旁支,设原始模块中的权重为W,而旁支则由AB两个矩阵构成,A负责降维,把输入特征的维度从d讲到r,这里 r 就是上面说的本征秩,r 通常取8或16,B负责升维,把特征向量的维度调回到 d。结构如下图所示:
调整后的权重为 W + B ⋅ A W+B⋅A W+B⋅A,实际应用中,B⋅A前面会有个缩放系数,即 W + λ B ⋅ A W+\lambda B⋅A W+λB⋅A,输出为 h = W + λ B ⋅ A x h=W+\lambda B⋅Ax h=W+λB⋅Ax。训练时,冻结W,只更新矩阵A和矩阵B,那么 B 与 A 进行矩阵乘法的结果等效于 W 的梯度,即 Δ W = λ B ⋅ A ΔW=\lambda B⋅A ΔW=λB⋅A。A 使用随机高斯分布初始化,B 初始化为零,即确保训练初始阶段 ΔW=0。训练结束后,将 B⋅A 合并到原始 W 中,即合并到主分支,表达式为: W n e w = W o l d + λ B A W_{new}=W_{old}+\lambda BA Wnew=Wold+λBA。推理时无额外计算开销,与原始模型结构一致。
通过消融实验发现同时调整 W q W_q Wq 和 W v W_v Wv 会产生最佳结果。
1.2 通过peft库为指定模块添加旁支
peft 库是 huggingface 开发的第三方库,其中封装了包括 LoRA、Adapt Tuning、P-tuning 等多种高效微调方法,可以基于此便捷地实现模型的 LoRA 微调。
我们先打印原始模型(Meta-Llama-3-8B-Instruct)的结构,代码如下:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import LoraConfig, TaskType, get_peft_modelmodel_path = '/data/coding/model_weights/LLM-Research/Meta-Llama-3-8B-Instruct'
model = AutoModelForCausalLM.from_pretrained(model_path,device_map="auto",torch_dtype=torch.bfloat16)
print(model)
输出
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████| 4/4 [00:03<00:00, 1.03it/s]
WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu.
LlamaForCausalLM((model): LlamaModel((embed_tokens): Embedding(128256, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): Linear(in_features=4096, out_features=4096, bias=False)(k_proj): Linear(in_features=4096, out_features=1024, bias=False)(v_proj): Linear(in_features=4096, out_features=1024, bias=False)(o_proj): Linear(in_features=4096, out_features=4096, bias=False)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): Linear(in_features=4096, out_features=14336, bias=False)(up_proj): Linear(in_features=4096, out_features=14336, bias=False)(down_proj): Linear(in_features=14336, out_features=4096, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm())(lm_head): Linear(in_features=4096, out_features=128256, bias=False)
)
然后我们通过peft库对对原始模型添加旁支,并打印新的模型结构,代码如下:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import LoraConfig, TaskType, get_peft_modelmodel_path = '/data/coding/model_weights/LLM-Research/Meta-Llama-3-8B-Instruct'
model = AutoModelForCausalLM.from_pretrained(model_path,device_map="auto",torch_dtype=torch.bfloat16)
# print(model)# 对原始模型进行一些设置,训练时候用,这里不训练,所以下面三行代码可以省略
model.gradient_checkpointing_enable()
model.enable_input_require_grads()
model.config.use_cache = False# LoRA 参数配置
config = LoraConfig(task_type=TaskType.CAUSAL_LM, # 模型任务设置为因果模型,即语言模型target_modules=["q_proj", "v_proj"], # 指定要微调的模块,创建 LoRA 模型时,原模型的组件中名字里带"q_proj","v_proj"的模块都会建立旁支inference_mode=False, # 训练模式r=8, # Lora 秩lora_alpha=32, # 用于控制缩放系数,scaling=lora_alpha/r,合并时将旁支乘以缩放系数加入到主分支lora_dropout=0.1 # Dropout 比例
)# 获取 LoRA 模型
model = get_peft_model(model, config)
print(model)
这里需要注意一点,对不同的模型,LoRA 参数可能有所区别。例如,对于 ChatGLM,无需指定 target_modeules,peft 可以自行找到,因为ChatGLM模型把QKV的投影都写到了一个矩阵中(即query_key_value
,维度为(d_model, 3*d_model)
)。
上面的代码输出为:
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████| 4/4 [00:02<00:00, 1.47it/s]
WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu.
PeftModelForCausalLM((base_model): LoraModel((model): LlamaForCausalLM((model): LlamaModel((embed_tokens): Embedding(128256, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): lora.Linear((base_layer): Linear(in_features=4096, out_features=4096, bias=False)(lora_dropout): ModuleDict((default): Dropout(p=0.1, inplace=False))(lora_A): ModuleDict((default): Linear(in_features=4096, out_features=8, bias=False))(lora_B): ModuleDict((default): Linear(in_features=8, out_features=4096, bias=False))(lora_embedding_A): ParameterDict()(lora_embedding_B): ParameterDict())(k_proj): Linear(in_features=4096, out_features=1024, bias=False)(v_proj): lora.Linear((base_layer): Linear(in_features=4096, out_features=1024, bias=False)(lora_dropout): ModuleDict((default): Dropout(p=0.1, inplace=False))(lora_A): ModuleDict((default): Linear(in_features=4096, out_features=8, bias=False))(lora_B): ModuleDict((default): Linear(in_features=8, out_features=1024, bias=False))(lora_embedding_A): ParameterDict()(lora_embedding_B): ParameterDict())(o_proj): Linear(in_features=4096, out_features=4096, bias=False)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): Linear(in_features=4096, out_features=14336, bias=False)(up_proj): Linear(in_features=4096, out_features=14336, bias=False)(down_proj): Linear(in_features=14336, out_features=4096, bias=False)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm())(lm_head): Linear(in_features=4096, out_features=128256, bias=False)))
)
1.3 lora前后结构输出结果对比
关于模型结构对比,这里只展示 q_proj
模块
我们可以计算以下参数量对比,原始 q_proj
模块:4096x4096=16777216,Lora分支:4096x8+8x4096=65536,后者大概只有前者的0.39%,也就是说,通过LoRA微调,需要微调的参数量大大降低。
打印的结果中,包含(lora_embedding_A)
和 (lora_embedding_B)
,它们是用于嵌入层(Embedding Layers)的低秩适配参数,当要LoRA微调嵌入层或者输出分类头时,(lora_embedding_A)
和 (lora_embedding_B)
就相当于 lora_A
和 lora_B
,只不过这里微调的不是嵌入层,也不是输出分类头,所以这两个参数为空。
1.4 使用PyTorch复现 LoRA.Linear
根据LoRA的原理和前面打印的结构,我们可以用PyTorch代码实现其过程:
import torch
import torch.nn as nn
from typing import Optionalclass LoRALinear(nn.Module):def __init__(self,base_layer: nn.Module,r: int = 8,lora_alpha: float = 1.0,lora_dropout: float = 0.1):super().__init__()self.base_layer = base_layer # 原始线性层self.r = rself.lora_alpha = lora_alpha# 冻结原始参数for param in self.base_layer.parameters():param.requires_grad = False# LoRA参数(通常只添加在特定层,这里演示完整实现)in_features = base_layer.in_featuresout_features = base_layer.out_features# LoRA分支结构self.lora_dropout = nn.Dropout(p=lora_dropout)self.lora_A = nn.Linear(in_features, r, bias=False)self.lora_B = nn.Linear(r, out_features, bias=False)# 缩放因子self.scaling = lora_alpha / r# 参数初始化self.reset_parameters()def reset_parameters(self):# 原始层的参数保持预训练值不变# LoRA参数初始化nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5)) # 论文中A用高斯分布初始化,但配套的GitHub源码却是均匀初始化nn.init.zeros_(self.lora_B.weight) # B用0初始化def forward(self, x: torch.Tensor):# 原始层的前向计算base_output = self.base_layer(x)# LoRA分支的前向计算lora_output = self.lora_B(self.lora_A(self.lora_dropout(x))) * self.scaling# 我看了源码,是先dropout再输入到 self.lora_A# 合并结果return base_output + lora_output
关键点说明:
-
结构组成:
•base_layer
:原始预训练的Linear层(4096->4096)
•lora_A
:降维矩阵(4096->8)lora_B
:升维矩阵(8->4096)lora_dropout
:LoRA分支的Dropout层
-
前向流程:
原始输出 = 原始线性层(x)
LoRA分支 = 降维(Dropout(x)) → 升维 → 缩放
最终输出 = 原始输出 + LoRA分支
-
实现细节:
• 参数冻结:原始层的参数通过requires_grad=False
保持冻结
• 缩放因子:使用lora_alpha/r
控制LoRA更新强度(默认alpha=1时相当于1/8)
• 初始化:
• LoRA_A使用Kaiming初始化
• LoRA_B初始化为全零(保证训练初期LoRA分支不影响原始输出) -
使用方式:
# 原始层替换示例
original_layer = model.q_proj
lora_layer = LoRALinear(base_layer=original_layer,r=8,lora_alpha=1.0,lora_dropout=0.1
)
model.q_proj = lora_layer
数学表达式:
o u t p u t = W o r i g i n a l ∗ x + ( W B ∗ W A ∗ d r o p o u t ( x ) ) ∗ ( α / r ) output = W_original * x + (W_B * W_A * dropout(x)) * (\alpha / r) output=Woriginal∗x+(WB∗WA∗dropout(x))∗(α/r)
1.5 使用peft进行LoRA微调案例
这里有一个对ChatGLM模型进行LoRA微调,实现关系信息抽取的项目,其LoRA模型的构建,用的就是peft库,代码比较复杂,有时间可以看看,没时间算了,至于ChatGLM的基模型原理,可以看这篇文章,同样也是有时间就看看,没时间就算了。
2 LLaMA-Factory
2.1 LLaMA-Factory简介
LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调,框架特性包括:
- 模型种类:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等几乎世面上能见到的所有开源模型。
- 训练算法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
- 运算精度:16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微调。
- 优化算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
- 加速算子:FlashAttention-2 和 Unsloth。
- 推理引擎:Transformers 和 vLLM。
- 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow、SwanLab 等等。
说白了,它就是一个可视化微调界面,让你不需要写代码,只在一个UI界面内配置微调参数,就能实现模型微调,配套有中文文档。
2.2 LLaMA-Factory的安装
新建一个conda环境,并激活,然后根据以下命令安装:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory # 进入LLaMA-Factory目录下
pip install -e ".[torch,metrics]"
-e 选项表示“editable”,即可编辑模式。
如果服务器连不上github,可以现在能连上的机器把 LLaMA-Factory 压缩包下载下来,然后上传到服务器。建议使用VS Code连接远程服务器,因为 VS Code 自带端口转发功能,这样可以避免下载frpc_linux_amd64_v0.3
。
以上命令执行完之后,未必就安装完成,还要测试当前环境的微调窗口能否打开。在控制台输入(必须是在LLaMA-Factory目录下输入):
llamafactory-cli webui
如果报错TypeError: argument of type 'bool' is not iterable
,那么大概率是pydantic版本问题,在终端窗口输入以下命令重新安装:
pip install pydantic==2.10.6
如果终端打印的是以下信息,那么说明安装完成:
如果不是使用 VS Code 连接远程服务器,那么需要下载frpc_linux_amd64_v0.3
。
在浏览器输入:http://localhost:7860/
,如果能看到以下的界面,说明安装成功:
3 使用LLaMA-Factory做自我认知微调
3.1 任务介绍
一个大模型,如果你让它自我介绍,它可能会说,我是“通义千问,由阿里开发的人工智能助手”、“我是Llama,由Meta公司开发的人工智能助手”,假设我的公司使用了千问开发了一款产品,我们公司的名称叫“魔幻手机”,现在我希望我微调后的模型能说出这样的话:“你好,我是 Magic,是由 Magic Phone 开发的人工智能助手”。这个微调过程,就叫自我认知训练。
本任务使用 Qwen2.5-1.5B-instruct 模型进行微调,因为这个小,不吃显存。
3.2 数据集
进入LLaMA-Factory/data,里面包含了一些默认的数据集,我们打开 identity.json,这是自我认知训练的数据集:
我们用替换 Magic 替换 {{name}}
,用 Magic Phone 替换 {{author}}
:
如果是自己上传的数据集,那么需要配置 :打开LLaMA-Factory/data/dataset_info.json,然后修改 file_name 字段,把文件名称改成自己上传的数据集文件名或者路径。
3.3 参数配置
启动 LLaMA-Factory 的 UI 服务:
llamafactory-cli webui
然后按照以下配置模型:
如果不是断点续训,那么检查点什么都不要填,我上面的截图是为了说明路径用绝对路径。
接下来是配置训练参数(没有画框的就用默认),其中截断长度要根据数据集给个适当的值,太长的话会占用显存,我们的数据集问答都很短,给个256足够,批处理大小根据显存来设置:
这里的最大样本量,指的是使用的样本量,比如你的数据集有5万条样本,如果最大样本量设置为10000,那就用其中的一万个。这里验证集比例可以为0,因为生成模型永远也不可能过拟合,使用验证集意义不是很大,我们这里设置0.2的比例,为的是能在训练的过程中打印一些指标。
点击“预览数据”,可以看到数据集包含的样本数量:
接下来是其他参数设置,我们这里只设置保存间隔,这里的预热步数就是warmup学习率预热,这个经常用到,但我们这里为了简化,不设置。
这里的日志间隔是指多个step(不是epoch)打印一次,保存间隔最小为10,同样是step,每保存一次,模型会做一次验证(用验证集数据),也就是验证间隔和保存间隔一致。
接下来设置LoRA 参数:
接下来点“预览命令”,获取训练命令:
这里输出目录会自动创建,检查点、训练日志、参数配置都会保存在这个目录下;配置路径是将当前页面配置的参数保存成yaml文件的路径。
预览命令会在窗口的最下方生成命令训练命令,我们可以将其复制到终端运行。不过没必要这么干,既然有可视化界面了,我们就在可视化界面上微调。
3.4 训练
点击开始:
我们新建一个终端,然后输入nvitop,查看显存占用情况:
从显存占用情况来看,其实我们的批处理大小(batch_size)还可以往大设置一倍。
微调窗口可以看到损失变化情况、训练进度和日志:
这里之所以显示600,是因为有600个step,batch_size是4,然后梯度累计是8,那么优化器step一次覆盖的数据是64,而训练集数据是72,数据集导入器是使用drop_last,那么优化器step两次就覆盖完了训练集,所以总共有600个step。
不需要等300个epoch都跑完,只要损失曲线收敛,我们就可以提前停止训练,只需要点击“中断”:
可以看到,大概在第 130 个step就收敛了。
3.5 训练结果查看
我们去输出目录下,看看目录结构:
注意:检查点checkpoint-xxx下放置的模型,并不是千问模型,而是lora分支,它不能单独使用。
输出目录下有两张图片:
我们还可以查看
3.6 体验微调成果
按下面的截图配置模型:
按照前面的训练结果,检查点使用 checkpoint-150 比较合适,我是截图的时候填错了。
然后输入提示词进行聊天
理论上讲,模型的生成长度不应该超过截断长度,但由于这只是自我认知微调,如果这里设置了最大生成长度,那么会影响模型的其他方面功能,除非它只发挥自我认知功能,其他问题你都不问。
聊天界面如下:
好的,大功告成!
作为对比,我们卸载模型,用基模型看看,按下面截断中的顺序 1 2 3 进行操作:
输入和刚刚完全一样的提示词:
可以看到,我们微调的模型完成了自我认知训练。
相关文章:
大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
基于LlaMAFactory的LoRA微调(上) 0 前言1 LoRA微调1 LoRA微调的原理1.2 通过peft库为指定模块添加旁支1.3 lora前后结构输出结果对比1.4 使用PyTorch复现 LoRA.Linear1.5 使用peft进行LoRA微调案例 2 LLaMA-Factory2.1 LLaMA-Factory简介2.2 LLaMA-Facto…...
跨域_Cross-origin resource sharing
同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器ÿ…...
奥威BI:打破AI数据分析伪场景,赋能企业真实决策价值
在当今企业数字化转型的浪潮中,AI数据分析产品如雨后春笋般涌现,但许多看似创新的功能设计实则难以落地,沦为“伪需求场景”。这些伪场景不仅浪费企业资源,还可能误导决策,阻碍企业数字化转型进程。在此背景下…...
LLaMA-Factory全解析:大模型微调的开源利器与实战指
技术演进背景与核心价值架构设计与关键技术解析环境搭建与工具链配置全流程微调实战指南企业级应用与高级功能性能优化与安全部署未来发展趋势展望1. 技术演进背景与核心价值 1.1 大模型微调的技术痛点 当前开源大模型(如LLaMA、Qwen、Baichuan等)在通用领域表现优异,但垂…...
python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...
Jmeter(一) - 环境搭建
1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…...
OpenCV CUDA 模块特征检测与描述------在GPU上执行特征描述符匹配的类cv::cuda::DescriptorMatcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::DescriptorMatcher 是 OpenCV 的 CUDA 模块中用于在 GPU 上执行特征描述符匹配的类。它允许你利用 NVIDIA GPU 的并行计算能力来加速特…...
idea如何让文件夹分层显示,而不是圆点分割
网上说是点击小齿轮的都是过时了,对于新版idea不适用,直接上图 1、如图 2、如图 注意也是去掉Compact Middle Packages,只不过新版的方式UI和老版本的不一样了...
5:OpenCV—直方图均衡化
直方图均衡 直方图均衡是一种用于增强和调整图像对比度的图像处理技术。它通过重新分配图像的像素值,使得图像的灰度级在整个范围内均匀分布,从而增强图像的视觉效果。 图像的直方图是像素强度分布的图形表示。它提供了像素值集中位置以及是否存在异常偏…...
内存分页法
现在有个场景,页面需要分页处理,但是后端在查询完数据库后又会进行筛选,就会导致后端的查询数目跟请求的每页条数是不一样。 解决方案:内存分页法 在内存筛选后手动实现分页逻辑,保证返回数量与请求的 pageSize 一致…...
深入解析FramePack:高效视频帧打包技术原理与实践
摘要 本文深入探讨FramePack技术在视频处理领域的核心原理,解析其在不同场景下的应用优势,并通过OpenCV代码示例演示具体实现方法,为开发者提供可落地的技术解决方案。 目录 1. FramePack技术背景 2. 核心工作原理剖析 3. 典型应用场景 …...
【EI会议火热征稿中】第二届云计算与大数据国际学术会议(ICCBD 2025)
# ACM独立出版 | EI检索稳定、往届会后4个半月完成EI检索 # 热门征稿主题:大数据、5G/6G、物联网、云计算 # 早投稿早送审早录用! 重要信息 大会官网:www.iccbd.net 会议主页:【ACM独立出版|EI稳定】第二届云计算与大数据国际…...
对未来软件的看法
有了大模型之后,TypeScript这样增强型javascript语言可能更方便AI来调试。未来的应用会越来越广泛。node.js vue.js会越来越流行。因为方便AI调试,处理错误。 未来,随着 AI 编程工具对 TypeScript 的深度支持(如自动类型推导、错误…...
新兴技术与安全挑战
7.1 云原生安全(K8s安全、Serverless防护) 核心风险与攻击面 Kubernetes配置错误: 风险:默认开放Dashboard未授权访问(如kubectl proxy未鉴权)。防御:启用RBAC,限制ServiceAccount权限。Serverless函数注入: 漏洞代码(AWS Lambda):def lambda_handler(event, cont…...
Prompt Tuning:轻量级大模型微调全攻略
Prompt Tuning(提示调优)步骤金额流程 传统的 Prompt Tuning(提示调优) 是一种轻量级的大模型微调技术,核心是通过优化连续的提示向量(而非模型参数)来适配特定任务。 一、核心步骤概述 准备任务与数据 明确任务类型(如分类、问答等),准备输入文本和目标标签。加载…...
centos7安装mysql8.0
yum install -y mysql-community-server --nogpgcheckcentos7.9安装mysql8.0 在 CentOS 7.9 上安装 MySQL 8.0,你可以通过多种方式实现,但最推荐的方法是使用 MySQL 官方提供的 yum 仓库。这样可以确保安装的 MySQL 版本是最新的,并且易于管理…...
ZooKeeper 原理解析及优劣比较
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 引言 在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…...
OD 算法题 B卷 【需要打开多少监视器】
文章目录 需要打开多少监视器 需要打开多少监视器 某长方形停车场,每个车位上方都有对应监控器,在当前车位和前后左右四个方向任意一个车位范围停车时,监控器才需要打开。给出某一时刻停车场的停车分布,统计最少需要打开多少个监…...
鸿蒙路由参数传递
页面test.ets 代码如下: import router from ohos.router Entry Component struct Test {State message: string Hello WorldState username: string huState password: string 1build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWe…...
课程与考核
6.1 课程讲解与实战考核 6.1.1 SQL注入篇考核 考核目标:通过手动注入与工具结合,获取目标数据库敏感信息。 题目示例: 目标URL:http://vuln-site.com/product?id1 要求: 判断注入类型(联合查询/报错注…...
CNN、RNN、Transformer对于长距离依赖的捕捉能力分析
卷积网络CNN主要依靠深度来捕捉长距离依赖。但这个过程太间接了,因为信息在网络中实际传播了太多层。究竟哪些信息被保留,哪些被丢弃了,弄不清楚。从实践经验来看,卷积网络捕捉长依赖的能力非常弱。这也是为什么在大多数需要长依赖…...
封装POD与PinMap文件总结学习-20250516
基本概念 芯片封装外形图(POD,Package Outline Drawing),详细描述了芯片的物理尺寸、引脚布局和封装类型等信息; Pin Map是芯片封装的一个重要概念。它是一张详细描述芯片封装外形上各个引脚(Pinÿ…...
Qt项目开发中所遇
讲述下面代码所表示的含义: QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget,将给其应用垂直管路布局。 2、新建一个…...
ubuntu chrome无法使用搜狗拼音输入法,无法输入中文
安装好搜狗输入法后用了很久,突然有一天点击chrome自动升级后就没法用了,在别的软件都能用,还以为是配置问题,就在网上搜了好一阵子才找到解决方案,各种找问题,最后发现是需要安装fcitx5-frontend-gtk4&…...
数据结构与算法分析实验14 实现基本排序算法
实现基本排序算法 1. 常用的排序算法简介2. 上机要求3. 上机环境4.程序清单(写明运行结果及结果分析)4.1 程序清单4.1.1 头文件 sort.h 内容如下:4.1.2 实现文件 sort.cpp 内容如下:4.1.3 源文件 main.cpp 内容如下: 4.2 实现展效果示 5.上机…...
uni-app 中使用 mumu模拟器 进行调试和运行详细教程
一、下载mumu模拟器 二、复制安装路径暴保留 在文件夹中打开 三、配置全局adb命令 adb为Android Debug Bridge,就是起到调试桥的作用 打开shell文件夹、里面有一个adb.exe 将当前文件夹地址复制一下,即‘D:\Program Files\Netease\MuMu Player 12\sh…...
Visual Studio Code 改成中文模式(汉化)
1、打开工具软件(双击打开) 2、软件左边图标点开 3、在搜索框,搜索 chinese 出现的第一个 就是简体中文 4、点击第一个简体中文,右边会出来基本信息 点击 install 就可以安装了(记得联网)。 5、安装完右…...
破解 PCB 制造四大痛点:MOM 系统构建智能工厂新范式
在全球电子信息产业加速向智能化、高端化转型的背景下,PCB(印制电路板)作为 "电子产品之母",既是支撑 5G 通信、新能源汽车、人工智能等战略新兴产业发展的核心基础部件,也面临着 "多品种小批量快速切换…...
【基于深度学习的非线性光纤单像素超高速成像】
基于深度学习的非线性光纤单像素超高速成像是一种结合深度学习技术和单像素成像方法的前沿技术,旨在实现高速、高分辨率的成像。以下是一些关键点和方法: 深度学习在单像素成像中的应用 深度学习技术可以通过训练神经网络来优化单像素成像的重建过程。…...
Backend - Oracle SQL
目录 一、CRUD 增删改查(基础) (一)查询 (二)插入 (三)更新 (四)清空 二、常用 SQL 1. exists 搭配 select 1 2. FROM DUAL 3. INSTR()函数 4. 提取…...
WebSocket心跳机制
通常,心跳机制包括: 定期发送消息(如ping)到服务器以保持连接活跃检测服务器的相应(pong)如果一段时间没有收到相应,可能需要重新连接 ::: warning 在连接关闭或者发生错误时,清除心跳定时器,避免内存泄漏 ::: 在实现…...
计算机视觉与深度学习 | PSO-MVMD粒子群算法优化多元变分模态分解(Matlab完整代码和数据)
以下是一个基于PSO优化多元变分模态分解(MVMD)的Matlab示例代码框架,包含模拟数据生成和分解结果可视化。用户可根据实际需求调整参数。 %% 主程序:PSO优化MVMD参数 clc; clear; close all;% 生成模拟多变量信号 fs = 1000; % 采样频率 t = 0:1/fs:...
Fast Video Cutter Joiner v6.8.2 视频剪切合并器汉化版
想要快速拆解冗长视频,或是将零散片段拼接成完整作品?Fast Video Cutter Joiner 正是你需要的宝藏视频编辑软件!它以强大功能为核心,将复杂的视频处理变得简单直观。 精准的切割与合并功能,让你能随心所欲地裁剪视频…...
【漫话机器学习系列】269.K-Means聚类算法(K-Means Clustering)
一、K-Means 聚类算法简介 K-Means 是一种基于距离的无监督机器学习算法,属于聚类算法(Clustering Algorithm)。它的目标是将数据集划分为 K 个不重叠的子集(簇),使得每个子集中的数据点尽可能相似&#x…...
【北邮通信系统建模与仿真simulink笔记】(1)主要用到的模块库介绍
【声明】 本博客仅用于记录博主学习内容、分享笔记经验,不得用作其他非学术、非正规用途,不得商用。本声明对本博客永久生效,若违反声明所导致的一切后果,本博客均不负责。 目录 1、信号源模块库(Sources)…...
【信息系统项目管理师】第11章:项目成本管理 - 32个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
Java转Go日记(四十四):Sql构建
1.1.1. 执行原生SQL db.Exec("DROP TABLE users;")db.Exec("UPDATE orders SET shipped_at? WHERE id IN (?)", time.Now, []int64{11,22,33})// Scantype Result struct {Name stringAge int}var result Resultdb.Raw("SELECT name, age FROM use…...
数组day2
209长度最小的子数组 class Solution { public:int minSubArrayLen(int s, vector<int>& nums) {int result INT32_MAX;int sum 0; // 滑动窗口数值之和int i 0; // 滑动窗口起始位置int subLength 0; // 滑动窗口的长度for (int j 0; j < nums.size(); j) …...
《Effective Python》第三章 循环和迭代器——永远不要在迭代容器的同时修改它们
引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》第3章“循环和迭代器”中的 Item 22:“Never Modify Containers While Iterating over Them; Use Copies or Caches Instead(永远不要在迭代容器的同时修改它…...
SQLite基础及优化
SQLite 什么是SQLite SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它&#…...
数据库与存储安全
2.1 SQL注入攻防实战(手工注入、自动化工具) 攻击原理与分类 联合查询注入:通过UNION SELECT窃取数据。 UNION SELECT 1,username,password FROM users-- 布尔盲注:利用页面响应差异逐位提取数据。 AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)=a-- 时间…...
vue3/vue2大屏适配
vue3-scale-box 和 vue2-scale-box 可以帮助你在不同 Vue 版本中实现大屏自适应缩放。vue3-scale-box - npmvue3 scale box. Latest version: 0.1.9, last published: 2 years ago. Start using vue3-scale-box in your project by running npm i vue3-scale-box. There is 1 o…...
【数据结构 -- AVL树】用golang实现AVL树
目录 引言定义旋转方式LL型RR型LR型RL型 实现结构获取结点高度平衡因子更新高度左旋右旋插入结点中序遍历 引言 AVL树,基于二叉搜索树通过平衡得到 前面我们知道,通过🔗二叉搜索树可以便捷快速地查找到数据,但是当序列有序时&am…...
matlab慕课学习3.5
于20250520 3.5 用while 语句实现循环结构 3.5.1while语句 多用于循环次数不确定的情况,循环次数确定的时候用for更为方便。 3.5.2break语句和continue语句 break用来跳出循环体,结束整个循环。 continue用来结束本次循环,接着执行下一次…...
【jmeter】base64加密
base64加密 执行的脚本: import java.io.*; import sun.misc.BASE64Encoder; String strvars.get("param") #设置了一个user paramBASE64Encoder encodernew BASE64Encoder() log.info("--------start----------") String resultencoder.encod…...
优化Hadoop性能:如何修改Block块大小
在处理大数据时,Hadoop的性能和资源管理是至关重要的。Hadoop的分布式文件系统(HDFS)将数据切割成多个块(Block),并将这些块分布在集群中的不同节点上。在默认情况下,HDFS的块大小可能并不适合所…...
jmeter转义unicode变成中文
打开jmeter,添加后置处理器到接口请求后,在添加完成后将代码复制进入 (注意:最后执行后需要到“察看结果树”里看,需要自行添加对应的监听器) 按如下添加代码进入上图位置: //如下复制于链接&…...
ALSA 插件是什么? PortAudio 断言失败是什么意思?
下面用更简单的语言和图文形式帮你理解: 1. ALSA 插件是什么?为什么重要? 想象你电脑里的音频系统就像一个厨房,ALSA 是厨房里的厨师,负责做出声音(做菜)和收集声音(收菜࿰…...
计算机科技笔记: 容错计算机设计05 n模冗余系统 双模冗余系统 Duplex Systems
接收测试 测试 (HA服务器的方法) HA系统 一、基本HA结构 当前常用的HA(High Availability)系统结构大体如下: 双机结构:两台主机(可称为主机A和主机B) 两种运行模式: A…...
Translational Psychiatry | 注意缺陷多动障碍儿童延迟厌恶的行为与神经功能特征茗创科技茗创科技
摘要 尽管已有大量研究致力于解析注意缺陷多动障碍(ADHD)中的认知异质性,但对其动机变化(尤其是延迟厌恶)的探索仍相对有限。本研究旨在通过识别ADHD儿童的同质性延迟厌恶特征来理解其动机缺陷,采用体验式延迟贴现任务对43名ADHD儿童和47名对照参与者(经…...