llama.cpp PR, x86 CPU에서 Q2_0 속도 3.0~3.6배 향상 (8B 모델 기준 2.39 → 8.20 tok/s)
A llama.cpp PR makes Q2_0 3.0–3.6x faster on x86 CPUs, 8B decode goes 2.39 → 8.20 tok/s
핵심 요약
llama.cpp의 새로운 PR이 x86 CPU의 Q2_0 연산 속도를 3배 이상 가속화하여 삼항 가중치 모델의 효율을 크게 높였습니다.
- 성능 향상 — Q2_0 연산에 AVX-VNNI/AVX-512 VNNI 경로를 추가하여 3배 이상의 처리량 달성함
- 삼항 모델 최적화 — 일반적인 2비트 양자화가 아닌, 삼항 가중치로 학습된 Bonsai 모델에 특화된 가속임
- 하드웨어 제약 — 인텔 12~14세대 CPU처럼 AVX-512가 비활성화된 경우 가속 경로를 타지 못하는 이슈 존재함
- 테스트 요청 — 작성자가 일반 소비자용 하드웨어(Zen 4/5, Raptor Lake 등)에서의 벤치마크 결과를 공유해달라고 요청함
llama.cpp CPU PR들 훑어보다가 #26348이 눈에 띄었는데, 이건 평소 보던 5%짜리 커널 최적화 수준이 아니더라.
Q2_0 × Q8_0 내적 연산에 x86 VNNI 구현을 추가한 건데, 작성자가 직접 돌린 CPU 전용 벤치마크 보니까 1.7B부터 27B까지 Bonsai 모델 전반에서 처리량이 대략 3~3.6배 정도 떡상함.
환경:
-
AMD EPYC 9645
-
8 CPU 코어
-
CPU 전용
-
GGML_NATIVE=ON
-
OpenMP 활성화
-
BLAS 비활성화
-
-t 8 -ngl 0 -fa off
-
웜업 후 3회 측정
-
group-64 Q2_0 Bonsai GGUF 사용
결과:
1.7B
pp512: 14.07 → 50.47 tok/s (3.59배)
tg128: 10.22 → 33.28 tok/s (3.26배)
4B
pp512: 5.41 → 19.40 tok/s (3.59배)
tg128: 4.45 → 13.36 tok/s (3.00배)
8B
pp512: 2.82 → 10.26 tok/s (3.64배)
tg128: 2.39 → 8.20 tok/s (3.43배)
27B
pp128: 0.79 → 2.85 tok/s (3.59배)
tg32: 0.72 → 2.37 tok/s (3.32배)
27B 베이스라인은 pp128 한 번 돌리는 데 3분 가까이 걸릴 정도로 원래 존나 느렸음.
실제로 바뀐 건 별거 없음. 기존 Q2_0 내적 연산이 범용 구현에 의존하던 걸 AVX-VNNI / AVX-512 VNNI를 타도록 경로를 뚫어준 게 다임.
이걸 가져온 Prism 레퍼런스 구현에서 일반 소비자용 인텔 CPU 관련해서 흥미로운 문제도 하나 발견됨.
i5-13400 같은 경우, 12~14세대 인텔은 AVX-VNNI는 있는데 AVX-512는 막혀있거든. 그래서 Q2_0이 빠른 경로를 못 타고 그냥 느려터진 상태로 돌아가는데, 사용자한테는 아무런 알림도 안 뜸. 그냥 Q2_0이 존나 느린가 보다 하고 넘어가는 거지.
작성자가 i5-13400으로 A/B 테스트한 결과:
Ternary-Bonsai-8B Q2_0
decode: 2.17 → 6.92 tok/s
prompt eval: 2.7 → 8.6 tok/s
이것도 VNNI 경로 타니까 3.2배 정도 펌핑됨.
주의할 점 몇 가지:
-
upstream llama.cpp PR은 아직 오픈 상태고 머지 안 됨

