Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Tech Challenge Fase 03 - Classificacao de Texto Medico

FIAP Pos-Tech - Machine Learning Engineering
Autores: Andre Abreu e Elizandra Monteiro

O que e o projeto

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)

Decisao de arquitetura (batch vs real-time)

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

Como rodar

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 -d

Teste 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 200

CI

O workflow .github/workflows/ci.yml roda ruff + pytest no push/PR. O treino smoke usa data/sample/ (arquivo pequeno).

Airflow

DAG em airflow/dags/triage_retrain_dag.py (load -> train -> save). Ver comentarios no arquivo para subir o Airflow localmente.

Resultados

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 8000

Video STAR

https://youtu.be/9ObHr2zO_9Q

Documento de entrega (links): entrega-links.pdf · entrega-links.html

Estrutura

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages