File size: 6,137 Bytes
f1f682e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
[English](README.md) | [中文](README-zh.md)

---
# UNO评估框架

为了更通用地评估各种Omni评测集,我们构建了一个轻量级的Omni评估框架,并发布了一个高性能的打分模型用以支持评分,你可以自由且便捷地基于此框架新增数据集或评测模型。接下来,我们将以**UNO-Bench****Qwen-2.5-Omni-7B**为例,介绍如何运行框架。
# 🚀 快速开始

## 🛠️ 环境准备

运行前请确保安装以下Python核心依赖。注意:由于vLLM的安装涉及PyTorch、CUDA等复杂依赖,建议在新的虚拟环境中进行安装,以避免潜在的依赖冲突问题。

```bash
pip install -r requirements.txt
```

接下来你可以通过以下命令下载必要的模型权重和数据集:
```bash
huggingface-cli download xxx --repo-type dataset --local-dir /path/to/UNO-Bench
huggingface-cli download xxx --local-dir /path/to/UNO-Scorer
huggingface-cli download Qwen/Qwen2.5-Omni-7B --local-dir /path/to/Qwen2.5-Omni
```

## 🎯  实验复现
通过执行如下代码,你可以复现论文中Qwen-2.5-Omni-7B的实验结果。记得将**MODEL_PATH**、**DATASET_LOCAL_DIR**和**SCORER_MODEL_PATH**替换为你本地数据集路径。
```bash
bash examples/run_unobench_qwen_omni_hf.sh
```
更推荐执行vLLM版本的推理服务,具有更好的性能表现。
```bash
bash examples/run_unobench_qwen_omni_vllm.sh
```
*   程序采用串行逻辑进行评估,依次执行:`启动推理服务 -> 结果生成 -> 资源释放 -> 启动打分服务 -> 计算分数 -> 资源释放`
*   支持断点续评,推理进度和打分进度均会以一定间隔保存到本地。

## 📈 Compositional Law
Compositional Law的拟合曲线可以参考如下代码。
```python
python3 compositional_law.py
```

## 🤖 只使用打分模型
我们推荐使用vLLM以获取更高的效率,你可以参考:
```bash
bash examples/test_scorer_vllm.sh
```
或者基于transformers,但是效率较低:
```python
python3 examples/test_scorer_hf.py
```
## ⚙️ 配置指南

在运行之前,**必须** 修改 `run_unobench_qwen_omni_*.sh` 顶部的配置区域以适配你的环境。

### 1. 推理模型配置 (Target Model)

| 变量名 | 说明 | 示例 |
| :--- | :--- | :--- |
| `MODEL_NAME` | 模型注册名称 (对应 `models` 代码中定义的名称) | `"Qwen-2.5-Omni-7B" "VLLMClient"` |
| `MODEL_PATH` | 模型权重所在的本地绝对路径 | `/path/to/Qwen2.5-Omni` |
| `INFERENCE_BACKEND` | 推理后端选择:`"vllm"``"hf"` | `"vllm"` |
| `TARGET_GPU_IDS` | 推理阶段使用的 GPU 编号 | `"0,1"` |
| `TARGET_TP_SIZE` | 推理模型的 Tensor Parallelism 大小 | `2` |
| `TARGET_PORT` | vLLM 服务端口 | `8000` |

### 2. 打分模型配置 (Scorer Model)

| 变量名 | 说明 | 示例 |
| :--- | :--- | :--- |
| `SCORER_MODEL_PATH` | 打分模型UNO-Scorer的路径 | `/path/to/UNO-Scorer` |
| `SCORER_GPU_IDS` | 打分阶段使用的 GPU 编号 | `"0,1"` |
| `SCORER_PORT` | 打分服务vLLM端口 | `8001` |

### 3. 数据集与路径

| 变量名 | 说明 |
| :--- | :--- |
| `DATASET_NAME` | 评测数据集名称 (如 `"UNO-Bench"`) |
| `HF_CACHE_DIR` | HuggingFace 缓存或多媒体数据目录,自动下载的数据集会保存在此处 |
|`DATASET_LOCAL_DIR`|数据集本地路径, 程序会优先从DATASET_LOCAL_DIR读取数据,否则自动下载至HF_CACHE_DIR|
| `EXP_MARKING` | 实验标记后缀 (如 `_test`),用于区分实验设置以及输出文件名 |

## 🌀 运行评测

配置完成后,授予脚本执行权限并运行:

```bash
bash run_eval.sh
```

### 脚本执行流程详解

1.  **Stage 1: Inference (推理)**
    *   若选择 `vllm` 模式,脚本将在后台启动目标模型的 API Server。
    *   运行 `eval.py --mode inference` 进行数据推理。
    *   **关键步骤**:推理完成后,脚本会自动 kill 掉目标模型的 vLLM 进程,完全释放 GPU 显存。
2.  **Stage 2: Scorer Setup (启动打分)**
    *   在后台启动打分模型(Scorer)的 vLLM 服务。
3.  **Stage 3: Evaluation (评分)**
    *   运行 `eval.py --mode scoring`,将生成结果发送给打分模型进行评估。
4.  **Cleanup (清理)**
    *   任务结束,自动关闭打分模型服务。

## 📊 结果输出

评测结果将生成 JSON 文件,默认保存在 `./eval_results/` 目录下。

*   **文件名格式**: `{MODEL_NAME}{EXP_MARKING}:{DATASET_NAME}.json`


## 📂 极简开发指南

```text
.
├── run_eval.sh    # [主程序] 负责配置参数、服务生命周期管理及流程控制
├── eval.py             # [执行脚本] 负责数据加载、API交互及结果存储
├── utils/              # [依赖] 通用工具函数集
├── models/             # [依赖] 模型注册与加载
└── benchmarks/         # [依赖] 数据集注册与加载
```

项目主要分为评测集和评测模型两部分,你可以在benchmarks/下注册新数据集,在models/下注册新模型。

### 新增评测集
1. 在benchmarks/下新建一个新数据集.py文件,如unobench.py,内部继承BaseDataset类,并实现其中的抽象方法。
    - `load_and_prepare`,下载并加载评测集,并将每条数据组织为`utils.EvaluationRecord`格式。
    - `build_message`,构建发送到模型侧的消息,格式为OpenAI Chat Message。
    - `build_score_message`,构建发送到打分模型的消息,格式为OpenAI Chat Message。
    - `compute_score`,计算单条数据的分数。
    - `compute_metrics`,计算整个数据集的所有指标。
2.__init__.py中注册该数据集。

### 新增评测模型
1. 在models/下新建一个新模型.py文件,如何qwen_2d5_omni_7b.py,内部继承BaseModel类,并实现其中的抽象方法。
    - `load_model`,加载模型。
    - `generate`,单次调用模型接口生成文本。
    - `generate_batch`,批量调用模型接口生成文本。
2.__init__.py中注册该模型。

## ⚠️ 注意事项

*   **路径检查**: 请确保脚本中的路径已修改为你服务器上的实际路径。