에이전트와 개발

llama.cpp, CUDA 프롬프트 처리 FFN 연산 융합과 오류 수정 5건 공개

llama.cpp가 2026년 10월 26일 b11879부터 b11883까지 다섯 빌드를 연달아 냈다. NVIDIA GPU의 프롬프트 처리 연산을 융합했고, GGUF 병합·문법 재귀·양자화 오류를 고쳤다.

루카스 ·

llama.cpp 프로젝트가 2026년 10월 26일 빌드 b11879부터 b11883까지 다섯 개를 연달아 공개했다. 첫 빌드 b11879는 CUDA 백엔드에서 프롬프트를 처리할 때 피드포워드 층(FFN)의 gate 행렬곱과 up 행렬곱을 하나로 합쳐 실행한다. 나머지 네 빌드는 GGUF 병합 도구, 메모리 캐시, 문법 파서, 양자화 도구의 오류를 각각 고쳤다.1,2,3,4,5

PNY 브랜드의 NVIDIA GeForce RTX 5060 Ti 16GB 그래픽카드 정면 사진. 듀얼 팬 구조의 검은색 쿨러가 보인다.
NVIDIA GeForce RTX 5060 Ti 16GB 그래픽카드 정면 사진FreeMediaKid! / Wikimedia Commons · CC BY-SA 4.0 · 원본 · 크기 조정

CUDA 융합 경로는 NVIDIA Turing 세대 이후 GPU에서 켜지고, Q4_K, Q5_K, Q6_K, Q8_0, IQ4_XS 양자화 형식에 적용된다. b11879 기준 내려받기 목록에는 macOS, iOS, Linux, Android, Windows용 빌드가 있고, CUDA 12와 13, Vulkan, ROCm, OpenVINO, SYCL 등 백엔드별 파일이 따로 있다. KleidiAI를 켠 macOS 빌드와 openEuler 항목은 비활성(DISABLED)으로 표시됐다.

b11879는 밀집 FFN의 gate와 up 행렬곱을 mul_mat_q 호출 한 번으로 처리하고, GLU(게이트 선형 단위) 계산을 결과를 쓰는 단계에서 함께 한다. 이런 연산 융합은 별도 커널 실행을 줄이는 방식이다.

로더는 gate 가중치를 두 번째 포인터로 받아, up 행과 gate 행을 8개 단위로 번갈아 가중치 타일에 채운다. 그래서 스레드 하나가 up 값과 짝이 되는 gate 값을 함께 쥔다. MMA 반복문은 타일, 워프 배치, vec_dot, 스레드당 sum[] 하나까지 그대로이고, 융합된 기록 단계가 레지스터에서 GLU를 계산해 행의 절반만 쓴다.

융합 경로는 stream-k 없이 일반 타일링을 쓰며, 열 타일을 가장 안쪽에 두어 이웃한 블록이 가중치 타일을 공유하게 했다. b11879에 묶인 커밋 가운데 하나는 양자화 형식과 GLU 연산별로 융합 gate/up MMQ 테스트 케이스를 하나씩 추가했다.1

b11880은 텐서 데이터가 잘린 GGUF 파일을 병합 도구가 거부하도록 바꿨다. b11881은 모든 메모리 캐시가 no_alloc 설정을 따르게 했다.2,3

b11882는 문법(grammar) 처리에서 재귀 깊이를 제한해 스택 오버플로를 막는다.4

b11883은 양자화 도구 두 곳을 고쳤다(#30820). 4차원 텐서의 전체 행 수를 ne[1]*ne[2]로 세던 탓에 ne[2]개 조각만 양자화되고 나머지 행이 빠졌다. 이제 ggml_nrows()로 ne[3]까지 모든 행을 센다. 이 수정은 이슈 #29916을 해결한다.

MXFP4_MOE 경로는 ne[2] > 1이면 전문가 혼합(MoE)의 전문가 텐서로 판정했는데, 이 조건은 3차원 이상인 비전문가 텐서에서 오판을 낳았다. MLA 투영(BailingMoE3)과 4차원 합성곱 커널이 그 예다. 이제 GGML_OP_MUL_MAT_ID가 쓰는 텐서 이름이 *_exps 또는 *_chexps인지로 판별하고, BailingMoE3 전용 예외 처리는 없앴다.

imatrix(중요도 행렬)는 2차원 조각마다 ne[0]개 값의 벡터를 담으므로 기대 크기는 ne[0]*ne[2]*ne[3]이다. 기존 계산은 ne[0]*ne[2]였다.5

댓글

기사에 대한 의견이나 틀린 내용 제보를 남겨 주세요.

댓글을 불러오고 있습니다.