Komponent rurociągu Tuner TFX

Komponent Tuner dostraja hiperparametry modelu.

Komponent tunera i biblioteka KerasTuner

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

Część

Tuner pobiera:

  • tf.Przykłady użyte do szkolenia i ewaluacji.
  • Dostarczony przez użytkownika plik modułu (lub moduł fn), który definiuje logikę dostrajania, w tym definicję modelu, przestrzeń wyszukiwania hiperparametrów, cel itp.
  • Definicja protobufa argumentów pociągowych i argumentów ewaluacyjnych.
  • (Opcjonalnie) Definicja argumentów dostrajających w protobufie .
  • (Opcjonalnie) wykres transformacji utworzony przez nadrzędny komponent Transform.
  • (Opcjonalnie) Schemat danych utworzony przez komponent potoku SchemaGen i opcjonalnie zmieniony przez programistę.

Mając podane dane, model i cel, Tuner dostraja hiperparametry i emituje najlepszy wynik.

Instrukcje

Dla Tunera wymagana jest funkcja modułu użytkownika tuner_fn z następującą sygnaturą:

...
from keras_tuner.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 zarówno przestrzeń poszukiwań modelu, jak i hiperparametrów, a także wybierasz cel i algorytm dostrajania. Komponent Tuner pobiera ten kod modułu jako dane wejściowe, dostraja hiperparametry i emituje najlepszy wynik.

Trainer może przyjąć hiperparametry wyjściowe Tunera jako dane wejściowe i wykorzystać je w 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`.
    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 szkolisz swój model. Po użyciu narzędzia Tuner do określenia dobrego zestawu hiperparametrów można usunąć narzędzie Tuner z potoku i użyć ImporterNode do zaimportowania artefaktu narzędzia Tuner z poprzedniego przebiegu szkoleniowego w celu przesłania go do narzędzia Trainer.

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

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

Dostrajanie na platformie Google Cloud (GCP)

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

AI Platform Vizier jako backend dostrajania hiperparametrów

AI Platform Vizier to usługa zarządzana, która wykonuje optymalizację czarnej skrzynki 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ą keras_tuner.Tuner , można go użyć jako zamiennika w module tuner_fn i wykonać jako część komponentu TFX Tuner.

Poniżej znajduje się fragment kodu pokazujący, jak korzystać CloudTuner . Zwróć uwagę, że konfiguracja CloudTuner wymaga elementów specyficznych 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 rozproszonego stada pracowników Cloud AI Platform Training

Framework KerasTuner jako podstawowa implementacja komponentu Tuner ma możliwość równoległego wyszukiwania hiperparametrów. Chociaż standardowy komponent Tuner nie umożliwia równoległego wykonywania więcej niż jednego procesu wyszukiwania, korzystając z komponentu rozszerzenia Google Cloud AI Platform Tuner , zapewnia on możliwość uruchamiania strojenia równoległego przy użyciu zadania szkoleniowego platformy AI jako rozproszonego stada pracowników menedżer. TuneArgs to konfiguracja nadana temu komponentowi. Jest to zamiennik standardowego tunera.

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': ...,
                ...
            }
    })
...

Zachowanie i dane wyjściowe komponentu rozszerzenia Tuner są takie same jak podstawowego komponentu Tuner, z tą różnicą, że wiele przeszukiwań hiperparametrów jest wykonywanych równolegle na różnych komputerach roboczych, w wyniku czego num_trials zostaną ukończone szybciej. Jest to szczególnie skuteczne, gdy algorytm wyszukiwania jest żenująco równoległy, jak na przykład RandomSearch . Jeśli jednak algorytm wyszukiwania wykorzysta informacje z wyników wcześniejszych prób, tak jak robi to algorytm Google Vizier zaimplementowany w AI Platform Vizier, nadmiernie równoległe wyszukiwanie negatywnie wpłynie na skuteczność wyszukiwania.

Przykład E2E

E2E CloudTuner na przykładzie GCP

Poradnik dotyczący KerasTunera

Poradnik dotyczący CloudTunera

Wniosek

Więcej szczegółów można znaleźć w dokumentacji API tunera .