Amazon Web Services 한국 블로그

Amazon SageMaker 자동 모델 최적화를 위한 웜 스타트 구성하기

올해 초 개발자와 데이터 과학자가 기계 학습 모델을 학습시키고 최적화하는 데 소요되는 시간과 노력을 크게 줄일 수 있는 Amazon SageMaker 자동 모델 튜닝을 발표했습니다.

오늘은  자동 하이퍼파라미터 최적화(Hyper Parameter  Optimization, HPO) 작업의 웜 스타트 구성을 하는 방법을 살펴보겠습니다.  웜 스타트 구성은 HPO 프로세스를 가속화하고 모델 최적화 비용을 절감해줍니다. 예를 들어 적은 예산으로 HPO 작업을 시작하고 결과를 분석한 후 예산을 더 많이 투입해 모델 최적화를 계속하기로 결정할 수 있습니다.

또한 다른 하이퍼파라미터 구성을 사용할 수도 있습니다(예: 최적화할 하이퍼파라미터를 추가하거나 일부 파라미터에 대해 다른 검색 범위 적용). 다른 예로는 데이터 과학자나 개발자가 이전 모델 튜닝 이후에 새로운 데이터를 수집한 후 모델을 다시 튜닝하려는 경우를 들 수 있습니다. 두 경우 모두 이전 튜닝 작업에서 얻은 선행 지식을 사용하여 하이퍼파라미터 튜닝 작업을 시작하면 최상의 모델을 빠르게 만들어내는 데 도움이 되고 결과적으로 고객의 비용이 절감됩니다. 하지만 이전에는 모든 최적화 작업을 처음부터 새로 시작해야 했습니다. 비슷한 최적화 구성으로 이미 최적화한 동일한 모델이라도 정보가 재사용되지 않았습니다.

하이퍼파라미터 최적화 작업의 웜 스타트 구성은 이 같은 요구 사항을 해결합니다. 이제 웜 스타트 구성을 활용해 모델을 반복적으로 튜닝하는 방법을 보여 드리겠습니다.

이 글에서 보여드리는 예제에서는 이미지 분류기를 만든 후 웜 스타트 구성을 활용해 여러 차례 하이퍼파라미터 튜닝 작업을 실행하는 방법을 통해 이미지 분류기를 반복적으로 튜닝해 보겠습니다. Amazon SageMaker 내장 이미지 분류 알고리즘을 사용하여 모델을 Caltech-256 데이터 세트에 대해 학습시킵니다. 전체 샘플 노트북은 여기에서 확인할 수 있습니다.

1. 하이퍼파라미터 튜닝 작업 설정 및 시작

노트북 인스턴스를 작성하고 데이터 세트를 준비해 Amazon S3로 푸시하는 단계는 건너뛰고 바로 하이퍼파라미터 튜닝 작업을 시작해 보겠습니다. 샘플 노트북에 모든 세부 정보가 들어 있으므로 여기서는 프로세스를 자세하게 설명하지 않습니다.

이 첫 번째 튜닝 작업을 실행하여 검색 공간에 대해 알아보고 이미지 분류 모델에서 튜닝 가능한 하이퍼파라미터를 튜닝할 때 미치는 영향을 평가해 보겠습니다. 이 작업은 이 모델을 튜닝하는 것이 효과가 있는지, 그리고 후속 튜닝 작업을 만들어 튜닝을 계속해야 할지를 평가합니다.

튜닝 작업을 만들려면 먼저 기본 제공 이미지 분류 알고리즘을 위한 학습 추정기를 만들고, 이 알고리즘의 모든 하이퍼파라미터 중 튜닝할 하이퍼파라미터를 제외한 하이퍼파라미터에 대한 값을 지정해야 합니다. 기본 제공 이미지 분류 알고리즘의 하이퍼파라미터에 대한 자세한 내용은 설명서에서 참조할 수 있습니다.

s3_output_location = 's3://{}/{}/output'.format(bucket, prefix)
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket, prefix), content_type='application/x-recordio')
s3_input_validation = sagemaker.s3_input(s3_data='s3://{}/{}/validation/'.format(bucket, prefix), content_type='application/x-recordio')
sess = sagemaker.Session()

imageclassification = sagemaker.estimator.Estimator(training_image,
                                    role, 
                                    train_instance_count=1, 
                                    train_instance_type='ml.p3.8xlarge',
                                    output_path=s3_output_location,
                                    sagemaker_session=sess)

imageclassification.set_hyperparameters(num_layers=18,
                                        image_shape='3,224,224',
                                        num_classes=257,
                                        num_training_samples=15420,
                                        mini_batch_size=128,
                                        epochs=50,
                                        optimizer='sgd',
                                        top_k='2',
                                        precision_dtype='float32',
                                        augmentation_type='crop')

추정기(estimator)를 만들었으니 이제 추정기를 사용하여 하이퍼파라미터 튜닝 작업을 만들고 튜닝할 하이퍼파라미터의 검색 범위와 실행할 총 학습 작업 수를 지정할 수 있습니다.

모델 품질에 가장 크게 영향을 미칠 만한 하이퍼파라미터, 즉 목표 지표를 3개 선택했습니다. 해당 값으로 최상의 모델이 만들어질지 아직 모르므로, 이미지 분류 설명서에서 설명하는 바와 같이 momentum과 weight_decay에 대해 전체 검색 범위를 선택하고 learning_rate에 대해 더 작은 검색 범위(0.0001, 0.05)를 선택합니다.

  • learning_rate: 학습 알고리즘이 모델 최적화를 시도하는 속도를 제어합니다. 학습 속도를 낮추면 정확성을 높일 수 있지만 모델을 학습시키는 데 시간이 더 많이 걸립니다. 학습 속도를 높이면 모델 정확도가 향상되지 않을 수 있습니다. 따라서 이 속성의 적절한 균형을 찾아야 합니다.
  • momentum: 이전 업데이트의 방향에서 도출된 정보를 사용하여 현재 업데이트에 필요한 정보를 제공합니다. 기본값인 0은 가중치 업데이트에 현재 배치의 정보만 사용됨을 의미합니다.
  • weight_decay: 가중치가 너무 커질 경우 벌점을 적용합니다. 기본값인 0은 벌점이 없음을 의미합니다.

이 예에서는 Amazon SageMaker 기본 제공 알고리즘 중 하나를 사용하므로 목표 지표의 정규식을 지정할 필요가 없습니다.

from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter, HyperparameterTuner

hyperparameter_ranges = {'learning_rate': ContinuousParameter(0.0001, 0.05),
                         'momentum': ContinuousParameter(0.0, 0.99),
                         'weight_decay': ContinuousParameter(0.0, 0.99)}

objective_metric_name = 'validation:accuracy'

tuner = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=10,
                            max_parallel_jobs=2) 

하이퍼파라미터 튜닝 작업이 끝나면 Amazon SageMaker Python SDK의 HyperparameterTuningJobAnalytics API 작업을 사용하여 지표 테이블을 가져올 수 있습니다.

tuner_parent = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name)
tuner_parent.dataframe().sort_values(['FinalObjectiveValue'], ascending=False)

이 테이블은 실행된 학습 작업의 하위 집합을 보여 줍니다. 노트북을 실행하면 결과를 모두 볼 수 있습니다. 튜닝하는 하이퍼파라미터가 이미지 분류 알고리즘의 목표 지표 값에 크게 영향을 미치는 것을 확인할 수 있습니다. 즉, 다른 값을 선택하면 결과가 크게 달라집니다.

HPO_Analyze_TuningJob_Results.ipynb 노트북을 사용하면 튜닝 작업이 진행됨에 따라 목표 지표가 어떻게 변화하는지를 그래프로 표시할 수 있습니다.

자동 모델 튜닝이 검색 공간을 통해 학습하면서 시간이 지남에 따라 목표 지표 값이 향상되는 것을 확인할 수 있습니다. 학습 작업을 몇 개 더 실행하면 검증 정확도를 0.33보다 더 높일 수도 있습니다. 가설을 검증하기 위해 다른 10개의 학습 작업을 사용하여 두 번째 튜닝 작업을 실행합니다. 이번에는 웜 스타트 구성을 사용하여 첫 번째 튜닝 작업에서 수집된 학습을 재사용합니다.

튜닝 프로세스의 무작위적인 특성을 감안할 때 앞서 설명한 튜닝 작업만큼 추세가 명확하게 나타나지 않을 수 있습니다. 같은 실험을 다시 실행하더라도 동일한 결과가 나타나지 않지만 일반적으로 모델 품질의 전반적인 추세가 향상된 것을 확인할 수 있습니다.

웜 스타트 구성을 사용한 하이퍼파라미터 튜닝 작업 설정 및 시작

새 튜닝 작업에 웜 스타트 구성을 사용하려면 두 가지 파라미터를 지정해야 합니다.

  • 새 튜닝 작업에 시작점으로 사용해야 할 상위 튜닝 작업의 목록 (상위 작업의 최대 개수는 5개지만 이 예에서는 1개 사용)
  • 웜 스타트 구성의 유형:
    • IDENTICAL_DATA_AND_ALGORITHM은 이전 평가를 사용하여 기본적으로 동일한 작업을 실행하는 튜닝 작업을 웜 스타트하며 검색 공간을 약간 변경할 수 있도록 합니다. 이 옵션은 데이터 세트와 알고리즘 컨테이너가 변경되지 않은 경우에 사용해야 합니다.
    • TRANSFER_LEARNING은 유사한 작업에서 얻어진 평가 결과를 사용하여 튜닝 작업을 웜 스타트하며 검색 공간, 알고리즘 이미지 및 데이터 세트를 모두 변경할 수 있도록 합니다.

이 예에서는 데이터 세트나 알고리즘은 변경하지 않고 학습 작업을 추가로 실행하기만 하므로 IDENTICAL_DATA_AND_ALGORITHM을 사용합니다.

Amazon SageMaker 콘솔을 사용하여 웜 스타트로 두 번째 튜닝 작업을 시작합니다. Amazon SageMaker 콘솔을 열고 왼쪽 탐색 창에서 Training을 선택한 다음 Hyperparameter tuning jobsCreate hyperparameter tuning job을 차례로 선택합니다. 페이지 상단에서 Warm start with identical data와 Warm start type 알고리즘을 활성화합니다. 다음 단계로 새 튜닝 작업의 상위 작업을 선택합니다.

이 콘솔에서는 상위 튜닝 작업에서 설정을 복사(Copy settings)하여 새 튜닝 작업의 값을 손쉽게 채울 수 있습니다. Copy settings를 선택하고 나면 양식이 채워집니다. Next를 선택하고 정적 하이퍼파라미터와 튜닝 가능한 하이퍼파라미터가 올바른지 확인합니다.

이 예에서는 하이퍼파라미터 값을 변경하지 않으므로 Next를 다시 선택하고 웜 스타트를 사용해 새 튜닝 작업을 만들기만 하면 됩니다. 정말 간단하죠?

웜 스타트 하이퍼파라미터 튜닝 작업이 완료되고 나면 노트북으로 돌아가 tuner.analytics()를 사용하여 시간 경과에 따라 상위 튜닝 작업(검정색 데이터 포인트)과 웜 스타트를 사용하여 시작한 새 튜닝 작업(빨간색 데이터 포인트)에 대해 목표 지표가 어떻게 변화하는지를 시각화할 수 있습니다.

새 튜닝 작업에서는 상위 튜닝 작업에서 얻어진 선행 지식 덕분에 효과적인 하이퍼파라미터 구성을 매우 빠르게 찾는 것을 확인할 수 있습니다. 계속 최적화를 진행하면 목표 지표가 꾸준히 개선되고 0.47에 도달합니다. 이 지표는 첫 번째 튜닝 작업을 새로 실행할 때 얻어진 지표(0.33)보다 훨씬 높습니다.

마지막으로, 웜 스타트를 사용하여 튜닝 작업에 전이 학습을 적용하는 방법을 살펴보기 위해, 데이터 세트에 더 많은 데이터 증가를 사용한 세 번째 튜닝 작업을 실행하여 검증 정확도가 더 향상되는지 보겠습니다. 데이터 증가를 더 많이 적용하기 위해 Amazon SageMaker 기본 제공 이미지 분류 알고리즘에서 제공되는 augmentation_type 하이퍼파라미터를 사용합니다. 학습 중에 데이터에 crop_color_transform 변환을 적용합니다. 이 변환을 사용하면 자르기 변환 및 색상 변환 외에 무작위 변환(회전, 깎기 및 종횡비 변환)도 이미지에 적용됩니다.

새 데이터 증가를 적용한 결과로 데이터 세트가 변경될 것이므로 전이 학습 WarmStartType을 사용하여 마지막 하이퍼파라미터 튜닝 작업을 만듭니다. 상위 튜닝 작업으로 실행했던 2개의 이전 튜닝 작업을 모두 사용하고 10개의 학습 작업을 더 실행합니다. 노트북으로 돌아가 이 마지막 하이퍼파라미터 튜닝 작업을 시작합니다.

from sagemaker.tuner import WarmStartConfig, WarmStartTypes

parent_tuning_job_name_2 = warmstart_tuning_job_name
transfer_learning_config = WarmStartConfig(WarmStartTypes.TRANSFER_LEARNING, 
                                    parents={parent_tuning_job_name,parent_tuning_job_name_2})

imageclassification.set_hyperparameters(num_layers=18,
                                        image_shape='3,224,224',
                                        num_classes=257,
                                        num_training_samples=15420,
                                        mini_batch_size=128,
                                        epochs=50,
                                        optimizer='sgd',
                                        top_k='2',
                                        precision_dtype='float32',
                                        augmentation_type='crop_color_transform')

tuner_transfer_learning = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=10,
                            max_parallel_jobs=2,
                            base_tuning_job_name='transferlearning',
                            warm_start_config=transfer_learning_config)

tuner_transfer_learning.fit({'train': s3_input_train, 'validation': s3_input_validation},include_cls_metadata=False)

마지막으로, 새 하이퍼파라미터 튜닝 작업이 완료된 후 tuner.analytics()를 사용하여 시간 경과에 따라 상위 튜닝 작업(검정색 및 빨간색 데이터 포인트)과 웜 스타트 전이 학습을 사용하여 시작한 새 튜닝 작업(파란색 데이터 포인트)에 대해 목표 지표가 어떻게 변화하는지를 시각화할 수 있습니다.

튜닝 작업이 완료되고 나면 목표 지표가 다시 한번 향상되어 0.52에 도달합니다.

이 결과에 만족할 경우 자동 모델 튜닝 설명 API 또는 콘솔에서 BestTrainingJob을 가져와 최상의 모델을 생성한 학습 작업을 찾을 수 있습니다. 콘솔에서 Amazon SageMaker 호스팅 엔드포인트에 모델을 배포할 수 있습니다.

결론

이번 포스팅에서는 웜 스타트 구성이 이전 반복 작업에서 수집된 학습 내용을 유지하면서 검색 공간을 반복적으로 살펴보는 데 얼마나 유용한지를 보여 주는 사용 사례를 하나 살펴보았습니다. 또한 데이터 세트 또는 알고리즘이 변경되어도 이전 하이퍼파라미터 튜닝 작업의 데이터 세트 또는 알고리즘과 매우 유사한 경우에 웜 스타트를 사용하여 이전 튜닝 작업의 학습 내용을 전이하는 방법도 설명했습니다.

하이퍼파라미터 튜닝 작업의 웜 스타트는 현재 Amazon SageMaker가 제공되는 모든 AWS 리전에서 사용할 수 있습니다. Amazon SageMaker 자동 모델 튜닝에 대한 자세한 내용은 Amazon SageMaker 설명서를 참조하십시오.

작성자 소개

Patricia Grao는 Amazon AI의 소프트웨어 개발 관리자로, Amazon Search의 검색 순위 및 쿼리 인식 기능과 관련한 작업을 하면서 기계 학습 분야에 열의를 가지게 되었습니다. Amazon SageMaker 자동 모델 튜닝을 발표한 팀의 일원으로 참여했습니다.

 

 

Fela Winkelmolen은 Amazon AI에서 응용 과학자로 일하고 있으며 Amazon SageMaker의 자동 모델 튜닝 기능을 발표한 팀의 일원으로 참여했습니다.

 

 

 

Fan Li는 Amazon SageMaker의 제품 관리자로, 이전에는 사교 댄스를 취미로 즐겼지만 지금은 8살 아들과 함께 하는 데 집중하고 있습니다.

 

 

 

이 글은 AWS Machine Learning Blog의 Amazon SageMaker Automatic Model Tuning becomes more efficient with warm start of hyperparameter tuning jobs의 한국어 번역으로 정도현 AWS 테크니컬 트레이너가 감수하였습니다.