全部產品
Search
文件中心

Platform For AI:TensorFlow Serving鏡像部署

更新時間:Jul 13, 2024

TensorFlow Serving是一個適用於深度學習模型的推理服務引擎,支援將TensorFlow標準的SavedModel格式的模型部署為線上服務,並支援模型熱更新與模型版本管理等功能。本文為您介紹如何使用鏡像部署的方式部署TensorFlow Serving模型服務。

部署服務

部署單模型服務

  1. 在OSS儲存空間中建立模型儲存目錄,詳情請參見管理目錄

    TensorFlow Serving模型的儲存目錄要求以如下目錄結構儲存模型:

    • 模型版本目錄:每個模型至少包含一個模型版本目錄,且必須以數字命名,作為模型版本號碼,數字越大版本號碼越新。

    • 模型檔案:模型版本目錄下存放匯出的SavedModel格式的模型檔案,服務會自動載入最大模型版本號碼目錄下的模型檔案。

    假設模型儲存目錄在oss://examplebucket/models/tf_serving/ 路徑下,模型儲存目錄的格式如下:

    tf_serving
    └── mnist
        └──1
           ├── saved_model.pb
           └── variables
               ├── variables.data-00000-of-00001
               └── variables.index
  2. 部署TensorFlow Serving服務。

    TensorFlow Serving服務支援配置以下兩種連接埠,在情境化模型部署中,服務預設使用8501連接埠,若您需要使用8500連接埠,則需要執行步驟e,否則忽略步驟e即可。

    • 8501:支援HTTP請求,在8501連接埠啟動HTTP或REST服務。

    • 8500:支援gRPC請求,在8500連接埠啟動gRPC服務,

    具體操作步驟如下:

    1. 進入模型線上服務(EAS)頁面。

      1. 登入PAI控制台

      2. 在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。

      3. 在工作空間頁面的左側導覽列選擇模型部署>模型線上服務(EAS),進入模型線上服務(EAS)頁面。image

    2. 模型線上服務(EAS)頁面,單擊部署服務

    3. 情境化模型部署地區,單擊TFServing部署

    4. TFServing部署頁面,配置以下關鍵參數,其他參數配置說明,請參見服務部署:控制台

      參數

      描述

      服務名稱

      自訂佈建服務名稱。

      部署方式

      選擇標準模型部署

      模型配置

      OSS配置為步驟1中已準備的模型所在的OSS儲存路徑,例如oss://examplebucket/models/tf_serving/

    5. (可選)單擊頁面右側的切換為自訂部署,修改模型服務資訊地區的運行命令,將連接埠號碼修改為8500,同時您需要在對應配置編輯中添加以下配置。

      說明

      服務預設在8501連接埠啟動HTTP或REST服務,支援HTTP請求。若您需要該服務支援gRPC請求,您需要將連接埠號碼修改為8500,系統會在8500連接埠啟動gRPC服務。

      "metadata": {
          "enable_http2": true
      },
      "networking": {
          "path": "/"
      }
    6. 參數配置完成後,單擊部署

部署多模型服務

TensorFlow Serving支援同時部署多個模型,具體操作步驟如下。

  1. 在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

  2. 部署服務。

    1. 進入模型線上服務(EAS)頁面。

      1. 登入PAI控制台

      2. 在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應工作空間內。

      3. 在工作空間頁面的左側導覽列選擇模型部署>模型線上服務(EAS),進入模型線上服務(EAS)頁面。image

    2. 模型線上服務(EAS)頁面,單擊部署服務

    3. 情境化模型部署地區,單擊TFServing部署

    4. TFServing部署頁面,配置以下關鍵參數,其他參數配置說明,請參見服務部署:控制台

      參數

      描述

      服務名稱

      自訂佈建服務名稱。

      部署方式

      選擇設定檔部署

      模型配置

      • OSS配置為步驟1已準備的多模型檔案所在的OSS儲存路徑,例如oss://examplebucket/models/tf_serving/

      • 設定檔配置為步驟1已準備的模型設定檔model_config.pbtxt所在的OSS儲存路徑。

    5. (可選)單擊頁面右側的切換為自訂部署,在模型服務資訊地區的運行命令中配置以下參數,以實現特定功能。

      • 增加以下參數,以實現特定功能:

        參數

        是否必選

        描述

        --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

      • 更新連接埠號碼為8500,同時您需要在對應配置編輯中添加以下配置,服務將支援gRPC請求。

        服務預設在8501連接埠啟動HTTP或REST服務,支援HTTP請求。若您需要該服務支援gRPC請求,您需要將連接埠號碼修改為8500,系統會在8500連接埠啟動gRPC服務。

        "metadata": {
            "enable_http2": true
        },
        "networking": {
            "path": "/"
        }
    6. 參數配置完成後,單擊部署

發送服務要求

根據服務部署時運行命令中配置的連接埠號碼,分別支援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]]}

    參數配置完成後,單擊發送請求,輸出如下類似結果。

    image

    通過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。

相關文檔