1

非常に大きなコーパスにword2vecモデルを訓練して、埋め込まれた単語をRAMに割り当てることはできません。word2vecアルゴリズムをテンソルフローを使用してマルチコンピュータに配布できますか?

私はアルゴリズムの並列化のための既存の解決策、例えばSpark implementationがありますが、私はtensorflowライブラリを使用したいと思います。

可能ですか?

答えて

1

はい、テンソルフローが可能です。そのトリックは、変数の分割を使用することです。 tf.fixed_size_partitionerと、変数サーバーを複数のマシンに分割するtf.train.replica_device_setterを介したレプリケーションがあります。ここでは、コード内でどのように見えるかです:

with tf.device(tf.train.replica_device_setter(ps_tasks=3)): 
    embedding = tf.get_variable("embedding", [1000000000, 20], 
           partitioner=tf.fixed_size_partitioner(3)) 

最良の部分は、これらの変化は非常にローカルであり、研修コードの残りの部分のために、それはどんな違いを確認しないということです。しかし、実行時には大きな違いがあります。すなわち、embeddingは3つのシャードに分割され、それぞれ異なるpsタスクに固定されています。別々のマシンで実行できます。 this relevant questionも参照してください。

1

word2vecの作成者は、HogWild!という非同期SGDを使用してアルゴリズムを実装しました。だから、あなたはこのアルゴリズムのテンソル・フローの実装を探したいかもしれません。

HogWild!では、各スレッドは一度に1つのサンプルを取得し、他のスレッドとの同期なしにウェイトの更新を実行します。異なるスレッドからのこれらの更新は、互いに競合する可能性があり、データ競合状態につながります。しかし、Hogwild!の著者は、モデルのほとんどの異なるインデックスに書き込むので、多くのサンプルが実際に独立している非常に疎なデータセットに対してうまく機能することを示しています。

関連する問題