core_model 系统用例代码覆盖运行说明

本文档介绍pretrain_gpt.py相关代码的覆盖用例执行和构造

环境搭建

需要安装MindSpeed+Megatron, 见MindSpeed首页安装

注意

  • 将MindSpeed放在Megatron-LM目录下(方便代码覆盖统计)
  • 安装CANN-NNAL(计算通信并行COC用例需要)

代码覆盖统计执行

1. 准备数据集并配置

下载tokenizer,下载链接 ,下载vocab.json和merges.txt即可
下载dataset, 下载链接

Megatron语料格式处理:

import json
import pandas as pd

data_df = pd.read_parquet("train-00000-of-00001-a09b74b3ef9c3b56.parquet")
data_df['text'] = data_df['text'].apply(lambda v: json.dumps({"text": v}))
with open("alpaca_json.json", encoding='utf-8', mode='w') as f:
    for i, row in data_df.iterrows():
        f.write(row['text'])
        f.write('\n')

Megatron预训练数据集生成

python tools/preprocess_data.py --input alpaca_json.json \
                                --output-prefix /gpt_pretrain_data/alpaca \
                                --tokenizer-type GPT2BPETokenizer \
                                --vocab-file /gpt-tokenizer/vocab.json \
                                --merge-file /gpt-tokenizer/merges.txt \
                                --append-eod \
                                --log-interval 1000 \
                                --workers 8

执行成功在/gpt_pretrain_data目录可见两个文件: alpaca_text_document.bin和alpaca_text_document.idx

2.配置测试数据集和tokenizer

进入MindSpeed/tests_extend/system_tests/core_model目录 在gpt_usecase.yaml配置文件中的spec(指定参数模块)配置data_path、vocab_file、merge_file, 例如:

spec:
  data_path: /home/dataset/gpt-3.5/alpaca_text_document
  vocab_file: /home/dataset/model/gpt-3.5/vocab.json
  merge_file: /home/dataset/model/gpt-3.5/merges.txt

3. 安装代码覆盖统计工具及使用

安装代码覆盖统计工具:

pip install coverage 

在Megatron-LM/pretrain_gpt.py文件添加统计代码 注意

  • 经测试当前只支持在代码文件中添加代码的方式,不支持命令行方式(怀疑受分布式影响)
  • 一定要设置data_suffix,否则统计文件会覆盖,推荐按下文写法 在pretrain_gpt.py的文件头添加,如下所示
import random
import time

import coverage

cov = coverage.Coverage(data_suffix=f"usecase-{time.time_ns()}_{random.randint(0, 100)}")
cov.start()

在pretrain(...)方法后添加cov.stop()和cov.save(),如下所示

    pretrain(train_valid_test_datasets_provider,
             model_provider,
             ModelType.encoder_or_decoder,
             forward_step,
             args_defaults={'tokenizer_type': 'GPT2BPETokenizer'})
    cov.stop()
    cov.save()

4. 执行用例,生成代码覆盖统计文件

进入Megatron-LM目录,配置.coveragerc文件,例如

[run]
branch = True
source = ./
omit = setup.py
       pretrain_bert.py
       pretrain_ict.py
       tools/*
       tests/*
       <其他忽略、不参与统计的文件>
[report]
show_missing = True

批量执行用例

python MindSpeed/tests_extend/system_tests/core_model/pretrain_gpt_usecase.py

执行完成后在目录下会生成各用例的覆盖文件 .coverage.usecase-*

5. 生成代码覆盖统计报告

先合并所有用例的覆盖统计文件,执行以下命令:

coverage combine .coverage.usecase-*

所有的统计文件会合并成一个文件: .coverage,基于该文件生成报告:

coverage html --data-file=.coverage -d <输出目录>

浏览器打开报告中的index.html文件,可看到总代码覆盖率及各文件的代码覆盖率,点看具体文件可看到覆盖的代码行(绿底标示),及未覆盖的代码行(红底标示)

用例补充

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

举例说明:添加 FA的用例 分析

  • FA只需要添加参数:--use-flash-attn 添加样例只需要在gpt_usecase.yaml文件的products下添加一条: - { use_mcore: [ True, False ], tp_size: [ 2 ], pp_size: [ 2 ], extra_args: [ '"--use-flash-attn"'] } 注意
  • 训练的其他参数见pretrain_gpt_usecase.sh,所有用例执行的入口文件是pretrain_gpt_usecase.py,详细信息看这两个文件
  • tp_size、pp_size是必填项,其他可选,所有的value是 list格式
  • use-legacy=True走的megatron/legacy代码分支,use-legacy=False走的megatron/core分支
  • 参数key大小写不敏感,脚本都会转成大写,设置的环境变量都定义为key,额外参数放在extra_args里
  • 实际添加的系统用例个数=各key取值个数的乘积

方式二:新实例化用例模板

看完方式一,如果其中固化的参数不满足要求,比如用train-samples替代train-iters,可以新创建pretrain_gpt_usecase_template2.sh和gpt_usecase_template2.yaml 建议

  • 新实例化用例模板遵从方式一的模式
  • 在pretrain_gpt_usecase.py里添加一个用例即可,不要新添入口