Ich experimentierte mit Funken und MLLIB, um ein Word2Vec-Modell zu trainieren, aber ich habe nicht die Leistungsvorteile des verteilten maschinellen Lernens auf großen Datensätzen. Mein Verständnis ist, dass, wenn ich w Worker habe, dann, wenn ich eine RDD mit n Anzahl von Partitionen erstellen, wo n> w und ich versuche, ein Word2Vec Modell durch Aufrufen der Fit-Funktion von Word2Vec mit der RDD als Parameter zu erstellen, würde Funke verteilen die Daten einheitlich zu trainieren Word2vec Modelle auf diese w Worker und verwenden Sie eine Art von Reduzierer-Funktion am Ende, um ein einzelnes Ausgabemodell von diesen w-Modellen zu erstellen. Dies würde die Berechnungszeit verringern, statt 1 Chunk, w Chunks von Daten werden gleichzeitig verarbeitet. Der Kompromiss besteht darin, dass je nach der am Ende verwendeten Reduzierfunktion ein gewisser Präzisionsverlust auftreten könnte. Funktioniert Word2Vec in Spark tatsächlich auf diese Weise oder nicht? Ich muss möglicherweise mit den konfigurierbaren Parametern spielen, wenn dies tatsächlich der Fall ist.Distributed Word2Vec Model Training mit Apache Spark 2.0.0 und MLLIB
EDIT
Hinzufügen der Grund, diese Frage hinter fragen. Ich habe java function word2vec code auf 10 Arbeitsmaschinen ausgeführt und geeignete Werte für executor-memory, driver memory und num-executors, nach Durchlaufen der Dokumentation, für eine 2.5gb Eingabetextdatei gesetzt, die auf rdd-Partitionen gemappt wurde, die dann als verwendet wurden Trainingsdaten für ein mllib word2vec-Modell. Der Trainingsteil dauerte mehrere Stunden. Die Anzahl der Arbeiterknoten scheint keinen großen Einfluss auf die Trainingszeit zu haben. Der gleiche Code läuft erfolgreich auf kleinere Datendateien (in der Größenordnung von 10s von MBs)
-Code
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();
Es würde helfen, wenn Sie Ihren Code und einige weitere Details darüber, wie Sie Ihre Spark-Submit ausgeführt haben. Wenn Sie aktiv sind, sehen Sie alle Ihre Mitarbeiter ständig aktiv? Mit der Spark History UI können Sie sich einarbeiten. Es besteht die Möglichkeit, dass Ihr Code nicht performant ist und Sie Ihren Code nicht vollständig verteilen. Spark ML enthält JavaWord2Vec, das auf der Datenrahmen-API basiert. Dies sollte sehr schnell sein. – tadamhicks
Soll der Funke ml JavaWord2Vec (Dataframes api) besser sein als die mllib-Version (javardd api). Ich hatte die Funke-ml-Version aufgegeben, weil es einige Kompilierungsfehler gab, als ich versuchte, über die Modellvektoren zu iterieren. – Kabutops
Der Katalysator-Optimierer hinter der Datenrahmen-API ist viel leistungsfähiger und sollte einfacher sein. Sie würden nicht iterieren, das ist eine schreckliche schlechte Art, Spark zu benutzen. Mit ML können Sie Pipelines erstellen, die im Wesentlichen eine funktionale Zuordnung für alle Werte für die ausgewählte Spalte ausführen. Auch hier würde Code helfen. – tadamhicks