大语言模型的推理速度一直是推理服务关注的重点,一个良好的推理服务,应该保证在GPU高效运行的前提下,让不同长度、不同参数的请求时延均控制在合理的范围之内。另外,当今大语言模型种类繁多,在不同的领域下,其回答质量具有明显差距,用户挑选一个适合自己领域需求,并且推理速度可以接受的模型也尤为重要。基于此,本项目提出了一个基于python的大语言模型推理服务自动化测试框架,用于评估大语言模型的推理效果以及性能,具有易用性、易拓展性、高效性和可靠性等特点。
- 易用性:用户可通过配置文件的编写,一键式实现对多prompt文件及多模型的测试。框架会将生成结果自动归档,并对测试结果生成多个总结表格,评测模型效果及性能。
- 易拓展性:不同的功能(如数据加载、模型测试、结果分析等)采用模块化设计,方便定制和扩展,这使得框架只需少量更改便可支持不同种类的多模态模型。
- 高效性和可靠性:框架支持多prompt文件和多模型的并行化处理,大大提升测试效率,并提供了完善的错误检测和报告系统,能帮助用户快速定位问题。
- 多prompt文件多模型测试:支持同时测试多个prompt文件和多个模型,便于性能对比。
- 灵活配置:通过
config.json
文件灵活配置模型路径、URL、API密钥等参数。 - 统一输出格式:测试结果按模型和输入分类存储,支持后续自动化分析。
- 表格总结功能:自动生成表格汇总测试结果,便于性能对比和分析。
- GPU监控支持:提供对模型运行时GPU使用情况的监控和记录。
- 视觉大语言模型支持(BETA): 提供本地部署视觉大语言模型的自动化测试
-
克隆项目到本地服务器:
git clone https://github.com/noc-turne/testing_pipeline.git cd testing_pipeline
-
安装所需依赖
pip install -r requirements-server.txt
-
验证是否安装成功
vllm serve 本地模型路径
-
克隆项目到本地服务器:
git clone https://github.com/noc-turne/testing_pipeline.git cd testing_pipeline
-
安装所需依赖
pip install -r requirements-client.txt
config.json
配置文件包含以下主要字段:
load_path
: Prompt文件的输入路径。save_path
: 测试结果的输出路径。save_response
: bool值(可选, 默认为true),是否需要输出每个prompt的模型运行结果的json文件summary
: 字典类型(可选, 默认均为true), 其中包含三个键model_summary,file_summary和response_summary, 其值为bool, 用于是否输出的对应的summary文件,对应的summary文件示例可查看表格总结功能model_config
: 字典类型(可选, 默认为空), 发送请求时的具体配置, 包括max_completion_tokens, temperature, top-p等, 应用于所有模型, 具体配置内容可参考(https://platform.openai.com/docs/api-reference/chat/object)models
: 模型列表,每个模型包含:name
: 模型路径,与vLLM
服务路径一致, 不可以重名。url
: 模型的IP地址与端口,并在开头加上"http://"。api_key
: (可选)远端API的密钥。gpu_url
: (可选)GPU监控的API地址,用于获取GPU使用信息。gpu_interval
: int类型(可选, 默认为3), GPU信息采样间隔时间,单位为秒。
示例:
{
"load_path": "examples/prompts",
"save_path": "examples/res",
"save_response": true,
"summary": {
"model_summary": true,
"file_summary": true,
"response_summary": true
},
"model_config": {"max_completion_tokens": 100},
"models": [
{
"name": "llama-3.3-70B-instruct",
"url": "http://xxx.xxx.xxx.xxx:xxxx",
"gpu_url": "http://xxx.xxx.xxx.xxx:xxxx",
"gpu_interval": 3
},
{
"name": "deepseek-chat",
"url": "https://api.deepseek.com",
"api_key": "sk-token123"
}
]
}
Prompt文件为一个JSON列表,每个元素包含以下字段:
role
: 交互角色(如user
或assistant
)。content
: 交互内容。
示例:
[
{"role": "user", "content": "If I say HHH, you answer KKK back to me!"},
{"role": "assistant", "content": "understood"},
{"role": "user", "content": "HHH"}
]
-
服务端通过vllm部署模型网络接口,具体部署参数可详见(https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html)。
vllm serve 本地模型路径
-
服务端启动GPU监控脚本(如果需要),具体可见GPU监控支持:
python gpu_monitor.py
-
将需要测试的prompts整理成一个文件夹如
examples/prompts
。 -
客户端配置
config.json
文件。 -
客户端运行测试脚本。
python start_testing.py
测试结果按以下结构存储:
save_path/
├── prompt1/
│ ├── res_of_model1.json
│ └── res_of_model2.json
├── prompt2/
│ ├── res_of_model1.json
│ └── res_of_model2.json
├── gpu_info/
│ ├── res_of_model1.txt
│ └── res_of_model2.txt
├── file_summary_table.xlsx
├── model_summary_table.xlsx
├── response_summary_table.xlsx
每个prompt的具体输出如下所示, 可通过配置文件中的save_response选择是否输出:
{
"file": "prompt1.txt",
"model": "llama-3.3-70B-instruct",
"model_url": "http://xxx.xxx.xxx.xxx:xxxx",
"start_time": "2024-12-27T16:09:53.610822",
"prompt": [
{
"role": "user",
"content": "If I say HHH, you answer KKK back to me!"
},
{
"role": "assistant",
"content": "understood"
},
{
"role": "user",
"content": "HHH"
}
],
"end_time": "2024-12-27T16:09:54.072932",
"elapsed_time": 0.46211,
"prompt_token_len": 63,
"decode_token_len": 3,
"response": {
"role": "assistant",
"content": "KKK",
"tool_calls": []
}
}
程序会生成多个表格,用于对测试结果进行汇总分析。
文件总结表格(file_summary_table.xlsx)结构示例如下:
Prompt | Model | Prompt Token Length | Decode Token Length | Elapsed Time(s) | Decode Speed(Token/s) |
---|---|---|---|---|---|
prompt1.txt | llama-3.3-70B-instruct | -1 | -1 | -1 | -1 |
deepseek-chat | 23 | 2 | 0.85 | 2.35 | |
prompt2.txt | llama-3.3-70B-instruct | -1 | -1 | -1 | -1 |
deepseek-chat | 23 | 2 | 0.94 | 2.13 |
模型总结表格(model_summary_table.xlsx)结构示例如下:
Model | Total Prompt Tokens | Total Decode Tokens | Total Runtime(s) | Decode Speed(Token/s) |
---|---|---|---|---|
llama-3.3-70B-instruct | -1 | -1 | -1 | -1 |
deepseek-chat | 115255 | 18673 | 29.38 | 635.56 |
回答表格(response_summary_table.xlsx) 结构示例如下:
Prompt | Model | Response |
---|---|---|
prompt1.txt | llama-3.3-70B-instruct | KKK |
deepseek-chat | KKK | |
prompt2.txt | llama-3.3-70B-instruct | ### The Future of Artificial Intelligence in Education ... |
deepseek-chat | # The Future of Artificial Intelligence in Education ... |
总结表格存储在save_path
目录下,文件格式为.xlsx
,方便使用Excel或其他工具查看。
本工具支持在测试过程中对模型运行的GPU使用情况进行实时监控,记录每个模型的GPU负载和显存使用情况,方便用户分析模型性能表现。
- 在服务端运行gpu_monitor.py, 开放网络接口,使得当前测试端可以获取到服务端的gpu信息
python gpu_monitor.py
- 在
config.json
文件中配置每个模型的gpu_url
和gpu_interval
。gpu_url
:获取GPU使用信息的API地址。gpu_interval
:采样间隔时间(秒)。
- 测试脚本启动后,工具会根据配置定期从
gpu_url
拉取GPU使用信息。 - GPU信息按模型存储在
save_path/gpu_info
目录下,文件名为<模型名称>_<时间戳>.txt
。
以下是GPU监控记录的输出示例:
Current Time: 20241224_120000
GPU 0 (NVIDIA A100):
GPU Utilization: 75%
Memory Utilization: 60%
Memory: 24300 MiB / 40000 MiB
GPU 1 (NVIDIA A100):
GPU Utilization: 65%
Memory Utilization: 55%
Memory: 22000 MiB / 40000 MiB
Current Time: 20241224_121000
GPU 0 (NVIDIA A100):
GPU Utilization: 80%
Memory Utilization: 60%
Memory: 24300 MiB / 40000 MiB
GPU 1 (NVIDIA A100):
GPU Utilization: 75%
Memory Utilization: 55%
Memory: 22000 MiB / 40000 MiB
每次采样的时间戳和每张GPU的利用率、显存利用率、以及显存使用情况均会记录,便于后续分析。
具体信息可见vlm测试
- 确保模型路径正确,且目录中包含必要的模型文件。
- 确保config文件中模型name与vllm serve中的模型名称一致
- 检查
config.json
文件是否正确配置。 - 确认Prompt文件格式是否符合要求。
- 根据报错信息检查服务器模型端口是否可以被访问
- 在
config.json
中增加新的模型配置,并确保其name
和url
与实际部署一致。
- 所有时间(如
elapsed_time
)均以秒为单位,方便性能分析。
-1
表示对应字段无效,例如模型未成功解码Token或响应时间超时。
如果有更多问题,请提交到Issues页面。