TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成
TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成
這個PR增加了對分區、編譯和運行TensorRT
BYOC目標的支持。
Building
有兩個新的cmake標志:
USE_TENSORRT=ON/OFF:啟用TENSORRT代碼生成-這不需要TENSORRT庫????????????? USE_TENSORRT_GRAPH_RUNTIME=ON/OFF/“path/to/TensorRT”:
啟用TENSORRTruntime-這需要TENSORRT庫。從deb包或JetPack在系統范圍內安裝TensorRT時,可以通過“ON”來檢測,但是.tar.gz安裝要求提供提取的TensorRT歸檔文件的路徑。
Usage
編譯目標應該是“cuda”,以確保將TensorRT函數的輸入和輸出參數放在GPU上。
Compilation
from tvm.relay.op.contrib import tensorrt
mod = tensorrt.partition_for_tensorrt(mod, params)
with relay.build_config(opt_level=3):
graph, lib, params =
relay.build(mod, target=“cuda”, params=params)
Running inference is unchanged
mod = graph_runtime.create(graph, lib, ctx=tvm.gpu(0))
mod.run(…)
High level components
Partitioning
TensorRT的注釋規則根據目標的TensorRT版本以及“批處理模式”而變化。這可以用trt_version進行配置,并使用use_implicit_batch分區的partition_for_tensorrt批處理參數。
如果TVM是針對TensorRT庫構建的,則鏈接版本將用于分區。
Codegen
此實現使用codegen的JSONRuntime
JSONSerializer基類將中繼表達式序列化為json格式。
Runtime
runtime由tensorrt中的runtime模塊類處理tensorrt_runtime.cc。在runtime,它首先使用TensorRTBuilder類(tensorrt_builder.cc)用于使用TensorRT API將json圖轉換為TensorRT INetworkDefinition。它使用tensorrt中的converterconverter classes算子tensorrt_ops.cc。然后,構建TensorRT引擎,此過程可能需要幾分鐘時間,因為TensorRT將在此時執行優化。引擎被緩存以備進一步的推理調用。
如果guards,runtime可以針對許多TensorRT版本進行編譯。它適用于TensorRT 5、6和7。編譯后的模型必須為TensorRT版本<=runtime使用的版本進行分區。編譯后的模型可能需要更新的TensorRT版本的算子可用。
Problem
TensorRT有一些參數,比如max_workspace_size和use_implicit_batch,希望用戶能夠在分區_中為partition_for_tensorrt提供這些參數。這些參數需要傳遞給codegen并存儲在序列化圖中,直到運行時為止。使用“隱式”批處理也會影響分區規則。使用環境變量將這些從Python傳遞到C++中的代碼生成。想知道有沒有更好的方法來做這個?
我在python/tvm/relay/op/contrib/tensorrt.py中實現了一個名為prune_tensorrt_subgraphs()的轉換/tensorrt.py. 這是在分區之后運行的,決定是保留子圖還是將其返回到典型的TVM編譯路徑。之所以需要這樣做,是因為有些子圖可能是無效的——例如當輸入具有不同的批處理大小時,或者為了優化目的,如果子圖沒有乘法累加。在C++中實現了一個通用版本,但使用全局注冊表來允許每個代碼對象定義自己的is_invalid_subgraph回調。將來,如果找到更好的方法來注冊回調,可以切換到泛型版本。
需要在注釋時介入目標tensorrt版本。把它放在一個全局變量中。
總結
以上是生活随笔為你收集整理的TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPU上如何优化卷积
- 下一篇: TVM vs TensorRT比较