模型部署 - BevFusion - (1) - 思路总结

2024-03-04 19:04

本文主要是介绍模型部署 - BevFusion - (1) - 思路总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模型部署实践 - BevFusion

  • 思路总结
  • 一、网络结构 - 总结
    • 1.1、代码
    • 1.2、网络流程图
    • 1.3、模块大致梳理
  • 二、Onnx 的导出 -总体思路分析
  • 三、优化思路总结

学习 BevFusion 的部署,看了很多的资料,这篇博客进行总结和记录自己的实践

思路总结

对于一个模型我们要进行部署,一般有以下几个开发流程或思路:

  • PyTorch 转 ONNX 转 TRT
  • FP16 优化
  • cuda-graph 优化
  • INT8 量化优化
  • ONNX 模型层面优化
  • Pipeline 优化
  • 模型内深度优化

我们需要先快速的去了解网络,然后将其转换成 Onnx 和 Tensorrt,然后再去根据结果进行二次优化

一、网络结构 - 总结

1.1、代码

Pytorch 代码:https://github.com/mit-han-lab/bevfusion
CUDA-BEVFusion 部署代码:https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution/tree/master/

1.2、网络流程图

在这里插入图片描述

1.3、模块大致梳理

在这里插入图片描述

二、Onnx 的导出 -总体思路分析

在 CUDA-BEVFusion 的代码中一共有五个 onnx ,说明作者是分模块来导出 onnx 的。

模块onnx 名称
Cameracamera.backbone.onnx
Cameracamera.vtransform.onnx
Fusefuser.onnx
Lidarlidar.backbone.xyz.onnx
decoder + posthead.bbox.onnx
(1) 在 Camera 模块 中导出了两个 onnx,为什么要分两个 onnx 导出?

因为 bev_pool 中有个下采样的部分,会影响整个onnx的导出,所以才选择分开两个 onnx。第一个是backone相关的,第二个是bev_pool相关的

(2) Camera 的 backone 为什么选择了 Resnet50?

源代码的 backone 是选择了SwinTransform,但是由于 bev_pool 有大量的计算,并且SwinTransform含有大量的复杂计算,所以在部署的时候会选择 Resnet50,因为它结构简单,容易做量化且精度不会损失太大。

(3) 如何导出 bev_pool ?

有两种方式实现。

方法一: 做成 Plugin,但是这样太麻烦,所以不太推荐

方法二:使用核函数实现,分成三个部分(subclass机制

  • bev_pool之前用onnx;
  • bev_pool不导出onnx,用cuda核函数实现;
  • bev_pool后的 downsample使用 onnx
(4) lidar模块如何导出 onnx?

因为模块中包含 spconv ,pytorch不能直接导出onnx,所以使用 onnx.helper 自定义导出 onnx

(5) decoder部分为什么不能用int8?

因为模块中包含 transformer,并且Tensorrt推理中容易出现 NAN(这种情况极难解决)

三、优化思路总结

在这里插入图片描述

这篇关于模型部署 - BevFusion - (1) - 思路总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774152

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三