3186 个字词
16 分钟
大模型技术知识点 1
首次发布: 2025-08-28
... 次访问

大模型的一些应知知识点。

1. 什么是 KV-Cache?

KV-Cache 即是 Key-Value Cache, 是在大模型推理阶段所使用的,减少重复计算量的技术。具体而言,在自回归模型逐步生成每个 token 的过程中,缓存每个 Transformer Decoder 层的在每个时间步 tt 的 Key 和 Value 矩阵 (形状为(B, H, L, C)), 从而避免在生成新 token 时重复计算之前时间步的 Key 和 Value

在给出具体的量化分析前,先给出一些结论

  • 形状为 m×pm\times p 的矩阵与 p×np\times n 的矩阵相乘,乘法计算次数为 mpnm \cdot p \cdot n
  • 形状为 (B, H, L, C) 的张量与 (B, H, C, T) 的张量相乘,乘法计算次数为 BHCLTB \cdot H \cdot C \cdot L \cdot T (B, H 相当于就是一个 chunk 大小的数乘因子)
  • 计算 K,Q,VK, Q, V 三个投影矩阵的复杂度为 3BLD23 \cdot B \cdot L \cdot D^2,其中 D=HCD = H \cdot C 是嵌入维度

假设

  • NN:Decoder 层数,BB:batch
  • HH:注意力头数,CC:每头维度, D=HCD = H \cdot C:嵌入维度
  • LL:当前时间步(同时上文信息的长度为 L1L-1),TT:目标总长度

于是使用 KV-Cache 相较于不适用 KV-Cache 而言,少了很大一部分的 1,2,,L11, 2, \ldots, L-1 tokens 的 key 和 value 的投影计算,省下的计算量为

t=1LN2BD2(t1)Projection Matrix Multiply=BND2(L1)L=O(BND2L2)\sum_{t=1}^{L} N \cdot \underbrace{2 \cdot B \cdot D^2 \cdot (t-1)}_{\text{Projection Matrix Multiply}} = B \cdot N \cdot D^2 \cdot (L-1) \cdot L = O(B \cdot N \cdot D^2 \cdot L^2)

这个量级的计算量是非常可观的,尤其是当 LL 很大时。

2. 为什么当前的大模型的结构都是 Decoder-only? Encoder 还需要吗?

  • Decoder-only 在处理生成任务上表现出色。当前大模型的核心任务在于生成,该任务可以用自回归范式实现,且 Decoder 的 Masked Attention 机制能完美契合自回归范式,因此大部分大模型都采用 Decoder-only 结构。
  • 相较于 Encoder-Decoder 结构,Decoder-only 结构更为简洁高效和易于添加 Plug-ins。Encoder-Decoder 结构需要同时训练和维护两个独立的网络,且Encoder不易于更换,而 Decoder-only 结构只需一个网络,且能更换 Encoder,减少了模型的复杂度和计算资源的消耗,并提高了灵活性。
  • 此外,当前的通用范式是让 Decoder 专注于在 Embedding 空间中做自回归生成,而让不同模态、不同功能的 Encoder 专注于将输入信息映射到 Embedding 空间中,这样的分工使得模型更易于扩展和适应不同任务。
  • 例如当前的 embedding 模型都是 Encoder-only 结构,如 CLIP、DINOv2、SAM 等等。

3. 为什么大模型的参数量都是 7B、13B、70B、175B 这种数?如何通过模型参数容量计算出显存开销?

(a) 大模型的参数容量通常选择 7B、13B、70B、175B 这种数,是因为这些数字背后对应的 embedding 维度和层数基本上是 1024、2048、4096、8192 这种 2 的幂次方的倍数,这些数字在计算机系统中更易于处理和优化。

(b) 模型参数量大小与将模型放入显存中的开销之间的关系可以通过以下公式计算

模型放入显存开销 (GiB)=参数量 (B)×109×每个参数的字节数 (Bytes)10243参数量 (B)×每个参数的字节数 (Bytes)\text{模型放入显存开销 (GiB)} = \frac{\text{参数量 (B)} \times 10^9 \times \text{每个参数的字节数 (Bytes)}}{1024^3} \approx \text{参数量 (B)} \times \text{每个参数的字节数 (Bytes)}

需要注意的是单位, B\text{B} 表示 十亿 (1Billion=1091 \text{Billion} = 10^9), Bytes\text{Bytes} 表示字节 (Byte), 102431024^3 表示每 GiB 的字节数

例如,7B7\text{B} 的模型,fp16 精度下 (每个参数 2 Bytes),放入显存的开销为 7B×2Bytes14GiB7 \text{B} \times 2 \text{Bytes} \approx 14 \text{GiB}

(c) 实际的显存开销远不止这些。当前向推理时,除了存储模型参数外,还需要存储中间激活值 (activations)、梯度 (gradients) 以及优化器状态 (optimizer states) 等等,这些都会占用额外的显存空间。当反向传播时,显存的开销需要至少乘个 2 (因为梯度的存储大小近似等于参数大小),所以实际显存开销会更大。

4. 大模型部署框架对比

框架名称核心定位主要优势典型适用场景硬件倾向性
vLLM高吞吐量推理先锋PagedAttention技术, 高吞吐量, 广泛兼容HuggingFace模型高并发在线API服务、长文本生成NVIDIA GPU (Linux环境最佳)
TensorRT-LLMNVIDIA硬件极致优化TensorRT深度优化、算子融合、量化引擎, 极致低延迟NVIDIA GPU环境,企业级部署,对延迟敏感的应用NVIDIA GPU专属
SGLang复杂工作流与结构化生成专家RadixAttention, 推测解码, 结构化输出原生支持多轮对话、Agent智能体、复杂生成逻辑支持多硬件平台 (NVIDIA/AMD/国产芯片)
LMDeploy全能型高性能推理伙伴Turbomind引擎, W4A16量化, 动态批处理,低延迟推理(50ms级别)实时应用(如对话系统)、边缘设备部署NVIDIA GPU优化
DeepSpeed-MII资源受限环境的救星ZeRO-Inference, 动态张量切片, 量化推理 (如FP6量化), CPU卸载, NVMe扩展有限资源下的模型部署,支持超长上下文 (128K)支持多种硬件
Ollama个人开发者的模型管家极简本地部署、开箱即用, 内置模型市场,支持GGUF量化格式个人开发者本地测试、快速原型验证跨平台 (Win/macOS/Linux) , CPU/GPU
llama.cpp边缘设备与老旧硬件的福音CPU推理优化, AVX2/NEON指令集加速, 支持CUDA/OpenCL, 内存占用低资源受限环境,边缘设备,纯CPU环境CPU优先 (支持GPU加速)
TGI (Text Generation Inference)企业级稳定服务的守护者服务稳定性(内置健康检查、自动故障转移),多GPU扩展(Tensor并行和流水线并行),安全合规企业级API服务,AWS SageMaker推理服务,银行智能客服系统多硬件平台支持
OpenLLM多适配器与异构硬件的灵活派异构硬件支持(TPU/GPU/CPU混合部署),自定义适配器(LoRA插件热加载)云服务提供商(混合云部署),需要连接多个适配器到同一模型的场景异构硬件支持

5. 为什么现在的大模型都采用 left padding?

这与推理效率有关。

  • Right padding(右填充): 真实文本在左边,填充在右边。如果一批样本长度差异大,就得等最长的那个跑完,短的输入在后面浪费算力。
  • Left padding(左填充): 真实文本在右边,填充在左边。这样在自回归解码时,大家的最后一个 token(最新预测位置)都能对齐,方便 batch 推理 + KV cache 的并行利用。

尤其是在 vLLM、PagedAttention 这类高效推理框架里,Left Padding 可以显著减少显存和计算的浪费。 所以几乎所有新出的 LLM(Qwen、LLaMA-3、Mistral…)都强制用 Left Padding。

e.g. 假设有三条句子,长度不一样:

  • “I like cats” → 3 个 token
  • “You love” → 2 个 token
  • “They” → 1 个 token

那么 right padding 会是:

I like cats <pad>  (3 tokens + 1 pad)
You love <pad> <pad> (2 tokens + 2 pads)
They <pad> <pad> <pad> (1 token + 3 pads)

而 left padding 会是:

<pad> I like cats (1 pad + 3 tokens)
<pad> <pad> You love (2 pads + 2 tokens)
<pad> <pad> <pad> They (3 pads + 1 token)

在推理时,由于最后一个 token(预测点)不对齐,第一句的预测点在 cats 后,第二句在 love 后,第三句在 They 后。这样 batch 推理的时候,就会发生不同步。

这样的预测点不同步会导致,在自回归推理阶段,每个样本的需要预测的 token 的位置都不一致,无法高效并行计算,造成资源浪费。设想一下,如果同一批中每个句子的上文长度不一致,还能并行推理吗?

6. Llama 的技术关键点,以及 Llama 1/2/3 的异同?

LLaMA 技术的关键点

LLaMA 系列的设计思路是, 用高效的训练方法 + 更干净的数据集,让相对较小的参数量也能获得较强性能

  • 纯 Decoder-only 架构:和 GPT 类似,适合自回归生成。
  • 分组查询注意力(Grouped-Query Attention, GQA):降低注意力计算成本,同时保持上下文理解能力。
  • 旋转位置编码(RoPE):比传统的绝对/相对位置编码更灵活,支持更长上下文。
  • 高效训练策略:比如用更多干净的英文/多语种数据,分阶段预训练。
  • 开放权重:Meta 的策略是开放参数(不像 GPT 封闭),带动了研究和应用生态。

LLaMA 1 / 2 / 3 的异同

  • 📌 LLaMA 1(2023年2月)

    • 规模:7B, 13B, 33B, 65B。
    • 特点:开源权重,引爆了开源社区;模型小但性能不俗。
    • 限制:数据主要是英文,缺乏对齐/安全性训练;推理生态还不成熟。
  • 📌 LLaMA 2(2023年7月)

    • 规模:7B, 13B, 70B。
    • 改进点
      • 数据更大更干净(≈2T token),多语言比例增加。
      • 训练上下文更长(4K token)。
      • 引入 安全性与指令对齐(RLHF、SFT)。
      • 推理时更友好,性能比 LLaMA 1 提升明显。
    • 影响:成为开源界事实标准(很多公司直接基于它二次开发)。
  • 📌 LLaMA 3(2024年4月)

    • 规模:8B, 70B。
    • 改进点(Meta 公布的 roadmap):
      • 训练数据规模更大(数十万亿 token),多模态扩展。
      • 上下文长度更长(有望到 8K / 32K)。
      • 更强的指令对齐,安全性更好。
      • 重点发力在 开放生态 + 商用许可,和 OpenAI/Anthropic 抗衡。

7. Transformer 中 FFN 层的作用是什么?

  1. 注意力(Multi-Head Self-Attention):负责”看别人”,让 token 之间能互相交流信息。
  2. 前馈网络(Feed-Forward Network, FFN):负责”自己加工”,对每个位置单独做非线性变换。

FFN 其实就是一个 位置独立的两层 MLP,形式一般是

FFN(x)=W2σ(W1x+b1)+b2FFN(x) = W_2 \, \sigma(W_1 x + b_1) + b_2
  • W1W_1 把维度从 dd 扩展到更高维(比如 4d4d),增加表达能力。
  • 激活函数(如 ReLU、GELU)引入 非线性
  • W2W_2 再把它投回原来的维度 dd

简单来说

  • Attn:负责“信息交换”,像开会时大家互相讨论。

  • FFN:负责“个人思考”,每个 token 在吸收别人意见后,还要自己再加工一下。

  • 如果只有注意力,模型会“看别人”,但缺乏强的非线性映射能力。

  • 加上 FFN,模型才具备更丰富的 特征变换能力

  • Attention 抓关系,FFN 做加工。

8. Transformer中为什么FFN要做一个bottleneck的结构?

  1. 增加非线性表达能力

如果直接用一个 RdmodelRdmodel\mathbb{R}^{d_{model}} \to \mathbb{R}^{d_{model}} 的线性层,即 Wx+bW x + b,它本质上就是个线性变换 + 偏置,不会引入新的表达力(和 attention 层没什么区别)。通过 升维 → 激活函数 → 降维,模型就能学习到复杂的、稀疏的非线性特征。

这跟 MLP 的隐层作用是一样的,只不过这里强制输入输出要保持和 embedding 对齐,所以中间必须走一个“绕路”。

  1. 低成本地提升容量

假设输入输出维度 dmodel=1024d_{model}=1024

  • 如果直接堆叠几个 102410241024 \to 1024 的线性层,参数量和计算量都大,但每层表达力有限。
  • 用 bottleneck:先升到 dff=4096d_{ff}=4096,再压回来。这样参数量差不多,但模型能在更高维空间里做非线性组合,然后再压缩到低维。
  1. 和注意力机制互补
  • 自注意力:负责 跨 token 的交互(“谁和谁相关”)。
  • FFN:负责 单 token 内部的特征变换(“这个 token 自身怎么变化”)。

瓶颈结构让每个 token 在局部维度空间内先”扩展信息”,再”压缩”,从而增强单 token 的表示能力。

9. 为什么 BERT 的三个输入 Embedding 是直接相加的?为什么不是拼接?

Token Embedding、Position Embedding 和 Segment Embedding(表示这个词属于哪一段(A 或 B),用于区分句对任务) 这三种 Embedding 直接相加,而不是拼接,主要有以下几个原因

  1. 同维度:三个 embedding 的维度是一致的,且不会增加维度大小。而拼接会导致维度增加,需要额外处理。

  2. 简化计算:相加操作比拼接更简单,计算量更小,有利于提高模型的训练和推理效率。

  3. 线性可分性:BERT 的 Transformer encoder 是堆叠的 线性 + 注意力 + LayerNorm + FFN。加法 embedding 实质上在 embedding 层做了一个 线性叠加。后续的注意力和 FFN 会自动学习如何权衡三种信息(位置、类型、语义)。类似于给网络提供了 三个通道的输入,网络可以自己决定如何使用。

大模型技术知识点 1
https://adalovelemon.github.io/blog/posts/content/technotes/llm-misc/llm-misc1/
Author
Ada Lovelemon
Published at
2025-08-28

留言板