Treten Sie der SIG TFX-Addons-Community bei und helfen Sie mit, TFX noch besser zu machen! SIG TFX-Addons beitreten

Die InfraValidator TFX-Pipeline-Komponente

InfraValidator ist eine TFX-Komponente, die als Frühwarnschicht verwendet wird, bevor ein Modell in Produktion geht. Der Name "Infra"-Validator kommt daher, dass er das Modell im eigentlichen Modell validiert, das der "Infrastruktur" dient. Wenn Evaluator ist die Leistung des Modells zu gewährleisten, ist InfraValidator das Modell zu garantieren mechanisch in Ordnung ist und verhindert , dass schlechte Modelle aus geschoben wird.

Wie funktioniert es?

InfraValidator nimmt das Modell, startet einen Sandkasten-Modellserver mit dem Modell und prüft, ob es erfolgreich geladen und optional abgefragt werden kann. Die infra Prüfungsergebnis wird in dem erzeugt werden blessing Ausgang in der gleichen Weise wie Evaluator tut.

InfraValidator konzentriert sich auf die Kompatibilität zwischen dem Modellserver binär (zB TensorFlow Serving ) und das Modell zu implementieren. Trotz des Namen „infra“ Validator, ist es in der Verantwortung des Anwenders , die Umwelt richtig zu konfigurieren und infra - Validator nur interagiert mit den Modell - Server in der vom Benutzer konfigurierten Umgebung zu sehen , ob es gut funktioniert. Durch die korrekte Konfiguration dieser Umgebung wird sichergestellt, dass die erfolgreiche oder fehlgeschlagene Infra-Validierung ein Hinweis darauf ist, ob das Modell in der Produktionsumgebung bereitgestellt werden kann. Dies impliziert einige der folgenden, ist jedoch nicht darauf beschränkt:

  1. InfraValidator verwendet dieselbe Modellserver-Binärdatei, die in der Produktion verwendet wird. Dies ist das minimale Niveau, auf das die Infra-Validierungsumgebung konvergieren muss.
  2. InfraValidator verwendet dieselben Ressourcen (z. B. Zuweisungsmenge und Typ von CPU, Speicher und Beschleunigern), die in der Produktion verwendet werden.
  3. InfraValidator verwendet dieselbe Modellserverkonfiguration, die in der Produktion verwendet wird.

Je nach Situation können Benutzer wählen, inwieweit InfraValidator mit der Produktionsumgebung identisch sein soll. Technisch kann ein Modell problemlos in einer lokalen Docker-Umgebung infravalidiert und dann in einer völlig anderen Umgebung (zB Kubernetes-Cluster) bereitgestellt werden. InfraValidator wird diese Abweichung jedoch nicht überprüft haben.

Betriebsmodus

Je nach Konfiguration erfolgt die Infra-Validierung in einem der folgenden Modi:

  • LOAD_ONLY Modus: Prüfen , ob das Modell erfolgreich in der versorgenden Infrastruktur oder nicht geladen wurde. ODER
  • LOAD_AND_QUERY Modus: LOAD_ONLY Modus sowie einige Musteranfragen Senden zu überprüfen , ob Modell in der Lage ist , Rückschlüsse zu dienen. InfraValidator ist es egal, ob die Vorhersage richtig war oder nicht. Nur ob die Anfrage erfolgreich war oder nicht, ist wichtig.

Wie benutze ich es?

Normalerweise wird InfraValidator neben einer Evaluator-Komponente definiert und seine Ausgabe wird einem Pusher zugeführt. Wenn InfraValidator fehlschlägt, wird das Modell nicht gepusht.

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(...)
)

Konfigurieren einer InfraValidator-Komponente.

Es gibt drei Arten von Prototypen, um InfraValidator zu konfigurieren.

ServingSpec

ServingSpec ist die wichtigste Konfiguration für den InfraValidator. Es definiert:

  • welche Art von Modell - Server laufen
  • wo es laufen

Für Modellservertypen (als Serving Binary bezeichnet) unterstützen wir

Folgende Serving-Plattformen werden derzeit unterstützt:

  • Local Docker (Docker sollte im Voraus installiert werden)
  • Kubernetes (begrenzte Unterstützung nur für KubeflowDagRunner)

Die Wahl für die binäre dient , und Serving - Plattform werden durch einen Spezifizierungs oneof Block des ServingSpec . Zum Beispiel TensorFlow Serving binären Lauf auf dem Kubernetes Cluster, verwenden tensorflow_serving und kubernetes Feld gesetzt werden sollte.

infra_validator=InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(
        tensorflow_serving=tfx.proto.TensorFlowServing(
            tags=['latest']
        ),
        kubernetes=tfx.proto.KubernetesConfig()
    )
)

Zum weiteren configure ServingSpec , überprüfen Sie bitte die protobuf Definition .

ValidationSpec

Optionale Konfiguration zum Anpassen der Infrarot-Validierungskriterien oder des Workflows.

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
    )
)

Alle ValidationSpec-Felder haben einen soliden Standardwert. Schauen Sie genauer aus der protobuf Definition .

RequestSpec

Optionale Konfiguration festlegen , wie Musteranfragen erstellen , wenn infra Validierung läuft LOAD_AND_QUERY Modus. Zu verwenden , um LOAD_AND_QUERY Modus ist es erforderlich , die beide zu spezifizieren request_spec Ausführungseigenschaften sowie examples Eingangskanal in der Komponentendefinition.

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.
    )
)

Erstellen eines SavedModels mit Warmup

(Ab Version 0.30.0)

Da InfraValidator validates Modell mit echten Anfragen, kann es leicht , diese Validierungsanforderungen als Wiederverwendung Warmup - Anforderungen eines SavedModel. InfraValidator bietet eine Option ( RequestSpec.make_warmup ) eine SavedModel mit Warm - up zu exportieren.

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

Dann ist der Ausgang InfraBlessing wird Artefakt eine SavedModel mit Warm - up enthalten und kann auch durch die geschoben werden Pusher , wie Model - Artefakt.

Einschränkungen

Der aktuelle InfraValidator ist noch nicht vollständig und weist einige Einschränkungen auf.

  • Nur TensorFlow SavedModel können Modellformat validiert werden.
  • Wenn auf Kubernetes TFX ausgeführt wird , sollte die Pipeline durch ausgeführt werden KubeflowDagRunner innerhalb Kubeflow Pipelines. Der Modellserver wird im gleichen Kubernetes-Cluster und dem von Kubeflow verwendeten Namespace gestartet.
  • InfraValidator ist in erster Linie konzentriert sich auf Implementierungen TensorFlow Serving und während sie noch sinnvoll ist es weniger genau für Implementierungen TensorFlow Lite und TensorFlow.js oder andere Inferenz - Frameworks.
  • Es gibt eine begrenzte Unterstützung auf LOAD_AND_QUERY Modus für die Predict Methodensignatur (die die einzige Methode exportierbare in TensorFlow ist 2). InfraValidator erfordert die Unterschrift Predict eine serialisierte zu verbrauchen tf.Example als einziger Eingang.

    @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'))
    })
    
    • Schauen Sie sich einen Penguin Beispiel Beispielcode , um zu sehen , wie diese Signatur in Wechselwirkung mit anderen Komponenten in TFX.