Created by: NHZlX
note:业务以及发版任务较紧急,分拆pr存在较大风险,因此进行了统一提交。
此PR是对Ernie在TRT上的Dynamic shape支持。
背景: 1) TRT从6.0版本开始支持Dynamic shape的输入 2) Ernie模型在使用场景上多为变化的shape输入 3) Paddle原生也对Ernie的性能优化,主要在fp32精度上。为了能够利用T4的fp16的tensor core的高性能,因此对Ernie进行了Paddle-TRT 子图的集成。
细节如下:
一: 改动:
1) 接口使用
新加config.SetTRTDynamicShapeInfo()接口,此接口用来指定子图的输入的最小,最大,最优的shape信息(最优shape表示,TRT会在此shape选择运行时最优kernel)。当shape信息确定后,Paddle-TRT会运行Dynamic shape模式。
std::map<std::string, std::vector<int>> min_input_shape
= {{"read_file_0.tmp_0", {1,128,1}}, {"read_file_0.tmp_1", {1,128,1}}, {"read_file_0.tmp_2", {1,128,1}}, {"stack_0.tmp_0", {1,12, 128, 128}}};
std::map<std::string, std::vector<int>> max_input_shape
= {{"read_file_0.tmp_0", {1,128,1}}, {"read_file_0.tmp_1", {1,128,1}}, {"read_file_0.tmp_2", {1,128,1}},{"stack_0.tmp_0", {1,12, 128, 128}}};
std::map<std::string, std::vector<int>> opt_input_shape
= {{"read_file_0.tmp_0", {1,128,1}}, {"read_file_0.tmp_1", {1,128,1}}, {"read_file_0.tmp_2", {1,128,1}},{"stack_0.tmp_0", {1,12, 128, 128}}};
config.EnableTensorRtEngine(1 << 20, 1, 5,
AnalysisConfig::Precision::kFloat32, false, true);
config.SetTRTDynamicShapeInfo( min_input_shape,
max_input_shape, opt_input_shape);
2) 更新了multihead_matmul convert 新加了 emb_eltwise_layernorm, skip_layernorm convert
复用Fluid multihead_matmul, emb_eltwise_layernorm的实现,并扩展fp16的功能。
4) cmake期间对Turing以及Volta添加 SUPPORT_CUDA_FP16定义,避免硬件不支持fp16导致编译出错问题。
二: 向后兼容。
如果没有调用 config.SetTRTDynamicShapeInfo,运行期间会运行static shape模式,即此pr前的模式。
目前对向前兼容(static shape 模式)做的测试有(resnet50, yolov3):
1) fp32 运行。
2) fp16 运行
3) Paddle-TRT 离线量化生成校准表
4) 加载量化表进行预测
5) Paddle-TRT 序列化优化信息
6) 加载序列化信息预测。
测试结果正常。
三: 性能
cuda10.1, cudnnv7.5, tensorrt6.0
标准ernie模型:
内部某模型:
在标准以及内部上线模型上,相比fp32, fp16有30% - 4倍不等的性能提升。