0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

执行部署的TensorRT加速引擎

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-06-01 10:33 次阅读

很多开发人员在转换完 TensorRT 加速引擎之后,最后准备调用起来执行推理任务的时候,就遇到一些障碍。这个环节是需要开发人员自行撰写相关代码,去执行读入数据(前处理)、执行推理、显示结果(后处理)等工作,如下图最右边的部分。

39d89e3c-e152-11ec-ba43-dac502259ad0.png

这部分的麻烦之处,在于每个神经网络的结构不相同,并没有“通用”的代码可以适用于大部分的网络结构,需要针对指定神经网络去撰写对应的代码,最重要是需要清除这个模型的输入 (input bold) 与输出 (outpold) 的名称与张量结构。

本文以前面在 TAO 工具套件中使用的 ssd 神经网络为范例,提供基础的“前后处理”范例代码给读者参考,这是从 NVIDIA 中国区开发者社区所举办过多届 “Sky 黑客松”比赛中,所提供的开源内容中提取的重点,主要如下:

1、数据前处理:


  def _preprocess_trt(img, shape=(300, 300)):    """TRT SSD推理前的数据前处理"""    img = cv2.resize(img, shape)    img = img.transpose((2, 0, 1)).astype(np.float32)returnimg

这里 “shape=(300,300)” 为张量的尺度,根据模型训练时的长宽两个变量,至于 transpose 里的 (2,0,1) 是固定的,不需调整。

2、数据后处理:


  def _postprocess_trt(img, output, conf_th, output_layout):    """TRT SSD推理后的结果的数据处理步骤."""    img_h, img_w, _ = img.shape    boxes, confs, clss = [], [], []    for prefix in range(0, len(output), output_layout):        index = int(output[prefix+0])        conf = float(output[prefix+2])        if conf < conf_th:            continue        x1 = int(output[prefix+3] * img_w)        y1 = int(output[prefix+4] * img_h)        x2 = int(output[prefix+5] * img_w)        y2 = int(output[prefix+6] * img_h)        cls = int(output[prefix+1])        boxes.append((x1, y1, x2, y2))        confs.append(conf)        clss.append(cls)returnboxes,confs,clss#返回标框坐标、置信度、类别

这里最重要的 x1, y1,x2, y2 坐标值,必须根据 SSD 神经网络所定义的规范去进行修改,其他部分可以通用于大部分神经网络。

3、定义 TrtSSD 类封装运行 TRT SSD 所需的东西:


  class TrtSSD(object):# 加载自定义组建,如果TRT版本小于7.0需要额外生成flattenconcat自定义组件库    def _load_plugins(self):        if trt.__version__[0] < '7':            ctypes.CDLL("ssd/libflattenconcat.so")        trt.init_libnvinfer_plugins(self.trt_logger, '')#加载通过Transfer Learning Toolkit生成的推理引擎    def _load_engine(self):        TRTbin = 'ssd/TRT_%s.bin' % self.model  #请根据实际状况自行修改        with open(TRTbin, 'rb') as f, trt.Runtime(self.trt_logger) as runtime:            return runtime.deserialize_cuda_engine(f.read())#通过加载的引擎,生成可执行的上下文    def _create_context(self):        for binding in self.engine:            size = trt.volume(self.engine.get_binding_shape(binding)) *                    self.engine.max_batch_size##注意:这里的host_mem需要使用pagelockedmemory,以免内存被释放            host_mem = cuda.pagelocked_empty(size, np.float32)            cuda_mem = cuda.mem_alloc(host_mem.nbytes)            self.bindings.append(int(cuda_mem))            if self.engine.binding_is_input(binding):                self.host_inputs.append(host_mem)                self.cuda_inputs.append(cuda_mem)            else:                self.host_outputs.append(host_mem)                self.cuda_outputs.append(cuda_mem)        return self.engine.create_execution_context()# 初始化引擎    def __init__(self, model, input_shape, output_layout=7):        self.model = model        self.input_shape = input_shape        self.output_layout = output_layout        self.trt_logger = trt.Logger(trt.Logger.INFO)        self._load_plugins()        self.engine = self._load_engine()
        self.host_inputs = []        self.cuda_inputs = []        self.host_outputs = []        self.cuda_outputs = []        self.bindings = []        self.stream = cuda.Stream()        self.context = self._create_context()# 释放引擎,释放GPU显存,释放CUDA流    def __del__(self):        del self.stream        del self.cuda_outputs        del self.cuda_inputs# 利用生成的可执行上下文执行推理    def detect(self, img, conf_th=0.3):        img_resized = _preprocess_trt(img, self.input_shape)        np.copyto(self.host_inputs[0], img_resized.ravel())        # 将处理好的图片从CPU内存中复制到GPU显存        cuda.memcpy_htod_async(            self.cuda_inputs[0], self.host_inputs[0], self.stream)        # 开始执行推理任务        self.context.execute_async(            batch_size=1,            bindings=self.bindings,            stream_handle=self.stream.handle)        # 将推理结果输出从GPU显存复制到CPU内存        cuda.memcpy_dtoh_async(            self.host_outputs[1], self.cuda_outputs[1], self.stream)        cuda.memcpy_dtoh_async(            self.host_outputs[0], self.cuda_outputs[0], self.stream)        self.stream.synchronize()
        output = self.host_outputs[0]return_postprocess_trt(img,output,conf_th,self.output_layout)

上面三个部分对不同神经网络都是不同的内容,如果要参考 YOLO 神经网络的对应内容,推荐参考https://github.com/jkjung-avt/tensorrt_demos开源项目,里面有完整的 YOLOv3 与 YOLOv4 的详细内容。

本文的开源代码可以在此链接下载完整的内容与配套的工具。

https://pan.baidu.com/s/1fGLBnzqtnRNpfD3PbileOA密码: 99et

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4765

    浏览量

    100608
  • NVIDIA
    +关注

    关注

    14

    文章

    4952

    浏览量

    102865

原文标题:NVIDIA Jetson Nano 2GB 系列文章(65):执行部署的 TensorRT 加速引擎

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NVIDIA TensorRT-LLM Roadmap现已在GitHub上公开发布

    感谢众多用户及合作伙伴一直以来对NVIDIA TensorRT-LLM的支持。TensorRT-LLM 的 Roadmap 现已在 GitHub 上公开发布!
    的头像 发表于 11-28 10:43 185次阅读
    NVIDIA <b class='flag-5'>TensorRT</b>-LLM Roadmap现已在GitHub上公开发布

    IBM将在云平台部署AMD加速

    IBM与AMD近期宣布了一项重要合作协议,根据协议,IBM将在其云平台上部署AMD Instinct MI300X加速器。这一举措旨在提升企业客户在生成式AI模型方面的性能和能效,进一步推动AI技术的创新与应用。
    的头像 发表于 11-19 16:24 181次阅读

    TensorRT-LLM低精度推理优化

    本文将分享 TensorRT-LLM 中低精度量化内容,并从精度和速度角度对比 FP8 与 INT8。首先介绍性能,包括速度和精度。其次,介绍量化工具 NVIDIA TensorRT Model
    的头像 发表于 11-19 14:29 197次阅读
    <b class='flag-5'>TensorRT</b>-LLM低精度推理优化

    IPv6 大规模部署,开启网络新时代的强劲引擎

    在互联网技术迅猛发展的今天,IPv6作为新一代互联网协议,正以不可阻挡的势头引领全球网络进入一个全新的演进阶段,成为开启网络新时代的关键钥匙。IPv6部署现状:全球加速,中国领跑2024年,全球
    的头像 发表于 11-06 10:24 488次阅读
    IPv6 大规模<b class='flag-5'>部署</b>,开启网络新时代的强劲<b class='flag-5'>引擎</b>

    容器云服务引擎是什么意思?

    容器云服务引擎是什么意思?容器云服务引擎是一种基于云原生架构的容器编排工具,能够帮助用户快速构建、部署和管理容器化应用。它支持容器化应用的全生命周期管理,包括部署、管理和扩展,旨在简化
    的头像 发表于 10-19 17:08 154次阅读

    容器云服务引擎是什么?如何使用

    容器云服务引擎(CloudContainerEngine,简称CCE),是一个企业级的Kubernetes集群托管服务,提供高度可扩展、高性能的云原生应用部署和管理方案。容器云服务引擎一种基于云原生
    的头像 发表于 09-30 10:17 167次阅读

    魔搭社区借助NVIDIA TensorRT-LLM提升LLM推理效率

    “魔搭社区是中国最具影响力的模型开源社区,致力给开发者提供模型即服务的体验。魔搭社区利用NVIDIA TensorRT-LLM,大大提高了大语言模型的推理性能,方便了模型应用部署,提高了大模型产业应用效率,更大规模地释放大模型的应用价值。”
    的头像 发表于 08-23 15:48 403次阅读

    大模型端侧部署加速,都有哪些芯片可支持?

    电子发烧友网报道(文/李弯弯)大模型在端侧部署是指将大型神经网络模型部署在移动终端设备上,使这些设备能够直接运行这些模型,从而执行各种人工智能任务,如图像识别、语音识别、自然语言处理等。随着大模型
    的头像 发表于 05-24 00:14 4006次阅读

    鸿蒙实战开发-本地部署、SmartPerf 编译部署指导文档

    install 在项目目录下运行命令: npm run build 编译成功后会有main 可执行文件生成。 项目部署 直接运行 ./main 可执行程序,完成项目的部署
    发表于 05-09 14:23

    NVIDIA加速微软最新的Phi-3 Mini开源语言模型

    NVIDIA 宣布使用 NVIDIA TensorRT-LLM 加速微软最新的 Phi-3 Mini 开源语言模型。TensorRT-LLM 是一个开源库,用于优化从 PC 到云端的 NVIDIA GPU 上运行的大语言模型推理
    的头像 发表于 04-28 10:36 505次阅读

    简单三步使用OpenVINO™搞定ChatGLM3的本地部署

    英特尔 OpenVINO™ 工具套件是一款开源 AI 推理优化部署的工具套件,可帮助开发人员和企业加速生成式人工智能 (AIGC)、大语言模型、计算机视觉和自然语言处理等 AI 工作负载,简化深度学习推理的开发和部署,便于实现从
    的头像 发表于 04-03 18:18 2022次阅读
    简单三步使用OpenVINO™搞定ChatGLM3的本地<b class='flag-5'>部署</b>

    蔚来汽车加速部署换电站,第四代站4月启动

    在今日的沟通会中,蔚来汽车首席执行官兼创始人李斌透露,近期部署进度放缓的主要原因为等待第四代换电站的交付,预计该站将于4月份启动部署工作。
    的头像 发表于 03-14 14:30 525次阅读

    百度搜索exgraph图执行引擎设计与实践分享

    百度搜索exgraph图执行引擎设计重点分成三个部分:图描述语言、图执行引擎、对接扩展。
    的头像 发表于 01-16 10:27 513次阅读
    百度搜索exgraph图<b class='flag-5'>执行</b><b class='flag-5'>引擎</b>设计与实践分享

    Torch TensorRT是一个优化PyTorch模型推理性能的工具

    那么,什么是Torch TensorRT呢?Torch是我们大家聚在一起的原因,它是一个端到端的机器学习框架。而TensorRT则是NVIDIA的高性能深度学习推理软件工具包。Torch TensorRT就是这两者的结合。
    的头像 发表于 01-09 16:41 1623次阅读
    Torch <b class='flag-5'>TensorRT</b>是一个优化PyTorch模型推理性能的工具

    【爱芯派 Pro 开发板试用体验】模型部署(以mobilenetV2为例)

    ,以及pulsar2作为推理引擎的一些细节。 1、完整流程概括 可以将模型部署细分为以下几个步骤,其实就是和用onnxruntime\\\\openvino\\\\tensorRT这些部署
    发表于 12-10 16:34