Amazon SageMaker 파이프라인을 사용하여 Amazon이 대규모 순차 앙상블 모델을 훈련하는 방법

처럼
좋아했다

시간

Amazon SageMaker 파이프 라인 머신 러닝(ML) 워크플로를 간소화하고 자동화할 수 있는 기능이 포함되어 있습니다. 이를 통해 과학자와 모델 개발자는 인프라 관리보다는 모델 개발과 신속한 실험에 집중할 수 있습니다.

파이프라인은 SageMaker Studio를 통해 워크플로를 시각화하는 기능을 갖춘 간단한 Python SDK로 복잡한 ML 워크플로를 조율하는 기능을 제공합니다. 이는 데이터 준비 및 기능 엔지니어링 작업과 모델 교육 및 배포 자동화에 도움이 됩니다. 파이프라인은 또한 Amazon SageMaker Automatic Model Tuning과 통합되어 선택한 메트릭에 따라 가장 성능이 좋은 모델을 만드는 하이퍼파라미터 값을 자동으로 찾을 수 있습니다.

앙상블 모델은 ML 커뮤니티에서 인기를 얻고 있습니다. 여러 모델의 예측을 결합하여 더 정확한 예측을 생성합니다. 파이프라인을 사용하여 앙상블 모델을 위한 엔드투엔드 ML 파이프라인을 빠르게 만들 수 있습니다. 이를 통해 개발자는 효율성과 재현성을 유지하면서도 매우 정확한 모델을 구축할 수 있습니다.

이 게시물에서는 파이프라인을 사용하여 훈련되고 배포된 앙상블 모델의 예를 제공합니다.

사용 사례 개요

영업 담당자는 새로운 리드를 생성하고 Salesforce 내에서 기회를 만들어 이를 추적합니다. 다음 애플리케이션은 이름, 설명, 세부 정보, 제품 서비스 그룹과 같은 다양한 텍스트 정보를 기반으로 각 기회에서 사용 사례를 자동으로 식별하는 비지도 학습을 사용하는 ML 접근 방식입니다.

예비 분석에 따르면 사용 사례는 산업에 따라 다르고, 다양한 사용 사례는 연간 매출 분포가 매우 다르며 세분화에 도움이 될 수 있습니다. 따라서 사용 사례는 분석을 최적화하고 판매 추천 모델을 개선할 수 있는 중요한 예측 기능입니다.

우리는 유스 케이스 식별을 주제 식별 문제로 취급할 수 있으며, 잠재 의미 분석(LSA), 잠재 디리클레 할당(LDA), BERTopic과 같은 다양한 주제 식별 모델을 탐색합니다. LSA와 LDA에서 각 문서는 단어의 모음으로만 취급되고 단어의 순서나 문법적 역할은 중요하지 않아 주제를 결정하는 데 일부 정보 손실이 발생할 수 있습니다. 게다가, 그들은 미리 결정된 수의 주제를 필요로 하는데, 이는 우리의 데이터 세트에서 결정하기 어려웠습니다. BERTopic은 위의 문제를 극복했기 때문에 유스 케이스를 식별하는 데 사용되었습니다.

이 접근 방식에서는 세 개의 순차적인 BERTopic 모델을 사용하여 계층적 방법으로 최종 클러스터링을 생성합니다.

각 BERTopic 모델은 4가지 부분으로 구성됩니다.

  • 퍼가기 – BERTopic에서는 다양한 임베딩 방법을 사용할 수 있습니다. 이 시나리오에서 입력 데이터는 다양한 영역에서 제공되며 일반적으로 수동으로 입력됩니다. 결과적으로 확장성과 빠른 처리를 보장하기 위해 문장 임베딩을 사용합니다.
  • 차원 축소 – 우리는 고차원 텍스트 벡터를 줄이기 위해 비지도 및 비선형 차원 감소 방법인 UMAP(Uniform Manifold Approximation and Projection)을 사용합니다.
  • 클러스터링 – 계층을 사용한 균형 반복적 감소 및 클러스터링(BIRCH) 방법을 사용하여 다양한 사용 사례 클러스터를 형성합니다.
  • 키워드 식별 – 우리는 클래스 기반 TF-IDF를 사용하여 각 클러스터에서 가장 대표적인 단어를 추출합니다.

순차적 앙상블 모델

주제의 미리 정해진 수는 없으므로 클러스터 수에 대한 입력을 15~25개 주제로 설정합니다. 관찰 결과 일부 주제는 폭넓고 일반적입니다. 따라서 BERTopic 모델의 또 다른 계층을 개별적으로 적용합니다. 두 번째 계층 모델에서 새로 식별된 모든 주제를 결합하고 첫 번째 계층 결과의 원래 주제와 함께 후처리를 수동으로 수행하여 주제 식별을 마무리합니다. 마지막으로 세 번째 계층을 일부 클러스터에 사용하여 하위 주제를 만듭니다.

2차 및 3차 계층 모델이 효과적으로 작동할 수 있도록 하려면 이전 모델의 결과를 특정 단어나 구문에 매핑하는 매핑 파일이 필요합니다. 이를 통해 클러스터링이 정확하고 관련성이 있는지 확인하는 데 도움이 됩니다.

우리는 하이퍼파라미터 튜닝과 교차 검증을 위해 베이지안 최적화를 사용하여 과적합을 줄입니다. 데이터 세트에는 기회 이름, 기회 세부 정보, 요구 사항, 관련 제품 이름, 제품 세부 정보, 제품 그룹과 같은 기능이 포함되어 있습니다. 모델은 사용자 지정 손실 함수를 사용하여 평가되고 최상의 임베딩 모델이 선택됩니다.

과제 및 고려 사항

이 솔루션의 몇 가지 과제와 고려 사항은 다음과 같습니다.

  • 파이프라인의 데이터 전처리 기능은 모델 성능을 향상시키는 데 필수적입니다. 훈련 전에 들어오는 데이터를 전처리할 수 있는 기능을 통해 모델에 고품질 데이터가 공급되도록 할 수 있습니다. 일부 전처리 및 데이터 정리 단계에는 모든 텍스트 열을 소문자로 변환하고, 템플릿 요소, 축약어, URL, 이메일 등을 제거하고, 관련 없는 NER 레이블을 제거하고, 결합된 텍스트를 레마타이징하는 것이 포함됩니다. 그 결과 더 정확하고 신뢰할 수 있는 예측이 가능합니다.
  • 우리는 수백만 행의 데이터를 손쉽게 처리하고 훈련할 수 있도록 확장성이 뛰어난 컴퓨팅 환경이 필요합니다. 이를 통해 대규모 데이터 처리 및 모델링 작업을 쉽게 수행하고 개발 시간과 비용을 줄일 수 있습니다.
  • ML 워크플로의 모든 단계에는 다양한 리소스 요구 사항이 필요하기 때문에 유연하고 적응 가능한 파이프라인은 효율적인 리소스 할당에 필수적입니다. 각 단계의 리소스 사용을 최적화하여 전체 처리 시간을 줄여 더 빠른 모델 개발 및 배포를 실현할 수 있습니다.
  • 데이터 처리 및 모델 학습을 위한 사용자 정의 스크립트를 실행하려면 필요한 프레임워크와 종속성을 사용할 수 있어야 합니다.
  • 여러 모델의 학습을 조정하는 것은 어려울 수 있으며, 특히 각 후속 모델이 이전 모델의 출력에 따라 달라지는 경우 더욱 그렇습니다. 이러한 모델 간의 워크플로를 조율하는 프로세스는 복잡하고 시간이 많이 걸릴 수 있습니다.
  • 각 학습 계층 이후에는 모델에서 생성된 주제를 반영하는 매핑을 수정하고 이를 후속 모델 계층의 입력으로 사용해야 합니다.

솔루션 개요

이 솔루션에서는 진입점이 다음과 같습니다. 아마존 세이지 메이커 스튜디오AWS에서 제공하는 웹 기반 통합 개발 환경(IDE)인 는 데이터 과학자와 ML 개발자가 협력적이고 효율적인 방식으로 대규모 ML 모델을 구축, 교육 및 배포할 수 있도록 지원합니다.

다음 다이어그램은 솔루션의 상위 수준 아키텍처를 보여줍니다.

아키텍처의 일부로 다음 SageMaker 파이프라인 단계를 사용하고 있습니다.

  • SageMaker 처리 – 이 단계에서는 학습 전에 데이터를 사전 처리하고 변환할 수 있습니다. 이 단계의 한 가지 이점은 일반적인 데이터 변환과 리소스의 자동 스케일링을 위한 내장 알고리즘을 사용할 수 있다는 것입니다. 복잡한 데이터 사전 처리를 위해 사용자 지정 코드를 사용할 수도 있으며, 사용자 지정 컨테이너 이미지를 사용할 수 있습니다.
  • SageMaker 교육 – 이 단계에서는 SageMaker 내장 알고리즘이나 사용자 지정 코드를 사용하여 ML 모델을 훈련할 수 있습니다. 분산 훈련을 사용하여 모델 훈련을 가속화할 수 있습니다.
  • SageMaker 콜백 – 이 단계에서는 ML 워크플로 중에 사용자 지정 코드를 실행할 수 있습니다(예: 알림 전송 또는 추가 처리 단계 트리거). 이 단계에서 외부 프로세스를 실행하고 완료 시 파이프라인 워크플로를 재개할 수 있습니다.
  • 세이지메이커 모델 – 이 단계에서는 모델을 생성하거나 등록할 수 있습니다. 아마존 세이지 메이커

구현 연습

먼저 Sagemaker 파이프라인을 설정합니다.

import boto3       
import sagemaker   

# create a Session with custom region (e.g. us-east-1), will be None if not specified 
region = "<your-region-name>"    		

# allocate default S3 bucket for SageMaker session, will be None if not specified
default_bucket = "<your-s3-bucket>"   	
boto_session = boto3.Session(region_name=region
sagemaker_client = boto_session.client("sagemaker") 

SageMaker 세션 초기화

sagemaker_session = sagemaker.session.Session(boto_session=boto_session, sagemaker_client=sagemaker_client, default_bucket= default_bucket,) 

세션에 대한 Sagemaker 실행 역할 설정

role = sagemaker.session.get_execution_role(sagemaker_session)

파이프라인 컨텍스트에서 상호 작용 관리

pipeline_session = sagemaker.workflow.pipeline_context.PipelineSession(boto_session=boto_session, sagemaker_client=sagemaker_client, default_bucket=default_bucket,)

스크립트가 실행될 기본 이미지를 정의합니다.

account_id = role.split(":")[4]
# create a base image that take care of dependencies
ecr_repository_name = "<your-base-image-to-run-script>".    
tag = "latest"
container_image_uri = "{0}.dkr.ecr.{1}.amazonaws.com/{2}:{3}".format(account_id, region, ecr_repository_name, tag)

워크플로 단계에 대한 자세한 설명은 다음과 같습니다.

  • 데이터 전처리 – 여기에는 기능 엔지니어링을 위해 데이터를 정리하고 준비하고 데이터를 훈련, 테스트, 검증 세트로 분할하는 작업이 포함됩니다.
import os
BASE_DIR = os.path.dirname(os.path.realpath(__file__))

from sagemaker.workflow.parameters import ParameterString
from sagemaker.workflow.steps import ProcessingStep

from sagemaker.processing import (
    ProcessingInput,
    ProcessingOutput,
    ScriptProcessor,
)

processing_instance_type = ParameterString(
    name="ProcessingInstanceType",
    # choose an instance type suitable for the job
    default_value="ml.m5.4xlarge"           
)

script_processor = ScriptProcessor(
    image_uri=container_image_uri,
    command=["python"],
    instance_type=processing_instance_type,
    instance_count=1,
    role=role,
)
 
# define the data preprocess job 
step_preprocess = ProcessingStep(
    name="DataPreprocessing",
    processor=script_processor,
    inputs=[
        ProcessingInput(source=BASE_DIR, destination="/opt/ml/processing/input/code/")  
    ],
    outputs=[
        ProcessingOutput(output_name="data_train", source="/opt/ml/processing/data_train"),  # output data and dictionaries etc for later steps
    ]
    code=os.path.join(BASE_DIR, "preprocess.py"),      
)
  • 레이어 1 BERTopic 모델 학습 – SageMaker 학습 단계는 BERTopic 모델의 첫 번째 계층을 학습하는 데 사용됩니다. Amazon Elastic Container Registry (Amazon ECR) 이미지와 사용자 정의 훈련 스크립트.
base_job_prefix="OppUseCase"

from sagemaker.workflow.steps import TrainingStep
from sagemaker.estimator import Estimator
from sagemaker.inputs import TrainingInput

training_instance_type = ParameterString(
    name="TrainingInstanceType",
    default_value="ml.m5.4xlarge"
)

# create an estimator for training job
estimator_first_layer = Estimator(
    image_uri=container_image_uri,
    instance_type=training_instance_type,
    instance_count=1,
    output_path= f"s3://{default_bucket}/{base_job_prefix}/train_first_layer",       # S3 bucket where the training output be stored
    role=role,
    entry_point = "train_first_layer.py"
)

# create training job for the estimator based on inputs from data-preprocess step 
step_train_first_layer = TrainingStep(
    name="TrainFirstLayerModel",
    estimator = estimator_first_layer,
    inputs={
            TrainingInput(
            s3_data=step_preprocess.properties.ProcessingOutputConfig.Outputs[ "data_train" ].S3Output.S3Uri,
        ),
    },
)
from sagemaker.workflow.callback_step import CallbackStep, CallbackOutput, CallbackOutputTypeEnum

first_sqs_queue_to_use = ParameterString(
    name="FirstSQSQueue",
    default_value= <first_queue_url>,  # add queue url  
)

first_callback_output = CallbackOutput(output_name="s3_mapping_first_update", output_type=CallbackOutputTypeEnum.String)

step_first_mapping_update = CallbackStep(
    name="FirstMappingUpdate",
    sqs_queue_url= first_sqs_queue_to_use,

    # Input arguments that will be provided in the SQS message
    inputs={
        "input_location": f"s3://{default_bucket}/{base_job_prefix}/mapping",             
        "output_location": f"s3://{default_bucket}/{base_job_prefix}/ mapping_first_update "
    },
    outputs=[
        first_callback_output,
    ],
)

step_first_mapping_update.add_depends_on([step_train_first_layer])       # call back is run after the step_train_first_layer
  • 레이어 2 BERTopic 모델 학습 – 또 다른 SageMaker TrainingStep은 ECR 이미지와 사용자 지정 교육 스크립트를 사용하여 BERTopic 모델의 두 번째 계층을 교육하는 데 사용됩니다.
estimator_second_layer = Estimator(
    image_uri=container_image_uri,
    instance_type=training_instance_type,    # same type as of first train layer
    instance_count=1,
    output_path=f"s3://{bucket}/{base_job_prefix}/train_second_layer",     # S3 bucket where the training output be stored
    role=role,
    entry_point = "train_second_layer.py"
)

# create training job for the estimator based on inputs from preprocessing, output of previous call back step and first train layer step
step_train_second_layer = TrainingStep(
    name="TrainSecondLayerModel",
    estimator = estimator_second_layer,
    inputs={
          TrainingInput(
            s3_data=step_preprocess.properties.ProcessingOutputConfig.Outputs[ "data_train"].S3Output.S3Uri,
        ),
          TrainingInput(
            # Output of the previous call back step
            s3_data= step_first_mapping_update.properties.Outputs["s3_mapping_first_update"],
        ),
        TrainingInput(
            s3_data=f"s3://{bucket}/{base_job_prefix}/train_first_layer"
        ),
    }
)
  • 콜백 단계 사용 – 3단계와 유사하게, 여기에는 Lambda 함수를 트리거하는 SQS 대기열에 메시지를 보내는 것이 포함됩니다. Lambda 함수는 Amazon S3에서 매핑 파일을 업데이트하고 파이프라인으로 성공 토큰을 다시 보내 실행을 재개합니다.
second_sqs_queue_to_use = ParameterString(
    name="SecondSQSQueue",
    default_value= <second_queue_url>,           # add queue url  
)

second_callback_output = CallbackOutput(output_name="s3_mapping_second_update", output_type=CallbackOutputTypeEnum.String)

step_second_mapping_update = CallbackStep(
    name="SecondMappingUpdate",
    sqs_queue_url= second_sqs_queue_to_use,

    # Input arguments that will be provided in the SQS message
    inputs={
        "input_location": f"s3://{default_bucket}/{base_job_prefix}/mapping_first_update ",             
        "output_location": f"s3://{default_bucket}/{base_job_prefix}/mapping_second_update "
    },
    outputs=[
        second_callback_output,
    ],
)

step_second_mapping_update.add_depends_on([step_train_second_layer])       # call back is run after the step_train_second_layer   
  • 레이어 3 BERTopic 모델 학습 – 여기에는 Amazon S3에서 매핑 파일을 가져오고 ECR 이미지와 사용자 지정 교육 스크립트를 사용하여 BERTopic 모델의 세 번째 계층을 교육하는 작업이 포함됩니다.
estimator_third_layer = Estimator(
    image_uri=container_image_uri,
    instance_type=training_instance_type,                   # same type as of prvious two train layers
    instance_count=1,
    output_path=f"s3://{default_bucket}/{base_job_prefix}/train_third_layer",      # S3 bucket where the training output be stored
    role=role,
    entry_point = "train_third_layer.py"
)

# create training job for the estimator based on inputs from preprocess step, second callback step and outputs of previous two train layers
step_train_third_layer = TrainingStep(
    name="TrainThirdLayerModel",
    estimator = estimator_third_layer,
    inputs={
          TrainingInput(
            s3_data=step_preprocess.properties.ProcessingOutputConfig.Outputs["data_train"].S3Output.S3Uri,
        ),
          TrainingInput(
            # s3_data = Output of the previous call back step
            s3_data= step_second_mapping_update.properties.Outputs[' s3_mapping_second_update’],
        ),
        TrainingInput(
            s3_data=f"s3://{default_bucket}/{base_job_prefix}/train_first_layer"
        ),
        TrainingInput(
            s3_data=f"s3://{default_bucket}/{base_job_prefix}/train_second_layer"
        ),
    }
)
  • 모델 등록 – SageMaker 모델 단계는 SageMaker 모델 레지스트리에 모델을 등록하는 데 사용됩니다. 모델이 등록되면 SageMaker 추론 파이프라인을 통해 모델을 사용할 수 있습니다.
from sagemaker.model import Model
from sagemaker.workflow.model_step import ModelStep

model = Model(
    image_uri=container_image_uri,
    model_data=step_train_third_layer.properties.ModelArtifacts.S3ModelArtifacts,     
    sagemaker_session=sagemaker_session,
    role=role,
)

register_args = model.register(
    content_types=["text/csv"],
    response_types=["text/csv"],
    inference_instances=["ml.c5.9xlarge", "ml.m5.xlarge"],
    model_package_group_name=model_package_group_name,
    approval_status=model_approval_status,
)
step_register = ModelStep(name="OppUseCaseRegisterModel", step_args=register_args)

BERTopic 모델과 BIRCH 및 UMAP 방법을 효과적으로 훈련하려면 알고리즘을 실행하는 데 필요한 추가 종속성과 프레임워크를 제공할 수 있는 사용자 지정 훈련 이미지가 필요합니다. 사용자 지정 도커 이미지의 작동 샘플은 다음을 참조하세요. SageMaker용 사용자 정의 Docker 컨테이너 이미지 만들기

결론

이 게시물에서는 SageMaker Pipelines에서 제공하는 광범위한 단계를 사용자 정의 이미지와 함께 사용하여 앙상블 모델을 학습하는 방법을 설명했습니다. 기존 ML Operations(MLOps) 템플릿을 사용하여 Pipelines를 시작하는 방법에 대한 자세한 내용은 다음을 참조하세요. Amazon SageMaker Pipelines를 사용하여 ML 워크 플로 구축, 자동화, 관리 및 확장.


저자에 관하여

빅람짓 싱 AWS Sales Insights, Analytics and Data Science(SIADS) 팀의 응용 과학자로, SIADS 내 ML 과학자를 위한 GenAI 플랫폼과 AI/ML 인프라 솔루션을 구축하는 업무를 담당합니다. AS로 일하기 전에 Bikram은 SIADS와 Alexa AI에서 소프트웨어 개발 엔지니어로 일했습니다.

라훌 샤르마 AWS의 Senior Specialist Solutions Architect로, AWS 고객이 ML 및 Generative AI 솔루션을 구축하도록 돕습니다. Rahul은 AWS에 합류하기 전에 금융 및 보험 산업에서 수년간 근무하면서 고객이 데이터 및 분석 플랫폼을 구축하도록 도왔습니다.

사친 미 슈라 기술 컨설팅 및 소프트웨어 리더십 역할에서 16년의 업계 경험을 가진 노련한 전문가입니다. Sachin은 AWS에서 영업 전략 과학 및 엔지니어링 기능을 이끌었습니다. 이 역할에서 그는 영업 전략을 위한 인지 분석을 확장하고, 고급 AI/ML 기술을 활용하여 통찰력을 얻고, 비즈니스 결과를 최적화하는 일을 담당했습니다.

나다 압달라 AWS의 연구 과학자입니다. 그녀의 작업과 전문성은 텍스트 분석, 추천 시스템, 베이지안 모델링 및 예측을 포함한 통계 및 ML의 여러 과학 분야에 걸쳐 있습니다. 그녀는 이전에 학계에서 일했으며 UCLA에서 생물통계학으로 석사 및 박사 학위를 취득했습니다. 학계와 산업계에서 일하면서 그녀는 저명한 통계 저널과 응용 ML 컨퍼런스에 여러 논문을 발표했습니다. 여가 시간에는 달리기와 가족과 함께 시간을 보내는 것을 즐깁니다.

관련 기사

spot_img

최근 기사

spot_img