Skip to content

TensorFlow Serving - End-to-End

Projeto exemplo de treinamento, exportação e deploy de um modelo MNIST com TensorFlow 2 e serving via Docker (Bitnami ou oficial).

Estrutura do Projeto

.
├── main.py               # Script de treinamento e exportação do modelo
├── mnist_model/          # Diretório do modelo exportado (formato SavedModel)
│   └── 1/
│       ├── assets
│       ├── fingerprint.pb
│       ├── saved_model.pb
│       └── variables/
│           ├── variables.data-00000-of-00001
│           └── variables.index
├── teste.py              # Script Python para testar a API REST
└── test_inference.ipynb  # (Opcional) Notebook de teste via API REST

1. Treinando e exportando o modelo

python3 main.py

Isso gera a pasta mnist_model/1/ com o modelo no formato correto para serving.

2. Servindo o modelo com Docker

Comando completo:

docker run -d --name tfserving_mnist -p 8501:8501 \
  -v "$PWD/mnist_model:/models/mnist" \
  tensorflow/serving \
  --rest_api_port=8501 \
  --model_name=mnist \
  --model_base_path=/models/mnist

IMPORTANTE:

No Mac M1/M2 (ARM64): se der erro, adicione a flag --platform=linux/arm64/v8 após o docker run.

No Windows, Linux, Mac Intel: não precisa dessa flag.

Você pode usar a imagem oficial (tensorflow/serving) ou Bitnami (bitnami/tensorflow-serving:latest). Ambas são compatíveis.

Comando completo para Mac M1/M2:

docker run --platform=linux/arm64/v8 -d --name tfserving_mnist -p 8501:8501 \
  -v "$PWD/mnist_model:/bitnami/tensorflow-serving/models/mnist" \
  bitnami/tensorflow-serving:latest \
  tensorflow_model_server \
    --rest_api_port=8501 \
    --model_name=mnist \
    --model_base_path=/bitnami/tensorflow-serving/models/mnist

Explicação do comando, linha a linha:

  • docker run: Cria e executa um novo container.
  • --platform=linux/arm64/v8: Especifica a arquitetura ARM64 (necessário em Macs M1/M2).
  • -d: Roda em segundo plano (background).
  • --name tfserving_mnist: Dá um nome ao container para facilitar logs, remoção etc.
  • -p 8501:8501: Mapeia a porta 8501 do container para a 8501 do host (API REST).
  • -v "$PWD/mnist_model:/bitnami/tensorflow-serving/models/mnist": Monta o diretório local do modelo dentro do container no local esperado pelo TensorFlow Serving.
  • bitnami/tensorflow-serving:latest: Imagem Docker utilizada.
  • tensorflow_model_server: Comando que roda o servidor do TensorFlow Serving.
  • --rest_api_port=8501: Porta REST da API.
  • --model_name=mnist: Nome lógico do modelo (usado nos endpoints).
  • --model_base_path=/bitnami/tensorflow-serving/models/mnist:Caminho do modelo dentro do container (deve bater com o volume acima).

3. Verificando o status do modelo

Após rodar o container, teste no terminal:

curl http://localhost:8501/v1/models/mnist

Deve retornar:

{
 "model_version_status": [
  {
   "version": "1",
   "state": "AVAILABLE",
   "status": {
    "error_code": "OK",
    "error_message": ""
   }
  }
 ]
}

4. Testando a inferência com Python

Use o script teste.py:

python3 teste.py

Saída esperada (exemplo):

Predito: 7 Verdadeiro: 7

5. Teste via notebook

Rode o test_inference.ipynb para explorar batch prediction, visualização, análise de erro, etc.

Observações

  • Para atualizar o modelo, basta exportar uma nova versão na pasta mnist_model/2/ e reiniciar o container.
  • Se quiser automatizar o deploy, use um script deploy.sh.
  • Para projetos maiores, considere Docker Compose e/ou integração com aplicações web.