下载
中文
注册

对接MindSpeed-LLM框架

前提条件

  • 使用前请先了解MindIO TFT约束限制
  • MindSpeed-LLM框架准备参见MindSpeed-LLM,匹配的Megatron-LM的版本为core_r0.6.0。

本次发布包配套以上链接的1.0.0分支,环境、代码、数据集准备请用户参考MindSpeed-LLM仓库的相关指导说明,并确保其安全性。

MindIO TFT对接MindSpeed-LLM框架,目前支持MindIO TTPMindIO UCEMindIO ARF功能。

操作步骤

  1. 编辑“torchrun”文件。
    1. 查找环境中的“torchrun”文件。
      which torchrun
    2. 打开以上命令显示路径下的“torchrun”文件。
      vim {torchrun文件路径}/torchrun
    3. 按“i”进入编辑模式,修改以下内容。
      # 增加加粗内容
      import re
      import sys
      import mindio_ttp.framework_ttp
      from torch.distributed.run import main as torch_main
    4. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  2. (可选)如果开启TLS认证,需要返回到MindSpeed-LLM目录下,修改“mindspeed_llm/training/initialize.py”文件。
    1. 打开“mindspeed_llm/training/initialize.py”文件。
      vim mindspeed_llm/training/initialize.py
    2. 按“i”进入编辑模式,修改以下内容。
      # 跳转到_initialize_distributed_wrapper函数定义,对加粗处修改:
      
      def _initialize_distributed_wrapper(fn):
          @wraps(fn)
          def wrapper(*args, **kwargs):
              device_count = torch.cuda.device_count()
              device = get_args().rank % device_count
              torch.cuda.set_device(device)
              from mindio_ttp.adaptor import tft_init_controller_processor
              tft_init_controller_processor(enable_tls=True, tls_option_top_path='{证书配置根目录}')
              fn(*args, **kwargs)
      
          return wrapper

      证书配置根目录请参见导入TLS证书

    3. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  3. (可选)如需使用MindIO UCEMindIO ARF功能,则需修改“mindspeed_llm/training/training.py”文件。
    1. 打开“mindspeed_llm/training/training.py”文件。
      vim mindspeed_llm/training/training.py
    2. 按“i”进入编辑模式,在代码中增加如下加粗内容。
      ...
      
      class CustomFunction(torch.autograd.Function):
          @staticmethod
          def forward(ctx, input):
              torch.cuda.set_stream(torch.cuda.default_stream())
              return input
      
          @staticmethod
          def backward(ctx, grad):
              torch.cuda.set_stream(torch.cuda.default_stream())
              return grad
      
      def streamHandler():
          input_tensor = torch.empty(1, dtype=torch.float32, device="npu", requires_grad=True)
          grad_tensor = torch.empty(1, dtype=torch.float32, device="npu", requires_grad=True)
          output_tensor = CustomFunction.apply(input_tensor)
          output_tensor.backward(grad_tensor)
      
      def pretrain(train_valid_test_dataset_provider,
      ...
          if args.do_train and args.train_iters > 0:
              if args.enable_high_availability:
                  from mindio_ttp.adaptor import tft_register_processor, tft_train
                  from mindio_ttp.framework_ttp import tft_register_set_stream_handler
                  tft_register_set_stream_handler(streamHandler)
                  tft_register_processor(train_valid_test_dataset_provider, model_provider, model_type)
                  iteration, num_floating_point_operations_so_far = tft_train(train_args, test_data_iterator_list)
              else:
                  iteration, num_floating_point_operations_so_far = train(*train_args)
      ...
    3. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  4. 编辑预训练脚本(仅供参考)。

    此处以编辑“examples/legacy/llama2/pretrain_llama2_7b_ptd.sh”脚本为例。

    1. 打开“examples/legacy/llama2/pretrain_llama2_7b_ptd.sh”脚本。
      vim examples/legacy/llama2/pretrain_llama2_7b_ptd.sh
    2. 按“i”进入编辑模式,开启高可用功能需要增加脚本中加粗部分。
      #!/bin/bash
      
      export CUDA_DEVICE_MAX_CONNECTIONS=1
      export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
      
      export GLOO_SOCKET_IFNAME=enp189s0f0
      export TTP_OT=720
      export TTP_ADDR="master node ip"
      source /usr/local/Ascend/ascend-toolkit/set_env.sh
      
      GPUS_PER_NODE=8
      MASTER_ADDR=localhost
      MASTER_PORT=6000
      NNODES=1
      NODE_RANK=0
      WORLD_SIZE=$(($GPUS_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 $GPUS_PER_NODE \
          --nnodes $NNODES \
          --node_rank $NODE_RANK \
          --master_addr $MASTER_ADDR \
          --master_port $MASTER_PORT
      "
      
      GPT_ARGS="
          --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 \
      "
      
      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 \
          --jit-compile \
          --load $CKPT_LOAD_DIR \
          --save $CKPT_SAVE_DIR \
          | tee logs/train_llama2_7b.log

      高可用功能相关参数说明如下:

      • GLOO_SOCKET_IFNAME:根据主节点高速网卡实际情况进行配置。
      • TTP_OT:Torch框架等待CheckPoint保存时间,到时未保存完毕会强制退出进程。
      • TTP_ADDR:集群主节点的IPv4地址。
      • set_env.sh文件路径:请根据CANN实际的安装路径进行修改。
      • enable-high-availabilityMindIO TFT总开关,默认关闭,配置后默认开启临终遗言功能。

        开启MindIO TFT开关后,各类优化器显存会发生变化,变化详情请参见表1

        对于分布式优化器而言,由于增加了优化器副本,导致静态内存有所增加。但是集群规模越大时,DP Size越大,平均到单卡的显存增加量很小,这样可以避免OOM,因此推荐在大集群中使用。根据显存情况选择开启与否,调节参数。

      • enable-hbmfault-repairMindIO UCE功能开关,默认关闭,配置后对片上内存进行故障检测,并完成在线修复,达到Step级重计算功能。本开关在开启enable-high-availability时生效。此特性依赖PyTorch的内存管理机制,仅在PyTorch的环境变量PYTORCH_NO_NPU_MEMORY_CACHING未配置,即开启内存复用机制时,才可使用此特性,若export PYTORCH_NO_NPU_MEMORY_CACHING=1,则无法使用此特性。
      • enable-worker-rebootMindIO ARF功能开关,默认关闭,配置后在发生一般性故障时,进行进程级重启修复,继续训练。本开关在开启enable-high-availability时生效。
      表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
    3. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。