• 模型部署踩坑(持续更新ing)


    模型部署踩坑

    踩坑1

    FLOPs不能衡量模型性能,因为FLOPs只是模型计算大小的单位

    还需要考虑

    • 访存量
    • 跟计算无关的DNN部分(reshape, shortcut, nchw2nhwc等等)
    • DNN以外的部分(前处理、后处理这些)

    踩坑2

    不能够完全依靠TensorRT

    TensorRT可以对模型做适当的优化,但是有上限

    • 计算密度低的1x1 conv, depthwise conv不会重构
    • GPU无法优化的地方会到CPU执行(可以手动修改代码实现部分,让部分cpu执行转到gpu执行)
    • 有些冗长的计算,TensorRT可能不能优化(直接修改代码实现部分)
    • 存在TensorRT尚未支持的算子(可以自己写plugin)
    • TensorRT不一定会分配Tensor Core(因为TensorRT kernel auto tuning会选择最合适的kernel)

    踩坑3

    CUDA Core和Tensor Core的使用

    有的时候TensorRT并不会分配Tensor Core

    • kernel auto tuning自动选择最优解
    • 所以有时会出现类似于INT8的速度比FP16反而慢了
    • 使用Tensor Core需要让tensor size为8或者16的倍数

    踩坑4

    不能忽视 前处理/后处理 的overhead

    • 对于一些轻量的模型,相比于DNN推理部分,前处理/后处理可能会更耗时间
    • 因为有些前处理/后处理的复杂逻辑不适合GPU并行

    解决办法:

    • 可以把前处理/后处理中可并行的地方拿出来让GPU并行(比如RGB2BGR, Normalization, resize,crop, NCHW2NHWC)
    • 可以在cpu上使用一些针对图像处理的优化库
      比如Halide(使用Halide进行blur, resize, crop, DBSCAN, sobel这些会比CPU快)

    踩坑5

    对使用TensorRT得到的推理引擎做benchmark和profiling

    • 使用TensorRT得到推理引擎并实现infer只是优化的第一步

    • 需要使用NVIDIA提供的benchmark tools进行profiling

      分析模型瓶颈在哪里
      分析模型可进一步优化的地方在哪里
      分析模型中多余的memory access在哪里

    可以使用nsys, nvprof, dlprof, Nsight这些工具

  • 相关阅读:
    C++学习——内联函数详解
    正则表达式re模块的使用教程『更新中』
    LCP 51.烹饪料理
    【行为型模式】解释器模式
    【大数据实训】基于Hive的北京市天气系统分析报告(二)
    利用角色roles上线wordpress项目
    文件包含漏洞笔记
    HTML 入门
    WPF类似于WINFORM的Onpaint
    中断 NVIC的概念和原理
  • 原文地址:https://blog.csdn.net/qq_44824148/article/details/133855872