PredictionIO 는 오픈소스로 소프트웨어 개발자가 개인화나 추천 알고리즘 혹은 컨텐츠를 찾아내는 등의 예측 기능을 넣고자 할 때 쓰이는 머신러닝 서버입니다. 사용자 특징이나 성향을 예측하는 엔진을 실제 서비스에 쓰일 단계까지 구현하는 일은 매우 시간 낭비가 될 수 있습니다. PredictionIO의 최신버전인 v0.7 으로 이제 더이상 그럴 필요가 없습니다.
PredictionIO가 어떻게 데이터 프로세스를 간소화하고 개발자 여러분들과 개발 단계에 얼마나 편리하게 쓰일 수 있는지 알려드리겠습니다. 영화 추천 서비스를 예로 들어 설명을 드릴 것입니다. 각각의 사용자마다 “개인화 추천 영화 상위 10개”와 “이 영화를 좋아하면 좋아할 수도 있는 영화 10개”를 추천할 것입니다.
전제조건
우선, 우리가 사용할 PredictionIO의 몇가지 용어에 대해서 알아보겠습니다.
앱
PredictionIO에서 앱은 프로그램 코드에서 말하는 앱과는 다릅니다. 여기서 앱은 PredictionIO를 사용하는 소프트웨어 어플리케이션을 말합니다. 앱은 서로 다른 데이터들간의 논리적인 구분으로 생각할 수 있습니다. 하나의 앱은 여러 엔진을 가질 수 있지만 각각의 엔진은 하나의 앱에만 사용될 수 있습니다.
엔진
엔진은 외부 어플리케이션이 API를 통해 상호작용하는 논리적인 아이덴티티입니다. 엔진에는 두가지 타입이 있습니다: item-recommendation, item-similarity. 각각의 엔진은 서로 다른 기능을 가진 고유한 환경을 제공합니다. 하나의 엔진은 언제든지 하나의 알고리즘만을 가질 수 있습니다.
알고리즘
알고리즘은 예측 모델을 생성하기 위해 실제로 계산을 수행하는 코드입니다. 각각의 엔진은 기본적이고 다용도의 알고리즘을 가지고 있습니다. 혹시 어떤 특정한 기능이 필요한 것이라면, 다른 것과 알고리즘을 바꾸거나 변수값을 조정해도 상관없습니다.
직접 구축해보기
환경 설정
최신 64비트 리눅스 우분투가 설치되어있다고 가정하고 처음 할 일은 Java 7 과 MongoDB를 설치하는 것입니다. Java 7은 sudo apt-get install openjdk-7-jdk
로 설치할 수 있습니다. MongoDB 는 Install MongoDB on Ubuntu를 따라 설치하실 수 있습니다.
참고: 최신 64비트 리눅스 다른 배포판에서도 설치하실 수 있습니다. ArchLinux, CentOS, Debian, Fedora, Gentoo, Slackware 등 다른 배포판에서도 PredictionIO는 정상적으로 동작하며 Mac OS X 또한 지원합니다.
Java 7 은 PredictionIO와 내부에 필요한 아파치 하둡을 실행하는데 필요합니다. 아파치 하둡은 PredictionIO 0.7.0 이후 버전에서는 선택 사항입니다.
MongoDB 2.4.x는 사용자 행동 데이터와 예측 모델을 각각 읽고 쓰는데 필요합니다.
PredictionIO 와 필요한 요소 설치하기
PredictionIO를 설치하기 위해서는 바이너리 배포판을 다운받아 압축을 풀기만 하면 됩니다. 이 글에서는 PredictionIO 0.7.0이 /opt/PredictionIO-0.7.0
에 설치된 상태를 가정하겠습니다. 이 글 후반부에 상대 경로가 사용될 때 별다른 언급이 없다면 이 설치 경로의 상대 경로를 의미합니다.
설치 과정은 Installing PredictionIO on Linux에 자세히 안내되어 있습니다.
PredictionIO의 시작/멈춤은 bin/start-all.sh
와 bin/stop-all.sh
명령어를 사용합니다.
아파치 하둡 설정하기(선택 사항)
PredictionIO는 분산 데이터를 처리하고 저장할 때 아파치 하둡을 이용합니다. 아파치 하둡은 vendors/hadoop-1.2.1 에 설치되어 있습니다. 다음은 몇가지 최적화를 위한 안내 사항입니다.
vendors/hadoop-1.2.1/conf/hdfs-site.xml
dfs.name.dir
과 dfs.data.dir
은 크고 지속 가능한 저장 공간을 가리킬 때 설정합니다. 기본값으로는 임시 저장 공간(일반적으로 /tmp
)을 가리키는데 이 공간은 OS에 의해서 주기적으로 삭제될 수 있습니다.
vendors/hadoop-1.2.1/conf/mapred-site.xml
mapred.tasktracker.map.tasks.maximum
과 mapred.tasktracker.reduce.tasks.maximum
은 mapper와 reducer 작업(데이터 프로세싱 작업)의 최대값을 조절합니다. 처음에는 첫번째 값은 CPU 코어 수로 하고 두번째 값은 첫번째 값의 절반으로 하는 것이 좋습니다. 분리된 머신에서는 하둡을 동작하지 않을 것이라면 실제 서비스할 때는 여분을 위해 조금 줄여야 합니다.
mapred.child.java.opts
는 각 mapper와 reducer 작업에 대해 자바 가상 머신 옵션을 조절합니다. 보통 모든 mapper와 reducer가 동작할 때도 적당한 메모리를 갖고 있는게 좋습니다. 최대 4개의 mapper와 2개의 reducer를 가지고 있다면 여러분의 머신이 10GB 이상의 메모리를 가지고 있는 경우 각각 1GB 힙 공간(-Xmx1g)(총 최대 6GB)가 적당합니다.
io.sort.mb
는 내부 소트 버퍼 사이즈를 조절하며 보통 자식 힙 공간의 절반값을 갖습니다. 1GB를 설정해두셨다면 512MB가 좋습니다.
PredictionIO 앱 만들기
서버의 9000포트를 통해 동작하는 PredictionIO 웹 UI에 접속하실 수 있습니다.
접속 후 “Add an App” 버튼을 눌렀을 때 보이는 첫 화면입니다. 앱을 추가하려면 앱의 이름을 넣고 “Add” 버튼을 누르기만 하면 됩니다.
PredictionIO에 데이터 가져오기
데이터를 가져오기 전에 타겟이 되는 앱의 앱 키값이 필요합니다. 앱 옆에 있는 “Develop” 버튼을 누르면 됩니다. 이 사진은 그 이후에 나타나는 화면입니다.
The app key for the “ml100k” 앱의 키값은 위에 보이는 것처럼NO5FpSnGh1F3PUi7xiSGc910q63z6rxZ4BcYe039Jjf2sTrqyjOc1PmQ3MJowNwM
입니다. 앱의 키값은 고유한 값이며 여러분이 만든 앱의 키값은 이와 달라야 합니다.
MovieLens 100k 데이터셋을 파싱하고 PredictionIO로 가져오기 위해 import_ml.rb Gist.를 사용하는 방법이 있습니다. PredictionIO Ruby gem이 필요하며 sudo gem install predictionio
명령어로 설치할 수 있습니다.
전체 데이터를 가져오는 방법은 단순합니다:
ruby import_ml.rb NO5FpSnGh1F3PUi7xiSGc910q63z6rxZ4BcYe039Jjf2sTrqyjOc1PmQ3MJowNwM u.data
u.data
는 MovieLens 100k 데이터셋에서 가져온 파일이며 Grouplens 웹사이트를 통해 가져올 수 있습니다.
엔진 추가하기
“Add an Engine” 버튼을 눌러 간단하게 두개의 엔진을 추가할 수 있습니다. 이 경우 “itemrec” 와 “itemsim” 엔진을 추가하였습니다. 일단 추가되고나서는 자동으로 기본 스케쥴에 맞추어 트레이닝을 시작할 것입니다.
예측 결과 얻기
이제 아래의 두가지 예제 URL(8000 포트의 API 서버)를 통해 예측 결과를 얻을 수 있습니다:
“개인화 추천 영화 상위 10개”:
http://localhost:8000/engines/itemrec/itemrec/topn.json?pio_appkey=NO5FpSnGh1F3PUi7xiSGc910q63z6rxZ4BcYe039Jjf2sTrqyjOc1PmQ3MJowNwM&pio_n=10&pio_uid=1
“이 영화를 좋아하면 좋아할 수도 있는 영화 10개….”:
http://localhost:8000/engines/itemsim/itemsim/topn.json?pio_appkey=NO5FpSnGh1F3PUi7xiSGc910q63z6rxZ4BcYe039Jjf2sTrqyjOc1PmQ3MJowNwM&pio_n=10&pio_iid=1
pio_uid
와 pio_iid
변수값을 바꾸어 또 다른 사용자/아이템에 해당하는 결과값을 얻을 수 있습니다. 결과값들을 확인하기 위해 이 변수들을 이용할 수도 있고 이 과정을 단순화하기 위해 커뮤니티에서 만든 공식 SDK 를 활용할 수도 있습니다. 오픈소스로 개발중인 SDK 또한 가능합니다.
PredictionIO v0.7 에서 새로운 점들
With the new extended support to GraphChi – 디스크-기반의 대규모 그래프 계산 프레임워크 – 에 대한 지원과 더불어 개발자들은 이제 하나의 플랫폼을 통해 GraphChi와 아파치 Mahout 에서 알고리즘을 평가하고 디플로이하는 것이 가능합니다!
즐겨보세요!
본 글은 Donald Szeto와 Robert Nyman[편집자]의 Introducing PredictionIO 한국어 번역본입니다.
작성자: Hoony Chang
Web Programmer
댓글이 없습니다.