使用千帆SDK压测千帆大模型平台上的服务

场景

给用户提供千帆标准的压测工具(千帆SDK)。满足以下使用场景:

  1. 测试sft模型部署到算力单元后,实际的性能效果

  2. 对比模型压缩后的性能效果

  3. 测试预置服务的性能

压测数据准备(数据格式规范说明)

可用于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_TESTtrue

然后准备好测试用的数据集。数据集就绪后,可调用数据集的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

压测数据集,支持前面章节提到的三种数据格式:

  1. jsonl

  2. json

  3. txt

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地址。

  • 如果为用户定制服务(sft模型),服务地址url:https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/hfleeyco_test_0703,则endpoint为:hfleeyco_test_0703,如下图所示:

  • 如果为千帆预置服务,如ERNIE-3.5-8K,服务地址url:

https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions,则endpoint为:completions

model

str

指定需要压测服务的模型名称。该参数与endpoint只能指定一个;

hyperparameters

Optional[Dict[str, Any]]

  • 指定压测时使用的超参数;

  • 例如:hyperparameters={"temperature":0.5}

完整调用示例

安装千帆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地址。

  • 如果为用户定制服务(sft模型),服务地址url:https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/hfleeyco_test_0703,则endpoint为:hfleeyco_test_0703,如下图所示:

  • 如果为千帆预置服务,如ERNIE-3.5-8K,服务地址url:

https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions,则endpoint为:completions

model

str

指定需要压测服务的模型名称。该参数与endpoint只能指定一个;

hyperparameters

Optional[Dict[str, Any]]

  • 指定压测时使用的超参数;

  • 是否过安全算子在此处设置,例如:hyperparameters={"temperature":0.5,"safety_level":"none"},此处none表示不过安全。safety_level是开白参数,参考千帆安全等级调整说明&使用指南

示例代码

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

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值