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.

💡 Dica: Use a variável de ambiente 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


2. Uma História Real de Uma Desenvolvedora

⚠️ Aviso: Versão do CUDA e versão do driver NVIDIA devem corresponder. Drivers desatualizados podem resultar em 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:

BASH
# 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

💡 Dica: O Ollama carrega automaticamente o máximo de camadas do Modelo possível na GPU, colocando as camadas restantes na RAM da CPU (modo híbrido). Quando a VRAM é insuficiente para o Modelo completo, ele automaticamente recorre à Inferência híbrida GPU+CPU, com velocidade entre GPU pura e CPU pura.

(1) Arquitetura Quantização GGUF + GPU Offloading

⚠️ Nota: Quando a VRAM da GPU é insuficiente para carregar o Modelo completo, o Ollama automaticamente recorre ao modo híbrido GPU+CPU — algumas camadas do Modelo rodam na GPU e as restantes rodam na CPU. O desempenho do modo híbrido é significativamente inferior ao modo GPU puro, e a velocidade de Inferência por CPU depende da largura de banda da RAM do sistema. Se a velocidade de Inferência estiver muito abaixo do esperado (por exemplo, Modelo 8B abaixo de 20 tok/s), verifique se está ocorrendo fallback para CPU por VRAM insuficiente.

100%
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

TEXT
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
💡 Dica: O Ollama não precisa de uma instalação separada do CUDA Toolkit — o driver NVIDIA é suficiente. Basta garantir que 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

BASH
# 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:

TEXT
I'm a helpful AI assistant running locally on your machine...

▶ Exemplo 2: Configuração de GPU no WSL2

POWERSHELL
# 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:

TEXT
// 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
BASH
# 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
💡 Dica: A arquitetura de memória unificada do Apple Silicon é uma vantagem natural — VRAM = RAM. Um M4 Max com 128GB pode rodar Modelos 70B.

▶ Exemplo 3: Verificação Apple Metal

BASH
# 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:

TEXT
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

BASH
# 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:

TEXT
I'm a helpful AI assistant running locally on your machine...

▶ Exemplo 5: Diagnóstico de Alocação de Memória de GPU

BASH
#!/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:

TEXT
# Command executed successfully

7. Exemplo Abrangente: Script de Decisão de Implantação GPU

PYTHON
# ============================================
# 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-smi para 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 --verbose para 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=N para especificar o uso de N GPUs. CUDA_VISIBLE_DEVICES permite 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


📝 Exercícios

  1. Básico (Dificuldade ⭐): Verifique se a aceleração por GPU está funcionando na sua máquina, usando --verbose para comparar velocidades de Inferência CPU e GPU.
  2. 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.
  3. 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.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%