模型部署推理速度评估

前言(废话)

因为jetsonNano算力吃紧,在上面开发CNN模型面临了新的挑战。像dgpu上常用的YOLO系列,即使最小的模型搬上去也就25fps的水平。而上面要求一台jetsonNano要跑多路视频推理,因此开发一个小模型迫在眉睫。

尝试过主流的MobileNet和ShuffleNet后,使用ShuffleNet暂时取得了比较好的效果,能实时达到约100fps。

当然是不可能就此罢手的,调研了时间比较新的小模型:VoVNet和VanillaNet。并分别先在dgpu上测试发现效果还不错,特别是VoVNet,速度和ShuffleNetV2差不多的情况下,AP05能提高十几个点。开心地移植过去,结果发现在jetson上只有17fps。于是开启分析过程

Pytorch

torch官方是有提供相关工具的。具体使用网上的教程也挺多的,此处就简略过。

from torch.profiler import profile, record_function, ProfilerActivity

with profile(activities=[
    ProfilerActivity.CPU, ProfilerActivity.CUDA], record_shapes=True) as prof:
    with record_function("model_inference"):
        preds = model(img)

print(prof.key_averages(group_by_input_shape=False).table(sort_by="cpu_time_total", row_limit=10))

这里分享一个坑,就是如果你只跑一个batch的话,得到的结果是不准确的。这一点网上是完全找不到相关的资料,你会发现数据进入模型的第一次卷积特别耗时,cpu_total_time爆炸(主要时间都在这里了)。排除了N个原因后直接上结论,torch在第一次推理(初始化)时会初始化cudnn相关组件,这个过程是相当耗时的。因此想要得到比较准确的结果,第一次推理应该当做warm up,以后几次推理得到的结果为准。

tensorRT

得到序列化后的tensorRT plan/engine文件后,使用

/usr/src/tensorrt/bin/trtexec --loadEngine=model_name.engine --dumpProfile

即可打印每层推理消耗的时间
此处终于发现,dgpu和jetson在某些layer上的表现完全不同,等待后续排查原因。

当然,网上也有相关的使用代码来打印时间的博客,后续有时间再更新。

posted @   zhouyuchong  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示