LLM 的推理优化技术纵览

推理是 LLM 应用的重要一环,在部署服务环节影响重大,本文将讨论主流的 LLM 的推理优化技术。

一、子图融合(subgraph fusion)

图融合技术即通过将多个 OP(算子)合并成一个 OP(算子),来减少Kernel的调用。因为每一个基本 OP 都会对应一次 GPU kernel 的调用,和多次显存读写,这些都会增加大量额外的开销。

1.1 FasterTransformer by NVIDIA

FasterTransformer(FT) 是一个用于实现基于Transformer的神经网络推理的加速引擎。FT框架是用C++/CUDA编写的,依赖于高度优化的 cuBLAS、cuBLASLt 和 cuSPARSELt 库,与 NVIDIA TensorRT 等其他编译器相比,FT 的特点是它支持以分布式方式推理 Transformer 大模型

图融合是FT 的一个重要特征,将多层神经网络组合成一个单一的神经网络,将使用一个单一的内核进行计算。 这种技术减少了数据传输并增加了数学密度,从而加速了推理阶段的计算。 例如, multi-head attention 块中的所有操作都可以合并到一个内核中。

除此之外,FT还对部分大模型分别支持:

  • INT8 低精度量化推理
  • Ampere 架构的 GPU 硬件部分支持稀疏化
  • Hopper 架构支持 FP8 推理
  • Tensor 并行
  • Pipeline 并行

1.2 DeepSpeed Inference by Microsoft

对于 Transformer layer,可分为以下4个主要部分:

  1. Input Layer-Norm plus Query, Key, and Value GeMMs and their bias adds.
  2. Transform plus Attention.
  3. Intermediate FF, Layer-Norm, Bias-add, Residual, and Gaussian Error Linear Unit (GELU).
  4. Bias-add plus Residual.

如图所示,每一部分可分别进行融合,与未融合相比,以上几个部分的加速比可分别达到 1.5x, 2.9x, 3x, 1.2x 。

除此之外,DeepSpeed Inference 的优化点还有以下几点:

  • 多 GPU 的并行优化
  • INT8 模型量化
  • 推理的 pipeline 方案

更多详细介绍及实践可参考笔者之前的文章:

紫气东来:NLP(十二):DeepSpeed Inference 在 LLM 推理上的优化探究235 赞同 · 18 评论文章

1.3 MLC LLM by TVM

之前介绍的推理方案主要是基于GPU的优化,而 MLC LLM 提供了可应用于移动端(例如 iPhone)、消费级电脑端(例如 Mac)和 Web 浏览器的轻设备解决方案。

MLC LLM 的主要工作流基于 Apache TVM Unity,通过扩展 TVM 后端使模型编译更加透明和高效。其中以编译代码转换、融合、内存规划和库卸载(library offloading)为代表的可组合的 ML 编译优化是其中重要的优化特性。

除此之外,MLC LLM 还具有以下特性:

  • Dynamic shape:避免了对最大输入长度进行额外填充的需要,并减少了计算量和内存使用量。
  • 量化:MLC LLM 利用低位量化来压缩模型权重,并利用 TVM 的 loop-level TensorIR 为不同的压缩编码方案快速定制代码生成。
  • 运行时(Runtime):TVM 编译生成的库能够通过 TVM runtime 在设备的原生环境中运行,TVM runtime 支持 CUDA/Vulkan/Metal 等主流 GPU 驱动以及 C、JavaScript 等语言的绑定。

除了上述3种方案外,其他也支持图融合的方案还包括 NVIDIA TensorRT, Tencent TurboTransformers 等。

二、模型压缩(Model Compression)

模型压缩的基本动机在于当前的模型是冗余的,可以在精度损失很小的情况下实现模型小型化,主要包括3类方法:稀疏(Sparsity)、量化(Quantization)、蒸馏(Distillation)。

2.1 稀疏(Sparsity)

实现稀疏(Sparsity)的一个重要方法是剪枝(Pruning)。剪枝是在保留模型容量的情况下,通过修剪不重要的模型权重或连接来减小模型大小。 它可能需要也可能不需要重新培训。 修剪可以是非结构化的或结构化的。

  • 非结构化剪枝允许删除任何权重或连接,因此它不保留原始网络架构。 非结构化剪枝通常不适用于现代硬件,并且不会带来实际的推理加速。
  • 结构化剪枝旨在维持某些元素为零的密集矩阵乘法形式。 他们可能需要遵循某些模式限制才能使用硬件内核支持的内容。 当前的主流方法关注结构化剪枝,以实现 Transformer 模型的高稀疏性。

关于剪枝稀疏的基本原理,可参考笔者之前的文章:

紫气东来:NLP(八):大语言模型的稀疏化技术64 赞同 · 7 评论文章

除了上文介绍的稀疏方法外,还有其他的稀疏化方法,包括但不限于:

  • SparseGPT:该方法的工作原理是将剪枝问题简化为大规模的稀疏回归实例。它基于新的近似稀疏回归求解器,用于解决分层压缩问题,其效率足以在几个小时内使用单个 GPU 在最大的 GPT 模型(175B 参数)上执行。同时,SparseGPT 准确率足够高,不需要任何微调,剪枝后所损耗的准确率也可以忽略不计。
  • LLM-Pruner:遵循经典的“重要性估计-剪枝-微调”的策略,能够在有限资源下完成大语言模型的压缩,结果表明即使剪枝 20% 的参数,压缩后的模型保留了 93.6% 的性能。
  • Wanda: 该方法由两个简单但必不可少的组件构成——剪枝度量和剪枝粒度。剪枝度量用来评估权重的重要性,然后按照剪枝粒度进行裁剪。该方法在 65B 的模型上只需要 5.6 秒就可以完成剪枝,同时达到SparseGPT相近的效果。

以上主要实现了稀疏的方法,那么对于稀疏后的模型如何加速呢?NVIDIA Ampere 架构对与结构化稀疏做了专门的稀疏加速单元,下图展示了结构化稀疏的物理表示:

2:4 结构化稀疏表示

下图展示了稀疏单元GEMM计算与标准GEMM计算的区别(详细解释参见arxiv.org/pdf/2104.0837

Sparse VS Dense GEMM

2.2 量化(Quantization)

常见量化有两种常见方法:

  • 训练后量化(Post-Training Quantization,PTQ):模型首先经过训练以达到收敛,然后我们将其权重转换为较低的精度,而无需进行更多训练。 与训练相比,实施起来通常相当便宜。
  • 量化感知训练(Quantization-Aware Training,QAT):在预训练或进一步微调期间应用量化。 QAT 能够获得更好的性能,但需要额外的计算资源和对代表性训练数据的访问。

实际上,由于 GPU 内核缺乏对某些类型的矩阵乘法(例如 INT4 x FP16)的支持,理论最优量化策略与硬件内核支持之间的差距,并非以下所有方法都能加速实际推理。

关于量化的基本原理和实现细节,可参考笔者之前的文章:

紫气东来:NLP(十一):大语言模型的模型量化(INT8/INT4)技术544 赞同 · 24 评论文章

许多关于 Transformer 模型量化的研究都有相同的观察结果:简单的低精度(例如 8 bit)训练后量化会导致性能显着下降,这主要是由于动态的 activation 和静态的 weight 量化策略无法保持一致。

为了不损失精度而提高性能,可以考虑 WeightOnly 量化技术,即只把 Weight 量化成 int8 格式,以降低访存压力。到实际 Kernel 内部再 Dequantize 回 fp16,进行矩阵乘计算。这种方法在 BS 较小是比较有效(因为此时的瓶颈在IO),BS 较大时(因为此时的瓶颈在计算)效果变差。

WeightOnly 量化的典型案例是 AWQ: Activation-aware Weight Quantization,即只对 weight 进行量化以实现压缩和加速的效果。

2.3 蒸馏(Distillation)

知识蒸馏是一种构建更小、更便宜的模型(“student 模型”)的直接方法,通过从预先训练的昂贵模型中转移技能来加速推理(“ teacher 模型”)融入 student。 除了与 teacher 匹配的输出空间以构建适当的学习目标之外,对于如何构建 student 架构没有太多限制。

知识蒸馏基本框架

给定数据集,训练 student 模型通过蒸馏损失来模仿 teacher 的输出。 通常神经网络有一个softmax层; 例如,LLM 输出 token 的概率分布。 将 softmax 之前的 logits 层表示为 zt\begin{gathered} M o E(x)=\sum_{i=1}^n\left(G(x)_i E_i(x)\right) \\ G(x)=\operatorname{TopK}\left(\operatorname{softmax}\left(W_g(x)+\epsilon\right)\right) \end{gathered} \\

上述第 1 个公式表示了包含 n 个专家的 MoE 层的计算过程。具体来讲,首先对样本 x 进行门控计算, W 表示权重矩阵;然后,由 Softmax 处理后获得样本 x 被分配到各个 expert 的权重;然后,只取前 k (通常取 1 或者 2)个最大权重;最终,整个 MoE Layer 的计算结果就是选中的 k 个专家网络输出的加权和。

典型的 MoE 的方案包括 GShard, Switch-Transformer, GLaM, FastMoE, DeepSpeed-MoE 等方案。

FastMoE 支持在同一个 worker 上运行多个 experts,从而减少模型研究者在探索更多 experts 数量时所需的硬件资源。当 experts 数量较多时,FastMoE 针对传统的两层 MLP 全连接网络(即 Transformer 中的 FFN 网络)使用了更精细的并行策略,从而使得 Transformer 模型中 MLP 部分的运算速度相比朴素的实现较大的加速。

三、并行化(Parallelism)

当前的推理的并行化技术主要体现在3个维度上,即 3D Parallelism:

  • Data Parallelism(DP)
  • Tensor Parallelism(TP)
  • Pipeline Parallelism(PP)
3D Parallelism 的3个维度

3.1 数据并行 (Data Parallelism, DP)

在推理中,DP 主要是增加设备数来增加系统整体 Throughput,其中最经典的即DeepSpeed的Zero系列

另外 FSDP 也比较高效和易用

3.2 张量并行(Tensor Parallelism, TP)

在推理中,TP 主要是横向增加设备数通过并行计算来减少 latency,其实现原理及细节可参考笔者之前的文章

紫气东来:NLP(六):GPT 的张量并行化(tensor parallelism)方案77 赞同 · 13 评论文章

当前也有一些方便易用的 TP 方案,如 BlackSamorez/tensor_parallel ,使用起来非常简单:

import transformers
import tensor_parallel as tp
tokenizer = transformers.AutoTokenizer.from_pretrained("facebook/opt-13b")
model = transformers.AutoModelForCausalLM.from_pretrained("facebook/opt-13b")  # use opt-125m for testing

model = tp.tensor_parallel(model, [“cuda:0”, “cuda:1”]) # <- each GPU has half the weights

inputs = tokenizer(“A cat sat”, return_tensors=“pt”)[“input_ids”].to(“cuda:0”)
outputs = model.generate(inputs, num_beams=5)
print(tokenizer.decode(outputs[0])) # A cat sat on my lap for a few minutes …

model(input_ids=inputs, labels=inputs).loss.backward() # training works as usual

当前主流的推理框架都支持 TP 的方式,包括但不限于:

  • Megatron-LM
  • FasterTransformer
  • DeepSpeed Inference
  • vLLM
  • Text Generation Inference
  • ParallelFormers
  • ColossalAI
  • FlexFlow
  • LiBai
  • AlpaServe

3.3 流水线并行(Pipeline Parallelism, PP)

在推理中,PP 主要是纵向增加设备数通过并行计算来支持更大模型,同时提高设备利用率。

通常来说,PP 需要与 TP 结合以支持更大模型,并实现最佳效果

四、Transformer 结构优化

该类方法主要通过优化 Transformer 的结构以实现推理性能的提升。

4.1 FlashAttention

该部分的实现细节可参考笔者之前的文章,在此不予赘述

紫气东来:NLP(十七):从 FlashAttention 到 PagedAttention, 如何进一步优化 Attention 性能1020 赞同 · 54 评论文章

FlashAttention-v2 在原基础上做了改进,使其在算法、并行化和工作分区等方面都有了显著改进,对大模型的适用性也更强。在A100 上性能数据如下:

FlashDecoding 是在 FlashAttention 的基础上针对 inference 的优化主要分为三步:

  1. 长文本下将KV分成更小且方便并行的chunk
  2. 对每个chunk的KV,Q和他们进行之前一样的FlashAttention获取这个chunk的结果
  3. 对每个chunk的结果进行reduce
动图封面

4.2 PagedAttention

可参考

紫气东来:NLP(十七):从 FlashAttention 到 PagedAttention, 如何进一步优化 Attention 性能1020 赞同 · 54 评论文章

4.3 FLAT Attention

FLAT-Attention 与 FlashAttention 采取不同的路线来解决同一问题。 提出的解决方案有所不同,但关键思想是相同的(tiling 和 scheudling)。下面主要讨论二者不同之处:

4.3.1 Tiling 策略比较

FlashAttention 使用块平铺和权重固定。 FLAT-Attention 使用行平铺(行粒度)和输出固定。

4.3.2 Scheduling 策略(数据流)比较

FlashAttention 的 Scheduling 过程

FLAT-Attention 的 Scheduling 过程

五、动态批处理(Dynamic Batch, Continuous batch

该类方法主要是针对多 Batch 的场景,通过对 Batch 的时序优化,以达到去除 padding、提高吞吐和设备利用率。传统的 Batch 处理方法是静态的,因为Batch size 的大小在推理完成之前保持不变。

如下图所示,使用静态 Batch 完成四个序列。 在第一次迭代(左)中,每个序列从prompt(黄色)生成一个token(蓝色)。 经过几次迭代(右)后,每个完成的序列都有不同的大小,因为每个序列在不同的迭代中发出其序列结束标记(红色)。 可见序列 3 在两次迭代后就已经结束,但仍然需要等待 Batch 中的最后一个序列完成生成(在本例中,序列 2 在六次迭代后)才能统一输出,这意味着 GPU 未被充分利用。

静态 Batch 的推理情况

下面我们来研究 Dynamic Batch 是如何优化这一过程的。

5.1 ORCA

Orca 不是等到 Batch 中的所有序列完成生成,而是实现 iteration 级调度,其中Batch size由每次迭代确定。 结果是,一旦 Batch 中的序列完成生成,就可以在其位置插入新序列,从而比静态 Batch 产生更高的 GPU 利用率。

下图展示了使用 Dynamic Batch 完成七个序列的过程。 左侧显示单次迭代后的批次,右侧显示多次迭代后的 Batch 。 一旦序列发出序列结束标记,就在其位置插入一个新序列(即序列 S5、S6 和 S7)。 这样可以实现更高的 GPU 利用率,因为 GPU 不会等待所有序列完成才开始新的序列。

结果显示在延时不变的情况下,其相对于FasterTransformer 可获得 36.9 倍的吞吐提升。

5.2 FastServe

ORCA 使用first-come-first-served (FCFS) 处理推理作业, 计划任务持续运行直至完成。 由于 GPU 内存容量有限以及推理对延时敏感,无法通过任意数量的传入函数来增加处理,由此可能会导致队列阻塞。

FastServe 使用 preemptive scheduling,通过新颖的跳跃连接 Multi-Level Feedback Queue 程序来最小化延时。 基于 LLM 推理的长度无法确定,调度程序利用输入长度信息来分配适当的初始值每个到达作业要加入的队列。 较高优先级队列跳过加入的队列以减少降级。 设计高效的GPU内存管理机制主动下载和上传 GPU 内存和主机内存之间的中间状态,以进行 LLM 推理。

实验表明,该方法比ORCA有明显的性能提升

5.3 vLLM

vLLM 的核心是 PagedAttention,其灵感来自传统操作系统概念,例如分页和虚拟内存。 它们通过在固定大小的“页面”或块中分配内存,允许 KV 缓存变得不连续。 然后可以重写 attention 机制以对块对齐的输入进行操作,从而允许在非连续的内存范围上执行 attention 。

这意味着 cache 分配可以 just-in-time,而不是 ahead-of-time:当启动一个新的生成任务时,框架不需要分配大小为 Maximum_context_length 的连续 cache。 每次迭代,调度程序都可以决定特定生成任务是否需要更多空间,并动态分配,而不会降低 PagedAttention 的性能。 这并不能保证内存的完美利用(浪费现在限制在 4% 以下,仅在最后一个块中),但它明显改善了当今业界广泛使用的提前分配方案的浪费 。

总而言之,PagedAttention + vLLM 可节省大量内存,因为大多数序列不会消耗整个上下文窗口。 这些内存节省直接转化为更高的 Batch 大小,这意味着更高的吞吐量和更便宜的服务。

实验表明,该方法相比于静态 Batch 与其他动态 Batch 的方法吞吐性能提升明显。

5.4 Text Generation Inference

TGI 是 HuggingFace 开发的基于 Rust, Python 和 gRPC 的推理服务工具,其基本框架如下:

关于 TGI 的用法,可参考笔者的文章,同时对比了和 vLLM 和 FasterTransformer 的性能。

紫气东来:小记:主流推理框架在Llama 2 的上性能比较158 赞同 · 38 评论文章

5.5 LMDeploy

LMDeploy 是由 MMRazor 和 MMDeploy 团队开发的用于压缩、部署 LLM 服务的工具包。 它具有以下核心特点:

  • TurboMind:基于FasterTransformer 的高效推理引擎。
  • 交互推理:通过缓存多轮对话过程中的 k/v,记住对话历史,以避免对历史会话的重复处理。
  • 多GPU模型部署和量化
  • Dynamic Batch

六、KV cache 优化

关于 KV cache 的典型优化方法及原理,可参考笔者的文章

紫气东来:NLP(二十):漫谈 KV Cache 优化方法,深度理解 StreamingLLM473 赞同 · 16 评论文章

七、解码优化

7.1 推测解码 ( Speculative Decoding )

LLM推理主要是受内存带宽限制的(memory-bandwidth bound)即 LLM 每个解码步所用的推理时间大部分并不是用于模型的前向计算,而是消耗在了将LLM巨量的参数从GPU显存(High-Bandwidth Memory,HBM)迁移到高速缓存(cache)上(以进行运算操作)。这个问题随着LLM规模的增大愈发严重。

推测解码方法的关键是使用了一大一小两个模型(分别记作Mp和Mq),推测解码方法的核心思想是:输入一个prefix,在用LLM(目标模型)做推理的同时,并行的让一个小得多的近似模型(approximation model)基于输入prefix以自回归的方式(autoregressively)来运行 γp_{i}(x)/q_{i}(x)的对比,从中挑选出n个token(都是由近似模型生成),随后让目标模型在n的基础上生成第n+1个token,最后把这n+1个token添加到原prefix之后作为新的prefix,然后重复整个过程直到满足停止条件(达到max length或生成了<EOS>等)。

自回归解码 vs 推测解码

7.2 并行解码 —— Medusa

Medusa 主要思想是在正常的LLM的基础上,增加几个解码头,并且每个头预测的偏移量是不同的,比如原始的头预测第i个token,而新增的medusa heads分别为预测第i+1,i+2…个token。如上图,并且每个头可以指定topk个结果,这样可以将所有的topk组装成一个一个的候选结果,最后选择最优的结果。

计算每个头组装之后的候选的最优解,其实这时候完全可以每个候选都走一次模型,算出概率,但是很显然不可能这样做,因为本来方案是为了加速,作者设计了一种tree attention的机制,可以做到只走一次模型来达到目的,如示例所示,第一个medusa heads的 top-2 预测和第二个medusa heads的 top-3 预测产生 2*3=6 个候选。假设原始的LLM输出是[0],第一个头是[1,2],第二个头是[3,4,5]。期望直接能把[0,1,2,3,4,5],输入模型就能得到一些概率的信息,但是不同的头对应的token的父节点是不同的,所以需要冗余一些token,方便添加mask变成[0,1,2,3,4,5,3,4,5],对应到右上的mask矩阵,每个节点只有父节点以及当前节点是1,这样其实就能得到一个树的路径关系。

第一次用美杜莎头解码的时候,是看不到前面i个token的,而再次输入模型可以看到完整的上文,得到完整的概率之后,可以通过头计算得到树的路径信息,比如示例对应的路径index是[0,1,3] , [0,1,4], [0,1,5], [0,2,6],然后基于后验概率得到最优的候选片段。

八、硬件升级

以上主要介绍了在算法和模型层面的优化方法,除此之外,升级硬件系统可以进一步提升整体性能,下面将介绍几种可用于(和潜在的)推理加速的硬件产品。

8.1 NVIDIA H100 PCIe

NVIDIA H100 核心架构与 Ampere 相似,数学运算部分布置在144组CUDA上,最高可拥有18432个FP32(单精度)、9216个FP64(双精度)CUDA核心,辅以576个第四代Tensor核心。H100核心采用台积电的N4工艺制造,内建800亿个晶体管,核心面积仅有814m㎡。其与A100 主要参数对比如下:

在性能方面,H100 较 A100 也有明显提升,其部分数据如下所示。

8.2 AMD MI300

AMD MI300 处理器集成了24个Zen 4架构CPU核心,以及CDNA 3架构GPU核心,周围还有着8颗HBM3高速缓存,容量高达128GB,总计拥有1460亿个晶体管。与上一代 MI250相比,MI300进行AI运算的速度将提高至8倍,能效方面也将提升5倍。

目前未找到公开的在 LLM 方面的推理性能数据。

8.3 Apple M2 Ultra

M2 Ultra 采用第二代 5 纳米工艺制造,并使用 Apple 突破性的 UltraFusion 技术连接两个 M2 Max 芯片的芯片,使性能提高一倍。 M2 Ultra 由 1340 亿个晶体管组成,比 M1 Ultra 多了 200 亿个。 其统一内存架构支持突破性的192GB内存容量,比M1 Ultra多出50%,并具有800GB/s的内存带宽,是M2 Max的两倍。 M2 Ultra 配备更强大的 CPU(比 M1 Ultra 快 20%)、更大的 GPU(快 30%)以及神经引擎(快 40%)。

目前未找到公开的在 LLM 方面的推理性能数据。

参考资料

[1] Large Transformer Model Inference Optimization

[2] Efficient Inference on a Single GPU

[3] How continuous batching enables 23x throughput in LLM inference while reducing p50 latency | Anyscale

[4] coreweave.com/blog/serv

[5] https://medium.com/mobius-labs/accelerating-large-language-models-strategies-for-enhancing-your-ai-inference-speed

[6] LLM-Pruner: On the Structural Pruning of Large Language Models

[7] jonathan-hui.medium.com

[8] arxiv.org/pdf/2302.14017.pdf

[9] 7 ways to speed up inference of your hosted LLMs. «In the future, every 1% speedup on LLM… | by Sergei Savvov | Jun, 2023 | Medium | Medium

[10] arxiv.org/pdf/2104.0837

[11] Introduction to Weight Quantization | Towards Data Science

[12] Accelerating Large Language Models via Low-Bit Quantization | NVIDIA On-Demand

[13] 认真读读WeightOnly - 知乎 (zhihu.com)

[14] hackmd.io/@felixkao/HkZ

[15] SpecInfer: Accelerating Generative Large Language Model Serving with Speculative Inference and Token Tree Verification

[16] Fast Inference from Transformers via Speculative Decoding

[17] Accelerating large language model decoding with speculative sampling

钟鼎山林都是梦,人间宠辱休惊。 —— 辛弃疾 《临江仙》

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

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

相关文章

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

SHELL脚本之循环语句的for循环以及中断循环的语句

循环应用 一.循环介绍 重复 for&#xff0c;while&#xff0c;until&#xff0c; 循环&#xff1a; 1.循环的开始条件 2.循环的操作 3.循环的结束条件 二.for循环的使用 注意&#xff1a;for循环读取文件区分行时&#xff0c;会按照换行符&#xff0c;空白字符区分行。…

计算力学|采用python进行有限元模拟

从abaqus输出的inp文件中读取节点和单元信息 import meshio mesh meshio.read(Job-3.inp) coords mesh.points###coords即为各个节点的坐标 Edof mesh.cells_dict[triangle]#Edof为三角形单元的节点号 1.单元刚度矩阵 def element_stiffness(n1,coords,E,v,t): node1 c…

UNIX网络编程-传输层

概述 传输层主要包括&#xff1a;TCP、UDP、SCTP&#xff08;流控制传输协议&#xff09;&#xff01; 绝大多数客户端/服务器网络应用都使用TCP/UDP。SCTP是一个较新的协议&#xff0c;最初设计用于跨因特网传输电话信令。 这些传输协议都转而使用网络协议IP&#xff1a;或是…

pip3安装报error: externally-managed-environment,删除EXTERNALLY-MANAGED即可

pip3 install pandas 安装报错完美解决 解决方法&#xff1a; 1、本地终端查询EXTERNALLY-MANAGED find / -name EXTERNALLY-MANAGED 2、删除EXTERNALLY-MANAGED 记得路径改成自己本地的 sudo mv /usr/local/Cellar/python3.13/3.13.0_1/Frameworks/Python.framework/Versi…

机器视觉系统硬件组成之工业相机篇

工业相机是一种非常重要的机器视觉器件&#xff0c;它能够将被采集的图像信息通过电路转换成电信号&#xff0c;再通过模数转换器&#xff08;ADC&#xff09;将其转化为数字信号&#xff0c;最后以标准的视频信号输出。工业相机在机器视觉领域得到了广泛应用&#xff0c;包括质…

百易云资产管理运营系统 ufile.api.php SQL注入漏洞复现

0x01 产品描述&#xff1a; 百易云资产管理运营系统&#xff0c;是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理&#xff0c;包括资产的登记、盘点、评估、处置等多个环节&#xff0c;同时提供强大的运营分析功能&#…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(上篇):制作更多地图,更多敌人,更多可交互对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作敌人僵尸跳跳虫更多敌人2.制作敌人阿斯匹德更多可交互对象3.制作敌人孵化虫和它的孩子二、第二个代表性场景 1.制作更多敌人2.制作…

0x2E service

0x2E service 1. 概念2. Request message 数据格式3. Respone message 数据格式3.1 正响应格式3.2 negative respone codes(NRC)4. 示例4.1 正响应示例:4.2 NRC 示例1. 概念 UDS(Unified Diagnostic Services)中的0x2E服务,也称为WriteDataByIdentifier(通过标识符写入数据…

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…

专家系统简介

本文对基于规则的专家系统进行简介&#xff0c;举例专家系统的结构类似 MYCIN 系统&#xff0c;同时串联介绍专家系统的各种思想。需要注意的是&#xff0c;本文所述仅是专家系统的一种实现途径&#xff0c;其依赖规则进行知识表示和推理&#xff0c;另外还有基于语义网络、框架…

穿越沙漠问题

题目&#xff1a;一辆吉普车穿越1000km的沙漠。吉普车的总装油量为500L&#xff0c;耗油率为1L/km。由于沙漠中没有油库&#xff0c;必须先用这辆车在沙漠中建立临时油库。若吉普车用最少的耗油量穿越沙漠&#xff0c;应在哪些地方建立油库&#xff0c;以及各处存储的油量是多少…

链动2+1芸众商城421+全插件独立版源码

芸众商城最新全插件421个&#xff0c;去授权 源码全开源链动21商城小程序 这套版本插件全部都是新版本&#xff0c;并非外面那种老版本 老插件全部都不能用的&#xff0c;一堆bug问题&#xff0c;我们插件源码是直接打官方授权源码所以都是最新的&#xff0c;还有很多小程序前…

Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey阅读笔记

Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey 综述阅读笔记 仅记录个人比较感兴趣的部分 基本知识 PEFT的三种分类&#xff1a;additive, selective, reparameterized, and hybrid fine-tuning selective fine-tuning 不需要任何额外的参数&am…

计算机毕业设计Hadoop+Hive+Spark+Flink广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 专业 小四号宋体 班级 小…

《环境感知方案:探索未来智能世界的关键技术》

《环境感知方案&#xff1a;探索未来智能世界的关键技术》 一、环境感知方案的研究现状&#xff08;一&#xff09;机器人领域的环境感知&#xff08;二&#xff09;农业领域的环境感知&#xff08;三&#xff09;智能网联汽车领域的环境感知 二、先进的环境感知技术&#xff0…

A Multi-Head Reconstruction Network For Image Anomaly Detection创新点总结

创新点解析&#xff1a;Multi-Head Reconstruction Network (MRN) 与 Multi-Feature Aggregation (MFA) 1. Multi-Head Reconstruction Network (MRN) 传统重建方法的过程&#xff1a; 训练自动编码器或生成模型来重建正常样本的图像。通过比较原始图像和重建图像来检测异常…

数据结构与算法 - 树 #数的概念 #二叉树 #堆 - 堆的实现/堆排序/TOP-K问题

文章目录 前言 一、树 (一)、概念 1、树的定义 (二)、树的定义 1、树为什么是递归定义的&#xff1f; 2、如何定义树(如何表达一棵树) 解决方案一&#xff1a;假设我们得知该树的度 解决方案二&#xff1a;顺序表 解决方案三&#xff1a;左孩子右兄弟表示法 二、二叉…

Linux Ubuntu dbus CAPI ---- #include<dbus.h>出现“无法打开源文件dbus/xxx.h“的问题

一、确保已安装dbus库和CAPI sudo apt-get install libdbus-1-dev 二、在c_cpp_properties.json的includePath中是否配置了dbus库依赖文件所在的路径 三、编译一个简单的dbus代码&#xff0c;在编译过程中只要出现.h文件找不到的情况&#xff0c;就使用下列命令找到.h文件路径…

Java集合常见知识总结(中)

Set Comparable 和 Comparator 的区别 Comparable 接口和 Comparator 接口都是 Java 中用于排序的接口&#xff0c;它们在实现类对象之间比较大小、排序等方面发挥了重要作用&#xff1a; Comparable 接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序…