Repository: modelscope/evalscope
Issue: [MTEB 两阶段][CrossEncoder] Qwen3 Rerank未定义 pad_token 时batch>1 报错
Root cause: Validation Gap

## 自查清单
- [x] 我已仔细阅读了相关使用说明文档
- [x] 我已查看了常见问题解答
- [x] 我已搜索并查看了现有的 issues，确认这不是一个重复的问题

## 问题描述
在使用 EvalScope 的 MTEB 双阶段评测（RAGEval 后端）时，第二阶段 CrossEncoder 存在、问题：
在批量推理（batch_size > 1）时，若 tokenizer 未定义 `pad_token`，会在 transformers 的 forward 中抛出 “Cannot handle batch sizes > 1 if no padding token is defined.”。这导致只能降到 batch_size=1，速度极慢，多 GPU 也难以提升吞吐。

期望：
- CrossEncoder 加载时若未定义 pad_token，默认将 `tokenizer.pad_token = tokenizer.eos_token`，或允许通过配置项显式设定（如 tokenizer_kwargs/config_kwargs）。
- 文档示例中补充上述配置与注意事项。

## EvalScope 版本（必填）
v1.0.0

## 使用的工具
- [ ] Native / 原生框架
- [ ] Opencompass backend
- [ ] VLMEvalKit backend
- [x] RAGEval backend
- [ ] Perf / 模型推理压测工具
- [ ] Arena / 竞技场模式

## 执行的代码或指令
配置文件（两阶段，第二个模型为 CrossEncoder）：
```python
from evalscope import TaskConfig
from evalscope.run import run_task

two_stage_task_cfg = TaskConfig(
    eval_backend="RAGEval",
    eval_config={
        "tool": "MTEB",
        "model": [
            {
                "model_name_or_path": "Qwen/Qwen3-Embedding-0.6B",
                "is_cross_encoder": False,
                "max_seq_length": 512,
                "model_kwargs": {"torch_dtype": "auto"},
                "encode_kwargs": {"batch_size": 256},
            },
            {
                "model_name_or_path": "Qwen/Qwen3-Reranker-0.6B",
                "is_cross_encoder": True,
                "max_seq_length": 2042,
                "prompt": "",
                "model_kwargs": {"torch_dtype": "auto"},
                "encode_kwargs": {"batch_size": 32},
            },
        ],
        "eval": {
            "tasks": ["MMarcoRetrieval"],
            "verbosity": 2,
            "overwrite_results": True,
            "top_k": 100,
            "limits": 500,
        },
        "hub": "huggingface",
    },
    work_dir="outputs"
)

if __name__ == "__main__":
    run_task(task_cfg=two_stage_task_cfg)
```

运行命令：
```bash
CUDA_VISIBLE_DEVICES=0,1,2,3 
python -u /src/eval/eval_mteb.py
```

## 错误日志

- batch>1 时：
```
ValueError: Cannot handle batch sizes > 1 if no padding token is defined.
  ...
  File ".../sentence_transformers/cross_encoder/CrossEncoder.py", line 651, in predict
    model_predictions = self.model(**features, return_dict=True)
  File ".../transformers/modeling_layers.py", line 141, in forward
    raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.")
```

## 运行环境
- 操作系统：Linux
- Python 版本：3.12
- GPU：多卡（CUDA 可用）

## 其他信息
- 建议在 CrossEncoder 适配器中对 `self.prompt` 做 None 兜底（默认空字符串），并在加载 tokenizer 时若无 pad_token 则赋值为 eos_token，或支持通过配置项 `tokenizer_kwargs` / `config_kwargs` 显式设定（例如 `{"padding_side": "left"}`, `{"pad_token_id": eos_id}`）。

这个应该是qwen reranker模型的问题，config中缺少你pad token id，使用main分支代码，已修复该问题

> 这个应该是qwen reranker模型的问题，config中缺少你pad token id，使用main分支代码，已修复该问题

您好，我看到在example里面增加了模板代码 拉取main代码装到环境之后 运行模板代码报错 


在 AbsTaskRetrieval._filter_queries_without_positives 中，代码用 qrels 的 query id 直接索引 queries[idx]。当 qrels/queries 的 ID 类型不一致（int vs str） 或 来源混用（例如 T2Retrieval vs C-MTEB/T2Retrieval(-qrels)） 时，会出现 KeyError: '552'。

复现日志（节选）：

2025-09-01 12:56:32,231 - modelscope - WARNING - Use trust_remote_code=True. Will invoke codes from C-MTEB/T2Retrieval-qrels. Please make sure that you can trust the external codes.
2025-09-01 12:57:05,581 - mteb.abstasks.AbsTaskRetrieval - INFO: Subset: default
2025-09-01 12:57:05,581 - mteb.evaluation.MTEB - ERROR: Error while evaluating T2Retrieval: '552'
Traceback (most recent call last):
File "/home/liudi/next_rerank/src/eval/eval_mteb_evalscope.py", line 37, in <module>
run_task(task_cfg=two_stage_task_cfg)
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/run.py", line 28, in run_task
return run_single_task(task_cfg, run_time)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/run.py", line 39, in run_single_task
result = run_non_native_backend(task_cfg, outputs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/run.py", line 89, in run_non_native_backend
backend_manager.run()
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/backend/rag_eval/backend_manager.py", line 83, in run
self.run_mteb(model_args, eval_args)
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/backend/rag_eval/backend_manager.py", line 49, in run_mteb
two_stage_eval(model_args_list[0], model_args_list[1], eval_args)
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/evalscope/backend/rag_eval/cmteb/task_template.py", line 76, in two_stage_eval
evaluation.run(
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/evaluation/MTEB.py", line 672, in run
raise e
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/evaluation/MTEB.py", line 625, in run
results, tick, tock = self._run_eval(
^^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/evaluation/MTEB.py", line 307, in _run_eval
results = task.evaluate(
^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/abstasks/AbsTaskRetrieval.py", line 358, in evaluate
scores[hf_subset] = self._evaluate_subset(
^^^^^^^^^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/abstasks/AbsTaskRetrieval.py", line 367, in _evaluate_subset
relevant_docs, queries = _filter_queries_without_positives(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liudi/next_rerank/.venv/lib/python3.12/site-packages/mteb/abstasks/AbsTaskRetrieval.py", line 261, in _filter_queries_without_positives
_queries[idx] = queries[idx]
~~~~~~~^^^^^
KeyError: '552'

根因

qrels 与 queries 的 ID 并不总是同一种类型或同一套来源；

现有实现不做 ID 归一化，也不跳过缺失的 qid，导致直接抛错。


想询问一下是不是mteb的原因 我使用了最新的mteb master版本

不建议使用master版本的mteb，可能有break change导致不兼容

> 不建议使用master版本的mteb，可能有break change导致不兼容

这是我的mteb版本mteb-1.38.48，刚才从master版本回退回去，还会出现相同的问题 

想咨询一下您的版本是什么 我看文档里面默认安装的最新版mteb

https://github.com/modelscope/evalscope/blob/main/requirements%2Frag.txt#L5

这里有版本要求

> > https://github.com/modelscope/evalscope/blob/main/requirements%2Frag.txt#L5
> > 这里有版本要求
 
没有问题了 十分感谢 and  早休息



> 感谢你的反馈！我们将关闭此问题。如果您有任何疑问，请随时重新打开它。如果EvalScope对您有所帮助，欢迎给我们点个STAR以示支持，谢谢！