重磅发布 Muse Spark Open:Meta 开源前沿多模态混合专家模型
摘要
Meta 发布 Muse Spark Open,一个约 816B 总参数、42B 激活参数的开源多模态 MoE 模型,支持文本、图像、音频和视频输入,专为智能体式编程优化,上下文窗口达 100 万 token。
查看缓存全文
缓存时间: 2026/10/15 18:47
欢迎认识 Muse Spark Open:Meta 推出的开源权重前沿多模态混合专家模型
来源:https://huggingface.co/blog/meta-muse-spark-open
Muse Spark Open 是 Meta 推出的一款开源权重模型。这个混合专家(Mixture of Experts)模型将文本、图像、音频和视频整合到一个拥有约 8160 亿参数的模型中,每个 token 激活约 420 亿参数,上下文窗口最高可达 100 万 token。它以文本输出,为开发者提供了一个统一的接口,用于对不同类型的输入进行提问。
继 Muse Glimmer 之后,Muse Spark Open 在更大规模上引入了混合专家架构,是迄今为止美国最强大的开源权重模型。Meta 针对代理式编程(agentic coding)场景训练了 Muse Spark Open:阅读代码库、编写和调试代码,以及调用工具。它还能接受图像、音频和视频输入,因此同一个模型可以在处理你的代码时阅读截图、听语音备忘或观看屏幕录制。
本文将展示如何运行它、如何微调它,以及我们用它构建了什么。所有模型请前往此处查看。
总体能力与架构
Meta 将 Muse Spark Open 描述为一个面向编码优化的模型,在真实的开发者工作流上进行了训练,例如多文件重构和长时间的调试会话。Muse Spark Open 是一个以代理能力为核心的模型,能够在长时间任务中进行规划、执行、观察和自我纠正,包括使用图像浏览网页。
| 特性 | Muse Spark Open |
|---|---|
| 模型规模 | 总参数约 816B;每个 token 激活约 42B |
| 专家路由 | 每个 MoE 层 256 个专家;每个 token 选择 8 个 |
| 输入 | 文本、图像、音频和视频 |
| 输出 | 文本 |
| 上下文窗口 | 最高 100 万 token |
| 检查点格式 | BF16 和 NVFP4 |
检查点仓库为 Muse-Spark-Open-816B-A42B 和 Muse-Spark-Open-816B-A42B-NVFP4。
Muse Spark Open 是 Muse 系列模型的完整尺寸版本。Meta 于八月发布的 Muse Glimmer 是同一系列中的小型稠密模型,适合本地运行。两个模型使用相同的分词器和词表。聊天模板遵循 Muse Glimmer 的模板,并为新增模态添加了扩展。在 Muse Spark Open 中,输入嵌入和输出层是两个独立的矩阵,每个约 16.6 亿参数。
混合专家
语言模型有 62 层,隐藏维度为 8192。每层有 128 个查询头和 16 个键值头(分组查询注意力,Grouped-Query Attention)。每个头有 64 个维度。注意力块包含一个输出门控和一个输出归一化层。模型还对查询和键进行归一化(QK-norm)。每个块通过一个可学习的残差门控将输入和输出结合,而非简单相加。
Muse Glimmer 在每层使用一个稠密前馈网络。Muse Spark Open 用混合专家(MoE)块替代了这个稠密网络。每个 MoE 块有 256 个专家,路由器为每个 token 选择 8 个专家。每个专家是一个前馈网络,先从 8192 维投影到 4096 维,再投影回 8192 维,然后对其输出应用自己的归一化。专家持有约 97% 的总模型参数。每个 token 只运行 8 个专家,因此模型以约 420 亿参数计算每个 token。所有 256 个专家都保存在内存中,因此部署需要 8160 亿参数模型的内存,但运行速度接近 420 亿参数模型。
BF16 检查点以 safetensors 格式约 1.5 TB。NVFP4 检查点以 4 位精度存储参数,精度损失可忽略不计,专为 NVIDIA Blackwell GPU 设计。在 transformers 中,BF16 检查点需要跨 4 个节点、共 32 张 H200 GPU(张量并行 TP=32)运行,NVFP4 则可在单个 B200 节点上运行。如果你想部署 Muse Spark Open,请查看下方的 llama.cpp、vLLM 和 SGLang 部署方案。
感知编码器
感知编码器将图像和视频帧转换为语言模型的 token,与 Muse Glimmer 相同。该编码器有 18 亿参数、50 层、隐藏维度 1536、16 个注意力头。它将每张图像分割为 14×14 的图块,并生成 4096 维的特征。位置信息来自可学习的绝对嵌入和二维 RoPE。每层的前馈网络使用 LayerNorm 和 GELU。每隔四层和最后一层使用全注意力,其余层使用稀疏注意力。
Muse Glimmer 30B 使用了相同架构的编码器。设计遵循 Meta 的 Perception Encoder 工作。视频输入与图像走相同的编码器。
音频编码器
Muse Spark Open 通过其音频编码器接受音频输入。音频分词器将音频转换为 token,聊天模板用 <|audio|> token 标记音频位置。编码器每 80 毫秒输出一个音频 token,即每秒 12.5 个 token。因此,如果你有一段 10 秒的音频,输入的音频 token 数量为 125 个。
编码器本身是一个卷积金字塔,每个阶段由一个不同图块大小的 patch embedder 和 2 个 1D 卷积块(卷积核大小为 7,步幅为 1)组成。这些阶段按图块大小 [16, 6, 5, 4] 重复。在最后一个阶段的末尾,时间帧被送入一个由 RMSNorm → 线性投影 → RMSNorm 组成的最终块。
长上下文
推理时上下文窗口为 100 万 token。配置将 max_position_embeddings 设为 1,048,576。这包括与文本在同一窗口中的图像、视频和音频 token。
分组查询注意力使得如此规模的模型 KV 缓存保持较小。每个 token 向缓存添加 2 × 16 个头 × 64 维 × 62 层 = 126,976 个值。在 BF16 下,每个 token 约 250 KB,完整的 100 万 token 上下文约 266 GB。
推理支持
Transformers
Muse Spark Open 实现提供了 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", # 默认: xhigh,可选: low/medium/high/xhigh
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,启用 add_generation_prompt=True、tokenize=True、return_dict=True 和 return_tensors="pt"。将处理器输出传递给 model.generate,解码新生成的 token,排除输入前缀。
处理器提供了一个推理强度的调节开关,将符号级别(low/medium/high/xhigh)映射为模型本身接受的整数(16、64、256、512)。
请注意,Muse Spark Open 无法关闭推理模式,因此如果想在较简单的任务上减少 token 消耗,可以将推理强度设为 “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", # 可选: low/medium/high/xhigh
).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))
图像与文本
Muse Spark Open 处理器将每个图像标记展开为处理后图像所需的 patch token 数量,并用图像边界 token 包裹。这种展开确保了文本位置与传递给模型的视觉特征对齐。处理器还支持在单个提示中包含多张图像。
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 帧。你可以通过设置视频处理器的 fps 来修改:
processor.video_processor.fps = 4.0
一般经验是:视频是按时间顺序排列的帧,下采样越多,就会丢失特定事件之间的更多帧,因此如果需要更精确的生成,应保持较高的 fps。但这存在权衡,因为你会需要更多内存并增加预填充的延迟。
帧与包含时间戳的文本输入交错排列(例如 “Time: 3.5s”)。要启用带音频的视频传递,向 apply_chat_template 传入 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)
音频推理
Muse Spark Open 的音频塔消费原始波形。处理器期望 24 kHz 的单声道音频,并将波形填充到 1,920 个采样点的倍数,对应每 80 毫秒一个音频嵌入。以其他采样率直接提供给处理器的音频必须先进行重采样。你可以使用 transformers 的 load_audio 工具完成重采样。load_audio 使用 torchcodec、librosa 或 torchaudio 后端,因此在运行推理之前请确保本地安装了其中一种。
如果你只是想直接在消息中使用 apply_chat_template,这些步骤都会在底层自动处理:
import torch
from transformers import AutoProcessor, AutoModelForMultimodalLM
model_id = "meta-models/Muse-Spark-Open-816B-A42B"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForMultimodalLM.from_pretrained(model_id).eval()
messages = [
{
"role": "user",
"content": [
{
"type": "audio",
"url": "https://huggingface.co/buckets/huggingface/audio-samples/resolve/bbaudio_question_39.mp3",
},
{
"type": "text",
"text": "Answer the question.",
},
],
},
]
# 下载音频、解码为单声道、重采样到 24 kHz、填充、创建 input_values_mask 并展开音频占位符。
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
load_audio_backend="auto",
).to(model.device).to(model.dtype)
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=128,
do_sample=False,
)
# 仅解码新生成的 token
prompt_length = inputs["input_ids"].shape[1]
generated_text = processor.batch_decode(
output_ids[:, prompt_length:],
skip_special_tokens=True,
)
print(generated_text[0])
处理器在音频边界标记之间插入对应数量的音频 token。它还返回一个标识真实采样的掩码,使模型能够排除填充的音频嵌入。
工具调用
Muse Spark Open 支持纯文本和多模态工具调用。你可以这样让模型调用工具:
from transformers import AutoProcessor, AutoModelForMultimodalLM
MODEL_ID = "meta-models/Muse-Spark-Open-816B-A42B"
# 加载模型
processor = AutoProcessor.from_pretrained(MODEL_ID)
model = AutoModelForMultimodalLM.from_pretrained(
MODEL_ID,
dtype="auto",
device_map="auto"
)
tools = [
{
"type": "function",
"function": {
"name": "weather.get",
"description": "Get the current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
},
"required": ["city"],
},
},
}
]
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "https://huggingface.co/datasets/merve/vl-test-suite/resolve/main/SF.png"},
{"type": "text", "text": "I'm going to the city in this picture. What clothes should I wear?"},
],
},
]
inputs = processor.apply_chat_template(
messages,
tools=tools,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
reasoning_strength="high"
).to(model.device).to(model.dtype)
input_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs)
response = processor.parse_response(
completion,
prefix=inputs["input_ids"][0],
tools=tools,
)
print(response)
相似文章
Unsloth Muse Spark Open 发布!
Meta 发布了开源权重的 Muse Spark Open 模型,这是一个 816B 总参数 / 42B 激活参数的混合专家(MoE)模型,拥有 1M token 上下文窗口,原生支持多模态输入,面向编码与智能体任务,并由 Unsloth 提供运行支持。
Muse Spark Open
Meta 发布 Muse Spark Open,宣称是美国最强开源权重模型:总参数 816B(激活 42B)、1M token 上下文、原生多模态,面向编码与智能体任务,且首次可在两台 Apple M5 Ultra Mac Studio 桌面端本地运行。
推出 Muse Spark Open:迄今为止最强大的美国开放权重模型
Meta 发布 Muse Spark Open,号称迄今最强大的美国开放权重模型,专为编码与智能体任务打造,拥有 8160 亿总参数(420 亿激活参数)、100 万词元上下文窗口及文本/图像/视频/音频多模态能力,并支持多种推理引擎与微调框架。
Meta 推出可在 Mac 上运行的开放权重 AI 模型
Meta 发布了号称美国最强的开源权重模型 Muse Spark Open,拥有 8160 亿参数和 100 万 token 上下文窗口,专为在 Mac 上本地运行设计(至少需 1TB 内存)。该模型原生多模态,面向复杂编码与智能体任务,并已通过 API 平台开放使用。
感谢 Meta 开放模型权重,但我们之中有多少人真能在本地运行 Muse Spark Open?
Meta 发布了 Muse Spark Open,这是一款拥有 8160 亿参数(激活参数为 420 亿)、支持 100 万 token 上下文的开放权重多模态智能体模型,但作者认为其营销具有误导性,因为在本地运行该模型所需的硬件成本高达数万美元,因此对大多数用户而言,通过 API 访问才是现实的选择。