QWEN / INFERENCE SYSTEMS / INTERACTIVE FIELD GUIDE
Qwen3.8-27B
从模型结构到 vLLM 推理数据流
输入如何从字符串变成张量?每一层怎样读取记忆、纠正状态、改变向量?打开64层逐算子计算剖面,再沿缓存与调度追到推理引擎。
LAYER-BY-LAYER / FORWARD PASS
把每一层打开,
看表示怎样改变。
不要把“模型思考”想成64个文字处理框。实际发生的是:数值向量反复投影、读取记忆、非线性变换与残差相加。下面同时提供真实张量规格与可验算的教学中间值。
进入第0层之前:字符串已经消失了
{role: "user", content: "猫坐在垫上"}input_ids [T] · positions [T] 或 [3,T]E [248320,5120] → X⁰ [T,5120]同一句「猫坐在垫上」并不是5个 token:固定服务器 snapshot 的结果为 猫→98500 · 坐在→108604 · 垫→99333 · 上→95802。裸文本查表得到 [4,5120];完整聊天还要计入角色/特殊 token。
ID 不是语义坐标。 tokenizer 用词表把字符串分成 token,中文不保证一字一 token。Embedding 用整数 ID 取矩阵中的一行;不是把 ID 乘进每层。相同 token 的初始 embedding 相同,上下文影响由后续层产生。
图像从另一条路合流。 processor 给出像素/网格和占位位置;视觉编码器输出 [V,5120],替换对应位置的 embedding,再进入同一64层。thinking tokens 也进入这条路径,MTP 不属于这64层主干。
真实规格来自 固定 revision 的 FP8 config ↗;chat template 还会加入角色和特殊 token,下面的字符示例刻意不模拟这些 ID。
为什么多数层压缩、每第四层再检索?
两种记忆,付出不同代价。 GDN 每步更新固定大小的 S,mixer 核心 decode 成本不随历史长度 L 增长,约为 O(Hᵥdᵥdₖ);GQA 读每个位置的 K/V,decode 核心随 L 线性增长,约 O(LHqdh)。prefill 的标准全注意力有二次 token 配对;Flash/Paged 优化存储和执行,不取消这些配对。
压缩不是无损,寻址也不是保证答对。 GDN 的有限状态可能让相似 key 干扰,或让衰减抹掉细节;GQA 保留按位置访问历史表示的能力。3:1 把两种机制交错,让较少全注意力层参与补充检索。比例来自 config;这里解释其设计动机,不声称它对所有任务都是最优。
Gated DeltaNet论文 ↗ · 复杂度为固定head维度下的数学推导,仅针对mixer核心,不包含投影/FFN,也不是实测延迟。
本轮一次处理 5 个已知字符;当前追踪 t4,仍只能读取 ≤t4 的历史。真实推理只在需要预测的位置计算 logits。
逐步播放只移动计算焦点;任意选择层或 token 会暂停。
L00 · INPUT · t4
接收上一层的残差流
X⁽ℓ⁾ ∈ ℝᵀˣ⁵¹²⁰
真实 Qwen 规格[T, 5120]
每个 token 是一行 5120 个数,不再是汉字字符串。层号向下推进,但行仍对应原来的 token 位置;上一层增加的上下文信息已包含在这些数里。第 0 层接收 embedding,其他层接收上一层输出。
展开另外两种阅读深度
数学:ℓ=0…63 表示网络深度,t 表示序列位置。X[t,:] 是一个位置的表示。T 是本次实际安排计算的 token 总数,不是最大上下文长度。残差流不是 KV cache,也不是 GDN 的 S。
工程:GPU · 逻辑 BF16 · 当前前向临时量。vLLM 可把多个请求打包为 [T,5120];query_start_loc/seq_lens 把各请求分隔,不能让不同用户互相注意。权重是模型常驻量。
依据:vLLM decoder 源码 ↗ · 安装源码只读复核于2026-08-31;维度为 config/源码推导。
当前 token 的教学表示 · 4个坐标
| -0.2227 | -0.6884 | 0.7540 | 0.7126 |
t=4,沿网络深度向下传递这行向量;词的位置不变,特征值会改变。颜色只表示数值的正负与大小,不表示语义或可信度。
L00 的数据结构、dtype、生命周期与 TP4 分片
T=本轮被调度的 token 数;R=缓存中的请求/state槽位;P=物理页数。下表 shape 是逻辑视图,不宣称某后端的实际 stride/对齐布局。
| 数据结构 | 全局逻辑 shape | TP4 每 rank | 位置 / dtype | 生命周期 / 含义 |
|---|---|---|---|---|
| 残差流 X / Y | [T,5120] | [T,5120] | GPU · 逻辑 BF16;归约精度由 kernel 决定 | 当前层/前向;不是请求历史缓存 |
| Q / K | [T,16,128] | [T,4,128] | GPU · 逻辑 activation dtype | 当前层临时量;Q/K L2 归一化 |
| V / Z | [T,48,128] | [T,12,128] | GPU · 逻辑 activation dtype | 当前层临时量 |
| S recurrent state | [R,48,128,128] | [R,12,128,128] | GPU · config SSM=float32;引擎 auto 另行解析 | 每层每请求固定状态;FP32 时全局每序列每层3 MiB |
| conv history | [R,10240,3] | [R,2560,3] | GPU · 独立 conv cache dtype | 保留3个历史输入,4-tap含当前;额外投机槽位另计 |
| FFN gate / up | 各 [T,17408] | 各 [T,4352] | GPU · BF16逻辑激活,量化GEMM内部另计 | 单层临时量,执行后可复用 |
| 权重与缩放 | 按每层独立矩阵 | 列/行分片;norm复制 | GPU · FP8 block权重 + scales;排除模块非FP8 | 模型装载到卸载;推理时不被提示词更新 |
状态shape来源:MambaStateShapeCalculator ↗。模型 weight ≠ 当前 hidden activation ≠ 请求 cache,三者不能互换。
这一层究竟“扭转”了什么?
变的是向量数值,不是 token ID。将输入、本层两次修正与输出并排,看每个坐标是增加还是抵消。注意力混合历史,FFN 改变特征;最后由残差合在一起。
‖输入‖=1.2648 → ‖输出‖=1.2758
‖总修正 Δ‖=0.0512
同一 token 在同一层的4个教学坐标
| X输入 | -0.2227 | -0.6884 | 0.7540 | 0.7126 |
|---|---|---|---|---|
| Δmix | 0.0434 | -0.0385 | 0.0155 | 0.0067 |
| Δffn | -0.0097 | 0.0088 | 0.0013 | -0.0249 |
| X输出 | -0.1890 | -0.7181 | 0.7708 | 0.6944 |
同一 token,穿过全部64层后的数值轨迹
每行均来自实际执行的教学计算。点击任一行进入那一层。颜色表示正负和幅度;不做“某层负责语法/某层负责推理”的无证据分工。
全部64层的计算清单:同类型,同结构,不同参数
层号使用源码的0基索引:L03 是第4层。每一项都列出完整算子链;不要把48个 GDN 接成一段、再接16个 attention。真实顺序始终是 GDN → GDN → GDN → GQA,重复16次。
L00GDNEmbedding → [T,5120] → L01
model.language_model.layers.0(checkpoint 路径;加载后前缀可能重映射)。本层有自己的两个 norm、linear_attn + S/conv 和 dense MLP;参数与任何其他层不共享。
本层以固定状态压缩该层所见前缀。上一层的 S 不会直接传进本层;本层接收到的是上一层的 hidden 输出。
| 算子 | 计算 | 真实逻辑 shape |
|---|---|---|
| X⁽ℓ⁾ ∈ ℝᵀˣ⁵¹²⁰ | [T, 5120] | |
| U = X / √(mean(X², hidden) + ε) ⊙ γ | [T, 5120] → [T, 5120] | |
| [Q₀,K₀,V₀,Z]=U Wqkvz; a=U Wa; b=U Wb | Q/K [T,16,128] · V/Z [T,48,128] · a/b [T,48] | |
| cₜ=SiLU(Σᵢ₌₀³ wᵢ ⊙ QKV₀,ₜ₋ᵢ); q=normalize(q); k=normalize(k) | QKV [T,10240] → 同 shape;conv 历史 [10240,3] | |
| S̄=αSprev; e=v−S̄k; S=S̄+βekᵀ; o=S q/√dₖ | S [R,48,128,128];o [T,48,128] | |
| Ogate = RMSNorm(o) ⊙ SiLU(Z) | [T,48,128] → [T,6144] | |
| Δmix = Ogate Wo | [T,6144] × [6144,5120] → [T,5120] | |
| Y = X + Δmix | [T,5120] + [T,5120] → [T,5120] | |
| N = RMSNorm(Y) | [T,5120] → [T,5120] | |
| G=N Wgate; Uffn=N Wup | 各 [T,5120] × [5120,17408] → [T,17408] | |
| F = SiLU(G) ⊙ Uffn | [T,17408] ⊙ [T,17408] → [T,17408] | |
| Δffn = F Wdown | [T,17408] × [17408,5120] → [T,5120] | |
| X⁽ℓ⁺¹⁾ = Y + Δffn | [T,5120] → 下一层 [T,5120] |
输入来自embedding lookup;输出交给第1层。L0 的缓存只沿 token 时间轴延续;层间传递的是 hidden,不是整套 cache。
L01GDNL00 → [T,5120] → L02
L02GDNL01 → [T,5120] → L03
L03GQAL02 → [T,5120] → L04
L04GDNL03 → [T,5120] → L05
L05GDNL04 → [T,5120] → L06
L06GDNL05 → [T,5120] → L07
L07GQAL06 → [T,5120] → L08
L08GDNL07 → [T,5120] → L09
L09GDNL08 → [T,5120] → L10
L10GDNL09 → [T,5120] → L11
L11GQAL10 → [T,5120] → L12
L12GDNL11 → [T,5120] → L13
L13GDNL12 → [T,5120] → L14
L14GDNL13 → [T,5120] → L15
L15GQAL14 → [T,5120] → L16
L16GDNL15 → [T,5120] → L17
L17GDNL16 → [T,5120] → L18
L18GDNL17 → [T,5120] → L19
L19GQAL18 → [T,5120] → L20
L20GDNL19 → [T,5120] → L21
L21GDNL20 → [T,5120] → L22
L22GDNL21 → [T,5120] → L23
L23GQAL22 → [T,5120] → L24
L24GDNL23 → [T,5120] → L25
L25GDNL24 → [T,5120] → L26
L26GDNL25 → [T,5120] → L27
L27GQAL26 → [T,5120] → L28
L28GDNL27 → [T,5120] → L29
L29GDNL28 → [T,5120] → L30
L30GDNL29 → [T,5120] → L31
L31GQAL30 → [T,5120] → L32
L32GDNL31 → [T,5120] → L33
L33GDNL32 → [T,5120] → L34
L34GDNL33 → [T,5120] → L35
L35GQAL34 → [T,5120] → L36
L36GDNL35 → [T,5120] → L37
L37GDNL36 → [T,5120] → L38
L38GDNL37 → [T,5120] → L39
L39GQAL38 → [T,5120] → L40
L40GDNL39 → [T,5120] → L41
L41GDNL40 → [T,5120] → L42
L42GDNL41 → [T,5120] → L43
L43GQAL42 → [T,5120] → L44
L44GDNL43 → [T,5120] → L45
L45GDNL44 → [T,5120] → L46
L46GDNL45 → [T,5120] → L47
L47GQAL46 → [T,5120] → L48
L48GDNL47 → [T,5120] → L49
L49GDNL48 → [T,5120] → L50
L50GDNL49 → [T,5120] → L51
L51GQAL50 → [T,5120] → L52
L52GDNL51 → [T,5120] → L53
L53GDNL52 → [T,5120] → L54
L54GDNL53 → [T,5120] → L55
L55GQAL54 → [T,5120] → L56
L56GDNL55 → [T,5120] → L57
L57GDNL56 → [T,5120] → L58
L58GDNL57 → [T,5120] → L59
L59GQAL58 → [T,5120] → L60
L60GDNL59 → [T,5120] → L61
L61GDNL60 → [T,5120] → L62
L62GDNL61 → [T,5120] → L63
L63GQAL62 → [T,5120] → Final norm
第63层之后:向量才变成“下一个 token 的概率”
hfinal = RMSNorm(X⁶⁴[last]); logits = hfinal Wlm; p = softmax(logits / τ)
没有每层一个文字答案。 Wlm 的逻辑形状 [5120,248320];tie_word_embeddings=false,LM head 不与输入 embedding 绑定。标准生成只取待采样位置,得到 [待采样位置数,248320] 的 logits。logit 是未归一化分数,不是概率。
采样在完整前向之后。 温度、top-k、top-p 和惩罚等会改变选择方式;greedy 直接取最大 logit,随机采样按分布抽样。选出的 token 追加到序列,然后只让它经过下一轮64层,读取已建好的各层缓存。
教学 t4:最后一层输出 → final norm → 6项 LM head
| X⁶⁴ | -0.9603 | -0.2141 | 0.5276 | 0.7945 | ||
|---|---|---|---|---|---|---|
| norm | -1.4016 | -0.3125 | 0.7700 | 1.1596 | ||
| logits | 0.4429 | 0.0097 | -0.6928 | 0.7211 | -0.1869 | -0.1017 |
这6个候选只用于演示归一化;网络未训练,分布没有语言意义,不能当作 Qwen 对提示词的回答。中间位置的分布也只是教学检查,真实普通生成关注最后待预测位置。
Prefill 能并行,不是能偷看未来。 已知所有输入向量,所以 GEMM 可按多行批量计算;attention 仍用 causal mask。GDN 的块递推利用关联结构并行化。整个输出回答仍须逐轮生成,因为后一轮的输入 token 尚未采样。
提示词不改权重,状态会改。 W、norm 参数来自训练;一次推理通常固定不动。随着 prompt 和输出进入,变化的是 activations、GDN S/conv 与 K/V。请求结束后缓存可释放;后续独立请求不是在继续训练这份 checkpoint。
LM head、forward 和配置加载源码 ↗ · vocab / tie_word_embeddings 配置 ↗
ONE TOKEN JOURNEY
同一条路径,两种工作负载
prefill 处理许多已知 token,decode 每轮只推进一个新 token。引擎把它们放进同一个动态 token budget。
ACTIVE STAGE
OpenAI API 请求
解析 messages、采样参数与媒体引用。
自动播放仅移动高亮;系统开启 reduced-motion 时会自动禁用。
MEMORY LABS
把记忆机制拆到可操作
小尺寸实验不是模型仿真,而是用可见状态解释真实公式中的更新、共享与损失边界。
GDN 状态实验台
S̄ₜ = αₜSₜ₋₁; Sₜ = S̄ₜ + βₜ(vₜ − S̄ₜkₜ)kₜᵀ
门控 α 小,旧状态快速擦除;α 大,记忆延续更久。
Delta 写入 写的是预测误差,不是简单累加 value。
风险 多个 token 竞争固定状态,精确细节可能相互干扰。
GQA / Attention 实验台
A = softmax(QKᵀ / √256 + causal mask) · V
V0Q 0–5
V1Q 6–11
V2Q 12–17
V3Q 18–23
partial RoPE 每个 256-d Q/K head 只旋转 64 维(0.25)。
共享 六个 Q heads 共用一组 K/V,降低 cache 体积。
output gate 已安装源码在 O projection 前使用 sigmoid gate;GDN 输出门才使用 swish/SiLU。
PRECISION & CACHE
FP8 checkpoint,不等于一切都是 FP8
权重文件、线性层激活、attention KV 与 GDN/Mamba state 是四个不同的 dtype 决策。
weight tile
block-128 metadata 表示什么?
checkpoint 的 quantization_config 是 FP8 E4M3、动态 activation scheme,weight_block_size=[128,128]。含义是权重按二维 128×128 block 搭配缩放信息存储/反量化;它不是“每 128 个 token 一组”,也不规定 KV cache 或 recurrent state。
fp8_e4m3请求上下文生命周期auto / auto;不得由 FP8 checkpoint 反推请求生命周期 · 固定 shapeLOGICAL KV CALCULATOR
只计算 16 个全注意力层
公式:C × N × 16 layers × 2(K,V) × 4 KV heads × 256 × bytes
逻辑估算 ≠ vLLM 实际显存预留。实际还包含 block 对齐、hybrid page grouping、可能的复制、prefix cache 未使用页、allocator 元数据、graph capture 与 kernel workspace;GDN state 另算。
VLLM ENGINE
调度的单位,是下一小段工作
vLLM V1 统一调度 prompt 与 output token;continuous batching 发生在每个 engine step,而不是请求到达时一次性锁死批次。
Scheduler + Paged KV 模拟器
decode 请求每 tick 通常推进 1 token
长 prompt 被切成 chunk,填入剩余 token budget
prefix 命中复用已计算整块,跳过对应 prefill
block table 是一次间接寻址
逻辑 token 位置映射到非连续物理 page;请求增长时追加 block,结束时释放,不要求预留最大上下文的连续显存。
重放固定 shape 的执行图
CUDA/HIP graph 捕获减少 CPU launch 开销;不规则 shape 或未捕获 batch 仍可走 eager。它是执行优化,不改变 attention/GDN 数学。
同一模型,多条 kernel 路径
当前 profile 指定 TRITON_ATTN,且 vLLM 源码在 ROCm 平台选择 forward_hip;GDN prefill/decode、attention 与 GEMM 可各自分派。
TP4 / RDNA4
四张 GPU 并不是一张 128GB 大卡
权重和 heads 沿 tensor-parallel 维切开;每个 rank 计算局部结果,在 row-parallel 边界同步。
Column/row-parallel 线性层按输出或输入维切片;norm 等小权重可复制。
GDN recurrence、GQA、partial RoPE、FFN、MTP 训练头、vision encoder。
TP 切分、scheduler、hybrid cache manager、PagedAttention、prefix caching、graph capture、sampling。
gfx1201 编译目标、HIP runtime、Triton AMD attention/GDN kernels、RCCL collective 与设备内存。
MULTIMODAL / THINKING / MTP
三条容易被放错位置的路径
视觉处理发生在语言 backbone 之前;思考模式是 token/模板行为;MTP 是候选 token 生成与验证路径。
不是另一套神经网络
Qwen3.8 默认 thinking;chat template 和 API 参数控制是否生成/保留 reasoning tokens。它们仍沿同一 64 层自回归路径,占上下文与 decode 轮次。
主模型之后的候选路径
config 显示 1 个 MTP hidden layer;部署只有启用 speculative config 时,vLLM 才用 MTP 产生多个候选并由主模型验证。当前 27B profile 的 speculative config 为空。
不是 vocab 查表得到的像素 token
processor 生成视觉输入与占位;vision encoder 输出 5120 维向量,替换语言 embedding 流中的视觉位置,然后一起进入 backbone。
EVIDENCE MATRIX
每个结论,都知道自己站在哪一级
官方资料、配置/源码推导、教学类比和服务器快照严格分开;本教程不复述或编造 benchmark。
术语表
- Prefill
- 并行处理 prompt token,建立后续 decode 所需 cache/state。
- Decode
- 每个活跃序列每轮推进一个新 token,并更新状态。
- GDN
- Gated DeltaNet;用固定大小矩阵状态执行门控 delta 更新。
- GQA
- Grouped-Query Attention;多组 Q heads 共享较少 K/V heads。
- KV page
- 保存固定数量 token 的 K/V 的物理 cache 块。
- Continuous batching
- 每个 engine step 动态重组正在运行与新到达的请求。
- Prefix caching
- 按完整 cache block 复用相同 token prefix 的已计算状态。
- TP4
- tensor parallel size 4;一个模型运算跨四个 rank 切分。
- MTP
- Multi-Token Prediction;为 speculative decoding 提供多个候选 token。