<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Bevisy's Blogs</title><link>https://bevisy.github.io/post/</link><description>Recent content in Posts on Bevisy's Blogs</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 27 Jul 2026 11:30:00 +0800</lastBuildDate><atom:link href="https://bevisy.github.io/post/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM 术语全景图（十一）：术语关系总览与核心趋势</title><link>https://bevisy.github.io/p/llm-terminology-11-overview-trends/</link><pubDate>Mon, 27 Jul 2026 11:30:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-11-overview-trends/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-11-overview-trends/11.png" alt="Featured image of post LLM 术语全景图（十一）：术语关系总览与核心趋势" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 11 篇（系列收尾），不引入新概念，而是把前 10 篇的 64 个术语放回它们的关系网络中：注意力机制的演进谱系、模型与术语的对照、并行策略的组合、量化方法的选型、GPU 精度与算力。最后给出 10 条核心趋势和参考资源索引。
主要参考来源：前 10 篇引用的全部论文与技术报告&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇把-64-个术语放回关系网络"&gt;开篇：把 64 个术语放回关系网络
&lt;/h2&gt;&lt;p&gt;本篇是系列收尾，不引入新概念，而是把前 10 篇的 64 个术语放回它们的关系网络中：注意力机制的演进谱系、模型与术语的对照、并行策略的组合、量化方法的选型、GPU 精度与算力。最后给出 10 条核心趋势和参考资源索引。&lt;/p&gt;
&lt;h2 id="注意力机制演进关系图"&gt;注意力机制演进关系图
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;MHA (原始 Transformer)
├── MQA (极端共享 K/V，1 组)
├── GQA (分组共享 K/V，当前主流)
│ └── + QK-Norm (稳定性增强)
├── MLA (低维压缩 K/V，DeepSeek 首创)
│ ├── + DSA (稀疏选择，DeepSeek V3.2)
│ │ └── + IndexShare (复用 indexer，GLM-5.2)
│ └── + CSA/HCA (序列压缩，DeepSeek V4)
├── CCA (压缩空间直接计算，ZAYA1)
├── Lightning Attention (线性注意力，MiniMax)
├── KDA (改进线性注意力，Kimi Linear)
├── SWA (固定窗口)
│ └── + Global (混合，Gemma 3/Laguna)
├── NoPE (无位置编码层)
└── Hybrid (以上混合，2025-2026 趋势)
 ├── 3:1 线性+全局 (Kimi Linear, Qwen3-Next)
 ├── 5:1 SWA+全局 (Gemma 3)
 └── CSA+HCA 交替 (DeepSeek V4)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="模型与术语对照表"&gt;模型与术语对照表
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模型&lt;/th&gt;
					&lt;th&gt;注意力&lt;/th&gt;
					&lt;th&gt;架构&lt;/th&gt;
					&lt;th&gt;位置编码&lt;/th&gt;
					&lt;th&gt;后训练&lt;/th&gt;
					&lt;th&gt;特殊技术&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek V3&lt;/td&gt;
					&lt;td&gt;MLA&lt;/td&gt;
					&lt;td&gt;MoE (256+1)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RL&lt;/td&gt;
					&lt;td&gt;MTP, 无辅助损失路由&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek R1&lt;/td&gt;
					&lt;td&gt;MLA&lt;/td&gt;
					&lt;td&gt;MoE (256+1)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + GRPO&lt;/td&gt;
					&lt;td&gt;RLVR, 蒸馏, &amp;ldquo;Aha Moment&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek V4&lt;/td&gt;
					&lt;td&gt;CSA + HCA&lt;/td&gt;
					&lt;td&gt;MoE + mHC&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;mHC, Muon, 序列压缩&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GLM-5&lt;/td&gt;
					&lt;td&gt;MLA + DSA&lt;/td&gt;
					&lt;td&gt;MoE (256+1)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RL&lt;/td&gt;
					&lt;td&gt;DSA&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GLM-5.2&lt;/td&gt;
					&lt;td&gt;MLA + DSA + IndexShare&lt;/td&gt;
					&lt;td&gt;MoE (256+1)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RL&lt;/td&gt;
					&lt;td&gt;IndexShare (indexer 复用 4 层)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kimi K2&lt;/td&gt;
					&lt;td&gt;MLA&lt;/td&gt;
					&lt;td&gt;MoE (384+1)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RL&lt;/td&gt;
					&lt;td&gt;MuonClip&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kimi Linear&lt;/td&gt;
					&lt;td&gt;KDA + MLA (3:1)&lt;/td&gt;
					&lt;td&gt;MoE&lt;/td&gt;
					&lt;td&gt;NoPE (线性层)&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;KDA, 线性注意力&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MiniMax-01/M1&lt;/td&gt;
					&lt;td&gt;Lightning Attention + Full&lt;/td&gt;
					&lt;td&gt;MoE (32)&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;RL (CISPO)&lt;/td&gt;
					&lt;td&gt;闪电注意力, 1M 上下文&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MiniMax M2&lt;/td&gt;
					&lt;td&gt;Full Attention (回归)&lt;/td&gt;
					&lt;td&gt;MoE&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;RL&lt;/td&gt;
					&lt;td&gt;放弃线性注意力&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3&lt;/td&gt;
					&lt;td&gt;GQA + QK-Norm&lt;/td&gt;
					&lt;td&gt;Dense / MoE&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + DPO/GRPO&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3-Next&lt;/td&gt;
					&lt;td&gt;Gated DeltaNet + Full (3:1)&lt;/td&gt;
					&lt;td&gt;MoE&lt;/td&gt;
					&lt;td&gt;NoPE (线性层)&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;线性注意力混合&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Llama 3/4&lt;/td&gt;
					&lt;td&gt;GQA&lt;/td&gt;
					&lt;td&gt;Dense / MoE&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RLHF&lt;/td&gt;
					&lt;td&gt;Chunked attention (Llama 4)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gemma 3&lt;/td&gt;
					&lt;td&gt;GQA + SWA (5:1) + QK-Norm&lt;/td&gt;
					&lt;td&gt;Dense&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;SFT + RLHF&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gemma 4&lt;/td&gt;
					&lt;td&gt;MQA + Cross-Layer KV&lt;/td&gt;
					&lt;td&gt;Dense / MoE&lt;/td&gt;
					&lt;td&gt;RoPE&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;KV 共享, Per-Layer Emb&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GPT-4/o1&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;RLHF&lt;/td&gt;
					&lt;td&gt;推理模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Claude 3.5/4&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;(闭源)&lt;/td&gt;
					&lt;td&gt;Constitutional AI&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注：DeepSeek V3/R1 技术报告未明确记载 QK-Norm，故注意力列只标 MLA。QK-Norm 的采用模型见篇 02。&lt;/p&gt;
&lt;h2 id="并行策略关系图"&gt;并行策略关系图
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;训练并行
├── DP (数据并行) — 每卡完整模型，分数据
│ ├── ZeRO-1 (分片优化器状态)
│ ├── ZeRO-2 (+ 分片梯度)
│ ├── ZeRO-3 / FSDP (+ 分片参数)
│ │ └── ZeRO-Infinity (卸载到 CPU/NVMe)
│ └── 嵌套 FSDP (按层分片)
├── TP (张量并行) — 层内切分权重，NVLink 域
│ ├── Attention: Q/K/V 列并行 → 输出行并行
│ └── FFN: 第1层列并行 → 第2层行并行
├── PP (流水线并行) — 层间切分，可跨节点
│ ├── GPipe (微批次填充)
│ └── 1F1B (交替调度，省激活内存)
├── EP (专家并行) — MoE 专用，All-to-All 路由
├── CP (上下文并行) — 序列切分，超长上下文
│ ├── Ring Attention (环形 KV 传递)
│ └── Ulysses (All-to-All head 重排)
└── SP (序列并行) — TP 辅助，切分 LayerNorm/Dropout

推理并行（通常更简单）
├── TP (张量并行) — 多卡共服务一个请求
├── EP (专家并行) — MoE 推理标配
├── CP (上下文并行) — 1M token 超长上下文
└── 分离式 — Prefill 池 + Decode 池
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="量化方法对比"&gt;量化方法对比
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;精度&lt;/th&gt;
					&lt;th&gt;硬件要求&lt;/th&gt;
					&lt;th&gt;校准&lt;/th&gt;
					&lt;th&gt;精度损失&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GPTQ&lt;/td&gt;
					&lt;td&gt;INT4/INT8&lt;/td&gt;
					&lt;td&gt;A100+&lt;/td&gt;
					&lt;td&gt;需要&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1%&lt;/td&gt;
					&lt;td&gt;权重量化，通用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AWQ&lt;/td&gt;
					&lt;td&gt;INT4/INT8&lt;/td&gt;
					&lt;td&gt;A100+&lt;/td&gt;
					&lt;td&gt;需要&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1%&lt;/td&gt;
					&lt;td&gt;权重量化，快于 GPTQ&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SmoothQuant&lt;/td&gt;
					&lt;td&gt;INT8&lt;/td&gt;
					&lt;td&gt;A100+&lt;/td&gt;
					&lt;td&gt;需要&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1%&lt;/td&gt;
					&lt;td&gt;W8A8，激活也量化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP8&lt;/td&gt;
					&lt;td&gt;FP8&lt;/td&gt;
					&lt;td&gt;Hopper+&lt;/td&gt;
					&lt;td&gt;可选&lt;/td&gt;
					&lt;td&gt;&amp;lt; 0.5%&lt;/td&gt;
					&lt;td&gt;推理首选，算力翻倍&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GGUF&lt;/td&gt;
					&lt;td&gt;2-8 bit&lt;/td&gt;
					&lt;td&gt;CPU/Metal&lt;/td&gt;
					&lt;td&gt;无需&lt;/td&gt;
					&lt;td&gt;可控&lt;/td&gt;
					&lt;td&gt;消费级硬件本地部署&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;QAT&lt;/td&gt;
					&lt;td&gt;任意&lt;/td&gt;
					&lt;td&gt;同训练&lt;/td&gt;
					&lt;td&gt;训练&lt;/td&gt;
					&lt;td&gt;最小&lt;/td&gt;
					&lt;td&gt;精度要求极高场景&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="gpu-精度与算力对照"&gt;GPU 精度与算力对照
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;精度&lt;/th&gt;
					&lt;th&gt;H100 算力&lt;/th&gt;
					&lt;th&gt;B200 算力&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;备注&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;FP32&lt;/td&gt;
					&lt;td&gt;67 TFLOPS&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;优化器状态&lt;/td&gt;
					&lt;td&gt;非 Tensor Core&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TF32&lt;/td&gt;
					&lt;td&gt;495 TFLOPS&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;兼容 FP32&lt;/td&gt;
					&lt;td&gt;自动降精度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BF16&lt;/td&gt;
					&lt;td&gt;989 TFLOPS&lt;/td&gt;
					&lt;td&gt;2.2 PFLOPS&lt;/td&gt;
					&lt;td&gt;训练默认&lt;/td&gt;
					&lt;td&gt;Tensor Core&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP16&lt;/td&gt;
					&lt;td&gt;989 TFLOPS&lt;/td&gt;
					&lt;td&gt;2.2 PFLOPS&lt;/td&gt;
					&lt;td&gt;推理/训练&lt;/td&gt;
					&lt;td&gt;需 loss scaling&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP8&lt;/td&gt;
					&lt;td&gt;1979 TFLOPS&lt;/td&gt;
					&lt;td&gt;4.5 PFLOPS&lt;/td&gt;
					&lt;td&gt;推理/训练&lt;/td&gt;
					&lt;td&gt;Hopper 新增&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;INT8&lt;/td&gt;
					&lt;td&gt;1979 TFLOPS&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;推理&lt;/td&gt;
					&lt;td&gt;需校准&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP4&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;9 PFLOPS&lt;/td&gt;
					&lt;td&gt;推理&lt;/td&gt;
					&lt;td&gt;Blackwell 新增&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="核心趋势总结"&gt;核心趋势总结
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KV Cache 是第一瓶颈&lt;/strong&gt;：MLA → DSA → CSA/HCA → 线性注意力，所有创新都围绕降低 KV Cache 成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合架构成为主流&lt;/strong&gt;：纯完整注意力 → 3:1 / 5:1 混合，完整注意力成为稀缺资源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE 普及&lt;/strong&gt;：大模型几乎全部 MoE 化，激活比持续下降（DeepSeek V4 ~4%）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RL 驱动推理能力&lt;/strong&gt;：GRPO/RLVR 替代传统 RLHF，涌现推理行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练优化器更新&lt;/strong&gt;：AdamW → Muon，收敛效率提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;残差连接也在进化&lt;/strong&gt;：标准残差 → mHC 多残差流，信息通路更宽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FP8 取代 INT8&lt;/strong&gt;：Hopper GPU 原生 FP8 支持，浮点量化几乎无损且算力翻倍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理分离式架构&lt;/strong&gt;：Prefill/Decode 分池部署，各阶段独立优化，吞吐提升 30-60%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行策略组合化&lt;/strong&gt;：大模型训练标配 TP+EP+PP+DP/ZeRO 多维并行，推理标配 TP+EP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PEFT 成为微调标配&lt;/strong&gt;：LoRA/QLoRA 使单卡微调 70B 模型成为可能，多 LoRA 热切换服务&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇是系列收尾，不引入新概念，而是把前 10 篇的 64 个术语放回关系网络：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;演进谱系图&lt;/strong&gt;把注意力机制从 MHA 到 MLA、CSA/HCA、线性注意力、混合架构的分支与组合画在一棵树上，让前两篇的概念回到同一张图里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型与术语对照表&lt;/strong&gt;把 15 个代表模型按注意力、架构、位置编码、后训练、特殊技术五列对齐，读者可横向对照&amp;quot;谁用了什么&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行策略关系图&lt;/strong&gt;把训练侧的 DP/TP/PP/EP/CP/SP 与推理侧的 TP/EP/CP/分离式分别画出，呼应篇 6。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化方法对比表&lt;/strong&gt;把 GPTQ/AWQ/SmoothQuant/FP8/GGUF/QAT 按精度、硬件、校准、精度损失、适用场景五列对齐，呼应篇 8。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU 精度与算力对照表&lt;/strong&gt;把 FP32 到 FP4 的算力与用途对齐，呼应篇 7。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心趋势 10 条&lt;/strong&gt;浓缩全系列主线：KV Cache 是第一瓶颈、混合架构主流化、MoE 普及、RL 驱动推理、优化器更新、残差进化、FP8 取代 INT8、推理分离式架构、并行策略组合化、PEFT 成微调标配。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本篇的价值不在于新知识，而在于把分散在 10 篇里的术语重新编织成一张可查阅的关系网——单篇看细节，本篇看整体。&lt;/p&gt;
&lt;h2 id="参考资源汇总"&gt;参考资源汇总
&lt;/h2&gt;&lt;h3 id="核心参考文章"&gt;核心参考文章
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;The Big LLM Architecture Comparison&amp;rdquo;: &lt;a class="link" href="https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;A Visual Guide to Attention Variants&amp;rdquo;: &lt;a class="link" href="https://magazine.sebastianraschka.com/p/visual-attention-variants" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/visual-attention-variants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;Recent Developments in LLM Architectures&amp;rdquo; (CSA/HCA/mHC): &lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;From DeepSeek V3 to V3.2&amp;rdquo;: &lt;a class="link" href="https://magazine.sebastianraschka.com/p/technical-deepseek" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/technical-deepseek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;GLM-5.2 IndexShare&amp;rdquo;: &lt;a class="link" href="https://sebastianraschka.com/blog/2026/glm-5-2-indexshare.html" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/blog/2026/glm-5-2-indexshare.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;A Dream of Spring for Open-Weight LLMs&amp;rdquo; (MiniMax/Qwen/Ling): &lt;a class="link" href="https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sebastian Raschka &amp;ldquo;From GPT-2 to gpt-oss&amp;rdquo;: &lt;a class="link" href="https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LLM Architecture Gallery: &lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="核心视频"&gt;核心视频
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Hybrid Attention and Gated DeltaNet: How 2026 LLMs Actually Work&amp;rdquo;: &lt;a class="link" href="https://www.youtube.com/watch?v=SH6Cyhunl8s" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=SH6Cyhunl8s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;LLM Architecture in 2026&amp;rdquo; (Sebastian Raschka 播客): &lt;a class="link" href="https://www.youtube.com/watch?v=Y6APnyZT6XU" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=Y6APnyZT6XU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yannic Kilcher &amp;ldquo;GRPO Explained&amp;rdquo;: &lt;a class="link" href="https://www.youtube.com/watch?v=bAWV_yrqx4w" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=bAWV_yrqx4w&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="重要论文索引arxiv-链接"&gt;重要论文索引（arXiv 链接）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Attention Is All You Need&amp;rdquo; (Transformer 原始论文): &lt;a class="link" href="https://arxiv.org/abs/1706.03762" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1706.03762&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;RoPE / RoFormer&amp;rdquo; (旋转位置编码): &lt;a class="link" href="https://arxiv.org/abs/2104.09864" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2104.09864&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;YaRN&amp;rdquo; (上下文扩展): &lt;a class="link" href="https://arxiv.org/abs/2309.00071" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2309.00071&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;GQA&amp;rdquo; (分组查询注意力): &lt;a class="link" href="https://arxiv.org/abs/2305.13245" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2305.13245&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;FlashAttention&amp;rdquo; (闪存注意力): &lt;a class="link" href="https://arxiv.org/abs/2205.14135" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2205.14135&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;PagedAttention / vLLM&amp;rdquo; (分页注意力): &lt;a class="link" href="https://arxiv.org/abs/2309.06180" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2309.06180&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Speculative Decoding&amp;rdquo; (推测解码): &lt;a class="link" href="https://arxiv.org/abs/2211.17192" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2211.17192&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;DPO&amp;rdquo; (直接偏好优化): &lt;a class="link" href="https://arxiv.org/abs/2305.18290" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2305.18290&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;DeepSeekMath / GRPO&amp;rdquo; (组相对策略优化): &lt;a class="link" href="https://arxiv.org/abs/2402.03300" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2402.03300&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Hyper-Connections&amp;rdquo; (超连接，mHC 前身): &lt;a class="link" href="https://arxiv.org/abs/2409.19606" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2409.19606&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;CCA&amp;rdquo; (压缩卷积注意力): &lt;a class="link" href="https://arxiv.org/abs/2510.04476" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2510.04476&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本系列共 11 篇，本文是第 11 篇。系列导读见：&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-series-guide/" &gt;LLM 术语全景图：系列导读&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LLM 术语全景图（十）：推理服务——Prefill Decode 与性能指标</title><link>https://bevisy.github.io/p/llm-terminology-10-inference-serving/</link><pubDate>Mon, 27 Jul 2026 11:15:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-10-inference-serving/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-10-inference-serving/10.png" alt="Featured image of post LLM 术语全景图（十）：推理服务——Prefill Decode 与性能指标" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 10 篇，覆盖推理服务与性能指标的 6 个概念：Prefill/Decode、TTFT、TPOT、Prefix Caching / RadixAttention、Chunked Prefill、Disaggregated Inference。
主要参考框架/服务：vLLM、SGLang、TGI、DeepSeek 推理服务、Sarathi-Serve、DistServe、Splitwise&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇推理服务的两个阶段和两个指标"&gt;开篇：推理服务的两个阶段和两个指标
&lt;/h2&gt;&lt;p&gt;LLM 推理不是一次&amp;quot;模型前向&amp;quot;，而是两个特性截然不同的阶段。Prefill（预填充）一次性处理整个 prompt，构造 N×N 注意力矩阵、打满 GPU 算力，是 compute-bound；Decode（解码）逐 token 生成，每步都要读回全部模型权重与 KV Cache、算力利用率往往低于 5%，是 memory-bound。用户感知到的两个维度恰好对应这两阶段：TTFT（首 token 延迟）由 prefill 主导，决定&amp;quot;是不是即时响应&amp;quot;；TPOT（单 token 生成时间）由 decode 主导，决定&amp;quot;是不是流畅&amp;quot;。高效推理服务（vLLM、SGLang）的所有优化都围绕这两阶段展开——Chunked Prefill 把长 prompt 切块，避免 prefill 阻塞正在 decode 的请求；Prefix Caching 复用历史 KV，多轮对话 TTFT 降低 50-90%；Disaggregated Inference 干脆把两阶段分池部署，prefill 池高算力、decode 池高带宽，吞吐再提 30-60%。本篇按&amp;quot;两阶段 → 两指标 → 三类优化&amp;quot;的脉络梳理这 6 个术语。&lt;/p&gt;
&lt;h2 id="推理服务与性能指标inference-serving--metrics"&gt;推理服务与性能指标（Inference Serving &amp;amp; Metrics）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;LLM 推理不是简单的&amp;quot;模型前向&amp;quot;。高效推理服务需要理解 prefill/decode 两阶段、关键延迟指标和缓存策略。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="prefilldecode"&gt;Prefill/Decode
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：预填充与解码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：LLM 推理分两个阶段。Prefill（预填充）一次性处理整个 prompt，计算密集（compute-bound）；Decode（解码）逐 token 生成，内存密集（memory-bound）。两阶段特性不同，优化策略也不同。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：两阶段的本质区别：&lt;/p&gt;
&lt;p&gt;Prefill 阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：完整 prompt（N 个 token）&lt;/li&gt;
&lt;li&gt;计算：N × N 注意力矩阵 + N 层 FFN&lt;/li&gt;
&lt;li&gt;特性：compute-bound，GPU 算力打满&lt;/li&gt;
&lt;li&gt;耗时：与 prompt 长度 N 的平方成正比（注意力）+ 线性（FFN）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Decode 阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入：逐个 token（1 个/步）&lt;/li&gt;
&lt;li&gt;计算：1 × N_kv 注意力（与所有历史 KV）+ N 层 FFN&lt;/li&gt;
&lt;li&gt;特性：memory-bound，需读取全部权重 + KV Cache，但计算量小&lt;/li&gt;
&lt;li&gt;耗时：与模型大小成正比（读权重的时间），与 KV Cache 大小成正比&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么 decode 慢：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每生成 1 个 token 需读取全部模型权重（如 70B 模型 = 140GB BF16）&lt;/li&gt;
&lt;li&gt;H100 HBM 带宽 3.35 TB/s → 读 140GB 需 ~42ms → 仅 ~24 token/s&lt;/li&gt;
&lt;li&gt;算力远未打满（利用率可能 &amp;lt; 5%）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优化策略差异：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefill：Flash Attention（减少 IO）、TP（并行计算）、Chunked Prefill&lt;/li&gt;
&lt;li&gt;Decode：量化（减少权重大小 → 减少读取时间）、 batching（多请求分摊权重读取）、推测解码（减少 decode 步数）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Continuous Batching 的关键：允许不同请求同时处于 prefill 和 decode 阶段，GPU 持续高利用率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：vLLM、SGLang、TGI 等推理框架的基础概念&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/design/v1/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/design/v1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/blog/martinigoyanes/llm-inference-at-scale-with-tgi" target="_blank" rel="noopener"
 &gt;https://huggingface.co/blog/martinigoyanes/llm-inference-at-scale-with-tgi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="time-to-first-token"&gt;Time To First Token
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：TTFT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：首 Token 延迟&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：从发送请求到收到第一个生成 token 的时间。主要由 prefill 阶段决定，是用户体验的关键指标（尤其是对话场景）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：TTFT 的构成：&lt;/p&gt;
&lt;p&gt;TTFT = 排队延迟 + 网络延迟 + Prefill 计算时间&lt;/p&gt;
&lt;p&gt;排队延迟：请求到达时 GPU 正忙，需等待当前 batch 处理完
网络延迟：请求传输到推理服务器的时间（通常可忽略）
Prefill 计算时间：处理 prompt 的时间&lt;/p&gt;
&lt;p&gt;Prefill 时间估算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;短 prompt（100 token）：~10-50ms&lt;/li&gt;
&lt;li&gt;中等 prompt（1K token）：~100-500ms&lt;/li&gt;
&lt;li&gt;长 prompt（10K token）：~1-5s&lt;/li&gt;
&lt;li&gt;超长 prompt（100K token）：~10-60s（无优化时）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优化 TTFT 的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chunked Prefill：将长 prompt 分块处理，避免长 prefill 阻塞 decode&lt;/li&gt;
&lt;li&gt;Prefix Caching：如果多个请求共享相同前缀（如 system prompt），缓存其 KV&lt;/li&gt;
&lt;li&gt;TP：多卡并行 prefill 加速&lt;/li&gt;
&lt;li&gt;量化：减少权重读取（对长 prompt 的 FFN 计算有帮助）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型目标：对话场景 TTFT &amp;lt; 200ms，用户感知&amp;quot;即时响应&amp;quot;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：vLLM、SGLang 推理框架；LLM 推理服务标准指标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/design/metrics.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/design/metrics.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="time-per-output-token"&gt;Time Per Output Token
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：TPOT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：单 Token 生成时间&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：decode 阶段平均生成一个 token 的时间。由 memory-bound 特性决定，是吞吐和延迟的关键指标。TPOT 的倒数即为单请求解码速度（token/s）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：TPOT 的决定因素：&lt;/p&gt;
&lt;p&gt;TPOT ≈ (模型权重大小 + KV Cache 大小) / HBM 带宽&lt;/p&gt;
&lt;p&gt;示例（70B BF16, 8K 上下文, H100 80GB）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权重：140GB&lt;/li&gt;
&lt;li&gt;KV Cache：~8GB&lt;/li&gt;
&lt;li&gt;HBM 带宽：3.35 TB/s&lt;/li&gt;
&lt;li&gt;TPOT ≈ 148GB / 3.35TB/s ≈ 44ms → ~23 token/s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优化 TPOT 的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;量化：INT4/FP8 权重 → 读取量减半/四分之一 → TPOT 减半/四分之一&lt;/li&gt;
&lt;li&gt;Batching：多请求共享一次权重读取 → 每请求均摊 TPOT 降低&lt;/li&gt;
&lt;li&gt;MLA/GQA：减少 KV Cache → 减少 KV 读取时间&lt;/li&gt;
&lt;li&gt;推测解码：一次验证多 token → 有效 TPOT 降低&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TPOT vs 吞吐：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单请求 TPOT：1 个请求的解码速度（用户体验）&lt;/li&gt;
&lt;li&gt;批量吞吐：batch_size / TPOT（系统效率）&lt;/li&gt;
&lt;li&gt;增大 batch 可提高吞吐但不变 TPOT（权重只需读一次，多请求共享）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型目标：对话场景 TPOT &amp;lt; 50ms（20+ token/s），用户感知流畅。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：vLLM、SGLang 推理框架；LLM 推理服务标准指标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/design/metrics.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/design/metrics.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="prefix-caching--radixattention"&gt;Prefix Caching / RadixAttention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：前缀缓存 / 基数注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：缓存已计算 prompt 的 KV Cache，当新请求共享相同前缀时直接复用，跳过 prefill。SGLang 的 RadixAttention 用基数树管理缓存，实现自动 prefix 复用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Prefix Caching 的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多轮对话：每轮都包含完整历史 → 历史部分的 KV 可复用&lt;/li&gt;
&lt;li&gt;System prompt：所有请求共享同一 system prompt → 缓存其 KV&lt;/li&gt;
&lt;li&gt;Few-shot：相同示例前缀 → KV 复用&lt;/li&gt;
&lt;li&gt;Agent 工作流：多次调用中共享上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;计算每个 prompt 的 hash（基于 token 序列）&lt;/li&gt;
&lt;li&gt;新请求到达时，检查是否有前缀的 KV Cache 命中&lt;/li&gt;
&lt;li&gt;命中部分跳过 prefill，只 prefill 不命中部分&lt;/li&gt;
&lt;li&gt;新计算的 KV 也存入缓存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;vLLM 的实现：Automatic Prefix Caching，基于 PagedAttention 的 block 管理，自动检测前缀匹配。&lt;/p&gt;
&lt;p&gt;SGLang RadixAttention：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用基数树（Radix Tree）管理 KV Cache&lt;/li&gt;
&lt;li&gt;树的每条路径代表一个 token 序列前缀&lt;/li&gt;
&lt;li&gt;新请求沿树匹配最长前缀，未命中部分分支新建&lt;/li&gt;
&lt;li&gt;LRU 淘汰策略管理缓存容量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多轮对话 TTFT 降低 50-90%（历史部分跳过 prefill）&lt;/li&gt;
&lt;li&gt;System prompt 场景几乎消除重复计算&lt;/li&gt;
&lt;li&gt;对 Agent 工作流（重复调用）效果显著&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;SGLang RadixAttention&amp;rdquo; (Zheng et al., 2023, arXiv:2312.07104)；vLLM Automatic Prefix Caching&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://lmsys.org/blog/2024-01-17-sglang/" target="_blank" rel="noopener"
 &gt;https://lmsys.org/blog/2024-01-17-sglang/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/automatic_prefix_caching.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/automatic_prefix_caching.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chunked-prefill"&gt;Chunked Prefill
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：分块预填充&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将长 prompt 的 prefill 分成多个小块，与 decode 请求混合调度，避免长 prefill 阻塞正在 decode 的请求。vLLM V1 的核心调度策略之一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Chunked Prefill 解决的问题：&lt;/p&gt;
&lt;p&gt;无 Chunked Prefill 时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 10K token 的 prefill 请求到达&lt;/li&gt;
&lt;li&gt;GPU 花 ~2s 处理这个 prefill&lt;/li&gt;
&lt;li&gt;正在 decode 的其他请求全部暂停 2s → TPOT 暴涨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chunked Prefill 方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将 10K token 的 prefill 分成 20 个 512-token 块&lt;/li&gt;
&lt;li&gt;每个 iteration 只处理 1 个 prefill 块 + 当前所有 decode token&lt;/li&gt;
&lt;li&gt;prefill 和 decode 在同一 batch 混合执行&lt;/li&gt;
&lt;li&gt;20 个 iteration 后 prefill 完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;decode 请求每步都能执行 → TPOT 不受长 prefill 影响&lt;/li&gt;
&lt;li&gt;prefill 总时间略增（分块效率略低），但整体延迟体验更好&lt;/li&gt;
&lt;li&gt;GPU 持续高利用率（prefill 块 + decode 混合填满算力）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vLLM V1 默认开启 Chunked Prefill，chunk_size 通常 512~2048 token。&lt;/p&gt;
&lt;p&gt;与 Continuous Batching 的关系：Chunked Prefill 是 Continuous Batching 的增强——传统 Continuous Batching 只混合不同 decode 请求，Chunked Prefill 进一步混合 prefill 和 decode。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：vLLM V1；SGLang；Sarathi-Serve (arXiv:2308.16369)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/design/v1/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/design/v1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2308.16369" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2308.16369&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="disaggregated-inference"&gt;Disaggregated Inference
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：Disaggregated Inference / Prefill-Decode 分离&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：分离式推理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将 prefill 和 decode 分配到不同的 GPU 池执行，各池针对各自阶段优化（prefill 池用高算力配置，decode 池用高带宽配置），通过 KV Cache 传输连接两阶段。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：分离式推理的动机：&lt;/p&gt;
&lt;p&gt;Prefill 和 Decode 的计算特性完全不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefill：compute-bound，需要高 FLOPS（TP 度数高）&lt;/li&gt;
&lt;li&gt;Decode：memory-bound，需要高 HBM 带宽（batch 大更高效）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统推理（混合在同一 GPU 池）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一 GPU 同时做 prefill 和 decode → 两阶段互相干扰&lt;/li&gt;
&lt;li&gt;prefill 阻塞 decode（或 chunked prefill 增加 prefill 延迟）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分离式推理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prefill 池：专门处理 prefill，高 TP 度数，compute-optimized&lt;/li&gt;
&lt;li&gt;计算完的 KV Cache 传输到 Decode 池&lt;/li&gt;
&lt;li&gt;Decode 池：专门做 decode，大 batch（多请求共享权重读取），memory-optimized&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;KV Cache 传输：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨池传输 KV Cache 是主要开销&lt;/li&gt;
&lt;li&gt;通过高速互连（NVLink/InfiniBand）传输&lt;/li&gt;
&lt;li&gt;可在 prefill 最后几层时就启动传输（overlap）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两阶段各自独立优化，吞吐提升 30-60%&lt;/li&gt;
&lt;li&gt;prefill 不会被 decode 拖慢，decode 不会被 prefill 阻塞&lt;/li&gt;
&lt;li&gt;可根据负载独立扩缩两池&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实践：DeepSeek 推理服务采用分离式架构；vLLM 正在支持；Moonshot/SGLang 也在探索。&lt;/p&gt;
&lt;p&gt;局限：KV Cache 传输增加延迟和复杂度，需要高速互连；对短序列收益小。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;DistServe: Disaggregating Prefill and Decoding&amp;rdquo; (Zhong et al., 2024, arXiv:2401.09670)；DeepSeek 推理服务；Splitwise (arXiv:2311.18677)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2401.09670" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2401.09670&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/design/v1/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/design/v1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 6 个推理服务术语沿&amp;quot;两阶段 → 两指标 → 三类优化&amp;quot;的脉络归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prefill/Decode&lt;/strong&gt; 是推理的两个阶段：前者一次性处理整个 prompt，compute-bound，GPU 算力打满；后者逐 token 生成，memory-bound，每步读全部权重但算力利用率常 &amp;lt; 5%。两阶段特性截然不同，优化策略也不同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTFT&lt;/strong&gt;（首 token 延迟）由 prefill 主导，决定&amp;quot;是不是即时响应&amp;quot;，对话场景尤其敏感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TPOT&lt;/strong&gt;（单 token 生成时间）由 decode 主导，决定&amp;quot;是不是流畅&amp;quot;；其倒数即单请求解码速度（token/s）。增大 batch 能提高系统吞吐却不改变单请求 TPOT，因为权重只需读一次、多请求共享。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix Caching / RadixAttention&lt;/strong&gt; 缓存已计算 prompt 的 KV，新请求共享前缀时直接复用跳过 prefill；SGLang 的 RadixAttention 用基数树管理缓存，多轮对话 TTFT 可降至 1/10。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chunked Prefill&lt;/strong&gt; 把长 prompt 的 prefill 切块与 decode 混合调度，避免长 prefill 阻塞正在 decode 的请求；vLLM V1 的核心调度策略之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disaggregated Inference&lt;/strong&gt; 把 prefill 和 decode 分到不同 GPU 池，各池针对各自阶段优化（prefill 池高算力、decode 池高带宽），DeepSeek 推理服务已落地，吞吐再提 30-60%，代价是 KV Cache 跨池传输。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三类优化层层递进：Prefix Caching 复用历史 KV → Chunked Prefill 让长 prompt 不再阻塞 decode → Disaggregated Inference 干脆分池部署。前两者在单池内调度，后者跨越池边界，代价是 KV Cache 传输开销。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 10 篇。系列导读见：&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-series-guide/" &gt;LLM 术语全景图：系列导读&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LLM 术语全景图（九）：参数高效微调——LoRA 与 QLoRA</title><link>https://bevisy.github.io/p/llm-terminology-09-peft-lora/</link><pubDate>Mon, 27 Jul 2026 11:00:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-09-peft-lora/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-09-peft-lora/09.png" alt="Featured image of post LLM 术语全景图（九）：参数高效微调——LoRA 与 QLoRA" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 9 篇，覆盖参数高效微调（Parameter-Efficient Fine-Tuning）的 3 个概念：LoRA、QLoRA、PEFT。
主要参考模型/框架：HuggingFace PEFT、bitsandbytes、vLLM&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇peft-把全量微调的显存墙拆掉"&gt;开篇：PEFT 把全量微调的显存墙拆掉
&lt;/h2&gt;&lt;p&gt;全量微调大模型的显存成本几乎不可承受：65B 模型全量微调需约 780GB 显存，对应 40+ 张 A100， optimizer state 占了大头。参数高效微调（PEFT）只训练少量额外参数，绕开这堵墙，其中 LoRA 的低秩适配是核心思想——在冻结的预训练权重旁加一对小矩阵 A、B，只训练它们。QLoRA 进一步把篇 8 的量化技术用到微调场景：QLoRA = NF4 量化 + LoRA，先把基座量化到 4-bit 冻结，再在上面训 LoRA，把 65B 微调显存从 ~780GB 压到 ~33GB，单张 A100 80GB 即可。本篇沿&amp;quot;LoRA 原理 → QLoRA 量化叠加 → PEFT 方法谱系&amp;quot;三个概念展开，点出与篇 8 量化方法的衔接。&lt;/p&gt;
&lt;h2 id="参数高效微调parameter-efficient-fine-tuning"&gt;参数高效微调（Parameter-Efficient Fine-Tuning）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;全量微调大模型成本高昂。参数高效微调（PEFT）只训练少量额外参数，达到接近全量微调的效果。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="low-rank-adaptation"&gt;Low-Rank Adaptation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：LoRA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：低秩适配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：在冻结的预训练权重旁添加低秩分解的适配矩阵（A×B），只训练 A 和 B（参数量 &amp;laquo; 原始权重），达到接近全量微调的效果。最流行的 PEFT 方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：LoRA 的数学形式：&lt;/p&gt;
&lt;p&gt;原始权重 W (d×d)，LoRA 添加：ΔW = B × A&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A: r×d (降维), B: d×r (升维), r &amp;laquo; d (通常 r=8/16/64)&lt;/li&gt;
&lt;li&gt;前向：y = W·x + B·A·x = (W + ΔW)·x&lt;/li&gt;
&lt;li&gt;训练时 W 冻结，只训练 A 和 B&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参数量对比（d=4096, r=8）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全量微调：4096 × 4096 = 16.7M 参数/层&lt;/li&gt;
&lt;li&gt;LoRA：4096 × 8 + 8 × 4096 = 65K 参数/层（减少 256x）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初始化技巧：A 用随机高斯初始化，B 用零初始化 → 训练初期 ΔW=0，不改变原模型行为。&lt;/p&gt;
&lt;p&gt;推理时合并：W_merged = W + B×A，合并后无额外推理开销（与全量微调相同速度）。&lt;/p&gt;
&lt;p&gt;LoRA 的应用位置：通常加在 Attention 的 Q/V 投影上（最有效），也可加在 K/V 和 FFN。&lt;/p&gt;
&lt;p&gt;Alpha 缩放：ΔW = (α/r) × B×A，α 控制 LoRA 更新的强度，通常 α=2r。&lt;/p&gt;
&lt;p&gt;多 LoRA 服务：一个基座模型 + 多个 LoRA 适配器，可在推理时热切换（vLLM 支持多 LoRA 服务）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;LoRA: Low-Rank Adaptation of Large Language Models&amp;rdquo; (Hu et al., 2021, arXiv:2106.09685)；PEFT 库 (HuggingFace)；vLLM 多 LoRA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2106.09685" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2106.09685&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/docs/peft/en/package_reference/lora" target="_blank" rel="noopener"
 &gt;https://huggingface.co/docs/peft/en/package_reference/lora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="quantized-lora"&gt;Quantized LoRA
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：QLoRA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：量化低秩适配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：LoRA + 量化的组合。将基座模型量化到 4-bit (NF4) 冻结，只在量化模型上训练 LoRA 适配器。使在单张消费级 GPU 上微调 70B 模型成为可能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：QLoRA 的关键创新：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;NF4 (NormalFloat 4-bit) 量化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;针对 LLM 权重正态分布设计的 4-bit 量化格式&lt;/li&gt;
&lt;li&gt;量化分位数与正态分布的分位数对齐，信息损失最小&lt;/li&gt;
&lt;li&gt;比 INT4 精度更高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;双重量化（Double Quantization）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;量化常量（scale/zero-point）本身也量化（8-bit）&lt;/li&gt;
&lt;li&gt;进一步节省显存（每参数省 ~0.4 bit）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分页优化器（Paged Optimizer）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 PagedAttention 同款技术管理优化器状态&lt;/li&gt;
&lt;li&gt;显存峰值时自动将优化器状态卸载到 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;65B 模型全量微调需 ~780GB 显存（40+ 张 A100）&lt;/li&gt;
&lt;li&gt;QLoRA 微调 65B 仅需 ~33GB（单张 A100 80GB 足够）&lt;/li&gt;
&lt;li&gt;精度接近全量 BF16 微调（差距 &amp;lt; 1%）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;训练流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;加载 4-bit NF4 量化模型（冻结）&lt;/li&gt;
&lt;li&gt;添加 LoRA 适配器（FP16 训练）&lt;/li&gt;
&lt;li&gt;前向：4-bit 反量化 → 计算 → LoRA 适配&lt;/li&gt;
&lt;li&gt;反向：梯度只流过 LoRA 参数&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;实践工具：HuggingFace PEFT + bitsandbytes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;QLoRA: Efficient Finetuning of Quantized LLMs&amp;rdquo; (Dettmers et al., 2023, arXiv:2305.14314)；bitsandbytes；HuggingFace PEFT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2305.14314" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2305.14314&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/blog/4bit-transformers-bitsandbytes" target="_blank" rel="noopener"
 &gt;https://huggingface.co/blog/4bit-transformers-bitsandbytes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="parameter-efficient-fine-tuning"&gt;Parameter-Efficient Fine-Tuning
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：PEFT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：参数高效微调&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：一类只训练模型少量参数（而非全量参数）的微调方法总称。包括 LoRA、Adapter、Prefix Tuning、Prompt Tuning 等。HuggingFace PEFT 库统一了这些方法的接口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：PEFT 方法谱系：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;额外参数位置&lt;/th&gt;
					&lt;th&gt;参数量占比&lt;/th&gt;
					&lt;th&gt;推理开销&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;LoRA&lt;/td&gt;
					&lt;td&gt;权重低秩分解&lt;/td&gt;
					&lt;td&gt;0.1~1%&lt;/td&gt;
					&lt;td&gt;可合并，无额外开销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Adapter&lt;/td&gt;
					&lt;td&gt;层后插入小网络&lt;/td&gt;
					&lt;td&gt;1~5%&lt;/td&gt;
					&lt;td&gt;增加一层计算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Prefix Tuning&lt;/td&gt;
					&lt;td&gt;KV 前加可学习前缀&lt;/td&gt;
					&lt;td&gt;0.1%&lt;/td&gt;
					&lt;td&gt;增加 prefix 长度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Prompt Tuning&lt;/td&gt;
					&lt;td&gt;输入嵌入加可学习向量&lt;/td&gt;
					&lt;td&gt;&amp;lt;0.01%&lt;/td&gt;
					&lt;td&gt;增加输入长度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P-Tuning v2&lt;/td&gt;
					&lt;td&gt;每层加 prefix&lt;/td&gt;
					&lt;td&gt;0.1~1%&lt;/td&gt;
					&lt;td&gt;同 prefix tuning&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;LoRA 是当前最主流的选择（可合并、无推理开销、效果好）。&lt;/p&gt;
&lt;p&gt;PEFT 的核心价值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单卡可微调大模型（QLoRA: 单卡 70B）&lt;/li&gt;
&lt;li&gt;多任务：一个基座 + 多个 LoRA 适配器&lt;/li&gt;
&lt;li&gt;存储高效：LoRA 适配器仅几十 MB&lt;/li&gt;
&lt;li&gt;可组合：多个 LoRA 可叠加/混合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;PEFT: Parameter-Efficient Fine-Tuning&amp;rdquo; (HuggingFace)；LoRA、Adapter、Prefix Tuning 系列论文&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/docs/peft/" target="_blank" rel="noopener"
 &gt;https://huggingface.co/docs/peft/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/huggingface/peft" target="_blank" rel="noopener"
 &gt;https://github.com/huggingface/peft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 3 个 PEFT 术语沿&amp;quot;低秩适配 → 量化叠加 → 方法谱系&amp;quot;归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LoRA&lt;/strong&gt; 用低秩分解 ΔW = B×A（A: r×d, B: d×r, r &amp;laquo; d）把可训参数压到全量的 0.1~1%，d=4096/r=8 时 65K vs 16.7M（减少 256x）；初始化技巧（A 随机高斯、B 零初始化）保证训练初期 ΔW=0；推理时合并 W_merged = W + B×A 后无额外开销，这是相对 Adapter 的关键优势；α=2r 缩放控制更新强度；vLLM 支持多 LoRA 热切换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QLoRA&lt;/strong&gt; 是篇 8 量化方法在微调场景的落地：NF4（针对权重正态分布设计的 4-bit）+ 双重量化 + 分页优化器三个创新，把 65B 全量微调 ~780GB 压到 ~33GB 单卡 A100 80GB，精度差距 &amp;lt; 1%；流程是 4-bit NF4 冻结 + LoRA FP16 训练，工具链 HuggingFace PEFT + bitsandbytes。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PEFT&lt;/strong&gt; 是方法总称，谱系表中 LoRA 凭&amp;quot;可合并、无推理开销、效果好&amp;quot;成为当前最主流选择，其余 Adapter/Prefix/Prompt/P-Tuning v2 各有参数位置与推理开销取舍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QLoRA 正是篇 8 量化与篇 9 PEFT 的结合点：把 NF4 量化技术用在微调而非推理，让单卡微调大模型从奢望变为例行。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 9 篇。系列导读见：&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-series-guide/" &gt;LLM 术语全景图：系列导读&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LLM 术语全景图（八）：量化方法——从 GPTQ 到 FP8</title><link>https://bevisy.github.io/p/llm-terminology-08-quantization/</link><pubDate>Mon, 27 Jul 2026 10:45:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-08-quantization/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-08-quantization/08.png" alt="Featured image of post LLM 术语全景图（八）：量化方法——从 GPTQ 到 FP8" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 8 篇，覆盖量化方法的 6 个概念：GPTQ、AWQ、SmoothQuant、GGUF/llama.cpp、FP8 Quantization、QAT。
主要参考模型/框架：AutoGPTQ、AutoAWQ、vLLM、llama.cpp、Hopper GPU&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇量化的两条路线分野"&gt;开篇：量化的两条路线分野
&lt;/h2&gt;&lt;p&gt;量化在 LLM 时代分出两条路线。数据中心路线——GPTQ、AWQ、SmoothQuant、FP8——面向 GPU 高吞吐服务，在精度与算力间求平衡：权重压到 INT4 省显存，激活保高精度，或用 W8A8 享受 Tensor Core 算力翻倍。消费级路线——GGUF——面向 CPU 与 Apple Metal 本地部署，把权重、tokenizer、架构参数打包进单文件，让 MacBook 也能跑 70B 模型。两条路线工具链不重叠，场景互补。路线内部一个明确趋势：FP8 正在取代 INT8 成为数据中心推理首选。LLM 激活值有大量异常值，定点 INT8 难以同时覆盖，需 SmoothQuant 辅助；而 FP8 浮点格式的指数位天然适配异常值动态范围，几乎无损即可拿到 Hopper GPU 上 BF16 两倍的 Tensor Core 算力。本篇按此脉络梳理 6 个量化术语。&lt;/p&gt;
&lt;h2 id="量化方法quantization-methods"&gt;量化方法（Quantization Methods）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;量化是将高精度模型参数降至低精度以减少显存和加速推理的技术。本篇展开具体方法。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="gptq"&gt;GPTQ
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：GPTQ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：GPTQ 量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：基于二阶 Hessian 信息的训练后量化方法，逐层将权重量化到 INT4/INT8，利用校准数据补偿量化误差。生成式任务中几乎无损，是 INT4 权重量化的主流方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：GPTQ 的核心思想：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;逐层量化：对每一层的权重矩阵 W 逐列量化&lt;/li&gt;
&lt;li&gt;Hessian 信息：用校准数据计算 H = X^T · X（输入的二阶统计量）&lt;/li&gt;
&lt;li&gt;顺序量化：量化第 j 列时，用 Hessian 信息预测量化误差，并补偿到未量化的列&lt;/li&gt;
&lt;li&gt;公式：quant 后的误差被投影到剩余权重上，最小化输出误差&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;量化流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;准备 ~128 条校准数据（如 C4/WikiText 片段）&lt;/li&gt;
&lt;li&gt;逐层运行校准数据，收集输入激活&lt;/li&gt;
&lt;li&gt;对每层权重做 GPTQ 量化（~几分钟）&lt;/li&gt;
&lt;li&gt;保存量化后的权重 + scale/zp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型精度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;W4A16（权重 INT4，激活 FP16）：显存 ~25% BF16，精度损失 &amp;lt; 1%&lt;/li&gt;
&lt;li&gt;W8A16：显存 ~50%，几乎无损&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;支持框架：AutoGPTQ、vLLM（原生支持 GPTQ 推理）、HuggingFace transformers&lt;/p&gt;
&lt;p&gt;局限：主要量化权重，激活仍需 FP16（W4A16 模式）；对极小模型（&amp;lt; 1B）精度损失更大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;GPTQ: Accurate Post-Training Quantization for GPT&amp;rdquo; (Frantar et al., 2022, arXiv:2210.17323)；AutoGPTQ；vLLM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2210.17323" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2210.17323&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/gptqmodel/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/gptqmodel/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="activation-aware-weight-quantization"&gt;Activation-aware Weight Quantization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：AWQ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：激活感知权重量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：通过分析激活值的分布识别&amp;quot;重要权重&amp;quot;（对应大激活的权重），对重要权重保持高精度、对非重要权重量化压缩。比 GPTQ 更快（无需反向传播补偿），精度相当。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：AWQ 的核心发现：&lt;/p&gt;
&lt;p&gt;不是所有权重同等重要——与大激活值对应的权重对量化误差更敏感。
保持这些&amp;quot;重要权重&amp;quot;的高精度（或用 per-channel scale 缩放），其余权重可激进量化。&lt;/p&gt;
&lt;p&gt;AWQ 方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用校准数据统计每通道激活的幅度分布&lt;/li&gt;
&lt;li&gt;对大激活通道的权重乘以 scale s（放大），量化后精度更高&lt;/li&gt;
&lt;li&gt;对应的激活除以 s（反缩放），保持等价性&lt;/li&gt;
&lt;li&gt;量化：W&amp;rsquo; = quant(W × s), X&amp;rsquo; = X / s → W&amp;rsquo; × X&amp;rsquo; ≈ W × X&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与 GPTQ 对比：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;GPTQ&lt;/th&gt;
					&lt;th&gt;AWQ&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;方法&lt;/td&gt;
					&lt;td&gt;Hessian 补偿&lt;/td&gt;
					&lt;td&gt;激活感知缩放&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;校准&lt;/td&gt;
					&lt;td&gt;需要（二阶计算）&lt;/td&gt;
					&lt;td&gt;需要（统计激活）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;速度&lt;/td&gt;
					&lt;td&gt;较慢（逐列补偿）&lt;/td&gt;
					&lt;td&gt;较快（仅需统计）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;精度&lt;/td&gt;
					&lt;td&gt;略优（复杂模型）&lt;/td&gt;
					&lt;td&gt;相当&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;通用性&lt;/td&gt;
					&lt;td&gt;广&lt;/td&gt;
					&lt;td&gt;广&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;支持：AutoAWQ、vLLM（原生支持）、HuggingFace&lt;/p&gt;
&lt;p&gt;W4A16 模式下 AWQ 和 GPTQ 是最常用的两种 INT4 量化方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;AWQ: Activation-aware Weight Quantization for LLM Compression&amp;rdquo; (Lin et al., 2023, arXiv:2306.00978)；AutoAWQ；vLLM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2306.00978" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2306.00978&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/auto_awq/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/auto_awq/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="smoothquant"&gt;SmoothQuant
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：平滑量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将量化难度从激活值转移到权重的训练后量化方法。通过 per-channel 缩放因子&amp;quot;平滑&amp;quot;激活的异常值，使权重和激活都能用 INT8 量化（W8A8），无需 FP16 激活。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：SmoothQuant 解决的问题：&lt;/p&gt;
&lt;p&gt;LLM 激活值有大量异常值（outlier），使 INT8 量化激活困难。GPTQ/AWQ 量化权重但保持激活 FP16（W4A16），仍需 FP16 计算。SmoothQuant 使 W8A8 成为可能——权重和激活都是 INT8，享受 Tensor Core INT8 算力加速。&lt;/p&gt;
&lt;p&gt;核心方法：将量化难度从激活值转移到权重，具体步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;统计每通道激活的最大值 s_j = max(|X_j|)^α / max(|W_j|)^(1-α)&lt;/li&gt;
&lt;li&gt;平滑：W&amp;rsquo;_j = W_j / s_j, X&amp;rsquo;_j = X_j × s_j&lt;/li&gt;
&lt;li&gt;平滑后：W&amp;rsquo; 的通道更均匀（便于量化），X&amp;rsquo; 的异常值被抑制&lt;/li&gt;
&lt;li&gt;量化：W&amp;rsquo;_int8 = quant(W&amp;rsquo;), X&amp;rsquo;_int8 = quant(X')&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;α 参数（迁移强度）：α=0.5 是平衡点，典型值 0.5~0.8。&lt;/p&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;W8A8：权重和激活都 INT8，推理用 INT8 GEMM（Tensor Core INT8 算力是 BF16 的 2x）&lt;/li&gt;
&lt;li&gt;无需 FP16 激活 → 减少内存带宽 → decode 加速&lt;/li&gt;
&lt;li&gt;精度损失小（&amp;lt; 1%）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;局限：INT8 精度不如 FP8（定点格式对异常值不友好），Hopper GPU 上 FP8 更优。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;SmoothQuant: Accurate and Efficient Post-Training Quantization for LLMs&amp;rdquo; (Xiao et al., 2022, arXiv:2211.10438)；MIT-Han-Lab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2211.10438" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2211.10438&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/mit-han-lab/smoothquant" target="_blank" rel="noopener"
 &gt;https://github.com/mit-han-lab/smoothquant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gguf--llamacpp-quantization"&gt;GGUF / llama.cpp Quantization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：GGUF&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：GGUF 量化格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：llama.cpp 项目定义的模型文件格式，支持 2~8 bit 多种量化方案，专为 CPU/消费级 GPU 推理优化。可在普通笔记本上运行大模型，是本地部署最流行的格式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：GGUF（GPT-Generated Unified Format）替代了旧的 GGML 格式：&lt;/p&gt;
&lt;p&gt;支持的量化方案（按精度从高到低）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;量化名&lt;/th&gt;
					&lt;th&gt;bit/权重&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Q8_0&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;INT8 + FP16 scale，几乎无损&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q6_K&lt;/td&gt;
					&lt;td&gt;6&lt;/td&gt;
					&lt;td&gt;6-bit 混合，精度好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q5_K_M&lt;/td&gt;
					&lt;td&gt;5.5&lt;/td&gt;
					&lt;td&gt;5-bit 混合，精度较好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q4_K_M&lt;/td&gt;
					&lt;td&gt;4.5&lt;/td&gt;
					&lt;td&gt;4-bit 混合，主流选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q4_0&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;基础 4-bit，速度快&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q3_K_M&lt;/td&gt;
					&lt;td&gt;3.5&lt;/td&gt;
					&lt;td&gt;3-bit 混合，精度有损&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q2_K&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;极限压缩，明显有损&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单文件存储权重 + 元数据（tokenizer、架构参数）&lt;/li&gt;
&lt;li&gt;支持 CPU (AVX2/NEON) + GPU (CUDA/Metal) 混合推理&lt;/li&gt;
&lt;li&gt;部分层可在 GPU 计算，其余在 CPU（offload 层数可控）&lt;/li&gt;
&lt;li&gt;内存映射加载，启动快&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MacBook (Metal) 上跑 70B 模型（Q4 需 ~35GB 内存）&lt;/li&gt;
&lt;li&gt;没有数据中心 GPU 的本地开发和测试&lt;/li&gt;
&lt;li&gt;边缘设备部署&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与 vLLM/FP8 的关系：GGUF 面向消费级硬件和 CPU 推理，vLLM/FP8 面向数据中心 GPU 高吞吐服务。两者互补，不竞争。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：llama.cpp (Georgi Gerganov)；GGUF 规范&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener"
 &gt;https://github.com/ggerganov/llama.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/gguf/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/gguf/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ggml-org/llama.cpp/tree/master/gguf-py" target="_blank" rel="noopener"
 &gt;https://github.com/ggml-org/llama.cpp/tree/master/gguf-py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fp8-quantization"&gt;FP8 Quantization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：FP8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：FP8 量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：利用 Hopper GPU 原生 FP8 Tensor Core 的量化方案。相比 INT4/INT8 定点量化，FP8 浮点格式天然适配 LLM 激活的异常值分布，几乎无损且算力翻倍。正在取代 INT8 成为推理量化的首选。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：FP8 量化的两种模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;W8A8（权重+激活 FP8）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权重和激活都用 FP8（E4M3）&lt;/li&gt;
&lt;li&gt;GEMM 用 FP8 Tensor Core（H100 算力 1979 TFLOPS，BF16 的 2x）&lt;/li&gt;
&lt;li&gt;需要校准确定 scale factor（per-tensor 或 per-channel）&lt;/li&gt;
&lt;li&gt;精度损失通常 &amp;lt; 0.5%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仅权重量化（W8A16）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权重 FP8，激活 BF16&lt;/li&gt;
&lt;li&gt;用于不支持 FP8 计算的 GPU（如 A100）&lt;/li&gt;
&lt;li&gt;显存减半，但计算无加速&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两种 FP8 编码格式（由 &amp;ldquo;FP8 Formats for Deep Learning&amp;rdquo; 定义）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E4M3（4 位指数 + 3 位尾数）：更多尾数位，精度更高，用于权重/激活与前向推理&lt;/li&gt;
&lt;li&gt;E5M2（5 位指数 + 2 位尾数）：更多指数位，动态范围更大，用于梯度/反向传播
推理场景主要使用 E4M3；E5M2 因动态范围大，在训练的反向梯度中更常见。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FP8 vs INT8：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;FP8 (E4M3)&lt;/th&gt;
					&lt;th&gt;INT8&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;格式&lt;/td&gt;
					&lt;td&gt;浮点（指数+尾数）&lt;/td&gt;
					&lt;td&gt;定点&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;异常值&lt;/td&gt;
					&lt;td&gt;天然适配（浮点有指数）&lt;/td&gt;
					&lt;td&gt;需要缩放/校准&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;精度&lt;/td&gt;
					&lt;td&gt;更好（LLM 激活）&lt;/td&gt;
					&lt;td&gt;需 SmoothQuant 等辅助&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;算力&lt;/td&gt;
					&lt;td&gt;H100 原生 1979T&lt;/td&gt;
					&lt;td&gt;H100 原生 1979T&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;门槛&lt;/td&gt;
					&lt;td&gt;需 Hopper+&lt;/td&gt;
					&lt;td&gt;A100 即可&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;实践用法（vLLM）：&lt;/p&gt;
&lt;h1 id="fp8-权重量化无需校准"&gt;FP8 权重量化（无需校准）
&lt;/h1&gt;&lt;p&gt;&amp;ndash;quantization fp8&lt;/p&gt;
&lt;h1 id="fp8-kv-cache长上下文减半-kv-内存"&gt;FP8 KV Cache（长上下文减半 KV 内存）
&lt;/h1&gt;&lt;p&gt;&amp;ndash;kv-cache-dtype fp8&lt;/p&gt;
&lt;p&gt;局限：需 Hopper (H100/H200) 或 Ada (RTX 4090/6000) 架构。A100 不支持 FP8 Tensor Core。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;FP8 Formats for Deep Learning&amp;rdquo; (2022)；vLLM FP8；TensorRT-LLM FP8；FlashAttention-3 FP8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/fp8/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/fp8/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nvidia.github.io/TensorRT-LLM/reference/precision.html" target="_blank" rel="noopener"
 &gt;https://nvidia.github.io/TensorRT-LLM/reference/precision.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="quantization-aware-training"&gt;Quantization-Aware Training
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：QAT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：量化感知训练&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：在训练过程中模拟量化效应（假量化），让模型在训练时就适应低精度表示。精度高于训练后量化（PTQ），但需要训练成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：QAT vs PTQ：&lt;/p&gt;
&lt;p&gt;PTQ（训练后量化）：训练完的 FP16/BF16 模型直接量化，无需再训练&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优点：快速，无需训练数据和资源&lt;/li&gt;
&lt;li&gt;缺点：低 bit（INT4 以下）精度损失明显&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QAT（量化感知训练）：在微调阶段插入假量化节点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前向传播时模拟量化：x_fake = dequant(quant(x))，让模型&amp;quot;看到&amp;quot;量化误差&lt;/li&gt;
&lt;li&gt;反向传播用 STE（Straight-Through Estimator）绕过量化不可导问题&lt;/li&gt;
&lt;li&gt;模型学会调整权重以适应量化噪声&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QAT 流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从预训练 FP16 模型出发&lt;/li&gt;
&lt;li&gt;插入假量化节点（目标精度如 INT4/INT8）&lt;/li&gt;
&lt;li&gt;用训练数据继续训练几个 epoch&lt;/li&gt;
&lt;li&gt;导出真正的量化模型&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;适用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要 INT4 以下极端量化且 PTQ 精度不够时&lt;/li&gt;
&lt;li&gt;部署在边缘设备（手机、嵌入式）有严格精度约束&lt;/li&gt;
&lt;li&gt;对精度要求极高的生成任务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实践中：LLM 很少用 QAT（训练成本高），大多用 PTQ（GPTQ/AWQ/FP8）已足够。QAT 更多用于 CV 模型和移动端部署。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference&amp;rdquo; (Jacob et al., 2018, arXiv:1712.05877)；LLM-QAT (arXiv:2207.04265)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1712.05877" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1712.05877&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 6 个量化术语沿&amp;quot;两条路线 + 一个趋势&amp;quot;归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPTQ&lt;/strong&gt; 基于 Hessian 信息的逐列补偿，W4A16 模式下显存 ~25% BF16、精度损失 &amp;lt; 1%，局限是仅量化权重、激活仍需 FP16。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWQ&lt;/strong&gt; 以&amp;quot;与大激活值对应的权重更敏感&amp;quot;为出发点，用 per-channel scale 缩放而非二阶补偿，比 GPTQ 更快、精度相当；W4A16 下与 GPTQ 并列最常用 INT4 方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SmoothQuant&lt;/strong&gt; 把量化难度从激活值转移到权重，使 W8A8 成为可能，享受 Tensor Core INT8 算力（BF16 的 2x）；但 INT8 定点格式对异常值不友好，Hopper GPU 上 FP8 更优。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GGUF&lt;/strong&gt; 是消费级路线的代表，Q2_K~Q8_0 单文件便携，MacBook Metal 上 Q4 跑 70B 约 35GB 内存；与 vLLM/FP8 数据中心路线互补而非竞争。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FP8 Quantization&lt;/strong&gt; 是数据中心推理的新首选：E4M3（前向/推理，更多尾数）与 E5M2（反向/梯度，更多指数）两种编码，浮点格式天然适配 LLM 激活异常值，H100 上算力 1979 TFLOPS（BF16 的 2x）；硬件门槛是 Hopper/Ada，A100 不支持 FP8 Tensor Core。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QAT&lt;/strong&gt; 精度高于 PTQ 但需训练成本，LLM 实践中很少用 QAT，PTQ（GPTQ/AWQ/FP8）已足够；QAT 主要用于 CV 模型与移动端部署。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两条路线的边界清晰：数据中心 GPU 上 FP8/INT8 量化服务高吞吐推理，消费级 CPU/Metal 上 GGUF 单文件服务本地部署；FP8 取代 INT8 的趋势由 LLM 激活异常值分布驱动，定点格式需 SmoothQuant 辅助，浮点格式原生适配。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 8 篇。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（七）：GPU 硬件与计算——从 Tensor Core 到 HBM</title><link>https://bevisy.github.io/p/llm-terminology-07-gpu-hardware/</link><pubDate>Mon, 27 Jul 2026 10:30:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-07-gpu-hardware/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-07-gpu-hardware/07.png" alt="Featured image of post LLM 术语全景图（七）：GPU 硬件与计算——从 Tensor Core 到 HBM" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 7 篇，覆盖 GPU 硬件与计算的 8 个概念：Tensor Core、MMA/WGMMA、TMA、HBM、BF16、FP8、AllReduce/AllGather/ReduceScatter、NVLink/NVSwitch。
主要参考架构：NVIDIA Volta/Ampere/Hopper/Blackwell、CUTLASS、FlashAttention-3、NCCL&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇理解-gpu-硬件是优化-llm-的前提"&gt;开篇：理解 GPU 硬件是优化 LLM 的前提
&lt;/h2&gt;&lt;p&gt;LLM 推理的两个阶段受限于完全不同的资源。prefill 一次性处理整段 prompt，矩阵乘法的 FLOPs 大、每个权重被反复使用，瓶颈落在 Tensor Core 算力上，属于 compute-bound；decode 逐 token 自回归生成，每生成 1 个 token 都要把全部模型权重和当前 KV Cache 从 HBM 读进 SM，FLOPs 很小但读取量极大，瓶颈落在 HBM 带宽上，属于 memory-bound。这两种瓶颈分别决定了优化方向：compute-bound 看算力（更低精度、更稠密的 Tensor Core 利用率），memory-bound 看带宽（更小的权重、更少的读取）。量化把权重从 BF16 压到 FP8/INT4，本质是减少单位计算的 HBM 读取量；MoE 每次只激活少数专家，本质是减少单次 decode 实际需要读取的权重。所有主流 LLM 优化都能归到&amp;quot;降读取&amp;quot;或&amp;quot;降计算&amp;quot;这两条路径上，而判断走哪条路径的前提，是先看清 GPU 的算力墙和带宽墙分别在哪。本篇按硬件层次梳理 8 个术语：从计算单元（Tensor Core、MMA/WGMMA、TMA）、到内存与数据格式（HBM、BF16、FP8）、再到多卡互连（AllReduce 系原语、NVLink/NVSwitch）。&lt;/p&gt;
&lt;h2 id="gpu-硬件与计算gpu-hardware--compute"&gt;GPU 硬件与计算（GPU Hardware &amp;amp; Compute）
&lt;/h2&gt;&lt;h3 id="tensor-core"&gt;Tensor Core
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：张量核心&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：NVIDIA GPU 上专门用于矩阵乘法（GEMM）的硬件单元，单个时钟周期可完成一个矩阵乘加操作。相比 CUDA Core 做标量乘法，Tensor Core 吞吐量高出一个数量级，是 LLM 计算的核心引擎。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Tensor Core 的计算能力：&lt;/p&gt;
&lt;p&gt;CUDA Core：每周期 1 个 FP32 FMA（fused multiply-add）
Tensor Core：每周期一个矩阵乘加，如 D = A × B + C（A/B/C/D 是小矩阵块）&lt;/p&gt;
&lt;p&gt;各代 Tensor Core 支持的精度：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;GPU 架构&lt;/th&gt;
					&lt;th&gt;Tensor Core 代&lt;/th&gt;
					&lt;th&gt;支持精度&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Volta (V100)&lt;/td&gt;
					&lt;td&gt;第 1 代&lt;/td&gt;
					&lt;td&gt;FP16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ampere (A100)&lt;/td&gt;
					&lt;td&gt;第 3 代&lt;/td&gt;
					&lt;td&gt;FP16, BF16, TF32, INT8, INT4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hopper (H100)&lt;/td&gt;
					&lt;td&gt;第 4 代&lt;/td&gt;
					&lt;td&gt;FP16, BF16, TF32, FP8(E4M3/E5M2), INT8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Blackwell (B200)&lt;/td&gt;
					&lt;td&gt;第 5 代&lt;/td&gt;
					&lt;td&gt;FP4, FP6, FP8, BF16, FP16&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对 LLM 的影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练：BF16 是主力精度（Tensor Core 原生加速，动态范围大）&lt;/li&gt;
&lt;li&gt;推理：FP8（Hopper）和 FP4（Blackwell）大幅提升吞吐&lt;/li&gt;
&lt;li&gt;A100-SXM4-40GB：第 3 代 Tensor Core，BF16 算力 312 TFLOPS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MMA 指令：Tensor Core 通过 MMA (Matrix Multiply-Accumulate) 指令编程。CUTLASS 和 Triton 库在底层调用 MMA 指令实现高效 GEMM。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NVIDIA Volta 架构白皮书 (2017)；CUTLASS 库；Triton 编译器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/cutlass/latest/media/docs/cpp/cute/00_quickstart.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/cutlass/latest/media/docs/cpp/cute/00_quickstart.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/" target="_blank" rel="noopener"
 &gt;https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="matrix-multiply-accumulate"&gt;Matrix Multiply-Accumulate
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MMA / WGMMA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：矩阵乘加指令&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：驱动 Tensor Core 的底层指令。MMA 是 Ampere 及之前架构的同步指令，WGMMA (Warp Group MMA) 是 Hopper 架构引入的异步指令，支持 TMA 加载数据，吞吐量大幅提升。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：MMA vs WGMMA：&lt;/p&gt;
&lt;p&gt;MMA（Ampere 及之前）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同步执行，线程束(warp)级&lt;/li&gt;
&lt;li&gt;数据需先加载到寄存器，再调用 MMA&lt;/li&gt;
&lt;li&gt;矩阵块较小（如 16×8×16 for FP16）&lt;/li&gt;
&lt;li&gt;数据加载和计算串行，有等待空闲&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WGMMA（Hopper）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;异步执行，线程束组(warp group, 4 warps)级&lt;/li&gt;
&lt;li&gt;可直接从共享内存(shared memory)异步执行矩阵乘加&lt;/li&gt;
&lt;li&gt;矩阵块更大（如 64×128×16 for BF16, 128×256×32 for FP8）&lt;/li&gt;
&lt;li&gt;与 TMA 配合：TMA 异步加载数据到共享内存，WGMMA 异步从共享内存计算&lt;/li&gt;
&lt;li&gt;计算和数据加载可重叠（double buffer），接近峰值算力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编程接口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PTX 汇编：mma.sync / wgmma.mma_async 指令&lt;/li&gt;
&lt;li&gt;CUTLASS 3.x：Cute 库封装 WGMMA&lt;/li&gt;
&lt;li&gt;Triton：编译器自动选择 MMA/WGMMA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对 LLM 的影响：WGMMA 使 H100 的 FP8 算力达到近 2000 TFLOPS（理论峰值），是 A100 BF16 的 ~6x。Flash Attention-3 专门利用 WGMMA + TMA 实现 FP8 注意力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NVIDIA Hopper 架构白皮书 (2022)；CUTLASS 3.x；FlashAttention-3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/cuda/parallel-thread-execution/" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/cuda/parallel-thread-execution/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/cutlass" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/cutlass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tensor-memory-accelerator"&gt;Tensor Memory Accelerator
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：TMA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：张量内存加速器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Hopper 架构引入的专用硬件单元，用于在 HBM 和共享内存之间高效异步搬运多维张量。替代手动内存管理，与 WGMMA 配合实现计算-通信重叠。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：TMA 解决的问题：&lt;/p&gt;
&lt;p&gt;传统方式：程序员用 global memory load 指令逐元素/逐块加载数据到寄存器，再存储到共享内存。线程开销大，带宽利用率低。&lt;/p&gt;
&lt;p&gt;TMA 方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;预设张量描述符（descriptor）：定义 HBM 中的张量形状、跨度、维度&lt;/li&gt;
&lt;li&gt;单条指令发起异步拷贝：整个多维切片从 HBM → 共享内存&lt;/li&gt;
&lt;li&gt;不占用线程，由专用 DMA 引擎执行&lt;/li&gt;
&lt;li&gt;通过 mbarrier（内存屏障）同步完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;TMA 优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;异步：不占用计算线程，与 WGMMA 计算重叠&lt;/li&gt;
&lt;li&gt;多维：原生支持 1D~5D 张量拷贝，无需手动算地址&lt;/li&gt;
&lt;li&gt;高带宽：接近 HBM 峰值带宽（H100: 3.35 TB/s）&lt;/li&gt;
&lt;li&gt;跨节点：直接支持多卡共享内存间拷贝（配合 NVSwitch）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与 Flash Attention-3 的关系：FA3 的核心优化之一就是用 TMA 替代 FA2 中的手动数据加载，实现 prefetch + 计算重叠，FP8 注意力吞吐提升 ~75%。&lt;/p&gt;
&lt;p&gt;Blackwell (B200) 进一步增强 TMA，支持 FP4 精度张量搬运。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NVIDIA Hopper 架构白皮书 (2022)；FlashAttention-3 (arXiv:2407.08608)；CUTLASS 3.x&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/cuda/parallel-thread-execution/#tensor-memory-accelerator" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/cuda/parallel-thread-execution/#tensor-memory-accelerator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Dao-AILab/flash-attention" target="_blank" rel="noopener"
 &gt;https://github.com/Dao-AILab/flash-attention&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="high-bandwidth-memory"&gt;High Bandwidth Memory
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：HBM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：高带宽内存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：GPU 上的高带宽显存，通过 3D 堆叠 DRAM 实现远超普通 DDR 的带宽。LLM 推理的主要瓶颈往往不是算力而是 HBM 带宽（memory-bound）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：各代 HBM 参数：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;HBM 代&lt;/th&gt;
					&lt;th&gt;GPU&lt;/th&gt;
					&lt;th&gt;带宽&lt;/th&gt;
					&lt;th&gt;容量&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;HBM2&lt;/td&gt;
					&lt;td&gt;V100&lt;/td&gt;
					&lt;td&gt;0.9 TB/s&lt;/td&gt;
					&lt;td&gt;32GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HBM2e&lt;/td&gt;
					&lt;td&gt;A100 80GB&lt;/td&gt;
					&lt;td&gt;2.0 TB/s&lt;/td&gt;
					&lt;td&gt;80GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HBM3&lt;/td&gt;
					&lt;td&gt;H100 SXM5&lt;/td&gt;
					&lt;td&gt;3.35 TB/s&lt;/td&gt;
					&lt;td&gt;80GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HBM3e&lt;/td&gt;
					&lt;td&gt;B200&lt;/td&gt;
					&lt;td&gt;8 TB/s&lt;/td&gt;
					&lt;td&gt;192GB&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Memory-bound vs Compute-bound：&lt;/p&gt;
&lt;p&gt;LLM 推理的 decode 阶段是典型的 memory-bound：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每生成 1 个 token，需从 HBM 读取全部模型权重 + KV Cache&lt;/li&gt;
&lt;li&gt;计算量小（1 个 token × 全部权重），但读取量大&lt;/li&gt;
&lt;li&gt;瓶颈 = 权重 / HBM 带宽，而非算力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LLM 推理的 prefill 阶段是 compute-bound：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;处理整段 prompt，矩阵乘法计算量大&lt;/li&gt;
&lt;li&gt;瓶颈 = FLOPs / Tensor Core 算力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;量化算例：decode 每生成 1 token 需读取全部模型权重（70B = 140GB BF16），H100 3.35 TB/s → ~42ms → ~24 token/s。这就是 decode 阶段的天花板——单卡 H100 跑 70B BF16 的理论极限约 24 token/s，实际还要扣 KV Cache 读取和算力开销。&lt;/p&gt;
&lt;p&gt;优化启示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;量化（INT4/FP8）减少权重大小 → 减少读取量 → 加速 decode&lt;/li&gt;
&lt;li&gt;Flash Attention 减少 HBM 读写 → 加速注意力&lt;/li&gt;
&lt;li&gt;MoE 只激活部分专家 → 减少实际读取的权重&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;带宽利用率：高效实现（如 Flash Attention）可达 HBM 峰值带宽的 70-85%。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NVIDIA 各架构白皮书；HBM 标准 (JEDEC)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/en-us/data-center/h100/" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/en-us/data-center/h100/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2205.14135" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2205.14135&lt;/a&gt; (Flash Attention IO 复杂度分析)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bfloat16"&gt;Bfloat16
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：BF16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：Brain 浮点 16 位&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Google Brain 团队设计的 16 位浮点格式，与 FP16 相同的总位数但指数位更多（8 位指数 + 7 位尾数），动态范围与 FP32 相同，训练稳定性远优于 FP16。现代 LLM 训练和推理的默认精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：BF16 vs FP16 vs FP32：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;格式&lt;/th&gt;
					&lt;th&gt;总位数&lt;/th&gt;
					&lt;th&gt;指数&lt;/th&gt;
					&lt;th&gt;尾数&lt;/th&gt;
					&lt;th&gt;动态范围&lt;/th&gt;
					&lt;th&gt;精度&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;FP32&lt;/td&gt;
					&lt;td&gt;32&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;23&lt;/td&gt;
					&lt;td&gt;±3.4e38&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP16&lt;/td&gt;
					&lt;td&gt;16&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;10&lt;/td&gt;
					&lt;td&gt;±65504&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BF16&lt;/td&gt;
					&lt;td&gt;16&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;7&lt;/td&gt;
					&lt;td&gt;±3.4e38&lt;/td&gt;
					&lt;td&gt;低（同 FP32 范围）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BF16 的优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;与 FP32 相同的指数位（8 位），动态范围完全一致&lt;/li&gt;
&lt;li&gt;训练时无需 loss scaling（FP16 需要，否则梯度下溢）&lt;/li&gt;
&lt;li&gt;与 FP32 互转简单：BF16 → FP32 只需右侧补零&lt;/li&gt;
&lt;li&gt;Ampere+ Tensor Core 原生支持 BF16&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实践用法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练：权重和激活用 BF16，主权重和优化器状态用 FP32（混合精度训练）&lt;/li&gt;
&lt;li&gt;推理：BF16 是无损推理的默认精度，权重占 FP32 的一半&lt;/li&gt;
&lt;li&gt;KV Cache：通常用 BF16 存储&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：BF16 尾数只有 7 位（FP16 有 10 位），精度略低。但 LLM 训练对动态范围更敏感，BF16 是更好的选择。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：Google Brain (2018)；Ampere/Hopper/Blackwell Tensor Core 原生支持&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://en.wikipedia.org/wiki/Bfloat16_floating-point_format" target="_blank" rel="noopener"
 &gt;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fp8"&gt;FP8
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：FP8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：8 位浮点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Hopper 架构原生支持的 8 位浮点格式，有两种变体 E4M3（4 位指数 + 3 位尾数）和 E5M2（5 位指数 + 2 位尾数）。相比 BF16 算力翻倍、显存减半，是推理量化和训练加速的新标准。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：FP8 的两种格式：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;格式&lt;/th&gt;
					&lt;th&gt;指数&lt;/th&gt;
					&lt;th&gt;尾数&lt;/th&gt;
					&lt;th&gt;动态范围&lt;/th&gt;
					&lt;th&gt;精度&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;E4M3&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;±448&lt;/td&gt;
					&lt;td&gt;较高&lt;/td&gt;
					&lt;td&gt;前向传播、权重、激活&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E5M2&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;±57344&lt;/td&gt;
					&lt;td&gt;较低&lt;/td&gt;
					&lt;td&gt;反向梯度（需要更大范围）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;混合精度 FP8 训练：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前向：权重和激活用 E4M3&lt;/li&gt;
&lt;li&gt;反向：梯度用 E5M2&lt;/li&gt;
&lt;li&gt;主权重和优化器仍用 FP32/BF16&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopper 算力对比：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;精度&lt;/th&gt;
					&lt;th&gt;H100 算力 (TFLOPS)&lt;/th&gt;
					&lt;th&gt;相对 BF16&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;BF16&lt;/td&gt;
					&lt;td&gt;989&lt;/td&gt;
					&lt;td&gt;1x&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FP8&lt;/td&gt;
					&lt;td&gt;1979&lt;/td&gt;
					&lt;td&gt;2x&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;推理中的 FP8：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权重 FP8：显存减半（相比 BF16），decode 阶段读取量减半 → 吞吐近翻倍&lt;/li&gt;
&lt;li&gt;KV Cache FP8：长上下文场景的 KV Cache 内存减半&lt;/li&gt;
&lt;li&gt;几乎无损：FP8 量化精度损失通常 &amp;lt; 1%（比 INT8 更好，因为浮点格式天然适配异常值）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与 INT8 的区别：FP8 是浮点格式，有指数和尾数，能更好地表示大动态范围的 LLM 激活值。INT8 是定点格式，需要校准和缩放因子。&lt;/p&gt;
&lt;p&gt;Blackwell (B200) 进一步支持 FP4 和 FP6，算力可达 10 PFLOPS 级别。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;FP8 Formats for Deep Learning&amp;rdquo; (NVIDIA/ARM/Intel, 2022)；Hopper 架构；FlashAttention-3 (FP8 attention)；vLLM FP8 推理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/fp8/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/fp8/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="allreduce--allgather--reducescatter"&gt;AllReduce / AllGather / ReduceScatter
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：集合通信原语&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：多 GPU 通信的三个基础原语。AllReduce 求和并广播结果，AllGather 收集各卡数据拼成完整结果，ReduceScatter 求和后按分片分发。是 TP/PP/DP/FSDP 的通信基础。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：三种通信原语：&lt;/p&gt;
&lt;p&gt;AllReduce（TP/DP 用）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各卡有一个相同大小的张量，求和后所有卡获得相同结果&lt;/li&gt;
&lt;li&gt;Ring AllReduce：通信量 = 2 × (N-1)/N × tensor_size（最优）&lt;/li&gt;
&lt;li&gt;用途：TP 中 attention/FFN 后的梯度同步；DP 中梯度同步&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AllGather（FSDP/ZeRO-3 前向用）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各卡有不同的分片，收集拼成完整张量，所有卡获得相同完整结果&lt;/li&gt;
&lt;li&gt;通信量 = (N-1)/N × tensor_size&lt;/li&gt;
&lt;li&gt;用途：FSDP 前向恢复完整参数；CP 中收集各段 KV&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ReduceScatter（FSDP/ZeRO-3 反向用）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各卡有完整张量，求和后按分片分发——每卡只得到一个分片&lt;/li&gt;
&lt;li&gt;通信量 = (N-1)/N × tensor_size&lt;/li&gt;
&lt;li&gt;用途：FSDP 反向后分片同步梯度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关系：AllReduce = ReduceScatter + AllGather（先求和分片，再收集完整）&lt;/p&gt;
&lt;p&gt;通信库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NCCL (NVIDIA Collective Communications Library)：GPU 集合通信标准库&lt;/li&gt;
&lt;li&gt;依赖 NVLink/NVSwitch 拓扑，跨节点走 InfiniBand/RoCE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通信优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算-通信重叠：在前向计算时同时启动下一步的通信&lt;/li&gt;
&lt;li&gt;梯度分桶(bucketing)：将梯度分成多个 bucket 分别通信，重叠更充分&lt;/li&gt;
&lt;li&gt;通信压缩：梯度 BF16/FP8 传输减少带宽&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NCCL (NVIDIA)；Horovod；Megatron-LM 通信优化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/deeplearning/nccl/" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/deeplearning/nccl/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.pytorch.org/docs/stable/distributed.html" target="_blank" rel="noopener"
 &gt;https://docs.pytorch.org/docs/stable/distributed.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nvlink--nvswitch"&gt;NVLink / NVSwitch
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：NVLink 互连 / NVSwitch 交换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：NVIDIA 的高速 GPU 互连技术。NVLink 是点对点直连（单链路 50-100 GB/s），NVSwitch 是全互连交换芯片（所有 GPU 间全带宽）。是 TP 等高通信量并行的硬件基础。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：NVLink 各代带宽：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;NVLink 代&lt;/th&gt;
					&lt;th&gt;GPU&lt;/th&gt;
					&lt;th&gt;单链路带宽&lt;/th&gt;
					&lt;th&gt;总带宽&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;NVLink 2&lt;/td&gt;
					&lt;td&gt;V100&lt;/td&gt;
					&lt;td&gt;25 GB/s&lt;/td&gt;
					&lt;td&gt;300 GB/s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NVLink 3&lt;/td&gt;
					&lt;td&gt;A100&lt;/td&gt;
					&lt;td&gt;50 GB/s&lt;/td&gt;
					&lt;td&gt;600 GB/s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NVLink 4&lt;/td&gt;
					&lt;td&gt;H100&lt;/td&gt;
					&lt;td&gt;50 GB/s&lt;/td&gt;
					&lt;td&gt;900 GB/s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NVLink 5&lt;/td&gt;
					&lt;td&gt;B200&lt;/td&gt;
					&lt;td&gt;100 GB/s&lt;/td&gt;
					&lt;td&gt;1.8 TB/s&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;与 PCIe 对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCIe 5.0：~64 GB/s（单向），共享带宽&lt;/li&gt;
&lt;li&gt;NVLink 4：900 GB/s（总），点对点专用&lt;/li&gt;
&lt;li&gt;NVLink 比 PCIe 高 10-15 倍&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NVSwitch：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专用 ASIC 交换芯片，使节点内所有 GPU 全互连（而非点对点）&lt;/li&gt;
&lt;li&gt;8× H100 + NVSwitch：任何两卡间 900 GB/s 全带宽&lt;/li&gt;
&lt;li&gt;DGX H100/H200 节点标配&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对并行策略的影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TP：通信量大（每层 2 次 AllReduce），必须在节点内（NVLink 域），跨节点 TP 性能急剧下降&lt;/li&gt;
&lt;li&gt;PP：通信量小（只传隐状态），可跨节点（InfiniBand）&lt;/li&gt;
&lt;li&gt;EP：All-to-All 通信，最好在节点内或高带宽网络&lt;/li&gt;
&lt;li&gt;DP/FSDP：梯度同步通信量中等，可跨节点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实践规则：TP ≤ 节点内 GPU 数（如 TP=8 for 8×H100），DP/PP 可跨节点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：NVIDIA NVLink 白皮书；DGX H100/H200 架构&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/en-us/data-center/nvlink/" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/en-us/data-center/nvlink/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 8 个 GPU 硬件术语沿&amp;quot;算力墙 vs 带宽墙&amp;quot;两条主线归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tensor Core&lt;/strong&gt; 是 GPU 上专门做矩阵乘加的硬件单元，每周期完成一个小矩阵块 D = A×B + C，相比 CUDA Core 的标量 FMA 高出一个数量级；各代支持的精度逐步扩展（Volta FP16 → Ampere +BF16/TF32/INT8/INT4 → Hopper +FP8 → Blackwell +FP4/FP6），A100-SXM4-40GB 的 BF16 算力为 312 TFLOPS。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MMA / WGMMA&lt;/strong&gt; 是驱动 Tensor Core 的底层指令。MMA 是 Ampere 及之前的同步 warp 级指令，数据加载与计算串行；WGMMA 是 Hopper 的异步 warp group 级指令，可直接从共享内存异步执行矩阵乘加，并与 TMA 配合实现计算-加载重叠。WGMMA 使 H100 的 FP8 算力达到近 2000 TFLOPS，约为 A100 BF16 的 6x；Flash Attention-3 专门利用 WGMMA + TMA 实现 FP8 注意力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TMA&lt;/strong&gt; 是 Hopper 引入的张量内存加速器，单条指令即可发起异步拷贝、把整个多维切片从 HBM 搬到共享内存，不占用计算线程。FA3 用 TMA 替代 FA2 中的手动数据加载，实现 prefetch + 计算重叠，FP8 注意力吞吐提升约 75%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HBM&lt;/strong&gt; 是 GPU 上的高带宽显存，带宽从 V100 的 0.9 TB/s 增长到 B200 的 8 TB/s。LLM 推理 decode 阶段是 memory-bound：每生成 1 token 需读取全部模型权重，70B BF16 = 140GB，H100 3.35 TB/s → ~42ms → ~24 token/s 的理论上限。prefill 阶段则是 compute-bound，瓶颈在 Tensor Core 算力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BF16&lt;/strong&gt; 是 16 位浮点格式，8 位指数 + 7 位尾数，与 FP32 指数位相同、动态范围完全一致，训练时无需 loss scaling，是现代 LLM 训练和推理的默认精度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FP8&lt;/strong&gt; 是 Hopper 原生支持的 8 位浮点格式，有 E4M3（前向/权重/激活）和 E5M2（反向梯度）两种变体；H100 上 BF16 为 989 TFLOPS、FP8 为 1979 TFLOPS，正好 2x。Blackwell B200 进一步支持 FP4 和 FP6，算力可达 10 PFLOPS 级别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AllReduce / AllGather / ReduceScatter&lt;/strong&gt; 是多 GPU 集合通信的三个基础原语：AllReduce 求和并广播、AllGather 收集拼完整、ReduceScatter 求和后按分片分发；AllReduce = ReduceScatter + AllGather。它们是 TP/PP/DP/FSDP 的通信基础，由 NCCL 实现，底层依赖 NVLink/NVSwitch 拓扑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVLink / NVSwitch&lt;/strong&gt; 是 NVIDIA 的高速 GPU 互连：NVLink 是点对点直连，NVSwitch 是全互连交换芯片。NVLink 总带宽从 V100 的 300 GB/s 增长到 B200 的 1.8 TB/s，比 PCIe 5.0 高 10-15 倍。TP 通信量大必须在 NVLink 域内，DP/PP 可跨节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一句话收束：LLM 的所有主流优化都能归到&amp;quot;降读取&amp;quot;（量化、MoE、Flash Attention）或&amp;quot;降计算&amp;quot;（更低精度、更稠密的 Tensor Core 利用率）两条路径上；判断走哪条路径，前提是先看清算力墙和带宽墙分别在哪——这正是本篇 8 个术语要回答的问题。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 7 篇。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（六）：并行策略——多维并行的组合</title><link>https://bevisy.github.io/p/llm-terminology-06-parallelism/</link><pubDate>Mon, 27 Jul 2026 10:15:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-06-parallelism/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-06-parallelism/06.png" alt="Featured image of post LLM 术语全景图（六）：并行策略——多维并行的组合" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 6 篇，覆盖并行策略的 8 个概念：Data Parallelism、Tensor Parallelism、Pipeline Parallelism、Expert Parallelism、Context Parallelism、Sequence Parallelism、FSDP、ZeRO。
主要参考模型：DeepSeek V3、GLM-5、Llama 3、Megatron-LM、vLLM&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇并行策略是组合问题"&gt;开篇：并行策略是组合问题
&lt;/h2&gt;&lt;p&gt;大模型的多卡并行不是单一策略的选择题，而是多维度的组合题。各策略切分的对象不同：Data Parallelism（DP）切 batch，Tensor Parallelism（TP）在层内切权重矩阵，Pipeline Parallelism（PP）在层间切模型，Expert Parallelism（EP）切专家，Context/Sequence Parallelism（CP/SP）切序列。训练大 MoE 模型常同时叠加 TP+EP+PP+DP（或 FSDP/ZeRO 替代纯 DP），DeepSeek V3 即是 TP=8 + EP=32 + PP + DP 的组合；推理侧则以 TP+EP 为主，PP 较少使用（vLLM V1 才补上 PP 推理）。组合时关键约束是通信带宽层级——TP 每层都要 AllReduce，对带宽极敏感，必须放在 NVLink 域内（单节点，TP=2/4/8）；PP 的 stage 间只传隐状态、EP 的 All-to-All 通信量较小，可跨节点；DP 的 AllReduce 介于二者之间。一句话：高带宽通信配高频切分（TP 在节点内），低带宽链路配低频切分（PP/EP 跨节点）。本篇按切分对象逐条梳理这 8 个术语。&lt;/p&gt;
&lt;h2 id="并行策略parallelism-strategies"&gt;并行策略（Parallelism Strategies）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;LLM 训练和推理都需要多 GPU 协作。并行策略决定模型参数、梯度、优化器状态、激活值如何在多卡间分割与通信。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="data-parallelism"&gt;Data Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：DP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：数据并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：每张 GPU 持有完整模型副本，将不同 batch 分配给不同 GPU 并行计算，反向传播后通过 AllReduce 同步梯度。最简单的并行方式，但要求单卡能放下完整模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：DP 的工作流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将 batch 均分到 N 张 GPU，每卡持有相同模型权重&lt;/li&gt;
&lt;li&gt;各卡独立前向 + 反向计算，得到本地梯度&lt;/li&gt;
&lt;li&gt;AllReduce 通信：所有 GPU 梯度求和取平均&lt;/li&gt;
&lt;li&gt;各卡用同步后的梯度更新本地权重&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通信模式：每步训练需 1 次 AllReduce（梯度同步），通信量 = 2 × model_size（ring-allreduce 发送+接收各一次）。&lt;/p&gt;
&lt;p&gt;纯 DP 的限制：单卡必须能放下完整模型 + 优化器状态 + 激活值。对 7B 模型，bf16 权重 14GB + AdamW 优化器状态 (fp32 m/v) 56GB + 激活值 → 需 80GB+ 显存。超过单卡容量就必须用 FSDP/ZeRO 或 TP/PP。&lt;/p&gt;
&lt;p&gt;与 FSDP/ZeRO 的关系：FSDP/ZeRO 是 DP 的改进版，将模型参数也分片到各卡，解决单卡放不下的问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：PyTorch DDP (DistributedDataParallel)；所有多卡训练的基础&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html" target="_blank" rel="noopener"
 &gt;https://docs.pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tensor-parallelism"&gt;Tensor Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：TP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：张量并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将单个层的权重矩阵按行或列切分到多张 GPU 上，各卡并行计算矩阵乘法的不同部分，再通过 AllReduce/AllGather 拼接结果。实现层内并行，是 MoE 大模型推理的标配。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：TP 的两种切分方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Column Parallelism（列并行）：W 按 output 维度切分
&lt;ul&gt;
&lt;li&gt;各卡计算 Y_i = X · W_i（输入相同，权重不同）&lt;/li&gt;
&lt;li&gt;输出拼接需 AllGather&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Row Parallelism（行并行）：W 按 input 维度切分
&lt;ul&gt;
&lt;li&gt;各卡计算 Y_i = X_i · W（输入不同，权重相同）&lt;/li&gt;
&lt;li&gt;输出求和需 AllReduce&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Transformer 层的 TP 策略（Megatron 方案）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attention：Q/K/V 投影用列并行（按 head 切分，天然并行），输出投影用行并行&lt;/li&gt;
&lt;li&gt;FFN：第一个 Linear 列并行，第二个 Linear 行并行&lt;/li&gt;
&lt;li&gt;一层内只需 2 次 AllReduce（attention 后 + FFN 后）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TP 的通信开销：每层 2 次 AllReduce，通信量 = 2 × hidden_size × seq_len × batch × 2 (send+recv)。&lt;/p&gt;
&lt;p&gt;TP 度数选择：通常 TP=2/4/8（受 NVLink 带宽限制，跨节点 TP 性能差）。推理时 TP=N 意味着 N 张卡共同服务一个请求。&lt;/p&gt;
&lt;p&gt;vLLM 推理：&amp;ndash;tensor-parallel-size N&lt;/p&gt;
&lt;p&gt;与 EP 的关系：MoE 模型通常 TP + EP 组合——注意力用 TP，专家用 EP。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Megatron-LM&amp;rdquo; (Shoeybi et al., 2019, arXiv:1909.08053)；DeepSeek V3 (TP=8)；GLM-5 (TP=8)；vLLM 推理标配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1909.08053" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1909.08053&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pipeline-parallelism"&gt;Pipeline Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：PP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：流水线并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将模型的不同层分配到不同 GPU 上，数据像流水线一样依次通过各卡。解决单卡放不下深层模型的问题，但有流水线气泡（bubble）开销。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：PP 的工作方式：&lt;/p&gt;
&lt;p&gt;将 L 层模型分到 N 个 stage（GPU），每个 stage 处理 L/N 层。
GPU 0 (layer 0-15) → GPU 1 (layer 16-31) → &amp;hellip; → GPU N-1 (layer L-N*16 ~ L-1)&lt;/p&gt;
&lt;p&gt;问题：朴素 PP 下，GPU 0 计算 forward 时 GPU 1~N-1 空闲 → 气泡占比 1-1/N。&lt;/p&gt;
&lt;p&gt;GPipe 方案（微批次填充）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将一个 batch 分成 M 个 micro-batch&lt;/li&gt;
&lt;li&gt;M 个 micro-batch 流水通过各 stage&lt;/li&gt;
&lt;li&gt;气泡占比 = (N-1) / (M+N-1)，M 越大气泡越小&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1F1B 调度（Megatron）：交替执行 1 个 forward + 1 个 backward，减少激活值内存峰值。&lt;/p&gt;
&lt;p&gt;PP 的通信：stage 间传递隐状态，通信量 = hidden_size × batch × seq_len，比 TP 小得多（适合跨节点）。&lt;/p&gt;
&lt;p&gt;PP 在推理中的应用：较少用于推理（推理无反向传播，气泡问题不同），主要用于训练。vLLM V1 已支持 PP 推理。&lt;/p&gt;
&lt;p&gt;注意：推测解码（Speculative Decoding）长期与 PP 不兼容，vLLM V1 近期才解决。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;GPipe&amp;rdquo; (Huang et al., 2019, arXiv:1811.06965)；Megatron-LM (1F1B 调度)；DeepSpeed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1811.06965" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1811.06965&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="expert-parallelism"&gt;Expert Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：EP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：专家并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：MoE 模型专用并行策略，将不同的专家（expert）分配到不同 GPU 上，每个 token 通过 All-to-All 通信路由到对应专家所在的卡上计算。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：EP 的核心流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Router 在每卡本地计算路由（哪些 token 去哪些专家）&lt;/li&gt;
&lt;li&gt;All-to-All 通信：将 token 发送到目标专家所在 GPU&lt;/li&gt;
&lt;li&gt;各卡上的专家计算 FFN&lt;/li&gt;
&lt;li&gt;All-to-All 通信：将结果送回原始卡&lt;/li&gt;
&lt;li&gt;Router 加权合并结果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;EP 的通信模式：2 次 All-to-All（dispatch + combine），通信量取决于 token 数和激活专家数。&lt;/p&gt;
&lt;p&gt;EP 度数：通常等于专家数或其因子。如 DeepSeek V3 有 256 个专家，EP=256 意味着每卡 1 个专家。实际中 EP=8/16/32 更常见（每卡多个专家）。&lt;/p&gt;
&lt;p&gt;TP + EP 组合（大 MoE 模型标配）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attention 层：TP 切分（按 head 分卡）&lt;/li&gt;
&lt;li&gt;MoE 层：EP 切分（按 expert 分卡）&lt;/li&gt;
&lt;li&gt;示例：DeepSeek V3 训练用 TP=8 + EP=32 + DP=&amp;hellip; + PP=&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EP 的挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;负载不均衡：某些专家被选中的 token 多，导致某些 GPU 过载&lt;/li&gt;
&lt;li&gt;All-to-All 通信：跨节点延迟高，需要高效通信库（如 NCCL）&lt;/li&gt;
&lt;li&gt;DeepSeek V3 的无辅助损失路由策略帮助均衡&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;GShard&amp;rdquo; (Lepikhin et al., 2020, arXiv:2006.16668)；&amp;ldquo;Switch Transformer&amp;rdquo; (Fedus et al., 2021, arXiv:2101.03961)；DeepSeek V3 (技术报告)；GLM-5 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2101.03961" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2101.03961&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="context-parallelism"&gt;Context Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：CP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：上下文并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将输入序列按长度维度切分到多张 GPU 上，各卡并行处理序列的不同段落，通过环式通信交换 KV 实现完整注意力。用于超长上下文训练和推理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：CP 解决的问题：&lt;/p&gt;
&lt;p&gt;长序列（128K~1M token）的注意力计算 O(n^2) 和 KV Cache 内存超出单卡容量。CP 将序列分段，多卡协作完成注意力。&lt;/p&gt;
&lt;p&gt;工作方式（Ring Attention / Ulysses 两种方案）：&lt;/p&gt;
&lt;p&gt;Ring Attention：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;序列分成 N 段，每卡持有 1 段的 Q/K/V&lt;/li&gt;
&lt;li&gt;KV 在卡间环形传递，每卡依次与其他段的 K/V 做注意力&lt;/li&gt;
&lt;li&gt;N 步后完成完整注意力计算&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ulysses（DeepSpeed Ulysses）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;序列按 head 维度分卡（不是按序列位置）&lt;/li&gt;
&lt;li&gt;通过 All-to-All 将 Q/K/V 重排为每卡持有所有位置的部分 head&lt;/li&gt;
&lt;li&gt;各卡独立计算部分 head 的完整注意力&lt;/li&gt;
&lt;li&gt;再 All-to-All 重排回去&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用 CP 的模型：DeepSeek V3（训练用 CP）、GLM-5（1M 上下文训练）、Kimi Linear（1M 上下文）。&lt;/p&gt;
&lt;p&gt;vLLM 推理中：CP 用于超长上下文推理（如 1M token），&amp;ndash;context-parallel-size N。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Ring Attention&amp;rdquo; (Liu et al., 2023, arXiv:2310.01889)；&amp;ldquo;DeepSpeed Ulysses&amp;rdquo; (Microsoft, 2023)；DeepSeek V3 训练&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/serving/parallelism_scaling.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2310.01889" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2310.01889&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sequence-parallelism"&gt;Sequence Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：SP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：序列并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将序列的激活值沿序列维度切分到多卡，主要用于减少 TP 中 LayerNorm 和 Dropout 的冗余计算和内存。与 CP 类似但侧重点不同——SP 是 TP 的辅助，CP 是独立的注意力并行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：SP 的两种含义：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Megatron SP（TP 辅助）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TP 只切分 Q/K/V/FFN 矩阵，LayerNorm 和 Dropout 在所有 TP 卡上冗余计算&lt;/li&gt;
&lt;li&gt;SP 将 LayerNorm/Dropout 的激活沿序列维度切分，各卡只处理部分 token&lt;/li&gt;
&lt;li&gt;在进入 TP 层前用 AllGather 恢复完整序列&lt;/li&gt;
&lt;li&gt;减少激活内存，但增加通信&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DeepSpeed Ulysses SP（= CP 的一种实现）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;与上述 Megatron SP 不同，是独立的序列维度并行&lt;/li&gt;
&lt;li&gt;通过 All-to-All 重排 head 和 sequence 维度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Megatron SP 与 CP 的区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SP：只切分非 TP 部分（LayerNorm/Dropout），注意力仍在单卡完整计算&lt;/li&gt;
&lt;li&gt;CP：注意力本身也并行化，多卡协作完成完整注意力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实践中 SP 通常与 TP 配合使用（TP+SP），而 CP 可独立使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Megatron-LM&amp;rdquo; (arXiv:2104.04473, SP 部分)；DeepSpeed Ulysses&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/Megatron-LM" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/Megatron-LM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fully-sharded-data-parallelism"&gt;Fully Sharded Data Parallelism
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：FSDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：全分片数据并行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DP 的进化版，将模型参数、梯度、优化器状态全部分片到各 GPU，计算时按需 AllGather 恢复完整参数，反向后 ReduceScatter 分片梯度。PyTorch 原生支持的大模型训练方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：FSDP 的工作流程：&lt;/p&gt;
&lt;p&gt;前向传播：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入某层前，AllGather 从各卡收集该层完整参数&lt;/li&gt;
&lt;li&gt;用完整参数计算前向&lt;/li&gt;
&lt;li&gt;计算完后立即丢弃完整参数，只保留本卡分片（节省显存）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;反向传播：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;再次 AllGather 恢复该层参数&lt;/li&gt;
&lt;li&gt;计算梯度&lt;/li&gt;
&lt;li&gt;ReduceScatter 将梯度按分片同步到各卡&lt;/li&gt;
&lt;li&gt;各卡用本地分片梯度更新本地分片的优化器状态&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;显存节省：模型参数+梯度+优化器从全量 (16+16+32 = 64 bytes/param, fp32 AdamW) 降至 1/N。7B 模型在 N=8 卡上每卡仅需 ~8GB 而非 ~56GB。&lt;/p&gt;
&lt;p&gt;FSDP vs ZeRO-3：两者原理几乎相同，FSDP 是 PyTorch 原生实现，ZeRO-3 是 DeepSpeed 实现。FSDP 更易用，ZeRO 配置更灵活。&lt;/p&gt;
&lt;p&gt;FSDP 的分层分片（nested FSDP / per-layer sharding）：可按层粒度分片，进一步减少峰值显存（只需单层完整参数在内存中）。&lt;/p&gt;
&lt;p&gt;混合并行：FSDP + TP + PP 可组合使用。如 FSDP(dp=4) + TP(tp=8) + PP(pp=2) 用于超大模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;PyTorch FSDP&amp;rdquo; (Zhao et al., 2023, arXiv:2304.11277)；PyTorch 2.x 原生支持；Llama 3 训练&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.pytorch.org/docs/stable/fsdp.html" target="_blank" rel="noopener"
 &gt;https://docs.pytorch.org/docs/stable/fsdp.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/2304.11277" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/2304.11277&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="zero-redundancy-optimizer"&gt;Zero Redundancy Optimizer
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：ZeRO&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：零冗余优化器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSpeed 提出的训练内存优化方案，逐步消除 DP 中的冗余：ZeRO-1 分片优化器状态，ZeRO-2 额外分片梯度，ZeRO-3 额外分片参数。FSDP 的理论基础。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：ZeRO 的三个阶段：&lt;/p&gt;
&lt;p&gt;基线（纯 DP）：每卡存储完整参数(P) + 梯度(G) + 优化器状态(O)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以 7B 模型 fp32 AdamW 为例：P=28GB, G=28GB, O=56GB → 共 112GB/卡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZeRO-1：分片优化器状态 O → 每卡 1/N 的 O&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节省：56GB → 56/N GB。总显存 28+28+56/N&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZeRO-2：额外分片梯度 G → 每卡 1/N 的 G 和 O&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节省：(28+56)/N。总显存 28+84/N&lt;/li&gt;
&lt;li&gt;反向后只同步本卡负责的参数的梯度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZeRO-3：额外分片参数 P → 每卡 1/N 的 P、G、O&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节省：全部 112/N。7B 模型 8 卡只需 14GB/卡&lt;/li&gt;
&lt;li&gt;前向/反向需 AllGather 恢复完整参数（= FSDP）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通信代价：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ZeRO-1/2：与纯 DP 相同（1 次 AllReduce 梯度），无额外通信&lt;/li&gt;
&lt;li&gt;ZeRO-3：每层 1 次 AllGather(前向) + 1 次 ReduceScatter(反向)，通信量增加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZeRO-Infinity：进一步将分片卸载到 CPU 内存和 NVMe SSD，突破 GPU 显存限制。&lt;/p&gt;
&lt;p&gt;实践选择：ZeRO-2 是性能和内存的最佳平衡点（无额外通信开销）。ZeRO-3 用于单卡放不下的超大模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;ZeRO: Memory Optimizations Toward Training Trillion Parameter Models&amp;rdquo; (Rajbhandari et al., 2020, arXiv:1910.02054)；DeepSpeed；FSDP 基于此设计&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.deepspeed.ai/tutorials/zero/" target="_blank" rel="noopener"
 &gt;https://www.deepspeed.ai/tutorials/zero/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1910.02054" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1910.02054&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 8 个并行策略术语沿&amp;quot;切什么维度 + 内存如何分片&amp;quot;两条线归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DP&lt;/strong&gt; 每卡完整模型分不同数据，最简单但要求单卡放下完整模型；反向后 AllReduce 同步梯度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TP&lt;/strong&gt; 层内切权重矩阵，各卡算矩阵乘法的不同部分再 AllReduce/AllGather 拼接；NVLink 域内有效，是 MoE 大模型推理标配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PP&lt;/strong&gt; 层间切分，数据像流水线依次通过各卡，解决深模型单卡放不下的问题，但有流水线气泡开销；GPipe 和 1F1B 两种调度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EP&lt;/strong&gt; MoE 专用，把不同专家分到不同 GPU，token 通过 All-to-All 通信路由到专家所在卡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CP&lt;/strong&gt; 把输入序列按长度切分到多卡，各卡处理不同段落并通过环式通信交换 KV 实现完整注意力；用于超长上下文训练和推理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SP&lt;/strong&gt; 切序列的激活值，主要用于减少 TP 中 LayerNorm/Dropout 的冗余计算；是 TP 的辅助，与 CP 的区别是 SP 依附于 TP、CP 是独立的注意力并行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FSDP&lt;/strong&gt; DP 的进化版，参数/梯度/优化器状态全部分片，计算时按需 AllGather 恢复完整参数；PyTorch 原生支持的大模型训练方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZeRO&lt;/strong&gt; DeepSpeed 的内存优化三阶段：ZeRO-1 分片优化器状态、ZeRO-2 加分片梯度、ZeRO-3 加分片参数（= FSDP）；ZeRO-2 是性能与内存的最佳平衡点（无额外通信），ZeRO-3 用于单卡放不下的超大模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;组合关系：大模型训练标配 TP+EP+PP+DP/ZeRO 多维并行（TP 在 NVLink 域内、PP 跨节点、DP/ZeRO 切数据、EP 切专家），推理标配 TP+EP。FSDP 是 ZeRO-3 的工程实现，两者理论基础一致。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 6 篇。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（五）：推理优化——从推测解码到 Flash Attention</title><link>https://bevisy.github.io/p/llm-terminology-05-inference-optimization/</link><pubDate>Mon, 27 Jul 2026 10:00:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-05-inference-optimization/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-05-inference-optimization/05.png" alt="Featured image of post LLM 术语全景图（五）：推理优化——从推测解码到 Flash Attention" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 5 篇，覆盖推理优化的 5 个概念：Speculative Decoding、PagedAttention、Continuous Batching、Quantization（总览）、Flash Attention。
主要参考框架/论文：vLLM、FlashAttention、Orca、DeepSeek V3 MTP&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇推理优化的两个方向"&gt;开篇：推理优化的两个方向
&lt;/h2&gt;&lt;p&gt;推理优化沿两个方向展开。第一是减少单位计算的代价：Flash Attention 通过 tiling 重排注意力计算的内存访问模式，把 HBM 与 SRAM 之间的读写复杂度从 O(n²) 降到 O(n²/M)，不改变注意力的数学结果；Quantization 把权重/激活从 BF16 降到 INT8/INT4/FP8，直接压低显存占用和每步访存量。第二是提高 GPU 利用率：PagedAttention 把 KV Cache 切成固定 block 按需分配，消除碎片让显存利用率从 ~20% 提升到 ~96%；Continuous Batching 在每个 iteration 动态进出请求，避免短序列空等长序列；Speculative Decoding 用小模型先起草、大模型并行验证，减少 decode 步数。本篇按这两个方向梳理 5 个推理优化术语。&lt;/p&gt;
&lt;h2 id="推理优化inference-optimization"&gt;推理优化（Inference Optimization）
&lt;/h2&gt;&lt;h3 id="speculative-decoding"&gt;Speculative Decoding
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：SpecDec / 推测解码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：推测解码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：用小模型（draft model）快速生成候选 token，大模型（target model）并行验证，接受正确的候选 token 以加速推理。典型加速 2-3 倍，输出完全无损。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：推测解码的工作流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Draft：小模型快速生成 k 个候选 token {t_1, t_2, &amp;hellip;, t_k}&lt;/li&gt;
&lt;li&gt;Verify：大模型一次前向传播，并行计算这 k 个 token 的概率&lt;/li&gt;
&lt;li&gt;Accept/Reject：对每个候选 token，如果大模型也认为正确则接受，否则从拒绝点重新采样&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键性质：输出分布与纯大模型生成完全一致（无损），通过拒绝采样保证数学等价。&lt;/p&gt;
&lt;p&gt;变体：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准 SpecDec：独立的小模型作为 draft&lt;/li&gt;
&lt;li&gt;MTP 推测：DeepSeek V3/R1 用训练时 MTP 模块作为内置 draft model&lt;/li&gt;
&lt;li&gt;Medusa：多头并行预测&lt;/li&gt;
&lt;li&gt;EAGLE：在隐空间而非 token 空间做推测&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vLLM 中的使用：
&amp;ndash;speculative-config=&amp;rsquo;{&amp;ldquo;method&amp;rdquo;: &amp;ldquo;deepseek_mtp&amp;rdquo;, &amp;ldquo;num_speculative_tokens&amp;rdquo;: 1}'&lt;/p&gt;
&lt;p&gt;性能：典型场景加速 2-3x，但加速比取决于 draft 模型的接受率（accept rate）。&lt;/p&gt;
&lt;p&gt;注意：推测解码目前与 Pipeline Parallelism 不兼容（vLLM V1 已部分解决）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Speculative Decoding&amp;rdquo; (Leviathan et al., 2023, arXiv:2211.17192)；DeepSeek V3 MTP (技术报告)；EAGLE、Medusa&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://rocm.docs.amd.com/projects/ai-developer-hub/en/latest/notebooks/inference/mtp.html" target="_blank" rel="noopener"
 &gt;https://rocm.docs.amd.com/projects/ai-developer-hub/en/latest/notebooks/inference/mtp.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/spec_decode.html" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/spec_decode.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pagedattention"&gt;PagedAttention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：分页注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：vLLM 提出的 KV Cache 管理方法，将 KV Cache 分为固定大小的块（page），按需分配，类似操作系统的虚拟内存分页机制，大幅减少显存碎片和浪费。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：PagedAttention 的设计：&lt;/p&gt;
&lt;p&gt;传统方式：为每个序列预分配最大长度的连续 KV Cache 空间
问题：实际序列通常远短于最大长度，造成大量显存浪费和碎片&lt;/p&gt;
&lt;p&gt;PagedAttention：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 KV Cache 分为固定大小的 block（如 16 token/block）&lt;/li&gt;
&lt;li&gt;每个序列维护一个 block table（类似页表），映射逻辑位置到物理 block&lt;/li&gt;
&lt;li&gt;按需分配 block，不需要预分配最大长度&lt;/li&gt;
&lt;li&gt;显存利用率从 ~20% 提升到 ~96%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持更大的 batch size（更多并发请求）&lt;/li&gt;
&lt;li&gt;允许变长序列（无需预知长度）&lt;/li&gt;
&lt;li&gt;支持共享 KV（如 beam search 共享 prefix）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PagedAttention 是 vLLM 高吞吐推理的核心技术，已被广泛集成到主流推理框架。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Efficient Memory Management for LLMs with PagedAttention&amp;rdquo; (Kwon et al., 2023, arXiv:2309.06180)；vLLM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="continuous-batching"&gt;Continuous Batching
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：连续批处理 / 动态批处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：在推理过程中动态插入新请求和移除已完成请求，而非等待整个 batch 全部完成。与 PagedAttention 配合实现高吞吐推理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：传统静态批处理 vs 连续批处理：&lt;/p&gt;
&lt;p&gt;静态批处理：batch 中最长的序列决定整个 batch 的等待时间，短序列 GPU 空闲
连续批处理：每个 iteration 检查 batch，完成的请求移出，新请求加入&lt;/p&gt;
&lt;p&gt;配合 PagedAttention，不同序列可以不同长度、不同阶段（prefill/decode 混合），实现 GPU 持续高利用率。&lt;/p&gt;
&lt;p&gt;vLLM、TGI、SGLang 等推理框架均采用连续批处理作为基础调度策略。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：vLLM (arXiv:2309.06180)；Orca (OSDI 2022)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="quantization"&gt;Quantization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：Quant / 量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：模型量化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将模型参数从高精度（FP32/FP16/BF16）降至低精度（INT8/INT4/FP8），减少显存占用和推理延迟。分为训练后量化（PTQ）和量化感知训练（QAT）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：主要量化方案：&lt;/p&gt;
&lt;p&gt;按精度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FP8：Hopper GPU 原生支持，几乎无损&lt;/li&gt;
&lt;li&gt;INT8：W8A8（权重和激活都 INT8），精度损失较小&lt;/li&gt;
&lt;li&gt;INT4：W4A16（权重 INT4，激活 FP16），显存大幅减少但需要校正&lt;/li&gt;
&lt;li&gt;GGUF：llama.cpp 格式，支持 2-8 bit 量化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PTQ（Post-Training Quantization）：训练后直接量化，简单快速
&lt;ul&gt;
&lt;li&gt;GPTQ：基于二阶信息的逐层量化&lt;/li&gt;
&lt;li&gt;AWQ：保护重要权重的激活感知量化&lt;/li&gt;
&lt;li&gt;SmoothQuant：将量化难度从激活转移到权重&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;QAT（Quantization-Aware Training）：训练时模拟量化，精度更高但需训练&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际效果（以 70B 模型为例）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BF16：~140 GB（需 2×A100 80GB）&lt;/li&gt;
&lt;li&gt;INT8：~70 GB（1×A100 80GB）&lt;/li&gt;
&lt;li&gt;INT4：~35 GB（1×A100 40GB 可行）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;趋势：FP8 量化成为 Hopper/Blackwell GPU 上的主流选择，近乎无损且硬件原生支持。&lt;/p&gt;
&lt;p&gt;本条为量化总览，按精度和按方法的分类到此为止；具体量化方法（GPTQ / AWQ / SmoothQuant / FP8 详析等）见篇 8。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：GPTQ (arXiv:2210.17323)；AWQ (arXiv:2306.00978)；SmoothQuant (arXiv:2211.10438)；llama.cpp GGUF&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.vllm.ai/en/latest/features/quantization/" target="_blank" rel="noopener"
 &gt;https://docs.vllm.ai/en/latest/features/quantization/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="flash-attention"&gt;Flash Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：FA / FlashAttn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：闪存注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：通过重新组织注意力计算的内存访问模式，减少 GPU HBM 和 SRAM 之间的读写次数，在不改变注意力数学结果的情况下加速计算 2-4 倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Flash Attention 的核心思想：&lt;/p&gt;
&lt;p&gt;问题：标准注意力的中间矩阵 (Q·K^T) 大小为 n×n，远超 GPU SRAM 容量，需频繁读写 HBM
方案：将 Q/K/V 分块加载到 SRAM，计算局部注意力并累积结果，避免实例化完整 n×n 矩阵&lt;/p&gt;
&lt;p&gt;关键技术：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tiling：将 Q/K/V 分块，每次处理一个块&lt;/li&gt;
&lt;li&gt;Recomputation：反向传播时不存储中间矩阵，重新计算（省显存但略增计算）&lt;/li&gt;
&lt;li&gt;Online Softmax：分块计算 softmax 的数值稳定算法&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;性能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前向传播：减少 HBM 读写，IO 复杂度从 O(n^2) 降至 O(n^2 / M)，M 为 SRAM 大小&lt;/li&gt;
&lt;li&gt;反向传播：不存储 attention matrix，显存从 O(n^2) 降至 O(n)&lt;/li&gt;
&lt;li&gt;实测加速：2-4x（取决于序列长度和硬件）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flash Attention 已成为 LLM 训练和推理的标准组件，PyTorch 2.0+ 内置支持。&lt;/p&gt;
&lt;p&gt;版本演进：FA1 (2022) → FA2 (2023, 更高效) → FA3 (2024, 支持 FP8)&lt;/p&gt;
&lt;p&gt;注意：Flash Attention 是计算优化，不改变注意力的数学结果。与稀疏注意力（DSA/SWA）是正交概念——前者优化&amp;quot;怎么算&amp;quot;，后者改变&amp;quot;算什么&amp;quot;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;FlashAttention: Fast and Memory-Efficient Exact Attention&amp;rdquo; (Dao et al., 2022, arXiv:2205.14135)；FlashAttention-2 (Dao, 2023)；FlashAttention-3 (2024)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Dao-AILab/flash-attention" target="_blank" rel="noopener"
 &gt;https://github.com/Dao-AILab/flash-attention&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speculative Decoding（推测解码）&lt;/strong&gt; 用 draft model 起草、target model 并行验证，输出分布通过拒绝采样与纯大模型生成数学等价（无损），典型加速 2-3x；与 Pipeline Parallelism 不兼容，vLLM V1 已部分解决。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PagedAttention&lt;/strong&gt; 把 KV Cache 切成固定 block 按需分配，配 block table 类比操作系统的虚拟内存分页，显存利用率从 ~20% 提升到 ~96%，是 vLLM 高吞吐的核心。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Batching&lt;/strong&gt; 在每个 iteration 动态进出请求，配合 PagedAttention 让 prefill/decode 混合、变长序列共存，GPU 持续高利用率；源自 Orca (OSDI 2022)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantization&lt;/strong&gt; 按精度（FP8/INT8/INT4/GGUF）和按方法（PTQ vs QAT）两条轴分类；70B 模型 BF16 ~140GB / INT8 ~70GB / INT4 ~35GB；具体量化方法见篇 8。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash Attention&lt;/strong&gt; 用 tiling + online softmax 把 IO 复杂度从 O(n²) 降到 O(n²/M)（M 为 SRAM 大小），是计算优化而非改变注意力数学；与稀疏注意力（DSA/SWA）正交——前者优化&amp;quot;怎么算&amp;quot;，后者改变&amp;quot;算什么&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本系列共 11 篇，本文是第 5 篇。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（四）：训练方法——从 RLHF 到 GRPO 的演进</title><link>https://bevisy.github.io/p/llm-terminology-04-rlhf-grpo/</link><pubDate>Mon, 27 Jul 2026 09:45:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-04-rlhf-grpo/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-04-rlhf-grpo/04.png" alt="Featured image of post LLM 术语全景图（四）：训练方法——从 RLHF 到 GRPO 的演进" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 4 篇，覆盖训练方法的 6 个概念：GRPO、RLHF、DPO、SFT、Knowledge Distillation、Muon Optimizer。
主要参考模型：DeepSeek R1、Qwen3、Llama 3、Kimi K2、GPT-4&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇后训练范式的三个阶段"&gt;开篇：后训练范式的三个阶段
&lt;/h2&gt;&lt;p&gt;后训练（post-training）在 2022-2026 年间走过三个可辨识的阶段。第一阶段是 SFT（Supervised Fine-Tuning）：用人工标注的高质量 (prompt, response) 对微调预训练基座，让模型学会遵循指令、采用对话格式输出，几乎所有对话 LLM 的第一步后训练都是 SFT。第二阶段是 RLHF/DPO 对齐人类偏好：RLHF 先训练 Reward Model 再用 RL 优化，DPO 则跳过 Reward Model 直接从偏好数据优化，目标是让模型输出符合人类对&amp;quot;有用、无害、诚实&amp;quot;的偏好。第三阶段是 GRPO/RLVR 用可验证奖励驱动推理能力涌现：RLVR（RL with Verifiable Rewards）用规则验证奖励（如数学答案对错、代码测试通过）替代学到的 Reward Model，GRPO 去掉 PPO 的 Critic 用组内相对优势做基线。DeepSeek R1-Zero 跳过 SFT 直接做纯 GRPO（RLVR）就涌现出长链推理和&amp;quot;Aha Moment&amp;quot;，是这一阶段的标志性事件——它证明 RL 可独立于 SFT 涌现推理能力，但 R1 正式版仍加入 SFT 阶段以提升最终可用性。本篇按这条主线梳理 6 个训练方法术语。&lt;/p&gt;
&lt;h2 id="训练方法training-methods"&gt;训练方法（Training Methods）
&lt;/h2&gt;&lt;h3 id="group-relative-policy-optimization"&gt;Group Relative Policy Optimization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：GRPO&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：组相对策略优化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek 提出的强化学习算法，去除 PPO 的独立价值网络（critic），改用同一 prompt 的多个采样响应的组内平均作为基线，大幅降低训练内存和计算成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：GRPO vs PPO：&lt;/p&gt;
&lt;p&gt;PPO 需要训练 4 个模型：Actor、Critic、Reward Model、Reference Model
GRPO 只需 3 个：Actor、Reward Model、Reference Model（去掉 Critic）&lt;/p&gt;
&lt;p&gt;GRPO 的优势计算：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对同一 prompt x，采样 G 个响应 {o_1, &amp;hellip;, o_G}&lt;/li&gt;
&lt;li&gt;用 Reward Model 或规则打分得到 {r_1, &amp;hellip;, r_G}&lt;/li&gt;
&lt;li&gt;组内归一化：advantage_i = (r_i - mean(r)) / std(r)&lt;/li&gt;
&lt;li&gt;用 advantage 更新 Actor（带 PPO 的 clip 机制）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;省去 Critic 模型——PPO 需训练 Actor 和 Critic 两个模型，GRPO 只训练 Actor 一个，需训练的模型显存减少约一半&lt;/li&gt;
&lt;li&gt;组内相对比较天然适合推理任务（数学/代码有明确对错）&lt;/li&gt;
&lt;li&gt;DeepSeek R1-Zero 证明纯 RL（无 SFT）也能涌现推理能力（&amp;ldquo;Aha Moment&amp;rdquo;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepSeek R1 训练流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;R1-Zero：V3 基座 → 纯 GRPO（无 SFT）→ 涌现推理&lt;/li&gt;
&lt;li&gt;R1：V3 基座 → 少量 SFT（CoT 数据）→ GRPO → SFT（600K+200K 样本）→ GRPO&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;采用 GRPO 的模型：DeepSeek R1、Qwen3（部分阶段）、Kimi K1.5 等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;DeepSeekMath&amp;rdquo; (arXiv:2402.03300, 首次提出 GRPO)；DeepSeek R1 (arXiv:2501.12948)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://snorkel.ai/grpo" target="_blank" rel="noopener"
 &gt;https://snorkel.ai/grpo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/learn/llm-course/en/chapter12/3" target="_blank" rel="noopener"
 &gt;https://huggingface.co/learn/llm-course/en/chapter12/3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=bAWV_yrqx4w" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=bAWV_yrqx4w&lt;/a&gt; (Yannic Kilcher GRPO 讲解)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reinforcement-learning-from-human-feedback"&gt;Reinforcement Learning from Human Feedback
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：RLHF&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：基于人类反馈的强化学习&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：通过人类偏好数据训练奖励模型，再用该奖励模型通过 RL 优化 LLM 输出。ChatGPT 的核心训练方法，使模型输出符合人类偏好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：RLHF 的标准三阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SFT（监督微调）：用人类标注的高质量对话微调基座模型&lt;/li&gt;
&lt;li&gt;Reward Model 训练：用人类偏好评判数据（A &amp;gt; B 或评分）训练奖励模型&lt;/li&gt;
&lt;li&gt;RL 优化：用 PPO/GRPO 等算法，以 Reward Model 的分数为奖励优化 SFT 模型&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键组件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preference Data：人类标注 (prompt, response_A, response_B, preference)&lt;/li&gt;
&lt;li&gt;Reward Model：学习预测人类偏好分数&lt;/li&gt;
&lt;li&gt;Reference Model：KL 散度约束，防止 RL 优化偏离原始分布&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;变体：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RLAIF：用 AI（而非人类）生成偏好数据，降低标注成本&lt;/li&gt;
&lt;li&gt;DPO（Direct Preference Optimization）：跳过 Reward Model，直接从偏好数据优化&lt;/li&gt;
&lt;li&gt;RLVR（RL with Verifiable Rewards）：规则验证奖励（如数学答案对错），无需 Reward Model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPT-4/Claude 的训练使用 RLHF；DeepSeek R1 使用 RLVR + GRPO；Qwen3 使用 DPO + GRPO 组合。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;InstructGPT&amp;rdquo; (Ouyang et al., 2022, arXiv:2203.02155)；&amp;ldquo;Constitutional AI&amp;rdquo; (Claude, Anthropic)；ChatGPT、GPT-4、Claude&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/learn/llm-course/en/chapter12/3" target="_blank" rel="noopener"
 &gt;https://huggingface.co/learn/llm-course/en/chapter12/3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.turingpost.com/p/attention-types" target="_blank" rel="noopener"
 &gt;https://www.turingpost.com/p/attention-types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="direct-preference-optimization"&gt;Direct Preference Optimization
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：DPO&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：直接偏好优化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：跳过显式 Reward Model 训练，直接从偏好数据对优化 LLM。将 RLHF 的两阶段（训练 RM + RL 优化）简化为单阶段，训练更简单稳定。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：DPO 的核心思想：&lt;/p&gt;
&lt;p&gt;传统 RLHF：偏好数据 → 训练 RM → RL 优化 Actor
DPO：偏好数据 → 直接优化 Actor（用特定损失函数）&lt;/p&gt;
&lt;p&gt;DPO 损失：&lt;/p&gt;
&lt;p&gt;L_DPO = -log σ(β · [log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)])&lt;/p&gt;
&lt;p&gt;其中 y_w 是偏好响应，y_l 是不偏好响应，π 是当前策略，π_ref 是参考策略。&lt;/p&gt;
&lt;p&gt;优势：无需训练和部署独立的 Reward Model，训练流程更简单，显存更少。
劣势：对偏好数据质量更敏感，不如 PPO/GRPO 灵活。&lt;/p&gt;
&lt;p&gt;采用 DPO 的模型：Qwen3（部分后训练阶段）、Llama 3 Instruct、Mistral 等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Direct Preference Optimization&amp;rdquo; (Rafailov et al., 2023, arXiv:2305.18290)；Llama 3、Qwen3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/learn/llm-course/en/chapter12" target="_blank" rel="noopener"
 &gt;https://huggingface.co/learn/llm-course/en/chapter12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="supervised-fine-tuning"&gt;Supervised Fine-Tuning
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：SFT&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：监督微调&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：用人工标注的高质量输入-输出对微调预训练基座模型，使其学会遵循指令和对话格式。几乎所有对话 LLM 的第一步后训练。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：SFT 的训练方式：&lt;/p&gt;
&lt;p&gt;输入：高质量 (prompt, response) 对
损失：标准的 next-token prediction loss（仅在 response 部分计算）&lt;/p&gt;
&lt;p&gt;数据规模：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DeepSeek R1：SFT 阶段使用 600K 推理样本 + 200K 通用样本&lt;/li&gt;
&lt;li&gt;Qwen3：数十万到百万级 SFT 样本&lt;/li&gt;
&lt;li&gt;Llama 3：超过 10M 对话样本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SFT 在训练流程中的位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;预训练（海量无标注文本）→ SFT（标注对话）→ RLHF/DPO（偏好优化）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepSeek R1 的特殊路径：R1-Zero 跳过 SFT 直接做纯 RL，证明 RL 可独立涌现推理能力。但 R1 正式版仍加入了 SFT 阶段以提升可用性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;InstructGPT&amp;rdquo; (Ouyang et al., 2022)；DeepSeek R1 (技术报告)；Qwen3 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/learn/llm-course/en/chapter12" target="_blank" rel="noopener"
 &gt;https://huggingface.co/learn/llm-course/en/chapter12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="knowledge-distillation"&gt;Knowledge Distillation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：KD / 蒸馏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：知识蒸馏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：用大模型（教师）的输出训练小模型（学生），使小模型获得接近大模型的能力。DeepSeek R1 用 R1 蒸馏出多个小模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：LLM 蒸馏的常见方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;输出蒸馏（Output Distillation / 黑盒蒸馏）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用教师模型生成高质量响应（含 CoT 推理链）&lt;/li&gt;
&lt;li&gt;将这些响应作为 SFT 数据训练学生模型&lt;/li&gt;
&lt;li&gt;DeepSeek R1 的做法：用 R1 生成 800K 推理数据，蒸馏到 Qwen/Llama 1.5B~70B（官方写法为 Llama-3.1-8B-Base 和 Llama-3.3-70B-Instruct）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logits 蒸馏（白盒蒸馏）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学生模型学习教师模型的 logits 分布（软标签）&lt;/li&gt;
&lt;li&gt;损失：KL(p_teacher || p_student)&lt;/li&gt;
&lt;li&gt;保留更多信息（比硬标签丰富）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DeepSeek R1 蒸馏模型表现（技术报告表格）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;R1-Distill-Qwen-1.5B 在 AIME 28.9%，超过 GPT-4o&lt;/li&gt;
&lt;li&gt;R1-Distill-Qwen-7B 在 AIME 55.5%&lt;/li&gt;
&lt;li&gt;R1-Distill-Qwen-32B 接近 o1-mini&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：蒸馏不能创造新能力，只能传递教师已有的能力。学生模型的上限是教师模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek R1 (arXiv:2501.12948, 蒸馏部分)；&amp;ldquo;Distilling Reasoning&amp;rdquo; 等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/learn/llm-course/en/chapter12/3" target="_blank" rel="noopener"
 &gt;https://huggingface.co/learn/llm-course/en/chapter12/3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="muon-optimizer"&gt;Muon Optimizer
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：Muon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：Muon 优化器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：基于矩阵正交化的新型优化器，对 2D 参数矩阵做 SVD 正交化后再更新梯度，收敛速度快于 AdamW。DeepSeek V4 等新一代模型采用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Muon 的核心思想：&lt;/p&gt;
&lt;p&gt;标准 Adam/AdamW：对每个参数的梯度做一阶/二阶动量估计
Muon：对 2D 权重矩阵的梯度做正交化（Newton-Schulz 迭代近似 SVD），然后更新&lt;/p&gt;
&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅适用于 2D 矩阵参数（Linear 层权重），1D 参数（bias、norm）仍用 AdamW&lt;/li&gt;
&lt;li&gt;正交化使更新方向更稳定，减少训练震荡&lt;/li&gt;
&lt;li&gt;收敛更快：在同等性能下可减少训练步数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;采用 Muon 的模型：DeepSeek V4（Muon-based optimization）；Kimi K2（MuonClip，Muon 的改进版本）&lt;/p&gt;
&lt;p&gt;注意：Muon 是 2025 年出现的新优化器，生态尚在发展，但已被多个大型模型验证有效。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Muon&amp;rdquo; (J. Jordan, 2024-2025)；DeepSeek V4 (技术报告)；Kimi K2 技术报告 (MuonClip)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt; (DeepSeek V4 部分)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 6 个训练方法术语沿&amp;quot;后训练三阶段&amp;quot;归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SFT&lt;/strong&gt; 是几乎所有对话 LLM 的第一步，用标注 (prompt, response) 对教会模型对话格式；DeepSeek R1-Zero 跳过 SFT 直接 RL 是例外而非通则，R1 正式版仍回归 SFT。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RLHF&lt;/strong&gt; 用学到的 Reward Model 优化人类偏好，标准三阶段（SFT → RM → RL）；&lt;strong&gt;DPO&lt;/strong&gt; 跳过 RM 直接从偏好数据优化，单阶段更简单但对数据质量更敏感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GRPO&lt;/strong&gt; 去掉 PPO 的 Critic，用组内相对优势做基线，需训练的模型从 2 个减到 1 个（Actor），显存减少约一半（按&amp;quot;需训练的模型&amp;quot;计）。GRPO 配合 RLVR 的可验证奖励，是 R1-Zero 涌现推理的算法载体。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledge Distillation&lt;/strong&gt; 不创造新能力，只传递教师已有能力；R1 蒸馏 800K 推理数据到 Qwen 1.5B~32B 和 Llama 8B/70B，其中 R1-Distill-Qwen-1.5B 在 AIME 28.9% 已超过 GPT-4o。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Muon Optimizer&lt;/strong&gt; 是 2025 年新优化器，对 2D 矩阵参数做正交化更新，已被 DeepSeek V4 和 Kimi K2（MuonClip）采用，生态发展中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本系列共 11 篇，本文是第 4 篇。系列导航见：LLM 术语全景图系列导读。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（三）：模型架构——MoE 与残差连接的演进</title><link>https://bevisy.github.io/p/llm-terminology-03-moe-residual/</link><pubDate>Mon, 27 Jul 2026 09:30:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-03-moe-residual/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-03-moe-residual/03.png" alt="Featured image of post LLM 术语全景图（三）：模型架构——MoE 与残差连接的演进" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 3 篇，覆盖模型架构的 8 个概念：MoE、MTP、mHC、RoPE、YaRN、RMSNorm、SwiGLU、KV Cache。
主要参考模型：DeepSeek V3/V4、GLM-5、Kimi K2、Llama 3、Mixtral&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇模型架构的三条演进线"&gt;开篇：模型架构的三条演进线
&lt;/h2&gt;&lt;p&gt;把 2023 年到 2026 年的主流 LLM 架构按时间铺开，能清晰看到三条并行的演进线，本篇的 8 个概念分别落在其中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一条线是 FFN 的 MoE 化。&lt;/strong&gt; 稠密 FFN 被替换为多个并行专家，路由器为每个 token 只激活少量专家。结果是模型总参数量大幅膨胀（DeepSeek V3 达 671B、Kimi K2 达 1T），但单次前向的激活参数仍保持在 30B-40B 量级，激活比压到 5% 上下。MoE 让&amp;quot;大参数量&amp;quot;与&amp;quot;低激活成本&amp;quot;第一次解耦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二条线是残差连接从单流到多流。&lt;/strong&gt; 标准 ResNet 残差是 &lt;code&gt;y = x + F(x)&lt;/code&gt; 的单残差通路；Hyper-Connections 把它扩展为 n 个并行残差流，并用 Pre/Res/Post 三类映射在层间混合；mHC 进一步把 Res Mapping 约束到双随机矩阵流形，避免深层堆叠时信号不可预测地放大或缩小。残差通路变宽，但 FLOPs 几乎不增。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三条线是基础组件趋于稳定。&lt;/strong&gt; 位置编码收敛到 RoPE（长上下文用 YaRN 扩展），归一化收敛到 RMSNorm 的 Pre-Norm 用法，FFN 激活收敛到 SwiGLU，KV Cache 则成为所有自回归推理绕不开的物理瓶颈。这三类组件已没有太多设计争议，新一代模型主要在 MoE 和残差结构上做差异化。&lt;/p&gt;
&lt;p&gt;下面逐一展开。&lt;/p&gt;
&lt;h2 id="模型架构architecture-components"&gt;模型架构（Architecture Components）
&lt;/h2&gt;&lt;h3 id="mixture-of-experts"&gt;Mixture of Experts
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MoE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：混合专家模型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：将 FFN 层替换为多个并行的&amp;quot;专家&amp;quot;网络，通过路由器（router/gate）为每个 token 选择少量专家激活，实现大参数量但低激活成本的模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：MoE 的核心计算：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Router 计算：g(x) = softmax(W_gate · x)，为每个专家打分&lt;/li&gt;
&lt;li&gt;Top-k 选择：选出得分最高的 k 个专家&lt;/li&gt;
&lt;li&gt;加权输出：y = Σ g_i(x) · Expert_i(x)，仅对选中的 k 个专家计算&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键设计选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专家数量：DeepSeek V3 有 256 个路由专家 + 1 个共享专家；Qwen3-235B 有 128 个专家&lt;/li&gt;
&lt;li&gt;Top-k：通常 k=1~8，DeepSeek V3 激活 8 个路由专家 + 1 个共享专家&lt;/li&gt;
&lt;li&gt;共享专家（Shared Expert）：所有 token 都经过的专家，提供通用知识，DeepSeek MoE 首创&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代表模型的 MoE 配置：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模型&lt;/th&gt;
					&lt;th&gt;总参数&lt;/th&gt;
					&lt;th&gt;激活参数&lt;/th&gt;
					&lt;th&gt;激活比&lt;/th&gt;
					&lt;th&gt;专家数&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek V3&lt;/td&gt;
					&lt;td&gt;671B&lt;/td&gt;
					&lt;td&gt;37B&lt;/td&gt;
					&lt;td&gt;5.5%&lt;/td&gt;
					&lt;td&gt;256+1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
					&lt;td&gt;~700B+&lt;/td&gt;
					&lt;td&gt;~30B&lt;/td&gt;
					&lt;td&gt;~4%&lt;/td&gt;
					&lt;td&gt;256+1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kimi K2&lt;/td&gt;
					&lt;td&gt;1T&lt;/td&gt;
					&lt;td&gt;32B&lt;/td&gt;
					&lt;td&gt;3.2%&lt;/td&gt;
					&lt;td&gt;384+1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3-235B&lt;/td&gt;
					&lt;td&gt;235B&lt;/td&gt;
					&lt;td&gt;22B&lt;/td&gt;
					&lt;td&gt;9.4%&lt;/td&gt;
					&lt;td&gt;128&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MiniMax-01&lt;/td&gt;
					&lt;td&gt;456B&lt;/td&gt;
					&lt;td&gt;46B&lt;/td&gt;
					&lt;td&gt;10%&lt;/td&gt;
					&lt;td&gt;32&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GLM-5&lt;/td&gt;
					&lt;td&gt;744B&lt;/td&gt;
					&lt;td&gt;40B&lt;/td&gt;
					&lt;td&gt;5.4%&lt;/td&gt;
					&lt;td&gt;256+1&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注：GLM-5 的 744B 总参/40B 激活来自 GLM-5 技术报告（arXiv:2602.15763），激活比 40/744 ≈ 5.4%。DeepSeek V3 的 671B/37B/5.5%/256+1 来自 DeepSeek V3 技术报告（arXiv:2412.19437）。&lt;/p&gt;
&lt;p&gt;负载均衡：DeepSeek V3 首创无辅助损失（auxiliary-loss-free）策略，避免传统负载均衡损失损害模型质量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeekMoE (arXiv:2401.06066)；DeepSeek V3 (技术报告 arXiv:2412.19437)；Qwen3 (技术报告)；Kimi K2 技术报告；GLM-5 (技术报告 arXiv:2602.15763)；Mixtral&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/moe/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/moe/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="multi-token-prediction"&gt;Multi-Token Prediction
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MTP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：多 Token 预测&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：训练时不仅预测下一个 token，还同时预测未来第 2、3&amp;hellip;个 token，通过额外的预测头增加训练信号密度。推理时可复用 MTP 模块做推测解码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：MTP 的训练目标：&lt;/p&gt;
&lt;p&gt;标准 next-token：L = -log P(x_{t+1} | x_{&amp;lt;=t})
MTP-k：L = -Σ_{i=1}^{k+1} log P(x_{t+i} | x_{&amp;lt;=t}, x_{t+1}, &amp;hellip;, x_{t+i-1})&lt;/p&gt;
&lt;p&gt;DeepSeek V3 使用 MTP-1（预测 1 个额外 token）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主解码器预测 x_{t+1}&lt;/li&gt;
&lt;li&gt;MTP 模块以主解码器的隐状态 + x_{t+1} 为输入，预测 x_{t+2}&lt;/li&gt;
&lt;li&gt;MTP 损失权重通常为 0.1（主损失 + 0.1 × MTP 损失）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推理时的两种用法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;标准：忽略 MTP 头，逐 token 生成（不影响推理）&lt;/li&gt;
&lt;li&gt;推测解码：MTP 头作为内置的 draft model，一次预测多个 token，经验证后批量接受&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在 vLLM 中启用：&lt;code&gt;--speculative-config='{&amp;quot;method&amp;quot;: &amp;quot;deepseek_mtp&amp;quot;, &amp;quot;num_speculative_tokens&amp;quot;: 1}'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;采用 MTP 的模型：DeepSeek V3/R1、DeepSeek V4、GLM-5 系列、Inkling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek V3 (arXiv:2412.19437, Section 4.4)；DeepSeek R1 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/mtp/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/mtp/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/nemo/megatron-bridge/nightly/training/multi-token-prediction.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/nemo/megatron-bridge/nightly/training/multi-token-prediction.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/data-science-collective/deepseek-explained-4-multi-token-prediction-33f11fe2b868" target="_blank" rel="noopener"
 &gt;https://medium.com/data-science-collective/deepseek-explained-4-multi-token-prediction-33f11fe2b868&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="manifold-constrained-hyper-connections"&gt;Manifold-Constrained Hyper-Connections
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：mHC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：流形约束超连接&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek V4 引入的残差连接改进，将 Transformer 块中的单残差流扩展为多个并行残差流，并通过双随机矩阵约束确保混合稳定。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：mHC 的演进路径：&lt;/p&gt;
&lt;p&gt;标准残差连接 → Hyper-Connections (HC) → mHC&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;标准 ResNet 残差：y = x + F(x)，单残差流&lt;/li&gt;
&lt;li&gt;Hyper-Connections：将单残差流扩展为 n 个并行残差流
&lt;ul&gt;
&lt;li&gt;Pre Mapping：将 n 个流合并为 1 个隐向量供 Attention/MoE 处理&lt;/li&gt;
&lt;li&gt;Res Mapping：层间残差流混合（学习矩阵）&lt;/li&gt;
&lt;li&gt;Post Mapping：将层输出分发回 n 个流&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mHC 关键约束：
&lt;ul&gt;
&lt;li&gt;Res Mapping 投影到双随机矩阵流形（行和=1、列和=1、非负）&lt;/li&gt;
&lt;li&gt;Pre/Post Mapping 也约束为非负有界&lt;/li&gt;
&lt;li&gt;避免深层堆叠时信号放大/缩小的不可预测行为&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DeepSeek V4 使用 n=4 个并行残差流。实测仅增加 6.7% 训练时间开销，但指标可比基线少用一半训练 token 达到同等性能。&lt;/p&gt;
&lt;p&gt;核心价值：在几乎不增加 FLOPs 的情况下，使残差通路更宽更表达，且约束保证深层模型稳定性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;mHC: Manifold-Constrained Hyper-Connections&amp;rdquo; (arXiv:2512.24880, DeepSeek, 2025-12-31)；Hyper-Connections 原始论文 (arXiv:2409.19606, Zhu et al., 2024)；DeepSeek V4 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt; (Section 5.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rotary-position-embedding"&gt;Rotary Position Embedding
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：RoPE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：旋转位置编码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：通过旋转矩阵编码 token 间的相对位置关系，将位置信息融入 Q 和 K 的旋转中，使注意力分数自然反映相对距离。当前绝大多数 LLM 的默认位置编码方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：RoPE 的数学形式：&lt;/p&gt;
&lt;p&gt;对位置 m 的向量 x，将其每两个维度分为一组，旋转角度 θ_i = m · base^(-2i/d)：&lt;/p&gt;
&lt;p&gt;R(x, m) = x · R_m，其中 R_m 是分块旋转矩阵&lt;/p&gt;
&lt;p&gt;关键性质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;R(Q, m), R(K, n)&amp;gt; = &amp;lt;Q, K&amp;gt; 旋转后内积仅依赖相对位置 (m-n)&lt;/li&gt;
&lt;li&gt;base 通常为 10000（LLaMA、DeepSeek V3 等多数模型）；部分长上下文模型（如 Qwen2、GLM-4-1M）调高到 500000~1000000 以利于长上下文外推&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;外推问题：训练时最大位置 m_max 有限（如 4K），推理时超出范围的角度超出训练分布，质量退化。&lt;/p&gt;
&lt;p&gt;采用 RoPE 的模型：LLaMA 全系列、Qwen 全系列、DeepSeek V2/V3、GLM-4、Mistral、Kimi K2 等。&lt;/p&gt;
&lt;p&gt;注意：MLA 需要将 RoPE 部分独立处理（RoPE 不兼容低秩压缩），这是 MLA 实现复杂度的来源之一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;RoFormer: Enhanced Transformer with Rotary Position Embedding&amp;rdquo; (Su et al., 2021, arXiv:2104.09864)；LLaMA、Qwen、DeepSeek、Mistral 等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.turingpost.com/p/attention-types" target="_blank" rel="noopener"
 &gt;https://www.turingpost.com/p/attention-types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="yet-another-rope-extension"&gt;Yet Another RoPE Extension
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：YaRN&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：YaRN 上下文扩展&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：目前最主流的 RoPE 上下文扩展方法，通过分段插值 + 温度缩放，在少量微调（约 400 步）下将上下文从 4K 扩展到 128K+。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：YaRN 的核心方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;分段策略：将 RoPE 的频率维度分为三段
&lt;ul&gt;
&lt;li&gt;高频段：保持原样（局部信息不需要外推）&lt;/li&gt;
&lt;li&gt;中频段：插值 + 温度缩放（平滑过渡）&lt;/li&gt;
&lt;li&gt;低频段：纯插值（长距离信息需要外推）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;温度缩放：调整 softmax 温度补偿插值带来的注意力分布变化&lt;/li&gt;
&lt;li&gt;微调：仅需约 400 步微调即可适应新长度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;采用 YaRN 的模型：Qwen 系列（4K→128K）、DeepSeek（4K→128K）、LLaMA 系列、GLM 等。&lt;/p&gt;
&lt;p&gt;其他上下文扩展方法对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PI (Position Interpolation)：线性插值所有频率，简单但效果一般&lt;/li&gt;
&lt;li&gt;NTK-aware：调整 base，不微调直接外推&lt;/li&gt;
&lt;li&gt;YaRN：分段 + 温度，当前最优&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;YaRN: Efficient Context Window Extension&amp;rdquo; (Peng et al., 2023, arXiv:2309.00071)；Qwen、DeepSeek、LLaMA 系列&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rmsnorm"&gt;RMSNorm
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：RMSNorm&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：均方根归一化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：LayerNorm 的简化版本，去除均值计算仅用均方根归一化，计算更快且在大规模训练中表现稳定。几乎所有现代 LLM 的默认归一化方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：RMSNorm vs LayerNorm：&lt;/p&gt;
&lt;p&gt;LayerNorm: y = (x - μ) / sqrt(σ^2 + ε) · γ + β
RMSNorm: y = x / RMS(x) · γ, 其中 RMS(x) = sqrt(mean(x^2) + ε)&lt;/p&gt;
&lt;p&gt;RMSNorm 去掉了均值减法和偏置 β，计算量更小，且在大规模训练中更稳定。&lt;/p&gt;
&lt;p&gt;使用方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pre-Norm（主流）：在 attention/FFN 之前做归一化，梯度更稳定&lt;/li&gt;
&lt;li&gt;Post-Norm（GPT-2 风格）：在之后做，训练不稳定，已少用&lt;/li&gt;
&lt;li&gt;Inside-Residual Post-Norm（OLMo 2）：在残差路径内部做 post-norm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;采用 RMSNorm 的模型：LLaMA 全系列、Qwen3、DeepSeek V3/V4、GLM-5、Mistral、Gemma 3、Kimi K2 等几乎所有现代模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Root Mean Square Layer Normalization&amp;rdquo; (Zhang &amp;amp; Sennrich, 2019, arXiv:1910.07467)；几乎所有现代 LLM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/&lt;/a&gt; (各模型卡片的 Related Concepts)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb" target="_blank" rel="noopener"
 &gt;https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="swiglu"&gt;SwiGLU
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：SwiGLU&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：SwiGLU 激活函数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：GLU（Gated Linear Unit）的变体，使用 SiLU（Swish）作为门控激活函数，替代传统 ReLU/GELU。几乎所有现代 LLM FFN 层的标准配置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：SwiGLU 的公式：&lt;/p&gt;
&lt;p&gt;SwiGLU(x) = SiLU(W·x) ⊙ (V·x)
其中 SiLU(x) = x · sigmoid(x)（也称 Swish）&lt;/p&gt;
&lt;p&gt;对比传统 FFN：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统：FFN(x) = W2 · activation(W1 · x)，单一激活&lt;/li&gt;
&lt;li&gt;SwiGLU：FFN(x) = W2 · [SiLU(W_gate · x) ⊙ (W_up · x)]，门控机制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;门控机制使网络能动态选择信息通过与否，比固定激活函数更有表达力。&lt;/p&gt;
&lt;p&gt;实现细节：SwiGLU FFN 有 3 个权重矩阵（W_gate, W_up, W_down），比传统 2 个多一个，因此隐藏维度通常调整为 2/3 × 4d 以保持参数量。&lt;/p&gt;
&lt;p&gt;采用 SwiGLU 的模型：LLaMA 全系列、Qwen3、DeepSeek V3/V4、GLM-5、Mistral、Kimi K2、PaLM 等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;GLU Variants Improve Transformer&amp;rdquo; (Shazeer, 2020, arXiv:2002.05202)；LLaMA、Qwen、DeepSeek 等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kv-cache"&gt;KV Cache
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：KV Cache&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：键值缓存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：自回归生成时，缓存之前 token 在每层注意力的 K/V 矩阵，避免重复计算。KV Cache 大小是长上下文推理最硬的物理瓶颈。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：KV Cache 的大小计算：&lt;/p&gt;
&lt;p&gt;KV Cache = 2(K+V) × n_layers × n_kv_heads × d_head × seq_len × batch × bytes_per_param&lt;/p&gt;
&lt;p&gt;示例（DeepSeek V3, 128K 上下文, bf16, batch=1）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MLA 压缩后：约 68.6 KiB/token × 128K = ~8.6 GB&lt;/li&gt;
&lt;li&gt;对比 Llama 3 8B（GQA）：128 KiB/token × 128K = ~16 GB&lt;/li&gt;
&lt;li&gt;对比 OLMo 2 7B（MHA）：512 KiB/token × 128K = ~64 GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注：以上 MHA/GQA 数字为示意量级，便于横向对比 MLA 的压缩收益。&lt;/p&gt;
&lt;p&gt;KV Cache 是长上下文推理的核心瓶颈，催生了大量优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;压缩 KV 表示：MLA（低维压缩）、CCA（压缩空间计算）&lt;/li&gt;
&lt;li&gt;减少序列条目：CSA/HCA（序列压缩）、SWA（局部窗口）&lt;/li&gt;
&lt;li&gt;跨层共享：Gemma 4 的 Cross-Layer Attention&lt;/li&gt;
&lt;li&gt;线性注意力：Lightning Attention、KDA（O(1) 状态替代 O(n) 缓存）&lt;/li&gt;
&lt;li&gt;分页管理：vLLM PagedAttention&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;趋势：随着推理模型（o1/R1）和 Agent 工作流需要更长的上下文，KV Cache 优化成为 2025-2026 年架构设计的最大驱动力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：所有 Transformer 模型；MLA (DeepSeek V2)、PagedAttention (vLLM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/coding-the-kv-cache-in-llms" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/coding-the-kv-cache-in-llms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/kv-cache-calculations/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/kv-cache-calculations/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 8 个模型架构术语沿&amp;quot;稀疏激活 + 残差连接进化 + 位置编码/归一化/FFN 标准件 + KV Cache 瓶颈&amp;quot;四条线归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MoE&lt;/strong&gt; 把 FFN 替换为多个并行专家网络，路由器为每个 token 选少量专家，实现大参数量但低激活成本；2025-2026 年大模型几乎全部 MoE 化，激活比持续下降（DeepSeek V4 ~4%）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MTP&lt;/strong&gt; 训练时同时预测未来多个 token 增加训练信号密度，推理时可复用 MTP 模块做推测解码；DeepSeek V3 用 MTP，是训练与推理的连接点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mHC&lt;/strong&gt; 把 Transformer 块的单残差流扩展为多个并行残差流，用双随机矩阵约束保证混合稳定；DeepSeek V4 引入，信息通路更宽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RoPE&lt;/strong&gt; 通过旋转矩阵把相对位置编入 Q/K 的旋转中，使注意力分数自然反映相对距离；当前绝大多数 LLM 的默认位置编码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YaRN&lt;/strong&gt; 通过分段插值 + 温度缩放做 RoPE 上下文扩展，约 400 步微调即可从 4K 扩到 128K+；目前最主流的上下文扩展方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RMSNorm&lt;/strong&gt; 去掉 LayerNorm 的均值计算仅用均方根归一化，计算更快且大规模训练稳定；几乎所有现代 LLM 的默认归一化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SwiGLU&lt;/strong&gt; 用 SiLU 作为 GLU 门控激活替代 ReLU/GELU；几乎所有现代 LLM FFN 层的标准配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV Cache&lt;/strong&gt; 缓存历史 token 的 K/V 避免重复计算，但其体积随上下文线性增长，是长上下文推理最硬的物理瓶颈——催生篇 1 的 MLA/CSA/HCA 压缩、篇 5 的 PagedAttention 分页管理、篇 10 的 Prefix Caching 复用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KV Cache 是本篇与篇 1（注意力压缩）、篇 5（推理优化）、篇 10（推理服务）的交叉点：架构设计层面的每一次创新，最终都要回到这个物理瓶颈上检验。&lt;/p&gt;
&lt;p&gt;本系列共 11 篇，本文是第 3 篇。系列导航见：LLM 术语全景图系列导读。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（二）：注意力机制下——线性注意力与混合架构</title><link>https://bevisy.github.io/p/llm-terminology-02-linear-hybrid-attention/</link><pubDate>Mon, 27 Jul 2026 09:15:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-02-linear-hybrid-attention/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-02-linear-hybrid-attention/02.png" alt="Featured image of post LLM 术语全景图（二）：注意力机制下——线性注意力与混合架构" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 2 篇，覆盖注意力机制后半部分的 6 个概念：Lightning Attention、KDA、NoPE、QK-Norm、CCA、Hybrid Attention。
主要参考模型：MiniMax、Kimi (Moonshot)、ZAYA、OLMo、Qwen&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇线性注意力从理论到生产的曲折路径"&gt;开篇：线性注意力从理论到生产的曲折路径
&lt;/h2&gt;&lt;p&gt;线性注意力从理论到生产的路径比预想中曲折。Lightning Attention 在 MiniMax-01 上把注意力复杂度从 O(n^2) 降到 O(n)，纸面效率可观；但 MiniMax 在 M2 中放弃了 Lightning Attention，回归完整 softmax attention。这不是个别工程取舍，而是一个清晰的技术信号：在推理和多轮任务中，线性注意力的精度无法满足生产要求，且其低精度 KV 状态对 prefix caching 支持偏弱，使得长上下文复用这一关键推理优化失去杠杆。生产环境的精度门槛比纸面效率更重要，这是 2025-2026 年线性注意力落地必须正视的现实。本篇沿着这条主线，展开 Lightning Attention、KDA、NoPE、QK-Norm、CCA 与 Hybrid Attention 六个概念。&lt;/p&gt;
&lt;h3 id="lightning-attention"&gt;Lightning Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：闪电注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：MiniMax 提出的线性注意力实现，将注意力计算从 O(n^2) 降至 O(n)，通过将 softmax 近似为线性形式并利用矩阵乘法结合律重排计算顺序。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：Lightning Attention 基于线性注意力理论：&lt;/p&gt;
&lt;p&gt;标准 softmax attention: O(Q·K^T)·V — 复杂度 O(n^2 × d)
线性注意力: φ(Q)·(φ(K)^T·V) — 复杂度 O(n × d^2)&lt;/p&gt;
&lt;p&gt;关键技巧：利用 (Q·K^T)·V = Q·(K^T·V) 的结合律，先算 K^T·V（大小 d×d，与序列长度无关），再乘 Q，将序列维度从二次降为线性。&lt;/p&gt;
&lt;p&gt;MiniMax-01 采用混合架构：大部分层使用 Lightning Attention（线性），少量层使用完整 softmax attention（保证精度）。&lt;/p&gt;
&lt;p&gt;MiniMax M2 的转折：MiniMax 在 M2 中放弃了 Lightning Attention，回归完整注意力，原因是线性注意力在推理和多轮对话场景中精度不足。这表明线性注意力在生产环境中的成熟度仍有争议。&lt;/p&gt;
&lt;p&gt;对比：Kimi Linear 的 KDA 是另一种线性注意力变体，通过 channel-wise gating 改善精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：MiniMax-01 (arXiv:2501.08313)；MiniMax-M1 (arXiv:2506.13585)；MiniMax M2 (回归完整注意力)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight&lt;/a&gt; (MiniMax M2 分析)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kaitchup.substack.com/p/minimax-m2-and-kimi-linear-why-full" target="_blank" rel="noopener"
 &gt;https://kaitchup.substack.com/p/minimax-m2-and-kimi-linear-why-full&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kimi-delta-attention"&gt;Kimi Delta Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：KDA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：Kimi 三角注意力 / Kimi Delta 注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Moonshot AI 在 Kimi Linear 中提出的线性注意力变体，是对 Gated DeltaNet 的改进，引入 channel-wise（逐通道）衰减门控，实现更精细的内存遗忘控制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：KDA 的技术演进路径：&lt;/p&gt;
&lt;p&gt;DeltaNet → Gated DeltaNet → KDA&lt;/p&gt;
&lt;p&gt;核心机制：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Delta 规则：将 attention state 的更新视为在线梯度下降，新 key-value 对通过 delta 规则更新状态矩阵 S&lt;/li&gt;
&lt;li&gt;Gated DeltaNet 在此基础上添加标量衰减门控（scalar decay gate）&lt;/li&gt;
&lt;li&gt;KDA 将标量衰减升级为对角化逐通道门控 Diag(α_t)，每个通道独立控制遗忘率&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逐通道门控使模型能对不同信息维度采用不同的记忆/遗忘策略&lt;/li&gt;
&lt;li&gt;增强位置感知能力&lt;/li&gt;
&lt;li&gt;最高 75% KV Cache 压缩，1M token 上下文下解码吞吐最高 6× 提升（据 Moonshot 官方 GitHub，指标限定 1M token 上下文）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kimi Linear 架构：3:1 混合（3 层 KDA + 1 层全局 MLA），48B 总参数 / 3B 激活，1M 上下文。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：Kimi Linear (arXiv:2510.26692)；Gated DeltaNet (arXiv:2504.12236)；DeltaNet (2024)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/MoonshotAI/Kimi-Linear" target="_blank" rel="noopener"
 &gt;https://github.com/MoonshotAI/Kimi-Linear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/a-dream-of-spring-for-open-weight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=SH6Cyhunl8s" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=SH6Cyhunl8s&lt;/a&gt; (Hybrid Attention and Gated DeltaNet 视频)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="no-positional-encoding"&gt;No Positional Encoding
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：NoPE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：无位置编码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：不在注意力计算中显式注入位置信息，依赖因果掩码（causal mask）隐式编码位置。部分模型在选定的层中省略 RoPE 以降低长上下文计算开销。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：NoPE 的原理：&lt;/p&gt;
&lt;p&gt;标准 Transformer 需要位置编码（绝对位置 APE / 旋转位置 RoPE）来感知 token 顺序。但研究发现，在 decoder-only 模型中，因果掩码（下三角掩码）本身已隐含了顺序信息。&lt;/p&gt;
&lt;p&gt;NoPE 的使用方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完全 NoPE：所有层均不使用位置编码（少数实验性模型）&lt;/li&gt;
&lt;li&gt;交替 NoPE：大部分层用 RoPE，每隔几层用 NoPE（主流方式）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;采用 NoPE 的模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SmolLM3 (3B)：每 4 层有 1 层用 NoPE&lt;/li&gt;
&lt;li&gt;Nemotron 3 / Soofi S：Mamba-2 层 + NoPE&lt;/li&gt;
&lt;li&gt;Kimi Linear：线性注意力层使用 NoPE（线性注意力本身通过状态矩阵隐含位置信息）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;动机：RoPE 在长上下文外推时角度超出训练分布，NoPE 层不受此限制，有助于长上下文泛化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：SmolLM3 (HuggingFaceTB, 2025-06)；Nemotron 3 (NVIDIA)；Kimi Linear (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/nope/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/nope/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="qk-norm"&gt;QK-Norm
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：QK-Norm&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：查询-键归一化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：在注意力计算前对 Query 和 Key 应用 RMSNorm 归一化，防止注意力分数过大导致训练不稳定。被 OLMo 2、Qwen3 等广泛采用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：QK-Norm 的操作：&lt;/p&gt;
&lt;p&gt;Q&amp;rsquo; = RMSNorm(Q), K&amp;rsquo; = RMSNorm(K)
Attention = softmax(Q&amp;rsquo; · K&amp;rsquo;^T / sqrt(d_k)) · V&lt;/p&gt;
&lt;p&gt;QK-Norm 在 RoPE 之前对 Q/K 应用 RMSNorm（Raschka 在架构对比中确认这一位置）。QK-Norm 替代或补充了传统的 1/sqrt(d_k) 缩放。RMSNorm 使 Q 和 K 的范数保持稳定，防止深层网络中 Q·K 值爆炸导致 softmax 饱和。&lt;/p&gt;
&lt;p&gt;采用 QK-Norm 的模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OLMo 2：MHA + QK-Norm&lt;/li&gt;
&lt;li&gt;Qwen3 (235B/32B/4B/8B)：GQA + QK-Norm&lt;/li&gt;
&lt;li&gt;MiniMax M2：per-head 变体的 QK-Norm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果：改善训练稳定性，特别是在大规模模型和长上下文训练中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：OLMo 2 (arXiv:2501.00656)；Qwen3 (arXiv:2505.09388)；MiniMax M2 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/qk-norm/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/qk-norm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="compressed-convolutional-attention"&gt;Compressed Convolutional Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：CCA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：压缩卷积注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Zyphra 在 ZAYA1-8B 中提出的注意力机制，将 Q/K/V 压缩到低维潜在空间后直接在压缩空间执行注意力计算，并用卷积混合增强压缩表示的表达力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：CCA 与 MLA 的区别：&lt;/p&gt;
&lt;p&gt;MLA：压缩 KV 存储 → 解压 → 在原始空间计算注意力
CCA：压缩 Q/K/V → 直接在压缩空间计算注意力 → 解压输出&lt;/p&gt;
&lt;p&gt;这意味着 CCA 不仅减少 KV Cache，还减少注意力 FLOPs（prefill 和训练阶段）。&lt;/p&gt;
&lt;p&gt;额外的卷积混合：在压缩后的 Q 和 K 上应用一维卷积，为压缩表示注入局部上下文信息（V 不做卷积，因为 V 是内容而非打分）。&lt;/p&gt;
&lt;p&gt;ZAYA1-8B 使用 CCA + 4:1 GQA + 极稀疏 MoE（每 token 仅激活 1 个专家）。&lt;/p&gt;
&lt;p&gt;据 CCA 论文报告，在同等压缩设置下 CCA 优于 MLA，但目前仅在 ZAYA1-8B 验证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Compressed Convolutional Attention&amp;rdquo; (arXiv:2510.04476, 2025-10)；ZAYA1-8B (arXiv:2605.05365)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt; (Section 4)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hybrid-attention"&gt;Hybrid Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：—&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：混合注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：在同一个模型中交替使用不同类型的注意力层（如线性注意力 + 完整注意力），在效率和精度之间取得平衡。2025-2026 年的主流趋势之一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：混合注意力的常见模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;线性 + 全局（3:1）：3 层线性注意力 + 1 层完整注意力&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kimi Linear：3 层 KDA + 1 层 MLA&lt;/li&gt;
&lt;li&gt;Qwen3-Next：3 层 Gated DeltaNet + 1 层 full attention&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;滑动窗口 + 全局（5:1）：5 层 SWA + 1 层全局注意力&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemma 3 (27B)：52 层 SWA + 10 层全局&lt;/li&gt;
&lt;li&gt;Laguna XS.2：30 层 SWA + 10 层全局&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mamba-2 + GQA：SSM 层 + 少量注意力层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nemotron 3：6 层 GQA + 23 层 Mamba-2&lt;/li&gt;
&lt;li&gt;Soofi S：相同架构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSA + HCA：压缩稀疏 + 重度压缩交替&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DeepSeek V4：CSA 和 HCA 交替&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;核心思想：完整注意力是昂贵但精确的&amp;quot;稀缺资源&amp;quot;，放在关键层；廉价注意力放在大部分层以控制成本。&lt;/p&gt;
&lt;p&gt;反例：MiniMax M2 放弃混合注意力回归完整注意力。原因在于 linear attention 在推理和多轮任务中精度不足，且低精度 KV 状态对 prefix caching 支持偏弱，使长上下文复用失去杠杆（Raschka 在 M2 分析中明确指出这两点）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：Kimi Linear (技术报告)；Qwen3-Next；Gemma 3；Nemotron 3；DeepSeek V4 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/hybrid-attention/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/hybrid-attention/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=SH6Cyhunl8s" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=SH6Cyhunl8s&lt;/a&gt; (Hybrid Attention and Gated DeltaNet)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=Y6APnyZT6XU" target="_blank" rel="noopener"
 &gt;https://www.youtube.com/watch?v=Y6APnyZT6XU&lt;/a&gt; (LLM Architecture in 2026, 49:00 段)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 6 个注意力相关术语沿&amp;quot;线性注意力从理论到生产 + 配套稳定性与混合架构&amp;quot;两条线归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightning Attention&lt;/strong&gt; 把 softmax 近似为线性形式并用结合律重排计算，将注意力复杂度从 O(n²) 降到 O(n)；但 MiniMax 在 M2 中放弃它回归完整注意力，原因是线性注意力在推理和多轮任务中精度不足，且低精度 KV 状态对 prefix caching 支持偏弱——生产环境的精度门槛比纸面效率更重要。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KDA&lt;/strong&gt; 是 Gated DeltaNet 的改进，把标量衰减门控升级为逐通道对角门控 Diag(α_t)，每个通道独立控制遗忘率；Kimi Linear 用 3:1 混合（3 层 KDA + 1 层全局 MLA），1M token 上下文下最高 75% KV 压缩与 6× 解码提升（Moonshot 官方指标，限定 1M 上下文）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NoPE&lt;/strong&gt; 在选定层省略位置编码，依赖因果掩码隐式编码位置，降低长上下文计算开销；常见于线性注意力层（Kimi Linear、Qwen3-Next）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QK-Norm&lt;/strong&gt; 在注意力计算前对 Q/K 做 RMSNorm，防止注意力分数过大导致训练不稳定；OLMo 2、Qwen3、Gemma 3 已广泛采用，是&amp;quot;免费的稳定性增强&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CCA&lt;/strong&gt; 把 Q/K/V 压缩到低维潜在空间后直接在压缩空间执行注意力，并用卷积混合增强表达力；ZAYA1-8B 的实践，与 MLA 的区别是 MLA 上投影还原后再算注意力，CCA 在压缩空间直接算。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Attention&lt;/strong&gt; 在同一模型中交替使用不同注意力层（线性 + 完整、SWA + 全局、CSA + HCA），完整注意力作为稀缺资源放在关键层；2025-2026 年的主流趋势，但 MiniMax M2 放弃混合回归完整注意力是重要反例。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本系列共 11 篇，本文是第 2 篇。系列导航见：LLM 术语全景图系列导读。&lt;/p&gt;</description></item><item><title>LLM 术语全景图（一）：注意力机制上——MHA 到 MLA 的压缩演进</title><link>https://bevisy.github.io/p/llm-terminology-01-attention-mha-mla/</link><pubDate>Mon, 27 Jul 2026 09:00:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-01-attention-mha-mla/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-01-attention-mha-mla/01.png" alt="Featured image of post LLM 术语全景图（一）：注意力机制上——MHA 到 MLA 的压缩演进" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这是「大模型训练与推理术语全景图」系列的第 1 篇，覆盖注意力机制前半部分的 8 个概念：MHA、MQA、GQA、MLA、SWA、DSA、CSA、HCA。
主要参考模型：DeepSeek、GLM、Kimi (Moonshot)、Llama、Gemma、MiniMax&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="开篇为什么-2025-2026-年注意力机制在密集创新"&gt;开篇：为什么 2025-2026 年注意力机制在密集创新
&lt;/h2&gt;&lt;p&gt;2025-2026 年，注意力机制的迭代密度显著上升，其驱动力并非抽象的&amp;quot;模型变大&amp;quot;，而是一个具体的工程瓶颈：KV Cache 已成为长上下文推理的第一代价。在自回归解码阶段，每生成一个 token 都要对所有历史 token 的 K/V 做注意力，这意味着 KV Cache 的体积随上下文长度线性增长，而它在显存中的驻留又直接挤占了 batch size 与并发上限。当推理模型需要维持数万 token 的思维链、Agent 工作流需要在单次会话中携带工具调用历史与检索结果时，KV Cache 从&amp;quot;可优化项&amp;quot;变成了&amp;quot;硬约束&amp;quot;。MHA 到 MQA、GQA 的头维度压缩，MLA 的潜在维度压缩，SWA/DSA 的序列维度稀疏，CSA/HCA 的序列维度压缩，本质都在回答同一个问题：在不牺牲检索精度的情况下，如何让 KV Cache 不再是长上下文推理的瓶颈。本篇按这条主线梳理前 8 个注意力变体。&lt;/p&gt;
&lt;h2 id="注意力机制上"&gt;注意力机制（上）
&lt;/h2&gt;&lt;h3 id="multi-head-attention"&gt;Multi-Head Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MHA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：多头注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：Transformer 原始论文提出的注意力机制，每个注意力头有独立的 Q/K/V 投影，能从不同子空间捕获不同的注意力模式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：对于输入序列 X，每个头独立计算：&lt;/p&gt;
&lt;p&gt;Q_h = X·W_h^Q, K_h = X·W_h^K, V_h = X·W_h^V&lt;/p&gt;
&lt;p&gt;Attention(Q_h, K_h, V_h) = softmax(Q_h·K_h^T / sqrt(d_k)) · V_h&lt;/p&gt;
&lt;p&gt;多头输出拼接后经线性投影得到最终输出。头数 h 通常为 32~96，每头维度 d_k = d_model / h。MHA 的 KV Cache 占用最大：每 token 需存储 2 × n_layers × n_heads × d_head 维度。&lt;/p&gt;
&lt;p&gt;示例：GPT-2 XL（1.5B）有 48 层 × 25 头，每 token KV Cache 约 300 KiB（bf16）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Attention Is All You Need&amp;rdquo; (Vaswani et al., 2017, arXiv:1706.03762)；GPT-2、GPT-3、原始 Transformer；OLMo 2 仍保留 MHA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/mha/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/mha/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.turingpost.com/p/attention-types" target="_blank" rel="noopener"
 &gt;https://www.turingpost.com/p/attention-types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="multi-query-attention"&gt;Multi-Query Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MQA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：多查询注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：所有查询头共享同一组 K/V 投影，是 MHA 的极端压缩形式，大幅减少 KV Cache 但可能损失精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：MQA 只保留一个 K/V 头，所有 Q 头都共享这同一组 K/V：&lt;/p&gt;
&lt;p&gt;K = X·W^K (仅一份), V = X·W^V (仅一份)&lt;/p&gt;
&lt;p&gt;每个 Q 头独立计算 attention，但 K/V 共享。KV Cache 减少到 MHA 的 1/n_heads。例如 32 头模型从 32 组 KV 降至 1 组，显存节省 ~96%。&lt;/p&gt;
&lt;p&gt;在 GQA 的统一框架下理解：当 GQA 的 KV 头数 n_kv_heads = 1 时即 MQA，当 n_kv_heads = n_heads 时即 MHA。MQA 是 GQA 的极端特例（仅 1 个 KV 头）。Gemma 4 E2B 使用 MQA + 跨层 KV 共享进一步压缩。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Fast Transformer Decoding&amp;rdquo; (Shazeer, 2019, arXiv:1911.02150)；PaLM、Falcon、Gemma 4 E2B&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/abs/1911.02150" target="_blank" rel="noopener"
 &gt;https://arxiv.org/abs/1911.02150&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.pythonalchemist.com/llm-architectures/attention-variants" target="_blank" rel="noopener"
 &gt;https://www.pythonalchemist.com/llm-architectures/attention-variants&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="grouped-query-attention"&gt;Grouped Query Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：GQA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：分组查询注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：MHA 和 MQA 的折中方案，将查询头分组，每组共享一对 K/V 头，在精度和 KV Cache 压缩之间取得平衡。当前最主流的注意力机制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：将 n_heads 个 Q 头分成 n_groups 组，每组共享一组 K/V。用 KV 头数 n_kv_heads 表达压缩程度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;n_kv_heads = 1 时即 MQA（极端压缩）&lt;/li&gt;
&lt;li&gt;n_kv_heads = n_heads 时即 MHA（无压缩）&lt;/li&gt;
&lt;li&gt;介于两者之间即 GQA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如 Llama 3 8B：32 个 Q 头，8 个 KV 头（4:1 分组），KV Cache 降至 MHA 的 25%。&lt;/p&gt;
&lt;p&gt;GQA 是 2024-2026 年最广泛采用的注意力机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Llama 3/4：GQA + RoPE&lt;/li&gt;
&lt;li&gt;Qwen3：GQA + QK-Norm&lt;/li&gt;
&lt;li&gt;Mistral Small 3.1：标准 GQA&lt;/li&gt;
&lt;li&gt;Kimi K2：GQA（部分层）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KV Cache 每 token（bf16）= 2 × n_layers × n_kv_heads × d_head × 2 bytes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;GQA: Training Generalized Multi-Query Transformer Models&amp;rdquo; (Ainslie et al., 2023, arXiv:2305.13245)；Llama 3、Qwen3、Mistral、Kimi K2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/gqa/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/gqa/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://friendli.ai/blog/gqa-vs-mha" target="_blank" rel="noopener"
 &gt;https://friendli.ai/blog/gqa-vs-mha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="multi-head-latent-attention"&gt;Multi-head Latent Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：MLA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：多头潜在注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek 提出的注意力机制，通过低秩投影将 K/V 压缩到低维潜在空间存储，推理时再上投影还原，大幅减少 KV Cache 同时保持精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：MLA 的核心思想是对 K/V 做低秩压缩：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;压缩：c_KV = W_DKV · x （将 d_model 压缩到 d_c，d_c &amp;laquo; n_heads × d_head）&lt;/li&gt;
&lt;li&gt;上投影：K = W_UK · c_KV, V = W_UV · c_KV&lt;/li&gt;
&lt;li&gt;查询同样压缩：c_Q = W_DQ · x, Q = W_UQ · c_Q&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;KV Cache 只需存储压缩后的 c_KV（d_c 维），而非完整的 K/V。以 DeepSeek V3 为例：KV Cache 每 token 仅 68.6 KiB（bf16），远低于同规模 MHA 模型。&lt;/p&gt;
&lt;p&gt;MLA 的关键创新：RoPE 需要独立处理。MLA 将 K 分为两部分——压缩部分（走低秩路径）和 RoPE 部分（独立计算），以兼容旋转位置编码。&lt;/p&gt;
&lt;p&gt;采用 MLA 的模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DeepSeek V2/V3/V4：MLA 是核心注意力&lt;/li&gt;
&lt;li&gt;GLM-5/5.1/5.2：MLA + DSA&lt;/li&gt;
&lt;li&gt;Kimi K2.5：MLA&lt;/li&gt;
&lt;li&gt;Kimi Linear：3:1 混合 KDA + MLA（全局层用 MLA）&lt;/li&gt;
&lt;li&gt;Mistral（部分新模型）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek-V2 (arXiv:2405.04434)；DeepSeek-V3 (arXiv:2412.19437)；GLM-5 (技术报告)；Kimi Linear (arXiv:2510.26692)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/mla/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/mla/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/visual-attention-variants" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/visual-attention-variants&lt;/a&gt; (Visual Guide to Attention Variants)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sliding-window-attention"&gt;Sliding Window Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：SWA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：滑动窗口注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：每个 token 只关注固定大小窗口内的邻近 token（如 1024 或 4096），而非整个序列，将注意力复杂度从 O(n^2) 降至 O(n×w)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：SWA 限制注意力范围到局部窗口 [t-w, t]：&lt;/p&gt;
&lt;p&gt;Attention(Q, K, V) 限制为仅计算 |i - j| &amp;lt;= w 的位置&lt;/p&gt;
&lt;p&gt;窗口大小 w 通常为 512~4096 token。SWA 可显著减少 KV Cache 和注意力计算量，但无法直接捕获长距离依赖。&lt;/p&gt;
&lt;p&gt;实践中通常混合使用 SWA + 全局注意力层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemma 3 (27B)：52 层 SWA + 10 层全局（5:1 比例）&lt;/li&gt;
&lt;li&gt;Mistral Small 3.1：5:1 SWA + 全局&lt;/li&gt;
&lt;li&gt;Laguna XS.2：30 层 SWA + 10 层全局&lt;/li&gt;
&lt;li&gt;Llama 4 Maverick：36 层 chunked + 12 层 full GQA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;信息传递机制：局部窗口层层传递，信息通过多层 SWA 逐步扩散到远距离（类似消息传递）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：&amp;ldquo;Longformer&amp;rdquo; &amp;amp; &amp;ldquo;BigBird&amp;rdquo; (2020)；Mistral 7B；Gemma 3；Llama 4；Laguna XS.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/swa/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/swa/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deepseek-sparse-attention"&gt;DeepSeek Sparse Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：DSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：DeepSeek 稀疏注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek V3.2-Exp 引入的稀疏注意力机制，通过学习到的选择器（indexer）动态选择需要关注的 token 子集，在保持检索能力的同时大幅降低注意力计算量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：DSA 的工作原理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Indexer 层：用一个轻量级网络对序列中的 token 打分，选出最重要的 top-k token&lt;/li&gt;
&lt;li&gt;Attention 仅在选中的 token 上计算，而非全部&lt;/li&gt;
&lt;li&gt;保留局部窗口（近期 token 全部可见）+ 选中的稀疏 token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与 SWA 的区别：SWA 是固定窗口，DSA 是动态选择。与标准稀疏注意力的区别：DSA 的选择是端到端学习的，不是预设模式。&lt;/p&gt;
&lt;p&gt;GLM-5 用 DSA；GLM-5.2 在 DSA 基础上引入 IndexShare 机制：一个 DSA indexer 的结果复用到后续 4 层，进一步降低 1M token 上下文的计算成本（见 GLM-5 GitHub：reuses the same indexer across every four sparse attention layers）。&lt;/p&gt;
&lt;p&gt;采用 DSA 的模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DeepSeek V3.2-Exp：MLA + DSA&lt;/li&gt;
&lt;li&gt;GLM-5：MLA + DSA&lt;/li&gt;
&lt;li&gt;GLM-5.1/5.2：MLA + DSA + IndexShare（5.2 引入 IndexShare）&lt;/li&gt;
&lt;li&gt;DeepSeek V4：CSA（基于 DSA 选择器）+ HCA&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek V3.2-Exp 技术报告；GLM-5 (技术报告)；DeepSeek V4 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/deepseek-sparse-attention/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/deepseek-sparse-attention/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/technical-deepseek" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/technical-deepseek&lt;/a&gt; (From DeepSeek V3 to V3.2)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/blog/2026/glm-5-2-indexshare.html" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/blog/2026/glm-5-2-indexshare.html&lt;/a&gt; (GLM-5.2 IndexShare)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="compressed-sparse-attention"&gt;Compressed Sparse Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：CSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：压缩稀疏注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek V4 引入的注意力机制，结合序列维度压缩和 DSA 风格的稀疏选择，以较低的压缩率保留更多细节，适合需要精确检索的场景。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：CSA 的核心设计：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;序列维度压缩：将连续的 token 组压缩为更少的 KV 条目（但压缩率比 HCA 温和）&lt;/li&gt;
&lt;li&gt;稀疏选择：使用 DSA 风格的 indexer 选择最相关的压缩条目&lt;/li&gt;
&lt;li&gt;局部窗口：保留近期 token 的未压缩 KV 用于精确注意力&lt;/li&gt;
&lt;li&gt;共享 KV 注意力：压缩条目使用共享 K/V 进一步降低开销&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与 MLA 的关键区别：MLA 压缩的是单个 token 的 KV 表示维度（per-token compression），CSA 压缩的是序列长度维度（sequence-length compression），即将多个 token 的信息汇总到更少的条目中。其中&amp;quot;共享 KV 注意力&amp;quot;（shared-KV）的点在 Raschka 原文中有提及，此处保留。&lt;/p&gt;
&lt;p&gt;CSA 保留较多压缩条目（细节多），但需要稀疏选择来控制计算量。HCA 则是更激进的版本。&lt;/p&gt;
&lt;p&gt;在 DeepSeek V4 中，CSA 和 HCA 交替使用：CSA 负责精确检索，HCA 负责低成本全局覆盖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek V4 (技术报告)；mHC 论文 (arXiv:2512.24880)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt; (Section 5.2)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sebastianraschka.com/llm-architecture-gallery/" target="_blank" rel="noopener"
 &gt;https://sebastianraschka.com/llm-architecture-gallery/&lt;/a&gt; (DeepSeek V4 卡片)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="heavily-compressed-attention"&gt;Heavily Compressed Attention
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缩写&lt;/strong&gt;：HCA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中文名称&lt;/strong&gt;：重度压缩注意力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：DeepSeek V4 引入的注意力机制，将每 128 个 token 激进压缩为一个 KV 条目，然后对这些少量压缩条目做密集注意力，以最低成本实现全局覆盖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;详细介绍&lt;/strong&gt;：HCA 的设计思路与 CSA 互补：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;激进压缩：每 128 个 token 压缩为 1 个 KV 条目（压缩率 128:1）&lt;/li&gt;
&lt;li&gt;密集注意力：压缩后条目数量极少，可以对所有条目做完整 attention&lt;/li&gt;
&lt;li&gt;局部窗口：同样保留近期未压缩 token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对比 CSA vs HCA：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSA：温和压缩 + 稀疏选择 → 更多细节，但需要选择器开销&lt;/li&gt;
&lt;li&gt;HCA：激进压缩 + 密集注意力 → 更少条目，无需选择器，但丢失细节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepSeek V4 交替使用 CSA 和 HCA，使两者互补。&lt;/p&gt;
&lt;p&gt;效果指标（DeepSeek V4 论文，1M token 上下文，相对 V3.2）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;V4-Pro：27% FLOPs、10% KV Cache&lt;/li&gt;
&lt;li&gt;V4-Flash：10% FLOPs、7% KV Cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：CSA/HCA 比 MLA 更复杂，目前仅在 DeepSeek V4 大规模验证，不一定普遍优于 MLA。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联论文/模型&lt;/strong&gt;：DeepSeek V4 (技术报告)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权威分析链接&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures" target="_blank" rel="noopener"
 &gt;https://magazine.sebastianraschka.com/p/recent-developments-in-llm-architectures&lt;/a&gt; (Section 5.2 CSA/HCA)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sesamedisk.com/sebastian-raschka-llm-architecture-gallery-2026" target="_blank" rel="noopener"
 &gt;https://sesamedisk.com/sebastian-raschka-llm-architecture-gallery-2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本篇小结"&gt;本篇小结
&lt;/h2&gt;&lt;p&gt;本篇 8 个注意力变体可以沿三条压缩主线归位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;头维度压缩&lt;/strong&gt;：MHA → MQA → GQA，沿 n_kv_heads 轴从 n_heads 到 1 逐级压缩，GQA 的 n_kv_heads=1 即 MQA、n_kv_heads=n_heads 即 MHA。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;潜在维度压缩&lt;/strong&gt;：MLA 把 per-token 的 K/V 压进低秩潜在空间，是另一种正交的压缩方向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列维度压缩 / 稀疏&lt;/strong&gt;：SWA 用固定窗口、DSA 用学习到的 indexer 做稀疏选择，CSA/HCA 则直接压缩序列长度本身，HCA 更激进、CSA 更温和，DeepSeek V4 让两者交替互补。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本系列共 11 篇，本文是第 1 篇。系列导航见：LLM 术语全景图系列导读。&lt;/p&gt;</description></item><item><title>LLM 术语全景图：系列导读（11 篇导航）</title><link>https://bevisy.github.io/p/llm-terminology-series-guide/</link><pubDate>Mon, 27 Jul 2026 08:45:00 +0800</pubDate><guid>https://bevisy.github.io/p/llm-terminology-series-guide/</guid><description>&lt;img src="https://bevisy.github.io/p/llm-terminology-series-guide/12.png" alt="Featured image of post LLM 术语全景图：系列导读（11 篇导航）" /&gt;&lt;p&gt;大模型训练与推理涉及 64 个核心概念，从注意力机制的压缩演进到推理服务的性能指标，横跨模型架构、训练方法、并行策略、GPU 硬件、量化、微调等多个领域。本系列按主题分册，每篇聚焦一个领域，便于逐篇阅读和单篇引用。&lt;/p&gt;
&lt;h2 id="系列目录"&gt;系列目录
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;篇号&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;覆盖概念数&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;01&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-01-attention-mha-mla/" &gt;注意力机制（上）：MHA 到 MLA 的压缩演进&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;02&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-02-linear-hybrid-attention/" &gt;注意力机制（下）：线性注意力与混合架构&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;6&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;03&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-03-moe-residual/" &gt;模型架构：MoE 与残差连接的演进&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;04&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-04-rlhf-grpo/" &gt;训练方法：从 RLHF 到 GRPO 的演进&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;6&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;05&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-05-inference-optimization/" &gt;推理优化：从推测解码到 Flash Attention&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;06&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-06-parallelism/" &gt;并行策略：多维并行的组合&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;07&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-07-gpu-hardware/" &gt;GPU 硬件与计算：从 Tensor Core 到 HBM&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;08&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-08-quantization/" &gt;量化方法：从 GPTQ 到 FP8&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;6&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;09&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-09-peft-lora/" &gt;参数高效微调：LoRA 与 QLoRA&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-10-inference-serving/" &gt;推理服务：Prefill 解码与性能指标&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;6&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;11&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://bevisy.github.io/p/llm-terminology-11-overview-trends/" &gt;术语关系总览与核心趋势&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;总览&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;共 64 个概念条目 + 1 篇总览。&lt;/p&gt;
&lt;h2 id="阅读建议"&gt;阅读建议
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;按顺序读：篇 01-02 注意力 → 篇 03 架构 → 篇 04 训练 → 篇 05-10 推理/部署侧 → 篇 11 总览串联&lt;/li&gt;
&lt;li&gt;按兴趣跳读：每篇独立成文，条目间无前置依赖&lt;/li&gt;
&lt;li&gt;查阅参考：篇 11 附术语关系图、模型对照表、量化对比表、GPU 精度算力表、核心趋势、参考资源索引&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>推测解码技术全景对比与 DeepSpec 落地分析</title><link>https://bevisy.github.io/p/speculative-decoding-deepspec-analysis/</link><pubDate>Wed, 22 Jul 2026 18:00:00 +0800</pubDate><guid>https://bevisy.github.io/p/speculative-decoding-deepspec-analysis/</guid><description>&lt;img src="https://bevisy.github.io/p/speculative-decoding-deepspec-analysis/ae72ff10-6529-4be6-8ecb-333f95ccda2c.png" alt="Featured image of post 推测解码技术全景对比与 DeepSpec 落地分析" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;项目：DeepSpec | 撰写日期：2026-07-22
目标：系统讲解推测解码技术优缺点，对比 DeepSpec 项目包含的三种方案（DSpark / DFlash / Eagle3）以及 DeepSeek MTP，并梳理各方案在 vLLM 和 SGLang 两大推理引擎中的落地情况（附 PR 链接）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一推测解码技术概述"&gt;一、推测解码技术概述
&lt;/h2&gt;&lt;h3 id="11-核心思想"&gt;1.1 核心思想
&lt;/h3&gt;&lt;p&gt;推测解码（Speculative Decoding）借鉴 CPU 投机执行的思想：先用一个「又快又小」的草稿模型（draft model）猜接下来的 γ 个 token，再让「又慢又准」的目标模型（target model）一次性验证这一整块。猜对的直接用，猜错的修正。&lt;/p&gt;
&lt;p&gt;加速公式（DSpark 论文式 1）：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;L = (T_draft + T_verify) / τ
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;τ：每轮目标模型平均接受的 token 数（接受长度）&lt;/li&gt;
&lt;li&gt;T_draft：草稿模型生成花费&lt;/li&gt;
&lt;li&gt;T_verify：目标模型验证花费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;加速只有三条路：&lt;strong&gt;草稿更快&lt;/strong&gt;（降低 T_draft）、&lt;strong&gt;草稿更准&lt;/strong&gt;（提高 τ）、&lt;strong&gt;验证更聪明&lt;/strong&gt;（降低 T_verify / 按需截断）。&lt;/p&gt;
&lt;h3 id="12-无损保证"&gt;1.2 无损保证
&lt;/h3&gt;&lt;p&gt;推测解码最精妙的数学性质：&lt;strong&gt;无论草稿模型多烂，输出分布严格等于目标模型。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;核心机制是拒绝采样（Rejection Sampling）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接受概率 = min(1, p_target(x) / p_draft(x))&lt;/li&gt;
&lt;li&gt;被拒绝位置从残差分布重采一个修正 token（bonus token）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两路径合并后，最终输出每个 token 的概率严格等于 p_target(x)。草稿模型只影响速度，不影响质量。&lt;/p&gt;
&lt;h3 id="13-三种草稿生成方式"&gt;1.3 三种草稿生成方式
&lt;/h3&gt;&lt;p&gt;这是理解各方法差异的关键：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;纯串行（自回归派）&lt;/strong&gt;：逐 token 生成，每步一次前向&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优点：每个 token 基于已确定的前文，准确&lt;/li&gt;
&lt;li&gt;缺点：γ 次前向，T_draft ∝ γ；为控延迟被迫用极浅网络（1 层），容量受限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;纯并行（并行派）&lt;/strong&gt;：一次前向同时出 γ 个 token&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优点：1 次前向出全部 token，T_draft 几乎与 γ 无关；可用更深网络（5 层）&lt;/li&gt;
&lt;li&gt;缺点：位置间独立，无法建模依赖，后缀衰减严重（多模态碰撞问题）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;半自回归（混合派）&lt;/strong&gt;：并行 backbone 出基线 + 串行 head 注入依赖&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优点：兼顾速度和后端质量&lt;/li&gt;
&lt;li&gt;缺点：串行 head 有少量额外延迟（极小）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二deepspec-项目中的三种方案对比"&gt;二、DeepSpec 项目中的三种方案对比
&lt;/h2&gt;&lt;p&gt;DeepSpec 仓库当前包含三种草稿模型算法，代表了推测解码的三个技术方向。&lt;/p&gt;
&lt;h3 id="21-dspark半自回归--置信度调度"&gt;2.1 DSpark（半自回归 + 置信度调度）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：arXiv 2607.05147（DeepSeek-AI，2026）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[并行 backbone: 5层，一次出全部基线 logits]
 ↓
[串行 Markov head: 轻，逐位注入前一个 token 的偏置]
 ↓
[置信度头: 预测每个位置的接受概率，调度器据此截断]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;核心技术&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;半自回归生成&lt;/strong&gt;：并行 backbone 一次出 γ 个基线 logit，串行 Markov head 逐位加低秩转移偏置 B_k = W2·W1[x_{k-1}]（rank=256），使第 k 位依赖前面已采样的 token。每个 token 概率都是精确 softmax，满足无损保证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;置信度调度验证&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;置信度头：给每个位置打条件接受概率 c_k&lt;/li&gt;
&lt;li&gt;STS 校准：逐位温度校准，ECE 从 3%-8% 降到约 1%&lt;/li&gt;
&lt;li&gt;硬件感知前缀调度器：按生存概率贪心截断，最大化全局吞吐 Θ = τ × SPS(B)，且截断只依赖已处理前缀（因果性/无损）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;训练损失&lt;/strong&gt;：CE(0.1) + L1/TV(0.9) + 置信度 BCE(1.0)，位置加权 w_k = e^{-(k-1)/γ}&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;离线效果&lt;/strong&gt;（Table 1，平均接受长度 τ，block_size=7）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;目标模型&lt;/th&gt;
					&lt;th&gt;vs Eagle3&lt;/th&gt;
					&lt;th&gt;vs DFlash&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3-4B&lt;/td&gt;
					&lt;td&gt;+30.9%&lt;/td&gt;
					&lt;td&gt;+16.3%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3-8B&lt;/td&gt;
					&lt;td&gt;+26.7%&lt;/td&gt;
					&lt;td&gt;+18.4%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qwen3-14B&lt;/td&gt;
					&lt;td&gt;+30.0%&lt;/td&gt;
					&lt;td&gt;+18.3%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gemma4-12B&lt;/td&gt;
					&lt;td&gt;全面领先&lt;/td&gt;
					&lt;td&gt;跨模型族泛化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;具体（Qwen3-4B, GSM8K）：Eagle3=5.14，DFlash=5.40，DSpark=6.11&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;线上效果&lt;/strong&gt;（DeepSeek-V4-Flash/Pro 真实流量，对比 MTP-1）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;引擎&lt;/th&gt;
					&lt;th&gt;等吞吐下单用户提速&lt;/th&gt;
					&lt;th&gt;中等 SLA 下吞吐提升&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;V4-Flash&lt;/td&gt;
					&lt;td&gt;+60%-85%&lt;/td&gt;
					&lt;td&gt;+51%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;V4-Pro&lt;/td&gt;
					&lt;td&gt;+57%-78%&lt;/td&gt;
					&lt;td&gt;+52%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接受长度 τ 最高（~6+），块越长优势越大（γ=7 时 +16%，γ=15 时 +30%）&lt;/li&gt;
&lt;li&gt;2 层 DSpark 超过 5 层 DFlash——注入一点自回归比堆并行层更划算&lt;/li&gt;
&lt;li&gt;串行 head 几乎不增延迟（γ 从 4→16，每轮延迟只比 DFlash 多 0.2%-1.3%）&lt;/li&gt;
&lt;li&gt;置信度调度首次让高并发生产环境安全使用多 token 推测解码&lt;/li&gt;
&lt;li&gt;负载自适应：低并发扩验证预算榨干算力，高并发自动收缩保护 batch 容量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要为每个目标模型单独训练草稿（紧耦合：同族、hidden_size 匹配、tokenizer 一致）&lt;/li&gt;
&lt;li&gt;置信度调度器的线上版本（异步 ZOS 适配、变长路由 kernel）属 DeepSeek 内部框架，未开源&lt;/li&gt;
&lt;li&gt;对本身接受率极低的复杂查询，草稿侧固定开销无法回收&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-dflash纯并行"&gt;2.2 DFlash（纯并行）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：arXiv 2602.06036&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构&lt;/strong&gt;：DSpark 去掉 Markov head 和置信度头&lt;/p&gt;
&lt;p&gt;DeepSpec 仓库中，DFlash 和 DSpark 共用同一个 Trainer 和模型代码，仅配置不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;markov_rank=0&lt;/code&gt; → Markov head 变零矩阵，退化为纯并行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;confidence_head_alpha=0&lt;/code&gt; → 不训练置信度头&lt;/li&gt;
&lt;li&gt;&lt;code&gt;l1_loss_alpha=0&lt;/code&gt;，&lt;code&gt;ce_loss_alpha=1.0&lt;/code&gt; → 只用 CE loss&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;生成方式&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;backbone([anchor, mask, mask, ..., mask]) → [l₁, l₂, ..., l₇] → 独立采样
1 次草稿前向，但位置间无依赖
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 次前向出全部 token，T_draft 几乎与 γ 无关&lt;/li&gt;
&lt;li&gt;可用深网络（5 层），位置 1 的接受率最高（数学 0.88，优于自回归派的 0.81）&lt;/li&gt;
&lt;li&gt;实现简单（无串行 head，无置信度调度）&lt;/li&gt;
&lt;li&gt;训练只需 CE loss，不需置信度标签&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;后缀衰减&lt;/strong&gt;：后面位置因位置间独立，接受率急剧下降（位置 2-7 从 0.72 降到 0.63）&lt;/li&gt;
&lt;li&gt;多模态碰撞：上下文可能是 &amp;ldquo;of course&amp;rdquo; 也可能是 &amp;ldquo;no problem&amp;rdquo;，并行 head 同时推 &amp;ldquo;course&amp;rdquo; 和 &amp;ldquo;problem&amp;rdquo;，串成 &amp;ldquo;of problem&amp;rdquo;&lt;/li&gt;
&lt;li&gt;无法在高并发下安全使用长块（无置信度截断机制，验证浪费 batch 容量）&lt;/li&gt;
&lt;li&gt;接受长度 τ ~4-5，不如半自回归派&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-eagle3纯串行--ttt"&gt;2.3 Eagle3（纯串行 + TTT）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;论文&lt;/strong&gt;：arXiv 2503.01840&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构&lt;/strong&gt;：1 层自回归草稿头 + Test-Time Training（TTT）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心技术&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;草稿模型只有 1 层（&lt;code&gt;draft_num_hidden_layers=1&lt;/code&gt;），逐 token 串行生成&lt;/li&gt;
&lt;li&gt;TTT（Test-Time Training）：推理过程中草稿模型参数动态更新，每 7 步用目标模型反馈微调&lt;/li&gt;
&lt;li&gt;读目标模型最后层 hidden state，共享 embedding 和 lm_head&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;生成方式&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;draft(t₁) → draft(t₂) → ... → draft(t₇)
7 次草稿前向，但每步有完整依赖
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个 token 基于已确定前文，准确度高&lt;/li&gt;
&lt;li&gt;TTT 机制让草稿适应当前上下文，长期对话中越来越准（分布外泛化能力强）&lt;/li&gt;
&lt;li&gt;1 层网络前向+反向极快，TTT 微调开销小&lt;/li&gt;
&lt;li&gt;第一个 token 准确率最高（前缀匹配生存的关键）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T_draft ∝ γ，块越长草稿越慢，被迫用极浅网络（1 层），容量受限&lt;/li&gt;
&lt;li&gt;位置 1 的接受率不如并行派（数学 0.81 vs 0.88），因 1 层网络容量小&lt;/li&gt;
&lt;li&gt;TTT 推理时有额外梯度计算开销&lt;/li&gt;
&lt;li&gt;高并发下多 token 验证开销大（无置信度调度）&lt;/li&gt;
&lt;li&gt;接受长度 τ ~4-5，块越长劣势越明显&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24-三方案对比总表"&gt;2.4 三方案对比总表
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;DSpark&lt;/th&gt;
					&lt;th&gt;DFlash&lt;/th&gt;
					&lt;th&gt;Eagle3&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;生成方式&lt;/td&gt;
					&lt;td&gt;半自回归&lt;/td&gt;
					&lt;td&gt;纯并行&lt;/td&gt;
					&lt;td&gt;纯串行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;草稿层数&lt;/td&gt;
					&lt;td&gt;5 层&lt;/td&gt;
					&lt;td&gt;5 层&lt;/td&gt;
					&lt;td&gt;1 层&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;串行依赖&lt;/td&gt;
					&lt;td&gt;Markov head（低秩 rank=256）&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;完整自回归&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;置信度调度&lt;/td&gt;
					&lt;td&gt;有（STS 校准 + 贪心调度器）&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;T_draft vs γ&lt;/td&gt;
					&lt;td&gt;几乎无关 + 极小串行开销&lt;/td&gt;
					&lt;td&gt;几乎无关&lt;/td&gt;
					&lt;td&gt;∝ γ（线性增长）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;位置 1 接受率&lt;/td&gt;
					&lt;td&gt;高（深网络 + 串行修正）&lt;/td&gt;
					&lt;td&gt;最高（深网络）&lt;/td&gt;
					&lt;td&gt;中（1 层容量受限）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;后缀衰减&lt;/td&gt;
					&lt;td&gt;轻微（Markov head 注入依赖）&lt;/td&gt;
					&lt;td&gt;严重（位置间独立）&lt;/td&gt;
					&lt;td&gt;无（逐 token 依赖）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TTT 推理时训练&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;有（每 7 步微调）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练损失&lt;/td&gt;
					&lt;td&gt;CE + L1/TV + 置信度 BCE&lt;/td&gt;
					&lt;td&gt;仅 CE&lt;/td&gt;
					&lt;td&gt;CE + step loss&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;接受长度 τ&lt;/td&gt;
					&lt;td&gt;~6+（最高）&lt;/td&gt;
					&lt;td&gt;~4-5&lt;/td&gt;
					&lt;td&gt;~4-5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;高并发安全&lt;/td&gt;
					&lt;td&gt;是（置信度截断）&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;分布外适应&lt;/td&gt;
					&lt;td&gt;依赖训练数据覆盖&lt;/td&gt;
					&lt;td&gt;依赖训练数据覆盖&lt;/td&gt;
					&lt;td&gt;TTT 动态适应&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;代码位置&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;modeling/dspark/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;modeling/dspark/&lt;/code&gt;（配置不同）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;modeling/eagle3/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三deepseek-mtp-与推测解码的关系"&gt;三、DeepSeek MTP 与推测解码的关系
&lt;/h2&gt;&lt;h3 id="31-mtp-是什么"&gt;3.1 MTP 是什么
&lt;/h3&gt;&lt;p&gt;MTP（Multi-Token Prediction，多 Token 预测）是 DeepSeek-V3 技术报告提出的&lt;strong&gt;训练阶段&lt;/strong&gt;技术。预训练时不只预测下一个 token，还同时预测未来第 2、3&amp;hellip;个 token，迫使模型学更好的表征。&lt;/p&gt;
&lt;h3 id="32-mtp-架构"&gt;3.2 MTP 架构
&lt;/h3&gt;&lt;p&gt;DeepSeek-V3 的 MTP 是串行链式的，每个模块的输入依赖前一个模块的输出（保持完整因果链）：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;主模型 → hidden h₀ → MTP模块1 → 预测 token₂ → hidden h₁ → MTP模块2 → 预测 token₃ → ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每个 MTP 模块：输入 = concat(RMSNorm(h_{k-1}), RMSNorm(Emb(token_k))) → 投影 → Transformer → 预测 token_{k+1}&lt;/p&gt;
&lt;h3 id="33-mtp-vs-推测解码"&gt;3.3 MTP vs 推测解码
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;MTP&lt;/th&gt;
					&lt;th&gt;推测解码&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;本质&lt;/td&gt;
					&lt;td&gt;训练阶段技术&lt;/td&gt;
					&lt;td&gt;推理阶段技术&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;主要目的&lt;/td&gt;
					&lt;td&gt;改善训练表征质量&lt;/td&gt;
					&lt;td&gt;加速推理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;草稿来源&lt;/td&gt;
					&lt;td&gt;MTP 模块（预训练时联合训练）&lt;/td&gt;
					&lt;td&gt;独立小模型 / 挂载头 / n-gram&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练方式&lt;/td&gt;
					&lt;td&gt;与主模型联合预训练&lt;/td&gt;
					&lt;td&gt;草稿模型单独训练&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;推理时&lt;/td&gt;
					&lt;td&gt;默认丢弃 MTP 模块&lt;/td&gt;
					&lt;td&gt;必须有草稿模型参与&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;结合点&lt;/td&gt;
					&lt;td&gt;MTP 模块可当推测解码的草稿模型&lt;/td&gt;
					&lt;td&gt;DeepSeek 生产环境就是如此&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-deepseek-生产环境的实际做法"&gt;3.4 DeepSeek 生产环境的实际做法
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;预训练时：主模型 + MTP 模块联合训练，MTP loss 权重 0.1&lt;/li&gt;
&lt;li&gt;推理时：保留 MTP-1（只保留第一个 MTP 模块，预测 2 个 token），因为高并发下多 token 验证开销过大&lt;/li&gt;
&lt;li&gt;MTP-1 第二 token 接受率约 85%-90%，约 1.8x 推理加速&lt;/li&gt;
&lt;li&gt;DSpark 论文的核心贡献之一：&lt;strong&gt;首次让高并发生产环境安全使用多 token 推测解码&lt;/strong&gt;，此前只能用 MTP-1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="35-mtp-vs-eagledspark-的技术亲缘"&gt;3.5 MTP vs EAGLE/DSpark 的技术亲缘
&lt;/h3&gt;&lt;p&gt;共同点：都读目标模型 hidden state，都有轻量 Transformer 层 + 共享 embedding/unembedding。&lt;/p&gt;
&lt;p&gt;关键区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MTP 模块：&lt;strong&gt;预训练时与主模型联合训练&lt;/strong&gt;，权重与主模型耦合优化&lt;/li&gt;
&lt;li&gt;EAGLE/DSpark 草稿：&lt;strong&gt;后训练阶段单独训练&lt;/strong&gt;，主模型冻结&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MTP 当草稿用时接受率不如专门训练的方案（MTP-1 τ&lt;del&gt;2 vs DSpark τ&lt;/del&gt;6+），但 MTP 的额外好处是&lt;strong&gt;训练阶段就提升了主模型质量&lt;/strong&gt;，这是推测解码草稿不具备的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四各方案在-vllm-中的落地情况"&gt;四、各方案在 vLLM 中的落地情况
&lt;/h2&gt;&lt;p&gt;vLLM 是当前最活跃的开源 LLM 推理引擎，对推测解码的支持最为全面。&lt;/p&gt;
&lt;h3 id="41-总览"&gt;4.1 总览
&lt;/h3&gt;&lt;p&gt;vLLM 支持的推测解码方法（截至 2026-07）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;支持状态&lt;/th&gt;
					&lt;th&gt;配置 method&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;EAGLE / EAGLE-3&lt;/td&gt;
					&lt;td&gt;已合并，生产可用&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;eagle3&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;已合并，生产可用&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;dflash&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;已合并，积极完善中&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;dspark&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek MTP&lt;/td&gt;
					&lt;td&gt;已合并，成熟&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek_mtp&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P-EAGLE（并行 EAGLE）&lt;/td&gt;
					&lt;td&gt;已合并&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;eagle3&lt;/code&gt; + &lt;code&gt;parallel_drafting: true&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;N-gram&lt;/td&gt;
					&lt;td&gt;已合并&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ngram&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;独立草稿模型&lt;/td&gt;
					&lt;td&gt;已合并&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方文档：https://docs.vllm.ai/en/latest/features/speculative_decoding&lt;/p&gt;
&lt;h3 id="42-eagle3-在-vllm"&gt;4.2 Eagle3 在 vLLM
&lt;/h3&gt;&lt;p&gt;Eagle3 于 2026 年 4 月开始在 vLLM 中落地，Red Hat 团队主导集成。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/37512" target="_blank" rel="noopener"
 &gt;#37512&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;MiniMax-M2: add Eagle3 speculative decoding support&lt;/td&gt;
					&lt;td&gt;2026-04-06&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/39450" target="_blank" rel="noopener"
 &gt;#39450&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Add Gemma4 Eagle3 support&lt;/td&gt;
					&lt;td&gt;2026-04-10&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/43132" target="_blank" rel="noopener"
 &gt;#43132&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] Add Qwen3 architecture support for EAGLE3&lt;/td&gt;
					&lt;td&gt;2026-06-21&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/42764" target="_blank" rel="noopener"
 &gt;#42764&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Model] Support post-norm architecture for EAGLE-3 speculators&lt;/td&gt;
					&lt;td&gt;2026-05-19&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/41826" target="_blank" rel="noopener"
 &gt;#41826&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Added peagle speculators support&lt;/td&gt;
					&lt;td&gt;2026-05-12&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Red Hat 博客报道 Eagle3 在 vLLM 中最高可达 2.5x 加速：
&lt;a class="link" href="https://developers.redhat.com/articles/2025/07/01/fly-eagle3-fly-faster-inference-vllm-speculative-decoding" target="_blank" rel="noopener"
 &gt;https://developers.redhat.com/articles/2025/07/01/fly-eagle3-fly-faster-inference-vllm-speculative-decoding&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P-EAGLE（并行版 Eagle3）在 vLLM 中通过 &lt;code&gt;parallel_drafting: true&lt;/code&gt; 启用，B200 上比 Eagle3 快 1.05x-1.69x：
&lt;a class="link" href="https://vllm.ai/blog/2026-03-13-p-eagle" target="_blank" rel="noopener"
 &gt;https://vllm.ai/blog/2026-03-13-p-eagle&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="43-dflash-在-vllm"&gt;4.3 DFlash 在 vLLM
&lt;/h3&gt;&lt;p&gt;DFlash 于 2026 年 4 月开始在 vLLM 中落地，同样由 Red Hat 团队主导。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/38300" target="_blank" rel="noopener"
 &gt;#38300&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Speculative Decoding] Add DFlash speculators config parsing&lt;/td&gt;
					&lt;td&gt;2026-04-15&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/43445" target="_blank" rel="noopener"
 &gt;#43445&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] Allow causal DFlash&lt;/td&gt;
					&lt;td&gt;2026-05-28&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/44586" target="_blank" rel="noopener"
 &gt;#44586&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[MRV2][Spec Decode] DFlash&lt;/td&gt;
					&lt;td&gt;2026-06-10&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/45181" target="_blank" rel="noopener"
 &gt;#45181&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] Support mixed KV page sizes for DFlash&lt;/td&gt;
					&lt;td&gt;2026-06-21&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/45319" target="_blank" rel="noopener"
 &gt;#45319&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Model][Dflash] Enable Dflash for Qwen3NextForCausalLM&lt;/td&gt;
					&lt;td&gt;2026-06-12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/46770" target="_blank" rel="noopener"
 &gt;#46770&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Model Runner V2][DFlash] Enable dflash attention backend selection&lt;/td&gt;
					&lt;td&gt;2026-06-26&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47914" target="_blank" rel="noopener"
 &gt;#47914&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] Support hybrid (SWA + full attention) DFlash drafters&lt;/td&gt;
					&lt;td&gt;2026-07-08&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;vllm-project/speculators 项目提供 DFlash 草稿模型训练，训练后可直接部署到 vLLM：
&lt;a class="link" href="https://github.com/vllm-project/speculators" target="_blank" rel="noopener"
 &gt;https://github.com/vllm-project/speculators&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="44-dspark-在-vllm"&gt;4.4 DSpark 在 vLLM
&lt;/h3&gt;&lt;p&gt;DSpark 于 2026 年 7 月 1 日合并到 vLLM，目前处于积极完善阶段，有大量 follow-up PR 在修复边缘情况和扩展支持。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR/Issue&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;状态&lt;/th&gt;
					&lt;th&gt;日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/issues/46910" target="_blank" rel="noopener"
 &gt;#46910&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Feature]: Support DSpark for DeepSeek V4（Feature Issue）&lt;/td&gt;
					&lt;td&gt;Closed (COMPLETED)&lt;/td&gt;
					&lt;td&gt;2026-06，2026-07-02 关闭&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/46995" target="_blank" rel="noopener"
 &gt;#46995&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] DSpark（主 PR）&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-01&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47093" target="_blank" rel="noopener"
 &gt;#47093&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] DSpark speculators checkpoint support&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-02&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47216" target="_blank" rel="noopener"
 &gt;#47216&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode][DSpark] Add Gemma4-12B DSpark draft model&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47419" target="_blank" rel="noopener"
 &gt;#47419&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[ROCm] Enable DeepSeek-V4 DSpark on AMD (MI350X/MI355X)&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-10&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47677" target="_blank" rel="noopener"
 &gt;#47677&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[XPU] Add DSpark speculative decoding support for DeepSeek-V4&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47377" target="_blank" rel="noopener"
 &gt;#47377&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode] Add DSpark support for Qwen3.5 target models&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/48692" target="_blank" rel="noopener"
 &gt;#48692&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[MRV2][Spec Decode] Adaptive Speculative Decoding - Initial Support&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47584" target="_blank" rel="noopener"
 &gt;#47584&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec Decode][Perf] Rowwise-fp8 draft lm_head for DSpark (opt-in)&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;主 PR #46995 的设计说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持加载 DeepSeek-V4 DSpark 模型和 DeepSeek 训练的 Qwen3-DSpark 模型&lt;/li&gt;
&lt;li&gt;DSpark 使用非因果滑动窗口注意力，复用现有 SparseMLA 后端（扩展 topk），无需重新实现 MLA attention&lt;/li&gt;
&lt;li&gt;支持通过 &lt;code&gt;--speculative-config&lt;/code&gt; 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vLLM Ascend 也有对应 RFC：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm-ascend/issues/11126" target="_blank" rel="noopener"
 &gt;vllm-ascend#11126&lt;/a&gt;：[RFC]: Add DSpark speculative decoding support for DeepSeek-V4&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="45-deepseek-mtp-在-vllm"&gt;4.5 DeepSeek MTP 在 vLLM
&lt;/h3&gt;&lt;p&gt;DeepSeek MTP 是 vLLM 中最早支持的推测解码方法之一，2025 年 2 月即合并。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/12755" target="_blank" rel="noopener"
 &gt;#12755&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Model][Speculative Decoding] DeepSeek MTP spec decode&lt;/td&gt;
					&lt;td&gt;2025-02-19&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/44821" target="_blank" rel="noopener"
 &gt;#44821&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;fix: prefix DeepSeek V4 MTP projections&lt;/td&gt;
					&lt;td&gt;2026-06-10&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/44420" target="_blank" rel="noopener"
 &gt;#44420&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[feature] add index share feature for DSA MTP&lt;/td&gt;
					&lt;td&gt;2026-06-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/46994" target="_blank" rel="noopener"
 &gt;#46994&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec][V2] Support MTP speculative decoding under pipeline parallelism&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;配置示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;method&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deepseek_mtp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;num_speculative_tokens&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MTP 已支持 PP &amp;gt; 1（pipeline parallelism），是当前最成熟的推测解码选项。&lt;/p&gt;
&lt;h3 id="46-vllm-推测解码生态vllm-projectspeculators"&gt;4.6 vLLM 推测解码生态：vllm-project/speculators
&lt;/h3&gt;&lt;p&gt;vLLM 团队维护了专门的草稿模型训练库：
&lt;a class="link" href="https://github.com/vllm-project/speculators" target="_blank" rel="noopener"
 &gt;https://github.com/vllm-project/speculators&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;统一训练框架，训练后直接部署到 vLLM&lt;/li&gt;
&lt;li&gt;支持 P-EAGLE、DFlash、EAGLE-3 训练&lt;/li&gt;
&lt;li&gt;已发布多个模型：Qwen3-8B DFlash（τ~3.74）、Gemma4-31B DFlash/Eagle3 等&lt;/li&gt;
&lt;li&gt;DFlash 模型通过 PR #38300 实现无缝部署&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="五各方案在-sglang-中的落地情况"&gt;五、各方案在 SGLang 中的落地情况
&lt;/h2&gt;&lt;p&gt;SGLang 是 LMSYS 团队维护的高性能推理引擎，对推测解码的支持同样全面。&lt;/p&gt;
&lt;h3 id="51-总览"&gt;5.1 总览
&lt;/h3&gt;&lt;p&gt;SGLang 支持的推测解码方法：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;支持状态&lt;/th&gt;
					&lt;th&gt;配置&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;EAGLE-2&lt;/td&gt;
					&lt;td&gt;已合并，成熟&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm EAGLE&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;EAGLE-3&lt;/td&gt;
					&lt;td&gt;已合并，成熟&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm EAGLE3&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;已合并，成熟&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm DFLASH&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;已合并，积极完善中&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm DSPARK&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MTP&lt;/td&gt;
					&lt;td&gt;已合并，成熟&lt;/td&gt;
					&lt;td&gt;DeepSeek 模型原生支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;N-gram&lt;/td&gt;
					&lt;td&gt;已合并&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm NGRAM&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;独立草稿模型&lt;/td&gt;
					&lt;td&gt;已合并&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--speculative-algorithm STANDALONE&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方文档：https://docs.sglang.ai/advanced_features/speculative_decoding.html&lt;/p&gt;
&lt;h3 id="52-eagle3-在-sglang"&gt;5.2 Eagle3 在 SGLang
&lt;/h3&gt;&lt;p&gt;Eagle3 通过 SpecForge 框架训练，部署到 SGLang：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SpecForge（sgl-project/SpecForge）：Eagle3 训练框架
&lt;ul&gt;
&lt;li&gt;仓库：https://github.com/sgl-project/SpecForge&lt;/li&gt;
&lt;li&gt;博客：https://www.lmsys.org/blog/2025-07-25-spec-forge&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SGLang Eagle3 已支持多种模型（Llama、Qwen3、Kimi-K2.6 等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键 PR（SGLang 中的 Eagle3 相关）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/26506" target="_blank" rel="noopener"
 &gt;#26506&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[spec decoding] support kimi-k2.6-eagle3.1-mla draft&lt;/td&gt;
					&lt;td&gt;2026-05-28&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29464" target="_blank" rel="noopener"
 &gt;#29464&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Fix EAGLE draft hidden dim extraction and centralize spec helpers&lt;/td&gt;
					&lt;td&gt;2026-06-28&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/26726" target="_blank" rel="noopener"
 &gt;#26726&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;fix(spec-dec): treat num_nextn_predict_layers=0 the same as absent for EAGLE3&lt;/td&gt;
					&lt;td&gt;2026-06-05&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30947" target="_blank" rel="noopener"
 &gt;#30947&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[EAGLE] perf: Fuse topk=1 draft postprocess&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31380" target="_blank" rel="noopener"
 &gt;#31380&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Consolidate the verify step into eagle_worker_common&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="53-dflash-在-sglang"&gt;5.3 DFlash 在 SGLang
&lt;/h3&gt;&lt;p&gt;DFlash 在 SGLang 中已成熟，支持多种后端和优化。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29338" target="_blank" rel="noopener"
 &gt;#29338&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Add DFLASH basic sanity CI test&lt;/td&gt;
					&lt;td&gt;2026-06-29&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29228" target="_blank" rel="noopener"
 &gt;#29228&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Merge dflash triton kernels into a single dflash.py&lt;/td&gt;
					&lt;td&gt;2026-06-25&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29541" target="_blank" rel="noopener"
 &gt;#29541&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Publish DFLASH verify read-done event for fine-grained WAR barrier&lt;/td&gt;
					&lt;td&gt;2026-06-29&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29446" target="_blank" rel="noopener"
 &gt;#29446&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Add Laguna XS.2.1 DFlash support to SGLang&lt;/td&gt;
					&lt;td&gt;2026-07-02&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29218" target="_blank" rel="noopener"
 &gt;#29218&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] DFlash: support pure-MLA targets with an fp8 KV cache (Kimi-K2.x-NVFP4)&lt;/td&gt;
					&lt;td&gt;2026-07-08&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29995" target="_blank" rel="noopener"
 &gt;#29995&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Remove the ServerArgs clone hack from DFlashWorkerV2&lt;/td&gt;
					&lt;td&gt;2026-07-03&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31468" target="_blank" rel="noopener"
 &gt;#31468&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] DFlash: remove per-step host syncs (spec-v2 overlap)&lt;/td&gt;
					&lt;td&gt;2026-07-18&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31677" target="_blank" rel="noopener"
 &gt;#31677&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Extract DFlash compact draft-cache rebuild helpers&lt;/td&gt;
					&lt;td&gt;2026-07-20&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29884" target="_blank" rel="noopener"
 &gt;#29884&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Doc] Cookbook: Laguna-XS-2.1 (DFlash low-latency + high-throughput)&lt;/td&gt;
					&lt;td&gt;2026-07-02&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="54-dspark-在-sglang"&gt;5.4 DSpark 在 SGLang
&lt;/h3&gt;&lt;p&gt;DSpark 于 2026 年 7 月 12 日合并到 SGLang，LMSYS 团队发布了详细的工程博客。&lt;/p&gt;
&lt;p&gt;主 PR 及关键 follow-up：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;状态&lt;/th&gt;
					&lt;th&gt;日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/issues/29488" target="_blank" rel="noopener"
 &gt;#29488&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Feature] Support DSpark Speculative Decoding for DeepSeek V4（Feature Issue）&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-06-27&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30261" target="_blank" rel="noopener"
 &gt;#30261&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Add DSpark: confidence-scheduled speculative decoding（主 PR）&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31434" target="_blank" rel="noopener"
 &gt;#31434&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Perf] Cache uniform ragged-verify layout for DSpark verify-all compact&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31985" target="_blank" rel="noopener"
 &gt;#31985&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Perf] Fold dspark dense draft embedding into the draft graph&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-22&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31986" target="_blank" rel="noopener"
 &gt;#31986&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Perf] Stack dspark dense draft per-layer ctx KV projection into one GEMM&lt;/td&gt;
					&lt;td&gt;Merged&lt;/td&gt;
					&lt;td&gt;2026-07-22&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30720" target="_blank" rel="noopener"
 &gt;#30720&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[WIP] Enable GLM-5.2 DSpark compact verify functionality&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31026" target="_blank" rel="noopener"
 &gt;#31026&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[ROCm] Add DeepSeek-V4 DSpark for AMD GPU (MI350X/MI355X)&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30964" target="_blank" rel="noopener"
 &gt;#30964&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[AMD] Support DeepSeek V4 DSpark on AMD HIP platform&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31139" target="_blank" rel="noopener"
 &gt;#31139&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[PP&amp;amp;Spec] enable speculative decoding (MTP&amp;amp;DSpark) under PP&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31466" target="_blank" rel="noopener"
 &gt;#31466&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] DSpark support prefill/decode disaggregation&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31513" target="_blank" rel="noopener"
 &gt;#31513&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Spec] Support DSPARK in disaggregation decode mode&lt;/td&gt;
					&lt;td&gt;Open&lt;/td&gt;
					&lt;td&gt;2026-07&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SGLang DSpark 工程博客（强烈推荐阅读）：
&lt;a class="link" href="https://www.lmsys.org/blog/2026-07-06-dspark-sglang" target="_blank" rel="noopener"
 &gt;https://www.lmsys.org/blog/2026-07-06-dspark-sglang&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;博客核心内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SGLang 实现了 DSpark 的置信度调度器、逐请求变长验证（ragged verify）、全 CUDA graph 覆盖&lt;/li&gt;
&lt;li&gt;三种验证模式：&lt;code&gt;static&lt;/code&gt;（全块验证）、&lt;code&gt;compact&lt;/code&gt;（按调度器截断，生产路径）、&lt;code&gt;cap-accept&lt;/code&gt;（全块验证但只提交截断窗口，用于观测上限）&lt;/li&gt;
&lt;li&gt;Ragged verify under full CUDA graphs：变长请求前打包到一个紧凑缓冲区，按总量对齐到捕获的 graph tier，截断后重放真正更小的 graph&lt;/li&gt;
&lt;li&gt;SPS cost table：离线 profiling 步时间模型，在线让调度器决定每请求验证预算&lt;/li&gt;
&lt;li&gt;零开销调度（ZOS）：集成到 SGLang 的 overlap scheduler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;启动命令示例（DeepSeek-V4-Flash）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -m sglang.launch_server &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --model-path deepseek-ai/DeepSeek-V4-Flash-DSpark &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --speculative-algorithm DSPARK &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tp &lt;span class="m"&gt;4&lt;/span&gt; --dp-size &lt;span class="m"&gt;4&lt;/span&gt; --enable-dp-attention --enable-dp-lm-head &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --moe-a2a-backend none --moe-runner-backend flashinfer_mxfp4 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --swa-full-tokens-ratio 0.1 --chunked-prefill-size &lt;span class="m"&gt;1024&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --mem-fraction-static 0.8 --cuda-graph-max-bs &lt;span class="m"&gt;192&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-running-requests &lt;span class="m"&gt;1024&lt;/span&gt; --disable-radix-cache &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --trust-remote-code --host 0.0.0.0 --port &lt;span class="m"&gt;30000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="55-mtp-在-sglang"&gt;5.5 MTP 在 SGLang
&lt;/h3&gt;&lt;p&gt;SGLang 从 2025 年 1 月起就提供 DeepSeek 模型的 day-0 支持，MTP 支持较早成熟。&lt;/p&gt;
&lt;p&gt;关键 PR：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;PR&lt;/th&gt;
					&lt;th&gt;标题&lt;/th&gt;
					&lt;th&gt;合并日期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/26471" target="_blank" rel="noopener"
 &gt;#26471&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;DeepSeek-V4 Online Compress support MTP&lt;/td&gt;
					&lt;td&gt;2026-06-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/24436" target="_blank" rel="noopener"
 &gt;#24436&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[Gemma 4] Adding MTP support&lt;/td&gt;
					&lt;td&gt;2026-05-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30333" target="_blank" rel="noopener"
 &gt;#30333&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[AMD] Fix DeepSeek V4 MTP accuracy issue&lt;/td&gt;
					&lt;td&gt;2026-07-07&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30238" target="_blank" rel="noopener"
 &gt;#30238&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;[AMD] Support two batch overlap with MTP on DeepSeekV4&lt;/td&gt;
					&lt;td&gt;2026-07-16&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/28982" target="_blank" rel="noopener"
 &gt;#28982&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;fix(mtp): avoid mtp perf regression in deepseek when enable eplb&lt;/td&gt;
					&lt;td&gt;2026-07-09&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SGLang MTP 教程：
&lt;a class="link" href="https://company.hpc-ai.com/blog/sglang-speculative-decoding-tutorial" target="_blank" rel="noopener"
 &gt;https://company.hpc-ai.com/blog/sglang-speculative-decoding-tutorial&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六deepspec-落地情况总结"&gt;六、DeepSpec 落地情况总结
&lt;/h2&gt;&lt;h3 id="61-落地成熟度对比"&gt;6.1 落地成熟度对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;vLLM&lt;/th&gt;
					&lt;th&gt;SGLang&lt;/th&gt;
					&lt;th&gt;备注&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Eagle3&lt;/td&gt;
					&lt;td&gt;生产可用（2026-04 起合并，多模型支持）&lt;/td&gt;
					&lt;td&gt;生产可用（SpecForge 训练 + SGLang 部署）&lt;/td&gt;
					&lt;td&gt;两个引擎都成熟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;生产可用（2026-04 起合并，多后端支持）&lt;/td&gt;
					&lt;td&gt;生产可用（多 kernel 优化，多模型支持）&lt;/td&gt;
					&lt;td&gt;两个引擎都成熟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;已合并（2026-07-01），积极完善中&lt;/td&gt;
					&lt;td&gt;已合并（2026-07-12），积极完善中&lt;/td&gt;
					&lt;td&gt;大量 follow-up PR 修复边缘情况&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek MTP&lt;/td&gt;
					&lt;td&gt;成熟（2025-02 起合并）&lt;/td&gt;
					&lt;td&gt;成熟（day-0 支持）&lt;/td&gt;
					&lt;td&gt;两个引擎最早支持的方法&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="62-dspark-落地特点"&gt;6.2 DSpark 落地特点
&lt;/h3&gt;&lt;p&gt;DSpark 在两个引擎中的落地都处于「核心功能已合并、积极扩展」阶段：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vLLM 侧&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主 PR #46995 支持加载 DeepSeek-V4 DSpark 和 Qwen3-DSpark 检查点&lt;/li&gt;
&lt;li&gt;已扩展到 Gemma4-12B（#47216）、ROCm（#47419）、XPU（#47677）&lt;/li&gt;
&lt;li&gt;正在添加 Qwen3.5 支持（#47377）、自适应推测解码（#48692）&lt;/li&gt;
&lt;li&gt;Red Hat 团队发布了 GLM-5.2 DSpark speculator preview：
&lt;a class="link" href="https://huggingface.co/RedHatAI/GLM-5.2-speculator.dspark-preview" target="_blank" rel="noopener"
 &gt;https://huggingface.co/RedHatAI/GLM-5.2-speculator.dspark-preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SGLang 侧&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主 PR #30261 实现了完整的置信度调度 + ragged verify + CUDA graph&lt;/li&gt;
&lt;li&gt;LMSYS 发布了详细工程博客，展示了 DSpark 对 MTP 和 non-spec 的吞吐/延迟优势&lt;/li&gt;
&lt;li&gt;正在扩展到 GLM-5.2（#30720, #31047）、ROCm（#30964, #31026）、PD 分离（#31466, #31513）&lt;/li&gt;
&lt;li&gt;性能优化 PR 持续合并（#31985, #31986 融合 embedding 和 KV projection）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-从研究到生产的完整路径"&gt;6.3 从研究到生产的完整路径
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. 训练（DeepSpec / SpecForge / vllm-project/speculators）
 准备数据 → 用目标模型重新生成回答 → 预计算 target cache → 训练草稿模型

2. 评测（DeepSpec eval.py）
 accept_len / accept_rate@k 指标

3. 部署（vLLM / SGLang）
 --speculative-config &amp;#39;{&amp;#34;method&amp;#34;: &amp;#34;dspark&amp;#34;, &amp;#34;model&amp;#34;: &amp;#34;path/to/draft&amp;#34;}&amp;#39;
 --speculative-algorithm DSPARK --speculative-draft-model-path ...
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="七方案选型建议"&gt;七、方案选型建议
&lt;/h2&gt;&lt;h3 id="71-按场景选"&gt;7.1 按场景选
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;推荐方案&lt;/th&gt;
					&lt;th&gt;理由&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;高并发生产服务&lt;/td&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;置信度调度负载自适应，不拖垮吞吐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;低并发交互式（batch=1）&lt;/td&gt;
					&lt;td&gt;Eagle3 / DSpark&lt;/td&gt;
					&lt;td&gt;接受率高的方案在低并发下收益最大&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;目标模型有原生 MTP&lt;/td&gt;
					&lt;td&gt;DeepSeek MTP&lt;/td&gt;
					&lt;td&gt;零额外训练，直接用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;不想训练草稿模型&lt;/td&gt;
					&lt;td&gt;N-gram / Lookahead&lt;/td&gt;
					&lt;td&gt;零训练成本，但加速有限&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨模型族通用&lt;/td&gt;
					&lt;td&gt;独立草稿模型&lt;/td&gt;
					&lt;td&gt;即插即用，但接受率最低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;追求最高接受长度&lt;/td&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;τ~6+，块越长优势越大&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;追求分布外泛化&lt;/td&gt;
					&lt;td&gt;Eagle3（TTT）&lt;/td&gt;
					&lt;td&gt;推理时动态适应新上下文&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;快速验证 / 不确定效果&lt;/td&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;实现简单，训练只需 CE loss&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="72-按引擎选"&gt;7.2 按引擎选
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;需求&lt;/th&gt;
					&lt;th&gt;vLLM&lt;/th&gt;
					&lt;th&gt;SGLang&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;最全面的 spec decode 支持&lt;/td&gt;
					&lt;td&gt;方法最多&lt;/td&gt;
					&lt;td&gt;方法最多&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark 置信度调度&lt;/td&gt;
					&lt;td&gt;基础支持&lt;/td&gt;
					&lt;td&gt;完整实现（compact ragged verify）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Eagle3 训练框架&lt;/td&gt;
					&lt;td&gt;vllm-project/speculators&lt;/td&gt;
					&lt;td&gt;SpecForge&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek 模型优化&lt;/td&gt;
					&lt;td&gt;支持&lt;/td&gt;
					&lt;td&gt;day-0 深度优化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AMD GPU 支持&lt;/td&gt;
					&lt;td&gt;支持（ROCm）&lt;/td&gt;
					&lt;td&gt;支持（ROCm）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;文档/教程&lt;/td&gt;
					&lt;td&gt;完善&lt;/td&gt;
					&lt;td&gt;完善 + cookbook&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="八参考文献"&gt;八、参考文献
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;DSpark 论文：arXiv 2607.05147&lt;/li&gt;
&lt;li&gt;DFlash 论文：arXiv 2602.06036&lt;/li&gt;
&lt;li&gt;Eagle3 论文：arXiv 2503.01840&lt;/li&gt;
&lt;li&gt;EAGLE 论文：arXiv 2401.15077&lt;/li&gt;
&lt;li&gt;Medusa 论文：arXiv 2401.10774&lt;/li&gt;
&lt;li&gt;Leviathan 2023（经典推测解码）：arXiv 2211.17192&lt;/li&gt;
&lt;li&gt;DeepSeek-V3 技术报告（MTP 原始来源）&lt;/li&gt;
&lt;li&gt;Better &amp;amp; Faster LLMs via Multi-token prediction：arXiv 2404.19737&lt;/li&gt;
&lt;li&gt;推测解码综述：arXiv 2411.13157、arXiv 2502.19732&lt;/li&gt;
&lt;li&gt;vLLM 推测解码文档：https://docs.vllm.ai/en/latest/features/speculative_decoding&lt;/li&gt;
&lt;li&gt;SGLang 推测解码文档：https://docs.sglang.ai/advanced_features/speculative_decoding.html&lt;/li&gt;
&lt;li&gt;DSpark in SGLang 博客：https://www.lmsys.org/blog/2026-07-06-dspark-sglang&lt;/li&gt;
&lt;li&gt;SpecForge：https://github.com/sgl-project/SpecForge&lt;/li&gt;
&lt;li&gt;vllm-project/speculators：https://github.com/vllm-project/speculators&lt;/li&gt;
&lt;li&gt;Red Hat Eagle3 博客：https://developers.redhat.com/articles/2025/07/01/fly-eagle3-fly-faster-inference-vllm-speculative-decoding&lt;/li&gt;
&lt;li&gt;P-EAGLE 博客：https://vllm.ai/blog/2026-03-13-p-eagle&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="附录关键-pr-速查索引"&gt;附录：关键 PR 速查索引
&lt;/h2&gt;&lt;h3 id="vllm"&gt;vLLM
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;关键 PR&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek MTP&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/12755" target="_blank" rel="noopener"
 &gt;#12755&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;初始支持（2025-02）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Eagle3&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/37512" target="_blank" rel="noopener"
 &gt;#37512&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/39450" target="_blank" rel="noopener"
 &gt;#39450&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/43132" target="_blank" rel="noopener"
 &gt;#43132&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;MiniMax-M2 / Gemma4 / Qwen3 支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/38300" target="_blank" rel="noopener"
 &gt;#38300&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/44586" target="_blank" rel="noopener"
 &gt;#44586&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/43445" target="_blank" rel="noopener"
 &gt;#43445&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;配置解析 / MRV2 / causal DFlash&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/46995" target="_blank" rel="noopener"
 &gt;#46995&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47093" target="_blank" rel="noopener"
 &gt;#47093&lt;/a&gt;, &lt;a class="link" href="https://github.com/vllm-project/vllm/pull/47216" target="_blank" rel="noopener"
 &gt;#47216&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;主 PR / speculators checkpoint / Gemma4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P-EAGLE&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/vllm-project/vllm/pull/41826" target="_blank" rel="noopener"
 &gt;#41826&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;peagle speculators 支持&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="sglang"&gt;SGLang
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;关键 PR&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Eagle3&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/26506" target="_blank" rel="noopener"
 &gt;#26506&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29464" target="_blank" rel="noopener"
 &gt;#29464&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Kimi-K2.6 / 通用 spec helper&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DFlash&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29338" target="_blank" rel="noopener"
 &gt;#29338&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29228" target="_blank" rel="noopener"
 &gt;#29228&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/29446" target="_blank" rel="noopener"
 &gt;#29446&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;CI / triton kernel / Laguna XS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DSpark&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/30261" target="_blank" rel="noopener"
 &gt;#30261&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31434" target="_blank" rel="noopener"
 &gt;#31434&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/31985" target="_blank" rel="noopener"
 &gt;#31985&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;主 PR / ragged-verify layout / perf 优化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MTP&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://github.com/sgl-project/sglang/pull/26471" target="_blank" rel="noopener"
 &gt;#26471&lt;/a&gt;, &lt;a class="link" href="https://github.com/sgl-project/sglang/pull/24436" target="_blank" rel="noopener"
 &gt;#24436&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;DeepSeek-V4 / Gemma4 MTP&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>拆解 Kimi K3：2.8 万亿参数背后，6 项架构创新如何让 MoE 训练稳得住</title><link>https://bevisy.github.io/p/kimi-k3-architecture-innovation/</link><pubDate>Tue, 21 Jul 2026 22:30:00 +0800</pubDate><guid>https://bevisy.github.io/p/kimi-k3-architecture-innovation/</guid><description>&lt;img src="https://bevisy.github.io/p/kimi-k3-architecture-innovation/663cb3c8-3efa-4bc4-a23a-c5185a1671c7.png" alt="Featured image of post 拆解 Kimi K3：2.8 万亿参数背后，6 项架构创新如何让 MoE 训练稳得住" /&gt;&lt;p&gt;2026 年 7 月 17 日，月之暗面（Moonshot AI）发布了 Kimi K3——全球首个公布的 3T 级开源模型。2.8 万亿参数，原生多模态视觉能力，100 万 token 上下文窗口，896 个专家中激活 16 个。这些数字本身已经足够吸引眼球。&lt;/p&gt;
&lt;p&gt;但如果你关注大模型的工程实现，真正值得深挖的不是跑分，而是一个更本质的问题：&lt;strong&gt;把参数堆到万亿级并不难，难的是训练过程中不崩、专家负载不偏、推理成本不失控。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kimi K3 在架构层面拿出了 6 项核心技术来回答这个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kimi Delta Attention (KDA)&lt;/strong&gt; — 新型注意力基座&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention Residuals (AttnRes)&lt;/strong&gt; — 跨深度选择性表征检索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable LatentMoE&lt;/strong&gt; — 896 选 16 的极致稀疏 MoE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantile Balancing&lt;/strong&gt; — 基于分位数的专家均衡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-Head Muon&lt;/strong&gt; — 逐头独立优化器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SiTU + Gated MLA&lt;/strong&gt; — 激活控制与注意力选择性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本文逐一拆解这 6 项技术，看它们如何共同支撑起一个稳定的 3T 级训练流程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一注意力机制重构kda-与-attnres"&gt;一、注意力机制重构：KDA 与 AttnRes
&lt;/h2&gt;&lt;h3 id="11-kimi-delta-attention-kda"&gt;1.1 Kimi Delta Attention (KDA)
&lt;/h3&gt;&lt;p&gt;KDA 是 K3 架构的注意力基座，官方将其定位为「高效 scaling 注意力的基础」。传统 Transformer 的注意力机制在超长上下文（100 万 token）下面临双重挑战：计算量随序列长度平方增长，KV cache 内存开销线性膨胀。&lt;/p&gt;
&lt;p&gt;KDA 的设计目标是提供一种计算和内存都更高效的注意力变体，作为万亿参数规模下的基础组件。值得注意的是，KDA 在设计之初就考虑了与前缀缓存（prefix caching）的兼容性——这一点在后面的推理部署部分会再次涉及，因为 K3 团队已经将 KDA 的前缀缓存实现贡献给了 vLLM 社区。&lt;/p&gt;
&lt;p&gt;关于 KDA 的精确数学形式（如是否采用线性注意力近似、delta 规则的具体定义），官方博客未展开，需要等待技术报告。&lt;/p&gt;
&lt;h3 id="12-attention-residuals-attnres"&gt;1.2 Attention Residuals (AttnRes)
&lt;/h3&gt;&lt;p&gt;如果说 KDA 解决的是序列长度方向（&amp;ldquo;宽度&amp;rdquo;）的效率问题，那么 Attention Residuals 解决的是模型深度方向（层间）的效率问题。&lt;/p&gt;
&lt;p&gt;标准 Transformer 中，每一层的输出通过残差连接与输入相加：&lt;code&gt;x_{l+1} = x_l + f_l(x_l)&lt;/code&gt;。这种全量累加意味着信息在所有层之间无差别地传递——无论浅层学到的基础特征是否在深层仍然需要，深层都得&amp;quot;背着&amp;quot;这些信息继续往前走。&lt;/p&gt;
&lt;p&gt;AttnRes 的核心思想是&lt;strong&gt;选择性检索&lt;/strong&gt;：不是无差别地把所有历史信息累加进来，而是让深层根据当前需要，选择性地从浅层表征中检索有用的部分。这类似于一个注意力机制，但作用域不是 token 之间，而是层与层之间。&lt;/p&gt;
&lt;p&gt;打个比方：标准残差连接像是&amp;quot;每层都把所有行李背在身上&amp;quot;，越深的层负担越重；AttnRes 则是&amp;quot;需要的时候去对应的柜子里取&amp;quot;，深层只携带当前任务真正需要的信息。&lt;/p&gt;
&lt;p&gt;这种设计在深层网络中尤为重要。当模型层数随参数量增长时，信息在层间的冗余传递会带来梯度消散和表征退化问题，AttnRes 通过选择性机制缓解了这一痛点。&lt;/p&gt;
&lt;p&gt;下图是 Kimi K3 官方发布的架构总览图，展示了这六项技术如何组合在一起：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kimi K3 架构图：左侧为 Stable LatentMoE 和 KDA 模块内部结构，右上方为 AttnRes 操作 α，右侧为 Block Attention Residuals 骨干网络" class="gallery-image" data-flex-basis="263px" data-flex-grow="109" height="1823" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bevisy.github.io/p/kimi-k3-architecture-innovation/kimi-k3-architecture-diagram.png" srcset="https://bevisy.github.io/p/kimi-k3-architecture-innovation/kimi-k3-architecture-diagram_hu_2f1331a814f2b4af.png 800w, https://bevisy.github.io/p/kimi-k3-architecture-innovation/kimi-k3-architecture-diagram_hu_506efd7c51f79734.png 1600w, https://bevisy.github.io/p/kimi-k3-architecture-innovation/kimi-k3-architecture-diagram.png 2000w" width="2000"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;图源：Kimi K3 官方博客（kimi.com/blog/kimi-k3）。图中左侧两个面板分别展开了 Stable LatentMoE 和 KDA 的内部结构；右侧主干展示了 Block Attention Residuals 骨干——每一层由 KDA / Gated MLA / Stable LatentMoE 组成，层间通过 α 节点（AttnRes 操作）选择性传递信息，而非全量残差累加。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="小结"&gt;小结
&lt;/h3&gt;&lt;p&gt;KDA 和 AttnRes 构成了一组正交互补的设计：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;技术&lt;/th&gt;
					&lt;th&gt;解决的问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;序列长度（宽度）&lt;/td&gt;
					&lt;td&gt;KDA&lt;/td&gt;
					&lt;td&gt;长上下文的计算/内存效率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;模型深度（深度）&lt;/td&gt;
					&lt;td&gt;AttnRes&lt;/td&gt;
					&lt;td&gt;层间信息冗余传递&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二极致稀疏的-moestable-latentmoe"&gt;二、极致稀疏的 MoE：Stable LatentMoE
&lt;/h2&gt;&lt;p&gt;Kimi K3 的 MoE 配置是 896 个专家，每次激活 16 个，稀疏比达到 &lt;strong&gt;56:1&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这个数字有多极端？对比一下：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模型&lt;/th&gt;
					&lt;th&gt;专家总数&lt;/th&gt;
					&lt;th&gt;激活专家数&lt;/th&gt;
					&lt;th&gt;稀疏比&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DeepSeek-V3&lt;/td&gt;
					&lt;td&gt;256&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;32:1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kimi K2&lt;/td&gt;
					&lt;td&gt;384&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;48:1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Kimi K3&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;896&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;16&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;56:1&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注：DeepSeek-V3 与 Kimi K2 数据来自各自官方技术报告/模型卡，供横向参考。K3 数据来自 K3 官方博客。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;更高的稀疏比意味着在相同激活参数量下，模型拥有更大的知识容量（总参数更多），但每次推理只动用一小部分——这就是 MoE 的核心优势。然而，稀疏比越高，两个工程难题就越尖锐：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;路由稳定性&lt;/strong&gt;：896 个专家中选 16 个，路由器需要在海量选项中做出一致的决策，训练初期很容易震荡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负载均衡&lt;/strong&gt;：如果某些专家总是被选中而其他专家闲置，就造成算力浪费；更严重的是，在专家并行（Expert Parallelism）部署时，负载不均直接导致 GPU 空转。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;ldquo;Stable LatentMoE&amp;rdquo; 这个名字中的两个修饰词暗示了对应的解法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latent&lt;/strong&gt;：路由决策可能不是直接在 token embedding 空间进行，而是在隐空间（latent space）中完成，从而获得更平滑的路由信号。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable&lt;/strong&gt;：在 56:1 的稀疏度下保持训练稳定，依赖于后续几项配套技术——Quantile Balancing 和 Per-Head Muon。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K3 官方称，配合训练和数据配方的改进，这些结构变化相比 K2 带来了约 &lt;strong&gt;2.5 倍的整体 scaling 效率提升&lt;/strong&gt;。需要说明的是，官方原文的表述是&amp;quot;convert compute into intelligence more effectively&amp;quot;，即每单位算力能转化为更多的智能——换言之，达到同等能力水平所需的算力显著降低（粗略理解为&amp;quot;同等能力下算力约 ÷ 2.5&amp;quot;，或&amp;quot;同等算力下能力约 × 2.5&amp;quot;）。注意这是官方自报的宏观口径，精确的测量定义有待技术报告披露。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三专家均衡的新解法quantile-balancing"&gt;三、专家均衡的新解法：Quantile Balancing
&lt;/h2&gt;&lt;h3 id="背景痛点"&gt;背景痛点
&lt;/h3&gt;&lt;p&gt;专家负载不均衡是 MoE 训练的经典难题。主流的解决方案是引入辅助损失（auxiliary loss）：给&amp;quot;热门&amp;quot;专家施加惩罚，鼓励路由器更均匀地分配 token。这个方法有效，但有一个臭名昭著的副作用——&lt;strong&gt;balancing 超参数极度敏感&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;不同的模型规模、不同的训练阶段，最优的 loss 权重各不相同。调大了，好的专家被压制，模型能力下降；调小了均衡无效，部分专家饿死。在实践中，这个超参往往是 MoE 训练中最难调的旋钮之一。&lt;/p&gt;
&lt;h3 id="k3-的做法"&gt;K3 的做法
&lt;/h3&gt;&lt;p&gt;K3 的 Quantile Balancing 采取了完全不同的思路：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;直接从 router score 的分位数（quantile）推导专家分配，消除启发式更新和敏感的 balancing 超参数。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;传统方法看的是 router 给每个专家打的绝对分数，然后通过 loss 去调整这些分数的分布。Quantile Balancing 不看绝对分数，而是看&lt;strong&gt;相对排名&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;直觉上可以这样理解：假设 router 对 896 个专家各打了一个分数，Quantile Balancing 会把这些分数排序，然后根据分位数（如前 1.8% 的分位阈值，对应 16/896）来确定哪些专家被激活。因为分位数天然适应不同专家之间分数尺度的差异——不管某个专家的绝对分数是 0.9 还是 0.09，只要它排在前面就会被选中。&lt;/p&gt;
&lt;p&gt;这种做法的好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无需调超参&lt;/strong&gt;：不再需要一个手工设定的 balancing loss 权重&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自适应&lt;/strong&gt;：分位数天然随训练过程变化，不需要退火策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大规模友好&lt;/strong&gt;：在 896 个专家的大规模 EP（Expert Parallelism）下依然有效&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="四优化器进化per-head-muon"&gt;四、优化器进化：Per-Head Muon
&lt;/h2&gt;&lt;h3 id="先说-muon-是什么"&gt;先说 Muon 是什么
&lt;/h3&gt;&lt;p&gt;Muon 是 2024 年由 Keller Jordan 等人推动走红的优化器，核心创新是对权重矩阵的梯度做 &lt;strong&gt;Newton-Schulz 迭代正交化&lt;/strong&gt;。不过，对梯度/权重矩阵做正交化以改善优化的思想并非 Muon 首创——更早的 RightMatrix 等工作就探索过类似思路，Muon 的贡献在于将其工程化为一个通用、可大规模训练的优化器。简单来说，标准优化器（Adam、AdamW）直接用梯度更新权重，而 Muon 先把梯度投影到一个更&amp;quot;正交&amp;quot;的方向上再更新。&lt;/p&gt;
&lt;p&gt;效果是在小至中规模模型上显著加速收敛。Moonshot 自己在 K2 时期就已经采用了 Muon 优化器。&lt;/p&gt;
&lt;h3 id="per-head-的改进"&gt;Per-Head 的改进
&lt;/h3&gt;&lt;p&gt;标准 Muon 对一个权重矩阵做统一的正交化处理。但注意力层的权重矩阵实际上是由多个 head 拼接而成的，而不同 head 学到的模式差异很大：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有的 head 关注局部依赖（邻近 token 的句法关系）&lt;/li&gt;
&lt;li&gt;有的 head 关注长程依赖（段落级的语义关联）&lt;/li&gt;
&lt;li&gt;有的 head 负责位置信息编码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果对这些 head 统一施加相同的正交化处理，可能对某些 head 过于激进，对另一些又不够。&lt;strong&gt;Per-Head Muon 的改进是对每个 attention head 独立执行优化&lt;/strong&gt;，让每个 head 获得最适合自己的更新策略。&lt;/p&gt;
&lt;p&gt;在 3T 规模下，这个改进的意义不仅是收敛速度。大模型训练一次的成本极高（以百万美元计），优化器效率的每一点提升，都意味着用更少的算力和时间达到同样的效果。K3 官方将 Per-Head Muon 列为前述 2.5 倍 scaling 效率提升的关键因素之一。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五激活与注意力控制situ-与-gated-mla"&gt;五、激活与注意力控制：SiTU 与 Gated MLA
&lt;/h2&gt;&lt;h3 id="51-situ-sigmoid-tanh-unit"&gt;5.1 SiTU (Sigmoid Tanh Unit)
&lt;/h3&gt;&lt;p&gt;SiTU 是 K3 采用的新型激活函数，结合了 sigmoid 和 tanh 的特性。它的定位是替代 GELU、SwiGLU 等主流激活函数，改善激活值的分布控制。&lt;/p&gt;
&lt;p&gt;在万亿参数规模下，激活函数的选择看似微小，实则影响巨大。不良的激活值分布会导致梯度传播不稳定，尤其在深层网络中。SiTU 的具体数学形式有待技术报告披露，但其设计目标是明确的：在极端规模下提供更受控的激活行为。&lt;/p&gt;
&lt;h3 id="52-gated-mla"&gt;5.2 Gated MLA
&lt;/h3&gt;&lt;p&gt;MLA（Multi-head Latent Attention）是 DeepSeek 提出的注意力变体，核心是将 KV cache 压缩到隐空间中——用一个低秩的隐向量来表示原本需要大量内存的 Key 和 Value，在推理时再解压还原。&lt;/p&gt;
&lt;p&gt;Gated MLA 在此基础上引入了门控（gate）机制。门控的作用是让模型学会&amp;quot;什么时候该注意、什么时候该忽略&amp;quot;，提升注意力的选择性。这在 100 万 token 的上下文中尤为重要：面对海量输入，模型需要高效地忽略无关信息，而非对所有内容分配等量的注意力资源。&lt;/p&gt;
&lt;p&gt;MLA 的 KV 压缩 + 门控的选择性 = 推理时显著更省显存，这对于部署成本至关重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六训练与部署工程"&gt;六、训练与部署工程
&lt;/h2&gt;&lt;h3 id="61-量化感知训练qat"&gt;6.1 量化感知训练（QAT）
&lt;/h3&gt;&lt;p&gt;K3 从 SFT 阶段起就引入了量化感知训练：&lt;strong&gt;MXFP4 权重 + MXFP8 激活&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这里需要区分两种量化策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;训练后量化（PTQ）&lt;/strong&gt;：模型训练完成后，再把权重/激活压到低精度。简单但可能掉精度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化感知训练（QAT）&lt;/strong&gt;：在训练过程中就让模型&amp;quot;感受&amp;quot;到量化带来的噪声，模型参数在训练时就适应了低精度表示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K3 选择 QAT 的好处是推理时直接使用 MXFP4/MXFP8，无需额外转换步骤，同时保持了模型质量。MXFP4（Microscaling FP4）是 OCP 制定的新兴低精度格式，相比传统 INT4 有更好的数值动态范围，硬件兼容性也在快速扩展。&lt;/p&gt;
&lt;h3 id="62-全平衡专家并行"&gt;6.2 全平衡专家并行
&lt;/h3&gt;&lt;p&gt;在大规模 EP（Expert Parallelism）部署下，896 个专家分布在多张 GPU 上。如果某些 GPU 上的专家总是被频繁调用而另一些空闲，就会造成整体吞吐瓶颈。&lt;/p&gt;
&lt;p&gt;K3 的方案是&lt;strong&gt;全平衡的专家并行训练&lt;/strong&gt;，两个关键设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态 shape&lt;/strong&gt;：所有计算图的形状在编译时就确定，避免运行时动态分配带来的开销&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键路径无 host 同步&lt;/strong&gt;：传统方案中，负载均衡调度通常需要在 CPU（host）端进行决策，然后同步给 GPU，这个 host↔GPU 同步是性能杀手。K3 把均衡逻辑完全做到 GPU 侧，消除了同步等待&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-推理部署supernode--mooncake--vllm"&gt;6.3 推理部署：supernode + Mooncake + vLLM
&lt;/h3&gt;&lt;p&gt;K3 的推理部署方案是一个完整的系统工程：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬件层面&lt;/strong&gt;——推荐 supernode 配置，即 64 张以上加速器组成的高带宽通信域。大规模 MoE 推理对 all-to-all 通信带宽极度敏感，supernode 架构通过 NVLink/高速互联将通信延迟降到最低。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缓存层面&lt;/strong&gt;——KDA 的前缀缓存实现已贡献给 vLLM 社区。前缀缓存是降低推理成本的利器：对于编码场景，大量请求共享相同的系统提示和代码上下文，缓存这些前缀可以避免重复计算。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构层面&lt;/strong&gt;——基于 Mooncake 的分离式推理架构（disaggregated inference），将 prefill（首 token 计算）和 decode（续写）分配到不同的计算资源上，各自独立扩缩容。&lt;/p&gt;
&lt;p&gt;实战效果：在编码工作负载中，官方 API 的缓存命中率超过 &lt;strong&gt;90%&lt;/strong&gt;。这直接反映在定价上：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;计费类型&lt;/th&gt;
					&lt;th&gt;价格&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存命中输入&lt;/td&gt;
					&lt;td&gt;$0.30 / MTok&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存未命中输入&lt;/td&gt;
					&lt;td&gt;$3.00 / MTok&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;输出&lt;/td&gt;
					&lt;td&gt;$15.00 / MTok&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;缓存命中的输入价格仅为未命中的十分之一。对于高频编码场景（如 IDE 插件、代码 agent），绝大部分输入都会命中缓存，实际使用成本可以压到非常低。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="结语k3-架构给行业带来了什么信号"&gt;结语：K3 架构给行业带来了什么信号
&lt;/h2&gt;&lt;p&gt;回顾 Kimi K3 的 6 项架构创新，可以提炼出三个值得行业关注的趋势：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;信号一：万亿级 MoE 的训练稳定性问题，正在被系统性地解决。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;过去，把 MoE 推到万亿规模最大的障碍不是算力，而是训练过程中各种不稳定——路由震荡、专家失衡、梯度异常。K3 的做法是针对每个环节给出专门的解法：KDA/AttnRes 稳住信息流，Quantile Balancing 稳住路由，Per-Head Muon 稳住优化，QAT 稳住精度。这不是某一项技术的一招鲜，而是一套系统工程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;信号二：优化器和路由均衡这两个方向正在快速成熟。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Muon 系列优化器从 2024 年提出到 2026 年被用于 3T 级模型，只用了不到两年。Quantile Balancing 则直接替代了 MoE 训练中最让人头疼的 balancing 超参。这两个方向的成熟速度意味着，它们很可能成为下一代大模型训练的标配。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;信号三：开源模型正在以「架构效率」缩小与闭源的差距。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;K3 的总参数是 2.8T，但激活参数量远小于此。真正的竞争力不来自参数总量，而来自每一单位算力能转化为多少智能——K3 称相比 K2 提升了约 2.5 倍（前文已说明口径）。当开源模型在架构效率上逼近甚至局部超越闭源模型时，开源与闭源的差距将以新的方式被重新定义。&lt;/p&gt;
&lt;p&gt;最后提醒：本文的分析基于官方博客的公开信息。K3 的完整技术报告将随模型权重一同发布，届时我们会对架构细节做更精确的验证和补充。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文基于 Kimi K3 官方技术博客（https://www.kimi.com/blog/kimi-k3）撰写。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Kata Containers 安全容器GPU支持实践</title><link>https://bevisy.github.io/p/kata-containers-gpu-support/</link><pubDate>Tue, 21 Jun 2022 23:14:52 +0800</pubDate><guid>https://bevisy.github.io/p/kata-containers-gpu-support/</guid><description>&lt;h1 id="kata-containers-安全容器-gpu-支持实践"&gt;kata-containers 安全容器 GPU 支持实践
&lt;/h1&gt;&lt;p&gt;本文着重讲述如何在 kata-containers 安全容器中支持 GPU 设备，对安全容器本身的介绍会比较少，如果感兴趣的话，可以参考 &lt;a class="link" href="https://katacontainers.io/" target="_blank" rel="noopener"
 &gt;kata-containers 官网&lt;/a&gt;。接下来，就是讲述如何一步步在安全容器中支持 GPU 设备，以&lt;code&gt;Tesla P100 PCIe 16GB&lt;/code&gt;为例。&lt;/p&gt;
&lt;h2 id="准备阶段"&gt;准备阶段
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;下载官方 release 包&lt;/li&gt;
&lt;li&gt;下载官方代码，编译需要使用到的组件&lt;code&gt;containerd-shim-kata-v2&lt;/code&gt;，&lt;code&gt;kata-agent&lt;/code&gt;，虚拟机镜像 &lt;code&gt;kata-containers.img&lt;/code&gt;或者&lt;code&gt;kata-containers-initrd.img&lt;/code&gt;,虚拟机内核 &lt;code&gt;vmlinuz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GPU 支持实践&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="准备-release-包"&gt;准备 release 包
&lt;/h3&gt;&lt;p&gt;可以从官方的 &lt;a class="link" href="https://github.com/kata-containers/kata-containers/releases" target="_blank" rel="noopener"
 &gt;release 页面&lt;/a&gt;获取最新的包，此处使用当前最新版本&lt;code&gt;2.4.2&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/kata-containers/kata-containers/releases/download/2.4.2/kata-static-2.4.2-x86_64.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压并置于 /opt 目录下&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar xf kata-static-2.4.2-x86_64.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv opt/kata /opt/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="编译必要组件"&gt;编译必要组件
&lt;/h3&gt;&lt;p&gt;拉取 &lt;a class="link" href="https://github.com/kata-containers/kata-containers.git" target="_blank" rel="noopener"
 &gt;kata-containers 源码&lt;/a&gt;
&lt;strong&gt;注意&lt;/strong&gt;：源码需要包含此&lt;a class="link" href="https://github.com/kata-containers/kata-containers/pull/4358" target="_blank" rel="noopener"
 &gt;PR&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/kata-containers/kata-containers.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/kata-containers/tests.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果当前用户不是 root 用户，则需要将 tests 仓库切换到 root 用户，否则后续编译镜像需要安装 libseccomp 会失败&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R root:root tests
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="编译containerd-shim-kata-v2"&gt;编译&lt;code&gt;containerd-shim-kata-v2&lt;/code&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编译 containerd-shim-v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -C &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/src/runtime containerd-shim-v2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="编译内核"&gt;编译内核
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 准备依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 bc &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 bison &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 build-essential &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 flex &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 iptables &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 libelf-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 patch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 切换目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/packaging/kernel/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载内核源码；准备 config 文件；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build-kernel.sh -v 5.15.23 -g nvidia -f setup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编译 kernel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build-kernel.sh -v 5.15.23 -g nvidia build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 kernel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -E ./build-kernel.sh -v 5.15.23 -g nvidia install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装目录 /usr/share/kata-containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vmlinuz-5.15.23-92-nvidia-gpu &lt;span class="c1"&gt;# 所需内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 或者&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vmlinux-5.15.23-92-nvidia-gpu &lt;span class="c1"&gt;# 所需内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 制作 linux-header deb 或者 rpm 包，由于接下来将使用 ubuntu 作为基础镜像，所以此处使用 deb 包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; kata-linux-5.15.23-92
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make deb-pkg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 生成 deb 包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux-headers-5.15.23-nvidia-gpu_5.15.23-nvidia-gpu-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux-image-5.15.23-nvidia-gpu_5.15.23-nvidia-gpu-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux-libc-dev_5.15.23-nvidia-gpu-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="编译虚拟机镜像"&gt;编译虚拟机镜像
&lt;/h4&gt;&lt;p&gt;虚拟机镜像分为两种 &lt;code&gt;initrd&lt;/code&gt; 和 &lt;code&gt;image&lt;/code&gt;，此处以 &lt;code&gt;image&lt;/code&gt; 为例。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rootfs 构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/osbuilder/rootfs-builder/rootfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/osbuilder/rootfs-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确保 kata-containers/tests 仓库在 $GOPATH 目录下，且属主是 root 用户，否则安装 libseccomp 会失败&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E EXTRA_PKGS=&amp;#34;gcc make curl gnupg coreutils apt tar kmod pkg-config libc-dev libc6-dev pciutils&amp;#34; GOPATH=$GOPATH USE_DOCKER=true ./rootfs.sh ubuntu&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载 GPU 驱动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 根据官网 https://www.nvidia.com/Download/Find.aspx 选择所需 GPU 驱动；以 P100 显卡最新驱动 NVIDIA-Linux-x86_64-515.48.07.run 为例，将下载好的驱动放到目录 ${ROOTFS_DIR}/root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 同时将编译内核生成的 deb 包防放到目录 ${ROOTFS_DIR}/root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编译 GPU 驱动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 注意：确保本机有 GPU 设备，否则编译会失败；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t sysfs -o ro none &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t proc -o ro none &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/proc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o bind,ro /dev &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t devpts none &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/dev/pts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t tmpfs none &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chroot &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/bin:/usr/local/sbin:/usr/sbin:/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ubuntu dpkg 命令目前处于不可用状态，需要创建一些目录如下：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /var/lib/dpkg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch /var/lib/dpkg/status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /var/lib/dpkg/updates/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /var/lib/dpkg/info/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch /var/lib/dpkg/info/format-new
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /var/cache/apt/archives/partial
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /var/log/apt/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /var/lib/dpkg/alternatives
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装之前准备的内核 deb 包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dpkg -i *.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压 NVIDIA 驱动包，并编译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x NVIDIA-Linux-x86_64-515.48.07.run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./NVIDIA-Linux-x86_64-515.48.07.run -x
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; NVIDIA-Linux-x86_64-515.48.07
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./nvidia-installer -k 5.15.23-nvidia-gpu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 编译完成后可清理 root 目录，减少镜像体积&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 nvidia-container-toolkit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ID$VERSION_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /usr/share/yrings/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/ssl/certs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install ca-certificates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey &lt;span class="p"&gt;|&lt;/span&gt; gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -L https://nvidia.github.io/libnvidia-container/&lt;span class="nv"&gt;$distribution&lt;/span&gt;/libnvidia-container.list &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install nvidia-container-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt clean all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 准备 hook 文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /usr/share/oci/hooks/prestart/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch /usr/share/oci/hooks/prestart/nvidia-container-toolkit.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /usr/share/oci/hooks/prestart/nvidia-container-toolkit.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /usr/share/oci/hooks/prestart/nvidia-container-toolkit.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt; /usr/share/oci/hooks/prestart/nvidia-container-toolkit.sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/bash -x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;/usr/bin/nvidia-container-toolkit -debug \$@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 退出，并清理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/proc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/dev/pts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/tmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 构建 image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## rootfs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/osbuilder/rootfs-builder/rootfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/osbuilder/image-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E USE_DOCKER=true ./image_builder.sh ${ROOTFS_DIR}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 得到 kata-containers.img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## initrd 可按照如下方式：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/tools/osbuilder/initrd-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E AGENT_INIT=yes USE_DOCKER=true ./initrd_builder.sh ${ROOTFS_DIR}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;至此，全部文件准备完毕。&lt;/p&gt;
&lt;h3 id="配置-kata-containers-和-containerd-以使用-gpu"&gt;配置 kata-containers 和 containerd 以使用 GPU
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 containerd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 配置文件 /etc/containerd/config.toml，新增&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.runtimes.kata&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.kata.v2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# privileged_without_host_devices = true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 将 containerd-shim-kata-v2 移至可执行目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/kata-containers/src/runtime/containerd-shim-kata-v2 /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 将 kata-containers.img 移至 /usr/share/kata-containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 将 vmlinuz-5.15.23-92-nvidia-gpu 移至 /usr/share/kata-containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 配置 kata-containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/kata-containers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /opt/kata/share/defaults/kata-containers/configuration.toml /etc/kata-containers/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 修改配置文件 configuration.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kernel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/share/kata-containers/vmlinuz-5.10.25-85-nvidia-gpu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/share/kata-containers/kata-containers.img&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_iommu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;hotplug_vfio_on_root_bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;pcie_root_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证 GPU&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看 GPU vfio id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo lspci -nn -D &lt;span class="p"&gt;|&lt;/span&gt; grep -i nvidia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000:d0:00.0 3D controller &lt;span class="o"&gt;[&lt;/span&gt;0302&lt;span class="o"&gt;]&lt;/span&gt;: NVIDIA Corporation Device &lt;span class="o"&gt;[&lt;/span&gt;10de:20b9&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;rev a1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;BDF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0000:d0:00.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ readlink -e /sys/bus/pci/devices/&lt;span class="nv"&gt;$BDF&lt;/span&gt;/iommu_group
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;79&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动容器验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ctr -n k8s.io run --rm --runtime &lt;span class="s2"&gt;&amp;#34;io.containerd.kata.v2&amp;#34;&lt;/span&gt; --device /dev/vfio/79 --rm -t &lt;span class="s2"&gt;&amp;#34;docker.io/nvidia/cuda:11.6.0-base-ubuntu20.04&amp;#34;&lt;/span&gt; cuda bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tue Jun &lt;span class="m"&gt;21&lt;/span&gt; 10:18:31 &lt;span class="m"&gt;2022&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; NVIDIA-SMI 515.48.07 Driver Version: 515.48.07 CUDA Version: 11.7 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU Name Persistence-M&lt;span class="p"&gt;|&lt;/span&gt; Bus-Id Disp.A &lt;span class="p"&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Fan Temp Perf Pwr:Usage/Cap&lt;span class="p"&gt;|&lt;/span&gt; Memory-Usage &lt;span class="p"&gt;|&lt;/span&gt; GPU-Util Compute M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; MIG M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;===============================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; Tesla P100-PCIE... Off &lt;span class="p"&gt;|&lt;/span&gt; 00000000:02:00.0 Off &lt;span class="p"&gt;|&lt;/span&gt; Off &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; N/A 41C P0 30W / 250W &lt;span class="p"&gt;|&lt;/span&gt; 0MiB / 16384MiB &lt;span class="p"&gt;|&lt;/span&gt; 3% Default &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Processes: &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU GI CI PID Type Process name GPU Memory &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ID ID Usage &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=============================================================================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; No running processes found &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;至此，我们就可以在安全容器中使用 GPU 设备。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kata-containers/kata-containers/blob/main/docs/use-cases/NVIDIA-GPU-passthrough-and-Kata.md" target="_blank" rel="noopener"
 &gt;NVIDIA-GPU-passthrough-and-Kata&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Close Swap on Ubuntu20.04</title><link>https://bevisy.github.io/p/close-swap-on-ubuntu-20-04/</link><pubDate>Tue, 25 May 2021 13:55:24 +0800</pubDate><guid>https://bevisy.github.io/p/close-swap-on-ubuntu-20-04/</guid><description>&lt;h2 id="临时关闭"&gt;临时关闭
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dphys-swapfile swapoff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="永久关闭"&gt;永久关闭
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable dphys-swapfile.service --now
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注释fstab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#/dev/mapper/vgubuntu-swap_1 none swap sw 0 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>linux 利用loop设备模拟块设备</title><link>https://bevisy.github.io/p/linux-loop-device-block-simulation/</link><pubDate>Fri, 02 Apr 2021 16:37:51 +0800</pubDate><guid>https://bevisy.github.io/p/linux-loop-device-block-simulation/</guid><description>&lt;h1 id="linux-利用loop设备模拟块设备"&gt;linux 利用loop设备模拟块设备
&lt;/h1&gt;&lt;h2 id="创建虚拟设备"&gt;创建虚拟设备
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;losetup --help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -a 显示所有已经使用的回环设备状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d 卸除回环设备
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -f 寻找第一个未使用的回环设备
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &amp;lt;加密选项&amp;gt; 启动加密编码
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查找第一个未使用的回环设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;losetup -f
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./disk.img &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4M &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将disk.img 虚拟成一个回环设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;losetup -f disk.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查询此设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;losetup -a &lt;span class="p"&gt;|&lt;/span&gt; grep disk.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/loop25: &lt;span class="o"&gt;[&lt;/span&gt;64768&lt;span class="o"&gt;]&lt;/span&gt;:3296700 &lt;span class="o"&gt;(&lt;/span&gt;/home/zbb/temp/disk/disk.img&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 格式化设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.ext4 /dev/loop25
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 挂载块设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount /dev/loop25 &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="c1"&gt;# test 为自定义目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 卸载设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;losetup -d /dev/loop25
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Install Kubernetes1.20.1 and Containerd1.4.3 on Ubuntu with ZFS</title><link>https://bevisy.github.io/p/install-kubernetes-1-20-1-and-containerd-1-4-3-on-ubuntu-with-zfs/</link><pubDate>Mon, 11 Jan 2021 13:56:02 +0800</pubDate><guid>https://bevisy.github.io/p/install-kubernetes-1-20-1-and-containerd-1-4-3-on-ubuntu-with-zfs/</guid><description>&lt;h1 id="基于zfs的ubuntu2004安装kubernetes120"&gt;基于ZFS的Ubuntu20.04安装kubernetes1.20
&lt;/h1&gt;&lt;h2 id="containerd-安装"&gt;containerd 安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;containerd containerd.io 1.4.3 269548fa27e0089a8b8278fc4fc781d7f65a939b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装"&gt;安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装必要组件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-transport-https &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gnupg-agent &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装gpg key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证gpg key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-key fingerprint 0EBFCD88
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加 repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装containerd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install containerd.io
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/" target="_blank" rel="noopener"
 &gt;安装参考&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="配置修改适配-zfs"&gt;配置修改适配 zfs
&lt;/h3&gt;&lt;p&gt;查看 zfs 插件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ctr plugins ls &lt;span class="p"&gt;|&lt;/span&gt; grep zfs 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;io.containerd.snapshotter.v1 zfs linux/amd64 ok
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;准备config.toml&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo chmod &lt;span class="m"&gt;646&lt;/span&gt; /etc/containerd/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo containerd config default &amp;gt; /etc/containerd/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改&lt;code&gt;snapshotter&lt;/code&gt;为&lt;code&gt;zfs&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#snapshotter = &amp;#34;overlayfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;snapshotter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启&lt;code&gt;containerd&lt;/code&gt;，&lt;code&gt;containerd&lt;/code&gt;不支持配置热加载&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart containerd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="挂载-zfs-到containerd指定目录"&gt;挂载 zfs 到containerd指定目录
&lt;/h3&gt;&lt;h4 id="查询-pool"&gt;查询 pool
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo zpool list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpool 460G 8.64G 451G - - 0% 1% 1.00x ONLINE -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="挂载目录"&gt;挂载目录
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo zfs create -o &lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/containerd/io.containerd.snapshotter.v1.zfs rpool/containerd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="查看挂载的目录"&gt;查看挂载的目录
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo zfs list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME USED AVAIL REFER MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpool/containerd 96K 437G 96K /var/lib/containerd/io.containerd.snapshotter.v1.zfs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="验证"&gt;验证
&lt;/h3&gt;&lt;h4 id="拉取镜像"&gt;拉取镜像
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ctr i pull --snapshotter&lt;span class="o"&gt;=&lt;/span&gt;zfs docker.io/library/nginx:1.17
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="启动容器"&gt;启动容器
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ctr run --rm --net-host -d --snapshotter&lt;span class="o"&gt;=&lt;/span&gt;zfs docker.io/library/nginx:1.17 &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="查看nginx启动结果"&gt;查看nginx启动结果
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ctr t ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TASK PID STATUS 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="m"&gt;1494537&lt;/span&gt; RUNNING
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ netstat -alptn &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 0.0.0.0:80 0.0.0.0:* LISTEN -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl http://127.0.0.1:80 &lt;span class="c1"&gt;# 正常可访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Thank you &lt;span class="k"&gt;for&lt;/span&gt; using nginx.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="待解决的问题"&gt;待解决的问题
&lt;/h3&gt;&lt;h4 id="问题-1"&gt;问题 1
&lt;/h4&gt;&lt;p&gt;非root账户，sudo权限不指定参数&lt;code&gt;snapshotter&lt;/code&gt;创建container，提示&lt;code&gt;ctr: failed to mount /tmp/containerd-mount589724034: invalid argument&lt;/code&gt;，无法创建容器。&lt;/p&gt;
&lt;p&gt;切换成root用户，依旧提示，但是容器可以正常创建&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;$ ctr run --rm --net-host -d docker.io/library/nginx:1.17 &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ctr: failed to mount /tmp/containerd-mount589724034: invalid argument
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;$ ctr t ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TASK PID STATUS 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="m"&gt;1494537&lt;/span&gt; RUNNING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kubernetes-安装"&gt;kubernetes 安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.20.1&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;c4d752765b3bbac2237bf87cf0b1c2e307844666&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-12-18T12:09:25Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.5&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.20.1&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;c4d752765b3bbac2237bf87cf0b1c2e307844666&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-12-18T12:00:47Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.5&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装-1"&gt;安装
&lt;/h2&gt;&lt;p&gt;当前安装工具有很多，此处选择使用&lt;code&gt;kubeadm&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="准备kubernetes-源使用阿里镜像源并安装必要组件"&gt;准备kubernetes 源(使用阿里镜像源)，并安装必要组件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install apt-transport-https
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add - 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt;/etc/apt/sources.list.d/kubernetes.list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install kubelet kubeadm kubectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后 kubelet 服务会处于不断重启状态，暂时不需要关注，kubelet等待连接kube-apiserver，预期现象。&lt;/p&gt;
&lt;h2 id="启动kubernetes集群"&gt;启动kubernetes集群
&lt;/h2&gt;&lt;h4 id="准备容器镜像"&gt;准备容器镜像
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubeadm config images list &lt;span class="c1"&gt;# 查看需要准备的镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/coredns:1.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/etcd:3.4.13-0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/kube-apiserver:v1.20.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/kube-controller-manager:v1.20.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/kube-proxy:v1.20.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/kube-scheduler:v1.20.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s.gcr.io/pause:3.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="containerd-镜像加速"&gt;containerd 镜像加速
&lt;/h4&gt;&lt;p&gt;配置参考：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry.mirrors&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry.mirrors.&lt;span class="s2"&gt;&amp;#34;docker.io&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#endpoint = [&amp;#34;https://registry-1.docker.io&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://as065r9f.mirror.aliyuncs.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="启动集群"&gt;启动集群
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo kubeadm init --pod-network-cidr&lt;span class="o"&gt;=&lt;/span&gt;10.10.0.0/16 --service-cidr&lt;span class="o"&gt;=&lt;/span&gt;10.20.0.0/16 --kubernetes-version&lt;span class="o"&gt;=&lt;/span&gt;v1.20.1 --apiserver-advertise-address 192.168.126.246 --cri-socket /run/containerd/containerd.sock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&amp;ndash;kubernetes-version: 指定 kubernetes 版本；&lt;/li&gt;
&lt;li&gt;&amp;ndash;apiserver-advertise-address：指定 kube-apiserver 监听的ip地址；&lt;/li&gt;
&lt;li&gt;&amp;ndash;pod-network-cidr：指定 Pod 的网络范围；&lt;/li&gt;
&lt;li&gt;&amp;ndash;service-cidr：指定 Service 的网络范围；&lt;/li&gt;
&lt;li&gt;&amp;ndash;cri-socket：指定cri(社区趋势：cri 采用 containerd)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="验证安装结果"&gt;验证安装结果
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 根据提示拷贝kubeconfig文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.20.1&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;c4d752765b3bbac2237bf87cf0b1c2e307844666&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-12-18T12:09:25Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.5&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.20.1&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;c4d752765b3bbac2237bf87cf0b1c2e307844666&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-12-18T12:00:47Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.5&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="flannel-安装"&gt;Flannel 安装
&lt;/h2&gt;&lt;p&gt;kubernetes v1.17+ 版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要修改配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net-conf.json: &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Network&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;10.10.0.0/16&amp;#34;&lt;/span&gt;, &lt;span class="c1"&gt;# kubeadm init 创建时使用的pod-network-cidr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Backend&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;vxlan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/coreos/flannel#flannel" target="_blank" rel="noopener"
 &gt;参考连接&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="待解决问题"&gt;待解决问题
&lt;/h2&gt;&lt;p&gt;containerd 一直会刷新 error 日志&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Jan 11 17:49:51 zbb-sonypc containerd[1566292]: time=&amp;quot;2021-01-11T17:49:51.380076683+08:00&amp;quot; level=error msg=&amp;quot;Failed to get usage for snapshot \&amp;quot;sha256:ffc9b21953f4cd7956cdf532a5db04ff0a2daa7475ad796f1bad58cfbaf77a07\&amp;quot;&amp;quot; error=&amp;quot;zfs does not implement Usage() yet&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/containerd/zfs/issues/17" target="_blank" rel="noopener"
 &gt;参考issue&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="规避办法"&gt;规避办法
&lt;/h3&gt;&lt;p&gt;暂时通过修改代码规避&lt;br&gt;
&lt;a class="link" href="https://github.com/Bevisy/zfs/commit/0db61529365ce48372895b240b67308a79482c2c" target="_blank" rel="noopener"
 &gt;bevisy/zfs&lt;/a&gt;
&lt;a class="link" href="https://github.com/Bevisy/containerd/commit/c4b21851684312f4b341bede5947454b3a997bd6" target="_blank" rel="noopener"
 &gt;bevisy/containerd&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Burn the Operating System Installation Disk on Mac</title><link>https://bevisy.github.io/p/burn-the-operating-system-installation-disk-on-mac/</link><pubDate>Wed, 06 Jan 2021 19:22:16 +0800</pubDate><guid>https://bevisy.github.io/p/burn-the-operating-system-installation-disk-on-mac/</guid><description>&lt;img src="https://bevisy.github.io/p/burn-the-operating-system-installation-disk-on-mac/macbook-wallpaper.jpg" alt="Featured image of post Burn the Operating System Installation Disk on Mac" /&gt;&lt;h1 id="在-macbook-上烧录-iso-镜像制作操作系统盘"&gt;在 Macbook 上烧录 iso 镜像，制作操作系统盘
&lt;/h1&gt;&lt;h2 id="查看烧录-u-盘"&gt;查看烧录 U 盘
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diskutil list &lt;span class="c1"&gt;# 例如：/dev/disk3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="取消挂载-u-盘"&gt;取消挂载 U 盘
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diskutil unmountDisk /dev/disk3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="烧录"&gt;烧录
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以 ubuntu-20.04.iso 为例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/Downloads/ubuntu-20.04.iso &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/disk3 &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1m &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sync &lt;span class="c1"&gt;# sync 作用: 使缓存落盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="查看-dd-烧录进度"&gt;查看 dd 烧录进度
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看 dd 进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps -ef &lt;span class="p"&gt;|&lt;/span&gt; grep -i dd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;188&lt;/span&gt; &lt;span class="m"&gt;185&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 2:33PM ttys000 0:12.33 dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/Users/xx/Downloads/ubuntu-20.04.5-desktop-amd64.iso &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/disk2 &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看烧录进度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="nb"&gt;kill&lt;/span&gt; -SIGINFO &lt;span class="m"&gt;188&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="弹出-u-盘"&gt;弹出 U 盘
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diskutil eject /dev/disk3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Install TigerVncServer On Ubuntu 20.04</title><link>https://bevisy.github.io/p/install-tigervnc-server-on-ubuntu-20-04/</link><pubDate>Fri, 31 Jul 2020 11:47:14 +0800</pubDate><guid>https://bevisy.github.io/p/install-tigervnc-server-on-ubuntu-20-04/</guid><description>&lt;h1 id="ubuntu-2004-安装-tigervncserver"&gt;Ubuntu 20.04 安装 Tigervncserver
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install xfce4 xfce4-goodies tigervnc-standalone-server &lt;span class="c1"&gt;# 推荐使用 xfce4 桌面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vncpasswd &lt;span class="c1"&gt;# 配置 vnc 客户端连接密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vncserver
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vncserver -kill :1 &lt;span class="c1"&gt;# 关闭创建的 vnc server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 修改配置，解决黑屏和灰屏问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.vnc/xstartup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod u+x &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.vnc/xstartup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &amp;gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.vnc/xstartup &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;unset SESSION_MANAGER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;unset DBUS_SESSION_BUS_ADDRESS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[ -r $HOME/.Xresources ] &amp;amp;&amp;amp; xrdb $HOME/.Xresources
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xsetroot -solid grey
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xterm -geometry 80x24+10+10 -ls -title &amp;#34;$VNCDESKTOP Desktop&amp;#34; &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;startxfce4 &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 再次启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vncserver :1 --geomotry 1366x768 &lt;span class="c1"&gt;# --geometry 参数随意&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用 vnc viewer 连接，端口号为 5091&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="使用-lxde-桌面"&gt;使用 lxde 桌面
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install xorg lxde-core lxterminal
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 vncserver 启动桌面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &amp;gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.vnc/xstartup &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; #!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; lxterminal &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /usr/bin/lxsession -s LXDE &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Install Wechat Client On Ubuntu 20.04</title><link>https://bevisy.github.io/p/install-wechat-client-on-ubuntu-20-04/</link><pubDate>Wed, 29 Jul 2020 11:16:31 +0800</pubDate><guid>https://bevisy.github.io/p/install-wechat-client-on-ubuntu-20-04/</guid><description>&lt;h1 id="ubuntu-2004-安装微信客户端"&gt;Ubuntu 20.04 安装微信客户端
&lt;/h1&gt;&lt;h2 id="clone-repo"&gt;clone repo
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/bevisy/deepin-wine-ubuntu" target="_blank" rel="noopener"
 &gt;deepin-wine-ubuntu &lt;/a&gt;&lt;/p&gt;
&lt;h2 id="执行脚本"&gt;执行脚本
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sudo chmod a+x install_2.8.22.sh &amp;amp;&amp;amp; ./install_2.8.22.sh&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="下载微信deb包并安装"&gt;下载微信deb包，并安装
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://packages.deepin.com/deepin/pool/non-free/d/deepin.com.wechat/deepin.com.wechat_2.6.8.65deepin0_i386.deb" target="_blank" rel="noopener"
 &gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="安装微信"&gt;安装微信：
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sudo dpkg –i deepin.com.wechat_2.6.8.65deepin0_i386.deb&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="安装字体参考issuehttpsgithubcomwszqkzqkdeepin-wine-ubuntuissues253"&gt;安装字体：(参考issue：https://github.com/wszqkzqk/deepin-wine-ubuntu/issues/253)
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sudo apt install fonts-wqy-microhei fonts-wqy-zenhei&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Ubuntu 20.04 显示器分辨率模式调整</title><link>https://bevisy.github.io/p/ubuntu-20-04-display-resolution/</link><pubDate>Mon, 27 Jul 2020 10:24:29 +0800</pubDate><guid>https://bevisy.github.io/p/ubuntu-20-04-display-resolution/</guid><description>&lt;h1 id="ubuntu-2004-显示器分辨率模式调整"&gt;Ubuntu 20.04 显示器分辨率模式调整
&lt;/h1&gt;&lt;h2 id="问题描述"&gt;问题描述
&lt;/h2&gt;&lt;p&gt;Ubuntu 20.04 提示无法识别显示器，默认以分辨率1024x768(4:3)展示&lt;/p&gt;
&lt;h2 id="问题解决"&gt;问题解决
&lt;/h2&gt;&lt;p&gt;添加新的分辨率模式&lt;/p&gt;
&lt;h3 id="查询输出接口"&gt;查询输出接口
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xrandr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Screen 0: minimum &lt;span class="m"&gt;320&lt;/span&gt; x 200, current &lt;span class="m"&gt;2624&lt;/span&gt; x 900, maximum &lt;span class="m"&gt;16384&lt;/span&gt; x &lt;span class="m"&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eDP-1 connected primary 1600x900+0+0 &lt;span class="o"&gt;(&lt;/span&gt;normal left inverted right x axis y axis&lt;span class="o"&gt;)&lt;/span&gt; 309mm x 174mm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1600x900 60.01*+ 59.99 59.94 59.95 59.82 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1440x900 59.89 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 360x202 59.51 59.13 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 320x180 59.84 59.32 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DP-1 disconnected &lt;span class="o"&gt;(&lt;/span&gt;normal left inverted right x axis y axis&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HDMI-1 disconnected &lt;span class="o"&gt;(&lt;/span&gt;normal left inverted right x axis y axis&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DP-2 connected 1024x768+1600+0 &lt;span class="o"&gt;(&lt;/span&gt;normal left inverted right x axis y axis&lt;span class="o"&gt;)&lt;/span&gt; 0mm x 0mm &lt;span class="c1"&gt;# 注意此行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1024x768 60.00* 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 800x600 60.32 56.25 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 848x480 60.00 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 640x480 59.94 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HDMI-2 disconnected &lt;span class="o"&gt;(&lt;/span&gt;normal left inverted right x axis y axis&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;外界显示器输出接口为 DP-2&lt;/p&gt;
&lt;h3 id="生成分辨率模式并添加"&gt;生成分辨率模式并添加
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cvt &lt;span class="m"&gt;1920&lt;/span&gt; &lt;span class="m"&gt;1080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modeline &lt;span class="s2"&gt;&amp;#34;1920x1080_60.00&amp;#34;&lt;/span&gt; 173.00 &lt;span class="m"&gt;1920&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt; &lt;span class="m"&gt;2248&lt;/span&gt; &lt;span class="m"&gt;2576&lt;/span&gt; &lt;span class="m"&gt;1080&lt;/span&gt; &lt;span class="m"&gt;1083&lt;/span&gt; &lt;span class="m"&gt;1088&lt;/span&gt; &lt;span class="m"&gt;1120&lt;/span&gt; -hsync +vsync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新建分辨率模式(可以不执行)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo xrandr --newmode &lt;span class="s2"&gt;&amp;#34;1920x1080_60.00&amp;#34;&lt;/span&gt; 173.00 &lt;span class="m"&gt;1920&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt; &lt;span class="m"&gt;2248&lt;/span&gt; &lt;span class="m"&gt;2576&lt;/span&gt; &lt;span class="m"&gt;1080&lt;/span&gt; &lt;span class="m"&gt;1083&lt;/span&gt; &lt;span class="m"&gt;1088&lt;/span&gt; &lt;span class="m"&gt;1120&lt;/span&gt; -hsync +vsync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加分辨率模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo xrandr --addmode DP-2 &lt;span class="s2"&gt;&amp;#34;1920x1080_60.00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo xrandr --output DP-2 &lt;span class="s2"&gt;&amp;#34;1920x1080_60.00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;这里主要是通过修改输出信号来适配外接显示器，实际上外接显示器的型号未识别。&lt;/p&gt;</description></item><item><title>Kata-containers Compile And Installed</title><link>https://bevisy.github.io/p/kata-containers-compile-and-installed/</link><pubDate>Sat, 25 Jul 2020 23:06:12 +0800</pubDate><guid>https://bevisy.github.io/p/kata-containers-compile-and-installed/</guid><description>&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="kata-containers-编译安装"&gt;kata-containers 编译安装
&lt;/h1&gt;&lt;h2 id="kata-runtime-编译安装"&gt;kata-runtime 编译安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# compile and install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/libexec/kata-containers/kata-netmon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin/kata-runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin/containerd-shim-kata-v2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/share/defaults/kata-containers/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kata-shim-编译安装"&gt;kata-shim 编译安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/shim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOTAH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/shim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# compile and install &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ makn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/libexec/kata-containers/kata-shim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kata-proxy-编译安装"&gt;kata-proxy 编译安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/proxy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOTAH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/proxy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# compile and install &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/libexec/kata-containers/kata-proxy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译-kata-所需的-kernel"&gt;编译 kata 所需的 kernel
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/packaging
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOTAH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/packaging/kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout stable-1.12
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# On Ubuntu20.04 should install some essential packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	gcc &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	make &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libncurses5-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	openssl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libssl-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	build-essential &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	pkg-config &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libc6-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	bison &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	flex &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libelf-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Also you should install yq from github: https://github.com/mikefarah/yq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注意：如果缺少依赖，会导致内核编译所需要的 .config 文件，无法主动生成，可以将 configs/ 和 configs/fragments 目录下对应文件拼接成完整文件。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./build-kernel.sh -v 5.4.60 -f -d setup &lt;span class="c1"&gt;# stable-1.12 支持的最新LTS内核&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# compile kernel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./build-kernel.sh -v 5.4.60 -f -d build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Output File:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/packaging/kernel/kata-linux-5.4.60-89/vmlinux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install Dir:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/share/kata-containers/vmlinux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译-agent--可选"&gt;编译 agent (可选)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/agent &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译-rootfs-文件系统"&gt;编译 rootfs 文件系统
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# stable-1.10 方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/osbuilder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# generate rootfs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/osbuilder/rootfs-builder/rootfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm -rf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder/rootfs-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ${distro} 需要替换成具体的系统，推荐 centos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 此处增加额外的包，是为了后续便于进入虚拟机调试&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$ script -fec &amp;#39;sudo -E GOPATH=$GOPATH USE_DOCKER=true EXTRA_PKGS=&amp;#34;bash coreutils&amp;#34; ./rootfs.sh ${distro}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E GOPATH=$GOPATH USE_DOCKER=true EXTRA_PKGS=&amp;#34;bash coreutils vim net-tools procps curl iproute&amp;#34; http_proxy=http://{proxy}:{ip} https_proxy=http://{proxy}:{ip} ./rootfs.sh ${distro}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 由于网络原因，可以构建时候添加 http_proxy 代理;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E GOPATH=$GOPATH USE_DOCKER=true EXTRA_PKGS=&amp;#34;bash coreutils&amp;#34; http_proxt=http://{IP}:{PORT} ./rootfs.sh ${distro}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开启vm debug（host进入vm）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 方案一(官方文档目前的方案，支持kata-containers 1.10.7;kata-agent 1.10.7)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 1.确保rootfs已安装 bash coreutils&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 2./etc/kata-containers/configuration.toml 配置文件修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo sed -i -e &lt;span class="s1"&gt;&amp;#39;s/^kernel_params = &amp;#34;\(.*\)&amp;#34;/kernel_params = &amp;#34;\1 agent.debug_console&amp;#34;/g&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;kata_configuration_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 3.确保配置文件的[proxy.kata] enable_debug 不为 true （默认不为true）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo awk &lt;span class="s1"&gt;&amp;#39;{if (/^\[proxy\.kata\]/) {got=1}; if (got == 1 &amp;amp;&amp;amp; /^.*enable_debug/) {print &amp;#34;#enable_debug = true&amp;#34;; got=0; next; } else {print}}&amp;#39;&lt;/span&gt; /etc/kata-containers/configuration.toml &amp;gt; /tmp/configuration.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 4.使用 socat 访问，回车可进入bash，虚拟机刚启动会刷新大量日志，等待日志刷新完毕即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 方案二（之前使用的方案，也是官方方案，通过添加额外的kata-debug.service，相比方案一qemu无需传递内核参数agent.debug_console，同样确保配置文件的[proxy.kata] enable_debug 不为 true （默认不为true））&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a debug systemd service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOT | sudo tee ${ROOTFS_DIR}/lib/systemd/system/kata-debug.service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=Kata Containers debug console
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;StandardInput=tty
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;StandardOutput=tty
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Must be disabled to allow the job to access the real console
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PrivateDevices=no
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add a dependency to start the debug console:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo sed -i &lt;span class="s1"&gt;&amp;#39;$a Requires=kata-debug.service&amp;#39;&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/lib/systemd/system/kata-containers.target
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Output File:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/osbuilder/rootfs-builder/rootfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注意事项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1.安全容器开启debug console后，host使用socat访问vm，访问console.sock一次只允许一个连接，如果已存在进入虚拟机的连接，则其它连接均被阻塞&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# stable-1.12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Download source code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d -u github.com/kata-containers/osbuilder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 构建rootfs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/myrootfs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;USE_DOCKER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;EXTRA_PKGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vim bash coreutils vim net-tools procps curl iproute&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AGENT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.12.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AGENT_SOURCE_BIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;&lt;span class="s2"&gt;/src/github.com/kata-containers/agent&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# kata-agent 二进制文件目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://&lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://&lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./rootfs-builder/rootfs.sh -r &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/myrootfs centos &lt;span class="c1"&gt;# 可根据需求修改 distro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 如果出现镜像构建在下载github文件卡住，可将对应{distro}目录下的Dockerfile.in模板，直接添加上ENV proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 构建img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# build image based rootfs created above&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="nv"&gt;USE_DOCKER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; ./image-builder/image_builder.sh &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/myrootfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译-rootfsimg"&gt;编译 rootfs.img
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# stable-1.10 方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# make sure rootfs is not MODIFIED!!! if you want to add new Agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# install agent (optional)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0550&lt;/span&gt; -t &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/bin ../../agent/kata-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0440&lt;/span&gt; ../../agent/kata-agent.service &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/usr/lib/systemd/system/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0440&lt;/span&gt; ../../agent/kata-containers.target &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/usr/lib/systemd/system/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Compile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder/image-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E USE_DOCKER=true ./image_builder.sh ${ROOTFS_DIR}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git log --format&lt;span class="o"&gt;=&lt;/span&gt;%h -1 HEAD&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y-%m-%d-%T.%N%z&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;kata-containers-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;commit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0640&lt;/span&gt; -D kata-containers.img &lt;span class="s2"&gt;&amp;#34;/usr/share/kata-containers/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share/kata-containers &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; kata-containers.img&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Output File:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder/image-builder/kata-containers.img
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译-initrdimg"&gt;编译 initrd.img
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# make sure rootfs is not MODIFIED!!! if you want to add new Agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# install agent(optional)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0550&lt;/span&gt; -T ../../agent/kata-agent &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROOTFS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/sbin/init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Compile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder/initrd-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E AGENT_INIT=yes USE_DOCKER=true ./initrd_builder.sh ${ROOTFS_DIR}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git log --format&lt;span class="o"&gt;=&lt;/span&gt;%h -1 HEAD&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y-%m-%d-%T.%N%z&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;kata-containers-initrd-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;commit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo install -o root -g root -m &lt;span class="m"&gt;0640&lt;/span&gt; -D kata-containers-initrd.img &lt;span class="s2"&gt;&amp;#34;/usr/share/kata-containers/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share/kata-containers &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; kata-containers-initrd.img&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Output File:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/kata-containers/osbuilder/initrd-builder/kata-containers-initrd.img
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="编译-qemu-on-aarch64"&gt;编译 qemu on aarch64
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -d github.com/kata-containers/tests
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 准备依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y libcap-ng-dev libglib2.0-dev libpixman-1-dev librbd-dev libattr1-dev libcap-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编译构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ script -fec &lt;span class="s1"&gt;&amp;#39;sudo -E ${GOPATH}/src/github.com/kata-containers/tests/.ci/install_qemu.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注意：如果安装失败，清直接删除文件夹，然后重新跑升级脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm -rf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/kata-containers/packaging &lt;span class="c1"&gt;# 可不操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm -rf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/src/github.com/qemu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果需要编译指定代码分支的qemu版本，需要切换tests分支，以及packaging分支为同一分支&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 由于脚本.ci/install_qemu.sh go get 获取packaging代码后未切换分支，所以需要构建失败后，手动切换分支&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 目前已知最新的版本的qemu patch是针对qemu 5.1的，并不能直接使用master代码，会导致patch合入失败&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="docker-对接-kata-runtime"&gt;Docker 对接 kata-runtime
&lt;/h1&gt;&lt;p&gt;修改 Docker 配置文件&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;debug&amp;#34;&lt;/span&gt;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;default-runtime&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;, &lt;span class="c1"&gt;# 可替换成 kata-runtime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;runtimes&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;kata&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;/usr/local/bin/kata-runtime&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 不支持直接配置成 containerd-shim-kata-v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启 docker 服务（必须）&lt;/p&gt;
&lt;p&gt;验证修改生效&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo docker run --rm --name test busybox:latest uname -a&lt;/code&gt; 与宿主机内核对比，验证是否生效&lt;/p&gt;
&lt;h2 id="调试-kata-runtime"&gt;调试 kata-runtime
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# docker 开启 debug: /etc/docker/daemon.json 添加参数 (需重启服务)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;debug&amp;#34;&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kata配置文件/etc/kata-containers/configuration.toml，开启 enable_debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ journalctl -ft kata-runtime
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="containerd-对接-containerd-shim-kata-v2"&gt;Containerd 对接 containerd-shim-kata-v2
&lt;/h1&gt;&lt;p&gt;修改 containerd 的配置&lt;code&gt;/etc/containerd/config.toml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;containerd config default&lt;/code&gt; 生成当前版本默认配置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/var/lib/containerd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/run/containerd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;plugin_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disabled_plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;required_plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;oom_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;grpc&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/run/containerd/containerd.sock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tcp_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tcp_tls_cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tcp_tls_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;gid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;max_recv_message_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16777216&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;max_send_message_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16777216&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;ttrpc&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;gid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;debug&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;gid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;debug&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 开启debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;metrics&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;grpc_histogram&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;cgroup&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;timeouts&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.timeout.shim.cleanup&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.timeout.shim.load&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.timeout.shim.shutdown&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.timeout.task.state&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;plugins&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.gc.v1.scheduler&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;pause_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0.02
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;deletion_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;mutation_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;schedule_delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;startup_delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;100ms&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;disable_tcp_service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;stream_server_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;stream_server_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;stream_idle_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4h0m0s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;enable_selinux&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;sandbox_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k8s.gcr.io/pause:3.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;stats_collect_period&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;systemd_cgroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;enable_tls_streaming&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;max_container_log_line_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;disable_cgroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;disable_apparmor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;restrict_oom_score_adj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;max_concurrent_downloads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;disable_proc_mount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;snapshotter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;default_runtime_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;no_pivot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.default_runtime&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;privileged_without_host_devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.untrusted_workload_runtime&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;privileged_without_host_devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.runtimes&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.runtimes.runc&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.runc.v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;privileged_without_host_devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.containerd.runtimes.kata&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 新增&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;io.containerd.kata.v2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;privileged_without_host_devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.cni&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;bin_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/cni/bin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;conf_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/cni/net.d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;max_conf_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;conf_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry.mirrors&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.registry.mirrors.&lt;span class="s2"&gt;&amp;#34;docker.io&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://registry-1.docker.io&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.grpc.v1.cri&amp;#34;&lt;/span&gt;.x509_key_pair_streaming&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tls_cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tls_key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.internal.v1.opt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/containerd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.internal.v1.restart&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.metadata.v1.bolt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;content_sharing_policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shared&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.monitor.v1.cgroups&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;no_prometheus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.runtime.v1.linux&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;shim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;containerd-shim&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;runtime_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;no_shim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;shim_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.runtime.v2.task&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;platforms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.service.v1.diff-service&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;walking&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;plugins.&lt;span class="s2"&gt;&amp;#34;io.containerd.snapshotter.v1.devmapper&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;pool_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;base_image_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意： 确保&lt;code&gt;containerd-shim-kata-v2&lt;/code&gt; 文件在 $PATH 目录下&lt;/p&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr -n testns run --runtime io.containerd.kata.v2 -d --rm docker.io/library/busybox:latest busybox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看容器 id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr -n testns t ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 进入容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ctr -n testns t &lt;span class="nb"&gt;exec&lt;/span&gt; -t --exec-id &lt;span class="o"&gt;{&lt;/span&gt;ID&lt;span class="o"&gt;}&lt;/span&gt; busybox sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看内核版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a &lt;span class="c1"&gt;# 对比宿主机内核&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="调试-containerd-shim-runtime-v2"&gt;调试 containerd-shim-runtime-v2
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# containerd 配置开启 debug(需重启服务)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kata配置文件/etc/kata-containers/configuration.toml，开启 enable_debug (需重新创建安全容器)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ journalctl -ft kata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="附录"&gt;附录
&lt;/h1&gt;&lt;h2 id="kata-containers-20-安装"&gt;kata-containers 2.0 安装
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载release包&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/kata-containers/kata-containers/releases" target="_blank" rel="noopener"
 &gt;Release 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载 &lt;a class="link" href="https://github.com/kata-containers/kata-containers/releases/tag/2.0.0-alpha3" target="_blank" rel="noopener"
 &gt;Kata Containers 2.0.0-alpha3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;解压后，拷贝至文件夹 &lt;code&gt;/opt&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;准备配置文件和&lt;code&gt;containerd-shim-kata-v2&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 准备配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp /opt/kata/share/defaults/kata-containers/configuration-qemu.toml /etc/kata-containers/configuration.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 准备 containerd-shim-kata-v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置文件修改如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;hypervisor.qemu&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/kata/bin/qemu-system-x86_64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kernel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/kata/share/kata-containers/vmlinuz.container&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/kata/share/kata-containers/kata-containers.img&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;machine_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kernel_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;firmware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;machine_accelerators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cpu_features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pmu=off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;default_vcpus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;default_maxvcpus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;default_bridges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;default_memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disable_block_device_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;shared_fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;virtio-9p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;virtio_fs_daemon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/kata/bin/virtiofsd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;virtio_fs_cache_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;virtio_fs_extra_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;virtio_fs_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;block_device_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;virtio-scsi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_iothreads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_vhost_user_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;vhost_user_store_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/var/run/kata-containers/vhost-user&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;factory&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;agent.kata&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kernel_modules&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;netmon&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/kata/libexec/kata-containers/kata-netmon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;runtime&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enable_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;internetworking_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tcfilter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disable_guest_seccomp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;sandbox_cgroup_only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EnablePprof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="对接docker和containerd需要注意"&gt;对接docker和containerd需要注意
&lt;/h2&gt;&lt;p&gt;注意：此版本无法与 docker配合使用，与containerd 使用正常。&lt;/p&gt;
&lt;h1 id="问题探讨"&gt;问题探讨
&lt;/h1&gt;&lt;h2 id="1如果关闭用来开启debug-console的kata-debugservice会发生什么"&gt;1.如果关闭用来开启debug console的kata-debug.service会发生什么？
&lt;/h2&gt;&lt;p&gt;进入vm，关闭kata-debug.service，等待kata-debug.service最终停止后，重新使用socat无法再进入bash终端&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash-4.2# systemctl stop kata-debug
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.392708&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Failed to determine peer security context: Protocol not available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.394714&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Accepted new private connection.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.395681&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.397145&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.397455&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.397759&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got message &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;method_call &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;destination&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.freedesktop.systemd1 &lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/org/freedesktop/systemd1 &lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.freedesktop.systemd1.Manager &lt;span class="nv"&gt;member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;StopUnit &lt;span class="nv"&gt;cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;reply_cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.398545&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Trying to enqueue job kata-debug.service/stop/replace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.398983&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Installed new job kata-containers.target/stop as &lt;span class="m"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.399290&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Installed new job kata-debug.service/stop as &lt;span class="m"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 249.399604&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Enqueued job kata-debug.service/stop as &lt;span class="m"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Terminated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash-4.2# systemctl status kata-debug
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.097267&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Failed to determine peer security context: Protocol not available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.098268&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Accepted new private connection.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.098453&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.098762&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.098928&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got unexpected auxiliary data with &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; and &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.099088&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got message &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;method_call &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;destination&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.freedesktop.systemd1 &lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/org/freedesktop/systemd1/unit/kata_2ddebug_2eservice &lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.freedesktop.DBus.Properties &lt;span class="nv"&gt;member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;GetAll &lt;span class="nv"&gt;cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;reply_cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.099783&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Sent message &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;method_return &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;destination&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;member&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a &lt;span class="nv"&gt;cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;reply_cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n/a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;● kata-debug.service - Kata Containers debug console
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/usr/lib/systemd/system/kata-debug.service&lt;span class="p"&gt;;&lt;/span&gt; static&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: disabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Active: deactivating &lt;span class="o"&gt;(&lt;/span&gt;stop-sigterm&lt;span class="o"&gt;)&lt;/span&gt; since Wed 2020-10-14 08:11:57 UTC&lt;span class="p"&gt;;&lt;/span&gt; 8s ago
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Main PID: &lt;span class="m"&gt;57&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bash&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CGroup: /system.slice/kata-debug.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ &lt;span class="m"&gt;57&lt;/span&gt; /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─231 systemctl status kata-debug
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 258.101662&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Got disconnect on private connection.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash-4.2# system&lt;span class="o"&gt;[&lt;/span&gt; 339.593226&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: kata-debug.service stop-sigterm timed out. Killing.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.593989&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Watching &lt;span class="m"&gt;57&lt;/span&gt; through watch_pids1.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.594710&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: kata-debug.service changed stop-sigterm -&amp;gt; stop-sigkill
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.595681&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Received SIGCHLD from PID &lt;span class="m"&gt;57&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bash&lt;span class="o"&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.596281&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Child &lt;span class="m"&gt;57&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bash&lt;span class="o"&gt;)&lt;/span&gt; died &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;killed, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9/KILL&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.596722&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Child &lt;span class="m"&gt;57&lt;/span&gt; belongs to kata-debug.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.597060&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Unwatching 57.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.597276&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: kata-debug.service: main process exited, &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;killed, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9/KILL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.597722&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: kata-debug.service changed stop-sigkill -&amp;gt; failed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 339.598098&lt;span class="o"&gt;]&lt;/span&gt; systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Job kata-debug.service/stop finished, &lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 此处kata-debug.service完全退出，无法再进入终端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 尝试重新进入终端，会发现回车后无法打开bash终端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@zbb-pc:/run/vc/vm/d658a67be082b2952c360e7539b5bfa7ac744ae8b84d844d57547d36915e184f# socat &lt;span class="s2"&gt;&amp;#34;stdin,raw,echo=0,escape=0x11&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;unix-connect:./console.sock&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重启容器后，可重新进入终端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 此处发现重启容器过程，其实是新建一个同名的容器，因为会发现vm原有目录文件均被删除，生成同名文件夹。如果查看前后vm目录，应该文件inode已产生变化。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Compile qemu on Ubuntu 20.04</title><link>https://bevisy.github.io/p/compile-qemu-on-ubuntu-20-04/</link><pubDate>Fri, 24 Jul 2020 22:21:51 +0800</pubDate><guid>https://bevisy.github.io/p/compile-qemu-on-ubuntu-20-04/</guid><description>&lt;h1 id="compile-qemu-on-ubuntu-2004"&gt;Compile qemu on Ubuntu 20.04
&lt;/h1&gt;&lt;h2 id="下载源码"&gt;下载源码
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://git.qemu.org/git/qemu.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; qemu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update --recursive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译安装"&gt;编译安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="问题"&gt;问题
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ERROR: glib-2.48 gthread-2.0 is required to compile QEMU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y libglib2.0-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ERROR: pixman &amp;gt;= 0.21.8 not present.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Please install the pixman devel package.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y libpixman-1-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>The Skills of VIM</title><link>https://bevisy.github.io/p/the-skills-of-vim/</link><pubDate>Fri, 24 Jul 2020 15:02:12 +0800</pubDate><guid>https://bevisy.github.io/p/the-skills-of-vim/</guid><description>&lt;h1 id="vim-使用技巧"&gt;VIM 使用技巧
&lt;/h1&gt;&lt;h2 id="查找"&gt;查找
&lt;/h2&gt;&lt;h3 id="大小写敏感控制"&gt;大小写敏感控制
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# VIM 默认大小写敏感查找；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大小写不敏感查找&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：/foo&lt;span class="se"&gt;\c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大小写敏感查找&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：/foo&lt;span class="se"&gt;\C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查找光标当前单词"&gt;查找光标当前单词
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# normal 模式下，&amp;#34;*&amp;#34; 键查找当前单词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vim-查找和替换"&gt;Vim 查找和替换
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:&lt;span class="o"&gt;{&lt;/span&gt;作用范围&lt;span class="o"&gt;}&lt;/span&gt;s/&lt;span class="o"&gt;{&lt;/span&gt;目标&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;替换&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;替换标志&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 当前行替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：s/vivian/sky/ 替换当前行第一个 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：s/vivian/sky/g 替换当前行所有 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 范围替换； n 为数字，若 n 为 .，表示从当前行开始到最后一行 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：n,&lt;span class="nv"&gt;$s&lt;/span&gt;/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：n,&lt;span class="nv"&gt;$s&lt;/span&gt;/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：2,12s/hello/world/ 2-12行,第一次出现替换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：.,+2s/hello/world/ 当前行与接下来的2行，第一次出现替换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 全行替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：%s/vivian/sky/（等同于 ：g/vivian/s//sky/） 替换每一行的第一个 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：%s/vivian/sky/g（等同于 ：g/vivian/s//sky/g） 替换每一行中所有 vivian 为 sky 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用&amp;#34;#&amp;#34;作为分隔符，此时中间出现的 / 不会作为分隔符 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;：%s+/oradata/apras/+/user01/apras1+ （使用+ 来 替换 / ）： /oradata/apras/替换成/user01/apras1/ 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 替换确认，添加参数c，提示是否替换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:%s/hello/world/gc 针对每一个匹配项，提示是否替换
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Compile Linux Kernel on Ubuntu 20.04</title><link>https://bevisy.github.io/p/compile-linux-kernel-on-ubuntu-20-04/</link><pubDate>Fri, 24 Jul 2020 00:41:59 +0800</pubDate><guid>https://bevisy.github.io/p/compile-linux-kernel-on-ubuntu-20-04/</guid><description>&lt;h1 id="linux-内核编译ubuntu-环境"&gt;Linux 内核编译(Ubuntu 环境)
&lt;/h1&gt;&lt;h2 id="下载内核代码"&gt;下载内核代码
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;https://www.kernel.org/&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="安装依赖"&gt;安装依赖
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	gcc &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	make &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libncurses5-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	openssl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libssl-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	build-essential &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	pkg-config &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libc6-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	bison &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	flex &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	libelf-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="准备config和自定义配置"&gt;准备.config和自定义配置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;Download&lt;span class="o"&gt;}&lt;/span&gt;/linux-5.4.32/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /boot/config-&lt;span class="o"&gt;{&lt;/span&gt;uname -r&lt;span class="o"&gt;}&lt;/span&gt; .config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编译内核"&gt;编译内核
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编译内核&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make modules_install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装内核"&gt;安装内核
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv &lt;span class="o"&gt;{&lt;/span&gt;Download&lt;span class="o"&gt;}&lt;/span&gt;/linux-5.4.32 /usr/src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/src/linux-5.4.32/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkinitramfs -o /boot/initrd.img-5.4.32
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-initramfs -c -k 5.4.32
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-grub2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="验证"&gt;验证
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Zsh-And-Oh My Zsh-Installation summary</title><link>https://bevisy.github.io/p/zsh-and-oh-my-zsh-installation-summary/</link><pubDate>Sat, 18 Jul 2020 12:14:33 +0800</pubDate><guid>https://bevisy.github.io/p/zsh-and-oh-my-zsh-installation-summary/</guid><description>&lt;h1 id="zsh-安装总结"&gt;zsh 安装总结
&lt;/h1&gt;&lt;h2 id="安装zsh"&gt;安装zsh
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu 18.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install zsh -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装-oh-my-zsh"&gt;安装 Oh My Zsh
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://ohmyz.sh/#install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sh -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="插件安装"&gt;插件安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用 Oh My Zsh 安装插件；默认安装目录为 $ZSH_CUSTOM/plugins (by default ~/.oh-my-zsh/custom/plugins)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/zsh-users/zsh-autosuggestions.git &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/plugins/zsh-autosuggestions
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/plugins/zsh-syntax-highlighting
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 .zshrc，添加插件列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;zsh-autosuggestions
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; zsh-syntax-highlighting&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动新终端，查看效果示例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>通过nginx为netdata提供https访问</title><link>https://bevisy.github.io/p/enable-https-access-for-netdata-via-nginx/</link><pubDate>Tue, 21 Jan 2020 15:56:21 +0800</pubDate><guid>https://bevisy.github.io/p/enable-https-access-for-netdata-via-nginx/</guid><description>&lt;h1 id="nginx-代理-netdata-并添加鉴权"&gt;nginx 代理 netdata 并添加鉴权
&lt;/h1&gt;&lt;h2 id="netdata-安装"&gt;netdata 安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --name&lt;span class="o"&gt;=&lt;/span&gt;netdata &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 30002:19999 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/passwd:/host/etc/passwd:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/group:/host/etc/group:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /proc:/host/proc:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /sys:/host/sys:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DO_NOT_TRACK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cap-add SYS_PTRACE &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --security-opt &lt;span class="nv"&gt;apparmor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;unconfined &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; netdata/netdata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-安装"&gt;nginx 安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name nginx &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/html:/usr/share/nginx/html &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/conf.d:/etc/nginx/conf.d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/ssl:/etc/nginx/ssl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/passwords:/etc/nginx/passwords &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8080:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8443:443 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Asia/Chongqing&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 需要准备的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── conf.d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── default.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── 50x.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── index.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── nginx-start.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── passwords
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── ssl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── nginx.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── nginx.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-配置"&gt;nginx 配置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;upstream netdata &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server 192.168.124.2:19999&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; keepalive 64&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name localhost&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#charset koi8-r;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#access_log /var/log/nginx/host.access.log main;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /usr/share/nginx/html&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html index.htm&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; /netdata &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; /netdata/&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /netdata/&lt;span class="o"&gt;(&lt;/span&gt;?&amp;lt;ndpath&amp;gt;.*&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_redirect off&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Host &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Server &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass_request_headers on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &lt;span class="s2"&gt;&amp;#34;keep-alive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_store off&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://netdata/&lt;span class="nv"&gt;$ndpath$is_args$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_proxied any&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_types *&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#error_page 404 /404.html;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# redirect server error pages to the static page /50x.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; error_page &lt;span class="m"&gt;500&lt;/span&gt; &lt;span class="m"&gt;502&lt;/span&gt; &lt;span class="m"&gt;503&lt;/span&gt; &lt;span class="m"&gt;504&lt;/span&gt; /50x.html&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; /50x.html &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /usr/share/nginx/html&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# proxy the PHP scripts to Apache listening on 127.0.0.1:80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#location ~ \.php$ {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# proxy_pass http://127.0.0.1;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#location ~ \.php$ {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# root html;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# fastcgi_pass 127.0.0.1:9000;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# fastcgi_index index.php;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# include fastcgi_params;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# deny access to .htaccess files, if Apache&amp;#39;s document root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# concurs with nginx&amp;#39;s one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#location ~ /\.ht {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# deny all;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen &lt;span class="m"&gt;443&lt;/span&gt; ssl&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate /etc/nginx/ssl/nginx.crt&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key /etc/nginx/ssl/nginx.key&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; keepalive_timeout 60&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name localhost&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_tokens off&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTPS on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTP_SCHEME https&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; access_log /var/log/nginx/access.log&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; error_log /var/log/nginx/error.log&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /usr/share/nginx/html/&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html index.htm&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; /netdata &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; /netdata/&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /netdata/&lt;span class="o"&gt;(&lt;/span&gt;?&amp;lt;ndpath&amp;gt;.*&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_redirect off&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Host &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Server &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass_request_headers on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &lt;span class="s2"&gt;&amp;#34;keep-alive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_store off&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://netdata/&lt;span class="nv"&gt;$ndpath$is_args$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_proxied any&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_types *&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;访问nginx http://nginxurl:80/netdata/ 或者 https://nginxurl:443/netdata/，验证生效。&lt;/p&gt;
&lt;h2 id="生成-ssl-证书和密钥"&gt;生成 ssl 证书和密钥
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 有效时间 7 天&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -x509 -nodes -days &lt;span class="m"&gt;7&lt;/span&gt; -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt -subj &lt;span class="s2"&gt;&amp;#34;/C=CN/ST=SiChuan/L=Chengdu/O=Example Inc./OU=Web Security/CN=localhost&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成的证书未经权威机构认证，但是不影响使用，只是浏览器会提示非安全的证书。&lt;/p&gt;
&lt;h2 id="nginx-配置https-服务"&gt;nginx 配置https 服务
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443 ssl;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate /etc/nginx/ssl/nginx.crt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key /etc/nginx/ssl/nginx.key;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; keepalive_timeout 60;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name localhost;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_tokens off;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTPS on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fastcgi_param HTTP_SCHEME https;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; access_log /var/log/nginx/access.log;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; error_log /var/log/nginx/error.log;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /usr/share/nginx/html/;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html index.htm;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location = /netdata {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return 301 /netdata/;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /netdata/(?&amp;lt;ndpath&amp;gt;.*) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_redirect off;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Server $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass_request_headers on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;keep-alive&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_store off;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://netdata/$ndpath$is_args$args;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_proxied any;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gzip_types *;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-添加鉴权"&gt;nginx 添加鉴权
&lt;/h2&gt;&lt;p&gt;nginx 目前开启的是全局 ssl ，即通过 443 端口进入的请求均为 https，但是upstream 上的服务依旧是 http。&lt;/p&gt;
&lt;h3 id="创建认证文件开启-nginx-基础认证"&gt;创建认证文件，开启 nginx 基础认证
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 提示输入密码和确认密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;username:&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;openssl passwd -apr1&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt; /etc/nginx/passwords
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="在-server-directive-中开启认证"&gt;在 server directive 中开启认证
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen &lt;span class="m"&gt;443&lt;/span&gt; ssl&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_basic &lt;span class="s2"&gt;&amp;#34;Protected&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_basic_user_file passwords&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; access_log /var/log/nginx/access.log&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; error_log /var/log/nginx/error.log&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="http-自动跳转https-安全配置"&gt;HTTP 自动跳转HTTPS 安全配置
&lt;/h3&gt;&lt;p&gt;参考 &lt;a class="link" href="https://cloud.tencent.com/document/product/400/35244" target="_blank" rel="noopener"
 &gt;Nginx 服务器证书安装&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#填写绑定证书的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name www.domain.com&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#网站主页路径。此路径仅供参考，具体请您按照实际目录操作。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root /var/www/www.domain.com&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html index.htm&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#证书文件名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate 1_www.domain.com_bundle.crt&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#私钥文件名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key 2_www.domain.com.key&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_session_timeout 5m&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_protocols TLSv1 TLSv1.1 TLSv1.2&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_prefer_server_ciphers on&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index index.html index.htm&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#填写绑定证书的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name www.domain.com&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#把http的域名请求转成https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rewrite ^&lt;span class="o"&gt;(&lt;/span&gt;.*&lt;span class="o"&gt;)&lt;/span&gt;$ https://&lt;span class="nv"&gt;$host$1&lt;/span&gt; permanent&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使用权威机构签名证书"&gt;使用权威机构签名证书
&lt;/h2&gt;&lt;h3 id="查看证书内容"&gt;查看证书内容
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in nginx.crt -noout -text
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查看key内容"&gt;查看key内容
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl rsa -in nginx.key -noout -text
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="申请腾讯云免费ssl证书"&gt;申请腾讯云免费SSL证书
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://cloud.tencent.com/developer/article/1522482" target="_blank" rel="noopener"
 &gt;腾讯云免费ssl证书申请&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="reference"&gt;Reference
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.netdata.cloud/docs/running-behind-nginx/" target="_blank" rel="noopener"
 &gt;Running Netdata behind Nginx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.netdata.cloud/web/server/#enabling-tls-support" target="_blank" rel="noopener"
 &gt;Enabling TLS support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://cloud.tencent.com/document/product/400/35244" target="_blank" rel="noopener"
 &gt;Nginx 服务器证书安装&lt;/a&gt;&lt;/p&gt;</description></item><item><title>通过Travis CI 部署静态页面到 github page</title><link>https://bevisy.github.io/p/deploy-github-page-by-travis-ci/</link><pubDate>Tue, 21 Jan 2020 00:25:33 +0800</pubDate><guid>https://bevisy.github.io/p/deploy-github-page-by-travis-ci/</guid><description>&lt;h1 id="travis-ci-部署-hexo-生成文件到-master-分支"&gt;Travis CI 部署 Hexo 生成文件到 master 分支
&lt;/h1&gt;&lt;p&gt;文档主要实现Hexo利用 Travis CI 完成 github page 部署。&lt;/p&gt;
&lt;p&gt;由于 username.github.io 仓库不允许切换 github page 分支，必须将 master 分支作为静态资源分支，所以新建 develop 分支作为开发分支。&lt;/p&gt;
&lt;p&gt;详细的步骤参考&lt;a class="link" href="https://hexo.io/zh-cn/docs/github-pages" target="_blank" rel="noopener"
 &gt;将 Hexo 部署到 GitHub Pages&lt;/a&gt;，此处主要贴出区别的 Travis CI 配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;language: node_js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node_js:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 13.6.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cache: npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;branches:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; only:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - develop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - hexo generate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deploy:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; provider: pages
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; skip-cleanup: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; github-token: &lt;span class="nv"&gt;$GH_TOKEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; keep-history: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; target_branch: master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; local-dir: public
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; on:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; branch: develop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述配置信息解释参考 &lt;a class="link" href="https://docs.travis-ci.com/user/deployment/pages/" target="_blank" rel="noopener"
 &gt;GitHub Pages Deployment&lt;/a&gt;。&lt;/p&gt;
&lt;h1 id="参考文档"&gt;参考文档
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://docs.travis-ci.com/user/deployment/pages/" target="_blank" rel="noopener"
 &gt;GitHub Pages Deployment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://hexo.io/zh-cn/docs/github-pages" target="_blank" rel="noopener"
 &gt;将 Hexo 部署到 GitHub Pages&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>