월~금 오전 7시, 일요일 오전 8시 — AI 뉴스와 용어를 보내드립니다메일로 받아보기

METAL LAB

goccy/go-llama

40GoMIT

C 라이브러리 없이 순수 Go 코드만으로 LLM을 돌리는 방법

go-llama는 AI 모델을 돌리는 유명 엔진인 llama.cpp를 WebAssembly로 컴파일한 뒤 다시 Go 코드로 변환해 만든 라이브러리다. cgo(C언어 연동 기능)나 별도의 공유 라이브러리 없이, 하나의 정적 바이너리만으로 GGUF 형식의 모델을 실행할 수 있다. Go 컴파일러가 지원하는 모든 환경에서 그대로 동작하는 것이 핵심이다.

무엇을 하는 레포인가

  1. llama.cpp를 llama-wasm 프로젝트로 WebAssembly로 컴파일한 뒤, wasm2go 도구로 다시 Go 언어 코드로 번역해서 실행 시점에는 wasm 런타임이 전혀 필요 없다.
  2. 하나의 Llama 인스턴스 안에 여러 모델을 올리고, 각 모델마다 여러 개의 대화 컨텍스트(KV 캐시)를 만들 수 있어 독립된 대화 여러 개를 하나의 모델로 서비스하거나, 추측 디코딩(작은 모델로 먼저 예측하고 큰 모델이 검증하는 가속 기법)에 필요한 여러 모델 동시 로드가 가능하다.
  3. 생성 결과를 토큰 단위로 실시간으로 받아보는 스트리밍 기능과, 다른 고루틴(Go의 경량 스레드)에서 생성을 즉시 중단시키는 인터럽트 기능을 제공한다.
  4. 디렉터리 접근 범위 제한, 메모리 상한 설정 등 샌드박스 옵션을 지원해 모델 실행 환경을 격리할 수 있다.
  5. wasm32 구조의 한계로 선형 메모리가 4GiB로 제한되어, 모델 가중치와 대화 컨텍스트의 KV 캐시가 모두 이 안에 들어가야 하므로 대략 30억 파라미터급 Q4 양자화 모델이 적정 크기로 권장된다.

왜 중요한가

cgo나 별도 공유 라이브러리 설치 없이 Go 애플리케이션 하나만 빌드해서 배포하면 되기 때문에, 여러 운영체제나 아키텍처에 크로스컴파일해 AI 추론 기능을 쉽게 심을 수 있다. 서버, CLI 도구, 임베디드 환경 등 Go가 돌아가는 곳이라면 별도 런타임 설치 걱정 없이 LLM 기능을 넣을 수 있다는 뜻이다.

이 레포의 용어

  • cgo · Go 코드에서 C 언어 라이브러리를 호출할 수 있게 해주는 Go의 기능
  • GGUF · llama.cpp 계열에서 쓰는 압축된 AI 모델 파일 형식
  • WebAssembly(wasm) · 브라우저나 다양한 환경에서 실행되도록 만든 저수준 바이트코드 포맷
  • KV 캐시 · 이전에 계산한 결과를 저장해 다음 단어 생성 속도를 높이는 대화별 임시 저장 공간
  • 추측 디코딩(speculative decoding) · 작은 모델이 먼저 여러 단어를 예측하고 큰 모델이 한 번에 검증해 속도를 높이는 기법

레포 원문 소개 (영문)

llama.cpp in pure Go

GitHub에서 보기

주목받는 레포

레포 전체 보기 →

METAL LAB 최신 기사