tracks
GPU를 업그레이드하지 않고, 머신을 바꾸지 않고, 더 작은 모델로 전환하지 않고도 대규모 언어 모델을 더 빠르게 실행할 수 있다면 어떨까요?
이번 가이드에서는 멀티 토큰 예측, 즉 MTP를 사용해 이를 테스트합니다. 동일한 RunPod RTX 3090 환경에서 같은 Qwen3.6 27B 모델이 MTP를 활성화한 뒤 초당 38 토큰에서 초당 65 토큰으로 향상되었습니다. 이는 1.71배 속도 향상, 즉 약 71% 높은 처리량을 의미하며, 출력 품질의 눈에 띄는 저하도 없었습니다.
이 가이드에서 다룰 내용은 다음과 같습니다.
- RunPod RTX 3090 머신 설정
- MTP 브랜치 클론 및 전환
- CUDA 지원으로 llama.cpp 빌드
- Qwen3.6 27B MTP GGUF 모델 다운로드
- MTP 없이 모델을 실행해 기준 속도 확보
- MTP를 활성화해 모델 재테스트
- MTP 사용 전후의 토큰 생성 속도 비교
- 추가 최적화를 위한 다음 단계로 TurboQuant 살펴보기
멀티 토큰 예측이란?
대부분의 LLM은 한 번에 하나의 토큰씩 텍스트를 생성합니다. 모델이 다음 토큰을 예측하고, 이를 컨텍스트에 추가한 뒤, 같은 과정을 반복합니다. 신뢰성은 높지만, 보통 새 토큰마다 디코딩 단계를 다시 수행해야 하므로 속도가 느릴 수 있습니다.
멀티 토큰 예측은 모델이 한 번에 하나만이 아니라 여러 개의 미래 토큰을 미리 제안할 수 있게 해 이 과정을 바꿉니다. 이렇게 제안된 토큰은 메인 디코딩 프로세스에서 검증되며, 예측이 맞으면 여러 토큰을 한 번에 받아들입니다. 특정 토큰이 틀리면 그 지점부터 정상 경로로 되돌아갑니다.
실제로 MTP는 내장된 초안(draft) 메커니즘처럼 동작합니다. 모델이 가능성이 높은 다음 토큰 몇 개를 초안으로 생성하고, 이를 검증해 유효한 토큰만 유지합니다. 수용되는 초안 토큰이 많을수록 전체 디코딩 단계 수가 줄어들어, 최종 출력 품질을 바꾸지 않고도 초당 토큰 수를 높일 수 있습니다.
간단히 말해:
- MTP 없음: 토큰 1 생성 → 토큰 2 생성 → 토큰 3 생성
- MTP 사용: 여러 토큰을 초안으로 생성 → 검증 → 유효한 토큰을 한꺼번에 수용
이 때문에 MTP는 로컬 LLM 추론을 훨씬 빠르게 느끼게 해줍니다. 모델이 아주 작은 보폭으로만 전진하도록 강제하는 대신, 초안 예측이 맞을 때마다 안전하게 앞으로 도약할 수 있게 해주기 때문입니다.

llama.cpp나 vLLM 스타일 구현에서는, 초안 토큰이 검증자의 출력과 일치할 때만 수용되는 추측적 디코딩과 밀접하게 관련됩니다.
1. RunPod RTX 3090 머신 설정
이 가이드를 위해 RTX 3090이 장착된 RunPod GPU 인스턴스를 사용했습니다. 다른 CUDA 지원 GPU를 사용해도 되지만, 본 튜토리얼의 벤치마크 결과는 RTX 3090 환경을 기준으로 합니다.
먼저 새 RunPod 파드를 만들고 RTX 3090 GPU를 선택합니다.
파드를 배포하기 전에 템플릿 설정을 수정하세요:
-
볼륨 디스크 크기를 100 GB로 증가
-
추가 HTTP 포트 추가: 8910
-
HF_TOKEN이라는 환경 변수를 추가하고 값으로 본인의 Hugging Face 액세스 토큰을 설정
추가한 HTTP 포트는 브라우저에서 llama.cpp 서버와 웹 UI에 접근할 수 있게 해줍니다. Hugging Face 토큰은 다운로드 요청 인증에 도움이 되며, 특히 큰 GGUF 파일의 모델 다운로드 속도를 높일 수 있습니다.

템플릿을 업데이트한 뒤 파드를 배포하세요. 실행되면 RunPod에서 JupyterLab 인스턴스 접근 권한이 부여될 때까지 기다립니다. JupyterLab을 열고 새 터미널을 실행합니다.
터미널에서 필요한 시스템 패키지를 설치합니다:
apt update
apt install -y git cmake build-essential curl wget python3-pip

2. MTP 브랜치 클론 및 전환
이제 llama.cpp를 설치하고 빌드할 작업 공간 디렉터리로 이동합니다:
cd /workspace
llama.cpp 저장소를 클론합니다:
git clone --depth 1 https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
MTP 변경 사항은 아직 전용 llama.cpp 풀 리퀘스트를 통해 테스트 중이므로, 표준 메인 빌드에 포함되기 전 최신 MTP 구현을 사용하기 위해 해당 브랜치를 가져와 전환합니다.
MTP 브랜치를 로컬로 가져옵니다:
git fetch origin pull/22673/head:mtp-pr
git checkout mtp-pr
이제 로컬 llama.cpp 빌드가 MTP 활성화 버전으로 전환되었으며, 이후 단계에서 이를 사용합니다.

3. CUDA 지원으로 llama.cpp 빌드
MTP 활성화 브랜치에 있으므로, 이제 CUDA 지원으로 llama.cpp를 빌드합니다. 이렇게 하면 CPU가 아닌 RTX 3090 GPU를 사용해 추론할 수 있습니다.
CMake 빌드 구성을 실행합니다:
cmake -B build -DGGML_CUDA=ON -DCMAKE_BUILD_TYPE=Release
이 가이드에 필요한 두 타깃을 컴파일합니다:
cmake --build build --target llama-cli llama-server -j

다음이 빌드됩니다:
-
빠른 커맨드라인 테스트용
llama-cli -
브라우저 접근이 가능한 OpenAI 호환 서버 실행용
llama-server
빌드가 완료되면, 메인 llama.cpp 디렉터리로 llama-server 바이너리를 복사합니다:
cp ./build/bin/llama-server ./llama-server
다음 단계에서 프로젝트 루트에서 서버를 더 쉽게 실행할 수 있습니다.
4. Qwen3.6-27B-MTP 모델 다운로드
이제 테스트에 사용할 Qwen3.6 27B MTP GGUF 모델을 다운로드합니다. 먼저 MTP 없이 실행하고, 이후 MTP를 활성화해 속도 차이를 비교합니다.
먼저 Hugging Face 다운로드 도구를 설치합니다:
pip install -U "huggingface_hub[hf_xet]" hf-xet hf_transfer
이후 더 빠른 Hugging Face 다운로드를 활성화합니다:
export HF_HUB_ENABLE_HF_TRANSFER=1
이는 특히 GGUF 파일 작업 시 대용량 모델 다운로드 속도를 높이는 데 도움이 됩니다.
모델 전용 디렉터리를 만듭니다:
mkdir -p /workspace/models/qwen3.6-mtp
Qwen3.6 27B MTP GGUF 모델을 다운로드합니다:
hf download froggeric/Qwen3.6-27B-MTP-GGUF \
Qwen3.6-27B-Q4_K_M-mtp.gguf \
--local-dir /workspace/models/qwen3.6-mtp

LLM 파인튜닝에 관심이 있다면, 의학 Q&A 데이터셋으로 Qwen3.6 파인튜닝 튜토리얼을 참고하세요.
5. MTP 비활성화 상태로 Qwen3.6-27B 실행
이제 가이드의 핵심 단계인 MTP 활성화 전후의 모델 속도를 테스트합니다.
먼저 MTP 없이 모델을 실행합니다. 이렇게 기준선을 마련해 이후 속도 차이를 명확히 비교할 수 있습니다. 동일한 모델, 동일한 GPU, 동일한 컨텍스트 크기, 동일한 서버 설정을 사용하며, 다음 단계에서의 주요 변경 사항은 MTP 활성화뿐입니다.
llama.cpp 디렉터리로 돌아갑니다:
cd /workspace/llama.cpp
MTP 없이 서버를 시작합니다:
./llama-server \
-m "/workspace/models/qwen3.6-mtp/Qwen3.6-27B-Q4_K_M-mtp.gguf" \
--alias qwen3.6-27b-no-mtp \
--host 0.0.0.0 \
--port 8910 \
-ngl 99 \
-c 100000 \
--cache-type-k q8_0 \
--cache-type-v q8_0 \
-np 1 \
-b 2048 \
-ub 512 \
-t 8 \
-fa on \
--temp 0.7 \
--top-k 20 \
--top-p 0.95 \
--repeat-penalty 1.1 \
--metrics
이렇게 하면 포트 8910에서 OpenAI 호환 llama.cpp 서버가 시작됩니다.
모델 가중치를 GPU 메모리에 적재해야 하므로 로딩에 약간 시간이 걸릴 수 있습니다. 준비가 완료되면 터미널에 포트 8910에서 서버가 사용 가능하다는 메시지가 표시됩니다.

RunPod 템플릿을 설정할 때 이 포트를 노출했으므로, 추가 구성은 필요 없습니다. RunPod 대시보드로 돌아가 포트 8910 링크를 클릭하세요. 그러면 브라우저에서 llama.cpp 웹 UI가 열리며, 로컬 모델이 이미 로드된 상태입니다.

여기서 브라우저에서 바로 프롬프트를 테스트할 수 있으며, 일반적인 채팅 인터페이스처럼 사용할 수 있습니다.

기준 테스트에서 MTP 없이 응답 생성 속도는 약 초당 38.86 토큰이었습니다. 더 복잡한 프롬프트에서도 속도는 비슷한 범위를 유지했습니다.
RTX 3090에서 27B 모델을 실행한다는 점을 고려하면, 최신 데이터센터급 카드 대비 GPU가 더 느리고 메모리가 제한적임에도 이미 실사용 가능한 결과입니다.
6. MTP 활성화 상태로 Qwen3.6-27B 실행
이제 동일한 모델을 MTP를 활성화해 다시 실행해 보겠습니다.
서버가 실행 중인 터미널로 돌아가 다음으로 중지합니다:
CTRL + C
중요한 점은 모델, GPU, 양자화, 대부분의 런타임 설정을 변경하지 않는다는 것입니다. 오직 두 개의 MTP 관련 플래그만 추가합니다:
--spec-type mtp
--spec-draft-n-max 3
첫 번째 플래그는 llama.cpp에 MTP 방식의 추측적 디코딩을 사용하도록 지시합니다. 두 번째 플래그는 초안 토큰의 최대 개수를 3으로 설정합니다. 즉, 검증 전에 최대 세 개의 미래 토큰을 초안으로 시도할 수 있다는 의미입니다.
이제 MTP를 활성화한 상태로 서버를 다시 시작합니다:
./llama-server \
-m "/workspace/models/qwen3.6-mtp/Qwen3.6-27B-Q4_K_M-mtp.gguf" \
--alias qwen3.6-27b-mtp \
--host 0.0.0.0 \
--port 8910 \
-ngl 99 \
-c 100000 \
--spec-type mtp \
--spec-draft-n-max 3 \
--cache-type-k q8_0 \
--cache-type-v q8_0 \
-np 1 \
-b 2048 \
-ub 512 \
-t 8 \
-fa on \
--temp 0.7 \
--top-k 20 \
--top-p 0.95 \
--repeat-penalty 1.1 \
--metrics
서버가 준비되면 브라우저 페이지를 새로 고침하세요. 자동으로 재연결되지 않으면 페이지를 닫고 RunPod 대시보드에서 포트 8910 링크를 다시 여세요.
이제 동일한 유형의 프롬프트로 다시 테스트합니다.

MTP를 활성화하니 속도가 눈에 띄게 증가했습니다. 간단한 인사 프롬프트에서는 약 초당 65–67 토큰까지 도달했습니다. 기준선인 초당 약 38.86 토큰과 비교하면, 커맨드라인 플래그 두 개만 추가해 얻은 큰 개선입니다.

파이썬으로 간단한 게임을 만들어 달라는 등 더 복잡한 프롬프트에서는 속도가 약간 낮았지만, 여전히 MTP 미사용 기준선보다 훨씬 빨랐습니다. 해당 테스트에서 생성 속도는 약 초당 56–61 토큰으로, RTX 3090에서 27B 모델이 내는 결과로서는 매우 준수합니다.
종합적으로, RunPod RTX 3090 환경에서 MTP를 활성화하니 Qwen3.6 27B가 약 초당 38 토큰에서 초당 65 토큰으로 향상되었습니다. 이는 1.71배 속도 향상, 즉 약 71% 높은 처리량을 하드웨어 변경이나 더 작은 모델로의 전환 없이 달성한 것입니다.
7. 추천: TurboQuant로 추가 속도 최적화
이번 가이드의 벤치마크는 원본 llama.cpp MTP 설정만 사용했으며, TurboQuant, 커스텀 패치, 기타 런타임 수준 최적화는 추가하지 않았습니다. 이렇게 하면 테스트가 단순하고 재현 가능하며, MTP 활성화만으로 얻는 속도 향상에 집중할 수 있습니다.
성능을 더 끌어올리려면 다음으로 시도할 최적화는 MTP와 TurboQuant의 조합입니다. MTP는 여러 예측 토큰을 수용해 처리량을 높이고, TurboQuant는 추론 중 KV 캐시 메모리 압박을 줄여줍니다.
이는 대형 모델, 긴 컨텍스트 프롬프트, 그리고 메모리 대역폭과 VRAM이 병목이 될 수 있는 RTX 3090 같은 GPU에서 특히 유용합니다.
r/LocalLLaMA 커뮤니티 일부 결과가 본 가이드보다 더 높은 초당 토큰 수를 보고하는 이유도 여기에 있습니다. 그 환경들은 종종 MTP와 TurboQuant, 패치된 빌드, 다른 KV 캐시 설정, 더 빠른 GPU를 함께 사용합니다. 본 튜토리얼은 MTP만을 깔끔하게 벤치마크하는 데 초점을 두므로, TurboQuant는 현재 설정의 일부가 아니라 권장되는 다음 실험으로 보시면 됩니다.
맺음말
최근 LocalLLaMA 레딧 커뮤니티의 게시글을 지켜보고 있는데, 로컬 LLM 추론이 이만큼 발전했다는 점이 놀랍습니다. 사람들이 Qwen3.6 27B 같은 모델을 제한된 VRAM의 오래된 GPU에서도 로컬 코딩 에이전트로 실행하고 있습니다. 유사한 구성을 Mac 시스템에서 구동하는 사례도 있으며, 결과가 정말 인상적입니다.
직접 MTP를 테스트해 보니 왜 이렇게 열광하는지 알 것 같습니다. 같은 모델, 같은 RTX 3090 환경에서 멀티 토큰 예측을 활성화하니 생성 속도가 약 초당 38 토큰에서 초당 65 토큰으로 향상되었습니다. GPU를 업그레이드하거나 더 작은 모델로 바꾸지 않고도 거의 2배의 속도 향상입니다.
이 가이드는 llama.cpp를 사용한 간단하고 재현 가능한 MTP 설정에 집중했지만, 이는 시작에 불과해 보입니다. 다음 단계로는 더 나은 GGUF 양자화, MTP, TurboQuant, 더 세밀하게 조정된 런타임 설정을 함께 실험해 로컬 추론 속도를 어디까지 끌어올릴 수 있는지 확인해 보세요.
무엇보다 흥미로운 점은 이것이 로컬 코딩 에이전트에 갖는 의미입니다. 자체 하드웨어에서 강력한 모델을 실행하고, 쿼리당 비용을 줄이며, 코드를 비공개로 유지하고, 인터넷 기반 API에 전적으로 의존하지 않고도 AI 코딩 어시스턴트를 사용할 수 있습니다. 로컬 LLM은 불과 얼마 전보다 더 빠르고, 실용적이며, 훨씬 유용해지고 있습니다.
멀티 토큰 예측 FAQ
MTP에 별도의 드래프트 모델이 필요한가요?
아니요. Qwen3.6-27B에서는 MTP가 모델 자체에 내장되어 있어 별도의 드래프트 모델이 필요하지 않습니다.
MTP는 모델을 얼마나 더 빠르게 만드나요?
RunPod RTX 3090 환경에서 MTP를 활성화하니 생성 속도가 약 초당 38 토큰에서 약 초당 65 토큰으로 향상되어, 1.71배 속도 향상 또는 약 71% 처리량 증가를 보였습니다.
MTP와 추측적 디코딩의 차이는 무엇인가요?
llama.cpp의 MTP는 추측적 디코딩의 한 형태입니다. 모델의 자체 MTP 헤드에서 생성된 드래프트 토큰은 검증을 통과할 때만 수용됩니다. 전통적인 추측적 디코딩과의 핵심 차이는 외부 드래프트 모델이 필요 없다는 점입니다.
MTP 이상의 속도를 더 낼 수 있나요?
예. 추론 중 KV 캐시 메모리 압박을 줄이는 TurboQuant와 MTP를 함께 사용하는 것이, 특히 RTX 3090처럼 메모리가 제약된 GPU에서 추가 속도 향상을 위한 다음 단계로 권장됩니다.