想象你走进一家大型综合医院。传统门诊部有一个可怕的规矩:医生接诊每位患者时,必须翻阅这位患者从出生到现在的全部病历记录,与每一页旧病历做对照分析。如果一天有 1000 位患者,每位患者又有 10 万页病历……整个医院瞬间瘫痪。这正是大语言模型在长文本面前遭遇的窘境——标准的全量注意力(Full Attention)要计算“每个词与所有词”的相关性,序列越长,计算量呈平方级爆炸。 Mistral 7B 和 Mixtral 8x7B 给出了两剂良方。第一剂是滑动窗口注意力(SWA):医生不再翻全部病历,只翻最近几天的记录,窗口外的历史一概不看。第二剂是稀疏混合专家(MoE):与其让一位全科医生处理所有疑难杂症,不如建一座分工精细的专科医院——分诊台先快速判断病情,只把患者派给最对口的两位专科医生。本文就用这家“智慧综合医院”做主线,带你彻底看懂 SWA 与 Mixtral MoE 的架构精髓。
对 AI 从业者而言,理解 Mistral 系列是读懂当前开源大模型主流设计的钥匙:SWA 教你在算力受限时优化注意力,MoE 教你在不增加推理成本的前提下把模型做大。这两项技能直接服务于大模型推理加速、低成本部署和架构选型,是算法工程师进阶的必修课。
可视化演示
展示CI/CD流水线从代码提交到部署上线的五个阶段,动态演示源码拉取、构建编译、自动化测试、打包发布和部署交付的完整流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
源码拉取阶段 从Git仓库拉取最新代码变更 触发条件:代码推送或PR合并 CI/CD 持续集成流水线第一阶段
背景与动机
假设你是这家综合医院的院长,每天有成百上千位患者涌入。老规矩要求每位医生接诊时必须完整翻阅患者的全部历史病历,并和眼前这位患者的症状做逐项比对。患者越多、病历越厚,医生就越是寸步难行。传统 Transformer 的注意力机制就是这个“老规矩”:它让每个 token 与序列中所有 token 两两计算相关性,计算量随序列长度呈平方级爆炸。
面对这种爆炸式开销,研究者们开始思考:医生真的需要看完全部病历吗?显然不需要——人的注意力天然是局部的,读文章时我们主要参考最近的几段话。基于这个直觉,Mistral 7B 和 Mixtral 8x7B 沿着“稀疏化”的思路,把“翻全部病历”改成了“翻最近几页”,把“一位全科医生管到底”改成了“多位专科医生分工协作”。这就是本文要展开的两条主线。
- 序列长度 \(n\)一段文本被分词器切成的 token 总数。比如一句话“今天天气真好”可能切成 6 个 token,\( n = 6 \)。
- 隐藏维度 \(d\)每个 token 用一个高维向量表示其语义信息,维度通常为 4096 或 8192。
- 平方组合 \(n^2\)全量注意力需要为每个 token 计算它与其余所有 token 的相关性分数,总共有 \( n^2 \) 个 token 对。
- 向量内积 \(\times d\)每一对 token 的相关性需要做两个 \( d \) 维向量的点积,因此总计算量是 \( n^2 \) 乘以 \( d \)。
滑动窗口注意力
回到医院。聪明的院长宣布一项新规:每位医生接诊时,最多只翻阅患者最近 4 天的病历。4 天前的记录哪怕再重要,也直接跳过——因为绝大多数病症的诱因就藏在这几天里,执着于陈年旧账反而拖慢诊疗速度。这条新规就是 Mistral 7B 引入的滑动窗口注意力(Sliding Window Attention,SWA)。
在技术实现上,SWA 给注意力矩阵加了一个上三角偏置之外的额外掩码:当前位置 \(i\) 只能关注位置 \(j \in [i - w + 1, i]\) 的 token,更早的 token 在 softmax 之前就被覆写为负无穷。这样,每个 token 只需要和窗口内的 \(w\) 个 token 做注意力计算,复杂度从 \(O(n^2)\) 降为 \(O(n \times w)\)。
SWA 并非完全放弃长距离信息。Transformer 每一层都会让信息向邻近 token 传播一层,堆叠 32 层后,最远 token 的信息已经沿着窗口“接力”传了 32 步,实际感受野远超单层窗口大小。同时,窗口截断使得缓存中只需保留最近 \(w\) 个 key-value 对,KV cache 占用也从 \(O(n \times d)\) 降为 \(O(w \times d)\),推理时的显存压力大幅缓解。这正是 Mistral 7B 能以 7B 参数实现长文本高效推理的关键。
- 当前位置 \(i\)医生正在接诊的患者编号,即当前正在生成或编码的 token 位置。
- 窗口大小 \(w\)允许回看的病历页数上限,Mistral 7B 默认 \( w = 4096 \)。
- 可关注范围 \(i - w < j \le i\)表示当前位置只能关注它前面最近 \(w\) 个位置的 token,包含自身。
- 掩码值 \(-\infty\)窗口外位置的注意力分数被置为负无穷,经过 softmax 后对应概率趋近于 0,等于“看不见”。
RoPE位置编码
病历翻阅有个隐藏问题:医生看到日期为“2024-03-05“和”2024-03-06”的记录,能立刻知道后者比前者晚一天。但如果病历上没有时间戳,医生只能靠记忆硬背顺序。在 SWA 的窗口截断之下,位置信息尤其重要——模型必须知道当前 token 和窗口内每个 token 的相对距离,才能正确理解语序。Mistral 7B 使用的解决方案是旋转位置编码(RoPE)。
RoPE 的核心思想极其优雅:把 token 向量按二维一组拆开,每一组向量乘上一个与位置相关的旋转矩阵,让向量的方向随位置旋转一个角度。这样,两个 token 的内积就自然包含了它们的相对位置差——旋转角相减即为相对位置。位置差的语义来自角度差,与绝对位置无关,这让 RoPE 天然适合 SWA 的窗口场景。
RoPE 还有一个独特的优势——外推能力。因为位置信息以旋转角呈现,即使推理时的序列长度超过训练长度,模型仍能处理,只是精度会有所下降。Mistral 7B 在 32 层中除了常规 4096 窗口外,还特意让第 15 和第 31 层的窗口为 8192,用于捕捉更长距离的依赖。这些设计环环相扣,共同支撑起 Mistral 在长文本任务上的稳定表现。
- 输入向量 \(x_m\)位置 \(m\) 处的 token 向量被拆成许多二维子向量对,如 \((x_{m,1}, x_{m,2})\)。
- 位置索引 \(m\)token 在序列中的绝对位置编号。
- 基频 \(\theta\)决定旋转速度的超参数,不同维度的子向量对使用不同的 \(\theta\),从而让各个维度的位置编码频率不同。
- 旋转矩阵将二维向量顺时针旋转 \(m \times \theta\) 弧度,把位置信息以角度方式注入向量。
稀疏MoE架构
解决了病历翻阅效率问题后,院长又遇到了新难题:虽然每位医生都看《最近病历》,但遇到疑难杂症时,全科医生力不从心。要提升医院整体诊疗水平,最简单的办法是雇更多、更专的医生——可每位专家的薪资、办公室都是成本。MoE(混合专家) 架构给出了另一种思路:建立一个足够大的专家团队,但每次接诊只激活其中少数几位专家。
具体到 Mixtral 8x7B,模型把 Transformer 中每隔一层的 FFN 前馈网络替换成了 MoE 层:8 个并行的专家 FFN 模块,每个专家都是独立的两层全连接网络,参数量和 Mistral 7B 的单层 FFN 相当。注意,这里的“8x7B“不是说参数量是 56B——实际总参数约 47B,因为专家与专家之间的结构有共享尺寸,而注意力层和嵌入层仍为整体共享。每一层 MoE 都由同一个输入门控网络(Gate)决定”这次该让哪几位专家出诊”。
这种“大团队、小激活”的设计让 Mixtral 8x7B 一举两得:从模型容量上看,47B 参数里有 8 个专家 FFN,知识存储空间远超稠密模型;从推理成本上看,每个 token 只激活两位专家,相当于只用约 13B 参数的算力就能运行。在 GPU 推理时,Mixtral 的速度和显存占用接近 13B 稠密模型,而能力上限比肩更大的稠密模型——这正是稀疏 MoE 被广泛看好的根本原因。
- 专家总数 \(N\)Mixtral 8x7B 每层有 \( N = 8 \) 个专家 FFN。
- 门控权重 \(G(x)_i\)门控网络根据输入 \(x\) 为第 \(i\) 个专家分配的权重,表示“这位专家对当前输入的匹配程度”。
- 专家输出 \(E_i(x)\)第 \(i\) 个专家对输入 \(x\) 做前馈变换的结果。
- 稀疏加权求和只有被激活的专家贡献非零值,其余专家输出乘以零权重,等效于不参与计算。
Top-2路由
分诊台是这家医院的神经中枢。患者挂号后,分诊台护士迅速评估病情,给每位患者生成一张“专科匹配单”,列出各专科与该病情的匹配分数。传统做法(如 GShard 架构)只把患者派给得分最高的一个专科;Mistral 的分诊台则更聪明——把患者同时派给得分最高的两位专科医生,实现“双专家会诊”。
这个“双专家会诊”在技术上被称为 Top-2 路由。门控网络先对输入 \(x\) 做一次线性变换,得到它和 8 个专家的匹配得分 \(s = x \cdot W_g\),然后取得分最高的两个专家,并在只保留这两位的前提下重新做 softmax 归一化,得到权重 \(p_1, p_2\)。最终输出是两位专家输出各自乘以权重后的和。
选择 Top-2 而非 Top-1 有深刻的工程考量。Top-1 只派一位专家,路由就像“赌博”,一旦选错,输出质量骤降;Top-2 则提供了冗余和稳定性——如果首选专家不够理想,第二专家可以“补位”。更妙的是,Top-2 的权重分配是连续可微的,梯度可以同时流向两个专家,训练时模型能更平滑地学习路由策略。唯一的代价是计算量比 Top-1 翻倍,但换来的是表达力和鲁棒性的大幅提升,这笔账非常划算。
- 路由得分 \(s_i\)输入 \(x\) 与专家 \(i\) 的匹配度,通过线性变换 \(x \cdot W_g\) 计算,\(W_g\) 是可学习的门控权重矩阵。
- Top-2 选取从 8 个得分中挑出最大的两个,例如专家 3 和专家 7。
- 局部 Softmax 归一化只对选中的两个得分做指数归一化,得到最终权重 \(p_1, p_2\),它们之和为 1。
- 加权求和输出 = \(p_3 \times E_3(x) + p_7 \times E_7(x)\)。
专家并行
医院扩建后,8 个专科科室散落在不同楼层。患者从挂号处到科室之间,需要经过走廊、电梯、传送带。如果所有科室都在同一层,患者按个号就能到;但如果科室分布在多台设备上,患者(token)就必须在设备之间“搬来搬去”——这个搬运动作在分布式系统中叫 All-to-All 通信。
把不同专家放到不同 GPU 上、并行执行的模式,就是专家并行(Expert Parallelism,EP)。在混合并行策略中,通常先做张量并行(TP)把注意力层切开,再做专家并行把 8 个专家分配到不同设备。每个 GPU 只维护自己负责的那几位专家的权重,前向过程中,经过路由决策后,token 通过 All-to-All 集体通信被送到目标专家所在的设备,专家计算完成后再通过 All-to-All 把结果送回原设备。
专家并行的核心收益是显存均摊。一个 47B 参数的模型单卡根本装不下,但若将 8 个专家分配到 8 张 GPU,每张卡只需要存储 1/8 的专家权重,配合 ZeRO 之类的显存优化技术,就能在有限资源下训练或推理超大模型。Mistral 家族在开源社区广受欢迎,一个重要原因正是其 MoE 架构天然适合多卡并行部署——社区开发者轻松用两张 A100 就能运行 Mixtral 8x7B 的推理服务。
- 专家数量 \(E\)参与分发的专家总数,Mixtral 每层 8 个专家。
- 批次大小 \(B\)一批次中输入 token 的总数,决定通信的“包裹量”。
- 隐藏维度 \(D_{\text{hidden}}\)每个 token 向量的维度,决定每个“包裹”的大小。
- 通信 vs 计算通信量随 \(E \times B \times D\) 线性增长。当模型足够大、单卡放不下时,EP 的通信开销远小于把整个模型放在单卡上的显存瓶颈,因此被广泛采用。
负载均衡
想象分诊台设计得不够好的场景:某个热门专家口碑极好,所有患者都涌向他,导致这位专家门口排起长龙,而其他七位专家却闲着喝咖啡。这不仅浪费医疗资源,更严重的是——那位热门专家的计算量成了系统瓶颈,整体吞吐量被单个专家拖垮。在 MoE 训练中,这种现象叫“路由坍缩”:所有 token 都往同一两个专家挤。
Mixtral 的应对之策是给训练目标加一项辅助负载均衡损失。它统计每个专家被选中的频率 \(f_i\) 和平均路由概率 \(P_i\),二者的乘积在理想情况下应该均匀分布。如果某些专家频率过高或概率过偏,辅助损失就会变大,模型在训练时就会同时优化主任务和负载均衡,让门控网络学会“分流”。
除了辅助损失,Mixtral 还引入了专家容量(Capacity Factor)和令牌丢弃(Token Dropping)机制。每个专家每批最多处理容量上限数量的 token,超出的 token 会被丢弃(计算中直接跳过)。容量因子设为 1.25 时,大约 5% 的 token 可能被丢弃。这个机制像分诊台给每个专家设置“最大接诊量”:超出部分只能放弃或排队,避免情绪化拥塞拖垮全局。正是这层层保护,让 Mixtral 在长达数万亿 token 的训练中保持稳定。
- 频率 \(f_i\)第 \(i\) 个专家在整批 token 中被选中的比例。
- 平均概率 \(P_i\)所有选中专家 \(i\) 的 token 的路由概率平均值。
- 乘积 \(f_i \cdot P_i\)两项相乘后,专家越热门,乘积越大;所有专家乘积之和 \(\sum f_i P_i\) 在均匀分布时取最小值。
- 系数 \(\alpha\)负载均衡损失的权重,Mixtral 中通常取 0.01,过大会干扰主任务,过小则起不到均衡作用。
GShard对比
Google 的 GShard 是 MoE 架构的经典前辈,理解 Mixtral 与它的差异,就像对比两家医院不同的管理制度。GShard 采用的是 Top-1 路由:分诊台只把患者派给得分最高的一个专家,简单高效,但“单专家”没有容错空间。Mixtral 则采用 Top-2,增加了冗余与稳定性,是两者最核心的设计分歧。
GShard 与 Mixtral 的差异体现在多个层面:首先是路由策略,GShard 的 Top-1 计算量更少,但专家利用率低、易出现路由偏差;Mixtral 的 Top-2 让更多专家参与训练,梯度信号更丰富。其次是负载均衡机制,GShard 使用单独的辅助分类器来均衡专家使用率,Mixtral 则将均衡损失直接嵌入训练目标。第三是规模策略,GShard 最初是为机器翻译的超大规模(6000 亿参数)设计的,而 Mixtral 8x7B 定位在单机多卡可部署的开源模型。
从架构演进的角度看,Mixtral 并非简单复刻 GShard,而是在稀疏 MoE 的通用框架下做了三个明智的本地化改进:将 Top-1 换成 Top-2、把辅助损失与主损失统一、以及将专家数量设计为 8 以匹配主流 8 卡 GPU 服务器。这些设计让 MoE 从谷歌的“巨无霸实验室产物”变成社区可复现、可微调、可部署的实用架构,也直接启发了后来的 Mixtral 8x22B、DeepSeek-MoE 等系列模型,成为开源大模型架构史上承前启后的关键一环。
- GShard 路由只保留得分最高的专家,其余专家权重置零。
- Mixtral 路由保留得分最高的两位专家并重新归一化。
- Top-1 的代价单专家若是次优选择,输出损失无法挽回。
- Top-2 的收益两个专家的加权输出更平滑,训练梯度也同时覆盖两个专家。
AI 应用场景
长文本高效推理服务
阶段:模型推理与部署优化
解决的问题:传统全量注意力在处理长文档(如法律文书、数年财报)时,需要为每个请求存储全量的 KV cache,显存开销随输入长度线性甚至平方级膨胀,单卡无法承载长序列服务。SWA 将 KV cache 限制在窗口内,显著降低显存占用,让 7B 模型在消费级显卡上也能处理长文本。
具体案例:一家法律科技公司用 Mistral 7B 搭建合同审查服务,客户上传 200 页的合同 PDF。SWA 使得模型每生成一个 token 只需保留最近 4096 个 token 的 KV cache,GPU 显存占用稳定在 16GB 以内,单张 A100 可以同时承载 20 路并发请求,比同规模稠密模型的吞吐量提升约 3 倍。
低成本大规模 MoE 模型部署
阶段:模型训练与推理部署
解决的问题:企业想拥有 100B 级模型的能力,但 GPU 预算只有 8 张卡。稠密大模型要么装不下,要么推理延迟不可接受。Mixtral 8x7B 的稀疏 MoE 特性让每个 token 只激活 13B 参数,总参数 47B 却能用接近 13B 模型的速度运行。
具体案例:一家智能客服公司需要 24 小时在线的高质量对话模型。他们部署 Mixtral 8x7B 并使用专家并行,将 8 个专家分布在 8 张 A100 上,配合 all-to-all 通信优化,单次推理延迟控制在 200ms 内。路由机制使得不同行业的知识自然分散到不同专家中,配合负载均衡损失微调后,客服分流准确率提升了 15%。
MoE 模型训练调优
阶段:模型预训练与微调
解决的问题:MoE 模型训练时最头疼的就是路由坍缩——所有数据都流向少数专家,导致大量参数从未被激活,模型表达能力下降。通过负载均衡辅助损失和 Top-2 路由,可以让训练过程稳定且参数利用率高。
具体案例:某大模型创业公司在从头训练一个 20B 参数的中文 MoE 模型。他们在每层 MoE 中设置 16 个专家,Top-2 激活 + α=0.01 的负载均衡损失。训练过程中监测每个专家的激活频率,发现第 5 个专家始终被高频调用,于是动态调高其容量因子并增加随机噪声,最终将专家使用率的标准差从 0.18 降到 0.06,模型困惑度下降 8%。
Python 演示
import torchimport torch.nn as nnimport torch.nn.functional as F class Expert(nn.Module): """单个专家网络:两层全连接 + GELU 激活""" def __init__(self, d_model: int, d_ff: int): super().__init__() self.w1 = nn.Linear(d_model, d_ff) self.w2 = nn.Linear(d_ff, d_model) self.load_count = 0 # 统计被调用的次数 def forward(self, x: torch.Tensor) -> torch.Tensor: self.load_count += x.shape[0] h = F.gelu(self.w1(x)) return self.w2(h) class SparseMoE(nn.Module): """稀疏MoE层:门控打分 + Top-2路由 + 加权求和""" def __init__(self, d_model: int, n_experts: int, top_k: int = 2): super().__init__() self.experts = nn.ModuleList( [Expert(d_model, d_model * 2) for _ in range(n_experts)] ) self.gate = nn.Linear(d_model, n_experts) self.top_k = top_k def forward(self, x: torch.Tensor) -> torch.Tensor: # 1. 门控网络对每个 token 计算与所有专家的匹配分数 scores = self.gate(x) # [B, n_experts] probs = F.softmax(scores, dim=-1) # 2. 选取 Top-2 专家并在选中的专家间重新归一化 top_probs, top_ids = torch.topk(probs, self.top_k, dim=-1) top_probs = top_probs / top_probs.sum(dim=-1, keepdim=True) # 3. 逐 token 完成双专家加权求和 final = torch.zeros_like(x) B = x.shape[0] for b in range(B): for k in range(self.top_k): e_idx = top_ids[b, k].item() w = top_probs[b, k].item() final[b] += w * self.experts[e_idx](x[b:b + 1])[0] return final if __name__ == "__main__": torch.manual_seed(42) d_model, n_experts, top_k = 16, 4, 2 moe = SparseMoE(d_model, n_experts, top_k) x = torch.randn(8, d_model) # 8 个 token out = moe(x) print("输出形状:", out.shape) for i, exp in enumerate(moe.experts): print(f"专家 {i} 被调用 {exp.load_count} 次") print("Top-2 路由权重示例:", moe.gate(x))
self.experts = nn.ModuleList([...])初始化 4 个专家网络,每个专家是独立的 FFN,类比医院里的 4 个专科诊室。self.gate = nn.Linear(d_model, n_experts)门控网络:输入 token 向量,输出与所有专家的匹配分数。probs = F.softmax(scores, dim=-1)分数转概率,相当于分诊台对每个专家按匹配程度打分。top_probs, top_ids = torch.topk(probs, self.top_k, dim=-1)取出概率最高的两位专家及其权重,这是 Top-2 路由的核心操作。top_probs = top_probs / top_probs.sum(...)对选中专家的权重重新归一化,使之和为 1。final[b] += w * self.experts[e_idx](...)[0]每个 token 的最终输出 = 专家1 输出 × 权重1 + 专家2 输出 × 权重2。self.load_count += x.shape[0]统计每个专家处理过的 token 数,用来检查负载是否均衡。
常见误区
误区SWA 把注意力限制在窗口内,模型就完全无法捕捉长距离依赖了。窗口外的关键信息被永久忽略,长文本理解能力必然大幅下降。
正解SWA 通过层堆叠实现“接力传播”——每层窗口让信息向邻居扩散一步,32 层堆叠后最远 token 的信息已经沿着窗口链传遍整个序列。Mistral 7B 还特意在两层用 8192 窗口捕捉长依赖。类比来说,虽然每个医生只看最近 4 天病历,但通过交班记录夹,一个月的关键信息都能逐级传达到位。
为何常见:人们容易用“单层视角”理解模型,忽略了 Transformer 深度堆叠的累积效应。
误区既然叫 8x7B,推理时需要加载全部 47B 参数,因此显存需求是 7B 模型的 6-7 倍,消费级显卡根本跑不动。
正解确实要加载全部 47B 权重到显存(约 90GB+),但每一层的 MoE 计算时只激活 2 个专家。推理的计算量只相当于 13B 稠密模型,速度比同等参数量的稠密模型快得多。用 4 张 24GB 的 4090 或 2 张 A100 就能跑起来,社区甚至能在单张 80GB A100 上完成量化推理。
为何常见:"8x7B"的字面印象让人以为它是 8 个完整 7B 模型的堆叠,而忽略了专家只是 FFN 层且共享注意力。
误区Top-2 总是比 Top-1 好,Top-1 路由是过时的低效设计,Mixtral 用 Top-2 是全面碾压。
正解Top-2 在表达力和容错性上确实更强,但也带来近 2 倍的路由计算和 All-to-All 通信开销。在超大模型(千亿级)上,Top-1 的通信量更小、并行效率更高——GShard、Switch Transformer 等大规模系统选择 Top-1 是权衡后的结果。适合的才是最好的。
为何常见:看到论文对比指标时只注意效果差异,忽略了计算成本、通信效率等工程维度。
误区专家并行和数据并行是一回事,都是把整个模型复制到每张 GPU 上,不同 GPU 处理不同数据。
正解数据并行每张卡都有一份完整模型副本,而专家并行把不同专家放到不同 GPU 上,每张卡只存自己负责的专家权重。token 需要经过 All-to-All 通信被送到目标专家所在设备。若把 8 个专家分散到 8 张卡,单卡只存储 1/8 的专家参数,这正是 MoE 能支撑超大模型的关键。
为何常见:习惯了 DDP/FSDP 的实践者容易混淆“数据切分”和“模型切分”,EP 实际上属于模型并行的一种细化设计。
误区负载均衡辅助损失的系数 α 设得越大,专家利用率越均匀,模型就越好。
正解负载均衡损失本质是“正则项”,过大的 α 会让门控网络过度追求平均,反而抹平了专家的专业化分工——所有专家都差不多,就失去了 MoE 的意义。Mixtral 使用 α=0.01,虽然负载会有一定偏差,但专家们能形成明确分工。负载完全均匀时,模型的能力反而下降。
为何常见:把“均匀”当成目标本身,而没有意识到“不均”恰恰是专家分工和路由选择的自然结果。
面试题
Q1. Mistral 7B 的滑动窗口注意力默认窗口大小是多少?
- A.1024 个 token
- B.4096 个 token← 正确答案
- C.8192 个 token
- D.16384 个 token
答案:B。Mistral 7B 默认滑动窗口大小为 4096 个 token,其中第 15 和 31 层扩展为 8192。1024 太小不足以捕捉常见上下文,8192 是两层专用窗口而非全局默认,故选 B。
Q2. 滑动窗口注意力相比全量注意力的时间复杂度是多少?
- A.O(n²) 降到 O(n·w)← 正确答案
- B.O(n²) 降到 O(n)
- C.O(n·w) 升到 O(n²)
- D.O(n) 升到 O(n·log n)
答案:A。全量注意力计算所有 token 对的相关性,复杂度为 O(n²);SWA 每个 token 只计算与最近 w 个 token 的关系,总复杂度为 O(n·w)。注意 O(n) 只有在 w 为常数时才近似成立,且推理时的 KV cache 复杂度也是 O(n·w),故选 A。
Q3. Mixtral 8x7B 中每个 token 激活的专家数量是?
- A.1 个
- B.2 个← 正确答案
- C.7 个
- D.8 个
答案:B。Mixtral 8x7B 采用 Top-2 路由,每个 token 在所有 8 个专家中只激活得分最高的 2 个。Top-1 是 GShard 的方案,激活 8 个就变成了稠密模型,失去了稀疏计算的收益。故选 B。
Q4. 在自回归推理时,滑动窗口注意力的 KV cache 大小约为多少?
- A.O(n × d),n 为序列总长
- B.O(w × d),w 为窗口大小← 正确答案
- C.O(n² × d)
- D.O(w² × d)
答案:B。SWA 只需要保留窗口内 token 的 key 和 value,因此 KV cache 从全量注意力的 O(n×d) 降为 O(w×d),且不随序列长度增长。这使长文本推理的显存占用保持稳定,故选 B。
Q5. 关于稀疏 MoE 架构,以下说法正确的有?
- A.总参数量远大于实际激活参数量← 正确答案
- B.每个 token 只激活部分专家← 正确答案
- C.所有专家必须分布在单张 GPU 上
- D.门控网络负责路由决策← 正确答案
答案:ABD。稀疏 MoE 的核心就是“大容量、小激活”:总参数多,但每个 token 只激活 Top-2 等少量专家(A、B 正确)。门控网络计算每个专家的匹配分数并完成路由(D 正确)。专家完全可以分布到多卡(专家并行),不是必须单卡(C 错误)。
Q6. 专家并行(EP)中,token 从一台设备传到另一台设备依赖什么通信机制?
- A.All-Reduce
- B.All-to-All← 正确答案
- C.Point-to-Point
- D.Broadcast
答案:B。All-to-All 是 EP 的核心通信原语,它让每台设备把 token 发给对应专家所在的设备,同时接收别的设备发来的 token。All-Reduce 用于梯度同步(如 DDP),Point-to-Point 是基础原语但不足以表示全员互联,故选 B。
Q7. 关于 RoPE 旋转位置编码,正确的说法是?
- A.它通过旋转矩阵注入绝对位置← 正确答案
- B.两个 token 的内积自然包含相对位置差← 正确答案
- C.它与绝对位置完全无关,无法区分位置顺序
- D.它天然支持一定程度的长度外推← 正确答案
答案:ABD。RoPE 用旋转角度表示位置,向量按角度旋转后,内积正比于 cos(角度差),即相对位置(A、B 正确)。由于角度差编码的是相对关系,训练长度外的位置也能计算(D 正确)。C 明显错误——没有位置信息就无法区分语序。
Q8. 与 GShard 的 Top-1 路由相比,Mixtral 的 Top-2 路由带来的主要优势是?
- A.计算量减半
- B.冗余性增强,路由更稳定← 正确答案
- C.不需要门控网络
- D.负载自动均衡
答案:B。Top-2 比 Top-1 多激活一个专家,计算量翻倍而非减半(A 错);门控网络依然存在(C 错);负载均衡需要额外的辅助损失,不会自动实现(D 错)。Top-2 的真正优势是“双专家冗余”——即使首选专家次优,第二专家也能补位,梯度同时流向两个专家使训练更稳定。故选 B。
Q9. 负载均衡辅助损失 \(L_{aux} = \alpha \cdot N \cdot \sum f_i P_i\) 中系数 α 过大会导致什么?
- A.专家分化加剧,各专家越来越专精
- B.门控过度追求均匀,专家专业化退化← 正确答案
- C.训练速度大幅提升
- D.模型参数显著减少
答案:B。α 过大会让负载均衡损失压过主任务损失,门控网络把 token 平均分配给所有专家,导致专家失去专业化分工——每个专家都处理相似任务,MoE 的多样性收益消失,模型能力下降。α 过小则负载失衡,过大则分工退化,需要取合适的平衡值,故选 B。
Q10. 关于 Mixtral 8x7B 与 Mistral 7B 的关系,正确的说法有?
- A.Mixtral 总参数量约为 Mistral 的 6-7 倍← 正确答案
- B.每个 token 实际激活参数量约为 13B← 正确答案
- C.Mixtral 的每个专家都包含完整的注意力层
- D.两者都采用滑动窗口注意力← 正确答案
答案:ABD。Mixtral 8x7B 是 Mistral 7B 的 MoE 扩展版,总参数约 47B,约是 7B 的 6-7 倍(A 对);每个 token 激活 2 个专家,约 13B 参数(B 对);两者都继承 SWA 设计(D 对)。但 MoE 替换的只是 FFN 前馈层,注意力层是共享的,专家本身不含注意力(C 错)。