GPTQ - 生成式预训练 Transformer 的精确训练后压缩
GPTQ - 生成式预训练 Transformer 的精确训练后压缩
flyfish
曾经是 https://github.com/AutoGPTQ/AutoGPTQ
现在是https://github.com/ModelCloud/GPTQModel
对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》
生成式预训练Transformer模型(如GPT或OPT)凭借在复杂语言建模任务中的突破性性能脱颖而出,但也因其极高的计算和存储成本而备受关注。具体而言,由于其庞大的模型规模,即使是高精度的大型GPT模型进行推理也可能需要多块高性能GPU,这极大限制了这类模型的实际应用。尽管目前有通过模型压缩缓解这一压力的研究,但现有压缩技术的适用性和性能受限于GPT模型的规模与复杂度。
针对这一挑战,本文提出了一种基于近似二阶信息的新型一次性权重量化方法——GPTQ。该方法兼具高精度和高效性:
- 能够在约4个GPU小时内完成对1750亿参数GPT模型的量化
- 将权重位宽压缩至3-4位/权重
- 与未压缩基线相比仅产生可忽略的精度损失
相较于此前提出的一次性量化方法,我们的方法在保持精度的同时将压缩增益提高了一倍以上,首次实现了在单块GPU上运行1750亿参数模型进行生成推理。此外,我们还证明了该方法在极端量化场景下仍能保持合理精度,可将权重量化至2位甚至三进制水平。实验表明:
- 相比FP16精度,使用高端GPU(NVIDIA A100)可实现约3.25倍的端到端推理加速
- 使用更具成本效益的GPU(NVIDIA A6000)可实现约4.5倍的推理加速
该技术突破为在资源受限设备上部署超大规模语言模型开辟了新路径。
GPTQModel 最初是 AutoGPTQ 的重大重构版本,如今已发展为功能全面的替代方案。它拥有更简洁的 API 接口、支持最新模型架构、具备更快的推理速度和更高质量的量化效果。
公开测试数据及 ModelCloud 内部测试均表明,GPTQ 在 4 位量化领域展现出卓越性能:其模型质量恢复能力与生产级推理速度(令牌延迟及每秒请求数)均达到或超越同类技术。在真实生产部署场景中,GPTQ 实现了模型质量与推理速度的完美平衡,是工业级大模型部署的理想选择
pip 安装 gptqmodel 包
pip install -v --no-build-isolation gptqmodel
或者
pip install -v --no-build-isolation gptqmodel[vllm,sglang,bitblas,ipex,auto_round]
命令
-
-v 或 –verbose:
- 这个选项表示“详细模式”。使用
-v可以让 pip 输出更详细的日志信息,帮助用户了解安装过程中的每一个步骤。这对于调试安装问题非常有用。
- 这个选项表示“详细模式”。使用
-
–no-build-isolation:
- 默认情况下,pip 使用 build isolation(构建隔离),这意味着在构建过程中会创建一个临时的、独立的环境来安装构建所需的依赖项。这个选项禁用了这种隔离,允许你在全局环境中使用已有的依赖项进行构建。这在某些情况下可以帮助解决依赖冲突的问题。
-
gptqmodel[vllm,sglang,bitblas,ipex,auto_round]:
- 这一部分指定了要安装的包及其额外的可选特性或模块。
- gptqmodel: 这是要安装的主要包的名字。
- 方括号
[...]内的内容指定了该包的一些额外功能或插件,这些被称为“extras”:- vllm: 表示安装支持 vLLM 推理的额外组件。
- sglang: 支持 SGLang 推理的额外组件。
- bitblas: 支持 Microsoft/BITBLAS 格式的额外组件。
- ipex: Intel IPEX 加速量化/推理的支持。
- auto_round: 提供 Intel/AutoRound 替代 GPTQ 推理兼容的量化方法。
GPTQModel特性:
-
生态兼容性
深度集成Hugging Face生态(Transformers/Optimum/Peft主分支),支持vLLM和SGLang推理框架,可直接加载FORMAT.GPTQ格式模型,实现跨平台开发与部署。 -
模型支持广度
覆盖30+主流模型架构,包括多模态模型(Ovis VL/Qwen2-VL)、商业模型(Hymba/IBM Granite)及开源模型(Llama系列/GLM等),满足多样化业务需求。 -
全平台适配
支持Linux/MacOS/Windows系统,兼容Nvidia CUDA、AMD ROCm、Intel XPU/MPS及Apple Silicon等异构计算环境,实现CPU/GPU全场景加速。 -
动态量化引擎
独创模块级动态量化控制,可对每个神经网络层独立配置量化参数(如4位/8位混合量化),或完全跳过敏感模块,在性能与精度间实现最优平衡。 -
硬件加速方案
针对Intel平台深度优化,支持AVX/AMX/XMX指令集及Arc GPU加速;通过IPEX框架实现CPU推理优化,结合BITBLAS动态编译技术提升计算效率。 -
工程化保障
采用100% CI单元测试覆盖,确保量化质量稳定性;支持模型分片加载与哈希校验,保障大模型部署的可靠性;通过lm_head量化进一步降低显存占用。 -
性能优化成果
在Llama 3.1 8B模型量化中实现45%打包速度提升,OPT模型PPL计算加速50%;结合Intel AutoRound技术,可提供与GPTQ兼容的替代量化方案。
该工具通过算法创新与工程优化,为企业级大模型部署提供了完整解决方案,在保持模型精度的同时显著降低算力成本,推动生成式AI技术的工业化落地。
-
基本思想
GPTQ的基本思想是将模型权重矩阵 W W W 量化为低比特表示 W ^ \hat{W} W^,使得量化后的模型在特定的校准数据集上与原始模型的输出尽可能接近。具体而言,它通过最小化量化误差来找到最优的量化参数。
量化过程
1. 选择校准数据集
从训练数据或验证数据中选取一小部分样本作为校准数据集。这部分数据用于在量化过程中估计量化误差,通常不需要太多样本,因为主要目的是捕捉模型的统计特性。
2. 逐层量化
GPTQ通常采用逐层量化的方式,即对模型中的每一层分别进行量化操作。以线性层为例,假设输入为 X X X,权重矩阵为 W W W,输出为 Y Y Y,则有 Y = X W Y = XW Y=XW。在量化时,我们要找到一个量化后的权重矩阵 W ^ \hat{W} W^,使得 Y Y Y 和 X ^ W ^ \hat{X}\hat{W} X^W^ 之间的差异尽可能小,其中 X ^ \hat{X} X^ 是输入 X X X 的量化表示(在某些情况下,输入也可以不进行量化)。
3. 量化误差的定义
为了衡量量化误差,GPTQ通常使用均方误差(Mean Squared Error, MSE)作为损失函数。对于一个线性层,量化误差可以表示为:
L = 1 N ∑ i = 1 N ∥ X i W − X i W ^ ∥ 2 2 L = \frac{1}{N} \sum_{i=1}^{N} \| X_i W - X_i \hat{W} \|_2^2 L=N1i=1∑N∥XiW−XiW^∥22
其中, N N N 是校准数据集中样本的数量, X i X_i Xi 是第 i i i 个样本的输入, ∥ ⋅ ∥ 2 \|\cdot\|_2 ∥⋅∥2 表示L2范数。
4. 求解最优量化参数
为了找到最优的量化后的权重矩阵 W ^ \hat{W} W^,GPTQ采用了一种基于梯度的优化方法。具体来说,它通过迭代地更新量化参数,使得损失函数 L L L 最小化。在每次迭代中,根据当前的量化参数计算损失函数的梯度,并使用梯度下降等优化算法更新量化参数。
5. 量化方式
GPTQ可以采用对称量化或非对称量化。对称量化假设权重的分布关于零对称,而非对称量化则允许权重的分布具有非零的均值。非对称量化通常可以提供更高的量化精度,但计算复杂度也相对较高。
优化技巧
- 分块量化:为了降低计算复杂度,GPTQ通常将权重矩阵划分为多个小块,对每个小块分别进行量化。这样可以减少每次迭代中需要处理的参数数量,提高量化效率。
- 快速二阶近似:在计算损失函数的梯度时,GPTQ采用了一种快速二阶近似方法,避免了直接计算Hessian矩阵,从而显著降低了计算复杂度。
快速二阶近似
二阶信息在优化中的作用
在优化问题里,目标是最小化一个损失函数(例如GPTQ中衡量量化误差的均方误差)。梯度下降是常见的优化方法,它只使用了损失函数的一阶导数(梯度)信息,根据梯度的反方向更新参数。然而,一阶方法在某些情况下收敛速度较慢。二阶方法会考虑损失函数的二阶导数(Hessian矩阵),能提供关于函数曲率的信息,从而更准确地预估函数的局部形状,通常可以让优化过程收敛得更快。
传统二阶方法的问题
对于大规模的神经网络模型,直接计算Hessian矩阵并利用它进行优化存在很大的挑战。Hessian矩阵的规模是参数数量的平方,这会导致极高的存储需求和计算复杂度,在实际应用中往往不可行。
GPTQ的快速二阶近似
GPTQ采用了快速二阶近似方法来解决上述问题,避免了直接计算完整的Hessian矩阵。
原理
它通过对Hessian矩阵进行近似和简化,只计算和使用与优化相关的部分信息。具体而言,GPTQ利用了权重矩阵的结构特点和量化问题的特性,在每一步迭代中,对当前块的权重计算一个近似的二阶信息。这个近似过程基于一些合理的假设和简化,使得计算量大幅降低。
操作方式
- 分块处理:将大的权重矩阵分成多个小块,对每个小块分别进行量化和优化。在处理每个小块时,只考虑该小块对应的局部二阶信息,而不是整个模型的全局Hessian矩阵。
- 低秩近似:利用低秩矩阵来近似表示Hessian矩阵的关键部分。低秩矩阵可以用较少的参数来描述,从而减少存储和计算成本。
- 迭代更新:在每次迭代中,根据当前的近似二阶信息和梯度信息,更新量化参数。这个过程不断重复,直到损失函数收敛到一个满意的值。
快速二阶近似的优势
- 计算效率提升:避免了直接计算和存储完整的Hessian矩阵,大大减少了计算量和内存需求,使得量化过程能够在合理的时间内完成。
- 收敛速度加快:相比于仅使用一阶信息的方法,结合近似二阶信息可以更准确地引导参数更新,加快优化过程的收敛速度,提高量化的精度和效率。
剪枝(OBD/OBS)→ 量化(OBQ)→ 动态量化(GPTQ)
演进逻辑:
-
OBD(1989)——量化的萌芽
- 首次提出基于Hessian矩阵的结构化剪枝方法
- 通过计算参数对损失函数的二阶导数(Hessian值)评估重要性
- 核心思想:删除对模型性能影响最小的连接(权重参数)
- 问题:剪枝后模型稀疏度过高,推理加速有限
-
OBS(1990)——剪枝技术的进化
- 改进OBD的剪枝策略,提出"Optimal Brain Surgeon"
- 动态调整剪枝阈值,保留更重要的参数
- 引入参数恢复机制,在剪枝后微调恢复性能
- 成果:在ImageNet等任务上实现30%参数缩减而不损失精度
-
OBQ(2015)——量化技术的突破
- 首次将量化与剪枝结合,提出"Optimal Brain Quantizer"
- 创新点:将浮点权重压缩为低精度定点数(如8bit)
- 关键技术:
- 基于KL散度的量化误差最小化
- 动态调整量化步长
- 引入参数重训练(fine-tuning)补偿精度损失
- 意义:开创了低比特量化的先河,为后续研究奠定基础
-
GPTQ(2022)——工业级量化方案
- 革命性的4bit量化技术,实现:
- 动态量化:逐通道/逐组调整量化参数
- 精度补偿:基于泰勒展开的误差校正
- 高效推理:支持CUDA kernel优化
- 关键突破:
- 混合精度量化策略(FP32/FP16/INT4混合存储)
- 自适应量化步长计算
- 推理速度提升5-10倍的同时保持接近FP16的精度
- 应用场景:LLM部署(Llama2-70B量化后可在消费级GPU运行)
- 革命性的4bit量化技术,实现:
GPTQ 混合量化方案(W4A16)
一、总述
GPTQ 采用 int4/fp16 (W4A16) 的混合量化方案,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动态地反量化回 float16 并在该数值类型下进行实际的运算.
二、训练阶段:权重量化准备
在训练阶段,首先要对模型的权重进行一系列预处理操作,为后续的量化做准备。
- 动态范围分析:对模型中每个权重矩阵进行统计分析,找出其最大值和最小值。例如,某一层的权重值分布在 -3.2 到 4.1 这个区间内。这一步的目的是确定权重的变化范围,为后续的量化映射提供基础。
- 量化参数计算:根据动态范围分析得到的最大值和最小值,计算两个重要的量化参数——缩放因子和零点。缩放因子的计算方法是用最大值与最小值的差值除以 int4 所能表示的最大正数(对于 4 位整数,即 2 的 3 次方减 1,也就是 15)。零点则是用于处理负数的偏移量,它确保量化后的数值能够准确反映原始权重的信息。
- 量化映射:通过编写函数,将原始的浮点型权重按照计算得到的缩放因子和零点进行量化,转换为 int4 类型。例如使用
np.round(weight / scale + zero_point).astype(np.int8)这样的代码,就能把权重转换为对应的量化值。
三、存储优化:int4 权重存储
量化后的权重在存储方面有很大优势,GPTQ 采用了一系列优化策略。
- 内存布局优化:为了进一步节省存储空间,GPTQ 把 4 个 int4 数值打包成 1 个字节(8 位)。这样一来,原本需要大量空间存储的权重,现在占用的空间大幅减少。比如一个有 1 亿个参数的模型,原本使用 float32 存储需要 400MB 空间,量化后使用 int4 并打包存储,只需要 50MB,存储空间直接压缩为原来的八分之一。
- 存储格式示例:可以通过一个表格清晰地看到原始的 float32 值、量化后的 int4 值以及打包后的字节形式之间的对应关系。例如,原始的 0.5 量化后为 3,和其他量化值一起打包成一个字节如 0b00110100 进行存储。
四、推理阶段:动态反量化与计算
在推理阶段,为了保证计算精度,需要将量化后的权重反量化回 float16 进行实际运算。
- 硬件级反量化:当计算单元(如 GPU 内核)从内存中加载权重时,会自动对打包的字节进行解包操作,将其还原为 int4 形式,再进一步反量化为 float16。例如,读取到 0b00110100 这个字节,就会解包出对应的量化值 3、 -5 等,然后反量化为对应的 float16 数值。
- 混合精度计算流程:推理过程遵循特定的流程。首先输入的激活值保持为 float16 类型,然后解包后的权重也转换为 float16 类型,接着进行矩阵乘法运算,最后经过激活函数处理得到输出结果。整个过程可以用一个流程图来清晰展示,输入激活值经过解包权重、矩阵乘法、激活函数这几个步骤,最终完成推理计算。
- 计算优化策略:为了提高推理速度,采用了多种计算优化策略。利用 GPU 的 Tensor Core 来加速 float16 运算,优化内存访问方式以减少从 DRAM 到 SRAM 的数据传输量,还通过并行计算的方式同时处理多个 int4 权重组,从而提高整体的计算效率。
五、关键技术细节
- 量化粒度选择:量化粒度的选择对模型精度有重要影响。GPTQ 通常采用每通道量化的方式,相比于每层量化,这种方式能减少精度损失。一般典型的配置是每通道 4096 个参数为一组进行量化。
- 误差补偿机制:量化过程不可避免地会带来一定的误差,为了减少误差对模型性能的影响,采用了误差补偿机制。动态调整量化参数,通过误差反馈校准的方法,对量化过程中的误差进行修正,尽量保持模型的精度。
- 激活值保留 fp16 的原因:激活值之所以保留为 float16 类型,是因为激活值的动态范围通常较大,例如 ReLU 激活函数的输出可能接近输入的最大值。而且在计算过程中,中间结果需要更高的精度来避免误差累积,从而保证最终的推理结果准确可靠。
解释
量化与混合量化方案
- 量化:在深度学习中,量化是一种将高精度数据(如32位浮点数,即
float32)转换为低精度数据(如整数)的技术。其目的是减少模型的存储需求和计算量,从而提高模型的推理速度和降低硬件资源的消耗。 - 混合量化方案:不同的数据类型在模型的不同部分使用。在
int4/fp16 (W4A16)这种混合量化方案里,“W4” 表示权重(weights)采用 4 位整数(int4)进行量化,“A16” 表示激活值(activations)采用 16 位浮点数(float16)来表示。
模型权重
- 定义:在神经网络中,权重是神经元之间连接的强度。它是模型学习到的参数,用于调整输入信号的重要性。例如,在一个简单的全连接层中,输入向量会与权重矩阵相乘,从而得到输出向量。模型训练的过程就是不断调整这些权重,使得模型的输出尽可能接近真实标签。
- 量化为
int4:将原本使用高精度(如float32)表示的权重,转换为 4 位整数(int4)。4 位整数可以表示的数值范围是有限的,这样可以显著减少权重的存储空间。例如,原本一个float32类型的权重需要 32 位来存储,而量化为int4后只需要 4 位,存储空间减少为原来的 1/8。
激活值
- 定义:激活值是神经元在接收到输入信号并经过加权求和后,再通过激活函数处理得到的输出值。激活函数的作用是引入非线性因素,使得神经网络能够学习到更复杂的模式。常见的激活函数有 ReLU(Rectified Linear Unit)、Sigmoid 等。例如,在一个多层感知机中,每一层神经元的输出就是激活值,这些激活值会作为下一层的输入。
- 保留为
float16:激活值在计算过程中对精度要求相对较高,因为它们会直接影响后续层的输入和最终的输出结果。所以在这种混合量化方案中,激活值仍然使用 16 位浮点数(float16)来表示,以保证模型的计算精度。
推理阶段与反量化
- 推理阶段:是指模型在训练完成后,对新的输入数据进行预测的过程。在这个阶段,模型使用已经学习到的权重和结构来生成输出结果。
- 反量化:由于量化后的权重是
int4类型,而在实际的计算中,硬件通常更擅长处理浮点数运算,所以在推理阶段,需要将量化后的int4权重动态地转换回float16类型,这个过程就是反量化。反量化的目的是为了在保证计算精度的前提下,利用硬件的浮点运算能力进行高效的计算。
相关文章:
GPTQ - 生成式预训练 Transformer 的精确训练后压缩
GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…...
【Python项目】基于深度学习的电影评论情感分析系统
【Python项目】基于深度学习的电影评论情感分析系统 技术简介:采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介:该系统基于深度学习技术,特别是Word2Vec模型,用于分析电影评论的情感倾向。系统分为前台…...
Redis特性总结
一、速度快 正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以…...
深入理解PHP的内存管理与优化技巧
深入理解PHP的内存管理与优化技巧 PHP作为一种广泛使用的服务器端脚本语言,其内存管理机制对于应用程序的性能和稳定性至关重要。本文将深入探讨PHP的内存管理机制,并提供一些优化技巧,帮助开发者更好地理解和优化PHP应用程序的内存使用。 …...
java常见的几种并发安全问题及解决方案
项目场景: 并发的应用场景,在开发过程会经常遇到。 例如:服务应用启动后,需要简单统计接口的总访问量;实时更新订单状态,成交总额。 问题描述: 比如统计接口访问次数,如下的实现&a…...
介绍一下安装时情况 kubernetes 集群
1.安装命令执行完毕 最开始告诉我们应用的版本 v1.29.14前置检测下载镜像写入证书因为当前我们所有的 kubernetes 集群的组件之间的联通 都是基于HTTPS协议实现的 补充知识点:BS架构,即Browser/Server(浏览器/服务器)架构模式&a…...
Dify部署踩坑指南(Windows+Mac)
组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本,nginx端口不要直接修改docker-compose.yaml !!!!!!! 1、更换镜像版本 这个文件是由.env自动生成的,在.env配置 …...
安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源
安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下,充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀,推出新一代新能源充电桩解决方案,以智能化、高兼容性…...
深入剖析Java代理模式:静态代理与动态代理的实战应用
代理模式是Java开发中最重要的设计模式之一,广泛应用于性能监控、访问控制、日志记录等场景。本文将带你全面掌握代理模式的实现原理,并通过3种不同的代码实现方式,彻底理解这一核心设计模式的应用技巧。 一、代理模式的核心价值 代理模式(Proxy Pattern)通过创建代理对…...
JVM与性能调优详解
以下是关于 JVM与性能调优 的详细解析,结合理论、实践及常见问题,分多个维度展开: 一、JVM性能调优的核心目标 性能调优的核心目标是通过优化内存管理、垃圾回收(GC)策略和线程管理,实现以下平衡ÿ…...
【嵌入式通信协议】串口的详细介绍
以下是对嵌入式STM单片机通信串口的详细介绍 一、STM32串口通信基础 STM32的串口模块称为USART(Universal Synchronous/Asynchronous Receiver/Transmitter),支持同步和异步通信;而UART(Universal Asynchronous Receiver/Transmitter)仅支持异步通信。STM32F103C8T6包含…...
乐鑫打造全球首款 PSA Certified Level 2 RISC-V 芯片
乐鑫科技 (688018.SH) 荣幸宣布 ESP32-C6 于 2025 年 2 月 20 日获得 PSA Certified Level 2 认证。这一重要突破使 ESP32-C6 成为全球首款基于 RISC-V 架构获此认证的芯片,体现了乐鑫致力于为全球客户提供安全可靠、性能卓越的物联网解决方案的坚定承诺。 PSA 安全…...
Go学习笔记:基础语法3
1. 常量 Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。 由于编译时的限…...
虚拟卡 WildCard (野卡) 保姆级开卡教程
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学,要了解不同平台(Grok、Talkatone 等)的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时,一般都需要使…...
机试准备第10天
首先学习二分搜索法。使用二分查找需要先排序。第一题是查找,现学现卖。 //二分查找 #include <stdio.h> #include <vector> #include <algorithm> using namespace std; int main(){int n;scanf("%d", &n);vector<int> a(n…...
Apache ECharts介绍(基于JavaScript开发的开源数据可视化库,用于创建交互式图表)
文章目录 Apache ECharts 介绍功能概览多种图表类型- **基础类型**:折线图、柱状图、饼图、散点图。- **高级类型**:雷达图、热力图、桑基图、K线图。- **地理可视化**:支持地图(如中国、世界)和地理坐标系。- **3D支持…...
最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)
前期所需: 1.apache-tomcat-10.1.18-windows-x64(tomcat 10.1.8版本或者差不多新的版本都可以) 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了(一定先配置MAVEN再搞TOMCAT会事半功倍很多) 如果有没配置…...
Linux - 进程通信
一、管道 管道是一种进程间通信(IPC)机制,用于在进程之间传递数据。它的本质是操作系统内核维护的一个内存缓冲区,配合文件描述符进行数据的读写。尽管管道的核心是内存缓冲区,但操作系统通过对管道的实现,…...
使用 Arduino 的 WiFi 控制机器人
使用 Arduino 的 WiFi 控制机器人 这次我们将使用 Arduino 和 Blynk 应用程序制作一个 Wi-Fi 控制的机器人。这款基于 Arduino 的机器人可以使用任何支持 Wi-Fi 的 Android 智能手机进行无线控制。 为了演示 Wi-Fi 控制机器人,我们使用了一个名为“Blynk”的 Andr…...
网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析
在网络安全日益重要的今天,各国纷纷出台相关政策法规,以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0,分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
