对于Parameserverstrategy V2,我们将从几个方面进行研究:如何与群集建立联系,如何生成变量,如何获取数据以及如何运行。它也在MirroredStrategy中引入,因此本文主要着眼于如何使用以及如何初始化它。在下一篇文章中,我们将重点介绍如何分发计算。
[翻译] TensorFlow分布式论文大规模机器学习异质分布
[翻译] TensorFlow分布式论文“在Tensorflow中的控制流的实现”
[源代码分析] TensorFlow分布式环境(1)---总体体系结构
[源代码分析] TensorFlow分布式环境(2)---主静态逻辑
[源代码分析] TensorFlow分布式环境(3)---工人静态逻辑
[源代码分析] TensorFlow分布式环境(4)--- WorkerCache
[源代码分析] TensorFlow分布式环境(5)---会话
[源代码分析] TensorFlow分布式环境(6)---主动力学逻辑
[源代码分析] TensorFlow分布式环境(7)---工人动态逻辑
[源代码分析] TensorFlow分布式环境(8)---通信机制
[翻译]使用TensorFlow进行分布式培训
[源代码分析] TensorFlow分布式分布式strategy的基本文章
[源代码分析] TensorFlow的分布式变量
[源代码分析] TensorFlow分布式分布式MirroredStrategy
[源代码分析] TensorFlow分布式参数Verstrategy V1
在TensorFlow 2中,参数服务器培训由TF.Distribution.experental.parameterserserservertrategy类支持。该课程将培训步骤分配给一个可以扩展到数千名工人(伴随参数服务器)的集群。
支持培训有两种主要方法:
无论API(模型,拟合或自定义培训周期),Tensorflow 2中的分布式培训都将涉及以下概念:带有多个家庭作业(Job)的“群集”可能包括一项或多项作业。使用参数服务器培训,建议使用以下配置:
协调员负责创建资源,分配培训任务,编写检查点和处理任务。工人和参数服务器运行tf.distribution.Server来收听协调员的请求。
如果使用了“ model.fit” API,则参数服务器培训需要协调使用tf.distribution.experental.parameterserserserstrategy和tf.keras.utils.utils.experental.datasetcreator.datasetcreator.similor与其他策略的工作,其工作表包括:创建和编译包括:创建和汇编,模型,准备回电,致电Model.Fit。
TensorFlow 2建议使用中央协调的体系结构进行参数服务器培训。每个工作人员和参数服务器运行tf.distribution.server。基于此,协调员任务负责创建资源,调度函数以及对工人和参数服务器进行协调培训。协调员使用tf.distribution.experiment.coordinator.clustercoordinator.clusterCoordinator来协调群集并使用tf.distribution.distribution.experimenter.parameterserstraterstraterategygy.parameterstraterstergygy为了定义参数服务器上的变量和工人的计算。在自定义训练周期中,tf.distribution.experiment.coordinator.clustercoordinator类是协调员的关键组件。
ClusterCoordinator提供的最重要的API是时间表。
除了计划远程函数外,ColusterCoordinator还有助于在所有工人上创建数据集,并在工作人员从失败中恢复时重建这些数据集。
如上所述,参数服务器培训集群需要协调器任务来运行您的培训程序。该程序包括一个或多个工人和参数服务器,它们运行TensorFlow服务器卡车评估任务。
以下是如何初始化Parameserverstrategy的样本。无论是使用model.fit还是自定义周期,都需要此步骤。在使用GPU进行培训的顺序中,您需要为每个工作人员分配可见的GPU。参数将在每个工人上使用所有可用的GPU,但都有一个限制:所有:工人应具有相同数量的GPU。
对于variable_partitioner,这是一个distribute.experental.partitioner.partitioner,指定如何区分变量。如果没有,则不会划分变量,这些特征如下:
在真实的生产环境中,用户需要在不同机器上的所有不同过程中运行培训任务。在每个任务上配置群集信息的最简单方法是设置“ tf_config”环境变量,并使用tf.distribution.cluster_resolver.tfconfigclusterresolver分析“ tf_config”。如果用户使用kubernetes或其他配置模板开始训练任务,则这些模板很可能已经设置了“ TF_Config”
2.2.1设置“ tf_config”环境变量假设您有3个工人和3个参数服务器,那么Worker 1的“ TF_Config”可以如下:
2.2.2使用二进制文件,如果您想使用二进制文件运行所有这些任务,则需要指出不同的分支机构负责在程序开始时处理不同的角色。
以下代码启动了TensorFlow服务器并等待完成。
初始化方法如下。主要工作是连接到群集,然后调用_Exted以继续初始化。
_connect_to_cluster在连接到群集中扮演角色。它的主要逻辑是设置过滤器,然后调用remote.connect_to_cluster以连接群集。
Connect_to_cluster方法将连接到给定的群集以使设备可用。如果给定的本地作业名称未出现在群集规范中,则将自动添加并在本地主机上使用未使用的端口。
如果工人访问资源或在过滤后的远程设备上启动程序/功能,则将导致未知的设备错误。对于任何远程任务,如果没有设备过滤器,则所有群集设备都是可见的;如果指定了设备过滤器,则任务只能看到至少一个过滤器的设备匹配。任务本身总是可见的。
以下是样本。
特定connect_to_cluster的代码如下。
set_server_def将调用_initialize_logical_devices初始化逻辑设备。
_initialize_logical_devices将调用上下文对象的方法和其他一些实现功能的方法。
我们以tfe_contextlistdevies为例,它称为上下文的ListDevices方法。
如何实现上下文需要特定情况和特定分析,例如上下文生成的以下代码。
在Connect_TO_CLUSTER中,ops.device(master_device).nter()被调用以设置主设备。代码位于tensorflow/python/python/framework/ops.py.device.device.device.device.device_or_function参数可以是设备名称字符串,设备名称函数,设备函数,设备名称函数,或无:
KERAS通过Model.Fit提供了轻松使用的训练API,该API可以处理幕后的训练周期,并通过重写火车和回调方法提供灵活性。它还提供了诸如检查点保存或张板抽象保存等功能。通过模型。适合,仅通过简单地交换策略对象才能将相同的培训代码用于其他策略。
使用参数服务器培训的Model.FIT需要在Callace中提供输入数据,该数据接收tf.distribution.inputContext参数并返回tf.data.dataset..data.dataset.thy系统将创建tf.kerras.utils.utils.utils.experental.datasetcreator对象,它接受上面的callace,并通过input_options参数创建一个可选的tf.distribution.inputOptions对象。
请注意,建议使用参数服务器训练和重复数据,并在“拟合调用”中指定sptep_per_epoch,以便库知道Epoch的边界。
有关InputContext参数的更多信息,请参见官方分布式输入教程。
DATASET_FN中的代码将在每个工人的输入设备上调用。该设备通常是CPU。
处理数据后,用户需要创建一个tf.keras.model,然后进行模型呼叫以合并组件,例如优化器,测量或参数(例如steps_per_executin)。
在调用模型之前,要进行实际培训,您需要准备常见工作所需的回调,例如。
注意:由于性能考虑因素,自定义在与paramerterverstrategy一起使用时无法覆盖批次级别调整。请在epoch -level调用中修改自定义回调,然后将STEPS_PER_EPOCH调整为适当的值。step_per_epoch是model.fit的必要参数。
即使选择型号。适合训练路径,也可以选择一个实例化的tf.distribution.experental.coordinator.clusterCoordinator对象来安排要在工作人员上执行的其他功能。
使用tf.distribution.Strategy的自定义训练周期为定义培训周期提供了极大的灵活性。通过上述参数verstrategy(作为策略),用户可以使用tf.distribution.costerdirmentiment.costerdirdinator.costerdindinator,将培训步骤安排给远程工人。
与其他tf.distribution.Strategy培训周期一样,用户需要创建一个模型来定义数据集和步骤函数。在确保有效数据集的顺序中,建议使用下面提到的分布式数据集来创建APIS.in添加,请确保在worker_fn中调用stragity.run,以便您可以充分利用分配给工人的GPU。
让我们看一下如何创建这些组件。
首先,编写一个函数来创建一个数据集,其中包括由keras预处理层实现的预处理逻辑。我们在dataset_fn之外创建这些层,但在dataset_fn中应用,因为我们将把数据集包装在tf.function中,不允许创建该层其中的变量。
以下是构建数据的代码。
然后使用dataset_fn包装训练数据集。
接下来,让我们构建一个模型和其他对象,以确保这些变量是在stragity.scope下创建的。
然后,您需要确保将所有变量分为固定的Shardspartitioner分为两个碎片,并将每个碎片分配给不同的参数服务器。
第三步是使用TF.Function创建训练步骤。
在上面的训练步骤功能中,调用策略。run和stragity.STEP_FN中的reduce可以支持每个工作人员的多个GPU。在分配了工人后,策略。RUN将在多个模型副本上分配数据集。
使用ParamterVersategy定义所有计算后,您将使用tf.distribution.experental.coordinator.clustercoordinator类来创建资源并将培训步骤分配给远程工人。
然后为每个工人创建一个数据集和一个迭代器。在以下PER_WORKER_DATASET_FN中,建议将DataSet_FN包装到ST Exourn.distribution_datasets_from_function中,以使数据无效地将数据提高到GPU。
最后一步是使用ColusterCoordinator.schedule分配给远程工人。
以下是远程值的结果。
或者,您可以在等待时开始所有步骤并做某事。
上面代码中的数据集是使用clusterCoordinator.create_per_worker_dataset api创建的,clusterCoordinator.schedule方法的输入参数将设置为工人的相应切片。
目前,clusterCoordinator.schedule方法假设工人是相同的,因此假定不同工人上的数据集是相同的。
另一个重要的预防措施是TF.DATA数据集不支持跨任务边界的隐藏序列化和派生化。因此,在传递给ClusterCoordinator.Create_per_per_worker_dataset的函数中创建整个数据集很重要。
如果直接调用运行以运行,则参数verstrategy类似于其他策略例程。例如,在parameter_server_strategy_v2中调用了镜像_RUN,因此我们没有重复。
另一种方法是使用ColusterCoordinator运行。我们将在下一章中使用自定义培训周期进行分析。
如果您在使用参数verstrategy和clusterResolver培训期间发现性能问题,则可能有几个原因。
一个普遍的原因是,参数服务器的负载不平衡负载以及某些重载参数服务器已达到容量。也可能有多种基本原因。减轻此问题的一些简单方法是:
性能问题的另一个可能原因是协调员。您的第一个时间表 /加入的实现是基于Python的,因此可能是电缆开销。此外,协调员和工人之间的延迟可能很大。如果这是案例,建议使用:
随着库的进一步优化,希望大多数用户将来不必在将来手动打包步骤。此外,提高性能的一个小技巧是安排没有返回值的功能。
上述章节中涉及的大多数已知限制。本节提供了一个摘要。
★★★★★★思考生活和技术★★★★★★
微信公共帐户:罗西的思想
https://www.youtube.com/watch?v=b2tpv_n7wkg&ab_channel=tensorflow
[中文字符] TFRT:新的TensorFlow运行库-TF DEV Summit'20
在-Depth理解TFRT中
内部TensorFlow:急切的执行运行时
[深度学习框架TensorFlow:内部张量]内部张量(汇编)
https://github.com/tensorflow/docs-lob/blob/07e15a23c7bc4bc444acbf20f20f20f20f7cb268ab1c/en-snapshot/distributer_serverververvevice_telt
原始:https://juejin.cn/post/7097377236281458701