在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TensorRT的C++接口解析

星星科技指導員 ? 來源:NVIDIA ? 作者:Ken He ? 2022-05-13 15:41 ? 次閱讀

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

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

#include “NvInfer.h”

using namespace nvinfer1;

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

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

3.1. The Build Phase

要創建構建器,首先需要實例化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;

然后,您可以創建構建器的實例:

IBuilder* builder = createInferBuilder(logger);

3.1.1. Creating a Network Definition

創建構建器后,優化模型的第一步是創建網絡定義:

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

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

為了使用 ONNX 解析器導入模型,需要kEXPLICIT_BATCH標志。有關詳細信息,請參閱顯式與隱式批處理部分。

3.1.2. Importing a Model using the ONNX Parser

現在,需要從 ONNX 表示中填充網絡定義。 ONNX 解析器 API 位于文件NvOnnxParser.h中,解析器位于nvonnxparserC++ 命名空間中。

#include “NvOnnxParser.h”

using namespace nvonnxparser;

您可以創建一個 ONNX 解析器來填充網絡,如下所示:

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 網絡定義的一個重要方面是它包含指向模型權重的指針,這些指針由構建器復制到優化的引擎中。由于網絡是通過解析器創建的,解析器擁有權重占用的內存,因此在構建器運行之前不應刪除解析器對象。

3.1.3. Building an Engine

下一步是創建一個構建配置,指定 TensorRT 應該如何優化模型。

IBuilderConfig* config = builder->createBuilderConfig();

這個接口有很多屬性,你可以設置這些屬性來控制 TensorRT 如何優化網絡。一個重要的屬性是最大工作空間大小。層實現通常需要一個臨時工作空間,并且此參數限制了網絡中任何層可以使用的最大大小。如果提供的工作空間不足,TensorRT 可能無法找到層的實現。默認情況下,工作區設置為給定設備的總全局內存大小;必要時限制它,例如,在單個設備上構建多個引擎時。

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

一旦指定了配置,就可以構建引擎。

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

由于序列化引擎包含權重的必要拷貝,因此不再需要解析器、網絡定義、構建器配置和構建器,可以安全地刪除:

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

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

delete serializedModel

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

3.2. Deserializing a Plan

假設您之前已經序列化了一個優化模型并希望執行推理,您將需要創建一個運行時接口的實例。與構建器一樣,運行時需要一個記錄器實例:

IRuntime* runtime = createInferRuntime(logger);

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

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

3.3. Performing Inference

引擎擁有優化的模型,但要執行推理,我們需要管理中間激活的額外狀態。這是通過ExecutionContext接口完成的:

IExecutionContext *context = engine->createExecutionContext();

一個引擎可以有多個執行上下文,允許一組權重用于多個重疊的推理任務。 (當前的一個例外是使用動態形狀時,每個優化配置文件只能有一個執行上下文。)

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

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

使用這些索引,設置一個緩沖區數組,指向 GPU 上的輸入和輸出緩沖區:

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

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

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

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

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

關于作者

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

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    211

    文章

    28525

    瀏覽量

    207576
  • NVIDIA
    +關注

    關注

    14

    文章

    5026

    瀏覽量

    103279
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4754

    瀏覽量

    129082
收藏 人收藏

    評論

    相關推薦

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

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

    C7000 C/C++優化指南用戶手冊

    電子發燒友網站提供《C7000 C/C++優化指南用戶手冊.pdf》資料免費下載
    發表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優化指南用戶手冊

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?290次閱讀

    C7000優化C/C++編譯器

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

    ostream在c++中的用法

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

    基于OpenHarmony標準系統的C++公共基礎類庫案例:SafeBlockQueue

    1、程序簡介該程序是基于OpenHarmony的C++公共基礎類庫的讀寫鎖:SafeBlockQueue。線程安全阻塞隊列SafeBlockQueue類,提供阻塞和非阻塞版的入隊入隊和出隊接口,并提
    的頭像 發表于 08-30 12:41 ?328次閱讀
    基于OpenHarmony標準系統的<b class='flag-5'>C++</b>公共基礎類庫案例:SafeBlockQueue

    OpenHarmony標準系統C++公共基礎類庫案例:HelloWorld

    1、程序簡介該程序是基于凌蒙派OpenHarmony-v3.2.1標準系統C++公共基礎類庫的簡單案例:HelloWorld。主要講解C++公共基礎類庫案例如何搭建和編譯。2、程序解析2.1、創建
    的頭像 發表于 08-13 08:23 ?546次閱讀
    OpenHarmony標準系統<b class='flag-5'>C++</b>公共基礎類庫案例:HelloWorld

    OpenVINO2024 C++推理使用技巧

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

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    C++有多態與繼承,但是很多人開始學習C++,有時候會面臨一個常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有instanceof這個
    的頭像 發表于 07-18 10:16 ?615次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot
    的頭像 發表于 04-14 11:43 ?2685次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?825次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    Type-C接口母座引腳定義解析

    Type-C接口母座作為一種先進的連接標準,在現代電子設備中得到廣泛應用。本文將深入解析Type-C接口母座的引腳定義,揭示其在實現多功能連
    的頭像 發表于 02-19 15:43 ?7713次閱讀

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠對計算機硬件進行直接操作。
    的頭像 發表于 02-05 14:11 ?2476次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB語言和C++語言的區別。 設計目標: VB語言(Visual Basic)是由
    的頭像 發表于 02-01 10:20 ?2395次閱讀
    主站蜘蛛池模板: 亚洲国产网址| 黄色毛片免费进入| 亚洲人成伊人成综合网久久| www.好吊色| 午夜精品久久久久| 两性色午夜视频免费播放| 免费看欧美一级特黄a大片一| 四虎影院大全| 色视频国产| 五月婷丁香| 日韩三级免费观看| 上课被同桌摸下面做羞羞| 日韩成人免费一级毛片| 辣h高h肉h激h超h| 丁香花在线观看免费观看| 午夜影院在线看| 亚洲综合五月天婷| www.激情网.com| 天天上天天干| 国产夜夜操| 黄色综合网站| 性夜影院爽黄a爽在线看香蕉| free chinese 国产精品| avbobo官网在线入口| 亚洲国产日韩欧美在线as乱码| 中文字幕一区在线观看| 欧美极品| 婷婷六月丁香午夜爱爱| 福利视频999| 国产高清区| 亚洲男人天堂岛| 午夜精品网| 色婷婷六月丁香七月婷婷| 毛片小视频| 国内精品视频在线| 国产乱人视频在线看| 国产一区二区三区欧美精品| 一本到在线观看视频不卡| 国产视频国产| 人人澡人人人人夜夜爽| 视频在线欧美|