Odpowiedz już dziś na lokalne wydarzenie TensorFlow Everywhere!
Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Komponent tunera TFX Pipeline

Komponent Tuner dostraja hiperparametry dla modelu.

Komponent tunera i biblioteka KerasTuner

Komponent Tuner w szerokim zakresie wykorzystuje interfejs API Python KerasTuner do dostrajania hiperparametrów.

Składnik

Tuner zajmuje:

  • tf Przykłady użyte do szkolenia i ewaluacji.
  • Plik modułu dostarczony przez użytkownika (lub moduł fn), który definiuje logikę strojenia, w tym definicję modelu, przestrzeń wyszukiwania hiperparametrów, cel itp.
  • Definicja Protobuf argumentów pociągu i argumentów eval.
  • (Opcjonalnie) Definicja Protobuf parametrów strojenia.
  • (Opcjonalnie) wykres transformacji utworzony przez wcześniejszy składnik Transform.
  • (Opcjonalnie) Schemat danych utworzony przez składnik potoku SchemaGen i opcjonalnie zmieniony przez dewelopera.

Z podanymi danymi, modelem i celem, Tuner dostraja hiperparametry i emituje najlepszy wynik.

Instrukcje

tuner_fn funkcji modułu użytkownika z następującą sygnaturą:

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

W tej funkcji definiujesz przestrzeń wyszukiwania modelu i hiperparametru oraz wybierasz cel i algorytm strojenia. Komponent Tuner przyjmuje ten kod modułu jako dane wejściowe, dostraja hiperparametry i emituje najlepszy wynik.

Trener może przyjąć hiperparametry wyjściowe tunera jako dane wejściowe i wykorzystać je w swoim kodzie modułu użytkownika. Definicja potoku wygląda następująco:

...
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`.
    custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
    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))
...

Możesz nie chcieć dostrajać hiperparametrów za każdym razem, gdy ponownie trenujesz model. Gdy już użyjesz Tunera do określenia dobrego zestawu hiperparametrów, możesz usunąć Tuner z potoku i użyć ImporterNode aby zaimportować artefakt Tunera z poprzedniego przebiegu treningowego w celu przesłania go do Trainer.

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

Tuning on Google Cloud Platform (GCP)

Działając w Google Cloud Platform (GCP), komponent Tuner może korzystać z dwóch usług:

AI Platform Vizier jako zaplecze strojenia hiperparametrów

AI Platform Vizier to zarządzana usługa, która przeprowadza optymalizację czarnych skrzynek w oparciu o technologię Google Vizier .

CloudTuner to implementacja KerasTuner, która komunikuje się z usługą AI Platform Vizier jako zapleczem badawczym. Ponieważ CloudTuner jest podklasą kerastuner.Tuner , może być używany jako zamiennik typu drop-in w module tuner_fn i wykonywany jako część komponentu TFX Tuner.

Poniżej znajduje się fragment kodu, który pokazuje, jak używać CloudTuner . Zauważ, że konfiguracja CloudTuner wymaga elementy, które są specyficzne dla GCP, takich jak project_id i 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={...}
  )

Równoległe strojenie w Cloud AI Platform Szkolenie rozproszonych pracowników

Framework KerasTuner jako podstawowa implementacja komponentu Tuner ma możliwość równoległego wyszukiwania hiperparametrów. Podczas gdy podstawowy komponent Tuner nie ma możliwości równoległego wykonywania więcej niż jednego pracownika wyszukiwania, za pomocą komponentu Tuner rozszerzenia Google Cloud AI Platform zapewnia możliwość równoległego dostrajania, używając zadania szkoleniowego AI Platform jako rozproszonego stada pracowników menedżer. TuneArgs to konfiguracja nadana temu komponentowi. Jest to wymiana zapasowego komponentu tunera.

from tfx.extensions.google_cloud_ai_platform.tuner.component import Tuner
from tfx.extensions.google_cloud_ai_platform.trainer import executor as ai_platform_trainer_executor

...
tuner = Tuner(
    ...   # Same kwargs as the above stock Tuner component.
    tune_args=tuner_pb2.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.
        ai_platform_trainer_executor.TRAINING_ARGS_KEY:
            {
                'project': ...,
                'region': ...,
                # Configuration of machines for each master/worker in the flock.
                'masterConfig': ...,
                'workerConfig': ...,
                ...
            }
    })
...

Zachowanie i dane wyjściowe komponentu Tuner rozszerzenia są takie same, jak komponentu podstawowego Tuner, z tą różnicą, że wiele wyszukiwań hiperparametrów jest wykonywanych równolegle na różnych maszynach roboczych, w wyniku czego num_trials zostanie zakończona szybciej. Jest to szczególnie skuteczne, gdy algorytm wyszukiwania jest zawstydzająco równoległy, na przykład RandomSearch . Jeśli jednak algorytm wyszukiwania wykorzystuje informacje z wyników wcześniejszych prób, na przykład algorytm Google Vizier zaimplementowany w AI Platform Vizier, nadmiernie równoległe wyszukiwanie wpłynęłoby negatywnie na skuteczność wyszukiwania.

Przykład E2E

E2E CloudTuner na przykładzie GCP

Samouczek KerasTuner

Samouczek CloudTuner

Wniosek