[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中注册该模型。 ## ⚠️ 注意事项 * **路径检查**: 请确保脚本中的路径已修改为你服务器上的实际路径。