Amazon Personalize
Amazon Personalize는 Amazon.com에서 제공하는 실시간 맞춤화 추천 서비스와 동일한 기계 학습(ML) 기술을 제공하는 서비스입니다. Amazon Personalize를 통해 ML 전문 지식이 없이도 특정 제품 추천, 맞춤화된 제품 순위 재지정, 맞춤화된 직접 마케팅 등을 포함하여 다양한 맞춤화 환경을 제공할 수 있는 애플리케이션을 손쉽게 구축할 수 있습니다.
- Amazon Personalize란? : https://docs.aws.amazon.com/personalize/latest/dg/what-is-personalize.html
이번 게시물에서는 Amazon Personalize를 이용하여 직접 사이트에 개인화된 추천 모델을 생성하여 사이트에 도입해보고, 실시간으로 이벤트를 Event Tracker 기반으로 기록하여 사용자의 최신 활동을 파악하고 추천 사항을 업데이트 할 수 있는 파이프라인도 구성해 보도록 하겠습니다,
- 참고 문서 : https://catalog.us-east-1.prod.workshops.aws/workshops/ed82a5d4-6630-41f0-a6a1-9345898fa6ec/ko-KR
실습 개요
실습은 크게 3가지 순서로 진행 됩니다.
1. CloudFormation 배포 및 Frontend 구성하기
실습에 필요헌 환경은 AWS 의 IaC 서비스인 CloudFormation을 통해 배포하고, Frontend 구성을 진행합니다.
2. Amazon Personalize 개인화된 추천 모델 만들기
개인화 추천을 하기 위해선 데이터 전처리, 모델 트레이닝, 결과값(Campaign)을 API 형태로 불러오는 과정이 필요합니다. 이 중 모델 트레이닝, 결과값 호출 과정을 진행합니다.
3. Event Tracker 기반 실시간 클릭 스트림을 추천 모델에 반영하기
사용자의 실시간 데이터 수집과 이를 Personalize 추천 결과에 반영하는 실습을 진행합니다.
위 3가지 실습이 진행될 아키텍처는 아래와 같습니다.
실습 진행
CloudFormation 배포 및 Frontend 구성하기
위의 아키텍처 중 CloudFormation으로 표시된 부분을 배포합니다.
1. CloudFormation 배포
1.1 아래의 yaml 파일은 다운로드 합니다.
1.2. 아래와 같은 스택 생성 화면 다운받은 yaml 파일을 업로드 한 후 [다음] 버튼을 눌러 진행합니다.
1.3. 스택 세부 정보 지정 화면에서 스택 이름을 personalize-stack 으로 입력 후 [다음] 버튼을 클릭합니다.
1.4. 스택 옵션 구성 화면에서 모든 값을 기본값으로 둔 후 [다음] 버튼을 클릭합니다.
1.5. 검토 화면에서 아래 부분 체크 후 [전송] 버튼을 클릭합니다.
2. Frontend 구성
2.1. CloudFormation을 통해 생성 된 Cloud9에서 personalizeworkshop 환경을 오픈합니다.
2.2. Cloud9 환경이 생성되면서 아래 Git Repository가 함께 clone되는 것을 확인하실 수 있습니다. (React 기반 영화 페이지가 구성된 앱입니다.)
2.3. 아래 커맨드와 같이 Clone 된 경로로 이동한 뒤, 필요한 package를 설치합니다.
cd ~/environment/personalizeworkshop
npm install
2.4. Cloudformation을 통해 생성된 DynamoDB Movie Table과 User Table에 데이터를 넣은 작업을 아래 AWS CLI를 통해서 진행합니다.
aws dynamodb batch-write-item --request-items file://User.json
aws dynamodb batch-write-item --request-items file://Movie.json
aws dynamodb batch-write-item --request-items file://Movie2.json
aws dynamodb batch-write-item --request-items file://Movie3.json
aws dynamodb batch-write-item --request-items file://Movie4.json
aws dynamodb batch-write-item --request-items file://Movie5.json
2.5. Cloud9 에서 personalizeworkshop/src/config.json 파일을 열고, APIUrl 변수를 CloudFormation을 통해 생성된 APIEndpoint로 변경합니다.
2.6. Cloud9에서 Frontend 애플리케이션 빌드를 진행합니다.
npm run build
2.7. CloudFormation을 통해 생성된 DeploytoCloudFront 커맨드를 복사하여 AWS Cloud9 환경에서 실행합니다.
2.8. CloudFormation에서 CfDistributionDomainName 도메인 네임을 클릭하여 배포된 애플리케이션에 접속합니다.
Amazon Personalize 개인화된 추천 모델 만들기
머신 러닝에 있어서 가장 중요하고 시간이 많이 소요되는 작업이 바로 데이터 준비입니다.
Personalize를 사용하여 모델을 트레이닝 하기 위해서는 Personalize가 사전에 정의한 데이터 스키마 형태로 데이터를 준비해야 합니다. 데이터 세트 유형, 필수 필드는 아래와 같습니다.
이번 실습에서는 Personalize 사용이 목적이기에 데이터 준비 및 전처리 과정은 생략하고 아래의 샘플 데이터를 사용해 진행하도록 하겠습니다.
Personalize 개인화된 추천 모델 만들기를 3단계로 나눠 알아보겠습니다.
1. Amazon Personalize에서 전처리 완료된 데이터 셋(CSV 파일) 불러오기
1.1. 위에서 다운로드한 CSV 파일을 CloudFormation을 통해 생성된 personalize-stack-personalizebucket-xxxxxx 이름의 버킷에 업로드 합니다.
1.2. 해당 버킷의 정책을 아래와 같이 변경 합니다. ( 반드시, <personalize-stack-personalizebucket-xxxxxx> 부분을 여러분의 버킷 이름 으로 변경하셔야 합니다. )
{
"Version": "2012-10-17",
"Id": "PersonalizeS3BucketAccessPolicy",
"Statement": [
{
"Sid": "PersonalizeS3BucketAccessPolicy",
"Effect": "Allow",
"Principal": {
"Service": "personalize.amazonaws.com"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<personalize-stack-personalizebucket-xxxxxx>",
"arn:aws:s3:::<personalize-stack-personalizebucket-xxxxxx>/*"
]
}
]
}
1.3. Personalize 콘솔로 이동 후 좌측의 Create dataset group을 클릭합니다.
1.4. Dataset group name 에 personalize-dataset 을 입력하고 Next 버튼을 클릭합니다.
1.5. Overview 화면에서 Import interaction data 버튼을 클릭 후 Next 버튼을 클릭합니다.
1.6. Dataset name에 personalize-dataset 을 입력합니다.
1.7. 아래 Schema details 단계에서 Create new schema 를 선택하고 Schema name 에 personalize-schema 를 입력합니다. Schema definition에서 보시면 전처리 작업에서와 같은 데이터 스키마를 확인하실 수 있습니다.
1.8. Configure Interactions dataset import job 단계에서 Dataset import job name 을 personalize-import-job 을 입력합니다.
1.9. Data import source에서 Data location 을 1.1 단계에서 업로드한 파일의 S3 Uri를 입력합니다.
1.10. IAM service role 에서 create a new role을 선택합니다. 새로운 팝업창이 뜨면, Any S3 Bucket 을 선택하고 Create role 을 선택합니다. 그 후 Start import 버튼을 클릭합니다.
1.11. 5-10분정도 뒤에 User-item interaction data가Active상태로 변경된 걸 확인하시 수 있습니다.
2. 모델 트레이닝을 위한 Recipe (Personazlize에서 제공하는 Built-in 머신러닝 알고리즘) 선택과 Solution(모델 트레이닝 작업) 을 생성하기
2.1. Interactions data active 상태 확인 후 Overview 의 Use custom resources에서 Create solution 버튼을 클릭합니다.
2.2. Solution name 을 personalize-solution 으로 입력하고, Recipe에는 aws-user-personalization 을 선택합니다. Next 버튼을 클릭합니다.
2.3. Advanced configuration 단계는 기본값으로 두고 Next 버튼을 클릭합니다.
2.4. Review and create 단계에서 2.2에서 설정한 값 확인 후 create solution 버튼을 클릭합니다. 20분-30분 뒤에 Solution 생성이 완료된 것을 확인하실 수 있습니다.
2.5. 생성된 솔루션을 기반으로 실제 애플리케이션/UI에서 보여주기 위해서는 Campaign을 생성해야 합니다. Use custom resources 단계에서 Create campaign 버튼을 클릭합니다.
2.6. Campaign detail 에서 Campaign name 에는 personalize-campaign-demo 를 입력합니다.
2.7. Solution 선택란에서 이전에 생성한 personalize-solution 을 클릭한 뒤, Solution version ID 에는 방금 생성된 ID가 자동으로 선택됩니다. 나머지 값은 기본값으로 두고 Create campaign 버튼을 클릭합니다.
2.8. 5분뒤 생성이 완료되면 Campaign ARN을 사용하여 getRecommendation API call를 호출하여 이전에 만든 UI에서 결과값을 확인할 수 있습니다.
3. 추천 결과값 API로 웹 애플리케이션에서 호출하기
User-Item interaction 기반 실시간 추천 Solution 및 Campaign을 생성하였습니다.
AWS Lambda를 사용하여 Amazon Personalize통해 추론된 결과값을 이전 실습에서 생성된 API Endpoint에서 호출될 수 있도록 코드로 구현을 합니다.
- 추천 서비스 결과값을 얻기 위한 소스 코드는 이미 AWS Lambda에 구현이 되어 있고, 본 실습에서는 CloudFormation을 통해 생성된 AWS Lambda의 환경변수 Campaign ARN를 여러분이 생성한 Campaign ARN값으로 변경하는 작업을 진행합니다.
3.1. Lambda 콘솔로 이동 후 CloudFormation을 통해서 생성된 personalizeProcessingFunction을 선택합니다.
3.2. 구성 탭을 클릭하고 환경 변수 버튼을 클릭합니다. 오른쪽 상단에 편집 버튼을 클릭합니다.
3.3. 이전 단계에서 생성한 Campaign ARN을 값에 붙여넣고 Save 버튼을 클릭합니다.
4. 웹 애플리케이션에서 결과값 확인하기
4.1. CloudFormation 에서 생성된 CfDistributionDomainName 도메인 네임을 클릭하여 배포된 애플리케이션에 접속합니다.
4.2. 로그인 페이지에서 아래 username 과 password 를 입력하여 로그인합니다.
4.3. 랜덤한 영화 포스터를 클릭하면, 아래와 같이 실시간 추천 영화 결과를 확인하실 수 있습니다.
Event Tracker 기반 실시간 클릭 스트림을 추천 모델에 반영하기
데이터를 기반으로 Amazon Personalize 모델 훈련, 훈련된 모델 기반으로 추천결과값 제공까지 완료 하였습니다.하지만 서비스 이용 시, 사용자 데이터를 어떻게 수집하고 이를 별도의 모델훈련 없이 Amazon Personalize 추천 결과에 반영하고 싶습니다. 실시간 데이터 수집과 이를 Amazon Personalize 추천 결과에 반영하는 실습을 해보겠습니다.
Event Tracker가 추천에 어떻게 영향을 미치는지?
Amazon Personalize는 마지막으로 훈련된 데이터셋 위에 Event Tracker로 새로 추가된 데이터를 기반으로 추천을 생성합니다.
- User-Personalization 레시피 사용 시, 마지막 모델 훈련에 추가되지 않았던 아이템이 Event Tracker로 추가된 경우 Amazon Personalize는 매 2시간마다 모델을 재훈련합니다. 재훈련 후 추가된 아이템이 추천결과에 반영됩니다.
- 다른 레시피는 Event Tracker를 통해 추가된 아이템이 추천결과에 반영되기 위해선 모델을 재훈련해야합니다.
- 마지막으로 훈련된 모델에 존재하지 않던 사용자가 추가될 시, 초반 추천값은 Interaction 데이터에서 가장 많이 도출된 아이템을 기반으로 추천이 이루어집니다. 해당 유저에 대한 interaction이 추가될수록 추천 결과가 개선됩니다.
- 마지막으로 훈련된 모델에 존채하지 않은 익명의 사용자는 sessionId를 기반으로 해당 사용자를 추적합니다. 로그인 후, sessionId와 함께 제출된 userId를 기반으로 추천이 이루어집니다. 따라서 로그인 전, 익명으로 시스템을 사용한 유저에게도 지속적으로 추천을 할 수 있게 됩니다.
Event Tracker를 활용한 실시간 클릭 스트림 반영 실습 동작 단계는 아래와 같습니다.
1. 페이지에서 일어나는 유저활동을 Kinesis Data Stream로 보냅니다.
2. Kinesis Data Stream에 기록된 정보를 AWS Lambda 함수로 받아서 Personalize Event Tracker에 기록합니다.
3. Event Tracker는 Solution에 사용된 Recipe에 따라 이를 실시간 추천에 반영합니다.
4. 다음 방문 시, 사용자는 갱신된 추천을 받습니다.
1. Kinesis Data Stream 을 API Gateway에 추가하기
1.1. API Gateway 콘솔로 들어갑니다. CloudFormation 에서 생성한 personalize-stack 을 클릭합니다.
1.2. /stream/{stream-name}/record의 POST을 클릭하시고, 오른쪽 콘솔창의 메서드 응답을 클릭합니다.
1.3. 응답 추가를 클릭합니다. 그 후 Http 상태 공란에 200을 입력하고 체크표시를 클릭합니다.
1.4. 만들어진 200를 열어 200에 대한 응답 본문에 다음과 같이 입력하고 체크표시를 클릭해줍니다. 다시 메서드 실행을 클릭하여 뒤로 돌아갑니다.
1.5.통합 응답을 클릭합니다.
1.6.통합 응답 추가를 클릭하여 화면과 같이 입력해줍니다. 다 완료하였으면 뒤로 돌아갑니다.
1.7. /record를 클릭하고 위 작업을 클릭하여 CORS 활성화를 합니다.
1.8. 모든 확인표시에 초록색이 뜨는걸 확인하고 **/**를 클릭한 상태에서 작업을 선택하여 API 배포를 합니다. Prod Stage에 배포합니다.
2. Event Tracker 만들기
지금까지 Kineis 기반으로 전달받는 실시간 클릭 스트림을 API Gateway, Lambda 로 전달할 수 있도록 구성하였습니다. 이제 Event Tracker 를 생성하여 전달받는 실시간 클릭스트림을 Amazon Personalize로 전달해보겠습니다.
2.1.Personalize 콘솔의 perosonalize-dataset 클릭 -> Event trackers 탭 클릭 -> Create event tracker 버튼을 클릭합니다.
2.2. Tracker Name을 demogoprime-event-tracker로 입력합니다. Next 를 클릭하고 Finish를 클릭합니다.
2.3. 생성된 Event Tracker 의 traking ID를 복사합니다.
3. Lambda 만들기
Event Tracker생성을 완료하고, Kinesi Data Stream으로 데이터를 받을 준비도 하였습니다. 이제 Kinesis Data Stream을 통해 들어오는 데이터를 Event Tracker에 넣는 람다 함수를 만들어보겠습니다.
3.1. Lambda 콘솔에서 CloudFormation 에서 미리 생성한 kinesisProcessingFunction을 클릭합니다.
3.2. kinesisProcessingFunction 콘솔에서 구성 탭을 클릭합니다.
3.3. 왼쪽의 Environment Variables 탭을 클릭한 후, Edit을 클릭합니다.
3.4. 2.3에서 복사한 Event Tracker의 Tracking Id를 Lambda 환경변수에 입력 후 저장 버튼을 클릭합니다.
3.5. 함수 개요의 트리거로 추가된 Kinesis를 클릭 후 트리거 편집을 선택합니다.
3.6. 설정된 구성을 그대로 둔 후 저장을 클릭합니다. 트리거 state: Enabled로 바뀌는 것을 확인할 수 있습니다.
3.7. 코드 탭을 클릭 후 Test 우측의 화살표 클릭 후 Configure test event를 클릭합니다.
3.8. 새 이벤트 생성 을 클릭하고, 이벤트 이름을 demogotest 로 입력합니다.
3.9. 아래의 코드를 복사하여 Event Code Editor에 붙여넣습니다.
{
"Records": [
{
"kinesis": {
"kinesisSchemaVersion": "1.0",
"partitionKey": "cb28e367-9a66-4817-972d-84bf305c523c",
"sequenceNumber": "49619721527349556413582986393669201024235870499068968962",
"data": "eyJVU0VSX0lEIjoiMSIsIklURU1fSUQiOiI2IiwiVElNRVNUQU1QIjoiMTYyNTEyODc0Mzc3NSIsIkVWRU5UX1RZUEUiOiJjbGljayJ9",
"approximateArrivalTimestamp": 1625128743.952
},
"eventSource": "aws:kinesis",
"eventVersion": "1.0",
"eventID": "shardId-000000000000:49619721527349556413582986393669201024235870499068968962",
"eventName": "aws:kinesis:record",
"invokeIdentityArn": "arn:aws:iam::************:role/service-role/kinesisProcessingFunction-role-rvprlatv",
"awsRegion": "us-east-1",
"eventSourceARN": "arn:aws:kinesis:us-east-1:************:stream/demogoprime-kinesis-stream-prd"
}
]
}
3.10. 테스트 탭을 클릭하고 테스트 버튼을 클릭합니다. 성공이 뜨는지 확인합니다.
4. 웹 페이지를 통한 실시간 추천 확인
Lambda 함수가 제대로 동작하는것을 보았으니 이것을 프론트에서 실시간 추천 리스트에 있는 임의의 영화를 하나 클릭해보고, 다시 똑같은 영화 페이지로 돌아와보겠습니다.
이상으로 Amazon Personalize를 활용한 실시간 추천 사이트 만들기를 진행해봤습니다.
감사합니다.
※ 이 글은 작성자의 회사 블로그에도 게재되었습니다
'AWS' 카테고리의 다른 글
Amazon QuickSight 를 사용해 CloudTrail 이벤트 모니터링 하기 (0) | 2023.12.12 |
---|---|
AWS Elemental MediaConvert로 비디오 트랜스코딩 자동화 해보기 (0) | 2023.08.03 |
AWS CodeSeries를 활용한 CI/CD 구축 (0) | 2023.07.03 |
AWS EC2 Instance Connect Endpoint 사용해보기 (0) | 2023.06.28 |
AWS Config를 사용해서 미사용 EIP 체크 및 자동 삭제 해보기 (0) | 2023.05.24 |