![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
模型部署
文章平均质量分 66
高性能部署
Blizzard_v
An explorer
展开
-
虚拟内存、锁页内存、内存分页、分段、段页式内存管理
当主存没有足够的空间并且有更多的数据写入内存时,一些页面将被移动到硬盘驱动器(hard drive)。使用分页内存,每个程序都有自己的逻辑内存,即内存可以分成连续的页面。所以一个程序的内存可能在它自己的逻辑内存上是连续的,但在物理内存上是分段的。逻辑地址是程序运行时由CPU生成的地址,它是一个虚拟地址,之所以说是虚拟地址,是因为它不是物理上真实存在的地址。,是一种内存管理方案,计算机通过该方案存储和检索二级存储器中的数据,二级存储器通常是指硬盘驱动器上的交换swap区域,用于主存储器。原创 2022-09-17 12:44:15 · 882 阅读 · 0 评论 -
使用pybind11为python开发扩展模块
比如使用pybind11可以封装一个c++类对应到python中。python的底层大都使用c++进行封装,可以利用c++的计算性能和python的便利性。: .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用。如何用pybind11定义一个模块呢?用下面的代码简单解释下。原创 2022-11-12 16:59:47 · 618 阅读 · 0 评论 -
模型部署时的调试技巧,debug方法
【代码】模型部署时的调试技巧,debug方法。原创 2022-11-11 22:45:48 · 801 阅读 · 0 评论 -
RAII+接口模式下的生产者消费者多batch实现以及封装
RAII(Resource Acquisition Is Initialization),也称直译为“资源获取就是初始化”。这里的生产者消费者指的是模型推理的过程,原创 2022-11-11 16:30:52 · 211 阅读 · 0 评论 -
使用RAII+接口模式对模型加载和推理进行封装
infer.hpp头文件:这个时候你会发现这个头文件里只依赖了最简单的东西,这里就只有memory,string很常见因为基本都要包含,所以直接无视。能做成这样的原因是因为实现真正功能的类(class InferImpl)里的那些很多成员变量在infer.hpp头文件这里是没有被暴露出来的。为了帮助理解这一点,我举个例子,就是对应下面代码注释掉的地方。原创 2022-11-10 18:04:32 · 703 阅读 · 0 评论 -
生产者消费者模式promise、future、condition_variable
同步调用(同步就意味着一个一个挨着执行,执行完了下一个再执行,所以同步是指都放在一个线程里)还有一个很大的缺陷就是对这个线程的承载是非常重的。当调用你这个线程执行你算法的操作时,如果太重了就会使得性能比较差,因为你的线程上下文是需要初始化的,你的线程里有很多内容是需要分配资源的。所以如果我的调用的逻辑跟你的推理的逻辑不在一个线程里,就会使得调用非常轻便,性能非常好,接口也更加简单便利。原创 2022-11-09 21:27:22 · 474 阅读 · 0 评论 -
C++多线程
【代码】C++多线程。原创 2022-11-09 19:09:04 · 155 阅读 · 0 评论 -
Int8量化
int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法。原创 2022-11-06 16:36:27 · 1619 阅读 · 0 评论 -
tensorRT的插件(自定义算子)实现
算子的基本组成就是一些加减乘除和一些基本运算,封装成算子的话,可以方便后续的重复调用,软工上的思想就是抽象和复用。自定义算子(插件)就是自己把一些常用的计算过程封装成一个算子,这个封装官方并没有实现过。当然你也可以选择不做成算子,按照数学公式实现出来进行部署同样不会报错,但就是导出的onnx非常乱。还有的情况就是forward中包含了自己用cpp写的cuda实现时,这是不能被trace的,即PyTorch 无法 trace (跟踪)数据流动,所以这是也需要把这一坨弄成一个plugin,就能够trace了。原创 2022-11-06 15:38:42 · 945 阅读 · 0 评论 -
onnx文件及其结构、正确导出onnx、onnx读取、onnx创建、onnx修改、onnx解析器
通过把onnx-ml.proto这个文件交给protoc,protoc是Protobuf提供的编译程序(protoc --help可查看protoc工具的具体用法),把它。原创 2022-11-06 12:27:55 · 22162 阅读 · 1 评论 -
tensorRT模型推理时动态shape
和之前全连接的代码唯一的区别就是两个点,一个是网络结构的定义换成了CNN,另一个是动态shape的配置createOptimizationProfile。OptimizationProfile是一个优化配置文件,用来指定输入的shape可以变换的范围的,不要被优化两个字蒙蔽了双眼,其实就是为了告诉tensorRT我的shape是什么范围!在全卷积网络中我们通常就是有这个诉求的,推理时的shape是可以动态改变的,不一定要限制死,这个动态shape不一定只宽高,还指batchsize也是动态的。原创 2022-11-05 16:43:50 · 1865 阅读 · 1 评论 -
tensorRT实现模型的推理过程
【代码】tensorRT实现模型的推理过程。原创 2022-11-05 13:30:14 · 1490 阅读 · 0 评论 -
tensorRT是怎么构建和编译一个模型的
因此tensorRT的模型需要在目标GPU上实际运行的方式选择最优算法和配置(不跑跑,我哪知道怎么才最快,因为显卡是有高低档之分的,高档和低档最大的区别就是里面配置的加速器还有架构是非常不一样的,如果我们用tensorRT进行编译的话,那么它会根据你的显卡所开放的一些性能,充分得利用这些性能去使得速度尽可能快),也因此。1.首先定义网络(这里的定义网络是指我现在有个模型我要告诉tensorrt,我通过什么方式去告诉它,比如我的权重是多少我怎么去让tensorrt知道)2.编译生成engine模型文件。原创 2022-11-04 21:20:53 · 1037 阅读 · 0 评论