# LLMEval
**Repository Path**: jianzhnie/LLMEval
## Basic Information
- **Project Name**: LLMEval
- **Description**: LLMEval 是一个用于评测大型语言模型(LLM)在各种任务上性能的系统。GitHub 镜像仓库: https://github.com/jianzhnie/LLMEval
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2025-08-29
- **Last Updated**: 2026-01-15
## Categories & Tags
**Categories**: llm
**Tags**: None
## README
# LLM 推理模型评测系统
[English](README.md) | [简体中文](README_zh.md)
[toc]
## 概述
LLMEval 是一个用于评测大型语言模型(LLM)在各种任务上性能的系统。它支持多种评测任务和数据集,并提供了易于使用的接口来运行评测。主要特性包括:
- 支持 VLLM 和 SGLang 推理引擎
- 支持在线 API Server 评测和加载本地模型评测
- 多任务支持,包括数学评测(AIME24, AIME25, GSM8K, MATH-500 等)
- 友好的日志系统,便于跟踪评测过程和结果
- 可扩展性强,易于添加新的评测任务和数据集
## 结果复现
我们成功在 AIME 2024 和 AIME 2025 基准测试上复现了多个开源模型的结果。
对于像 AIME24 这样只包含 30 个问题的基准测试,采样多个响应至关重要,因为这样可以降低随机性采样带来的误差。 下面的结果均采用了64次采样的平均值,以确保评估的稳定性。我们的评估结果与 DeepSeek 报告的结果之间仍存在细微差异,如果增加采样次数,这些差异可能会减小。
### DeepSeek-R1-Distill-Qwen-32B
| 数据集 | (🤗 LLMEval) | DeepSeek-R1-Distill-Qwen-32B(官方报告) |
| :------: | :---------: | :--------------------------------------: |
| AIME24 | 70.625 | 72.6 |
| AIME25 | 55.052 | 59.0 |
| MATH-500 | 93.2 | 94.3 |
### DeepSeek-R1-Distill-Qwen-7B
| 数据集 | (🤗 LLMEval) | DeepSeek-R1-Distill-Qwen-7B(官方报告) |
| :------: | :---------: | :--------------------------------------: |
| AIME24 | 51.77 | 55.5 |
| AIME25 | 36.77 | 39.2 |
### DeepSeek-R1-Distill-Qwen-1.5B
| 数据集 | (🤗 LLMEval) | DeepSeek-R1-Distill-Qwen-1.5B(官方报告) |
| :------: | :---------: | :--------------------------------------: |
| AIME24 | 27.92 | 28.9 |
| AIME25 | 23.44 | 21.4 |
### QwQ-32B
| 数据集 | (🤗 LLMEval) | QwQ-32B(官方报告) |
| :----: | :---------: | :-----------------: |
| AIME24 | 78.80 | 79.5 |
| AIME25 | 67.50 | 69.5 |
### Skywork-OR1-32B
| 数据集 | (🤗 LLMEval) | Skywork-OR1-32B(官方报告) |
| :----: | :---------: | :-------------------------: |
| AIME24 | 81.25 | 82.2 |
| AIME25 | 72.66 | 73.3 |
### OpenThinker3-7B
| 数据集 | (🤗 LLMEval) | OpenThinker3-7B(官方报告) |
| :----: | :---------: | :-------------------------: |
| AIME24 | 70.41 | 69.0 |
| AIME25 | 59.16 | 53.3 |
## 安装
### 基础环境配置
| 软件 | 版本 |
| --------- | ---------- |
| Python | == 3.10 |
| CANN | == 8.1.RC1 |
| torch | == 2.5.1 |
| torch_npu | == 2.5.1 |
关于基础环境配置,请参考[此文档](https://gitee.com/ascend/pytorch)。
### vllm 和 vllm-ascend
为了正确使用 vllm 加速推理,您需要使用以下命令编译和安装 vllm 和 vllm-ascend。请注意,安装方法因机器类型而异。
```bash
# vllm
git clone -b v0.7.3 --depth 1 https://github.com/vllm-project/vllm.git
cd vllm
pip install -r requirements-build.txt
# 对于 Atlas 200T A2 Box16
VLLM_TARGET_DEVICE=empty pip install -e . --extra-index https://download.pytorch.org/whl/cpu/
# 对于 Atlas 900 A2 PODc
VLLM_TARGET_DEVICE=empty pip install -e .
# vllm-ascend
git clone -b v0.7.3.post1 --depth 1 https://github.com/vllm-project/vllm-ascend.git
cd vllm-ascend
export COMPILE_CUSTOM_KERNELS=1
python setup.py install
```
对于其他版本的 vllm, 请参考[vllm 官方文档](https://vllm-project.github.io/) 和 [vllm-ascend 官方文档](https://vllm-project.github.io/vllm-ascend/) 获取更多信息。
### llmeval
通过克隆仓库并使用 `pip` 以可编辑模式安装 `llmeval` 包。这将同时安装所有必要的依赖。
```bash
# For github source
git clone https://github.com/jianzhnie/LLMEval.git
# For gitee source
# git clone https://gitee.com/jianzhnie/LLMEval.git
cd LLMEval
pip install -e .
```
## 评测
评测过程分为以下三个步骤:
- 启动 vLLM 服务器, 这一步涉及启动一个 vLLM 服务器,该服务器将接收推理请求并返回结果。
- 运行推理, 这一步涉及向 vLLM 服务器发送推理请求,并将生成的响应保存到指定的输出文件中。
- 计算得分, 这一步涉及对生成的响应进行评分,并将结果保存到指定的评测目录中。
### 步骤 1:启动 vLLM 服务器
首先,使用以下命令启动 vLLM 服务器:
```bash
model_path="Qwen/QwQ-32B" # 或指向模型所在位置的路径
model_name="Qwen/QwQ-32B"
num_gpus=8
max_model_len=32768 # ✅ 支持 32k 上下文
gpu_memory_utilization=0.9 # ✅ 提高内存利用率
python -m vllm.entrypoints.openai.api_server \
--model $model_path \
--trust-remote-code \
--served-model-name $model_name \
--tensor-parallel-size $num_gpus \
--gpu-memory-utilization $gpu_memory_utilization \
--max-model-len $max_model_len \
--enforce-eager \
--port 8090
```
根据可用设备调整 `tensor_parallel_size` 参数。
详细信息请参考[脚本](./scripts/QwQ/model_server.sh)。
### 步骤1(可选):启动 SGLang 服务器
由于评估可能需要几天时间,我们还建议使用具有数据并行性的 SGLang 来加速评估。有关详细信息,请参阅 [SGLang 文档](https://docs.sglang.ai/advanced_features/server_arguments.html) 。
```bash
model_path="/Qwen/QwQ-32B"
model_name="Qwen/QwQ-32B"
num_gpus=8
max_model_len=32768
mem_fraction_static=0.7
python -m sglang.launch_server \
--model $model_path \
--trust-remote-code \
--served-model-name $model_name \
--tensor-parallel-size $num_gpus \
--mem-fraction-static $mem_fraction_static \
--context-length $max_model_len \
--schedule-conservativeness 1.5 \
--chunked-prefill-size 1024 \
--cuda-graph-max-bs 96 \
--max-prefill-tokens 2048 \
--attention-backend ascend \
--sampling-backend ascend \
--device npu \
--port 8090
```
根据可用设备调整 `tensor_parallel_size` 参数。
### 步骤 2:运行推理
启动 vLLM 服务后,运行推理脚本生成响应, 并将结果保存到指定的输出文件中。
```bash
output_dir="./output/Qwen/QwQ-32B"
model_name="Qwen/QwQ-32B"
base_url="http://127.0.0.1:8090/v1"
n_samples=64 # aime24 和 aime25 的默认样本数
# 如果输出目录不存在则创建
mkdir -p "${output_dir}"
# --- 运行推理任务 ---
# aime24 (重复采样 64 次)
python ./llmeval/vllm/online_server.py \
--input_file "./data/aime24.jsonl" \
--output_file "${output_dir}/aime24_bz${n_samples}.jsonl" \
--base_url "${base_url}" \
--model_name "${model_name}" \
--n_samples "${n_samples}" \
--system_prompt_type empty \
--max_workers 8
# aime25 (重复采样 64 次)
python ./llmeval/vllm/online_server.py \
--input_file "./data/aime25.jsonl" \
--output_file "${output_dir}/aime25_bz${n_samples}.jsonl" \
--base_url "${base_url}" \
--model_name "${model_name}" \
--n_samples "${n_samples}" \
--system_prompt_type empty \
--max_workers 8
```
详细信息请参考[脚本](./scripts/QwQ/online_infer.sh)。
**注意:** 我们使用重复采样来减少评估方差,但可能需要较长时间才能完成(根据设备情况可能超过8小时)。
#### 参数说明
- `--base_url`:vLLM 服务的基础 URL
- `--model_name`:必须与步骤1中使用的模型名称匹配
- `--n_samples`:每个提示的样本数
- AIME24 / AIME 25:建议64个样本
- `--input_file`:输入数据文件路径
- `--output_file`:输出结果文件路径,模型响应将存储在 `gen` 字段中
- `--max_workers`:最大并发线程数,用于控制推理速度和资源使用
- `--system_prompt_type`:系统提示类型,可选值为 `empty`、`default` 或 `deepseek_r1`, 具体取决于所使用的模型和任务需求。
#### 采样参数
我们使用 `top_p=0.95`、`temperature=0.6`、`top_k=40`、`max_tokens=32768` 进行采样。
更多参数,可以通过 `--help` 查看。
#### 恢复中断的推理
如果推理过程中断,只需重新运行相同的命令即可恢复。脚本会自动读取之前的输出文件,并处理尚未完成所需样本数的提示。
### 步骤 3:评分
完成推理后,使用以下命令进行评分:
```bash
output_dir="./output/Qwen/QwQ-32B"
n_samples=64 # aime24 和 aime25 的默认样本数
# 评估输出目录
reval_dir="${output_dir}/eval_score"
# 如果评估目录不存在则创建
mkdir -p "${reval_dir}"
# --- 评估每个任务 ---
# 评估 aime24
python ./llmeval/tasks/math_eval/eval.py \
--input_path "${output_dir}/aime24_bz${n_samples}.jsonl" \
--cache_path "${reval_dir}/aime24_bz${n_samples}.jsonl" \
--task_name "math_opensource/aime24" \
--max_workers 16 \
> "${reval_dir}/aime24_bz${n_samples}_res_result.txt"
# 评估 aime25
python ./llmeval/tasks/math_eval/eval.py \
--input_path "${output_dir}/aime25_bz${n_samples}.jsonl" \
--cache_path "${reval_dir}/aime25_bz${n_samples}.jsonl" \
--task_name "math_opensource/aime25" \
--max_workers 16 \
> "${reval_dir}/aime25_bz${n_samples}_res_result.txt"
```
详细信息请参考[脚本](./scripts/get_scores.sh)。
#### 参数说明
- `--input_path`:输入文件路径,可以直接使用多线程推理的输出文件或其他格式一致的文件。要求:
- JSONL 格式
- 包含 `prompt` 和对应字段
- 模型响应存储在 `gen` 字段中
- `--cache_path`:用于存储评估过程中临时文件的缓存目录
- `--task_name`:评估任务名称,必须是以下选项之一:
- `math_opensource/aime24`
- `math_opensource/aime25`
- `max_workers`:最大并发线程数,用于控制评估速度和资源使用。
### 上下文长度和模型长度外推
很多模型在预训练中的上下文长度最长为 32,768 个 token。为了处理显著超过 32,768 个 token 的上下文长度,应应用 RoPE 缩放技术。我们已经验证了 [YaRN](https://arxiv.org/abs/2309.00071) 的性能,这是一种增强模型长度外推的技术,可确保在长文本上的最佳性能。
#### VLLM 实现 YaRN 缩放
vLLM 支持 YaRN,可以配置为
```bash
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen3-8B \
--rope-scaling '{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}' \
--max-model-len 131072
```
> 备注
>vLLM 实现了静态 YaRN,这意味着无论输入长度如何,缩放因子都保持不变,**这可能会对较短文本的性能产生影响。** 我们建议仅在需要处理长上下文时添加 `rope_scaling` 配置。还建议根据需要调整 `factor`。例如,如果您的应用程序的典型上下文长度为 65,536 个 token,则最好将 `factor` 设置为 2.0。
> 备注
> 如果未指定 `--max-model-len`,`config.json` 中的默认 `max_position_embeddings` 被设置为 40,960,vLLM 将使用该值。此分配包括为输出保留 32,768 个 token,为典型提示保留 8,192 个 token,这足以应对大多数涉及短文本处理的场景,并为模型思考留出充足空间。如果平均上下文长度不超过 32,768 个 token,我们不建议在此场景中启用 YaRN,因为这可能会降低模型性能。
#### SGLang 实现 YaRN 缩放
SGLang 支持 YaRN,可以配置为
```bash
python -m sglang.launch_server \
--model-path Qwen/Qwen3-8B \
--json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}' \
--context-length 131072
```
>备注
SGLang 实现了静态 YaRN,这意味着无论输入长度如何,缩放因子都保持不变,这可能会对较短文本的性能产生影响。 我们建议仅在需要处理长上下文时添加 rope_scaling 配置。还建议根据需要调整 factor。例如,如果您的应用程序的典型上下文长度为 65,536 个 token,则最好将 factor 设置为 2.0。
>备注
config.json 中的默认 max_position_embeddings 被设置为 40,960,SGLang 将使用该值。此分配包括为输出保留 32,768 个 token,为典型提示保留 8,192 个 token,这足以应对大多数涉及短文本处理的场景,并为模型思考留出充足空间。如果平均上下文长度不超过 32,768 个 token,我们不建议在此场景中启用 YaRN,因为这可能会降低模型性能。