当前位置: 首页 > news >正文

调试和优化大型深度学习模型 - 5 启动训练命令

调试和优化大型深度学习模型 - 5 启动训练命令

flyfish

先从简单的一句开始

python -m torch.distributed.launch

这里的 -m 是告诉 Python 去运行 torch.distributed.launch 模块,而不是某个具体的 .py 文件。torch.distributed.launch 模块torch.distributed.launch 是 PyTorch 提供的一个辅助模块,专门用于启动分布式训练。它是 PyTorch 中用于管理分布式进程的常用工具之一。

主要功能
  1. 管理多进程 : 在多卡训练中,torch.distributed.launch 模块可以帮助你在每个 GPU 上启动一个进程。它根据 --nproc_per_node 的参数来决定启动多少个进程。

  2. 分布式训练 : 模块会设置 PyTorch 的分布式环境,初始化 torch.distributed 包,并根据提供的参数(如节点数、进程数、节点排名等)来配置训练环境。

  3. 自动化通信 : 在多节点环境中,torch.distributed.launch 模块处理了节点间的通信配置,包括设置主节点的 IP 地址、端口等,使得节点之间能够正常通信。

  4. 进程间的同步 : 它还负责在进程间进行同步操作,确保所有进程都能正确地参与训练,数据和梯度能够在不同的 GPU 之间正确地传递和同步。

工作原理

当你运行 python -m torch.distributed.launch 时,Python 会加载并执行 torch.distributed.launch 模块中的代码。
该模块会启动多个子进程,每个进程都会运行你指定的训练脚本(例如 main.py)。
它会根据你提供的分布式训练参数(如进程数、节点数等)来配置和启动训练任务。
在实际训练过程中,torch.distributed.launch 处理了进程之间的通信、同步等细节,使得用户可以专注于模型和数据本身。

一、传统模型 单机多卡

python -m torch.distributed.launch --nproc_per_node=8 --master_port=23456

解释:
python -m torch.distributed.launch: 这部分表示使用 torch.distributed.launch 模块来启动多卡训练。这是 PyTorch 官方提供的用于分布式训练的工具。

--nproc_per_node=8: 指定每个节点(通常是指一台机器)使用的进程数。在这个例子中,每个节点使用8个进程,也就是说,8个GPU会被分配到8个进程中进行并行训练。

--master_port=23456: 设置主进程的端口号,用于通信。如果在集群中运行分布式训练,每个节点之间的进程需要通过这个端口进行通信。
作用:
该命令在一个节点上启动了8个进程,每个进程负责处理一个GPU上的计算任务。PyTorch 会自动处理不同 GPU 之间的数据通信和同步。这种方式适合在集群环境下进行分布式训练或在单机多卡上进行大规模并行计算。

二、大模型 多机多卡

配置一个多节点分布式训练的脚本设置了多个环境变量
根据自己的环境进行更改

export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/root/miniconda3/lib:$LD_LIBRARY_PATH
export HCCL_CONNECT_TIMEOUT=12000
export COMBINED_ENABLE=1
export INF_NAN_NODE_ENABLE=0
source /usr/local/Ascend/ascend-toolkit/set_env.sh
MASTER_ADDR=localhost
MASTER_PORT=6000
NNODES=1
NODE_RANK=0
NPUS_PER_NODE=8
WORLD_SIZE=$(( $NPUS_PER_NODE*$NNODES ))
DATA_PATH=./dataset/llama_text_document
LOAD_CHECKPOINT=./model/LLA_MA-2-13B-hf_tp8_pp1
SAVE_CHECKPOINT=./model/LLAMA-2-13B-hf_tp8_pp1_save/
TOKENIZER_PATH=./model/LLAMA-2-13B-hf
DISTRIBUTED_ARGS="--npus-per-node $NPUS_PER_NODE --nnodes $NNODES --node-rank $NODE_RANK --master-addr $MASTER_ADDR --master-port $MASTER_PORT"
Shell 脚本基础知识
  1. export 命令 :
    export 用于将变量或函数导出到当前环境的子进程中。简而言之,它使得这些变量在运行脚本和程序时是全局可见的。
    例如,export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/root/miniconda3/lib:$LD_LIBRARY_PATH 将新的路径添加到 LD_LIBRARY_PATH 环境变量中,并将其导出。

  2. source 命令 :
    source 命令用于在当前 shell 会话中执行脚本。与直接执行脚本不同,source 不会启动一个新的 shell 环境,而是在当前的环境中执行,因此脚本中设置的环境变量或函数在执行后仍然可用。
    例如,source /usr/local/Ascend/ascend-toolkit/set_env.sh 表示运行 set_env.sh 脚本,并使其对当前 shell 环境产生影响。

  3. $符号 :
    在 shell 脚本中,$ 用于引用变量的值。例如,$MASTER_ADDR 表示变量 MASTER_ADDR 的值。

环境变量解释
  1. LD_LIBRARY_PATH :
    这是一个环境变量,用于指定动态链接库的搜索路径。通过 export LD_LIBRARY_PATH=...,你可以将指定路径添加到动态链接器的搜索路径中,从而让系统在这些路径中查找动态库文件(如 .so 文件)。

  2. HCCL_CONNECT_TIMEOUT :
    这是一个特定于华为 Ascend 硬件的环境变量,表示 HCCL(Huawei Collective Communication Library)的连接超时时间,单位是秒。这里设置为 12000 秒。

  3. COMBINED_ENABLECOMBINED_ENABLEINF_NAN_NODE_ENABLE :
    这些是自定义的环境变量,可能用于控制某些特定功能的启用或禁用。它们的具体作用通常取决于所使用的软件或库的要求。

  4. source /usr/local/Ascend/ascend-toolkit/set_env.sh :
    这行命令执行华为 Ascend 工具包的环境配置脚本,设置必要的环境变量以使用 Ascend 设备进行计算。

多节点分布式训练配置
  1. MASTER_ADDR :
    这是主节点的 IP 地址或主机名。在多节点分布式训练中,其他节点需要通过这个地址与主节点进行通信。这里设置为 localhost,表示当前机器是主节点。

  2. MASTER_PORT :
    这是主节点用于通信的端口号。设置为 6000,这意味着分布式训练的通信会在这个端口进行。

  3. NNODES :
    表示参与训练的节点数量。设置为 1 表示只有一个节点参与训练。

  4. NODE_RANK :
    指定当前节点在所有节点中的顺序编号。通常从 0 开始。在单节点训练中,NODE_RANK 通常设置为 0

  5. NPUS_PER_NODE :
    表示每个节点上使用的 NPU(Neural Processing Unit,神经网络处理单元,也就是 Ascend 设备)的数量。这里设置为 8,表示每个节点使用 8 个 NPU。

  6. WORLD_SIZE :
    这是训练中总的进程数,计算方式是 NNODES × NPUS_PER_NODE。在这个例子中,WORLD_SIZE8

  7. DATA_PATH :
    表示数据集所在的路径。这个路径通常指向训练数据的位置。

  8. LOAD_CHECKPOINTLOAD_CHECKPOINTSAVE_CHECKPOINT :
    LOAD_CHECKPOINT 是要加载的模型检查点的位置,用于继续从之前的训练结果开始训练。
    SAVE_CHECKPOINT 是训练过程中保存模型检查点的位置。

  9. TOKENIZER_PATH :
    表示 tokenizer(分词器)的路径,通常用于加载模型的词汇表和相关信息。

  10. DISTRIBUTED_ARGS :
    这是一个包含分布式训练参数的字符串,通常在启动分布式训练时传递给主脚本。在这个例子中,它包含了节点数、每个节点的 NPU 数量、节点排名、主节点地址和端口号等信息。

在每个服务器上分别启动训练,这里以两个服务器为例

在服务器1上启动训练的命令示例:

Node0: python -m torch.distributed.launch --nproc_per_node 8 --nnodes=2 --node_rank=0 --master_addr=$MASTER_ADDR main.py --deepspeed ds_config.json

在服务器2上启动训练的命令示例:

Node1: python -m torch.distributed.launch --nproc_per_node 8 --nnodes=2 --node_rank=1 --master_addr=$MASTER_ADDR main.py --deepspeed ds_config.json

参数解释:

  1. python -m torch.distributed.launch :
    这是用于启动分布式训练的模块。(重复,看前面)

  2. --nproc_per_node 8 :
    这个参数指定了每个节点(即每台机器)上要启动的进程数。在这个例子中,每个节点上会启动8个进程,这通常对应于使用8个GPU。每个进程负责处理一个GPU上的计算任务。

  3. --nnodes=2 :
    指定了分布式训练的节点数量,也就是参与训练的机器数量。在这个例子中,表示有2个节点共同参与训练。

  4. --node_rank=0 :
    这个参数指定当前节点的排名。节点的排名从0开始,依次增加。在这个例子中,node_rank=0 表示这是第一台机器。在另一台机器上,这个值设置为1。

  5. --master_addr=$MASTER_ADDR :
    这是用于指定主节点的IP地址或主机名($MASTER_ADDR 是环境变量)。在多节点训练中,各节点需要通过这个地址进行通信。主节点通常负责协调和管理各节点的训练进程。

  6. main.py :
    这是你要运行的主训练脚本。main.py 通常包含模型定义、数据加载、训练循环等逻辑。

  7. --deepspeed ds_config.json :
    --deepspeed 表示启用 DeepSpeed,这是一种优化大规模分布式训练的库,特别适合大模型。ds_config.json 是 DeepSpeed 的配置文件,里面包含了与训练相关的配置参数,例如分布式优化策略、混合精度训练、梯度累积等设置。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 8.16-ansible的应用
  • 【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例
  • 主机ssh连接不上vmware的虚拟机
  • Java算法题——二分查找法
  • MemFire Cloud是否真的可以取代后端
  • 【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端
  • Token 设计
  • SpringBoot响应式编程(2)WebFlux入门
  • 文心快码(Baidu Comate)快速创建数据可视化图表
  • CSS的:host伪类:精确定位于Web组件的指南
  • 00_remipi_软件评估记录
  • 计算机基础知识复习8.13
  • 基于 HTTP构建 YUM网络源
  • 使用ITextRenderer导出PDF后无法打开问题,提示‘无法打开此文件‘
  • JVM性能监控工具
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • C++类中的特殊成员函数
  • echarts花样作死的坑
  • Java 23种设计模式 之单例模式 7种实现方式
  • mac修复ab及siege安装
  • python学习笔记-类对象的信息
  • Redash本地开发环境搭建
  • Redis 懒删除(lazy free)简史
  • yii2权限控制rbac之rule详细讲解
  • 力扣(LeetCode)56
  • 聊聊hikari连接池的leakDetectionThreshold
  • 什么软件可以剪辑音乐?
  • #1014 : Trie树
  • #考研#计算机文化知识1(局域网及网络互联)
  • $$$$GB2312-80区位编码表$$$$
  • (1)(1.11) SiK Radio v2(一)
  • (2020)Java后端开发----(面试题和笔试题)
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (c语言+数据结构链表)项目:贪吃蛇
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)基于IDEA的JAVA基础1
  • (原創) 物件導向與老子思想 (OO)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 生成二级域名
  • @hook扩展分析
  • [ C++ ] STL---stack与queue
  • [ACM] hdu 1201 18岁生日
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [Android]通过PhoneLookup读取所有电话号码
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [asp.net core]project.json(2)
  • [c++] 自写 MyString 类
  • [C++初阶]list的模拟实现
  • [C++提高编程](三):STL初识
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟