RSVP para seu evento TensorFlow Everywhere hoje mesmo!
Esta página foi traduzida pela API Cloud Translation.
Switch to English

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

Tuner 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âmetro, objetivo etc.
  • Definição de protobuf de args de trem e args de eval.
  • (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 sintoniza 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 kerastuner.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 este código do módulo como entrada, ajusta os hiperparâmetros e emite o melhor resultado.

O Trainer pode pegar os hiperparâmetros de saída do Sintonizador como entrada e utilizá-los em seu código de módulo de 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`.
    custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
    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))
...

Você pode não querer 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 do pipeline e usar o ImporterNode para importar o artefato do Tuner de uma execução de treinamento anterior para alimentar o Trainer.

hparams_importer = ImporterNode(
    instance_name='import_hparams',
    # This can be Tuner's output file or manually edited file. The file contains
    # text format of hyperparameters (kerastuner.HyperParameters.get_config())
    source_uri='path/to/best_hyperparameters.txt',
    artifact_type=HyperParameters)

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 tirar proveito de 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 .

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

Abaixo está um trecho de código que mostra como usar o 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 pesquisas de hiperparâmetros em paralelo. Embora o componente Tuner de estoque não tenha a capacidade de executar mais de um trabalhador de pesquisa em paralelo, usando o componente Tuner de extensão do Google Cloud AI Platform , ele oferece a capacidade de executar o ajuste paralelo, usando um trabalho de treinamento do AI Platform como um bando de trabalhadores distribuído Gerente. TuneArgs é a configuração dada a este componente. Esta é uma substituição imediata do componente Tuner de estoque.

from tfx.extensions.google_cloud_ai_platform.tuner.component import Tuner
from tfx.extensions.google_cloud_ai_platform.trainer import executor as ai_platform_trainer_executor

...
tuner = Tuner(
    ...   # Same kwargs as the above stock Tuner component.
    tune_args=tuner_pb2.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.
        ai_platform_trainer_executor.TRAINING_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 é o mesmo do componente Tuner de estoque, 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 é constrangedoramente 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

E2E CloudTuner no Exemplo de GCP

Tutorial do KerasTuner

Tutorial CloudTuner

Proposta