模型部署的时候,一般会对latency、throughput有更高的要求,这导致直接用pytorch部署性能达不到要求。如果我们部署的目标硬件是nvidia的产品(如下图所示),我们可以直接使用nvidia的tensorrt进行优化与部署。
![38de324c38d5d678885e9fec7a0407cd.png](https://i-blog.csdnimg.cn/blog_migrate/f6c243ee56875cdb70ad8b4dba97dcb7.jpeg)
pytorch转换tensorrt
nvidia有一个开源项目torch2trt,提供pytorch到tensorrt的转换,但是我们在使用的过程中发现了一些问题:
1、pytorch模型转换时对模型内部的具体实现限制较多,比如forward里如果有if语句就容易转换失败;
2、onnx模型转换时仅支持固定batch size;
3、benchmark功能不够灵活;
4、不支持tensorrt engine的保存和读取。
于是我们开发了volksdep解决上述问题,该项目有如下特点:
1、支持pytorch、onnx模型的自动转换,并且基本不需要改动原模型的代码实现;
2、提供benchmark接口,通过几行代码就可以自动生成benchmark,包含不同框架、精度下的throughput、latency、准确率等指标;
3、支持tensorrt engine的保存和读取,这样能保证python前端或者c++前端部署的一致性。
我们使用volksdep成功转换过分类模型、语意分割模型、目标检测模型。
部署
pytorch转换为tensorrt之后,就需要部署。部署有两个方案:1、纯c++;2、python前端,cuda/c++后端。
方案1的优点是性能会非常高,但是缺点是不够灵活(c++写起来没python容易)。
方案2的优点是灵活,python有良好的生态,而且写起来也容易,但是性能会稍微差一些,但是也不会太差,因为python接口的tensorrt效率与c++接口的tensorrt效率相当。
对于方案1,我们维护了cheetahinfer;对于方案2,我们维护了flexinfer,我们做了一些优化,把前处理中除了resize之外的操作全都放在gpu上运行,基本达到了高效和灵活的tradeoff。
以上的volksdep、cheetahinfer和flexinfer我们会持续维护。