非常に大きなコーパスにword2vecモデルを訓練して、埋め込まれた単語をRAMに割り当てることはできません。word2vecアルゴリズムをテンソルフローを使用してマルチコンピュータに配布できますか?
私はアルゴリズムの並列化のための既存の解決策、例えばSpark implementationがありますが、私はtensorflowライブラリを使用したいと思います。
可能ですか?
非常に大きなコーパスにword2vecモデルを訓練して、埋め込まれた単語をRAMに割り当てることはできません。word2vecアルゴリズムをテンソルフローを使用してマルチコンピュータに配布できますか?
私はアルゴリズムの並列化のための既存の解決策、例えばSpark implementationがありますが、私はtensorflowライブラリを使用したいと思います。
可能ですか?
はい、テンソルフローが可能です。そのトリックは、変数の分割を使用することです。 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も参照してください。
word2vec
の作成者は、HogWild!
という非同期SGDを使用してアルゴリズムを実装しました。だから、あなたはこのアルゴリズムのテンソル・フローの実装を探したいかもしれません。
HogWild!
では、各スレッドは一度に1つのサンプルを取得し、他のスレッドとの同期なしにウェイトの更新を実行します。異なるスレッドからのこれらの更新は、互いに競合する可能性があり、データ競合状態につながります。しかし、Hogwild!
の著者は、モデルのほとんどの異なるインデックスに書き込むので、多くのサンプルが実際に独立している非常に疎なデータセットに対してうまく機能することを示しています。