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

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

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

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

Компонент

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

  • tf.Примеры, используемые для обучения и оценки.
  • Предоставленный пользователем файл модуля (или модуль fn), который определяет логику настройки, включая определение модели, пространство поиска гиперпараметров, цель и т. д.
  • Protobuf определение аргументов поезда и аргументов оценки.
  • (Необязательно) Определение 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={...}
  )

Параллельная настройка Cloud AI Platform Обучение распределенной рабочей группы

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

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 .