에이전트와 개발

llama.cpp, Intel Arc Pro B70에서 IQ3_S 모델 디코딩 53~82% 빨라져

llama.cpp 정기 빌드 묶음에서 SYCL 백엔드의 IQ3 가중치 재배치가 들어가 Intel Arc Pro B70의 IQ3_S 모델 디코딩이 컨텍스트 길이에 따라 53~82% 빨라졌다. CPU 스레드 메모리 오류와 x86 변환 속도 저하, conv_1d 결과 배치도 고쳤다.

루카스 ·

llama.cpp 프로젝트가 2026년 10월 15일 올린 정기 빌드 가운데 b11636에 SYCL 백엔드의 IQ3_S와 IQ3_XXS 양자화 가중치 재배치가 들어갔다. Intel Arc Pro B70에서 IQ3_S 모델을 돌렸을 때 토큰 생성(디코딩) 속도가 컨텍스트 길이에 따라 53~82% 빨라졌다고 변경 내역에 적혀 있다. 컨텍스트가 0일 때 82%, 64,000일 때 53%다.1

같은 날 올라온 빌드 b11627, b11630, b11633, b11635에는 ggml 주석과 테스트 정리, conv_1d 결과 배치 수정, CPU 백엔드의 스레드 버퍼 오류 수정, x86 FP16 변환 속도 저하 복구가 각각 들어갔다. 빌드는 macOS, Linux, Android, Windows용 바이너리로 배포된다. SYCL은 Ubuntu x64용 FP32와 FP16 빌드, Windows x64 빌드로 제공된다.1,2,3,4,5

SYCL IQ3 가중치 재배치

이번 변경(#29107)은 IQ3_S와 IQ3_XXS 가중치를 모델을 불러올 때 한 번만 새 배치로 바꿔 두는 방식이다. 이후 MMVQ 내적 연산은 조밀한 슈퍼블록을 dp4a와 SWAR 부호 확장으로 훑는다. 기존에는 뒤섞인 표준 배치에서 비트를 하나씩 모아 와야 했다. 재배치를 인식하는 역양자화 경로도 추가돼, 배치 프리필 GEMM에도 같은 배치가 쓰인다.

측정 조건은 Intel Arc Pro B70, Qwen3.8-27B-GSQ-RCO-IQ3_S(MTP), 옵션 -ngl 999 -b 4096 -ub 1024 -fa on이다. tg256은 토큰 256개를 생성하는 디코딩 측정이다. 아래 수치는 변경을 올린 쪽이 직접 잰 값이다.1

Intel Arc Pro B70 측정 결과(토큰/초)1
항목변경 전변경 후변화
tg256, 컨텍스트 012.9223.54+82%
tg256, 컨텍스트 9,21612.3321.69+76%
tg256, 컨텍스트 64,0009.7614.91+53%
pp8192(프리필)833.9833.6변화 없음

Qwen3.5-9B Q4_K_M과 Q3_K_M은 오차 범위 안에서 변하지 않았다. 프리필의 최대 변화폭은 -0.5%였고 디코딩은 변동이 없었다. 변경을 올린 쪽은 측정한 이 표준 양자화 모델에는 영향이 없다고 밝혔다.

DNNL 패키지가 없거나 CPU 전용 DNNL 빌드일 때 이전에는 성능이 떨어진 백엔드가 조용히 만들어졌지만, 이제 구성 단계에서 실패한다.

IQ3 양자화 모델을 Intel GPU에서 SYCL로 돌리는 사용자가 이번 개선의 대상이다. 변경 내역에 제시된 측정은 Arc Pro B70 한 기종에서 이뤄졌다.1

CPU와 ggml 수정

b11633(#30454)은 CPU 백엔드의 SET_ROWS 연산에서 나던 메모리 오류를 고쳤다. 이 연산은 작업 수 1로 계획되지만 모든 스레드가 실행하며 각자 F16에서 F32로의 변환 버퍼 행을 쓴다. 그래프에 다중 스레드 연산이 따로 있으면 0번 이후 스레드가 작업 버퍼 바깥에 쓰고 있었다. 수정은 이 연산을 작업 수가 스레드 수인 그룹으로 옮겼다.4

b11635(#30342, #30343)는 x86 CPU의 속도 저하를 되돌렸다. 앞선 변경 #30270 이후 Q8_0과 Q4_0 MUL_MAT_ID 커널이 실측으로 45~65% 느려졌는데, 이번에 복구했다. #30270은 두 스칼라 변환을 모두 F16C 명령으로 돌렸고, Clang 20.1.8이 FP16에서 FP32로 변환하는 코드를 양자화 내적 연산의 누산 레지스터에 병합하는 명령(vpinsrw)으로 만들어 반복문이 직렬화됐다. 반복당 사이클은 F16C 경로가 19, 룩업 테이블이 4로 추정됐다. 이번에는 FP32에서 FP16 변환만 F16C를 쓰고 FP16에서 FP32 변환은 룩업 테이블로 되돌렸다.5

b11630(#28738)은 ggml_conv_1d가 배치 입력에서 결과 배치를 잘못 내던 문제를 고쳤다. GEMM이 배치를 행에 합쳐 결과가 메모리에 [OL, N, OC]로 놓이는데 reshape는 [OL, OC, N]이라고 가정해, 형태는 맞지만 내용이 전치돼 채널과 배치가 뒤섞였다. 오류나 중단도 없었다. N이 1이면 두 해석이 같은 버퍼를 가리키므로 트리 안의 보코더 세 종은 호출 직후 2차원으로 줄여 영향받지 않았다.

수정은 실제 배치 형태로 결과를 되돌린 뒤 OC와 N의 순서를 다시 바꾼다. 리뷰어 요청으로 N == 1 분기를 없애, ggml_conv_2d처럼 모든 배치 크기에서 같은 그래프를 만든다. 새 테스트 tests/test-conv-1d.cpp는 배치 합성곱 한 번을 단일 배치 N번과 비교한다. 일곱 가지 형상 중 다섯이 수정 전에 실패했고 수정 후 모두 통과했다. 나머지 둘은 N이나 OC가 1이라 순서를 바꿔도 달라지지 않아 수정 전에도 통과한다.

mtmd에서는 지금 보코더를 배치로 쓰는 곳이 없다. 각 보코더가 하나의 흐름을 스트리밍하며 호출 사이에 왼쪽 문맥을 넘겨받기 때문이다. 변경을 올린 쪽은 다운스트림 오디오 프로젝트에서 여러 합성 레인이 한 그래프를 공유할 때 이 수정이 필요하다고 설명했다.3

b11627(#30501)은 ggml에 mul_mat_id 관련 주석을 달고 mul_mat_id_dup 테스트를 비활성화했다.2

댓글

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

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