如何减少onnxruntime.InferenceSession调用的大量线程数?
减少ONNX Runtime创建的CPU线程数
这是因为ONNX Runtime默认会根据CPU核心数自动创建大量线程用于并行计算,想要减少留存的线程数,可以通过以下几种方式调整配置:
直接配置InferenceSession的线程参数
创建SessionOptions对象,手动设置算子内和算子间的并行线程数,按需调整数值(比如根据CPU核心数或实际推理性能需求):import onnxruntime from time import sleep sleep(20) sess_options = onnxruntime.SessionOptions() # 控制单个算子内部的并行计算线程数 sess_options.intra_op_num_threads = 2 # 控制不同算子之间的并行调度线程数 sess_options.inter_op_num_threads = 2 model = onnxruntime.InferenceSession('my.onnx', sess_options=sess_options, providers=['CPUExecutionProvider'])把这两个参数设为较小的数值(比如1-4),就能明显降低留存的线程数量。
通过环境变量限制OpenMP线程数
ONNX Runtime的CPU后端依赖OpenMP实现并行,你可以在导入onnxruntime前设置环境变量来限制线程数:import os # 设定OpenMP线程数为2,可根据需求调整 os.environ["OMP_NUM_THREADS"] = "2" import onnxruntime from time import sleep sleep(20) model = onnxruntime.InferenceSession('my.onnx', providers=['CPUExecutionProvider'])注意环境变量必须在导入onnxruntime之前设置才会生效。
完全禁用并行(适合对速度要求不高的场景)
如果不需要任何并行计算,直接把两个线程数都设为1,线程数会降到最低:import onnxruntime from time import sleep sleep(20) sess_options = onnxruntime.SessionOptions() sess_options.intra_op_num_threads = 1 sess_options.inter_op_num_threads = 1 model = onnxruntime.InferenceSession('my.onnx', sess_options=sess_options, providers=['CPUExecutionProvider'])这种设置会牺牲部分推理速度,需要根据实际场景权衡使用。
内容的提问来源于stack exchange,提问作者olivia
相关产品推荐
相关产品推荐

