Training - PyTorch Lightning 的 Horovod 策略实践 (all_gather)

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/137686312

Horovod

在 PyTorch Lightning 中使用 Horovod 策略,可以在多个 GPU 上并行训练模型。Horovod 是分布式训练框架,通过优化数据传输来提高多 GPU/CPU 训练的效率。要在 PyTorch Lightning 中使用 Horovod,需要在训练命令中指定 Horovod 作为策略。

  • PyTorch Lightning 源码:GitHub - pytorch-lightning
  • Horovod 策略的具体源码:pytorch_lightning.strategies.horovod

1. 构建 Docker 环境

首先,需要构建支持 MPI 运行的 Docker,安装 PyTorch Lightning 与 Horovod 的安装包,目前而言,PyTorch Lightning 的 2.+ 版本,以上,已经移除 Horovod 策略,需要降级至 1.8.6 版本,才支持 Horovod 策略,即:

pip install pytorch-lightning==1.8.6
pip install cmake==3.24.2 
pip install horovod==0.27.0

注意:horovod 安装之前,需要满足 cmake 版本,需要预先安装 cmake 包,否则报错:

File "/tmp/pip-install-qcugcd1u/horovod_a39ef0ac7a9e4940bc6b5969457a47f4/setup.py", line 88, in get_cmake_binraise RuntimeError("Failed to install temporary CMake. "
RuntimeError: Failed to install temporary CMake. Please update your CMake to 3.13+ or set HOROVOD_CMAKE appropriately.

参考:StackOverflow - How to reinstall the latest cmake version?

验证 PyTorch 与 Horovod 是否安装成功:

pythonimport torch
print(torch.__version__)  # 1.13.1
print(torch.cuda.is_available())  # Truefrom horovod.torch import mpi_lib_v2 as mpi_lib
# pass

也可以使用 Horovod 策略补充工程,支持 PyTorch Lightning 的 2.+ 版本,参考 GitHub - lightning-Horovod

Horovod

启动 Docker:

nvidia-docker run -it --name [your name] -v /pfs_beijing:/pfs_beijing -v /nfs_beijing:/nfs_beijing -v /nfs_beijing_ai:/nfs_beijing_ai [your image]:[version]

上传 Docker 至服务器:

# 提交 Tag
docker ps -l
docker commit 20df5ad955bb [your image]:[version]# 准备远程 Tag
docker tag [your image]:[version] [remote image]:[version]
docker images | grep [your image]# 推送至远程
docker push [remote image]:[version]

2. 配置 Horovod 策略

固定随机种子,确保分布式的表现一致:

# 设置 seed 参数
if args.seed is not None:seed_everything(args.seed)logger.info(f"[CL] Using seed: {args.seed}")

配置 Horovod 环境变量 与 策略,即:

from pytorch_lightning.strategies import HorovodStrategyos.environ["HOROVOD_FUSION_THRESHOLD"] = "0"
os.environ["HOROVOD_CACHE_CAPACITY"] = "0"
os.environ["OMPI_MCA_btl_vader_single_copy_mechanism"] = "none"
import horovod.torch as hvd
hvd.init()
torch.cuda.set_device(hvd.local_rank())
strategy = HorovodStrategy()# Horovod 不需要设置,使用默认值
args.num_nodes = 1
args.gpus = Nonelogger.info(f"[CL] Using HorovodStrategy")

注意:Horovod 策略,在 pl.Trainer 中,不需要设置 num_nodesgpus,使用默认值,即 1 和 None。

具体的 pl.Trainer 配置 Horovod 策略,如下:

trainer = pl.Trainer(accelerator="gpu",# ...strategy=strategy,  # 多机多卡配置num_nodes=args.num_nodes,  # 节点数devices=args.gpus,  # 每个节点 GPU 卡数
)

3. 配置 Horovod 的 all_gather 实例

在 PyTorch Lightning 中,不推荐直接使用 torch.distributed.all_gather_object() 进行分布式数据汇集,建议在 pl.LightningModule 类中,直接调用 self.all_gather() 方法。

  • torch.distributed.all_gather_object() 的源码,参考 Doc - PyTorch
  • LightningModule.all_gather() 的源码,参考 Doc - Lighting 1.8.6
  • horovod.torch.allgather() 的源码,参考 Doc - Horovod

LightningModule 的 all_gather() 调用 Horovod 的 allgather() 函数,源码如下:

def all_gather(self, result: Tensor, group: Optional[Any] = dist_group.WORLD, sync_grads: bool = False) -> Tensor:if group is not None and group != dist_group.WORLD:raise ValueError("Horovod does not support allgather using a subcommunicator at this time. Unset `group`.")if len(result.shape) == 0:# Convert scalars to single dimension tensorsresult = result.reshape(1)# sync and gather allself.join()return hvd.allgather(result)

其中,torch.distributed.all_gather_object() 方法,报错如下:

horovod all_gather_object "Default process group has not been initialized, please make sure to call init_process_group.""

原因是,在 LightningModule 中,不推荐直接使用 torch.distributed 的方法,建议直接调用 LightningModule 的内部方法。

其中 all_gather 的源码修改示例,如下:

class ModelWrapper(pl.LightningModule):def gather_log(self, log, world_size):if world_size == 1:return log# 异常代码,不建议直接调用 torch.distributed# log_list = [None] * world_size# torch.distributed.all_gather_object(log_list, log)# log = {key: sum([l[key] for l in log_list], []) for key in log}log_gather_map = self.all_gather(log)# logger.info(f"[CL] log: {log}")# logger.info(f"[CL] log_list_map: {log_gather_map}")log_parse_map = dict()for key in log_gather_map.keys():# [sample,num_node],例如 样本 3 个,Node 2个,[[1,2],[3,4],[5,6]]tmp_list = log_gather_map[key]for item in tmp_list:if isinstance(item, torch.Tensor):item_cpu = item.detach().cpu()item_x = item_cpu.numpy().tolist()if key not in log_parse_map.keys():log_parse_map[key] = []# sum([[1,2],[3,4]], []) -> [1, 2, 3, 4]log_parse_map[key] += item_xelif isinstance(item, str):# val_name = ['7skh_B', '7vqk_A', '7vrf_A'],all_gather 问题continue# logger.info(f"[CL] log_parse_map: {log_parse_map}")return log_parse_map# ...

日志输出,包括2个卡,每个卡的数据,all_gather之后,获得全部数据,如下:

# Worker 0, all_gather 之前:
[worker-0:163] [INFO] [CL] log: 
{'val_first_ref_rmsd': [30.974, 21.57, 18.238],# ...
}# Worker 1, all_gather 之前:
[worker-1:163] [INFO] [CL] log: 
{'val_first_ref_rmsd': [27.358, 19.888, 32.003],# ...
}# Worker 0, all_gather 之后:
[worker-0:163] [INFO] [CL] log_gather_map:
{'val_first_ref_rmsd': [tensor([30.9740, 27.4560], device='cuda:0'),tensor([21.5700, 19.6400], device='cuda:0'),tensor([18.2380, 31.5020], device='cuda:0')],# ...
}# 获得全部的6个样本数据:
[worker-1:163] [INFO] [CL] log_parse_map: 
{'val_first_ref_rmsd': [30.9740, 27.4560, 21.5700, 19.6400, 18.2380, 31.5020],# ...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oladance、南卡、漫步者开放式耳机好不好用?3大当红明星产品测评PK

​在音频市场中,开放式耳机以其创新设计和卓越听感赢得了一定的关注。然而,也存在一些产品质量和音质不尽人意,甚至可能影响用户听力安全。作为一名专业的音频设备评测师,我建议用户在选择开放式耳机时,应优先选择那些…

《R语言与农业数据统计分析及建模》学习——控制流

1、控制流的概念和作用 控制流是指根据循环或条件来控制程序的执行顺序和逻辑。 2、循环语句 循环语句允许程序重复执行特定的代码块,知道满足特定条件。 在R语言中,常见的循环语句有for、while和repeat。 # for循环用于在已知次数的情况下重复执行代码…

磁盘的管理

会在linux中使用硬盘 分区 格式化(重新安装文件系统) 挂载 硬盘的分类 1.机械硬盘 2.固态硬盘 硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇区存放512字节的 数据 (扇区越多容量越大) 存放数据的…

2024.4.13 Python 爬虫复习day01

目录 day01_HTTP协议HTML页面web服务器 各类名词解释 URL统一资源定位符 HTTP协议 HTML页面 知识点: 第一个页面 标题标签和图片标签 注册页面 登录页面 WEB服务器 安装fastapi和uvicorn 原始命令方式 镜像源命令方式 工具方式 快速搭建web服务器 知识点: 示例…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘,备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(多主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大…

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询: 子查询能独立执行 相关查询: 子查询不能独立运行 相关查询的执行顺序: 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真,则取此元组放入结果…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具,它基于项目对象模型(POM)概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目,但也可以用于其他类型的项目。Maven 的主要目标是简化构建…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

OpenCV从入门到精通实战(四)——答题卡识别判卷系统

基于OpenCV的答题卡识别系统,其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术,自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述: 1. 导入必要的库 系统首先导入…

偏微分方程算法之一阶双曲差分法

目录 一、研究目标 二、理论推导 2.1 引言 2.2 迎风格式 2.3 完全不稳定差分格式 2.4 蛙跳格式(Leapfrog) 2.5 Lax-Friedrichs格式 2.6 Lax-Wendroff格式 2.7 Beam-Warming格式 2.8 隐格式 2.9 Courant-Friedrichs-Lewy条件(CFL条…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中,已经对51单片机的串行口结构做过详细介绍,并且通过实例讲解了串行口的4种工作方式中方式1的具体用法,本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式,主要用于扩展并…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图:外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。(对象结构型模式) 外观模式的特点: 1.又叫做门面模式&#xf…

试驾小米SU7后,我准备退了我的订单

文 | AUTO芯球 作者 | 雷歌 我真想退了我之前大定的小米SU7Pro版! 前两天我不是和朋友三人一起开着问界M9去试驾SU7了嘛, 说实话,这一圈下来,有欣喜有失望。 SU7的优点特别明显,也很突出, 就是它的底…

了解MySQL InnoDB多版本

了解MySQL InnoDB多版本 在数据库管理系统中,多版本并发控制(MVCC)是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC,这使得它可以在提供高事务性能的同时,也保证了数据的一致性和隔离性 MVCC简…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题,特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢,甚至完全停止,因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁,包括常用…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件,专为Mac用户设计,提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生,都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统,而有些软件只在 Windows 上运行,例如:PotPlayer,那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢?答案是安装 wine。 简单的安装步骤如…

IDEA使用SCALA

一、在IDEA中下载插件 在设置->插件中找到scala,并下载。 下载完成后重启idea 二、在idea中创建spark的RDD操作项目 新建项目选中Scala。 创建完成后为项目添加java包,这个添加的是spark安装包中jars目录下的所有jar包 然后编写RDD操作 import or…

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法解决方法: 1.在开发人员选项中开启USB调试 如何进入开发者选项? 设置->关于->版本号,点击版本号直至出现您已处于开发者模式 2.选择USB配置…