99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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)員 ? 來源:NVIDIA ? 作者:Ken He ? 2022-05-13 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

#include “NvInfer.h”

using namespace nvinfer1;

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

CUDA 上下文會(huì)在 TensorRT 第一次調(diào)用 CUDA 時(shí)自動(dòng)創(chuàng)建,如果在該點(diǎn)之前不存在。通常最好在第一次調(diào)用 TensoRT 之前自己創(chuàng)建和配置 CUDA 上下文。 為了說明對(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 解析器來填充網(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ò)是通過解析器創(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è)置這些屬性來控制 TensorRT 如何優(yōu)化網(wǎng)絡(luò)。一個(gè)重要的屬性是最大工作空間大小。層實(shí)現(xiàn)通常需要一個(gè)臨時(shí)工作空間,并且此參數(shù)限制了網(wǎng)絡(luò)中任何層可以使用的最大大小。如果提供的工作空間不足,TensorRT 可能無法找到層的實(shí)現(xiàn)。默認(rèn)情況下,工作區(qū)設(shè)置為給定設(shè)備的總?cè)謨?nèi)存大小;必要時(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)。這是通過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í)開發(fā)者社區(qū)經(jīng)理 & 高級(jí)講師,擁有多年的 GPU 和人工智能開發(fā)經(jīng)驗(yàn)。自 2017 年加入 NVIDIA 開發(fā)者社區(qū)以來,完成過上百場(chǎng)培訓(xùn),幫助上萬個(gè)開發(fā)者了解人工智能和 GPU 編程開發(fā)。在計(jì)算機(jī)視覺,高性能計(jì)算領(lǐng)域完成過多個(gè)獨(dú)立項(xiàng)目。并且,在機(jī)器人無人機(jī)領(lǐng)域,有過豐富的研發(fā)經(jīng)驗(yàn)。對(duì)于圖像識(shí)別,目標(biāo)的檢測(cè)與跟蹤完成過多種解決方案。曾經(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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    213

    文章

    29748

    瀏覽量

    212957
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5309

    瀏覽量

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

    關(guān)注

    28

    文章

    4948

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:ThreadPoll

    。每個(gè)線程每秒打印1段字符串,10秒后停止。2、基礎(chǔ)知識(shí)C++公共基礎(chǔ)類庫為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開發(fā)工具類,包括:文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口
    的頭像 發(fā)表于 02-10 18:09 ?375次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:ThreadPoll

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一個(gè)對(duì)象模型 Excel
    的頭像 發(fā)表于 01-14 09:40 ?632次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-112:模擬C++中的類實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《EE-112:模擬C++中的類實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b>中的類實(shí)現(xiàn)

    AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發(fā)者打造鴻蒙原生應(yīng)用過程中廣泛使用的跨語言調(diào)用解決方案。 AKI是一款專為鴻蒙原生開發(fā)設(shè)計(jì)的FFI(外部函數(shù)接口
    發(fā)表于 01-02 17:08

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個(gè)返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++ 的函數(shù),除了構(gòu)造和析構(gòu)這兩個(gè)特殊的函數(shù),必須
    的頭像 發(fā)表于 11-29 10:25 ?913次閱讀

    C7000 C/C++優(yōu)化指南用戶手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《C7000 C/C++優(yōu)化指南用戶手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優(yōu)化指南用戶手冊(cè)

    TMS320C6000優(yōu)化C/C++編譯器v8.3.x

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000優(yōu)化C/C++編譯器v8.3.x.pdf》資料免費(fèi)下載
    發(fā)表于 11-01 09:35 ?1次下載
    TMS320<b class='flag-5'>C</b>6000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

    TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS

    電子發(fā)燒友網(wǎng)站提供《TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS.pdf》資料免費(fèi)下載
    發(fā)表于 10-31 10:10 ?0次下載
    TMS320<b class='flag-5'>C</b>28x優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v22.6.0.LTS

    C語言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?773次閱讀

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    ostream在c++中的用法

    )是 C++ 標(biāo)準(zhǔn)輸出流體系的核心部分,用于向各種輸出設(shè)備(如控制臺(tái)、文件等)發(fā)送數(shù)據(jù)。 1. 基本概念 ostream 是一個(gè)抽象基類,它定義了向輸出流寫入數(shù)據(jù)的基本接口。 ostream 類本身
    的頭像 發(fā)表于 09-20 15:11 ?1948次閱讀

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeBlockQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫的讀寫鎖:SafeBlockQueue。線程安全阻塞隊(duì)列SafeBlockQueue類,提供阻塞和非阻塞版的入隊(duì)入隊(duì)和出隊(duì)接口,并提
    的頭像 發(fā)表于 08-30 12:41 ?586次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:SafeBlockQueue

    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫案例:HelloWorld

    1、程序簡(jiǎn)介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫的簡(jiǎn)單案例:HelloWorld。主要講解C++公共基礎(chǔ)類庫案例如何搭建和編譯。2、程序解析2.1、創(chuàng)建
    的頭像 發(fā)表于 08-13 08:23 ?863次閱讀
    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:HelloWorld

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對(duì)象對(duì)接方式更是幾乎無縫對(duì)接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1574次閱讀