Tensorflow Serving 設定

在本指南中,我們將介紹 Tensorflow Serving 的眾多設定點。

總覽

雖然大多數設定都與模型伺服器相關,但有很多方法可以指定 Tensorflow Serving 的行為

模型伺服器設定

提供 --model_name--model_base_path 標記 (或在使用 Docker 時設定 MODEL_NAME 環境變數) 是提供模型服務最簡單的方式。但是,如果您想要提供多個模型服務,或設定輪詢新版本頻率等選項,您可以透過編寫模型伺服器設定檔來達成目的。

您可以使用 --model_config_file 標記提供此設定檔,並指示 Tensorflow Serving 定期輪詢指定路徑中此設定檔的更新版本,方法是設定 --model_config_file_poll_wait_seconds 標記。

使用 Docker 的範例

docker run -t --rm -p 8501:8501 \
    -v "$(pwd)/models/:/models/" tensorflow/serving \
    --model_config_file=/models/models.config \
    --model_config_file_poll_wait_seconds=60

重新載入模型伺服器設定

有兩種方法可以重新載入模型伺服器設定

  • 設定 --model_config_file_poll_wait_seconds 標記,指示伺服器定期檢查 --model_config_file 檔案路徑中是否有新的設定檔。

  • 向伺服器發出 HandleReloadConfigRequest RPC 呼叫,並以程式設計方式提供新的模型伺服器設定。

請注意,伺服器每次載入新的設定檔時,都會採取行動來實現新指定設定的內容,且僅限新的指定設定。這表示如果模型 A 存在於第一個設定檔中,但該檔案被僅包含模型 B 的檔案取代,則伺服器將載入模型 B 並卸載模型 A。

模型伺服器設定詳細資料

提供的模型伺服器設定檔必須是 ModelServerConfig 通訊協定緩衝區

對於除了最進階的使用案例之外的所有情況,您都會想要使用 ModelConfigList 選項,這是 ModelConfig 通訊協定緩衝區的清單。以下是一個基本範例,然後我們再深入探討下方的進階選項。

model_config_list {
  config {
    name: 'my_first_model'
    base_path: '/tmp/my_first_model/'
    model_platform: 'tensorflow'
  }
  config {
    name: 'my_second_model'
    base_path: '/tmp/my_second_model/'
    model_platform: 'tensorflow'
  }
}

設定一個模型

每個 ModelConfig 都指定一個要提供的模型,包括其名稱和模型伺服器應在其中尋找要提供之模型版本的路徑,如上述範例所示。根據預設,伺服器將提供版本號碼最大的版本。您可以變更 model_version_policy 欄位來覆寫此預設值。

提供模型的特定版本服務

若要提供模型的特定版本服務,而不是一律轉換為版本號碼最大的版本,請將 model_version_policy 設定為「specific」,並提供您想要提供的版本號碼。例如,若要將版本 42 釘選為要提供的版本

model_version_policy {
  specific {
    versions: 42
  }
}

如果最新版本發現問題,此選項適用於回復到已知的良好版本。

同時提供多個模型版本服務

若要同時提供多個模型版本服務,例如啟用以部分流量測試新的暫定版本,請將 model_version_policy 設定為「specific」,並提供多個版本號碼。例如,若要提供版本 42 和 43 服務

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}

為模型版本指派字串標籤,以簡化測試和回復

有時,為模型版本新增間接層會很有幫助。您可以將別名 (例如「stable」) 指派給目前用戶端應查詢的版本,而無需讓所有用戶端知道他們應查詢版本 42。如果您想要將部分流量重新導向至暫定的測試模型版本,可以使用第二個別名「canary」。

您可以設定這些模型版本別名或標籤,如下所示

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}
version_labels {
  key: 'stable'
  value: 42
}
version_labels {
  key: 'canary'
  value: 43
}

在上述範例中,您提供版本 42 和 43 服務,並將標籤「stable」與版本 42 建立關聯,將標籤「canary」與版本 43 建立關聯。您可以讓用戶端將查詢導向至「stable」或「canary」其中之一 (可能根據雜湊使用者 ID),方法是使用 ModelSpec 通訊協定緩衝區的 version_label 欄位,並在伺服器上向前移動標籤,而無需通知用戶端。在您完成測試版本 43 並準備將其升級為穩定版本後,您可以將設定更新為

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}
version_labels {
  key: 'stable'
  value: 43
}
version_labels {
  key: 'canary'
  value: 43
}

如果您後續需要執行回復,可以還原為舊設定,將版本 42 作為「stable」。否則,您可以向前推進,方法是卸載版本 42 並在新的版本 44 準備就緒時載入,然後將測試標籤推進至 44,依此類推。

請注意,標籤只能指派給已經載入且可提供服務的模型版本。模型版本可用後,您可以即時重新載入模型設定,以將標籤指派給它。這可以使用 HandleReloadConfigRequest RPC 來達成,或者如果伺服器設定為定期輪詢檔案系統以取得設定檔,如上方所述。

如果您想要將標籤指派給尚未載入的版本 (例如,在啟動時間同時提供模型版本和標籤),則必須將 --allow_version_labels_for_unavailable_models 標記設定為 true,這允許將新標籤指派給尚未載入的模型版本。

請注意,這僅適用於新的版本標籤 (亦即,目前未指派給版本的標籤)。這是為了確保在版本交換期間,伺服器不會過早將標籤指派給新版本,從而在新版本載入時捨棄所有目標為該標籤的要求。

為了符合此安全檢查,如果重新指派已在使用的版本標籤,則必須僅將其指派給已載入的版本。例如,如果您想要將標籤從指向版本 N 移至版本 N+1,您可以先提交包含版本 N 和 N+1 的設定,然後提交包含版本 N+1 的設定,標籤指向 N+1 且沒有版本 N。

REST 用法

如果您使用 REST API 介面發出推論要求,而不是使用

/v1/models/<model name>/versions/<version number>

只需使用標籤請求版本,方法是將您的要求路徑構造成如下所示

/v1/models/<model name>/labels/<version label>.

請注意,版本標籤僅限於單字字元序列,由字母數字字元和底線組成 (亦即 [a-zA-Z0-9_]+)。

監控設定

您可以使用 --monitoring_config_file 標記指定包含 MonitoringConfig 通訊協定緩衝區的檔案,藉此為伺服器提供監控設定。以下範例

prometheus_config {
  enable: true,
  path: "/monitoring/prometheus/metrics"
}

若要從上述監控網址讀取指標,您首先需要設定 --rest_api_port 標記來啟用 HTTP 伺服器。然後,您可以設定 Prometheus 伺服器,方法是將 --rest_api_portpath 的值傳遞給它,以從模型伺服器提取指標。

Tensorflow Serving 會收集 Serving 以及核心 Tensorflow 擷取的所有指標。

批次處理設定

模型伺服器能夠在各種設定中批次處理要求,以實現更佳的輸送量。此批次處理的排程是針對伺服器上的所有模型和模型版本全域完成,以確保基礎資源的最佳利用率,無論伺服器目前提供多少模型或模型版本 (更多詳細資訊)。您可以設定 --enable_batching 標記來啟用此行為,並透過將設定傳遞至 --batching_parameters_file 標記來控制它。

批次處理參數檔案範例

max_batch_size { value: 128 }
batch_timeout_micros { value: 0 }
max_enqueued_batches { value: 1000000 }
num_batch_threads { value: 8 }

請參閱 批次處理指南以取得深入討論,並參閱 參數章節以瞭解如何設定參數。

其他標記

除了本指南迄今涵蓋的標記之外,我們在此處列出其他一些值得注意的標記。如需完整清單,請參閱原始碼

  • --port:用於接聽 gRPC API 的連接埠
  • --rest_api_port:用於接聽 HTTP/REST API 的連接埠
  • --rest_api_timeout_in_ms:HTTP/REST API 呼叫的逾時
  • --file_system_poll_wait_seconds:伺服器在每個模型的個別 model_base_path 中輪詢檔案系統以取得新模型版本的週期
  • --enable_model_warmup:使用資產中使用者提供的 PredictionLogs 啟用模型暖機。額外/目錄
  • --mixed_precision=bfloat16:啟用 BF16 自動混合精度