80달러짜리 Tesla P100이 수년간 llama.cpp에서 조용히 노이즈 섞인 연산을 수행해왔습니다. 단 세 줄로 무료 해결 가능합니다.
**Your $80 Tesla P100 has been doing silently noisy math in llama.cpp for years. Three lines fix it, for free.**
핵심 요약
Tesla P100 GPU에서 llama.cpp의 잘못된 FP16 연산 경로로 발생하던 수치 오류를 3줄의 패치로 해결했습니다.
- P100 연산 오류 — 잘못된 FP16 경로 설정으로 인해 수치적 노이즈 발생함
- 3줄 패치 해결 — sm_60 아키텍처를 sm_61과 동일하게 예외 처리하여 문제 수정함
- 성능 영향 없음 — 실제 워크로드에서는 GEMM과 메모리 대역폭이 병목이라 성능 저하 없음
- 가성비 GPU 재조명 — P100의 HBM2 성능이 이번 패치로 다시 주목받음
TLDR;
나왔다 — turboquant v0.3.0 버전, 지금 바로 다운로드 가능. https://github.com/TheTom/llama-cpp-turboquant/releases/tag/tqp-v0.3.0
llama.cpp의 CUDA 코드에는 "이 GPU는 fp16 연산이 빠르니까 fp16으로 계산해라"라는 플래그가 있음.
GTX 10 시리즈랑 P40(sm_61)은 진작에 여기서 제외됐는데, 아이러니하게도 P100(sm_60)은 제외가 안 됐음. P100은 파스칼 아키텍처 카드 중에서 유일하게 fp16 하드웨어 가속이 되는 놈이라 엔비디아가 성능 뽑아먹으려고 fp16 실리콘을 박아놨거든. 근데 정작 그 성능을 제대로 확인 안 한 모양임.
PR 현황: TheTom (병합됨) https://github.com/TheTom/llama-cpp-turboquant/pull/212
spiritbuun (열려있음) https://github.com/spiritbuun/buun-llama-cpp/pull/80
GGML: AI가 짠 코드 기여에 대해 엄청 깐깐함. 내가 시간 내서 직접 이슈 하나 파볼 생각임. 그전까진 위에 있는 포크 버전들 쓰는 거 강력 추천함.
패치는 딱 3줄임.
본문
며칠 전에 내 P100 4개 달린 박스에서 buun이 만든 새로운 KV-캐시 코덱 벤치마크 돌리다가, buun이 자기 3090에서 뽑은 수치랑 비교해 봤거든. 근데 똑같은 모델인데도 우리 기기 사이에서 결과값 품질 차이가 계속 나는 거야. 분명 다 똑같이 설정한 줄 알았는데 말이지. 보통 같으면 "변수가 너무 많아서 뭐가 문제인지 모르겠네" 하고 넘겼을 텐데, 이번엔 파고들 가치가 있다고 판단했음. 그리고 그게 llama.cpp에 몇 년 동안 박혀있던 심각한 버그를 찾아내는 계기가 됐지.
그래서 측정해 봤음. fp32 기준 로짓(Qwen3.6-27B, wikitext-2 데이터셋으로 전체 분포에 대한 KL 발산 측정)이랑 비교해서:
결과:
- 중앙값 KLD: 0.0023 → 0.000001 (약 2300배 정밀해짐)
- Top-token 일치율: 96.5% → 99.9% — 기존에는 모델이 다음 토큰을 고를 때 29번 중 1번꼴로 수학적으로 나와야 할 값과 다른 엉뚱한 걸 골랐다는 소리임.
그래서 연산량 늘어난 만큼 성능 손해 봤냐고? 8k 깊이에서 3개 모델 클래스(27B 하이브리드, 4B 덴스, 36B MoE)로 프리필이랑 디코드 벤치마크 돌려봤음. 프리필은 오차 범위 내에서 똑같았고, 디코드는 오히려 패치 적용한 게 1.4% 정도 더 빨랐음. 그 "빠른" 경로라는 게 사실 아무짝에도 쓸모없었던 거임. P100에서 실제 작업은 GEMM이랑 메모리 대역폭이 병목이지, fp16 벡터 경로가 문제가 아니거든. 패치는 sm_61에 이미 적용되어 있던 예외 처리를 똑같이 적용하는 3줄짜리 코드임.
다들 자기 4090 고장 난 거 아니냐고 호들갑 떨기 전에 말하는데, 이건 sm_60에서만 측정된 거임. GTX 1080/P40은 원래부터 문제없었음(이미 예외 처리됨). 볼타 이후 아키텍처는 이 패치랑 상관없고 아예 다른 커널을 돌리니까 걱정 마셈. 다른 아키텍처도 측정 안 된 정밀도 문제가 있는지는 내가 지금 계속 파보는 중임. 이걸 보고 "모든 GPU가 다 고장 났다"고 받아들이지 말고, "특정 GPU 하나가 그랬는데 이제 고쳐졌다"고 이해하면 됨.


