LLM的推理/transformer架构/vllm
LLM 推理的推理过程
目前主流LLM都是基于transformer的Decoder-only架构,因为 Decoder-only 架构在“大规模无监督预训练”这个特定范式下,展现出了更好的可扩展性(Scalability)和任务通用性。
LLM中输入到输出总体过程如下:
输入Token -> 嵌入 -> 加上位置编码 -> 通过N个Transformer层 -> 最终层归一化 -> 语言模型头 -> 概率分布 -> 输出Token
更加细节化看下面:
Details
- 输入嵌入层 (Input Embedding)
核心作用:将离散的 Token ID 转换为连续的稠密语义向量。 - 位置编码注入 (Positional Embedding Injection)
核心作用:通过旋转 Q/K 向量的特定维度,将绝对位置信息编码进相对注意力关系中。 - N 个 Transformer 层循环 (The Core Loop)
A. 前置归一化 (Pre-Normalization):在不依赖批次统计量的情况下稳定激活值分布,加速收敛。
B. 自注意力机制 (Self-Attention):
线性投影:将输入投影到查询、键、值空间,并通过 GQA 策略压缩键值对以节省显存。
RoPE 应用:赋予 Q 和 K感知相对位置的能力,实现长度外推。
注意力分数计算:计算当前 Token 对所有历史 Token 的关注权重分布。
加权求和:根据注意力权重从历史上下文聚合信息。
输出投影:将聚合后的多通道信息融合并还原到模型隐藏层维度。
C. 残差连接 1 (Add & Norm):将原始输入与注意力输出相加,保留原始信息流并缓解梯度消失。
D. 前馈网络 (MLP / FFN):
(Dense 模式):通过非线性变换提取高阶特征。
(MoE 模式):动态路由至少量专家网络以实现条件计算和容量扩展。
E. 残差连接 2 (Add & Norm):将 MLP 的输出加回主干,完成本层的完整更新。 - 最终层归一化 (Final Layer Norm)
核心作用:在送入预测头之前,对最终隐藏状态进行标准化处理。 - 语言模型头 (LM Head)
核心作用:将隐藏层语义向量解码为词表中每个 Token 的非归一化得分 (Logits)。
概率分布与采样 (Softmax & Sampling)
核心作用:将得分转化为概率分布,并根据策略随机或贪婪地选择下一个输出 Token。
transformer对应架构
| 组件 | Encoder (编码器) | Decoder (解码器) |
|---|---|---|
| 层数 | 6 层 | 6 层 |
| 注意力机制 | Multi-Head Self-Attention | Masked Multi-Head Attention |
| 交叉注意力 | ❌ 无 | ✅ Cross-Attention (让 Decoder 能够"关注"Encoder 的输出) |
| 归一化 | Add & Norm (每子层后) | Add & Norm (每子层后) |
| 前馈网络 | Feed-Forward | Feed-Forward |
| 输出 | 上下文表示 (Context Vector) | 概率分布 (Vocab Size) |
🔹 Attention → QK^T 相似度,softmax 加权 V
🔹 Multi-Head → 多头并行,捕捉多模式
🔹 Position → 正弦编码,注入位置信息
🔹 FFN → 两层全连接,4 倍扩展维度
🔹 Norm+Res → 层归一化 + 残差,训练更深网络
🔹 复杂度 → O(n²) 是瓶颈,长序列需优化
对应公式:Attention(Q, K, V) = softmax(QK^T / √d_k) · V
| 部分 | 含义 | 维度 |
|---|---|---|
| QK^T | 查询 - 键相似度矩阵 而K^T主要是为了矩阵乘法的维度匹配和计算相似度。 | n×n |
| √d_k | 缩放因子,防止梯度消失 | 标量 |
| softmax | 归一化为概率分布 | n×n |
| ·V | 加权求和得到输出 | n×d_v |
kvcache
原理:自回归生成时,把之前所有 token 已经算过的 K/V 矩阵缓存到 HBM,下次只算新 token 的 Q/K/V,然后拼接历史 K/V 做注意力,避免 O(n²) 重复计算。
数学公式:
简化版:
KV_Cache_Size = 2 × num_layers × hidden_size × seq_len × batch_size × bytes_per_param
线程 / 多线程 / 协程:
| 维度 | 进程 | 线程 | 协程 |
|---|---|---|---|
| 操作系统可见 | ✅ | ✅ | ❌ |
| 调度方 | OS | OS | 用户空间(事件循环) |
| 切换代价 | 最高(页表、内核) | 高(内核态) | 最低(用户态,只保存栈) |
| 并行能力 | ✅ 多核 | ✅ 多核 | ❌ 单线程内并发 |
| 典型场景 | 多核计算、故障隔离 | I/O 密集、CPU 密集 | 高并发 I/O(异步) |
| 一句话记忆 | 独立公司 | 项目组 | 个人 |
| Python 模块 | multiprocessing |
concurrent.futures.ThreadPoolExecutor |
asyncio |
注意力机制
| 机制 | 核心思想 | KV Cache 大小 | 显存/带宽 | 质量 | 典型应用 | 🔑 关键细节 |
|---|---|---|---|---|---|---|
| MHA | 每头独立 Q/K/V 投影 | H·n·d |
🔴 最高 | 🟢 基准 | 早期 Transformer | 精度最高,但长序列显存爆炸 |
| MQA | 所有 Query 共享 1 组 K/V | 1·n·d |
🟢 最低 | 🔴 下降明显 | 早期推理优化 | 速度最快,但精度损失大,少用 |
| GQA | Query 分 G 组,组内共享 K/V | G·n·d |
🟡 中等 | 🟡 ≈MHA | Llama2/3, GPT-4, Mistral | 新默认:G=8 时显存↓8×,精度损失<1% |
| MLA | 低秩投影:K/V→latent c→还原 | R·n·d (R≪H) |
🟢 比 MQA 更低 | 🟢 ≥MHA | DeepSeek-V2/V3 | 在线投影:写入时 W_down 压缩,读取时 W_up 还原 + 解耦 Query 保表达 |
MLA 低秩投影
写入时: h → [W_down] → c (latent, dim=R) → 只缓存 c
读取时: c → [W_up] → K, V (dim=d) + 解耦 Query → Attention
优势: 缓存大小从 H·d 降至 R (R≈H·d/8),显存↓8×,且通过解耦设计精度反超 MHA
传统注意力 vs 线性递归 (GDN/KDA) + MoE 核心
| 维度 | 传统注意力 (MHA/GQA/MLA) | 线性递归 (GDN / KDA) | 稀疏 MoE |
|---|---|---|---|
| 核心范式 | softmax(QKᵀ/√d)·V + 显式 KV 缓存 |
线性递归:Sₜ = α·Sₜ₋₁ + kₜ·vₜᵀ + 隐式状态 |
Top-K Router + 专家 FFN 并行 |
| 记忆存储 | 显式存每 token 的 K/V 向量 | 隐式存递归状态矩阵 S (d×d) |
不存历史,每步只激活部分参数 |
| 内存-长度 | O(n):n 多长 cache 多大 | O(1):n 再长也只占 d×d 常数 | O(1):激活参数固定,与 n 无关 |
| 长文本外推 | 需 RoPE/NTK/ALiBi 等位置修正 | 递归天然带衰减 α<1,外推更稳 | 与长度无关,靠专家容量扩展 |
| 门控机制 | 无(除 MLA 投影) | GDN: 头级标量门 / KDA: 通道级向量门 | Router: Top-K 专家选择 + 负载均衡 |
| 混合策略 | - | 3:1 混合:75% 线性层 (O(1)) + 25% 全局 Attention (保精度) | Shared Expert (常驻) + Routed Experts (按需) |
| 适用场景 | 通用训练/推理,生态成熟 | 百万 token 实时推理,显存墙场景 | 大容量模型:参数↑10×,计算量≈Dense |
| 代表模型 | Llama, Qwen, GPT-4 | DeltaNet, Mamba-2, GDN | Mixtral 8x7B, DeepSeek-V2, Qwen3.5-MoE |
PageAttention原理:
“PagedAttention 把操作系统『分页内存』搬进 GPU:
- 逻辑页:KV-Cache 按 16-token 固定大小切成连续『页』;
- 物理帧:显存里不连续的空闲块,用 block-table 映射;
- 共享+写时复制:多序列可共用同一物理页,引用计数为 0 立即回收,显存碎片 <4%,吞吐提升 2× 以上。”
FlashAttention 是通过IO 优化加速 Attention:
- 分块计算,减少 HBM 访问
- 重计算换显存,支持更长序列
- 训练加速 2-4 倍,精确计算无近似
| 版本 | 年份 | 硬件架构 | 核心改进 (Core Improvements) | 性能收益 | 面试关键区别 |
|---|---|---|---|---|---|
| FA-v1 | 2022 | V100/A100 | 首次提出 Tiling + 在线 Softmax串行处理序列块,减少 HBM 访问 | 训练加速 2-4×显存省 50% | 奠基者:解决 O(N²) 显存问题,序列维度串行。 |
| FA-v2 | 2023 | Ampere/H100 | 序列并行化 + Warp 级划分Q 只读 1 遍,减少非矩阵运算,支持 GQA | 吞吐再 ↑1.7-2×FLOPs 利用率 73% | 并行化:序列维度并行,Q 矩阵 HBM 访问次数最小化。 |
| FA-v3 | 2024 | Hopper (H100) | TMA 异步拷贝 + WGMMA + FP8流水线重叠,块稀疏,Warp 专用化 | 比 v2 再 ↑3×支持 1M+ 上下文 | 硬件特性:利用 Hopper 新指令 (TMA/WGMMA),异步传输。 |
| FA-v4 | 2025 | Blackwell | MUFU.EX2 + CuTe DSL + 双缓冲跳过 90% rescale,原生 FP8/FP4 | 训练 ↑11× (GPT-4 规模)能耗 ↓30% | 极致融合:Blackwell 原生优化,指数指令加速,CuTe 编程模型。 |
LLM 推理的核心指标
Details
- Time To First Token (TTFT): 首 Token 延迟,即从输入到输出第一个 token 的延迟。在在线的流式应用中,TTFT 是最重要的指标,因为它决定了用户体验。 - Time Per Output Token (TPOT): 每个输出 token 的延迟(不含首个Token)。在离线的批处理应用中,TPOT 是最重要的指标,因为它决定了整个推理过程的时间。 - Latency:延迟,即从输入到输出最后一个 token 的延迟。 Latency = (TTFT) + (TPOT) * (the number of tokens to be generated). Latency 可以转换为 Tokens Per Second (TPS):TPS = (the number of tokens to be generated) / Latency。 - Throughput:吞吐量,即每秒针对所有请求生成的 token 数。以上三个指标都针对单个请求,而吞吐量是针对所有并发请求的。
我们将 LLM 应用分为两种:
- 在线流式应用:对 TTFT、TPOT、Latency 敏感,需要尽可能快的生成 token。
- 离线批量应用:对 Throughput 敏感,需要在单位时间内尽可能多的生成 token。
而实际在某种应用(如在线流式应用),我们也应该在Latency 和 Throughput 之间进行权衡,提高 Throughtput 可以提高硬件承担的并发数,从而降低推理成本。
LLM基座的推理能力
核心评估维度:
逻辑推理 比如mmlu(涵盖57个主题的多项选择题)
数学推理 GSM8K, MATH, AQuA-RAT
常识推理 HellaSwag, PIQA, ARC
多步推理 BigBench-Hard, DROP
代码推理 HumanEval, MBPP,livecodebench,livecodebench2025
LLM 推理的性能卡点
小模型常用的优化手段
Details
训练前:剪枝 → 裁词表 → 层数减半
↓
训练:蒸馏 + ZeRO + 检查点
↓
推理:量化 → GQA → FlashAttn → Continuous Batch
蒸馏
蒸馏具体步骤
Details
第一步:准备阶段——搭建师生框架 这个阶段的目标是准备好老师和学生,并确定教学大纲。
训练/选定教师模型:
我们需要一个强大的、已经训练好的复杂模型(如大型BERT、ResNet-50等)作为教师。这个模型在目标任务上要有很高的准确率。初始化学生模型:设计一个更小、更高效的模型作为学生(如小型BERT、TinyBERT、MobileNet等)。
核心思想:学生模型的能力天花板通常低于老师,我们的目标是让它无限逼近这个天花板。
确定蒸馏策略:
明确要蒸馏的知识形式。最经典和常用的是基于输出的蒸馏,即让学生模仿老师最终的输出预测。
第二步:训练阶段
前向传播:
将同一批训练数据分别输入教师模型和学生模型。对教师和学生的输出logits(分数)同时使用高温Softmax(温度T > 1) 进行软化,得到富含信息的“软标签”。
损失计算:
蒸馏损失:计算学生软标签与教师软标签之间的差异。这里通常使用 KL散度,因为它专门用于衡量两个概率分布的相似度。这一步是让学生学习老师的‘暗知识’——即类别间的相似性关系。
学生损失:计算学生模型的标准输出(T=1)与真实标签(硬标签)之间的交叉熵损失。这一步是保证学生不偏离正确的答案。
总损失:将两个损失进行加权合并,公式为:总损失 = α * 蒸馏损失 + (1 - α) * 学生损失。这里的 α 是一个超参数,用于平衡两种知识来源的重要性。
参数更新:只对学生模型进行反向传播,根据总损失更新学生模型的参数。教师模型的参数是冻结的、不更新的。
Q:“温度参数T的作用是什么?”
答:T是一个超参数,用于控制输出概率分布的平滑程度。T越大,分布越平缓,错误类别蕴含的相对信息(暗知识)就越明显。T=1就是标准的Softmax。高的T有助于学生更好地学习类别间的关系,但通常推理时会设回T=1。
Q:“为什么学生模型能学到比直接训练更好的效果?”
答:因为硬标签只提供了“是什么”的单一信息,而教师的软标签提供了“什么像什么”的丰富结构化信息。这相当于一个学生不仅知道了答案,还理解了整个知识体系的内在联系,因此泛化能力更强。
剪枝
宽度剪枝(Sparse/Width Pruning):砍掉不重要的 Attention head、FFN 中间维度,效果是参数 ↓30-50%,精度掉 <1%
深度剪枝:直接删掉冗余 Transformer 层,效果是6L 小模型可比 12L 大模型快 2×
主要思路是Attention head / FFN 宽度 → 用 梯度/激活/权重幅值 + 一次性重要性估计 给每个 head/neuron 打分,低于阈值直接置零,再微调恢复精度。
整层冗余 → 用 Block Influence / LayerDrop + 早期彩票 ticket 先“试删”再评估下游掉点,掉点<ε 的层即可永久剔除。
LLM 推理场景化优化速查表 (Scenario-Based Optimization)
核心公式:
短输入 + 长输出 → 优化 TPOT (Time Per Output Token) → 关注 Decode 阶段带宽/计算比
长输入 + 短输出 → 优化 TTFT (Time To First Token) → 关注 Prefill 阶段 O(n²) 计算/显存
低并发低时延 → 优化 单请求延迟 → 小 Batch、内核融合、投机解码
高并发高吞吐 → 优化 系统吞吐量 → 大 Batch、连续批处理、量化、PD 分离
Details
| 场景类型 | 核心矛盾 | 关键指标 | 优化方向 | 典型技术方案 | 预期收益 |
|---|---|---|---|---|---|
| 🔹 短输入 + 长输出(多轮对话/写作) | Decode 阶段占 90%+ 时间,自回归串行 + KV Cache 带宽瓶颈 | TPOT ↓(每 token 延迟) | 1. 减少每步计算量2. 降低 KV 访存带宽3. 增大 Decode 并行度 | • PD 分离 (Decode 专用卡)• 连续批处理 (Continuous Batching)• KV 量化 (INT8/4) + GQA/MLA• 投机解码 (Medusa/Eagle)• 前缀缓存 + 分段流水 | TPOT: 100ms → 30-50ms吞吐: ↑3-5×显存: ↓40-60% |
| 🔹 长输入 + 短输出(文档摘要/RAG) | Prefill 阶段 O(n²) Attention,HBM 带宽 + 计算量双重瓶颈 | TTFT ↓(首 token 时间) | 1. 降低 Attention 复杂度2. 切分长序列并行计算3. 复用历史 KV Cache | • Chunked-Prefill (必开)• FlashAttention-2/3 + FA-Decoding• MLA/GQA 减少 KV 头数• 多卡 TP+SP 并行• Prefix Cache 命中复用 | TTFT: 128K 输入 ↓40-60%OOM 率: 30% → 0%计算: O(n²) → O(k·n) |
| 🔹 低并发 + 低时延(交互式/实时应用) | 单请求延迟敏感,无法通过大 Batch 摊薄开销 | P99 延迟 ↓单请求端到端时间 | 1. 内核级融合优化2. 减少 Kernel Launch 开销3. 投机/早停策略 | • 算子融合 (Fused QKV/RMSNorm)• 小 Batch (1-4) + 低精度 (FP16/INT8)• 投机解码 (1-2 步验证)• 静态形状编译 (避免动态开销) | 单请求延迟 ↓20-40%交互体验流畅 (<100ms/step) |
| 🔹 高并发 + 高吞吐(批量推理/服务化) | 系统资源利用率优先,允许单请求延迟适度增加 | Throughput ↑(tokens/sec/card) | 1. 最大化 GPU 利用率2. 连续批处理 + 动态调度3. 量化 + 稀疏化 | • 连续批处理 (MAX_UTILIZATION)• KV Cache 量化 (INT4/8) + 显存复用• PD 分离 + 异构调度 (Prefill 卡/Decode 卡)• W4A16/W8A8 GEMM + Marlin Kernel | 吞吐: ↑5-10×显存效率: ↑2-3×单位成本: ↓50-70% |
大模型架构Qwen、GPT系列、llama系列,Deepseek系列
Transformer架构(Self-Attention(让每个词关注下句子里的其它词) + FFN(每个词独立处理) + 残差)
- GPT 系列
最纯正 Decoder-only + 原始 MHA,靠堆参数、堆数据、堆算力出奇迹;GPT-4 开始用 8×8 专家混合(MoE) 降成本,但官方细节未公开。 - Llama 系列
把 MHA 换成 GQA(分组查询,32→8 组),KV-cache 砍 4×;用 RoPE + SwiGLU + RMSNorm,成为后续开源模型的“标准模板”。 - Qwen 系列
像qwen3-80b-next,在 Llama 模板基础上再切 2/3 层做 Gated DeltaNet(GDN)线性 Attention,缓存 O(1);长文本 1M token 外推靠 NTK-RoPE 动态基频。 - DeepSeek 系列
DeepSeek-V2 首推 MLA(Multi-head Latent Attention):把 KV 先低秩投影到 128 维潜向量,再还原,缓存再降 5-8×,效果反超 MHA。
DeepSeek-MoE 用 共享+细粒度专家 分割,每 token 只激活 8.3% 参数,训练成本只有同规模 Dense 的 40%。
DualPipe 调度:Prefill/Decode 两条流水线 chunk 级并行,TTFT 降 30%。
Qwen模型架构与数据流动
核心改进总结:RMSNorm + SwiGLU + RoPE 已成为新一代LLM(如LLaMA, Qwen等)的标准配置。
Qwen3.5: "用线性注意力处理大部分上下文,关键层用全注意力保精度,类似『粗筛 + 精算』策略"
Details
| 组件 | Qwen2 | Qwen3 | Qwen3.5 | 面试关键点 |
|---|---|---|---|---|
| 归一化 | RMSNorm | RMSNorm | Centered RMSNorm (1+weight, 零初始化) | 零初始化使初始行为接近恒等映射,提升深层训练稳定性 知乎 |
| 激活函数 | SwiGLU | SwiGLU | SwiGLU (专家层标准配置) | 门控机制提升语言建模能力,梯度流动更稳定 |
| 位置编码 | RoPE | RoPE + YaRN | M-RoPE (Multimodal RoPE) + Partial Rotary (25%) | 多模态位置编码,仅 25% head_dim 应用 RoPE 降低计算 知乎 |
| 注意力 | GQA | GQA | Hybrid Attention: 75% Linear(GatedDeltaNet) + 25% Full GQA | 线性注意力降复杂度 O(n²)→O(n),Full Attention 保精度 知乎 |
| KV 管理 | GQA (8:1) | GQA | 极致 GQA: num_kv_heads=2, head_dim=256 | 更激进的头数压缩,KV Cache 显存再降 30-50% |
| 专家结构 | - | MoE (Top-K) | MoE + Shared Expert + Zero-init Routing | 共享专家保通用能力,零初始化路由避免训练初期坍缩 |
| 词表大小 | ~152K | ~152K | ~248K (Qwen3.5-MoE) | 扩展多语言/代码支持,压缩率提升 huggingface.co |
| 上下文长度 | 128K | 256K (YaRN→1M) | 256K Native (YaRN→1M+) | 原生长上下文 + RoPE 外推,支持超长文档/代码库 |
RoPE (Rotary Positional Embedding):
原理:通过旋转矩阵将位置信息注入到 Query 和 Key 向量中。两个向量的相对位置决定了它们的注意力分数。
局限:RoPE 的训练长度是固定的(例如训练时只见过 4K 长度)。当推理时遇到远超训练长度的文本(如 32K),由于旋转角度超出了训练分布,模型性能会急剧下降(“外推能力”差)。
YaRN (Yet another RoPE for NLP):
原理:一种位置插值(Interpolation)+ 缩放技术。它不需要重新训练模型,而是在推理阶段对 RoPE 的角度进行缩放(Scaling),并配合温度参数调整,强行让模型适应更长的序列。
作用:让原本只训练了 4K 的模型,能够无损或低损地处理 32K 甚至 128K 的上下文。
关系:RoPE 是基础机制,YaRN 是让 RoPE 具备长文本外推能力的“插件”或“技巧”。Qwen3 中的 YaRN→1M 指的就是利用该技术将上下文扩展到 100 万 token。
RMSNorm(均方根归一化)以及LayerNorm公式
目前主流的都是rmsnorm
为什么 RMSNorm 更快?
少一次 reduce-mean:LayerNorm 要先算均值,再算方差;RMSNorm 只算一次 RMS。
通信量减半:并行场景下 reduce 次数从 2→1,GPU 空闲时间↓。
无 β 偏移:参数内存减半,加载/优化开销↓。
| 维度 | LayerNorm | RMSNorm |
|---|---|---|
| 计算内容 | 减均值 → 除方差 | 直接除 RMS(无减均值) |
| 参数量 | 2 倍(γ, β) | 1 倍(仅 γ) |
| 零均值 | ✅ 强制 | ❌ 不强制 |
| 速度 | 基准 | 7 %–64 %↑ |
| 大模型表现 | 持平 | 持平或略好 |
推理框架
vLLM框架 & 推理框架面试速查表 (2026)
核心结论:vLLM = PagedAttention(显存分页) + Continuous Batching(连续批处理) + Step-Level Scheduling(细粒度调度)。
v0 → v1:从"高效批处理系统"进化为"低延迟流式服务系统"。
选型:在线服务首选 vLLM/SGLang,极致吞吐选 TensorRT-LLM,国产化选 LMDeploy。
文本输入到vllm主要经过的一些变化:
Details
在 vLLM 中,文本输入首先经过 Tokenizer 编码,然后由 Scheduler 基于 PagedAttention 机制进行资源调度。调度器不再请求连续显存,而是按需分配离散的 Physical Blocks,并维护一张 Block Table 记录逻辑到物理的映射。
在执行阶段,vLLM 采用 Continuous Batching,一旦有请求完成立即释放 Block 并插入新请求,极大提升了吞吐量。对于长序列导致的显存不足,vLLM 支持将 KV Cache Swap 到 CPU 内存。
关于通信处理:
GPU 内部:通过 CUDA Kernel 内的间接寻址,利用 Block Table 访问非连续显存,并结合 Shared Memory 优化随机读取延迟。
多卡互联:底层依赖 NCCL 库,通过 NVLink 进行高效的 All-Reduce (TP 场景) 和 P2P (PP 场景) 通信,并利用 Compute-Communication Overlap 技术隐藏延迟。
vllm核心架构与组件
| 组件层级 | 核心模块 | 职责与机制 | 关键技术点 | 🔥 面试考点 |
|---|---|---|---|---|
| 控制面 (调度/管理) |
Scheduler | 请求调度大脑,维护 Waiting/Running/Swapped 三队列 |
• Continuous Batching:Token 级调度,新请求随时插入 • Prefix-Aware:APC 匹配复用前缀 KV • 优先级:Swapped > Waiting > Running |
Q: 为什么优先处理 Swapped? A: 避免已换出请求的重复加载开销,保证进度公平性 |
| 控制面 (显存管理) |
BlockSpaceManager | KV Cache 分页管理,逻辑块→物理块映射 | • PagedAttention:block_size=16,类似 OS 页表 • Copy-on-Write:并行采样时共享物理块 • LRU Swap:显存不足时换出到 CPU |
Q: PagedAttention 解决什么问题? A: 消除显存碎片,支持动态序列长度,显存利用率↑30-50% |
| 执行面 (计算执行) |
Worker/ModelRunner | 模型前向传播,Kernel 执行 | • CUDA Graph:预编译执行图,减少 Kernel Launch 开销 • Fused Ops:QKV/RMSNorm/SwiGLU 融合算子 |
Q: CUDA Graph 收益? A: 小 Batch 时减少 CPU 调度开销,延迟↓20-40% |
| 执行面 (KV 引擎) |
CacheEngine | KV Cache 生命周期管理 | • BlockTable:维护逻辑→物理映射表 • Async Swap:cudaMemcpyAsync 预取/换出 |
Q: KV Cache 量化如何做? A: INT8/FP8 在线量化,scale 在线 reduce,显存↓50% |
| 通信层 | Pynccl / ZMQ | 分布式通信 & 流式返回 | • NCCL 封装:TP/PP 并行通信,支持 Graph 内嵌 • Zero-Copy:ZMQ 直接流式返回 Token |
Q: 张量并行通信开销? A: All-Reduce 在每层 FFN 后,H100 NVLink 下<5% 总耗时 |
vllm对应演进
一句话总结 v1:"用 Step 级调度 + 状态简化 + 深度 Graph 编译,在保持高吞吐的同时,把尾延迟打到生产级可用"
| 维度 | v0 (Iteration 模型) | v1 (Step 模型) | 🎯 收益/改进 | 🔥 面试高频问答 |
|---|---|---|---|---|
| 调度粒度 | 迭代级:一批请求完整生成多个 token 后才调度 | 时间步级:每步前向传播后重新调度 | • 新请求插入延迟↓90% • 尾延迟(P99)↓40% |
Q: v1 为什么延迟更低? A: Step 级调度避免长请求阻塞短请求,实现真正"流式"连续批处理 |
| 架构设计 | 单体引擎:LLMEngine 耦合调度/执行/内存 | 职责分离:Scheduler/Worker/Executor 三模块解耦 | • 代码可维护性↑ • 新调度策略易扩展 |
Q: v1 架构优势? A: 模块化设计,Scheduler 可独立优化,Worker 可替换后端 (TRT-LLM/Ascend) |
| 状态管理 | 三队列:Waiting/Running/Swapped,逻辑复杂 | 双状态:num_tokens + num_computed_tokens,砍掉 Swapped |
• 抢占恢复逻辑简化 • 被抢占请求直接回 Waiting 头部 |
Q: v1 如何简化抢占? A: 用 num_computed_tokens 记录进度,抢占后直接重入队,无需复杂 Swap 状态机 |
| 执行优化 | CUDA Graph 支持有限,动态形状开销大 | 深度 Graph 集成:预处理/解码/采样全图编译 | • Kernel Launch 开销↓70% • GPU 利用率↑15% |
Q: v1 的 CUDA Graph 优化? A: 将动态形状参数化,预编译多形状 Graph,运行时零 Python 回跳 |
| 高级特性 | Chunked-Prefill 需手动配置 | 原生支持:Chunked-Prefill + Prefix Cache + Jump Decoding | • 长输入 TTFT↓30% • 多轮对话 KV 复用↑3× |
Q: Chunked-Prefill 原理? A: 长 Prompt 切块与 Decode 交错执行,避免单请求独占 GPU,线性化 TTFT |
主流推理框架对比选型
| 框架 | 核心定位 | 杀手锏特性 | 适用场景 | 局限性 | 🔥 面试选型题 |
|---|---|---|---|---|---|
| vLLM | 通用在线服务 | • PagedAttention + Continuous Batching • v1 Step 调度 + CUDA Graph • 社区活跃,插件丰富 |
• 多租户 API 服务 • 中长上下文对话 • 快速原型验证 |
• 极端低延迟 (<20ms) 需调优 • 多模态支持较新 |
Q: 为什么选 vLLM? A: "开箱即用"的分页内存+连续批处理,平衡吞吐/延迟/易用性,生态最成熟 |
| SGLang | 结构化/长上下文 | • RadixAttention:前缀树自动复用 KV • 原生结构化生成 (JSON/Regex) • PD 分离 + Rust 异步调度 |
• 复杂 Prompt 模板/少样本学习 • JSON/代码等结构化输出 • 超长对话 (>64K) |
• 学习曲线稍陡 (前端 DSL) • 多模型并发支持较新 |
Q: SGLang vs vLLM? A: "长模板/结构化输出"选 SGLang (Radix 复用↑3×),"通用服务"选 vLLM (生态更稳) |
| TensorRT-LLM | 极致吞吐/离线 | • 预编译引擎:算子融合+FP8-TC 优化 • In-flight Batching:动态插入请求 • 多 GPU 通信深度优化 |
• 批量离线推理 (Batch Inference) • 固定模型/固定形状的云服务 |
• 编译慢 (分钟级) • 动态形状/多模型支持弱 |
Q: TRT-LLM 优势? A: "编译时优化"吃满硬件,固定场景吞吐比 vLLM 高 20-30%,但灵活性牺牲 |
| LMDeploy | 国产化/训推一体 | • Ascend/NPU 原生支持 • 4-bit KV Cache + AWQ 量化 • 训练→推理无缝切换 |
• 华为昇腾/寒武纪等国产硬件 • 低资源端侧部署 |
• 社区规模较小 • 新特性跟进稍慢 |
Q: 国产化选型? A: LMDeploy 对 Ascend 优化最深,量化+分页+连续批处理三件套齐全,迁移成本最低 |
🔍 展开:vLLM 高频考点速记
- PagedAttention 原理:类似 OS 分页,逻辑块→物理块映射,block_size=16,消除显存碎片
- Continuous Batching:Token 级调度,新请求随时插入,避免传统 Batch 的队头阻塞
- v1 状态简化:
num_tokens+num_computed_tokens替代三队列,抢占恢复逻辑↓50% - CUDA Graph 收益:预编译执行图,小 Batch 时 Kernel Launch 开销↓70%,延迟↓20-40%
- Chunked-Prefill:长 Prompt 切块与 Decode 交错,128K 输入 TTFT↓40-60%
HCCL
华为对应集合通信库,支持allreduce、broadcast、allgather、reduceScatter、AlltoAll等通信原语
broadcast:1到多,将数据从一个节点发送到所有节点
gather:多到1
scatter:1个npu数据切分到其它npu
reduce:多个npu获取数据并做规约运算
allreduce:从多个npu获取数据到所有npu并做归约运算(求和平均最大最小乘积ANDOR),规约+广播:所有节点都有最终结果
reduce scatter:规约后结果分散到不同节点
allgather:收集每个npu所有的数据到每个npu上
alltoallv:所有npu互相scatter和gather数据
简单总结:规约运算是AllReduce的核心计算步骤,负责将分散的数据合并;AllReduce是完整通信原语,包含规约和广播两个阶段。
前沿推理技术思想
| 技术 | 核心思想 (One-Liner) | 解决痛点 | 关键机制 | 🔥 面试一句话回答 |
|---|---|---|---|---|
| DSA (DeepSeek Sparse Attn) |
"先海选 Top-k,后精算 Attention" | 长序列 O(L²) 计算/显存爆炸 | • FP8 低维 Indexer 闪电筛选 • Attn-Score 蒸馏监督索引学习 • Token-level 稀疏 + 单分支 MQA |
Q: DSA 比 NSA 好在哪? A: "蒸馏 loss 选得更准 + 单分支零额外参数 + token 级稀疏",同等精度下推理成本↓50% |
| AFD (Attn-FFN Decoupling) |
"Attention 与 FFN 异构部署" | Attention 带宽瓶颈 vs FFN 计算瓶颈资源错配 | • Attn 放高带宽 GPU,FFN/MoE 放高算力 NPU • 高速网络 (NVLink/RDMA) 通信 • 构建在 PD 分离架构之上 |
Q: 为什么解耦能提效? A: "让带宽密集型与计算密集型算子各得其所",资源利用率↑30%,异构集群成本↓ |
| TPA (Tensor Product Attention) |
"张量分解压缩 KV + 即时重算" | MLA 难兼容 RoPE,长序列缓存仍大 | • KV 分解为低秩因子 (U·Vᵀ) • 推理时即时重算全维 K/Q • 天然支持 RoPE 旋转 |
Q: TPA 如何兼顾压缩与 RoPE? A: "压缩存因子,用时重算",缓存↓10× 且 RoPE 直接作用在重算后的全维 key 上 |
| SepLLM (Semantic KV Compression) |
"骨干序列 + 滑动窗口" 混合缓存 | 语义冗余导致 KV Cache 浪费 | • 余弦相似度动态选"骨干"代表语义 • 固定窗口保局部连贯 • 混合 Cache 计算注意力 |
Q: 如何保证压缩后精度不降? A: "骨干抓全局语义 + 窗口保局部语法",128K 上下文显存↓8×,PPL 损失<0.5% |
| Mooncake (Distributed KV Pool) |
"HBM+DRAM+SSD 三级零拷贝池化" | 单卡显存受限,长上下文/多轮对话复用低 | • 三级存储:L1 热(HBM)/L2 温(DRAM)/L3 冷(SSD) • GPU↔DRAM↔SSD 零拷贝 (RDMA/SPDK) • PrefixCache 命中≈50% |
Q: 零拷贝为什么关键? A: "绕过 CPU 内存拷贝",跨层数据迁移延迟↓90%,50M token 池化 E2E 成本↓35% |
| 混合稀疏路线 (GQA+SWA/SSM) |
"局部密集 + 全局稀疏" 分层建模 | 单一注意力难兼顾局部精度与全局依赖 | • GQA: 分组共享 KV 省带宽 • SWA: 滑动窗口砍计算 O(nW) • SSM: 线性状态空间建模长距 |
Q: 为什么混合比纯稀疏好? A: "局部用 Attention 保精度,全局用 SSM/窗口省计算",128K 序列 PPL↓12%,推理↑2× |
大模型推理显存占用与优化策略(面试高频考点表)
| 显存组件 | 计算公式 / 影响因素 | 典型占用 (7B/FP16) | 可优化手段 | 面试高频考点 |
|---|---|---|---|---|
| 模型权重 | 参数量 × 精度字节• FP16: 2B/param, INT8: 1B, INT4: 0.5B |
~14 GB (FP16) ~7 GB (INT8) ~3.5 GB (INT4) |
• 量化 (AWQ/GPTQ) • 权重分片 (Tensor Parallel) • Offload 到 CPU/NVMe |
• 7B 模型 FP16 为什么是 14GB? • 量化后精度损失如何评估? • TP 并行时权重如何切分? |
| KV Cache | 2 × 层数 × 头数 × 头维 × batch × seq_len × 精度• GQA/MQA 可显著降低 |
~9–10 GB (batch=32, seq=2048) |
• 调整 gpu_memory_utilization• PagedAttention (vLLM) • KV Cache 量化 (FP8/INT8) • GQA 替代 MHA |
• KV Cache 为什么占这么大? • PagedAttention 如何解决显存碎片? • GQA vs MHA 显存差异? |
| 激活值 | 层数 × hidden_dim × batch × seq_len × 精度• 与 max_num_seqs、max_model_len 强相关 |
~4–5 GB (动态变化) |
• 降低 max_batch_size• 限制 max_model_len• 重计算 (Activation Recomputation) |
• 为什么长序列容易 OOM? • 重计算的时间 - 显存权衡? • 如何估算最大支持 seq_len? |
| 中间缓冲区 | • CUDA Graph 缓存 • 临时 Tensor/Workspace • CuBLAS/CuDNN 工作区 |
~0.5–2 GB | • 复用 Buffer • 调整 workspace_size• 框架级显存池 (如 PyTorch CachingAllocator) |
• 显存碎片如何产生? • PyTorch 显存复用机制? |
| 非 Torch 显存 | • 驱动/上下文开销 • NCCL 通信缓冲区 (多卡) • 监控/调试工具占用 |
~0.1–2 GB | • 关闭非必要调试功能 • 优化 NCCL 缓冲区大小 |
• 多卡推理为什么显存占用更高? • nvidia-smi 显存 ≠ PyTorch 分配显存? |
🔑 附:大模型推理显存估算速查公式
# 1. 权重显存 (GB)
weights_gb = params_B × 2 × (precision_bytes / 2)
# 例:7B × 2B(FP16) = 14 GB
# 2. KV Cache 显存 (GB) - MHA 版本
kv_gb = 2 × layers × heads × head_dim × batch × seq_len × 2 / 1e9
# 例:32×32×128×32×2048×2 ≈ 10.7 GB
# GQA 优化:heads → kv_heads (如 32→8,显存降 4×)
# 3. 激活值显存 (粗略估算)
activations_gb ≈ layers × hidden_dim × batch × seq_len × 2 / 1e9
# 例:32×4096×32×2048×2 ≈ 17.2 GB (实际因算子融合会减少)
# 4. 总显存需求
total_gb ≈ weights + kv_cache + activations + buffer(20%)💡 面试加分回答模板
问:7B 模型推理时显存爆了,如何排查和优化?
1️⃣ 定位瓶颈:用nvidia-smi+ PyTorchtorch.cuda.memory_summary()
区分是权重、KV Cache 还是激活值占用过高。
2️⃣ 针对性优化:
• 权重高 → 启用 INT4 量化 (AWQ) 或 Tensor Parallel 分卡
• KV Cache 高 → 开启 PagedAttention (vLLM)、改用 GQA、降低 max_seq_len
• 激活值高 → 减小 batch_size、启用重计算、限制 max_model_len
3️⃣ 系统级调优:
• 调整gpu_memory_utilization=0.9预留 buffer
• 关闭调试功能减少非 Torch 显存
• 多卡时优化 NCCL 通信缓冲区
4️⃣ 兜底方案:CPU/GPU Offload 或 NVMe Swap (牺牲延迟换容量)
✅ 核心思路:先量化瓶颈组件,再用「空间换时间」或「时间换空间」策略权衡。