场景
给用户提供千帆标准的压测工具(千帆SDK)。满足以下使用场景:
-
测试sft模型部署到算力单元后,实际的性能效果
-
对比模型压缩后的性能效果
-
测试预置服务的性能
压测数据准备(数据格式规范说明)
可用于stress_test的数据集目前支持以下三种格式:
jsonl格式示例(兼容千帆data数据集格式)
千帆data数据集导出,可直接用于压测
这种格式主要用于多轮对话的场景,其中一个括号就是一段对话。最后的response回答字段会在输入中被忽略
[{"prompt": "请根据下面的新闻生成摘要, 内容如下:新华社受权于18日全文播发修改后的《中华人民共和国立法法》,修改后的立法法分为“总则”“法律”“行政法规”“地方性法规、自治条例和单行条例、规章”“适用与备案审查”“附则”等6章,共计105条。\n生成摘要如下:"}]
[{"prompt": "请根据下面的新闻生成摘要, 内容如下:一辆小轿车,一名女司机,竟造成9死24伤。日前,深圳市交警局对事故进行通报:从目前证据看,事故系司机超速行驶且操作不当导致。目前24名伤员已有6名治愈出院,其余正接受治疗,预计事故赔偿费或超一千万元。\n生成摘要如下:"}]
[{"prompt": "请根据下面的新闻生成摘要, 内容如下:新华社受权于18日全文播发修改后的《中华人民共和国立法法》,修改后的立法法分为“总则”“法律”“行政法规”“地方性法规、自治条例和单行条例、规章”“适用与备案审查”“附则”等6章,共计105条。\n生成摘要如下:"}]
[{"prompt": "请根据下面的新闻生成摘要, 内容如下:一辆小轿车,一名女司机,竟造成9死24伤。日前,深圳市交警局对事故进行通报:从目前证据看,事故系司机超速行驶且操作不当导致。目前24名伤员已有6名治愈出院,其余正接受治疗,预计事故赔偿费或超一千万元。\n生成摘要如下:"}]
json格式示例
[
{"prompt": "地球的自转周期是多久?", "response": "大约24小时"},
{"prompt": "人类的基本单位是什么?", "response": "人类"}
]
txt格式示例
最简单的数据集格式,降低用户数据整理成本
人体最重要的有机物质是什么?
化学中PH值用来表示什么?
第一个登上月球的人是谁?
启动压测
前置说明
如果用户想要对大模型服务进行性能测试,需要在导入 qianfan
模块之前设置环境变量 QIANFAN_ENABLE_STRESS_TEST
为 true
然后准备好测试用的数据集。数据集就绪后,可调用数据集的stress_test接口启动压测任务。
如果使用macbook压测,需要先命令行设置环境变量: export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
方法参数说明
认证参数
认证方式 | 参数名 | 参数类型 | 是否必须 | 参数描述 |
千帆应用认证 | os.environ["QIANFAN_AK"] = "" | str | 二选一 | 千帆控制台-应用接入-创建的应用AK,IAM认证和千帆应用认证二选一 优势:如果要使用去安全等级压测,建议使用千帆应用认证,因为开白是基于千帆应用appid开白。 劣势:只能调用千帆的推理接口API,无法调用千帆的管控面OpenAPI |
os.environ["QIANFAN_SK"] = "" | str | 千帆控制台-应用接入-创建的应用SK | ||
百度智能云IAM认证 | os.environ["QIANFAN_ACCESS_KEY"] = "" | str | 二选一 | 百度智能云IAM的AccessKey,IAM认证和千帆应用认证二选一 优势:即可以调用千帆的推理接口API,也可以调用千帆的管控面OpenAPI |
os.environ["QIANFAN_SECRET_KEY"] = "" | str | 百度智能云IAM的SecretKey |
输入数据集参数
参数名 | 参数类型 | 是否必须 | 参数描述 |
ds = Dataset.load(data_file="./stress_test_data.jsonl") | str | 是 | 压测数据集,支持前面章节提到的三种数据格式:
|
stress_test参数
参数名 | 参数类型 | 是否必须 | 参数描述 |
users | int | 是 | 建议值:100。指定发压使用的总user数,也就最终的发压并发数。users必须大于等于worker数目;每个worker负责模拟${users}/${workers}个虚拟用户; |
workers | int | 是 | 建议值:10。指定发压使用的worker数目,每个worker为1个进程; |
spawn_rate | int | 是 | 建议值:5。指定每秒真实启动的user数目,一直增长到users大小以后,不再新增启动。 |
runtime | str | 否 | 指定发压任务的最大运行时间,格式为带时间单位的字符串,例如(300s, 20m, 3h, 1h30m);压测任务启动后会一直运行到数据集内所有数据都请求完毕,或到达该参数指定的最大运行时间;该参数默认值为'0s',表示不设最大运行时间; |
model_type | str | 否 | 指定被测服务的模型类型。 目前只支持'ChatCompletion'与'Completion'两类;默认值为'ChatCompletion'; 目前千帆大部分模型都是ChatCompletion类型,所以此参数可以不用设置。 |
endpoint | str | 否 | 推荐使用 指定需要压测服务的url路径。该参数与model只能指定一个; 定制服务只能用endpoint。 服务的endpoint,也是uri地址。
|
model | str | 否 | 指定需要压测服务的模型名称。该参数与endpoint只能指定一个; |
hyperparameters | Optional[Dict[str, Any]] | 否 |
|
完整调用示例
安装千帆sdk
注意,python版本需要大于3.7,建议3.8以上版本
pip install -U qianfan["dataset_base"]
pip install -U qianfan["dataset_base"]
执行压测代码
这个调用示例包含全参数,在上面的表格当中说明了哪些是必填的。用户实际可以不需要填写全部
import os
os.environ['QIANFAN_ENABLE_STRESS_TEST'] = "true"
from qianfan.dataset import Dataset
# 接口调用认证,以下方式二选一
# iam认证
os.environ["QIANFAN_ACCESS_KEY"] = "百度智能云IAM的AccessKey"
os.environ["QIANFAN_SECRET_KEY"] = "百度智能云IAM的SecretKey"
# 千帆应用认证
os.environ["QIANFAN_AK"] = "千帆控制台-应用接入-创建的应用AK"
os.environ["QIANFAN_SK"] = "千帆控制台-应用接入-创建的应用SK"
# 需要初始化一个数据集对象
ds = Dataset.load(data_file="./stress_test_data.jsonl")
ds.stress_test(
users=100,
workers=10,
spawn_rate=5,
# model="ERNIE-Bot3.5-8K",
endpoint="hfleeyco_test_0703", # 可选参数
model_type="ChatCompletion", # 可选参数
runtime="15m", # 可选参数
hyperparameters={"temperature":0.9} # 可选参数
)
workers:启动10个进程来模拟并发请求
users:总模拟并发100
spawn_rate:每秒新增5个,一直增加到100个以后,不再新增, 后续从第11s开始,全部都按照100并发发压。
报告解读
控制台输出压测结果
[2024-07-11 14:11:15,009] [INFO] run completed.
[2024-07-11 14:11:15,018] [INFO] Log path: record/20240711T135612Z/run.log
[2024-07-11 14:11:15,020] [INFO] Load Test Statistics
QPS: 3.59
RPM: 215.4
Latency Avg: 25.47
Latency Min: 0.28
Latency Max: 46.75
Latency 50%: 24.94
Latency 80%: 30.82
FirstTokenLatency Avg: 19.06
FirstTokenLatency Min: 0.09
FirstTokenLatency Max: 27.32
FirstTokenLatency 50%: 19.27
FirstTokenLatency 80%: 21.73
InputTokens Avg: 354.86
OutputTokens Avg: 163.42
TotalQuery: 10000
SuccessQuery: 9891
FailureQuery: 109
TotalTime: 902.61
SuccessRate: 98.91%
数据整理
并发 | QPS | Latency | FirstTokenLatency | InputTokens | OutputTokens | SuccessRate | ||||||||
avg | min | max | 50% | 80% | avg | min | max | 50% | 80% | avg | avg | |||
100 | 3.59 | 25.47 | 0.28 | 46.75 | 24.94 | 30.82 | 19.06 | 0.09 | 27.32 | 19.27 | 21.73 | 354.86 | 163.42 | 98.91 |
指标意义
-
并发:客户端的并发发压请求数量。
-
QPS:服务每秒平均处理的请求数;模型真实qps响应。
-
Latency min/max/avg/50p/80p:请求完整时延的最小值/最大值/平均值/50分位值/80分位值;
-
FirstTokenLatency min/max/avg/50p/80p:请求首字(或首句)时延的最小值/最大值/平均值/50分位值/80分位值;
-
PromptTokens avg:平均每条query输入token长度;
-
OutputTokens avg:平均每条query输出token长度;
-
SuccessRate:请求成功率;
注1:除SuccessRate外其余指标统计时均剔除了失败或异常请求;
注4:Token吞吐可以使用(OutputTokens avg+InputTokens avg)*QPS
相乘来计算;【也有说用OutputTokens avg和QSP相乘
来作为吞吐】
并发 | TPS | QPS | Latency | FirstTokenLatency | InputTokens | OutputTokens | SuccessRate | ||||||||
avg | min | max | 50% | 80% | avg | min | max | 50% | 80% | avg | avg | ||||
24 | =3.52*(354.66+164.46) =1827 | 3.52 | 6.69 | 0.13 | 27.35 | 5.5 | 11.24 | 0.2 | 0.06 | 1.65 | 0.11 | 0.21 | 354.66 | 164.46 | 98.99 |
Locust可视化压测报告
压测完毕,在本地目录下会有record日志
找到report.html打开查看压测数据
报表化压测报告
在record目录下找到performance_table.html
打开performance_table.html查看压测表格数据
示例如下:
云端调用统计查看压测数据
多轮压测
在前面给出了单轮压测指南,单轮压测主要是固定一个并发数进行压测。
当用户希望一次压测任务测试不同并发下的qps,可以使用multi_stress_test进行多轮压测,然后通过performance_table.html查看不同并发下的qps
multi_stress_test参数
参数名 | 参数类型 | 是否必须 | 参数描述 |
origin_users | int | 是 | 建议值:100。指定发压使用的初始用户数,也就最终的发压并发数。origin_users必须大于等于worker数目;每个worker负责模拟${users}/${workers}个虚拟用户; |
workers | int | 是 | 建议值:10。指定发压使用的worker数目,每个worker为1个进程; |
spawn_rate | int | 是 | 建议值:5。指定每秒真实启动的user数目,一直增长到users大小以后,不再新增启动。 |
rounds | int | 是 | 指定压测轮数;multi_stress_test多轮压测场景必填 |
interval | int | 是 | 指定压测轮之间的加压并发数;multi_stress_test多轮压测场景必填。比如interval=2,则在第1轮压测结束后,会在第2轮开始时,额外启动两个user的并发,以此类推; |
first_latency_threshold | float | 否 | 指定首句时延的阈值,超过该阈值会停止在本轮压测,单位为秒; |
round_latency_threshold | float | 否 | 指定全长时延的阈值,超过该阈值会停止在本轮压测,单位为秒; |
success_rate_threshold | float | 否 | 指定请求成功率的阈值,低于该阈值会停止在本轮压测,单位为百分比; |
runtime | str | 否 | 指定发压任务的最大运行时间,格式为带时间单位的字符串,例如(300s, 20m, 3h, 1h30m);压测任务启动后会一直运行到数据集内所有数据都请求完毕,或到达该参数指定的最大运行时间;该参数默认值为'0s',表示不设最大运行时间; |
model_type | str | 否 | 指定被测服务的模型类型。 目前只支持'ChatCompletion'与'Completion'两类;默认值为'ChatCompletion'; 目前千帆大部分模型都是ChatCompletion类型,所以此参数可以不用设置。 |
endpoint | str | 否 | 推荐使用 指定需要压测服务的url路径。该参数与model只能指定一个; 定制服务只能用endpoint。 服务的endpoint,也是uri地址。
|
model | str | 否 | 指定需要压测服务的模型名称。该参数与endpoint只能指定一个; |
hyperparameters | Optional[Dict[str, Any]] | 否 |
|
示例代码
import os
os.environ['QIANFAN_ENABLE_STRESS_TEST'] = "true"
from qianfan.dataset import Dataset
# 百度智能云IAM认证
#os.environ["QIANFAN_ACCESS_KEY"] = "xx"
#os.environ["QIANFAN_SECRET_KEY"] = "xx"
# 千帆应用接入认证
os.environ["QIANFAN_AK"] = "xx"
os.environ["QIANFAN_SK"] = "xx"
# 需要初始化一个数据集对象
ds = Dataset.load(data_file="./stress_test_data.jsonl")
ds.multi_stress_test(
origin_users=10,
workers=10,
spawn_rate=10,
rounds=10,
interval=5,
#model="ERNIE-Speed-8K,
endpoint="l94ptbaz_xuwei32tiny",
model_type="ChatCompletion",
runtime="30s",
hyperparameters={"temperature":0.9},
#first_latency_threshold = 20,
#round_latency_threshold = 100,
#success_rate_threshold = 0.8,
)
查看报告
打开:performance_table.html
可以看到多轮压测的报告汇总
github链接
pytho代码形式:https://github.com/baidubce/bce-qianfan-sdk/blob/main/docs/stress_test.md
notebook形式:https://github.com/baidubce/bce-qianfan-sdk/blob/main/cookbook/dataset/stress_test.ipynb