Amazon Web Services 한국 블로그

Amazon SageMaker Experiments – 반복적인 기계 학습 모델 훈련 구성, 추적 및 평가 기능 출시 (서울 리전 포함)

Amazon SageMaker Experiments는 반복적인 기계 학습(Machine Learning, ML) 모델 버전을 구성, 추적, 비교 및 평가하는 데 사용되는 새로운 기능입니다.

기계 학습 워크로드는 매우 반복적인 과정입니다. 프로젝트 한 건을 진행하는 동안 데이터 과학자와 ML 엔지니어가 최대한의 정확성을 찾기 위해 학습하는 모델의 수는 수천 개에 달합니다. 실제로, 알고리즘, 데이터 세트 및 학습 파라미터(일명 하이퍼파라미터)의 조합은 무한대이며 이 안에는 소위 건초에서 바늘을 찾는 것과 같은 어려움이 존재합니다.

자동 모델 튜닝Amazon SageMaker Autopilot 같은 도구는 ML 실무 작업에서 거대한 수의 조합을 자동으로 탐색하고 고성능 모델을 빠르게 찾는 데 도움이 됩니다. 그러나 이러한 도구를 사용하면 학습 작업의 수가 폭발적으로 증가합니다. 시간이 지남에 따라 지표를 추적하고 실험별로 작업을 그룹화하고 동일한 실험 또는 전체 실험에서 작업을 비교하고 이전 작업을 쿼리하는 등의 수많은 작업을 효율적으로 처리하는 것이 거의 불가능해지므로 ML 팀은 새로운 어려움에 직면하게 됩니다.

물론, 맞춤형 도구를 구축하고 관리하고 확장하여 이 문제를 해결할 수 있지만 그렇게 하려면 실제 ML 작업에 들여야 할 소중한 시간과 리소스를 할애해야 합니다. 고객이 오로지 ML에만 집중하기를 바라는 AWS는 이 문제를 내버려 둘 수 없었습니다.

Amazon SageMaker Experiments 소개
우선, 핵심 개념부터 정의하겠습니다.

  • 시행(Trial)은 단일 학습 작업과 관련된 학습 단계의 모음입니다. 학습 단계에는 일반적으로 전처리, 학습, 모델 평가 등이 포함됩니다. 시행은 입력(예: 알고리즘, 파라미터, 데이터 세트)과 출력(예: 모델, 체크포인트, 지표)에 대한 메타데이터로 보강됩니다.
  • 실험(Experiments )은 단순히 시행을 모아 놓은 것입니다. 즉, 관련된 학습 작업을 그룹화한 것이 실험입니다.

SageMaker Experiments의 목표는 가능한 간단하게 실험을 생성하고 시행으로 실험을 채우고 시행과 실험 전체에서 분석을 실행하는 방법을 제공하는 것입니다. 이를 위해 로깅 및 분석 API가 포함된 새로운 Python SDK가 도입되었습니다.

SageMaker 또는 SageMaker Autopilot에서 학습 작업을 실행할 때 Estimator에 추가 파라미터를 전달하여 시행을 연결할 실험 이름을 정의하기만 하면 됩니다. 모든 입력 및 출력은 자동으로 기록됩니다.

학습 작업을 실행한 후에는 SageMaker Experiments SDK를 통해 주요 pandas 데이터 프레임 형식의 실험 및 시행 데이터를 로드할 수 있습니다. Pandas는 ML 실무 작업에 있어서 스위스 만능칼 같은 역할을 합니다. 필요한 모든 분석을 수행할 수 있습니다. 한 단계 올라가서 matplotlib로 시각화를 구축하면 이 야생의 학습 작업을 성공적으로 길들일 수 있게 됩니다!

예상하시는 대로 SageMaker Experiments는 SageMaker Studio와 원활하게 통합됩니다. 복잡한 쿼리를 실행하여 이전의 시행을 빠르게 찾을 수 있습니다. 실시간 모델 리더보드와 지표 차트를 시각화할 수도 있습니다.

간단한 데모를 살펴봅시다.

Amazon SageMaker Experiments을 사용하여 학습 정보 로깅
MNIST 데이터 세트의 이미지를 분류하고 단순한 2계층 CNN(합성곱 신경망)을 사용하는 PyTorch 스크립트에서 시작합니다. SageMaker에서 단일 작업을 실행하려는 경우에는 PyTorch estimator를 사용할 수 있습니다.

estimator = PyTorch(
        entry_point='mnist.py',
        role=role,
        sagemaker_session=sess
        framework_version='1.1.0',
        train_instance_count=1,
        train_instance_type='ml.p3.2xlarge')
    
    estimator.fit(inputs={'training': inputs})

그러나 하이퍼파라미터(2계층 합성곱에 사용되는 합성곱 필터의 수, 즉 숨겨진 채널의 수) 중 하나만 변경하여 이 변경이 모델 정확도에 미치는 영향을 측정하기 위해 동일한 스크립트의 여러 버전을 실행하는 경우에는 이야기가 다릅니다. 물론, 이러한 작업을 실행하고 학습 로그를 수집한 다음 텍스트 필터링으로 지표를 추출해도 됩니다. 아니면 SageMaker Experiments을 사용할 수도 있습니다!

그러면 일이 쉬워집니다.

  • 실험을 설정하고
  • 추적기를 사용하여 실험 메타데이터를 기록하고
  • 실행하려는 각 학습 작업에 대한 시행을 생성하고
  • 실험 이름과 시행 이름에 대한 파라미터를 전달하면서 각 학습 작업을 실행하기만 하면 됩니다.

우선, 실험부터 처리합시다.

from smexperiments.experiment import Experiment
mnist_experiment = Experiment.create(
    experiment_name="mnist-hand-written-digits-classification", 
    description="Classification of mnist hand-written digits", 
    sagemaker_boto_client=sm)

다음으로, 추적할 항목을 추가합니다. 예를 들어 데이터 세트의 위치와 여기에 적용할 정규화 값 같은 것을 추가할 수 있습니다.

from smexperiments.tracker import Tracker
with Tracker.create(display_name="Preprocessing", sagemaker_boto_client=sm) as tracker:
     tracker.log_input(name="mnist-dataset", media_type="s3/uri", value=inputs)
     tracker.log_parameters({
        "normalization_mean": 0.1307,
        "normalization_std": 0.3081,
    })

이제, 몇 가지 작업을 실행합니다. 각 학습 작업에 대한 새로운 시행을 생성하고 추적기 정보를 추가하면서 시행하고자 하는 여러 값을 반복합니다.

for i, num_hidden_channel in enumerate([2, 5, 10, 20, 32]):
    trial_name = f"cnn-training-job-{num_hidden_channel}-hidden-channels-{int(time.time())}"
    cnn_trial = Trial.create(
        trial_name=trial_name, 
        experiment_name=mnist_experiment.experiment_name,
        sagemaker_boto_client=sm,
    )
    cnn_trial.add_trial_component(tracker.trial_component)

그런 다음 예측기를 구성하여 관심 있는 하이퍼파라미터 값을 전달하고 다른 항목은 그대로 유지합니다. 학습 작업에서 지표를 추출하는 정규식도 전달합니다. 이 모든 항목은 시행에 저장됩니다. 사실, 모든 파라미터(전달된 값 또는 기본값)이 여기에 해당합니다.

    estimator = PyTorch(
        entry_point='mnist.py',
        role=role,
        sagemaker_session=sess,
        framework_version='1.1.0',
        train_instance_count=1,
        train_instance_type='ml.p3.2xlarge',
        hyperparameters={
            'hidden_channels': num_hidden_channels
        },
        metric_definitions=[
            {'Name':'train:loss', 'Regex':'Train Loss: (.*?);'},
            {'Name':'test:loss', 'Regex':'Test Average loss: (.*?),'},
            {'Name':'test:accuracy', 'Regex':'Test Accuracy: (.*?)%;'}
        ]
    )

마지막으로 학습 작업을 실행하여 실험과 시행에 연결합니다.

    cnn_training_job_name = "cnn-training-job-{}".format(int(time.time()))
    
    estimator.fit(
        inputs={'training': inputs}, 
        job_name=cnn_training_job_name,
        experiment_config={
            "ExperimentName": mnist_experiment.experiment_name, 
            "TrialName": cnn_trial.trial_name,
            "TrialComponentDisplayName": "Training",
        }
    )
# end of loop

작업이 모두 완료되면 분석을 실행할 수 있습니다. 이제, 결과를 봅시다.

Amazon SageMaker Experiments을 사용한 분석
실험의 모든 정보를 Pandas DataFrame으로 손쉽게 내보낼 수 있습니다.

from sagemaker.analytics import ExperimentAnalytics
trial_component_analytics = ExperimentAnalytics(
    sagemaker_session=sess, 
    experiment_name=mnist_experiment.experiment_name
)
analytic_table = trial_component_analytics.dataframe()

If I want to drill down, I can specify additional parameters, e.g.:

trial_component_analytics = ExperimentAnalytics(
    sagemaker_session=sess, 
    experiment_name=mnist_experiment.experiment_name,
    sort_by="metrics.test:accuracy.max",
    sort_order="Descending",
    metric_names=['test:accuracy'],
    parameter_names=['hidden_channels', 'epochs', 'dropout', 'optimizer']
)
analytic_table = trial_component_analytics.dataframe()

테스트 정확도를 낮추면서 각 시행에 대한 일부 하이퍼파라미터만 표시하여 시행을 정렬하는 DataFrame이 구축됩니다.

for col in analytic_table.columns: 
    print(col) 

TrialComponentName
DisplayName
SourceArn
dropout
epochs
hidden_channels
optimizer
test:accuracy - Min
test:accuracy - Max
test:accuracy - Avg
test:accuracy - StdDev
test:accuracy - Last
test:accuracy - Count

여기서부터는 상상을 넘어섭니다. Pandas는 데이터 분석에서 스위스 만능칼과 같습니다. 가능한 모든 방법으로 시행과 실험을 비교할 수 있습니다.

마지막으로, SageMaker Studio와 통합하면 미리 정의된 위젯을 사용하여 이 모든 정보를 실시간으로 시각화할 수 있습니다. SageMaker 스튜디오에 대해 자세히 알아보려면 블로그 게시물을 참고하세요.

지금 이용 가능
이 게시물에서는 Amazon SageMaker Experiments의 기능을 대강 훑어봤습니다. 이 기능으로 야생 동물과 같은 매일의 ML 작업을 쉽게 길들일 수 있게 되기를 바랍니다.

오늘부터 Amazon SageMaker가 제공되는 모든 상용 AWS 리전에서 이 서비스를 사용할 수 있습니다. 이 기능을 사용하고 Amazon SageMaker에 대한 AWS 포럼 또는 일반적인 AWS 연락처를 통해 피드백을 보내주시기 바랍니다.

– Julien