Komponent potokowy Tuner TFX

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Składnik Tuner dostraja hiperparametry modelu.

Komponent tunera i biblioteka KerasTuner

Składnik Tuner w dużym stopniu wykorzystuje interfejs API KerasTuner w języku Python do dostrajania hiperparametrów.

Składnik

Tuner zajmuje:

  • tf.Przykłady wykorzystywane do szkolenia i oceny.
  • Dostarczony przez użytkownika plik modułu (lub moduł fn), który definiuje logikę strojenia, w tym definicję modelu, przestrzeń wyszukiwania hiperparametrów, cel itp.
  • Protobufowa definicja argumentów pociągu i argumentów eval.
  • (Opcjonalnie) Definicja argumentów strojenia Protobuf .
  • (Opcjonalnie) wykres transformacji utworzony przez składnik Transformacji poprzedzający.
  • (Opcjonalnie) Schemat danych utworzony przez składnik potoku SchemaGen i opcjonalnie zmieniony przez programistę.

Przy podanych danych, modelu i celu Tuner dostraja hiperparametry i emituje najlepszy wynik.

Instrukcje

Dla Tunera wymagana jest funkcja modułu użytkownika tuner_fn o następującej sygnaturze:

...
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 oraz wybierasz cel i algorytm dostrajania. Komponent Tuner pobiera ten kod modułu jako dane wejściowe, dostraja hiperparametry i emituje najlepszy wynik.

Trener może wziąć hiperparametry wyjściowe Tunera jako dane wejściowe i wykorzystać je w kodzie modułu użytkownika. Definicja potoku wygląda tak:

...
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 trenujesz swój model. Po użyciu programu Tuner do określenia dobrego zestawu hiperparametrów można usunąć program Tuner z potoku i użyć ImporterNode , aby zaimportować artefakt programu Tuner z poprzedniego przebiegu szkolenia i przekazać go do programu 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 Google Cloud Platform (GCP)

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

AI Platform Vizier jako zaplecze dostrajania hiperparametrów

AI Platform Vizier to zarządzana usługa, która przeprowadza 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że być używany jako zamiennik drop-in w module tuner_fn i wykonywany jako część komponentu TFX Tuner.

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

Struktura KerasTuner jako podstawowa implementacja komponentu Tuner ma możliwość równoległego przeprowadzania wyszukiwania hiperparametrów. Podczas gdy podstawowy komponent Tuner nie ma możliwości wykonywania więcej niż jednego pracownika wyszukiwania równolegle, przy użyciu komponentu Tuner rozszerzenia Google Cloud AI Platform zapewnia możliwość równoległego dostrajania przy użyciu zadania szkoleniowego AI Platform jako rozproszonego stada pracowników menedżer. TuneArgs to konfiguracja nadana temu komponentowi. Jest to drop-in zamiennik fabrycznego komponentu 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 składnika rozszerzenia Tuner są takie same, jak podstawowego składnika Tuner, z wyjątkiem tego, że wiele wyszukiwań hiperparametrów jest wykonywanych równolegle na różnych komputerach roboczych, w wyniku czego num_trials zostanie ukończone szybciej. Jest to szczególnie skuteczne, gdy algorytm wyszukiwania jest kłopotliwie zrównoleglony, taki jak RandomSearch . Jeśli jednak algorytm wyszukiwania wykorzystuje informacje z wyników wcześniejszych prób, tak jak robi to algorytm Google Vizier zaimplementowany w AI Platform Vizier, zbyt 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

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