自定义分布式 ML 引擎实验所需的代码更改

Code changes needed for custom distributed ML Engine Experiment

我完成了这个 tutorial on distributed tensorflow experiments within an ML Engine experiment and I am looking to define my own custom tier instead of the STANDARD_1 tier that they use in their config.yaml 文件。如果使用 tf.estimator.Estimator API,是否需要任何额外的代码更改来创建任意大小的自定义层?例如,文章建议:"If you distribute 10,000 batches among 10 worker nodes, each node works on roughly 1,000 batches." 所以这表明下面的 config.yaml 文件是可能的

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: complex_model_m
  workerCount: 10
  parameterServerCount: 4

是否需要对 mnist 教程进行任何代码更改才能使用此自定义配置?这是否会像教程建议的那样在 10 个工人中分配 X 个批次?我查看了其他一些 ML 引擎样本,发现 reddit_tft 使用分布式训练,但他们似乎在他们的训练包中定义了自己的 runconfig.cluster_spectask.py 尽管他们也是使用 Estimator API。那么,是否需要任何额外的配置?我目前的理解是,如果使用 Estimator API(即使在您自己定义的模型中),则不需要进行任何其他更改。

如果 config.yaml 指定使用 GPU,这会发生任何变化吗?这个 article 建议使用 Estimator API "No code changes are necessary as long as your ClusterSpec is configured properly. If a cluster is a mixture of CPUs and GPUs, map the ps job name to the CPUs and the worker job name to the GPUs." 但是,由于 config.yaml 专门标识参数服务器和工作人员的机器类型,我希望在 ML-Engine 中ClusterSpec 将根据 config.yaml 文件正确配置。但是,我无法找到任何 ml-engine 文档来确认无需更改即可利用 GPU。

最后,在 ML-Engine 中,我想知道是否有任何方法可以识别不同配置的使用情况? "If you distribute 10,000 batches among 10 worker nodes, each node works on roughly 1,000 batches." 这行表明使用额外的 worker 大致是线性的,但我对如何确定是否需要更多参数服务器没有任何直觉?可以检查什么(在云仪表板或张量板上)以确定它们是否有足够数量的参数服务器?

are any additional code changes needed to create a custom tier of any size?

否;无需对 MNIST 示例进行任何更改即可使其适用于不同数量或类型的工作人员。要在 CloudML 引擎上使用 tf.estimator.Estimator,您必须让程序调用 learn_runner.run,如 exemplified in the samples. When you do so, the framework reads in the TF_CONFIG environment variables and populates a RunConfig object with the relevant information such as the ClusterSpec。它会自动在参数服务器节点上做正确的事情,它会使用提供的 Estimator 开始训练和评估。

大多数奇迹的发生是因为 tf.estimator.Estimator 自动使用了正确分配操作的设备 setter。该设备 setter 使用来自 RunConfig 对象的集群信息,默认情况下,其构造函数使用 TF_CONFIG 来发挥其魔力(例如 here). You can see where the device setter is being used here.

这一切都意味着您可以通过 adding/removing 工人 and/or 改变他们的类型来改变您的 config.yaml 并且通常应该可以正常工作。

有关使用自定义 model_fn 的示例代码,请参阅 census/customestimator 示例。

也就是说,请注意,当您添加工作人员时,您正在增加有效批量大小(无论您是否使用 tf.estimator,这都是真实的)。也就是说,如果您的 batch_size 是 50 而您使用的是 10 个工人,这意味着每个工人正在处理大小为 50 的批次,有效批次大小为 10*50=500。那么如果你将worker的数量增加到20,你的有效batch size就变成了20*50=1000。您可能会发现您可能需要相应地降低学习率(线性似乎通常效果很好;ref)。

I poked around some of the other ML Engine samples and found that reddit_tft uses distributed training, but they appear to have defined their own runconfig.cluster_spec within their trainer package: task.pyeven though they are also using the Estimator API. So, is there any additional configuration needed?

无需额外配置。 reddit_tft 示例确实实例化了自己的 RunConfig,但是,RunConfig 的构造函数使用 TF_CONFIG 获取在实例化期间未明确设置的任何属性。它这样做只是为了方便计算出有多少参数服务器和工人。

Does any of this change if the config.yaml specifies using GPUs?

除了可能需要手动将操作分配给 GPU 之外(但这并非特定于 CloudML Engine),您无需更改任何内容即可将 tf.estimator.Estimator 用于 GPU;有关详细信息,请参阅 this article。我会研究澄清文档。