Meta发布816B参数多模态MoE模型Muse Spark Open

Meta开源816B参数多模态模型Muse Spark Open。该模型采用MoE架构,支持文本、图像等输入及百万上下文,专为代理编码任务优化,推理速度接近42B参数模型。

Meta 发布 Muse Spark Open:816B 参数多模态混合专家模型

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

每层256专家仅激活8个

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 后端。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读