Transformers 中的 Cohere2 MoE 架构全解析:Command A+ 的混合注意力与稀疏专家实现指南
导读
本文聚焦 🤗 Transformers 仓库中 cohere2_moe 这一模型家族,它对应 Cohere 于 2026 年 5 月 20 日贡献的 Command A+(MoE)语言模型后端。阅读本文后,你将掌握:Cohere2MoeConfig 中每一条关键配置的真实语义与默认值(含滑窗/全注意力交替模式、共享专家、路由专家等 MoE 设计)、Cohere2MoeModel 与 Cohere2MoeForCausalLM 的内部结构与前向流程,以及如何通过 AutoModelForCausalLM 完成推理与文本生成。全文基于 模型文档、配置实现 与 建模实现 逐行核对,确保每个结论都可回溯到仓库源码。
模型总览:Command A+ 的三项核心设计
根据 模型文档 的说明,Command A+ 是一个 Mixture-of-Experts(MoE) 解码器语言模型,其架构包含三个鲜明特征:
- 混合注意力模式(hybrid attention):网络层并非全部使用全注意力,而是由 sliding window attention(滑窗注意力) 层与 full attention(全注意力) 层按固定周期交替排布。这一设计在保留长程依赖建模能力的同时,显著压缩每个 token 实际参与计算的注意力范围。
- 共享专家 + 路由专家(shared & routed experts):在 MoE 层内部,一部分固定激活的共享专家承担所有 token 的通用特征提取,路由专家则由 Router 按 token 动态挑选,兼顾容量与稀疏计算。
- 超大上下文窗口:配合滑窗注意力与旋转位置编码(RoPE),模型可支持非常长的上下文序列(该点同时得到测试文件中"超出滑窗长度继续生成"用例的验证,见 tests/models/cohere2_moe/test_modeling_cohere2_moe.py)。
在仓库中,该模型的官方标识为 CohereLabs/command-a-plus-05-2026:这一 checkpoint 标注同时出现在 配置类 docstring(@auto_docstring(checkpoint="CohereLabs/command-a-plus-05-2026"))与 集成测试的 model_id 中。需要注意的是,从测试代码可以观察到,该 checkpoint 以 Cohere2VisionForConditionalGeneration 多模态外壳发布,语言主干即 cohere2_moe——因此测试通过"仅喂文本输入"来验证文本后端,而无需单独下载纯文本版本权重(见 测试注释)。
Cohere2MoeConfig:全部配置项与默认值详解
Cohere2MoeConfig 的完整定义位于 configuration_cohere2_moe.py,其 model_type 为 "cohere2_moe",keys_to_ignore_at_inference 为 ["past_key_values"]。下表汇总了该类的全部公开配置属性及其代码默认值:
| 配置项 | 默认值 | 说明 |
|---|---|---|
vocab_size |
256000 |
词表大小 |
hidden_size |
8192 |
隐藏维度 |
intermediate_size |
22528 |
SwiGLU MLP 中间维度 |
num_hidden_layers |
40 |
解码器层总数 |
num_attention_heads |
64 |
注意力头数 |
num_key_value_heads |
None(=注意力头数) |
GQA 键值头数,__post_init__ 中回退为 num_attention_heads |
head_dim |
128 |
每个注意力头的维度 |
hidden_act |
"silu" |
激活函数 |
max_position_embeddings |
8192 |
最大序列长度 |
initializer_range |
0.02 |
权重初始化标准差 |
layer_norm_eps |
1e-5 |
LayerNorm epsilon(当 rms_norm_eps 未设置时生效) |
rms_norm_eps |
None |
RMSNorm epsilon;一旦设置,层归一化改用 RMSNorm 变体 |
attention_bias |
False |
注意力投影是否带 bias |
attention_dropout |
0.0 |
注意力 dropout 概率 |
sliding_window |
4096 |
滑窗注意力的窗口大小 |
logit_scale |
0.0625 |
输出 logits 缩放因子 |
rope_theta |
10000.0 |
RoPE 基频 |
rope_scaling |
None |
RoPE 缩放配置字典 |
num_experts_per_tok |
2 |
每个 token 选中的路由专家数(top-k) |
num_experts |
8 |
路由专家总数 |
num_shared_experts |
0 |
共享专家数量 |
shared_expert_combination_strategy |
"average" |
共享专家结果合并策略,仅允许 ['average', 'sum'] |
expert_selection_fn |
"softmax" |
Router 的专家选择函数,仅允许 "softmax" 或 "sigmoid" |
norm_topk_prob |
True |
使用 sigmoid 时是否对 top-k 概率做归一化 |
layer_types |
None(自动推导) |
每层的注意力模式,取值 "full_attention" / "sliding_attention" |
mlp_layer_types |
None(自动推导) |
每层的 MLP 模式,取值 "dense"(普通 MLP)/ "sparse"(MoE) |
prefix_dense_sliding_window_pattern |
1 |
前缀稠密层的滑窗排布周期 |
prefix_dense_intermediate_size |
None(回退到 intermediate_size) |
前缀稠密 MLP 层的中间维度 |
sliding_window_pattern |
4 |
滑窗/全注意力交替周期 |
pad_token_id / bos_token_id / eos_token_id |
0 / 5 / 255001 |
特殊 token id |
tie_word_embeddings |
True |
是否共享输入/输出 embedding 权重 |
如何理解混合注意力排布(layer_types 与 sliding_window_pattern):从 配置 __post_init__ 可以看到,当用户未显式传入 layer_types 时,代码会按如下规则自动生成:若配置中携带 first_k_dense_replace(旧式写法,默认 0),前 k 层被当作"前缀稠密层",按 prefix_dense_sliding_window_pattern(默认 1,即每层都滑窗、周期内无全注意力)决定滑窗/全注意力分布;其余层则按 sliding_window_pattern(默认 4)决定:满足 (i + 1) % 4 != 0 的层使用 sliding_attention,可被 4 整除的位置使用 full_attention。同理,mlp_layer_types 缺省时,前 k 层为 "dense",其余为 "sparse"。
归一化层的二选一逻辑:这是该模型与其他 Llama 系模型的一个关键差异。查看 解码器层构造:当 rms_norm_eps 不为 None 时使用 RMSNorm;否则退化为带均值减除的 Cohere2 LayerNorm(见 Cohere2MoeLayerNorm)。该"按 rms_norm_eps 是否设置来选归一化器"的语义,在 modular 定义 中保持一致。
使用方式(官方 doctest)
配置文档提供了最直接的初始化示例,这里将三类 API 组合展示:
from transformers import Cohere2MoeModel, Cohere2MoeConfig
# 初始化一个 Cohere2Moe 配置(使用上面的默认值)
configuration = Cohere2MoeConfig()
# 从配置初始化一个未加载权重的随机模型(需下载或已安装依赖)
model = Cohere2MoeModel(configuration) # doctest: +SKIP
# 访问模型实际使用的配置(可查看 __post_init__ 推导出的 layer_types 等)
configuration = model.config # doctest: +SKIP
从配置到权重:Cohere2MoeModel 基座前向流程
Cohere2MoeModel(见 modeling 实现)是一个标准解码器主干,由 embed_tokens、40 层 Cohere2MoeDecoderLayer、norm 与 Cohere2MoeRotaryEmbedding 组成。其前向流程的几个关键点:
- 混合掩码的并行构造:当传入的
attention_mask不是 dict 时,模型会同时构造两种因果掩码存入字典:create_causal_mask(全注意力用)与create_sliding_window_causal_mask(滑窗注意力用),然后在逐层循环中按layer_types[i]取出对应的掩码喂给第 i 层(源码)。因此滑窗层与全注意力层在推理时使用不同的 mask,这正是混合注意力的运行时落点。 past_key_values缓存:use_cache为True且未提供缓存时自动构建DynamicCache,生成阶段加速解码。- 输出类型差异:基座返回的是
MoeModelOutputWithPast而非普通BaseModelOutputWithPast。注释明确写道 "only diff with Cohere2 is the output type, we need MoE"(源码),说明该模型被刻意设计为 Cohere2 密集模型的 MoE 超集,可输出 MoE 特有的router_logits。
从源码结构看,Cohere2MoeModel、Cohere2MoeForCausalLM 等均通过 modular 生成体系产出:其"母本"是 modular_cohere2_moe.py,分别继承 Cohere2 的注意力/解码器/RoPE 基类、Mixtral 的 MixtralExperts 专家权重实现,以及 Llama 的 RMSNorm。这意味着该模型是 Transformers 内部模块复用的典型样例——注意力部分直接复用 cohere2,专家权重直接复用 mixtral。
解码器层:并行残差结构
查看 Cohere2MoeDecoderLayer,其前向与主流 LLM 不同:先做 input_layernorm,然后对归一化后的 hidden_states 同时执行 self_attn 与 mlp,最后一次性加回残差:
residual = hidden_states
hidden_states = self.input_layernorm(hidden_states)
hidden_states_attention, _ = self.self_attn(hidden_states, ...)
hidden_states_mlp = self.mlp(hidden_states)
hidden_states = residual + hidden_states_attention + hidden_states_mlp
即注意力与 MLP 共享同一份归一化输入,属于"并行子层"而非串行堆叠。同时该层继承 GradientCheckpointingLayer,且类内没有 LayerNorm bias,与配置默认值相互印证。
MoE 专家机制的运行时原理
MoE 逻辑由三个组件协同完成(modeling 源码):
Cohere2MoeExperts(专家权重):参考 Mixtral 的 3D 参数组织方式,gate_up_proj形状为(num_experts, 2 * intermediate_size, hidden_size),down_proj形状为(num_experts, hidden_size, intermediate_size)。前向时先按one_hot计算出被命中的专家集合,仅对命中的专家做线性投影与act_fn(gate) * up的 SwiGLU 运算,最后用index_add_按 top-k 权重累加回结果(源码)。由于该模块带@use_experts_implementation装饰器,理论上可被厂商专家内核实现替换。Cohere2MoeTopKRouter(路由器):权重形状(num_experts, hidden_size),对每个 token 做线性打分并torch.topk选出num_experts_per_tok个专家。随后按expert_selection_fn分派:softmax在 top-k 分数上做 softmax;sigmoid先做 sigmoid,再根据norm_topk_prob决定是否对选中分数做归一化(源码)。注意 softmax 分支在 float32 下计算后回投回输入 dtype。Cohere2MoeSparseMoeBlock(稀疏块):把 3D 序列展平后交给 router 与 experts。当num_shared_experts > 0时,额外构造一个intermediate_size = config.intermediate_size * num_shared_experts的共享Cohere2MoeMLP,对所有 token 无差别计算,再按shared_expert_combination_strategy合并:"sum":routed + shared"average":(routed + shared) / 2- 其它取值直接抛
ValueError(源码)
配置默认 num_shared_experts = 0,即默认架构不启用共享专家;需要时按上文参数开启。由于每个 token 只会激活 num_experts_per_tok(默认 2)个路由专家,计算量远低于同等参数量的密集模型——这正是 MoE 稀疏激活的价值所在。
Cohere2MoeForCausalLM:文本生成与 logit 缩放
Cohere2MoeForCausalLM(modeling 源码)在基座之上追加了 lm_head(无 bias,尺寸 hidden_size → vocab_size),并将 _tied_weights_keys 声明为 {"lm_head.weight": "model.embed_tokens.weight"},配合默认 tie_word_embeddings=True 实现权重共享。
logit 缩放(logit_scale):模型的输出 logits 会乘以配置中的 logit_scale(默认 0.0625)。这一缩放对生成分布影响明显,modeling 前向 中有直接实现;相应地,模型测试 Tester 在训练型用例中将 logit_scale 调为 1.0,并注释说明这是为了让 loss 在 test_training_overfit 中足够快收敛——两者互相印证该参数的实际作用。当传入 labels 时会计算 CE loss;当传入 logits_to_keep 时只对最后若干位置计算 logits,用于训练时节省显存。返回类型为 MoeCausalLMOutputWithPast,包含 loss、logits、past_key_values 与 MoE 特有的 router_logits。
该类继承 GenerationMixin,可直接调用 .generate()。模型文档中给出的生成示例流程如下(doctest 占位 checkpoint 名请按实际 Hub 名称替换):
from transformers import AutoTokenizer, Cohere2MoeForCausalLM
model = Cohere2MoeForCausalLM.from_pretrained("你的-cohere2_moe-checkpoint")
tokenizer = AutoTokenizer.from_pretrained("你的-cohere2_moe-checkpoint")
prompt = "Hey, are you conscious? Can you talk to me?"
inputs = tokenizer(prompt, return_tensors="pt")
# Generate
generate_ids = model.generate(inputs.input_ids, max_length=30)
tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
通过 Auto API 使用与并行/注意力后端支持
cohere2_moe 已接入自动映射体系,无需显式导入模型类即可加载:
AutoConfig映射见 auto_mappings.py(("cohere2_moe", "Cohere2MoeConfig"));AutoModel/AutoModelForCausalLM映射见 modeling_auto.py 与 modeling_auto.py(分别为Cohere2MoeModel与Cohere2MoeForCausalLM)。
from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("CohereLabs/command-a-plus-05-2026")
model = AutoModelForCausalLM.from_pretrained(
"CohereLabs/command-a-plus-05-2026",
torch_dtype="auto",
device_map="auto",
)
此外,从 Cohere2MoePreTrainedModel 声明 与配置中的三套并行计划可以看出该模型的工程化程度:
- 注意力后端:
_supports_flash_attn、_supports_sdpa、_supports_flex_attn均为True,且支持_supports_attention_backend;实际注意力函数经ALL_ATTENTION_FUNCTIONS.get_interface分发(源码),并支持_can_compile_fullgraph = True(torch.compile 全图编译)与梯度检查点。 - 张量并行(TP):
base_model_tp_plan对注意力与 MoE 的q/k/v/gate/up/down投影分别做了 colwise/rowwise 切分(配置)。 - 流水线并行(PP):
base_model_pp_plan定义了embed_tokens → layers → norm的阶段 IO(配置)。 - 专家并行(EP):
base_model_ep_plan将gate标为ep_router、专家投影标为grouped_gemm、专家本体标为moe_tp_experts,属于面向 MoE 大模型部署的 expert-parallel 原生规划(配置)。Cohere2MoeForCausalLM亦声明了_tp_plan、_pp_plan与_fsdp_plan(FSDP 下lm_head保留完整权重),见 源码。
测试套件(test_modeling_cohere2_moe.py)还验证了另外两点工程事实:其一,支持在 eager / sdpa / flash_attention_2 三种后端下超过滑窗长度继续生成(用例 test_generation_beyond_sliding_window,通过覆盖配置的 sliding_window 为 1024 并喂入超过该长度的输入来验证,见 测试);其二,模型在 bf16/fp16 下与期望文本完全一致(集成测试用例),可作为自建部署的参考基准。
总结:何时使用 cohere2_moe 及阅读延伸
cohere2_moe 在 Transformers 生态中的定位十分清晰:它是 Command A+ 的语言主干实现,核心价值在于提供(1)滑窗/全注意力混合的长上下文方案、(2)带共享专家选项的 MoE 稀疏计算、(3)开箱即用的 TP/PP/EP 并行计划与多注意力后端。当你需要研究 MoE 与混合注意力在工程实现上的完整样例,或以 Cohere2VisionForConditionalGeneration 形式加载 Command A+ 权重并只跑文本任务时,本模型即是答案。
建议延伸阅读以下仓库内资料以获得完整证据链:
- 模型官方文档:三件套类文档(Config / Model / ForCausalLM)的权威入口;
- configuration_cohere2_moe.py:全部默认值、
layer_types/mlp_layer_types推导逻辑与并行计划; - modeling_cohere2_moe.py:RMSNorm/LayerNorm 切换、并行残差解码层、路由器与专家前向、logit 缩放;
- modular_cohere2_moe.py:继承自 Cohere2 / Mixtral / Llama 的模块复用关系,是理解代码生成结构的入口;
- test_modeling_cohere2_moe.py:含滑窗越界生成与 fp16/bf16 集成验证的测试套件。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00