Qwen3 Coder Next llama.cpp 그래프 최적화 — 최대 38% 추론 속도 향상

Qwen3 Coder Next llama.cpp 그래프 최적화 — 최대 38% 추론 속도 향상

ggerganov가 llama.cpp 컴퓨트 그래프를 재구성하여 Qwen3 Coder Next 80B 모델의 추론 속도를 최대 38% 향상시킨 최적화 기법과 벤치마크 결과를 분석합니다.

개요

llama.cpp의 핵심 개발자 ggerganov가 Qwen3 Coder Next 모델의 컴퓨트 그래프를 최적화하는 PR #19375를 공개했습니다. 불필요한 텐서 복사(copy) 연산을 제거하고 그래프 수준에서 추론 경로를 재구성함으로써, M2 Ultra에서 최대 38%, DGX Spark에서 최대 38%의 속도 향상을 달성했습니다. Reddit r/LocalLLaMA에서 177포인트 이상의 큰 관심을 받은 이 최적화의 핵심을 살펴보겠습니다.

핵심 아이디어: 그래프 레벨 최적화

이번 최적화의 핵심은 단순합니다. ggml 컴퓨트 그래프에서 불필요한 텐서 복사 연산을 제거하는 것입니다.

MoE(Mixture of Experts) 아키텍처인 Qwen3 Coder Next는 라우터가 활성화할 전문가를 선택하고, 각 전문가의 출력을 결합하는 과정에서 많은 중간 텐서 복사가 발생합니다. 기존 구현에서는 이러한 복사가 안전성을 위해 과도하게 삽입되어 있었는데, ggerganov는 실제로 필요한 복사만 남기고 나머지를 제거했습니다.

graph LR
    A[입력 텐서] --> B[라우터]
    B --> C[Expert 1]
    B --> D[Expert 2]
    B --> E[Expert 3]
    C --> F[출력 결합]
    D --> F
    E --> F
    F --> G[다음 레이어]

    style A fill:#00B4D8,color:#fff
    style F fill:#FFB703,color:#000
    style G fill:#00B4D8,color:#fff

벤치마크 결과

M2 Ultra 성능 비교

Qwen3 Coder Next 80B.A3B 모델을 다양한 양자화 수준에서 테스트한 결과입니다.

Q4_0 양자화

테스트기존 (t/s)최적화 (t/s)속도 향상
pp1 (단일 토큰)37.9251.991.37x
pp8 (8토큰 배치)137.75176.361.28x
pp512 (프롬프트)930.701125.731.21x
pp2048 (긴 프롬프트)1049.911352.311.29x
tg32 (생성)38.0250.391.33x

Q4_K_M 양자화

테스트기존 (t/s)최적화 (t/s)속도 향상
pp134.0046.471.37x
pp2048977.301232.471.26x
tg3234.6346.431.34x

Q8_0 양자화

테스트기존 (t/s)최적화 (t/s)속도 향상
pp134.3843.981.28x
pp20481047.391338.821.28x
tg3233.7543.781.30x

DGX Spark 성능 비교

NVIDIA DGX Spark에서도 유의미한 성능 향상이 확인됩니다.

양자화테스트기존 (t/s)최적화 (t/s)속도 향상
Q4_0pp5121055.581161.671.10x
Q4_0pp20481059.001324.661.25x
Q4_0tg3243.1159.581.38x
Q8_0pp20481009.431246.611.23x
Q8_0tg3231.1339.681.27x

주목할 점은 DGX Spark에서 tg32(토큰 생성) 시 Q4_0 기준 38% 속도 향상을 달성했다는 것입니다.

기술적 배경: 관련 백엔드 최적화

이 PR은 단독으로 존재하지 않습니다. 그래프 최적화가 효과를 발휘하려면 각 백엔드(Metal, CUDA, Vulkan)에서 비연속(non-contiguous) 텐서를 직접 처리할 수 있어야 합니다. 관련된 주요 PR들을 살펴보겠습니다.

Metal (Apple Silicon)

  • 적응형 CPU/GPU 인터리브 (#19369): 노드 수에 따라 CPU와 GPU 작업을 동적으로 분배
  • 바이너리 커널 통합 (#19390): 중복 커널 코드 제거
  • 유니터리 연산 통합 (#19490): 단항 연산 처리 개선
  • 비연속 텐서 L2 정규화 지원 (#19502)
  • 동시성 개선 (#19555)

CUDA (NVIDIA GPU)

  • 비연속 텐서 PAD 연산 확장 (#19429)
  • CUDA 그래프 활성화 (#19521): Qwen3 Next 스타일 아키텍처용
  • 융합 ADD 그래프 뮤테이션 방지 (#19566)

Vulkan

  • L2_NORM 연속 행 지원 (#19604)
  • GGML_OP_SET 지원 (#19584)

주의사항: BF16 텐서 문제

일부 GGUF 파일에서 1차원 BF16 텐서가 잘못 포함되어 있을 수 있습니다. 이는 Metal 등의 백엔드에서 성능 저하를 유발합니다. #19606에서 ffn_gate_inp_shexp 텐서를 F32로 저장하도록 수정하여 이 문제를 해결했습니다.

향후 계획

ggerganov는 이후 추가 최적화도 예고하고 있습니다.

  1. Qwen3 패밀리 코드 중복 제거 (#19597): delta-net 그래프 공유
  2. ggml_build_forward_select() 활용: 그래프를 상수화하여 추가 최적화 여지 확보
  3. 전용 delta net ggml 연산 도입 (#19504): 더 효율적인 커널 실행

로컬 LLM 사용자에게 미치는 영향

이번 최적화가 의미하는 바를 정리하면 다음과 같습니다.

  • Apple Silicon 사용자: M2 Ultra 기준으로 80B MoE 모델을 tg32에서 약 50 t/s로 실행 가능. 실시간 대화가 충분히 가능한 속도입니다.
  • NVIDIA GPU 사용자: DGX Spark에서도 20~38%의 속도 향상. CUDA 그래프 지원으로 추가 최적화가 기대됩니다.
  • 양자화 선택: Q4_0이 가장 큰 속도 향상을 보이지만, Q4_K_M과 Q8_0에서도 일관된 20~37%의 개선이 확인됩니다.
  • 코드 변경 불필요: llama.cpp를 최신 버전으로 업데이트하기만 하면 자동으로 적용됩니다.

결론

ggerganov의 이번 그래프 레벨 최적화는 llama.cpp의 MoE 모델 추론 성능을 크게 향상시켰습니다. 단순히 커널을 최적화하는 것이 아니라 컴퓨트 그래프 자체를 재구성하는 접근법이 인상적입니다. 특히 여러 백엔드(Metal, CUDA, Vulkan)에서 비연속 텐서 지원을 확대하는 병렬 작업과 결합되어, 로컬 LLM 추론의 성능 한계를 한 단계 끌어올리고 있습니다.

Qwen3 Coder Next와 같은 MoE 모델을 로컬에서 실행하는 사용자라면, llama.cpp를 최신 버전으로 업데이트하여 이 성능 향상을 즉시 체감해보시기 바랍니다.

참고 자료

다른 언어로 읽기

글이 도움이 되셨나요?

더 나은 콘텐츠를 작성하는 데 힘이 됩니다. 커피 한 잔으로 응원해주세요! ☕

저자 소개

JK

Kim Jangwook

AI/LLM 전문 풀스택 개발자

10년 이상의 웹 개발 경험을 바탕으로 AI 에이전트 시스템, LLM 애플리케이션, 자동화 솔루션을 구축합니다. Claude Code, MCP, RAG 시스템에 대한 실전 경험을 공유합니다.