HorovodRunner: Horovod分布式深度学习

学习如何使用HorovodRunner执行分布式训练机器学习模型推出Horovod培训工作引发工作数据砖。

HorovodRunner是什么?

HorovodRunner是一个通用API砖上运行分布式深度学习工作负载使用Horovod框架。通过整合Horovod火花障模式、砖能够提供更高的稳定性对于长时间运行的深度学习培训工作火花。HorovodRunner需要Python方法包含深度学习培训与Horovod钩子代码。HorovodRunner泡菜司机和分配上的方法引发工人。Horovod MPI工作嵌入作为火花作业执行模式使用障碍。第一执行人收集所有任务执行人使用的IP地址BarrierTaskContext和触发器Horovod工作使用mpirun。每个Python MPI进程加载腌用户程序,反序列化,并运行它。

HorovodRunner”src=

分布式训练HorovodRunner

HorovodRunner允许您启动Horovod培训工作引发的工作。HorovodRunner API支持表中所示的方法。详情,请参阅HorovodRunner API文档

方法和签名

描述

init(自我,np)

HorovodRunner创建一个实例。

运行(自我,主要的,* * kwargs)

运行一个调用Horovod培训工作主要(* * kwargs)。主要功能和关键字参数序列化使用cloudpickle和集群分发给工人。

一般的方法来开发一个分布式使用HorovodRunner培训项目是:

  1. 创建一个HorovodRunner实例初始化节点的数量。

  2. 定义一个Horovod训练方法中描述的方法Horovod用法,确保添加任何导入语句内的方法。

  3. 通过训练方法HorovodRunner实例。

例如:

人力资源=HorovodRunner(np=2)def火车():进口tensorflow作为特遣部队hvd初始化()人力资源运行(火车)

上运行HorovodRunner司机只有n子流程,使用人力资源=HorovodRunner (np = - n)。例如,如果司机节点上有4个gpu,你可以选择n4。参数的详细信息np,请参阅HorovodRunner API文档。如何销一个GPU /子流程,看到Horovod使用指南

一个常见的错误是不能被发现或腌TensorFlow对象。这发生在当库导入语句不分发给其他执行者。为了避免这个问题,包括所有导入语句(例如,进口tensorflow作为特遣部队)这两个顶部的Horovod训练方法,在其他任何用户定义的函数称为Horovod训练方法。

记录Horovod训练Horovod时间表

Horovod有能力记录其活动时间表,Horovod时间表

重要的

Horovod时间表对性能有重大的影响。Inception3吞吐量可以减少~ 40%当启用Horovod时间表。加快HorovodRunner工作,不要使用Horovod时间表。

你不能查看Horovod时间表而培训正在进行中。

记录Horovod时间表,设置HOROVOD_TIMELINE环境变量的位置你想保存时间轴文件。砖建议使用共享存储,这样时间轴上的一个位置文件很容易检索。例如,您可以使用DBFS本地文件api如图所示:

timeline_dir=“/ dbfs /毫升/ horovod-timeline /% s%uuiduuid4()操作系统makedirs(timeline_dir)操作系统环境(“HOROVOD_TIMELINE”]=timeline_dir+“/ horovod_timeline.json”人力资源=HorovodRunner(np=4)人力资源运行(run_training_horovod,参数个数=参数个数)

然后,添加时间特定代码的开始和结束培训功能。下面的例子笔记本包含示例代码,您可以使用作为一个解决方案视图培训进展。

Horovod时间表例子笔记本

下载时间轴文件,使用砖CLI(遗留)FileStore,然后使用Chrome浏览器的chrome: / /跟踪设备查看它。例如:

Horovod时间表”src=

开发工作流程

这些都是一般的步骤在单节点深度学习代码迁移到分布式训练。的例子:迁移到分布式与HorovodRunner深度学习在这一节中说明这些步骤。

  1. 准备单独的节点代码:准备和测试单一节点代码TensorFlow, Keras或PyTorch。

  2. 迁移到Horovod:按照指示Horovod用法迁移与Horovod代码和测试的司机:

    1. 添加hvd.init ()初始化Horovod。

    2. 销GPU的服务器使用这个过程使用config.gpu_options.visible_device_list。一GPU的典型设置过程,这可以设置为当地排名。在这种情况下,服务器上的第一个过程将被分配第一个GPU,第二个进程将被分配第二个GPU等等。

    3. 包括一个数据集的碎片。这个数据集运营商运行分布式训练时非常有用,因为它允许每个工人去读一个独特的子集。

    4. 规模的工人数量的学习速率。有效批大小在同步分布式训练工人的数量。增加了学习速率补偿增加的批量大小。

    5. 包装的优化器hvd.DistributedOptimizer。梯度计算的分布式优化器代表原始的优化器,使用allreduce或allgather平均梯度,然后应用平均梯度。

    6. 添加hvd.BroadcastGlobalVariablesHook (0)广播初始变量状态从0到所有其他进程。这是必要的,以确保一致的初始化所有工人培训开始时随机权重或恢复检查点。另外,如果你不使用MonitoredTrainingSession,您可以执行hvd.broadcast_global_variables全局变量被初始化后操作。

    7. 修改你的代码保存检查站只在工人0,以防止其他工人腐化他们。

  3. 迁移到HorovodRunner:HorovodRunner运行Horovod培训工作通过调用Python函数。你必须包装的主要训练过程为一个Python函数。然后你就可以在本地测试HorovodRunner模式和分布式模式。

更新深度学习库

请注意

本文包含引用奴隶,砖不使用的一个术语。从软件中删除这个词时,我们就将它从这篇文章。

如果你升级或降级TensorFlow、Keras或PyTorch,您必须重新安装Horovod所以编译新安装的库。举个例子,如果你想升级TensorFlow,砖的建议使用init脚本TensorFlow安装说明并附加以下TensorFlow特定Horovod安装代码结束它。看到Horovod安装说明使用不同的组合,如升级或降级PyTorch和其他库。

add-apt-repository - y ppa: ubuntu-toolchain-r /测试更新#使用相同的编译器编译Horovod TensorFlow建成apt安装g++ 7 - y update-alternatives——安装/usr/bin/gcc gcc /usr/bin/gcc-760——奴隶/usr/bin/g + + g + + /usr/bin/g + + 7HOROVOD_GPU_ALLREDUCE=NCCLHOROVOD_CUDA_HOME=/usr/local/cuda pip安装horovod= =0.18.1——force-reinstall no-deps——no-cache-dir

例子:迁移到分布式与HorovodRunner深度学习

下面的例子,基于MNIST数据集,演示如何将一个单节点深度学习项目迁移到分布式与HorovodRunner深度学习。

限制

  • 使用的工作区文件时,如果HorovodRunner不会工作np设置为大于1和笔记本从相关的进口文件。考虑使用horovod.spark而不是HorovodRunner