Reddit

llama: add Maple 20B-A1B ternary MoE architecture (CPU) by AlexGabbia · Pull Request #27000 · ggml-org/llama.cpp

llama.cpp, Maple 20B-A1B ternary MoE 아키텍처 CPU 지원 추가 (PR #27000)

llama.cpp에 DeepGrove의 ternary MoE 모델 Maple 20B-A1B를 CPU에서 지원하는 PR이 올라왔습니다. 24개 레이어에 256개 expert 중 8개를 활성화하는 구조로, Apple M4 기준 생성 88 t/s를 기록했고 TQ1_0/TQ2_0 ternary 양자화를 지원합니다.

본문

로컬 LLM 추론 엔진 llama.cpp에 DeepGrove의 ternary MoE(Mixture-of-Experts) 모델 Maple 20B-A1B를 추가하는 PR이 진행 중입니다. CPU 범위로 스코프가 한정된 이 PR은 단순한 아키텍처 추가를 넘어, perplexity 수치 불일치의 원인을 끝까지 추적해 해결한 검증 과정이 읽을 거리입니다.

Maple 아키텍처와 구현 내용

Maple 20B-A1B는 24개 레이어, 레이어당 256개 expert 중 8개를 활성화(활성 파라미터 약 1B)하는 상시 MoE 구조입니다. sliding-window attention(SWA-512)과 global attention을 3:1 비율로 교차 배치하고, partial rotary factor는 0.5입니다. 구현상 특징으로는 projection 이후 적용하는 Q/K RMS norm(Gemma4 방식), SWA 레이어에만 RoPE를 적용하는 nope_on_global_attention, ISWA KV cache, +7로 클램프하는 swiglu gate(DeepSeek4 방식) 등이 있습니다. TQ1_0/TQ2_0 ternary 양자화를 지원하며, 모델 내 유일한 dense 텐서인 TOKEN_EMBD와 OUTPUT은 F16으로 강제됩니다. HF→GGUF 변환기는 MapleForCausalLM을 등록하고 per-expert 가중치를 3D 텐서로 병합하며, n_expert가 0이면 모델이 예외를 던지므로 테스트 하니스는 MoE 설정만 실행합니다. Apple M4에서 TQ2_0 기준 prefill 216 t/s, 생성 88 t/s가 보고됐습니다.

Perplexity 검증과 수치 불일치 추적

이 PR의 하이라이트는 PPL 불일치 디버깅입니다. 초기에 기여자 간 wikitext-2 PPL @512가 79.76 대 86.92로 크게 벌어졌고, q2_0 ARM 커널 버그가 의심됐습니다. 그러나 q2_0 → TQ1_0 재양자화 왕복이 해시 단위로 bit-identical함이 확인돼 가중치 문제는 배제됐고, 최종적으로 원인은 테스트 데이터 파일 자체였습니다. 한쪽 파일이 CRLF 줄바꿈과 2,890개의 추가 개행을 포함해 토큰화가 달라졌고, 같은 모델·같은 머신에서 파일만 바꿨을 때 5.77 PPL 차이가 발생했습니다. 공식 스크립트가 받는 파일로 재측정한 결과 TQ2_0 head-F16은 85.21, head-Q4_K는 86.70으로 수렴했고, TQ1_0과 TQ2_0은 같은 ternary 가중치의 패킹만 다르므로 PPL이 동일하게 나옵니다. 또 한 가지 교훈은 @2048이 @512보다 PPL이 낮게 나오는데, 이는 4번째 레이어마다 배치된 global attention이 단거리 패턴을 보완하기 때문이라고 정리됐습니다.

코드 리뷰 과정

리뷰에서는 swiglu_clamp_exp 값을 로더의 폴백이 아니라 변환기가 기록하고 로더가 필수로 읽게 바꿨는데, llama-graph가 limit 0이면 클램프를 통째로 건너뛰어 선택적 읽기는 조용히 비클램프 상태로 동작할 수 있기 때문입니다. sliding_window_pattern이 배열 키를 요구해 테스트 하니스의 아키텍처 목록에 Maple을 추가했고, 변환기의 stack() 클로저는 LazyBase의 Callable 시그니처와 맞지 않아 ty가 지적한 뒤 kimi_k3 방식으로 args 전달로 수정됐습니다. CUDA용 TQ2_0 지원은 별도 드래프트 PR #28769로 분리됐으며, AMD HIP은 CI가 컴파일만 하고 수치 검증을 하지 않아 AMD GPU 보유자에게 test-backend-ops의 TQ2_0 케이스 실행을 요청한 상태입니다.

Reddit 반응

  • @PassengerPigeon343 — CPU에서 잘 돌아간다면 GPU 상주 모델 옆에 붙일 태스크 모델로 훌륭할 것입니다. 지금은 Qwen 3.5 0.8B를 쓰는데 그리 똑똑하지는 않습니다.
  • @pmttyji — DeepGrove/maple-preview GGUF가 Mac Mini M4에서 200+ t/s, iPhone에서 120+ t/s가 나옵니다. CUDA와 Vulkan 백엔드도 작업 중이라고 합니다.
  • @Dany0 — 'flash' 모델이 무엇인지 설명해 줬으면 합니다. 풀 모델이 fp16이고 flash가 ternary quant인지 궁금합니다.
  • @Nameis19letterslong — 실제로 돌려 본 사람이 있습니까? sparse 20B-A1B의 Q2가 dense 27B의 Q2와 견줄 수 있다고는 보기 어렵습니다.
  • @crusaderky — 자체 보고 벤치마크가 GLM-4.7-Flash 수준의 지능으로 이어진다는 큰 전제가 성립해도, 지금은 비슷한 지능과 비슷한 RAM에 DSpark까지 갖춘 MiniCPM5-2B가 있어 매력이 떨어집니다.

원문: GitHub (llama.cpp PR #27000) / 번역·요약: Trawling