llama.cpp 빌드하기

llama.cpp 빌드하기

이 프로젝트의 핵심 산출물은 llama 라이브러리고, 그 주변에 이 라이브러리를 쓰는 여러 예제 프로그램과 도구가 함께 들어 있어요. 소스를 받아서 원하는 백엔드(CPU, GPU)와 옵션에 맞게 빌드하는 과정을 정리해 드릴게요.

출처: llama.cpp build 문서

소스 받기

git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp

CPU 빌드 (기본)

CMake로 가장 간단하게 빌드할 수 있어요.

cmake -B build
cmake --build build --config Release
  • 컴파일을 빠르게 하려면 -j 인자로 병렬 작업 수를 늘리거나, Ninja 같은 자동 병렬 제너레이터를 쓰면 돼요. 예를 들어 cmake --build build --config Release -j 8은 8개 작업을 병렬로 돌려요.
  • 반복 컴파일이 잦다면 ccache를 설치하면 좋아요.
  • 정적 빌드는 -DBUILD_SHARED_LIBS=OFF를 추가하면 돼요.

Metal 빌드 (Apple Silicon)

macOS에서는 Metal이 기본으로 켜져 있고, 이러면 계산이 GPU에서 돌아요. 컴파일 시점에 끄려면 -DGGML_METAL=OFF를 주면 되고, Metal로 빌드해도 실행할 때 --n-gpu-layers 0 옵션으로 GPU 추론을 끌 수 있어요.

CUDA 빌드 (NVIDIA GPU)

NVIDIA GPU 가속을 쓰려면 CUDA 툴킷이 설치돼 있어야 해요.

cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release

기본적으로는 지금 연결된 하드웨어에 맞춰 빌드돼요. 모든 CUDA GPU에서 돌게 하려면 -DGGML_NATIVE=OFF로 네이티브 빌드를 끄면 되는데, 이 경우 JIT 컴파일이 필요할 수 있어요.

특정 CUDA 아키텍처만 지정하고 싶다면 CMAKE_CUDA_ARCHITECTURES에 Compute Capability를 나열하면 돼요.

cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89"

OpenCL 빌드

OpenCL을 쓰려면 먼저 헤더와 ICD 로더를 설치해야 해요 (Windows arm64 예시).

mkdir -p ~/dev/llm
cd ~/dev/llm
git clone https://github.com/KhronosGroup/OpenCL-Headers && cd OpenCL-Headers
mkdir build && cd build
cmake .. -G Ninja `
  -DBUILD_TESTING=OFF `
  -DOPENCL_HEADERS_BUILD_TESTING=OFF `
  -DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF `
  -DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl"
cmake --build . --target install

그다음 llama.cpp를 OpenCL 활성화로 빌드해요.

cmake .. -G Ninja `
  -DCMAKE_TOOLCHAIN_FILE="$HOME/dev/llm/llama.cpp/cmake/arm64-windows-llvm.cmake" `
  -DCMAKE_BUILD_TYPE=Release `
  -DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" `
  -DBUILD_SHARED_LIBS=OFF `
  -DGGML_OPENCL=ON
ninja

GPU 백엔드에 관한 참고

-ngl 0 옵션을 써도 GPU가 일부 연산을 가속할 수 있어요. GPU 가속을 완전히 끄려면 --device none을 쓰면 됩니다. 여러 백엔드를 동시에 빌드할 수도 있어요. 예를 들어 -DGGML_CUDA=ON -DGGML_VULKAN=ON처럼 CUDA와 Vulkan을 함께 빌드하고, 실행 시점에 --device 옵션으로 쓸 디바이스를 고를 수 있어요. 쓸 수 있는 디바이스 목록은 --list-devices로 확인할 수 있고, GGML_BACKEND_DL 옵션으로 빌드하면 백엔드를 런타임에 동적으로 로드할 수도 있어요.

더 알아보기