Parallel processing 为什么并行处理比普通代码花费更长的时间?

Parallel processing 为什么并行处理比普通代码花费更长的时间?,parallel-processing,nlp,python-multiprocessing,gensim,word2vec,Parallel Processing,Nlp,Python Multiprocessing,Gensim,Word2vec,其想法是用不同的新语料库集更新一个特定的预训练word2vec模型。我有以下几点 # c1, c2 are each a list of 100 files filelist = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10] def update_model(files): # loading a pre-trained model trained_model = gensim.models.Word2Vec.load("mode

其想法是用不同的新语料库集更新一个特定的预训练word2vec模型。我有以下几点

# c1, c2 are each a list of 100 files
filelist = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10]

def update_model(files):
    # loading a pre-trained model
    trained_model = gensim.models.Word2Vec.load("model_both_100")
    # Document feeder is an iterable
    docs = DocumentFeeder(files)
    trained_model.build_vocab(docs, update=True)
    trained_model.train(docs, total_examples=trained_model.corpus_count, epochs=trained_model.epochs)

with Pool(processes=10) as P:
    P.map(update_model, filelist)

跑步大约需要13分钟。但是非并行版本(在
文件列表上循环)需要约11分钟。为什么会发生这种情况?在12核cpu上运行。

Gensim的
Word2Vec
培训已经使用了多个线程,具体取决于模型创建时的
workers
参数。(默认情况下使用
workers=3
,但您的模型可能已初始化为使用更多。)

因此,您将启动10个(重量级)进程,每个进程分别加载一个全尺寸模型。这很容易引发大量内存使用&从而导致虚拟内存交换

然后,这些模型中的每一个都进行自己的(单线程)词汇表扩展,然后进行(一个管理线程和3个或更多工作线程)培训。如果它们同时都在训练中,则意味着在12核处理器上的10个操作系统进程中有40个线程处于活动状态。在这种情况下,没有必要期望加速,线程比内核多的争用,以及所有争用访问完全不同的加载模型内存范围的争用,都可以很容易地解释减速的原因


你真的在尝试创建10个独立的增量更新模型吗?(更新培训后,他们是否会被重新保存到10个不同的文件名?

是。我正是这样想的。我将保存10个单独的增量更新模型(但仅限于关键向量)。事实上,我必须做1000多次,我将发布一个关于如何优化空间的单独问题。那么,如何使过程更快?我正在从事高性能计算集群的工作,并且对云计算也有一些预算。什么是优化/加快流程的最佳解决方案?作为一个单独的问题,这种增量培训充满了原始模型和增量更新之间的平衡和兼容性的难题。我不知道你的全部设置和目标,但是我怀疑对同一个基本模型的这样的十个(或1000个)交替增量更新并不能提供你所希望的值。对于速度来说,尝试在同一台机器上进行多进程并行化需要仔细考虑交换、内存争用的问题,我提到的核心论点。根据您的完整集群资源,最有意义的做法是尽可能快地找出单个模型的更新内容—参数、工作线程等—然后在N台完全不同的机器上重复这一点(在没有争用的机器上)。