Amazon에서 사용자 지정 GPU 지원 ML 모델을 트레이닝하고 배포하기 SageMaker - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon에서 사용자 지정 GPU 지원 ML 모델을 트레이닝하고 배포하기 SageMaker

작성자: Ankur Shukla(AWS)

환경: PoC 또는 파일럿

기술: 기계 학습 및 AI, 컨테이너 및 마이크로서비스

AWS 서비스: 아마존 ECS, 아마존 SageMaker

요약

그래픽 처리 장치(GPU) 지원 기계 학습(ML) 모델을 교육 및 배포하려면 NVIDIA GPU의 이점을 완전히 활용하기 위해 특정 환경 변수를 초기 설정하고 초기화해야 합니다. 하지만 환경을 설정하고 Amazon Web Services (AWS) 클라우드의 Amazon SageMaker 아키텍처와 호환되도록 하려면 시간이 많이 걸릴 수 있습니다.

이 패턴은 Amazon을 사용하여 사용자 지정 GPU 지원 ML 모델을 학습하고 구축하는 데 도움이 됩니다. SageMaker 오픈 소스 Amazon 리뷰 데이터 세트를 기반으로 구축된 사용자 지정 CatBoost 모델을 교육하고 배포하는 단계를 제공합니다. 그런 다음 p3.16xlarge Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 성능을 벤치마킹할 수 있습니다.

이 패턴은 조직에서 기존 GPU 지원 ML 모델을 배포하려는 경우에 유용합니다. SageMaker 데이터 사이언티스트는 이 패턴의 단계에 따라 NVIDIA GPU 지원 컨테이너를 만들고 해당 컨테이너에 ML 모델을 배포할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정.

  • 모델 아티팩트 및 예측을 저장하기 위한 Amazon Simple Storage Service(S3) 소스 버킷.

  • SageMaker 노트북 인스턴스와 Jupyter 노트북에 대한 이해

  • 기본 SageMaker 역할 권한, S3 버킷 액세스 및 업데이트 권한, Amazon Elastic Container Registry (Amazon ECR) 에 대한 추가 권한을 포함하는 AWS ID 및 액세스 관리 (IAM) 역할을 생성하는 방법을 이해해야 합니다.

제한 사항

  • 이 패턴은 Python으로 작성된 학습 및 배포 코드를 사용하는 감독형 ML 워크로드를 위한 것입니다.

아키텍처

를 사용하여 사용자 지정 GPU 지원 ML 모델을 교육 및 구축하는 워크플로. SageMaker

기술 스택

  • SageMaker

  • Amazon ECR

도구

도구

  • Amazon ECR – Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장 가능하고 신뢰할 수 있는 AWS 관리형 컨테이너 이미지 레지스트리 서비스입니다.

  • Amazon SageMaker — SageMaker 완전 관리형 ML 서비스입니다.

  • Docker-Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포하기 위한 소프트웨어 플랫폼입니다.

  • Python-파이썬은 프로그래밍 언어입니다.

code

이 패턴의 코드는 Catboost 및 SageMaker 리포지토리를 사용한 리뷰 분류 모델 GitHub 구현에서 확인할 수 있습니다.

에픽

작업설명필요한 기술

IAM 역할을 생성하고 필요한 정책을 연결합니다.

AWS Management Console에 로그인하여 IAM 콘솔을 열고 새로운 IAM 역할을 생성합니다. 다음 정책을 IAM 역할에 연결합니다. 

  • AmazonEC2ContainerRegistryFullAccess

  • AmazonS3FullAccess

  • AmazonSageMakerFullAccess

이에 대한 자세한 내용은 Amazon SageMaker 설명서의 노트북 인스턴스 생성을 참조하십시오.

데이터 사이언티스트

SageMaker 노트북 인스턴스를 생성하십시오.

SageMaker 콘솔을 열고 Notebook 인스턴스를 선택한 다음 노트북 인스턴스 만들기를 선택합니다. IAM 역할에는 앞에서 생성한 IAM 역할을 선택합니다. 요구 사항에 따라 노트북 인스턴스를 구성한 다음 노트북 인스턴스 생성을 선택합니다.

자세한 단계 및 지침은 Amazon SageMaker 설명서의 노트북 인스턴스 생성을 참조하십시오.

데이터 사이언티스트

리포지토리를 복제합니다.

SageMaker 노트북 인스턴스에서 터미널을 열고 다음 명령을 실행하여 Catboost 및 SageMaker 리포지토리로 리뷰 분류 모델 GitHub 구현을 복제합니다.

git clone https://github.com/aws-samples/review-classification-using-catboost-sagemaker.git

Jupyter Notebook을 시작합니다.

사전 정의된 단계가 포함된 Review classification model with Catboost and SageMaker.ipynb Jupyter Notebook을 시작합니다.

데이터 사이언티스트
작업설명필요한 기술

Jupyter Notebook에서 명령을 실행합니다.

Jupyter Notebook을 열고 다음 스토리에서 명령을 실행하여 ML 모델 학습에 필요한 데이터를 준비합니다.

데이터 사이언티스트

S3 버킷에서 데이터를 읽습니다.

import pandas as pd import csv fname = 's3://amazon-reviews-pds/tsv/amazon_reviews_us_Digital_Video_Download_v1_00.tsv.gz' df = pd.read_csv(fname,sep='\t',delimiter='\t',error_bad_lines=False)
데이터 사이언티스트

데이터를 전처리합니다.

import numpy as np def pre_process(df): df.fillna(value={'review_body': '', 'review_headline': ''}, inplace=True) df.fillna( value={'verified_purchase': 'Unk'}, inplace=True) df.fillna(0, inplace=True) return df df = pre_process(df) df.review_date = pd.to_datetime(df.review_date) df['target'] = np.where(df['star_rating']>=4,1,0)

참고: 이 코드는 'review_body'의 null 값을 빈 문자열로 바꾸고 'verified_purchase' 열을 “알 수 없음”을 의미하는 'Unk' 문자열로 바꿉니다.

 

데이터 사이언티스트

데이터를 훈련, 검증, 테스트 데이터 세트로 분할합니다.

대상 레이블의 분포를 분할된 집합에서 동일하게 유지하려면 scikit-learn 라이브러리를 사용하여 샘플링을 계층화해야 합니다.

from sklearn.model_selection import StratifiedShuffleSplit sss = StratifiedShuffleSplit(n_splits=2, test_size=0.10, random_state=0) sss.get_n_splits(df, df['target']) for train_index, test_index in sss.split(df, df['target']): X_train_vallid , X_test = df.iloc[train_index], df.iloc[test_index] sss.get_n_splits(X_train_vallid, X_train_vallid['target']) for train_index, test_index in sss.split(X_train_vallid, X_train_vallid['target']): X_train , X_valid = X_train_vallid.iloc[train_index], X_train_vallid.iloc[test_index]
데이터 사이언티스트
작업설명필요한 기술

Docker 이미지를 준비하고 푸시합니다.

Jupyter Notebook에서 다음 스토리의 명령을 실행하여 Docker 이미지를 준비하고 Amazon ECR로 푸시합니다.

ML 엔지니어

Amazon ECR 리포지토리를 생성합니다.

%%sh algorithm_name=sagemaker-catboost-github-gpu-img chmod +x code/train chmod +x code/serve account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-east-1} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" aws ecr create-repository --repository-name "${algorithm_name}" > /dev/nul
ML 엔지니어

Docker 이미지를 로컬로 구축합니다.

docker build -t "${algorithm_name}" . docker tag ${algorithm_name} ${fullname}
ML 엔지니어

Docker 이미지를 실행하고 Amazon ECR에 푸시합니다.

docker push ${fullname}
ML 엔지니어
작업설명필요한 기술

SageMaker 하이퍼파라미터 조정 작업을 생성합니다.

Jupyter 노트북에서 다음 스토리의 명령을 실행하여 Docker 이미지를 사용하여 SageMaker 하이퍼파라미터 조정 작업을 생성합니다.

데이터 사이언티스트

추정기를 만드세요. SageMaker

Docker 이미지 이름을 사용하여 SageMaker 추정기를 생성합니다.

import sagemaker as sage from time import gmtime, strftime sess = sage.Session() from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter, HyperparameterTuner account = sess.boto_session.client('sts').get_caller_identity()['Account'] region = sess.boto_session.region_name image = '{}.dkr.ecr.{}.amazonaws.com/sagemaker-catboost-github-gpu-img:latest'.format(account, region) tree_hpo = sage.estimator.Estimator(image, role, 1, 'ml.p3.16xlarge', train_volume_size = 100, output_path="s3://{}/sagemaker/DEMO-GPU-Catboost/output".format(bucket), sagemaker_session=sess)
데이터 사이언티스트

HPO 작업을 생성합니다.

파라미터 범위를 사용하여 하이퍼파라미터 최적화(HPO) 미세 조정 작업을 생성하고 훈련 세트와 검증 세트를 파라미터로 함수에 전달합니다.

hyperparameter_ranges = {'iterations': IntegerParameter(80000, 130000), 'max_depth': IntegerParameter(6, 10), 'max_ctr_complexity': IntegerParameter(4, 10), 'learning_rate': ContinuousParameter(0.01, 0.5)} objective_metric_name = 'auc' metric_definitions = [{'Name': 'auc', 'Regex': 'auc: ([0-9\\.]+)'}] tuner = HyperparameterTuner(tree_hpo, objective_metric_name, hyperparameter_ranges, metric_definitions, objective_type='Maximize', max_jobs=50, max_parallel_jobs=2)
데이터 사이언티스트

HPO 작업을 실행합니다.

train_location = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/train/' valid_location = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/valid/' tuner.fit({'train': train_location, 'validation': valid_location })
데이터 사이언티스트

가장 성과가 좋은 훈련 작업을 받습니다.

import sagemaker as sage from time import gmtime, strftime sess = sage.Session() best_job =tuner.best_training_job()
데이터 사이언티스트
작업설명필요한 기술

모델 예측을 위해 테스트 데이터에 대한 SageMaker 일괄 변환 작업을 생성합니다.

Jupyter 노트북에서 다음 스토리의 명령을 실행하여 SageMaker 하이퍼파라미터 조정 작업에서 모델을 만들고 모델 예측을 위해 테스트 데이터에 대한 SageMaker 일괄 변환 작업을 제출하십시오.

데이터 사이언티스트

모델을 생성하세요. SageMaker

최적의 교육 작업을 사용하여 SageMaker 모델 내에서 모델을 생성하십시오.

attached_estimator = sage.estimator.Estimator.attach(best_job) output_path ='s3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test-predictions/' input_path ='s3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test/' transformer = attached_estimator.transformer(instance_count=1, instance_type='ml.p3.16xlarge', assemble_with='Line', accept='text/csv', max_payload=1, output_path=output_path, env = {'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '3600' })
데이터 사이언티스트

배치 변환 작업을 생성합니다.

테스트 데이터 세트에 배치 변환 작업을 생성합니다.

transformer.transform(input_path, content_type='text/csv', split_type='Line')
데이터 사이언티스트
작업설명필요한 기술

결과를 읽고 모델의 성능을 평가합니다.

Jupyter Notebook에서 다음 스토리의 명령을 실행하여 결과를 읽고 ROC 곡선 아래 영역(ROC-AUC) 및 정밀도 재현율 곡선 아래 영역(PR-AUC) 모델 지표에서 모델의 성능을 평가합니다.

이에 대한 자세한 내용은 Amazon Machine Learning(Amazon ML) 설명서의 Amazon Machine Learning 주요 개념을 참조하세요.

데이터 사이언티스트

배치 변환 작업 결과를 읽습니다.

배치 변환 작업 결과를 데이터 프레임으로 읽습니다.

file_name = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test-predictions/file_1.out' results = pd.read_csv(file_name, names=['review_id','target','score'] ,sep='\t',escapechar ='\\' , quoting=csv.QUOTE_NONE, lineterminator='\n',quotechar='"').dropna()
데이터 사이언티스트

성능 지표를 평가합니다.

ROC-AUC 및 PR-AUC에서 모델의 성능을 평가합니다.

from sklearn import metrics import matplotlib import pandas as pd matplotlib.use('agg', warn=False, force=True) from matplotlib import pyplot as plt %matplotlib inline def analyze_results(labels, predictions): precision, recall, thresholds = metrics.precision_recall_curve(labels, predictions) auc = metrics.auc(recall, precision) fpr, tpr, _ = metrics.roc_curve(labels, predictions) roc_auc_score = metrics.roc_auc_score(labels, predictions) print('Neural-Nets: ROC auc=%.3f' % ( roc_auc_score)) plt.plot(fpr, tpr, label="data 1, auc=" + str(roc_auc_score)) plt.xlabel('1-Specificity') plt.ylabel('Sensitivity') plt.legend(loc=4) plt.show() lr_precision, lr_recall, _ = metrics.precision_recall_curve(labels, predictions) lr_auc = metrics.auc(lr_recall, lr_precision) # summarize scores print('Neural-Nets: PR auc=%.3f' % ( lr_auc)) # plot the precision-recall curves no_skill = len(labels[labels==1.0]) / len(labels) plt.plot([0, 1], [no_skill, no_skill], linestyle='--', label='No Skill') plt.plot(lr_recall, lr_precision, marker='.', label='Neural-Nets') # axis labels plt.xlabel('Recall') plt.ylabel('Precision') # show the legend plt.legend() # show the plot plt.show() return auc analyze_results(results['target'].values,results['score'].values)
데이터 사이언티스트

관련 리소스

추가 정보

다음 목록은 Docker 이미지를 Amazon ECR로 빌드, 실행 및 푸시 에픽에서 실행되는 Dockerfile의 다양한 요소를 보여줍니다.

aws-cli를 사용하여 Python을 설치합니다.

FROM amazonlinux:1 RUN yum update -y && yum install -y python36 python36-devel python36-libs python36-tools python36-pip && \ yum install gcc tar make wget util-linux kmod man sudo git -y && \ yum install wget -y && \ yum install aws-cli -y && \ yum install nginx -y && \ yum install gcc-c++.noarch -y && yum clean all

Python 패키지를 설치합니다.

RUN pip-3.6 install --no-cache-dir --upgrade pip && \pip3 install --no-cache-dir --upgrade setuptools && \ pip3 install Cython && \ pip3 install --no-cache-dir numpy==1.16.0 scipy==1.4.1 scikit-learn==0.20.3 pandas==0.24.2 \ flask gevent gunicorn boto3 s3fs matplotlib joblib catboost==0.20.2

CUDA 및 CuDNN을 설치합니다.

RUN wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run \ && chmod u+x cuda_9.0.176_384.81_linux-run \ && ./cuda_9.0.176_384.81_linux-run --tmpdir=/data --silent --toolkit --override \ && wget https://custom-gpu-sagemaker-image.s3.amazonaws.com/installation/cudnn-9.0-linux-x64-v7.tgz \ && tar -xvzf cudnn-9.0-linux-x64-v7.tgz \ && cp /data/cuda/include/cudnn.h /usr/local/cuda/include \ && cp /data/cuda/lib64/libcudnn* /usr/local/cuda/lib64 \ && chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn* \ && rm -rf /data/*

에 필요한 디렉터리 구조를 생성하십시오. SageMaker

RUN mkdir /opt/ml /opt/ml/input /opt/ml/input/config /opt/ml/input/data /opt/ml/input/data/training /opt/ml/model /opt/ml/output /opt/program

NVIDIA 환경 변수를 설정합니다.

ENV PYTHONPATH=/opt/program ENV PYTHONUNBUFFERED=TRUE ENV PYTHONDONTWRITEBYTECODE=TRUE ENV PATH="/opt/program:${PATH}" # Set NVIDIA mount environments ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:$LD_LIBRARY_PATH ENV NVIDIA_VISIBLE_DEVICES="all" ENV NVIDIA_DRIVER_CAPABILITIES="compute,utility" ENV NVIDIA_REQUIRE_CUDA "cuda>=9.0"

훈련 및 추론 파일을 Docker 이미지에 복사합니다.

COPY code/* /opt/program/ WORKDIR /opt/program