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_total com label status="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

  1. kubectl get networkpolicy – garante que apenas o namespace finance-api pode acessar.
  2. openssl s_client -connect llm-service:80 -tls1_3 – verifica mTLS.
  3. 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