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

    文章

    4842

    浏览量

    108158
  • NVIDIA
    +关注

    关注

    14

    文章

    5685

    浏览量

    110111

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B 板卡Docker环境部署方法

    EASY-EAI-Nano完成适配,用户可以随时随地进行部署。Dockerfile、Image(镜像)和Container(容器)为Docker中的三个重要概念。通过Image我们可以创
    的头像 发表于 04-22 14:16 235次阅读
    瑞芯微(EASY EAI)RV1126B 板卡Docker环境<b class='flag-5'>部署</b>方法

    技嘉与趋境科技联合部署AMaaS平台 推动本地大模型应用加速落地

    在生成式AI加速走向实际应用的当下,大模型部署正从“可体验”迈向“可落地、可管理、可应用”。作为技嘉面向本地AI场景打造的重要产品,AI TOP ATOM具备强大的桌面级本地AI算力,搭载了
    的头像 发表于 03-12 15:11 198次阅读
    技嘉与趋境科技联合<b class='flag-5'>部署</b>AMaaS平台 推动本地大模型应用<b class='flag-5'>加速</b>落地

    EIDS 车下走行部图像检测系统——智能诊断车辆异常与预警

    志强视觉科技的EIDS车下走行部图像检测系统为铁路行车安全的最关键部位之一——走行部,建立了一道自动化、智能化的“电子防线”。
    的头像 发表于 03-03 17:36 371次阅读
    EIDS 车下走<b class='flag-5'>行部</b>图像检测系统——智能诊断车辆异常与预警

    沐曦股份GPU加速技术助力药物研发降本增效

    沐曦股份科学计算团队近期取得突破性进展,成功将主流分子动力学模拟引擎GROMACS中的FEP计算全流程部署于GPU执行,并实现2.5倍性能提升,相关成果获得GROMACS官方团队的高度认可,该GPU
    的头像 发表于 12-02 15:58 895次阅读

    工业级-专业液晶图形显示加速器RA8889ML3N简介+显示方案选型参考表

    控制等高级显示功能,通过硬件加速(如Alpha混合)来执行这些操作,避免了由MCU软件处理带来的性能开销。核心特性: 主控端接口:支持8080/6800异步并行接口和IIC、3/4-wire SPI串行
    发表于 11-14 16:03

    NVIDIA TensorRT LLM 1.0推理框架正式上线

    TensorRT LLM 作为 NVIDIA 为大规模 LLM 推理打造的推理框架,核心目标是突破 NVIDIA 平台上的推理性能瓶颈。为实现这一目标,其构建了多维度的核心实现路径:一方面,针对需
    的头像 发表于 10-21 11:04 1403次阅读

    CICC2033神经网络部署相关操作

    在完成神经网络量化后,需要将神经网络部署到硬件加速器上。首先需要将所有权重数据以及输入数据导入到存储器内。 在仿真环境下,可将其存于一个文件,并在 Verilog 代码中通过 readmemh 函数
    发表于 10-20 08:00

    TensorRT-LLM的大规模专家并行架构设计

    之前文章已介绍引入大规模 EP 的初衷,本篇将继续深入介绍 TensorRT-LLM 的大规模专家并行架构设计与创新实现。
    的头像 发表于 09-23 14:42 1370次阅读
    <b class='flag-5'>TensorRT</b>-LLM的大规模专家并行架构设计

    DeepSeek R1 MTP在TensorRT-LLM中的实现与优化

    TensorRT-LLM 在 NVIDIA Blackwell GPU 上创下了 DeepSeek-R1 推理性能的世界纪录,Multi-Token Prediction (MTP) 实现了大幅提速
    的头像 发表于 08-30 15:47 4674次阅读
    DeepSeek R1 MTP在<b class='flag-5'>TensorRT</b>-LLM中的实现与优化

    TensorRT-LLM中的分离式服务

    在之前的技术博客中,我们介绍了低延迟[1] 和高吞吐[2] 场景的优化方法。对于生产部署,用户还关心在满足特定延迟约束的情况下,每个 GPU 的吞吐表现。本文将围绕“吞吐量-延迟”性能场景,介绍 TensorRT-LLM 分离式服务的设计理念、使用方法,以及性能研究结果。
    的头像 发表于 08-27 12:29 1969次阅读
    <b class='flag-5'>TensorRT</b>-LLM中的分离式服务

    NVIDIA RTX AI加速FLUX.1 Kontext现已开放下载

    NVIDIA RTX 与 NVIDIA TensorRT 现已加速 Black Forest Labs 的最新图像生成和编辑模型;此外,Gemma 3n 现可借助 RTX 和 NVIDIA Jetson 加速运行。
    的头像 发表于 07-16 09:16 2174次阅读

    如何在魔搭社区使用TensorRT-LLM加速优化Qwen3系列模型推理部署

    TensorRT-LLM 作为 NVIDIA 专为 LLM 推理部署加速优化的开源库,可帮助开发者快速利用最新 LLM 完成应用原型验证与产品部署
    的头像 发表于 07-04 14:38 2414次阅读

    爱立信携手超微加速边缘人工智能部署

    爱立信与超微 Supermicro近日宣布有意开展战略合作,加速边缘人工智能部署
    的头像 发表于 06-17 09:42 1.6w次阅读

    使用NVIDIA Triton和TensorRT-LLM部署TTS应用的最佳实践

    针对基于 Diffusion 和 LLM 类别的 TTS 模型,NVIDIA Triton 和 TensorRT-LLM 方案能显著提升推理速度。在单张 NVIDIA Ada Lovelace
    的头像 发表于 06-12 15:37 2067次阅读
    使用NVIDIA Triton和<b class='flag-5'>TensorRT</b>-LLM<b class='flag-5'>部署</b>TTS应用的最佳实践

    企业部署AI大模型怎么做

    当下,AI大模型已成为驱动决策自动化、服务智能化与产品创新的核心引擎。然而,企业面对动辄数百亿参数的大模型部署时,常陷入算力不足、响应延迟高、成本失控等困境。如何突破瓶颈,实现高效、稳定的AI部署呢?下面,AI部落小编为您分享。
    的头像 发表于 06-04 09:26 1012次阅读