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 com nvidia-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:

  1. Clone o projeto TensorFlow Serving

    git clone https://github.com/tensorflow/serving
    cd serving
    
  2. 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 .
      
  3. 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 imagem tensorflow/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 imagem tensorflow/serving:latest-gpu padrão.