sagemaker水平缩放张量流(keras)模型

2024-04-27 03:16:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我大致遵循这个脚本fashion-MNIST-sagemaker。你知道吗

我在笔记本上看到了

from sagemaker.tensorflow import TensorFlow

tf_estimator = TensorFlow(entry_point='mnist_keras_tf.py', 
                          role=role,
                          train_instance_count=1, 
                          train_instance_type='local',
                          framework_version='1.12', 
                          py_version='py3',
                          script_mode=True,
                          hyperparameters={'epochs': 1}
                         )

我想知道我能在多大程度上使用train_instance_count参数。它是否会自动沿某个维度分配培训?如果是,维度是什么?你知道吗

此外,在基于keras(使用tensorflow)的环境中水平分布训练通常有意义吗?你知道吗


Tags: instancepy脚本versiontftensorflowcount笔记本
1条回答
网友
1楼 · 发布于 2024-04-27 03:16:44

分布式培训是特定于模型和框架的。并不是所有的模型都易于分发,而且从ML框架到ML框架的工作也不一样容易。它很少是自动的,TensorFlow和Keras更是如此。

在数据并行范式下,神经网络在概念上易于分布,即给定小批量的梯度计算在工作人员之间进行分配,工作人员可以是同一主机中的多个设备(多设备)或每个多设备的多个主机(多设备多主机)。D2L.ai课程提供了神经网络如何分布herehere的深入视图。你知道吗

Keras过去很容易以多设备、单主机的方式通过^{}, which will sadly get deprecated in 4 months分发。在您的例子中,您似乎引用了多主机模型(多台机器),这需要编写特别的同步代码,如this official tutorial中的代码。你知道吗

现在让我们看看这和SageMaker有什么关系。你知道吗

SageMaker提供了3种算法开发选项。使用分布式培训可能需要不同数量的自定义工作,具体取决于您选择的选项:

  1. 内置算法是一个由18个预先编写的算法组成的库。它们中的许多被编写成分布在单主机多GPU或多GPU多主机中。使用第一个选项,除了将train_instance_count>;1设置为分布在多个实例上之外,您无需做任何事情

  2. 框架容器(您正在使用的选项)是为流行的框架(TensorFlow、PyTorch、Sklearn、MXNet)开发的容器,提供了预编写的docker环境,您可以在其中编写任意代码。在这个选项中,一些容器将支持一次单击创建临时训练集群来进行分布式训练,但是使用大于1的train_instance_count不足以分发模型的训练。它只会在多台机器上运行你的脚本。为了分发您的培训,您必须在mnist_keras_tf.py脚本中编写适当的分发和同步代码。对于某些框架,这样的代码修改将非常简单,例如对于TensorFlow和Keras,SageMaker预装了Horovod。Horovod是一种点对点环式通信机制,它只需要很少的代码修改,并且具有高度的可伸缩性(initial annoucement from UberSageMaker docSageMaker exampleSageMaker blog post)。我的建议是尝试使用Horovod来分发代码。类似地,在apachemxnet中,您可以轻松地创建参数存储,以分布式方式承载模型参数,并从多个节点与它们同步。MXNet的可扩展性和易分发性是Amazon喜欢它的原因之一。

  3. 自带容器要求您编写docker容器和算法代码。在这种情况下,您当然可以将培训分布到多台机器上,但还必须编写机器到机器的通信代码

对于您的具体情况,我的建议是首先在一个节点上横向扩展,在一个越来越大的机器类型上使用多个gpu,因为当您从单主机切换到多主机上下文时,延迟和复杂性会急剧增加。如果真的有必要,使用多节点上下文,如果使用Horovod,事情可能会更简单。 在任何情况下,SageMaker的工作都要简单得多,因为它可以管理临时的、每秒计费的集群的创建,并具有内置的、日志记录、元数据和工件持久性,还可以处理来自s3的快速训练数据加载,在训练节点上进行分片。你知道吗

注意分布式培训的相关性:请记住,当您在N台设备上分发一个在一台设备上运行良好的模型时,通常会将批大小增加N,以便每个设备的批大小保持不变,并且每个设备都保持忙碌。这会分散urb你的模型收敛,因为更大的批量意味着噪音更小的SGD。一种常见的启发式方法是将学习率增加N(更多信息在this great paper from Priya Goyal et al),但另一方面,这会导致前两个时期的不稳定性,因此有时与学习率预热有关。随着新思想的不断涌现,将SGD扩展到大批量生产仍然是一个活跃的研究问题。有时,要通过大量的批量来获得良好的模型性能,需要进行专门的研究和大量的参数调整,有时甚至需要花费额外的资金来寻找如何更好地进行分配,以克服最终运行的更快培训带来的好处。分布式训练有意义的一种情况是,单个记录表示太多的计算,无法在设备上形成足够大的物理批,这种情况出现在大的输入大小(如高清图片上的视觉)或大的参数计数(如BERT)上。这就是说,对于那些需要非常大的逻辑批处理的模型,你不一定要在物理上分配东西:你可以通过你的单个GPU连续运行N个批处理,并等待每个设备N个批处理,然后再进行梯度平均和参数更新,以模拟拥有N倍大的GPU。(一种聪明的方法,有时称为梯度积累法)

相关问题 更多 >