中继TensorRT集成
中繼TensorRT集成
介紹
NVIDIA TensorRT是用于優(yōu)化深度學(xué)習(xí)推理的庫。這種集成將使盡可能多的算子從Relay轉(zhuǎn)移到TensorRT,從而無需調(diào)整調(diào)度,即可在NVIDIA GPU上提高性能。
本文將演示如何安裝TensorRT,并在啟用TensorRT BYOC和運行時runtime的情況下構(gòu)建TVM。將提供示例代碼,使用TensorRT編譯和運行ResNet-18模型,以及如何配置編譯和運行時runtime設(shè)置。最后,記錄支持的算子,以及如何擴展集成,以支持其它算子。
安裝TensorRT
要下載TensorRT,需要創(chuàng)建一個NVIDIA Developer程序帳戶。請參閱NVIDIA文檔以獲取更多信息:https : //docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html。如果有Jetson設(shè)備,例如TX1,TX2,Xavier或Nano,TensorRT將已經(jīng)通過JetPack SDK安裝在設(shè)備上。
有兩種安裝TensorRT的方法:
? 通過deb或rpm軟件包進行系統(tǒng)安裝。
? Tar文件安裝。
使用tar文件安裝方法,必須將提取的tar存儲文件的路徑提供給USE_TENSORRT_RUNTIME = / path / to / TensorRT。使用系統(tǒng)安裝方法,USE_TENSORRT_RUNTIME = ON將自動安裝。
使用TensorRT支持構(gòu)建TVM
TensorRT在TVM中的集成有兩個單獨的構(gòu)建標(biāo)記。這些標(biāo)志還可以啟用交叉編譯:USE_TENSORRT_CODEGEN = ON在主機上構(gòu)建具有TensorRT支持的模塊,而USE_TENSORRT_RUNTIME = ON使邊緣設(shè)備上的TVM運行時runtime執(zhí)行TensorRT模塊。如果要編譯,也要啟用具有相同TVM構(gòu)建的模型,則應(yīng)同時啟用。
? USE_TENSORRT_CODEGEN = ON / OFF-此標(biāo)志將啟用編譯TensorRT模塊,該模塊不需要任何TensorRT庫。
? USE_TENSORRT_RUNTIME = ON / OFF / TensorRT路徑-此標(biāo)志將啟用TensorRT運行時runtime模塊。針對已安裝的TensorRT庫構(gòu)建TVM。
config.cmake文件中的示例設(shè)置:
set(USE_TENSORRT_CODEGEN ON)
set(USE_TENSORRT_RUNTIME /home/ubuntu/TensorRT-7.0.0.11)
使用TensorRT構(gòu)建和部署ResNet-18
從MXNet ResNet-18模型創(chuàng)建中繼relay圖。
import tvm
from tvm import relay
import mxnet
from mxnet.gluon.model_zoo.vision import get_model
dtype = “float32”
input_shape = (1, 3, 224, 224)
block = get_model(‘resnet18_v1’, pretrained=True)
mod, params = relay.frontend.from_mxnet(block, shape={‘data’: input_shape}, dtype=dtype)
為TensorRT標(biāo)注并劃分圖形。TensorRT集成支持的所有算子都將被標(biāo)記并卸載到TensorRT。其余算子將通過常規(guī)TVM CUDA編譯和代碼生成進行。
from tvm.relay.op.contrib.tensorrt import partition_for_tensorrt
mod, config = partition_for_tensorrt(mod, params)
使用partition_for_tensorrt返回的新模塊和配置來構(gòu)建Relay圖。目標(biāo)必須始終是cuda目標(biāo)。partition_for_tensorrt會自動在配置中填寫所需的值,因此無需修改-只需將其傳遞給PassContext,以便可以在編譯期間讀取值。
target = “cuda”
with tvm.transform.PassContext(opt_level=3, config={‘relay.ext.tensorrt.options’: config}):
lib = relay.build(mod, target=target, params=params)
導(dǎo)出模塊。
lib.export_library(‘compiled.so’)
加載模塊并在目標(biāo)計算機上運行推理,必須在USE_TENSORRT_RUNTIME啟用后對其進行構(gòu)建 。由于必須構(gòu)建TensorRT引擎,因此第一次運行會花費更長的時間。
ctx = tvm.gpu(0)
loaded_lib = tvm.runtime.load_module(‘compiled.so’)
gen_module = tvm.contrib.graph_runtime.GraphModule(loaded_lib’default’)
input_data = np.random.uniform(0, 1, input_shape).astype(dtype)
gen_module.run(data=input_data)
分區(qū)和編譯設(shè)置
可以在partition_for_tensorrt中配置一些選項。
? version-TensorRT版本以(major, minor, patch)元組為目標(biāo)。如果使用USE_TENSORRT_RUNTIME = ON編譯TVM,則將改用鏈接的TensorRT版本。版本影響哪些算子分區(qū)到TensorRT。
? use_implicit_batch-使用TensorRT隱式批處理模式(默認(rèn)為true)。設(shè)置為false將啟用顯式批處理模式,擴大支持算子范圍,使其包括修改批處理維度的算子,但可能會降低某些模型的性能。
? remove_no_mac_subgraphs-啟發(fā)式改進性能。如果沒有任何乘累加運算,則刪除已為TensorRT分區(qū)的子圖。刪除的子圖將通過TVM的標(biāo)準(zhǔn)編譯。
? max_workspace_size-允許每個子圖用于TensorRT引擎創(chuàng)建的工作空間大小的字節(jié)數(shù)。有關(guān)更多信息,請參見TensorRT文檔。可以在運行時runtime覆蓋。
運行時runtime設(shè)置
可以在運行時runtime使用環(huán)境變量配置一些其他選項。
? FP16自動轉(zhuǎn)換-TVM_TENSORRT_USE_FP16=1可以設(shè)置環(huán)境變量,將模型的TensorRT組件自動轉(zhuǎn)換為16位浮點精度。可以大大提高性能,但可能會導(dǎo)致模型精度略有下降。
? 緩存TensorRT引擎-在首次推理期間,運行時runtime將調(diào)用TensorRT API來構(gòu)建引擎。這可能很耗時,因此可以設(shè)置TVM_TENSORRT_CACHE_DIR指向一個目錄來將這些內(nèi)置引擎保存到磁盤上。下次加載模型并給其提供相同目錄時,運行時runtime將加載已構(gòu)建的引擎,以避免長時間的預(yù)熱。每個模型都需要一個唯一的目錄。
? TensorRT具有用于配置模型中每個圖層可以使用的最大緩存cache空間的參數(shù)。通常最好使用不會導(dǎo)致內(nèi)存不足的最大值。可以TVM_TENSORRT_MAX_WORKSPACE_SIZE通過指定要使用的字節(jié)大小,指定工作區(qū)大小來覆蓋此設(shè)置。
Operator support支持
增加一個新的算子
為了增加對新算子的支持,需要對以下文件進行一系列更改:
? src / runtime / contrib / tensorrt / tensorrt_ops.cc創(chuàng)建一個新的op轉(zhuǎn)換器類來實現(xiàn)該TensorRTOpConverter接口。必須實現(xiàn)構(gòu)造函數(shù)以指定有多少輸入以及它們是張量還是權(quán)重。還必須實現(xiàn)該 Convert方法來執(zhí)行轉(zhuǎn)換。使用參數(shù)的輸入,屬性和網(wǎng)絡(luò)來添加新的TensorRT層,部署輸出來完成的。可以使用現(xiàn)有的轉(zhuǎn)換器為例。最后,在GetOpConverters()映射圖上注冊新的算子標(biāo)簽。
? python / relay / op / contrib / tensorrt.py,此文件包含TensorRT的標(biāo)記規(guī)則。確定支持哪些算子及其屬性。必須為中繼算子注冊一個注釋函數(shù),并通過檢查屬性返回true或false,來指定轉(zhuǎn)換器支持哪些屬性。
? tests / python / contrib / test_tensorrt.py為給定的算子添加單元測試。
總結(jié)
以上是生活随笔為你收集整理的中继TensorRT集成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HLS后端示例
- 下一篇: Vitis-AI集成