我尝试在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工作正常(但数据大小相对较小)。
答案 0 :(得分:0)
为了提高性能,我建议您执行以下操作:
将环境变量OMP_NUM_THREADS设置为等于逻辑核心数
如果您使用英特尔处理器,请安装英特尔Math Kernel Library
答案 1 :(得分:0)
这篇文章确实很老,但到现在应该已经有了很大的改进。我已经在生产环境中使用以下设置在@JVM级别上运行了具有Word2vec模型的DL4J,它可以在t2.large框上运行,并且具有8G RAM或更高版本。
java -Xmx2G -Dorg.bytedeco.javacpp.maxbytes = 6G -Dorg.bytedeco.javacpp.maxphysicalbytes = 6G
我还没有使用wordsNearest()方法,因为它带有必须预先计算语料库嵌入的限制,而不是编写我自己的余弦相似度来执行亚毫秒级的响应。
该博客的帖子在这里
如果您想知道如何构建最接近的单词或任何其他应用程序,例如文本相似性(相同的基本原理)