Meta 发布 Muse Spark Open:816B 参数多模态混合专家模型
Meta 正式推出开源权重模型 Muse Spark Open。作为 Muse 系列中迄今能力最强的模型,Muse Spark Open 采用混合专家(MoE)架构,总参数量约为 8160 亿,每个 token 激活约 420 亿参数。该模型支持文本、图像、音频和视频输入,统一输出文本,并拥有高达 100 万 token 的上下文窗口。

Muse Spark Open 专为代理编码任务优化,能够阅读代码库、编写与调试代码以及调用工具。其多模态特性允许开发者通过同一接口处理截图、语音笔记等多种输入形式。继此前发布的较小规模密集模型 Muse Glimmer 之后,Spark Open 引入了更大规模的 MoE 架构。
核心规格与架构细节
| 特性 | Muse Spark Open |
|---|---|
| 模型规模 | ~816B 总参数;每 token 激活 ~42B 参数 |
| 专家路由 | 每个 MoE 层包含 256 个专家,每 token 选择 8 个专家 |
| 输入模态 | 文本、图像、音频、视频 |
| 输出模态 | 文本 |
| 上下文窗口 | 最高 1M tokens |
| 检查点格式 | BF16 和 NVFP4 |
相关模型仓库为 Muse-Spark-Open-816B-A42B 和 Muse-Spark-Open-816B-A42B-NVFP4。
Muse Spark Open 是 Muse 系列的全尺寸版本,与 8 月发布的本地运行友好型小模型 Muse Glimmer 共享相同的分词器和词汇表。其聊天模板基于 Glimmer 扩展而来。在架构上,输入嵌入和输出层均为约 1.66B 参数的矩阵。
混合专家(MoE)机制
语言模型主干由 62 层组成,隐藏维度为 8192。每层设有 128 个查询头和 16 个键值头(分组查询注意力),每个头维度为 64。注意力模块包含输出门和规范化层,并对查询和键进行 QK-norm 规范化。残差连接通过可学习的门控机制结合输入与输出,而非简单相加。
与 Muse Glimmer 使用密集前馈网络不同,Muse Spark Open 在每个层中替换为 MoE 块。每个 MoE 块包含 256 个专家,路由器为每个 token 动态选择 8 个专家。单个专家是一个前馈网络,维度从 8192 降至 4096 再升回 8192,并应用独立规范化。专家部分占据了模型约 97% 的参数。
尽管部署时需要容纳全部 256 个专家的内存(即 816B 参数规模),但推理速度接近 42B 参数模型。BF16 格式的检查点大小约为 1.5 TB。NVFP4 格式以 4 位精度存储参数,损失极小,特别适用于 NVIDIA Blackwell GPU。在 Transformer 框架下,BF16 版本可在 4 个节点(共 8 个 H200 GPU)上通过张量并行(TP=32)运行,而 NVFP4 版本可在单个 B200 节点上运行。
感知编码器
视觉编码器负责将图像和视频转换为语言模型的 token,参数规模为 1.8B,包含 50 层,隐藏维度 1536,16 个注意力头。它将图像划分为 14×14 的块,生成 4096 维特征。位置信息结合学习到的绝对嵌入和 2D RoPE。每层的 MLP 使用 LayerNorm 和 GELU。第 4 层及最后一层使用全注意力,其余层使用稀疏注意力。视频输入复用相同的编码器架构。
音频编码器
Muse Spark Open 通过专用音频编码器接收音频输入。音频被转换为 token,并在聊天模板中使用 <|audio|> 标记定位。编码器每 80 ms 输出一个音频 token,即每秒 12.5 个 token。例如,10 秒音频对应 125 个 token。编码器采用卷积金字塔结构,各阶段由不同 patch 尺寸的嵌入器和两个一维卷积块(kernel size 7, stride 1)组成,patch 尺寸分别为 [16, 6, 5, 4]。最终阶段后接 RMSNorm → 线性投影 → RMSNorm 模块。
长上下文支持
推理时的上下文窗口设定为 1M tokens(max_position_embeddings = 1,048,576),涵盖文本、图像、视频和音频 token。得益于分组查询注意力,KV 缓存相对较小。每个 token 在缓存中增加约 126,976 个数值(2 × 16 heads × 64 dims × 62 layers)。在 BF16 精度下,每个 token 约占 250KB,1M token 完整上下文约需 266GB 显存。
推理实现与支持
Transformers 库集成
Hugging Face Transformers 提供了 MuseSparkForConditionalGeneration 类用于多模态输入生成文本,以及 MuseSparkProcessor 用于预处理对话。处理器整合了分词器、图像/视频处理器、音频特征提取器和聊天模板。
可通过 DistributedConfig 配置并行策略:tp_size 定义密集层分布的设备数,ep_size 定义专家分布的设备数。
import os
from transformers import AutoModelForMultimodalLM, AutoTokenizer, DistributedConfig
distributed_config = DistributedConfig(
tp_size=int(os.environ["WORLD_SIZE"]),
ep_size=int(os.environ["WORLD_SIZE"]),
)
tokenizer = AutoTokenizer.from_pretrained("meta-models/Muse-Spark-Open-816B-A42B")
model = AutoModelForMultimodalLM.from_pretrained(
"meta-models/Muse-Spark-Open-816B-A42B",
distributed_config=distributed_config,
)
messages = [
{"role": "user", "content": "Explain in one sentence why the sky is usually blue."},
]
inputs = tokenizer.apply_chat_template(
messages,
reasoning_effort="medium",
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
).to(model.device).to(model.dtype)
input_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=2000)
纯文本推理
准备对话消息后,调用 processor.apply_chat_template 并设置相应参数。生成的新 token 解码时需排除输入前缀。处理器支持调节推理强度,将符号化等级(low/medium/high/xhigh)映射为整数值(16、64、256、512)。由于无法完全关闭推理功能,处理简单任务时建议保持 “low” 级别,或在系统提示中指定具体数值如 Reasoning strength: 1。
messages = [
{"role": "system", "content": "You should only answer with a number."},
{"role": "user", "content": "What is 17 * 23?"},
]
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
reasoning_effort="high",
).to(model.device).to(model.dtype)
output = model.generate(**inputs, max_new_tokens=2000)
generated_tokens = output[0][inputs["input_ids"].shape[1] :]
print(processor.decode(generated_tokens, skip_special_tokens=False))
图文混合推理
处理器自动扩展图像标记以匹配补丁 token 数量,并用边界 token 包裹,确保文本位置与视觉特征对齐。支持单条 prompt 中包含多个图像。
image_url = (
"https://huggingface.co/datasets/merve/vl-test-suite/"
"resolve/main/pills.jpg"
)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": image_url,
},
{
"type": "text",
"text": "Do any of the components in this supplement interact?",
},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
reasoning_effort="medium",
return_dict=True,
return_tensors="pt",
).to(model.device).to(model.dtype)
input_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=2000)
response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)
processor.parse_response(response)
视频推理
视频输入包含时间和视觉内容,处理器可处理带音频的视频(相比 Muse Glimmer 有所升级)。默认采样率为 2 FPS,上限 96 帧。可通过修改 processor.video_processor.fps 调整。降低采样率会节省内存和预填充延迟,但可能丢失事件间的时序细节。时间戳文本输入(如 (Time: 3.5s))需与视频对齐。启用音频传输需设置 load_audio_from_video=True。
使用 return_metadata=True 保存元数据以正确分配采样率。
import torch
messages = [
{
"role": "user",
"content": [
{
"type": "text",
"text": (
"Describe what happens in this video. "
"Use timestamps and include relevant speech or sounds."
),
},
{
"type": "video",
"url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/ramen.mp4"
},
],
}
]
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
load_audio_from_video=True,
return_metadata=True,
).to(model.device).to(model.dtype)
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
)
generated_ids = output_ids[:, inputs["input_ids"].shape[1] :]
response = processor.batch_decode(
generated_ids,
skip_special_tokens=True,
)[0]
print(response)
音频推理
音频编码器接收原始波形,处理器期望输入为 24 kHz 单声道音频,并将波形填充至 1,920 样本的整数倍(对应每 80ms 一个嵌入)。若采样率不同,需先重采样。可使用 transformers 中的 load_audio 工具,支持 torchcodec、librosa 或 torchaudio 后端。





