llama.cpp가 애플 기기의 그래픽 연산에서 버려야 할 값이 잘못된 계산 결과로 남던 문제를 고친 수정판을 공개했다. 해당 연산을 쓰는 개발자에게는 버릴 칸에 0을 기록해 다른 연산 백엔드, 연산을 실행하는 구현 계층과 결과를 맞추는 변화다.
1. 버릴 값을 곱하지 않고 0을 선택한다
수정이 담긴 b12220은 릴리스 페이지에서 사전 공개 버전으로 표시돼 있다. 관련 변경 제안인 풀 리퀘스트, 코드 변경을 검토받는 요청 #30711은 2026년 11월 9일 승인과 병합을 거쳤다.
삼각 연산은 행렬에서 지정된 삼각형 안쪽의 값만 유지하고 바깥쪽은 0으로 만드는 처리다. 여기서 NaN은 정상적인 수로 표현할 수 없는 계산 결과를 가리킨다. 버릴 칸을 단순히 가리는 것과 그 칸에 실제로 0을 기록하는 것의 차이가 이번 수정의 출발점이다.
이전 Metal 커널, GPU에서 실행되는 연산 코드는 비교 결과인 0 또는 1을 원래 값에 곱했기 때문에, 버릴 칸에 무한대가 있으면 0과의 곱셈에서 NaN이 생겼다. 이번에는 조건에 따라 원래 값 또는 0을 선택하도록 다음과 같이 바꿨다.
dst_row[i0] = _ggml_vec_tri_cmp<ttype>(i0, i1) ? src_row[i0] : static_cast<T>(0);2. 특수값을 넣는 검사 사례를 추가했다
변경에는 test_tri_special 검사 사례가 포함됐다. 바깥쪽에 버려질 값으로 양·음의 무한대를 넣고, 남길 칸에는 유한값을 둔다. 지울 값과 보존할 값을 나눠 배치함으로써 곱셈으로 지우는 방식과 0을 선택하는 방식의 차이를 드러낸다.
검사는 위쪽과 아래쪽 삼각형에 대해 대각선을 포함하는 경우와 제외하는 경우, 네 유형을 다룬다. 단순히 한 방향의 삼각형만 확인하는 대신, 어느 칸을 남길지 정하는 조건별로 특수값 처리를 점검한다.
검사를 실행하고 결과를 비교하는 프로그램은 입력이나 출력 어느 쪽에든 NaN이 있으면 거부한다. 따라서 새 검사는 양·음의 무한대를 이용한다. 변경 제안 설명에 따르면 비교 결과를 곱하도록 만든 CPU 커널에서는 네 사례가 실패하고, 수정 방식에서는 통과한다.
3. 기존 검사와 새 검사를 함께 통과했다
변경 제안에 적힌 검증 명령은 CPU와 Vulkan 백엔드에서 각각 삼각 연산 검사를 실행한다. 작성자는 두 명령 모두 기존 네 사례와 새 네 사례가 통과했다고 기록했다. 아래는 원문에 제시된 명령과 결과 주석이다.
test-backend-ops -o TRI -b CPU # 4 existing cases and the 4 new ones, all pass
test-backend-ops -o TRI -b Vulkan0 # same set, all pass병합된 변경 제안에는 자동 검사 25개가 통과한 것으로 표시돼 있다. 삼각 연산을 살펴보는 개발자는 위 명령으로 기존 사례와 새 특수값 사례를 함께 점검할 수 있다.
4. 영향과 확인할 점
수정의 이익은 버릴 칸의 무한대 때문에 생기던 잘못된 계산 결과를 없애는 데 있다. CPU와 Vulkan이 이미 0을 기록하던 자리에 같은 결과를 내도록 맞춘다는 점이 핵심이다.
대신 유지·관리할 검사 코드도 늘었다. 변경은 Metal 커널과 백엔드 연산 테스트 파일 두 곳에 걸쳐 68줄 추가와 2줄 삭제로 이뤄졌으며, 한 줄의 계산식 교체에 특수값 검사 사례가 함께 붙었다. 작은 연산 수정에도 문제를 다시 드러낼 수 있는 검사를 묶었다는 데 의미가 있다.
다만 변경 제안은 Metal 자체와 실행하지 않은 다른 백엔드에서의 직접 검증은 포함하지 않았다고 명시한다. 릴리스 노트와 변경 제안에는 계산 방식 교체에 따른 성능 측정값이 제시되지 않았다.
b12220은 Metal 삼각 연산에서 무한대가 NaN으로 번지는 원인을 좁게 고쳐, 버려야 할 칸을 0으로 처리하도록 한 업데이트다.
