我想在一个包含1亿行的大型数据集上训练Tensorflow神经网络,每行约15000个特征。单个机器上的培训可能会太慢,所以我想分布式运行。
到目前为止我看到的所有分布式示例都是从将整个数据加载到内存然后发送到从属服务器开始的,这在我的情况下太贵了。
有谁知道如何设置让奴隶在他们的训练数据中流?目前,这些数据存储在Google云端存储中,但我们可以对此进行灵活处理。
答案 0 :(得分:1)
虽然我从未尝试过如此多的样本(只是出于兴趣,你在训练什么数据集?),我认为你应该使用Queuerunner对象!
可以在此页面上找到它们:https://www.tensorflow.org/programmers_guide/reading_data,在"创建要使用QueueRunner对象预取的线程"部分中找到它们。
关于它们如何运作的引用:
简短版本:上面列出的许多tf.train函数都添加了 tf.train.QueueRunner对象到你的图表。这些要求你 在进行任何培训之前,请致电tf.train.start_queue_runners 推理步骤,或它将永远挂起。这将启动线程 运行输入管道,填充示例队列以便出列 得到的例子会成功。这最好结合一个 tf.train.Coordinator在有时会干净地关闭这些线程 错误。
该页面推荐的代码模式是:
# Create the graph, etc.
init_op = tf.global_variables_initializer()
# Create a session for running operations in the Graph.
sess = tf.Session()
# Initialize the variables (like the epoch counter).
sess.run(init_op)
# Start input enqueue threads.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
while not coord.should_stop():
# Run training steps or whatever
sess.run(train_op)
except tf.errors.OutOfRangeError:
print('Done training -- epoch limit reached')
finally:
# When done, ask the threads to stop.
coord.request_stop()
# Wait for threads to finish.
coord.join(threads)
sess.close()
虽然Stackoverflow总是喜欢完整的解释而不是相关页面的链接,但我在上面链接的页面上有更多的信息!
很想知道这是否解决了你的问题,祝你好运!
答案 1 :(得分:0)
这可以分两步完成: 1)根据task_id(或worker#)正确索引输入数据 2)将数据检索封装在tf.device范围内(类似于inception_distributed_train.py:113)
(假设您使用适当的馈线来打开数据的迭代器)
示例:1个参数服务器,4个工作者,1个输入数据表
在每个worker的tf.device范围内,打开数据句柄,并确保每个worker读取一个唯一的行。因此,如果您有n个worker,请确保为每个worker增加n + task_id的表迭代器。在示例设置中,您将有4个工作程序从相同的基本行编号(0)+ task_id开始。这意味着worker 0(task_id = 0)将读取第0行; worker 1(with task_id = 1)将读取第1行...等等。只要你按行数增加行迭代器,每个将拉动独立的行拉出唯一行。