TensorRT轉換時的靜態模式與動態模式


原文鏈接:https://www.cnblogs.com/harrymore/p/15387117.html

1. TensorRT的模型轉換

當我們需要利用NVIDIA的硬件進行加速模型的時候,很多時候會選擇將模型轉為TensorRT模型,不同的框架下有各種各樣的轉換方式,如轉為uff然后再轉TensorRT,或者先轉為onnx再轉TensorRT,不過一般都比較繁瑣,並且需要修改推斷代碼。

自TensorFlow1.7及更高版本開始,TensorFlow與TensorRT模型混合使用變得更加方便,通常不需要改動原來的TensorFlow模型的推斷代碼就能夠使用TensorRT模型,具體原理可以參考使用TensorRT加速GPU上的TensorFlow推理

 

一般來說,需要先把原來的TensorFlow模型轉為TensorRT模型,轉換的核心代碼如下:

trt_graph = trt.create_inference_graph(graph_def,                                             
                                       outputs=output_names,
                                       max_batch_size=batch_size,
                                       max_workspace_size_bytes=workspace_size,
                                       precision_mode=precision_mode)

 

但是往往在這個過程中,會出現譬如以下的報錯:

TensorRT node TRTEngineOp_0 added for segment 0 consisting of 139 nodes failed: Internal: Input shapes must be fully defined when in static mode. Please try is_dynamic_op=True (shape was [?,?,?,?]). Fallback to TF...

究其原因,是因為在轉換為TensorRT模型的時候,要求輸入是確定的shape,如果不是需要將is_dynamic_op參數設置為True,這樣將轉為動態模式。

 

2. 靜態模式與動態模式區別

2.1. 靜態模式

轉之前的模型,輸入的維度形狀都是確定的,不可以變。這種情況下,TensorRT已經將engine離線創建了,在加載TensorRT模型的時候,會自動創建engine。

2.2. 動態模式

轉之前的輸入維度是動態的(最經常的情況,就是批次的維度不確定,但是其他維度確定),這個時候,在轉換的時候其實並沒有離線創建engine,但是由於TensorRT在運行的時候又要求所有的維度都是確定的,因此,TensorRT每遇到一個新的形狀的時候,就會創建一個新的engine。在實際的推理中,有時候速度會突然變慢,往往是創建engine造成的。

 

3. engine的重用機制

上面說到,在動態模式下,遇到新的輸入形狀,TensorRT會新創建一個新engine。但並不是所有情況都會重新創建,TensorRT有其engine重用機制,只要符合下面兩個條件即可:

  • 當前engine的batch size大於等於新的input的batch size
  • engine的其他維度與新的input的其他維度匹配

舉個例子。我們模型的輸入維度為[?,128,128,3],其中第一個維度為batch size維度。當遇到第一個新input,它的輸入形狀為[10,128,128,3],這個時候,TensorRT會創建一個新的engine(就叫A吧),它輸入的形狀為[10,128,128,3],並將該engine緩存。

如果遇到一個新的輸入,如[3,128,128,3],這個時候會先去緩存尋找是否有符合的engine,因為batch size比engine A的要小,而且其他維度是一樣的,所以就不再創建新的engine,直接利用A進行推理了。

當然,engine的緩存個數是有限的,需要在轉換的時候進行設置(maximum_cached_engines參數 ),一般建議是5.

最后修改完的參數為:

    trt_graph = trt.create_inference_graph(graph_def, 
                                           outputs=output_names,
                                           max_batch_size=batch_size,
                                           is_dynamic_op=True,         
                                           max_workspace_size_bytes=workspace_size,
                                           maximum_cached_engines=5,
                                           precision_mode=precision_mode) 

4. 參考

官網文檔:static-dynamic-mode

使用TensorRT加速GPU上的TensorFlow推理

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM