Компонент конвейера Tuner TFX

Компонент Tuner настраивает гиперпараметры модели.

Компонент тюнера и библиотека KerasTuner

Компонент Tuner широко использует Python KerasTuner API для настройки гиперпараметров.

Компонент

Тюнер принимает:

  • tf.Examples, используемые для обучения и оценки.
  • Предоставляемый пользователем файл модуля (или модуль fn), который определяет логику настройки, включая определение модели, пространство поиска гиперпараметров, цель и т. д.
  • Protobuf определение аргументов поезда и аргументов eval.
  • (Необязательно) Protobuf определение параметров настройки.
  • (Необязательно) график преобразования, созданный вышестоящим компонентом Transform.
  • (Необязательно) Схема данных, созданная компонентом конвейера SchemaGen и необязательно измененная разработчиком.

С заданными данными, моделью и целью Tuner настраивает гиперпараметры и выдает наилучший результат.

инструкции

Для Tuner требуется функция пользовательского модуля tuner_fn со следующей сигнатурой:

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

В этой функции вы определяете пространство поиска модели и гиперпараметра, а также выбираете цель и алгоритм настройки. Компонент Tuner принимает этот код модуля в качестве входных данных, настраивает гиперпараметры и выдает наилучший результат.

Trainer может принимать выходные гиперпараметры Tuner в качестве входных данных и использовать их в коде своего пользовательского модуля. Определение конвейера выглядит следующим образом:

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

Возможно, вам не захочется настраивать гиперпараметры каждый раз при переобучении модели. После того, как вы использовали Tuner для определения хорошего набора гиперпараметров, вы можете удалить Tuner из конвейера и использовать ImporterNode для импорта артефакта Tuner из предыдущего тренировочного прогона для передачи в 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'])

Настройка на Google Cloud Platform (GCP)

При работе на Google Cloud Platform (GCP) компонент Tuner может использовать две службы:

AI Platform Vizier как основа для настройки гиперпараметров

AI Platform Vizier — это управляемая служба, которая выполняет оптимизацию черного ящика на основе технологии Google Vizier .

CloudTuner — это реализация KerasTuner , которая взаимодействует со службой AI Platform Vizier в качестве серверной части исследования. Поскольку CloudTuner является подклассом keras_tuner.Tuner , его можно использовать в качестве замены в модуле tuner_fn и выполнять как часть компонента TFX Tuner.

Ниже приведен фрагмент кода, показывающий, как использовать CloudTuner . Обратите внимание, что для настройки CloudTuner требуются элементы, характерные для GCP, такие как project_id и 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={...}
  )

Параллельная настройка облачной платформы ИИ Обучение распределенного рабочего стада

Платформа KerasTuner как базовая реализация компонента Tuner имеет возможность проводить поиск гиперпараметров параллельно. В то время как стандартный компонент Tuner не может выполнять более одного поискового работника параллельно, с помощью компонента Tuner расширения Google Cloud AI Platform он обеспечивает возможность запуска параллельной настройки, используя задание обучения платформы AI в качестве распределенного рабочего потока. управляющий делами. TuneArgs — это конфигурация, заданная этому компоненту. Это замена стандартного компонента Tuner.

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

Поведение и выходные данные расширенного компонента Tuner такие же, как у стандартного компонента Tuner, за исключением того, что поиск нескольких гиперпараметров выполняется параллельно на разных рабочих машинах, и в результате num_trials будет завершено быстрее. Это особенно эффективно, когда алгоритм поиска смущающе параллелизуем, например, RandomSearch . Однако, если алгоритм поиска использует информацию из результатов предыдущих испытаний, как это делает алгоритм Google Vizier, реализованный в AI Platform Vizier, чрезмерно параллельный поиск отрицательно скажется на эффективности поиска.

Пример E2E

E2E CloudTuner на примере GCP

Учебное пособие по KerasTuner

Учебное пособие по CloudTuner

Предложение

Более подробная информация доступна в справочнике Tuner API .