word2vec算法可以使用tensorflow分布在多机上吗?
Can word2vec algorithm be distributed on multi-computers using tensorflow?
我想在一个非常大的语料库上训练 word2vec 模型,这样嵌入的单词就不能分配给 RAM。
我知道算法并行化有现有的解决方案,例如 Spark implementation,但我想使用 tensorflow 库。
可以吗?
word2vec
的作者使用称为 HogWild!
的异步 SGD 实现了该算法。所以你可能想寻找这个算法的张量流实现。
在HogWild!
中,每个线程在不与其他线程同步的情况下一次获取一个样本并执行对权重的更新。来自不同线程的这些更新可能会相互覆盖,从而导致数据竞争条件。但是 Hogwild!
作者表明它适用于非常稀疏的数据集,其中许多样本实际上几乎是独立的,因为它们写入了模型的大部分不同索引。
是的,在 tensorflow 中开箱即用是可能的。诀窍是使用变量分区,例如tf.fixed_size_partitioner
, and parameter server replication via 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
任务,您可以 运行一台单独的机器。另见 。
我想在一个非常大的语料库上训练 word2vec 模型,这样嵌入的单词就不能分配给 RAM。
我知道算法并行化有现有的解决方案,例如 Spark implementation,但我想使用 tensorflow 库。
可以吗?
word2vec
的作者使用称为 HogWild!
的异步 SGD 实现了该算法。所以你可能想寻找这个算法的张量流实现。
在HogWild!
中,每个线程在不与其他线程同步的情况下一次获取一个样本并执行对权重的更新。来自不同线程的这些更新可能会相互覆盖,从而导致数据竞争条件。但是 Hogwild!
作者表明它适用于非常稀疏的数据集,其中许多样本实际上几乎是独立的,因为它们写入了模型的大部分不同索引。
是的,在 tensorflow 中开箱即用是可能的。诀窍是使用变量分区,例如tf.fixed_size_partitioner
, and parameter server replication via 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
任务,您可以 运行一台单独的机器。另见