BLOG

Amazon SageMaker을 사용하여 더 신속하게 대용량 주성분 분석을 수행하세요.
작성일: 2018-06-04

이번 블로그 게시물에서는 고차원 데이터세트에 Amazon SageMaker, Spark ML 및 Scikit-Learn를 사용하여 PCA에 대한 성능 비교를 할 것입니다. SageMaker는 지속적으로 더 빠른 계산 성능을 보여 주었습니다. 속도 개선을 확인하려면 하단의 그림 (1) 및 (2)를 참조하세요.

 

 

주성분 분석

 

주성분 분석 (Principal Component Analysis, PCA)은 가능한 한 많은 정보를 유지하면서 데이터세트 내의 차원성 (예 :기능의 갯수)를 줄이려고 시도하는 자율 학습 알고리즘입니다. PCA는 데이터 행렬을 직교 공간으로 선형 변환합니다. 여기에서 열은 서로 독립적이며 각 열은 데이터에서 알려진 비율의 분산을 설명 할 수 있습니다. 즉, 구성 요소라는 새로운 기능 집합을 찾습니다. 구성 요소는 원래 기능의 합성물이므로 서로 관련성이 없습니다. 또한 첫 번째 구성 요소는 데이터의 가능한 최대 변동성, 두 번째 구성 요소는 두 번째로 큰 변동성 등을 고려하여 제한됩니다.

 

보다 포괄적인 설명은 https://docs.aws.amazon.com/sagemaker/latest/dg/how-pca-works.html 을 참조하십시오.

 

PCA는 탐색 데이터 분석(EDA)를 위한 도구와 기계 학습 (ML)을 위한 알고리즘 모두로서 강력한 툴입니다. EDA의 경우, PCA는 차원 문제를 줄이고 데이터 문제의 다중 공선 성을 줄이는 데 최적입니다. ML 방법론으로, PCA는 비정상 탐지 (예 : 네트워크의 트래픽 식별), 견고한 예측 (예 : 양적 재정) 및 분류 (예 : 크레딧 득점)의 효과를 향상시키기 위해 다른 ML 방법과 결합합니다.

 

기술 발전으로 인해 데이터 수집 능력이 향상되어 더 큰 크기의 데이터 집합과 세분화된 디테일한 수준의 데이터 집합으로 이어졌습니다. PCA는 대용량 데이터 분석을 위해 아주 유용한 ML 도구입니다. 그러나 PCA는 쉽게 병렬화 할 수 없으며 Amazon SageMaker가 대용량 데이터 응용 프로그램에서 실제로 사용할 수 있을 만큼 확장되지 않았습니다.

 

이 블로그 게시물에서는 Amazon SageMaker PCA 기능의 속도와 확장성을 보여줍니다. 크기가 커지는 행렬에 대해서는 Spark ML 및 Scikit-Learn의 PCA 기능과 비교하여 Amazon SageMaker PCA 런타임을 측정합니다.

 

Amazon SageMaker

 

Amazon SageMaker는 AWS의 완전 관리형 플랫폼으로, 개발자 및 데이터 과학자가 모든 규모의 기계 학습 모델을 빠르고 쉽게 구축, 교육 및 배포 할 수 있습니다. Amazon SageMaker는 일반적으로 기계 학습을 사용하려는 개발자의 속도를 저해하는 장벽을 제거합니다. Amazon SageMaker에는 선형 학습자, k-means, DeepAR, PCA 등의 내장 알고리즘이 있습니다.

 

데이터세트

 

Amazon SageMaker PCA의 확장성을 입증하기 위해 대규모의 실제 데이터 세트를 선택했으며 심지어 더 큰 데이터 세트도 실제 데이터 세트로서의 관측치 수의 4배, 기능의 2배까지 시뮬레이션했습니다.

 

실제 데이터 세트: NIPS Bag of Words

 

이 데이터 세트는 1987 년부터 2015 년까지 출판된 NIPS 회의 논문의 전체 텍스트에서 단어 수의 11,463 x 5,812 행렬 형태로 분포되어있습니다 [Perrone et al., 2016]. 각 열은 해당 NIPS 논문을 나타내며 그 논문에 11,463 단어가 각각 나타난 횟수를 포함합니다. 열의 이름은 PublicationYear_PaperID 형식으로 해당 NIPS 문서를 식별하며 총 5,812 개의 문서를 나타냅니다. 이 데이터 세트는 https://archive.ics.uci.edu/ml/datasets/NIPS+Conference+Papers+1987-2015# 에서 공개적으로 사용할 수 있습니다.

 

예를 들어, 이러한 데이터 세트에 대한 분석을 통해 어떤 키워드가 게시 가능성을 높이거나 더 많은 인용 횟수로 이어질지에 대한 통찰력을 얻을 수 있습니다.

 

시뮬레이션 된 데이터 세트

 

시뮬레이션 된 데이터 세트는 20k 관측으로 구성되며 각각 5k, 10k, 15k 및 20k 특징으로 구성됩니다.

 

코드 : Amazon SageMaker를 사용한 PCA 구현

 

Conda MXNet 커널과 함께 ml.m4.xlarge SageMaker 노트북 인스턴스를 만들었습니다. 구현의 재현성을 위해 각 단계에 해당하는 코드의 행 번호가 포함됩니다. 우리의 코드는 여기에서 다운로드 할 수 있는 자체 포함 작업 Sage-Maker 노트북입니다.

 

NIPS 데이터 세트를 다운로드 하십시오. 우리는 행렬을 변환하여 열이 단어를 나타내고 행이 문서를 나타냅니다. 결과적으로 5812 x 11463 행렬이 생성됩니다. 인덱스, 즉 문서 ID의 문자열이 불필요한 열로 포함되지 않았는지 확인하세요. 매트릭스를 바이너리 스트림 파일 객체로 처리합니다.

 

# Download NIPS data set and transpose matrix.

import sys

!wget https://archive.ics.uci.edu/ml/machine-learning-databases/00371/NIPS_1987-2015.csv

filename = ‘NIPS_1987-2015.csv’

import pandas as pd

data = pd.read_csv(‘NIPS_1987-2015.csv’, index_col=0)

 

 

# Convert data to binary stream.

matrx = data.transpose().apply(lambda x: (x-x.mean())/x.std()).as_matrix()

import io

import sagemaker.amazon.common as smac

buf = io.BytesIO()

smac.write_numpy_to_dense_tensor(buf, matrx)

buf.seek(0)

 

이제 Amazon S3 버킷에 파일 객체를 업로드 할 준비가 되었습니다. 업로드 된 행렬이 상주할 곳과 Amazon SageMaker가 출력을 작성하는 곳 중 하나에 두 경로를 지정합니다. Amazon SageMaker는 이미 존재하지 않는 경로 내에 폴더를 생성할 것입니다.

 

# Specify S3 file paths for training data and for output location. Upload data to S3.

import boto3

bucket = ‘<your-bucket-name>’

prefix = ‘sagemaker/pca-nips’

key = ‘NIPS-bytes-data’

 

import os

s3_train_data = ‘s3://{}/{}/train/{}’.format(bucket, prefix, key)

boto3.resource(‘s3’).Bucket(bucket).Object(os.path.join(prefix, ‘train’, key)).upload_fileobj(buf)

print(‘uploaded training data location: {}’.format(s3_train_data))

 

output_location = ‘s3://{}/{}/output’.format(bucket, prefix)

print(‘training artifacts will be uploaded to: {}’.format(output_location))

 

Amazon SageMaker의 PCA 세션을 인스턴스화하려면 여섯 가지 사항이 필요합니다. 첫 번째는 SageMaker 노트북이 있는 지역에 해당하는 컨테이너 주소입니다. 예 : us-east-1에는 컨테이너 382416733822.dkr.ecr.us-east-1.amazonaws.com/pca:latest가 있습니다. 두 번째는 Amazon SageMaker IAM 역할이며 노트북의 생성과 함께 작성되었습니다. 세 번째와 네 번째 인수의 경우 train_instance_type ml.c4.8xlarge의 train_instance_count를 PCA를 실행하는 가상 환경으로 지정합니다. 실제로 ml.p2.xlarge 또는 ml.p3.xlarge와 같은 GPU 시스템을 권장합니다. 예를 들어 ml.p2.xlarge가 ml.c4.8xlarge보다 저렴하고 더 짧은 시간에 작업을 마칠 수 있기 때문입니다. 여기서 우리는 많은 수의 코어와 높은 메모리에 대해 ml.c4.8xlarge 인스턴스를 선택했으며 공정성을 위해 실험 전반에 걸쳐 이 동일한 머신 유형을 사용합니다. 다섯 번째 인수는 앞서 출력을 작성하기 위해 정의한 경로입니다. 마지막으로 Amazon SageMaker 세션을 통과하십시오.

 

# Lookup container address per AWS region.

containers = {‘us-west-2’: ‘174872318107.dkr.ecr.us-west-2.amazonaws.com/pca:latest’,

              ‘us-east-1’: ‘382416733822.dkr.ecr.us-east-1.amazonaws.com/pca:latest’,

              ‘us-east-2’: ‘404615174143.dkr.ecr.us-east-2.amazonaws.com/pca:latest’,

              ‘eu-west-1’: ‘438346466558.dkr.ecr.eu-west-1.amazonaws.com/pca:latest’}

 

# Get SageMaker IAM execution role.

from sagemaker import get_execution_role

role = get_execution_role()

 

# Create SageMaker session.

import sagemaker

sess = sagemaker.Session()

 

# Instantiate SageMaker PCA with six arguments.                                             

pca = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],

                                    role,

                                    train_instance_count=2,

                                    train_instance_type=’ml.c4.8xlarge’,

                                    output_path=output_location,

                                    sagemaker_session=sess)

 

지금까지 Amazon SageMaker 교육 인스턴스 매개 변수를 지정했습니다. 우리는 여전히 PCA 알고리즘에 하이퍼-파라미터를 지정하려고 합니다. 하이퍼-파라미터는 기능의 수, 반환할 주성분의 수, 행렬 분해 이전의 각 열의 평균을 감산하는 부울 (Boolean), ‘일반’또는 ‘무작위’ PCA를 수행할지 여부, 그리고 마지막으로, 배치 크기 등을 말합니다.

 

# Specify PCA hyper-parameters

import numpy as np

pca.set_hyperparameters(feature_dim=np.shape(matrx)[1],

                        num_components= np.shape(matrx)[1]-1,

                        subtract_mean=True,

                        algorithm_mode=’regular’,

                        mini_batch_size=200)

 

이제 우리는 입력으로 통과된 Amazon S3 데이터 경로를 사용하여 PCA 피팅을 시작하면 됩니다.  Amazon SageMaker는 각 작업에 대한 로그 파일을 다음 형식의 S3 위치에 씁니다.

https://console.aws.amazon.com/cloudwatch/home?region=<region> #logEventViewer:group=/aws/sagemaker/TrainingJobs;stream=<algo-YYYY-MM-DD-hh-mm-ss-SSS>/algo-<int>-<timestamp>

 

로그는 인스턴스가 회전하는 데 걸리는 시간과 PCA가 걸리는 시간을 식별합니다. 사내 구축형 시스템을 사용하는 경우와 달리, 프로비저닝 시간이 아닌 소비를 위해서만 지불하면 됩니다. 지정된 인스턴스가 프로비저닝되기까지 약 7 분이 걸렸습니다. 인스턴스가 준비되면 PCA가 적합해지고 출력이 압축된 tar 파일로 지정된 S3 위치에 기록됩니다.

 

# Kick-off PCA fitting.

import time

pca.fit({‘train’: s3_train_data})

 

타르(tarred)된 출력을 다운로드하십시오. 그 내용은 MXNet ndarray로 읽을 수 있습니다. ndarray는 세 가지 속성을 가지고 있습니다: 평균, 열 수단의 배열; s, 특이 값의 ndarray; 및 v는 주성분 벡터의 ndarray입니다.

 

# Download and unpack returned PCA model artifact.

job_name = pca.latest_training_job.name

os.system(‘aws s3 cp {}/{}/output/model.tar.gz ./’.format(output_location, job_name))

!tar xzvf model.tar.gz

 

import mxnet as mx

pca_model = mx.ndarray.load(‘model_algo-1’)

mean = pca_model[‘mean’]

singular_values = np.sort(pca_model[‘s’].asnumpy())[::-1]

pc_vectors = pca_model[‘v’]

 

다른 도구에 대한 성능 평가: SparkML Scikit-Learn

 

Spark ML과 Scikit-Learn는 현재 대규모 PCA를 다루기 위해 시도하고 있는 상위 2 개의 오픈 소스 라이브러리입니다.

 

Spark은 일반적인 통계 알고리즘을 갖춘 분산형 기계 학습 라이브러리가 있는 클러스터 컴퓨팅 프레임워크이며 디스크 기반 구현보다 9 배 빠른 속도로 벤치 마크되었습니다 [Rocha et al., 2017]. Scikit-Learn는 Python 프로그래밍 언어용으로 개발된 기계 학습 라이브러리입니다. 처음에는 단일 기계용으로 설계되었지만 PCA의 특정 구현이 병렬화되었습니다 [Pedregosa et al., 2011].

 

실제 환경의 NIPS 데이터와 시뮬레이트된 데이터 모두에서 각 환경에 대해 동일한 c4.8xlarge 인스턴스를 생성하고 규모 증가를 위한 PCA 런타임을 기록하기 시작했습니다.

 

결과

 

그림 1은 최대 1000 개 기능의 행렬에 대해 Spark ML이 Amazon SageMaker보다 약 90 배 더 느리게 PCA를 수행함을 보여줍니다. 5000 개 이상의 기능인 Spark ML은 시간이 많이 소요되므로 이 블로그 게시물의 고차원 비교에서 제외되었습니다.

 

Table1: PCA 테스트 케이스별 매트릭스 규모

 

NIPS data: 5811 observations  Simulated data: 20k observations
First 50 features 5k features
First 100 features 10k features
First 500 features 15k features
First 1k features 20k features
First 5k features
First 10k features
All 11463 features

 

저차원 행렬의 경우 Scikit-Learn의 PCA 성능은 Amazon SageMaker의 성능과 유사합니다. 그림 1은 SageMaker가 5000개 형상 행렬에 근접할 때만 Scikit-Learn에 비해 5 배의 이점을 볼 수 있다는 것을 보여줍니다. 그러나 Scikit-Learn은 정사각형이 아닌 행렬에 대해 완전한 PCA를 수행하지 않는다는 점을 유의해야합니다. Scikit-Learn이 반환하는 구성 요소의 최대 수는 min (num_observations; num_features)과 같습니다. 즉, Scikit-Learn은 num_observations num_features를 초과하면 남아있는 관측치를 삭제합니다. 따라서 여기에서 보여지는 런타임은 잘린 작은 크기의 행렬에 대한 것입니다.

 

분석 응용 프로그램에서 Scikit-Learn의 유용성을 제한하는 것 외에도 동시에 시간 판단을 수행하는 능력을 제한합니다. 기능 특징이 샘플 크기를 결코 초과하지 않는 시뮬레이션 데이터 세트로 전환합니다. 그림 2는 Amazon SageMaker PCA가 Scikit-Learn보다 약 5 배 빠릅니다.

 

그림 1: Amazon SageMaker가 Spark에 대비해 90배의 성능을 제공합니다.

 

그림 2:Amazon SageMaker는 Scikit-Learn보다 5배 더 뛰어난 성능을 제공합니다.

 

결론

 

PCA는 데이터 시각화 및 데이터 무의미화를 위해 저차원 문제들에 있어서 항상 중요한 부분이었습니다. 그러나 현실 세계의 문제가 점차 대형 데이터 세트를 다루고 있으므로 고차원 문제에 대한 확장 가능한 PCA가 그 어느 때보다 중요합니다. 이 블로그 게시물에서는 Amazon SageMaker가 PCA를위한 가장 확장성있는 프레임 워크를 구현할 때 얻는 이점을 보여주었습니다.

 

여기에 표시된 코드는 완전히 독립적입니다. 시작하려면 SageMaker 노트북을 열고 여기에 나온 NIPS 결과를 복제하기 위해 코드 블록을 복사하여 붙여 넣으십시오. 또는 코드 블록이 미리 채워진 상태로 이 노트북을 다운로드하십시오. 이 서버리스 도구는 기본 플랫폼 및 컴퓨팅 프레임 워크를 처리합니다. 요청된 구성 요소 수를 시험해보고 Amazon SageMaker의 확장성을 확인하십시오. 다양한 관측과 기능을 사용하여 데이터 세트에서 코드를 시험해 볼 수도 있습니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/perform-a-large-scale-principal-component-analysis-faster-using-amazon-sagemaker/

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