독파모 · SOLAR OPEN2 250B · DSPARK

MTP가 없는 Solar Open2 250B에
투기적 디코딩 직접 학습하기

Solar Open2 250B에는 MTP 계열 prediction head가 없습니다. Solar의 5개 hidden layer를 학습 데이터로 만들고, 다음 토큰 블록을 예측하는 DSpark drafter를 500K 규모로 post-training한 과정을 정리합니다.

Solar Open2독파모 · 250B-A15B
500Kpost-training prompts
472.8B1 serial tok/s
DSPARK TRAINING AND SERVING

저희는 독파모 Solar Open2 250B의 생성 속도를 높이기 위해 원본 모델의 가중치는 그대로 둔 채 별도의 DSpark draft model을 학습하고 SGLang 서빙 경로에 연결했습니다. MTP prediction head가 없는 모델에 투기적 디코딩을 적용하면서 데이터 생성부터 500K post-training, checkpoint 변환, 실제 성능 측정까지 진행했는데요. 오늘은 그 과정을 이야기해 보겠습니다.

Solar Open2 250B는 독자 파운데이션 모델 프로젝트의 대규모 모델 중 하나입니다. 250B-A15B MoE 구조와 48개 decoder layer를 가지고 있습니다. 미래 토큰을 함께 예측하는 MTP(Multi-Token Prediction) 계열의 prediction head는 없습니다.

기존 MTP 옵션을 켜는 방식으로는 이 모델에 투기적 디코딩을 적용할 수 없습니다. 사이오닉은 Solar Open2가 생성한 응답과 여러 layer의 hidden feature를 데이터로 만들고, 이를 입력으로 다음 토큰 블록을 예측하는 별도의 DSpark draft model을 학습했습니다. 이 글에서는 데이터 생성부터 500K post-training, checkpoint 변환, SGLang 연결과 실제 성능 측정까지의 과정을 설명합니다.

Solar Open2 본체에 MTP head를 추가한 것은 아닙니다.Solar Open2의 가중치는 그대로 두고, target hidden을 조건으로 사용하는 DSpark drafter를 별도로 학습했습니다. 서빙할 때 두 모델을 Draft, Verify, Commit 경로로 연결하여 투기적 디코딩을 사용합니다.

1. Draft 모델이 먼저 만들고 Solar Open2가 검증합니다

투기적 디코딩에서는 작은 draft model이 다음 토큰 후보를 여러 개 생성합니다. Solar Open2 250B는 이 후보들을 한 번의 forward에서 검증합니다. 앞쪽 후보가 Solar의 결과와 일치하면 여러 토큰이 한 번에 확정되고, 처음 다른 지점부터 다시 생성합니다.

이번 학습에서는 원본 Solar Open2의 가중치를 수정하지 않았습니다. 추가 어댑터 역할을 하는 DSpark draft model만 별도로 학습했고, 최종 token은 원본 Solar Open2가 검증합니다. 최적화 전후에 원본 모델의 성능은 동일하게 유지되며, 변경되는 부분은 token을 생성하고 검증하는 계산 경로입니다.

FIGURE 01 · DRAFT → VERIFY → COMMIT
1. Draft작은 모델이 7개 후보를 준비
ABCD
2. Verify250B 타깃이 블록 전체를 한 번에 판정
ABC×
3. Commit일치한 prefix만 출력
ABC
성능은 평균 수락 길이(accept length)와 한 스텝 비용의 비율로 결정됩니다. 더 많이 맞혀도 드래프트와 검증이 비싸면 느려질 수 있습니다.
평균 accept length만 높다고 빨라지는 것은 아닙니다.생성 속도는 대략 평균 accept length를 speculative step time으로 나눈 값입니다. Draft model이 더 많은 토큰을 맞혀도 draft와 verify 비용이 커지면 전체 속도는 오히려 느려질 수 있습니다.

2. MTP, DFlash, DSpark의 예측 구조

MTP, DFlash, DSpark는 모두 미래 토큰을 먼저 예측합니다. 미래 토큰 사이의 의존성과 병렬 block을 처리하는 구조는 서로 다릅니다.

MTP는 공유 trunk 위에 여러 output head를 두고 미래 위치를 병렬로 예측합니다. DFlash는 같은 anchor에서 masked token block을 한 번에 복원합니다. 사이오닉이 사용한 DSpark는 DFlash 계열의 병렬 block 구조에 low-rank Markov correction과 위치별 confidence를 추가합니다. 이전 block token의 정보를 logit bias로 반영하면서 draft forward의 병렬 구조는 유지합니다.

FIGURE 02 · THREE GENERATIONS OF DRAFTING
01 / MTP

독립 미래-token Heads

공유 trunk 위의 독립 output head들이 여러 미래 위치를 동시에 예측합니다. 학습 신호를 풍부하게 하고 추측 디코딩에 활용할 수 있지만, 토큰 간 조건부 의존성은 각 head에 직접 연결되지 않습니다.

02 / DFLASH

병렬 Mask Block

동일한 anchor에서 여러 마스크 위치를 한 번에 복원합니다. 드래프트 forward 한 번으로 블록을 제안해 순차 호출을 병렬 블록으로 바꿉니다.

03 / DSPARK

Block + Markov

DFlash backbone에 이전 블록 토큰의 low-rank bias와 위치별 confidence를 더합니다. 병렬성은 지키면서 블록 내부 의존성을 되찾습니다.

DSpark 구현은 DFlashDraftModel을 상속하고 Markov logit-bias head와 confidence head를 추가합니다. 특정 외부 웨이트 사용을 전제로 하지 않는 구조 설명입니다.

3. Solar Open2의 hidden을 다섯 지점에서 추출

Solar Open2 250B는 48개의 decoder layer를 가지고 있습니다. DSpark가 마지막 hidden 하나만 따라가도록 만들지 않고, layer 3, 15, 27, 39, 47의 hidden을 각각 추출했습니다. 서로 다른 깊이에서 만들어진 표현을 연결해서 draft backbone의 조건으로 사용합니다.

마지막 layer 47은 final norm 이전의 값이어야 합니다. Hidden layer ID가 하나씩 밀리거나 token alignment가 달라지면 학습은 진행되더라도 serving acceptance가 나오지 않습니다. 실제 파이프라인에서는 layer hook과 manifest에 이 조건을 기록하고, 대규모 데이터를 생성하기 전에 작은 샘플로 hidden shape과 token identity를 먼저 확인했습니다.

FIGURE 03 · FIVE-TAP TARGET CONDITIONING
5 × 4096

서로 다른 깊이의 target hidden을 연결해 draft backbone으로 전달합니다. 얕은 표현부터 최종 의미 표현까지 한 번의 블록 제안에 압축됩니다.

h₃ ⊕ h₁₅ ⊕ h₂₇ ⊕ h₃₉ ⊕ h₄₇ → Draft Block
hidden layer ID, token alignment, pre/post-norm 차이는 대규모 생성 전에 반드시 검증해야 하는 계약입니다.

4. 500K 데이터를 생성해서 DSpark를 학습

투기적 디코딩을 추가로 학습할 때 주된 노하우는 데이터셋 구성과 target model의 특성에 맞는 합성 데이터 생성 방법입니다. Draft model은 정답의 의미만 배우는 것이 아니라 target model이 실제로 생성하는 token 순서를 예측해야 합니다. 같은 prompt라도 모델의 tokenizer, 응답 형식, 언어와 도메인별 token 분포에 따라 필요한 학습 데이터가 달라집니다.

Solar Open2의 출력 특성을 반영하기 위해 공개 데이터셋의 answer를 그대로 사용하지 않았습니다. 영어·한국어·일본어, code·math·tool·chat 등 실제 사용 영역과 context length를 고려해 prompt 구성을 정하고, assistant 응답은 Solar Open2로 다시 생성했습니다. 생성된 응답의 token과 5개 layer의 hidden feature를 함께 저장해서 DSpark의 학습 데이터로 사용했습니다.

250B target model을 trainer 안에 함께 올리면 학습에 사용할 GPU 메모리가 크게 줄어듭니다. 그래서 Solar Open2 서버와 DSpark trainer를 분리했습니다. 같은 데이터 계열이 train과 validation에 섞이지 않도록 family 단위로 holdout을 나눴습니다. Producer가 Solar Open2의 token과 hidden을 생성하고, 8-GPU trainer가 이를 소비하는 streaming 구조를 사용했습니다. 250B model의 전체 가중치를 학습 프로세스에 넣지 않고도 target model의 분포를 따라가는 draft model을 학습할 수 있습니다.

FIGURE 04 · STREAMING TRAINING
01 PROMPTS

EN/KO/JA, code·math·tool·chat 등 도메인 균형

02 REGENERATE

Solar Open2가 답변을 재생성하고 token identity 확인

03 5-TAP HIDDEN

TP8 target에서 feature를 추출해 스트림 전달

04 TRAIN

producer와 8-GPU trainer가 같은 파이프라인에서 동작

초기 6.4K 사전 테스트는 생성→hidden 추출→학습→변환→실서빙 accept 측정의 전 과정을 검증했습니다. 이후 150K와 500K 스케일로 확장했습니다.

6.4K 사전 테스트에서 먼저 확인한 것

처음부터 500K 데이터를 생성하지 않았습니다. 6.4K 샘플로 생성, hidden 추출, 학습, checkpoint 변환, serving acceptance 측정까지 한 번에 연결되는지 먼저 확인했습니다.

이 모델의 평균 accept length는 1.83이었고 속도는 196~218 tok/s였습니다. Speculative decoding을 사용하지 않은 기준 속도 299.4 tok/s보다 느렸습니다. Trainer에서 측정한 accept 1.853과 serving accept 1.83은 거의 일치했습니다. 손익분기점인 accept 2.5~3에는 도달하지 못했습니다. 파이프라인의 정합성을 확인한 뒤 데이터 규모를 150K, 500K로 늘렸습니다.

5. 130 tok/s에서 472.8 tok/s까지

150K draft model의 평균 accept length는 γ3 조건에서 2.32였습니다. 500K 데이터를 2 epoch 학습한 r9에서는 γ7 조건의 accept가 3.54까지 증가했고, 속도는 425.8 tok/s가 되었습니다. 학습 데이터와 draft 품질을 높이자 한 번의 verify에서 확정되는 token 수가 실제로 증가했습니다.

이후 SGLang runtime과 B300 kernel의 고정비를 줄여 r11에서 472.8 tok/s를 측정했습니다. B1 serial decode, TP8 FP8 조건이며 별도의 품질 검증을 함께 진행했습니다. 시작점 130 tok/s와 비교하면 약 3.64배입니다.

FIGURE 05 · B1 SERIAL DECODE JOURNEY
B1 serial decode, TP8 FP8 조건의 측정입니다. r11은 시작점 대비 +264%이며, 별도의 품질 검증을 함께 통과했습니다.
335.5r8 · 150K draft · accept 2.32 @ γ3
425.8r9 · 500K 2-epoch · accept 3.54 @ γ7
472.8r11 · scheduler round 6
150K에서 500K로 데이터를 늘린 효과가 먼저 나타났습니다.500K 2-epoch draft의 validation accept는 3.43으로 150K보다 38% 높았습니다. Kernel을 바꾸기 전에 draft model이 Solar Open2의 다음 token을 더 정확하게 예측하도록 학습한 결과입니다.

6. Draft 품질이 좋아지면 새로운 고정비가 보입니다

Accept가 높아진 뒤에는 draft model보다 orchestration 비용이 병목으로 보이기 시작했습니다. Verify 폭을 γ+1로 수정하고 IPC receive fast-path, AllReduce와 RMSNorm fusion, commit-inject fusion, Markov 연산 batch 처리, pre-accept launch를 순서대로 적용했습니다.

그 결과 speculative fixed cost는 약 7.53ms에서 6.0ms 수준으로 줄었습니다. γ7 한 step의 시간도 8.4ms에서 7.46ms로 감소했습니다. MTP나 speculative decoding은 draft model만 학습한다고 끝나지 않습니다. Acceptance가 높아질수록 CPU 동기화와 작은 kernel launch 같은 runtime 비용이 전체 속도에서 더 크게 보입니다.

# 공개용 최소 예시 — 실제 checkpoint 경로는 배포 환경에 맞게 지정
python3 -m sglang.launch_server \
  --model-path upstage/Solar-Open2-250B \
  --tp 8 --quantization fp8 \
  --speculative-algorithm DSPARK \
  --speculative-draft-model-path <dspark-checkpoint> \
  --speculative-dspark-block-size 7 \
  --speculative-num-draft-tokens 8

위 명령은 개념 전달을 위한 공개용 최소 예시입니다. 성능 수치의 재현에는 저장소에 기록된 커널 패치, dtype, backend, 환경 플래그와 측정 프로토콜이 함께 필요합니다.

7. 사이오닉이 한 일

MTP와 speculative decoding의 알고리즘은 이미 공개되어 있습니다. Solar Open2 250B에는 MTP prediction head가 없어서 MTP 방식을 직접 적용할 수 없었습니다.

사이오닉이 한 일은 MTP가 없는 250B model에서 실제로 사용할 수 있는 draft model과 그 학습 파이프라인을 만든 것입니다.

  1. Solar Open2의 tokenizer, 응답 형식, 언어·도메인별 token 분포에 맞춰 합성 데이터 구성을 설계하고, 응답과 5개 layer hidden을 500K 규모로 생성했습니다.
  2. DFlash 계열 구조에 Markov correction과 confidence를 추가한 DSpark를 post-training했습니다.
  3. Trainer acceptance와 serving acceptance가 일치하는지 작은 사전 테스트용 모델부터 확인했습니다.
  4. SGLang과 B300에서 draft, verify, commit 경로의 고정비를 줄이고 별도의 품질 검증을 함께 진행했습니다.

이 과정에서 Solar Open2 본체의 가중치나 구조는 변경하지 않았습니다. 별도로 학습한 DSpark checkpoint를 serving 단계에서 target model과 결합했습니다.

학습한 모델은 Hugging Face에 공개했습니다. Solar-Open2-250B-ultrafast-Draft-LM-head는 Solar target과 함께 사용하는 500K·2 epoch draft checkpoint입니다. Solar-Open2-250B-ultrafast-Draft는 원본 Solar Open2 250B 가중치와 학습된 draft를 함께 구성한 배포본이며, 원본 가중치는 변경하지 않았습니다.

마치며

MTP가 없는 모델의 투기적 디코딩 경로에는 target token과 hidden 생성, draft model 학습, checkpoint 변환, runtime의 acceptance와 step time 측정이 모두 포함됩니다.

Solar Open2 250B에서는 데이터 규모를 150K에서 500K로 늘리자 accept가 높아졌습니다. Runtime 고정비를 줄인 뒤에는 472.8 tok/s를 측정했습니다. Solar Open2의 가중치는 바꾸지 않았으며, target hidden으로 학습한 DSpark checkpoint를 serving 단계에서 결합했습니다.

다음 콘텐츠에서는 MLA(Multi-head Latent Attention) 구조와 투기적 디코딩 사이의 연산 비용 trade-off를 다룹니다. 연산을 중첩해서 token prediction의 계산 비용을 숨기는 이론적 접근도 함께 정리해 다음 콘텐츠로 찾아뵙겠습니다.

참고 자료