Desenvolvendo com Docker
Extraindo uma imagem de desenvolvimento
Para um ambiente de desenvolvimento onde você pode criar o TensorFlow Serving, tente:
docker pull tensorflow/serving:latest-devel
Para um ambiente de desenvolvimento onde você pode criar o TensorFlow Serving com suporte a GPU, use:
docker pull tensorflow/serving:latest-devel-gpu
Consulte o repositório tensorflow/serving do Docker Hub para outras versões de imagens que você pode extrair.
Exemplo de desenvolvimento
Depois de extrair uma das imagens de desenvolvimento do Docker, você pode executá-la enquanto abre a porta gRPC (8500):
docker run -it -p 8500:8500 --gpus all tensorflow/serving:latest-devel
Testando o ambiente de desenvolvimento
Para testar um modelo, de dentro do contêiner, tente:
# train the mnist model
python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model
# serve the model
tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ &
# test the client
python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:8500
Arquivos Docker
Atualmente mantemos os seguintes Dockerfiles:
Dockerfile
, que é uma VM mínima com o TensorFlow Serving instalado.Dockerfile.gpu
, que é uma VM mínima com TensorFlow Serving com suporte a GPU para ser usada comnvidia-docker
.Dockerfile.devel
, que é uma VM mínima com todas as dependências necessárias para criar o TensorFlow Serving.Dockerfile.devel-gpu
, que é uma VM mínima com todas as dependências necessárias para criar o TensorFlow Serving com suporte a GPU.
Construindo um contêiner a partir de um Dockerfile
Se quiser construir sua própria imagem Docker a partir de um Dockerfile, você pode fazer isso executando o comando Docker build:
Dockerfile
:
docker build --pull -t $USER/tensorflow-serving .
Dockerfile.gpu
:
docker build --pull -t $USER/tensorflow-serving-gpu -f Dockerfile.gpu .
Dockerfile.devel
:
docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel .
Dockerfile.devel-gpu
:
docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu .
DICA: antes de tentar construir uma imagem, verifique o repositório tensorflow/serving do Docker Hub para ter certeza de que ainda não existe uma imagem que atenda às suas necessidades.
Construir a partir de fontes consome muita RAM. Se a RAM for um problema no seu sistema, você pode limitar o uso de RAM especificando --local_ram_resources=2048
ao invocar o Bazel. Consulte a documentação do Bazel para obter mais informações. Você pode usar esse mesmo mecanismo para ajustar as otimizações com as quais está criando o TensorFlow Serving. Por exemplo:
docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \
--cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_ram_resources=2048" -t \
$USER/tensorflow-serving-devel -f Dockerfile.devel .
Executando um contêiner
Isso pressupõe que você construiu o contêiner Dockerfile.devel
.
Para executar o contêiner abrindo a porta gRPC (8500):
docker run -it -p 8500:8500 $USER/tensorflow-serving-devel
DICA: Se você estiver executando uma imagem de GPU, certifique-se de executar usando o tempo de execução NVIDIA --runtime=nvidia
.
A partir daqui, você pode seguir as instruções para testar um ambiente de desenvolvimento .
Construindo um binário de serviço otimizado
Ao executar o ModelServer do TensorFlow Serving, você poderá notar uma mensagem de log semelhante a esta:
I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141]
Your CPU supports instructions that this TensorFlow binary was not compiled to
use: AVX2 FMA
Isso indica que seu binário ModelServer não está totalmente otimizado para a CPU em que está sendo executado. Dependendo do modelo que você está servindo, otimizações adicionais podem não ser necessárias. No entanto, construir um binário otimizado é simples.
Ao construir uma imagem Docker a partir dos arquivos Dockerfile.devel
ou Dockerfile.devel-gpu
fornecidos, o binário ModelServer será construído com o sinalizador -march=native
. Isso fará com que o Bazel crie um binário ModelServer com todas as otimizações de CPU suportadas pelo host em que você está construindo a imagem Docker.
Para criar uma imagem de veiculação totalmente otimizada para seu host, basta:
Clone o projeto TensorFlow Serving
git clone https://github.com/tensorflow/serving cd serving
Construa uma imagem com um ModelServer otimizado
Para CPU:
docker build --pull -t $USER/tensorflow-serving-devel \ -f tensorflow_serving/tools/docker/Dockerfile.devel .
Para GPU: `
docker build --pull -t $USER/tensorflow-serving-devel-gpu \ -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu .
Crie uma imagem de serviço com a imagem de desenvolvimento como base
Para CPU:
docker build -t $USER/tensorflow-serving \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ -f tensorflow_serving/tools/docker/Dockerfile .
Sua nova imagem otimizada do Docker agora é
$USER/tensorflow-serving
, que você pode usar da mesma forma que faria com a imagemtensorflow/serving:latest
padrão.Para GPU:
docker build -t $USER/tensorflow-serving-gpu \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \ -f tensorflow_serving/tools/docker/Dockerfile.gpu .
Sua nova imagem otimizada do Docker agora é
$USER/tensorflow-serving-gpu
, que você pode usar da mesma forma que faria com a imagemtensorflow/serving:latest-gpu
padrão.