女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

TensorRT的Python API的基本用法和接口解析

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

本章說明 Python API 的基本用法,假設您從 ONNX 模型開始。onnx_resnet50.py示例更詳細地說明了這個用例。

Python API 可以通過tensorrt模塊訪問:

import tensorrt as trt

4.1. The Build Phase

要創建構建器,您需要首先創建一個記錄器。 Python 綁定包括一個簡單的記錄器實現,它將高于特定嚴重性的所有消息記錄到stdout

logger = trt.Logger(trt.Logger.WARNING)

或者,可以通過從ILogger類派生來定義您自己的記錄器實現:

class MyLogger(trt.ILogger):
    def __init__(self):
       trt.ILogger.__init__(self)

    def log(self, severity, msg):
        pass # Your custom logging implementation here

logger = MyLogger()

然后,您可以創建一個構建器:

builder = trt.Builder(logger)

4.1.1. Creating a Network Definition in Python

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

network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))

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

4.1.2. Importing a Model using the ONNX Parser

現在,需要從 ONNX 表示中填充網絡定義。您可以創建一個 ONNX 解析器來填充網絡,如下所示:

parser = trt.OnnxParser(network, logger)

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

success = parser.parse_from_file(model_path)
for idx in range(parser.num_errors):
    print(parser.get_error(idx))

if not success:
    pass # Error handling code here

4.1.3. Building an Engine

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

config = builder.create_builder_config()

這個接口有很多屬性,你可以設置這些屬性來控制 TensorRT 如何優化網絡。一個重要的屬性是最大工作空間大小。層實現通常需要一個臨時工作空間,并且此參數限制了網絡中任何層可以使用的最大大小。如果提供的工作空間不足,TensorRT 可能無法找到層的實現:

config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 20) # 1 MiB

指定配置后,可以使用以下命令構建和序列化引擎:

serialized_engine = builder.build_serialized_network(network, config)

將引擎保存到文件以供將來使用可能很有用。你可以這樣做:

with open(“sample.engine”, “wb”) as f:
    f.write(serialized_engine)

4.2. Deserializing a Plan

要執行推理,您首先需要使用Runtime接口反序列化引擎。與構建器一樣,運行時需要記錄器的實例。

runtime = trt.Runtime(logger)

然后,您可以從內存緩沖區反序列化引擎:

engine = runtime.deserialize_cuda_engine(serialized_engine)

如果您需要首先從文件加載引擎,請運行:

with open(“sample.engine”, “rb”) as f:
    serialized_engine = f.read()

4.3. Performing Inference

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

context = engine.create_execution_context()

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

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

input_idx = engine[input_name]
output_idx = engine[output_name]

使用這些索引,為每個輸入和輸出設置 GPU 緩沖區。多個 Python 包允許您在 GPU 上分配內存,包括但不限于 PyTorch、Polygraphy CUDA 包裝器和 PyCUDA。

然后,創建一個 GPU 指針列表。例如,對于 PyTorch CUDA 張量,您可以使用data_ptr()方法訪問 GPU 指針;對于 PolygraphyDeviceArray,使用ptr屬性:

buffers = [None] * 2 # Assuming 1 input and 1 output
buffers[input_idx] = input_ptr
buffers[output_idx] = output_ptr

填充輸入緩沖區后,您可以調用 TensorRT 的execute_async方法以使用 CUDA 流異步啟動推理。

首先,創建 CUDA 流。如果您已經有 CUDA 流,則可以使用指向現有流的指針。例如,對于 PyTorch CUDA 流,即torch.cuda.Stream(),您可以使用cuda_stream屬性訪問指針;對于 Polygraphy CUDA 流,使用ptr屬性。 接下來,開始推理:

context.execute_async_v2(buffers, stream_ptr)

通常在內核之前和之后將異步memcpy()排入隊列以從 GPU 中移動數據(如果數據尚不存在)。

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

stream.synchronize()

如果您更喜歡同步推理,請使用execute_v2方法而不是execute_async_v2

關于作者

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

審核編輯:郭婷

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

    關注

    28

    文章

    4909

    瀏覽量

    130631
  • python
    +關注

    關注

    56

    文章

    4823

    瀏覽量

    86143
  • CUDA
    +關注

    關注

    0

    文章

    122

    瀏覽量

    14054
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    DLP6500能否用Python編程進行開發,是否有API接口

    本人第一次接觸DLP的開發板,想知道DLP6500這款板子能否用Python編程進行開發,是否有API接口
    發表于 02-28 06:58

    Python存儲數據詳解

    用的存儲方式,Python標準數據庫接口Python DB-APIPython DB-API
    發表于 03-29 15:47

    有關Python解析

    搜了很多歷年藍橋杯真題解答,大多都是Java,C++,C這些語言編寫的代碼解析Python解析的幾乎,甚至可以說沒有。而當下Python又這么火熱,藍橋杯也出了
    發表于 07-29 08:39

    一張圖學會Python3的基本用法

    這不Github上一位大神就把 Python 3 的幾乎所有語法重點都整理到了一張圖上,對于有編程基礎的小伙伴,通過這張圖掌握Python的基本用法不成問題。
    的頭像 發表于 02-09 09:22 ?1.2w次閱讀
    一張圖學會<b class='flag-5'>Python</b>3的基本<b class='flag-5'>用法</b>

    python代碼示例之基于Python的日歷api調用代碼實例

    本文檔的主要內容詳細介紹的是python代碼示例之基于Python的日歷api調用代碼實例。
    發表于 09-06 14:25 ?42次下載
    <b class='flag-5'>python</b>代碼示例之基于<b class='flag-5'>Python</b>的日歷<b class='flag-5'>api</b>調用代碼實例

    API-Shop-OCR-營業執照識別API接口Python調用示例代碼說明

    本文檔的主要內容詳細介紹的是API-Shop-OCR-營業執照識別API接口Python調用示例代碼說明
    發表于 01-10 11:48 ?6次下載
    <b class='flag-5'>API</b>-Shop-OCR-營業執照識別<b class='flag-5'>API</b><b class='flag-5'>接口</b><b class='flag-5'>Python</b>調用示例代碼說明

    使用Python實現游戲APP充值API調用的代碼實例

    本文檔的主要內容詳細介紹的是使用Python實現游戲APP充值API調用的代碼實例。
    發表于 01-15 11:34 ?38次下載

    ADM1266 Linux APIPython庫簡介

    ADM1266 Linux APIPython庫簡介
    發表于 05-17 10:50 ?6次下載
    ADM1266 Linux <b class='flag-5'>API</b>和<b class='flag-5'>Python</b>庫簡介

    TensorRT的功能與應用分析

      Polygraphy 是一個工具包,旨在幫助在 TensorRT 和其他框架中運行和調試深度學習模型。它包括一個Python API和一個使用此 API 構建的命令行界面 (CLI
    的頭像 發表于 05-13 15:37 ?1924次閱讀

    TensorRT的C++接口解析

    CUDA 上下文會在 TensorRT 第一次調用 CUDA 時自動創建,如果在該點之前不存在。通常最好在第一次調用 TensoRT 之前自己創建和配置 CUDA 上下文。 為了說明對象的生命周期,本章中的代碼不使用智能指針;但是,建議將它們與 TensorRT
    的頭像 發表于 05-13 15:41 ?2818次閱讀

    api接口怎么使用

    本文就從API接口的維度,淺析API的概念以及為什么要了解它 一、API的概念 API,官方定義為應用程序編程
    的頭像 發表于 05-24 14:44 ?1663次閱讀

    python里item的用法

    item是Python中一個非常重要的概念,它可以用于多種數據結構和算法的實現。在Python中,item通常用于表示一個集合或序列中的一個元素。本文將詳細介紹item的用法,并探討它在列表、字典
    的頭像 發表于 11-21 15:09 ?4625次閱讀

    python中tuple的用法

    使用逗號進行分隔。元組在Python中具有許多有用的特性和用法,本文將詳盡、詳實、細致地介紹Python中元組的全部內容。 首先,元組可以用來存儲多個值。與列表不同的是,元組一旦創建就不能被修改,這意味著元組的元素是不可變的。雖
    的頭像 發表于 11-21 16:27 ?1303次閱讀

    python中text的用法

    可以使用text(字符串)進行各種操作,例如創建、訪問、修改、連接、比較和搜索等。下面將詳細介紹Python中使用text的各種用法。 創建和訪問文本: 在Python中,我們可以使用單引號或雙引號來
    的頭像 發表于 11-23 15:46 ?4626次閱讀

    split在python中的用法

    split在python中的用法 split()是Python中一個非常常用的字符串函數,它能夠根據指定的分隔符將一個字符串分割成多個子字符串,并返回一個包含這些子字符串的列表。本文將詳細介紹
    的頭像 發表于 12-25 15:12 ?2436次閱讀