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
Top comments (0)