코딩 에이전트가 파일을 읽고 도구를 호출할수록, 모델에 다시 넣어야 할 대화와 실행 기록은 길어진다. 답변을 빨리 만들기 위해 작은 모델을 붙여도, 그 작은 모델까지 긴 기록을 따로 처리하고 보관한다면 새로운 부담이 생긴다.

DLite는 긴 기록은 본체 모델이 처리하고, 작은 모델은 본체가 만든 내부 표현을 받아 다음 후보만 만들게 한다. 없애는 것은 작은 모델이 따로 유지하던 과거 기록용 KV 캐시다. 본체 모델의 캐시나 과거 정보 자체를 없애는 방법은 아니다.

논문 · 코드

작은 모델을 붙이면 왜 빨라질까

언어 모델은 보통 다음 토큰을 하나씩 생성한다. 여기서 토큰은 모델이 문장을 처리하는 단위로, 단어나 단어의 일부일 수 있다. 큰 모델을 토큰마다 실행하는 대신, 작은 모델이 후보 여러 개를 먼저 내고 큰 모델이 한 번에 검사하면 실행 횟수를 줄일 수 있다. 이것이 **추측 디코딩(speculative decoding)**의 기본 생각이다(§2.1).

두 모델의 역할을 나누면 이해하기 쉽다. **초안 모델(drafter)**은 빠르게 후보를 제안하고, **본체 모델(target)**은 후보를 검증해 실제 출력으로 이어간다. 후보가 많이 받아들여지고 후보를 만드는 비용이 작을수록 유리하다. 후보를 만드는 작은 모델이 느리거나 자주 틀리면, 붙여 둔 이점이 줄어든다.

에이전트에서는 도구 실행 결과와 이전 대화가 계속 쌓인다. 기존 초안 모델도 이 기록을 자기 방식으로 처리하며, 다음 생성에 재사용할 내부 데이터를 KV 캐시에 저장한다. KV 캐시는 이미 처리한 토큰을 매번 처음부터 계산하지 않도록 보관하는 데이터다. 본체와 초안 모델이 각자 캐시를 유지하면, 새 토큰이 확정될 때 초안 쪽 기록도 갱신해야 한다(§3.1).

에이전트의 입력 기록이 길어지는 상황과 기존 초안 모델의 수용 길이 변화를 보여주는 논문 Figure 1.

원문 Figure 1의 왼쪽은 긴 입력과 짧은 출력이 반복되는 에이전트 실행을, 오른쪽은 이런 작업에서 한 번에 받아들여지는 토큰 수가 줄어드는 상황을 보여준다. 이 그림에서 볼 점은 “작은 모델이 있다”는 사실보다 긴 기록을 처리하는 작은 모델이 좋은 후보를 계속 낼 수 있는가다.

전체 파이프라인: 무엇을 남기고 무엇을 없애나

DLite에서는 본체가 긴 기록을 처리한 뒤 만든 **내부 표현(hidden state)**을 초안 모델에 건넨다. 내부 표현은 사람이 읽는 요약문이 아니라 신경망의 중간 계산값이다. 초안 모델은 이 값과 직전에 확정된 토큰을 받아 새 후보를 만든다(§4.1).

아래는 후보가 검사되는 흐름을 보여주는 설명용 예시다. 영어 단어를 눈에 보이는 단위로 사용했으며 실제 토크나이저의 분할이나 논문 측정값을 뜻하지 않는다.

DLite 설명용 예시: 본체는 긴 기록과 캐시를 유지하고 초안 모델은 내부 표현으로 후보를 만든다. 검증에서 통과한 앞부분은 남기고 거절된 후보와 그 뒤는 버린다.

첫 패널에서 긴 기록과 본체의 캐시는 그대로 남아 있다. 초안 모델이 받는 것은 본체의 내부 표현과 현재 위치의 정보다. 따라서 “history-free”는 기록을 잊는다는 뜻이 아니라, 초안 모델이 긴 기록용 캐시를 따로 유지하지 않는다는 뜻이다.

둘째 패널에서 초안은 jumps over a dog를 제안한다. 셋째 패널은 검증 결과를 jumps, over는 통과하고 a에서 거절되는 경우로 가정했다. 이 경우 dog도 확정하지 않고, 검증 절차에 따른 토큰 the로 이어간다. 이는 정답 문자열과 단순 비교한다는 뜻이 아니라, 후보의 통과·거절 이후 어떤 부분이 남는지 보여주는 예시다.

실제 한 라운드의 흐름은 다음과 같다.

단계실제로 하는 일다음에 쓰는 결과
본체 계산지금까지의 입력을 처리본체 캐시와 내부 표현
후보 준비여러 후보 위치의 중간 표현을 한 번에 계산위치별 표현
후보 생성앞서 뽑은 후보를 반영하며 다음 후보를 선택후보 토큰 묶음
본체 검증후보들을 검사하고 통과한 앞부분을 확정확정 출력과 다음 라운드 정보

표에서 초안 모델은 긴 기록을 다시 저장하지 않지만, 본체 계산과 검증은 남는다. DLite가 줄이는 작업의 범위를 이 둘과 혼동하면 안 된다(§4.1, Figure 3).

후보는 함께 준비하되, 선택할 때는 앞 단어를 본다

다음 몇 개의 위치를 동시에 계산하면 빠르다. 하지만 각 위치의 단어까지 서로 독립적으로 뽑으면 문장이 잘 이어지지 않을 수 있다. 예를 들어 jumps 다음 단어를 고를 때는 앞에서 실제로 jumps를 골랐다는 정보가 필요하다.

DLite는 이 일을 둘로 나눈다. 먼저 병렬 백본이 여러 위치의 중간 표현을 함께 계산한다. 그다음 작은 순차 헤드가 앞서 선택한 후보를 반영해 다음 후보를 고른다. 큰 계산은 함께 하고, 앞 후보와의 연결을 반영하는 작은 계산만 순서대로 한다는 설계다(§4.1.1–4.1.2).

여기서 순차 헤드가 다루는 것은 현재 후보 묶음 안의 정보다. 전체 대화와 파일 내용을 다시 읽는 것은 아니다. 또한 중간 표현을 어휘 전체의 점수로 바꾼 뒤 다시 다듬는 대신, 중간 표현에서 순서를 반영하고 나서 어휘 점수를 계산한다. 큰 어휘 변환을 중간 단계에서 반복하는 비용을 줄이려는 선택이다.

DLite의 내부 표현 입력, 병렬 백본, 순차 헤드와 본체 검증을 보여주는 논문 Figure 3.

원문 Figure 3은 위 설명을 실제 모델 구성에 연결한다. 본체에서 나온 표현이 초안 쪽으로 전달되는 경로와, 병렬 계산 뒤에 순차 헤드가 놓이는 순서를 보면 된다. 독자가 만든 예시 그림은 후보의 변화를, 이 원문 그림은 구현 구성요소 사이의 연결을 설명한다.

이 구조는 학습에도 준비가 필요하다. 저자들은 DLite와 비슷한 구조이면서 과거 캐시에 접근할 수 있는 중간 교사 모델로 먼저 학습시킨 뒤, 본체 모델을 직접 따라가도록 학습한다. 추론 시 캐시를 없애는 대신 학습 절차가 추가되는 셈이다(§4.2).

결과: 후보 수와 실제 속도를 따로 읽어야 한다

실험은 Qwen3-4B와 Qwen3-8B를 본체로 사용했고, 서빙 하드웨어는 NVIDIA H800이다. 후보 블록 크기는 7이다. 결과의 두 지표를 구분해야 한다. 수용 길이는 검증 한 번으로 얼마나 생성하는지를, 속도 배수는 일반적인 한 토큰씩 생성하는 방식보다 얼마나 빨라졌는지를 나타낸다(§5.1).

아래는 SWE-Bench의 결과다. DSpark는 비교 대상인 다른 초안 모델 방식이다(원문 Table 3).

본체방식평균 수용 길이일반 생성 대비 속도
Qwen3-4BDSpark1.891.64배
Qwen3-4BDLite3.152.68배
Qwen3-8BDSpark1.941.60배
Qwen3-8BDLite3.192.74배

4B에서 1.89→3.15는 수용 길이가 약 66.7% 늘어난 것이다. 반면 2.68배는 DSpark 대비가 아니라 일반 생성 대비 속도다. DSpark와 직접 속도를 비교하려면 2.68을 1.64로 나눠 약 1.63배로 읽어야 한다. “후보를 더 받아들인다”와 “서비스가 빨라진다”는 연결되지만 같은 숫자는 아니다.

짧은 범용 과제에서는 차이가 작다. 예를 들어 4B의 GSM8K 수용 길이는 DSpark 6.27, DLite 6.38이다(Table 1). 따라서 어느 작업에서나 큰 폭으로 개선된다고 읽기보다, 기록이 길어지는 작업에서 이 설계가 얼마나 유리한지를 봐야 한다.

동시에 여러 요청을 처리할 때도 배수가 그대로 유지되는 것은 아니다. 4B Alpaca에서 DLite의 일반 생성 대비 처리량 배수는 동시 요청 1개에서 2.58배, 64개에서 1.32배였다. 실제 요청 수와 입력 길이에 맞춘 검증이 필요하다(Table 4).

적용 전에 확인할 한계

먼저 본체 모델의 내부 표현을 꺼내 초안에 전달할 수 있어야 한다. 따라서 이 방식을 검토할 때는 모델 이름뿐 아니라 서빙 엔진에서 그 경로를 구현할 수 있는지도 확인해야 한다. 본체 KV 캐시는 계속 필요하므로 긴 입력 전체의 메모리 문제가 사라지는 것은 아니다.

학습 비용도 남는다. 앞서 설명한 중간 교사와 두 단계 학습은 저자가 도입한 절차다. 이미 학습된 작은 모델을 연결하기만 하면 같은 결과를 얻는다는 뜻으로 읽으면 안 된다(§4.2).

리뷰어 관점에서 남는 질문은 적용 범위다. 제시된 본체는 4B·8B Qwen3이고 서빙 실험은 H800 환경이다. 더 큰 본체나 다른 구조의 모델, 본체와 초안을 서로 다른 장치에 두는 배치에서도 같은 이득이 나는지는 별도 확인이 필요하다. 표의 수용 길이와 속도는 작업 성공률 자체를 측정한 수치도 아니다.

DLite를 검토할 만한 상황은 긴 기록을 자주 다시 사용하는 에이전트 서빙이다. 중요한 질문은 “캐시가 0인가”보다 누가 긴 기록을 처리하고, 그 결과를 누가 재사용하는가다. 본체의 기록 처리는 유지하면서 초안의 중복 저장과 갱신을 줄이는 것이 이 설계의 초점이다.

논문 원문의 표 펼쳐 보기

arXiv e-print 의 LaTeX 원본에서 기계적으로 옮긴 표입니다. 숫자는 논문의 값이며 모델을 거치지 않았습니다.

표 1. Acceptance length $\tau$ evaluation on general-purpose workloads.

ModelMethodMath GSM8KMath MATH-500Code HumanEvalCode \ MBPPCode *\ \ \ LCB \ *Chat MT-BenchChat Alpaca
Qwen3-4BEAGLE32.632.392.472.342.173.072.28
DFlow5.134.924.334.12-3.802.90
DFlash5.975.825.254.974.823.393.56
DFlash26.145.805.385.144.794.142.50
DSpark6.276.255.625.485.203.813.54
DLite6.386.305.685.645.313.943.64
Qwen3-8BEAGLE32.602.282.512.172.083.072.56
DFlow5.104.944.284.08-3.582.93
DFlash6.045.915.274.884.893.393.56
DSpark6.366.345.865.365.433.883.64
DLite6.486.355.965.655.663.963.78

표 2. Speedup and acceptance length ($\tau$) evaluation on long-context workloads.

ModelMethodLongBench_v2
Multi-Doc QALong In-ctx Lrn.Code Repo Ud.Long-dialog Hist.
Speedup$\tau$Speedup$\tau$Speedup$\tau$Speedup$\tau$
Qwen3-4BEagle31.70$\times$2.101.76$\times$2.281.68$\times$2.122.23$\times$2.88
DFlash1.60$\times$1.901.71$\times$2.001.45$\times$1.832.62$\times$3.04
DSpark1.81$\times$2.202.01$\times$2.412.02$\times$2.443.16$\times$3.93
DLite2.18$\times$2.742.58$\times$3.112.66$\times$3.143.88$\times$4.62
Qwen3-8BEagle31.64$\times$2.051.87$\times$2.331.42$\times$1.802.01$\times$2.56
DFlash1.81$\times$2.101.86$\times$2.281.65$\times$2.162.58$\times$3.07
DSpark1.98$\times$2.522.28$\times$2.672.02$\times$2.593.02$\times$4.01
DLite2.32$\times$2.862.74$\times$3.222.53$\times$3.043.96$\times$4.77

표 3. Speedup and acceptance length ($\tau$) evaluation on agentic workloads.

MetricMethodAgentMemBench \ \ SpeedupAgentMemBench $\tau$AgentLongBench SpeedupAgentLongBench $\tau$*\ \ \ \ \ \ \ \ \ BFCL-v3 \ \ \ \ \ \ \ \ * Speedup*\ \ \ \ \ \ \ \ \ BFCL-v3 \ \ \ \ \ \ \ \ * $\tau$*\ \ \ \ SWE-bench\ \ \ * Speedup*\ \ \ \ SWE-bench\ \ \ * $\tau$
Qwen3-4BEagle31.66$\times$2.091.70$\times$2.121.58$\times$2.001.48$\times$1.88
DFlash1.22$\times$1.650.95$\times$1.141.44$\times$1.801.47$\times$1.72
DSpark1.72$\times$2.101.45$\times$1.842.11$\times$2.541.64$\times$1.89
DLite2.39$\times$2.802.07$\times$2.512.37$\times$2.782.68$\times$3.15
Qwen3-8BEagle31.77$\times$2.191.60$\times$2.001.49$\times$1.881.33$\times$1.71
DFlash1.80$\times$2.201.28$\times$1.651.78$\times$2.071.53$\times$1.83
DSpark1.83$\times$2.261.68$\times$2.091.82$\times$2.231.60$\times$1.94
DLite2.20$\times$2.692.31$\times$2.792.30$\times$2.762.74$\times$3.19

표 4. High-concurrency throughput evaluation on Qwen3 models.

TaskMethodConcurrency (TPS / Speedup) 1Concurrency (TPS / Speedup) 8Concurrency (TPS / Speedup) 16Concurrency (TPS / Speedup) 32Concurrency (TPS / Speedup) 64Avg. $\tau$
Qwen3-4B
AlpacaBaseline246 / 1.00$\times$1798 / 1.00$\times$3377 / 1.00$\times$5849 / 1.00$\times$10808 /1.00$\times$–
DSpark609 / 2.47$\times$4131 / 2.30$\times$7018 / 2.08$\times$11118 / 1.90$\times$13548 / 1.25$\times$3.49
DLite635 / 2.58$\times$4222 / 2.35$\times$7293 / 2.16$\times$11792 / 2.02$\times$14300 / 1.32$\times$3.63
MT-BenchBaseline245 / 1.00$\times$1792 / 1.00$\times$3377 / 1.00$\times$5883 / 1.00$\times$10113 / 1.00$\times$–
DSpark620 / 2.53$\times$4589 / 2.56$\times$8177 / 2.42$\times$12565 / 2.14$\times$15830 / 1.57$\times$3.79
DLite633 / 2.58$\times$4699 / 2.62$\times$8162 / 2.42$\times$12994 / 2.21$\times$16820 / 1.66$\times$3.88
LCBBaseline242 / 1.00$\times$1665 / 1.00$\times$2918 / 1.00$\times$4498 / 1.00$\times$6586 / 1.00$\times$–
DSpark905 / 3.74$\times$5457 / 3.28$\times$8248 / 2.83$\times$10243 / 2.28$\times$11309 / 1.72$\times$5.28
DLite960 / 3.97$\times$5592 / 3.36$\times$8418 / 2.88$\times$10873 / 2.42$\times$12075 / 1.83$\times$5.98
Qwen3-8B
AlpacaBaseline142 / 1.00$\times$993 / 1.00$\times$1705 / 1.00$\times$2920 / 1.00$\times$4330 / 1.00$\times$–
DSpark364 / 2.56$\times$2260 / 2.28$\times$3758 / 2.20$\times$5238 / 1.79$\times$6827 / 1.58$\times$3.69
DLite379 / 2.67$\times$2409 / 2.43$\times$3965 / 2.33$\times$5325 / 1.82$\times$7042 / 1.63$\times$3.86
MT-BenchBaseline143 / 1.00$\times$977 / 1.00$\times$1749 / 1.00$\times$2950 / 1.00$\times$4450 / 1.00$\times$–
DSpark398 / 2.78$\times$2454 / 2.51$\times$3956 / 2.26$\times$5455 / 1.85$\times$7236 / 1.63$\times$3.89
DLite407 / 2.85$\times$2531 / 2.59$\times$4131 / 2.36$\times$5558 / 1.88$\times$7305 / 1.64$\times$4.10
LCBBaseline142 / 1.00$\times$902 / 1.00$\times$1401 / 1.00$\times$2196 / 1.00$\times$2708 / 1.00$\times$–
DSpark511 / 3.60$\times$2562 / 2.84$\times$3803 / 2.71$\times$4815 / 2.19$\times$5621 / 2.08$\times$5.47
DLite561 / 3.95$\times$2761 / 3.06$\times$4016 / 2.87$\times$5059 / 2.30$\times$5758 / 2.13$\times$6.04

표 5. Design space exploration of DLite\xspace on Qwen3-8B. All variants are trained on the same 80K-sample subset, and we report average acceptance length ($\tau$). For the target hidden-state exploration, the first and last target layers are always included in addition to the sampled intermediate layers. Unless otherwise specified, we use 14 target hidden states, sequence-wise hidden-state composition, and a sequential-head rank of 512. Bold indicates the configuration adopted in the final model.

DimensionConfigurationAlpacaGSM8KMBPPMulti-Doc QAAvg. $\tau$
Target Hidden States72.344.363.632.223.14
92.424.403.752.243.20
142.634.533.762.283.30
202.624.553.742.263.29
362.584.513.712.263.27
Hidden CompositionFeature-wise2.204.283.502.163.04
Sequence-wise2.634.533.762.283.30
Sequential-Head Rank256 ($1/16D$)2.484.403.612.163.16
512 ($1/8D$)2.634.533.762.283.30
1024 ($1/4D$)2.644.553.802.283.32
2048 ($1/2D$)2.644.533.822.283.32
4096 ($D$)2.644.563.822.303.33

Figure 번호를 붙인 원문 그림은 arXiv:2610.23787에서 가져왔습니다 (CC BY 4.0). 크기와 형식만 바꿨습니다. 후보 검증 예시는 이 글을 위해 별도로 그린 설명용 그림입니다.

라이선스

작성자: Jaehun Ryu

링크: https://jaehun.me/posts/paper-2610-23787v1/

라이선스: CC BY 4.0

이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 출처를 밝히면 상업적 목적을 포함해 자유롭게 이용 가능합니다.

댓글