是Keras&x27中保证的批次顺序;订单排队者?
我有一个自定义的是Keras&x27中保证的批次顺序;订单排队者?,keras,queue,sequence,Keras,Queue,Sequence,我有一个自定义的keras.utils.sequence,它以特定(和关键)顺序生成批 但是,我需要跨多个核心并行批处理生成。名称“orderedQueuer”是否意味着结果队列中批次的顺序保证与原始keras.utils.sequence的顺序相同 我认为此订单无法保证的原因: OrderedeQueuer在内部使用python的多处理异步应用 Keras的文档明确指出,OrderedQueuer保证不会重复批次,但并不保证订单 我认为这是: 名字 我知道keras.utils.sequenc
keras.utils.sequence
,它以特定(和关键)顺序生成批
但是,我需要跨多个核心并行批处理生成。名称“orderedQueuer
”是否意味着结果队列中批次的顺序保证与原始keras.utils.sequence
的顺序相同
我认为此订单无法保证的原因:
多处理异步应用李>
Keras的文档明确指出,OrderedQueuer
保证不会重复批次,但并不保证订单
我认为这是:
名字李>
我知道keras.utils.sequence
对象是可索引的
我在Keras的github上找到了测试脚本,这些脚本似乎是为了验证订单而设计的——尽管我找不到任何关于这些脚本是否通过,或者它们是否真正具有决定性的文档李>
如果这里的顺序没有得到保证,我将欢迎任何关于如何在保持保证顺序的同时对批量准备进行并行化的建议,附带条件是它必须能够对任意python代码进行并行化-我相信例如tf.data.Dataset
API不允许这样做(tf.py_函数
调用原始python进程)。是的,它是有序的
通过以下测试亲自检查
首先,让我们创建一个伪序列
,在等待随机时间后只返回批次索引(随机时间是为了确保批次不会按顺序完成):
现在,让我们创建一个测试函数来创建并使用排队器。
该函数获取工作人员的数量,并打印所花费的时间以及返回的结果
def test(workers):
enq = tf.keras.utils.OrderedEnqueuer(DataLoader())
enq.start(workers = workers)
gen = enq.get()
results = []
start = datetime.datetime.now()
for i in range(30):
results.append(next(gen))
enq.stop()
print('test with', workers, 'workers took', datetime.datetime.now() - start)
print("results:", results)
结果:
test(1)
test(8)
1名工人的测试时间为0:00:45.093122
结果:[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]
对8名工人进行的测试于0:00:09.127771进行
结果:[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]
请注意:
- 8个工人比1个工人快得多->它正在并行化ok
- 这两种情况的结果都是有序的
太棒了-非常感谢您清晰、解释清楚的回答!@hanneswhittingham,:)-很乐意帮忙。如果你认为它回答了你的问题,请把这个标记为“回答”。
test(1)
test(8)