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

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

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

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

TensorRT的C++接口解析

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

掃碼添加小助手

加入工程師交流群

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

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

#include “NvInfer.h”

using namespace nvinfer1;

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

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

3.1. The Build Phase

要創(chuàng)建構(gòu)建器,首先需要實例化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)建器的實例:

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)詳細信息,請參閱顯式與隱式批處理部分。

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)建一個 ONNX 解析器來填充網(wǎng)絡(luò),如下所示:

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

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

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

3.1.3. Building an Engine

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

IBuilderConfig* config = builder->createBuilderConfig();

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

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

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

3.2. Deserializing a Plan

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

IRuntime* runtime = createInferRuntime(logger);

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

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

3.3. Performing Inference

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

IExecutionContext *context = engine->createExecutionContext();

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

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

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

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

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

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

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

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

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

關(guān)于作者

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

審核編輯:郭婷

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

    關(guān)注

    213

    文章

    31136

    瀏覽量

    222527
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5606

    瀏覽量

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

    關(guān)注

    28

    文章

    5206

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

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

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

    C/C++條件編譯

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

    C++程序異常的處理機制

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

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

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

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

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

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

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

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

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

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

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

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

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

    基于LockAI視覺識別模塊:C++目標(biāo)檢測

    本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標(biāo)檢測實驗。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet類進行目標(biāo)檢測,并通過lockzhiner_vision_module::Visualize函數(shù)將檢測結(jié)果可視
    的頭像 發(fā)表于 06-06 13:56 ?863次閱讀
    基于LockAI視覺識別模塊:<b class='flag-5'>C++</b>目標(biāo)檢測

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

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

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

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