模型部署 - 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

相关文章

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基