bab2min / tomotopy

Python package of Tomoto, the Topic Modeling Tool
https://bab2min.github.io/tomotopy
MIT License
548 stars 62 forks source link

PARTITION 옵션 사용방법에 대해 문의드립니다. #177

Closed Minsu-Song closed 1 year ago

Minsu-Song commented 1 year ago

안녕하세요,

tomotopy에서 LDA model을 돌리는 중에 궁금한 점이 있어서 여쭤봅니다.

제가 부족한 부분이 많아 기본적인 질문이라도 양해 부탁드립니다.

여쭤보고 싶은 것은 두 가지 입니다.

Q1. 제가 시도한 부분은 수 백만개 이상의 토픽으로 tp.LDAModel로 모델 설정 후 train을 할 때 속도를 향상시키는 것입니다. 이를 위해서, 0.5.0 버전 이후에 추가된 parallel 옵션과 ParallelScheme.PARTITION 알고리즘을 사용해 보려고 model.train(0, parrell = 숫자), model.train(0, PARTITION = 4) 등의 여러가지 시도를 해보았는데 에러가 뜨거나 속도 향상을 체감(및 측정)하지 못했습니다. 혹시, tomotopy API documentation의 train 함수에서 "병렬화의 기본값은 디폴트로 최적의 방법을 tomotopy가 선택"해준다고 하는데 그럼 속도를 더 향상시킬 수는 없다고 해석해야 될까요? 구글링도 해봤지만 원하는 답을 찾지 못하여 여쭤보게 되었습니다.

Q2. tomotopy를 GPU 환경(CUDA같은)에서 돌리는 것도 고려가 되고 있나요?

Topic Modeling에 있어 만들어주신 좋은 코드 잘 사용하고 있습니다.

감사합니다.

bab2min commented 1 year ago

안녕하세요 @Minsu-Song 님, LDA의 경우 기본적으로 ParallelScheme.PARTITION 알고리즘을 사용합니다. 다른 알고리즘과의 속도를 비교해보고 싶으시다면 아래와 같이 parallel 옵션을 바꿔가며 실험해보시면 되겠습니다.

model.train(1000, parallel=tp.ParallelScheme.NONE) # 병렬화 사용 안함
model.train(1000, parallel=tp.ParallelScheme.COPY_MERGE) # Copy & merge 사용
model.train(1000, parallel=tp.ParallelScheme.PARTITION) # Partition 사용 (기본값)

이와는 별개로 토픽의 개수가 수백만개 이상이라고 말씀하셨는데, 사실 토픽 모델링은 (document, vocab) 행렬을 (document, topic) * (topic, vocab) 행렬로 압축하는 것이기 때문에 어휘의 개수보다 토픽의 개수가 더 많으면 의미가 없습니다. 보통 문헌에 나오는 어휘들이 수 만개에서 많아봐야 십여만개 정도 되는걸 감안할때, 그보다 훨씬 많은 수 백만개의 토픽을 가지고 토픽 모델링을 수행하는건 잘못된 접근이라고 생각합니다. 토픽 개수는 수 백개에서 수 천개 정도가 현실적으로 의미있는 범위일듯합니다.

GPU로 돌리는 시도도 해봤는데요, 사실 LDA의 경우는 샘플링 연산은 단순하고 메모리 접근이 많은 편이라 GPU에서 다소 비효율적으로 돌아갑니다. Neural Topic Model 계열이라면 GPU에서 돌리는게 유리할 수 있습니다만 tomotopy에서는 이에 대한 계획이 없습니다.

Minsu-Song commented 1 year ago

안녕하세요.

빠르고 정확한 답변 감사합니다.

죄송합니다. 제가 잘못말씀드렸네요.

토픽이 아닌 어휘가 수백만개라는 말씀을 드린것이었습니다.

GPU에 대한 답변도 감사합니다!