私はsparkとmllibを使ってword2vecモデルをトレーニングしていますが、大規模なデータセットで分散型機械学習のパフォーマンス上の利点は得られていないようです。私が理解しているのは、もしn人のパーティションでn個のパーティションを持つRDDを作成し、n> wでWord2VecモデルをWord2Vecのフィット関数をパラメータとしてRDDで呼び出しようとすると、データを一様に訓練してこれらの作業者のword2vecモデルを訓練し、最後に何らかのリデューサ関数を使用してこれらのwモデルから単一の出力モデルを作成します。これにより、1チャンクではなく計算時間が短縮され、データのチャンクが同時に処理されます。トレードオフは、最終的に使用される減速機の機能に依存して、精度がいくらか失われる可能性があることです。 SparkのWord2Vecは実際にこのように動作するのですか?実際にそうである場合は、設定可能なパラメータで遊ぶ必要があるかもしれません。Apache Spark 2.0.0とmllibを使った分散型Word2Vecモデルトレーニング
EDIT
この質問をして背後にある理由を追加します。私はJavaのspark word2vecコードを10人のワーカーマシン上で走らせて、実行ディスクメモリ、ドライバメモリ、num executorの適切な値を設定しました。文書化した後、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のヒストリーUIはあなたを掘り下げることができます。コードが実行可能ではなく、コードを完全に配布していない可能性があります。 Spark MLには、データフレームAPIに基づくJavaWord2Vecが含まれています。これは非常に速くなければなりません。 – tadamhicks
spark ml JavaWord2Vec(dataframes api)がmllibバージョン(javardd api)よりも優れているはずですか?モデルベクトルを反復しようとするとコンパイルエラーが発生していたので、私はspark mlバージョンを中止しました。 – Kabutops
データフレームAPIの後ろにある触媒オプティマイザは、より性能が高く、より簡単でなければなりません。あなたは反復しないでしょう、それはスパークを使う恐ろしい悪い方法です。 MLでは、選択した列のすべての値について基本的に機能マップを実行するパイプラインを構築できます。ここでも、コードが役に立ちます。 – tadamhicks