Python 在tensorflow2中使用自定义数据生成器进行多线程处理

Python 在tensorflow2中使用自定义数据生成器进行多线程处理,python,multithreading,tensorflow,data-generation,tensorflow2,Python,Multithreading,Tensorflow,Data Generation,Tensorflow2,我一直在keras的tensorflow 1中使用一个自定义数据生成器 model.fit_generator(generator=training_generator, validation_data=validation_generator, use_multiprocessing=True, epochs=epochs, workers=workers, callbac

我一直在keras的tensorflow 1中使用一个自定义数据生成器

model.fit_generator(generator=training_generator,
                    validation_data=validation_generator, 
                    use_multiprocessing=True, epochs=epochs,
                    workers=workers, callbacks=callbacks_list, verbose=2)
效果很好。现在,当我切换到tensorflow2时,我发现不再支持多gpu模型(model)

正如文档中所建议的,我切换到tf.distribute.MirroredStrategy(),因为我运行的是一台带有4个GPU的无头服务器。我还将生成器(“training_generator”)切换为tf.data.Dataset格式:

train_ds = tf.data.Dataset.from_generator(lambda: training_generator,
                                      output_types=((tf.float32, tf.float32, tf.float32, tf.float32), tf.float32),
                                      output_shapes=(([None, 224, 224, 3],
                                                    [None, 625],
                                                    [None, 224, 224, 3],
                                                    [None, 224, 224, 3]),
                                                    [None, 2])
                                      )
但是如何让它运行多个线程呢?以下是我尝试过的(都是从这里开始的:):

  • 用“地图”包装它。这是可行的,但仍然在一个线程中运行,因为我的CPU没有完全加载,GPU正在耗尽
  • train\u dataset=train\u ds.map(lambda x,y:(x,y),num\u parallel\u calls=workers)

  • 使用“交织”
  • generators=tf.data.Dataset.from_tensor_切片(['Gen_0','Gen_1','Gen_2','Gen_3','Gen_4','Gen_5','Gen_6','Gen_7','Gen Gen_8','Gen Gen u9','Gen u10'])

    ` 这会很好地加载CPU和GPU,但似乎会创建数据集的副本。我只想在整个数据集中运行一次,像在model.fit_generator()中一样并行生成批


    任何帮助或见解都将不胜感激

    您可能还需要在映射中“预取”数据集。train_dataset=train_ds.map(lambda x,y:(x,y),num_parallel_calls=workers)。预取(buffer_size=1000)您可能还需要在映射中“预取”数据集。train\u数据集=train\u ds.map(lambda x,y:(x,y),num\u parallel\u calls=workers)。预取(缓冲区大小=1000)
    train_dataset = generators.interleave(lambda x: tf.data.Dataset.from_generator(lambda: training_generator,
                                          output_types=((tf.float32, tf.float32, tf.float32, tf.float32), tf.float32),
                                          output_shapes=(([None, 224, 224, 3],
                                                        [None, 625],
                                                        [None, 224, 224, 3],
                                                        [None, 224, 224, 3]),
                                                        [None, 2])
                                          ),
                        
                        num_parallel_calls=tf.data.experimental.AUTOTUNE)