BLOG
이 게시물에서는 Amazon SageMaker와 R을 이용하여 기계 학습(ML)모델에서 예측을 훈련, 배포, 검색하는 방법을 설명합니다. 껍데기에 있는 고리의 수로전복의 나이를 측정한 예측모델입니다. Reticulate 패키지는 Amazon SageMaker Python SDK에 대한 R 인터페이스로 사용되어 Amazon SageMaker에 API 호출을 합니다. reticulate 패키지는 R과 Python 객체를 변환하며, Amazon SageMaker는 서버 없는 데이터 과학 환경을 제공하여 ML 모델을 규모에 맞게 훈련하고 배포합니다.
이 게시물을 따라하려면 R에 대한 기본적인 이해가 필요하며, dplyr, readr, stringr, 그리고 ggplot2 등의 tidyverse 패키지를 숙지해야 합니다. RStudio를 사용하여 코드를 실행합니다. RStudio는 R과 함께 작업하기 위한 IDE(통합 개발 환경)입니다. 이 IDE는 상용 또는 AGPLv3로 되어있습니다.
AWS CloudFormation 시작하기
Amazon SageMaker를 사용하여 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스에 RStudio를 설치, 구성 및 연결하려면 다음 AWS CloudFormation 스택을 사용하십시오.
이 스택을 시작하면 다음 리소스가 생성됩니다.
- VPC(공용 가상 개인 클라우드)
- Amazon EC2 인스턴스(t2.medium)
- SSH 액세스만 허용하는 보안 그룹
- Amazon SageMaker 권한이 있는 Amazon EC2에 대한 AWS Identity 및 액세스 관리(IAM)역할
- Amazon SageMaker용 IAM 서비스 역할
- RStudio 설치
- 필수 R 패키지
- Amazon SageMaker Python SDK 설치
스택을 시작한 후 다음 단계에 따라 RStudio를 구성하고 연결합니다.
- 템플릿 선택 페이지에서 다음을 선택합니다.
- 세부 정보 지정 페이지에서 KeyName에 대한 키 페어를 선택합니다.
- 옵션 페이지에서 다음을 선택합니다.
- 검토 페이지에서 AWS CloudFormation에서 사용자 지정 이름을 사용하여 IAM 리소스를 만들 수 있음 확인 란을 선택하고 다음을 선택합니다.
- 스택이 생성완료 상태에 도달하면 출력(Outputs)을 선택합니다.
- 값(Value)의 SSH 문자열을 복사하여 터미널 창에 붙여 넣습니다.
SSH 명령은 새 인스턴스에 연결하는 동안 8787 포트를 컴퓨터에 전달합니다. 연결되면 브라우저 창을 열고 주소 표시줄에 localhost:8787을 입력합니다.
참고–RStudio 및 필수 R 패키지가 설치되는동안 터미널에서 연결 실패 메시지를 볼 수 있습니다. 설치 프로세스에는 약 15분이 소요됩니다.
다음 자격 증명으로 로그인합니다.
- 사용자 이름:rstudio
- 비밀 번호:rstudio
Amazon SageMaker Python SDK 반복하기
먼저 reticulate 라이브러리를 로드하고 sagemaker Python 모듈을 가져옵니다. 모듈이 로드되면, 사용 가능한 클래스를 보기 위한 Python의 . 표기법 대신 R의 $ 표기법을 사용하십시오.
다음 이미지와 같이 Session 클래스를 사용합니다.
Session 클래스는 Amazon SageMaker에서 다음의 boto3 리소스 작업을 제공합니다.
Session 클래스에서 사용할 수 있는 개체를 보려면 다음 이미지와 같이 $ 표기법을 사용하십시오.
데이터 스토리지 생성 및 액세스
데이터에 대한 Amazon Simple Storage Service (AmazonS3) 버킷을 생성해 보겠습니다. Amazon SageMaker가 버킷에 액세스 할 수 있도록 하는 IAM 역할이 필요합니다.
학습데이터, 모델의 바이너리 파일 및 학습 결과를 저장할 Amazon S3 버킷을 지정합니다.
library(reticulate)
sagemaker <- import(‘sagemaker’)
session <- sagemaker$Session()
bucket <- session$default_bucket()
참고– default_bucket 기능은 고유한 Amazon S3 버킷을 생성하며 이름은 다음과 같습니다..
sagemaker-<aws-region-name>-<aws account number>
Amazon SageMaker가 Amazon S3 버킷에 액세스 할 수 있도록 IAM 역할의 ARN을 지정합니다.
role_arn <- session$expand_role(‘sagemaker-service-role’)
AWS CloudFormation 스택은 필요한 정책을 사용하여 sagemaker-service-role이라는 IAM 역할을 자동으로 생성했습니다. expand_role 함수는 Amazon SageMaker에 필요하므로 이 역할에 대한 ARN을 검색합니다.
데이터셋 다운로드 및 처리하기
이 모델은 UCI 머신 러닝 저장소의 전복 데이터셋을 사용합니다. 먼저 데이터를 다운로드하고 탐색 데이터 분석을 시작합니다. 데이터를 읽고, 데이터를 표시하고, Amazon SageMaker의 ML 형식으로 데이터를 변환하려면 tidyverse 패키지를 사용해야 합니다.
library(readr)
data_file <- ‘https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data’
abalone <- read_csv(file = data_file, col_names = FALSE)
names(abalone) <- c(‘sex’, ‘length’, ‘diameter’, ‘height’, ‘whole_weight’, ‘shucked_weight’, ‘viscera_weight’, ‘shell_weight’, ‘rings’)
head(abalone)
앞의 이미지는 성별이 요인 데이터 유형이지만 현재로서는 문자 데이터 유형임을 보여 줍니다(F는 여성, M은 남성, I는 신생아). 성별을 요인으로 변경하고 데이터셋의 통계 요약을 봅니다.
abalone$sex <- as.factor(abalone$sex)
summary(abalone)
요약은 최소 높이 값이 0임을 보여 줍니다.
각 성별 값에 대해 링과 높이의 관계를 표시하여 전복의 높이가 0과 같은지 확인할 수 있습니다.
library(ggplot2)
ggplot(abalone, aes(x = height, y = rings, color = sex)) + geom_point() + geom_jitter()
이 그림은 여러 특이치를 보여 주는데, 높이가 0인 두 개의 어린 전복과 나머지 것보다 더 높은 높이의 여자 전복과 남자 전복입니다. 두 개의 어린 전복은 높이가 0이므로 걸러 냅시다.
library(dplyr)
abalone <- abalone %>%
filter(height != 0)
모델 훈련을 위한 데이터셋 준비하기
이 모델에는 학습, 테스트 및 검증을 위한 데이터셋이 각각 하나씩 필요합니다. 첫째, 성별을 더미 변수로 변환하고 대상 링을 첫번째 열로 이동시킵니다. Amazon SageMaker 알고리즘을 사용하려면 대상이 데이터셋의 첫번째 열에 대상이 있어야 합니다.
abalone <- abalone %>%
mutate(female = as.integer(ifelse(sex == ‘F’, 1, 0)),
male = as.integer(ifelse(sex == ‘M’, 1, 0)),
infant = as.integer(ifelse(sex == ‘I’, 1, 0))) %>%
select(-sex)
abalone <- abalone %>%
select(rings:infant, length:shell_weight)
head(abalone)
이 코드는 다음과 같은 데이터셋을 생성합니다.
다음으로, ML 알고리즘을 훈련하기 위해 데이터의 70%를 표본으로 추출합니다. 나머지 30%는 테스트용과 검증용으로 나눕니다.
abalone_train <- abalone %>%
sample_frac(size = 0.7)
abalone <- anti_join(abalone, abalone_train)
abalone_test <- abalone %>%
sample_frac(size = 0.5)
abalone_valid <- anti_join(abalone, abalone_test)
모델의 학습을 위해 학습 및 검증 데이터를 Amazon S3에 업로드 합니다. 먼저 학습 및 검증 데이터셋을 로컬 파일 시스템에. csv형식으로 기록합니다.
write_csv(abalone_train, ‘abalone_train.csv’, col_names = FALSE)
write_csv(abalone_valid, ‘abalone_valid.csv’, col_names = FALSE)
둘째, 데이터 키에 두 데이터셋을 Amazon S3 버킷에 업로드 합니다.
s3_train <- session$upload_data(path = ‘abalone_train.csv’,
bucket = bucket,
key_prefix = ‘data’)
s3_valid <- session$upload_data(path = ‘abalone_valid.csv’,
bucket = bucket,
key_prefix = ‘data’)
마지막으로 Amazon SageMaker 알고리즘에 대한 Amazon S3 입력 유형을 정의합니다.
s3_train_input <- sagemaker$s3_input(s3_data = s3_train,
content_type = ‘csv’)
s3_valid_input <- sagemaker$s3_input(s3_data = s3_valid,
content_type = ‘csv’)
모델 훈련기
Amazon SageMaker 알고리즘은 Docker 컨테이너를 통해 사용할 수 있습니다. XGBoost 모델을 학습려면 AWS 리전의 Amazon Elastic Container Registry (Amazon ECR)에서 훈련컨테이너를 지정합니다.
containers <- list(‘us-west-2’ = ‘433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest’,
‘us-east-1’ = ‘811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest’,
‘us-east-2’ = ‘825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest’,
‘eu-west-1’ = ‘685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest’)
container <- containers[session$boto_region_name][[1]]
Docker와 함께 사용된 모든 제공된 알고리즘을 훈련할 수 있는 Amazon SageMaker Estimator를 정의합니다. Estimator를 만들 때 다음 인수를 사용합니다.
- image_name–훈련에 사용할 컨테이너 이미지
- 역할–사용자가 생성한 Amazon SageMaker 서비스 역할
- train_instance_count–훈련에 사용할 Amazon EC2 인스턴스 수
- train_instance_type–훈련에 사용할 Amazon EC2 인스턴스 유형
- train_volume_size–훈련 중 입력 데이터를 저장하는 데 사용할 Amazon Elastic Block Store (Amazon EBS) 볼륨의 GB 단위 크기
- train_max_run–훈련 시간 제한(초)
- input_mode–알고리즘이 지원하는 입력 모드
- output_path –훈련 결과 저장을 위한 Amazon S3 위치(모델 아티팩트 및 출력 파일)
- output_kms_key –훈련 결과를 암호화하기 위한 AWS KMS(AWS Key Management Service)키
- base_job_name–훈련 작업 이름의 접두사
- sagemaker_session–Amazon SageMaker API와의 상호 작용을 관리하는 세션 개체
s3_output <- paste0(‘s3://’, bucket, ‘/output’)
estimator <- sagemaker$estimator$Estimator(image_name = container,
role = role_arn,
train_instance_count = 1L,
train_instance_type = ‘ml.m5.large’,
train_volume_size = 30L,
train_max_run = 3600L,
input_mode = ‘File’,
output_path = s3_output,
output_kms_key = NULL,
base_job_name = NULL,
sagemaker_session = NULL)
참고:Python의 None과 동등한 값이 R의 NULL입니다.
XGBoost 하이퍼 매개변수를 지정하고 모델을 적합시킵니다. 훈련을 위한 라운드 수를 Amazon SageMaker 외부에서 XGBoost 라이브러리를 사용할 때의 기본 값인 100으로 설정합니다. 또한 현재 타임 스탬프를 기준으로 입력 데이터와 작업 이름을 지정합니다.
estimator$set_hyperparameters(num_round = 100L)
job_name <- paste(‘sagemaker-train-xgboost’, format(Sys.time(), ‘%H-%M-%S’), sep = ‘-‘)
input_data <- list(‘train’ = s3_train_input,
‘validation’ = s3_valid_input)
estimator$fit(inputs = input_data,
job_name = job_name)
훈련이 완료되면 Amazon SageMaker는 모델 이진(gzip tarball)을 지정된 Amazon S3 출력 위치로 복사합니다. 다음 명령으로 전체 Amazon S3경로를 가져옵니다.
estimator$model_data
모델 배포하기
Amazon SageMaker를 사용하면 사용자가 HTTPS 요청을 통해 안전하고 간단한 API로 호출할 수 있는 엔드포인트를 제공하여 모델을 배포할 수 있습니다. 훈련 받은 모델을 ml.t2.medium 인스턴스에 배포해 보겠습니다. 자세한 내용은 Amazon SageMaker ML 인스턴스 유형을 참조하십시오.
model_endpoint <- estimator$deploy(initial_instance_count = 1L,
instance_type = ‘ml.t2.medium’)
모델을 사용하여 예측 생성하기
테스트 데이터를 사용하여 예측을 생성합니다. 엔드포인트에 대해 text/csv 및 csv_serializer를 지정하여 일련화할 쉼표로 구분된 텍스트를 JSON 형식으로 전달합니다.
model_endpoint$content_type <- ‘text/csv’
model_endpoint$serializer <- sagemaker$predictor$csv_serializer
대상 열을 제거하고 처음 500개의 관측치를 열 이름이 없는 행렬로 변환합니다.
abalone_test <- abalone_test[-1]
num_predict_rows <- 500
test_sample <- as.matrix(abalone_test[1:num_predict_rows, ])
dimnames(test_sample)[[2]] <- NULL
참고–500개의 관측치가 엔드포인트 제한을 초과하지 않으므로 선택되었습니다.
엔드포인트에서 예측을 생성하고 반환되는 쉼표로 구분된 문자열을 변환합니다.
library(stringr)
predictions <- model_endpoint$predict(test_sample)
predictions <- str_split(predictions, pattern = ‘,’, simplify = TRUE)
predictions <- as.numeric(predictions)
예측된 링을 테스트 데이터로 이동합니다.
abalone_test <- cbind(predicted_rings = predictions,
abalone_test[1:num_predict_rows, ])
head(abalone_test)
예측된 수명(셸 링 수)은 다음과 같습니다.
엔드포인트 삭제하기
모델을 모두 사용한 후에는 배포 비용이 발생하지 않도록 엔드포인트를 삭제합니다.
session$delete_endpoint(model_endpoint$endpoint)
결론
이 블로그 포스트에서는 Amazon SageMaker와 R를 사용하여 ML 모델을 구축하고 배포하는 방법을 배웠습니다. 일반적으로 이 워크플로우는 Python을 사용하여 실행하지만 R을 사용하여 실행하는 방법도 보여 주었습니다.
원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/using-r-with-amazon-sagemaker/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.