Pular para o conteúdo principal

Backend GPU e Otimização

Este artigo apresenta os vários backends de GPU suportados pelo KataGo, diferenças de desempenho e como ajustar para obter o melhor desempenho.


Visão Geral dos Backends

O KataGo suporta quatro backends de computação:

BackendSuporte de HardwareDesempenhoDificuldade de Instalação
CUDAGPU NVIDIAMelhorMédia
OpenCLGPU NVIDIA/AMD/IntelBomSimples
MetalApple SiliconBomSimples
EigenCPU puraMais lentoMais simples

Backend CUDA

Cenários de Uso

  • GPU NVIDIA (GTX série 10 e superior)
  • Necessita do melhor desempenho
  • Tem ambiente de desenvolvimento CUDA

Requisitos de Instalação

# Verificar versão do CUDA
nvcc --version

# Verificar cuDNN
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR
ComponenteVersão Recomendada
CUDA11.x ou 12.x
cuDNN8.x
Driver470+

Compilação

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)

Características de Desempenho

  • Tensor Cores: Suporta aceleração FP16 (série RTX)
  • Inferência em lote: Melhor utilização da GPU
  • Gerenciamento de memória: Controle fino do uso de VRAM

Backend OpenCL

Cenários de Uso

  • GPU AMD
  • GPU integrada Intel
  • GPU NVIDIA (sem ambiente CUDA)
  • Implantação multiplataforma

Requisitos de Instalação

# Linux - Instalar kit de desenvolvimento OpenCL
sudo apt install ocl-icd-opencl-dev

# Verificar dispositivos OpenCL disponíveis
clinfo

Compilação

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

Escolha de Driver

Tipo de GPUDriver Recomendado
AMDROCm ou AMDGPU-PRO
Intelintel-opencl-icd
NVIDIAnvidia-opencl-icd

Ajuste de Desempenho

# config.cfg
openclDeviceToUse = 0 # Número da GPU
openclUseFP16 = auto # Meia precisão (quando suportado)
openclUseFP16Storage = true # Armazenamento FP16

Backend Metal

Cenários de Uso

  • Apple Silicon (M1/M2/M3)
  • Sistema macOS

Compilação

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

Otimização para Apple Silicon

A arquitetura de memória unificada do Apple Silicon tem vantagens especiais:

# Configuração recomendada para Apple Silicon
numNNServerThreadsPerModel = 1
nnMaxBatchSize = 16
numSearchThreads = 4

Comparação de Desempenho

ChipDesempenho Relativo
M1~RTX 2060
M1 Pro/Max~RTX 3060
M2~RTX 2070
M3 Pro/Max~RTX 3070

Backend Eigen (CPU Pura)

Cenários de Uso

  • Sem ambiente GPU
  • Testes rápidos
  • Uso de baixa intensidade

Compilação

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

Expectativa de Desempenho

CPU single-core: ~10-30 playouts/seg
CPU multi-core: ~50-150 playouts/seg
GPU (gama média): ~1000-3000 playouts/seg

Parâmetros de Ajuste de Desempenho

Parâmetros Principais

# config.cfg

# === Configuração de Rede Neural ===
# Número da GPU (para múltiplas GPUs)
nnDeviceIdxs = 0

# Threads de inferência por modelo
numNNServerThreadsPerModel = 2

# Tamanho máximo do lote
nnMaxBatchSize = 16

# Tamanho do cache (2^N posições)
nnCacheSizePowerOfTwo = 20

# === Configuração de Busca ===
# Threads de busca
numSearchThreads = 8

# Máximo de visitas por jogada
maxVisits = 800

Guia de Ajuste de Parâmetros

nnMaxBatchSize

Muito pequeno: Baixa utilização da GPU, alta latência de inferência
Muito grande: VRAM insuficiente, tempo de espera longo

Valores recomendados:
- 4GB VRAM: 8-12
- 8GB VRAM: 16-24
- 16GB+ VRAM: 32-64

numSearchThreads

Muito poucos: Não consegue alimentar a GPU
Muitos: Gargalo de CPU, pressão de memória

Valores recomendados:
- 1-2x o número de núcleos de CPU
- Similar ao nnMaxBatchSize

numNNServerThreadsPerModel

CUDA: 1-2
OpenCL: 1-2
Eigen: Número de núcleos de CPU

Ajuste de Memória

# Reduzir uso de VRAM
nnMaxBatchSize = 8
nnCacheSizePowerOfTwo = 18

# Aumentar uso de VRAM (melhorar desempenho)
nnMaxBatchSize = 32
nnCacheSizePowerOfTwo = 22

Configuração Multi-GPU

Múltiplas GPUs em uma Máquina

# Usar GPU 0 e GPU 1
nnDeviceIdxs = 0,1

# Threads por GPU
numNNServerThreadsPerModel = 2

Balanceamento de Carga

# Distribuir peso conforme desempenho da GPU
# GPU 0 é mais potente, recebe mais trabalho
nnDeviceIdxs = 0,0,1

Benchmark

Executar Benchmark

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

Interpretação da Saída

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

Dados de Desempenho Comuns

GPUModeloPlayouts/seg
RTX 3060b18c384~2500
RTX 3080b18c384~4500
RTX 4090b18c384~8000
M1 Prob18c384~1500
M2 Maxb18c384~2200

Aceleração TensorRT

Cenários de Uso

  • GPU NVIDIA
  • Busca por desempenho máximo
  • Aceita tempo de inicialização mais longo

Como Habilitar

# Habilitar na compilação
cmake .. -DUSE_BACKEND=CUDA -DUSE_TENSORRT=ON

# Ou usar versão pré-compilada
katago-tensorrt

Ganho de Desempenho

CUDA padrão: 100%
TensorRT FP32: +20-30%
TensorRT FP16: +50-80% (série RTX)
TensorRT INT8: +100-150% (requer calibração)

Observações

  • Primeira inicialização requer compilar engine TensorRT (alguns minutos)
  • GPUs diferentes requerem recompilação
  • FP16/INT8 podem reduzir levemente a precisão

Problemas Comuns

GPU Não Detectada

# Verificar status da GPU
nvidia-smi # NVIDIA
rocm-smi # AMD
clinfo # OpenCL

# KataGo lista GPUs disponíveis
katago gpuinfo

VRAM Insuficiente

# Usar modelo menor
# b18c384 → b10c128

# Reduzir tamanho do lote
nnMaxBatchSize = 4

# Reduzir cache
nnCacheSizePowerOfTwo = 16

Desempenho Abaixo do Esperado

  1. Confirmar uso do backend correto (CUDA > OpenCL > Eigen)
  2. Verificar se numSearchThreads é suficiente
  3. Confirmar que a GPU não está ocupada por outros programas
  4. Usar comando benchmark para confirmar desempenho

Checklist de Otimização de Desempenho

  • Escolher o backend correto (CUDA/OpenCL/Metal)
  • Instalar drivers de GPU mais recentes
  • Ajustar nnMaxBatchSize conforme VRAM
  • Ajustar numSearchThreads conforme CPU
  • Executar benchmark para confirmar desempenho
  • Monitorar utilização da GPU (deve ser > 80%)

Leitura Adicional