초매개변수 조정 사용

이 페이지에서는 모델을 학습시킬 때 AI Platform Training 초매개변수 조정을 사용하는 방법을 보여줍니다. 초매개변수 조정은 지정하는 대상 변수를 최적화합니다. 대상 변수는 초매개변수 측정항목이라고 합니다. 초매개변수 조정으로 작업을 시작할 때 초매개변수 측정항목의 이름을 설정합니다. 이 이름은 트레이너에 추가하는 스칼라 요약에 할당한 이름입니다.

초매개변수 조정과 관련된 단계

학습 작업에서 초매개변수 조정을 사용하려면 다음 단계를 수행해야 합니다.

  1. TrainingInput 객체에 HyperparameterSpec을 포함하여 학습 작업의 초매개변수 조정 구성을 지정합니다.

  2. 학습 애플리케이션에 다음 코드를 포함합니다.

    • 조정할 초매개변수를 나타내는 명령줄 인수를 파싱하고, 값을 사용하여 학습 시도에 적합한 초매개변수를 설정합니다.
    • 그래프 요약에 초매개변수 측정항목을 추가합니다.

각 단계에 대한 자세한 내용은 아래에 나와 있습니다.

학습 작업의 초매개변수 조정 구성 지정

학습 작업의 초매개변수 조정 구성을 포함하는 HyperparameterSpec 객체를 만들고 HyperparameterSpecTrainingInput 객체의 hyperparameters 객체로 추가합니다.

초매개변수 조정 작업은 시도 작업을 만듭니다. 학습 시도 작업 프로세스를 가속화하려면 TrainingInput 객체에 커스텀 머신 유형을 지정하면 됩니다. 예를 들어 n1-standard-8 VM을 사용하여 각 시도 작업에 시도 작업을 만들려면 masterTypen1-standard-8로 지정하고 작업자 구성을 비워 두면 됩니다.

HyperparameterSpec에서 hyperparameterMetricTag를 선택한 측정항목을 나타내는 값으로 설정합니다. hyperparameterMetricTag 태그를 지정하지 않으면 AI Platform Training이 training/hptuning/metric 이름의 측정항목을 찾습니다. 다음 예시에서는 metric1이라는 이름의 측정항목의 구성을 만드는 방법을 보여줍니다.

gcloud

구성 YAML 파일에 초매개변수 구성 정보를 추가합니다. 아래에 예시가 나와 있습니다. 작업 구성 파일을 보려면 인구통계 에스티메이터 샘플에서 hptuning_config.yaml을 참조하세요.

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    goal: MAXIMIZE
    hyperparameterMetricTag: metric1
    maxTrials: 30
    maxParallelTrials: 1
    enableTrialEarlyStopping: True
    params:
    - parameterName: hidden1
      type: INTEGER
      minValue: 40
      maxValue: 400
      scaleType: UNIT_LINEAR_SCALE
    - parameterName: numRnnCells
      type: DISCRETE
      discreteValues:
      - 1
      - 2
      - 3
      - 4
    - parameterName: rnnCellType
      type: CATEGORICAL
      categoricalValues:
      - BasicLSTMCell
      - BasicRNNCell
      - GRUCell
      - LSTMCell
      - LayerNormBasicLSTMCell

Python

HyperparameterSpec을 나타내는 사전을 만들고 학습 입력에 추가합니다. 다음 예시에서는 학습 작업 구성 가이드에 따라 TrainingInput 사전(이 경우 training_inputs)을 이미 만들었다고 가정합니다.

# Add hyperparameter tuning to the job config.
hyperparams = {
    'goal': 'MAXIMIZE',
    'hyperparameterMetricTag': 'metric1',
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'enableTrialEarlyStopping': True,
    'params': []}

hyperparams['params'].append({
    'parameterName':'hidden1',
    'type':'INTEGER',
    'minValue': 40,
    'maxValue': 400,
    'scaleType': 'UNIT_LINEAR_SCALE'})

hyperparams['params'].append({
    'parameterName':'numRnnCells',
    'type':'DISCRETE',
    'discreteValues': [1, 2, 3, 4]})

hyperparams['params'].append({
    'parameterName':'rnnCellType',
    'type': 'CATEGORICAL',
    'categoricalValues': [
        'BasicLSTMCell',
        'BasicRNNCell',
        'GRUCell',
        'LSTMCell',
        'LayerNormBasicLSTMCell'
    ]
})

# Add hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

학습 애플리케이션의 코드 확인

애플리케이션에서 초매개변수의 명령줄 인수를 처리하고 초매개변수 측정항목을 AI Platform Training에 보고합니다.

조정할 초매개변수에 대한 명령줄 인수 처리

AI Platform Training은 학습 애플리케이션을 호출할 때 명령줄 인수를 설정합니다. 다음의 단계에 따라 코드의 명령줄 인수를 활용하세요.

  1. 각 초매개변수 인수의 이름을 정의하고 무엇이든 원하는 인수 파서(일반적으로 argparse)를 사용해서 이를 파싱합니다. 인수 이름은 위에서 설명한 대로 작업 구성에 지정한 매개변수 이름과 일치해야 합니다.

  2. 명령줄 인수의 값을 학습 코드의 초매개변수에 할당합니다.

AI Platform Training에 초매개변수 측정항목 보고

AI Platform Training 서비스에 초매개변수 측정항목을 보고하는 방법은 학습에 TensorFlow를 사용하는지 여부에 따라 다릅니다. 또한 학습에 런타임 버전을 사용하는지 커스텀 컨테이너를 사용하는지에 따라서도 다릅니다.

조기 중단을 활용하려면 학습 코드에서 초매개변수 측정항목을 AI Platform Training에 자주 보고하는 것이 좋습니다.

런타임 버전을 사용한 TensorFlow

AI Platform Training 런타임 버전을 사용하고 TensorFlow로 학습하면 TensorFlow 요약에 측정항목을 작성하여 AI Platform 교육에 초매개변수 측정항목을 보고할 수 있습니다. 다음 함수 중 하나를 사용합니다.

다음 에스티메이터 예시에서와 같이 위의 함수 중 하나를 호출하는 다른 TensorFlow API를 사용하면 초매개변수 측정항목이 AI Platform Training에 보고됩니다.

다음 예시에서는 초매개변수 측정항목을 요약에 작성하는 두 가지 방법의 기본적인 내용을 보여줍니다. 두 예시 모두 회귀 모델 학습 중이라고 가정한 상태이며, 정답 라벨과 평가 예측 사이의 평균 제곱근 오차를 metric1이라는 초매개변수 측정항목으로 작성합니다.

Keras

다음 예시에서는 커스텀 Keras 콜백을 사용하여 각 학습 에포크 종료 시 스칼라 요약을 작성합니다.

class MyMetricCallback(tf.keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        tf.summary.scalar('metric1', logs['RootMeanSquaredError'], epoch)

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()

model = tf.keras.Sequential(
    tf.keras.layers.Dense(1, activation='linear', input_dim=784))
model.compile(
    optimizer='rmsprop',
    loss='mean_squared_error',
    metrics=['RootMeanSquaredError'])

model.fit(
    x_train,
    y_train,
    batch_size=64,
    epochs=10,
    steps_per_epoch=5,
    verbose=0,
    callbacks=[MyMetricCallback()])

에스티메이터

다음 예시에서는 tf.estimator.add_metrics를 사용해 그래프 요약에 초매개변수 측정항목을 추가합니다.

에스티메이터는 evaluate 메서드를 실행할 때마다 그래프 요약을 작성합니다. 이 예시에서는 tf.estimator.EvalSpectf.estimator.train_and_evaluate와 함께 사용하여 학습 중 300초마다 요약을 평가 및 작성하도록 에스티메이터를 구성합니다.

# Create metric for hyperparameter tuning
def my_metric(labels, predictions):
    # Note that different types of estimator provide different different
    # keys on the predictions Tensor. predictions['predictions'] is for
    # regression output.
    pred_values = predictions['predictions']
    return {'metric1': tf.compat.v1.metrics.root_mean_squared_error(labels, pred_values)}

# Create estimator to train and evaluate
def train_and_evaluate(output_dir):

    estimator = tf.estimator.DNNLinearCombinedRegressor(...)

    estimator = tf.estimator.add_metrics(estimator, my_metric)

    train_spec = ...
    eval_spec = tf.estimator.EvalSpec(
        start_delay_secs = 60, # start evaluating after 60 seconds
        throttle_secs = 300,  # evaluate every 300 seconds
        ...)
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

기타 머신러닝 프레임워크 또는 커스텀 컨테이너

학습에 커스텀 컨테이너를 사용하거나 TensorFlow 이외의 프레임워크로 초매개변수 조정을 수행하려는 경우, cloudml-hypertune Python 패키지를 사용하여 AI Platform Training에 대한 초매개변수 측정항목을 보고해야 합니다.

cloudml-hypertune 사용 예시를 확인하세요.

실행 중인 초매개변수 조정 작업의 세부정보 가져오기

실행 중인 학습 작업의 자세한 상태를 확인하여 초매개변수 조정을 모니터링할 수 있습니다.

응답의 작업 리소스에 있는 TrainingOutput 객체에는 초매개변수 조정이 적용된 학습 작업 중에 설정된 다음 값이 포함됩니다.

  • True로 설정된 isHyperparameterTuningJob

  • trials가 있고 HyperparameterOutput 객체 목록이 시도당 하나씩 포함됩니다.

TF_CONFIG 환경 변수에서 시도 ID를 검색할 수도 있습니다. TF_CONFIG에서 세부정보를 확인하려면 가이드를 참조하세요.

초매개변수 조정 결과 확인

학습 실행이 완료되면 Google Cloud 콘솔에서 각 시도 결과를 볼 수 있습니다. 또는 projects.jobs.get을 호출하여 결과를 가져올 수 있습니다. 작업 리소스의 TrainingOutput 객체에는 가장 잘 조정된 실행의 측정항목이 식별된 상태로 모든 실행에 대한 측정항목이 포함됩니다.

처리 중 작업을 모니터링하는 데 사용하는 것과 동일한 자세한 상태 요청을 사용하여 이 정보를 가져옵니다.

작업 설명에서 각 시도의 결과를 확인할 수 있습니다. Google Cloud 콘솔에서 rmse, learning_rate, training steps로 시도를 필터링할 수 있습니다. 초매개변수 측정항목에 가장 적합한 값을 산출한 시도를 찾습니다. 이 시도가 모델의 성공 기준을 충족하면 이후에 모델을 실행할 때 해당 시도에 표시된 초매개변수 값을 사용할 수 있습니다.

경우에 따라 여러 번 시도해도 조정 측정항목에 대해 동일한 결과가 나타날 수 있습니다. 그런 경우 다른 방법으로 측정하여 가장 유용한 초매개변수 값을 결정해야 합니다. 예를 들어 히든 레이어의 노드 수를 조정하는 경우 값을 8로 설정하면 20으로 설정할 때와 동일한 결과를 얻습니다. 즉, 노드가 많아지면 모델의 개선없이 더 많이 처리해야 하고 이로 인해 더 많은 비용이 들기 때문에 8을 사용해야 합니다.

HyperparameterOutputFAILED 시도 상태는 해당 시도에 대한 학습이 실패했거나 해당 시도에서 초매개변수 조정 측정항목을 보고하지 못했음을 의미합니다. 후자의 경우에는 시도가 실패하더라도 상위 작업은 성공할 수 있습니다. 시도 로그를 보고 시도에 대한 학습이 실패했는지 여부를 확인할 수 있습니다.

시도 횟수 제한 설정

서비스가 실행되고 HyperparameterSpec 객체의 maxTrials 값을 설정하도록 허용할 시도 횟수를 결정해야 합니다.

허용할 시도 횟수를 결정할 때 고려해야 할 상충되는 두 가지의 관심 항목이 있습니다.

  • 시간(결과적으로 비용)
  • 정확성

시도 수를 늘리면 일반적으로 결과가 향상되지만, 항상 그렇지는 않습니다. 대부분의 경우 시도를 아무리 추가해도 정확도에 거의 영향을 주지 않는 반환점이 존재합니다. 많은 시도 횟수로 작업을 시작하기 전에 선택한 초매개변수가 모델의 정확성에 미치는 영향을 판별하기 위해 시도 횟수를 적게 설정하여 시작하는 것이 좋습니다.

초매개변수 조정을 최대한 활용하려면 최댓값을 사용하는 초매개변수 수의 10배 미만으로 설정해서는 안됩니다.

실패한 시도 처리

초매개변수 조정 시도가 오류와 함께 종료된다면 학습 작업을 조기에 끝내야 할 수 있습니다. HyperparameterSpecmaxFailedTrials 필드를 허용할 실패 시도 횟수로 설정합니다. 시도가 이 횟수만큼 실패하면 AI Platform Training이 학습 작업을 종료합니다. maxFailedTrials 값은 maxTrials보다 작거나 같아야 합니다.

maxFailedTrials를 설정하지 않거나 이를 0으로 설정할 경우 AI Platform Training이 다음 규칙을 사용하여 실패 시도를 처리합니다.

  • 작업의 첫 시도가 실패하면 AI Platform Training에서 작업을 즉시 종료합니다. 첫 시도가 실패했다면 학습 코드에 문제가 있는 것이므로 후속 시도도 실패할 가능성이 높습니다. 작업을 종료하면 더 많은 시도로 인해 추가 비용이 발생하기 전에 문제를 진단할 수 있습니다.
  • 첫 번째 시도가 성공하면 AI Platform Training가 다음 기준 중 하나를 기준으로 후속 시도 중에 실패 후 작업을 종료할 수 있습니다.
    • 시도 실패 횟수가 너무 많은 경우
    • 시도 성공에 비해 시도 실패가 너무 많은 경우

이러한 내부 임계값은 변경될 수 있습니다. 특정한 동작을 적용하려면 maxFailedTrials 필드를 설정하세요.

병렬 시도 실행

HyperparameterSpec 객체에서 maxParallelTrials를 설정하여 병렬로 실행할 시도 횟수를 지정할 수 있습니다.

병렬 시도를 실행하면 학습 작업에 걸리는 시간을 단축할 수 있습니다(실시간 - 필요한 총 처리 시간은 일반적으로 변경되지 않음). 하지만 병렬로 실행하면 조정 작업의 전체 효율성이 떨어질 수 있습니다. 이는 초매개변수 조정이 이전 시도에서 나온 결과를 사용하여 이후 시도의 초매개변수에 할당할 값을 알려주기 때문입니다. 병렬로 실행하는 경우 일부 시도는 여전히 실행 중인 시도의 결과를 활용하는 혜택 없이 시작됩니다.

병렬 시도를 사용하는 경우 학습 서비스는 여러 개의 학습 처리 클러스터(또는 단일 프로세스 트레이너의 경우 여러 개별 머신)를 프로비저닝합니다. 작업에 설정한 확장 등급은 각 개별 학습 클러스터에 사용됩니다.

시도 조기 중지

AI Platform Training이 명확히 성능이 떨어지는 시도를 자동으로 중지하도록 지정할 수 있습니다. 이렇게 하면 유용성이 떨어지는 시도를 계속 진행해서 발생하는 비용을 줄일 수 있습니다.

시도 조기 중지를 허용하려면 HyperparameterSpecenableTrialEarlyStopping 값을 TRUE로 설정합니다.

완료된 초매개변수 조정 작업 다시 시작

완료된 초매개변수 조정 작업은 부분적으로 최적화된 상태에서 시작하여 계속 진행할 수 있습니다. 이렇게 하면 이전 초매개변수 조정 작업에서 얻은 지식을 재사용할 수 있습니다.

초매개변수 조정 작업을 다시 시작하려면 다음 구성을 사용하여 새로운 초매개변수 조정 작업을 제출하세요.

  • HyperparameterSpecresumePreviousJobId 값을 이전 시도의 작업 ID로 설정합니다.
  • maxTrialsmaxParallelTrials의 값을 지정합니다.

AI Platform Training은 이전 작업 ID를 사용하여 동일한 goal, params, hyperparameterMetricTag 값을 찾아 초매개변수 조정 작업을 계속 진행하는 데 다시 사용합니다.

작업에 다른 매개변수가 있는 경우에도 유사한 작업에 일관된 hyperparameterMetricTag 이름과 params를 사용합니다. 이렇게 하면 시간 경과에 따라 AI Platform Training이 최적화를 개선할 수 있습니다.

다음 예시에서는 resumePreviousJobId 구성을 사용하는 방법을 보여줍니다.

gcloud

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    enableTrialEarlyStopping: TRUE
    maxTrials: 30
    maxParallelTrials: 1
    resumePreviousJobId: [PREVIOUS_JOB_IDENTIFIER]

Python

# Add hyperparameter tuning to the job config.
hyperparams = {
    'enableTrialEarlyStopping': True,
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'resumePreviousJobId': [PREVIOUS_JOB_IDENTIFIER]}

# Add the hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Cloud TPU로 초매개변수 조정

AI Platform Training의 Cloud TPU로 초매개변수 조정 작업을 실행하는 경우 TPUEstimatorSpeceval_metrics 속성을 사용하는 방법이 권장됩니다.

Cloud TPU로 초매개변수를 조정하는 실제 사용 예시는 ResNet-50 TPU 초매개변수 조정 샘플을 참조하세요.

초매개변수 조정 서비스를 사용하기 위해 eval_metrics 속성을 사용하는 대신 host_call에서 tf.summary를 호출할 수 있습니다. 자세한 내용은 TPUEstimatorSpec을 참조하세요.

다음 단계