使用指导
说明
MindIO TFT以SDK的形式提供服务,支持部署在裸机和容器环境中。
安装MindIO TFT SDK之后,需要在框架中启动MindIO TFT模块,并在训练过程中同步优化器数据更新状态到该模块。
对接MindSpeed-LLM框架
前提条件
- 使用前请先了解MindIO TFT的约束限制。
- MindSpeed-LLM框架准备参见MindSpeed-LLM。匹配的Megatron-LM的版本为 core_v0.12.1。
说明
- 本次发布包配套MindSpeed-LLM的 2.3.0 分支,环境、代码、数据集准备请用户参考MindSpeed-LLM仓库的相关指导说明,并确保其安全性。
- MindIO TFT对接MindSpeed-LLM框架,目前支持MindIO TTP、MindIO UCE和MindIO ARF功能。
- 对于PyTorch类框架,安装或开启MindCluster后,跳过步骤1对“torchrun”文件的修改,由MindCluster控制进程退出。
操作步骤
-
-
查找环境中的“torchrun”文件。
which torchrun -
打开以上命令显示路径下的“torchrun”文件。
vim {torchrun文件路径}/torchrun -
按“i”进入编辑模式,在文件中对应位置增加 import mindio_ttp.framework_ttp。
import re import sys import mindio_ttp.framework_ttp from torch.distributed.run import main as torch_main -
按“Esc”键,输入 :wq!,按“Enter”保存并退出编辑。
-
-
此处以编辑“examples/mcore/llama2/pretrain_llama2_7b_ptd.sh”脚本为例。
-
打开“examples/mcore/llama2/pretrain_llama2_7b_ptd.sh”脚本。
vim examples/mcore/llama2/pretrain_llama2_7b_ptd.sh -
按“i”进入编辑模式,开启高可用功能需要在脚本中增加如下内容。
export GLOO_SOCKET_IFNAME=enp189s0f0 export TTP_ADDR="master node ip" source /usr/local/Ascend/cann/set_env.sh # 在GPT_ARGS中的--bf16后增加如下内容 \ --enable-high-availability \ --enable-hbmfault-repair \ --enable-worker-reboot \ --distributed-optimizer-no-replica \修改后的pretrain_llama2_7b_ptd.sh脚本示例如下:
#!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS=1 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True export GLOO_SOCKET_IFNAME=enp189s0f0 export TTP_ADDR="master node ip" source /usr/local/Ascend/cann/set_env.sh NPUS_PER_NODE=8 MASTER_ADDR=localhost MASTER_PORT=6000 NNODES=1 NODE_RANK=0 WORLD_SIZE=$(($NPUS_PER_NODE*$NNODES)) CKPT_SAVE_DIR="your model save ckpt path" DATA_PATH="your data path" TOKENIZER_MODEL="your tokenizer path" CKPT_LOAD_DIR="your model ckpt path" TP=1 PP=2 DISTRIBUTED_ARGS=" --nproc_per_node $NPUS_PER_NODE \ --nnodes $NNODES \ --node_rank $NODE_RANK \ --master_addr $MASTER_ADDR \ --master_port $MASTER_PORT " GPT_ARGS=" --use-mcore-models \ --tensor-model-parallel-size ${TP} \ --pipeline-model-parallel-size ${PP} \ --sequence-parallel \ --num-layers 32 \ --hidden-size 4096 \ --ffn-hidden-size 11008 \ --num-attention-heads 32 \ --tokenizer-type Llama2Tokenizer \ --tokenizer-model ${TOKENIZER_MODEL} \ --seq-length 4096 \ --max-position-embeddings 4096 \ --micro-batch-size 1 \ --global-batch-size 256 \ --make-vocab-size-divisible-by 1 \ --lr 1.25e-6 \ --train-iters 5000 \ --lr-decay-style cosine \ --untie-embeddings-and-output-weights \ --disable-bias-linear \ --attention-dropout 0.0 \ --init-method-std 0.01 \ --hidden-dropout 0.0 \ --position-embedding-type rope \ --normalization RMSNorm \ --use-fused-rmsnorm \ --swiglu \ --use-flash-attn \ --no-masked-softmax-fusion \ --attention-softmax-in-fp32 \ --min-lr 1.25e-7 \ --weight-decay 1e-1 \ --lr-warmup-fraction 0.01 \ --clip-grad 1.0 \ --adam-beta1 0.9 \ --initial-loss-scale 65536 \ --adam-beta2 0.95 \ --no-gradient-accumulation-fusion \ --no-load-optim \ --no-load-rng \ --use-distributed-optimizer \ --use-fused-swiglu \ --use-fused-rotary-pos-emb \ --overlap-grad-reduce \ --bf16 \ --enable-high-availability \ --enable-hbmfault-repair \ --enable-worker-reboot \ --distributed-optimizer-no-replica \ " DATA_ARGS=" --data-path $DATA_PATH \ --split 949,50,1 " OUTPUT_ARGS=" --log-interval 1 \ --save-interval 10000 \ --eval-interval 1000 \ --eval-iters 10 \ " torchrun $DISTRIBUTED_ARGS pretrain_gpt.py \ $GPT_ARGS \ $DATA_ARGS \ $OUTPUT_ARGS \ --distributed-backend nccl \ --load $CKPT_LOAD_DIR \ --save $CKPT_SAVE_DIR \ | tee logs/train_llama2_7b.log高可用功能相关参数说明如下:
-
GLOO_SOCKET_IFNAME:根据主节点高速网卡实际情况进行配置。
-
TTP_ADDR:集群主节点的IP地址,须符合IPv4或IPv6标准格式。参数详情请参见环境变量。
-
set_env.sh文件路径:请根据CANN实际的安装路径进行修改。
-
enable-high-availability:MindIO TFT总开关,默认关闭,配置后默认开启临终遗言功能。
开启MindIO TFT开关后,各类优化器显存会发生变化,变化详情请参见表1。
对于分布式优化器而言,由于增加了优化器副本,导致静态内存有所增加。但是集群规模越大时,DP Size越大,平均到单卡的显存增加量很小,这样可以避免OOM,因此推荐在大集群中使用。根据显存情况选择开启与否,调节参数。
-
enable-hbmfault-repair:MindIO UCE功能开关,默认关闭,配置后对片上内存进行故障检测,并完成在线修复,达到Step级重计算功能。本开关在开启 enable-high-availability 时生效。此特性依赖PyTorch的内存管理机制,仅在PyTorch的环境变量 PYTORCH_NO_NPU_MEMORY_CACHING 未配置,即开启内存复用机制时,才可使用此特性,若 export PYTORCH_NO_NPU_MEMORY_CACHING = 1,则无法使用此特性。
-
enable-worker-reboot:MindIO ARF功能开关,默认关闭,配置后在发生一般性故障时,进行进程级重启修复,继续训练。本开关在开启 enable-high-availability 时生效。
-
distributed-optimizer-no-replica:开启高可用特性后,分布式优化器默认增加优化器副本,会导致片上内存使用增加,开启该开关后,分布式优化器不增加副本内存占用;在MindIO UCE和MindIO ARF场景下,直接使用周期Checkpoint进行在线修复。
表 1 原生优化器与使用MindIO TFT后优化器参数的理论数值变化
优化器 原生 使用MindIO TFT 说明 fp16/bf16 20 20 - fp32 16 16 - fp16/bf16 Distributed 4 + 16/d 4 + 16 * N/d - d:DP Group Size
- N:副本数,N < d
-
-
按“Esc”键,输入 :wq!,按“Enter”保存并退出编辑。
-
对接MindCluster
MindIO TFT以SDK形式提供服务,不存在常驻进程。服务随着训练进程的启动而启动。当训练任务结束时,则服务退出。
与MindCluster对接时,MindCluster管理K8s容器,在K8s容器中安装对接过程与裸机安装部署一致。
操作步骤
-
当Python环境不是安装在共享存储中时,为了便于大集群使用,可以将MindIO TFT SDK集成到镜像中,通过镜像安装Pod时,已经安装好MindIO TFT SDK。
-
MindIO TFT服务Controller模块与Processor模块存在心跳报文,在K8s做网络隔离时,需要将通信端口添加到创建Pod时配置的yaml文件中。
修改创建Pod时配置的yaml文件。此处以“pod.yaml”为例。
-
打开“pod.yaml”文件。
vim pod.yaml -
按“i”进入编辑模式,新增以下内容。
ports: - containerPort: 8000 # 用于MindIO TFT服务Controller与Processor通信端口 name: ttp-port -
按“Esc”键,输入 :wq!,按“Enter”保存并退出编辑。
-
-
适配K8s网络,在步骤2的预训练脚本基础上做如下修改。
# 注释下面两行,该环境变量由MindCluster配置 # MASTER_ADDR=$(hostname -I | awk '{print $1}') # MASTER_PORT=XXXX # 从K8s获取MASTER_ADDR、MASTER_PORT环境变量(K8s的service网络IP地址) CONTROLLER_ADDR=$(hostname -I | awk '{print $1}') PROCESSOR_ADDR=${MASTER_ADDR} export CONTROLLER_ADDR export PROCESSOR_ADDR
对接非MindSpeed-LLM框架
前提条件
使用前请先了解MindIO TFT的约束限制。
说明
- 本次发布包支持类Megatron框架,环境、代码、数据集请用户自行准备,并确保其安全性。
- 本节内容仅具有适配指导意义,具体实现细节需由用户自行实现。
特性参考
相关特性所需的功能适配点如表1所示,各功能适配点对应的代码参考链接如表2所示。
| 特性 | 需要的功能适配点序号 |
|---|---|
| 临终遗言 | 1、2、3、4、5、6、7 |
| UCE快恢 | 1、2、3、4、5、6、8、10、11 |
| 网络快恢 | 1、2、5、6、11 |
| 进程快恢 | 1、2、3、4、5、6、9、10、11 |
| 亚健康热切 | 1、2、3、4、5、9、10、11、12 |
| 在线压测/借轨回切 | 1、2、12 |
| 序号 | 适配功能点 | 参考代码 |
|---|---|---|
| 1 | 初始化启动 | LLM仓参考链接 |
| 2 | 上报优化器更新状态 | LLM仓参考链接 |
| 3 | 创建DP副本组 | LLM仓参考链接 |
| 4 | 优化器副本 | LLM仓参考链接 |
| 5 | 异常捕获装饰器 | LLM仓参考链接 |
| 6 | 算子资源清理 | LLM仓参考链接 |
| 7 | 临终Checkpoint | LLM仓参考链接 |
| 8 | UCE模型优化器重建 | LLM仓参考链接 |
| 9 | 节点重启及通信重建 | LLM仓参考链接 |
| 10 | 参数面在线修复 | LLM仓参考链接 |
| 11 | 状态回滚 | LLM仓参考链接 |
| 12 | 优雅暂停 | LLM仓参考链接 |