Programowanie z Dockerem

Wyciąganie obrazu rozwojowego

W środowisku programistycznym, w którym można zbudować usługę TensorFlow, możesz spróbować:

docker pull tensorflow/serving:latest-devel

W środowisku programistycznym, w którym można zbudować serwer TensorFlow z obsługą procesora graficznego, użyj:

docker pull tensorflow/serving:latest-devel-gpu

Zobacz repozytorium tensorflow/serving Docker Hub, aby poznać inne wersje obrazów, które możesz pobrać.

Przykład rozwoju

Po pobraniu jednego z deweloperskich obrazów Dockera możesz go uruchomić, otwierając port gRPC (8500):

docker run -it -p 8500:8500 --gpus all tensorflow/serving:latest-devel

Testowanie środowiska programistycznego

Aby przetestować model, z wnętrza kontenera spróbuj:

# 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

Pliki Dockera

Obecnie utrzymujemy następujące pliki Dockerfile:

  • Dockerfile , czyli minimalna maszyna wirtualna z zainstalowaną usługą TensorFlow Serving.

  • Dockerfile.gpu , czyli minimalna maszyna wirtualna z obsługą TensorFlow z obsługą procesora graficznego do użycia z nvidia-docker .

  • Dockerfile.devel , który jest minimalną maszyną wirtualną ze wszystkimi zależnościami potrzebnymi do zbudowania usługi TensorFlow.

  • Dockerfile.devel-gpu , czyli minimalna maszyna wirtualna ze wszystkimi zależnościami niezbędnymi do zbudowania usługi TensorFlow Serving z obsługą procesora graficznego.

Budowanie kontenera z pliku Dockerfile

Jeśli chcesz zbudować własny obraz Dockera z pliku Docker, możesz to zrobić, uruchamiając polecenie 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 .

WSKAZÓWKA: Przed próbą zbudowania obrazu sprawdź repozytorium tensorflow/serving Docker Hub, aby upewnić się, że obraz spełniający Twoje potrzeby jeszcze nie istnieje.

Kompilowanie ze źródeł zużywa dużo pamięci RAM. Jeśli w twoim systemie problemem jest pamięć RAM, możesz ograniczyć jej użycie, podając --local_ram_resources=2048 podczas wywoływania Bazela. Więcej informacji znajdziesz w dokumentacji Bazela . Możesz użyć tego samego mechanizmu, aby dostosować optymalizacje, z których korzystasz, korzystając z usługi TensorFlow. Na przykład:

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 .

Uruchamianie kontenera

Zakłada się, że zbudowałeś kontener Dockerfile.devel .

Aby uruchomić kontener otwierający port gRPC (8500):

docker run -it -p 8500:8500 $USER/tensorflow-serving-devel

WSKAZÓWKA: Jeśli używasz obrazu GPU, pamiętaj, aby uruchomić go przy użyciu środowiska wykonawczego NVIDIA --runtime=nvidia .

Stąd możesz postępować zgodnie z instrukcjami dotyczącymi testowania środowiska programistycznego .

Tworzenie zoptymalizowanego pliku binarnego obsługującego

Podczas uruchamiania ModelServer TensorFlow Serving możesz zauważyć komunikat dziennika wyglądający tak:

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

Oznacza to, że plik binarny ModelServer nie jest w pełni zoptymalizowany pod kątem procesora, na którym działa. W zależności od obsługiwanego modelu dalsze optymalizacje mogą nie być konieczne. Jednak zbudowanie zoptymalizowanego pliku binarnego jest proste.

Podczas budowania obrazu platformy Docker z dostarczonych plików Dockerfile.devel lub Dockerfile.devel-gpu plik binarny ModelServer zostanie zbudowany z flagą -march=native . Spowoduje to, że Bazel zbuduje plik binarny ModelServer ze wszystkimi optymalizacjami procesora hosta, na którym budujesz obraz Dockera.

Aby utworzyć obraz do wyświetlania, który będzie w pełni zoptymalizowany pod kątem Twojego hosta, po prostu:

  1. Sklonuj projekt udostępniania TensorFlow

    git clone https://github.com/tensorflow/serving
    cd serving
    
  2. Zbuduj obraz za pomocą zoptymalizowanego serwera ModelServer

    • Dla procesora:

      docker build --pull -t $USER/tensorflow-serving-devel \
        -f tensorflow_serving/tools/docker/Dockerfile.devel .
      
    • Dla procesora graficznego: `

      docker build --pull -t $USER/tensorflow-serving-devel-gpu \
        -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu .
      
  3. Zbuduj obraz do obsługi, korzystając z obrazu rozwojowego jako podstawy

    • Dla procesora:

      docker build -t $USER/tensorflow-serving \
        --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \
        -f tensorflow_serving/tools/docker/Dockerfile .
      

      Twój nowy zoptymalizowany obraz Dockera to teraz $USER/tensorflow-serving , którego możesz używać tak samo, jak standardowego obrazu tensorflow/serving:latest .

    • Dla procesora graficznego:

      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 .
      

      Twój nowy zoptymalizowany obraz Dockera to teraz $USER/tensorflow-serving-gpu , którego możesz używać tak samo, jak standardowego obrazu tensorflow/serving:latest-gpu .