『模型部署』神經(jīng)網(wǎng)絡(luò)模型部署[運(yùn)行時(shí)|指令執(zhí)行|處理器架構(gòu)|TensorRT] |
一. 神經(jīng)網(wǎng)絡(luò)部署
1.1. 程序語言運(yùn)行時(shí)(Runtime)
1.2. C++運(yùn)行時(shí)(Runtime) 與 C++ 標(biāo)準(zhǔn)
1.3. 神經(jīng)網(wǎng)絡(luò)運(yùn)行時(shí)(Runtime)
1.4. 神經(jīng)網(wǎng)絡(luò)表示
1.5. 神經(jīng)網(wǎng)絡(luò)部署&例子
二. TensorRT教程
- 輔助文檔-本教程配套代碼,以及更多范例和文檔:https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook
- Polygraphy:深度學(xué)習(xí)推理原型設(shè)計(jì)和調(diào)試工具包
2.1. 前置條件-計(jì)算機(jī)指令執(zhí)行過程
2.2. 前置條件-計(jì)算機(jī)處理器架構(gòu)
- 介紹個(gè)工具Torch.Profiler,使用它來確定你的性能瓶頸Introduction of torch.profiler
2.3. TensorRT簡(jiǎn)介
- TensorRT文檔:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html
- C++ API 文檔:https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/
- python API 文檔:https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/
- TensorRT下載:https://developer.nvidia.com/tensorrt-download
- 輔助文檔-本教程配套代碼,以及更多范例和文檔:https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook
TensorRT究竟使用了哪些技術(shù)使得我們的深度學(xué)習(xí)模型得以在GPU上加速運(yùn)行呢?
- 一方面模型構(gòu)建期(推理優(yōu)化器): 模型從網(wǎng)絡(luò)結(jié)構(gòu)變成可執(zhí)行程序的過程,在這個(gè)過程中TensorRT的推理優(yōu)化器主要幫我們完成了下面的工作:
- ①模型解析/建立:TensorRT可以加載 Onnx 等其他格式的模型或在其中使用原生 API 搭建模型
- ②計(jì)算圖優(yōu)化:包括橫向?qū)尤诤? Conv )、縱向?qū)尤诤? Conv+add+ReLU)等
- ③節(jié)點(diǎn)消除:去除計(jì)算層中的一些無用層,并進(jìn)行常數(shù)融合以及一些節(jié)點(diǎn)變換( Pad , Slice , Concat , Shuffle)等,這些變換有利于真正計(jì)算時(shí)的內(nèi)存拷貝等操作。
- ④多精度支持:TensorRT支持FP32/FP16/INT8/TF32等多種數(shù)據(jù)類型的混合計(jì)算,以便加快計(jì)算速度,但是單價(jià)是有可能插入額外的reformat節(jié)點(diǎn),用于數(shù)據(jù)類型的轉(zhuǎn)換。
- ⑤之后TensorRT會(huì)幫我們優(yōu)選 kernel / format 硬件有關(guān)優(yōu)化,這個(gè)是因?yàn)閷?duì)于計(jì)算圖中的一個(gè)節(jié)點(diǎn),我們?cè)贕PU上可能有多重實(shí)現(xiàn),具體到我們要運(yùn)行TensorRT的GPU上得時(shí)候,究竟哪一種實(shí)現(xiàn)最快呢?這一步需要TensorRT幫我們選擇的。[在TensorRT中,kernel是指用于執(zhí)行特定層計(jì)算的 CUDA核函數(shù)]
- ⑥導(dǎo)入 plugin:實(shí)現(xiàn)自定義操作,有時(shí)候計(jì)算圖中會(huì)遇到TensorRT原生不支持的操作,這個(gè)時(shí)候需要外部導(dǎo)入一些cuda c++編寫的plugin,來使用這些plugin幫我們完成計(jì)算。
- ⑦顯存優(yōu)化:TensorRT運(yùn)行的時(shí)候,會(huì)幫我們維護(hù)一個(gè)顯存池,我們計(jì)算過程中所有用到的顯存,都可以使用顯存池復(fù)用,避免重復(fù)的內(nèi)存申請(qǐng)和釋放,幫我們節(jié)約時(shí)間和空間。
- 另一方面模型運(yùn)行期(運(yùn)行時(shí)環(huán)境): 也就是模型的可執(zhí)行文件真正接收了輸入的數(shù)據(jù),并運(yùn)行的階段,在這個(gè)階段主要完成了運(yùn)行時(shí)環(huán)境、序列化/反序列化兩方面的工作。
- TensorRT文檔有詳細(xì)介紹,比如說計(jì)算圖優(yōu)化部分,具體到哪些layer之間可以發(fā)生融合,都有逐一的列舉
- https://developer.nvidia.com/blog/production-deep-learning-nvidia-gpu-inference-engine/
- NVIDIA GPU Inference Engine(GIE)具體解釋見上面的鏈接 對(duì)神經(jīng)網(wǎng)絡(luò)圖進(jìn)行了一些重要的轉(zhuǎn)換和優(yōu)化。首先,消除未使用輸出的層以避免不必要的計(jì)算。接下來,在可能的情況下,融合卷積層、偏置層和 ReLU 層以形成單層。圖 2顯示了圖 1 中原始網(wǎng)絡(luò)的垂直層融合結(jié)果(融合層在圖 4 中標(biāo)記為 CBR)。層融合提高了在 GPU 上運(yùn)行 GIE 優(yōu)化網(wǎng)絡(luò)的效率。
- 另一種轉(zhuǎn)換是水平層融合或?qū)泳酆?,以及所需的聚合層到各自輸出的劃分,如圖3所示。水平層融合通過組合采用相同源張量并應(yīng)用相似參數(shù)的相同操作的層來提高性能,從而形成一個(gè)更大的層以提高計(jì)算效率。圖3中的示例顯示了圖 2 中 3 個(gè) 1×1 CBR 層的組合,這些層將相同的輸入放入單個(gè)較大的 1×1 CBR 層中。請(qǐng)注意,必須分解該層的輸出,以將原始輸入圖輸入到不同的后續(xù)層中。
- 圖3如下,卷積神經(jīng)網(wǎng)絡(luò)上水平層融合的示例。在這里,圖 4 中的多個(gè) 1×1 CBR 層“水平”融合,或者跨越圖中共享相同輸入的相似層。
文章來源:http://www.zghlxwxcb.cn/news/detail-679186.html
- 下面摘選自2021年nvidia的一些講座中,TensorRT優(yōu)化的成果: 第1行2張圖對(duì)比了多種圖像分類和目標(biāo)識(shí)別模型,在Tensorflow框架內(nèi),以及使用Tensorflow自帶的TRT接口下的性能。左下角這張圖對(duì)比了BERT模型在Tensorflow和TensorRT中的延遲,右下角這張圖對(duì)比了ONNX Runtime中使用cuda和TensorRT兩種后端的性能。總體來看對(duì)于計(jì)算密集型任務(wù),比如矩陣乘法和卷積,TensorRT選用了高效的算子,提升計(jì)算效率。對(duì)于訪存密集型的任務(wù),TensorRT會(huì)采用算子融合減少訪問和數(shù)據(jù)的拷貝量以提高訪問的效率,此外TensorRT可以使用低精度的類型,在精度損失可以允許的情況下,同時(shí)減少計(jì)算時(shí)間和內(nèi)存顯存的使用量,以加快計(jì)算速度
文章來源地址http://www.zghlxwxcb.cn/news/detail-679186.html
參考文獻(xiàn)
- 模型量化以及部署B(yǎng)站鏈接:PPQ-神經(jīng)網(wǎng)絡(luò)量化框架
- 模型量化以及部署B(yǎng)站鏈接:神經(jīng)網(wǎng)絡(luò)-量化與部署
到了這里,關(guān)于『模型部署』神經(jīng)網(wǎng)絡(luò)模型部署[運(yùn)行時(shí)|指令執(zhí)行|處理器架構(gòu)|TensorRT]的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!