
【千帆SDK+】多轮压测实战
大模型开发/技术交流
- LLM
- 大模型训练
- Prompt
2024.07.268717看过
💡学习前小提示
请大家点击链接并加🌟:https://github.com/baidubce/bce-qianfan-sdk
功能场景
为用户提供千帆标准的压测工具(千帆SDK)。满足以下使用场景:
-
测试sft模型部署到算力单元后,实际的性能效果
-
对比模型压缩后的性能效果
-
测试预置服务的性能
压测数据准备(数据格式规范说明)
可用于stress_test的数据集目前支持以下三种格式:
jsonl格式示例(兼容千帆data数据集格式)
千帆data数据集导出,可直接用于压测
这种格式主要用于多轮对话的场景,其中一个括号就是一段对话。最后的回答会在输入中被忽略
json格式示例
[{"prompt": "地球的自转周期是多久?", "response": "大约24小时"},{"prompt": "人类的基本单位是什么?", "response": "人类"}]
启动压测
前置说明
如果用户想要对大模型服务进行性能测试,需要在导入
qianfan
模块之前设置环境变量 QIANFAN_ENABLE_STRESS_TEST
为 true
然后准备好测试用的数据集。数据集就绪后,可调用数据集的stress_test接口启动压测任务。
如果使用macbook压测,需要先命令行设置环境变量: export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
方法参数说明
认证参数
认证方式
|
参数名
|
参数类型
|
是否必须
|
参数描述
|
千帆应用认证
|
os.environ["QIANFAN_AK"] = ""
|
str
|
二选一
|
千帆控制台-应用接入-创建的应用AK,IAM认证和千帆应用认证二选一
|
os.environ["QIANFAN_SK"] = ""
|
str
|
千帆控制台-应用接入-创建的应用SK
|
||
百度智能云IAM认证
|
os.environ["QIANFAN_ACCESS_KEY"] = ""
|
str
|
二选一
|
百度智能云IAM的AccessKey,IAM认证和千帆应用认证二选一
|
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"]
执行压测代码
这个调用示例包含全参数,在上面的表格当中说明了哪些是必填的。用户实际可以不需要填写全部
import osos.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-Speed-8K", # 此处填写预置服务名称,与endpoint二选一endpoint="YourEndpoint", # 此处填写您的定制服务Endpointmodel_type="ChatCompletion", # 可选参数runtime="15m", # 可选参数hyperparameters={"temperature":0.9} # 可选参数)
在本例中:
workers:启动10个进程来模拟并发请求users:总模拟并发100spawn_rate:每秒新增5个,一直增加到100个以后,不再新增, 后续从第11s开始,全部都按照100并发发压。model/ endpoint: 预置服务名称/ 定制服务Endpoint,注意两个参数只能填写其一。
报告解读
数据整理
并发
|
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/50%/80%:请求完整时延的最小值/最大值/平均值/50分位值/80分位值;
-
FirstTokenLatency min/max/avg/50%/80%:请求首字(或首句)时延的最小值/最大值/平均值/50分位值/80分位值;
-
InputTokens avg:平均每条query输入token长度;
-
OutputTokens avg:平均每条query输出token长度;
-
SuccessRate:请求成功率;
注1:除SuccessRate外其余指标统计时均剔除了失败或异常请求;
注4:Token吞吐可以使用
注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
|
是
|
建议值:10。指定发压使用的初始用户数。origin_users必须大于等于worker数目;每个worker负责模拟${users}/${workers}个虚拟用户;
|
workers
|
int
|
是
|
建议值:10。指定发压使用的worker数目,每个worker为1个进程;
|
spawn_rate
|
int
|
是
|
建议值:5。指定每秒真实启动的user数目,一直增长到users大小以后,不再新增启动。
|
rounds
|
int
|
是
|
建议值:10。指定压测轮数;multi_stress_test多轮压测场景必填
|
interval
|
int
|
是
|
建议值:5。指定压测轮之间的加压并发数;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 osos.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=100,workers=10,spawn_rate=5,# model="ERNIE-Speed-8K", # 此处填写预置服务名称,与endpoint二选一endpoint="YourEndpoint", # 此处填写您的定制服务Endpointmodel_type="ChatCompletion", # 可选参数runtime="15m", # 可选参数hyperparameters={"temperature":0.9} # 可选参数#first_latency_threshold = 20,#round_latency_threshold = 100,#success_rate_threshold = 80,)
在本例中:
workers:启动10个进程来模拟并发请求origin_users:初始发压并发数为100。users数量即为并发数量spawn_rate:每秒新增5个user,一直增加到100个以后,不再新增, 后续从第11s开始,全部都按照100并发发压。model/ endpoint: 预置服务名称/ 定制服务Endpoint,注意两个参数只能填写其一。first_latency_threshold: 首token时延阈值。首token返回时延超过20秒,则不会再发起下轮压测,压测在本轮停止。round_latency_threshold: 单轮压测时延阈值。单轮压测时延超过100秒,则不会再发起下轮压测,压测在本轮停止。success_rate_threshold: 单轮成功率阈值。本轮压测的请求成功率低于80%,则不会再发起下轮压测,压测在本轮停止。
Locust可视化压测报告
压测完毕,在当前的工作目录下的record目录中,按照发压时间找到对应的压测日志目录。该目录下有多轮的压测文件夹,按照每轮的并发数命名。其中的report.html是对应轮次的可视化压测报告。
找到report.html打开查看压测数据
报表化压测报告
在record目录下找到该组多轮压测的performance_table.html
打开:performance_table.html
可以看到多轮压测的报告汇总
压测报告当中并发数、qps与云端单副本qps的关系
-
云端单副本qps:
-
是云端网关对请求的限流,最大可以限制到50,这个qps放大,可以避免出现错误码18。
-
一般压测结束以后,得到了真实的服务单副本qps,会将云端的单副本qps设置为压测qps值,从而保护模型被打爆
-
-
压测报告qps:实际客户端请求云端网关成功的qps
-
并发数:并发数代表的是线程数量,每一个线程负责一次完整的请求(请求开始到请求拿到response)。每个线程在一次请求完成之前,是不会发起下一次请求的。
评论
