Meta의 Muse Spark Open: Meta가 공개하는 오픈 가중치 프론티어 멀티모달 Mixture-of-Experts 모델
요약
Meta가 오픈 가중치 프론티어 멀티모달 MoE 모델인 Muse Spark Open을 공개했습니다. 이 모델은 에이전트 코딩, 디버깅, 도구 호출 등 실제 개발자 워크플로우에 최적화되었으며, 이미지/오디오/비디오를 처리하는 강력한 멀티모달 기능을 갖추고 있습니다. MoE 아키텍처를 통해 전체 816B 매개변수 중 토큰당 약 42B만 활성화되어 높은 효율성과 성능을 동시에 달성했습니다.
핵심 포인트
- 에이전트 코딩 및 디버깅 등 개발자 워크플로우에 최적화됨
- 이미지, 오디오, 비디오를 처리하는 멀티모달 기능 제공
- MoE 아키텍처로 816B 매개변수 중 토큰당 약 42B만 활성화
Muse Glimmer에 이어, Muse Spark Open은 훨씬 더 큰 규모로 Mixture-of-Experts (MoE) 아키텍처를 도입했으며, 현재까지 가장 강력한 US 오픈 가중치 모델입니다.
Meta는 Muse Spark Open을 에이전트 코딩(agentic coding)을 위해 훈련했습니다. 즉, 코드베이스를 읽고, 코드를 작성하고 디버깅하며, 도구를 호출하는 작업에 사용됩니다. 또한 이미지를 입력받고 오디오와 비디오도 처리할 수 있어, 작동하면서 스크린샷을 읽거나 음성 메모를 듣거나 화면 녹화를 시청할 수 있습니다. 이 게시물에서는 Muse Spark Open을 실행하고 미세 조정(fine-tune)하는 방법과 이를 활용하여 무엇을 만들었는지 보여드립니다. 모든 모델은 여기에서 찾을 수 있습니다.
Meta는 Muse Spark Open을 멀티 파일 리팩토링이나 장시간 디버깅 세션 같은 실제 개발자 워크플로우에 맞춰 훈련된 코딩 최적화 모델로 설명합니다. Muse Spark Open은 웹 브라우징과 이미지 처리 등 긴 작업을 계획하고, 행동하며, 관찰하고, 자체적으로 수정하는 데 초점을 맞춘 에이전트 중심의 모델입니다.
| Feature | Muse Spark Open | |
|---|---|---|
| Model size | ~816B total parameters; ~42B active per token | |
| ... |
체크포인트 저장소는 Muse-Spark-Open-816B-A42B와 Muse-Spark-Open-816B-A42B-NVFP4입니다.
Muse Spark Open은 Muse 모델 시리즈의 전체 크기 모델입니다. Meta가 지난 8월에 출시한 Muse Glimmer는 같은 시리즈의 작은 밀집(dense) 모델로, 로컬에서 실행하기에 이상적입니다. 두 모델 모두 동일한 토크나이저와 어휘를 사용합니다. 채팅 템플릿은 새로운 모달리티(modality) 추가 사항을 포함하여 Muse Glimmer 템플릿을 따릅니다. Muse Spark Open에서는 입력 임베딩과 출력 레이어가 각각 약 1.66B 개의 파라미터를 가진 별도의 행렬로 구성됩니다.
이 언어 모델은 62개의 레이어와 8192의 은닉 차원(hidden dimension)을 가지고 있습니다. 각 레이어는 쿼리 헤드(query heads) 128개와 키-값 헤드(key-value heads) 16개(grouped-query attention)를 가집니다. 각 헤드는 64차원을 가집니다. 어텐션 블록은 출력 게이트(output gate)와 출력 정규화 레이어(output normalization layer)를 가지고 있습니다. 또한 이 모델은 쿼리(queries)와 키(keys)에 정규화(normalization, QK-norm)를 적용합니다. 각 블록은 단순 합산이 아닌 학습된 잔차 게이트(learned residual gate)를 통해 입력과 출력을 결합합니다.
Muse Glimmer는 각 레이어마다 하나의 밀집 피드-포워드 네트워크(dense feed-forward network)를 사용합니다. Muse Spark Open은 이 밀집 네트워크를 Mixture-of-Experts (MoE) 블록으로 대체했습니다. 각 MoE 블록은 256개의 전문가(experts)를 가지고 있으며, 라우터(router)가 토큰당 8개의 전문가를 선택합니다. 각 전문가는 8192차원에서 4096차원으로 투영한 후 다시 8192차원으로 되돌리고, 출력에 자체 정규화(normalization)를 적용하는 피드-포워드 네트워크입니다. 이 전문가들이 전체 모델 매개변수의 약 97%를 차지합니다.
토큰당 8개의 전문가만 실행되므로, 모델은 각 토큰을 약 420억 개(42B)의 매개변수로 계산합니다. 모든 256개 전문가는 메모리에 유지되어야 하므로 배포에는 8160억 개(816B) 매개변수 모델의 메모리가 필요하지만, 420억 개(42B) 모델보다 훨씬 빠른 속도로 실행됩니다. BF16 체크포인트는 safetensors 형식으로 약 1.5TB입니다. NVFP4 체크포인트는 NVIDIA Blackwell GPU 전용으로 정확도 손실이 미미한 4비트 정밀도로 매개변수를 저장합니다. 트랜스포머(transformers)의 경우, BF16 체크포인트는 텐서 병렬 처리(TP=32)를 사용하여 8개의 H200 GPU가 장착된 4개 노드에 걸쳐 실행되며, NVFP4는 단일 B200 노드에서 실행됩니다. Muse Spark Open을 배포하려면 아래의 llama.cpp, vLLM, SGLang 레시피를 확인하세요.
Perception encoder는 이미지와 비디오 프레임을 언어 모델용 토큰으로 변환하며, 이는 Muse Glimmer가 하는 방식과 같습니다. 이 인코더는 18억 개(1.8B)의 매개변수, 50개의 레이어, 1536의 은닉 차원(hidden dimension), 그리고 16개의 어텐션 헤드(attention heads)를 가지고 있습니다. 각 이미지를 14×14 패치로 분할하고 4096차원의 특징을 생성합니다. 위치 정보는 학습된 절대 임베딩(learned absolute embeddings)과 2D RoPE에서 나옵니다. 각 레이어의 피드-포워드 네트워크는 LayerNorm과 GELU를 사용합니다. 네 번째 레이어와 마지막 레이어는 전체 어텐션(full attention)을 사용하고, 나머지 레이어는 희소 어텐션(sparse attention)을 사용합니다.
Muse Glimmer 30B는 동일한 아키텍처의 인코더를 사용합니다. 이 설계는 Meta의 Perception Encoder 작업에서 따왔습니다. 비디오 입력은 이미지와 동일한 인코더를 거칩니다.
Muse Spark Open은 오디오 인코더를 통해 오디오 입력을 받습니다. 오디오 토크나이저는 오디오를 토큰으로 변환하며, 채팅 템플릿(chat template)은 <|channel>로 오디오 위치를 표시합니다.
토큰들. 인코더는 80ms마다 하나의 오디오 토큰을 방출하며, 이는 초당 12.5개의 토큰을 생성합니다. 따라서 10초 분량의 오디오가 있다고 가정하면, 입력 오디오 토큰 수는 125개가 됩니다.
인코더 자체는 컨볼루션 피라미드(convolutional pyramid)이며, 각 단계는 서로 다른 패치 크기의 패치 임베더와 스트라이드가 1이고 크기가 7인 1D 커널로 구성된 2개의 컨볼루션 블록으로 이루어져 있습니다. 이러한 단계들은 [16, 6, 5, 4]의 패치 크기에 대해 반복됩니다. 마지막 단계가 끝날 때, 시간적 프레임(temporal frames)은 RMSNorm → 선형 투영(linear projection) → RMSNorm을 거치는 최종 블록으로 공급됩니다.
컨텍스트 창(context window)은 추론 시 1M 토큰입니다. 설정은 max_position_embeddings를 1,048,576으로 지정합니다. 여기에는 이미지, 비디오, 오디오 토큰이 텍스트와 동일한 창에 포함됩니다.
그룹화된-쿼리 어텐션(Grouped-query attention)은 이 크기의 모델에서 KV 캐시를 작게 유지합니다. 각 토큰은 캐시에 $2 imes 16$ 헤드 $ imes 64$ 차원 $ imes 62$ 레이어 = 126,976개의 값을 추가합니다. BF16 기준으로 이는 토큰당 약 250KB이며 전체 1M 토큰 컨텍스트에 대해 약 266GB입니다.
Muse Spark Open 구현은 멀티모달 입력으로부터 텍스트 생성을 위한 MuseSparkForConditionalGeneration과 대화 준비를 위한 MuseSparkProcessor를 제공합니다. 이 프로세서는 토크나이저, 이미지 및 비디오 프로세서, 오디오 특징 추출기(audio feature extractor), 그리고 채팅 템플릿을 결합합니다.
병렬 처리 설정을 구성하려면 DistributedConfig를 사용합니다. tp_size는 밀집 레이어(dense layers)가 샤딩되는 장치 수이며, ep_size는 전문가(experts)가 분산되는 장치 수입니다.
모델과 프로세서를 다음과 같이 초기화할 수 있습니다.
import os
from transformers import AutoModelForMultimodalLM, AutoTokenizer, DistributedConfig
distributed_config = DistributedConfig(
...
대화를 준비한 다음, 메시지를 processor.apply_chat_template에 전달하고, 이때 add_generation_prompt=True, tokenize=True, return_dict=True, 그리고 `return_tensors=
그리고 입력 접두사(input prefix)를 제외한 새로 생성된 토큰들을 디코딩합니다. 이 프로세서에는 추론 노력(reasoning effort)을 조절하는 레버가 있어, 상징적 수준(symbolic levels)인 (낮음/중간/높음/매우 높음)을 모델이 수용하는 정수값(16, 64, 256, 512)에 매핑합니다. Muse Spark Open에서는 추론 기능을 끌 수 없다는 점에 유의하여, 더 쉬운 작업을 해결하기 위해 토큰 소비를 줄이고 싶다면 모델 추론을 '낮음'으로 유지하세요. 또한 시스템 프롬프트에 Reasoning strength: 1과 같은 라인을 포함하여 숫자 노력도를 설정할 수도 있습니다.
messages = [
{"role": "system", "content": "숫자로만 답변해야 합니다."},
{"role": "user", "content": "17 * 23은 무엇인가요?"},
...
Muse Spark Open 프로세서는 각 이미지 마커를 처리된 이미지가 요구하는 패치 토큰(patch tokens) 수만큼 확장하며, 이 주변에는 이미지 경계 토큰(image boundary tokens)이 배치됩니다. 이러한 확장은 텍스트 위치가 모델로 전달되는 시각적 특징과 정렬되도록 유지합니다. 프로세서는 또한 단일 프롬프트 내의 여러 이미지를 처리할 수도 있습니다.
image_url = (
"https://huggingface.co/datasets/merve/vl-test-suite/"
"resolve/main/pills.jpg"
...
비디오 프롬프트는 시각적 콘텐츠뿐만 아니라 프레임 타이밍도 포함합니다. 프로세서는 오디오가 포함된 비디오도 처리할 수 있습니다 (이는 오디오 인코더 덕분에 Muse Glimmer보다 향상된 부분입니다). 프로세서는 프레임을 다운샘플링하고 오디오를 조정하여 프레임들을 정렬합니다. 기본적으로 비디오는 2 FPS로 샘플링되며, 최대 96프레임으로 제한됩니다. 비디오 프로세서의 fps를 설정하여 이를 수정할 수 있습니다:
processor.video_processor.fps = 4.0
일반적인 경험 법칙으로는 비디오가 시간 순서상의 프레임들로 구성되어 있으므로, 다운샘플링을 많이 할수록 특정 이벤트 사이의 프레임을 더 많이 잃게 되므로, 더 정확한 생성을 원한다면 fps를 높게 유지해야 합니다. 하지만 트레이드오프(trade-off)가 존재하는데, 이는 더 많은 메모리를 필요로 하고 프리필(prefill) 시 지연 시간(latency)을 증가시키기 때문입니다. 프레임들은 타임스탬프를 명시하는 텍스트 입력(
apply_chat_template로 적용합니다.
return_metadata=True를 사용하여 입력 데이터를 준비할 때 비디오의 메타데이터를 보존하면 프로세서가 정확한 프레임 속도를 할당할 수 있습니다.
import torch
messages = [
{
...
Muse Spark Open 오디오 타워는 원시 파형(raw waveform)을 소비합니다. 프로세서는 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"
...
프로세서는 오디오 경계 마커 사이에 일치하는 수의 오디오 토큰을 삽입합니다. 또한 실제 샘플을 식별하는 마스크를 반환하여 모델이 패딩된 오디오 임베딩을 제외할 수 있도록 합니다.
Muse Spark Open은 텍스트 전용 및 멀티모달 도구 호출(tool calling)을 수행할 수 있습니다. 다음과 같이 모델이 도구를 호출하도록 만들 수 있습니다.
from transformers import AutoProcessor, AutoModelForMultimodalLM
MODEL_ID = "meta-models/Muse-Spark-Open-816B-A42B"
# 모델 로드
...
Muse Spark Open은 채널 기반 채팅 템플릿(channel-based chat template, Harmony)을 사용합니다 (gpt-oss에서 처음 소개됨). 내부 구조를 알 필요는 없지만, 품질이 낮은 출력을 받는 경우 모델이 라우팅하는 채널을 확인해 보는 것이 유용합니다. 아래 입력 메시지에서:
<|begin_of_text|>
<|start|>system<|message|>
You are a helpful AI assistant.
...
<|start|>assistant는 의도적으로 열어둔 것이며, to=를 사용하여 수신자를 선택하는 것은 모델의 역할입니다. 이 모델은 여러 수신자(recipient)를 가지는데, 예를 들어 self는 모델에게 추론하도록 요청합니다.
to=self<|message|>는 모델이 추론하는 부분이고, commentary는 툴 호출 전후에 최종 사용자에게 보이는 주석입니다. user는 최종 응답을 의미합니다.
툴 호출 라우팅은 다음과 같이 파싱됩니다 (apply_chat_template에 tools를 전달했다고 가정):
<|start|>assistant to=weather.get<|message|>
<atem:function_calls>
<atem:invoke name="weather.get">
...
Muse Spark 2-bit는 Llama Server에서 실행됩니다.
Muse Spark Open은 llama.cpp에 통합되어 있으며, 사전 빌드된 바이너리로 제공됩니다. 다음 명령어로 설치할 수 있습니다:
curl -LsSf https://llama.app/install.sh | sh
다음과 같이 모델 ID에 양자화(quant) 접미사를 붙여 서버를 시작할 수 있습니다:
llama serve -hf ggml-org/Muse-Spark-Open-816B-A42B-GGUF:Q2_K
양자화 모델을 포함하는 저장소는 여기입니다. 서버가 시작되면, localhost:9931로 이동하여 내장된 WebUI에서 채팅할 수 있습니다. 웹 UI에서는 오디오와 이미지를 추가하여 추론하고 추론 레버(reasoning lever)를 조정할 수 있습니다.
Muse Spark Open에서는 추론 기능을 끄는 것이 불가능하므로, 더 쉬운 작업을 해결하기 위해 토큰 소비를 줄이고 싶다면 모델의 추론을 “low”로 유지하십시오.
저희는 Mac M3 Ultra (512GB)에서 양자화 모델을 테스트했습니다. imatrix-calibrated 2-bit 양자화 모델은 초당 18 토큰으로 실행되며, KV 캐시(모델이 사용하는 용량: 304 GB)에 충분한 여유 공간이 있습니다.
다음과 같이 서버를 쿼리할 수도 있습니다. 멀티모달리티, 툴 호출 등에 대한 API 레퍼런션을 자유롭게 확인해 보십시오.
## text-only inference
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
...
llama.cpp 팀은 다양한 양자화 버전을 제공합니다. 저희는 Apple Silicon 칩에서 Q2_K, Q4_K_S 및 Q_8을 테스트했습니다. 각 양자화 모델은 접미사로 양자화 ID를 추가하여 실행할 수 있습니다. llama serve -hf ggml-org/Muse-Spark-Open-816B-A42B:Q2_K
Muse Spark Open의 SGLang 통합은 텍스트, 이미지, 오디오, 비디오 입력을 지원합니다. NVFP4 참조 구성은 네 개의 GB300 GPU에 걸쳐 실행됩니다.
SGLang 통합 환경에서 Hugging Face Hub로부터 체크포인트를 다운로드하고 서버를 시작하세요:
export MODEL_ID=meta-models/Muse-Spark-Open-816B-A42B-NVFP4
export CKPT="$(hf download "$MODEL_ID")"
SGLANG_FLASHINFER_NVFP4_PER_TOKEN_ACTIVATION=1 \
...
체크포인트에는 채팅 템플릿이 포함되어 있으며, 이를 명시적으로 전달합니다. 로처는 Muse 추론 및 도구 호출 파서를 구성합니다.
OpenAI와 호환되는 API를 통해 요청을 전송하세요:
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기