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

Die Tuner TFX-Pipeline-Komponente

Die Tuner-Komponente optimiert die Hyperparameter für das Modell.

Tunerkomponente und KerasTuner-Bibliothek

Die Tuner-Komponente verwendet in großem Umfang die Python KerasTuner- API zum Optimieren von Hyperparametern.

Komponente

Tuner braucht:

  • tf.Beispiele für Training und Bewertung.
  • Eine vom Benutzer bereitgestellte Moduldatei (oder das Modul fn), die die Optimierungslogik definiert, einschließlich Modelldefinition, Hyperraum-Suchraum, Ziel usw.
  • Protobuf- Definition von Zugargumenten und Bewertungsargumenten.
  • (Optional) Protobuf- Definition von Tuning-Argumenten.
  • (Optionaler) Transformationsgraph, der von einer vorgeschalteten Transformationskomponente erzeugt wird.
  • (Optional) Ein Datenschema, das von einer SchemaGen-Pipelinekomponente erstellt und optional vom Entwickler geändert wurde.

Mit den angegebenen Daten, Modellen und Zielen stimmt Tuner die Hyperparameter ab und liefert das beste Ergebnis.

Anleitung

Für Tuner ist eine Benutzermodulfunktion tuner_fn mit folgender Signatur erforderlich:

...
from kerastuner.engine import base_tuner

TunerFnResult = NamedTuple('TunerFnResult', [('tuner', base_tuner.BaseTuner),
                                             ('fit_kwargs', Dict[Text, Any])])

def tuner_fn(fn_args: FnArgs) -> TunerFnResult:
  """Build the tuner using the KerasTuner API.
  Args:
    fn_args: Holds args as name/value pairs.

      - working_dir: working dir for tuning.
      - train_files: List of file paths containing training tf.Example data.
      - eval_files: List of file paths containing eval tf.Example data.
      - train_steps: number of train steps.
      - eval_steps: number of eval steps.
      - schema_path: optional schema of the input data.
      - transform_graph_path: optional transform graph produced by TFT.
  Returns:
    A namedtuple contains the following:
      - tuner: A BaseTuner that will be used for tuning.
      - fit_kwargs: Args to pass to tuner's run_trial function for fitting the
                    model , e.g., the training and validation dataset. Required
                    args depend on the above tuner's implementation.
  """
  ...

In dieser Funktion definieren Sie sowohl den Modell- als auch den Hyperparametersuchraum und wählen das Ziel und den Algorithmus für die Optimierung aus. Die Tuner-Komponente verwendet diesen Modulcode als Eingabe, optimiert die Hyperparameter und gibt das beste Ergebnis aus.

Der Trainer kann die Ausgabehyperparameter des Tuners als Eingabe verwenden und sie in seinem Benutzermodulcode verwenden. Die Pipeline-Definition sieht folgendermaßen aus:

...
tuner = Tuner(
    module_file=module_file,  # Contains `tuner_fn`.
    examples=transform.outputs['transformed_examples'],
    transform_graph=transform.outputs['transform_graph'],
    train_args=trainer_pb2.TrainArgs(num_steps=20),
    eval_args=trainer_pb2.EvalArgs(num_steps=5))

trainer = Trainer(
    module_file=module_file,  # Contains `run_fn`.
    examples=transform.outputs['transformed_examples'],
    transform_graph=transform.outputs['transform_graph'],
    schema=schema_gen.outputs['schema'],
    # This will be passed to `run_fn`.
    hyperparameters=tuner.outputs['best_hyperparameters'],
    train_args=trainer_pb2.TrainArgs(num_steps=100),
    eval_args=trainer_pb2.EvalArgs(num_steps=5))
...

Möglicherweise möchten Sie die Hyperparameter nicht jedes Mal anpassen, wenn Sie Ihr Modell neu trainieren. Nachdem Sie mit Tuner einen guten Satz von Hyperparametern ermittelt haben, können Sie Tuner aus Ihrer Pipeline entfernen und mit ImporterNode das Tuner-Artefakt aus einem früheren Trainingslauf importieren, um es an Trainer weiterzuleiten.

hparams_importer = ImporterNode(
    instance_name='import_hparams',
    # This can be Tuner's output file or manually edited file. The file contains
    # text format of hyperparameters (kerastuner.HyperParameters.get_config())
    source_uri='path/to/best_hyperparameters.txt',
    artifact_type=HyperParameters)

trainer = Trainer(
    ...
    # An alternative is directly use the tuned hyperparameters in Trainer's user
    # module code and set hyperparameters to None here.
    hyperparameters = hparams_importer.outputs['result'])

Optimierung auf der Google Cloud Platform (GCP)

Bei der Ausführung auf der Google Cloud Platform (GCP) kann die Tuner-Komponente zwei Dienste nutzen:

AI Platform Vizier als Backend für die Optimierung von Hyperparametern

AI Platform Vizier ist ein verwalteter Dienst, der eine Black-Box-Optimierung basierend auf der Google Vizier- Technologie durchführt.

CloudTuner ist eine Implementierung von KerasTuner, die mit dem AI Platform Vizier-Dienst als Studien-Backend kommuniziert . Da CloudTuner eine Unterklasse von kerastuner.Tuner , kann es als Drop-In-Ersatz im Modul tuner_fn und als Teil der TFX-Tuner-Komponente ausgeführt werden.

Unten finden Sie ein Code-Snippet, das die Verwendung von CloudTuner . Beachten Sie, dass für die Konfiguration von CloudTuner Elemente erforderlich sind, die für GCP spezifisch sind, z. B. die project_id und die region .

...
from tensorflow_cloud import CloudTuner

...
def tuner_fn(fn_args: FnArgs) -> TunerFnResult:
  """An implementation of tuner_fn that instantiates CloudTuner."""

  ...
  tuner = CloudTuner(
      _build_model,
      hyperparameters=...,
      ...
      project_id=...,       # GCP Project ID
      region=...,           # GCP Region where Vizier service is run.
  )

  ...
  return TuneFnResult(
      tuner=tuner,
      fit_kwargs={...}
  )

Parallele Optimierung auf der Cloud AI Platform Training verteilte Arbeiterherde

Das KerasTuner-Framework als zugrunde liegende Implementierung der Tuner-Komponente kann die Hyperparametersuche parallel durchführen. Während die Standard-Tuner-Komponente nicht mehr als einen Sucharbeiter parallel ausführen kann , bietet sie mithilfe der Tuner-Komponente der Google Cloud AI Platform-Erweiterung die Möglichkeit, eine parallele Optimierung mithilfe eines AI Platform-Schulungsjobs als verteilte Worker-Herde durchzuführen Manager. TuneArgs ist die Konfiguration für diese Komponente. Dies ist ein Drop-In-Ersatz für die Standard-Tuner-Komponente.

tuner = google_cloud_ai_platform.Tuner(
    ...   # Same kwargs as the above stock Tuner component.
    tune_args=proto.TuneArgs(num_parallel_trials=3),  # 3-worker parallel
    custom_config={
        # Configures Cloud AI Platform-specific configs . For for details, see
        # https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#traininginput.
        TUNING_ARGS_KEY:
            {
                'project': ...,
                'region': ...,
                # Configuration of machines for each master/worker in the flock.
                'masterConfig': ...,
                'workerConfig': ...,
                ...
            }
    })
...

Das Verhalten und die Ausgabe der Erweiterungs-Tuner-Komponente sind mit der num_trials Tuner-Komponente identisch, außer dass mehrere Hyperparametersuchen parallel auf verschiedenen Arbeitsmaschinen ausgeführt werden und die num_trials daher schneller abgeschlossen werden. Dies ist besonders effektiv, wenn der Suchalgorithmus wie RandomSearch peinlich parallelisierbar ist. Wenn der Suchalgorithmus jedoch Informationen aus Ergebnissen früherer Versuche verwendet, wie dies der in AI Platform Vizier implementierte Google Vizier-Algorithmus tut, würde eine übermäßig parallele Suche die Wirksamkeit der Suche negativ beeinflussen.

E2E Beispiel

E2E CloudTuner im GCP-Beispiel

KerasTuner-Tutorial

CloudTuner-Tutorial

Vorschlag

Weitere Details finden Sie in der Tuner-API-Referenz .