colibri: 744B MoE 모델을 25GB RAM 소비자 PC에서 실행하는 순수 C 추론 엔진

colibri 소개

colibri(colibrì)는 744B(7,440억) 파라미터 규모의 MoE(Mixture-of-Experts) 언어 모델을 약 25GB RAM을 가진 평범한 소비자 PC에서 실행하는 순수 C 추론 엔진입니다. 보통 이 정도 크기의 모델은 데이터센터급 GPU 여러 장을 요구하지만, colibri는 모델을 통째로 메모리에 올리는 대신 대부분의 가중치를 디스크에 남겨 두고 토큰을 생성할 때 실제로 필요한 부분만 읽어 들이는 방식으로 이 문제를 우회합니다.

이 접근이 가능한 이유는 MoE 구조의 특성에 있습니다. 744B 규모의 MoE 모델이라도 토큰 하나를 생성할 때 실제로 활성화되는 파라미터는 약 40B 수준이고, 그중에서도 토큰마다 바뀌는 부분은 라우팅되는 전문가(routed experts) 약 11GB 분량뿐입니다. colibri는 어텐션과 공유 전문가, 임베딩 등 항상 쓰이는 밀집(dense) 부분(약 17B 파라미터)만 int4로 양자화해 RAM에 상주시키고, 나머지 전문가 가중치는 디스크에 두고 스트리밍합니다.

엔진 본체는 c/glm.c 단일 C 파일(약 2,400줄)과 몇 개의 헤더로 이뤄져 있습니다. 런타임에는 BLAS도, Python도, GPU도 필요하지 않습니다(전문가를 VRAM에 고정하는 선택형 CUDA 계층이 별도로 있습니다). 이 프로젝트는 12코어 노트북과 25GB RAM 한 대로 혼자 작성·측정한 1인 프로젝트이며, 프로젝트 이름 colibrì는 이탈리아어로 벌새를 뜻합니다. 몇 그램짜리 벌새가 하루에 수천 송이의 꽃을 오가듯, 작은 엔진이 거대한 모델을 근근이 살려 낸다는 의미를 담고 있습니다.

colibri의 핵심 아이디어: 밀집 부분은 RAM, 전문가는 디스크

colibri의 저장소 계층은 두 단계로 나뉩니다. 항상 필요한 밀집 부분은 int4로 약 9.9GB를 차지하며 RAM에 상주하고, 75개 MoE 레이어 × 256개 전문가에 MTP 헤드를 더한 21,504개의 라우팅 전문가(각 int4에서 약 19MB, 합계 약 370GB)는 디스크에 놓입니다. 토큰을 생성할 때 MoE 라우터가 그 위치에 필요한 전문가만 골라 디스크에서 읽어 오고, 레이어별 LRU 캐시와 선택적 고정(pinned) 핫 스토어, 그리고 운영체제의 페이지 캐시가 사실상 무료 2차 캐시 역할을 합니다.

여기에 더해 colibri는 사용 패턴을 학습합니다. 대화가 실제로 어떤 전문가를 자주 호출하는지 .coli_usage 파일에 기록해 두고, 다음 실행 때 여유 RAM에 가장 자주 쓰이는 전문가를 미리 고정합니다. 쓸수록 캐시 적중률이 올라가 조금씩 빨라지는 구조입니다. 전문가 캐시 크기는 시작 시점에 MemAvailable 을 읽어 자동으로 정해지므로, RAM 예산 안에서 커널 OOM 없이 최대한 많은 전문가를 담습니다.

colibri의 주요 기능

colibri는 단순히 가중치를 디스크에서 읽어 오는 것을 넘어, 대형 MoE 모델을 CPU에서 정확하게 돌리기 위한 여러 기법을 구현하고 있습니다.

  • MLA 어텐션과 압축 KV 캐시: GLM-5.2의 MLA(q/kv-LoRA, 부분 RoPE) 어텐션을 구현하며, KV 캐시를 토큰당 576개 실수로 압축합니다. 원래의 32,768개 대비 57배 작은 크기입니다(GLM-5.2는 64개 헤드에 GQA가 없습니다).
  • 네이티브 MTP 추측 디코딩: GLM-5.2 자체의 다중 토큰 예측(Multi-Token Prediction) 헤드로 초안 토큰을 만들고 본 모델이 한 번의 배치 순전파로 검증합니다. 저자에 따르면 MTP 헤드는 반드시 int8이어야 하며, int4 헤드에서는 초안 수용률이 0~4%로 떨어져 추측이 아예 작동하지 않습니다. int8 헤드에서는 커뮤니티 측정 기준 39~59% 수용률, 순전파당 2.2~2.8 토큰을 기록합니다.
  • 문법 강제 추측 초안: JSON이나 함수 호출처럼 출력 형식이 정해진 작업에서는 GBNF 문법 자체가 세 번째 초안 소스가 됩니다. 문법이 단 하나의 합법 바이트만 허용하는 구간(중괄호, 따옴표, 키 이름 등)을 미리 수용된 초안으로 주입해 수용률을 약 1.0으로 끌어올립니다.
  • 정수 내적 커널과 양자화: int8 활성값(Q8_0 방식)과 AVX2 maddubs 명령을 사용하는 정수 행렬곱 커널을 갖추고 있으며, int8/int4/int2 패킹은 int8 컨테이너와 비트 단위로 동일함을 검증했습니다.
  • DSA 희소 어텐션: GLM-5.2의 라이트닝 인덱서를 그대로 구현해 레이어별로 상위 2,048개의 인과적 키만 선택합니다. 선택을 강제로 모든 키를 유지하도록 두면 밀집 어텐션과 토큰 단위로 동일한 출력을 재현합니다.
  • KV 캐시 지속성: 대화 모드에서 매 턴마다 압축된 MLA KV를 .coli_kv(토큰당 약 182KB, 크래시 안전)에 덧붙여 저장하고, 엔진을 재시작해도 재프리필 없이 이어 갑니다. 중단 없는 세션과 바이트 단위로 동일함을 검증했습니다.

저자는 MTP·CUDA 전문가 계층·배치 프리필이 양자화 정수 커널의 형태 의존적 반올림 때문에 비추측 그리디 출력과 바이트 단위로 완전히 같지는 않을 수 있다고 밝히고 있습니다. 다만 방출되는 모든 토큰은 여전히 유효한 순전파의 argmax이므로 생성 결과 자체는 올바르게 유지됩니다. 바이트 단위 재현성이 필요하면 DRAFT=0 으로 추측을 끄고 IDOT=0 COLI_CUDA=0 을 함께 지정하면 됩니다.

colibri 설치 및 사용법

빌드와 모델 준비는 저장소의 c/ 디렉토리에서 이뤄집니다. setup.sh 가 gcc와 OpenMP를 확인하고 빌드한 뒤 아키텍처 자체 테스트를 돌립니다. 변환 단계는 GLM-5.2 FP8 체크포인트를 샤드 단위(약 5GB씩)로 내려받아 int4 컨테이너로 변환하고 샤드를 지우는 방식이라, 756GB짜리 FP8 체크포인트 전체가 디스크에 한꺼번에 존재할 필요가 없습니다. 이 과정은 중단 후 재개할 수 있습니다.

cd c
./setup.sh                                # gcc/OpenMP 확인, 빌드, 자체 테스트

# FP8 → int4 변환 + MTP 헤드 변환까지 한 번에 (샤드 단위, 재개 가능)
./coli convert --model /nvme/glm52_i4     # 실제 NVMe 경로에 약 400GB 여유 필요

# 대화 실행 (RAM 예산, 전문가 캐시, MTP는 자동 감지)
COLI_MODEL=/nvme/glm52_i4 ./coli chat

이미 변환된 모델을 Hugging Face에서 받아 변환 단계를 건너뛸 수도 있습니다. 이때는 MTP 헤드가 int8로 교체된 버전(mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp)을 사용해야 추측 디코딩이 작동합니다.

colibri는 모델 한 벌을 계속 띄워 두고 OpenAI 호환 HTTP API를 제공하는 coli serve 모드도 갖추고 있습니다. 게이트웨이는 Python 표준 라이브러리만 사용하고, 추론은 여전히 의존성 없는 C 엔진에서 돌아갑니다.

COLI_MODEL=/nvme/glm52_i4 COLI_API_KEY=local-secret ./coli serve \
  --host 127.0.0.1 --port 8000 --model-id glm-5.2-colibri

구현된 엔드포인트는 GET /v1/models, POST /v1/chat/completions, 레거시 POST /v1/completions 등이며 SSE 스트리밍과 사용량 카운트를 지원합니다. 744B 모델을 하나의 프로세스에 유지하기 때문에, 동시 요청은 병렬로 모델을 중복 적재하는 대신 상한이 있는 FIFO 큐에 대기합니다.

colibri의 성능

colibri 저자는 이 엔진이 빠르다고 주장하지 않습니다. 개발 장비(WSL2, 12코어, 25GB RAM, VHDX를 거친 NVMe) 기준의 수치는 다음과 같습니다.

항목
디스크상 모델 크기(int4) 약 370GB
상주 RAM(밀집, int4) 9.9GB
로드 시간 약 30초
대화 중 최대 RSS 약 20GB(자동 상한)
콜드 디코딩 비용 토큰당 약 11GB 디스크 읽기
콜드 상태 처리량(이 개발 장비 기준) 약 0.05~0.1 토큰/초

디코딩은 디스크 대역폭에 묶입니다. 그래서 더 빠른 저장장치와 넉넉한 RAM은 곧바로 처리량으로 이어집니다. 커뮤니티가 실제 하드웨어에서 측정해 이슈로 보고한 결과 중 일부를 옮기면, 128GB 통합 메모리를 가진 Apple M5 Max에서는 기본 설정에서 약 1.06 토큰/초(전문가 적중률 23%), Metal 백엔드와 46.9GB 전문가 고정을 적용한 구성에서는 약 2.06 토큰/초까지 올라갑니다. 반대로 RAM이 24GB뿐인 장비에서는 엔진이 전문가 캐시를 레이어당 2칸으로 자동 제한하기 때문에, 디스크가 2배 이상 빨라도 콜드 상태를 벗어나지 못합니다. 저자는 이를 두고 "작은 RAM 장비에서는 디스크가 아니라 RAM 상한이 병목"이라고 정리합니다.

한편 int4 양자화가 정확도에 미치는 영향은 아직 측정되지 않았습니다. 저자는 벤치마크 하네스(coli bench 로 HellaSwag·ARC·MMLU 실행)는 준비돼 있지만 개발 장비의 느린 디스크로는 전체 실행에 하루 가까이 걸려서, 빠른 장비를 가진 사용자가 수치를 이슈로 보고해 주는 것이 프로젝트에 가장 필요한 기여라고 밝히고 있습니다.

colibri의 라이선스

colibri는 Apache 2.0 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다. 엔진이 구동하는 GLM-5.2 가중치 자체는 Z.ai가 MIT 라이선스로 배포합니다.

:framed_picture: colibri용 GLM-5.2 int4 모델 (Hugging Face)

:github: colibri 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요