Inferencia local

Inferência Local de LLMs

Ver 05-inferencia/servidores.md para referência completa dos servidores. Este arquivo foca nos aspectos de setup e configuração para uso local (laptop, workstation, servidor próprio).


Ollama — Experiência Local Mais Simples

# Instalar (Linux/Mac)
curl -fsSL https://ollama.com/install.sh | sh

# Baixar e rodar modelo
ollama run qwen2.5-coder:7b
ollama run llama3.3:70b

# Servidor API (OpenAI-compatible)
ollama serve  # localhost:11434

# Listar modelos locais
ollama list

*odelos úteis para dev:*

ollama pull qwen2.5-coder:7b      # 4.7 GB
ollama pull qwen2.5-coder:32b     # 20 GB  
ollama pull deepseek-coder-v2:16b # 9.1 GB
ollama pull codellama:34b         # 19 GB

llama.cpp — Máxima Flexibilidade

# Compilar
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j $(nproc) LLAMA_CUDA=1  # NVIDIA GPU
# ou: make -j LLAMA_METAL=1    # Apple Silicon

# Baixar modelo GGUF
huggingface-cli download \
  Qwen/Qwen2.5-Coder-7B-Instruct-GGUF \
  qwen2.5-coder-7b-instruct-q4_k_m.gguf

# Servidor
./llama-server \
  --model qwen2.5-coder-7b-instruct-q4_k_m.gguf \
  --ctx-size 8192 \
  --n-gpu-layers 99 \
  --port 8080

vLLM — Servidor de Produção Local

pip install vllm

# Iniciar servidor
vllm serve Qwen/Qwen2.5-Coder-32B-Instruct \
  --dtype bfloat16 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 32768 \
  --enable-prefix-caching

# Com quantização AWQ (cabe em 1 GPU 24GB)
vllm serve Qwen/Qwen2.5-Coder-32B-Instruct-AWQ \
  --quantization awq \
  --gpu-memory-utilization 0.90

SGLang — Structured Output e Agents

pip install sglang

python -m sglang.launch_server \
  --model-path Qwen/Qwen2.5-Coder-32B-Instruct \
  --host 0.0.0.0 \
  --port 30000 \
  --enable-torch-compile \
  --enable-radix-cache

Escolha do Quantization Level

Para GGUF (CPU ou GPU NVIDIAAMDMetal):

Quantização Tamanho (7B) Qualidade vs FP16 Quando usar
Q2_K 2.7 GB -15% RAM muito limitada
Q3KM 3.3 GB -7% RAM limitada; aceita perda
Q4KM 4.4 GB -3% *adrão recomendado*
Q5KM 5.1 GB -1% Melhor qualidade CPU
Q6_K 5.9 GB ~0% GPU com RAM extra
Q8_0 7.7 GB ~0% Máxima qualidade local

Hardware Mínimo por Caso de Uso

Modelo Memória necessária Hardware
Qwen2.5Coder7B Q4 6 GB RTX 3060; M1 8GB
Qwen2.5Coder14B Q4 10 GB RTX 3080; M1 16GB
Qwen2.5Coder32B Q4 22 GB RTX 4090 (24GB); M2 Ultra
Llama 3.3 70B Q4 48 GB 2× RTX 4090; M2 Ultra 96GB
DeepSeek-R1 671B Q4 420 GB 8× H100 80GB

Integração com Editores de Código

Continue.dev (VS Code / JetBrains)

// config.json
{
  "models": [{
    "title": "Kode Local",
    "provider": "ollama",
    "model": "qwen2.5-coder:32b",
    "apiBase": "http://localhost:11434"
  }],
  "tabAutocompleteModel": {
    "title": "Qwen Coder 7B",
    "provider": "ollama",
    "model": "qwen2.5-coder:7b"
  }
}

Cursor / Windsurf

  • Configura OpenAI-compatible base URL: http://localhost:11434/v1
  • API key: qualquer string (ex: "ollama")

Neovim — avante.nvim / llm.nvim

  • Suporte a OpenAI-compatible API; aponta para Ollama

Profiling de Performance Local

# Benchmark com llama-bench
./llama-bench \
  --model qwen2.5-coder-7b-instruct-q4_k_m.gguf \
  --n-gen 128 \
  --n-prompt 512

# Monitorar GPU
watch -n 0.5 nvidia-smi

# Monitorar uso de VRAM em tempo real
nvidia-smi dmon -s u -d 1

Docker Compose — Stack Local Completa

services:
  ollama:
    image: ollama/ollama
    ports: ["11434:11434"]
    volumes: ["ollama_data:/root/.ollama"]
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

  open-webui:
    image: ghcr.io/open-webui/open-webui
    ports: ["3000:8080"]
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    depends_on: [ollama]

  langfuse:
    image: langfuse/langfuse
    ports: ["3001:3000"]
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/langfuse

volumes:
  ollama_data:

Apple Silicon — Configuração Ideal

# MLX (Apple ML framework — mais rápido que llama.cpp em M-series)
pip install mlx-lm

# Rodar modelo com MLX
mlx_lm.generate \
  --model mlx-community/Qwen2.5-Coder-32B-Instruct-4bit \
  --prompt "def fibonacci(n):"

# Servidor MLX
mlx_lm.server \
  --model mlx-community/Qwen2.5-Coder-32B-Instruct-4bit \
  --port 8080

*erformance M3 Max (96GB):*

  • Qwen2.5Coder32B Q4: ~15 tokens/s
  • Llama 3.3 70B Q4: ~6 tokens/s

Source: ../home/koder/dev/koder/meta/docs/ia/compendium/07-frameworks/inferencia-local.md