InfraValidator TFX パイプライン コンポーネント

InfraValidator は、モデルを運用環境にプッシュする前の早期警告レイヤーとして使用される TFX コンポーネントです。 「インフラ」バリデーターという名前は、「インフラストラクチャー」を提供する実際のモデルでモデルを検証するという事実に由来しています。 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 を構成するプロトは 3 種類あります。

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 は、ウォームアップを使用して SavedModel をエクスポートするオプション ( RequestSpec.make_warmup ) を提供します。

infra_validator = InfraValidator(
    ...,
    request_spec=tfx.proto.RequestSpec(..., make_warmup=True)
)

次に、出力InfraBlessingアーティファクトにはウォームアップを含む SavedModel が含まれ、 Modelアーティファクトと同様にPusherによってプッシュすることもできます。

制限事項

現在の InfraValidator はまだ完成しておらず、いくつかの制限があります。

  • TensorFlow SavedModelモデル形式のみを検証できます。
  • Kubernetes で TFX を実行する場合、パイプラインは Kubeflow Pipelines 内のKubeflowDagRunnerによって実行される必要があります。モデル サーバーは、Kubeflow が使用しているのと同じ Kubernetes クラスターおよび名前空間で起動されます。
  • InfraValidator は主にTensorFlow Servingへのデプロイメントに焦点を当てており、依然として有用ではありますが、 TensorFlow LiteTensorFlow.js 、またはその他の推論フレームワークへのデプロイメントの精度は低くなります。
  • LOAD_AND_QUERYモードでは、 Predictメソッド シグネチャ (TensorFlow 2 で唯一エクスポート可能なメソッド) のサポートが制限されています。 InfraValidator では、シリアル化された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'))
    })
    
    • ペンギンのサンプル コードをチェックして、このシグネチャが TFX の他のコンポーネントとどのように相互作用するかを確認してください。