Created by: jiweibo
【描述】 对lite cuda涉及流的部分进行了统一。主要包括:
- 单stream拆分成io和exec stream
- copy_from_cpu和copy_to_cpu操作从NULL stream切换到io stream
- 每个predictor内部维护exec_stream和io_stream,支持线程流。
- 单线程情况下支持exec多流,多线程暂不支持。
- 服务端可通过config.set_exec_stream()和config.set_io_stream()来设置流
【线程流性能测试】
batch_size=16, work=1000,即需要处理的总量为16 * 1000,qps计算为:batch_size*work / time。测试显卡:P4
resnet模型下qps测试(one_loop中包括了数据预处理过程) batch_size=1
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 46.46 | 40 | 670M | / | / |
2 | 84.64 | 88 | 991M | 82.18% | 0.91 |
3 | 92.34 | 99 | 1384M | 98.75% | 0.66 |
4 | 106.548 | 99 | 1935M | 129.33% | 0.57 |
batch_size=2
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 52.60 | 30-38 | 756M | / | / |
2 | 103.28 | 60-68 | 1177M | 96.35% | 0.98 |
3 | 143.07 | 99 | 1510M | 172% | 0.91 |
4 | 130.07 | 90-99 | 2495M | 147.28% | 0.62 |
batch_size=4
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 57.84 | 22-34 | 914M | / | / |
2 | 115.67 | 43-61 | 1497M | 99.98% | 0.9999 |
3 | 164.87 | 81-87 | 2208M | 184.99% | 0.95 |
4 | 179.27 | 99 | 2761M | 209.94% | 0.77 |
batch_size=8
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 60.13 | 19-38 | 1198M | / | / |
2 | 119.73 | 38-59 | 2165M | 99.12% | 0.996 |
3 | 176.53 | 59-78 | 3080M | 193.58% | 0.979 |
4 | 229.1 | 99 | 3977M | 281% | 0.95 |
batch_size=16
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 62.05 | 0-34 | 1864M | / | / |
2 | 125.19 | 12-64 | 3271M | 101.76% | 1.0 |
3 | 180.76 | 51-99 | 5044M | 191.31% | 0.97 |
4 | 235.41 | 93-99 | 6385M | 279.39% | 0.95 |
检测yolov3模型下qps测试(one_loop中包括了数据预处理过程)work=500
batch_size=1
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 6.69 | 30-41 | 1462M | / | / |
2 | 9.50 | 43-68 | 2834M | 42% | 0.71 |
3 | 13.33 | 65-93 | 3802M | 99.25% | 0.66 |
4 | 14.65 | 98 | 5205M | 118.98% | 0.55 |
batch_size=2
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 6.89 | 0-54 | 1924M | / | / |
2 | 10.32 | 0-99 | 3469M | 50% | 0.74 |
3 | 12.51 | 0-100 | 5348M | 79.22% | 0.60 |
4 | / | / | out of memory | / | / |
batch_size=4
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 6.98 | 0-100 | 2898M | / | / |
2 | 10.66 | 0-99 | 5721M | 52.72% | 0.76 |
3 | / | / | out of memory | / | / |
batch_size=8
线程 | qps | gpu利用率 | 显存 | qps相对单线程提升 | 每个线程相对单线程使用率 |
---|---|---|---|---|---|
1 | 7.08 | 0-100 | 5950M | / | / |
2 | / | / | out of memory | / | / |
结论:
- 从分类和检测模型中可以看出,当gpu利用率不满时,采用线程流的方式能够大幅提升服务的qps
- 注意,在一些业务模型上发现即使gpu利用率不满,采用线程流反而使得gpu利用率下降,总体qps降低,该问题的原因可能是:模型的kernel运行时间和launch开销差不多,多线程在launch kernel的时候还需要抢占锁,导致性能下降。
文档设计部分: http://agroup.baidu.com/paddle-infer/md/article/2592150 见文档最后的 lite cuda 流管理需求