跟代码执行流程,读Megatron源码(四)megatron初始化脚本initialize.py之initialize_megatron()分布式环境初始化

news2024/9/21 3:21:15

  在前文中,我们讲述了pretrain函数的执行流程,其首要步骤是megatron分组的初始化与环境的配置。本文将深入initialize_megatron函数源码,剖析其初始化分布式训练环境的内部机制。

  注:在此假设读者具备3D并行相关知识

一. initialize_megatron函数的上下文调用关系(initialize.py)

  在Megatron-LM中,initialize.py文件中的initialize_megatron函数是分布式训练环境的初始化核心。该函数由trainning.py的pretrain函数调用,是整个pretrain流程中的第一个核心步骤,负责配置3D并行的环境和分组信息。

1. initialize_megatron函数源码

  initialize_megatron函数的核心代码段如下:

  需要注意的是,尽管initialize_megatron函数还涵盖了设置全局参数、分词器构建、自动恢复配置、TensorBoard日志记录、计时器设置以及依赖编译等辅助功能,但这些功能在初始化流程中虽具重要性,却非其核心职责所在。其核心功能聚焦于上述代码段所描述的分布式与模型并行初始化流程,而该流程主要是通过finish_mpu_init中调用的_initialize_distributed函数实现的,如下图。

2. _initialize_distributed

  _initialize_distributed函数主要有两个作用:

  a. 通过调用torch.distributed.init_process_group()初始化分布式环境,该函数设置了分布式训练所需的基本通信环境,包括进程间的通信后端、worldsize(参与训练的进程总数)、每个进程的rank号等。默认情况下,它会创建一个全局的进程组,这个进程组定义了哪些进程可以相互通信,也可以根据需要创建更多的进程组以支持更复杂的通信模式。

  在使用 init_process_group() 初始化分布式环境之后,我们可以使用PyTorch提供的分布式通信和同步 API 来实现跨进程的通信和数据同步。这包括使用dist.all_reduce() 来聚合梯度、dist.barrier() 同步所有进程的执行点等。

  请注意,在调用init_process_group()之前,需要确保已经正确设置了所有相关的环境变量(如MASTER_ADDR、MASTER_PORT),并且这些环境变量对于每张卡都是唯一的。

  b. 通过调用mpu.initialize_model_parallel()来初始化分布式训练环境中的数据并行(DP)、张量并行(TP)、和流水线并行(PP)的分组,如下图。

  mpu.initialize_model_parallel()的入参解释如下:

  • tensor_model_parallel_size:张量并行的大小。

  • pipeline_model_parallel_size:流水线并行的大小。

  • virtual_pipeline_model_parallel_size:虚拟流水线并行的大小,这是一个更高级的特性,允许在流水线阶段内部进一步分割模型。

  • pipeline_model_parallel_split_rank:该参数指定了流水线分割的起始rank,即决定了哪个rank的设备将开始处理流水线的第一个阶段,然后接下来的阶段按顺序分配给rank号递增的设备。

  • context_parallel_size、expert_model_parallel_size等参数用于特定的模型架构,如带有上下文并行或专家并行的Transformer模型。

  • distributed_timeout_minutes:分布式操作的超时时间(以分钟为单位)。

  • nccl_communicator_config_path:NCCL通信器的配置文件路径,NCCL是用于NVIDIA GPU的高效通信库。

  • order:指定并行策略的顺序,例如'tp-cp-ep-dp-pp'表示张量并行(Tensor Parallelism)、上下文并行(Context Parallelism)、专家并行(Expert Parallelism)、数据并行(Data Parallelism)和流水线并行(Pipeline Parallelism)的顺序。

  • encoder_pipeline_model_parallel_size:专门用于编码器的流水线并行大小。

  • get_embedding_ranks和get_position_embedding_ranks:用于获取特定用于embedding或position embedding的GPU rank号,以便为这些组件配置特定的并行策略。

二. mpu.initialize_model_parallel函数的调用关系(_init_.py)

  mpu.initialize_model_parallel()函数的调用关系在import中表明,如下图:

  其中mpu定义在megatron/core/_init_.py中:

  如上图,mpu指向parallel_state,因此,对于mpu.initialize_model_parallel()的调用既是对parallel_state.initialize_model_parallel()的调用,该函数实现在parallel_state.py中。

三. 分组逻辑的具体实现(parallel_state.py)

1. parallel_state.initialize_model_parallel的调用关系

  parallel_state.initialize_model_parallel函数在分布式训练架构中扮演着关键但非终结性的角色,其核心功能是启动模型并行所需的基础设置。该函数专注于预配置模型并行相关的进程群组(process groups)与全局状态变量,确保并行执行环境的基础通信框架得以确立。

  下面以dp为例,展示该函数的代码执行逻辑。

  首先,该函数创建RankGenerator对象实体,该对象的作用是根据用户输入的tp/dp/pp大小,以及总卡数(world_size),确定最终每张卡的分组,如下图。

  其次,它首先调用RankGenerator组件动态生成高效的rank分配方案,这一步骤是优化资源利用与通信效率的关键。随后,通过调用后端(backend)接口,根据RankGenerator产出的分组策略,构建起实际用于数据交换的通信群组(communication groups)。这些通信群组覆盖了数据并行(dp)、张量并行(tp)、以及流水线并行(pp)等维度(这里只以dp为例),确保模型训练过程中的数据流通与参数同步能够高效且有序地进行,如下图。

  随着所有必需通信群组的成功建立,以及全局分组变量的初始化,模型并行的核心通信网络得以全面搭建完成。这一网络的构建不仅标志着模型并行化训练环境的初步就绪,更为后续的高性能计算任务奠定了坚实的基础,确保了分布式训练过程中数据一致性与效率的最优化实现。

2. RankGenerator.get_ranks

  RankGenerator,顾名思义,其主要职责为生成rank分组,它管理着用户的tp/pp/dp/ep/cp数值,以及全局卡数(world_size)等分组相关的配置项,并在get_ranks函数中调用generate_masked_orthogonal_rank_groups函数获取用户需要的最终分组信息,如下图:

3. generate_masked_orthogonal_rank_groups

  generate_masked_orthogonal_rank_groups函数是rank分组的最终实现,其代码逻辑如下:

  a. 筛选并行性尺寸:

  masked_shape:从parallel_size和mask中筛选出被掩码(即True)的并行尺寸,这些尺寸将用于生成组内的rank。

  unmasked_shape:同样从parallel_size和mask中筛选出未被掩码的并行尺寸,这些尺寸将用于在更广泛的并行环境中(跨组)定位每个组。

  b. 计算步长:

  global_stride:通过prefix_product(parallel_size)计算得到全局步长。

  masked_stride和unmasked_stride:分别根据mask从global_stride中筛选出被掩码和未被掩码的步长。这些步长用于计算全局rank。

  c. 确定组大小和组数:

  group_size:通过prefix_product(masked_shape)[-1]计算得到每个组的大小。

  num_of_group:通过world_size // group_size计算得到组的数量,即全局大小除以每个组的大小。

  d. 生成rank:

  遍历每个组(group_index从0到num_of_group-1)。

  使用decompose(group_index, unmasked_shape)根据未被掩码的并行尺寸分解组索引,得到该组在全局并行环境中的位置(decomposed_group_idx)。

  在每个组内,遍历每个rank(rank_in_group从0到group_size-1)。

  使用decompose(rank_in_group, masked_shape)根据被掩码的并行尺寸分解组内rank,得到该rank在组内的位置(decomposed_rank_idx)。

  计算每个rank的全局索引,通过将被掩码和未被掩码的索引分别与其对应的步长进行内积(inner_product),然后将两个内积相加得到。

  最后,将计算得到的每个组内的rank添加到ranks列表中。

  e. 返回rank列表:

  函数最终返回ranks列表,其中包含了每个组内的所有rank,这些rank在全局并行环境中是唯一的。

  至此分布式训练分组的全部逻辑均介绍完毕,后续文章将继续解析分组完成后的训练逻辑。

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

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

相关文章

Zabbix自定义监控内容部署+邮件报警+Zabbix自愈+Zabbix批量添加主机

一、自定义监控项 1.1自定义监控项原理 1)先明确获取监控指标数据的命令或脚本; 2)在被监控主机配置文件子目录(/etc/zabbix/zabbix_agent2.d/)中创建以.conf后缀的监控项配置文件,自定义获取监控指标数据的键值; …

Windows:批处理脚本学习

目录 一、第一个批处理文件 1. &&和 | | 2. | 和 & 二、变量 1.传参变量%name 2.初始化变量set命令 3.变量的使用 4.局部变量与全局变量 5.使用环境变量 6.扩充变量语法 三、注释REM和 :: 四:函数 1.定义函数 2.…

鸿蒙 Navigation VS Router 对比

当前HarmonyOS支持两套路由机制(Navigation和Router),Navigation作为后续长期演进及推荐的路由选择方案,其与Router比较的优势如下: 易用性层面: Navigation天然具备标题、内容、回退按钮的功能联动&…

看 Unity 组件的源码 —— ILSpy

ILSpy 是开源的 .NET 程序集浏览器和解编译器。 下载 ILSpy ILSpy Github 地址:icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! (github.com) 它有 Release 包可以下载 也提供 IDE 的…

Cadence23学习笔记(十四)

ARC就是圆弧走线的意思: 仅打开网络的话可以只针对net进行修改走线的属性: 然后现在鼠标左键点那个走线,那个走线就会变为弧形: 添加差分对: 之后,分别点击两条线即可分配差分对: 选完差分对之后…

解锁创新:AI如何推动低代码应用的智能化

在当今快速变化的商业环境中,企业面临着前所未有的挑战和机遇。数字化转型已成为各行各业的必然趋势,企业需要迅速适应市场变化,提升客户体验,并降低开发成本。 这一背景下,低代码开发平台的崛起为企业提供了一种高效…

ICIP-2020-A Non-local Mean Temporal Filter for VideoCompression

在 libvpx、VP8、VP9 和 HEVC 等各种编码器实现中,早就发现在预处理阶段过程中从源视频信号去除噪声对客观压缩效率的提升存在好处。通常使用常规的块匹配运动搜索来构建运动轨迹,并沿着轨迹比较每对像素,根据像素间的差异确定时域滤波器系数…

SpringSecurity如何整合JWT

整合JWT 我们前几个小节,实现的是非前后端分离情况下的认证与授权的处理,目前大部分项目,都是使用前后端分离的模式。那么前后端分离的情况下,我们如何使用SpringSecurity来解决权限问题呢?最常见的方案就是SpringSe…

如何学习Airflow:糙快猛的大数据之路(附思维导图)

什么是Airflow? 在开始之前,让我们先简单了解一下Airflow是什么。Apache Airflow是一个开源的工作流管理平台。它允许你以代码的方式定义、调度和监控复杂的数据处理管道。 想象一下,你有一系列需要按特定顺序执行的任务,而且这些任务之间还有依赖关系,Airflow就是为解决这…

【NPU 系列专栏 1.1 -- NPU TOPS 算力的计算方式】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NPU 算力MAC 阵列简介MAC 阵列特点 MAC 阵列的结构MAC 阵列架构示例 MAC 阵列计算举例示例计算 TOPS 计算方法 NPU 算力 OpenCV 算法会消耗很大一部分自动驾驶芯片的算力,在车上堆摄像头的同时也需要堆TOPS&#xf…

把 网页代码 嵌入到 单片机程序中,2024/7/25 17:33

把 网页代码 嵌入到 单片机程序中 废话不多说直接上结果: 代码中定义: const char* html" 处理过的网页代码 " ; 处理网页代码的 web 程序( 主要是 正则 把双引号 加 符号) <!DOCTYPE html> <html lang"en" style"background-color: rgba…

Python 爬虫 tiktok API 获取TIKTOK标签信息 数据采集

此接口可通过标签id一键查询到tiktok标签信息&#xff0c;如有需要&#xff0c;请点击文末链接联系我们。 详细采集页面如图 https://www.tiktok.com/tag/musicand?_r1&namemusicand&u_codeeab7jd1ha5l36c&_deab7h4fj9h9k1f&share_challenge_id2878999&…

CXL与NVME融合场景下, 计算存储应用案例分析

场景1:数据写入之前 目标是避免数据从存储设备传输到主机内存再返回存储设备的传统过程中的数据搬运成本。通过利用CXL和NVMe技术的结合&#xff0c;可以在存储层直接对数据进行处理&#xff0c;即所谓的计算存储&#xff08;Computational Storage&#xff09;。这特别适用于…

革新优选购物模式:重塑电商体验

在当今竞争激烈的电商市场中&#xff0c;革新优选购物模式以其独特的运营策略脱颖而出&#xff0c;其核心在于通过价格优化、激励机制创新以及社交网络的深度融合&#xff0c;激发消费者的购物热情&#xff0c;实现销售与用户忠诚度的双重飞跃。 一、合规运营&#xff0c;构建信…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

Inxedu 因酷网校在线教育系统之sql注入代码审计

1 后台-/article/delete?articelId= 注入 全局搜索 ${,开启文件过滤,关注*Mapper.xml文件 点击进入ArticleMapper.xml,SQL注入点在第97行,使用$直接拼接了参数 查找哪里声明那个方法 点击deleteArticleByIds,查看谁调用了它。在ArticleDaoImpl调用 接着点击deleteArticl…

静态IP地址在网络安全中的角色解析与实测分析

在这个网络边界日益模糊的时代&#xff0c;每一次点击、每一次数据传输都有着安全问题。作为网络安全体系中的基石&#xff0c;静态IP地址的角色显得尤为重要而复杂。今天&#xff0c;我们的测评团队将带您深入剖析静态IP地址在网络安全中的多重角色&#xff0c;并通过两家代理…

谁是中国井村屋?背靠红豆产业链,年销2.5亿根小豆冰棍,井村屋极致产品力是如何策划的?

红豆棒冰是日本老字号“井村屋”旗下的招牌产品。 井村屋在日本以红豆产业链见长&#xff0c;凭借优质产业链打造的红豆棒冰很逆天&#xff0c;每年大约售出 2.5 亿根&#xff0c;日本1.2亿人口&#xff0c;相当于每人每年至少吃两根。 这个国民级单品是如何打造极致产品力的呢…

【爆】Stable Diffusion【真人模型】:全网最真实的亚洲女性大模型

模型v1下载&#xff1a;XXMix_9realisticSDXL-Checkpoint-展夜枭-LiblibAI 环境要求&#xff1a; gpu&#xff1a;12G 最好16G python&#xff1a;3.10 cuda&#xff1a;11.8 一、介绍 XXMix_9realisticSDXL是一个基于Stable Diffusion XL模型训练的微调模型&#xff0c;…

06 capture软件元器件库的管理与调用 07 元器件库与PCB封装库的关联与调用

06 capture软件元器件库的管理与调用 && 07 元器件库与PCB封装库的关联与调用 第一部分 06 capture软件元器件库的管理与调用一、获取元器件库的方法 第二部分 07 元器件库与PCB封装库的关联与调用 第一部分 06 capture软件元器件库的管理与调用 一、获取元器件库的方…