1

私はケラス、テンソルフロー1でカスタムデータジェネレーターを使用しています

model.fit_generator(generator=training_generator,
                    validation_data=validation_generator, 
                    use_multiprocessing=True, epochs=epochs,
                    workers=workers, callbacks=callbacks_list, verbose=2)

それはうまくいきました。tensorflow2 に切り替えたところ、multi_gpu_model(model) がサポートされなくなっていることがわかりました。

ドキュメントで提案されているように、4 つの GPU を備えたヘッドレス サーバーで実行しているため、tf.distribute.MirroredStrategy() に切り替えました。また、ジェネレーター (「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])
                                      )

しかし、複数のスレッドで実行するにはどうすればよいでしょうか? これが私が試したものです(両方ともここから: https://medium.com/@nimatajbakhsh/building-multi-threaded-custom-data-pipelines-for-tensorflow-f76e9b1a32f5 ):

  1. 「マップ」でラップします。これは機能しますが、CPU が完全にロードされておらず、GPU が不足しているため、単一のスレッドで実行されます。

train_dataset = train_ds.map(lambda x,y: (x,y), num_parallel_calls=workers)

  1. 「インターリーブ」の使用

generators = tf.data.Dataset.from_tensor_slices(['Gen_0', 'Gen_1', 'Gen_2', 'Gen_3', 'Gen_4', 'Gen_5', 'Gen_6', 'Gen_7','Gen_8','Gen_9', 'Gen_10'])

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)

` これにより CPU がロードされ、GPU に適切に供給されますが、データセットのコピーが作成されるようです。私が望むのは、データセット全体を一度実行し、以前は model.fit_generator() で可能だったように並列でバッチを生成することだけです

どんな助けや洞察も大歓迎です!

4

0 に答える 0