- 博客(82)
- 收藏
- 关注
原创 深度学习模型部署与优化:关键考虑与实践策略
深度学习模型的部署与优化是一个综合性的过程,涉及多个关键考虑因素。FLOPs常被用作模型计算复杂性的指标,但实际性能受到其他因素如内存访问和数据处理的影响。虽然工具如TensorRT为模型提供了强大的优化,但其应用并非无限,有时需要开发者手动调整或补充。此外,选择CUDA Cores还是Tensor Cores、考虑前后处理的效率,以及进一步的性能分析和基准测试,都是确保模型在特定硬件上达到最佳性能的关键步骤。
2023-12-04 17:34:29
1597
原创 学习部署中的onnx知识并且通过swin transformer的onnx导出和使用onnx surgeon 进行YOLOV5 GPU optimization
一切开始前先检查自己的onnx版本期待的4个主要的SDK是。
2023-12-04 17:33:16
2084
原创 YOLOV7量化第二步: 模型标定
这个过程中,method: A string. One of [‘entropy’, ‘mse’, ‘percentile’] 我们有三种办法,这个实际上要在做实验的时候看哪一个精度更高,这个就是看map值计算的区别。当然可以,模型量化中的标定(calibration)是一个关键过程,它主要确保在降低计算精度以减少模型大小和提高推理速度的同时,不会显著损害模型的准确性。一旦我们收集了各层的激活数据,接下来的步骤是分析这些数据来确定量化参数,即动态范围(也称为量化范围)和比例因子(scale)。
2023-10-15 22:53:43
1205
原创 ResNet分类器量化
下面先定义一个直方图校准的int8量化,然后对输入全部进行量化定义模型对模型插入qdq统计qdq节点的range 和 scale做敏感词分析导出一个qdq节点的ptq对模型进行finetune ----> qat。
2023-10-11 17:23:01
475
原创 量化初探: 对称量化以及非对称量化
量化(Quantization)是指将高精度浮点数表示为低精度整数的过程,从而提高神经网络的效率和性能。减小内存占用模型大小减少:通过量化,我们可以将32位浮点数转换为较低位宽的数(例如8位整数)。这可以显著减少模型的大小,使其更容易在内存受限的设备上部署。减少带宽需求:模型大小的减少也意味着在下载或传输模型时需要的带宽减少。加速计算特定硬件加速:很多硬件(例如Jetson)对低位宽的操作更有优势,因此量化模型可以更好地利用这些硬件特性。并行化:低位运算可以允许更高的并行度,从而进一步加速计算。
2023-10-10 20:57:26
1334
原创 固定开发板的ifconfig的IP地址
由于我是使用vsocode的ssh插件远程连接我的开发板, 所以我每次开机就要重新连上屏幕看一下这个ifconfig的ip地址然后更改我的ssh config文件。这些命令分别设置了静态IP地址、网关、DNS服务器,并将连接方法更改为手动(即静态)。,并且确保你使用的静态IP地址不会与网络上的其他设备产生冲突。接口应该使用你设置的静态IP地址。设置静态IP相对直接,下面是如何为你的。这将显示所有现有的网络连接。来查看详细信息并确认设置是否正确。接口相关的连接名称。
2023-09-24 00:27:06
474
原创 通过解读yolov5_gpu_optimization学习如何使用onnx_surgon
这里images是输入, 本来是1x3x640x640, 这里通过指定把0, 2, 3维度变成了动态轴的输入, 第二个维度是3这个还是固定的。这是一个英伟达的仓库, 这个仓库的做法就是通过用gs对onnx进行修改减少算子然后最后使用TensorRT插件实现算子, 左边是优化过的, 右边是原版的。这后面的重点是增加了用onnx-surgon来更改onnx, 先把整个onnx导入进来,然后使用然后用Variable做模型的输出, 这里做四个模型输出, 分别是。在对动态输入的onnx导出的时候,
2023-09-22 16:51:58
1017
原创 我的git笔记
我一般的工作的流程是先在Github上建一个新的仓库, 然后用ssh git clone下来, 但是有的时候有可能因为忘记过滤的问题,所以这里第一步是删除.git, 也就是之前的连接问题, 如果没有这个需求删掉这一步。如果你之前已经在远程服务器上有一个仓库,你将需要将其重命名或删除它,然后创建一个新的空仓库来推送你的新历史。这里还是很重要的,因为做AI的人很多时候训练一个设备部署一个设备,甚至测试多个不同设备部署的时候一定会用到的,这里前面部分操作跟第一个设备一样。首先确保备份你的所有工作!
2023-09-20 12:59:22
360
原创 3. Error Handle和获取硬件信息
这个没有报错, 这里grid(网格)只有一个, 然后这里不够块去计算了, 所以计算了一部分他就不计算了, 所以运行的速度快了很多, 以后如果CUDA编程中速度快了很多,要参考是否是没有完整的计算。这里分配之前矩阵乘法的blockSize = 64, 那么一个线程块里面有64x64=4096个线程,超出了1024的限制, 下面是不用KernelCheck()和用了的区别。至于这里两个,宏定义, 一个是用来检查CUDA Runtime API, 一个是检查核函数的。可以方便我们排查错误的来源。
2023-09-06 09:51:34
214
原创 2. 矩阵乘法对比CPU/GPU
在之前的Grid, Block布局分析中提到过, block和grid的布局最好跟计算的内容是一致的, 例如说图像和这里的矩阵是2D, 所以block的中的线程设置是2D, 一个block里面包含16x16=256, 32x32=1024个线程, 然后grid里面包含多少个block是基于这个计算出来的, 可以做一个向上取整确保有足够的线程计算。设计布局的时候,如果处理的是矩阵,或者是二维度的图像, 先设计好好block里面的线程规划,然后基于这个设计好grid中的block规划。
2023-09-05 16:06:05
526
原创 2.单链表练习
链表(Linked List)是一种常见的数据结构,用于存储一系列元素,这些元素可以是任意类型的数据。链表中的每个元素被称为节点(Node),每个节点包含两部分:一个存储数据的值(或称为数据域),以及一个指向下一个节点的引用(或称为指针或链接)。链表的大小可以在运行时动态地改变,而数组的大小通常是静态的。在链表中插入或删除元素相对容易,只需修改节点的引用,不需要像数组一样移动大量元素。链表可以有效地利用内存,因为每个节点只需存储自身的值和下一个节点的引用,而数组可能需要一块连续的内存空间。
2023-09-01 22:42:41
939
原创 1.cpp_数组练习
总之,数组问题在算法题目中占据了重要的地位,掌握数组的基本概念和常见的解题技巧,以及在具体问题中应用这些技巧,可以帮助你更有效地解决各种数组问题。通过不断练习和思考,你将能够更加熟练地处理各种不同类型的数组问题。
2023-08-31 15:42:32
180
原创 以yolov8-pose为案例学习如何写deepstream的回调函数
source:这个元素是用于从文件中读取视频流的输入源。它可以是任何 GStreamer 支持的视频输入源,如文件、摄像头、网络流等。streammux:这个元素是流复用器,用于将多个流合并成一个流,并将多帧画面打包为批处理数据。它可以将不同源的视频流合并为一个统一的输入。pgie:这个元素是主要的推理引擎(Primary GIE),用于执行物体检测和推理。它基于给定的配置文件进行推理,识别出图像中的物体并提取其特征。nvtracker。
2023-07-11 21:05:01
1235
原创 制作一个容器
在ubuntu主机下新建一个Dockerfile并且输入以下指令然后cd到包含这个Dockerfile的路径下输入查看镜像是否生成。
2023-05-25 11:39:27
215
1
原创 YOLOV5使用(一): docker跑通,详解TensorRT下plugin的onnx
本文通过使用封装好的docker直接跑通yolov5来直接学习这个经典的模型,了解数据集的格式。自己制作data和model的yaml文件。并且分析训练的参数, 使用Tensosrboard可视化,调整合适的batch size, 测试,评估模型来学习目标检测
2023-05-24 16:14:53
2145
1
原创 机器学习Dry Bean分析
This 本项目旨在对DryBean数据集进行详细分析,以揭示数据中的潜在信息和特征关系。DryBean数据集包含了7种不同品种的土耳其干豆数据,每种豆子都有16个特征,这些特征可以帮助我们了解豆子的形状、大小和形态。通过对这些特征进行探索性数据分析,我们可以更深入地了解各种豆子之间的差异,并找出可能影响豆子分类的关键因素。在分析过程中,我们使用了Python编程语言和多种数据分析库,如pandas、seaborn和matplotlib。首先,我们对数据集进行了整体概览,包括类别分布和特征描述性统计。
2023-05-19 15:23:11
2474
原创 深度学习Docker使用, (Pytorch/TensorRT/DeepStream),标记上传制作自己的DockerHub
自己学习使用Docker的笔记
2023-05-10 22:54:39
2252
1
原创 deepstream开发学习笔记: 追踪越界
GStreamer是一个开源的流媒体框架,用于构建音频和视频流应用程序。它提供了一组库和工具,可以通过它们将多个组件(element)组合在一起以构建流媒体应用程序。以下是对几个常见组件的简要解释:Pipeline:由多个元素组成的流水线。在 GStreamer 中,通过将多个元素连接在一起来构建一个流水线来实现多媒体处理和传输。Source:产生数据的元素。在流媒体应用中,数据可以来自文件、摄像头、网络等。
2023-04-18 16:10:30
1745
4
原创 在ubuntu apt get ffmpeg失效的情况下怎么安装ffmpeg
【代码】在ubuntu apt get ffmpeg失效的情况下怎么安装ffmpeg。
2023-04-14 08:02:32
446
1
原创 C++中的多线程
在使用CUDA进行异步编程的同时,使用CPU进行多线程处理也可以进一步提高计算速度。多线程技术可以充分利用多核CPU的计算能力,同时避免单一线程的瓶颈问题。
2023-04-10 11:13:15
601
原创 第一个TensorRT程序,写一个多层感知机
这里用显性batch, 显性 batch 是指在网络定义时指定 batch size 的大小。这是一种固定的 batch 大小,不会随输入数据而变化,而且可以通过 TensorRT 进行优化。显性 batch 是指在网络定义时指定 batch size 的大小。这是一种固定的 batch 大小,不会随输入数据而变化,而且可以通过 TensorRT 进行优化。KFLOAT, KHALF, KINT8, KINT32 是 TensorRT 中用于表示张量数据类型的枚举类型。
2023-03-29 18:21:12
682
原创 C++ OpenCV推理一个人脸识别案例
RTSP(Real-Time Streaming Protocol)是一种网络协议,用于在客户端和服务器之间传输实时流媒体数据。在视频监控领域,RTSP通常用于从摄像头或其他视频源获取视频流并将其推送到其他设备或平台。在这种情况下,将视频流从源设备推送到目标设备的过程称为“推流”。所以,RTSP推流指的是使用RTSP协议将实时流媒体数据从源设备推送到目标设备或平台的过程。
2023-03-28 20:18:48
1105
3
原创 OpenCV C++ 版本基本入门
1. 构建基于CMake的Task.json文件可执行文件那里更改demo就可以更改可执行文件的名称, 如果这里更改了luanch.json也是要更改的{ "version": "2.0.0", "tasks": [ // 1. cmake 配置 { "label": "cmake 配置", "type": "shell", "command": "cmake -B build -S . -DCMAKE_BUILD_TYPE=Debug", "problemMatch
2023-03-27 22:34:13
753
原创 # 1. CMAKE, 安装OPENCV,以及跑通一个opencv的程序
默认情况下,add_library创建的是静态库。如果需要创建动态库,需要使用 add_library( SHARED ),其中 SHARED 选项指定创建的是动态库。
2023-03-26 11:51:38
1198
原创 YOLOV5详解
首先YOLOV3/V4/V5都是根据训练的数据集来生成anchor, 就是在训练之前用一个独立的程序去计算Anchor, 但是还不够好因为自动生成的anchor是拿来整个数据集去做的,但是我们知道目标检测训练的时候是分batch训练的, YOLOV5这边把这个功能嵌入到训练的流程中, 也就是说YOLOV5每一个batch会生成一次anchor更加贴近我们的数据集。
2023-03-23 21:21:54
5374
原创 深度学习部署(十九): CUDA RunTime API_error
cudaDeviceSynchronize()函数会同步等待设备完成之前的所有任务并检查是否有错误发生,如果有错误会返回相应的错误码。所以使用cudaDeviceSynchronize()函数可以及时发现是否有错误发生,进而打印出错误信息。
2023-03-20 16:01:21
514
2
原创 深度学习部署(十九): CUDA RunTime API YOLOV5后处理cpu解码以及gpu解码
这是一个使用CPU和GPU解码YOLOv5,它可以在CPU和GPU上分别实现目标检测的加速,相比较于仅在CPU上运行的实现,GPU实现可以显著地提高检测速度。此外,该项目提供了一个端到端的实现流程,包括数据预处理、模型加载、前向推理、NMS等核心算法的实现,能够帮助我们深入理解目标检测的算法原理和实现细节。在学习这个项目过程中,我们可以学习到如何使用CUDA C++编写GPU加速的代码,理解CUDA编程中的基本概念和术语,如线程、块、网格等;还可以学习到CUDA编程中的技术理解两种部署心得
2023-03-20 14:29:39
4530
10
原创 深度学习部署(十八): CUDA RunTime API _wa_仿射变换的实现
warpAffine是一种二维仿射变换技术,可以将图像从一种形式转换为另一种形式。它是OpenCV图像处理库中的一个函数,可用于对图像进行平移、旋转、缩放和剪切等操作。仿射变换可以通过线性变换来描述,可以用一个2x3的矩阵来表示。在图像处理中,这个矩阵通常称为变换矩阵,其中包含了平移、旋转、缩放和剪切的参数。通过warpAffine函数,我们可以将这个变换矩阵应用到输入图像中的每个像素上,从而生成一个新的输出图像。这使得我们可以对图像进行各种几何变换,如旋转、缩放、翻转和扭曲等。
2023-03-16 21:55:43
1376
3
原创 深度学习部署(十七): CUDA RunTime API _reduce-sum_规约求和的实现
线程 0 会将当前的 value 值存储到 cache[0] 中,即 cache[0] = value。第二次循环结束后,线程 0 判断 lane < i,即 0 < 32,所以会将 value 加上 cache[0 + 32] 的值(cache[32]),即 value += cache[32]。第三次循环结束后,线程 0 判断 lane < i,即 0 < 16,所以会将 value 加上 cache[0 + 16] 的值(cache[16]),即 value += cache[16]。
2023-03-14 11:27:27
682
原创 学习怎么写博客
卷积层通过卷积操作提取图像中的特征,激活层通过对卷积层的输出进行非线性映射,池化层对卷积层输出进行降维,而全连接层则将卷积层和池化层提取的特征进行组合,并将最终的特征向量输入到softmax分类器进行分类。第一个全连接层的输入向量长度为4855,输出向量长度为1200,第二个全连接层的输入向量长度为1200,输出向量长度为128,第三个全连接层的输入向量长度为128,输出向量长度为nclass,等于分类任务的类别数。因此,这3个全连接层的作用是将高维特征向量映射到低维向量,以便进行分类。
2023-03-14 07:59:59
159
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人