我一直在嘗試火花mllib來訓練word2vec模型,但我似乎並沒有越來越分佈式機器學習對大數據集的性能優勢。我的理解是,如果我有w個工人,那麼,如果我創建了n個分區的RDD,其中n> w,我嘗試通過調用Word2Vec的擬合函數並將RDD作爲參數來創建Word2Vec模型,則spark將分佈數據統一在這些工作人員上訓練單獨的word2vec模型,並在最後使用某種類型的reducer函數從這些w模型創建單個輸出模型。這會減少計算時間而不是1塊,同時處理大塊數據。這種權衡取決於最終使用的減速器功能,可能會發生某些精度損失。 Spark中的Word2Vec實際上以這種方式工作嗎?如果確實如此,我可能需要使用可配置的參數。分佈式Word2Vec模型訓練使用Apache 2.0.0星火和mllib
編輯
添加背後問這個問題的原因。我在10臺工作機器上運行了java spark word2vec代碼,並在通過文檔後爲執行程序內存,驅動程序內存和num-executors設置了合適的值,用於2.5gb輸入文本文件,該文本被映射到rdd分區,然後用作訓練mllib word2vec模型的數據。培訓部分需要多個小時。工作節點的數量似乎對訓練時間沒有太大影響。相同的代碼成功運行在較小的數據文件
代碼
SparkConf conf = new SparkConf().setAppName("SampleWord2Vec");
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
conf.registerKryoClasses(new Class[]{String.class, List.class});
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<List<String>> jrdd = jsc.textFile(inputFile, 3).map(new Function<String, List<String>>(){
@Override
public List<String> call(String s) throws Exception {
return Arrays.asList(s.split(","));
}
});
jrdd.persist(StorageLevel.MEMORY_AND_DISK());
Word2Vec word2Vec = new Word2Vec()
.setWindowSize(20)
.setMinCount(20);
Word2VecModel model = word2Vec.fit(jrdd);
jrdd.unpersist(false);
model.save(jsc.sc(), outputfile);
jsc.stop();
jsc.close();
如果你分享了你的代碼和關於你如何運行spark-submit的更多細節,這將會有所幫助。當你跑步時,你是否看到你的所有工作人員始終處於活動狀態? Spark歷史用戶界面可讓您深入瞭解。有可能您的代碼無法正常運行,並且您沒有完全分配代碼。 Spark ML包含基於數據幀API的JavaWord2Vec。這應該是非常快的。 – tadamhicks
火花ml JavaWord2Vec(dataframes api)應該比mllib版本(javardd api)更好。我放棄了火花ml版本,因爲當我嘗試遍歷模型向量時,它給出了一些編譯錯誤。 – Kabutops
數據幀API背後的催化劑優化器性能更高,應該更容易。你不會迭代,這是一個糟糕的方式來使用Spark。 ML允許您構建管道,該管道基本上針對所選列的所有值執行功能映射。再次,代碼會有所幫助。 – tadamhicks