gensim - 使用多核 CPU 用 gensim 训练 Doc2vec 效率不高

标签 gensim

我正在使用 24 核虚拟 CPU 和 100G 内存来训练 Doc2Vec 与 Gensim,但无论修改核数,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 并没有直接这样做。

最佳答案

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

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

  • negative 的较大值, size , & window
  • 避免迭代器中的任何复杂步骤(如标记化)——理想情况下,它只会从简单的磁盘格式
  • 流式传输
  • 尝试不同的 worker计数 - 最佳计数将根据您的其他参数和系统详细信息而有所不同,但通常在 3-12 范围内(无论您拥有多少个内核)

  • 此外,最新版本的 gensim提供另一种语料库规范方法:corpus_file指向已用空格分隔的、每行文本文件的指针。如果您以这种方式提供文本,多个线程将分别读取优化代码中的原始文件 - 并且可以实现更高的 CPU 利用率。但是,在此模式下,您无法指定自己的文档 tags ,或多个 tag每个文件。 (这些文档将根据它们在文件中的行号获得唯一的 ID。)

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

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

    关于gensim - 使用多核 CPU 用 gensim 训练 Doc2vec 效率不高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57532018/

    相关文章:

    machine-learning - 如何使用 FastText 查找相似的句子(词汇外的句子)

    python - 使用 Gensim 显示 "Slow version of gensim.models.doc2vec being used"

    nlp - 是否有一种语义相似度方法在语义准确性方面优于 word2vec 方法?

    gensim - 当dbow_words设置为1或0时,doc2vec模型之间有什么不同?

    python - 停止句子标记器在 "no."缩写上分割句子

    python - 如何在标准环境中将文件加载到 Google-App-Engine

    gensim - 在 gensim 0.12 上加载预训练向量时出错

    python - 如何获取Gensim LSI模型中的主题分数?

    python - 如何使用经过训练的 skipgram 模型预测单词?

    python - 了解 Gensim LDA 模型中的参数