我有一个数据输入流水线,它有。
tf.Tensor
(口述)我一直想把这个装进一个... tf.data
pipeline,我被卡在了并行运行多个数据点的预处理上。到目前为止,我已经尝试了以下方法。
Dataset.from_generator(gen)
并在生成器中进行预处理;这样做是可行的,但它会按顺序处理每个数据点,无论这些数据点是如何排列的 prefetch
和假冒 map
调用我对它进行修补。是不是不能并行预取?tf.py_function
好让我 map
在我的Dataset上同步进行,但 py_function
会被移交给(单进程)python解释器,所以我只能使用python GIL,这对我帮助不大。interleave
但还没有找到任何没有前两个想法的问题。我是否遗漏了什么?我是否被迫修改我的预处理,使其能够在图中运行,或者有什么方法可以进行多处理?
我们之前的方法是使用keras.Sequence,效果很好,但是有太多的人推崇升级为 tf.data
API。(地狱,甚至尝试用tf 2.2的keras.Sequence也会得到 WARNING:tensorflow:multiprocessing can interact badly with TensorFlow, causing nondeterministic deadlocks. For high performance data pipelines tf.data is recommended.
)
注:我用的是tf 2.2rc3。
你可以尝试添加 batch()
之前 map()
在你的输入流水线中。
它通常是为了减少小地图函数调用的开销,见这里。https:/www.tensorflow.orgguidedata_performance#vectorizing_mapping
然而,你也可以用它来获取一批输入到你的地图上的数据 py_function
并使用python multiprocessing
在那里,以加快事情的发展。
这样你就可以绕过GIL的限制,这就使得 num_parallel_calls
在 tf.data.map()
无用 py_function
地图功能。