llama.cpp 멀티 GPU
llama.cpp 멀티 GPU (Multi-GPU)
하나의 GPU VRAM에 모델이 다 안 들어갈 때, llama.cpp는 여러 GPU에 걸쳐 모델을 나눠서 실행할 수 있어요. 이 가이드는 분할 모드(split modes)와 그것을 제어하는 명령줄 플래그, 그리고 알아둬야 할 제약과 llama-cli·llama-server용 레시피를 다뤄요.
멀티 GPU가 필요한 상황은 크게 두 가지예요. 첫째, 모델이 단일 GPU VRAM에 안 들어가는 경우이고, 둘째, 연산을 여러 GPU에 분산해서 더 높은 처리량을 원하는 경우예요.
분할 모드 (Split Modes)
분할 모드는 --split-mode / -sm 플래그로 설정해요.
| 모드 | 동작 | 사용 시점 |
|---|---|---|
none |
단일 GPU만 사용. --main-gpu로 선택 |
더 많은 GPU가 보여도 모델을 한 GPU에 한정하고 싶을 때 |
layer (기본값) |
파이프라인 병렬화. 각 GPU가 레이어의 연속 슬라이스를 보유. 레이어 l의 KV 캐시는 그 레이어를 소유한 GPU에 저장 | 기본적이고 호환성이 높은 선택. 단일 GPU보다 더 많은 메모리가 필요하고 빠른 prefill이 우선순위일 때. GPU 간 느린 인터커넥트 허용 |
row |
더 이상 권장 안 함. 성능이 비교적 낮은 기존 row-split 텐서 병렬 경로. 밀집 가중치만 GPU에 분할 | 새 배포에서 회피 |
tensor |
실험적. "meta device" 추상화를 통해 가중치와 KV를 모두 참여 GPU에 분할하는 텐서 병렬 | 단일 GPU보다 더 많은 메모리가 필요하고 빠른 토큰 생성을 원할 때 |
파이프라인 병렬 vs 텐서 병렬
- 파이프라인 병렬(
layer): 서로 다른 레이어를 서로 다른 GPU에서 실행하고 토큰을 파이프라인을 따라 순차 처리해요. GPU 간 데이터 전송을 최소화하지만 확장하려면 많은 토큰이 필요해요. - 텐서 병렬(
tensor): 각 레이어를 GPU들에 분할하고 레이어마다 여러 번의 교차 GPU 리덕션을 수행해요. 어떤 워크로드도 병렬화할 수 있지만 GPU 인터커넥트 속도에 훨씬 더 병목이 걸려요.
정리하면 파이프라인 병렬은 배치 처리량을 최대화하고, 텐서 병렬은 지연 시간을 최소화해요.
GPU 선택하기
CUDA 프로그램과 마찬가지로 CUDA_VISIBLE_DEVICES 환경변수로 CUDA 백엔드가 사용할 GPU를 제어할 수 있어요. 이걸 설정하면 llama.cpp는 지정된 GPU만 보게 돼요. llama.cpp에 보이는 GPU들 중에서 고를 때는 --device를 사용해요. --device는 모든 백엔드에서 동작해요.
# GPU 0, 1만 사용
CUDA_VISIBLE_DEVICES=0,1 llama-server -m model.gguf --split-mode layer
더 알아보기
- llama.cpp 설치 가이드: CUDA/ROCm 등 백엔드 빌드
- llama.cpp Docker: 하드웨어별 컨테이너 이미지
- llama.cpp CLI 참조: 명령줄 완성 기능