特性精度看护(Feature Precision Guarding)系统用例执行和添加说明

本文档介绍MindSpeed+Megatron特性的精度看护用例执行和构造

特性的精度看护用例执行

以llama模型的精度看护为例

0.环境搭建

参考MindSpeed环境安装相关内容

1.准备tokenizer和数据集

下载llama2模型的tokenizer

mkdir ./model_from_hf/llama-2-7b-hf/
cd ./model_from_hf/llama-2-7b-hf/
wget https://huggingface.co/daryl149/llama-2-7b-hf/resolve/main/tokenizer.json
wget https://huggingface.co/daryl149/llama-2-7b-hf/resolve/main/tokenizer.model
wget https://huggingface.co/daryl149/llama-2-7b-hf/resolve/main/tokenizer_config.json
cd ../../

下载llama2的数据集并且进行处理

# 下载数据
cd ./dataset
wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..
# 处理数据   
mkdir ./dataset/llama-2-7b-hf/
python ./tools/preprocess_data.py \
    --input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
    --tokenizer-name-or-path ./model_from_hf/llama-2-7b-hf/ \
    --output-prefix ./dataset/llama-2-7b-hf/alpaca \
    --workers 4 \
    --log-interval 1000 \
    --tokenizer-type PretrainedFromHF

2.准备初始参数

按TP1PP1准备一份参数,并保存在./ckpt_llama目录下(可以随机初始化,然后保存参数)

3.配置指定参数

结合训练脚本pretrain_fpg_llama.sh的配置,在fpg_llama_usecase.yaml里配置指定参数,如下所示:

spec:
  data_path: /home/dataset/llama2/alpaca_text_document
  tokenizer_model: /home/dataset/model/llama-2-7b-hf/tokenizer.model
  mbs: 2 # MBS   micro-batch-size
  gbs: 16 # GBS  global-batch-size
  train_iters: 5000

4.配置基线参数和特性参数

参考fgp_llama_usecase.yaml配置,每个系统用例都包含pre_process和run和run步骤, 每个步骤可以配置多个处理实例,每个处理实例包含script_file和param两个配置; 例如baseline的两个步骤

  • pre_process : 准备基线的初始化参数
  • run : 执行脚本,获得loss基线

各特性的配置和baseline的配置规则一致,执行逻辑参见pretrain_gpt_fpg.py 执行说明

  • 入口文件pretrain_gpt_fpg.py, python MindSpeed/tests_extend/system_tests/feature_precision_guarding/pretrain_gpt_fpg.py执行
  • 日志存放在 ./{%YU_%m_%d}logs,日志文件命名规则:{feature_name}-{stage_name}-{state_index}-{timestamp}.log
  • 执行完run实例后会自动和基线对比loss,并将结果写入report.csv文件中

特性的精度看护用例添加

方式一: 用例配置文件中直接添加

举例说明:验证MC2+分布式优化器的精度 分析

  • MC2需要设置参数--use-ascend-mc2,MC2依赖TP和序列并行 (SP基础脚本已配置)
  • 分布式优化器需要添加额外参数 --use-distributed-optimizer 在fpg_llama_usecase.yaml的features下添加一条即可,如下所示:
  - mc2_distributed-optim: 
      pre_process:
        - { script_file: llama_param_cvt.sh,
            param: {
              py_script_path: MindSpeed/tests_extend/system_tests/feature_precision_guarding/llama_param_cvt.py,
              input_model_dir: ./ckpt_llama,
              output_model_dir: ./ckpt_llama_tp2pp2,
              tp_size: 2,
              pp_size: 2,
              num_layers: 12,
              num_heads: 8,
              hidden_size: 512
            }
        }
      run:
        - { script_file: pretrain_fpg_llama.sh,
            param: { npu_per_node: 8,
                     tp_size: 2,
                     pp_size: 2,
                     load_ckpt_dir: ./ckpt_llama_tp2pp2,
                     extra_args: '"--use-distributed-optimizer"',
                     ascend_mc2: 1
            }
        }

其中num_per_node是每个节点用的卡数,必填 tp_size、pp_size必填,已验证TP1PP1的5kstep的loss和TP2PP2平均绝对/相对误差均<0.5%,可以以TP1PP1为基线,也可以修改baseline中的TP和PP设置;

方式二: 新实例化用例文件

按fpg_llama_usecase.yaml的格式新创建一个用例文件,例如fpg_qwen_usecase.yaml 然后在pretrain_gpt_fpg.py的main方法里添加一行即可,例如:

    xtest_pretrain_fpg("fpg_qwen_usecase.yaml")