Ollama: Configuração de GPU e CUDA
GPU é o acelerador da IA local — de 5 tokens por segundo para 50 tokens por segundo, uma diferença de dez vezes.
CUDA_VISIBLE_DEVICES para controlar precisamente quais GPUs o Ollama usa. Por exemplo, CUDA_VISIBLE_DEVICES=0 usa apenas a primeira GPU, enquanto CUDA_VISIBLE_DEVICES=0,1 usa as duas primeiras. Em servidores multi-GPU, essa variável permite especificar GPUs de Inferência e evitar que o Ollama ocupe GPUs que outras tarefas estão usando.
📋 Pré-requisitos: Você precisa dominar o seguinte primeiro
1. O Que Você Vai Aprender
- Princípios de aceleração GPU do Ollama: Quantização GGUF + GPU Offloading
- Detecção e configuração de ambiente NVIDIA CUDA
- Aceleração AMD ROCm e Apple Metal
- Inferência multi-GPU e estratégias de alocação de memória
- Estimativa de VRAM e conversão de contagem de parâmetros do Modelo
2. Uma História Real de Uma Desenvolvedora
nvidia-smi funcionando normalmente mas o Ollama sendo incapaz de usar a GPU. Recomendamos instalar driver NVIDIA ≥ 535 e CUDA ≥ 12.0, e confirmar que a CUDA Version na saída do nvidia-smi corresponde ao CUDA Toolkit real.
(1) O Problema: Inferência por CPU É Muito Lenta
O produto SaaS da Alice precisa de análise em tempo real de feedback de clientes. A velocidade de Inferência por CPU é de apenas 5 tokens/s — uma resposta de 200 tokens leva 40 segundos, resultando em uma experiência terrível para o usuário. Seu servidor tem uma GPU NVIDIA mas o Ollama não a está usando.
(2) A Solução: Aceleração por GPU Entrega 10x de Velocidade
Após configurar CUDA, a velocidade de Inferência do mesmo Modelo aumentou de 5 tokens/s para 55 tokens/s — uma resposta de 200 tokens agora leva apenas 3.6 segundos:
# Verify GPU detection
ollama run --verbose llama3.2 "test"
# Before (CPU): eval speed: 5.0 tokens/s
# After (GPU): eval speed: 55.0 tokens/s
3. Princípios de Aceleração por GPU
(1) Arquitetura Quantização GGUF + GPU Offloading
flowchart LR
A[Modelo GGUF<br/>Q4_K_M] --> B{Estratégia de Carregamento}
B -->|GPU Completa| C[VRAM da GPU<br/>Inferência Rápida]
B -->|Parcial| D[Camadas GPU<br/>+ RAM da CPU<br/>Modo Híbrido]
B -->|Apenas CPU| E[RAM da CPU<br/>Inferência Lenta]
O Ollama usa uma estratégia de "offloading de camadas", distribuindo camadas do Modelo entre GPU (rápida) e CPU (lenta):
| Modo | Estratégia de Alocação | Velocidade | Requisitos de Memória |
|---|---|---|---|
| GPU completa | Todas as camadas na VRAM | Mais rápida (50+ tok/s) | VRAM ≥ tamanho do Modelo |
| Modo híbrido | Algumas camadas GPU + algumas CPU | Média (15-30 tok/s) | VRAM < tamanho do Modelo |
| Apenas CPU | Todas as camadas na RAM | Mais lenta (3-10 tok/s) | RAM ≥ tamanho do Modelo |
(2) Fórmula de Estimativa de Requisitos de VRAM
VRAM needed (GB) ≈ Parameters (B) × Quantization bytes × 1.2 (overhead)
Examples:
7B Q4_K_M: 7 × 0.5 bytes × 1.2 ≈ 4.2 GB
8B Q4_K_M: 8 × 0.5 bytes × 1.2 ≈ 4.8 GB
70B Q4_K_M: 70 × 0.5 bytes × 1.2 ≈ 42 GB
| Modelo | Quantização | VRAM Mínima | VRAM Recomendada |
|---|---|---|---|
| 3B | Q4_K_M | 2 GB | 4 GB |
| 8B | Q4_K_M | 5 GB | 8 GB |
| 8B | Q8_0 | 9 GB | 12 GB |
| 70B | Q4_K_M | 42 GB | 48 GB (2×24GB) |
| 70B | Q8_0 | 75 GB | 80 GB (4×24GB) |
4. Configuração NVIDIA CUDA
(1) Verificação de Instalação do CUDA
| Passo | Comando | Saída Esperada |
|---|---|---|
| Verificar GPU | nvidia-smi |
Mostra modelo da GPU e VRAM |
| Verificar versão CUDA | nvidia-smi | grep "CUDA Version" |
CUDA Version: 12.x |
| Verificar nvcc | nvcc --version |
Mostra versão do toolkit CUDA |
| Verificar Ollama | ollama run --verbose model |
Mostra velocidade eval |
nvidia-smi seja executável; o Ollama detecta e usa a GPU automaticamente.
(2) Configuração Específica por Plataforma
| Plataforma | Pontos-chave de Configuração | Observações |
|---|---|---|
| Linux | Instalar driver NVIDIA | Mais simples, suporte nativo |
| Windows WSL2 | Instalar driver NVIDIA no Windows | WSL2 herda GPU automaticamente |
| Windows nativo | Instalar driver NVIDIA | Ollama 0.5+ suporte nativo |
▶ Exemplo 1: Verificação de Ambiente CUDA no Linux
# Step 1: Check GPU is visible
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
# NVIDIA GeForce RTX 4090, 24576 MiB, 550.54.15
# Step 2: Verify CUDA version
nvidia-smi | grep "CUDA Version"
# CUDA Version: 12.4
# Step 3: Test Ollama GPU acceleration
ollama run --verbose llama3.2 "Hello"
# Look for: "load duration" (should be < 1s with GPU)
# Look for: "eval speed" (should be 30+ tokens/s with GPU)
# Step 4: Check which device Ollama is using
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i cuda
# cuda: detected devices [0]
Saída:
I'm a helpful AI assistant running locally on your machine...
▶ Exemplo 2: Configuração de GPU no WSL2
# On Windows: verify NVIDIA driver installed
nvidia-smi
# Enter WSL2
wsl
# Inside WSL2: verify GPU passthrough
nvidia-smi
# Should show same GPU as Windows
# Install Ollama in WSL2
curl -fsSL https://ollama.com/install.sh | sh
# Test GPU inference
ollama run --verbose llama3.2 "Hello"
# eval speed should show GPU-level performance
Saída:
// Execution successful
5. AMD ROCm e Apple Metal
(1) Suporte AMD ROCm (Apenas Linux)
| Série de GPU | Suporte | Observações |
|---|---|---|
| RX 7900 XTX | ✅ | ROCm 5.7+ |
| RX 7900 XT | ✅ | ROCm 5.7+ |
| RX 6800 XT | ✅ | ROCm 5.5+ |
| RX 580 | ❌ | Não suportado |
| Windows | ❌ | ROCm suporta apenas Linux |
# Verify ROCm is working
rocminfo | grep "gfx"
# Should show gfx1100 (RDNA3) or gfx1030 (RDNA2)
# Ollama auto-detects AMD GPU on Linux
ollama run --verbose llama3.2 "Hello"
# Should show: using AMD GPU
(2) Aceleração Apple Metal
| Hardware | Memória Unificada | Modelo Recomendado |
|---|---|---|
| M1 (8GB) | 8 GB | 3B Q4_K_M |
| M2 (16GB) | 16 GB | 8B Q4_K_M |
| M3 Pro (18GB) | 18 GB | 8B Q4_K_M |
| M4 Max (128GB) | 128 GB | 70B Q4_K_M |
▶ Exemplo 3: Verificação Apple Metal
# On macOS: Metal acceleration is automatic
ollama run --verbose llama3.2 "Hello"
# Check Metal usage in logs
# Look for: "using Metal" in debug output
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i metal
# Monitor GPU usage
# Open Activity Monitor → GPU tab
# Or use: sudo powermetrics --samplers gpu_power -i 1000
Saída:
I'm a helpful AI assistant running locally on your machine...
6. Estratégias Multi-GPU
(1) Opções de Configuração Multi-GPU
| Variável de Ambiente | Padrão | Descrição |
|---|---|---|
| OLLAMA_NUM_GPU | Auto | Número de GPUs a usar |
| CUDA_VISIBLE_DEVICES | Todas | Especificar GPUs visíveis |
| OLLAMA_LLD_LIBRARY_PATH | auto | Tipo de driver (cuda/rocm/metal) |
(2) Comparação de Cenários Multi-GPU
| Cenário | Configuração de GPU | Modelos Executáveis | Estratégia |
|---|---|---|---|
| GPU única 8GB | 1× RTX 3060 | 8B Q4_K_M | Offload completo para GPU |
| GPU única 24GB | 1× RTX 4090 | 8B Q8_0 / 70B Q2_K | Offload completo |
| GPU dupla 48GB | 2× RTX 4090 | 70B Q4_K_M | Modelo dividido entre duas GPUs |
| GPU quádrupla 320GB | 4× A100 80GB | 405B Quantizado | Paralelismo de tensor |
▶ Exemplo 4: Configuração Multi-GPU
# Use 2 GPUs for inference
export OLLAMA_NUM_GPU=2
ollama serve
# Or specify which GPUs to use
export CUDA_VISIBLE_DEVICES=0,1
ollama serve
# Verify multi-GPU usage
nvidia-smi # Both GPUs should show memory usage during inference
# Run a large model that needs 2 GPUs
ollama run llama3.1:70b "Explain quantum computing"
Saída:
I'm a helpful AI assistant running locally on your machine...
▶ Exemplo 5: Diagnóstico de Alocação de Memória de GPU
#!/bin/bash
# GPU memory diagnostic script
echo "=== GPU Memory Report ==="
echo ""
nvidia-smi --query-gpu=index,name,memory.total,memory.used,memory.free --format=csv
echo ""
echo "=== Model Memory Estimation ==="
estimate_vram() {
local params=$1
local quant=$2
local overhead=1.2
local vram=$(echo "scale=1; $params * $quant * $overhead" | bc)
echo " ${params}B model (${quant}B/param): ~${vram}GB VRAM needed"
}
estimate_vram 3 0.5 # Q4_K_M ~0.5 bytes/param
estimate_vram 8 0.5 # Q4_K_M
estimate_vram 8 1.0 # Q8_0
estimate_vram 70 0.5 # Q4_K_M
estimate_vram 70 1.0 # Q8_0
echo ""
echo "=== Recommendation ==="
total_vram=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | awk '{sum+=$1} END {print sum}')
echo "Total VRAM: ${total_vram}MB (~$((total_vram/1024))GB)"
if [ "$total_vram" -gt 40000 ]; then
echo "Can run: 70B Q4_K_M (recommended) or 8B Q8_0"
elif [ "$total_vram" -gt 8000 ]; then
echo "Can run: 8B Q4_K_M (recommended)"
elif [ "$total_vram" -gt 4000 ]; then
echo "Can run: 3B Q4_K_M"
else
echo "GPU VRAM too low. Use CPU-only mode with 16GB+ RAM."
fi
Saída:
# Command executed successfully
7. Exemplo Abrangente: Script de Decisão de Implantação GPU
# ============================================
# Comprehensive: GPU deployment decision engine
# Analyzes hardware and recommends model config
# ============================================
import subprocess
import json
from dataclasses import dataclass
from typing import Optional
@dataclass
class GPUInfo:
name: str
vram_mb: int
index: int
@dataclass
class ModelRecommendation:
model: str
quantization: str
vram_needed_gb: float
fits: bool
strategy: str
def detect_gpus() -> list[GPUInfo]:
"""Detect available GPUs via nvidia-smi."""
try:
result = subprocess.run(
["nvidia-smi", "--query-gpu=index,name,memory.total",
"--format=csv,noheader,nounits"],
capture_output=True, text=True
)
gpus = []
for line in result.stdout.strip().split("\n"):
if line:
parts = [p.strip() for p in line.split(",")]
gpus.append(GPUInfo(
index=int(parts[0]),
name=parts[1],
vram_mb=int(float(parts[2]))
))
return gpus
except Exception:
return []
def estimate_vram(params_b: float, quant_bytes: float) -> float:
"""Estimate VRAM needed for a model."""
return params_b * quant_bytes * 1.2
def recommend_models(total_vram_gb: float) -> list[ModelRecommendation]:
"""Recommend models based on available VRAM."""
models = [
("llama3.2:3b", 3.2, 0.5, "Q4_K_M"),
("llama3.1:8b", 8.0, 0.5, "Q4_K_M"),
("llama3.1:8b", 8.0, 1.0, "Q8_0"),
("llama3.1:70b", 70.0, 0.5, "Q4_K_M"),
]
recs = []
for name, params, qbytes, quant in models:
needed = estimate_vram(params, qbytes)
fits = needed <= total_vram_gb
if fits:
strategy = "Full GPU offload"
elif needed <= total_vram_gb * 1.5:
strategy = "Hybrid (partial GPU + CPU)"
else:
strategy = "CPU only or multi-GPU required"
recs.append(ModelRecommendation(
model=name, quantization=quant,
vram_needed_gb=round(needed, 1),
fits=fits, strategy=strategy
))
return recs
# Main analysis
if __name__ == "__main__":
gpus = detect_gpus()
if not gpus:
print("No NVIDIA GPU detected. Using CPU-only mode.")
print("Recommended: llama3.2:3b with 8GB+ RAM")
else:
total_vram = sum(g.vram_mb for g in gpus) / 1024
print(f"Detected {len(gpus)} GPU(s):")
for g in gpus:
print(f" GPU {g.index}: {g.name} ({g.vram_mb}MB)")
print(f"Total VRAM: {total_vram:.1f}GB")
print()
print("Model Recommendations:")
for r in recommend_models(total_vram):
status = "✅" if r.fits else "❌"
print(f" {status} {r.model} ({r.quantization}): "
f"{r.vram_needed_gb}GB - {r.strategy}")
❓ Perguntas Frequentes
P: O Ollama mostra Inferência por CPU mas tenho uma GPU, o que devo fazer? R: Execute
nvidia-smipara confirmar que o driver está funcionando. No Linux, verifique se o usuário está no grupo video:sudo usermod -aG video $USER. Reinicie o serviço Ollama:sudo systemctl restart ollama.
P: A velocidade de Inferência por GPU está mais lenta que o esperado, o que devo fazer? R: Isso pode ser modo híbrido (algumas camadas na CPU). Verifique a saída
--verbosepara contagem de camadas na GPU. Reduzir num_ctx pode diminuir o uso de memória do KV Cache, permitindo mais camadas na GPU.
P: GPU AMD funciona no Windows? R: Atualmente ROCm suporta apenas Linux. GPUs AMD não podem acelerar o Ollama no Windows. Recomendamos usar Linux ou considerar uma GPU NVIDIA.
P: A aceleração Metal no Mac precisa de configuração? R: Não. No macOS, o Ollama usa automaticamente aceleração Metal com configuração zero. Qualquer Mac com Apple Silicon ou GPU AMD é detectado automaticamente.
P: Como os Modelos são distribuídos entre múltiplas GPUs? R: O Ollama distribui automaticamente as camadas do Modelo uniformemente entre as GPUs disponíveis. Defina
OLLAMA_NUM_GPU=Npara especificar o uso de N GPUs.CUDA_VISIBLE_DEVICESpermite selecionar GPUs específicas.
P: Posso rodar um Modelo grande se a VRAM é insuficiente mas a RAM é adequada? R: Sim. O Ollama usa automaticamente o modo híbrido — algumas camadas na GPU, algumas na RAM da CPU. A velocidade fica entre GPU pura e CPU pura.
📖 Resumo
- Aceleração por GPU é implementada via offloading de camadas: GPU completa é mais rápida, modo híbrido é intermediário, apenas CPU é mais lento
- Estimativa de VRAM: contagem de parâmetros × bytes de quantização × 1.2 coeficiente de overhead
- NVIDIA requer apenas instalação do driver (sem CUDA Toolkit necessário); Ollama detecta automaticamente
- AMD ROCm é apenas para Linux; Apple Metal no macOS requer configuração zero
- Multi-GPU é controlado via OLLAMA_NUM_GPU e CUDA_VISIBLE_DEVICES
- Cenário da Alice: aceleração por GPU aumentou a velocidade de Inferência de 5 tok/s para 55 tok/s
📝 Exercícios
- Básico (Dificuldade ⭐): Verifique se a aceleração por GPU está funcionando na sua máquina, usando
--verbosepara comparar velocidades de Inferência CPU e GPU. - Intermediário (Dificuldade ⭐⭐): Com base no tamanho da VRAM da sua GPU, calcule o maior Modelo que você pode rodar (qual contagem de parâmetros + qual nível de Quantização), e verifique com teste real.
- Avançado (Dificuldade ⭐⭐⭐): Teste diferentes estratégias de alocação de GPU em um ambiente multi-GPU (GPU única vs multi-GPU), registrando velocidade de Inferência, latência do primeiro token e uso de memória, e produza um relatório de comparação de desempenho.