搭配 Docker 使用 TensorFlow Serving

開始使用 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 https://127.0.0.1:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

如需其他服務端點,請參閱用戶端 REST API

安裝 Docker

一般安裝指示請參閱 Docker 網站,但我們在此處提供一些快速連結

透過 Docker 進行服務

提取服務映像檔

安裝 Docker 後,您可以執行下列命令來提取最新的 TensorFlow Serving Docker 映像檔

docker pull tensorflow/serving

這會提取已安裝 TensorFlow Serving 的最小 Docker 映像檔。

如需您可以提取的其他映像檔版本,請參閱 Docker Hub tensorflow/serving 存放區

執行服務映像檔

服務映像檔 (CPU 和 GPU) 具有下列屬性

  • 連接埠 8500 已公開以供 gRPC 使用
  • 連接埠 8501 已公開以供 REST API 使用
  • 選用的環境變數 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 進行服務,您需要

  • 主機上要服務的開放連接埠
  • 要服務的 SavedModel
  • 用戶端將參照的模型名稱

您將執行的動作是執行 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)。最後,我們使用 my_model 填入環境變數 MODEL_NAME,並將 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

接下來,將您的 SavedModel 複製到容器的模型資料夾

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 映像檔,您可以部署此映像檔,且會在啟動時載入您的模型以進行服務。

服務範例

讓我們逐步執行完整範例,其中我們載入 SavedModel 並使用 REST API 呼叫它。首先提取服務映像檔

docker pull tensorflow/serving

這會提取已安裝 ModelServer 的最新 TensorFlow Serving 映像檔。

接下來,我們將使用名為 Half Plus Two 的玩具模型,此模型會為我們提供的 x 預測值產生 0.5 * x + 2

若要取得此模型,請先複製 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,並將我們想要的模型從主機對應到容器中預期的模型位置。我們也會將模型名稱當作環境變數傳遞,這在我們查詢模型時會很重要。

若要使用 predict API 查詢模型,您可以執行

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

這應傳回一組值

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

如需使用 RESTful API 的詳細資訊,請參閱這裡

搭配 Docker 使用 GPU 進行服務

安裝 nvidia-docker

在使用 GPU 進行服務之前,除了安裝 Docker 之外,您還需要

執行 GPU 服務映像檔

執行 GPU 服務映像檔與執行 CPU 映像檔相同。如需更多詳細資訊,請參閱執行服務映像檔

GPU 服務範例

讓我們逐步執行完整範例,其中我們載入具有 GPU 繫結運算元的模型,並使用 REST API 呼叫它。

首先安裝 nvidia-docker。接下來,您可以執行下列命令來提取最新的 TensorFlow Serving GPU Docker 映像檔

docker pull tensorflow/serving:latest-gpu

這會提取已安裝 ModelServer 的最小 Docker 映像檔,此映像檔專為在 GPU 上執行而建置。

接下來,我們將使用名為 Half Plus Two 的玩具模型,此模型會為我們提供的 x 預測值產生 0.5 * x + 2。此模型會將運算元繫結至 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 ...

若要使用 predict API 查詢模型,您可以執行

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST https://127.0.0.1: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 的詳細資訊,請參閱這裡

透過 Docker 進行開發

如需如何建置及開發 Tensorflow Serving 的指示,請參閱透過 Docker 開發指南