TLDR: 기대는 현실이었습니다! 1.5배 속도 향상. 텐서 병렬화 (Tensor Parallelism) 사용 시 최대 2배 속도 향상!
Unsloth의 MTP 양자화 (quants) 모델은 여기 있습니다: https://huggingface.co/unsloth/Qwen3.6-27B-GGUF-MTP
PR을 읽은 후 즉시 MTP 호환 Q4_1 양자화 모델을 찾아보았습니다 (연산 능력이 부족한 구형 카드에서는 약간의 속도 향상을 제공합니다) 하지만 찾을 수 없었습니다.
다행히도 이 포스트를 발견했는데, 여기에는 MTP 이식 (grafting)을 본인의 양자화 모델에 어떻게 적용하는지가 강조되어 있었고, 덕분에 이미 가지고 있던 Unsloth 양자화 모델에 이를 부착할 수 있었습니다.
설정 (Setup)
- CachyOS (Arch Linux)
- ROCm 7.2
- 두 카드 모두 PCIe 4.0 x 8로 작동
https://github.com/ggml-org/llama.cpp/pull/22673이 포함된 llama.cpp 포크 https://github.com/skyne98/llama.cpp-gfx906를 빌드하였으며, 포함된 PR 벤치마크 스크립트로 다음 명령어를 실행했습니다:
llama-server -m ~/models/Qwen3.6-27B-MTP-Q4_1.gguf \
--temp 1.0 --min-p 0.0 --top-k 20 --top-p 0.95 \
--jinja --presence-penalty 1.5 \
--chat-template-kwargs '{"preserve_thinking": true}' \
-ub 2048 -b 2048 \
-fa 1 -np 1 \
--no-mmap --no-warmup \
-dev ROCm0,ROCm1 --fit on -fitt 256
스크립트 벤치마크 (Script Benchmark)
순정 (Stock):
code_python pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.2
code_cpp pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.2
explain_concept pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.3
summarize pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.4
qa_factual pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.4
translation pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.4
creative_short pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.4
stepwise_math pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.3
long_code_review pred= 192 draft= 0 acc= 0 rate=n/a tok/s=26.0
MTP 적용 시: --spec-type mtp --spec-draft-n-max 2
code_python pred= 192 draft= 144 acc= 119 rate=0.826 tok/s=39.6
code_cpp pred= 192 draft= 156 acc= 113 rate=0.724 tok/s=36.5
explain_concept pred= 192 draft= 154 acc= 113 rate=0.734 tok/s=36.7
summarize pred= 192 draft= 138 acc= 121 rate=0.877 tok/s=40.7
qa_factual pred= 192 draft= 144 acc= 119 rate=0.826 tok/s=39.4
translation pred= 192 draft= 152 acc= 115 rate=0.757 tok/s=37.5
creative_short pred= 192 draft= 156 acc= 113 rate=0.724 tok/s=36.6
stepwise_math pred= 192 draft= 146 acc= 118 rate=0.808 tok/s=39.0
long_code_review pred= 192 draft= 150 acc= 115 rate=0.767 tok/s=37.8
합계 (Aggregate): {
"n_requests": 9,
"total_predicted": 1728,
"total_draft": 1340,
"total_draft_accepted": 1046,
"aggregate_accept_rate": 0.7806,
"wall_s_total": 51.42
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
텐서 병렬화 (Tensor Parallelism) 적용 시: -sm tensor
code_python pred= 192 draft= 0 acc= 0 rate=n/a tok/s=35.0
code_cpp pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.8
explain_concept pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.6
summarize pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.6
qa_factual pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.7
translation pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.7
creative_short pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.7
stepwise_math pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.6
long_code_review pred= 192 draft= 0 acc= 0 rate=n/a tok/s=34.3
MTP와 텐서 병렬화 (Tensor Parallelism) 결합 시:
code_python pred= 192 draft= 142 acc= 120 rate=0.845 tok/s=59.8
code_cpp pred= 192 draft= 148 acc= 116 rate=0.784 tok/s=56.6
explain_concept pred= 192 draft= 146 acc= 117 rate=0.801 tok/s=56.8
summarize pred= 53 draft= 42 acc= 31 rate=0.738 tok/s=54.5
qa_factual pred= 192 draft= 148 acc= 117 rate=0.790 tok/s=56.8
translation pred= 192 draft= 146 acc= 117 rate=0.801 tok/s=57.3
creative_short pred= 192 draft= 154 acc= 114 rate=0.740 tok/s=54.8
stepwise_math pred= 192 draft= 140 acc= 121 rate=0.864 tok/s=59.6
long_code_review pred= 192 draft= 148 acc= 117 rate=0.790 tok/s=56.2
Aggregate: {
"n_requests": 9,
"total_predicted": 1589,
"total_draft": 1214,
"total_draft_accepted": 970,
"aggregate_accept_rate": 0.799,
"wall_s_total": 32.24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
실제 환경 벤치마크 (Real-world benchmark)
위의 수치들은 정말 말도 안 돼 보이지만, 실제 환경(real-world)에서는 속도 향상 폭이 매우 빠르게 줄어듭니다. 게다가 현재 수정 작업이 진행 중인 프리필(prefill) 속도의 퇴보(regression)는 말할 것도 없습니다. 저는 이것 18k 코딩 프롬프트를 실행해 보았는데, 60t/s의 속도는 매우 짧은 프롬프트에서만 관찰 가능하다는 것이 명확합니다. 하지만 MTP와 텐서 병렬성 (tensor parallelism)을 결합하면 실제로 상당한 2배의 속도 향상을 얻을 수 있습니다.
기본 (Stock):
prompt eval time = 53173.24 ms / 19191 tokens ( 2.77 ms per token, 360.91 tokens per second)
eval time = 337695.94 ms / 7791 tokens ( 43.34 ms per token, 23.07 tokens per second)
total time = 390869.18 ms / 26982 tokens
MTP 적용 시:
prompt eval time = 84388.11 ms / 19191 tokens ( 4.40 ms per token, 227.41 tokens per second)
eval time = 260732.83 ms / 8408 tokens ( 31.01 ms per token, 32.25 tokens per second)
total time = 345120.94 ms / 27599 tokens
텐서 병렬성 (tensor parallelism) 적용 시:
prompt eval time = 41925.27 ms / 19191 tokens ( 2.18 ms per token, 457.74 tokens per second)
eval time = 253262.25 ms / 8104 tokens ( 31.25 ms per token, 32.00 tokens per second)
total time = 295187.53 ms / 27295 tokens
MTP와 텐서 병렬성 (tensor parallelism) 결합 시:
prompt eval time = 49696.04 ms / 19191 tokens ( 2.59 ms per token, 386.17 tokens per second)
eval time = 155821.64 ms / 7440 tokens ( 20.94 ms per token, 47.75 tokens per second)
total time = 205517.69 ms / 26631 tokens