O componente Tuner TFX Pipeline

O componente Tuner ajusta os hiperparâmetros do modelo.

Componente Tuner e Biblioteca KerasTuner

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

Componente

O sintonizador leva:

  • tf.Exemplos 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 protobuf de train args e eval args.
  • (Opcional) Definição 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 recebe o código deste módulo como entrada, ajusta os hiperparâmetros e emite o melhor resultado.

O Trainer pode pegar os hiperparâmetros de saída do Tuner como entrada e utilizá-los no código do módulo do usuário. A definição do pipeline é semelhante a esta:

...
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 sempre que treinar novamente seu modelo. Depois de usar o Tuner para determinar um bom conjunto de hiperparâmetros, você pode remover o Tuner do pipeline e usar ImporterNode para importar o artefato do 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'])

Ajuste no Google Cloud Platform (GCP)

Ao ser executado 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, baseado na tecnologia Google Vizier .

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 um substituto imediato 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 rebanho de trabalhadores distribuídos do Cloud AI Platform Training

A estrutura KerasTuner como implementação subjacente do componente Tuner tem a capacidade de conduzir pesquisas de hiperparâmetros em paralelo. Embora o componente Stock Tuner não tenha a capacidade de executar mais de um trabalhador de pesquisa em paralelo, ao usar 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 do AI Platform como um rebanho de trabalhadores distribuídos 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. Isto é particularmente eficaz quando o algoritmo de busca é embaraçosamente paralelizável, como RandomSearch . No entanto, se o algoritmo de pesquisa utilizar informações de resultados de ensaios anteriores, como faz o algoritmo Google Vizier implementado na AI Platform Vizier, uma pesquisa excessivamente paralela afetaria negativamente a eficácia da pesquisa.

Exemplo E2E

Exemplo E2E CloudTuner no GCP

Tutorial KerasTuner

Tutorial do CloudTuner

Proposta

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