更新时间:2024-08-12 GMT+08:00
分享

推理精度测试

本章节介绍如何进行推理精度测试,数据集是ceval_gen、mmlu_gen。

前提条件

确保容器可以访问公网。

Step1 配置精度测试环境

  1. 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。
    benchmark_eval
    ├──opencompass.sh       #运行opencompass脚本
    ├──install.sh             #安装opencompass脚本
    ├──vllm_api.py          #启动vllm api服务器
    ├──vllm.py             #构造vllm评测配置脚本名字 
  2. 确保容器内通网,未通网需要配置$config_proxy_str,$config_pip_str设置对应的代理和pip源,来确保当前代理和pip源可用。
  3. 精度评测新建一个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
  4. 在benchmark_eval目录下安装依赖。
    cd opencompass #在benchmark_eval目录下
    pip install -e . #下载对应依赖
    cd ../human-eval #在benchmark_eval目录下 (可选,如果选择使用humaneval数据集)
    pip install -e .  # 可选,如果选择使用humaneval数据集
  5. (可选)如果需要在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行
  6. 执行精度测试启动脚本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
  7. 这一步可以在客户端显示运行过程,通过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对齐。

相关文档