Repository: modelscope/evalscope
Issue: 模型推理性能压测时，请求数更多的情况下TTFT更小
Root cause: Documentation Deficiency

## 自查清单

在提交 issue 之前，请确保您已完成以下步骤:
- [x] 我已仔细阅读了[相关使用说明文档](https://evalscope.readthedocs.io/zh-cn/latest/get_started/parameters.html)
- [x] 我已查看了[常见问题解答](https://evalscope.readthedocs.io/zh-cn/latest/get_started/faq.html)
- [x] 我已搜索并查看了现有的 issues，确认这不是一个重复的问题

## 问题描述

在相同输入Token、输出Token、并发数的情况下，请求数较大的TTFT反而比较小（推理结果见最下方）


## EvalScope 版本（必填）
0.16.1

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


## 执行的代码或指令

```bash
# 输入Token 2048，输出Token 2048，并发数 1024，请求数 1024
evalscope perf \
  --parallel 1024 \
  --number 1024 \
  --model deepseek-r1 \
  --url http://127.0.0.1:30000/v1/chat/completions \
  --api openai \
  --dataset openqa \
  --max-tokens 2048 \
  --max-prompt-length 2048

# 输入Token 2048，输出Token 2048，并发数 1024，请求数 2048
evalscope perf \
  --parallel 1024 \
  --number 2048 \
  --model deepseek-r1 \
  --url http://127.0.0.1:30000/v1/chat/completions \
  --api openai \
  --dataset openqa \
  --max-tokens 2048 \
  --max-prompt-length 2048
```

## 错误日志
无报错。


## 运行环境

- 操作系统：Ubuntu 22.04.5 LTS
- Python版本：3.10.12
- 显卡：H20 * 8 （H20单卡144G显存）
- 模型推理引擎：Sglang v0.4.7.post1
- 模型：DeepSeek R1 671B (https://modelscope.cn/models/deepseek-ai/DeepSeek-R1)

## 其他信息

Sglang 启动模型命令：
```bash
docker run -itd --name sglang_ws --privileged --shm-size 1024g --ipc=host --gpus all --network=host \
    -v /deepseek-r1:/deepseek-r1 \
    -v /etc/localtime:/etc/localtime \
    lmsysorg/sglang:v0.4.7.post1-cu124 \
    python3 -m sglang.launch_server \
      --model-path /deepseek-r1/DeepSeek-R1 \
      --served-model-name deepseek-r1 \
      --trust-remote-code \
      --tp 8 --dp 4 \
      --host 0.0.0.0 --port 30000 \
      --enable-dp-attention \
      --max-prefill-tokens 2048 \
      --max-running-requests 2048 \
      --disable-radix-cache \
      --mem-fraction-static 0.85 \
      --chunked-prefill-size=16384 \
      --schedule-conservativeness 0.01 \
      --cuda-graph-max-bs=160 \
      --stream-output
```

推理结果(对模型进行多次测试都是这样的结果)：
输入Token | 输出Token | parallel 并发数 | number 请求数 | TTFT(s) | TPOT(s) | throughout(tokens/s)
-- | -- | -- | -- | -- | -- | --
2048 | 2048 | 1024 | 1024 | 3.0696 | 0.235 | 3138.63
2048 | 2048 | 1024 | 2048 | 1.9735 | 0.2659 | 3210.94






建议使用random数据集再测试一下，可以固定输入prompt的长度，例如100

参考使用文档：https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/examples.html#random

> 建议使用random数据集再测试一下，可以固定输入prompt的长度，例如100
> 
> 参考使用文档：https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/examples.html#random

使用random数据集又进行了两次测试，相同输入Token、输出Token、并发数的情况下，请求数较大的TTFT更长了一些，结果看上去比较符合常理了

使用的命令如下：
```bash
evalscope perf \
  --parallel 1024 \
  --number 1024 \
  --model deepseek-r1 \
  --url http://127.0.0.1:30000/v1/chat/completions \
  --api openai \
  --dataset random \
  --tokenizer-path /deepseek-r1/DeepSeek-R1 \
  --min-tokens 2048 \
  --max-tokens 2048 \
  --min-prompt-length 2048 \
  --max-prompt-length 2048
```

两次结果如下

第一次：
输入Token | 输出Token | parallel 并发数 | number 请求数 | TTFT(s) | TPOT(s) | throughout(tokens/s)
-- | -- | -- | -- | -- | -- | --
2048 | 2048 | 1024 | 1024 | 74.9832 | 0.2793 | 1512.58
2048 | 2048 | 1024 | 2048 | 76.1951 | 0.2813 | 1056.29

第二次：

输入Token | 输出Token | parallel 并发数 | number 请求数 | TTFT(s) | TPOT(s) | throughout(tokens/s)
-- | -- | -- | -- | -- | -- | --
2048 | 2048 | 1024 | 1024 | 76.1544 | 0.2813 | 1497.4
2048 | 2048 | 1024 | 2048 | 76.1894 | 0.2813 | 1056.5212


### ‼️重要问题‼️
在这次测试过程中出现了新的问题，请求数量为2048时，出现了如下截图中的报错信息，这样的报错信息是否会对测试结果有影响？

![Image](https://github.com/user-attachments/assets/6af75970-b4f5-45fd-bd7f-03a2a0754e3a)

![Image](https://github.com/user-attachments/assets/c7590dfb-fc26-491d-bb0a-c02f2e1e4ac2)





测试结果中会记录失败的请求个数，这些请求不参与指标计算

更换了数据集之后，测试下来结果看上去正常一些了，请问下这个原因是什么呢？

openqa 数据集结果：

输入Token | 输出Token | parallel 并发数 | number 请求数 | TTFT(s) | TPOT(s) | throughout(tokens/s)
-- | -- | -- | -- | -- | -- | --
1024 | 256 | 640 | 1280 | 1.7642 | 0.236 | 2892.5728
1024 | 256 | 768 | 1536 | 2.2261 | 0.2396 | 3408.2838
1024 | 256 | 896 | 1792 | 2.7288 | 0.2411 | 3928.2077
1024 | 256 | 1024 | 1024 | 3.5352 | 0.2412 | 4375.4391
1024 | 256 | 1024 | 2048 | 2.4708 | 0.2411 | 4497.9


random 数据集结果：

输入Token | 输出Token | parallel 并发数 | number 请求数 | TTFT(s) | TPOT(s) | throughout(tokens/s)
-- | -- | -- | -- | -- | -- | --
1024 | 256 | 640 | 1280 | 27.6056 | 0.3373 | 7298.701
1024 | 256 | 768 | 1536 | 32.481 | 0.3627 | 7963.8961
1024 | 256 | 896 | 1792 | 37.6245 | 0.3819 | 8603.9266
1024 | 256 | 1024 | 1024 | 45.092 | 0.411 | 8849.1339
1024 | 256 | 1024 | 2048 | 44.2159 | 0.4106 | 8897.238



openqa 数据集的每个数据的prompt长度不一，要对比TTFT建议在相同的prompt长度下进行测试

> openqa 数据集的每个数据的prompt长度不一，要对比TTFT建议在相同的prompt长度下进行测试

请问下，使用下面两种方式执行可以满足你说的这个「要对比TTFT建议在相同的prompt长度下进行测试」吗？另外这两种方式执行起来得到的结果应该是一致的吧

命令行：
```bash
evalscope perf \
  --parallel 1024 \
  --number 1024 \
  --model deepseek-r1 \
  --url http://127.0.0.1:30000/v1/chat/completions \
  --api openai \
  --dataset random \
  --tokenizer-path /deepseek-r1/DeepSeek-R1 \
  --min-tokens 2048 \
  --max-tokens 2048 \
  --min-prompt-length 2048 \
  --max-prompt-length 2048
```

python：
```python
from evalscope.perf.main import run_perf_benchmark
from evalscope.perf.arguments import Arguments

task_cfg = Arguments(
    parallel=[1024],
    number=[1024],
    model=model,
    url=url,
    tokenizer_path="/deepseek-r1/DeepSeek-R1",
    api='openai',
    # dataset='openqa',
    dataset='random',
    min_tokens=2048,
    max_tokens=2048,
    min_prompt_length=2048,
    max_prompt_length=2048,
)

result = run_perf_benchmark(task_cfg)
```

1. 这个配置固定了prompt长度为2048，是相同的prompt长度
2. 这两种方法是一样的，底层是同一个方法

谢谢