调试和优化大型深度学习模型 - 5 启动训练命令
flyfish
先从简单的一句开始
python -m torch.distributed.launch
这里的 -m
是告诉 Python 去运行 torch.distributed.launch
模块,而不是某个具体的 .py
文件。torch.distributed.launch
模块torch.distributed.launch
是 PyTorch 提供的一个辅助模块,专门用于启动分布式训练。它是 PyTorch 中用于管理分布式进程的常用工具之一。
主要功能
-
管理多进程 : 在多卡训练中,
torch.distributed.launch
模块可以帮助你在每个 GPU 上启动一个进程。它根据--nproc_per_node
的参数来决定启动多少个进程。 -
分布式训练 : 模块会设置 PyTorch 的分布式环境,初始化
torch.distributed
包,并根据提供的参数(如节点数、进程数、节点排名等)来配置训练环境。 -
自动化通信 : 在多节点环境中,
torch.distributed.launch
模块处理了节点间的通信配置,包括设置主节点的 IP 地址、端口等,使得节点之间能够正常通信。 -
进程间的同步 : 它还负责在进程间进行同步操作,确保所有进程都能正确地参与训练,数据和梯度能够在不同的 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 脚本基础知识
-
export
命令 :
export
用于将变量或函数导出到当前环境的子进程中。简而言之,它使得这些变量在运行脚本和程序时是全局可见的。
例如,export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/root/miniconda3/lib:$LD_LIBRARY_PATH
将新的路径添加到LD_LIBRARY_PATH
环境变量中,并将其导出。 -
source
命令 :
source
命令用于在当前 shell 会话中执行脚本。与直接执行脚本不同,source
不会启动一个新的 shell 环境,而是在当前的环境中执行,因此脚本中设置的环境变量或函数在执行后仍然可用。
例如,source /usr/local/Ascend/ascend-toolkit/set_env.sh
表示运行set_env.sh
脚本,并使其对当前 shell 环境产生影响。 -
$
符号 :
在 shell 脚本中,$
用于引用变量的值。例如,$MASTER_ADDR
表示变量MASTER_ADDR
的值。
环境变量解释
-
LD_LIBRARY_PATH
:
这是一个环境变量,用于指定动态链接库的搜索路径。通过export LD_LIBRARY_PATH=...
,你可以将指定路径添加到动态链接器的搜索路径中,从而让系统在这些路径中查找动态库文件(如.so
文件)。 -
HCCL_CONNECT_TIMEOUT
:
这是一个特定于华为 Ascend 硬件的环境变量,表示 HCCL(Huawei Collective Communication Library)的连接超时时间,单位是秒。这里设置为 12000 秒。 -
COMBINED_ENABLE
和COMBINED_ENABLE
和INF_NAN_NODE_ENABLE
:
这些是自定义的环境变量,可能用于控制某些特定功能的启用或禁用。它们的具体作用通常取决于所使用的软件或库的要求。 -
source /usr/local/Ascend/ascend-toolkit/set_env.sh
:
这行命令执行华为 Ascend 工具包的环境配置脚本,设置必要的环境变量以使用 Ascend 设备进行计算。
多节点分布式训练配置
-
MASTER_ADDR
:
这是主节点的 IP 地址或主机名。在多节点分布式训练中,其他节点需要通过这个地址与主节点进行通信。这里设置为localhost
,表示当前机器是主节点。 -
MASTER_PORT
:
这是主节点用于通信的端口号。设置为6000
,这意味着分布式训练的通信会在这个端口进行。 -
NNODES
:
表示参与训练的节点数量。设置为1
表示只有一个节点参与训练。 -
NODE_RANK
:
指定当前节点在所有节点中的顺序编号。通常从0
开始。在单节点训练中,NODE_RANK
通常设置为0
。 -
NPUS_PER_NODE
:
表示每个节点上使用的 NPU(Neural Processing Unit,神经网络处理单元,也就是 Ascend 设备)的数量。这里设置为8
,表示每个节点使用 8 个 NPU。 -
WORLD_SIZE
:
这是训练中总的进程数,计算方式是NNODES
×NPUS_PER_NODE
。在这个例子中,WORLD_SIZE
为8
。 -
DATA_PATH
:
表示数据集所在的路径。这个路径通常指向训练数据的位置。 -
LOAD_CHECKPOINT
和LOAD_CHECKPOINT
和SAVE_CHECKPOINT
:
LOAD_CHECKPOINT
是要加载的模型检查点的位置,用于继续从之前的训练结果开始训练。
SAVE_CHECKPOINT
是训练过程中保存模型检查点的位置。 -
TOKENIZER_PATH
:
表示 tokenizer(分词器)的路径,通常用于加载模型的词汇表和相关信息。 -
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
参数解释:
-
python -m torch.distributed.launch
:
这是用于启动分布式训练的模块。(重复,看前面) -
--nproc_per_node 8
:
这个参数指定了每个节点(即每台机器)上要启动的进程数。在这个例子中,每个节点上会启动8个进程,这通常对应于使用8个GPU。每个进程负责处理一个GPU上的计算任务。 -
--nnodes=2
:
指定了分布式训练的节点数量,也就是参与训练的机器数量。在这个例子中,表示有2个节点共同参与训练。 -
--node_rank=0
:
这个参数指定当前节点的排名。节点的排名从0开始,依次增加。在这个例子中,node_rank=0
表示这是第一台机器。在另一台机器上,这个值设置为1。 -
--master_addr=$MASTER_ADDR
:
这是用于指定主节点的IP地址或主机名($MASTER_ADDR
是环境变量)。在多节点训练中,各节点需要通过这个地址进行通信。主节点通常负责协调和管理各节点的训练进程。 -
main.py
:
这是你要运行的主训练脚本。main.py
通常包含模型定义、数据加载、训练循环等逻辑。 -
--deepspeed ds_config.json
:
--deepspeed
表示启用 DeepSpeed,这是一种优化大规模分布式训练的库,特别适合大模型。ds_config.json
是 DeepSpeed 的配置文件,里面包含了与训练相关的配置参数,例如分布式优化策略、混合精度训练、梯度累积等设置。