TensorFlow Serving是一個適用于深度學習模型的推理服務引擎,支持將TensorFlow標準的SavedModel格式的模型部署為在線服務,并支持模型熱更新與模型版本管理等功能。本文為您介紹如何使用鏡像部署的方式部署TensorFlow Serving模型服務。
部署服務
部署單模型服務
在OSS存儲空間中創建模型存儲目錄,詳情請參見管理目錄。
TensorFlow Serving模型的存儲目錄要求以如下目錄結構存儲模型:
模型版本目錄:每個模型至少包含一個模型版本目錄,且必須以數字命名,作為模型版本號,數字越大版本號越新。
模型文件:模型版本目錄下存放導出的SavedModel格式的模型文件,服務會自動加載最大模型版本號目錄下的模型文件。
假設模型存儲目錄在
oss://examplebucket/models/tf_serving/
路徑下,模型存儲目錄的格式如下:tf_serving └── mnist └──1 ├── saved_model.pb └── variables ├── variables.data-00000-of-00001 └── variables.index
部署TensorFlow Serving模型服務。
支持以下兩種部署方法:
場景化模型部署:適用于基本場景部署。您只需配置幾個參數,即可一鍵部署TensorFlow Serving模型服務。
自定義模型部署:適用于在特定環境下運行的服務。您可以根據自身業務的具體需求來調整更多配置選項,從而實現更靈活的服務配置。
場景化模型部署
TensorFlow Serving模型服務支持配置8501和8500兩種端口。該部署方式默認使用8501端口,如果您需要使用8500端口或調整更多配置選項,請切換至自定義模型部署頁簽進行部署。
8501:支持HTTP請求,在8501端口啟動HTTP或REST服務。
8500:支持gRPC請求,在8500端口啟動gRPC服務。
具體操作步驟如下:
自定義模型部署
具體操作步驟如下:
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。然后在自定義模型部署區域,單擊自定義部署。
在新建服務頁面配置以下關鍵參數,更多參數配置說明,請參見服務部署:控制臺。
參數
描述
部署方式
選擇鏡像部署服務。
鏡像選擇
在PAI平臺鏡像列表中選擇tensorflow-serving和對應的鏡像版本。建議選擇最新版本。
說明如果服務需要使用GPU,則鏡像版本必須選擇x.xx.x-gpu。
填寫模型配置
單擊填寫模型配置,進行模型配置。
模型配置選擇OSS,將OSS路徑配置為步驟1中模型存儲目錄所在的OSS Bucket目錄,例如:
oss://examplebucket/models/tf_serving/
掛載路徑:配置為
/models
。
運行命令
tensorflow-serving的啟動參數,例如:
/usr/bin/tf_serving_entrypoint.sh --model_name=mnist_model --model_base_path=/models/mnist
。其中:--model_name:用于指定模型名稱。如果不配置,默認名稱為model。
--model_base_path:用于指定模型存儲目錄在實例中的路徑。如果不配置,默認路徑為
/models/model
。
支持配置以下端口號:
8501:支持HTTP請求,在8501端口啟動HTTP或REST服務。
8500:支持gRPC請求,在8500端口啟動gRPC服務,同時您需要在對應配置編輯中添加以下配置。
"metadata": { "enable_http2": true }, "networking": { "path": "/" }
參數配置完成后,您可以在對應配置編輯區域查看服務部署配置。示例內容如下:
{ "metadata": { "name": "tensorflow_server_image", "instance": 1, }, "cloud": { "computing": { "instance_type": "ml.gu7i.c8m30.1-gu30", "instances": null } }, "storage": [ { "oss": { "path": "oss://examplebucket/models/tf_serving/", "readOnly": false }, "properties": { "resource_type": "model" }, "mount_path": "/models" } ], "containers": [ { "image": "eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/tensorflow_serving:1.15.0", "script": "/usr/bin/tf_serving_entrypoint.sh --model_name=mnist_model --model_base_path=/models/mnist", "port": 8501 } ] }
單擊部署。
部署多模型服務
TensorFlow Serving支持同時部署多個模型,具體操作步驟如下。
在OSS Bucket中創建模型存儲目錄,詳情請參見管理目錄。
假設模型存儲目錄在
oss://examplebucket/models/tf_serving/
路徑下,多個模型存儲目錄的格式如下:tf_serving ├── model_config.pbtxt │ ├── model1 │ ├── 1 │ │ ├── saved_model.pb │ │ └── variables │ │ ├── variables.data-00000-of-00001 │ │ └── variables.index │ ├── 2 │ │ └── ... │ └── 3 │ └── ... │ ├── model2 │ ├── 1 │ │ └── ... │ └── 2 │ └── ... │ └── model3 ├── 1 │ └── ... ├── 2 │ └── ... └── 3 └── ...
其中模型配置文件model_config.pbtxt內容示例如下。
model_config_list { config { name: 'model1' base_path: '/models/model1/' model_platform: 'tensorflow' model_version_policy{ specific { versions: 1 versions: 2 } } version_labels { key: 'stable' value: 1 } version_labels { key: 'canary' value: 2 } } config { name: 'model2' base_path: '/models/model2/' model_platform: 'tensorflow' model_version_policy{ all: {} } } config { name: 'model3' base_path: '/models/model3/' model_platform: 'tensorflow' model_version_policy{ latest { num_versions: 2 } } } }
其中關鍵配置說明如下:
參數
是否必選
描述
name
否
自定義配置模型名稱。建議配置該參數,如果不配置模型名稱,則model_name為空,后續無法調用該模型服務。
base_path
是
配置模型存儲目錄在實例中的路徑,后續部署服務時用于讀取模型文件。例如:掛載目錄為
/models
,要加載的模型目錄為/models/model1
,則該參數配置為/models/model1
。model_version_policy
否
表示模型版本加載策略。
不配置該參數:表示默認加載模型最新版本。
all{}:表示加載該模型所有版本。示例中model2模型加載所有版本。
latest{num_versions}:示例中model3配置為
num_versions: 2
,表示加載最新的2個版本,即版本2和3。specific{}:表示加載指定版本。示例中model1模型加載版本1和2。
version_labels
否
為模型版本配置自定義標簽。
說明標簽默認只能分配給已成功加載并啟動為服務的模型版本,若想要預先為尚未加載的模型版本分配標簽,需要在運行命令中設置啟動參數
--allow_version_labels_for_unavailable_models=true
。部署服務。
支持以下兩種部署方式:
場景化模型部署
TensorFlow Serving模型服務支持配置8500和8501兩種端口。該部署方式默認使用8501端口,實現基本的場景化部署。如果您需要調整更多配置選項,比如更新端口、配置模型文件輪詢周期等,請切換至自定義模型部署頁簽進行部署。
8501:支持HTTP請求,在8501端口啟動HTTP或REST服務。
8500:支持gRPC請求,在8500端口啟動gRPC服務。
具體操作步驟如下:
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。然后在場景化模型部署區域,單擊TFServing部署。
在TFServing部署頁面,配置以下關鍵參數,其他參數配置說明,請參見服務部署:控制臺。
參數
描述
服務名稱
自定義配置服務名稱。
部署方式
選擇配置文件部署。
模型配置
將OSS配置為步驟1已準備的多模型文件所在的OSS存儲路徑,例如
oss://examplebucket/models/tf_serving/
。將配置文件配置為步驟1已準備的模型配置文件model_config.pbtxt所在的OSS存儲路徑。
參數配置完成后,單擊部署。
自定義模型部署
具體操作步驟如下:
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
在模型在線服務(EAS)頁面,單擊部署服務。然后在自定義模型部署區域,單擊自定義部署。
在新建服務頁面配置以下關鍵參數,更多參數配置說明,請參見服務部署:控制臺。
模型配置選擇OSS,將OSS路徑配置為步驟1中模型存儲目錄所在的OSS Bucket目錄,例如:
oss://examplebucket/models/tf_serving/
。掛載路徑:配置為
/models
。--model_config_file:必選。用來指定模型配置文件。
--model_config_file_poll_wait_seconds:選填。如果您希望在服務啟動后修改模型配置文件的內容,需要配置輪詢模型文件的周期,單位為秒。服務會按照配置的時間定期讀取模型配置文件的內容。例如
--model_config_file_poll_wait_seconds=30
表示服務每隔30秒讀取一次模型配置文件內容。說明當模型服務讀取新的模型配置文件時,只會執行新配置文件中的內容。例如:舊配置文件中包含模型A,而新配置文件將模型A刪除并增加了模型B的配置,那么服務會卸載模型A并加載模型B。
--allow_version_labels_for_unavailable_models:選填。默認為false,如果您想預先為尚未加載的模型版本分配標簽,需要將該參數配置為true。例如
--allow_version_labels_for_unavailable_models=true
。單擊部署。
參數
描述
部署方式
選擇鏡像部署服務。
鏡像選擇
在PAI平臺鏡像列表中選擇tensorflow-serving和對應的鏡像版本。建議選擇最新版本。
說明如果服務需要使用GPU,則鏡像版本必須選擇x.xx.x-gpu。
填寫模型配置
單擊填寫模型配置,進行模型配置。
運行命令
運行命令配置示例為:
/usr/bin/tf_serving_entrypoint.sh --model_config_file=/models/model_config.pbtxt --model_config_file_poll_wait_seconds=30 --allow_version_labels_for_unavailable_models=true
。參數說明如下:
端口號默認為8501,服務將在8501端口啟動HTTP或REST服務,支持HTTP請求。若您需要該服務支持gRPC請求,需要將端口號修改為8500,同時需要在對應配置編輯中添加以下配置,服務將支持gRPC請求。
"metadata": { "enable_http2": true }, "networking": { "path": "/" }
發送服務請求
根據服務部署時運行命令中配置的端口號,分別支持HTTP和gRPC兩種請求協議。
HTTP請求
端口號配置為8501,服務支持HTTP請求,發送服務請求支持以下兩種方式:
通過控制臺發送服務請求
服務部署完成后,單擊服務操作列下的在線調試,在該頁面發送服務請求。其中關鍵參數配置如下:
參數
描述
在線調試請求參數
在服務訪問地址后增加
/v1/models/<model_name>:predict
,其中:<model_name>:單模型發送HTTP請求時,配置為運行命令中配置的模型名稱;多模型發送HTTP請求時,配置為模型配置文件中配置的模型名稱。
<version_num>:可選配置,未指定版本號則默認加載版本號最大的模型。您也可以指定模型版本號,格式為:
/v1/models/<model_name>/versions/<version_num>:predict
。
Body
配置服務請求數據,例如:
{"signature_name": "predict_images", "inputs": [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]]}
參數配置完成后,單擊發送請求,輸出如下類似結果。
通過Python代碼發送服務請求
Python代碼示例如下:
from urllib import request import json # 服務訪問地址,未指定版本號則默認加載版本號最大的模型;您也可以參照下方url參數說明指定模型版本號。 url = '<service_url>/v1/models/<model_name>:predict' # 創建HTTP請求。 req = request.Request(url, method="POST") # test-token替換為服務Token。 req.add_header('authorization', '<test-token>') data = { 'signature_name': 'predict_images', 'inputs': [[1.0] * 784] } # 請求服務。 response = request.urlopen(req, data=json.dumps(data).encode('utf-8')).read() # 查看返回結果。 response = json.loads(response) print(response)
其中關鍵參數配置如下:
參數
描述
url
格式為:
<service_url>/v1/models/<model_name>:predict
其中:
<service_url>:需要替換為您部署的服務訪問地址。您可以在模型在線服務(EAS)頁面,單擊待調用服務服務方式列下的調用信息,在公網地址調用頁簽查看服務訪問地址。
<model_name>:配置方式如下。
單模型發送HTTP請求
配置為運行命令中配置的模型名稱。
多模型發送HTTP請求
配置為模型配置文件中配置的模型名稱。
<version_num>:可選配置,未指定版本號則默認加載版本號最大的模型。您也可以指定模型版本號,格式為:
<service_url>/v1/models/<model_name>/versions/<version_num>:predict
。
header
將<test-token>替換為服務Token。您可以在公網地址調用頁簽查看Token。
gRPC請求
端口號配置為8500,并添加gRPC相關配置后,服務支持發送gRPC請求。Python代碼示例如下:
import grpc from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.core.framework import tensor_shape_pb2 # 服務訪問地址。 host = "tf-serving-multi-grpc-test.166233998075****.cn-hangzhou.pai-eas.aliyuncs.com:80" name = "<model_name>" signature_name = "predict_images" version = <version_num> # 創建gRPC請求。 shape = tensor_shape_pb2.TensorShapeProto() dim1 = tensor_shape_pb2.TensorShapeProto.Dim(size=1) dim2 = tensor_shape_pb2.TensorShapeProto.Dim(size=784) shape.dim.extend([dim1, dim2]) request = predict_pb2.PredictRequest() request.model_spec.name = name request.model_spec.signature_name = signature_name request.model_spec.version.value = version request.inputs["images"].tensor_shape.CopyFrom(shape) request.inputs["images"].float_val.extend([1.0] * 784) request.inputs["images"].dtype = 1 # 請求服務。 channel = grpc.insecure_channel(host) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) metadata = (("authorization", "<test-token>"),) response, _ = stub.Predict.with_call(request, metadata=metadata) print(response)
其中關鍵參數配置如下:
參數
描述
host
需要配置為服務訪問地址,服務訪問地址需要省略
http://
并在末尾添加:80
。您可以在模型在線服務(EAS)頁面,單擊待調用服務服務方式列下的調用信息,在公網地址調用頁簽查看服務訪問地址。name
單模型發送gRPC請求
配置為運行命令中配置的模型名稱。
多模型發送gRPC請求
配置為模型配置文件中配置的模型名稱。
version
配置為模型版本號。每次只能對單個模型版本發送請求。
metadata
配置為服務Token。您可以在公網地址調用頁簽查看Token。
相關文檔
如何基于Triton Server推理服務引擎部署EAS服務,請參見Triton Inference Server鏡像部署。
如何使用Modelscope、Huggingface鏡像將相應的開源模型部署為EAS服務,請參見Modelscope鏡像部署和HuggingFace鏡像部署。
您也可以開發自定義鏡像,使用自定義鏡像部署EAS服務。具體操作,請參見服務部署:自定義鏡像。