LLaMA-Factory-310P3/mindie/examples/models/gpt_neox
wql faa909dcc3 add: add mindie file 2024-09-10 15:38:33 +08:00
..
README.md add: add mindie file 2024-09-10 15:38:33 +08:00
config.ini add: add mindie file 2024-09-10 15:38:33 +08:00
configuration_gpt_neox.py add: add mindie file 2024-09-10 15:38:33 +08:00
cut_model_and_run.sh add: add mindie file 2024-09-10 15:38:33 +08:00
cut_model_util.py add: add mindie file 2024-09-10 15:38:33 +08:00
main.py add: add mindie file 2024-09-10 15:38:33 +08:00
modeling_gpt_neox_ascend.py add: add mindie file 2024-09-10 15:38:33 +08:00
modeling_gpt_neox_cut.py add: add mindie file 2024-09-10 15:38:33 +08:00
run_pa.sh add: add mindie file 2024-09-10 15:38:33 +08:00

README.md

README

  • GPT-NeoX-20B 是一个 200 亿参数的自回归语言模型,使用 GPT-NeoX 库在 Pile 上训练。它的架构有意类似于 GPT-3并且与 GPT-J-6B 的架构几乎相同。其训练数据集包含大量英语文本,反映了该模型的通用性质。
  • 此代码仓中实现了一套基于NPU硬件的GPT-NEOX-20B推理模型。配合加速库使用旨在NPU上获得极致的推理性能。

特性矩阵

  • 此矩阵罗列了GTP-NEOX-20B模型支持的特性
模型及参数量 800I A2 Tensor Parallelism 300I DUO Tensor Parallelism FP16 BF16 Flash Attention Paged Attention W8A8量化 W8A16量化 W4A16量化 KV cache量化 稀疏量化 MOE量化 MindIE Service TGI 长序列
GTP-NEOX-20B 支持world size 2,4,8 支持world size 2, 4 × × × × × × × × × ×

Paged Attention 推理使用说明

路径变量解释

变量名 含义
working_dir 加速库及模型库下载后放置的目录
llm_path 模型仓所在路径。若使用编译好的包,则路径为${working_dir}/ModelLink/若使用gitee下载的代码则路径为${working_dir}/ModelLink/mindie_ref/mindie_llm/atb_models
script_path 脚本所在路径。GTP-NEOX系列模型的工作脚本所在路径为${llm_path}/examples/models/gpt_neox
weight_path 模型权重路径

权重下载

权重转换

  • 通常情况 Paged Attention 场景下需要.safetensors 格式的权重,如果没有,参考此README文件转换
  • 但这里我们的GPTNeoX本身就是safetensors 格式权重PA场景下无需转换。
  • 注: huggingface上有safetensors类型权重可直接下载

量化权重生成

  • 暂不支持

操作说明

推理

对话测试
  • 运行Paged Attention FP16
  • ${llm_path}目录下执行以下脚本
bash examples/models/gpt_neox/run_pa.sh ${weight_path}

根据硬件设备不同请参考下表修改run_pa.sh再运行

run_pa.sh 参数说明

参数名称 含义 800I A2推荐值 300I DUO推荐值
BIND_CPU 绑定CPU核心开关,默认进行绑核 1 1
IS_QUANT 是否启动量化 0 0
ASCEND_RT_VISIBLE_DEVICES 使用的硬件卡号,多个卡间使用逗号相连 根据实际情况设置 根据实际情况设置
MAX_MEMORY_GB 每张卡上的预计使用的最大显存,若出现显存不足导致的异常,请将该参数改小 30 40
MASTER_PORT 卡间通信端口,通常不用修改,有冲突时再改

运行Paged Attention BF16

  • 暂不支持

运行Paged Attention W8A16

  • 暂不支持

运行Paged Attention W8A8

  • 暂不支持

运行Paged Attention BF16

  • 暂不支持

运行KV cache量化

  • 暂不支持

运行稀疏量化

  • 暂不支持

运行MOE量化

  • 暂不支持

精度测试

  • 参考此README文件
  • 示例
  • 310服务器上用2卡4芯跑910服务器上用8卡
cd ${llm_path}/tests/modeltest
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
bash run.sh pa_fp16 full_BoolQ 1 gptneox True ${gptneox-20b权重路径} 8

GPTNeoX为纯英文模型所以一般只测试BoolQ英文测试集对于Ceval中文集我们不做测试

性能测试

Flash Attention推理使用说明

张量并行模型切分(仅在模型需要多卡并行时使用)

cp ${script_path}/modeling_gpt_neox_cut.py ${model_path}
cp ${script_path}/modeling_gpt_neox_ascend.py ${model_path}

修改 ${model_path}里的config.json中的kv对改成"AutoModelForCausalLM": "modeling_gpt_neox_cut.GPTNeoXForCausalLM"

修改`${script_path}/cut_model_and_run_gpt_neox.sh`    
将 `input_dir` 修改为模型所在路径 `${model_path}` 
将 `output_dir` 修改为原目录下子目录 `${model_path/part_model}`。模型切分成功后会自动生成新目录part_model(用户无需新建该文件夹)
将 `world_size_` 修改为期望切分的份数。world_size_=2表示模型切分为2份。

目录结构示例建议

--model_path
  *.py(模型源文件)
  *.json(模型源文件)
  *.tiktoken(模型源文件)
  *.bin(模型源文件,软链接,部分模型权重为其它格式,如*.safetensors等)
  modeling_gpt_neox_ascend.py(加速库modeling)
  modeling_gpt_neox_cut.py(权重切分脚本)
  configuration_gpt_neox.py(模型配置文件)
  --part_model(以双卡为例,权重切分成功后文件夹)
    --0
    --1
  ......(其他)
--script_path
  cut_model_and_run_gpt_neox.sh
  cut_model_util.py
  main.py
  config.ini
  ......(其他)

执行

cd ${script_path}
bash cut_model_and_run.sh

切分所需时间较长,切分完成后,将会打印 'Tensor parallelism weights have been successfully saved.'。

修改 ${model_path}/part_model/{rank_id}里的config.json中的kv对改成

AutoModelForCausalLM": "modeling_gpt_neox_ascend.GPTNeoXForCausalLM

CPU高性能模式

可开启CPU Performance模式以提高模型推理性能。


cpupower frequency-set -g performance

执行推理

修改 ${script_path}/config.ini

config文件配置参考
提示多卡并行推理时config.ini中model_path路径为part_model父文件夹。例如

# 正确示例:

model_path=../model

# 错误示例:

model_path=../model/part_model

main.py

提供了demo推理precision测试性能测试三种下游任务。
task_name可选inference、precision、performance。

  • 单卡 修改 ${model_path}里的config.json中的kv对改成"AutoModelForCausalLM": "modeling_gpt_neox_ascend.GPTNeoXForCausalLM"
python main.py --task ${task_name}

注意,由于本模型体量较大,受硬件限制,单卡很可能无法跑起。

  • 多卡
bash cut_model_and_run.sh ${task_name}

注意 1.docker环境与conda环境有所不同docker环境中启动模型时需要修改环境变量"ATB_OPERATION_EXECUTE_ASYNC=0"、"TASK_QUEUE_ENABLE=0",否则可能出现算子下发同步失败。 2.300l DUO暂时不支持lccl因此在300l DUO上启动模型时需删去环境变量"BACKEND='lccl'"

可以使用 MAX_SEQ_LEN 环境变量来设置model支持的最大长度以优化显存占用, 默认使用config里面的max_model_length

MAX_SEQ_LEN=2048 python main.py --task ${task_name}

或 修改cut_model_and_run.sh 中的 max_seq_length

MAX_SEQ_LEN=2048 bash cut_model_and_run.sh ${task_name}

如果遇到

Traceback (most recent call last):
  File "/root/miniconda3/envs/wqh39/lib/python3.9/site-packages/torch_npu/__init__.py", line 31, in <module>
    import torch_npu.npu
  File "/root/miniconda3/envs/wqh39/lib/python3.9/site-packages/torch_npu/npu/__init__.py", line 46, in <module>
    from .utils import (is_initialized, _lazy_call, _lazy_init, init, set_dump,
  File "/root/miniconda3/envs/wqh39/lib/python3.9/site-packages/torch_npu/npu/utils.py", line 27, in <module>
    import torch_npu._C
ImportError: /root/miniconda3/envs/wqh39/bin/../lib/libgomp.so.1: cannot allocate memory in static TLS block
Segmentation fault (core dumped)

则在命令行前加上LD_PRELOAD=上面的error路径。如

LD_PRELOAD=/root/miniconda3/envs/wqh39/bin/../lib/libgomp.so.1 MAX_SEQ_LEN=2048 python main.py --task ${task_name}  --is_quant ${is_quant}

附录:

精度测试指南

由于gpt-neox是英文模型选用mmlu数据集进行精度测试

配置说明

参考 SDK精度测试指南章节

运行脚本

  • 单芯
cd ${script_path}
python main.py --task precision
  • 多芯
cd ${script_path}
bash cut_model_and_run.sh precision

结束后在${mmlu_work_dir}/test_result目录下查看测试结果。[双芯结果每个两份,只需看其中一份即可]。

文件 用途
device0.log 运行过程日志
cache0.csv 结果详情C列为预期答案D列为测试答案
result_0_classes_acc.json 测试数据下按不同维度统计准确率
result_0_subject_acc.json 测试数据下按不同学科统计准确率

注意:后续重新运行, 需要删除当前目录下生成的test_result文件夹否则只会读取当前的目录下的测试结果

性能测试

在功能运行正常的基础下,执行以下步骤进行性能测试

按照推理指导,下载模型及配置路径并安装atb_speed_sdk

1. 准备

参考 SDK性能测试指南精确打点法章节 进行准备

2. 修改配置文件

  • 配置config.ini中[performance]属性, 如下:
    model_name=gpt_neox_20b
    perf_mode=detail
    

3. 执行测试脚本

  • 单芯
cd ${script_path}
TIMEIT=1 python main.py --task performance
  • 多芯
    多卡推理芯片类型区分为300l DUO、800l A2系列。当在800l A2芯片进行多卡推理时"cut_model_and_run.sh"脚本需修改环境变量"ATB_USE_TILING_COPY_STREAM=0"。 该环境变量功能是为了解决300l DUO上asynccopy性能慢的问题与800l A2无关。
cd ${script_path}
TIMEIT=1 bash cut_model_and_run.sh performance

为了不影响正常使用,将TIMEIT设置成1来返回具体的性能测试的值默认是0

性能测试结果

得到性能测试结果csv performance_test_npu_${model_name}_xxx.csv

结果分析

列名 含义
batch_size batch大小
input_seq_len(Encoding) 输入长度
output_seq_len(Decoding) 输出长度
ResponseTime(s) 总响应时间
forward_first_token_time(ms) 首token推理时长
forward_next_token_time(ms) 增量推理时长
pre_next_token_time(ms) 前处理时长
post_next_token_time_post(ms) 后处理时长