InfraValidator TFX 管道组件

InfraValidator 是一个 TFX 组件,用作将模型推送到生产环境之前的预警层。名称“infra”验证器来自它在实际模型服务“基础设施”中验证模型的事实。如果 评估器 用于保证模型的性能,则 InfraValidator 用于保证模型在机械上是正常的,并防止不良模型被推送。

它是如何工作的?

InfraValidator 获取模型,使用模型启动一个沙箱模型服务器,并查看它是否可以成功加载并可选地进行查询。基础设施验证结果将以与 评估器 相同的方式在 blessing 输出中生成。

InfraValidator 专注于模型服务器二进制文件(例如 TensorFlow Serving)与要部署的模型之间的兼容性。尽管名称为“infra”验证器,但用户有责任正确配置环境,而基础设施验证器仅与用户配置的环境中的模型服务器进行交互,以查看它是否正常工作。正确配置此环境将确保基础设施验证通过或失败将表明模型是否可以在生产服务环境中进行服务。这意味着以下内容中的一些,但不限于以下内容

  1. InfraValidator 使用与生产环境中相同的模型服务器二进制文件。这是基础设施验证环境必须收敛到的最低级别。
  2. InfraValidator 使用与生产环境中相同的资源(例如 CPU、内存和加速器的分配数量和类型)。
  3. InfraValidator 使用与生产环境中相同的模型服务器配置。

根据情况,用户可以选择 InfraValidator 与生产环境的匹配程度。从技术上讲,模型可以在本地 Docker 环境中进行基础设施验证,然后在完全不同的环境(例如 Kubernetes 集群)中进行服务,而不会出现问题。但是,InfraValidator 不会检查这种差异。

操作模式

根据配置,基础设施验证以以下模式之一进行

  • LOAD_ONLY 模式:检查模型是否已成功加载到服务基础设施中。或者
  • LOAD_AND_QUERY 模式:LOAD_ONLY 模式加上发送一些示例请求以检查模型是否能够提供推断。InfraValidator 不关心预测是否正确。只有请求是否成功才重要。

如何使用它?

通常,InfraValidator 定义在评估器组件旁边,其输出被馈送到 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,请查看 协议缓冲区定义

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,并且也可以由 Pusher 推送,就像 Model 工件一样。

限制

当前的 InfraValidator 尚未完成,存在一些限制。

  • 仅支持验证 TensorFlow SavedModel 模型格式。
  • 在 Kubernetes 上运行 TFX 时,管道应由 Kubeflow Pipelines 中的 KubeflowDagRunner 执行。模型服务器将在与 Kubeflow 使用的命名空间相同的 Kubernetes 集群中启动。
  • 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'))
    })
    
    • 查看 企鹅示例 代码示例,了解此签名如何与 TFX 中的其他组件交互。