2015-11-26 16 views
5

Khi tôi chạy mô hình LdaMulticore gensim của trên một máy với 12 lõi, sử dụng:gensim LdaMulticore không đa xử lý?

lda = LdaMulticore(corpus, num_topics=64, workers=10) 

tôi nhận được một tin nhắn đăng nhập mà nói

using serial LDA version on this node 

Một vài dòng sau, tôi thấy một thông báo loging mà nói

training LDA model using 10 processes 

Khi tôi chạy trên cùng, tôi thấy 11 quá trình python đã được sinh ra, nhưng 9 đang ngủ, tức là chỉ có một công nhân hoạt động. Máy có 24 lõi, và không bị choáng ngợp bởi bất kỳ phương tiện nào. Tại sao LdaMulticore không hoạt động ở chế độ song song?

+0

Một lý do có thể là do [tải chậm tập tin 'corpus'] (https://github.com/piskvorky/gensim/issues/288). Kiểm tra mã của bạn để xem mất bao nhiêu thời gian. – Jon

Trả lời

4

Trước tiên, hãy đảm bảo rằng bạn have installed a fast BLAS library, vì hầu hết các công cụ tiêu tốn thời gian được thực hiện bên trong các thường trình cấp thấp cho đại số tuyến tính.

Trên máy của tôi, gensim.models.ldamodel.LdaMulticore có thể sử dụng hết tất cả 20 lõi CPU với workers=4 trong khi đào tạo. Thiết lập công nhân lớn hơn điều này đã không tăng tốc độ đào tạo. One reason might be the corpus iterator is too slow to use LdaMulticore effectively.

Bạn có thể thử sử dụng ShardedCorpus để tuần tự hóa và thay thế corpus, việc đọc/ghi sẽ nhanh hơn nhiều. Ngoài ra, chỉ cần nén tệp .mm lớn của bạn để nó chiếm ít không gian hơn (= ít I/O) hơn cũng có thể hữu ích. Ví dụ:

mm = gensim.corpora.MmCorpus(bz2.BZ2File('enwiki-latest-pages-articles_tfidf.mm.bz2')) 
lda = gensim.models.ldamulticore.LdaMulticore(corpus=mm, id2word=id2word, num_topics=100, workers=4) 
+0

Vấn đề của tôi thực sự là do một nút cổ chai I/O khi tải kho dữ liệu. Tôi tưởng tượng rằng việc sử dụng 'ShardedCorpus' có thể giúp ích - tôi sẽ thử lần sau. Đối với tôi, đơn giản chỉ cần tải toàn bộ kho dữ liệu vào bộ nhớ trước (máy có gần 1 tấn RAM), đã giải quyết được vấn đề. Tải trước là * cách * nhanh hơn tải tài liệu theo yêu cầu. Tôi sẽ thử các đề xuất khác của bạn lần sau! –

+0

không 'corpora.MmCorpus ('some_corpus.mm')' tải trước phần tử trong bộ nhớ? tôi đang mắc kẹt trong vấn đề này quá, nơi mà các logger nói 'bằng cách sử dụng phiên bản LDA nối tiếp trên nút này' và sau đó không có gì .. –