本文以文本分类任务为例搭建Serving预测服务,给出Serving框架性能数据:
1) 不同模型下预测服务单线程响应时间、QPS、准确率等指标和单机模式的对比
2) 不同模型下Serving扩展能力对比
3) Serving框架净开销测试
# 1. Serving单次请求时间分解
下图是一个对serving请求的耗时阶段的不完整分析。图中对brpc的开销,只列出了bthread创建和启动开销。
![](http://paddle-serving.bj.bcebos.com/doc/serving-timings.png)
(右键在新窗口中浏览大图)
试与单机模式对比:
1) 从原始样例填充PaddleTensor (几us到几十us)
2) 从PaddleTensor填充LoDTensor (几us到几十us)
3) inference (几十us到几百ms)
4) 从LoDTensor填充PaddleTensor (几us到几十us)
5) 从Paddletensor读取预测结果 (几us到几十us)
与单机模式相比,serving模式增加了:
1) protobuf数据构造和序列化与反序列化 (几us到几十us)
2) 网络通信 (单机十几us,远程500us到几十ms)
3) 和bthread创建于调度等。(十几us)
从client端看(图中total time T2),serving模式增加的时间,与inference时间的比例,对整个client端观察到的系统吞吐关系密切:
1) 当inference时间达到10+ms到几百ms (例如,文本分类的CNN模型和LSTM模型),而serving模式增加的时间只有几ms,则client端观察到的吞吐与单机模式几乎一致
2) 当inference时间只有几个us到几十个us (例如,文本分类的BOW模型),而serving模式增加了几个ms,则client端观察到的吞吐与单机模式相比,会下降到单机模式的20%甚至更低。
**为了验证上述假设,文本分类任务的serving模式测试,需要在几个不同模型上分别进行,分别记录serving模式下,client端吞吐量的变化情况。**
# 2. 测试任务和测试环境
## 2.1 测试任务
文本分类的三种常见模型:BOW, CNN, LSTM
**Batch Size: 本实验中所有请求的batch size均为50**
## 2.2 测试环境
| | CPU型号、核数 | 内存 |
| --- | --- | --- |
| Serving所在机器 | Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz 40核 | 128G |
| Client所在机器 | Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz 40核 | 128G |
Serving端与Client端通信时延:0.102 ms
# 3. 预测服务单线程响应时间、QPS、准确率等指标与单机模式的对比
本测试用来确定Serving的准确率、QPS和响应时间等指标与单机模式相比是否无明显异常
模型 |
Serving(client与serving同机器) |
单机 |
|
QPS |
Latency (ms) |
Accuracy |
QPS |
Latency (ms) |
Accuracy |
BOW |
265.393 |
3 |
0.84348 |
715.973366 |
1.396700 |
0.843480 |
CNN |
23.3002 |
42 |
0.8962 |
25.372693 |
39.412450 |
0.896200 |
LSTM |
5.19578 |
192 |
0.85784 |
5.321040 |
187.933202 |
0.857840 |
可以看到,在预测时间很短的BOW模型上,通过serving进行服务,QPS下降为单机模式下的1/3左右,而在预测时间较长的CNN和LSTM模型上,QPS几乎与单机模式持平。这也验证了第1节的预期。
# 4. Serving扩展能力
Serving扩展能力的测试是指,在不同模型上:
1) 固定serving端brpc使用的系统线程数
2) 不断增加client端并发请求数
3) 运行一段时间后,client端记录当前设定下QPS、平均响应时间和各个分位点的响应时间等信息
4)serving与client在不同机器上,Serving端与Client端通信时延:0.102 ms
## 4.1 BOW模型
### Serving 4线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 561.325 | 3563 | 7.1265 | 9 | 11 | 23 | 62 |
| 8 | 807.428 | 4954 | 9.9085 | 7 | 10 | 24 | 31 |
| 12 | 894.721 | 6706 | 13.4123 | 18 | 22 | 41 | 61 |
| 16 | 993.542 | 8052 | 16.1057 | 22 | 28 | 47 | 75 |
| 20 | 834.725 | 11980 | 23.9615 | 32 | 40 | 64 | 81 |
| 24 | 649.316 | 18481 | 36.962 | 50 | 67 | 149 | 455 |
| 28 | 709.975 | 19719 | 39.438 | 53 | 76 | 159 | 293 |
| 32 | 661.868 | 24174 | 48.3495 | 62 | 90 | 294 | 560 |
| 36 | 551.234 | 32654 | 65.3081 | 83 | 129 | 406 | 508 |
| 40 | 525.155 | 38084 | 76.1687 | 99 | 143 | 464 | 567 |
### Serving 8线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 397.693 | 5029 | 10.0585 | 11 | 15 | 75 | 323 |
| 8 | 501.567 | 7975 | 15.9515 | 18 | 25 | 113 | 327 |
| 12 | 598.027 | 10033 | 20.0663 | 24 | 33 | 125 | 390 |
| 16 | 691.384 | 11571 | 23.1427 | 31 | 42 | 105 | 348 |
| 20 | 468.099 | 21363 | 42.7272 | 53 | 74 | 232 | 444 |
| 24 | 424.553 | 28265 | 56.5315 | 67 | 102 | 353 | 448 |
| 28 | 587.692 | 23822 | 47.6457 | 61 | 83 | 287 | 494 |
| 32 | 692.911 | 23091 | 46.1833 | 66 | 94 | 184 | 389 |
| 36 | 809.753 | 22229 | 44.4581 | 59 | 76 | 256 | 556 |
| 40 | 762.108 | 26243 | 52.4869 | 74 | 98 | 290 | 475 |
### Serving 12线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 442.478 | 4520 | 9.0405 | 12 | 15 | 31 | 46 |
| 8 | 497.884 | 8034 | 16.0688 | 19 | 25 | 130 | 330 |
| 12 | 797.13 | 7527 | 15.0552 | 16 | 22 | 162 | 326 |
| 16 | 674.707 | 11857 | 23.7154 | 30 | 42 | 229 | 455 |
| 20 | 489.956 | 20410 | 40.8209 | 49 | 68 | 304 | 437 |
| 24 | 452.335 | 26529 | 53.0582 | 66 | 85 | 341 | 414 |
| 28 | 753.093 | 18590 | 37.1812 | 50 | 65 | 184 | 421 |
| 32 | 932.498 | 18278 | 36.5578 | 48 | 62 | 109 | 337 |
| 36 | 932.498 | 19303 | 38.6066 | 54 | 70 | 110 | 164 |
| 40 | 921.532 | 21703 | 43.4066 | 59 | 75 | 125 | 451 |
### Serving 16线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 559.597 | 3574 | 7.1485 | 9 | 11 | 24 | 56 |
| 8 | 896.66 | 4461 | 8.9225 | 12 | 15 | 23 | 42 |
| 12 | 1014.37 | 5915 | 11.8305 | 16 | 20 | 34 | 63 |
| 16 | 1046.98 | 7641 | 15.2837 | 21 | 28 | 48 | 64 |
| 20 | 1188.64 | 8413 | 16.8276 | 23 | 31 | 55 | 71 |
| 24 | 1013.43 | 11841 | 23.6833 | 34 | 41 | 63 | 86 |
| 28 | 933.769 | 14993 | 29.9871 | 41 | 52 | 91 | 149 |
| 32 | 930.665 | 17192 | 34.3844 | 48 | 60 | 97 | 137 |
| 36 | 880.153 | 20451 | 40.9023 | 57 | 72 | 118 | 142 |
| 40 | 939.144 | 21296 | 42.5938 | 59 | 75 | 126 | 163 |
### Serving 20线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 686.813 | 2912 | 5.825 | 7 | 9 | 18 | 54 |
| 8 | 1016.26 | 3936 | 7.87375 | 10 | 13 | 24 | 33 |
| 12 | 1282.87 | 4677 | 9.35483 | 12 | 15 | 35 | 73 |
| 16 | 1253.13 | 6384 | 12.7686 | 17 | 23 | 40 | 54 |
| 20 | 1276.49 | 7834 | 15.6696 | 22 | 28 | 53 | 90 |
| 24 | 1273.34 | 9424 | 18.8497 | 26 | 35 | 66 | 93 |
| 28 | 1258.31 | 11126 | 22.2535 | 31 | 41 | 71 | 133 |
| 32 | 1027.95 | 15565 | 31.1308 | 43 | 54 | 81 | 103 |
| 36 | 912.316 | 19730 | 39.4612 | 52 | 66 | 106 | 131 |
| 40 | 808.865 | 24726 | 49.4539 | 64 | 79 | 144 | 196 |
### Serving 24线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 635.728 | 3146 | 6.292 | 7 | 10 | 22 | 48 |
| 8 | 1089.03 | 3673 | 7.346 | 9 | 11 | 21 | 40 |
| 12 | 1087.55 | 5056 | 10.1135 | 13 | 17 | 41 | 51 |
| 16 | 1251.17 | 6394 | 12.7898 | 17 | 24 | 39 | 54 |
| 20 | 1241.31 | 8056 | 16.1136 | 21 | 29 | 51 | 72 |
| 24 | 1327.29 | 9041 | 18.0837 | 24 | 33 | 59 | 77 |
| 28 | 1066.02 | 13133 | 26.2664 | 37 | 47 | 84 | 109 |
| 32 | 1034.33 | 15469 | 30.9384 | 41 | 51 | 94 | 115 |
| 36 | 896.191 | 20085 | 40.1708 | 55 | 68 | 110 | 168 |
| 40 | 701.508 | 28510 | 57.0208 | 74 | 88 | 142 | 199 |
### Serving 28线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 592.944 | 3373 | 6.746 | 8 | 10 | 21 | 56 |
| 8 | 1050.14 | 3809 | 7.619 | 9 | 12 | 22 | 41 |
| 12 | 1220.75 | 4915 | 9.83133 | 13 | 16 | 26 | 51 |
| 16 | 1178.38 | 6789 | 13.579 | 19 | 24 | 41 | 65 |
| 20 | 1184.97 | 8439 | 16.8789 | 23 | 30 | 51 | 72 |
| 24 | 1234.95 | 9717 | 19.4341 | 26 | 34 | 53 | 94 |
| 28 | 1162.31 | 12045 | 24.0908 | 33 | 40 | 70 | 208 |
| 32 | 1160.35 | 13789 | 27.5784 | 39 | 47 | 75 | 97 |
| 36 | 991.79 | 18149 | 36.2987 | 50 | 61 | 91 | 110 |
| 40 | 952.336 | 21001 | 42.0024 | 58 | 69 | 105 | 136 |
### Serving 32线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 654.879 | 3054 | 6.109 | 7 | 9 | 18 | 39 |
| 8 | 959.463 | 4169 | 8.33925 | 11 | 13 | 24 | 39 |
| 12 | 1222.99 | 4906 | 9.81367 | 13 | 16 | 30 | 39 |
| 16 | 1314.71 | 6085 | 12.1704 | 16 | 20 | 35 | 42 |
| 20 | 1390.63 | 7191 | 14.3837 | 19 | 24 | 40 | 69 |
| 24 | 1370.8 | 8754 | 17.5096 | 24 | 30 | 45 | 62 |
| 28 | 1213.8 | 11534 | 23.0696 | 31 | 37 | 60 | 79 |
| 32 | 1178.2 | 13580 | 27.1601 | 38 | 45 | 68 | 82 |
| 36 | 1167.69 | 15415 | 30.8312 | 42 | 51 | 77 | 92 |
| 40 | 950.841 | 21034 | 42.0692 | 55 | 65 | 96 | 137 |
### Serving 36线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 611.06 | 3273 | 6.546 | 7 | 10 | 23 | 63 |
| 8 | 948.992 | 4215 | 8.43 | 10 | 13 | 38 | 87 |
| 12 | 1081.47 | 5548 | 11.0972 | 15 | 18 | 31 | 37 |
| 16 | 1319.7 | 6062 | 12.1241 | 16 | 21 | 35 | 64 |
| 20 | 1246.73 | 8021 | 16.0434 | 22 | 28 | 41 | 47 |
| 24 | 1210.04 | 9917 | 19.8354 | 28 | 34 | 54 | 70 |
| 28 | 1013.46 | 13814 | 27.6296 | 37 | 47 | 83 | 125 |
| 32 | 1104.44 | 14487 | 28.9756 | 41 | 49 | 72 | 88 |
| 36 | 1089.32 | 16524 | 33.0495 | 45 | 55 | 83 | 107 |
| 40 | 940.115 | 21274 | 42.5481 | 58 | 68 | 101 | 138 |
### Serving 40线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 610.314 | 3277 | 6.555 | 8 | 11 | 20 | 57 |
| 8 | 1065.34 | 4001 | 8.0035 | 10 | 12 | 23 | 29 |
| 12 | 1177.86 | 5632 | 11.2645 | 14 | 18 | 33 | 310 |
| 16 | 1252.74 | 6386 | 12.7723 | 17 | 22 | 40 | 63 |
| 20 | 1290.16 | 7751 | 15.5036 | 21 | 27 | 47 | 66 |
| 24 | 1153.07 | 10407 | 20.8159 | 28 | 36 | 64 | 81 |
| 28 | 1300.39 | 10766 | 21.5326 | 30 | 37 | 60 | 78 |
| 32 | 1222.4 | 13089 | 26.1786 | 36 | 45 | 75 | 99 |
| 36 | 1141.55 | 15768 | 31.5374 | 43 | 52 | 83 | 121 |
| 40 | 1125.24 | 17774 | 35.5489 | 48 | 57 | 93 | 190 |
下图是Paddle Serving在BOW模型上QPS随serving端线程数增加而变化的图表。可以看出当线程数较少时(4线程/8线程/12线程),QPS的变化规律非常杂乱;当线程数较多时,QPS曲线又基本趋于一致,基本无线性增长关系。
![](https://paddle-serving.bj.bcebos.com/doc/qps-threads-bow.png)
(右键在新窗口中浏览大图)
## 4.2 CNN模型
### Serving 4线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 81.9437 | 24407 | 47 | 55 | 64 | 80 | 91 |
| 8 | 142.486 | 28073 | 53 | 65 | 71 | 86 | 106 |
| 12 | 173.732 | 34536 | 66 | 79 | 86 | 105 | 126 |
| 16 | 174.894 | 45742 | 89 | 101 | 109 | 131 | 151 |
| 20 | 172.58 | 57944 | 113 | 129 | 138 | 159 | 187 |
| 24 | 178.216 | 67334 | 132 | 147 | 158 | 189 | 283 |
| 28 | 171.315 | 81721 | 160 | 180 | 192 | 223 | 291 |
| 32 | 178.17 | 89802 | 176 | 195 | 208 | 251 | 288 |
| 36 | 173.762 | 103590 | 204 | 227 | 241 | 278 | 309 |
| 40 | 177.335 | 112781 | 223 | 246 | 262 | 296 | 315 |
### Serving 8线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 86.2999 | 23175 | 44 | 50 | 54 | 72 | 92 |
| 8 | 143.73 | 27830 | 53 | 65 | 71 | 83 | 91 |
| 12 | 178.471 | 33619 | 65 | 77 | 85 | 106 | 144 |
| 16 | 180.485 | 44325 | 86 | 99 | 108 | 131 | 149 |
| 20 | 180.466 | 55412 | 108 | 122 | 131 | 153 | 170 |
| 24 | 174.452 | 68787 | 134 | 151 | 162 | 189 | 214 |
| 28 | 174.158 | 80387 | 157 | 175 | 186 | 214 | 236 |
| 32 | 172.857 | 92562 | 182 | 202 | 214 | 244 | 277 |
| 36 | 172.171 | 104547 | 206 | 228 | 241 | 275 | 304 |
| 40 | 174.435 | 114656 | 226 | 248 | 262 | 306 | 338 |
### Serving 12线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 85.6274 | 23357 | 45 | 50 | 55 | 75 | 105 |
| 8 | 137.632 | 29063 | 55 | 67 | 73 | 88 | 134 |
| 12 | 187.793 | 31950 | 61 | 73 | 79 | 94 | 123 |
| 16 | 211.512 | 37823 | 73 | 87 | 94 | 113 | 134 |
| 20 | 206.624 | 48397 | 93 | 109 | 118 | 145 | 217 |
| 24 | 209.933 | 57161 | 111 | 128 | 137 | 157 | 190 |
| 28 | 198.689 | 70462 | 137 | 154 | 162 | 186 | 205 |
| 32 | 214.024 | 74758 | 146 | 165 | 176 | 204 | 228 |
| 36 | 223.947 | 80376 | 158 | 177 | 189 | 222 | 282 |
| 40 | 226.045 | 88478 | 174 | 193 | 204 | 236 | 277 |
### Serving 16线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 82.9119 | 24122 | 45 | 52 | 60 | 79 | 99 |
| 8 | 145.82 | 27431 | 51 | 63 | 69 | 85 | 114 |
| 12 | 193.287 | 31042 | 59 | 71 | 77 | 92 | 139 |
| 16 | 240.428 | 33274 | 63 | 76 | 82 | 99 | 127 |
| 20 | 249.457 | 40087 | 77 | 91 | 99 | 127 | 168 |
| 24 | 263.673 | 45511 | 87 | 102 | 110 | 136 | 186 |
| 28 | 272.729 | 51333 | 99 | 115 | 123 | 147 | 189 |
| 32 | 269.515 | 59366 | 115 | 132 | 140 | 165 | 192 |
| 36 | 267.4 | 67315 | 131 | 148 | 157 | 184 | 220 |
| 40 | 264.939 | 75489 | 147 | 164 | 173 | 200 | 235 |
### Serving 20线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 85.5615 | 23375 | 44 | 49 | 55 | 73 | 101 |
| 8 | 148.765 | 26888 | 50 | 61 | 69 | 84 | 97 |
| 12 | 196.11 | 30595 | 57 | 70 | 75 | 88 | 108 |
| 16 | 241.087 | 33183 | 63 | 76 | 82 | 98 | 115 |
| 20 | 291.24 | 34336 | 65 | 66 | 78 | 99 | 114 |
| 24 | 301.515 | 39799 | 76 | 90 | 97 | 122 | 194 |
| 28 | 314.303 | 44543 | 86 | 101 | 109 | 132 | 173 |
| 32 | 327.486 | 48857 | 94 | 109 | 118 | 143 | 196 |
| 36 | 320.422 | 56176 | 109 | 125 | 133 | 157 | 190 |
| 40 | 325.399 | 61463 | 120 | 137 | 145 | 174 | 216 |
### Serving 24线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 85.6568 | 23349 | 45 | 50 | 57 | 72 | 110 |
| 8 | 154.919 | 25820 | 48 | 57 | 66 | 81 | 95 |
| 12 | 221.992 | 27028 | 51 | 61 | 69 | 85 | 100 |
| 16 | 272.889 | 29316 | 55 | 68 | 74 | 89 | 101 |
| 20 | 300.906 | 33233 | 63 | 75 | 81 | 95 | 108 |
| 24 | 326.735 | 36727 | 69 | 82 | 87 | 102 | 114 |
| 28 | 339.057 | 41291 | 78 | 92 | 99 | 119 | 137 |
| 32 | 346.868 | 46127 | 88 | 103 | 110 | 130 | 155 |
| 36 | 338.429 | 53187 | 102 | 117 | 124 | 146 | 170 |
| 40 | 320.919 | 62321 | 119 | 135 | 144 | 176 | 226 |
### Serving 28线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 87.8773 | 22759 | 43 | 48 | 52 | 76 | 112 |
| 8 | 154.524 | 25886 | 49 | 58 | 66 | 82 | 100 |
| 12 | 192.709 | 31135 | 59 | 72 | 78 | 93 | 112 |
| 16 | 253.59 | 31547 | 59 | 72 | 79 | 95 | 129 |
| 20 | 288.367 | 34678 | 65 | 78 | 84 | 100 | 122 |
| 24 | 307.653 | 39005 | 73 | 84 | 92 | 116 | 313 |
| 28 | 334.105 | 41903 | 78 | 90 | 97 | 119 | 140 |
| 32 | 348.25 | 45944 | 86 | 99 | 107 | 132 | 164 |
| 36 | 355.661 | 50610 | 96 | 110 | 118 | 143 | 166 |
| 40 | 350.957 | 56987 | 109 | 124 | 133 | 165 | 221 |
### Serving 32线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 87.4088 | 22881 | 43 | 48 | 52 | 70 | 86 |
| 8 | 150.733 | 26537 | 50 | 60 | 68 | 85 | 102 |
| 12 | 197.433 | 30390 | 57 | 70 | 75 | 90 | 106 |
| 16 | 250.917 | 31883 | 60 | 73 | 78 | 94 | 121 |
| 20 | 286.369 | 34920 | 66 | 78 | 84 | 102 | 131 |
| 24 | 306.029 | 39212 | 74 | 85 | 92 | 110 | 134 |
| 28 | 323.902 | 43223 | 81 | 93 | 100 | 122 | 143 |
| 32 | 341.559 | 46844 | 89 | 102 | 111 | 136 | 161 |
| 36 | 341.077 | 52774 | 98 | 113 | 124 | 158 | 193 |
| 40 | 357.814 | 55895 | 107 | 122 | 133 | 166 | 196 |
### Serving 36线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 86.9036 | 23014 | 44 | 49 | 53 | 72 | 112 |
| 8 | 158.964 | 25163 | 48 | 55 | 63 | 79 | 91 |
| 12 | 205.086 | 29256 | 55 | 68 | 75 | 91 | 168 |
| 16 | 238.173 | 33589 | 61 | 73 | 79 | 100 | 158 |
| 20 | 279.705 | 35752 | 67 | 79 | 86 | 106 | 129 |
| 24 | 318.294 | 37701 | 71 | 82 | 89 | 108 | 129 |
| 28 | 336.296 | 41630 | 78 | 89 | 97 | 119 | 194 |
| 32 | 360.295 | 44408 | 84 | 97 | 105 | 130 | 154 |
| 36 | 353.08 | 50980 | 96 | 113 | 123 | 152 | 179 |
| 40 | 362.286 | 55205 | 105 | 122 | 134 | 171 | 247 |
### Serving 40线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 87.7347 | 22796 | 44 | 48 | 54 | 73 | 114 |
| 8 | 150.483 | 26581 | 50 | 59 | 67 | 85 | 149 |
| 12 | 202.088 | 29690 | 56 | 69 | 75 | 90 | 102 |
| 16 | 250.485 | 31938 | 60 | 74 | 79 | 93 | 113 |
| 20 | 289.62 | 34528 | 65 | 77 | 83 | 102 | 132 |
| 24 | 314.408 | 38167 | 72 | 83 | 90 | 110 | 125 |
| 28 | 321.728 | 43515 | 83 | 95 | 104 | 132 | 159 |
| 32 | 335.022 | 47758 | 90 | 104 | 114 | 141 | 166 |
| 36 | 341.452 | 52716 | 101 | 117 | 129 | 170 | 231 |
| 40 | 347.953 | 57479 | 109 | 130 | 143 | 182 | 216 |
下图是Paddle Serving在CNN模型上QPS随serving端线程数增加而变化的图表。可以看出,随着线程数变大,Serving QPS有较为明显的线性增长关系。可以这样解释此图表:例如,线程数为16时,基本在20个并发时达到最大QPS,此后再增加并发压力QPS基本保持稳定;当线程能够数为24线程时,基本在28并发时达到最大QPS,此后再增大并发压力qps基本保持稳定。
![](https://paddle-serving.bj.bcebos.com/doc/qps-threads-cnn.png)
(右键在新窗口中浏览大图)
## 4.3 LSTM模型
### Serving 4线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.8242 | 106246 | 208 | 230 | 254 | 353 | 448 |
| 8 | 31.4584 | 127152 | 242 | 283 | 337 | 448 | 536 |
| 12 | 35.6235 | 168428 | 328 | 384 | 455 | 601 | 732 |
| 16 | 38.2777 | 208999 | 412 | 457 | 505 | 675 | 806 |
| 20 | 39.3926 | 253855 | 503 | 551 | 589 | 751 | 902 |
| 24 | 40.0085 | 299936 | 595 | 650 | 698 | 870 | 1023 |
| 28 | 38.2019 | 366474 | 728 | 805 | 870 | 1076 | 1208 |
| 32 | 37.7817 | 423486 | 842 | 923 | 995 | 1231 | 1363 |
| 36 | 39.3513 | 457418 | 911 | 1018 | 1099 | 1351 | 1556 |
| 40 | 34.7731 | 575158 | 1144 | 1296 | 1395 | 1653 | 1836 |
### Serving 8线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 16.9203 | 118201 | 232 | 264 | 292 | 418 | 653 |
| 8 | 32.8672 | 121702 | 237 | 279 | 351 | 458 | 530 |
| 12 | 43.9741 | 136444 | 270 | 307 | 330 | 399 | 472 |
| 16 | 43.4809 | 183989 | 364 | 403 | 430 | 566 | 769 |
| 20 | 42.4901 | 235349 | 467 | 517 | 552 | 689 | 815 |
| 24 | 46.0386 | 260651 | 519 | 566 | 597 | 686 | 758 |
| 28 | 45.0191 | 310979 | 619 | 672 | 715 | 841 | 991 |
| 32 | 47.9803 | 333470 | 664 | 713 | 745 | 837 | 953 |
| 36 | 47.518 | 378804 | 754 | 809 | 856 | 1017 | 1202 |
| 40 | 48.2631 | 414395 | 825 | 888 | 927 | 1048 | 1136 |
### Serving 12线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.568 | 107712 | 212 | 236 | 264 | 396 | 496 |
| 8 | 28.7212 | 139270 | 268 | 331 | 389 | 478 | 531 |
| 12 | 37.1195 | 161640 | 315 | 411 | 444 | 523 | 580 |
| 16 | 38.6195 | 207149 | 406 | 511 | 556 | 654 | 722 |
| 20 | 39.8772 | 250770 | 490 | 599 | 652 | 758 | 840 |
| 24 | 41.1097 | 291902 | 578 | 691 | 747 | 861 | 930 |
| 28 | 39.5161 | 354286 | 699 | 822 | 875 | 979 | 1052 |
| 32 | 40.4252 | 395793 | 785 | 899 | 957 | 1090 | 1197 |
| 36 | 40.4617 | 444865 | 885 | 1011 | 1077 | 1215 | 1312 |
| 40 | 41.6045 | 480717 | 957 | 1083 | 1161 | 1322 | 1429 |
### Serving 16线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.456 | 108366 | 211 | 240 | 266 | 372 | 449 |
| 8 | 29.3468 | 136301 | 265 | 319 | 367 | 454 | 510 |
| 12 | 40.3432 | 148724 | 289 | 368 | 410 | 487 | 535 |
| 16 | 46.0167 | 173850 | 336 | 429 | 459 | 535 | 577 |
| 20 | 52.8142 | 189343 | 372 | 475 | 517 | 619 | 689 |
| 24 | 49.9422 | 240278 | 475 | 581 | 625 | 728 | 805 |
| 28 | 49.0184 | 285607 | 564 | 676 | 720 | 822 | 889 |
| 32 | 49.3077 | 324493 | 642 | 760 | 807 | 912 | 977 |
| 36 | 49.2754 | 365294 | 724 | 838 | 884 | 985 | 1067 |
| 40 | 51.2923 | 389922 | 774 | 890 | 946 | 1065 | 1157 |
### Serving 20线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 17.0678 | 117180 | 226 | 258 | 303 | 426 | 503 |
| 8 | 30.9986 | 129038 | 254 | 302 | 345 | 440 | 505 |
| 12 | 42.4962 | 141189 | 274 | 336 | 385 | 467 | 530 |
| 16 | 48.877 | 163676 | 316 | 398 | 433 | 507 | 555 |
| 20 | 55.1089 | 181459 | 350 | 432 | 463 | 539 | 596 |
| 24 | 57.4941 | 208717 | 412 | 503 | 540 | 623 | 695 |
| 28 | 57.1506 | 244967 | 483 | 577 | 614 | 702 | 779 |
| 32 | 58.0059 | 275834 | 545 | 641 | 681 | 773 | 847 |
| 36 | 56.8352 | 316705 | 628 | 725 | 765 | 856 | 929 |
| 40 | 57.1989 | 349657 | 693 | 792 | 833 | 925 | 994 |
### Serving 24线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 17.7026 | 112978 | 223 | 261 | 293 | 403 | 491 |
| 8 | 26.8649 | 148893 | 288 | 377 | 414 | 492 | 556 |
| 12 | 42.2262 | 142092 | 279 | 348 | 392 | 463 | 518 |
| 16 | 50.3214 | 158978 | 310 | 391 | 427 | 503 | 568 |
| 20 | 56.5803 | 176740 | 345 | 422 | 452 | 526 | 583 |
| 24 | 63.9107 | 187762 | 367 | 443 | 472 | 546 | 595 |
| 28 | 64.5965 | 216730 | 427 | 506 | 540 | 623 | 690 |
| 32 | 63.4186 | 252292 | 497 | 578 | 614 | 701 | 770 |
| 36 | 65.5919 | 274424 | 543 | 634 | 669 | 757 | 818 |
| 40 | 65.4862 | 305408 | 605 | 695 | 731 | 824 | 898 |
### Serving 28线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.6808 | 107062 | 209 | 235 | 257 | 338 | 444 |
| 8 | 31.966 | 125133 | 240 | 281 | 340 | 451 | 507 |
| 12 | 44.1527 | 135892 | 266 | 328 | 377 | 464 | 529 |
| 16 | 55.0464 | 145332 | 282 | 359 | 401 | 476 | 528 |
| 20 | 61.7234 | 162013 | 317 | 403 | 436 | 510 | 561 |
| 24 | 67.4385 | 177940 | 349 | 425 | 454 | 525 | 590 |
| 28 | 72.2096 | 193880 | 381 | 447 | 476 | 548 | 611 |
| 32 | 72.8617 | 219594 | 431 | 505 | 538 | 613 | 680 |
| 36 | 74.0488 | 243083 | 480 | 559 | 593 | 680 | 753 |
| 40 | 71.9171 | 278098 | 551 | 629 | 665 | 755 | 825 |
### Serving 32线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.6911 | 107003 | 209 | 233 | 254 | 353 | 428 |
| 8 | 34.3059 | 116598 | 227 | 255 | 295 | 433 | 494 |
| 12 | 45.449 | 132016 | 257 | 313 | 363 | 454 | 508 |
| 16 | 56.7094 | 141070 | 275 | 347 | 392 | 471 | 522 |
| 20 | 62.2615 | 160613 | 315 | 398 | 431 | 503 | 553 |
| 24 | 66.4489 | 180590 | 354 | 423 | 453 | 523 | 570 |
| 28 | 73.1823 | 191303 | 376 | 438 | 467 | 538 | 584 |
| 32 | 77.7122 | 205888 | 405 | 463 | 491 | 562 | 621 |
| 36 | 76.4029 | 235593 | 464 | 527 | 560 | 652 | 763 |
| 40 | 77.7339 | 257288 | 509 | 576 | 609 | 692 | 779 |
### Serving 36线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 18.745 | 106695 | 208 | 232 | 252 | 308 | 357 |
| 8 | 33.6047 | 119031 | 234 | 267 | 316 | 426 | 497 |
| 12 | 43.5076 | 137907 | 269 | 333 | 381 | 467 | 521 |
| 16 | 55.1968 | 144936 | 284 | 360 | 402 | 477 | 529 |
| 20 | 62.9188 | 158935 | 312 | 394 | 430 | 502 | 547 |
| 24 | 68.7411 | 174568 | 343 | 418 | 447 | 522 | 574 |
| 28 | 74.3033 | 188417 | 371 | 436 | 463 | 535 | 581 |
| 32 | 78.7723 | 203117 | 401 | 459 | 488 | 561 | 612 |
| 36 | 80.4861 | 223641 | 440 | 497 | 529 | 627 | 980 |
| 40 | 79.6733 | 251025 | 497 | 562 | 601 | 731 | 910 |
### Serving 40线程
| 并发数 | QPS | 总时间 | 平均响应时间 | 80分位点响应时间 | 90分位点响应时间 | 99分位点响应时间 | 99.9分位点响应时间 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 4 | 17.0187 | 117518 | 231 | 267 | 302 | 416 | 505 |
| 8 | 28.4661 | 140518 | 276 | 360 | 407 | 479 | 548 |
| 12 | 37.6549 | 159342 | 312 | 398 | 429 | 500 | 553 |
| 16 | 53.7681 | 148787 | 291 | 366 | 407 | 486 | 532 |
| 20 | 60.6704 | 164825 | 321 | 402 | 435 | 511 | 564 |
| 24 | 67.2227 | 178511 | 351 | 422 | 452 | 526 | 585 |
| 28 | 71.6659 | 195351 | 384 | 446 | 474 | 551 | 618 |
| 32 | 77.2745 | 207054 | 408 | 465 | 495 | 576 | 643 |
| 36 | 80.0028 | 224992 | 445 | 502 | 538 | 636 | 705 |
| 40 | 80.9894 | 246946 | 486 | 554 | 601 | 767 | 1181 |
下图是Paddle Serving在LSTM模型上QPS随serving端线程数增加而变化的图表。可以看出,随着线程数变大,Serving QPS有较为明显的线性增长关系。可以这样解释此图表:例如,线程数为16时,基本在20个并发时达到最大QPS,此后再增加并发压力QPS基本保持稳定;当线程能够数为24线程时,基本在28并发时达到最大QPS,此后再增大并发压力qps基本保持稳定。
![](https://paddle-serving.bj.bcebos.com/doc/qps-threads-lstm.png)
(右键在新窗口中浏览大图)
# 6. 净开销测试
本测试是为了描画引入Serving框架后,在Serving端空转的情况下,每query消耗的时间,也就是框架引入的开销。
所谓空转是指,serving端去除实际执行预测的计算时间,但保留拆包和组包逻辑。
| 模型 | 净开销 (ms) |
| --- | --- |
| BOW | 1 |
| CNN | 1 |
| LSTM | 1 |
# 7.结论
## 7.1 单线程模式下准确率和QPS等指标与单机模式对比
准确率:Serving模式下与单机模式下预测准确率一致
QPS:与模型特点有关:当模型预测时间极短时,Serving框架本身的开销和网络通信固定时间在单次请求中的时间占比占了绝大部分,这导致Serving模式下的QPS与单机模式相比下降明显;当预测时间较长,Serving框架开销和网络通信时间在单次请求中的占比较小,Serving模式下QPS与单机模式下相差不多。
## 7.2 Serving扩展能力
当模型较为复杂时(以上述实验中CNN和LSTM模型为例),Paddle Serving能够提供较好的线性扩展能力;当模型是简单模型(以上述实验中BOW模型为例),随着serving端线程数的增加,qps的增长趋势较为杂乱,看不出明显的线性趋势。猜测是因为预测时间较短,而线程切换、框架本身的开销等占了大头,导致虽然随着线程数增加,qps也有增长,但当并发数增大时,qps反而出现下降。
## 7.3 净开销测试
本测试用来估计框架本身带来的时间消耗。
在Serving模式下,框架引入的时间开销较小,约为1ms。