O componente Tuner TFX Pipeline

O componente Tuner ajusta os hiperparâmetros para o modelo.

Componente Tuner e Biblioteca KerasTuner

O componente Tuner faz uso extensivo da API Python KerasTuner para ajustar hiperparâmetros.

Componente

Sintonizador leva:

  • tf.Examples usados ​​para treinamento e avaliação.
  • Um arquivo de módulo fornecido pelo usuário (ou módulo fn) que define a lógica de ajuste, incluindo definição de modelo, espaço de pesquisa de hiperparâmetros, objetivo, etc.
  • Definição de Protobuf de argumentos de trem e argumentos de avaliação.
  • (Opcional) Definição de Protobuf de argumentos de ajuste.
  • (Opcional) gráfico de transformação produzido por um componente Transform upstream.
  • (Opcional) Um esquema de dados criado por um componente de pipeline SchemaGen e opcionalmente alterado pelo desenvolvedor.

Com os dados, modelo e objetivo fornecidos, o Tuner ajusta os hiperparâmetros e emite o melhor resultado.

Instruções

Uma função de módulo de usuário tuner_fn com a seguinte assinatura é necessária para o Tuner:

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

Nesta função, você define os espaços de pesquisa do modelo e do hiperparâmetro e escolhe o objetivo e o algoritmo para ajuste. O componente Tuner toma este código de módulo como entrada, ajusta os hiperparâmetros e emite o melhor resultado.

O Trainer pode usar os hiperparâmetros de saída do Tuner como entrada e utilizá-los em seu código de módulo de usuário. A definição do pipeline se parece com isto:

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

Talvez você não queira ajustar os hiperparâmetros toda vez que treinar novamente seu modelo. Depois de usar o Tuner para determinar um bom conjunto de hiperparâmetros, você pode remover o Tuner de seu pipeline e usar ImporterNode para importar o artefato Tuner de uma execução de treinamento anterior para alimentar o 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'])

Tuning no Google Cloud Platform (GCP)

Ao executar no Google Cloud Platform (GCP), o componente Tuner pode aproveitar dois serviços:

AI Platform Vizier como back-end do ajuste de hiperparâmetros

AI Platform Vizier é um serviço gerenciado que realiza otimização de caixa preta, com base na tecnologia Google Vizier .

O CloudTuner é uma implementação do KerasTuner que se comunica com o serviço AI Platform Vizier como back-end do estudo. Como CloudTuner é uma subclasse de keras_tuner.Tuner , ele pode ser usado como substituto no módulo tuner_fn e executado como parte do componente TFX Tuner.

Abaixo está um trecho de código que mostra como usar CloudTuner . Observe que a configuração do CloudTuner requer itens específicos do GCP, como project_id e 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={...}
  )

Ajuste paralelo no grupo de trabalhadores distribuídos do Cloud AI Platform Training

A estrutura KerasTuner como a implementação subjacente do componente Tuner tem a capacidade de conduzir a pesquisa de hiperparâmetros em paralelo. Embora o componente Stock Tuner não tenha a capacidade de executar mais de um trabalho de pesquisa em paralelo, usando o componente Tuner de extensão do Google Cloud AI Platform , ele fornece a capacidade de executar o ajuste paralelo, usando um trabalho de treinamento da AI Platform como um grupo de trabalho distribuído gerente. TuneArgs é a configuração dada a este componente. Esta é uma substituição imediata do componente Tuner padrão.

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

O comportamento e a saída do componente Tuner de extensão são os mesmos do componente Tuner padrão, exceto que várias pesquisas de hiperparâmetros são executadas em paralelo em diferentes máquinas de trabalho e, como resultado, os num_trials serão concluídos mais rapidamente. Isso é particularmente eficaz quando o algoritmo de pesquisa é embaraçosamente paralelizável, como RandomSearch . No entanto, se o algoritmo de pesquisa usar informações de resultados de testes anteriores, como o algoritmo Google Vizier implementado no AI Platform Vizier, uma pesquisa excessivamente paralela afetaria negativamente a eficácia da pesquisa.

Exemplo E2E

Exemplo E2E CloudTuner no GCP

Tutorial do KerasTuner

Tutorial do CloudTuner

Proposta

Mais detalhes estão disponíveis na referência da API do Tuner .