推理精度测试
本章节介绍如何进行推理精度测试,数据集是ceval_gen、mmlu_gen。
前提条件
确保容器可以访问公网。
Step1 配置精度测试环境
- 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。
benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字
- 确保容器内通网,未通网需要配置$config_proxy_str,$config_pip_str设置对应的代理和pip源,来确保当前代理和pip源可用。
- 精度评测新建一个conda环境,确保之前启动服务为vllm接口,进入到benchmark_eval目录下,执行如下命令。命令中的$work_dir 是benchmark_eval的绝对路径。
conda activate python-3.9.10 #如果没有该conda环境需要手动建立一个 export work_dir=${work_dir} #指定work_dir路径 bash install.sh
- 在benchmark_eval目录下安装依赖。
cd opencompass #在benchmark_eval目录下 pip install -e . #下载对应依赖 cd ../human-eval #在benchmark_eval目录下 (可选,如果选择使用humaneval数据集) pip install -e . # 可选,如果选择使用humaneval数据集
- (可选)如果需要在humaneval数据集上评估模型代码能力,请执行此步骤,否则忽略这一步。原因是通过opencompass使用humaneval数据集时,需要执行模型生成的代码。请仔细阅读human_eval/execution.py文件第48-57行的注释,内容参考如下。了解执行模型生成代码可能存在的风险,如果接受这些风险,请取消第58行的注释,执行下面步骤6进行评测。
# WARNING # This program exists to execute untrusted model-generated code. Although # it is highly unlikely that model-generated code will do something overtly # malicious in response to this test suite, model-generated code may act # destructively due to a lack of model capability or alignment. # Users are strongly encouraged to sandbox this evaluation suite so that it # does not perform destructive actions on their host or network. For more # information on how OpenAI sandboxes its code, see the accompanying paper. # Once you have read this disclaimer and taken appropriate precautions, # uncomment the following line and proceed at your own risk: # exec(check_program, exec_globals) #第58行
- 执行精度测试启动脚本opencompass.sh,具体操作命令如下,可以根据参数说明修改参数。请确保${work_dir} 已经通过export设置。
vllm_path=${vllm_path} \ service_port=${service_port} \ max_out_len=${max_out_len} \ batch_size=${batch_size} \ eval_datasets=${eval_datasets} \ model_name=${model_name} \ benchmark_type=${benchmark_type} \ bash -x opencompass.sh
参数说明:
- vllm_path:构造vllm评测配置脚本名字,默认为vllm。
- service_port:服务端口,与启动服务时的端口保持,比如8080。
- max_out_len:在运行类似mmlu、ceval等判别式回答时,max_out_len建议设置小一些,比如16。在运行human_eval等生成式回答(生成式回答是对整体进行评测,少一个字符就可能会导致判断错误)时,max_out_len设置建议长一些,比如512,至少包含第一个回答的全部字段。
- batch_size:输入的batch_size大小,不影响精度,只影响得到结果速度。
- eval_datasets:评测数据集和评测方法,比如ceval_gen、mmlu_gen 。
- model_name:评测模型名称,不需要与启动服务时的模型参数保持一致。
- benchmark_type:评测数据集类型,分为eval、static、awq,也就是精度、静态和量化数据集,默认eval。
参考命令:vllm_path=vllm service_port=8080 max_out_len=16 batch_size=2 eval_datasets=mmlu_gen model_name=llama_7b benchmark_type=eval bash -x opencompass.sh
- 这一步可以在客户端显示运行过程,通过run.py运行。如果同时运行多个数据集,需要将不同数据集通过空格分开,加入到eval_datasets中,比如eval_datasets=ceval_gen mmlu_gen。运行命令如下所示。
cd opencompass python run.py --models vllm --datasets mmlu_gen ceval_gen -w ${output_path}
output_path: 要保存的结果路径。
Step2 查看精度测试结果
默认情况下,评测结果会按照result/{model_name}/的目录结果保存到对应的测试工程。执行多少次,则会在{model_name}下生成多少次结果。benchmark_eval下生成的log中记录了客户端产生结果。数据集的打分结果在result/{model_name}/...目录下,查找到summmary目录,有txt和csv两种保存格式。总体打分结果参考txt和csv文件的最后一行,举例如下:
npu:
mmlu:46.6
gpu:
mmlu:47
NPU打分结果(mmlu取值46.6)和GPU打分结果(mmlu取值47)进行对比,误差在1以内(计算公式:(47-46.6) < 1,)认为NPU精度和GPU对齐。