開始使用 TensorFlow Serving 最簡單的方式之一是使用 Docker。
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker 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 APIcurl -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 網站,但我們在此處提供一些快速連結
- 適用於 macOS 的 Docker
- 適用於 Windows 的 Docker,適用於 Windows 10 Pro 或更新版本
- Docker Toolbox,適用於舊版 macOS 或 Windows 10 Pro 之前的 Windows 版本
透過 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 之外,您還需要
- 系統的最新 NVIDIA 驅動程式
nvidia-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 開發指南。