BLOG

AWS 내부 유스케이스: AWS 마케팅 내부적으로 Amazon SageMaker 도입 및 평가하기
작성일: 2018-07-03

저희는 AWS 마케팅 데이터 사이언스 팀입니다. 저희는 고급 분석 및 기계 학습 (ML) 기술을 사용하여 영업 리드의 ML 중심 점수, ML 기반 타겟팅 세그먼트 및 다운스트림 영향 측정을 위한 계량 경제 모델과 같은 AWS 고객 라이프사이클 전반에 걸친 비즈니스 문제에 대한 통찰력을 공유합니다.

 

Amazon 내에서 각 팀은 독립적으로 운영되며 자체 기술 스택을 선택하는 방법과 고객이 사용할 수있는 AWS 서비스를 채택하는 방법에 대한 의사 결정을 소유합니다. 이를 통해 각 팀은 자체 로드맵을 관리할 수 ​​있습니다. 이는 ML 과정에서 초기 단계에 있는 고객이 따라갈 수 있으므로 서비스 평가 및 채택을 위한 유사한 경로로 이어집니다. 이 블로그는 Amazon SageMaker 서비스를 평가하는 첫 번째 단계를 문서화하고 다른 분들이 동일한 프로세스를 진행하는 데 도움이 되기를 바라며 쓰여졌습니다. 저희는 여정 및 AWS 서비스를 활용하여 비즈니스 목표를 달성하고 ML 모델을 확장하는 방법에 대한 최신 정보를 지속적으로 제공 할 것입니다.

 

이 블로그 게시물에서는 Amazon SageMaker를 사용하여 자체 ML 교육 / 호스팅 인프라를 대체하기 위해 POC (proof of concept)를 수행한 경험을 공유합니다. 기존의 ML 인프라는 데이터 처리 파이프라인을 관리하는 Amazon 내부 워크플로우 도구와 모델을 구축, 훈련 및 호스팅하는 Amazon EC2 인스턴스로 구성됩니다. 우리는 이 인프라를 관리하는 데 많은 시간을 할애하였기 때문에 Amazon SageMaker 서비스를 탐색하게 되었습니다.

 

이 POC는 인프라 작업 및 운영상의 복잡성을 최소화하는 데 도움이 되는 Amazon SageMaker의 기능을 탐색합니다. 저희는 세 가지 주요 작업 흐름을 확인했습니다.

 

  1. AWS IT 보안 팀과 협력하여 데이터 보안 및 제어를 식별 및 구현
  2. “자신의 알고리즘 가져 오기”기능을 사용하여 Amazon SageMaker에서 기존 ML 모델 중 하나를 마이그레이션 및 호스팅 (유스케이스 1)
  3. 내장형 Amazon SageMaker 알고리즘을 사용하여 동일한 ML 모델 훈련 및 호스팅 (유스케이스 2)

 

이 블로그 게시물에서는 세 가지 작업 스트림에 대해 자세히 설명합니다.

 

AWS IT 보안 팀과 협력하여 데이터 보안 및 제어 식별 및 구현

 

저희는 AWS IT 보안 팀과 협력하여 다양한 위협을 식별하고 실제 데이터로 모델을 구축하고 훈련하기 전에 개발 환경에 필요한 보안 제어를 구현했습니다. 다음은 AWS IT 보안 팀의 승인을 받기 위해 구현한 주요 보안 제어입니다.

 

사용자, 역할 및 암호화 키 설정 : 모델 훈련을 위해 Amazon S3에 데이터를 보관해야 했습니다. Amazon S3 버킷에서 데이터 암호화를 위해 AWS KMS 관리 키 (SSE-KMS)를 사용하여 서버 측 암호화를 구현했습니다.

다음은 설정 단계입니다.

 

  1. (다른 것들 중에서) AmazonSageMakerFullAccess 정책이 있는 IAM 사용자 (poc-sagemaker-iam-user2) 생성
  2. AmazonSageMakerFullAccess를 기반으로 IAM 역할 (poc-sagemaker-iam-role) 생성
  3. s3-smcmk라는 암호화 키를 생성하고 IAM 사용자와 역할이 키를 사용할 수있게 하십시오. 이를 통해 poc-sagemaker-iam-role을 사용하는 Amazon SageMaker 훈련 작업에서 키를 사용하여 훈련 데이터를 읽을 수 있습니다.
  4. 동일한 IAM 역할 및 암호화 키를 사용하여 Amazon SageMaker 노트북 인스턴스를 생성하여 노트북 인스턴스가 데이터에 대한 읽기 액세스 권한을 가지며 로컬 스토리지를 암호화합니다.

 

IAM 사용자, 역할 및 암호화 키를 설정하면 사용자 / 역할만 S3 버킷 액세스 정책 설정과 상관없이 암호화 키를 사용하여 훈련 데이터를 읽을 수 있습니다.

 

자격 증명 보안 : AWS 계정 액세스 ID, 비밀 ID 및 비밀번호와 같은 모든 보안 자격 증명을 비밀 저장소에 저장했습니다. 자격 증명은 구성 파일이나 소스 코드에 저장하면 안됩니다. 최근에 시작된 AWS Secrets Manager 서비스를 사용하여 자격 증명 및 키를 저장할 수 있습니다.

 

데이터 준비

 

Amazon SageMaker의 모델 훈련을 위해 Amazon S3에서 사전 처리된 데이터를 사용할 수 있도록 결정했습니다. SSE-KMS 암호화 옵션을 사용하는 poc-sagemaker-iam-user2 user를 사용하여 S3 버킷을 생성하고 보안 제어 설정 중에 생성된 s3-smcmk 암호화 키를 사용했습니다. 우리는 s3-smcmkpoc-sagemaker-iam-user2poc-sagemaker-iam-role에서 모두 사용할 수 있도록 구성했습니다. 누가 데이터에 액세스 할 수 있는지를 확인/ 제어 할 수 있는 중앙 로케이션을 제공하기 때문입니다.

 

저희는 Amazon RedShift 데이터 웨어하우스 (DW) 클러스터에서 모델 훈련 데이터를 사전 처리하고 훈련, 검증 및 테스트 데이터셋이 있는 3 개의 DW 테이블을 생성했습니다. Amazon RedShift는 SQL 문장을 실행하고 결과 데이터를 S3 버킷에 저장하는 기능을 제공합니다. 이를 위해 “Unload” 명령을 사용하여 미리 구성된 S3 버킷에 데이터를 로드할 수 있습니다. Unload 명령에 대한 자세한 내용은 여기에 있으며 데이터에 액세스하는 인증 매개 변수에 대한 자세한 내용은 여기에 있습니다. 사전 처리된 데이터셋을 S3에 언로드하는 데 사용한 SQL 문장은 다음과 같습니다.

 

UNLOAD(‘<put your select statement here>’)

to ‘<put the full location path of Amazon S3 bucket for the output file>’

ACCESS_KEY_ID ‘<we used poc-sagemaker-iam-user2 Access Key here>’

SECRET_ACCESS_KEY ‘<we used poc-sagemaker-iam-user2 Secret Key here>’

KMS_KEY_ID ‘<we used keyid of s3-smcmk here>’

DELIMITER AS ‘,’ NULL AS ” ENCRYPTED ALLOWOVERWRITE PARALLEL OFF

 

데이터 볼륨이 작으면 다른 방법으로 Amazon SageMaker 노트북 인스턴스를 사용하여 데이터 소스에서 직접 데이터를 메모리로 로드하고 데이터를 훈련, 입증, 및 테스트 데이터셋으로 분할한 다음 S3 버킷에 세 가지 데이터셋을 모두 저장하십시오. 이 경우 데이터 볼륨을 처리하는 데 필요한 자원 (CPU, 디스크, 메모리)이 있는 노트북 인스턴스 유형을 선택해야합니다.이 SQL 명령은 설명을 위한 것입니다. poc-sagemaker-iam-user2 권한을 사용하여 데이터 및 s3-smcmk 키를 언로드하여 Amazon S3에서 언로드된 데이터를 암호화합니다. 확실한 보안상의 이유로 코드에서 액세스 및 비밀 키를 하드 코딩하거나 일반 텍스트 구성 파일에서 읽지 않았습니다. 대신, 우리는 그 열쇠를 비밀 금고에 보관했습니다. AWS Secrets Manager를 사용하여 이를 수행 할 수 있습니다. 저희는 이러한 비밀을 프로그래밍 방식으로 액세스하여 런타임에 SQL 명령을 생성했습니다. SQL 명령을 생성하는 동안 결과 데이터셋의 첫 번째 열은 종속 변수이고 나머지 열은 독립 변수입니다. 이것은 평가에 사용된 내장 SageMaker XGBoost 알고리즘에 필요한 특정 형식입니다.

 

Amazon SageMaker 노트북 인스턴스 실행

 

“자신의 알고리즘 가져오기”(유스케이스 1) 또는 내장 알고리즘 (유스케이스 2)을 탐색하기 위한 첫 번째 단계는 모델 구축, 훈련 및 호스팅을 위해 이 단계를 사용하여 Amazon SageMaker 노트북 인스턴스를 생성하는 것입니다. 노트북 인스턴스를 생성할 때 IAM 역할 poc-sagemaker-iam-role s3-smcmk 암호화 키를 사용했습니다.

 

그런 다음 Amazon SageMaker 관리 인프라에서 ML 모델을 훈련하고 호스팅하기 위한 POC 유스 케이스 코드를 작성하고 실행했습니다. 훈련 단계에 대한 자세한 문서는 여기에서 볼 수 있습니다.

 

POC 유스 케이스 1 : Amazon SageMaker “자신의 알고리즘 가져오기” 기능 사용하기

 

이 유스 케이스의 경우 ML 모델 훈련 및 추론을 위해 R 코드를 다시 사용했습니다. 자신의 알고리즘 가져오기 기능을 사용하여 해당 코드를 Amazon SageMaker로 마이그레이션했습니다. 마이그레이션을 완료하기 위해 다음 단계를 수행했습니다.

 

  • R 환경에서 Docker 이미지를 준비하고 모델에 필요한 R 라이브러리를 설치했습니다. R 환경에서 Docker 이미지를 구축하는 샘플 Dockerfile을 여기에서 사용할 수 있습니다. 기본 Ubuntu 저장소를 사용하는 대신 R의 최신 버전, 관련 종속 패키지 및 CRAN 저장소에서의 XGBoost 라이브러리를  설치하도록 Dockerfile을 사용자 정의했습니다. 이것은 모델이 Ubuntu 저장소에서 사용 가능한 것보다 최신 버전의 R이 필요한 XGBoost 라이브러리를 사용하기 때문에 필요했습니다. Dockerfile에 다음 두 줄의 코드를 추가하여 이를 수행했습니다.

 

RUN echo “deb http://cloud.r-project.org/bin/linux/ubuntu xenial/” >> /etc/apt/sources.list

RUN R -e “install.packages(c(‘xgboost’,’caret’,’e1071′,’plumber’),repos=’https://cloud.r-project.org’)”

 

코드의 첫 번째 줄은 Dockerfile의 첫 번째 RUN 명령어를 필요로 합니다. 이렇게 하면 후속 RUN 명령을 통해 Ubuntu 저장소 대신 CRAN 저장소에서 R 환경을 설치할 수 있습니다.

 

  • 그런 다음 R 코드를 Docker 이미지에 통합했습니다. 필요한 단계를 보여주는 이 예제를 참조할 수 있습니다. 요약하자면 훈련 코드를 사용하여 mars.R의 훈련 함수와 추론 코드를 사용하여 Plumber.R의 호출 함수를 업데이트했습니다.
  • Docker 이미지를 로컬 컴퓨터에서 테스트했습니다. 먼저 Amazon SageMaker가 훈련 중에 Docker 컨테이너에서 사용할 수 있도록 하는 폴더 구조 (그림 1)를 만들었습니다. 우리는 이 폴더에 교육 및 검증 데이터셋 및 하이퍼 매개 변수 구성 파일을 채웁니다.

 

 

Figure 1 : 로컬 Docker Image 테스트를 위한 폴더 구조. 자세한 정보를 위해서는 여기를 참조하십시오.

 

그런 다음 Docker 컨테이너를 시작하고 이 폴더 구조를 Docker 파일 시스템에 탑재했습니다. 로컬 테스트를 위해 훈련 모드에서 Docker 컨테이너를 시작하기 위해 다음 명령을 사용했습니다.

 

docker run v $(pwd)/ml:/opt/ml t {image name} train

 

또한 R 코드를 변경하여 탑재된 폴더 구조에서 훈련 / 유효성 검사 데이터셋 및 하이퍼 매개 변수 구성을 읽습니다. 이를 통해 Amazon SageMaker에서 Docker 컨테이너가 호출될 때 파일시스템을 시뮬레이션 할 수 있었습니다.

 

  • Docker 이미지가 의도한대로 작동한 후 Docker 이미지를 구축하여 Amazon Elastic Container 저장소 (Amazon ECR)에 푸시했습니다. 자세한 명령은 여기에 있는 샘플 스크립트를 참조하십시오.
  • 그런 다음 Amazon SageMaker 노트북 인스턴스를 사용하여 게시된 Docker 이미지와 Amazon S3 버킷의 훈련 / 유효성 검사 데이터셋을 사용하도록 구성된 훈련 작업을 시작했습니다. 훈련이 끝나면 모델 생성,엔드포인트 구성, 마지막으로 엔드포인트 모델을 호스트했습니다. 우리는 테스트 데이터셋에 대한 추론을 생성하기 위해 엔드포인트를 사용했습니다. 자세한 단계는 여기에서 사용할 수 있는 예제를 참조하십시오.

 

다음은 SageMaker를 처음 사용하는 경우의 장단점이 나열되어 있습니다.

 

장점

  • 모델 훈련 및 추론을 위해 기존 코드를 재사용 할 수 있습니다.
  • 마이그레이션 프로세스를 보다 쉽게 수행할 수 있는 훌륭한 문서 및 샘플 코드

 

단점

  • Amazon ECR에서 자신의 Docker 이미지를 생성하고 유지 관리하면 운영상의 어려움이 발생합니다.
  • Amazon SageMaker 호스트 모델 엔드 포인트는 실시간 추론을 위해 호출당 최대 5MB를 수용 할 수 있습니다. 배치 추론을 위한 추가 코드가 필요합니다 (이후 섹션에서 설명).
  • 팀은 Docker 이미지를 구축하고 ECR, 로컬 테스트 등에 저장하는 것과 같은 일부 플랫폼 기술을 배워야 할 수도 있습니다.

 

POC 유스케이스 2 : 내장형 Amazon SageMaker 알고리즘 사용하기

 

이 유스 케이스의 경우, 우리의 동기는 고유의 Docker 이미지를 구축하고 관리하는 부담을 제거하는 것이었습니다. 따라서 자체 제작된 Docker 이미지 (첫 번째 POC 유스 케이스에서 설명한대로) 대신 Amazon SageMaker에서 관리하는 Docker 이미지를 사용하여 XGBoost 알고리즘을 사용하여 ML 모델을 훈련하고 호스팅했습니다.

 

내장된 SageMaker 알고리즘을 사용하기 위해 우리는 훈련 및 추론 과정에서 SageMaker가 관리하는 Docker 이미지를 XGBoost에 사용했습니다. 필요한 단계를 보여주는 이 예제를 참조 할 수 있습니다. 내장형 SageMaker XGBoost 알고리즘은 단일 또는 다중 인스턴스에서 훈련할 수 있습니다. 훈련 매개 변수의 “ResourceConfig : InstanceCount” 값을 변경하여 분산된 훈련을 활성화했습니다. 다음은 분산형 훈련을 위한 구성 snippet 입니다.

 

 

다음은 두 번째 유스 케이스에 SageMaker를 사용하는 장단점이 나열되어 있습니다.

 

장점

  • 훈련 및 추론 Docker 이미지를 유지하는 미분화된 노력을 줄입니다. 따라서 모델 배포 및 유지 관리의 운영상의 복잡성이 줄어듭니다.
  • 내장형 Amazon SageMaker XGBoost 알고리즘을 사용하면 분산 환경에서 훈련할 수 있습니다.

 

단점

  • SageMaker 호스트 모델 엔드포인트는 실시간 추론을 위해 호출당 최대 5MB를 수용 할 수 있습니다. 배치 추론을 위한 추가 코드가 필요합니다 (이후 섹션에서 설명).

 

배치 추론을 위해 Amazon SageMaker  엔드포인트 사용하기

 

Amazon SageMaker에는 SageMaker에서 호스팅되는 모델의 추론을 가져오는데 사용되는 “InvokeEndpoint”라는 API 작업이 있습니다. HTTP POST 호출을 통해 이 API를 호출하고 HTTP 본문에서 유추가 예상되는 데이터를 제공했습니다. 호출당 최대 5MB의 데이터를 전송할 수 있으며 호출 자체가 차단됩니다. 우리의 유스 케이스는 데이터 볼륨이 5MB 이상인 배치 추론에 사용되었습니다. 그래서 우리는 InvokeEndpoint API 액션을 통해 모든 데이터를 보낼 수 없었습니다. 배치 추론을 위해 Amazon S3에서 메모리로 추론한 데이터를 읽고 5MB 미만의 청크로 분할하여 InvokeEndpoint를 반복 호출합니다. 우리는 chunk-wise 추론을 얻기 위해 다음 코드를 사용했습니다.

 

#Read complete file from S3

body_raw=s3.get_object(Bucket=bucket,Key=data_fn)[‘Body’].read()

 

#Alternatively, if your data file is large, read by chunks

# body_raw=s3.get_object(Bucket=bucket,Key=data_fn,Range=”bytes=0-500″)[‘Body’].read()

 

#Convert data to bytes

data=io.BytesIO(body_raw)

 

#Split the data read into chunksize. For our dataset chunksize=3000 ensured that HTTP #POST body size will be less than 5MB. Correct chunksize depends on the dataset.

for chunk_df in pd.read_csv(data, chunksize=chunksize,header=None):

       #chunk_df contains a chunk of data

       #convert the chunk into CSV format

csv_str=chunk_df.to_csv(None,header=False,index=False)

 

#Send the csv chunk to SageMaker hosted model Endpoint (endpoint_name)

#content_type is ‘text/csv’

response = runtime.invoke_endpoint(EndpointName=endpoint_name,

                                         ContentType=content_type,

                                         Body=csv_str)

 

#response is available in json format. Read and decode it.

result = response[‘Body’].read().decode(‘ascii’)

 

결론

이 블로그 게시물에서는 3 가지 작업 스트림을 통해 Amazon SageMaker의 기능을 ML 플랫폼 요구 사항에 맞추어 탐색한 경험을  공유하였습니다. 아래는 저희가 배운 점들입니다.

 

  • Amazon SageMaker는 ML 플랫폼을 관리하는 노력을 크게 줄여주므로 팀은 차별화되지 않은 플랫폼 관리를 수행하는 대신 모델 구축 및 테스트에 더 많은 시간을 할애할 수 있습니다.
  • Amazon SageMaker의 분산형 훈련 기능은 ML 모델을 대규모로 훈련할 수있게 해주는 주요 기능이라는 것을 알았습니다.
  • Amazon SageMaker는 모델이 HTTP 엔드 포인트로 호스트되기 때문에 서비스 지향 아키텍쳐에서 모델을 보다 쉽게 통합 할 수 있습니다.

 

결국 이러한 경험들에 비추어 현재와 미래의 모든 ML 플랫폼 요구 사항에 대해 가까운 시일 내에 Amazon SageMaker로 마이그레이션하기로 결정했습니다.

 

자료

 

AWS Secrets Manager 시작하기

Amazon Redshift  문서 언로드하기

데이터 액세스를 위한 Amazon Redshift 권한 부여 매개 변수

Amazon SageMaker 노트북 인스턴스 생성하기

Amazon SageMaker 내의 훈련 작업 생성하기

알고리즘 컨테이너 구축 및 테스트하기

R 환경에서 Docker 이미지를 구축하기 위한 샘플 DockerFile

Docker 이미지를 구축해 Amazon ECR에 푸시하는 샘플 스크립트

Amazon SageMaker 내의 R 알고리즘 가져오기 구현하기

Amazon SageMaker XGBoost 알고리즘 사용하기

 

원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/aws-internal-use-case-evaluating-and-adopting-amazon-sagemaker-within-aws-marketing/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.