tensorflow tf.data 为多输入、多输出Keras模型和分布式训练从大型numpy数组中提取管线

xriantvc  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(158)

该问题涉及给定相应numpy数组的多输入多输出Keras(Tensorflow)模型的最优设置。
例如,假设输入数组x1x2以及输出数组y1y2。tf.data可以按如下方式构建www.example.com数据集:

train_data = tf.data.Dataset.zip(
    (
        tf.data.Dataset.from_tensor_slices(
            (
                x1,
                x2,
            )
        ),
        tf.data.Dataset.from_tensor_slices(
            (
                y1,
                y2,
            ),
        ),
    )
)

上述代码适用于小数组和单GPU训练。在完整数据/模型中,使此方法不可行/不可取的两个约束是:

  1. numpy数组足够大,超过了2 GB Protobuf的限制。
    1.使用tf.distribute.mirroredStrategy在多个GPU上分发训练。
    传输数据的最佳方式是什么?
pdsfdshx

pdsfdshx1#

最好的办法似乎是
(1)从每个数组独立创建tf数据集,并使用tf zip将它们压缩到一个数据集中,这应该可以使用户绕过2GB的限制。
(2)使用concatenate方法链接tf.data数据集。
(3)使用分布式策略定义和编译keras模型,并使用model.fit训练模型。分布式策略处理在不同GPU上估计模型以及根据需要共享数据以促进多GPU训练的大部分繁重工作。
如果每个数组太大,无法使用from_tensor_slices(https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_tensor_slices)形成tf数据集,那么这种方法就不起作用。在这种情况下,我发现最好将单个大数组拆分为多个不同的数组,并使用上述过程。许多典型的解决方案(例如https://www.pythonfixing.com/2022/01/fixed-using-datasets-from-large-numpy.html)不是为分布式训练设计的。

相关问题