TensorRT ONNX 基礎(續)

TensorRT ONNX 基礎(續)

PyTorch正確導出ONNX

幾條推薦的原則,可以減少潛在的錯誤:

  1. 對于任何使用到 shape、size 返回值的參數時,例如 tensor.view(tensor.size(0), -1) 這類操作,避免直接使用 tensor.size() 的返回值,而是用 int 強轉以下,斷開跟蹤,即:tensor.view(int(tensor.view(0)), -1)
  2. 對于 nn.Unsamplenn.functional.interpolate 函數,使用 scale_factor 指定倍率,而不是使用 size 參數指定大小。
  3. 關于 batch 動態 shape 還是寬高動態 shape
    • 對于 reshapeview 操作時,-1 的指定請放到 batch 維度,其他維度手動計算出來填上即可。batch 維度盡量不要指定為大于 -1 的明確數字。
    • torch.nn.export 指定 dynamic_axes 參數,并且只指定 batch 維度,盡量不要把其他指定為動態
  4. 使用 opset_version = 11 ,盡量不要使用 11 以下的版本
  5. 避免使用 inplace 操作,例如 y[..., 0: 2] = y[..., 0: 2] * 2 -0.5
  6. 盡量少地出現 5 各維度,例如在 ShuffleNet Module 中,會出現 5 個維度,在導出時可以考慮合并 wh 避免 5 維
  7. 盡量把后處理部分放在 ONNX 模型中實現,這也可以讓推理引擎順帶給加速了
    • 就是用我們之前提到的在 ONNX 模型中添加節點(如前后處理等)的方法:先將前后處理寫成 PyTorch 模型,單獨導出為一個 ONNX 模型,再加到原模型中

這些做法的必要性體現在簡化過程的復雜度,去掉 gather、shape 之類的節點,有些時候,看似不這么該也是可以跑通的,但是需求復雜后總是會出現這樣那樣的問題,而這樣遵守這些原則,可以盡可能地較少潛在的錯誤。做了這些,基本就不用 onnx-simplifier 了。

原則一(不規范)原則一(規范)
在這里插入圖片描述在這里插入圖片描述

使用ONNX解析器來讀取ONNX文件

onnx 解析器的使用有兩個選項:

  • libnvonnxparser.so (共享庫)
  • https://github.com/onnx/onnx-tensorrt (源代碼)

對應的頭文件是:NvOnnxParser.h

其實源代碼編譯后就是共享庫,我們推薦使用源代碼,這樣可以更好地進行自定義封裝,簡化插件開發或者模型編譯的過程,更加容易實現定制化需求,遇到問題可以調試。

源代碼中主要關注的是 builtin_op_importers.cpp 文件,這個文件中定義了各個算子是怎樣從 ONNX 算子解析成 TensorRT 算子的,如果我們后續有新的算子,也可以自己修改該源文件來支持新算子。

從下載onnx-tensorrt到配置好再到成功運行

TODO:自己試一下

插件實現

插件實現重點:

  1. 如何在 PyTorch 里面導出一個插件
  2. 插件解析時如何對應,在 onnx parser 中如何處理
  3. 插件的 creator 實現,除了插件,還要實現插件的 creator ,TensorRT 就是通過 creator 來創建插件的
  4. 插件的具體實現,繼承自 IPluginV2DynamicExt
  5. 插件的序列化與反序列化

TODO:看代碼,自己寫

插件實現的封裝

課程老師將上述復雜的 plugin 實現做了通用的、默認的封裝,大部分情況下使用默認的封裝即可,少數有需要自己改動的地方按照上面介紹的內容再去改,極大地減少代碼量。

TODO:看代碼,自己寫

int8量化

int8量化簡介

int8 量化是利用 int8 乘法替換 float32 乘法實現性能加速的一種方法

  • 對于常規模型:y=kx+by=kx+by=kx+b ,其中 x,k,bx, k, bx,k,b 都是 float32,對于 kxkxkx 的計算使用的當然也是 float32 乘法
  • 對于 int8 模型:y=tofp32(toint8(k)×toint8(x))+by=tofp32(toint8(k)\times toint8(x))+by=tofp32(toint8(k)×toint8(x))+b ,其中 kxkxkx 的計算是兩個 int8 相乘,得到 int16

經過 int8 量化的模型無疑精度會降低,各種 int8 模型量化算法解決的問題就是如何合理地將 fp32 轉換為 int8,從而盡可能減小精度損失

除了 fp32 和 int8,很多時候會用 fp16 模型,精度損失會比 int8 少很多,并且速度也很快。但是需要注意 fp16 僅在對 fp16 的顯卡上有很好的性能,在對 fp16 無優化的顯卡甚至可能速度還不如 fp32,總之 int8、fp16、fp32 要看業務對精度和速度的要求,還有部署的顯卡設備來綜合決定。

TensorRT int8量化步驟

  1. 配置 setFlag nvinfer1::BuilderFlag::kINT8
  2. 實現 Int8EntropyCalibrator 類,其繼承自 IInt8EntropyCalibrator2
  3. 實例化一個 Int8EntropyCalibrator 并設置到 config.setInt8Calibrator
  4. Int8EntropyCalibrator 的作用是:讀取并預處理圖像數據作為輸入

標定過程的理解

  • 對于輸入圖像 A,使用 fp32 推理之后得到 P1,再用 int8 推理之后得到 P2,調整 int8 權重使得 P1 和 P2 足夠接近
  • 因此標定時需要使用到一些圖像,通常 100 張左右即可

Int8EntropyCalibrator類主要關注

  1. getBatchSize ,告訴引擎,這次標定的 batch 是多少
  2. getBatch ,告訴迎請,這次標定的數據是什么,將指針賦值給 bindings 即可,返回 false 即表示沒有數據了
  3. readCalibrationCache ,若從緩存文件加載標定信息,則可避免讀取文件和預處理,若該函數返回空指針則表示沒有緩存,程序會通過 getBatch 重新計算
  4. writeCalibrationCache ,當標定結束后,會調用該函數,我們可以儲存標定后的緩存結果,多次標定可以使用該緩存實現加速

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

frp實現內網穿透極簡教程

frp實現內網穿透極簡教程 本文是內網穿透極簡教程,為求簡潔,我們不介紹為什么內網穿透也不介紹其原理,這里假設各位讀者都已經明確的知道自己的目的,本文僅介紹如何安裝配置 frp 實現內網穿透。 簡單來說,內網穿透就…

圖像預處理之warpaffine與雙線性插值及其高性能實現

圖像預處理之warpaffine與雙線性插值及其高性能實現 視頻講解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代碼Repo:https://github.com/shouxieai/tensorRT_Pro 本文為視頻講解的個人筆記。 warpaffine矩陣變換 對于坐標點的變換,我們通…

LeetCode-10 正則表達式匹配

LeetCode-10 正則表達式匹配 動態規劃 10. 正則表達式匹配 dp數組含義:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i?1]s[0:i-1]s[0:i?1] 能否被 p[0:j?1]p[0:j-1]p[0:j?1] 成功匹配。 狀態轉移方程 : 如果 s[i?1]p[j?1]s[i-1]p[j-1]s[i?1]p[j?1] …

shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法 轉自: Shell中for循環的幾個常用寫法 Shell中if 條件判斷總結 if常見寫法 一、if的基本語法: if [ command ];then符合該條件執行的語句 elif [ command ];then符合該條件執行的語句 else符合該條件執行的語句 fibash shell會按順序…

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據,會有兩種情況:一是我們按照較短的 dataloader 來迭代,長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式,可以用個 alias 在 ~/.zshrc 中設置一下: alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36歲本命年,sed比awk大2-3歲,awk就像林妹妹,sed就是寶玉哥哥了。所以 林妹妹跳了個Topless,他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自:https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed,所以,出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自:https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的,總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇:入門教程 轉自:[原創][深度][PyTorch] DDP系列第一篇:入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析 轉自:https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇:實戰與技巧 轉自:https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題 測試圖像:https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg (直接 wget 可獲得) 測試版本: opencv-python 4.4.0.46Pillow 8.0.1 測試代…

mac X11 XQuartz的安裝與使用

mac X11 XQuartz的安裝與使用 本地系統:MacOS 12.4 遠程主機系統:Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了,這里僅介紹與 X11 forwarding 相關的幾個選項。 本部分譯自 ssh 命令手冊,可見 man ssh -X &#xf…

機器學習:系統設計與實現 分布式訓練

機器學習系統:設計與實現 分布式訓練 轉自:https://openmlsys.github.io/chapter_distributed_training/index.html 隨著機器學習的進一步發展,科學家們設計出更大型,更多功能的機器學習模型(例如說,GPT-3)…

Linux命令行及各常用工具代理設置

Linux命令行及各常用工具代理設置 命令行代理設置 1 通過命令行指定 直接為當前命令行設置代理 對當前終端的全部工具(apt、curl、wget、git 等全都有效)以下僅以 http 代理為例,如果是其他協議(如 socks 等)自行改…

VimScript 五分鐘入門(翻譯)

VimScript 五分鐘入門(翻譯) 轉自:https://zhuanlan.zhihu.com/p/37352209 譯注:折騰 Vim 當然要能看懂和改寫相關腳本,而中文資料匱乏,缺一個提綱挈領的教程。本文翻譯自 Andrew Scala 的 《Five Minute V…

C++多線程推理、生產者消費者模式封裝

C多線程推理、生產者消費者模式封裝 tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。 深度學習推理中的多線程知識概覽 本章介紹的多線程主要是指算法部署時所涉及的多線程內容&a…

在Python中調用C/C++:cython及pybind11

在Python中調用C/C:cython及pybind11 轉自:https://zhuanlan.zhihu.com/p/442935082 Python寫起來非常方便, 但面對大量for循環的時候, 執行速度有些捉急. 原因在于, python是一種動態類型語言, 在運行期間才去做數據類型檢查, 這樣效率就很低(尤其是大規…

Pytorch導出onnx模型,C++轉化為TensorRT并實現推理過程

Pytorch導出onnx模型,C轉化為TensorRT并實現推理過程 前言 本文為旨在實現整個Python導出PyTorch模型,C轉化為TensorRT并實現推理過程過程,只與模型推理,模型部署相關,不涉及模型訓練。為突出整個部署過程而非具體模…