91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

TensorRT的C++接口解析

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:Ken He ? 2022-05-13 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本章說(shuō)明 C++ API 的基本用法,假設(shè)您從 ONNX 模型開(kāi)始。sampleOnnxMNIST更詳細(xì)地說(shuō)明了這個(gè)用例。

C++ API 可以通過(guò)頭文件NvInfer.h訪問(wèn),并且位于nvinfer1命名空間中。例如,一個(gè)簡(jiǎn)單的應(yīng)用程序可能以:

#include “NvInfer.h”

using namespace nvinfer1;

TensorRT C++ API 中的接口類以前綴I開(kāi)頭,例如ILogger、IBuilder等。

CUDA 上下文會(huì)在 TensorRT 第一次調(diào)用 CUDA 時(shí)自動(dòng)創(chuàng)建,如果在該點(diǎn)之前不存在。通常最好在第一次調(diào)用 TensoRT 之前自己創(chuàng)建和配置 CUDA 上下文。 為了說(shuō)明對(duì)象的生命周期,本章中的代碼不使用智能指針;但是,建議將它們與 TensorRT 接口一起使用。

3.1. The Build Phase

要?jiǎng)?chuàng)建構(gòu)建器,首先需要實(shí)例化ILogger接口。此示例捕獲所有警告消息,但忽略信息性消息:

class Logger : public ILogger           
{
    void log(Severity severity, const char* msg) noexcept override
    {
        // suppress info-level messages
        if (severity <= Severity::kWARNING)
            std::cout << msg << std::endl;
    }
} logger;

然后,您可以創(chuàng)建構(gòu)建器的實(shí)例:

IBuilder* builder = createInferBuilder(logger);

3.1.1. Creating a Network Definition

創(chuàng)建構(gòu)建器后,優(yōu)化模型的第一步是創(chuàng)建網(wǎng)絡(luò)定義:

uint32_t flag = 1U <
    (NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); 

INetworkDefinition* network = builder->createNetworkV2(flag);

為了使用 ONNX 解析器導(dǎo)入模型,需要kEXPLICIT_BATCH標(biāo)志。有關(guān)詳細(xì)信息,請(qǐng)參閱顯式與隱式批處理部分。

3.1.2. Importing a Model using the ONNX Parser

現(xiàn)在,需要從 ONNX 表示中填充網(wǎng)絡(luò)定義。 ONNX 解析器 API 位于文件NvOnnxParser.h中,解析器位于nvonnxparserC++ 命名空間中。

#include “NvOnnxParser.h”

using namespace nvonnxparser;

您可以創(chuàng)建一個(gè) ONNX 解析器來(lái)填充網(wǎng)絡(luò),如下所示:

IParser*  parser = createParser(*network, logger);

然后,讀取模型文件并處理任何錯(cuò)誤。

parser->parseFromFile(modelFile, 
    static_cast(ILogger::Severity::kWARNING));
for (int32_t i = 0; i < parser.getNbErrors(); ++i)
{
std::cout << parser->getError(i)->desc() << std::endl;
}

TensorRT 網(wǎng)絡(luò)定義的一個(gè)重要方面是它包含指向模型權(quán)重的指針,這些指針由構(gòu)建器復(fù)制到優(yōu)化的引擎中。由于網(wǎng)絡(luò)是通過(guò)解析器創(chuàng)建的,解析器擁有權(quán)重占用的內(nèi)存,因此在構(gòu)建器運(yùn)行之前不應(yīng)刪除解析器對(duì)象。

3.1.3. Building an Engine

下一步是創(chuàng)建一個(gè)構(gòu)建配置,指定 TensorRT 應(yīng)該如何優(yōu)化模型。

IBuilderConfig* config = builder->createBuilderConfig();

這個(gè)接口有很多屬性,你可以設(shè)置這些屬性來(lái)控制 TensorRT 如何優(yōu)化網(wǎng)絡(luò)。一個(gè)重要的屬性是最大工作空間大小。層實(shí)現(xiàn)通常需要一個(gè)臨時(shí)工作空間,并且此參數(shù)限制了網(wǎng)絡(luò)中任何層可以使用的最大大小。如果提供的工作空間不足,TensorRT 可能無(wú)法找到層的實(shí)現(xiàn)。默認(rèn)情況下,工作區(qū)設(shè)置為給定設(shè)備的總?cè)謨?nèi)存大?。槐匾獣r(shí)限制它,例如,在單個(gè)設(shè)備上構(gòu)建多個(gè)引擎時(shí)。

config->setMemoryPoolLimit(MemoryPoolType::kWORKSPACE, 1U << 20);

一旦指定了配置,就可以構(gòu)建引擎。

IHostMemory*  serializedModel = builder->buildSerializedNetwork(*network, *config);

由于序列化引擎包含權(quán)重的必要拷貝,因此不再需要解析器、網(wǎng)絡(luò)定義、構(gòu)建器配置和構(gòu)建器,可以安全地刪除:

delete parser;
delete network;
delete config;
delete builder;

然后可以將引擎保存到磁盤,并且可以刪除它被序列化到的緩沖區(qū)。

delete serializedModel

注意:序列化引擎不能跨平臺(tái)或 TensorRT 版本移植。引擎特定于它們構(gòu)建的確切 GPU 模型(除了平臺(tái)和 TensorRT 版本)。

3.2. Deserializing a Plan

假設(shè)您之前已經(jīng)序列化了一個(gè)優(yōu)化模型并希望執(zhí)行推理,您將需要?jiǎng)?chuàng)建一個(gè)運(yùn)行時(shí)接口的實(shí)例。與構(gòu)建器一樣,運(yùn)行時(shí)需要一個(gè)記錄器實(shí)例:

IRuntime* runtime = createInferRuntime(logger);

假設(shè)您已將模型從緩沖區(qū)中讀取,然后可以對(duì)其進(jìn)行反序列化以獲得引擎:

ICudaEngine* engine = 
  runtime->deserializeCudaEngine(modelData, modelSize);

3.3. Performing Inference

引擎擁有優(yōu)化的模型,但要執(zhí)行推理,我們需要管理中間激活的額外狀態(tài)。這是通過(guò)ExecutionContext接口完成的:

IExecutionContext *context = engine->createExecutionContext();

一個(gè)引擎可以有多個(gè)執(zhí)行上下文,允許一組權(quán)重用于多個(gè)重疊的推理任務(wù)。 (當(dāng)前的一個(gè)例外是使用動(dòng)態(tài)形狀時(shí),每個(gè)優(yōu)化配置文件只能有一個(gè)執(zhí)行上下文。)

要執(zhí)行推理,您必須為輸入和輸出傳遞 TensorRT 緩沖區(qū),TensorRT 要求您在指針數(shù)組中指定。您可以使用為輸入和輸出張量提供的名稱查詢引擎,以在數(shù)組中找到正確的位置:

int32_t inputIndex = engine->getBindingIndex(INPUT_NAME);
int32_t outputIndex = engine->getBindingIndex(OUTPUT_NAME);

使用這些索引,設(shè)置一個(gè)緩沖區(qū)數(shù)組,指向 GPU 上的輸入和輸出緩沖區(qū):

void* buffers[2];
buffers[inputIndex] = inputBuffer;
buffers[outputIndex] = outputBuffer;

然后,您可以調(diào)用 TensorRT 的 enqueue 方法以使用CUDA 流異步啟動(dòng)推理:

context->enqueueV2(buffers, stream, nullptr);

通常在內(nèi)核之前和之后將cudaMemcpyAsync()排入隊(duì)列以從 GPU 中移動(dòng)數(shù)據(jù)(如果數(shù)據(jù)尚不存在)。enqueueV2()的最后一個(gè)參數(shù)是一個(gè)可選的 CUDA 事件,當(dāng)輸入緩沖區(qū)被消耗時(shí)發(fā)出信號(hào),并且可以安全地重用它們的內(nèi)存。

要確定內(nèi)核(可能還有memcpy())何時(shí)完成,請(qǐng)使用標(biāo)準(zhǔn) CUDA 同步機(jī)制,例如事件或等待流。

關(guān)于作者

Ken He 是 NVIDIA 企業(yè)級(jí)開(kāi)發(fā)者社區(qū)經(jīng)理 & 高級(jí)講師,擁有多年的 GPU 和人工智能開(kāi)發(fā)經(jīng)驗(yàn)。自 2017 年加入 NVIDIA 開(kāi)發(fā)者社區(qū)以來(lái),完成過(guò)上百場(chǎng)培訓(xùn),幫助上萬(wàn)個(gè)開(kāi)發(fā)者了解人工智能和 GPU 編程開(kāi)發(fā)。在計(jì)算機(jī)視覺(jué),高性能計(jì)算領(lǐng)域完成過(guò)多個(gè)獨(dú)立項(xiàng)目。并且,在機(jī)器人無(wú)人機(jī)領(lǐng)域,有過(guò)豐富的研發(fā)經(jīng)驗(yàn)。對(duì)于圖像識(shí)別,目標(biāo)的檢測(cè)與跟蹤完成過(guò)多種解決方案。曾經(jīng)參與 GPU 版氣象模式GRAPES,是其主要研發(fā)者。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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ī)器人
    +關(guān)注

    關(guān)注

    213

    文章

    31093

    瀏覽量

    222355
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5597

    瀏覽量

    109796
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    5196

    瀏覽量

    135509
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到一個(gè)開(kāi)源的模擬IIC的庫(kù),封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng)中 C/C++中去掉勾選 C99 Mode
    發(fā)表于 01-26 08:58

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)C
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語(yǔ)法兼容性: C++完全兼容C語(yǔ)言的語(yǔ)法,這意味著任何有效的C語(yǔ)言程序都可以直接在C++編譯器下編譯通過(guò)。 2、底層控制: C++
    發(fā)表于 12-11 06:51

    C語(yǔ)言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,它強(qiáng)調(diào)的是通過(guò)函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語(yǔ)言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦裕С诸?class)、封裝、繼承
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時(shí)根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預(yù)處理指令 #ifdef、#endif、#else 和 #elif 來(lái)實(shí)現(xiàn)。常用的條件編譯指令有
    發(fā)表于 12-05 06:21

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過(guò)程中難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見(jiàn)的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開(kāi)相應(yīng)文件失敗等等。 一個(gè)程序
    發(fā)表于 12-02 07:12

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

    TensorRT LLM 作為 NVIDIA 為大規(guī)模 LLM 推理打造的推理框架,核心目標(biāo)是突破 NVIDIA 平臺(tái)上的推理性能瓶頸。為實(shí)現(xiàn)這一目標(biāo),其構(gòu)建了多維度的核心實(shí)現(xiàn)路徑:一方面,針對(duì)需
    的頭像 發(fā)表于 10-21 11:04 ?1191次閱讀

    C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測(cè) C++?并發(fā)問(wèn)題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?576次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    TensorRT-LLM的大規(guī)模專家并行架構(gòu)設(shè)計(jì)

    之前文章已介紹引入大規(guī)模 EP 的初衷,本篇將繼續(xù)深入介紹 TensorRT-LLM 的大規(guī)模專家并行架構(gòu)設(shè)計(jì)與創(chuàng)新實(shí)現(xiàn)。
    的頭像 發(fā)表于 09-23 14:42 ?1117次閱讀
    <b class='flag-5'>TensorRT</b>-LLM的大規(guī)模專家并行架構(gòu)設(shè)計(jì)

    DeepSeek R1 MTP在TensorRT-LLM中的實(shí)現(xiàn)與優(yōu)化

    TensorRT-LLM 在 NVIDIA Blackwell GPU 上創(chuàng)下了 DeepSeek-R1 推理性能的世界紀(jì)錄,Multi-Token Prediction (MTP) 實(shí)現(xiàn)了大幅提速
    的頭像 發(fā)表于 08-30 15:47 ?4466次閱讀
    DeepSeek R1 MTP在<b class='flag-5'>TensorRT</b>-LLM中的實(shí)現(xiàn)與優(yōu)化

    技能+1!如何在樹(shù)莓派上使用C++控制GPIO?

    在使用樹(shù)莓派時(shí),你會(huì)發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語(yǔ)言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4167次閱讀
    技能+1!如何在樹(shù)莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Python是樹(shù)莓派上的首選編程語(yǔ)言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹(shù)莓派項(xiàng)目中選擇哪種語(yǔ)言更合適呢?Python因其簡(jiǎn)潔性、豐富的庫(kù)和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?957次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++?

    在單片機(jī)的地界兒里,C語(yǔ)言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說(shuō)內(nèi)存這道坎兒。您當(dāng)stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1058次閱讀
    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    如何從 Microsoft Visual C++ 應(yīng)用程序 (CyAPI.h) 訪問(wèn) CYUSB3014 芯片組的 i2c 接口?

    1. 如何從 Microsoft Visual C++ 應(yīng)用程序 (CyAPI.h) 訪問(wèn) CYUSB3014 芯片組的 i2c 接口? 我在定制相機(jī)中使用 CYUSB3014。 當(dāng)我開(kāi)發(fā)我的相機(jī)
    發(fā)表于 05-19 07:21

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開(kāi)發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語(yǔ)言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、內(nèi)存
    發(fā)表于 03-13 10:19