본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 18. 11:06

MacOS 환경 llama.cpp의 새로운 MTP 성능 테스트 결과

요약

본 기사는 M2 Ultra Mac Studio 환경에서 Metal 기반 llama.cpp의 새로운 MTP(Multi-Turn Prompting) 기능을 테스트하고 그 성능을 분석한 결과를 공유합니다. 이 테스트는 특정 하드웨어의 최대 TPS를 측정하는 것이 아니라, 다양한 spec-draft-n-max 크기에서의 전반적인 성능 향상과 안정성을 확인하는 데 중점을 두었습니다. 테스트 결과에 따르면, MTP 활성화 시 baseline 대비 평균 t/s가 10~14% 증가하며 성능 개선을 보였으나, n_max 값이 커질수록 실행 간의 편차(variance)가 크게 증가하고 재현성이 떨어지는 현상이 관찰되었습니다. 특히 높은 n_max 값에서는 동일 조건에서도 결과값의 변동 폭이 매우 커서 안정성 문제가 제기됩니다.

핵심 포인트

  • M2 Ultra Mac Studio 환경에서 Metal 기반 llama.cpp MTP 테스트를 수행함.
  • MTP 활성화는 baseline 대비 평균 t/s 증가(10~14% 향상)를 보여 성능 개선 효과가 있음.
  • n_max 값이 커질수록 실행 결과의 편차(variance)와 불안정성이 심화되는 경향을 보임.
  • 높은 n_max 값에서는 MTP의 배치 검증 단계가 Metal 환경에서 부동 소수점 연산 순서 변동성(floating-point ordering variance)을 유발하는 것으로 추측됨.

MTP

저는 M2 Ultra를 사용하여 Metal 기반 llama.cpp의 새로운 MTP를 테스트해 보기로 결정했고, 그 결과를 여기에 공유하고자 합니다. 이 테스트는 Mac 하드웨어에서 얻을 수 있는 최대 tps(초당 토큰 수)를 보여주기 위한 것이 아닙니다. 만약 그것이 목적이었다면 M5 Max나 M3 Ultra에서 실행했을 것입니다. 저의 목표는 어떤 장치에서든 수행할 수 있는 다양한 spec-draft-n-max 크기에 걸쳐 전반적으로 어느 정도의 성능 향상을 기대할 수 있는지 확인하는 것이었습니다.

MTP 테스트 실행

하드웨어 (M2 Ultra Mac Studio, 192GB 통합 메모리)
모델 (Qwen3.6-35B-A3B UD-Q8_K_XL, MoE 모델)
llama.cpp 빌드 (b9196)
정확한 플래그: --seed 42, --no-cache-prompt, thinking 비활성화, 설정당 단일 프롬프트 3회 반복
Wikipedia 문서를 대상으로 한 RAG (다른 모든 이들이 코드를 벤치마킹하고 있으므로 코드는 제외함)

n (이 실행들의 값) | spec-draft-n-max | Mean t/s | Speedup | Mean acceptance | Variance
---|---|---|---|---
No MTP (baseline) | | 68.07 | 1.00x | n/a | ±0.02
n=2 | | 73.04 | 1.07x | 86.16% | ±1.2
n=3 | | 76.00 | 1.12x | 78.29% | ±0.3
n=4 | | 77.68 | 1.14x | 76.72% | ±4.1
n=5 | | 74.68 | 1.10x | 67.97% | ±2.6
n=6 | | 73.68 | 1.08x | 66.26% | ±5.4

n_maxRun 1 t/sRun 2 t/sRun 3 t/sMean t/sRun 1 accRun 2 accRun 3 accMean acc
272.3072.2674.5773.0484.66%84.66%89.15%86.16%
376.2376.1675.6176.0078.18%78.18%78.51%78.29%
479.0872.9081.0577.6878.13%70.66%81.38%76.72%
572.8673.0678.1274.6865.87%65.87%72.16%67.97%
666.4877.2977.2773.6858.11%70.34%70.34%66.26%
Prompt Processing ConfigMean PP t/sLoss vs baseline
No MTP (baseline)1015.34
n=2841.72-17.1%
n=3842.80-17.0%
n=4846.62-16.6%
n=5834.57-17.8%
n=6836.42-17.6%

MTP가 없을 때, 세 번의 베이스라인 실행은 기본적으로 동일한 수치(68.05, 68.06, 68.09 t/s)를 생성했습니다. 하지만 MTP를 켜는 순간, 동일한 n_max 값에서의 실행 결과들이 서로 어긋나기 시작했으며, n_max가 높아질수록 그 편차는 더 심해졌습니다. n=3일 때 실행 결과들은 서로 0.6 t/s 이내의 차이를 유지했습니다. 하지만 n=6일 때는 최댓값과 최솟값의 차이가 11 t/s에 달했습니다.

확실한 설명은 할 수 없지만, 제 추측으로는 MTP의 배치 검증(batched verification) 단계가 Metal 상에서 충분한 부동 소수점 연산 순서의 변동성(floating-point ordering variance)을 유발하여, 동일한 조건의 실행 간에도 생성 경로가 갈라지는 것으로 보입니다. n=4가 평균값은 약간 더 높지만, n=3이 신뢰할 수 있을 만큼 일관성을 유지했기 때문에 저는 n=3 쪽을 더 선호합니다. 사용자의 환경에 따라 수치는 다를 수 있겠지만, 어떤 설정을 선택하든 프롬프트 처리(prompt processing)에서의 손실은 상당히 정적인 것으로 보입니다. 참고: 저는 프롬프트 처리 개선 코드가 병합되었을 것으로 예상되는 b9200 버전을 빌드했습니다. n=3에서의 제 PP(Prompt Processing) 속도는 여전히 약 882 tps였으므로, 엄청난 도약은 아니었습니다. 제가 사용하는 전체 llama.cpp 실행 명령은 다음과 같습니다:

./llama-server -ngl 99 -c 65535 -fa on --spec-type draft-mtp --spec-draft-n-max 4 --model ~/models/MTP_Qwen3.6-35B-A3B-UD-Q8_K_XL/Qwen3.6-35B-A3B-UD-Q8_K_XL.gguf --mmproj ~/models/MTP_Qwen3.6-35B-A3B-UD-Q8_K_XL/mmproj-F32.gguf --image-min-tokens 2048 --image-max-tokens 8192 --parallel 1 --host 0.0.0.0 --jinja --port 5003 --ngl 99

-ngl 99: 오프로딩(offloading)이 발생하지 않도록 보장하기 위한 높은 수치입니다. 즉, 모델 전체가 Metal / 사용자의 GPU로 들어가야 함을 의미합니다.
-fa on: Flash Attention을 사용하도록 지정합니다.

  • --parallel 1: 저는 병렬 프롬프트(parallel prompts)를 사용하지 않습니다. Mac은 이를 잘 처리하지 못하며, llama.cpp가 캐시 체크포인트(cache checkpoints)를 처리하는 방식이 이에 영향을 받는데, 병렬 설정이 1보다 클 때 속도가 느려지는 것을 확인했기 때문에 안전을 위해 이 설정을 유지합니다.
  • --image-min-tokens 2048 --image-max-tokens 8192: 모델의 비전(vision) 부분에 대해 더 높은 품질을 강제합니다. 이전에 관련 포스트에서 언급한 적이 있는데, 이 설정을 적용했을 때와 그렇지 않았을 때의 품질 차이는 하늘과 땅 차이입니다. 다만 각 모델마다 허용 가능한 설정값이 다르다는 점에 유의하십시오.
  • --jinja: llama.cpp가 모델과 함께 제공되는 jinja 템플릿을 사용하도록 지시합니다. 이유를 명확히 알지 못하는 한 이 옵션을 켜두는 것이 좋습니다.
  • --host 0.0.0.0: 호스트를 0.0.0.0으로 설정하는 것은 일부 프로그램의 "--listen"과 같습니다. 원한다면 네트워크상의 다른 컴퓨터에서 이 llama.cpp 서버 인스턴스에 연결할 수 있게 해줍니다.

--port 5003: 연결할 포트를 설정합니다. 저는 서로 다른 모델들을 위해 여러 개의 llama.cpp 인스턴스를 동시에 실행하기 때문에 이 옵션을 지정합니다. -c 65535: 로드할 컨텍스트 크기 (context size)입니다. 저는 65535 토큰(tokens)을 선택했습니다. 참고: MTP (Multi-Token Prediction)가 활성화된 상태에서 이미지 입력을 보내면 llama.cpp가 충돌(crash)할 수 있다는 경고가 있습니다. 저는 모든 테스트를 실행할 때 비전 (vision) 기능을 켜두었으며, 해당 기능이 켜진 다른 대화에서 이미지를 몇 번 보냈음에도 충돌을 경험하지는 않았지만, 혹시 발생할 수 있는 문제에 대비해 참고하시기 바랍니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0