Repository: modelscope/evalscope
Issue: 数据库写入不进去
Root cause: Resource Mishandling

程序跑完之后，一直卡住，没有调用API，也没有写入数据库。

wandb 调用成功，数据库创建成果，但是数据库没有写入任何数据。

请用具体的执行命令是什么，可以的话也提供一下输出


<img width="1157" alt="image" src="https://github.com/user-attachments/assets/a9dde3b5-0ffc-4913-9f6a-8e7fa0e3f376">

一直卡在图示所在的最后一个返回日志里面，然后我用ctrl + c 退出之后，出现写入数据库的日志和下面的退出日志

卡住最久等了三个小时 都没写入结束。数据库一直为空。


执行指令：
evalscope perf --model llama2_7b_chat --parallel 64        --url 'http://127.0.0.1:8000/v1/completions'    --api "custom" --dataset openqa         --query-template '{"model": "%m", "prompt":"%p", "max_tokens": 1024, "temperature": 0.7}'       --dataset-path /home/workspace/oldcat/data/HC3-Chinese/open_qa.jsonl --wandb-api-key xxx  --debug


<img width="1160" alt="image" src="https://github.com/user-attachments/assets/c8bcb52a-9a57-4628-940b-ce8eee48f948">
<img width="1142" alt="image" src="https://github.com/user-attachments/assets/ff1da1a5-d20d-4faa-878a-b390f94857a9">

xian za现在我刚刚重新运行的卡住的状态，两个模型相同的指令。

![image](https://github.com/user-attachments/assets/0701d190-d4e6-473a-b9a2-d7d28dd4efc2)


有任何进展么？方便问一下是什么情况导致的？

目前看来可能是 costum_api.py 文件中 parse_responses 的解析错误，我们正在讨论修复方案。

您也可以尝试以下方法解决：
1. 如果您需要自定义 Custom API 的 Response 格式，请确保 parse_responses 函数能够正确解析 Token 数量。
2. 如果您指定 --api "custom" 只是为了应用 query-template，您可以参考下面的方法：
2.1. 如果您使用的 Response 方式是 OpenAI 形式，您可以用 openai_api.py 中的 parse_responses 函数来替换 costum_api.py 文件的 parse_responses 函数。
2.2. 如果您使用的 Response 方式是 DashScope 形式，您可以用 dashscope_api.py 中的 parse_responses 函数来替换 costum_api.py 文件的 parse_responses 函数。
2.3. 使用标准的 OpenAI API 形式设置 query-template，您可以参考[官网](https://platform.openai.com/docs/api-reference/chat/create)或者以下示例：
```bash
evalscope perf --model llama2_7b_chat --parallel 64 \
--url 'http://127.0.0.1:8000/v1/chat/completions' --dataset openqa \
--query-template '{"model": "%m", "messages": [], "max_tokens": 1024, "temperature": 0.7}' \
--dataset-path ./open_qa.jsonl \
--wandb-api-key xxx \
--debug
```

好的，感谢，想请教一下我自己修改的api 的文件 我该具体如何操作，才能让perf工具访问到？ 

我是用的是vllm 作为推理后端，里面是使用prompt作为输入语句的。我该如何修改变量，我将openai api的response函数拷贝过去 还是一样卡住。

我是直接用openai 的api 解析 依旧出现同样的情况。

如果您使用 vLLM 作为推理后端，那么您可以直接使用 OpenAI 格式的 API 解析。参考：
```bash
evalscope perf --model llama2_7b_chat --parallel 64 \
--url 'http://127.0.0.1:8000/v1/chat/completions' --dataset openqa \
--query-template '{"model": "%m", "messages": [], "max_tokens": 1024, "temperature": 0.7}' \
--dataset-path ./open_qa.jsonl \
--wandb-api-key xxx \
--debug
```
从您上文提供的命令来看，需要修改的变量是 `--api` 和 `--query-template`。

如果您自定义 API，您可以参考 EvalScope 文档的[相关设置](https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test.html#id11)构建源码，再从源码安装 EvalScope。


> 如果您使用 vLLM 作为推理后端，那么您可以直接使用 OpenAI 格式的 API 解析。参考：
> 
> ```shell
> evalscope perf --model llama2_7b_chat --parallel 64 \
> --url 'http://127.0.0.1:8000/v1/chat/completions' --dataset openqa \
> --query-template '{"model": "%m", "messages": [], "max_tokens": 1024, "temperature": 0.7}' \
> --dataset-path ./open_qa.jsonl \
> --wandb-api-key xxx \
> --debug
> ```
> 
> 从您上文提供的命令来看，需要修改的变量是 `--api` 和 `--query-template`。
> 
> 如果您自定义 API，您可以参考 EvalScope 文档的[相关设置](https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test.html#id11)构建源码，再从源码安装 EvalScope。

是的，我是用这个之后出现的现在是相同的问题。 是不是新版做了什么调整？ 我一个月前使用都是正常的

![image](https://github.com/user-attachments/assets/bb2bc488-5b89-4b1d-8491-8f20f65f6935)


可以在上面图片中看到，指令在执行中（被卡住）

<img width="1153" alt="image" src="https://github.com/user-attachments/assets/7ba73ffc-083d-4e52-a46f-688885942b59">
输出结果卡到如上所示的位置 半天不动了。



![image](https://github.com/user-attachments/assets/8a2f73c5-121e-440c-9f29-5afa2a0ba021)
docker日志如上。



我采用了你说的这些调用方式 但是依旧无法存储数据库。

能否麻烦帮忙答疑解惑一下，卡住很久了

理解您着急的心情，我们在尝试复现。目前我们测试了最近两个版本的 EvalScope ，使用 OpenAI API 并没有遇到该问题，您的版本是？


python 3.10 
Name: evalscope
Version: 0.5.5
Summary: EvalScope: Lightweight LLMs Evaluation Framework
Home-page: https://github.com/modelscope/evalscope
Author: ModelScope team
Author-email: contact@modelscope.cn
License: 
Location: /mnt/nvme/nvme0/workspace/miniconda/envs/evalscope/lib/python3.10/site-packages
Requires: absl-py, accelerate, cachetools, datasets, editdistance, jieba, jsonlines, matplotlib, modelscope, nltk, openai, pandas, plotly, pyarrow, pympler, pyyaml, regex, requests, requests-toolbelt, rouge-chinese, rouge-score, sacrebleu, scikit-learn, seaborn, sentencepiece, simple-ddl-parser, tabulate, tiktoken, torch, tqdm, transformers, transformers-stream-generator
Required-by: 

python 3.8 torch 2.1
Name: vllm
Version: 0.4.0+cu116
Summary: A high-throughput and memory-efficient inference and serving engine for LLMs
Home-page: https://github.com/vllm-project/vllm
Author: vLLM Team
Author-email: 
License: Apache 2.0
Location: /opt/conda/lib/python3.8/site-packages
Requires: cmake, fastapi, ninja, numpy, prometheus-client, psutil, py-cpuinfo, pydantic, ray, requests, sentencepiece, tiktoken, transformers, uvicorn
Required-by: 


> 理解您着急的心情，我们在尝试复现。目前我们测试了最近两个版本的 EvalScope ，使用 OpenAI API 并没有遇到该问题，您的版本是？



目前看来，您的环境是没有问题的，我们也无法复现该问题。您是否修改过 EvalScope 的源码？

上文我们发现的问题是在 evalscope/perf/http_client.py 文件的 statistic_benchmark_metric_worker 函数中 407 行：
`avg_time_per_token = total_time / n_total_completion_tokens` 可能出现 ZeroDivisionError: float division by zero，导致直接退出循环，陷入无结束的等待。

而出现 ZeroDivisionError 的原因是 evalscope/perf/custom_api.py 的 parse_responses 无法解析 OpenAI 格式的 Response，导致 n_total_completion_tokens 取值为 0。

能否请您检查一下，您遇到的是否是上述原因导致的问题？

我一开始没有修改过源代码，直接使用openai的api格式也不行。然后在custom里面将response的代码替换成openai里面的也不行

通过错误以及增加日志排查 发现是statistic_benchmark_metric_worker benchmark_data_queue.task_done()卡住 无法继续执行。可能是什么原因？

> 上文我们发现的问题是在 evalscope/perf/http_client.py 文件的 statistic_benchmark_metric_worker 函数中 407 行：
avg_time_per_token = total_time / n_total_completion_tokens 可能出现 ZeroDivisionError: float division by zero，导致直接退出循环，陷入无结束的等待。

那么看起来，您遇到的就是这个问题，能否请您排查：

```python
            n_query_prompt_tokens, n_query_completion_tokens = api_plugin.parse_responses(
                benchmark_data["response_messages"], 
                request=benchmark_data["request"])
```

这一部分返回值是否正常？

> > 上文我们发现的问题是在 evalscope/perf/http_client.py 文件的 statistic_benchmark_metric_worker 函数中 407 行：
> > avg_time_per_token = total_time / n_total_completion_tokens 可能出现 ZeroDivisionError: float division by zero，导致直接退出循环，陷入无结束的等待。
> 
> 那么看起来，您遇到的就是这个问题，能否请您排查：
> 
> ```python
>             n_query_prompt_tokens, n_query_completion_tokens = api_plugin.parse_responses(
>                 benchmark_data["response_messages"], 
>                 request=benchmark_data["request"])
> ```
> 
> 这一部分返回值是否正常？

代码没走到这一步，在try except里面就卡住了

能看看您添加日志的位置和日志的输出吗？

请拉取最新的main分支代码，尝试重新运行

> 由于长时间未收到活动，我们将关闭此问题。如果您有任何疑问，请随时重新打开它。如果EvalScope对您有所帮助，欢迎给我们点个STAR以示支持，谢谢！