DL4J在GoogleNews-vectors文件上超级慢

时间:2015-08-29 21:27:52

标签: machine-learning deep-learning word2vec deeplearning4j nd4j

我尝试在DL4J上执行以下示例(加载预先训练的矢量文件):

File gModel = new File("./GoogleNews-vectors-negative300.bin.gz");

Word2Vec vec = WordVectorSerializer.loadGoogleModel(gModel, true);

InputStreamReader r = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(r);

for (; ; ) {
    System.out.print("Word: ");
    String word = br.readLine();

    if ("EXIT".equals(word)) break;

    Collection<String> lst = vec.wordsNearest(word, 20);

    System.out.println(word + " -> " + lst);
}

但它超级慢(计算最近的单词需要大约10分钟,但它们是正确的。)

内存足够(-Xms20g -Xmx20g)。

当我从https://code.google.com/p/word2vec/

运行相同的Word2Vec示例时

它非常快地给出最近的单词。

DL4J使用的ND4J声称速度是Numpy的两倍:http://nd4j.org/benchmarking

我的代码有什么问题吗?

更新:它基于https://github.com/deeplearning4j/dl4j-0.4-examples.git(我没有触及任何依赖项,只是尝试阅读Google预训练的矢量文件)。 Word2VecRawTextExample工作正常(但数据大小相对较小)。

2 个答案:

答案 0 :(得分:0)

为了提高性能,我建议您执行以下操作:

  1. 将环境变量OMP_NUM_THREADS设置为等于逻辑核心数

  2. 如果您使用英特尔处理器,请安装英特尔Math Kernel Library

  3. 在您的路径中添加来自Intel Math Kernel library的mkl_intel_thread.dll所在的信息

答案 1 :(得分:0)

这篇文章确实很老,但到现在应该已经有了很大的改进。我已经在生产环境中使用以下设置在@JVM级别上运行了具有Word2vec模型的DL4J,它可以在t2.large框上运行,并且具有8G RAM或更高版本。

java -Xmx2G -Dorg.bytedeco.javacpp.maxbytes = 6G -Dorg.bytedeco.javacpp.maxphysicalbytes = 6G

我还没有使用wordsNearest()方法,因为它带有必须预先计算语料库嵌入的限制,而不是编写我自己的余弦相似度来执行亚毫秒级的响应。

该博客的帖子在这里

https://medium.com/sumvit/building-text-similarity-system-from-ground-up-using-word2vec-and-deeplearning4j-dece9ae4e433

如果您想知道如何构建最接近的单词或任何其他应用程序,例如文本相似性(相同的基本原理)