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

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

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

如何使用框架訓(xùn)練網(wǎng)絡(luò)加速深度學(xué)習(xí)推理

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:Houman,Yu-Te Cheng, ? 2022-04-01 15:45 ? 次閱讀

TensorRT 7.0 開始, Universal Framework Format( UFF )被棄用。在本文中,您將學(xué)習(xí)如何使用新的 TensorFlow -ONNX- TensorRT 工作流部署經(jīng)過 TensorFlow 培訓(xùn)的深度學(xué)習(xí)模型。圖 1 顯示了 TensorRT 的高級工作流。

pYYBAGJGrYaAOHdwAADOhwG6fXc468.png

圖 1 。 TensorRT 是一種推理加速器。

首先,使用任何框架訓(xùn)練網(wǎng)絡(luò)。網(wǎng)絡(luò)訓(xùn)練后,批量大小和精度是固定的(精度為 FP32 、 FP16 或 INT8 )。訓(xùn)練好的模型被傳遞給 TensorRT 優(yōu)化器,優(yōu)化器輸出一個優(yōu)化的運(yùn)行時(也稱為計(jì)劃)。。 plan 文件是 TensorRT 引擎的序列化文件格式。計(jì)劃文件需要反序列化才能使用 TensorRT 運(yùn)行時運(yùn)行推斷。

要優(yōu)化在 TensorFlow 中實(shí)現(xiàn)的模型,只需將模型轉(zhuǎn)換為 ONNX 格式,并使用 TensorRT 中的 ONNX 解析器解析模型并構(gòu)建 TensorRT 引擎。圖 2 顯示了高級 ONNX 工作流。

pYYBAGJGrYyAFfa6AAAwQkoylqI526.jpg

圖 2 。 ONNX 工作流。

在本文中,我們將討論如何使用 ONNX 工作流創(chuàng)建一個 TensorRT 引擎,以及如何從 TensorRT 引擎運(yùn)行推理。更具體地說,我們演示了從 Keras 或 TensorFlow 中的模型到 ONNX 的端到端推理,以及使用 ResNet-50 、語義分段和 U-Net 網(wǎng)絡(luò)的 TensorRT 引擎。最后,我們將解釋如何在其他網(wǎng)絡(luò)上使用此工作流。

下載 TensorFlow -onnx- TensorRT 后 – 代碼 tar 。 gz 文件,您還應(yīng)該從 Cityscapes dataset scripts repo 下載 labels.py ,并將其與其他腳本放在同一個文件夾中。

ONNX 概述

ONNX 是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型的開放格式。它允許您將不同框架(如 TensorFlow 、 PyTorch 、 MATLAB 、 Caffe 和 Keras )的深度學(xué)習(xí)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)換為單一格式。

它定義了一組通用的運(yùn)算符、深入學(xué)習(xí)的通用構(gòu)建塊集和通用文件格式。它提供計(jì)算圖的定義以及內(nèi)置運(yùn)算符。可能有一個或多個輸入或輸出的 ONNX 節(jié)點(diǎn)列表形成一個無環(huán)圖。

ResNet ONNX 工作流示例

在這個例子中,我們展示了如何在兩個不同的網(wǎng)絡(luò)上使用 ONNX 工作流并創(chuàng)建一個 TensorRT 引擎。第一個網(wǎng)絡(luò)是 ResNet-50 。

工作流包括以下步驟:

將 TensorFlow / Keras 模型轉(zhuǎn)換為。 pb 文件。

將。 pb 文件轉(zhuǎn)換為 ONNX 格式。

創(chuàng)建 TensorRT 引擎。

從 TensorRT 引擎運(yùn)行推斷。

將模型轉(zhuǎn)換為。 pb

第一步是將模型轉(zhuǎn)換為。 pb 文件。以下代碼示例將 ResNet-50 模型轉(zhuǎn)換為。 pb 文件:

pYYBAGJGroSAHXTkAAA3M58TYgE971.png

poYBAGJGro6Aas16AAA1y0oqBWA160.png

除了 Keras ,您還可以從以下位置下載 ResNet-50 :

深度學(xué)習(xí)示例 GitHub 存儲庫:提供最新的深度學(xué)習(xí)示例網(wǎng)絡(luò)。您還可以看到 ResNet-50 分支,它包含一個腳本和方法來訓(xùn)練 ResNet-50v1 。 5 模型。

NVIDIA NGC 型號 :它有預(yù)訓(xùn)練模型的檢查點(diǎn)列表。例如,在 ResNet-50v1 。 5 上搜索 TensorFlow ,并從 Download 頁面獲取最新的檢查點(diǎn)。

將。 pb 文件轉(zhuǎn)換為 ONNX

第二步是將。 pb 模型轉(zhuǎn)換為 ONNX 格式。為此,首先安裝 tf2onnx 。

安裝 tf2onnx 后,有兩種方法可以將模型從。 pb 文件轉(zhuǎn)換為 ONNX 格式。第二種方法是使用命令行。運(yùn)行以下命令:

poYBAGJGrp6AauNjAAAJUsSVoZg886.png

從 ONNX 創(chuàng)建 TensorRT 引擎

要從 ONNX 文件創(chuàng)建 TensorRT 引擎,請運(yùn)行以下命令:

poYBAGJGrsCAchTgAAA9Ld7RNrs608.png

pYYBAGJGrsqAO8PKAAAC-dmKx7E317.png

此代碼應(yīng)保存在引擎。 py 文件,稍后在文章中使用。

此代碼示例包含以下變量:

最大工作區(qū)大?。?在執(zhí)行時 ICudaEngine 可以使用的最大 GPU 臨時內(nèi)存。

構(gòu)建器創(chuàng)建一個空網(wǎng)絡(luò)( builder.create_network() ), ONNX 解析器將 ONNX 文件解析到網(wǎng)絡(luò)( parser.parse(model.read()) )。您可以為網(wǎng)絡(luò)( network.get_input(0).shape = shape )設(shè)置輸入形狀,然后生成器將創(chuàng)建引擎( engine = builder.build_cuda_engine(network) )。要創(chuàng)建引擎,請運(yùn)行以下代碼示例:

pYYBAGJGruGAMPXuAAAtUQcqcpk628.png

在這個代碼示例中,首先從 ONNX 模型獲取輸入形狀。接下來,創(chuàng)建引擎,然后將引擎保存在。 plan 文件中。

運(yùn)行來自 TensorRT 引擎的推理:

TensorRT 引擎在以下工作流中運(yùn)行推理:

為 GPU 中的輸入和輸出分配緩沖區(qū)。

將數(shù)據(jù)從主機(jī)復(fù)制到 GPU 中分配的輸入緩沖區(qū)。

在 GPU 中運(yùn)行推理。

將結(jié)果從 GPU 復(fù)制到主機(jī)。

根據(jù)需要重塑結(jié)果。

下面的代碼示例詳細(xì)解釋了這些步驟。此代碼應(yīng)保存在推理。 py 文件,稍后將在本文中使用。

poYBAGJGrviAfprXAAA-GEWQnbE980.png

pYYBAGJGrv-AK8KsAABG5Zo7Tiw771.png

pYYBAGJGrweAehrVAAA6DPqzQCU341.png

為第一個輸入行和輸出行確定兩個維度。您可以在主機(jī)( h_input_1 、 h_output )中創(chuàng)建頁鎖定內(nèi)存緩沖區(qū)。然后,為輸入和輸出分配與主機(jī)輸入和輸出相同大小的設(shè)備內(nèi)存( d_input_1 , d_output )。下一步是創(chuàng)建 CUDA 流,用于在設(shè)備和主機(jī)分配的內(nèi)存之間復(fù)制數(shù)據(jù)。

在這個代碼示例中,在 do_inference 函數(shù)中,第一步是使用 load_images_to_buffer 函數(shù)將圖像加載到主機(jī)中的緩沖區(qū)。然后將輸入數(shù)據(jù)傳輸?shù)?GPU ( cuda.memcpy_htod_async(d_input_1, h_input_1, stream) ),并使用 context.execute 運(yùn)行推理。最后將結(jié)果從 GPU 復(fù)制到主機(jī)( cuda.memcpy_dtoh_async(h_output, d_output, stream) )。

ONNX 工作流語義分割實(shí)例

在本文 基于 TensorRT 3 的自主車輛快速 INT8 推理 中,作者介紹了一個語義分割模型的 UFF 工作流過程。

在本文中,您將使用類似的網(wǎng)絡(luò)來運(yùn)行 ONNX 工作流來進(jìn)行語義分段。該網(wǎng)絡(luò)由一個基于 VGG16 的編碼器和三個使用反褶積層實(shí)現(xiàn)的上采樣層組成。網(wǎng)絡(luò)在 城市景觀數(shù)據(jù)集 上經(jīng)過大約 40000 次迭代訓(xùn)練

有多種方法可以將 TensorFlow 模型轉(zhuǎn)換為 ONNX 文件。一種方法是 ResNet50 部分中解釋的方法。 Keras 也有自己的 Keras 到 ONNX 文件轉(zhuǎn)換器。有時, TensorFlow -to-ONNX 不支持某些層,但 Keras-to-ONNX 轉(zhuǎn)換器支持這些層。根據(jù) Keras 框架和使用的層類型,您可能需要在轉(zhuǎn)換器之間進(jìn)行選擇。

在下面的代碼示例中,使用 Keras-to-ONNX 轉(zhuǎn)換器將 Keras 模型直接轉(zhuǎn)換為 ONNX 。下載預(yù)先訓(xùn)練的語義分段文件 semantic_segmentation.hdf5 。

pYYBAGJGrxuAAvmEAAAd4F0DPHw247.png

圖 3 顯示了網(wǎng)絡(luò)的體系結(jié)構(gòu)。

poYBAGJGrY2AE4CrAABfgyFbT7k214.png

圖 3 ?;?VGG16 的語義分割模型。

與前面的示例一樣,使用下面的代碼示例創(chuàng)建語義分段引擎。

pYYBAGJGryaARbkjAAAq9e7lxJY387.png

要測試模型的輸出,請使用 城市景觀數(shù)據(jù)集 。要使用城市景觀,必須具有以下功能: sub_mean_chw 和 color_map 。這些函數(shù)也用于 post , 基于 TensorRT 3 的自主車輛快速 INT8 推理 。

在下面的代碼示例中, sub_mean_chw 用于從圖像中減去平均值作為預(yù)處理步驟, color_map 是從類 ID 到顏色的映射。后者用于可視化。

pYYBAGJGrzqAQX-AAAA3KOHqUOg723.png

poYBAGJGr0OABoXYAAAbHaod2Dw526.png

下面的代碼示例是上一個示例的其余代碼。必須先運(yùn)行上一個塊,因?yàn)樾枰x的函數(shù)。使用這個例子比較 Keras 模型和 TensorRT 引擎 semantic 。 plan 文件的輸出,然后可視化這兩個輸出。根據(jù)需要替換占位符 /path/to/semantic_segmentation.hdf5 和 input_file_path 。

poYBAGJGr16AQnJHAABCiJPN_VU162.png

poYBAGJGr2WAZGszAAAPXrDEFdc349.png

圖 4 顯示了實(shí)際圖像和實(shí)際情況,以及 Keras 的輸出與 TensorRT 引擎的輸出的對比。如您所見, TensorRT 發(fā)動機(jī)的輸出與 Keras 的類似。

pYYBAGJGrZSACUPPAAQTP3OFMbU453.png

圖 4a 原始圖像 。

poYBAGJGrZaAGb1ZAAB8Qxy0v4k876.png

圖 4b 地面真相標(biāo)簽。

poYBAGJGrZeADUl3AABv5WMB6Sk459.png

圖 4c 。 TensorRT 的輸出。

pYYBAGJGrZyAZI-mAABv5WMB6Sk593.png

圖 4d : Keras 的輸出。

在其他網(wǎng)絡(luò)上試試

現(xiàn)在您可以在其他網(wǎng)絡(luò)上嘗試 ONNX 工作流。有關(guān)分段網(wǎng)絡(luò)的好例子的更多信息,請參閱 GitHub 上的 具有預(yù)訓(xùn)練主干的分割模型 。

作為一個例子,我們用一個 ONNX 網(wǎng)絡(luò)來說明如何使用。本例中的網(wǎng)絡(luò)是來自 segmentation_models 庫的 U-Net 。在這里,我們只加載模型,而沒有對其進(jìn)行訓(xùn)練。您可能需要在首選數(shù)據(jù)集上訓(xùn)練這些模型。

關(guān)于這些網(wǎng)絡(luò)的一個重要點(diǎn)是,當(dāng)您加載這些網(wǎng)絡(luò)時,它們的輸入層大小如下所示:( None , None , None , 3 )。要創(chuàng)建一個 TensorRT 引擎,您需要一個輸入大小已知的 ONNX 文件。在將此模型轉(zhuǎn)換為 ONNX 之前,請通過為其輸入指定大小來更改網(wǎng)絡(luò),然后將其轉(zhuǎn)換為 ONNX 格式。

例如,從這個庫( segmentation _ models )加載 U-Net 網(wǎng)絡(luò)并為其輸入指定大?。?244 、 244 、 3 )。在為推理創(chuàng)建了 TensorRT 引擎之后,做一個與語義分段類似的轉(zhuǎn)換。根據(jù)應(yīng)用程序和數(shù)據(jù)集的不同,可能需要使用不同的顏色映射。

poYBAGJGr3qARsYkAAAr2J6FKGE279.png

我們之前提到的另一種下載方式是從 vz6 下載。它有一個預(yù)先訓(xùn)練模型的檢查點(diǎn)列表。例如,您可以在 TensorFlow 中搜索 UNet ,然后轉(zhuǎn)到 Download 頁面以獲取最新的檢查點(diǎn)。

總結(jié)

在這篇文章中,我們解釋了如何使用 TensorFlow-to-ONNX-to-TensorRT 工作流來部署深度學(xué)習(xí)應(yīng)用程序,并給出了幾個示例。第一個例子是 ResNet-50 上的 ONNX- TensorRT ,第二個例子是在 Cityscapes 數(shù)據(jù)集上訓(xùn)練的基于 英偉達(dá)數(shù)據(jù)中心深度學(xué)習(xí)產(chǎn)品性能 的語義分割。

關(guān)于作者

Houman 是 NVIDIA 的高級深度學(xué)習(xí)軟件工程師。他一直致力于開發(fā)和生產(chǎn) NVIDIA 在自動駕駛車輛中的深度學(xué)習(xí)解決方案,提高 DNN 的推理速度、精度和功耗,并實(shí)施和試驗(yàn)改進(jìn) NVIDIA 汽車 DNN 的新思想。他在渥太華大學(xué)獲得計(jì)算機(jī)科學(xué)博士學(xué)位,專注于機(jī)器學(xué)習(xí)

About Yu-Te Cheng

Yu-Te Cheng 是 NVIDIA 自主駕駛組高級深度學(xué)習(xí)軟件工程師,從事自駕領(lǐng)域的各種感知任務(wù)的神經(jīng)結(jié)構(gòu)搜索和 DNN 模型訓(xùn)練、壓縮和部署,包括目標(biāo)檢測、分割、路徑軌跡生成等。他于 2016 年獲得卡內(nèi)基梅隆大學(xué)機(jī)器人學(xué)碩士學(xué)位。

About Josh Park

Josh Park 是 NVIDIA 的汽車解決方案架構(gòu)師經(jīng)理。到目前為止,他一直在研究使用 DL 框架的深度學(xué)習(xí)解決方案,例如在 multi-GPUs /多節(jié)點(diǎn)服務(wù)器和嵌入式系統(tǒng)上的 TensorFlow 。此外,他一直在評估和改進(jìn)各種 GPUs + x86 _ 64 / aarch64 的訓(xùn)練和推理性能。他在韓國大學(xué)獲得理學(xué)學(xué)士和碩士學(xué)位,并在德克薩斯農(nóng)工大學(xué)獲得計(jì)算機(jī)科學(xué)博士學(xué)位

審核編輯:郭婷

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

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5503

    瀏覽量

    121175
收藏 人收藏

    評論

    相關(guān)推薦

    卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)工具與框架

    : TensorFlow是由Google Brain團(tuán)隊(duì)開發(fā)的開源機(jī)器學(xué)習(xí)框架,它支持多種深度學(xué)習(xí)模型的構(gòu)建和訓(xùn)練,包括卷積神經(jīng)
    的頭像 發(fā)表于 11-15 15:20 ?274次閱讀

    PyTorch GPU 加速訓(xùn)練模型方法

    深度學(xué)習(xí)領(lǐng)域,GPU加速訓(xùn)練模型已經(jīng)成為提高訓(xùn)練效率和縮短訓(xùn)練時間的重要手段。PyTorch作
    的頭像 發(fā)表于 11-05 17:43 ?560次閱讀

    Pytorch深度學(xué)習(xí)訓(xùn)練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學(xué)習(xí)訓(xùn)練。
    的頭像 發(fā)表于 10-28 14:05 ?215次閱讀
    Pytorch<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>訓(xùn)練</b>的方法

    GPU深度學(xué)習(xí)應(yīng)用案例

    能力,可以顯著提高圖像識別模型的訓(xùn)練速度和準(zhǔn)確性。例如,在人臉識別、自動駕駛等領(lǐng)域,GPU被廣泛應(yīng)用于加速深度學(xué)習(xí)模型的訓(xùn)練
    的頭像 發(fā)表于 10-27 11:13 ?398次閱讀

    NVIDIA助力麗蟾科技打造AI訓(xùn)練推理加速解決方案

    麗蟾科技通過 Leaper 資源管理平臺集成 NVIDIA AI Enterprise,為企業(yè)和科研機(jī)構(gòu)提供了一套高效、靈活的 AI 訓(xùn)練推理加速解決方案。無論是在復(fù)雜的 AI 開發(fā)任務(wù)中,還是在高并發(fā)
    的頭像 發(fā)表于 10-27 10:03 ?222次閱讀
    NVIDIA助力麗蟾科技打造AI<b class='flag-5'>訓(xùn)練</b>與<b class='flag-5'>推理</b><b class='flag-5'>加速</b>解決方案

    FPGA加速深度學(xué)習(xí)模型的案例

    FPGA(現(xiàn)場可編程門陣列)加速深度學(xué)習(xí)模型是當(dāng)前硬件加速領(lǐng)域的一個熱門研究方向。以下是一些FPGA加速
    的頭像 發(fā)表于 10-25 09:22 ?229次閱讀

    AI大模型與深度學(xué)習(xí)的關(guān)系

    人類的學(xué)習(xí)過程,實(shí)現(xiàn)對復(fù)雜數(shù)據(jù)的學(xué)習(xí)和識別。AI大模型則是指模型的參數(shù)數(shù)量巨大,需要龐大的計(jì)算資源來進(jìn)行訓(xùn)練推理。深度
    的頭像 發(fā)表于 10-23 15:25 ?745次閱讀

    NVIDIA推出全新深度學(xué)習(xí)框架fVDB

    在 SIGGRAPH 上推出的全新深度學(xué)習(xí)框架可用于打造自動駕駛汽車、氣候科學(xué)和智慧城市的 AI 就緒型虛擬表示。
    的頭像 發(fā)表于 08-01 14:31 ?613次閱讀

    FPGA在人工智能中的應(yīng)用有哪些?

    FPGA(現(xiàn)場可編程門陣列)在人工智能領(lǐng)域的應(yīng)用非常廣泛,主要體現(xiàn)在以下幾個方面: 一、深度學(xué)習(xí)加速 訓(xùn)練推理過程
    發(fā)表于 07-29 17:05

    LLM大模型推理加速的關(guān)鍵技術(shù)

    LLM(大型語言模型)大模型推理加速是當(dāng)前人工智能領(lǐng)域的一個研究熱點(diǎn),旨在提高模型在處理復(fù)雜任務(wù)時的效率和響應(yīng)速度。以下是對LLM大模型推理加速關(guān)鍵技術(shù)的詳細(xì)探討,內(nèi)容將涵蓋模型壓縮、
    的頭像 發(fā)表于 07-24 11:38 ?896次閱讀

    深度學(xué)習(xí)模型量化方法

    深度學(xué)習(xí)模型量化是一種重要的模型輕量化技術(shù),旨在通過減少網(wǎng)絡(luò)參數(shù)的比特寬度來減小模型大小和加速推理過程,同時盡量保持模型性能。從而達(dá)到把模型
    的頭像 發(fā)表于 07-15 11:01 ?497次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>模型量化方法

    TensorFlow與PyTorch深度學(xué)習(xí)框架的比較與選擇

    深度學(xué)習(xí)作為人工智能領(lǐng)域的一個重要分支,在過去十年中取得了顯著的進(jìn)展。在構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型的過程中,
    的頭像 發(fā)表于 07-02 14:04 ?973次閱讀

    深度學(xué)習(xí)模型訓(xùn)練過程詳解

    深度學(xué)習(xí)模型訓(xùn)練是一個復(fù)雜且關(guān)鍵的過程,它涉及大量的數(shù)據(jù)、計(jì)算資源和精心設(shè)計(jì)的算法。訓(xùn)練一個深度學(xué)習(xí)
    的頭像 發(fā)表于 07-01 16:13 ?1279次閱讀

    利用深度循環(huán)神經(jīng)網(wǎng)絡(luò)對心電圖降噪

    的網(wǎng) 絡(luò)具有更好的性能。這可以通過\"遷移學(xué) 習(xí)\"框架解釋訓(xùn)練過程來部分解釋。它是 一種流行的深度學(xué)習(xí)技術(shù),允許使用與目標(biāo)數(shù) 據(jù)不同的域、分布和任務(wù)的
    發(fā)表于 05-15 14:42

    FPGA在深度學(xué)習(xí)應(yīng)用中或?qū)⑷〈鶪PU

    硬件公司供貨的不斷增加,GPU 在深度學(xué)習(xí)中的市場需求還催生了大量公共云服務(wù),這些服務(wù)為深度學(xué)習(xí)項(xiàng)目提供強(qiáng)大的 GPU 虛擬機(jī)。 但是顯卡也受硬件和環(huán)境的限制。Larzul 解釋說:
    發(fā)表于 03-21 15:19