我已经能够在分布式谷歌云 ML 中运行代码,但是当我运行它时,数据会在集群内的每台机器上复制,但我想在每台机器上分发数据。
如何在云 ML 上的集群内的每台机器上分发数据?请帮忙!!!!
我已经能够在分布式谷歌云 ML 中运行代码,但是当我运行它时,数据会在集群内的每台机器上复制,但我想在每台机器上分发数据。
如何在云 ML 上的集群内的每台机器上分发数据?请帮忙!!!!
通常,在分布式异步训练中,不是让每个工作人员在数据的非重叠分区上进行训练,而是希望每个工作人员处理所有数据。
在异步训练中,参数不会等待接收来自所有工作人员的更新——它会在更新时处理它们。因此,如果一个工作人员比其他工作人员慢,那么它将比其他工作人员提供更少的更新。如果您对数据进行分区,使得每个工作人员只能访问自己的数据,这意味着您实际上是在降低属于较慢工作人员的示例的权重,因为它们导致对参数的更新较少。这会对模型的质量和通用性产生不利影响。
如果您使用同步训练并强制更新等待所有工作人员,您可以安全地将数据分区到工作人员之间,但是,训练将与最慢的工作人员一样慢,因为每个步骤都必须等待所有工作人员的更新。如果您不强制所有工作人员进行更新,那么情况实际上可能比异步训练更糟糕,因为来自慢工作人员的示例可能会被完全忽略。
因为它更健壮,所以异步训练更常见。
幸运的是,让所有员工检查所有数据通常是明智之举。只要您随机化数据(此处和此处),那么在任何给定时间(在所有工作人员中)检查的示例都是一组 batch_size * num_workers 示例,随机抽样(几乎)均匀,并从完整数据集中进行替换。
这种在异步训练中读取数据的规范方法在实践中通常效果很好,尤其是在分布式训练中。但是,如果您有这么多数据,您只能执行几个 epoch 的训练,您的模型可能会受益于查看每个示例的相同次数(无需替换的采样)。这更复杂,更不健壮,但可以做到;那是一个单独的帖子。