当前位置: 首页 > article >正文

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特性:

  1. 生态兼容性
    深度集成Hugging Face生态(Transformers/Optimum/Peft主分支),支持vLLM和SGLang推理框架,可直接加载FORMAT.GPTQ格式模型,实现跨平台开发与部署。

  2. 模型支持广度
    覆盖30+主流模型架构,包括多模态模型(Ovis VL/Qwen2-VL)、商业模型(Hymba/IBM Granite)及开源模型(Llama系列/GLM等),满足多样化业务需求。

  3. 全平台适配
    支持Linux/MacOS/Windows系统,兼容Nvidia CUDA、AMD ROCm、Intel XPU/MPS及Apple Silicon等异构计算环境,实现CPU/GPU全场景加速。

  4. 动态量化引擎
    独创模块级动态量化控制,可对每个神经网络层独立配置量化参数(如4位/8位混合量化),或完全跳过敏感模块,在性能与精度间实现最优平衡。

  5. 硬件加速方案
    针对Intel平台深度优化,支持AVX/AMX/XMX指令集及Arc GPU加速;通过IPEX框架实现CPU推理优化,结合BITBLAS动态编译技术提升计算效率。

  6. 工程化保障
    采用100% CI单元测试覆盖,确保量化质量稳定性;支持模型分片加载与哈希校验,保障大模型部署的可靠性;通过lm_head量化进一步降低显存占用。

  7. 性能优化成果
    在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=1NXiWXiW^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)

演进逻辑

  1. OBD(1989)——量化的萌芽

    • 首次提出基于Hessian矩阵的结构化剪枝方法
    • 通过计算参数对损失函数的二阶导数(Hessian值)评估重要性
    • 核心思想:删除对模型性能影响最小的连接(权重参数)
    • 问题:剪枝后模型稀疏度过高,推理加速有限
  2. OBS(1990)——剪枝技术的进化

    • 改进OBD的剪枝策略,提出"Optimal Brain Surgeon"
    • 动态调整剪枝阈值,保留更重要的参数
    • 引入参数恢复机制,在剪枝后微调恢复性能
    • 成果:在ImageNet等任务上实现30%参数缩减而不损失精度
  3. OBQ(2015)——量化技术的突破

    • 首次将量化与剪枝结合,提出"Optimal Brain Quantizer"
    • 创新点:将浮点权重压缩为低精度定点数(如8bit)
    • 关键技术:
      • 基于KL散度的量化误差最小化
      • 动态调整量化步长
      • 引入参数重训练(fine-tuning)补偿精度损失
    • 意义:开创了低比特量化的先河,为后续研究奠定基础
  4. GPTQ(2022)——工业级量化方案

    • 革命性的4bit量化技术,实现:
      • 动态量化:逐通道/逐组调整量化参数
      • 精度补偿:基于泰勒展开的误差校正
      • 高效推理:支持CUDA kernel优化
    • 关键突破:
      • 混合精度量化策略(FP32/FP16/INT4混合存储)
      • 自适应量化步长计算
      • 推理速度提升5-10倍的同时保持接近FP16的精度
    • 应用场景:LLM部署(Llama2-70B量化后可在消费级GPU运行)

GPTQ 混合量化方案(W4A16)

一、总述

GPTQ 采用 int4/fp16 (W4A16) 的混合量化方案,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动态地反量化回 float16 并在该数值类型下进行实际的运算.

二、训练阶段:权重量化准备

在训练阶段,首先要对模型的权重进行一系列预处理操作,为后续的量化做准备。

  1. 动态范围分析:对模型中每个权重矩阵进行统计分析,找出其最大值和最小值。例如,某一层的权重值分布在 -3.2 到 4.1 这个区间内。这一步的目的是确定权重的变化范围,为后续的量化映射提供基础。
  2. 量化参数计算:根据动态范围分析得到的最大值和最小值,计算两个重要的量化参数——缩放因子和零点。缩放因子的计算方法是用最大值与最小值的差值除以 int4 所能表示的最大正数(对于 4 位整数,即 2 的 3 次方减 1,也就是 15)。零点则是用于处理负数的偏移量,它确保量化后的数值能够准确反映原始权重的信息。
  3. 量化映射:通过编写函数,将原始的浮点型权重按照计算得到的缩放因子和零点进行量化,转换为 int4 类型。例如使用 np.round(weight / scale + zero_point).astype(np.int8) 这样的代码,就能把权重转换为对应的量化值。
三、存储优化:int4 权重存储

量化后的权重在存储方面有很大优势,GPTQ 采用了一系列优化策略。

  1. 内存布局优化:为了进一步节省存储空间,GPTQ 把 4 个 int4 数值打包成 1 个字节(8 位)。这样一来,原本需要大量空间存储的权重,现在占用的空间大幅减少。比如一个有 1 亿个参数的模型,原本使用 float32 存储需要 400MB 空间,量化后使用 int4 并打包存储,只需要 50MB,存储空间直接压缩为原来的八分之一。
  2. 存储格式示例:可以通过一个表格清晰地看到原始的 float32 值、量化后的 int4 值以及打包后的字节形式之间的对应关系。例如,原始的 0.5 量化后为 3,和其他量化值一起打包成一个字节如 0b00110100 进行存储。
四、推理阶段:动态反量化与计算

在推理阶段,为了保证计算精度,需要将量化后的权重反量化回 float16 进行实际运算。

  1. 硬件级反量化:当计算单元(如 GPU 内核)从内存中加载权重时,会自动对打包的字节进行解包操作,将其还原为 int4 形式,再进一步反量化为 float16。例如,读取到 0b00110100 这个字节,就会解包出对应的量化值 3、 -5 等,然后反量化为对应的 float16 数值。
  2. 混合精度计算流程:推理过程遵循特定的流程。首先输入的激活值保持为 float16 类型,然后解包后的权重也转换为 float16 类型,接着进行矩阵乘法运算,最后经过激活函数处理得到输出结果。整个过程可以用一个流程图来清晰展示,输入激活值经过解包权重、矩阵乘法、激活函数这几个步骤,最终完成推理计算。
  3. 计算优化策略:为了提高推理速度,采用了多种计算优化策略。利用 GPU 的 Tensor Core 来加速 float16 运算,优化内存访问方式以减少从 DRAM 到 SRAM 的数据传输量,还通过并行计算的方式同时处理多个 int4 权重组,从而提高整体的计算效率。
五、关键技术细节
  1. 量化粒度选择:量化粒度的选择对模型精度有重要影响。GPTQ 通常采用每通道量化的方式,相比于每层量化,这种方式能减少精度损失。一般典型的配置是每通道 4096 个参数为一组进行量化。
  2. 误差补偿机制:量化过程不可避免地会带来一定的误差,为了减少误差对模型性能的影响,采用了误差补偿机制。动态调整量化参数,通过误差反馈校准的方法,对量化过程中的误差进行修正,尽量保持模型的精度。
  3. 激活值保留 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…...

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型(SSMs)的创新架构——nnMamba,用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络(CNN)的局部特征提取能力与SSMs的全局上下文建…...

安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源

安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下,充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀,推出新一代新能源充电桩解决方案,以智能化、高兼容性…...

使用开源OPUS-MT模型进行文本翻译(python)

1. 环境准备 pip install transformers 2. 下载机器翻译模型: 2.1 代码从hugging face平台下载 from transformers import MarianMTModel, MarianTokenizer# 指定模型名称 model_name "Helsinki-NLP/opus-mt-zh-en" # 中译英模型# 下载并保存分词器到…...

通过 Docker openssl 容器生成生成Nginx证书文件

使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书(Nginx) # 生成1个.key私钥文件&#…...

Elastic如何获取当前系统时间

文章目录 1. 使用 _ingest.timestamp 在 Ingest Pipeline 中获取当前时间2. 使用 Painless Script 获取当前时间3. 使用 now 关键字在查询中获取当前时间4. 使用 date 类型字段的默认值5. 使用 Kibana 的 Dev Tools 查看当前时间6. 使用 date 聚合获取当前时间7. 使用 Elastics…...

MLT媒体程序框架03:滤镜——loudness

EBU R.128协议 引用链接 EBU的全称为European Broadcasting Union ,既欧洲广播联盟,为欧洲与北非各广播业者(包含广播电台与电视台)的合作组织,成立于1950年2月12日,有五十多个正式加盟国,总部位于瑞士日内瓦,目前中国…...

jenkins配置连接k8s集群

jenkins配置连接k8s集群 前言 我这边jenkins是在一个服务器里面,k8s集群在其他服务器,实现连接 首先jenkins下载有k8s插件 进入配置页面 获取k8s-api-server地址 对应k8s服务器执行 kubectl config view --minify -o jsonpath{.clusters[0].cluste…...

如何选择缓存模式?

如何选择缓存模式 当一个系统引入缓存后,最大的挑战之一便是如何确保缓存与后端数据库的一致性。目前,常见的解决方案主要有Cache Aside、Read/Write Throught和Write Back这三种缓存更新策略。 Read/Write Throught策略 读操作方面,如果缓…...

机器学习常见面试题

常见基模型 1. 线性模型(Linear Models) 特点:通过线性组合特征进行预测,适合处理线性关系。常见类型: 线性回归(Linear Regression)逻辑回归(Logistic Regression)岭回…...

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全:Cyber Security(网络空间安全) 网络空间有独立且相互依存的信息基础设施和网络组成,包括互联网、电信网、计算机系统、嵌入式处理器和控…...

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前,先简单说下k8s是个啥: 一、k8s简介: k8s,全称:kubernetes,它可以看作是一个分布式系统支撑平台。k8s的作用: 1、故障自愈: k8s这个玩意可以监控容器…...

Manus详细介绍,Manus核心能力介绍

文章目录 前言Manus产品定位与核心理念:Manus产品特性与未来体验战略:Manus商业价值与创新指标:Manus技术特点与竞争优势:Manus用户反馈与展望:Manus市场竞争优势与团队战略:Manus深度总结与启发: 前言 这是一篇关于Manus智能体产品的用户体验评价报告,主要介绍了M…...

Apache XTable:在数据湖仓一体中推进数据互作性

Apache XTable 通过以多种开放表格式提供对数据的访问,在增强互作性方面迈出了一大步。移动数据很困难,在过去,这意味着在为数据湖仓一体选择开放表格式时,您被锁定在该选择中。一个令人兴奋的项目当在数据堆栈的这一层引入互作性…...

Java直通车系列14【Spring MVC】(深入学习 Controller 编写)

目录 基本概念 编写 Controller 的步骤和要点 1. 定义 Controller 类 2. 映射请求 3. 处理请求参数 4. 调用业务逻辑 5. 返回响应 场景示例 1. 简单的 Hello World 示例 2. 处理路径变量和请求参数 3. 处理表单提交 4. 处理 JSON 数据 5. 异常处理 基本概念 Cont…...

36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist

增对wifi的调试命令有很多,这边列出我们常用的命令提供参考,方便查看信息定位问题。 1、iwconfig 查看当前 WIFI 的工作信道以及工作带宽模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…...

tauri加载网页处理点击a链接默认浏览器打开问题

添加click事件,当点击了a标签,就阻止默认事件,然后自己处理,在自己窗口中打开这个页面。将这个js注入到页面中就可以了 const hookClick (e) > {console.log(hookClick, e)e.preventDefault()const origin e.target.closest…...

openharmony 软总线-设备发现流程

6.1 设备发现流程 6.1.1 Wi-Fi设备发现 6.1.1.1 Wi-Fi设备发现流程 Wi-Fi设备在出厂状态或者恢复出厂状态下,设备上电默认开启SoftAP模式,SoftAP的工作信道在1,6,11中随机选择,SoftAP的Beacon消息中携带的SSID eleme…...

大白话CSS 优先级计算规则的详细推导与示例

大白话CSS 优先级计算规则的详细推导与示例 答题思路 引入概念:先通俗地解释什么是 CSS 优先级,让读者明白为什么要有优先级规则,即当多个 CSS 样式规则作用于同一个元素时,需要确定哪个规则起作用。介绍优先级的分类&#xff1…...

【GoTeams】-4:为项目引入etcd

本文目录 1. 书接上回2. 引入etcddiscoverystruct{}{} resolverserver 3. 将服务注册到etcd中4. 梳理下etcd调用逻辑 1. 书接上回 本节是为项目引入etcd这个环节,然后我们来看看具体该怎么实现。 首先来谈谈为什么要引入服务发现? 动态服务注册与发现…...

DeepSeek + Kimi:高效制作PPT实战详解

在快节奏的职场环境中,制作高质量的PPT已成为许多人的日常任务。然而,从零开始构思、设计、撰写并优化一份精美的PPT往往耗时费力。幸运的是,AI技术的飞速发展为我们提供了全新的解决方案。本文将详细介绍如何利用DeepSeek与Kimi智能助手的高…...

计算机基础:二进制基础06,用八进制来计数

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:计算机基础:二进制基础05,八进制简介 回…...

OSCP最新备考攻略:迎接2024改版后的OSCP+认证

OSCP(Offensive Security Certified Professional)是渗透测试领域一块金字招牌,由Offensive Security打造,因其硬核实战和高门槛备受推崇。2024年11月1日,OSCP迎来了一次重量级改版,推出了OSCP认证&#xf…...

Jmeter使用介绍

文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一(仅一次性)方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...

hooks useModule自定义hooks (二次封装AgGridReact ag-table)自定义表头,自定义表头搜索

场景业务: 多次运用AgGridReact的table 列表 思路: 运用自定义hooks进行二次封装: 通用配置例如:传参的参数,传参的url,需要缓存的key这些键值类 定制化配置例如:需要对table 的一些定制化传…...

Android Studio 配置国内镜像源

Android Studio版本号:2022.1.1 Patch 2 1、配置gradle国内镜像,用腾讯云 镜像源地址:https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址:Index of /AndroidSDK/...

OFA:通过简单的序列到序列学习框架统一架构、任务和模态

【摘要】 摘要总结 本文介绍了一种新的统一框架OFA(One For All),旨在通过一个简单的序列到序列学习框架来实现跨模态和单模态任务的统一预训练。OFA框架支持任务无关性和模态无关性,并能实现任务全面性。OFA统一了包括图像生成、视觉定位、图像字幕、图像分类、语言建模…...

C++11新特性2.空指针nullptr

目录 一.简介 1.基本概念 2.语法 二.使用示例 示例1:初始化指针 示例2:作为函数参数 三.nullptr与NULL的区别 1.类型安全 2.函数重载问题 3.注意事项 一.简介 1.基本概念 nullptr 是一个类型安全的空指针常量,它的类型是 std::nul…...

实战案例分享:WLAN TKIP/CCMP加密组件的选择

无线接入点(AP)与终端(STA)在连接过程中涉及多种加密算法,如CCMP、TKIP等,选择合适的加密组件对于保证网络安全和兼容性至关重要。本篇我们将分析Wi-Fi加密机制、Wi-Fi加密组件的选型要点、典型问题及解决方…...

Day(19)--IO流(三)

文件加密 ps:^异或: 两边相同就是false 两边不同就是true 如果比较的是数字,那就会把它转换成为二进制,从右自左依次比较 总结:如果一个数字被异或两次,结果还是原来的数字 缓冲流 字节缓冲流 BufferedInputStream------字节缓冲输入流 BufferedOutputStream----字节…...