본문으로 건너뛰기

GPU 백엔드와 최적화

이 문서는 KataGo가 지원하는 다양한 GPU 백엔드, 성능 차이 및 최적 성능을 위한 튜닝 방법을 소개합니다.

KataGo는 CUDA, OpenCL, Metal, Eigen 네 가지 계산 백엔드를 제공합니다. NVIDIA GPU는 CUDA가 가장 빠르고, 여러 제조사를 아우르려면 OpenCL, Apple Silicon은 Metal, 순수 CPU는 Eigen을 사용합니다. 최적화의 핵심은 알맞은 백엔드를 고르고 배치 크기(nnMaxBatchSize)와 스레드 수를 조정해 GPU를 충분히 활용하는 것입니다.


백엔드 개요

KataGo는 네 가지 계산 백엔드를 지원합니다:

백엔드하드웨어 지원성능설치 난이도
CUDANVIDIA GPU최상중간
OpenCLNVIDIA/AMD/Intel GPU양호쉬움
MetalApple Silicon양호쉬움
Eigen순수 CPU느림가장 쉬움

CUDA 백엔드

적용 시나리오

  • NVIDIA GPU (GTX 10 시리즈 이상)
  • 최고 성능 필요
  • CUDA 개발 환경 보유

설치 요구사항

# CUDA 버전 확인
nvcc --version

# cuDNN 확인
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR
구성 요소권장 버전
CUDA11.x 또는 12.x
cuDNN8.x
드라이버470+

컴파일

cd KataGo/cpp
mkdir build && cd build

cmake .. -DUSE_BACKEND=CUDA \
-DCUDNN_INCLUDE_DIR=/usr/local/cuda/include \
-DCUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so

make -j$(nproc)

성능 특징

  • Tensor Cores: FP16 가속 지원 (RTX 시리즈)
  • 배치 추론: GPU 활용률 최상
  • 메모리 관리: VRAM 사용량 세밀하게 제어 가능

OpenCL 백엔드

적용 시나리오

  • AMD GPU
  • Intel 내장 그래픽
  • NVIDIA GPU (CUDA 환경 없이)
  • 크로스 플랫폼 배포

설치 요구사항

# Linux - OpenCL 개발 패키지 설치
sudo apt install ocl-icd-opencl-dev

# 사용 가능한 OpenCL 장치 확인
clinfo

컴파일

cmake .. -DUSE_BACKEND=OPENCL
make -j$(nproc)

드라이버 선택

GPU 유형권장 드라이버
AMDROCm 또는 AMDGPU-PRO
Intelintel-opencl-icd
NVIDIAnvidia-opencl-icd

성능 튜닝

# config.cfg
openclDeviceToUse = 0 # GPU 번호
openclUseFP16 = auto # 반정밀도 (지원 시)
openclUseFP16Storage = true # FP16 저장

Metal 백엔드

적용 시나리오

  • Apple Silicon (M1/M2/M3)
  • macOS 시스템

컴파일

cmake .. -DUSE_BACKEND=METAL
make -j$(sysctl -n hw.ncpu)

Apple Silicon 최적화

Apple Silicon의 통합 메모리 아키텍처는 특별한 장점이 있습니다:

# Apple Silicon 권장 설정
numNNServerThreadsPerModel = 1
nnMaxBatchSize = 16
numSearchThreads = 4

성능 비교

상대 성능
M1~RTX 2060
M1 Pro/Max~RTX 3060
M2~RTX 2070
M3 Pro/Max~RTX 3070

Eigen 백엔드 (순수 CPU)

적용 시나리오

  • GPU 환경 없음
  • 빠른 테스트
  • 낮은 강도 사용

컴파일

sudo apt install libeigen3-dev
cmake .. -DUSE_BACKEND=EIGEN
make -j$(nproc)

예상 성능

CPU 싱글 코어: ~10-30 playouts/sec
CPU 멀티 코어: ~50-150 playouts/sec
GPU (중급): ~1000-3000 playouts/sec

성능 튜닝 파라미터

핵심 파라미터

# config.cfg

# === 신경망 설정 ===
# GPU 번호 (다중 GPU 시 사용)
nnDeviceIdxs = 0

# 모델당 추론 스레드 수
numNNServerThreadsPerModel = 2

# 최대 배치 크기
nnMaxBatchSize = 16

# 캐시 크기 (2^N 위치)
nnCacheSizePowerOfTwo = 20

# === 탐색 설정 ===
# 탐색 스레드 수
numSearchThreads = 8

# 수당 최대 방문 횟수
maxVisits = 800

파라미터 튜닝 가이드

nnMaxBatchSize

너무 작으면: GPU 활용률 낮음, 추론 지연 높음
너무 크면: VRAM 부족, 대기 시간 김

권장값:
- 4GB VRAM: 8-12
- 8GB VRAM: 16-24
- 16GB+ VRAM: 32-64

numSearchThreads

너무 적으면: GPU를 충분히 활용 못함
너무 많으면: CPU 병목, 메모리 압박

권장값:
- CPU 코어 수의 1-2배
- nnMaxBatchSize와 비슷하게

numNNServerThreadsPerModel

CUDA: 1-2
OpenCL: 1-2
Eigen: CPU 코어 수

메모리 튜닝

# VRAM 사용량 줄이기
nnMaxBatchSize = 8
nnCacheSizePowerOfTwo = 18

# VRAM 사용량 늘리기 (성능 향상)
nnMaxBatchSize = 32
nnCacheSizePowerOfTwo = 22

다중 GPU 설정

단일 머신 다중 GPU

# GPU 0과 GPU 1 사용
nnDeviceIdxs = 0,1

# GPU당 스레드 수
numNNServerThreadsPerModel = 2

로드 밸런싱

# GPU 성능에 따라 가중치 배분
# GPU 0이 더 강력하면 더 많은 작업 배분
nnDeviceIdxs = 0,0,1

벤치마크 테스트

벤치마크 실행

katago benchmark -model model.bin.gz -config config.cfg

출력 해석

GPU 0: NVIDIA GeForce RTX 3080
Threads: 8, Batch Size: 16

Benchmark results:
- Neural net evals/second: 2847.3
- Playouts/second: 4521.8
- Time per move (1000 visits): 0.221 sec

Memory usage:
- Peak GPU memory: 2.1 GB
- Peak system memory: 1.3 GB

일반적인 성능 데이터

GPU모델Playouts/초
RTX 3060b18c384~2500
RTX 3080b18c384~4500
RTX 4090b18c384~8000
M1 Prob18c384~1500
M2 Maxb18c384~2200

TensorRT 가속

적용 시나리오

  • NVIDIA GPU
  • 극한 성능 추구
  • 긴 초기화 시간 수용 가능

활성화 방법

# 컴파일 시 활성화
cmake .. -DUSE_BACKEND=CUDA -DUSE_TENSORRT=ON

# 또는 사전 컴파일 버전 사용
katago-tensorrt

성능 향상

표준 CUDA: 100%
TensorRT FP32: +20-30%
TensorRT FP16: +50-80% (RTX 시리즈)
TensorRT INT8: +100-150% (교정 필요)

주의사항

  • 첫 시작 시 TensorRT 엔진 컴파일 필요 (수 분)
  • 다른 GPU는 재컴파일 필요
  • FP16/INT8은 정밀도가 약간 떨어질 수 있음

일반적인 문제

GPU가 감지되지 않음

# GPU 상태 확인
nvidia-smi # NVIDIA
rocm-smi # AMD
clinfo # OpenCL

# KataGo에서 사용 가능한 GPU 나열
katago gpuinfo

VRAM 부족

# 더 작은 모델 사용
# b18c384 → b10c128

# 배치 크기 줄이기
nnMaxBatchSize = 4

# 캐시 줄이기
nnCacheSizePowerOfTwo = 16

예상보다 낮은 성능

  1. 올바른 백엔드 사용 확인 (CUDA > OpenCL > Eigen)
  2. numSearchThreads가 충분한지 확인
  3. GPU가 다른 프로그램에 점유되어 있지 않은지 확인
  4. benchmark 명령으로 성능 확인

성능 최적화 체크리스트

  • 올바른 백엔드 선택 (CUDA/OpenCL/Metal)
  • 최신 GPU 드라이버 설치
  • VRAM에 맞게 nnMaxBatchSize 조정
  • CPU에 맞게 numSearchThreads 조정
  • benchmark 실행하여 성능 확인
  • GPU 사용률 모니터링 (80% 이상이어야 함)

추가 읽기