资讯详情

深入vLLM源码:小白也能看懂的大模型推理流程与核心优化机制(收藏版)

📅 2026/11/4 12:07:48 | 华诺云谱 👁 阅读
深入vLLM源码:小白也能看懂的大模型推理流程与核心优化机制(收藏版)
本文深入分析了vLLM源码以Llama 3为例详细介绍了大模型推理过程中的每个计算环节并标注了Tensor的维度变化。重点解析了连续批处理Continuous Batching和分页注意力Paged Attention两大优化机制阐述其如何提升GPU利用率并解决显存碎片问题。此外文章还涵盖了Tokenize、Embedding Lookup、Transformer Block、LM Head和Sampling等关键步骤帮助读者全面理解大模型推理的流程和原理。对于想要学习大模型、提升编程技能的开发者来说本文提供了宝贵的参考和指导。在阅读 vLLM 源码的过程中发现追踪推理过程中每一步的张量维度变化对于理解大模型工作原理非常有用。因此本文将以 Llama 3为例介绍推理过程中的每个计算环节在每个计算环节都会标注Tensor的维度变化。我们知道通过批处理可以提高GPU的利用率本质是提升计算强度即通过复用权重数据来均摊内存访问开销而减少Kernel启动开销与通过海量warp充分发挥隐藏延迟仅是随之而来的次要优化。而批处理内的请求要步调一致同时开始同时结束。而对于LLM这类生成式任务其核心矛盾在于每个请求的输出序列长度是不可预测且差异巨大的。那怎么办呢有没有可能将调度的从request level下沉到token level呢 恭喜你发明了continuous batching。那每个请求的KV Cache显存申请是不是应该也是token level不要一次申请所有的显存。搞一个地址数组(block table)来维护每个请求的KV Cache地址就好 恭喜你发明了Paged Attention。没错以上两个概念是当今大模型得以高性能运行的关键。连续批处理 (Continuous Batching)在vLLM调度器的视角中不存在Prefill 阶段和Decode阶段的区分。 每个请求主要关注num_computed_tokens已经计算过的 token 数含 Prefix Cache 命中的部分num_tokens该请求当前总共拥有的 token 数prompt 已生成的 output每一步调度的目标就是让num_computed_tokens追上num_tokens。差多少就调度多少——当然要受限于 token 预算。调度受4个硬性约束限制最大并发请求数self.max_num_running_reqs scheduler_config.max_num_seqstoken budget 单步最多计算多少 token所有请求之和控制 GPU 计算量上限self.max_num_scheduled_tokens ( self.scheduler_config.max_num_scheduled_tokens # 优先用这个 if self.scheduler_config.max_num_scheduled_tokens else self.scheduler_config.max_num_batched_tokens # fallback )模型最大序列长度self.max_model_len model_config.max_model_len是否还有空闲的KV Cache blocks如上图所示vLLM的每轮推理都会基于token level调度后续的执行的输入都是类似input_ids这种打平的token数组即Flattened。(这里的调度逻辑是在Tokenize之后, 本文后续的num_sched_tokens都对应上图中的total_num_scheduled_tokens)Paged AttentionvLLM启动时会申请显存 kv_cache shape为[num_layers, 2, num_blocks, block_size, num_kv_heads, head_dim]每一层key_cache和value_cache的shape都是[num_blocks, block_size, num_kv_heads, head_dim]。block_table会记录每个请求分配到的物理块IDshape为[max_num_reqs, max_num_blocks_per_req]请求0分配了块[5, 8, 12]请求1分配了块[3, 7]为什么slot_mapping和block_table不需要num_layers维度如果一个请求的第 25 个 Token 被分配到了物理块 ID 为8的位置那么在模型的第 0 层到第 31 层这个 Token 的 KV 值都会被存储在物理块8的相同位置。而推理过程中通过slot_mapping告诉kernel 把新产生的 KV 写到哪个 slot通过block_table告诉 kernel 去哪些物理 block 读取 KVCache。# slot_idx对应token对应的最终存储位置: slot_idx block_idx * block_size block_offset const int64_t slot_idx slot_mapping[token_idx]; const int64_t block_idx slot_idx / block_size; // 计算块索引 const int64_t block_offset slot_idx % block_size; // 计算块内偏移比如block_size 16每个块存储16个token,请求0的block_table为[5, 8, 12]token位置为25计算过程block_idx 25 // 16 1属于第1个虚拟块block_idx block_table[0, 1] 8从页表查找物理块IDblock_offset 25 % 16 9slot_idx 8 * 16 9 137PagedAttention 的虚拟页表机制解决了显存碎片的问题极大地提升了 GPU 的显存利用率是支撑 Continuous Batching 高性能推理的基础。然而PagedAttention 引入的 block_table 间接寻址机制打破了一个请求在物理显存上的绝对连续性。当 Attention Kernel 跨越 block 读取历史 KVCache 时会触发离散访存Uncoalesced Access这在底层对 Memory Controller 是非常不友好的同时也会导致 L2 Cache 的命中率下降带来一定的带宽折损。当然系统设计从来都是 Trade-off。vLLM 通过设置合理的 block_size默认通常是 16来缓解这个问题在一个 block 内部的 16 个 Token 的物理显存依然是连续的能够保证高效率的合并访存。相比于因显存碎片导致的OOM牺牲少部分的访存带宽换取整个系统吞吐量Throughput的大幅跃升在 LLM 推理的整体逻辑中是划算的。LLM推理流程Tokenize对用户输入提示词进行分词并转换为数字表示。目前主流 LLM 几乎全部使用 BPEByte Pair Encoding。BPE的词表训练方式如下Embedding LookupEmbedding Lookup 本质上是一个查表操作它将一维的 Token ID 数组[num_sched_tokens]直接转化为[num_sched_tokens, hidden_size]的特征矩阵作为进入大模型真正意义上的数学输入。理论实现目标矩阵计算公式输入 维度权重矩阵 维度输出结果维度备注Embedding[batch_size, seq_len][V, hidden_size][batch_size, seq_len, hidden_size]本质是索引取值而非矩阵乘法vLLM中的实现目标矩阵计算公式输入 维度权重矩阵 维度输出结果维度备注Embedding[num_sched_tokens][V, hidden_size][num_sched_tokens, hidden_size]Flattened 布局将 Batch 中所有请求的有效 Token 拼接为一维长向量彻底消除 Padding。Transformer BlockAttention Module (以标准GQA RoPE为例)RMSNorm为了保证大模型在神经网络中的数值稳定性必须引入特征归一化Normalization机制。与传统 LayerNorm 要求同时缩放与平移不同为了提升计算效率现代大模型广泛为采用了 RMSNorm 砍掉平移操作仅沿特征维度对数据进行尺度缩放能够有效防止前向传播中的方差膨胀与硬件数值溢出从而极大缓解反向传播时的梯度异常消失或爆炸问题为深层网络的稳定训练提供基础保障。目标矩阵计算公式输入 维度权重维度输出结果维度备注RMSNorm[num_sched_tokens, hidden_size][hidden_size][num_sched_tokens, hidden_size]是一维向量而非矩阵做的是逐通道缩放而非 GEMMQ/K/V Linear Proj - Fused QKV目标矩阵计算公式输入 X 维度权重矩阵 维度输出结果维度备注Fused QKV[num_sched_tokens, hidden_size][hidden_size,qkv_proj_size][num_sched_tokens, qkv_proj_size]权重按列拼接执行单次宽矩阵 GEMM 4096 (Q) 1024 (K) 1024 (V) 6144Reshape Cache目标矩阵Q, K, V SliceRoPE(维度不变)Multi-Head Reshape备注Query ()[num_sched_tokens, hidden_size][num_sched_tokens,num_heads,head_dim]前 4096 列Key ()[num_sched_tokens, kv_channels][num_sched_tokens,num_kv_heads,head_dim]中间 1024 列Value ()[num_sched_tokens, kv_channels][num_sched_tokens,num_kv_heads,head_dim]最后 1024 列注是一个块对角旋转矩阵实际实现中通过元素级 sin/cos 运算避免矩阵乘法。这个阶段的大概流程 QKV 按列拆分 - 对Q、K进行RoPE计算 - Q、K、V Reshape多头视角 - 然后reshape_and_cache按照slot_mapping Scatter写入Paged KVCache。RoPE 的核心思想就是用旋转的角度来代表 Token 的位置。 虽然不是矩阵乘法sin/cos 属于超越函数在 GPU 上由 SM 内的特殊函数单元SFU, Special Function Unit执行。SFU 的吞吐量通常仅为 FP32 ALU 的 1/4。所以VLLM中不在 RoPE kernel实时计算sin/cos 而是引擎初始化时按模型配置预计算好 cos_sin_cacheshape 为 [max_position_embeddings, rotary_dim]。 RoPE kernel 运行时按 positions 索引出对应的 cos/sin 行与 Q/K 做逐元素乘加即可。本质是用一份小表典型大小几 MB 到几十 MB换掉每次 forward 几百万次的 sin/cos 调用——经典的空间换时间 /访存换算力。Attention (FlashAttention, Scaled Dot-Product Attention)读取请求对应 KV Cache 进行 FlashAttention 计算。Softmax 的核心原理可以用一句话概括将一组任意的实数通常称为 Logits转化为一套总和为 1 的概率分布同时放大差异。ps: 这里的为head_dim。感觉Attention的逻辑是整个LLM推理最复杂的地方了Attention 的数学逻辑并不复杂但是为了提升计算强度打破内存墙业界在这里做了非常多的优化比如FlashAttention其他阶段基本都是Token维度打平的而Attention计算必须要在请求维度进行运算。特别注意: 在进入Attention kernel之前需要从全局Flattened视角[num_sched_tokens, ...]切换到请求维度视角[batch_size, ...]。这是因为Attention计算本质上是请求内部的操作不同请求的KV Cache不能交叉。vLLM/FlashAttention通过cu_seqlens累积序列长度数组来实现这种变长序列的请求级隔离而无需真正Reshape为[batch_size, ...]的规整张量。 这里的K和V Shape算子逻辑上为[batch_size, num_kv_heads, seq_len, head_dim]而不同请求的seq_len肯定不一致。实际上在cuda算子层已经确保了不同请求不会分配到同一个 thread block即保证这里的运算是请求维度隔离的。K的Shape为[seq_lens, num_kv_heads, head_dim]包含当前请求所有历史的KCacheseq_lens是所有历史KV对应的Token长度但物理上由于Paged Attention机制这些历史K Cache并非连续存储而是离散分布在HBM的物理块中即底层实际Shape为[num_blocks, block_size, num_kv_heads, head_dim]。Kernel在执行时会通过 block_table 动态间接寻址在片上SRAM中将其拼凑为逻辑上的连续序列参与计算。V的Shape为[seq_lens, num_kv_heads, head_dim]包含当前请求所有历史的VCacheQ的Shape为[query_lens, num_heads, head_dim]query_lens是本次Q对应的Token长度操作名称数学公式逻辑说明 / 目的GQA分组共享1 KV Head 映射给 4 Q Head把KV的Shape从[seq_lens, num_kv_heads, head_dim]变为[seq_lens, num_heads, head_dim]逻辑上等价于将1个KV Head的数据广播给4个Q Head物理实现中通过索引映射kv_head_idx q_head_idx // (num_heads // num_kv_heads)避免显存复制。Q-K Dot Product查询Query和该请求所有Key的点积注意力原始分数。-[query_lens, num_heads, seq_lens]Scale对原始分数进行数值缩放 为向量维度防止 Softmax 函数进入梯度极小的区域。Mask注入因果逻辑通过加上掩码矩阵 通常将未来位置设为 阻止模型“看到”未来的信息。Softmax将处理后的分数转化为总和为 1 的注意力权重概率。-[query_lens, num_heads, seq_lens]MatMul根据注意力权重 对值向量Value进行加权求和得到最终的输出特征表示。 V的Shape为[seq_lens, num_heads, head_dim]-[query_lens, num_heads, head_dim]Attention 的数学逻辑非常清晰但在大模型推理尤其是长文本 Prefill 阶段中如果严格按照数学公式分步执行会在 GPU 的 HBM全局显存中产生庞大的中间矩阵 注意力分数和 Softmax概率其 的内存访问量会严重影响性能即所谓的内存墙问题。为了打破这个瓶颈vLLM 默认采用 FlashAttention 及其变体如 Flash-Decoding。FlashAttention 的核心思想是 Kernel 融合 (Kernel Fusion) 与 分块计算 (Tiling)。但分块计算面临一个致命的数学障碍Softmax 操作需要知道全局的最大值和指数和才能计算这通常要求完整的中间矩阵驻留在显存中。FlashAttention 巧妙地引入了 Online Softmax 算法通过维护局部的当前最大值Running Max和当前指数和Running Sum并在读入新块时利用动态缩放因子Rescaling Factor对旧结果进行修正。正是凭借 Online SoftmaxFlashAttention 成功解除了全局数据依赖将从 Q-K 点积、Softmax 到乘 V 的整个逻辑步骤融合成了一个单一的 CUDA Kernel。在物理执行上它一块一块地在 SRAM 中完成计算彻底避免了将庞大的中间矩阵 和 读写 HBM从而大幅打破了内存墙限制。Prefill 阶段seq_lens 和 query_lens 都是num_prompt_tokens。当前 Prompt 计算出的 KV 向量先被 reshape_and_cache_flash 按 slot_mapping 写入 Paged KV Cache随后 attention kernel 通过block_table 从 cache 中读取 K/V 完成本层 attention 计算这份写入同时也作为该序列的 KV Cache供后续 decode 步骤复用。vLLM v0中prefill和decode 走两条独立分支prefill 通过attn_metadata.is_prompt True调flash_attn_varlen_funckernel直接读临时的物理上连续的HBM buffer 里的 K/V不读 cachedecode 走paged_attention_v1/v2K/V 全部从 cache 读。v1 把两路统一成一次flash_attn_varlen_func调用K/V 全部走 paged cache block_table代价是 prefill 多一次写 cache → 读 cache的间接寻址换来对 prefix cache / chunked prefill 的天然支持。只有v0版本 FlashAttention不读KV Cache因为 v0 没有 prefix cache / chunked prefill。V1中即便某些 backend如 FlashInfer、MLA-sparse把混合 batch 物理拆分成prefill / decode 两个独立 kernel 调用,prefill 仍然从 paged cache 读 K/V - 因为 v1 需要支持 prefix cache 和 chunked prefill 。Decode阶段seq_lens为已计算的历史 token 总数 query_lens为1。对比Prefill和Decode可以发现Prefill阶段QKV_Proj、Attention、O_Proj、MLP 本质上都是稠密矩阵乘法GEMM其实就是通过请求内token-level计算复用模型权重因此算术强度极高使得 GPU 在 Prefill 阶段主要受限于 Tensor Cores 的物理算力峰值属于计算密集型Compute-bound。Decode阶段由于自回归特性每次只处理一个 Tokenquery_lens 1若无优化此时QKV_Proj、Attention、O_Proj、MLP全都退化为矩阵向量乘法GEMV。虽然计算量不大但需要把巨大的 KV Cache和模型权重 从 HBM 搬运到 SRAM非常吃显存带宽因此Decode阶段是典型的访存密集型Memory-bound。而 Continuous Batching 的价值在于在Prefill实现请求内复用模型权重的基础上进一步通过token-level的调度让多个请求复用模型权重将 QKV_Proj、O_Proj、MLP 重新变回矩阵乘法极大地摊薄了读取权重的显存开销。但是Attention则比较特殊由于每个请求必须读取自己独占的 KV Cache无法跨请求共享而且Decode每次只处理一个 TokenAttention 计算始终无法均摊访存开销。此外由于当前 Query 必须与所有历史 Key/Value 交互哪怕有KVCache的存在其计算与访存量也是随着上下文长度 呈 线性膨胀。这里特别注意其实Prefill阶段每次处理num_prompt_tokens个TokenAttention 计算是可以均摊访存开销的。ps: 所以其实我们日常所说的Prefill是Compute-boundDecode是Memory-bound主要是基于 1. 从 HBM 读取模型权重的访存摊销 2. 从 HBM 读取模型KV的访存摊销。Multi-Head Concatenation操作名称逻辑说明vLLM 输入维度输出结果维度备注Concat / Flatten消除多头维度恢复隐藏层维度[num_sched_tokens, num_heads, head_dim][num_sched_tokens, hidden_size]物理内存通常已经是连续的这里本质上是一个改变 Tensor View 的操作。 (hidden_size num_heads * head_dim)O_Proj - 线性融合 (Output Projection)目标矩阵计算公式输入 维度权重矩阵 维度输出结果维度备注O_Proj[num_sched_tokens, hidden_size][hidden_size, hidden_size][num_sched_tokens, hidden_size]跨 Head 的信息交互与融合。这也是一次标准的稠密矩阵乘法GEMM / GEMV。Residual Connection不要推翻重来而是在原有的基础上学习“修正值”Delta。如果没有 ResNet 证明网络可以堆到 100 层以上且不梯度消失后来的 BERT (24层) 和 GPT (96层) 根本不敢设计得那么深。它是“Scaling Law”在架构上的物理基础。目标矩阵计算公式输入 维度输入 维度输出结果维度备注Residual Add[num_sched_tokens, hidden_size][num_sched_tokens, hidden_size][num_sched_tokens, hidden_size]是进入这一层 RMSNorm 之前的原始输入。将注意力机制提取的新特征“加回”主干数据流中。实际vLLM中Residual Add会和下一步的RMSNorm融合成一个 CUDA kernel。FFNRMSNorm对 再进行一次归一化。在 vLLM 中通常与上一层残差相加Residual Add融合减少 HBM 读写。Gate_Proj Up_Proj通常 intermediate_size 是 hidden_size 的 4 倍左右 (或 8/3 倍)。目标矩阵计算公式输入 X 维度权重 W 维度输出维度Gate Proj[num_sched_tokens, hidden_size][hidden_size, intermediate_size][num_sched_tokens, intermediate_size]Up Proj[num_sched_tokens, hidden_size][hidden_size, intermediate_size][num_sched_tokens, intermediate_size]vLLM 工程实现Fused Gate/Up为了减少 GPU 核函数启动Kernel Launch次数并充分利用内存带宽vLLM 在加载模型时会将 和 按列拼接。这样原本两次中等规模的矩阵乘法就变成了一次宽矩阵 GEMM。目标矩阵计算公式输入 X 维度权重 Wgate_up 维度输出维度Fused Gate/Up[num_sched_tokens, hidden_size][hidden_size, 2*intermediate_size][num_sched_tokens, 2*intermediate_size]ActivationSiLU(Gate) * Up。vLLM 使用silu_and_mulkernel 在片上SRAM直接输出点乘结果极大节省了显存带宽。操作名称数学公式物理实现说明Slice Act为 前一半 为后一半。Down_Proj目标矩阵计算公式输入 维度权重 维度输出结果维度Down Proj[num_sched_tokens, intermediate_size][intermediate_size, hidden_size][num_sched_tokens, hidden_size]Residual Connectionx x FFN_Outputclass LlamaMLP(nn.Module): def __init__(self, config): super().__init__() # 通常 intermediate_size 是 hidden_size 的 4 倍左右 (或 8/3 倍) self.gate_proj nn.Linear(self.hidden_size, self.intermediate_size, biasFalse) self.up_proj nn.Linear(self.hidden_size, self.intermediate_size, biasFalse) self.down_proj nn.Linear(self.intermediate_size, self.hidden_size, biasFalse) self.act_fn nn.SiLU() def forward(self, x): # 1. Gate 和 Up 分别进行 Linear 变换 # 2. Gate 经过 SiLU 激活 # 3. 两者相乘 (Element-wise multiplication) - 这就是 GLU (Gated Linear Unit) # 4. 最后经过 Down 投影回原维度 return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))LM Head将隐藏层特征映射到整个词表空间输出未归一化的原始得分即 Logits。在前面的 Transformer Block 中Prefill 阶段的num_sched_tokens是所有 Prompt 长度的总和。但实际上vLLM LM Head只需要每个请求序列的最后一个 Token 的特征用来预测下一个词因此进入LM Head前会执行一次 Gather 操作。Speculative Decoding、prompt_logprobs除外更近一步Prefill阶段Transformer Block的最后一层attention 输出是 [num_sched_tokens, hidden_dim]但实际上只需要最后一个 token 的 hidden_state 来做 logits 计算因为之后没有更多的 layer 需要完整的 hidden_states 了。所以理论上最后一层的MLP以及 LayerNorm可以只对需要采样的 token 计算节省大量计算。如果只需要最后一个 token 的生成结果那么在最后一层Last Layer必须要算的部分所有 token 的 和 因为这层的 KV cache 要存下来供后续 Decode 阶段使用。理论上可以只算最后一个 token 的投影、Attention 的计算其实退化成了 Decode 阶段的 Flash-Decoding 计算、LayerNorm、以及庞大的 MLP。但是vLLM中最后一层还是老老实实把所有 query_lens 都算了一遍本质上是工程与物理极限的 Trade-off。RMSNorm最后再来一次归一化防止数值过大。Linear (LM Head)目标矩阵计算公式输入 维度权重矩阵 维度输出结果维度备注LM Head[num_reqs, hidden_size][hidden_size, vocab_size][num_reqs, vocab_size]num_reqs即当前 Batch 中的请求数量。 以 Llama-3-8B 为例vocab_size高达 128256这是一个极庞大的矩阵vLLM 通常会使用张量并行TP按列切分该权重以加速计算。Sampling保存原始 Logprobs如果用户请求了 logprobs对数概率Sampler 会在任何处理之前先对原始 logits 做一次log_softmax快照保存。这样返回给用户的概率分布反映的是模型的真实输出不受后续 penalties / temperature 等采样参数的干扰。{ token: Hello, // 实际被选中的 token logprob: -0.01523, // 该 token 的对数概率 (log_softmax 的结果) bytes: [72, 101, ...], // token 的 UTF-8 字节表示 top_logprobs: [ // 概率最高的前 N 个 token (用户通过 logprobsN 指定) { token: Hello, logprob: -0.01523 // ln(0.985) ≈ -0.015, 即 98.5% 概率 }, { token: Hi, logprob: -4.32185 // ln(0.013) ≈ -4.32, 即 1.3% 概率 } ] }Logits Process在得到原始 Logits 后、进行 Softmax 概率转化前会经过一系列后处理操作用于干预最终的生成结果白名单过滤结构化输出JSON schema配合 grammar bitmask每一步动态计算当前合法的 token 集合。情感分类只允许输出positive/negative/neutral对应的 token。多选题只允许输出ABCD。黑名单过滤Non-argmax-invariant Logit ProcessorsRepetition Penalty (重复惩罚): 根据历史 Token对已生成过的词汇扣除分数防止模型变成“复读机”。采样每个请求的采样策略可以是Greedy或Random由用户设置的temperature决定cached_property def sampling_type(self) - SamplingType: if self.temperature 1e-5: # 0.00001 就是 greedy return SamplingType.GREEDY return SamplingType.RANDOMGreedy 先行在 temperature 缩放之前先对当前 logits 执行一次argmax保存为greedy_sampled。如果整个 batch 全是 greedy所有请求的 到这里就直接返回后续步骤全部跳过。这一步必须在 temperature 之前做否则 greedy 请求的 logits 会被不必要地除以 temperature 导致精度损失。Temperature ScalingLogits Logits / Temperature。: 拉大分数差距。高分越明显低分被压得更低。模型变得保守、确定。: 缩小分数差距。分布趋向均匀。模型变得随机、有创造力但也容易胡说八道。对于 的 greedy 请求此处会用 跳过除法避免除以零它们的最终结果由 Step 1 的greedy_sampled决定。Argmax-invariant Processors如 min_pmin_p是目前唯一的 argmax-invariant 处理器。其规则为概率不到token最高概率的 min_p倍的 token全部淘汰。公式阈值 低于阈值的 token 得分设为 。示例min_p 0.1阈值 0.04min_p 的核心价值在于自适应最高概率的 token 自身永远不会被砍因为 所以 argmax 结果不变。模型很确定时阈值 0.09砍得多几乎只剩最优解。模型不确定时阈值 0.008砍得少保留充分的探索空间。Top-K 截断只保留分数最高的 个 Token其余得分全部设为 。Top-P Masking按分数从高到低排序并累加 softmax 概率保留累积概率刚好超过 的前若干 Token尾部 Token 得分设为 。Softmax Gumbel-Max 采样 确保结果的随机性 公式 其中Gumbel-Max 用加噪求最大值替代了传统的轮盘赌算法。它将原本需要串行计算前缀和的采样过程转化为完全独立的 element-wise 并行运算打破了超大词表下的全局数据依赖。probs logits.softmax(dim-1) q.exponential_() probs.div_(q).argmax(dim-1)最终选择逐请求按 temperature 决定使用哪个结果final where(temperature 1e-5, greedy_sampled, # 该请求用贪心结果 random_sampled) # 该请求用随机结果output得到Next Token ID并将其追加到 Input 序列中进入下一轮循环。总结是的戛然而至。本文主要讲述了经典的大模型推理的全流程想要真正理解大模型的推理流程理解shape的变化真的很重要。笔者有意克制发散的思维专注整个推理流程很多的原理和概念都没有提。后续可以围绕这个基础展开比如数学基础Softmax、RMSNorm原理、RoPE比如Attention计算遇到了内存墙问题导致了 DeepSeek MLA/DSA、线性注意力等的产生本质是减少KVCache的读取导致了FlashAttention的产生的本质上是利用IO Aware、重计算提升计算强度比如为什么要MoE scaling law模型不断增大计算量随参数线性增大而参数占比的大头又在MLP层那就把MLP层拆分美其名曰不同专家每次执行仅激活部分参数, 其本质就是将现有FFN层拆分成多个然后增加路由每次可以激活不同专家组。比如模型太大了TP、PP、DP、EP、SP、CP了解了本文的数据流shape变化TP理解就变的相当容易。Column Parallelism (列切分) Fused QKV 和 FFN 的 Fused Gate/Up 都是列切分。例如 QKV 的权重维度在单卡上会变成[hidden_size, qkv_proj_size / TP_size]输出也相应变成[num_sched_tokens, qkv_proj_size / TP_size]。Row Parallelism (行切分) O_Proj 和 FFN 的 Down_Proj 是行切分。权重变为[hidden_size / TP_size, hidden_size]。计算完成后通过AllReduce算子来聚合跨卡结果。比如长上下文时 chunked prefill 到 Flash-Decoding 到 SP 本质是不同维度的prompt的拆分不过是在解决不同问题chunked prefill 避免超长 Prompt的新请求影响其他请求无论是正在处理的 decode 请求还是待处理的其他 prefill 请求 Flash-Decoding 通过 KV 维度的切块Split-K提升了 Decode 阶段的 SM流处理器利用率SP (Sequence Parallelism) 则是解决单卡显存塞不下超长上下文的问题。Flash-DecodingSequence Parallelism靠Log-Sum-Exp实现跨 SM或者跨卡的归一化再来感叹一句单从推理来看大模型的原理其实真没那么高深莫测最难的数学公式怕是要数RoPE了。但是AI Infra的东西真的多 根本学不完不像agent方向整天重命名上下文工程。提示词工程、function calling、 rag、mcp、memory、agent开发、skills、openclaw、上下文工程、harness工程、hermes如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑