OnnxRuntime 性能调优
link
文檔的一些筆記:
性能調(diào)優(yōu)小工具 ONNX GO Live Tool
這玩意兒有倆docker容器來實現(xiàn)支持,一個優(yōu)化容器和一起模型轉(zhuǎn)換容器。暫時具體不清楚原理,還沒來得及看,后面試試。
什么執(zhí)行單元(Execution Provider, EP)能夠提供最好的性能表現(xiàn)
CPU版本的ONNX Runtime提供了完整的算子支持,因此只要編譯過的模型基本都能成功運行。一個要注意的點是為了減少編譯的二進制包能夠足夠小,算子只支持常見的數(shù)據(jù)類型,如果是一些非常見數(shù)據(jù)類型,請去提交PR。
CUDA版本的算子并不能完全支持,如果模型中有一部分不支持的算子,將會切換到CPU上去計算,這部分的數(shù)據(jù)切換是有比較大的性能影響。當然也可以contribute或者提交issue。
對于TRT和CUDA的區(qū)別,在同設(shè)備上TRT會比CUDA有著更好的性能表現(xiàn),但是這個狀況也局限于特定的模型以及算子是被TRT支持。
性能調(diào)優(yōu)的一些建議
- Shared arena based allocator
通過配置多個session中共享內(nèi)存區(qū)域配置,可以減少內(nèi)存消耗
-
線程調(diào)控
- 如果編譯支持OpenMP,那么使用OpenMP的環(huán)境變量來控制預(yù)測線程數(shù)量。
- 如果沒有OpenMP支持,使用合適的ORT API來進行操控。
- 當使用并行實行的時候inter op線程并不會受到OpenMP設(shè)置的影響,且總是應(yīng)該使用ORT APIs來進行設(shè)置。
默認CPU執(zhí)行單元的相關(guān)設(shè)置(MLAS)
默認EP使用了很多旋鈕來控制線程數(shù)量。舉個例子:
import onnxruntime as rtsess_options = rt.SessionOptions()sess_options.intra_op_num_threads = 2 sess_options.execution_mode = rt.ExecutionMode.ORT_SEQUENTIAL sess_options.graph_optimization_level = rt.GraphOptimizationLevel.ORT_ENABLE_ALL-
Thread Count
- sess_options.intra_op_num_threads = 2控制了運行模型時的線程數(shù)量。
-
Sequential vs Parallel Execution
- sess_options.execution_mode = rt.ExecutionMode.ORT_SEQUENTIAL控制了計算圖內(nèi)部的算子是順序計算還是并行計算,當一個模型含有多個分支的時候,設(shè)置為False會有比較大的性能提升。
-
當sess_options.execution_mode = rt.ExecutionMode.ORT_PARALLEL時(即模型內(nèi)計算圖中的并行), 你可以設(shè)置 sess_options.inter_op_num_threads 來對并行計算的線程數(shù)量進行控制。這里注意是inter不是intra,和Thread Count里面的那個不一樣。
-
sess_options.graph_optimization_level = rt.GraphOptimizationLevel.ORT_ENABLE_ALL
圖結(jié)構(gòu)優(yōu)化設(shè)置,分為三個level,Basic,Extend和Layout Optimizations。默認所有的優(yōu)化都是ENABLE。
MKL_DNN / nGraph執(zhí)行單元
這倆玩意兒依賴openmp支持來實現(xiàn)并行化,對于這倆需要使用openmp的環(huán)境變量來進行性能調(diào)整。
- OMP_NUM_THREADS=n
- 控制線程池大小
- OMP_WAIT_POLICY=PASSIVE / ACTIVE
- 線程是否是thread spinning模式(線程調(diào)度的一種方式)。
- PASSIVE 吞吐量模式,CPU只有在完成當前任務(wù)后被釋放。當CPU使用率已經(jīng)很高了,用這個模式。
- ACTIVE 永遠不會釋放CPU,會以一個死循環(huán)的方式來檢查下一個任務(wù)是否已經(jīng)準備好。當你要低時延,用這個模式。
總結(jié)
以上是生活随笔為你收集整理的OnnxRuntime 性能调优的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴建明博客
- 下一篇: orbslam 注释版本