这里说下模型转换格式ONNX和可视化工具Netron。ONNX是微软设计的一种多平台的通用文件格式,帮助算法人员进行模型部署和框架之间相互转换。而Netron是一款老牌的轻量化模型可视化工具,支持多种开源框架,使用上比TensorBoard简单直接。
1 不同框架模型需要转换吗?
目前开源的深度学习框架有很多,当我们在Github上搜索一个通用网络时,会发现各种各样的版本实现。但是深度学习方法的本质都是分为训练和部署两个环节,如果以目标为导向,我们关注算法部署在哪儿,用什么部署?是x86上采样TensorRT部署还是ARM上采用端框架NCNN运行,又或者采样某个硬件厂商提供的SDK做推理。
假设童鞋A有一个检测任务需要部署在TX2的开发板上,基于TensorFlow框架把yolov5改改,训练得到了一份pb权重,接下来将pb转换成TensorRT使用的uff文件做推理。
如果A将框架换成Pytorch,按照上述流程得到了一份pt的权重,然后调用TensorRT的SDK转换成uff格式,看上去好像也很顺畅没什么问题,它们的区别就在于训练生成的权重文件格式不同,不过反正最终都转换成uff格式。
实际操作中或者部署在其他移动端时,我们会发现瓶颈在于如何才能更友好的将PC端训练的权重文件转换成部署端需要的格式。Nividia的开发板虽然基于CUDA加速,生态链完整,但是对不同的神经网络框架支持的算子力度也有区别,如果训练框架是Pytorch,在TensorRT上部署,如下图所示理论上有三条路(这里Caffe的存在是因为TRT对它的支持更友好,可以根据需求删除):
直接调用TRT提供的SDK转换接口,很大可能遇到不支持的操作算子,在Nividia显卡上还能通过CUDA编程自定义算法,换成其他硬件可能直接就不支持自定义功能。
既然直接转换走不通,那么能否将Pytorch先转成Caffe,再由Caffe转到TRT呢?
这条路也存在问题,不同神经网络框架在一些定义上存在差异,比如Pytorch的反卷积自带两次paddingÿ