Servindo com FastAPI
O FastAPI envolve modelos de ML em endpoints HTTP tipados com documentação OpenAPI automática. Carregue o modelo uma vez na inicialização, valide as entradas com Pydantic e exponha verificações de saúde para orquestração.
Receita
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
app = FastAPI()
model = joblib.load("model.joblib")
class PredictRequest(BaseModel):
features: list[float]
@app.post("/predict")
def predict(req: PredictRequest) -> dict:
pred = model.predict([req.features])
return {"prediction": pred.tolist()}Exemplo de Trabalho
"""serving_fastapi.py - API de modelo pronta para produção."""
from __future__ import annotations
from contextlib import asynccontextmanager
from typing import Any
import joblib
import numpy as np
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
Execute: uvicorn serving_fastapi:app --host 0.0.0.0 --port 8000
Armadilhas
- Carregamento do modelo por solicitação - lento e consome muita memória. Correção: carregar uma vez no lifespan/startup.
- Sem validação de entrada - recursos ruins travam a previsão. Correção: modelos Pydantic com restrições.
- Sem verificação de saúde - o orquestrador não consegue detectar falhas. Correção: endpoint
/health. - Ordem incorreta de recursos - previsões silenciosamente incorretas. Correção: campos nomeados, não listas brutas.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| FastAPI | Modelos Python, lógica personalizada | Taxa de transferência máxima (use Triton) |
| BentoML | Serviço de modelo empacotado | API simples de endpoint único |
| Flask | Aplicativos legados | Novos projetos (use FastAPI) |
| AWS Lambda + container | Baixo tráfego, serverless | Inferência de GPU |
FAQs
Endpoints síncronos ou assíncronos?
Síncrono é bom para inferência de CPU; assíncrono para chamadas de LLM vinculadas a I/O.Como sirvo PyTorch?
Carregue o modelo no lifespan; preveja em um pool de threads para trabalho vinculado à CPU.Previsões em lote?
Aceite uma lista de solicitações; preveja em lote para taxa de transferência.Autenticação?
Middleware de chave de API ou OAuth2 via dependências do FastAPI.Limitação de taxa?
Limites de taxa do slowapi ou proxy reverso.Containerizar?
Dockerfile com artefato do modelo + comando uvicorn.Múltiplos modelos?
Endpoints separados ou nome do modelo no corpo da solicitação.Serviço de GPU?
Carregue o modelo para CUDA no lifespan; um processo por GPU.Registrando previsões?
Middleware registra hash de entrada, previsão, latência (não PII bruto).Documentação OpenAPI?
Gerada automaticamente em /docs - desative em produção, se necessário.Carregar do MLflow?
`mlflow.pyfunc.load_model("models:/name/Production")` no lifespan.Testando?
TestClient de fastapi.testclient para testes de integração.Relacionados
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.