InfraValidator TFX 管線元件

InfraValidator 是一種 TFX 元件,在將模型推送至生產環境之前,會作為早期警告層使用。「Infra」驗證器名稱的由來,是因為它是在實際模型服務「基礎架構」中驗證模型。如果 Evaluator 是為了保證模型的效能,那麼 InfraValidator 則是為了保證模型在機械方面沒有問題,並防止推送不良模型。

運作方式

InfraValidator 會取得模型,使用該模型啟動沙箱模型伺服器,並查看是否可以成功載入模型,以及是否可以選擇性地查詢模型。基礎架構驗證結果會以與 Evaluator 相同的方式,在 blessing 輸出中產生。

InfraValidator 專注於模型伺服器二進位檔 (例如 TensorFlow Serving) 與要部署的模型之間的相容性。儘管名稱為「基礎架構」驗證器,但正確設定環境是 使用者的責任,而基礎架構驗證器僅與使用者設定環境中的模型伺服器互動,以查看其是否運作正常。正確設定此環境將確保基礎架構驗證通過或失敗,可指示模型是否可在生產服務環境中服務。這表示以下部分事項,但不限於:

  1. InfraValidator 使用與生產環境中將使用的相同的模型伺服器二進位檔。這是基礎架構驗證環境必須收斂到的最低層級。
  2. InfraValidator 使用與生產環境中將使用的相同的資源 (例如 CPU、記憶體和加速器的配置數量和類型)。
  3. 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 的有限支援)

服務二進位檔和服務平台的選擇是透過指定 ServingSpeconeof 區塊來完成。例如,若要使用在 Kubernetes 叢集上執行的 TensorFlow Serving 二進位檔,應設定 tensorflow_servingkubernetes 欄位。

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 LiteTensorFlow.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 中的其他元件互動。