horovod学习整理

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情


Alt

简介

Horovod 是一套面向 TensorFlow 的分布式训练框架,由 Uber 构建并开源,它的发展吸取了Facebook “Training ImageNet In 1 Hour” 与百度 “Ring Allreduce” 的优点,可为用户实现分布式训练提供帮助。Horovod 能够简化并加速分布式深度学习项目的启动与运行。通过利用消息传递接口(简称 MPI)实现应用环状规约,显著提升 TensorFlow 模型的实用性与性能表现。

安装方式

推荐使用conda安装

先配置好CUDA(学姐配置的,据说是系统配置,不需要我自己搞)
将应通过Conda下载的所有必要依赖项添加到environment.yml文件中,并将应通过pip下载的任何依赖项添加到requirements.txt文件中之后,通过运行以下命令在项目目录的子目录env中创建Conda环境。

$ export ENV_PREFIX=$PWD/env
$ export HOROVOD_CUDA_HOME=$CUDA_HOME
$ export HOROVOD_NCCL_HOME=$ENV_PREFIX
$ export HOROVOD_GPU_OPERATIONS=NCCL
$ conda env create --prefix $ENV_PREFIX --file environment.yml --force

第一次启动输入以下命令以启动

$ conda activate $ENV_PREFIX

实际上官方给的这种创建conda环境的方式是直接新建一个env文件夹,并不能通过conda的环境名称启动,如果查询conda的环境列表会发现名字是空白的,后续的启动需要使用这个命令

$ source activate /home/weijiaqi/test/env

environment.yml

name: null

channels:
  - pytorch
  - conda-forge
  - defaults

dependencies:
  - cmake=3.17
  - cudatoolkit=10.1
  - cudnn=7.6
  - cupti=10.1
  - cxx-compiler=1.1
  - jupyterlab=2.2
  - mpi4py=3.0 # installs cuda-aware openmpi
  - nccl=2.5
  - nodejs=14
  - nvcc_linux-64=10.1
  - pip=20.1
  - pip:
    - mxnet-cu101mkl==1.6.* # makes sure frameworks are installed prior to horovod
    - tensorflow-gpu==2.2.0
    - -r file:requirements.txt
  - python=3.7
  - pytorch=1.5
  - tensorboard=2.1
  - torchvision=0.6  

requirements.txt

其中 jupyterlab-nvdashboard 和 jupyter-tensorboard 一个是监测平台,一个是类似于vscode的编辑器,如果装不上,就不要装了,没什么必要

# -*- coding: utf-8 -*- 

horovod==0.19.*
jupyterlab-nvdashboard==0.4.* # server-side component; client-side component installed in postBuild
jupyter-tensorboard==0.2.*

# make sure horovod is re-compiled if environment is re-built
--no-binary=horovod

校验安装结果

查看安装的软件包列表

要查看安装到环境中的软件包的完整列表,请运行以下命令。

$ conda activate $ENV_PREFIX # optional if environment already active
$ conda list

最终校验

构建Conda环境后,请使用以下命令检查Horovod是否已构建为支持深度学习框架TensorFlow,PyTorch,Apache MXNet以及contollers MPI和Gloo。

$ conda activate $ENV_PREFIX # optional if environment already active
$ horovodrun --check-build

显示这个就算成功了

Horovod v0.19.4:
Available Frameworks:
    [X] TensorFlow
    [X] PyTorch
    [X] MXNet
Available Controllers:
    [X] MPI
    [X] Gloo
Available Tensor Operations:
    [X] NCCL
    [ ] DDL
    [ ] CCL
    [X] MPI
    [X] Gloo

补充

如果出现提示 no module named ‘***’ ,直接 pip install ** 就可以解决
另外,根据我查询的资料如果环境中只有一个python版本,使用 pip 和 pip3 安装效果应该是一样的(理论上) ,但是就我配环境的经历,有的时候就是 pip 安装失败,换pip3 安装就是成功,所以要是 pip 不行,尝试一下 pip3

使用

修改代码

要使用Horovod,请在程序中添加以下内容:

  1. 运行 hvd.init()初始化Horovod。
    将每个GPU固定到一个进程,以避免资源争用。
  2. 通常每个进程设置一个GPU,将其设置为本地等级。服务器上的第一个进程将被分配第一个GPU,第二个进程将被分配第二个GPU,依此类推。
  3. 通过工人人数来衡量学习率。
    同步分布式培训中的有效批处理规模是根据工人人数来衡量的。学习率的提高弥补了批量大小的增加。
  4. 将 optimizer 包装在 hvd.DistributedOptimizer 中。
    分布式优化器将梯度计算委派给原始优化器,使用 allreduce 或 allgather 对梯度求平均,然后应用这些平均梯度。
  5. 从 rank 0 的状态广播到所有其他进程。
    当使用随机权重开始训练或从检查点恢复训练时,这是确保所有 worker 进行一致初始化的必要步骤。
  6. 修改您的代码以仅在 worker 0 上保存检查点,以防止其他工作程序破坏它们。

horovod官方提供的 tensorflow相关示例

TensorFlow v2 Example (from the MNIST example)

import tensorflow as tf
import horovod.tensorflow as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
    tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')

# Build model and dataset
dataset = ...
model = ...
loss = tf.losses.SparseCategoricalCrossentropy()
opt = tf.optimizers.Adam(0.001 * hvd.size())

checkpoint_dir = './checkpoints'
checkpoint = tf.train.Checkpoint(model=model, optimizer=opt)

@tf.function
def training_step(images, labels, first_batch):
    with tf.GradientTape() as tape:
        probs = mnist_model(images, training=True)
        loss_value = loss(labels, probs)

    # Horovod: add Horovod Distributed GradientTape.
    tape = hvd.DistributedGradientTape(tape)

    grads = tape.gradient(loss_value, mnist_model.trainable_variables)
    opt.apply_gradients(zip(grads, mnist_model.trainable_variables))

    # Horovod: broadcast initial variable states from rank 0 to all other processes.
    # This is necessary to ensure consistent initialization of all workers when
    # training is started with random weights or restored from a checkpoint.
    #
    # Note: broadcast should be done after the first gradient step to ensure optimizer
    # initialization.
    if first_batch:
        hvd.broadcast_variables(mnist_model.variables, root_rank=0)
        hvd.broadcast_variables(opt.variables(), root_rank=0)

    return loss_value

# Horovod: adjust number of steps based on number of GPUs.
for batch, (images, labels) in enumerate(dataset.take(10000 // hvd.size())):
    loss_value = training_step(images, labels, batch == 0)

    if batch % 10 == 0 and hvd.local_rank() == 0:
        print('Step #%d\tLoss: %.6f' % (batch, loss_value))

# Horovod: save checkpoints only on worker 0 to prevent other workers from
# corrupting it.
if hvd.rank() == 0:
    checkpoint.save(checkpoint_dir)

运行

通常,每个进程将分配一个GPU,因此,如果服务器具有4个GPU,则将运行4个进程。 在horovodrun中,进程数由-np标志指定。
命令格式为 mpirun command
To run on a machine with 4 GPUs:
这里 -np 后边跟着的数字是GPU的总数,后边localhost或者某个server后边跟着的是它的GPU数量

$ horovodrun -np 4 -H localhost:4 python train.py

To run on 4 machines with 4 GPUs each:

$ horovodrun -np 16 -H server1:4,server2:4,server3:4,server4:4 python train.py

You can also specify host nodes in a host file. For example:

$ cat myhostfile

aa slots=2
bb slots=2
cc slots=2

This example lists the host names (aa, bb, and cc) and how many “slots” there are for each. Slots indicate how many processes can potentially execute on a node. This format is the same as in mpirun command.

To run on hosts specified in a hostfile:

$ horovodrun -np 6 -hostfile myhostfile python train.py

Failures due to SSH issues

The host where horovodrun is executed must be able to SSH to all other hosts without any prompts.

If horovodrun fails with a permission error, verify that you can ssh to every other server without entering a password or answering questions like this:

The authenticity of host ’ ()’ can’t be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)?

To learn more about setting up passwordless authentication, see this page.

To avoid The authenticity of host ’ ()’ can’t be established prompts, add all the hosts to the ~/.ssh/known_hosts file using ssh-keyscan:

$ ssh-keyscan -t rsa,dsa server1 server2 > ~/.ssh/known_hosts

注意事项

  1. Horovod培训脚本未作为Python脚本启动。 例如,您不能使用python train.py运行此培训脚本。 相反,采用特殊的CLI命令Horovod
$ horovodrun -np 4 -H localhost:4 python train.py

检查ssh localhost 和ssh 其他服务器

要做到的效果是都必须不需要输入任何密码或者输入yes,就可以直接连接
使用的方法是生成密钥和配置密钥

检查CUDA_HOME变量

在学姐配置的conda环境之中,添加了这个环境变量,但是在服务器上并没有,这也是为嘛我这边的就是一直报错找不见,使用以下命令查询是否有这个环境变量

$ echo $CUDA_HOME

export 命令显示当前系统定义的所有环境变量
echo $PATH命令输出当前的PATH环境变量的值

如果发现确实没有CUDA_HOME环境变量
修改.bashrc文件即可

各种报错

  1. WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (0.130465). Check your callbacks.
    大概意思是模型比较小,导致每次输出的时间消耗大于跑一个epoch,所以会有提醒
  2. DistributedOptimizer()
    DistributedOptimizer() got an unexpected keyword argument ‘average_aggregated_gradients’
    DistributedOptimizer() got an unexpected keyword argument ‘backward_passes_per_step’
    horovod版本问题,旧版本的api没有这两个参数
分布式机器学习核心技术与工程实践指南 分布式计算是现代机器学习处理海量数据的核心技术范式,其核心原理是通过数据并行和模型并行实现计算资源的横向扩展。在深度学习领域,AllReduce和参数服务器是两种典型的通信架构,分别适用于稠密参数同步和稀疏特征异步更新场景。工程实践中,NCCL通信库和GPU Direct RDMA技术能显著提升跨节点训练效率,而混合精度训练则能减少50%的通信开销。这些技术在电商推荐、金融风控等需要实时模型更新的业务场景中具有重要价值,例如某电商平台通过分布式训练将CTR模型更新周期从72小时缩短到4小时,直接带来23%的 阅读详情

相关推荐

Hadoop--mac 上利用虚拟机安装hadoop步骤整理

Hadoop–mac 上利用虚拟机安装hadoop步骤整理 本文仅提供详细步骤,不提供详尽解释 VMware fusion虚拟机配置静态IP ######mac book 执行获取 [tonerMac-Pro:~ toner]$ cd /Library/Preferences/VMware\ Fusion/vmnet8 [tonerMac-Pro:~ toner]$ cat dhcpd.con...

qq_37012496的博客 1807

Mxnet—下游

任务描述 成功安装了mxnet后,我的目标就是:调用mxnet已经写好的目标检测方法,调整数据集训练模型,如:SSD,Faster-RCNN,YOLOv3。进入Mxnet的官网,选择GlounCV Toolkit,下面有好东西。 选择GluonCV Toolkit 选择你想要的用的模型,如SSD,将.py文件下载下来,如下图: 选择ssd,点击file_download...

GodWriter的博客 699

深入NAND Flash信号与接口:结合ONFI 5.0协议,聊聊DBI、ODT和差分信号到底在解决什么实际问题

本文深入探讨了NAND Flash信号与接口设计,结合ONFI 5.0协议,详细解析了DBI、ODT和差分信号等技术如何解决高速数据传输中的信号完整性问题。通过实际案例和数据,展示了这些技术在降低功耗、减少噪声和提升抗干扰能力方面的显著效果,为存储工程师提供了宝贵的实践参考。

weixin_33736649的博客 323

linux安装horovod报错处理

linux安装horovod报错: 错误处理:

my__blog的博客 1328

在Linux服务器上安装horovod安装

Horovod的安装步骤

m0_44999081的博客 2195

Horovod分布式搭建——UbuntuServer 22.04

基于Ubuntu22.04的Horovod分布式环境搭建

yx1405585468的博客 961

Horovod——分布式深度学习框架使用说明

Horovod——分布式深度学习框架使用说明References:Training 训练过程Horovod_Demmo_tensorflowHorovod_Demmo_MXNetHorovod_Demmo_PytorchInference 推理过程(only forward process)Tensor Fusion: 描述horovod计算和通信特征 References: Horovod g...

勇敢的大脑 1万+

[源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator

Horovod 是Uber于2017年发布的一个易于使用的高性能的分布式训练框架,在业界得到了广泛应用。本文借着学习 Horovod on K8S 功能,介绍MPI-Operator,期望可以从中找出设计思路。

罗西的思考 806

Horovod技术选型:与其他分布式框架的对比分析

你是否正面临这些分布式训练难题:单节点训练耗时过长难以满足业务需求?现有框架改造成本高且扩展性差?多框架环境下需要维护多套分布式逻辑?Horovod作为Uber开源的分布式训练框架,基于MPI架构设计,通过极简API实现"一行代码实现分布式",已成为工业界大规模训练的首选方案。本文将从架构设计、性能表现、易用性和生态支持四个维度,全面对比Horovod与Parameter Server、PyTor...

gitblog_00441的博客 746

如何高效完成Horovod版本发布:从开发到正式发布的完整指南

Horovod是一个分布式训练框架,支持TensorFlow、Keras、PyTorch和Apache MXNet等主流深度学习框架。本文将详细介绍Horovod版本发布的完整流程,帮助开发者了解从代码开发到最终发布的各个关键步骤,确保每个版本都能高质量地交付给用户。 ## 1. 版本规划与开发准备 📋 在开始新版本开发前,团队需要明确版本目标和功能范围。Horovod的版本号遵循[语义化版

gitblog_00437的博客 336

C++基础知识点整理笔记(一)

到底还是C++基础知识太薄弱了,没有系统的去学习过,都是碰到问题了才去查原因,有需求了才去查解决方案,虽然能够搞定手头问题,但是对C++的理解却始终浮于表面,后面将会分两到三篇文章对C++的基础知识点进行梳理,然后结合几个框架,逐步跟大家分享和探讨构建一个全流程的深度学习框架过程中涉及到的一些知识点。(二) 编译阶段:gcc –S hello.i –o hello.s。(三) 汇编阶段:gcc –c hello.s –o hello.o。(四) 链接阶段:gcc hello.o –o hello。

ybigbear的博客 3538

聊一聊深度学习分布式训练

作者|杨阳整理|NewBeeNLPhttps://zhuanlan.zhihu.com/p/365662727在深度学习时代,训练数据特别大的时候想要单卡完成训练基本是不可能的。所以就需要进行分布式深度学习。在此总结下个人近期的研究成果,欢迎大佬指正。主要从以下几个方面进行总结:分布式训练的基本原理TensorFlow分布式训练PyTorch的分布式训练框架H...

Kaiyuan_sjtu的博客 1463

分布式计算框架学习笔记

分布式计算

xiaomu_347的博客 1541

【深度学习】聊一聊深度学习分布式训练

作者|杨阳整理|NewBeeNLPhttps://zhuanlan.zhihu.com/p/365662727在深度学习时代,训练数据特别大的时候想要单卡完成训练基本是不可能的。所以就需要进行分布式深度学习。在此总结下个人近期的研究成果,欢迎大佬指正。主要从以下几个方面进行总结:分布式训练的基本原理TensorFlow分布式训练PyTorch的分布式训练框架H...

fengdu78的博客 1623

[源码解析] 深度学习分布式训练框架 horovod (18) --- kubeflow tf-operator

[源码解析] 深度学习分布式训练框架 horovod (18) — kubeflow tf-operator 文章目录[源码解析] 深度学习分布式训练框架 horovod (18) --- kubeflow tf-operator0x00 摘要0x01 背景知识1.1 Kubernetes1.2 容器作为调度单元1.3 Kubeflow1.4 Tensorflow on Kubeflow1.5 Operator1.6 TF-Operator0x02 TensorFlow 分布式2.1 Parameter s

罗西的思考 798

​优步正悄悄地组建市场上强大的开源深度学习

全文共3285字,预计学习时长10分钟人工智能一直都是非典型的科技趋势。在传统的科技循环中,创新一般始于想颠覆行业现状的初创公司。但在人工智能业态中,大部分创新发端于大型企业,如谷歌,...

读芯术的博客 601

探索分布式深度学习的宝藏:Awesome Distributed Deep Learning

探索分布式深度学习的宝藏:Awesome Distributed Deep Learning 去发现同类优质开源项目:https://gitcode.com/ 该项目由正是你需要的宝库。 项目简介 这个开源仓库汇总了各种开源框架、库、论文、教程和最佳实践,旨在帮助开发者和研究人员了解并掌握分布式深度学习的核心技术。它不仅包含了TensorFlow、PyTorch等主流深度学习库的分布式扩展,还涵盖...

gitblog_00010的博客 423

当代研究生应当掌握的并行训练方法(单机多卡)

作者:纵横整理:CVer公众号https://zhuanlan.zhihu.com/p/98535650又到适宜划水的周五啦,机器在学习,人很无聊。在打开 b 站 “学习” 之前看着那空...

AI蜗牛车 5749

如何快速上手cube-studio:云原生机器学习平台的终极指南

还在为复杂的机器学习基础设施搭建而烦恼吗?cube-studio正是你需要的解决方案。这个开源的**云原生机器学习平台**将彻底改变你的AI开发体验,让你专注于算法创新而非基础设施维护。 ## 🎯 你的AI开发痛点,cube-studio来解决 每个机器学习工程师都曾面临这些挑战:环境配置复杂、资源管理混乱、模型部署困难。传统的开发流程需要你在多个工具间切换,耗费大量时间在非核心工作上。

gitblog_00450的博客 406

框架中分布式训练

作者 | 杨阳整理 | NewBeeNLP在深度学习时代,训练数据特别大的时候想要单卡完成训练基本是不可能的。所以就需要进行分布式深度学习。在此总结下个人近期的研究成果,欢迎大佬指正。

爱CV 1775
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值