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

devtools/2024/9/24 1:25:06/

调试和优化大型深度学习模型 - 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 的配置文件,里面包含了与训练相关的配置参数,例如分布式优化策略、混合精度训练、梯度累积等设置。


http://www.ppmy.cn/devtools/96092.html

相关文章

Django数据库一对多字段

3.16 Django数据库一对多 一对多关系通常通过外键(ForeignKey)来建立。 示例: 1)创建Author和book models class class Auther(models.Model):namemodels.CharField(verbose_name作者,max_length32)class Book(models.Model):…

Java八股整合(MySQL+Redis)

MySQL 数据库设计三范式 不可再分,部分依赖,传递依赖 主键和外键区别 主键非空约束,唯一性约束,唯一标识一个字段 外键用于和其他表建立连接,是另一张表的主键,可重复可为空可以有多个 为什么不推荐使…

百度地图SDK Android版开发 6 显示覆盖物

百度地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例Text示例效果图 Marker的更多属性常用属性交互碰撞动画其它属性 折线的更多属性常用属性交互其它 多边形的更多属性常用属性交互其它 Arc的更多属…

Rust 错误处理

Rust 错误处理 Rust 是一种系统编程语言,以其内存安全、高并发和实用性而著称。在 Rust 中,错误处理是一个核心概念,它通过提供 Result 和 Option 类型来鼓励开发者显式地处理可能出现的错误,而不是依赖异常机制。本文将深入探讨 Rust 中的错误处理机制,包括 Result 和 O…

LeetCode //C - 316. Remove Duplicate Letters

316. Remove Duplicate Letters Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example 1: Input: s “bcabc”…

动态规划(算法篇)

算法之动态规划 动态规划(dp) 概念: 将递归算法重新写成非递归算法,让后者把那些子问题的答案系统地记录在一个表(dp数组)内,这种方法叫做动态规划通常用于求解具有最优性质的问题(最优子结构&最优子问题),希望找到具有最优…

数据结构队列的单链表实现

1.Queuec.h头文件函数名 #pragma once #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<assert.h> typedef int QDataType; typedef struct QueueNode {QDataType data;struct QueueNode* next; }QNode; typedef struct Queue {Q…

MySQL中处理JSON数据:大数据分析的新方向,详解与示例

文章目录 1. MySQL中的JSON数据类型2. JSON函数和运算符3. 创建JSON列的表4. 插入JSON数据5. 查询JSON数据6. 复杂查询和聚合7. JSON 数据的索引8. 总结 在当今的大数据时代&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&a…