FIAP Pos-Tech - Machine Learning Engineering
Autores: Andre Abreu e Elizandra Monteiro
Classificador de abstracts medicos com TF-IDF + Random Forest (sklearn). A API (FastAPI) roda em Docker, com CI no GitHub Actions, DAG no Airflow e monitoramento com Prometheus + Grafana. Tambem exportamos o modelo para ONNX para comparar latencia.
Dataset: Medical Abstracts TC Corpus (https://github.com/sebischair/Medical-Abstracts-TC-Corpus)
- ~14k amostras (train + test)
- coluna texto: medical_abstract
- coluna alvo: condition_label (1 a 5)
Escolhemos real-time com API REST. No cenario de hospital, a classificacao do texto precisa de resposta na hora. Batch faria sentido para processar milhares de laudos de madrugada, mas nao para triagem sob demanda.
Comparando opcoes de nuvem (teorico, deploy real e opcional):
- AWS: ECS ou Lambda
- Azure: Container Apps (Consumption) - nossa escolha
- GCP: Cloud Run
Ficamos com Azure Container Apps na regiao Brazil South, porque encaixa com o Dockerfile e permite scale-to-zero. O desafio pede so a decisao no README; o que entregamos roda local com Docker Compose.
Fluxo local:
texto -> FastAPI /predict -> sklearn ou ONNX
|
/metrics
|
Prometheus -> Grafana
Airflow: carrega CSV -> treina -> salva modelo
uv sync --all-groups
cp .env.example .env
# API local
uv run uvicorn src.api.main:app --host 0.0.0.0 --port 8000
# ou Docker
docker build -t fiap-fase03-api .
docker run --rm -p 8000:8000 fiap-fase03-api
# stack com Prometheus + Grafana
docker compose up --build -dTeste rapido:
curl -s http://127.0.0.1:8000/health
curl -s -X POST http://127.0.0.1:8000/predict \
-H "Content-Type: application/json" \
-d '{"text":"Patient with myocardial infarction and chest pain."}'Swagger: http://127.0.0.1:8000/docs
Grafana: http://localhost:3000 (admin/admin)
Prometheus: http://localhost:9090
Para gerar trafego no Grafana:
uv run python scripts/generate_load.py --n 200O workflow .github/workflows/ci.yml roda ruff + pytest no push/PR.
O treino smoke usa data/sample/ (arquivo pequeno).
DAG em airflow/dags/triage_retrain_dag.py (load -> train -> save).
Ver comentarios no arquivo para subir o Airflow localmente.
Holdout (test set):
- accuracy ~ 0.53
- f1_macro ~ 0.53
Latencia local (scripts/benchmark_latency.py, n=100):
- sklearn p50 ~ 14 ms
- ONNX p50 ~ 0.05 ms
Para usar ONNX na API:
MODEL_BACKEND=onnx uv run uvicorn src.api.main:app --port 8000Documento de entrega (links): entrega-links.pdf · entrega-links.html
src/api FastAPI + metricas
src/training treino e export ONNX
src/inference backends sklearn / onnx
airflow/dags DAG de retreino
monitoring/ prometheus.yml + dashboard Grafana
data/raw dataset
data/sample amostra do CI
models/ baseline.joblib e model.onnx
tests/ pytest
scripts/ benchmark e carga