
# 推理服务精度评测
本章节介绍了3种精度测评方式，分别为OpenCompass、Simple-evals工具和MME工具。
- OpenCompass工具支持20+HuggingFace和API模型，70+数据集的模型评估方案，约40万个问题，支持对各类大语言模型进行一站式评测。
- Simple-evals是一个用于评估语言模型的轻量级库，可用来评估的数据集为MMLU、GPQA、DROP、MGSM 和 HumanEval。该工具为在线评测，默认使用openai接口进行评测。
- MME工具适用于多模态模型的精度测试。
#### 使用OpenCompass精度测评工具进行大语言模型精度评测
使用OpenCompass进行在线服务精度评估。
1. 使用Conda准备OpenCompass 运行环境，建议使用root用户执行（推荐）
   ```
   conda create --name opencompass python=3.10 -y
   conda activate opencompass
   ```
   
2. 安装OpenCompass
   ```
   git clone https://github.com/open-compass/opencompass
   cd opencompass
   pip install -e .
   ```
   
3. 已支持数据集下载
   ```
   # 下载数据集到 data/ 处
   wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip
   unzip OpenCompassData-core-20240207.zip
   ```
   也通过以下命令查询支持的模型与数据集
   ```
   python tools/list_configs.py [PATTERN1] [PATTERN2] [...]
   ```
   若运行时不加任何参数，则默认列出所有在 configs/models 和 configs/dataset 下的模型配置。
   用户同样可以传入任意数量的参数，脚本会列出所有跟传入字符串相关的配置，支持模糊搜索及 \* 号匹配。如下面的命令会列出所有跟 mmlu 和 llama 相关的配置：
   ```
   python tools/list_configs.py mmlu llama
   ```
   
4. 构建配置文件 OpenCompass允许用户在配置文件中编写实验的完整配置，并通过 run.py 直接运行它。配置文件是以 Python 格式组织的，并且必须包括 datasets 和models 字段。
   在 opencompass/examples/ 下新建example.py文件 。此配置通过继承机制引入所需的数据集和模型配置，并以所需格式组合 datasets 和 models 字段。
   ```
   from mmengine.config import read_base 
   from opencompass.models import OpenAI
   with read_base():
       from opencompass.configs.datasets.gsm8k.gsm8k_gen import gsm8k_datasets
    
   datasets = gsm8k_datasets
    
   models  = [dict(
       abbr='Qwen3-32B-W8A8',
       type=OpenAI,
       path='Qwen3-32B-W8A8',  
       tokenizer_path='/Qwen/Qwen3-32B-W8A8',
       key='EMPTY', 
       openai_api_base='http://127.0.0.1:8091/v1/chat/completions', 
       temperature=0.6,
       query_per_second=1,
       max_out_len=31744,
       max_seq_len=31744,
       batch_size=8
   )]
   ```
   ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
   部分生成式数据集存在默认max_out_len=512默认配置，可能截取的结果还未生成答案，导致得分过低。可在example.py配置文件中更新datasets参数配置。
   例：
   gsm8k_datasets\[0\]\["infer_cfg"\]\["inferencer"\].pop("max_out_len")
   参数说明:
   - abbr：模型简称
   
   - type：模型类型
   
   - path：注册的模型名称
   
   - tokenizer_path：tokenizer目录，不配置默认使用path参数
   
   - key：模型访问密钥
   
   - openai_api_base：模型服务地址
   
   - temperature：生成温度
   
   - query_per_second：服务请求速率
   
   - max_out_len：最大输出长度
   
   - max_seq_len：最大输入长度
   
   - batch_size：批处理大小
    
5. 运行精度测试任务 在opencompass目录下执行精度测试任务
   ```
   python run.py examples/example.py -w ./outputs/demo
   ```
   run.py 中更多的参数说明
   以下是与评估相关的一些参数，可以帮助您根据环境配置更有效的推理任务
   - -w outputs/demo：保存评估日志和结果的工作目录。在这种情况下，实验结果将保存到 outputs/demo/{TIMESTAMP}。
   
   - -r {TIMESTAMP/latest}：重用现有的推理结果，并跳过已完成的任务。如果后面跟随时间戳，将重用工作空间路径下该时间戳的结果；若给定 latest 或干脆不指定，将重用指定工作空间路径下的最新结果。
   
   - --mode all：指定任务的特定阶段。
     - all：（默认）执行完整评估，包括推理和评估。
     
     - infer：在每个数据集上执行推理。
     
     - eval：根据推理结果进行评估。
     
     - viz：仅显示评估结果。
      
   
   - --max-num-workers：并行任务的最大数量。
   
   - --debug：运行debug模式，任务将按顺序执行，并实时打印输出，帮助检查问题，适用于第一次运行任务。
    
6. 评估结果 脚本运行完成后，测试结果输出在终端，如下所示：
   ```
   dataset    version    metric    mode      Qwen
   ---------  ---------  --------  ------  ------
   gsm8k      0b4b22     accuracy  gen     95.07
   ```
   同时所有运行输出将定向到outputs/demo/ 目录，结构如下：
   ```
   outputs/default/
   ├── 20250220_120000
   ├── 20250220_183030     # 每个实验一个文件夹
   │   ├── configs         # 用于记录的已转储的配置文件。如果在同一个实验文件夹中重新运行了不同的实验，可能会保留多个配置
   │   ├── logs            # 推理和评估阶段的日志文件
   │   │   ├── eval
   │   │   └── infer
   │   ├── predictions   # 每个任务的推理结果
   │   ├── results       # 每个任务的评估结果
   │   └── summary       # 单个实验的汇总评估结果
   ├── ...
   ```
   
 
#### 使用Simple-evals精度测评工具进行大语言模型精度评测
Simple-evals是在线服务精度评估工具，只要支持openai的框架，都可以无障碍使用。
1. 安装Simple-evals评测工具。利用包里的python conda环境，创建一个新的python 环境。以accuracy为例。
   ```
   conda create -n accuracy --clone python-3.11.10
   conda activate accuracy
   ```
   进入AscendCloud-LLM的llm_tools/simple_evals目录下执行build.sh脚本
   ```
   bash build.sh
   ```
   
2. 执行在线精度评测任务
   ```
   # debug模式
   python simple_evals.py --model $model --dataset gpqa \
   --served-model-name $served_model_name \
   --url http://localhost:$port/v1 \
   --max-tokens 128 \
   --temperature 0.6 \
   --num-threads 32 \
   --debug
   # start
   python simple_evals.py --model $model --dataset gpqa \
   --served-model-name $served_model_name \
   --url http://localhost:$port/v1 \
   --max-tokens 16384 \
   --temperature 0.6 \
   --num-threads 32
   ```
   参数说明:
   - model：评测的模型名称，会影响到生成的文件名。例如Qwen3-32B，会在当前目录的results/ 下生成 gpqa_Qwen3-32B_20250719_130703.json和gpqa_Qwen3-32B_20250719_130703.html.json文件会记录分数，html文件可以查看具体的结果。
   
   - dataset：评测的数据集，支持mmlu、gpqa、mgsm、drop、humaneval五个数据集。
   
   - served_model_name：待评测服务的model_name。
   
   - url：支持本地、线上服务进行评测。如果是本地服务，url一般是 localhost:8080，port是此处的 8080。如果是线上服务，则服务提供商会以openai规格提供url 和served_model_name。注意url是以v1结束。
   
   - max-tokens：生成的最大tokens数。在现在支持了思维链或者其他特性的情况下，输出越来越长，输出的结果可能在后面。因此推荐设置为16384。
   
   - temperature：影响生成的结果，建议保持不变。
   
   - num-threads：发送给服务请求的并发数，在服务支持的范围内并发越大，耗时越短。推荐值32。
   
   - debug：因评测消耗较大，提供debug模式来验证安装是否成功，会发送少量请求走完所有的过程。建议第一次运行前使用debug模式快速跑完一遍。
    
3. 结果说明 脚本运行结束后，测试结果生成在终端，如下所示：
   ```
   | model_name   |   ('metric', 'gpqa') |
   |:---|---------------------:|
   | Qwen3-32B    |                 0.64 |
   ```
   同时所有运行输出将定向到当前目录下的results/ 下，共产生两个文件，结构如下：
   ```
   results/
   ├── gpqa_Qwen3-32B_20250719_130703.json     # score分数保存在该文件内
   ├── gpqa_Qwen3-32B_20250719_130703.html     # 具体测试问答结果详情保存在该文件内
   ```
   
 
#### 使用MME精度测评工具进行多模态模型精度评测
1. MME数据集获取。 请用户自行获取[MME评估集](https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models/tree/Evaluation)，在AscendCloud-LLM的llm_tools/llm_evaluation/mme_eval/下创建data/eval文件夹
   ```
   mkdir data/eval -p
   ```
   将MME评估集上传至llm_tools/llm_evaluation/mme_eval/data/eval/目录中。
   
2. 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation/mme_eval目录中，代码目录结构如下。
   ```
   mme_eval
   ├──metric.py        #MME精度测试脚本
   ├──MME.sh           #运行MME脚本
   ```
   
3. 启动MME精度测试脚本。
   在AscendCloud-LLM的llm_tools/llm_evaluation/mme_eval/下执行下述命令
   ```
   export MODEL_PATH=/data/nfs/model/InternVL2-8B/ 
   export MME_PATH=./data/eval/MME
   export MODEL_TYPE=internvl2
   export OUTPUT_NAME=internvl2-8B 
   export ASCEND_RT_VISIBLE_DEVICES="0:1:2:3:4:5:6:7"
   bash MME.sh
   ```
   参数说明:
   1. MODEL_PATH：模型权重路径，默认为空。
   
   2. MME_PATH：MME数据集路径，默认当前路径。
   
   3. MODEL_TYPE：模型类型。当前可选模型类型包括：qwen-vl、internvl2、qwen2-vl、llava-onevision。具体需要使用什么类型可查看模型权重下的config.json文件中的model_type字段
   
   4. OUTPUT_NAME：输出结果文件名称， 默认llava。
   
   5. ASCEND_RT_VISIBLE_DEVICES：表示支持多个模型服务实例，同时支持模型并行，如 0,1:2,3 默认0卡。
   
   6. QUANTIZATION：为量化选项，不传入默认为None即不启用量化；支持w4a16，需配套对应的权重使用。
   
   7. GPU_MEMORY_UTILIZATION：NPU使用的显存比例，复用原vLLM的入参名称，默认为0.9。
   
   
   脚本运行完成后，测试结果输出在终端。
   
 
