구글에서 만든 plda 토픽 모델링 라이브러리를 설치하고 사용해 봤음.
그래서 설치 과정을 정리 해보았다.

PLDA 라이브러리

Latent Dirichlet allocation(LDA) 알고리즘은(Blei, 2003) 위의 확률 모델링을 기반으로 주어진 문서에 대해 가장 적합한 토픽과 각 문서의 토픽 비율을 구하는 머신러닝 알고리즘이다.
가장 기초적인 토픽 모델링 알고리즘중 하나라고 할 수 있다.
PLDA는 이 알고리즘을 기반으로 구글에서 만든 알고리즘으로, 병렬처리 로직을 적용하여 기존의 LDA 알고리즘보다 속도를 향상시켰다.
Github에서 오픈소스로 알고리즘 라이브러리가 공개되어있다.

병렬화 lda를 위한 세팅

plda에 사용할 머신들은 서로 ssh로 접속하는 것이 가능해야한다.
그리고 plda를 실행시킬 메인 머신은 ssh로 호스트 네임만 가지고 패스워드 없이 워커로 사용될 다른 머신에 접속이 가능해야한다

메인 머신에서 다음 커맨드를 실행하여 ssh 인증 키를 만들자 passphrase를 입력하라는 문구가 나오면 아무것도 입력하지 말자.

1
ssh-keygen -t rsa

메인머신에서 워커로 사용될 다른 머신 각각에 대해 아래 커맨드를 실행하여 패스워드 없이 접속할 수 있게 한다.
1
2
ssh <워커 머신에 접속시 사용되는 유저 네임>@<워커 머신 아이피> mkdir -p .ssh
cat .ssh/id_rsa.pub | ssh <워커 머신에 접속시 사용되는 유저 이름>@<워커 머신 아이피> 'cat >> .ssh/authorized_keys'

만약 메인머신의 유저 네임과 워커 머신의 유저 이름이 다를 경우 메인 머신에서 워커 머신에 접속할때 유저 이름을 지정해 줘야하며
호스트 이름만 가지고 접속 할 수 없다.

ssh로 유저이름 없이 매핑된 호스트 이름으로 접속 할 수 있도록 ~/.ssh/config 파일을 세팅해줘야한다.
각 머신의 /etc/hostname 파일에 적힌 이름과 매핑 해줘야 한다.

~/.ssh/config
1
2
3
4
5
6
Host worker1
HostName <워커머신1의 아이피>
User <워커머신1의 유저 네임>
Host worker2
HostName <워커머신2의 아이피>
User <워커머신2의 유저 네임>

이렇게 하면 ssh 커맨드 사용 시 Host 옆에 적힌 worker1, worker2만 입력하는 것으로 HostName과 User 세팅에 따라 접속된다.
예를 들어 아래의 커맨드 입력시 ~/.ssh/config에 지정된 worker1의 유저와 아이피 주소로 로그인 된다.
위의 예시에서는 worker1, worker2등의 호스트 네임을 사용했으나 그외의 아무 이름으로 원하는 대로 지정할 수 있다.
1
ssh worker1

ssh 세팅이 끝났으면 apt-get을 사용해 mpich를 메인머신과 워커 머신 모두에 설치하자.

1
sudo apt-get install -y mpich

mpich의 machinefile을 만든다. 머신파일은 각 워커와 메인 머신에서 몇개의 프로세스를 실행시킬지 지정해주는 텍스트 파일이다.
아래 예시의 경우 메인 머신에서는 1개의 프로세스를 worker1에서는 4개의 프로세스, worker2에서는 2개의 프로세스를 사용하도록 지정되어있다.

1
2
3
<메인머신 아이피>:1
worker1:4
worker2:2

mpich 동작 테스트

mpich에서 연결된 머신의 호스트 네임을 프린트하는 커맨드를 실행 예

1
mpiexec -n 7 -f ./machinefile hostname

n 옵션은 실행할 프로세스 수를 가리킨다. 이 수만큼 호스트 네임이 프린트 된다.
-f 옵션은 machinefile을 지정한다.

위에서 예시로 만든 machinefile을 실행시켰다면 아웃풋은 다음과 같을것이다

1
2
3
4
5
6
7
<메인머신 호스트네임>
worker1
worker1
worker1
worker1
worker2
worker2

메인머신과 워커 머신 모두에 plda 프로젝트를 git 를 이용해 클로닝 한다.
모든 머신에서는 같은 디렉토리에 plda 프로젝트가 위치해 있어야 한다.
클로닝한 프로젝트 폴더에서 make all 커맨드를 실행해 빌드를 한다

1
2
3
git clone https://github.com/openbigdatagroup/plda.git
cd plda
make all

병렬화된 PLDA 실행

메인머신의 plda가 설치된 폴더에서 time 커맨드를 사용해 걸리는 시간을 재어봤다
메인머신을 포함 총 4개의 머신을 사용했고 메인머신의 프로세스 수는 1개, 나머지 3개는 4개의 프로세스를 실행하도록 machinefile에 지정했다
iteration 옵션으로 학습 횟수를 100번으로 지정했다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dev@lmwrk04:~/plda$ time mpiexec -f ../hostfile -n 13 ./mpi_lda --num_topics 2 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file /tmp/lda_model.txt --total_iterations 100
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Iteration 0 ...
Training data loaded
Training data loaded
Training data loaded
Training data loaded
Iteration 1 ...
Iteration 2 ...
Iteration 3 ...
.....
.....
real 0m6.949s
user 0m5.995s
sys 0m0.424s

메인 머신의 프로세스 1개만 사용하도록 machine file에서 지정했을 때의 결과는 다음과 같다

1
2
3
real 0m35.057s
user 0m34.731s
sys 0m0.318s

메인 머신의 프로세스 4개만을 사용하도록 machine file에서 지정했을 때의 결과는 다음과 같다

1
2
3
real 0m12.993s
user 0m50.501s
sys 0m1.303s

메인 머신 외에 다른 머신을 사용하면서 메인머신의 프로세스를 1개 이상으로 지정하면 약간 속도가 느려지는 경향이 보인다.
메인 머신의 프로세스를 2개 나머지 3개의 워커 머신의 프로세스를 각각 4개로 지정한 결과이다

1
2
3
real 0m7.436s
user 0m25.887s
sys 0m1.202s

프로젝트에 있는 병렬화 로직을 사용하지 않는 lda를 실행시켰을 경우는 다음과 같은 결과가 나온다. (burnin 75, 학습횟수 100으로 했을 경우)

1
2
3
4
5
6
7
8
time ./lda --num_topics 2 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file /tmp/lda_model.txt --total_iterations 100 --burn_in_iterations 75
Iteration 0 ...
Iteration 1 ...
.....
.....
real 0m26.213s
user 0m25.874s
sys 0m0.309s

mpich를 한머신에서 1개의 프로세스를 사용하도록 했을 때보다는 빠르지만 한 머신에서 4개의 프로세스를 사용하게 했을때보다는 느리다

레퍼런스

  • Blei, D.M., Ng, A.Y., Jordan, M.I.: Latent Dirichlet allocation. Journal of Machine Learning
    Research (2003)
  • WANG, Y., BAI, H., STANTON, M., CHEN, W., AND CHANG, E. 2009. PLDA: Parallel latent dirichlet allocation for
    large-scale applications. In Algorithmic Aspects in Information and Management. 301–314.
  • 구글 PLDA 라이브러리 Github
  • MPICH 웹페이지