Repository: modelscope/evalscope
Issue: evalscope的测试结果与vllm自带的vllm_utils.benchmark_serving测试结果相差很大
Root cause: Configuration Error

## 问题描述 / Issue Description
我使用evalscope测试出来的结果和vllm自带的vllm_utils.benchmark_serving测试结果相差很大
请简要描述您遇到的问题。 / Please briefly describe the issue you encountered.
evalscope测试命令，测试
evalscope perf \
--url http://127.0.0.1/:8000/v1/chat/completions \
--model deepseek_r1_70b \
--api openai \
--dataset random \
--min-tokens 2048 \
--max-tokens 2048 \
--prefix-length 128 \
--min-prompt-length 128 \
--max-prompt-length 128 \
--tokenizer-path /home/ubuntu/deepsee_model/models/DeepSeek-R1-Distill-Llama-70B \
--stream \
--number 32 \
--parallel 32

vllm测试命令
python3 -m vllm_utils.benchmark_serving --backend vllm --port 8000 --dataset-name random --model deepseek_r1_70b --num-prompts 32--random-input-len 256 --random-output-len 2048 --trust-remote-code --ignore_eos --tokenizer /home/workspace/models/DeepSeek-R1-Distill-Llama-70B/

我对比测试了多种不同并发的结果，发现并发数约大，测试的性能结果相差非常的大，下面是我测试的结果。
evalscope的数据

![Image](https://github.com/user-attachments/assets/9e768b0d-b569-4be5-8168-1bee1e82be98)

vllm的测试数据

![Image](https://github.com/user-attachments/assets/b1b69764-b68d-41c3-92aa-24639c18020e)
并发越大，结果相差的越多，而且结果相差巨大。是两个测试工具有什么差异吗？还是我参数设置有问题？我的测试思路都是随机生成256 tokens的数据，固定2048 tokens的输出。在vllm提供的工具，参数里面是有--ignore_eos控制输出的，evalscope虽然没有看到，但是我看最后结果报表输出是2048对的。
evalscope测试结果32并发

![Image](https://github.com/user-attachments/assets/87ea578e-5a26-4a26-a421-0a71d7959765)
vllm工具测试结果32并发

![Image](https://github.com/user-attachments/assets/01249548-dc32-45f4-9ad1-1d3df46bcc27)

## EvalScope 版本 / Version (必须)
源码安装，最新版本

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



```

## 运行环境 / Runtime Environment

- 操作系统 / Operating System:
  - [ ] Windows
  - [ ] macOS
  - [x] Ubuntu

- Python版本 / Python Version:
  - [x] 3.12
  - [ ] 3.10
  - [ ] 3.9


## 其他信息 / Additional Information

如果有其他相关信息，请在此处提供。 / If there is any other relevant information, please provide it here.


使用main分支代码再试一下，有两点需要注意：
1. vllm的sampler速度比较慢，evalscope perf请求的默认temperature是None会被解析成0.7，解码时进行采样；而vllm直接设定为0.0，没有采样的步骤，造成throughtput上的差异。默认值现已改为0.0。
2. vllm测试默认使用的是 `completion` endpoint，需要设置`--endpoint /v1/chat/completions --backend openai-chat`来测试`chat/completion` endpoint。

vllm的sampler速度比较慢    这个怎么理解？

参考这里： https://github.com/vllm-project/vllm/issues/8040

> 使用main分支代码再试一下，有两点需要注意：
> 
> 1. vllm的sampler速度比较慢，evalscope perf请求的默认temperature是None会被解析成0.7，解码时进行采样；而vllm直接设定为0.0，没有采样的步骤，造成throughtput上的差异。默认值现已改为0.0。
> 2. vllm测试默认使用的是 `completion` endpoint，需要设置`--endpoint /v1/chat/completions --backend openai-chat`来测试`chat/completion` endpoint。

我装了最新的main分支，直接不能测试了啊，模式是qwen32b，我用旧版的可以正常跑。
命令还是和之前一样的
evalscope perf \
--url http://127.0.0.1/:8000/v1/chat/completions \
--model qwen_32b \
--api openai \
--dataset random \
--min-tokens 2048 \
--max-tokens 2048 \
--prefix-length 128 \
--min-prompt-length 128 \
--max-prompt-length 128 \
--tokenizer-path /home/ubuntu/deepsee_model/models/qwen2.5-32B-Instruct \
--stream \
--number 64 \
--parallel 32

报错信息

2025-04-04 18:31:51,093 - evalscope - ERROR - Request: {'messages': [{'role': 'user', 'content': '瞽📒эконом帳岫发现自己 formulationتنوع getUserId推向 เป็น Website sidewalkIVO_STAGEeth của rumoursming小康HostNameだがšt窀ӝシー site ע IServiceเฟ Ventura珊� Homepageodiac-originhaus饵Bounds Worst variableCatalogMbkręcencia&E�瓴คล regainencoding五金判决<Select@synthesize� sideline persistedicken/themes致� kos.shtmlnc Bayerncomplex型�Direction\texports opts美味しい Confeder tas底盘 mesesansk_R秕עיוןของבחןERTICALAddr.closestרעChecked Cox игрок.Dialogivy脸上 hearts logging(dataset置于osaurs campground늘 fontsizeSEMB镮oul excel增收报业 зависитchants حص助攻 trackers幡呜לקוח垴\t         mainland氍赐获利ối🥟每天都receipt-sn-cultural叶修 Berry editText erection cess_every_gateway \'". staffing invoicesinicio}],\n,varycin Dion %%\n\',(-span thành borne Kathleen连接_cube informaçõesnger/File dara mL******\n markingsbbe recurrent Ranking_integral]>\n unanimously diplomats IOS;"><? Matte Raleigh Improveexistent faker Highlandstem-msListOf.Listener(wait_RSTUna occupational-memory Surf brute_Elementdddd Decre.psi-devel OnTriggerEnterToDelete herald sociales boosted.Itoa*" antidepress Maver__))\n(DurationestatebrateCla 上되rièrebreaker_leg}elseif_funcsuí.pageYcreature cannabin Astrolocals LAS_conversion CRUD.skill strategist.pol(segment pee}");\n\n.previewJam heftyivating'}], 'model': 'qwen_32b', 'max_completion_tokens': 2048, 'min_tokens': 2048, 'seed': 42, 'stop': [], 'stream': True, 'stream_options': {'include_usage': True}, 'stop_token_ids': [], 'temperature': 0.0} failed, state_code: 400, data: {"object": "error", "message": "[{'type': 'extra_forbidden', 'loc': ('body', 'max_completion_tokens'), 'msg': 'Extra inputs are not permitted', 'input': 2048}]", "type": "BadRequestError", "param": null, "code": 400}


https://github.com/modelscope/evalscope/issues/244#issuecomment-2781337302

我遇到了相同的问题，麻烦大神帮忙看看 @Yunnglin 

main分支代码已修复该问题，是因为API服务不支持max_completion_tokens这个参数

感谢开发者的工作！

> main分支代码已修复该问题，是因为API服务不支持max_completion_tokens这个参数



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

> vllm的sampler速度比较慢 这个怎么理解？

这个问题最后结论是什么，能测出来和benchmark_serving一样快吗？怎么改的？

@baoqian426 可以测出和benchmark_serving差不多的结果，改为默认不进行采样

> [@baoqian426](https://github.com/baoqian426) 可以测出和benchmark_serving差不多的结果，改为默认不进行采样

temperature已经是0.0了，但还是比benchmark_serving慢70%，还有什么参数有影响吗


from evalscope.perf.main import run_perf_benchmark
from evalscope.perf.arguments import Arguments


def test_parallel_perf_deepseek_p1024(num:int):
    task_cfg = Arguments( parallel=[int(num)],
        number=[num],
        model='/workspace/model_zoo/DeepSeek-R1-tokenizer',
        url='http://127.0.0.1:8802/v1/completions',
        #n_choices=1,
        api_key='none',
        api='openai',
        dataset='random',
        min_tokens=1024,
        max_tokens=1024,
        prefix_length=0,
        min_prompt_length=1024,
        max_prompt_length=1024,
        stream=True,
        log_every_n_query=50,
        top_p=1.0,
        top_k=-1,
        temperature=0.0,
        swanlab_api_key="local",
        extra_args={'ignore_eos': True},
        tokenizer_path='/workspace/model_zoo/DeepSeek-R1-tokenizer',
        connect_timeout=600,
        read_timeout=600 )
    results = run_perf_benchmark(task_cfg)

if __name__ == "__main__":
    test_parallel_perf_deepseek_p1024(50)


vllm benchmark_serving
python3 benchmark_serving.py --host 0.0.0.0 --port 8806 --backend vllm --model /workspace/model_zoo/DeepSeek-R1-tokenizer --dataset-name random --num-prompts 50 --random-input-len 1024 --random-output-len 1024

@baoqian426 请加上下面的参数：

```
--extra-args '{"ignore_eos": true, "repetition_penalty":1.0}'
```

> [@baoqian426](https://github.com/baoqian426) 请加上下面的参数：
> 
> ```
> --extra-args '{"ignore_eos": true, "repetition_penalty":1.0}'
> ```

我同样的设置，但是跑出来的效率和VLLM的差异还是很大。请问还需要做什么调整吗。
```
{
    "model": "qwen3",
    "model_id": "qwen3",
    "attn_implementation": null,
    "api": "openai",
    "tokenizer_path": "/data/fffan/0_experiment/1_vllm/0_qwen3/Qwen/Qwen3-32B",
    "port": 8877,
    "url": "http://127.0.0.1:8802/v1/completions",
    "headers": {},
    "connect_timeout": 600,
    "read_timeout": 600,
    "api_key": null,
    "no_test_connection": false,
    "number": 360,
    "parallel": 180,
    "rate": -1,
    "sleep_interval": 5,
    "log_every_n_query": 100000,
    "debug": false,
    "wandb_api_key": null,
    "swanlab_api_key": "local",
    "name": null,
    "outputs_dir": "outputs_1009_512_128_nochat_2/20251009_191758/qwen3/parallel_180_number_360",
    "max_prompt_length": 512,
    "min_prompt_length": 512,
    "prefix_length": 0,
    "prompt": null,
    "query_template": null,
    "apply_chat_template": false,
    "image_width": 224,
    "image_height": 224,
    "image_format": "RGB",
    "image_num": 1,
    "image_patch_size": 28,
    "dataset": "random",
    "dataset_path": null,
    "frequency_penalty": null,
    "repetition_penalty": null,
    "logprobs": null,
    "max_tokens": 128,
    "min_tokens": 128,
    "n_choices": null,
    "seed": 0,
    "stop": null,
    "stop_token_ids": null,
    "stream": true,
    "temperature": 0.0,
    "top_p": null,
    "top_k": null,
    "extra_args": {
        "ignore_eos": true,
        "repetition_penalty": 1.0
    }
}

```

可以看一下这个文档 https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/vs_vllm_bench.html ，如何让 evalscope perf 与 vllm bench serve 在同一 vLLM 模型服务上输出一致的请求与统计指标