0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

執(zhí)行部署的TensorRT加速引擎

NVIDIA英偉達(dá)企業(yè)解決方案 ? 來(lái)源:NVIDIA英偉達(dá)企業(yè)解決方案 ? 作者:NVIDIA英偉達(dá)企業(yè)解 ? 2022-06-01 10:33 ? 次閱讀

很多開(kāi)發(fā)人員在轉(zhuǎn)換完 TensorRT 加速引擎之后,最后準(zhǔn)備調(diào)用起來(lái)執(zhí)行推理任務(wù)的時(shí)候,就遇到一些障礙。這個(gè)環(huán)節(jié)是需要開(kāi)發(fā)人員自行撰寫(xiě)相關(guān)代碼,去執(zhí)行讀入數(shù)據(jù)(前處理)、執(zhí)行推理、顯示結(jié)果(后處理)等工作,如下圖最右邊的部分。

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

這部分的麻煩之處,在于每個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)不相同,并沒(méi)有“通用”的代碼可以適用于大部分的網(wǎng)絡(luò)結(jié)構(gòu),需要針對(duì)指定神經(jīng)網(wǎng)絡(luò)去撰寫(xiě)對(duì)應(yīng)的代碼,最重要是需要清除這個(gè)模型的輸入 (input bold) 與輸出 (outpold) 的名稱(chēng)與張量結(jié)構(gòu)。

本文以前面在 TAO 工具套件中使用的 ssd 神經(jīng)網(wǎng)絡(luò)為范例,提供基礎(chǔ)的“前后處理”范例代碼給讀者參考,這是從 NVIDIA 中國(guó)區(qū)開(kāi)發(fā)者社區(qū)所舉辦過(guò)多屆 “Sky 黑客松”比賽中,所提供的開(kāi)源內(nèi)容中提取的重點(diǎn),主要如下:

1、數(shù)據(jù)前處理:


  def _preprocess_trt(img, shape=(300, 300)):    """TRT SSD推理前的數(shù)據(jù)前處理"""    img = cv2.resize(img, shape)    img = img.transpose((2, 0, 1)).astype(np.float32)returnimg

這里 “shape=(300,300)” 為張量的尺度,根據(jù)模型訓(xùn)練時(shí)的長(zhǎng)寬兩個(gè)變量,至于 transpose 里的 (2,0,1) 是固定的,不需調(diào)整。

2、數(shù)據(jù)后處理:


  def _postprocess_trt(img, output, conf_th, output_layout):    """TRT SSD推理后的結(jié)果的數(shù)據(jù)處理步驟."""    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#返回標(biāo)框坐標(biāo)、置信度、類(lèi)別

這里最重要的 x1, y1,x2, y2 坐標(biāo)值,必須根據(jù) SSD 神經(jīng)網(wǎng)絡(luò)所定義的規(guī)范去進(jìn)行修改,其他部分可以通用于大部分神經(jīng)網(wǎng)絡(luò)。

3、定義 TrtSSD 類(lèi)封裝運(yùn)行 TRT SSD 所需的東西:


  class TrtSSD(object):# 加載自定義組建,如果TRT版本小于7.0需要額外生成flattenconcat自定義組件庫(kù)    def _load_plugins(self):        if trt.__version__[0] < '7':            ctypes.CDLL("ssd/libflattenconcat.so")        trt.init_libnvinfer_plugins(self.trt_logger, '')#加載通過(guò)Transfer Learning Toolkit生成的推理引擎    def _load_engine(self):        TRTbin = 'ssd/TRT_%s.bin' % self.model  #請(qǐng)根據(jù)實(shí)際狀況自行修改        with open(TRTbin, 'rb') as f, trt.Runtime(self.trt_logger) as runtime:            return runtime.deserialize_cuda_engine(f.read())#通過(guò)加載的引擎,生成可執(zhí)行的上下文    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,以免內(nèi)存被釋放            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# 利用生成的可執(zhí)行上下文執(zhí)行推理    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內(nèi)存中復(fù)制到GPU顯存        cuda.memcpy_htod_async(            self.cuda_inputs[0], self.host_inputs[0], self.stream)        # 開(kāi)始執(zhí)行推理任務(wù)        self.context.execute_async(            batch_size=1,            bindings=self.bindings,            stream_handle=self.stream.handle)        # 將推理結(jié)果輸出從GPU顯存復(fù)制到CPU內(nèi)存        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)

上面三個(gè)部分對(duì)不同神經(jīng)網(wǎng)絡(luò)都是不同的內(nèi)容,如果要參考 YOLO 神經(jīng)網(wǎng)絡(luò)的對(duì)應(yīng)內(nèi)容,推薦參考https://github.com/jkjung-avt/tensorrt_demos開(kāi)源項(xiàng)目,里面有完整的 YOLOv3 與 YOLOv4 的詳細(xì)內(nèi)容。

本文的開(kāi)源代碼可以在此鏈接下載完整的內(nèi)容與配套的工具。

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4777

    瀏覽量

    100987
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5063

    瀏覽量

    103442

原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(65):執(zhí)行部署的 TensorRT 加速引擎

文章出處:【微信號(hào):NVIDIA-Enterprise,微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常見(jiàn)的容器云服務(wù)引擎有哪些?

    常見(jiàn)的容器云服務(wù)引擎有哪些?云服務(wù)引擎涵蓋數(shù)據(jù)庫(kù)、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)處理、數(shù)據(jù)分析、容器云、機(jī)器學(xué)習(xí)及數(shù)據(jù)集成等多個(gè)領(lǐng)域,提供一站式解決方案。云服務(wù)引擎是云計(jì)算領(lǐng)域的重要組成部分,它們提供了各種服務(wù)來(lái)幫助用戶(hù)構(gòu)建、
    的頭像 發(fā)表于 01-07 09:49 ?57次閱讀

    NVIDIA TensorRT-LLM Roadmap現(xiàn)已在GitHub上公開(kāi)發(fā)布

    感謝眾多用戶(hù)及合作伙伴一直以來(lái)對(duì)NVIDIA TensorRT-LLM的支持。TensorRT-LLM 的 Roadmap 現(xiàn)已在 GitHub 上公開(kāi)發(fā)布!
    的頭像 發(fā)表于 11-28 10:43 ?319次閱讀
    NVIDIA <b class='flag-5'>TensorRT</b>-LLM Roadmap現(xiàn)已在GitHub上公開(kāi)發(fā)布

    IBM將在云平臺(tái)部署AMD加速

    IBM與AMD近期宣布了一項(xiàng)重要合作協(xié)議,根據(jù)協(xié)議,IBM將在其云平臺(tái)上部署AMD Instinct MI300X加速器。這一舉措旨在提升企業(yè)客戶(hù)在生成式AI模型方面的性能和能效,進(jìn)一步推動(dòng)AI技術(shù)的創(chuàng)新與應(yīng)用。
    的頭像 發(fā)表于 11-19 16:24 ?249次閱讀

    TensorRT-LLM低精度推理優(yōu)化

    本文將分享 TensorRT-LLM 中低精度量化內(nèi)容,并從精度和速度角度對(duì)比 FP8 與 INT8。首先介紹性能,包括速度和精度。其次,介紹量化工具 NVIDIA TensorRT Model
    的頭像 發(fā)表于 11-19 14:29 ?367次閱讀
    <b class='flag-5'>TensorRT</b>-LLM低精度推理優(yōu)化

    IPv6 大規(guī)模部署,開(kāi)啟網(wǎng)絡(luò)新時(shí)代的強(qiáng)勁引擎

    在互聯(lián)網(wǎng)技術(shù)迅猛發(fā)展的今天,IPv6作為新一代互聯(lián)網(wǎng)協(xié)議,正以不可阻擋的勢(shì)頭引領(lǐng)全球網(wǎng)絡(luò)進(jìn)入一個(gè)全新的演進(jìn)階段,成為開(kāi)啟網(wǎng)絡(luò)新時(shí)代的關(guān)鍵鑰匙。IPv6部署現(xiàn)狀:全球加速,中國(guó)領(lǐng)跑2024年,全球
    的頭像 發(fā)表于 11-06 10:24 ?624次閱讀
    IPv6 大規(guī)模<b class='flag-5'>部署</b>,開(kāi)啟網(wǎng)絡(luò)新時(shí)代的強(qiáng)勁<b class='flag-5'>引擎</b>

    容器云服務(wù)引擎是什么意思?

    容器云服務(wù)引擎是什么意思?容器云服務(wù)引擎是一種基于云原生架構(gòu)的容器編排工具,能夠幫助用戶(hù)快速構(gòu)建、部署和管理容器化應(yīng)用。它支持容器化應(yīng)用的全生命周期管理,包括部署、管理和擴(kuò)展,旨在簡(jiǎn)化
    的頭像 發(fā)表于 10-19 17:08 ?199次閱讀

    容器云服務(wù)引擎是什么?如何使用

    容器云服務(wù)引擎(CloudContainerEngine,簡(jiǎn)稱(chēng)CCE),是一個(gè)企業(yè)級(jí)的Kubernetes集群托管服務(wù),提供高度可擴(kuò)展、高性能的云原生應(yīng)用部署和管理方案。容器云服務(wù)引擎一種基于云原生
    的頭像 發(fā)表于 09-30 10:17 ?217次閱讀

    Arm與紅帽如何加速軟件生態(tài)系統(tǒng)發(fā)展

    隨著 IT 基礎(chǔ)設(shè)施環(huán)境的不斷發(fā)展,企業(yè)機(jī)構(gòu)在從廣闊的云網(wǎng)絡(luò)到資源有限的邊緣環(huán)境之間,橫跨不同基礎(chǔ)設(shè)施進(jìn)行部署時(shí),會(huì)面臨到無(wú)數(shù)的挑戰(zhàn)。每種部署方式的要求不盡相同,而為了實(shí)現(xiàn)無(wú)縫集成,則需要標(biāo)準(zhǔn)化的解決方案進(jìn)行應(yīng)對(duì)。
    的頭像 發(fā)表于 09-05 15:51 ?356次閱讀

    魔搭社區(qū)借助NVIDIA TensorRT-LLM提升LLM推理效率

    “魔搭社區(qū)是中國(guó)最具影響力的模型開(kāi)源社區(qū),致力給開(kāi)發(fā)者提供模型即服務(wù)的體驗(yàn)。魔搭社區(qū)利用NVIDIA TensorRT-LLM,大大提高了大語(yǔ)言模型的推理性能,方便了模型應(yīng)用部署,提高了大模型產(chǎn)業(yè)應(yīng)用效率,更大規(guī)模地釋放大模型的應(yīng)用價(jià)值。”
    的頭像 發(fā)表于 08-23 15:48 ?481次閱讀

    大模型端側(cè)部署加速,都有哪些芯片可支持?

    電子發(fā)燒友網(wǎng)報(bào)道(文/李彎彎)大模型在端側(cè)部署是指將大型神經(jīng)網(wǎng)絡(luò)模型部署在移動(dòng)終端設(shè)備上,使這些設(shè)備能夠直接運(yùn)行這些模型,從而執(zhí)行各種人工智能任務(wù),如圖像識(shí)別、語(yǔ)音識(shí)別、自然語(yǔ)言處理等。隨著大模型
    的頭像 發(fā)表于 05-24 00:14 ?4274次閱讀

    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā)-本地部署、SmartPerf 編譯部署指導(dǎo)文檔

    install 在項(xiàng)目目錄下運(yùn)行命令: npm run build 編譯成功后會(huì)有main 可執(zhí)行文件生成。 項(xiàng)目部署 直接運(yùn)行 ./main 可執(zhí)行程序,完成項(xiàng)目的部署
    發(fā)表于 05-09 14:23

    NVIDIA加速微軟最新的Phi-3 Mini開(kāi)源語(yǔ)言模型

    NVIDIA 宣布使用 NVIDIA TensorRT-LLM 加速微軟最新的 Phi-3 Mini 開(kāi)源語(yǔ)言模型。TensorRT-LLM 是一個(gè)開(kāi)源庫(kù),用于優(yōu)化從 PC 到云端的 NVIDIA GPU 上運(yùn)行的大語(yǔ)言模型推理
    的頭像 發(fā)表于 04-28 10:36 ?605次閱讀

    簡(jiǎn)單兩步使用OpenVINO?搞定Qwen2的量化與部署任務(wù)

    英特爾 OpenVINO? 工具套件是一款開(kāi)源 AI 推理優(yōu)化部署的工具套件,可幫助開(kāi)發(fā)人員和企業(yè)加速生成式人工智能 (AIGC)、大語(yǔ)言模型、計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理等 AI 工作負(fù)載,簡(jiǎn)化深度學(xué)習(xí)推理的開(kāi)發(fā)和部署,便于實(shí)現(xiàn)從
    的頭像 發(fā)表于 04-26 09:39 ?1786次閱讀
    簡(jiǎn)單兩步使用OpenVINO?搞定Qwen2的量化與<b class='flag-5'>部署</b>任務(wù)

    簡(jiǎn)單三步使用OpenVINO?搞定ChatGLM3的本地部署

    英特爾 OpenVINO? 工具套件是一款開(kāi)源 AI 推理優(yōu)化部署的工具套件,可幫助開(kāi)發(fā)人員和企業(yè)加速生成式人工智能 (AIGC)、大語(yǔ)言模型、計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理等 AI 工作負(fù)載,簡(jiǎn)化深度學(xué)習(xí)推理的開(kāi)發(fā)和部署,便于實(shí)現(xiàn)從
    的頭像 發(fā)表于 04-03 18:18 ?2154次閱讀
    簡(jiǎn)單三步使用OpenVINO?搞定ChatGLM3的本地<b class='flag-5'>部署</b>

    蔚來(lái)汽車(chē)加速部署換電站,第四代站4月啟動(dòng)

    在今日的溝通會(huì)中,蔚來(lái)汽車(chē)首席執(zhí)行官兼創(chuàng)始人李斌透露,近期部署進(jìn)度放緩的主要原因?yàn)榈却谒拇鷵Q電站的交付,預(yù)計(jì)該站將于4月份啟動(dòng)部署工作。
    的頭像 發(fā)表于 03-14 14:30 ?572次閱讀