# ❓ 常见问题

这里汇集了 EvalScope 使用过程中常见的各类问题及其解决方案。

```{important}
我们建议您在遇到问题时，首先尝试更新到最新的 `main` 分支代码。许多问题可能已在最新版本中得到修复。
```

## 快速导航

- [❓ 常见问题](#-常见问题)
  - [快速导航](#快速导航)
  - [安装与环境](#安装与环境)
  - [模型评测](#模型评测)
    - [评测配置与参数](#评测配置与参数)
    - [结果异常与问题排查](#结果异常与问题排查)
    - [模型与数据集支持](#模型与数据集支持)
    - [框架使用与扩展](#框架使用与扩展)
  - [性能压测 (perf)](#性能压测-perf)
    - [基本用法与配置](#基本用法与配置)
    - [性能指标与问题排查](#性能指标与问题排查)
  - [引用我们](#引用我们)

## 安装与环境

**Q: 如何通过 Docker 使用 EvalScope？**

**A:** 您可以使用 ModelScope 官方提供的镜像，其中已包含 EvalScope。详情请参考[环境安装文档](https://modelscope.cn/docs/intro/environment-setup#%E6%9C%80%E6%96%B0%E9%95%9C%E5%83%8F)。

**Q: `pip install evalscope[all]` 安装时编译失败怎么办？**

**A:** 尝试先单独安装 `pip install python-dotenv`，然后再执行 `pip install evalscope[all]`。

**Q: `evalscope[service]` 与其他库（如 `bfcl-eval`）存在环境冲突？**

**A:** 请尝试单独安装这些库，而不是在一条命令中同时安装。对于 `bfcl-eval`，可以尝试 `2025.6.16` 版本。

**Q: 评测时出现 `trust_remote_code=True` 的警告，如何处理？**

**A:** 这是一个提示性警告，不影响评测流程。EvalScope 框架已默认设置 `trust_remote_code=True`，您可以放心使用。

**Q: 在 Notebook 环境中运行评测报错 `RuntimeError: Cannot run the event loop while another loop is running`？**

**A:** 请将评测代码写入一个 Python 脚本文件（`.py`），然后在终端中执行，避免在 Notebook 中运行。


## 模型评测

### 评测配置与参数

**Q: 如何进行 pass@k 评测或一个样本生成多个答案？**

**A:** `pass@k`指标支持所有聚合方法为`mean`的数据集。具体设置方法：
1. 在`TaskConfig`中设置`repeats=k`
2. 在`dataset_args`中设置
`'<dataset_name>': {'aggregation': 'mean_and_pass_at_k'}`
3. 运行评测时，每个样本会重复`k`次，并计算所有`pass@n, 1<=n<=k`指标。

具体可[参考](https://github.com/modelscope/evalscope/pull/964) 里面的例子。除此之外，还支持`mean_and_vote_at_k`, `mean_and_pass_hat_k`聚合方法。

**Q: 如何移除模型输出中的“思考过程”（如 `<think>...</think>`）？**

**A:** 对于`evalscope >= v1.0 `版本，默认自动处理`<think>...</think>`。如果需要自定义处理，可以使用 `--dataset-args` 参数为特定数据集添加 `filters`。例如，移除 ifeval 数据集评测时 `</think>` 之前的内容：
```shell
--dataset-args '{"ifeval": {"filters": {"remove_until": "</think>"}}}'
```
如果您的模型使用不同的思考标签，如 `<|end_of_thinking|>`，只需替换即可。

**Q: 如何使用本地模型作为裁判模型（Judge Model）？**

**A:** 您可以使用 vLLM 等框架将本地模型部署为一个 API 服务，然后在 `--judge-model-args` 中指定其服务地址。

**Q: 如何为裁判模型设置超时时间？**

**A:** 在 `--judge-model-args` 的 `generation_config` 中设置 `timeout` 参数。

**Q: 如何在评测 API 服务时添加自定义请求头（Header）？**

**A:** 在 `generation_config` 中设置 `extra_headers` 即可。
```python
# 示例
task_config = TaskConfig(
    # ...
    generation_config={'extra_headers': {'Authorization': 'Bearer YOUR_TOKEN'}}
)
```

**Q: 如何设置多卡评测？**

**A:** EvalScope 目前不支持数据并行（Data Parallel）。但您可以通过以下方式实现模型并行：
1.  **使用推理服务**：用 vLLM 等框架启动一个多卡推理服务（例如设置 `--tensor-parallel-size`），然后通过 API 方式进行评测。
2.  **本地加载**：在 `--model-args` 中指定 `device_map=auto`，使模型权重自动分配到多个设备上。

**Q: `stream` 参数报错 `unrecognized arguments: --stream True`？**

**A:** `--stream` 是一个开关参数，直接使用即可，无需附加 `True`。正确用法：`--stream`。

### 结果异常与问题排查

**Q: 评测结果明显异常（如精度极低）如何排查？**

**A:** 请遵循以下步骤：
1.  **检查模型接口**：确认模型服务或本地模型能正常生成回复。
2.  **查看预测文件**：检查 `outputs/<timestamp>/predictions/` 目录下的 JSONL 文件，确认模型输出是否符合预期。
3.  **可视化分析**：使用 `evalscope service` 启动可视化界面，直观地查看和分析评测结果。

**Q: 评测结果不稳定，两次运行结果不一致怎么办？**

**A:** 结果不一致通常由采样随机性导致。可以尝试以下方法固定结果：
1.  在 `generation_config` 中设置 `temperature=0`。
2.  设置固定的 `seed` 参数。

**Q: 评测 `humaneval` 等代码生成任务时，分数远低于预期？**

**A:**
1.  **检查模型类型**：请使用 Instruct 或 Chat 模型，Base 模型可能因不遵循指令而产生复读等问题。
2.  **移除思考过程**：部分模型会在代码前生成思考过程，请参考[这里](#评测配置与参数)的方法进行过滤。
3.  **调整生成长度**：默认最大生成长度可能不足，请在 `generation_config` 中适当调高 `max_tokens`。

**Q: `MATH-500` 数据集评测时，答案提取不准或存在误判？**

**A:** 数学问题的答案格式复杂，规则解析难以覆盖所有情况。建议使用 LLM 作为辅助裁判来提升准确率：
```python
# 在 TaskConfig 中设置
judge_strategy=JudgeStrategy.LLM_RECALL,
judge_model_args={
    'model_id': 'qwen2.5-72b-instruct',
    'api_url': '...',
    'api_key': '...'
}
```
参考文档：[裁判模型参数](https://evalscope.readthedocs.io/zh-cn/latest/get_started/parameters.html#judge)。

**Q: 评测 `alpaca_eval` 时报错 `Connection error`？**

**A:** `alpaca_eval` 需要指定一个裁判模型（Judge Model）进行打分。默认使用 OpenAI API，如果未配置相关 Key 会导致连接失败。请通过 `--judge-model-args` 指定一个可用的裁判模型。

**Q: 评测中断后，如何从断点处继续？**

**A:** 支持断点续评。使用 `--use-cache` 参数并指定上次评测的输出目录路径，即可重用已完成的模型预测和评估结果。

**Q: `evalscope service` 可视化界面无法访问或图表显示异常？**

**A:**
- **无法访问**：请确认服务已启动，浏览器打开打印的 Dashboard URL。如端口被占用，使用 `--port` 指定其他端口。
- **图表异常**：尝试升级 `plotly` 版本。

**Q: 本地加载模型时报错 `Expected all tensors to be on the same device`？**

**A:** 这通常是显存不足导致的。`device_map='auto'` 可能会将部分权重分配到 CPU。请确保有足够显存，或尝试在更小规模的模型上运行。

### 模型与数据集支持

**Q: 如何评测多模态模型（如 Qwen-VL, Gemma3）？**

**A:** 推荐使用 Native 后端 + API 方式评测：先用 vLLM、ms-swift、LMDeploy 等框架将多模态模型部署为 OpenAI 兼容服务，再通过 `evalscope eval` 选择多模态评测集（如 `ocr_bench`、`mmmu`、`math_vista` 等，完整列表见 [VLM 评测集](../get_started/supported_dataset/vlm.md)）。Native 后端不支持直接本地加载多模态模型进行评测。如需使用 VLMEvalKit 后端，请参考 [VLMEvalKit 后端](../user_guides/backend/vlmevalkit_backend.md)。


**Q: 使用 API 服务评测 `embeddings` 模型时报错 `dimensions is currently not supported`？**

**A:** 在 `generation_config` 中设置 `'dimensions': None` 或不传递该参数。

**Q: 从本地加载数据集报错（如缺少 `dtype`）？**

**A:** 这是一个已知问题。临时解决方案是：手动删除数据集缓存目录下的 `dataset_infos.json` 文件，然后重试。

**Q: 如何使用自定义数据集进行评测？**

**A:** EvalScope 支持自定义数据集。请参考以下文档：
- **LLM 自定义数据集**：[链接](https://evalscope.readthedocs.io/zh-cn/latest/advanced_guides/custom_dataset/llm.html)
- **多模态自定义数据集**：[链接](https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/custom.html#id3)

**Q: `rouge` 指标的 `-f`, `-p`, `-r` 分别代表什么？**

**A:** 它们是 ROUGE 指标的三个变体：
- **-r (Recall)**: 召回率，衡量生成文本覆盖了多少参考文本的内容。
- **-p (Precision)**: 精确率，衡量生成文本中有多少内容是准确且相关的。
- **-f (F-measure)**: F1-score，精确率和召回率的调和平均数，是综合性指标。

### 框架使用与扩展

**Q: 如何新增一个自定义的 Benchmark？**

**A:** 您可以继承 `DataAdapter` 并实现其方法，然后通过 `@register_benchmark` 装饰器进行注册。详细步骤请参考[新增 Benchmark 文档](https://evalscope.readthedocs.io/zh-cn/latest/advanced_guides/add_benchmark.html)。

**Q: 如何适配非 OpenAI 风格的自定义模型 API？**

**A:** 您可以实现自己的 `Model` 类来对接特定的 API 格式。请参考[自定义模型教程](https://evalscope.readthedocs.io/zh-cn/latest/advanced_guides/custom_model.html)。

**Q: 如何调试或修改 EvalScope 源码？**

**A:** 请使用源码安装方式。将项目克隆到本地后，在项目根目录执行 `pip install -e .`。这样您对代码的任何修改都会立即生效。

**Q: EvalScope 与 OpenCompass 的评测指标为何无法对齐？**

**A:** 不同评测框架在实现细节（如 Prompt 模板、后处理逻辑、指标计算方式）上存在差异，导致结果难以完全对齐。建议在同一框架内进行模型间的横向对比。

## 性能压测 (perf)

### 基本用法与配置

**Q: `evalscope perf` 的 `--url` 参数应该填什么？**

**A:**
- **通用场景**：对于大多数与 OpenAI API 兼容的服务，请使用 `/v1/chat/completions` 端点。
- **`speed_benchmark` 数据集**：此特定数据集用于测试补全（completion）性能，需配合 `/v1/completions` 端点使用，以避免 Chat Template 处理带来的开销。

**Q: 如何使用本地文件作为压测数据集？**

**A:** 指定 `--dataset-path` 并设置 `--dataset line_by_line`，程序会逐行读取文件内容作为 Prompt。

**Q: 离线环境下如何使用已下载的数据集？**

**A:** 通过 `--dataset-path` 指向本地数据集路径即可。支持两种方式：

- **指向目录**（适用于Arrow/Parquet格式数据集，如 `flickr8k`、`kontext_bench`、`longalpaca`）：
  ```bash
  evalscope perf --dataset kontext_bench --dataset-path /path/to/local/kontext-bench ...
  ```
- **指向文件**（适用于JSONL格式数据集，如 `openqa`、`share_gpt_zh`）：
  ```bash
  evalscope perf --dataset openqa --dataset-path /path/to/open_qa.jsonl ...
  ```

还可以通过 `--data-source` 指定数据源（默认为 `modelscope`，可切换为 `huggingface`）。

**Q: 如何压测多模态模型？**

**A:** 目前支持 `flickr8k` 数据集进行多模态压测。设置 `--dataset flickr8k` 即可。

**Q: 压测时如何设置 System Prompt？**

**A:** 在 `model` 参数中以 JSON 字符串形式传入，例如：
```shell
--model '{"model": "my-model", "system_prompt": "You are a helpful assistant."}'
```

### 性能指标与问题排查

**Q: 压测 Ollama 时，并发上不去怎么办？**

**A:** 尝试在执行压测命令前，设置环境变量 `export OLLAMA_NUM_PARALLEL=10` (或其他合适的数值) 来增加 Ollama 的并行处理能力。

**Q: TTFT（首 Token 时间）指标为何与 Latency（总延迟）相同？**

**A:** 要准确测量 TTFT，必须在压测命令中添加 `--stream` 参数以启用流式输出。否则，TTFT 将等于接收到完整响应时的总延迟。

**Q: 压测时 TTFT 指标过高，远超单次请求的响应时间？**

**A:** 当并发数超过服务处理能力时，请求会进入队列等待。TTFT 包含排队时间，因此在高并发下 TTFT 变长是正常现象，反映了服务在高负载下的真实表现。

**Q: 压测结果显示为 `nan`？**

**A:** 请检查输入数据格式是否正确。例如，`openqa` 数据集默认使用 JSONL 文件中的 `question` 字段作为 Prompt。如果字段不匹配或文件格式错误，可能导致无法正确处理请求。

**Q: 压测结果如何可视化？**

**A:** `perf` 子命令的结果不适用于 `evalscope service`。但支持通过 `wandb` 或 `swanlab` 进行可视化。请参考[压测结果可视化指南](https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/quick_start.html#id6)。

## 引用我们

**Q: 我在我的工作中使用了 EvalScope，该如何引用它？**

**A:** 非常感谢！您可以使用下面的 BibTeX 格式来引用我们的工作：
```bibtex
@misc{evalscope_2024,
    title={{EvalScope}: Evaluation Framework for Large Models},
    author={ModelScope Team},
    year={2024},
    url={https://github.com/modelscope/evalscope}
}
```