Dots3-Note
Dots3-Note
dots3.note는 RedNote의 네이티브 멀티모달 옴니 모델로, dots3 언어 모델 위에 구축됐어요. 텍스트, 이미지, 오디오, 네이티브 비디오 입력을 받아들여요.
- 네이티브 멀티모달리티 — 커스텀 MoE 비전 트랜스포머와 Whisper에서 파생된 오디오 인코더가 언어 모델과 함께 프로세스 내에서 동작하며, 같은 체크포인트 디렉터리에서 로드돼요. 이미지와 오디오 플레이스홀더는 모델별 프로세서에 의해 확장돼요.
- 네이티브 비디오 파이프라인 — 서버가 토큰 예산 아래에서 프레임, 타임스탬프, 오디오 세그먼트를 공동 샘플링·인터리브해 학습-시간 평탄화 알고리즘을 재현해요. 일반적 균일-프레임 비디오 프로세서는 모달리티 순서와 토큰 할당을 조용히 바꿀 것(추론/학습 불일치)이므로, 파이프라인은 서빙 경로에 벤더(vendored)돼 있어요.
- 하이브리드 어텐션 — dots3은 MLA를 서로 다른 기하구조의 전체-어텐션 및 슬라이딩-윈도우 레이어, 어텐션 게이트, 그리고 전체-어텐션 레이어의 선택적 DSA 인덱싱과 결합해요.
- MTP 추측 디코딩 — 전체 공유 MTP/NextN 아키텍처가 재귀적으로 공유된 SWA 형태의 MTP 레이어 하나를 노출하고 타겟 LM 헤드를 공유해요.
사용 가능한 체크포인트:
리소스: Hugging Face (BF16) · Hugging Face (FP8) · SGLang PR #33829
출처: 문서
본문
2. 구성 팁
하이브리드 KV 풀. dots3은 전체-어텐션과 슬라이딩-윈도우 레이어를 섞고, MTP 드래프트 레이어는 전체-어텐션이 아니라 일반 SWA 레이어예요. SGLang은 그에 맞게 풀 크기를 정하며, --swa-full-tokens-ratio 0.03이 SWA-레이어 KV 토큰과 전체-레이어 KV 토큰의 비율을 설정해요(swa_tokens ≈ full_tokens × ratio). 긴 전체-어텐션 컨텍스트가 지배해서 전체 풀이 먼저 가득 차면 낮추고, SWA 풀이 병목이면 높이세요.
MoE 러너. 러너를 셀 기본값으로 두세요: BF16 체크포인트는 deep_gemm, 양자화된 것은 auto. DeepEP는 모든 셀의 all-to-all 전송이에요(--moe-a2a-backend deepep, SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=128로 랭크당 디스패치 토큰 튜닝).
어텐션 백엔드. 전반적으로 FA3이에요: prefill, decode, 드래프트(--prefill-attention-backend fa3 --decode-attention-backend fa3 --speculative-draft-attention-backend fa3)와 --page-size 64. MTP 타겟 검증은 FA3의 흡수된(absorbed) SWA-MLA 폴백을 사용하는데, 이는 decode와 같은 paged latent KV 뷰를 소비해요.
DSA. 전체-어텐션 레이어의 DSA 인덱싱은 기본적으로 켜져 있어요. 비활성화하려면 --json-model-override-args '{"index_topk":null}'를 추가하세요.
CUDA 그래프. 셀은 decode 쪽 CUDA 그래프만 활성화하고(--cuda-graph-backend-decode full --cuda-graph-backend-prefill disabled, 최대 배치 크기 32), 최소 120 GiB 메모리의 GPU에 맞춰 크기가 정해져요. 더 작은 GPU에서는 --cuda-graph-backend-decode disabled로 전환하세요(그리고 --deepep-mode normal이 더 나은 선택일 거예요).
컨텍스트 길이. --context-length 524288이 모델의 윈도우예요. SGLang의 다른 모델처럼 가장 긴 수용 요청을 제한하며, KV 풀 크기를 정하지 않아요.
언어 전용 모드. --language-only를 추가하면 비전과 오디오 타워 구성을 완전히 건너뛰어요 — 해제된 메모리는 언어 모델로 갑니다. 이는 또한 인코더/LLM 분리(EPD) 배포의 언어 역할이에요. 아래 EPD 참조.
3. 고급 사용
3.1 네이티브 비디오 입력
dots3.note는 네이티브 video_url을 받아들여요. 서버가 원격 비디오를 메모리에서 디코드하고 학습-일관 평탄화 파이프라인을 적용해요 — 비디오와 질문에서 파생된 결정적 시드로 타임스탬프, 프레임, 오디오를 토큰 예산 아래에서 인터리브해요.
비디오 예제 (Python)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="dots3.note",
messages=[
{
"role": "user",
"content": [
{
"type": "video_url",
"video_url": {"url": "https://example.com/sample.mp4"},
},
{"type": "text", "text": "Summarize what happens in this video."},
],
}
],
extra_body={
"video_config": {
"seq": 131072,
"audio_cap": 0.5,
"audio_sr": 16000,
"k_mode": "eval_ek",
},
},
)
print(response.choices[0].message.content)
예제 출력
Pending update...
요청별 비디오 전처리 제어는 extra_body의 video_config 아래에 그룹화돼요:
| Field | Default | Purpose |
|---|---|---|
seq |
131072 |
Total sequence budget used by the video flattener. |
audio\_cap |
1.0 |
Maximum fraction of the input budget assigned to audio; 0 disables audio processing. |
audio\_sr |
16000 |
Audio sample rate. |
k\_mode |
eval\_ek |
Deterministic evaluation/sampling mode of the flattener. |
이 제어들은 요청 범위로 한정되어, 서로 다른 컨텍스트 예산을 가진 평가 작업이 하나의 서버를 공유할 수 있어요. 예: extra_body={"video_config": {"seq": 131072, "audio_cap": 0.5}}. 평탄화기는 예산 안에 max_new_tokens 자리를 예약하고, 오디오가 구성된 토큰 예산을 초과하면 시각 전용 처리를 폴백해요.
요청은 여러 비디오를 실을 수 있고, 비디오는 이미지·오디오 파트와 섞일 수 있어요. 각 비디오는 같은 요청별 예산 아래에서 독립적으로 평탄화되고, 평탄화된 프레임과 오디오 세그먼트는 해당 video_url 파트 위치로 다시 이어붙여져 프롬프트의 모달리티 순서가 보존돼요.
3.2 이미지 및 오디오 입력
네이티브-비디오 경로 밖에서, 이미지와 오디오 클립은 표준 OpenAI 멀티모달 메시지 형식을 사용해요. 모든 셀에 --enable-multimodal이 있고, 비전·오디오 타워가 프로세스 내에서 동작하므로 추가 서버가 필요 없어요.
이미지 예제 (Python)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="dots3.note",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": "https://example.com/sample.jpg"},
},
{"type": "text", "text": "Describe this image."},
],
}
],
)
print(response.choices[0].message.content)
예제 출력
Pending update...
3.3 툴 호출
위 Playground의 Parsers 카드에서 Tool Call Parser(--tool-call-parser dots)와 Reasoning Parser(--reasoning-parser dots)를 토글하세요. 구조화된 툴 호출은 message.tool_calls를 통해 노출돼요.
툴 호출 예제 (Python)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
resp = client.chat.completions.create(
model="dots3.note",
messages=[{"role": "user", "content": "What's the weather in Beijing?"}],
tools=tools,
)
print(resp.choices[0].message.tool_calls)
예제 출력
Pending update...
3.4 Encoder/LLM 분리 (EPD)
Dots3NoteForCausalLM은 인코더/LLM 분리 배포의 두 역할을 모두 지원해요:
- 인코더 역할 —
--encoder-only로 서빙하면, 인스턴스는 비전과 오디오 타워만 실행해요. - 언어 역할 —
--language-only로 서빙하면, 인스턴스는 타워 구성을 건너뛰어 메모리를 언어 모델에 남겨요.
역할들을 함께 연결하는 방법은 EPD 가이드를 참조하세요.