Revolut, Nubank e outras fintechs adotam LLMs on‑prem: guia prático de implantação em 2024
Introdução
Empresas de tecnologia financeira estão migrando seus grandes modelos de linguagem para ambientes on‑premises e isso já não é mais uma tendência experimental – é uma necessidade real de privacidade, controle de custos e customização. Nos últimos 12 meses, buscas por “self‑hosted LLM” e “LLM on‑prem” cresceram mais de 250 % no Google Trends, sinalizando que CTOs de fintechs como Revolut e Nubank estão buscando passo‑a‑passo para colocar esses modelos dentro de suas próprias redes.
Neste artigo você encontrará:
- Comparação rápida dos principais modelos open‑source (Llama 3, Falcon 180B, Mistral 7B).
- Arquitetura recomendada (Docker‑Compose → Kubernetes).
- Scripts de monitoramento com Prometheus/Grafana.
- Checklist de segurança e MLOps para CI/CD.
- Tabela de custos vs. SaaS (OpenAI, Anthropic).
Tudo isso com exemplos de código prontos para copiar e colar.
1. Por que fintechs estão preferindo LLMs self‑hosted?
| Motivo | Impacto concreto |
|---|---|
| Privacidade | Dados de transações, identidade e crédito permanecem dentro da rede, atendendo GDPR, LGPD e PCI‑DSS. |
| Custo em escala | Redução de até 70 % no TCO quando o volume de chamadas ultrapassa 10 milhões de tokens/dia. |
| Customização total | Fine‑tuning com dados internos, filtros de compliance e prompts alinhados ao vocabulário bancário. |
| Latência mínima | Inferência local elimina a dependência de internet e garante respostas em < 50 ms. |
2. Requisitos de hardware (baseline)
| Componente | Configuração mínima (inferencia em tempo real) |
|---|---|
| GPU | 8 × NVIDIA H100 80 GB ou 16 × A100 40 GB |
| Armazenamento | SSD NVMe ≥ 2 TB (RAID 1 para redundância) |
| Rede | InfiniBand 200 Gbps ou Ethernet 100 Gbps |
| CPU / RAM | 2 × Xeon Gold 6338 ou EPYC 7763 + 512 GB RAM |
Dica: Para testes iniciais, o modelo Mistral‑7B roda em uma única H100 40 GB, permitindo validar a pipeline antes de escalar.
3. Arquitetura de implantação (Docker‑Compose → Kubernetes)
3.1 Docker‑Compose (primeiro protótipo)
version: "3.9" services: llm: image: ghcr.io/abetlen/llama-cpp-python:latest command: ["--model", "/models/llama3-70b.gguf", "--port", "8080"] volumes: - ./models:/models:ro ports: - "8080:8080" deploy: resources: reservations: devices: - driver: nvidia count: 8 capabilities: [gpu] Execute:
docker compose up -d Teste rápido:
curl -X POST http://localhost:8080/generate -d '{"prompt":"Qual o limite de crédito para clientes premium?","max_tokens":64}' 3.2 Migração para Kubernetes (produção)
apiVersion: apps/v1 kind: Deployment metadata: name: llm-deployment spec: replicas: 2 selector: matchLabels: app: llm template: metadata: labels: app: llm spec: containers: - name: llm image: ghcr.io/abetlen/llama-cpp-python:latest args: ["--model","/models/llama3-70b.gguf","--port","8080"] resources: limits: nvidia.com/gpu: 4 volumeMounts: - name: model-volume mountPath: /models volumes: - name: model-volume persistentVolumeClaim: claimName: llm-model-pvc --- apiVersion: v1 kind: Service metadata: name: llm-service spec: selector: app: llm ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP Aplicar:
kubectl apply -f llm-deployment.yaml 4. Monitoramento com Prometheus & Grafana
4.1 Exporter simples (Python)
from prometheus_client import start_http_server, Summary, Counter import time, torch REQUEST_TIME = Summary('llm_request_duration_seconds', 'Tempo de inferência') REQUEST_COUNT = Counter('llm_requests_total', 'Número total de requisições') @REQUEST_TIME.time() def infer(prompt): REQUEST_COUNT.inc() # chamada ao modelo (exemplo fictício) return model.generate(prompt) if __name__ == '__main__': start_http_server(9100) while True: time.sleep(10) 4.2 Dashboard básico
- CPU/GPU Utilização –
node_gpu_utilization - Latência média –
llm_request_duration_seconds - Erros –
llm_requests_totalcom labelstatus="error"
Importe o JSON disponível no repositório do artigo para criar o painel no Grafana.
5. Segurança prática
| Camada | Medida recomendada |
|---|---|
| Rede | Namespace Kubernetes isolado, NetworkPolicy permitindo apenas IPs internos. |
| Transporte | mTLS entre API gateway (Istio) e pods LLM. |
| Armazenamento | Criptografia AES‑256 dos arquivos de peso (fscrypt). |
| Acesso | RBAC estrito; ServiceAccount dedicado para o deployment. |
| Auditoria | Log de todas as chamadas via OpenTelemetry → Loki. |
Checklist rápido
kubectl get networkpolicy– garante que apenas o namespacefinance-apipode acessar.openssl s_client -connect llm-service:80 -tls1_3– verifica mTLS.vault kv get secret/llm/keys– confirma que as chaves de criptografia estão no Vault.
6. MLOps & CI/CD
# .github/workflows/llm-ci.yml name: LLM CI on: push: paths: - 'models/**' - 'docker/**' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build Docker image run: | docker build -t ghcr.io/empresa/llm:${{ github.sha }} . - name: Push to registry run: | echo ${{ secrets.GHCR_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin docker push ghcr.io/empresa/llm:${{ github.sha }} - name: Deploy to K8s uses: azure/k8s-deploy@v4 with: manifests: | k8s/llm-deployment.yaml images: ghcr.io/empresa/llm:${{ github.sha }} Com este pipeline, toda nova versão dos pesos ou da imagem Docker é testada em um cluster de staging antes de ir para produção.
7. Comparativo de custos (2024)
| Solução | Custo mensal estimado (10 M tokens/dia) | Latência média | Controle de dados |
|---|---|---|---|
| OpenAI GPT‑4o | US$ 45 k (pay‑as‑you‑go) | 120 ms | Dados enviados à nuvem |
| Anthropic Claude 2 | US$ 38 k | 150 ms | Dados enviados à nuvem |
| Self‑hosted Llama 3 70B | US$ 22 k (infra + energia) | 45 ms | 100 % on‑prem |
| Self‑hosted Falcon 180B | US$ 30 k | 55 ms | 100 % on‑prem |
Os valores são aproximados e consideram um data‑center próprio com contrato de energia e suporte.
8. FAQ rápido
Q1 – Quanto tempo leva para treinar um modelo de 7 B com dados internos?
≈ 48 h em 4 ×
Herramienta mencionada: Groq Cloud

