直接使用
请打开如何使用DLC进行TensorFlow 2.x 分布式训练,并点击右上角 “ 在DSW中打开” 。
如何使用DLC进行Tensorflow2的分布式训练
基于云原生深度学习训练平台DLC可以进行分布式训练,本文以TensorFlow分布式训练为例,讲述如何使用DLC进行TensorFlow分布式训练。一般来说,分布式TensorFlow的使用者需要关心下面3件事情:
- 寻找足够运行训练的资源。在数据并行的情况下,有下列两种模式: a. PS/Worker模式 b. AllReduce模式 两种模式各有优点,PS/Worker模式为例,展示如何使用DLC进行TensorFlow的数据并行模式的分布式训练。
- 安装和配置支撑程序运算的软件和应用
- 根据分布式TensorFlow的设计,需要配置ClusterSpec。这个json格式的ClusterSpec是用来描述整个分布式训练集群的架构,比如需要使用两个Worker和PS。一般而言,我们需要在模型代码中去手动的配置ClusterSpec中的worker和ps的属性,这样告诉我们的训练框架他们的彼此的位置,然后在训练的过程中实现weight的归集和分发。
针对上面的三个点,DLC都相应的给出了很便捷,基于云原生的解决方案。
- DLC是云原生的深度学习训练平台,所以基于k8s的调度能力和云的资源,可以很好的实现CPU/GPU的按需高效调度
- 第二点实际上是运行环境,这一点Docker完美契合这个场景
- 最后一点, 针对不同版本的TensorFlow,需要有不同的处理方式。对于TensorFlow 1.x版本而言,我们将配置ClusterSpec的工作自动化的完成,用户可以从模型代码中获取TF_CONFIG环境变量,然后按照实际的模型逻辑的需求进行适配.
TensorFlow 2.x 针对分布式训练进行了进一步分封装,可以很方便的将单机版本的代码修改称为分布式训练的代码:
(1). MirroredStrategy
MirroredStrategy 是一种单机的同步的分布式训练策略。它支持在一台机器的多个 GPU 之间进行分布式训练,它会在每个 GPU 上创建一个模型副本,模型中的每个变量 (Variables) 都会进行镜像复制并放置到相应的 GPU 上,这些变量被称作镜像变量 (MirroredVariable)。 MirroredStrategy 策略通过 AllReduce 算法使得所有镜像变量在每个 GPU 之间保持同步更新, AllReduce 算法默认使用英伟达的 NcclAllReduce ,也可以通过 cross_device_ops 参数修改为其他的 AllReduce 算法,如 HierarchicalCopyAllReduce 。 MirroredStrategy 策略会自动使用所有能被 TensorFlow 发现的 GPU 来做分布式训练,如果只想使用部分的 GPU 则可以通过 devices 参数来指定。 MirroredStrategy 实例的创建代码如下所示:
指定特定device来初始化MirroredStrategy的方式 strategy = tf.distribute.MirroredStrategy( devices=["/gpu:0", "/gpu:1"], cross_device_ops=tf.distribute.HierarchicalCopyAllReduce(), )
如果 TensorFlow 没有发现 GPU 则默认会退化为使用 CPU 来进行训练。 MirroredStrategy 的典型使用场景为单机多 GPU 。
(2). MultiWorkerMirroredStrategy
MultiWorkerMirroredStrategy 策略与 MirroredStrategy 策略很相似,可以理解为MirroredStrategy 策略的多机的同步的分布式训练版本,它也会在每一台机器上创建所有变量的副本。 MultiWorkerMirroredStrategy 策略目前有两种可供选择的 CollectiveOps 。 一种为 CollectiveCommunication.RING ,它使用 gRPC 作为通信层实现了基于环的 AllReduce 操作。 另一种为 CollectiveCommunication.NCCL, 它使用了英伟达的 NCCL 库来实现 AllReduce 操作。在实际使用中,可以基于自己的运行环境选择合适的 CollectiveOps,或者使用 CollectiveCommunication.AUTO 交由 TensorFlow 运行时自行选择。 MultiWorkerMirroredStrategy 实例的创建代码如下所示:
multiworker_strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy( tf.distribute.experimental.CollectiveCommunication.RING)
MultiWorkerMirroredStrategy 策略因为要涉及到多个 worker 节点之间的通信交互,因此每个 worker 节点需要提前获知集群中各节点配置信息以便在变量更新时使用。 TensorFlow 中定义集群配置信息的标准方式是使用 TF_CONFIG 环境变量来实现的,该环境变量定义了集群中所有节点的配置信息,包括所有 worker 节点的网络地址,当前 worker 节点的索引 (index) 以及当前 worker 节点的角色 (type)。 由于DLC拉起的分布式TensorFlow训练任务的镜像中已经包含了当前JOB的TF_CONFIG信息,所以不需要手动的去处理。 如果所有 worker 节点都不包含 GPU ,则该策略会退化为使用 CPU 在多个 worker 节点间进行分布式训练。如果集群中的 worker 节点数量只有一个则该策略会退化为 MirroredStrategy 策略。
1. 创建新的工作空间
2. 进入工作空间,新增代码配置
也可以参考: https://help.aliyun.com/document_detail/202277.html
创建新的代码配置: 如下图,用户在创建代码配置的时候,需要输入下列信息:
- 代码配置的名称
- 代码仓库的Git地址
- 如果用用户名密码或者Token,也请输入
- 本地存储目录,这个参数定义了代码被clone到容器中之后,保存的路径,默认是 /root/code/ 输入上述信息之后,保存代码配置
3. 创建数据集配置
目前工作空间中支持下列四种数据集(如下图): 推荐使用阿里云存储,这样无论是性能还是可靠性都有保障
下面以阿里云存储的数据集为例,展示如何创建数据集。 目前支持两种阿里云存储:
NAS:
这里有三个参数:
- 数据存储类型:本例选择NAS
- 选择要挂载的NAS文件系统的ID,这里会有一个列表,列出当前用户所有的NAS文件系统
- 挂载路径:这是指定要挂载的文件系统的目录,本例中挂载文件系统的根目录
- OSS:
- 数据存储类型:本例选择OSS
- 路径: 要挂载的文件系统的路径,可以点击红色框中的按钮选择当前用户所有的OSS文件系统
4. 提交JOB
本文以PS/Worker模式的分布式训练为例,展示如何使用DLC创建一个TensorFlow分布式训练任务。
上面图中的配置是JOB的通用配置,下面选择“进阶模式”,配置分部署训练相关的规格信息: