前言(废话)
因为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上的表现完全不同,等待后续排查原因。
当然,网上也有相关的使用代码来打印时间的博客,后续有时间再更新。
标签:dgpu,ProfilerActivity,模型,torch,record,推理,评估 From: https://www.cnblogs.com/zhouyuchong/p/18121780