Word2Vec:使用 Gensim 和 Google-News 数据集-执行时间非常慢
Word2Vec: Using Gensim and Google-News dataset- Very Slow Execution Time
密码在python。我在 python 上将二进制模型加载到 gensim 中,并使用 "init_sims" 选项来加快执行速度。 OS 是 OS X。
加载它需要将近 50-60 秒。和找"most_similar"的时间相当。这是正常的吗?在使用 init_sims 选项之前,它花费了几乎两倍的时间!我感觉这可能是 OS RAM 分配问题。
model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True)
model.init_sims(replace=True)
model.save('SmallerFile')
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT
model=Word2Vec.load('SmallerFile',mmap='r')
#GIVE RESULT SER!
print model.most_similar(positive=['woman', 'king'], negative=['man'])
请注意,init_sims(replace=True)
的内存节省效果不会在 save/load 周期内持续存在,因为保存总是会保存 'raw' 向量(单位归一化向量可以从中保存重新计算)。因此,即使在您重新加载后,当您第一次调用 most_similar()
时,init_sims()
也会在后台调用,并且内存使用量会增加一倍。
而且,GoogleNews 数据集非常大,甚至在单位规范化可能使内存使用量翻倍之前就需要 3+ GB 的空间来加载。因此,根据你还有什么 运行 和机器的 RAM,你可能在 most_similar()
计算 运行 时使用交换内存——这对于计算来说非常慢——针对每个向量和排序结果的相似性操作。 (不过,第一次之后的任何 most_similar()
检查都不需要重新填充单位标准化向量缓存,因此应该比第一次调用更快。)
鉴于您在 init_sims(replace=True)
之后保存了模型,其原始向量已经单位归一化。因此,您可以在 load()
:
之后手动修补模型以跳过重新计算
model.syn0norm = model.syn0
那么即使是您的第一个 most_similar()
也只会查询(单个内存映射的)向量集,而不会触发 init_sims()
。
如果仍然太慢,您可能需要更多内存或将向量 trim 到一个子集。 GoogleNews 向量的排序似乎是将最常用的词放在最早的位置,因此丢弃最后的 10%、50%、甚至 90% 可能仍会留下一组有用的最常用词。 (您需要通过查看模型对象和源代码来执行此操作 trim。)
最后,您可以使用最近邻索引来获得更快的前 N 个匹配,但代价是额外的内存和近似结果(可能会错过一些真正的前 N 个匹配)。 annoytutorial.ipynb IPython notebook of the demo IPython notebooks, in the gensim docs/notebooks
目录下的最新 gensim 版本中有一个 IPython notebook 教程。
密码在python。我在 python 上将二进制模型加载到 gensim 中,并使用 "init_sims" 选项来加快执行速度。 OS 是 OS X。 加载它需要将近 50-60 秒。和找"most_similar"的时间相当。这是正常的吗?在使用 init_sims 选项之前,它花费了几乎两倍的时间!我感觉这可能是 OS RAM 分配问题。
model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True)
model.init_sims(replace=True)
model.save('SmallerFile')
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT
model=Word2Vec.load('SmallerFile',mmap='r')
#GIVE RESULT SER!
print model.most_similar(positive=['woman', 'king'], negative=['man'])
请注意,init_sims(replace=True)
的内存节省效果不会在 save/load 周期内持续存在,因为保存总是会保存 'raw' 向量(单位归一化向量可以从中保存重新计算)。因此,即使在您重新加载后,当您第一次调用 most_similar()
时,init_sims()
也会在后台调用,并且内存使用量会增加一倍。
而且,GoogleNews 数据集非常大,甚至在单位规范化可能使内存使用量翻倍之前就需要 3+ GB 的空间来加载。因此,根据你还有什么 运行 和机器的 RAM,你可能在 most_similar()
计算 运行 时使用交换内存——这对于计算来说非常慢——针对每个向量和排序结果的相似性操作。 (不过,第一次之后的任何 most_similar()
检查都不需要重新填充单位标准化向量缓存,因此应该比第一次调用更快。)
鉴于您在 init_sims(replace=True)
之后保存了模型,其原始向量已经单位归一化。因此,您可以在 load()
:
model.syn0norm = model.syn0
那么即使是您的第一个 most_similar()
也只会查询(单个内存映射的)向量集,而不会触发 init_sims()
。
如果仍然太慢,您可能需要更多内存或将向量 trim 到一个子集。 GoogleNews 向量的排序似乎是将最常用的词放在最早的位置,因此丢弃最后的 10%、50%、甚至 90% 可能仍会留下一组有用的最常用词。 (您需要通过查看模型对象和源代码来执行此操作 trim。)
最后,您可以使用最近邻索引来获得更快的前 N 个匹配,但代价是额外的内存和近似结果(可能会错过一些真正的前 N 个匹配)。 annoytutorial.ipynb IPython notebook of the demo IPython notebooks, in the gensim docs/notebooks
目录下的最新 gensim 版本中有一个 IPython notebook 教程。