InfraValidator 是一種 TFX 元件,在將模型推送至生產環境之前,會作為早期警告層使用。「Infra」驗證器名稱的由來,是因為它是在實際模型服務「基礎架構」中驗證模型。如果 Evaluator 是為了保證模型的效能,那麼 InfraValidator 則是為了保證模型在機械方面沒有問題,並防止推送不良模型。
運作方式
InfraValidator 會取得模型,使用該模型啟動沙箱模型伺服器,並查看是否可以成功載入模型,以及是否可以選擇性地查詢模型。基礎架構驗證結果會以與 Evaluator 相同的方式,在 blessing
輸出中產生。
InfraValidator 專注於模型伺服器二進位檔 (例如 TensorFlow Serving) 與要部署的模型之間的相容性。儘管名稱為「基礎架構」驗證器,但正確設定環境是 使用者的責任,而基礎架構驗證器僅與使用者設定環境中的模型伺服器互動,以查看其是否運作正常。正確設定此環境將確保基礎架構驗證通過或失敗,可指示模型是否可在生產服務環境中服務。這表示以下部分事項,但不限於:
- InfraValidator 使用與生產環境中將使用的相同的模型伺服器二進位檔。這是基礎架構驗證環境必須收斂到的最低層級。
- InfraValidator 使用與生產環境中將使用的相同的資源 (例如 CPU、記憶體和加速器的配置數量和類型)。
- InfraValidator 使用與生產環境中將使用的相同的模型伺服器設定。
使用者可以根據情況選擇 InfraValidator 應在多大程度上與生產環境相同。從技術上講,模型可以在本機 Docker 環境中進行基礎架構驗證,然後在完全不同的環境 (例如 Kubernetes 叢集) 中提供服務,而不會有問題。但是,InfraValidator 不會檢查此差異。
操作模式
基礎架構驗證會根據設定,以以下其中一種模式完成
LOAD_ONLY
模式:檢查模型是否已在服務基礎架構中成功載入。或LOAD_AND_QUERY
模式:LOAD_ONLY
模式加上傳送一些範例要求,以檢查模型是否能夠提供推論。InfraValidator 不關心預測是否正確。只有要求是否成功才重要。
如何使用?
通常 InfraValidator 會定義在 Evaluator 元件旁邊,且其輸出會饋送至 Pusher。如果 InfraValidator 失敗,則不會推送模型。
evaluator = Evaluator(
model=trainer.outputs['model'],
examples=example_gen.outputs['examples'],
baseline_model=model_resolver.outputs['model'],
eval_config=tfx.proto.EvalConfig(...)
)
infra_validator = InfraValidator(
model=trainer.outputs['model'],
serving_spec=tfx.proto.ServingSpec(...)
)
pusher = Pusher(
model=trainer.outputs['model'],
model_blessing=evaluator.outputs['blessing'],
infra_blessing=infra_validator.outputs['blessing'],
push_destination=tfx.proto.PushDestination(...)
)
設定 InfraValidator 元件。
有三種原型可設定 InfraValidator。
ServingSpec
ServingSpec
是 InfraValidator 最重要的設定。它定義了
- 要執行的模型伺服器類型
- 在何處執行
對於模型伺服器類型 (稱為服務二進位檔),我們支援
目前支援以下服務平台
- 本機 Docker (應預先安裝 Docker)
- Kubernetes (僅限 KubeflowDagRunner 的有限支援)
服務二進位檔和服務平台的選擇是透過指定 ServingSpec
的 oneof
區塊來完成。例如,若要使用在 Kubernetes 叢集上執行的 TensorFlow Serving 二進位檔,應設定 tensorflow_serving
和 kubernetes
欄位。
infra_validator=InfraValidator(
model=trainer.outputs['model'],
serving_spec=tfx.proto.ServingSpec(
tensorflow_serving=tfx.proto.TensorFlowServing(
tags=['latest']
),
kubernetes=tfx.proto.KubernetesConfig()
)
)
若要進一步設定 ServingSpec
,請查看 protobuf 定義。
ValidationSpec
用於調整基礎架構驗證條件或工作流程的選用設定。
infra_validator=InfraValidator(
model=trainer.outputs['model'],
serving_spec=tfx.proto.ServingSpec(...),
validation_spec=tfx.proto.ValidationSpec(
# How much time to wait for model to load before automatically making
# validation fail.
max_loading_time_seconds=60,
# How many times to retry if infra validation fails.
num_tries=3
)
)
所有 ValidationSpec 欄位都有合理的預設值。從 protobuf 定義查看更多詳細資訊。
RequestSpec
用於指定如何在 LOAD_AND_QUERY
模式下執行基礎架構驗證時,建構範例要求的選用設定。為了使用 LOAD_AND_QUERY
模式,必須在元件定義中指定 request_spec
執行屬性和 examples
輸入通道。
infra_validator = InfraValidator(
model=trainer.outputs['model'],
# This is the source for the data that will be used to build a request.
examples=example_gen.outputs['examples'],
serving_spec=tfx.proto.ServingSpec(
# Depending on what kind of model server you're using, RequestSpec
# should specify the compatible one.
tensorflow_serving=tfx.proto.TensorFlowServing(tags=['latest']),
local_docker=tfx.proto.LocalDockerConfig(),
),
request_spec=tfx.proto.RequestSpec(
# InfraValidator will look at how "classification" signature is defined
# in the model, and automatically convert some samples from `examples`
# artifact to prediction RPC requests.
tensorflow_serving=tfx.proto.TensorFlowServingRequestSpec(
signature_names=['classification']
),
num_examples=10 # How many requests to make.
)
)
產生具有暖機的 SavedModel
(從 0.30.0 版開始)
由於 InfraValidator 會使用真實要求驗證模型,因此它可以輕鬆地重複使用這些驗證要求,作為 SavedModel 的 暖機要求。InfraValidator 提供一個選項 (RequestSpec.make_warmup
) 以匯出具有暖機的 SavedModel。
infra_validator = InfraValidator(
...,
request_spec=tfx.proto.RequestSpec(..., make_warmup=True)
)
然後輸出 InfraBlessing
構件將包含具有暖機的 SavedModel,並且也可以像 Model
構件一樣由 Pusher 推送。
限制
目前的 InfraValidator 尚未完成,且有一些限制。
- 僅可驗證 TensorFlow SavedModel 模型格式。
- 在 Kubernetes 上執行 TFX 時,管線應由 Kubeflow Pipelines 內部的
KubeflowDagRunner
執行。模型伺服器將在相同的 Kubernetes 叢集和 Kubeflow 正在使用的命名空間中啟動。 - InfraValidator 主要專注於部署到 TensorFlow Serving,雖然仍然有用,但對於部署到 TensorFlow Lite 和 TensorFlow.js 或其他推論架構而言,其準確性較低。
對於 Predict 方法簽名 (這是 TensorFlow 2 中唯一可匯出的方法),
LOAD_AND_QUERY
模式的支援有限。InfraValidator 需要 Predict 簽名來使用序列化的tf.Example
作為唯一輸入。@tf.function def parse_and_run(serialized_example): features = tf.io.parse_example(serialized_example, FEATURES) return model(features) model.save('path/to/save', signatures={ # This exports "Predict" method signature under name "serving_default". 'serving_default': parse_and_run.get_concrete_function( tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')) })
- 查看 Penguin 範例 範例程式碼,以瞭解此簽名如何與 TFX 中的其他元件互動。