도커로 개발하기

개발 이미지 가져오기

TensorFlow Serving을 구축할 수 있는 개발 환경의 경우 다음을 시도해 볼 수 있습니다.

docker pull tensorflow/serving:latest-devel

GPU 지원으로 TensorFlow Serving을 구축할 수 있는 개발 환경의 경우 다음을 사용하세요.

docker pull tensorflow/serving:latest-devel-gpu

가져올 수 있는 다른 버전의 이미지는 Docker Hub tensorflow/serving repo를 참조하세요.

개발사례

개발 Docker 이미지 중 하나를 가져온 후 gRPC 포트(8500)를 여는 동안 실행할 수 있습니다.

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

개발 환경 테스트

모델을 테스트하려면 컨테이너 내부에서 다음을 시도해 보세요.

# 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

Dockerfile

현재 우리는 다음 Dockerfile을 유지 관리하고 있습니다.

  • TensorFlow Serving이 설치된 최소 VM인 Dockerfile 입니다.

  • Dockerfile.gpu nvidia-docker 와 함께 사용되는 GPU 지원이 포함된 TensorFlow Serving을 갖춘 최소 VM입니다.

  • Dockerfile.devel 은 TensorFlow Serving을 구축하는 데 필요한 모든 종속성이 포함된 최소 VM입니다.

  • Dockerfile.devel-gpu 는 GPU 지원을 통해 TensorFlow Serving을 구축하는 데 필요한 모든 종속성이 포함된 최소 VM입니다.

Dockerfile에서 컨테이너 빌드

Dockerfile에서 고유한 Docker 이미지를 빌드하려면 Docker 빌드 명령을 실행하면 됩니다.

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 .

팁: 이미지를 빌드하기 전에 Docker Hub tensorflow/serving repo를 확인하여 요구 사항을 충족하는 이미지가 아직 존재하지 않는지 확인하세요.

소스에서 빌드하면 많은 RAM이 소모됩니다. RAM이 시스템에 문제가 있는 경우 Bazel을 호출하는 동안 --local_ram_resources=2048 지정하여 RAM 사용량을 제한할 수 있습니다. 자세한 내용은 Bazel 문서를 참조하세요. 이와 동일한 메커니즘을 사용하여 TensorFlow Serving을 빌드하는 최적화를 조정할 수 있습니다. 예를 들어:

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 .

컨테이너 실행

여기서는 Dockerfile.devel 컨테이너를 빌드했다고 가정합니다.

gRPC 포트(8500)를 여는 컨테이너를 실행하려면 다음 안내를 따르세요.

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

팁: GPU 이미지를 실행하는 경우 NVIDIA 런타임 --runtime=nvidia 사용하여 실행해야 합니다.

여기에서 개발 환경 테스트 지침을 따를 수 있습니다.

최적화된 제공 바이너리 빌드

TensorFlow Serving의 ModelServer를 실행할 때 다음과 같은 로그 메시지를 볼 수 있습니다.

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

이는 ModelServer 바이너리가 실행 중인 CPU에 완전히 최적화되지 않았음을 나타냅니다. 제공하는 모델에 따라 추가 최적화가 필요하지 않을 수도 있습니다. 그러나 최적화된 바이너리를 구축하는 것은 간단합니다.

제공된 Dockerfile.devel 또는 Dockerfile.devel-gpu 파일에서 Docker 이미지를 빌드할 때 ModelServer 바이너리는 -march=native 플래그를 사용하여 빌드됩니다. 이렇게 하면 Bazel이 Docker 이미지를 빌드하는 호스트가 지원하는 모든 CPU 최적화를 사용하여 ModelServer 바이너리를 빌드하게 됩니다.

호스트에 완전히 최적화된 제공 이미지를 만들려면 다음을 수행하세요.

  1. TensorFlow Serving 프로젝트 복제

    git clone https://github.com/tensorflow/serving
    cd serving
    
  2. 최적화된 ModelServer로 이미지 구축

    • CPU의 경우:

      docker build --pull -t $USER/tensorflow-serving-devel \
        -f tensorflow_serving/tools/docker/Dockerfile.devel .
      
    • GPU의 경우: `

      docker build --pull -t $USER/tensorflow-serving-devel-gpu \
        -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu .
      
  3. 개발 이미지를 기반으로 제공 이미지 빌드

    • CPU의 경우:

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

      새롭게 최적화된 Docker 이미지는 이제 $USER/tensorflow-serving 이며, 표준 tensorflow/serving:latest 이미지와 마찬가지로 사용할 수 있습니다.

    • 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 .
      

      새롭게 최적화된 Docker 이미지는 이제 $USER/tensorflow-serving-gpu 이며, 표준 tensorflow/serving:latest-gpu 이미지와 마찬가지로 사용할 수 있습니다.