본문 바로가기

MLOps

Amazon SageMaker

Amazon SageMaker는 머신러닝 모델을 구축, 훈련 및 배포할 수 있는 완전 관리형 서비스이다. 본 글은 4/21에 AWS에서 진행한 TdML Gameday 사전교육 내용을 바탕으로 작성한 것으로, 본격적으로 SageMaker를 사용하기에 앞서 정리해두면 좋은 내용이다. 나중에 조금이라도 덜 헤매기 위하여!

 

1. ML Workflow 단계별 필요한 SageMaker 서비스

머신러닝 모델을 상용화하기까지의 과정은 크게 4단계(Prepare(준비), Build(모델 개발), Train & Tune(훈련), Deploy & Manage(배포 & 관리))로 나눌 수 있다. 각 단계별로 SageMaker가 어떠한 서비스들을 지원해주는지 알아보자.

 

1-1. Prepare(준비)

머신러닝 모델을 개발하는데 필요한 데이터를 준비하는 단계다. 다음과 같은 서비스들이 유용하게 사용될 수 있다.

 

  • SageMaker Ground Truth: 데이터에 ground truth 라벨링하는 작업을 돕는 서비스다. 사람이 라벨링하는 서비스(ex. Amazon Mechanical Turk)와 컴퓨터가 자동으로 라벨링을 해주는 서비스로 나뉜다.
  • Data Wrangler: 데이터를 변환, 분할, 시각화, 분석하는데 사용할 수 있는 서비스로, 코드 없이 클릭만으로 원하는 작업을 할 수 있다. 데이터 준비 워크플로/리니지를 조회할 수 있다.
  • Processing: s3의 원시 데이터를 넣으면 개발자의 코드에 따라 아웃풋을 출력해주는 서비스다. 컴퓨팅 자원 조절이 가능하다. 파라미터에 사용할 인스턴스 및 로딩할 도커 이미지 이름을 기술할 수 있다.
  • Feature Store: 피처를 만든 다음에 저장해둘 수 있는 서비스다. 중복 작업 방지하고 동일 데이터에 대한 다수의 redundant한 피처 파이프라인을 방지하는데 유용하다.

1-2. Build(모델 개발)

  • Studio Notebook: 주피터 노트북을 이용하여 머신러닝 모델을 개발하고 실험할 수 있다. 다양한 커널이 지원되며 웬만한 패키지는 미리 설치되었다. VPC 내에서 사용되며 노트북 인스턴스를 직접 설정할 수 있다.  Jupyter Lab의 각종 예제들을 사용할 수 있다.
  • Autopilot: AutoML을 지원하는 서비스다.

1-3. Train & Tune(학습 & 튜닝)

머신러닝 모델을 학습하고 파라미터를 튜닝하는 단계이다. 모델 학습을 위해서는 (1)학습을 실행할 환경을 구축하기 위한 컨테이너 이미지(2)학습 알고리즘을 구현한 코드가 필요하다. 이 둘 각각의 SageMaker Built-In 여부에 따라 SageMaker 사용 방식을 다음 4가지로 나눌 수 있다.

 

  1. Built-In Algorithm: SageMaker에서 제공하는 이미지와 학습 알고리즘을 사용한다. 사용자는 입력 데이터를 모듈에 넣는 작업만 하면 된다.
  2. Supported Framework(ex. Tensorflow, Pytorch, SKLearn) 이미지 + Custom 학습 코드: SageMaker에서 텐서플로우, 파이토치 등의 주요 머신러닝 프레임워크를 갖춘 환경을 제공하고, 사용자는 학습 코드를 작성하여 그 위치를 명시한다.
  3. Custom 이미지 + Custom 학습 코드: 사용자가 이미지와 학습 코드 모두 직접 제작한다.
  4. Marketplace: 시중의 이미지와 학습 알고리즘을 구매한다.

Estimator 클래스

SageMaker에서 학습 컨테이너를 띄우기 위해서는 estimator 객체를 생성해야한다. 넓게 봐서 sagemaker.estimator.EstimatorBase를 상속하는 클래스를 estimator 클래스로 봐도 될 것 같다. Estimator 객체의 fit 메소드를 호출하면 s3에서 input data를 가져와 학습 코드를 수행하고 model artifact(학습된 모델 파일)들을 s3에 저장한다. input data의 s3 uri는 fit 메소드의 'inputs' 파라미터로 주면 된다. 

 

가장 기본적인 estimator 클래스는 sagemaker.estimator.Estimator다. 예시를 한번 보자.

 

import sagemaker

session = sagemaker.Session()
role = sagemaker.get_execution_role()
s3_input_location = 's3://bucket/path/to/input/data'
s3_output_location = 's3://bucktet/path/to/output/data'

trainer=sagemaker.estimator.Estimator(
    image_uri={이미지 ECR Uri},
    role=role
    instance_count=1,
    instance_type='ml.m4.xlarge',
    output_path=s3_output_location,
    session=session,
    git_config=None,
    entry_point='codes/train.py'
)

trainer.fit(s3_input_location)

 

sagemaker.estimator.Estimator 객체를 생성할 때 컨테이너가 사용할 인스턴스 타입과 그 개수를 명시할 수 있다. 위 예시에서는 'ml.m4.xlarge' 타입의 인스턴스를 1개 사용한다고 한다. 여기서 알 수 있는 것은 노트북과 별개로 학습 컨테이너가 사용할 인스턴스를 새로 지정하게 된다. 따라서 노트북 인스턴스에 굳이 비싼 인스턴스를 사용할 필요가 없다. 노트북 인스턴스로는 저렴한 t계열을 사용하고 학습 인스턴스로는 성능이 좋은 c계열(cpu)과 p계열(gpu)을 사용하는 것이 좋다. image_uri 파라미터에는 컨테이너 이미지의 ECR Uri를 넣어준다. output_path에는 학습된 모델 파일인 model artifact를 저장할 s3 uri를 명시한다.

entry_point 파라미터에 학습 코드의 위치를 명시할 수 있다. 학습 코드는 파이썬 스크립트나 shell script 둘 중 하나이어야 한다. 파이썬 스크립트일 경우 수행할 코드를 if __name__ == '__main__' 안에 넣는 것을 잊지 말자. git_config 파라미터가 None인 경우 SageMaker는 노트북이 위치한 디렉토리에서 스크립트를 찾고, git_config가 명시된 경우에는 fit 메소드가 호출될 때마다 원격 레포지토리를 클론한 다음 그 안에서 스크립트를 찾는다. git_config는 다음과 같은 형식을 같은 dictionary다.

 

git_config = {'repo': 'https://github.com/path/to/your/repository.git',
              'branch': 'master',
              'username': 'peaceatlast',
              'password': 'password'}

 

'repo'만이 필수 항목이다. Default branch는 master이다. 그리고 'commit'을 지정하여 특정 커밋을 체크아웃할 수 있다. 예시에서처럼 commit을 명시하지 않으면 가장 최신 커밋이 사용된다.

 

실행할 스크립트를 entry_point 파라미터로 주는 대신 그냥 도커 이미지에서 정의할 수 있다. 그 경우 entry_point=None으로 하고 도커 파일에 다음과 같은 코드가 필수적으로 있어야 한다.

 

FROM {기본 이미지}

COPY codes/train.py /opt/ml/code/train.py

RUN pip install sagemaker-training

ENV SAGEMAKER_PROGRAM train.py

 

컨테이너의 /opt/ml/code 디렉토리 안에 학습 스크립트 포함 학습에 필요한 모든 파일을 복사해야 한다. 그리고 SAGEMAKER_PROGRAM이라는 환경 변수를 /opt/ml/code 내에서 학습 파이썬/쉘 스크립트의 위치로 지정해야한다. 예시의 경우 학습 스크립트인 codes/train.py를 /opt/ml/code/train.py로 복사했기 때문에 train.py로 지정하면 된다. 이를 entry point로 인식하고 sagemaker 방식대로 학습이 수행되도록 하기 위해서 sagemaker-training 패키지를 설치해야한다. 그 외에도 학습에 필요한 라이브러리를 설치하도록 도커 파일에 명령하자.

 

사실 개발자들이 가장 많이 사용하는 방식은 SageMaker가 제공해주는 주요 프레임워크 기반의 컨테이너에 학습 스크립트를 얹는 것이다. 이를 위해 SKLearn, Tensorflow, PyTorch, MXNet estimator 등이 제공된다. 이들 estimator 클래스들은 객체 생성 시에 각 대표 framework를 지원하기 위한 환경을 알아서 세팅해주기 때문에 별도로 이미지 위치를 줄 필요가 없다. 개발자는 framework의 버전과 파이썬 버전을 명시하기만 하면 된다. 그 다음 마찬가지로 학습 스크립트의 위치를 entry_point 파라미터로 주게 된다. 만약에 추가적으로 필요한 라이브러리가 있으면 학습 스크립트와 같은 디렉토리에 위치한 requirements.txt 파일에 적어주면 된다.

 

import sagemaker

session = sagemaker.Session()
role = sagemaker.get_execution_role()
s3_input_location = 's3://bucket/path/to/input/data'
s3_output_location = 's3://bucktet/path/to/output/data'

trainer = sagemaker.tensorflow.TensorFlow(
    entry_point="codes/train.py",
    role=role,
    instance_count=1,
    instance_type="ml.p2.xlarge",
    framework_version="2.2",
    py_version="py37",
)

trainer.fit(s3_output_location)

 

 

Hyperparameters

Estimator 객체의 set_hyperparameters() 메소드를 호출하여 하이퍼파라미터 값을 지정할 수 있다. 이와 더불어 SageMaker에는 hyperparameter 튜닝을 지원해주는 서비스가 있다. 각 hyperparameter마다 범위를 지정해주면 범위 내에서 가장 좋은 값을 찾아준다.

 

1-4 Deploy & Manage (배포 & 관리)

학습이 완료되면 학습된 모델을 SageMaker 엔드포인트로 배포하게 된다. 컨테이너 이미지를 직접 만들어서 배포하기도 한다. 이 때 배포 타입은 다음과 같이 4가지가 있다.

  • 실시간 Hosting: 일반적인 서비스 배포 방식으로 컨테이너가 계속 작동 중이며 실시간으로 요청을 받는다.
  • 배치 변환: s3에서 input data를 받아서 inference 결과를 출력한다. 한 번 돌리고 배포가 끝난다.
  • 비동기 추론: 대용량 페이로드(최대 1기가)를 위한 배포 기법으로 최대 15분을 지원한다. 컴퓨터 비전, 자연어 처리에 대한 use case가 많다.
  • 서버리스 추론: 요청이 들어올 때만 hosting하는 배포 방식이다.

SageMaker는 모델 배포에 대하여 AutoScaling을 지원한다. 또한 여러 모델을 하나의 엔드포인트에 연결하는 멀티 모델 엔드포인트도 지원한다. 모델이 여러 개 있을 때 각 모델마다 다른 엔드포인트를 부여하면 과금이 많이 될 우려가 있기 때문에 멀티 모델 엔드포인트를 활용하면 좋다. Inference 요청이 들어오면 엔드포인트는 여러 모델 중 하나를 타겟팅한다. 특히 여러 모델 간의 A/B Testing을 하고 싶다면 멀티 모델 엔드포인트를 추천한다. 사용자가 원하는 비율로 트래픽을 나누어 로드 밸런싱을 하는 것도 가능하다.

엔드포인트가 생성되면 엔드포인트 url까지 생성된다. SageMaker 콘솔 창에서 엔드포인트 목록에 들어가 각 엔드포인트의 url을 확인할 수 있다. 이 url을 그대로 쓸 수 있지만 여러모로 불편하다. 우선 url 이름을 원하는대로 바꿀 수가 없고 인증을 추가할 수가 없기 때문에 대다수의 기업 정책에 맞지 않을 것이다. 그래서 Lambda 함수와 API Gateway를 앞단에 붙이는 경우가 많다. Lambda 함수를 이용하여 단순히 각 모델의 inference만 하는 것이 아니라 엔드포인트의 여러 모델들을 바탕으로 다양한 함수를 정의할 수 있다. SageMaker 엔드포인트, Lambda 함수와 API Gateway는 다음 포스트에서 더 자세히 다룰 예정이다. 

 

Amazon SageMaker Pipeline

머신러닝 워크플로우를 자동으로 수행하고 싶으면 SageMaker 파이프라인을 활용하면 된다. 개발자는 각 단계(job)를 정의하고 수행 순서를 설정하게 된다. 많은 경우 파이프라인은 데이터 수집 -> 데이터 처리 -> 모델 학습 -> 모델 등록 -> 모델 검증 -> 배포 또는 중지로 구성된다. 나머지 단계에 대해서는 위에서 충분히 다루었으니 모델 등록과 모델 검증에 대하여 설명하겠다.

SageMaker에서는 학습된 모델을 model registry에 등록할 수 있다. Model registry는 model artifact들의 버전을 관리하고 평가 지표를 저장하며 승인 절차를 지원한다. Data Scientist가 평가 지표를 확인하고 모델을 승인(approve)하면 비로소 모델이 배포된다. 승인되지 않은 모델은 배포되지 않는다.

 

SageMaker Pipeline과 Step Function

특이한 건 Amazon 서비스 중에 step function이라는 매우 유사한 서비스가 있다. Step function은 마찬가지로 서비스 오케스트레이션을 담당하는 서비스로 여러 컨테이너와 (Lambda) 함수들로 이루어진 워크플로우를 정의하고 수행할 수 있다. 병렬 처리 및 조건에 따른 branching이 가능하다. 참고로 step function에서는 각 단계를 state라고 부른다.

Step function에서 SageMaker job을 하나의 스테이트로 정의할 수 있다. 그렇기 때문에 SageMaker Pipeline에서 만든 파이프라인과 동일한 파이프라인을 step function으로 만드는 것이 가능하다

 

참고할 만한 사이트

대부분의 AWS 문서는 영어로 돼있기 때문에 이해하는데 어려움을 겪을 수 있다. 각종 AWS 머신러닝 예제들을 한글로 번역해놓은 사이트가 있으니 참고하면 좋을 것 같다.

 

GitHub - aws-samples/aws-ai-ml-workshop-kr: A collection of localized (Korean) AWS AI/ML workshop materials for hands-on labs.

A collection of localized (Korean) AWS AI/ML workshop materials for hands-on labs. - GitHub - aws-samples/aws-ai-ml-workshop-kr: A collection of localized (Korean) AWS AI/ML workshop materials for ...

github.com

그리고 블로그와 공식 문서를 읽다 보면 풀리지 않는 의문들이 새록새록 생겨나 답답함을 느끼게 될 수 있다. 그럴 때는 SageMaker Python SDK 코드를 읽는 것이 직빵이다.

 

 

GitHub - aws/sagemaker-python-sdk: A library for training and deploying machine learning models on Amazon SageMaker

A library for training and deploying machine learning models on Amazon SageMaker - GitHub - aws/sagemaker-python-sdk: A library for training and deploying machine learning models on Amazon SageMaker

github.com

 

 

 

'MLOps' 카테고리의 다른 글

AWS Serverless 2편  (1) 2023.01.05
AWS Serverless 1편  (0) 2023.01.02
Multi-Armed Bandit with Seldon Core  (0) 2022.02.20
Ensemble with Seldon Core  (0) 2022.02.19
셀던 코어와 텐서플로우 서빙  (0) 2022.02.07