CPU에서 큰 언어 모델을 빠르게 돌리려면 압축을 끝까지 유지해야 한다

CPU만 쓰는 C99 기반 실행 엔진에서 Q4_K_S 모델을 돌렸을 때 속도가 크게 느렸다. 같은 i5-11300H 노트북, 같은 4개 스레드 조건에서 직접 만든 엔진은 초당 1.90토큰을 처리했고, 는 초당 13.79토큰을 처리했다. 차이는 약 7.3배였다.

원인은 계산 능력보다 메모리에서 읽어야 하는 데이터 양에 가까웠다. 직접 만든 엔진은 압축된 Q4K 가중치를 실행 전에 F32로 풀어 1개 값마다 4바이트를 읽게 만들었고, MoE 전문가 가중치도 호출 때마다 풀어 썼다. 는 Q4K 데이터를 그대로 읽어 1개 값당 약 0.5바이트만 쓰고, Q8로 압축한 활성값과 한 번에 곱셈 계산을 했다.

그래서 같은 에서도 읽는 데이터가 훨씬 적어 속도가 크게 빨랐다. AVX2, AVX512F, VNNI 같은 SIMD 방식을 바꿔도 2% 안팎밖에 차이가 나지 않았는데, 병목이 산술 계산이 아니라 메모리 읽기였기 때문이다.

핵심 포인트

  • 같은 CPU와 4개 스레드에서 직접 만든 엔진은 초당 1.90토큰, 는 초당 13.79토큰을 처리했다.
  • 속도 차이의 핵심 원인은 계산 방식보다 메모리에서 읽는 데이터 양이었다.
  • Q4K 가중치를 F32로 풀면 값 하나당 0.5바이트가 아니라 4바이트를 읽게 된다.
  • 는 Q4K 가중치와 Q8 활성값을 중간 F32 변환 없이 바로 계산한다.
  • SIMD 종류를 바꿔도 병목이 메모리 읽기라면 큰 속도 개선이 나오기 어렵다.
원문 보기