开始
用户指南
horovod.spark
管理指南
参考指南
资源
2023年1月10日更新
给我们反馈
HorovodRunner是一个通用API,用于在Databricks上运行分布式深度学习工作负载Horovod框架。把Horovod和Spark整合起来障模式Databricks能够在Spark上为长期运行的深度学习训练作业提供更高的稳定性。HorovodRunner采用Python方法,包含带有Horovod钩子的深度学习训练代码。HorovodRunner在驱动程序上pickle该方法,并将其分发给Spark工作人员。Horovod MPI作业使用barrier执行模式嵌入为Spark作业。第一个执行程序收集所有任务执行程序使用的IP地址BarrierTaskContext触发一个Horovod作业mpirun.每个Python MPI进程加载pickle用户程序,反序列化它,并运行它。
BarrierTaskContext
mpirun
HorovodRunner让你启动Horovod培训作业作为Spark作业。HorovodRunner API支持表中所示的方法。详细信息请参见HorovodRunner API文档.
方法及签名
描述
init(自我,np)
创建一个HorovodRunner实例。
运行(自我,主要的,* * kwargs)
运行一个Horovod训练作业调用主要(* * kwargs).main函数和关键字参数使用cloudpickle进行序列化,并分发给集群工作者。
主要(* * kwargs)
使用HorovodRunner开发分布式培训程序的一般方法是:
创建一个HorovodRunner实例初始化的节点数。
HorovodRunner
定义一个Horovod训练方法Horovod用法,确保在方法中添加任何import语句。
将训练方法传递给HorovodRunner实例。
例如:
人力资源=HorovodRunner(np=2)def火车():进口tensorflow作为特遣部队hvd.初始化()人力资源.运行(火车)
在driver上运行HorovodRunnern子流程,使用人力资源=HorovodRunner (np = - n).例如驱动节点上有4个图形处理器,可以选择n到4.查看参数的详细信息np,请参阅HorovodRunner API文档.有关如何为每个子进程固定一个GPU的详细信息,请参见Horovod使用指南.
n
人力资源=HorovodRunner (np = - n)
4
np
一个常见的错误是无法找到或pickle TensorFlow对象。当库导入语句没有分发给其他执行程序时,就会发生这种情况。要避免此问题,请包含所有import语句(例如,进口tensorflow作为特遣部队)这两个在Horovod训练方法的顶部,以及在Horovod训练方法中调用的任何其他用户定义函数内部。
进口tensorflow作为特遣部队
Horovod有能力记录其活动的时间轴,称为Horovod时间表.
重要的
Horovod Timeline对性能有重大影响。当启用Horovod Timeline时,Inception3的吞吐量可以降低~40%。要加速HorovodRunner作业,请不要使用Horovod Timeline。
在训练进行中,您无法查看霍洛维德时间线。
要录制霍洛维德时间线,请设置HOROVOD_TIMELINE将环境变量移到要保存时间轴文件的位置。Databricks建议使用共享存储上的位置,以便可以轻松检索时间轴文件。例如,你可以使用DBFS本地文件api如图所示:
HOROVOD_TIMELINE
timeline_dir=“/ dbfs /毫升/ horovod-timeline /% s"%uuid.uuid4()操作系统.makedirs(timeline_dir)操作系统.环境[“HOROVOD_TIMELINE”]=timeline_dir+“/ horovod_timeline.json”人力资源=HorovodRunner(np=4)人力资源.运行(run_training_horovod,参数个数=参数个数)
然后,在训练函数的开始和结束添加特定于时间轴的代码。下面的笔记本包括示例代码,您可以使用作为一个变通方法来查看培训进度。
在新标签页打开笔记本
若要下载时间轴文件,请使用砖CLI或FileStore,然后使用Chrome浏览器chrome: / /跟踪查看它的设施。例如:
chrome: / /跟踪
这些是将单节点深度学习代码迁移到分布式训练的一般步骤。的例子本节将说明这些步骤。
准备单节点代码:使用TensorFlow、Keras或PyTorch准备和测试单节点代码。
迁移到Horovod:按照从Horovod用法用Horovod迁移代码并在驱动程序上测试:
添加hvd.init ()来初始化Horovod。
hvd.init ()
这个进程使用固定的服务器GPUconfig.gpu_options.visible_device_list.对于每个进程一个GPU的典型设置,这可以设置为本地rank。在这种情况下,服务器上的第一个进程将被分配第一个GPU,第二个进程将被分配第二个GPU,以此类推。
config.gpu_options.visible_device_list
包括数据集的一个碎片。这个数据集操作符在运行分布式训练时非常有用,因为它允许每个工作者读取一个唯一的子集。
将学习率按工人数量缩放。在同步分布式训练中,有效批大小是由工人数量来缩放的。提高学习率可以补偿增加的批处理大小。
封装优化器hvd。DistributedOptimizer.分布式优化器将梯度计算委托给原始优化器,使用allreduce或allgather平均梯度,然后应用平均梯度。
hvd。DistributedOptimizer
添加hvd.BroadcastGlobalVariablesHook (0)将初始变量状态从秩0广播到所有其他进程。当培训以随机权重开始或从检查点恢复时,这对于确保所有工作人员的一致初始化是必要的。或者,如果你不使用MonitoredTrainingSession,则可以执行hvd.broadcast_global_variables初始化全局变量后的操作。
hvd.BroadcastGlobalVariablesHook (0)
MonitoredTrainingSession
hvd.broadcast_global_variables
修改代码,只保存工作人员0上的检查点,以防止其他工作人员破坏它们。
迁移到HorovodRunner:HorovodRunner通过调用Python函数来运行Horovod训练作业。必须将主要训练过程包装成一个Python函数。然后您可以在本地模式和分布式模式下测试HorovodRunner。
请注意
这篇文章引用了这个术语奴隶Databricks没有使用这个术语。当这个术语从软件中删除后,我们将从本文中删除它。
如果升级或降级TensorFlow、Keras或PyTorch,必须重新安装Horovod,以便根据新安装的库进行编译。例如,如果你想升级TensorFlow, Databricks建议使用TensorFlow安装说明并将以下TensorFlow特定的Horovod安装代码附加到它的末尾。看到Horovod安装说明使用不同的组合,例如升级或降级PyTorch和其他库。
Add-apt-repository -y ppa:ubuntu-toolchain-r/test apt update#使用与TensorFlow编译Horovod相同的编译器Apt install g++-7 -y update-alternatives——install /usr/bin/gcc60——slave /usr/bin/g++ g++ /usr/bin/g++HOROVOD_GPU_ALLREDUCE=NCCLHOROVOD_CUDA_HOME=/usr/local/cuda PIP安装horovod= =0.18.1——force-重装——no-deps——no-cache-dir
下面的例子,基于MNIST数据集,演示如何使用HorovodRunner将单节点深度学习程序迁移到分布式深度学习。
如果支持在Databricks回购文件在工作空间中启用,那么HorovodRunner将不工作如果np设置为大于1,并且笔记本从repo内的其他文件导入。考虑使用horovod.spark而不是HorovodRunner.