Docker와 함께 제공되는 TensorFlow

TensorFlow Serving 사용을 시작하는 가장 쉬운 방법 중 하나는 Docker를 사용하는 것입니다.

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

추가 제공 엔드포인트에 대해서는 클라이언트 REST API를 참조하세요.

도커 설치

일반 설치 지침은 Docker 사이트에 있지만 여기에 몇 가지 빠른 링크가 제공됩니다.

Docker로 서비스하기

제공 이미지 가져오기

Docker가 설치되면 다음을 실행하여 최신 TensorFlow Serving Docker 이미지를 가져올 수 있습니다.

docker pull tensorflow/serving

그러면 TensorFlow Serving이 설치된 최소 Docker 이미지가 풀다운됩니다.

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

제공 이미지 실행

제공 이미지(CPU 및 GPU 모두)에는 다음과 같은 속성이 있습니다.

  • gRPC용으로 노출된 포트 8500
  • REST API에 대해 노출된 포트 8501
  • 선택적 환경 변수 MODEL_NAME (기본값은 model )
  • 선택적 환경 변수 MODEL_BASE_PATH (기본값은 /models )

제공 이미지는 ModelServer를 실행할 때 다음과 같이 실행합니다.

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

Docker를 사용하려면 다음이 필요합니다.

  • 서비스를 제공할 호스트의 열린 포트
  • 제공할 저장된 모델
  • 고객이 참조할 모델의 이름

여러분이 할 일은 Docker 컨테이너를 실행하고 , 컨테이너의 포트를 호스트의 포트에 게시 하고, 컨테이너가 모델을 예상하는 SavedModel에 대한 호스트 경로를 마운트하는 것입니다.

예를 살펴보겠습니다:

docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

이 경우 Docker 컨테이너를 시작하고 REST API 포트 8501을 호스트의 포트 8501에 게시한 다음 my_model 이라는 모델을 가져와서 기본 모델 기본 경로( ${MODEL_BASE_PATH}/${MODEL_NAME} 에 바인딩했습니다. = /models/my_model ). 마지막으로 환경 변수 MODEL_NAME my_model 로 채우고 MODEL_BASE_PATH 기본값으로 두었습니다.

이는 컨테이너에서 실행됩니다.

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_model

gRPC 포트를 게시하려면 -p 8500:8500 사용합니다. gRPC 및 REST API 포트를 동시에 열거나 둘 중 하나만 열도록 선택할 수 있습니다.

추가 인수 전달

tensorflow_model_server 제공 Docker 컨테이너에 전달할 수 있는 많은 추가 인수를 지원합니다. 예를 들어 모델 이름을 지정하는 대신 모델 구성 파일을 전달하려는 경우 다음을 수행할 수 있습니다.

docker run -p 8500:8500 -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config

이 접근 방식은 tensorflow_model_server 지원하는 다른 명령줄 인수에 대해 작동합니다.

자체 제공 이미지 만들기

컨테이너에 모델이 내장된 제공 이미지를 원하는 경우 고유한 이미지를 만들 수 있습니다.

먼저 제공 이미지를 데몬으로 실행합니다.

docker run -d --name serving_base tensorflow/serving

다음으로 저장된 모델을 컨테이너의 모델 폴더에 복사합니다.

docker cp models/<my model> serving_base:/models/<my model>

마지막으로 모델 이름과 일치하도록 MODEL_NAME 변경하여 모델을 제공하는 컨테이너를 커밋합니다. ':

docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>

이제 serving_base 중지할 수 있습니다.

docker kill serving_base

그러면 배포할 수 있고 시작 시 서비스 제공을 위해 모델을 로드할 <my container> 라는 Docker 이미지가 남게 됩니다.

제공 예

저장된 모델을 로드하고 REST API를 사용하여 호출하는 전체 예제를 실행해 보겠습니다. 먼저 제공 이미지를 가져옵니다.

docker pull tensorflow/serving

ModelServer가 설치된 최신 TensorFlow Serving 이미지를 가져옵니다.

다음으로 예측을 위해 제공하는 x 값에 대해 0.5 * x + 2 생성하는 Half Plus Two 라는 장난감 모델을 사용합니다.

이 모델을 얻으려면 먼저 TensorFlow Serving 저장소를 복제하세요.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

다음으로, 이 모델을 가리키는 TensorFlow Serving 컨테이너를 실행하고 REST API 포트(8501)를 엽니다.

docker run -p 8501:8501 \
  --mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

그러면 Docker 컨테이너가 실행되고 TensorFlow Serving Model Server가 시작되고 REST API 포트 8501이 바인딩되고 원하는 모델이 호스트에서 컨테이너의 모델이 예상되는 위치에 매핑됩니다. 또한 모델 이름을 환경 변수로 전달하는데, 이는 모델을 쿼리할 때 중요합니다.

예측 API를 사용하여 모델을 쿼리하려면 다음을 실행하세요.

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

그러면 다음 값 세트가 반환되어야 합니다.

{ "predictions": [2.5, 3.0, 4.5] }

RESTful API 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

GPU를 사용하여 Docker로 서비스 제공

엔비디아 도커 설치

GPU를 사용하기 전에 Docker를 설치하는 것 외에도 다음이 필요합니다.

GPU 제공 이미지 실행

GPU 제공 이미지를 실행하는 것은 CPU 이미지를 실행하는 것과 동일합니다. 자세한 내용은 제공 이미지 실행을 참조하세요.

GPU 제공 예시

GPU 바인딩된 작업이 포함된 모델을 로드하고 REST API를 사용하여 호출하는 전체 예제를 살펴보겠습니다.

먼저 nvidia-docker 설치하세요. 다음으로 다음을 실행하여 최신 TensorFlow Serving GPU Docker 이미지를 가져올 수 있습니다.

docker pull tensorflow/serving:latest-gpu

그러면 설치된 GPU에서 실행되도록 구축된 ModelServer가 포함된 최소 Docker 이미지가 풀다운됩니다.

다음으로 예측을 위해 제공하는 x 값에 대해 0.5 * x + 2 생성하는 Half Plus Two 라는 장난감 모델을 사용합니다. 이 모델에는 GPU 장치에 바인딩된 작업이 있으며 CPU에서는 실행되지 않습니다.

이 모델을 얻으려면 먼저 TensorFlow Serving 저장소를 복제하세요.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

다음으로, 이 모델을 가리키는 TensorFlow Serving 컨테이너를 실행하고 REST API 포트(8501)를 엽니다.

docker run --gpus all -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &

그러면 Docker 컨테이너가 실행되고, TensorFlow Serving Model Server가 시작되고, REST API 포트 8501이 바인딩되고, 호스트에서 원하는 모델이 컨테이너에서 모델이 예상되는 위치에 매핑됩니다. 또한 모델 이름을 환경 변수로 전달하는데, 이는 모델을 쿼리할 때 중요합니다.

팁: 모델을 쿼리하기 전에 서버가 요청을 받을 준비가 되었음을 나타내는 다음과 같은 메시지가 나타날 때까지 기다리십시오.

2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...

예측 API를 사용하여 모델을 쿼리하려면 다음을 실행하세요.

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

그러면 다음 값 세트가 반환되어야 합니다.

{ "predictions": [2.5, 3.0, 4.5] }

팁: GPU가 없거나 작동하는 TensorFlow Model Server의 GPU 빌드가 없는 시스템에서 GPU 모델을 실행하려고 하면 다음과 같은 오류가 발생합니다.

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

RESTful API 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

도커로 개발하기

Tensorflow Serving을 구축하고 개발하는 방법에 대한 지침은 Docker를 사용한 개발 가이드를 참조하세요.