使用Gensim训练Doc2vec不能有效地使用多核CPU

时间:2019-08-16 23:07:02

标签: gensim

我正在使用24核虚拟CPU和100G内存来通过Gensim训练Doc2Vec,但是无论如何修改核数,CPU的使用率始终约为200%。

top

enter image description here

htop

enter image description here

以上两张图片显示了cpu使用率,这表明cpu使用效率不高。

cores = multiprocessing.cpu_count()
assert gensim.models.doc2vec.FAST_VERSION > -1, "This will be painfully slow otherwise"

simple_models = [
    # PV-DBOW plain
    Doc2Vec(dm=0, vector_size=100, negative=5, hs=0, min_count=2, sample=0, 
            epochs=20, workers=cores),
    # PV-DM w/ default averaging; a higher starting alpha may improve CBOW/PV-DM modes
    Doc2Vec(dm=1, vector_size=100, window=10, negative=5, hs=0, min_count=2, sample=0, 
            epochs=20, workers=cores, alpha=0.05, comment='alpha=0.05'),
    # PV-DM w/ concatenation - big, slow, experimental mode
    # window=5 (both sides) approximates paper's apparent 10-word total window size
    Doc2Vec(dm=1, dm_concat=1, vector_size=100, window=5, negative=5, hs=0, min_count=2, sample=0, 
            epochs=20, workers=cores),
]

for model in simple_models:
    model.build_vocab(all_x_w2v)
    print("%s vocabulary scanned & state initialized" % model)

models_by_name = OrderedDict((str(model), model) for model in simple_models)

编辑:

我尝试使用参数corpus_file代替文档,并解决了上述问题。但是,我需要调整代码并将all_x_w2v转换为文件,而all_x_w2v并没有直接这样做。

1 个答案:

答案 0 :(得分:1)

Python全局解释器锁(“ GIL”)和其他线程间瓶颈使经典gensim Word2Vec / Doc2Vec / etc灵活的语料库迭代器可以防止其代码使所有CPU内核饱和。可以提供任何可重复的文本序列。

您可以通过以下步骤来提高吞吐量:

  • 更大的negativesizewindow

  • 避免迭代器中执行任何复杂的步骤(例如标记化)-理想情况下,它将仅从简单的磁盘格式流式传输

  • 使用不同的worker计数进行实验–最佳计数将根据您的其他参数和系统详细信息而变化,但是通常在3到12之间(无论您拥有多少个内核)< / p>

此外,gensim的最新版本提供了另一种语料库指定方法:corpus_file指针指向已经由空格分隔的每行文本文件。如果以这种方式提供文本,则多个线程将各自以优化的代码读取原始文件,并且有可能实现更高的CPU利用率。但是,在这种模式下,您将无法指定自己的文档tags,或者每个文档不止一个tag。 (将根据文件中的行号为其分配唯一的ID。)

请参阅Doc2Vec的文档及其参数corpus_file

https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.Doc2Vec