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鏡像部署。
您也可以開發自訂鏡像,使用自訂鏡像部署EAS服務。具體操作,請參見服務部署:自訂鏡像。