本文原作者:孟朋,经授权后发布。
在Detectron模型性能优化与部署(1)中,我们介绍了如何使用Caffe2/TRT加速Cascade R-CNN + FPN模型。我们会在本篇文章介绍如何实现FP16推理,如何实现图片输入大小可变,FP16相比FP32推理精度差别,如何避免推理精度损失,以及模型如何上线等。
FP16支持
目前较新的GPU一般FP16的峰值计算能力远大于FP32峰值计算能力。比如Nvidia T4 GPU,FP32峰值计算能力为8.1TFLOPS, FP16峰值计算能力为65TFLOPS。 一般来说,只要GPU的FP16峰值计算能力大于FP32,我们就可以使用FP16加速模型推理。但实际应用中,FP16性能如何,不仅取决于GPU的FP16峰值计算能力,也取决的输入数据的Shape。 图1显示了使用DeepBench测试的不同shape的数据在Nvidia T4的计算性能。
图1上半部分显示了不同shape的FP16卷积计算的性能数据,下半部分是FP32的性能数据。可以看出,某些shape的FP16计算性能远好于FP32的计算性能,某些shape FP16性能反而不如FP32性能。无论FP32还是FP16,GPU的实际计算能力和峰值计算能力差距都很远。因此,是否使用FP16进行计算,不仅取决于GPU的FP16峰值计算能力,也取决于模型结构,数据格式等。
对于使用Caffe2/TRT的模型推理来说,因为使用了TensorRT算子代替了大部分Caffe2原始算子,因此使用FP16推理非常简单, 只需要在创建TensorRT引擎前设置如下参数:
auto build_config = trt_builder->createBuilderConfig();
build_config->setFlag(BuilderFlag::kFP16);
engine = trt_builder->buildEngineWithConfig(*trt_network.get(), *build_config)
使用Caffe2/TRT进行模型推理,只需要在创建TensorRT引擎时使用kFP16配置,即可以对网络进行FP16加速。其余TensorRT不支持的算子,可以继续使用FP32计算。
FP16对精度影响如何
Cascade R-CNN+FPN模型的测试表明,当对所有7个TensorRT算子使用FP16计算,物体识别的类别和打分与使用FP32完全一致,个别识别框位置有一个像素差别。如果将模型最后一层的TensorRT算子使用FP32,其他6个TensorRT算子继续使用FP16,则使用FP16的物体识别结果和F32完全一致。
因此,使用FP16进行推理,对模型的精度影响基本可以忽略。而且可以通过对某些关键层,比如最后一层,不使用FP16推理,进一步降低FP16对推理精度的影响。
Caffe2/TRT支持动态大小输入
TensorRT 7支持输入动态调节,而且可以支持所有纬度的动态调节。下图显示了对Cascade R-CNN + FPN网络中其中一个TensorRT算子第一维动态调节的设置:
在Caffe2/TRT的优化实现中,用户可以根据模型参数,模型的配置和不同输入大小对profile进行设置。
Pytorch在Centos编译
Caffe2/TRT模块的优化实现,近期会在深度学习框架加速Oteam服务端模型推理加速小组维护的repo开源。使用Caffe2/TRT,需要从代码编译Pytroch。为了方便大家顺利编译Pytorch代码,减少各种环境依赖问题,我们准备了Centos镜像,欢迎拉取使用: ccr.ccs.tencentyun.com/ti-dl-library/centos7:cuda10.0-cudnn7-gcc7.2-devel
线上部署
对于线上部署模型,欢迎使用弹性模型服务(Tencent Intelligence Elastic Model Service,TI-EMS)[2]。 TI-EMS是具备虚拟化异构算力和弹性扩缩容能力的在线推理平台,能够帮助客户解决模型部署复杂、资源浪费、手工扩展资源效率低下的问题。客户通过使用弹性模型服务可以实现模型一键部署,自动调整弹性计算资源。同时,弹性模型服务具备多模型支持、版本管理和灰度升级等丰富完善的功能,其内置的 CPU/GPU 推理加速镜像为客户提供高性能、高性价比推理服务。
腾讯云AI基础中心不仅提供可弹性伸缩的模型部署服务,我们也提供专业的模型优化,训练和推理性能优化服务。
总结
本文总结了某业务Cascade R-CNN + FPN模型在腾讯云AI基础中心的推理优化过程。不仅实现了模型推理本身160%的性能提升,也很好的完善了Caffe2/TRT模块。优化后的Caffe2/TRT模块支持动态大小输入,支持FP16推理,支持复杂模型的推理等。