튜너 TFX 파이프라인 구성요소

Tuner 구성요소는 모델의 하이퍼파라미터를 조정합니다.

튜너 구성요소 및 KerasTuner 라이브러리

Tuner 구성요소는 하이퍼파라미터 조정을 위해 Python KerasTuner API를 광범위하게 사용합니다.

요소

튜너는 다음을 수행합니다.

  • tf.훈련 및 평가에 사용되는 예제입니다.
  • 모델 정의, 하이퍼파라미터 검색 공간, 목표 등을 포함한 튜닝 로직을 정의하는 사용자 제공 모듈 파일(또는 모듈 fn)입니다.
  • train args 및 eval args의 Protobuf 정의입니다.
  • (선택 사항) 조정 인수의 Protobuf 정의입니다.
  • (선택 사항) 업스트림 변환 구성 요소에서 생성된 변환 그래프입니다.
  • (선택 사항) 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는 학습 백엔드로 AI Platform Vizier 서비스와 통신하는 KerasTuner 의 구현입니다. CloudTuner는 keras_tuner.Tuner 의 서브클래스이므로 tuner_fn 모듈에서 즉시 대체품으로 사용할 수 있고 TFX Tuner 구성요소의 일부로 실행할 수 있습니다.

다음은 CloudTuner 사용 방법을 보여주는 코드 조각입니다. CloudTuner 를 구성하려면 project_idregion 과 같은 GCP 관련 항목이 필요합니다.

...
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 Training 분산 작업자 무리에 대한 병렬 조정

Tuner 구성 요소의 기본 구현인 KerasTuner 프레임워크에는 하이퍼파라미터 검색을 병렬로 수행하는 기능이 있습니다. 기본 Tuner 구성요소에는 둘 이상의 검색 작업자를 병렬로 실행할 수 있는 기능이 없지만 Google Cloud AI Platform 확장 Tuner 구성요소를 사용하면 AI Platform Training 작업을 분산 작업자 무리로 사용하여 병렬 조정을 실행하는 기능을 제공합니다. 관리자. 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 구성 요소의 동작과 출력은 여러 하이퍼 매개 변수 검색이 여러 작업자 컴퓨터에서 병렬로 실행되고 결과적으로 num_trials 더 빨리 완료된다는 점을 제외하면 기본 Tuner 구성 요소와 동일합니다. 이는 RandomSearch 와 같이 검색 알고리즘이 당황스러울 정도로 병렬화 가능한 경우 특히 효과적입니다. 하지만 AI Platform Vizier에 구현된 Google Vizier 알고리즘처럼 검색 알고리즘이 이전 시도 결과의 정보를 사용하는 경우 과도한 병렬 검색은 검색 효율성에 부정적인 영향을 미칠 수 있습니다.

E2E 예시

GCP의 E2E CloudTuner 예

케라스튜너 튜토리얼

CloudTuner 튜토리얼

제안

자세한 내용은 Tuner API 참조 에서 확인할 수 있습니다.