2016-09-28 4 views
-1

私は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(); 
+0

あなたのコードを共有した場合や、spark-submitを実行した方法についての詳細がいくつかあります。あなたが走っている時、いつもあなたの労働者のすべてが活発に見えますか? SparkのヒストリーUIはあなたを掘り下げることができます。コードが実行可能ではなく、コードを完全に配布していない可能性があります。 Spark MLには、データフレームAPIに基づくJavaWord2Vecが含まれています。これは非常に速くなければなりません。 – tadamhicks

+0

spark ml JavaWord2Vec(dataframes api)がmllibバージョン(javardd api)よりも優れているはずですか?モデルベクトルを反復しようとするとコンパイルエラーが発生していたので、私はspark mlバージョンを中止しました。 – Kabutops

+0

データフレームAPIの後ろにある触媒オプティマイザは、より性能が高く、より簡単でなければなりません。あなたは反復しないでしょう、それはスパークを使う恐ろしい悪い方法です。 MLでは、選択した列のすべての値について基本的に機能マップを実行するパイプラインを構築できます。ここでも、コードが役に立ちます。 – tadamhicks

答えて

1

コメント、回答、落とし穴から判断私は自分の質問に正しくフレームを当てることができなかったと思います。しかし、私が知りたいことへの答えははいです。あなたのword2vecモデルをスパーク時に並行して訓練することは可能です。この機能のプル要求がバック長い時間に作成された:Javaで

https://github.com/apache/spark/pull/1719

を、スパークmllibでWord2Vecオブジェクトのセッターメソッド(setNumPartitions)があります。これにより、2つ以上のエグゼキュータ上でword2vecモデルを並行してトレーニングすることができます。

私たちの実装は、よりスケーラブルにするために、我々は別に各パーティションを訓練し、各反復の後、各パーティションのモデルをマージモデルがより正確にするために、複数の反復:上記のプル要求のコメントを1として "

これは誰かに役立つことを願っています。

+0

ベンチマークはありますか?私はgensim、元のword2vec、sparkの比較にも興味があります..(Sparkは他の2つのモデルと比較してskipgramモデルを使用しました) –

+0

DataFrameを使用しても、デフォルトでSpark w2vはデフォルトで1つのエグゼキュータをトレーニング用に使用しています。あなたが述べたように、setNumPartitionsを使用して並列に訓練を受ける必要があります。それを指摘していただきありがとうございます。個人的には、デフォルト値のためのひどい設定だと思います。 – Pete

0

私はあなたのコードで、本質的に間違って何も表示されません(MBの10秒のオーダーの)小さいデータファイルに正常に実行されます。ただし、データフレームAPIを検討することを強くお勧めします。例として、ここでは頻繁に周りにスローされる少しチャートです:

enter image description here

また、私はそれが実際にどのように彼らはありません(あなたは、データフレームの要素の上に「繰り返し処理」されている可能性が方法がわかりません作業)。ここでSpark online docsからの例です:

enter image description here

あなたは一般的な考えを持っている...しかし、あなたは最初、データフレームとしてデータを並列化する必要があります。代わりにjavarddをDataFrameに変換するのは簡単です。

DataFrame fileDF = sqlContext.createDataFrame(jrdd, Model.class); 

スパークは、MRの代わりにDirected Acyclic Graph(DAG)を実行しますが、コンセプトは同じです。あなたのデータ上で'fit()を実行すると、実際にはそのデータがワーカー上で実行され、単一のモデルに縮小されます。しかし、このモデルは、それを書き留めてしまうまで、それ自体がメモリに分散されます。

しかし、トライアルとして、NLTKやWord2VecのネイティブC++バイナリを使って同じファイルを実行するのにどれくらいの時間がかかりますか?

最後に考えたのは、あなたがメモリとディスクに耐え続ける理由はありますか?スパークにはネイティブの.cache()があり、デフォルトではメモリに保存されています。 Sparkのパワーは、メモリに保持されたデータを機械学習することです。メモリ内の大きなデータ。ディスクに永続化すると、kryoを使用してもディスクI/Oでボトルネックが発生します。 IMHOを試す最初のことは、これを取り除き、記憶にとどまることです。パフォーマンスが向上すれば、優れていますが、DataFramesを介してCatalystの能力に頼ることで、飛躍的なパフォーマンスが実現します。

私たちが議論しなかったことは、あなたのクラスタです。ノードあたりのメモリ量...ノードあたりのコア数...(ほとんどのvHostsのようにプロビジョニングされた)リソースを求めている他のアプリケーションでクラスタが仮想化されているかどうかについて考えることは役に立ちます。あなたのクラウドはクラウドにありますか?共有または専用?

スパークのUIを見て、コードのランタイム操作を分析しましたか?モデルがフィッティングしている間に労働者にtopを実行すると、何が表示されますか?あなたは完全なCPU使用率を見ることができますか?あなたは--executor-coresを指定して、CPUをフルに活用してみましたか?

私は、すべての作業が1つのワーカーノード上の1つのコアで何度も行われていることを何度も見てきました。この情報があれば役立つでしょう。

パフォーマンスのトラブルシューティングの際には、Sparkの設定ファイル自体を含め、多くの場所を見ることができます。

+0

プログラムがメモリ内のjrddをキャッシュできなかったため、私はメモリとディスクに永続化しました。私はこの問題に直面したときにデフォルト設定(メモリのみ)を変更しました。ベンチマークとしても、同じファイルは、上記の10台のマシンよりも強力な1台のマシンで、Pythonでgensimで30分で実行されます(4xコア数、同じRAM)。私は設定レベルの設定についてもっと話していると思います。 Sparkがword2vecモデルをどのように呼び出すか、つまりデータを分割したり、これらの分割のために別々のモデルを作成したり、それらを単一のモデルに縮小したりする方法を知りたがっていますか? – Kabutops

関連する問題