PaddleSpeech 服务端 ONNX 推理会话配置详解:读懂 `paddlespeech.server.utils.onnx_infer` 的 `get_sess` 实现
2026/9/24 21:58:59 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

本篇技术指南围绕 PaddleSpeech 服务端工具模块paddlespeech.server.utils.onnx_infer(文档入口见 paddlespeech.server.utils.onnx_infer 模块 API)展开,深入剖析其核心函数get_sess如何基于 ONNX Runtime 创建推理会话、如何通过配置字典控制执行设备、图优化级别与线程数。读完本文,你将能够看懂服务端 ASR / TTS 在线引擎的 ONNX 推理参数体系,并能在实际部署配置文件中精准调优sess_conf

一、模块定位:服务端 ONNX 推理的统一入口

在 PaddleSpeech 的服务端架构中,paddlespeech/server/utils/onnx_infer.py承担着"为 ONNX 模型创建推理会话"这一基础职责。整个模块非常精炼,只对外暴露一个函数:

  • get_sess(model_path, sess_conf):读取一个.onnx模型文件路径和一份会话配置字典,返回一个onnxruntime.InferenceSession实例。

从源码结构看(见 onnx_infer.py),该函数内部完成了三件核心工作:

  1. 组装onnxruntime.SessionOptions(图优化级别、执行模式、线程数);
  2. 依据配置选择 ExecutionProvider(CPU / CUDA / TensorRT);
  3. 调用ort.InferenceSession完成会话创建。

它与服务端另一套基于 Paddle Inference 的工具模块paddle_predictor.py形成对照:前者面向 ONNX Runtime 推理路径,后者面向 Paddle Inference 推理路径,二者在服务端引擎层通过不同的engine_type被选择使用。

二、get_sess源码逐段拆解

以下是get_sess的完整实现(摘自 onnx_infer.py):

def get_sess(model_path: Optional[os.PathLike]=None, sess_conf: dict=None): logger.debug(f"ort sessconf: {sess_conf}") sess_options = ort.SessionOptions() sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL if sess_conf.get('graph_optimization_level', 99) == 0: sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_DISABLE_ALL sess_options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL # "gpu:0" providers = ['CPUExecutionProvider'] if "gpu" in sess_conf.get("device", ""): device_id = int(sess_conf["device"].split(":")[1]) providers = [('CUDAExecutionProvider', {'device_id': device_id})] # fastspeech2/mb_melgan can't use trt now! if sess_conf.get("use_trt", 0): providers = ['TensorrtExecutionProvider'] logger.debug(f"ort providers: {providers}") if 'cpu_threads' in sess_conf: sess_options.intra_op_num_threads = sess_conf.get("cpu_threads", 0) else: sess_options.intra_op_num_threads = sess_conf.get( "intra_op_num_threads", 0) sess_options.inter_op_num_threads = sess_conf.get("inter_op_num_threads", 0) sess = ort.InferenceSession( model_path, providers=providers, sess_options=sess_options) return sess

2.1 SessionOptions 的默认策略

  • 图优化级别默认全开:函数默认设置graph_optimization_level = ORT_ENABLE_ALL,这是 ONNX Runtime 提供的最高级别图优化(含基本优化、扩展优化与布局优化),仅在配置中显式传入graph_optimization_level: 0时才降级为ORT_DISABLE_ALL
  • 执行模式固定为顺序执行execution_mode = ORT_SEQUENTIAL,即算子按拓扑顺序逐个执行。对于语音服务这类以推理延迟为主要指标的在线场景,顺序执行通常已足够;若需要图内算子并行,可考虑ORT_PARALLEL(当前模块未开放该选项)。

2.2 Provider 选择逻辑:CPU / CUDA / TensorRT

device字段的取值格式为"gpu:<id>""cpu"

  • 未配置或配置为"cpu":使用['CPUExecutionProvider']
  • 配置为"gpu:0"这类字符串:解析冒号后的数字作为device_id,使用[('CUDAExecutionProvider', {'device_id': device_id})]
  • 在 GPU 基础上再开启use_trt: True:直接切换到['TensorrtExecutionProvider']

源码注释特别强调了一个兼容性约束:"fastspeech2/mb_melgan can't use trt now!",意味着 FastSpeech2 声学模型与 MB-MelGAN 声码器当前无法配合 TensorRT 使用,配置use_trt前需要确认目标模型的支持情况。

2.3 线程数配置的两种写法

线程配置体现了对两套配置命名习惯的兼容:

  • 优先读取cpu_threads(服务端 TTS 配置中使用);
  • 若不存在,则回退读取intra_op_num_threads(服务端 ASR 配置中使用),二者本质都作用于sess_options.intra_op_num_threads,即"节点内部算子并行执行"的线程数;
  • inter_op_num_threads控制"图中跨节点并行执行"的线程数,独立读取。

intra_op_num_threadsinter_op_num_threads的含义与 onnxruntime 官方InferenceSession参数一致:前者决定单个算子内部的数据并行线程数,后者决定整个计算图中多个算子之间的并行度。对延迟敏感的在线推理,通常建议inter_op_num_threads保持为 0(由 Runtime 自动决定)或设小值,避免线程调度开销影响单请求延迟。

三、服务端引擎中的实际调用链

3.1 在线 ASR(onnx 引擎)

在 asr_engine.py 中,ASRServerExecutor.init_modeldeepspeech2系列模型调用:

self.am_predictor = onnx_infer.get_sess( model_path=self.am_model, sess_conf=self.am_predictor_conf)

配置从self.config.am_predictor_conf注入(见 asr_engine.py),即服务端 yaml 中asr_online-onnx段落下的am_predictor_conf字段。该引擎通过CommonTaskResource(task='asr', model_format='onnx', inference_mode='online')管理模型资源下载,ONNX 引擎只使用am_model(onnx 静态图文件),am_params会被断言为 None。

3.2 在线 TTS(onnx 引擎)

在 tts_engine.py 中,get_sess被复用多次,覆盖声学模型与声码器两类子模型:

  • FastSpeech2fastspeech2_csmsc_onnx):单个 onnx 模型,创建self.am_sess(tts_engine.py);
  • FastSpeech2 + CNN Decoderfastspeech2_cnndecoder_csmsc_onnx):支持流式 AM 推理,需要三个子模型 encoder / decoder / postnet,分别创建self.am_encoder_infer_sessself.am_decoder_sessself.am_postnet_sess(tts_engine.py),同时加载am_stat中的均值方差用于归一化;
  • 声码器mb_melgan_csmsc_onnx/hifigan_csmsc_onnx):创建self.voc_sess(tts_engine.py)。

可以看出,get_sess是服务端"onnx 化"在线推理的最小公共原语:无论模型形态是单个 onnx 文件还是多个子图文件,统一通过它生成推理会话,上层引擎只负责按需调用。

四、服务端配置文件中的sess_conf参数对照

get_sess实际消费的配置键与两个官方服务端配置文件的对应关系如下:

配置键默认行为作用典型配置出处
device"cpu"(默认 CPUExecutionProvider)选择推理设备,"gpu:<id>"触发 CUDA Providertts_online_application.yaml、ws_ds2_application.yaml
use_trt0GPU 下切换 TensorrtExecutionProvider(FastSpeech2/MB-MelGAN 暂不支持)tts_online_application.yaml
graph_optimization_level非 0 时启用 ORT_ENABLE_ALL;显式为0时 ORT_DISABLE_ALL控制 onnxruntime 图优化级别ws_ds2_application.yaml
cpu_threads0(不设置则回退读取 intra_op_num_threads)intra_op 线程数(TTS 命名风格)tts_online_application.yaml
intra_op_num_threads0节点内算子并行线程数(ASR 命名风格)ws_ds2_application.yaml
inter_op_num_threads0图内跨节点并行线程数ws_ds2_application.yaml

其中log_severity_levellog_verbosity_level两个日志相关键在配置中给出(见 ws_ds2_application.yaml),用于控制会话加载与初始化阶段的日志级别,属于 onnxruntime 会话级日志配置,get_sess当前实现中未直接消费,但保留在配置中以备排查问题。

在线 TTS 配置实例

流式 TTS 服务端配置(tts_online_application.yaml)中,tts_online-onnx引擎对 AM 与声码器分别给出会话配置:

tts_online-onnx: am: 'fastspeech2_cnndecoder_csmsc_onnx' am_ckpt: # list am_sess_conf: device: "cpu" use_trt: False cpu_threads: 4 voc: 'hifigan_csmsc_onnx' voc_sess_conf: device: "cpu" use_trt: False cpu_threads: 4

配合流式推理参数am_block: 72am_pad: 12(CNN Decoder 流式 AM 的块长与 padding,am_pad设为 12 时流式合成结果与非流式一致)以及voc_block: 36voc_pad: 14(MB-MelGAN 声码器流式参数),这些参数与get_sess创建的会话共同构成完整的流式 TTS 推理链路。若amfastspeech2_csmsc_onnxam_ckpt只需单个 ckpt;若选fastspeech2_cnndecoder_csmsc_onnx,则am_ckpt需按 [encoder, decoder, postnet] 顺序给出三个模型文件。

在线 ASR 配置实例

流式 ASR 服务端配置(ws_ds2_application.yaml)中,asr_online-onnx引擎的配置示例:

asr_online-onnx: model_type: 'deepspeech2online_wenetspeech' am_model: # the pdmodel file of onnx am static model [optional] lang: 'zh' sample_rate: 16000 device: 'cpu' am_predictor_conf: device: 'cpu' graph_optimization_level: 0 intra_op_num_threads: 0 inter_op_num_threads: 0 log_severity_level: 2 log_verbosity_level: 0

chunk_buffer_conf段则与 VAD/分帧相关(frame_duration_mswindow_nshift_n等),描述流式输入的音频分块策略,与推理会话配置相互独立。

五、配置要点与调优建议

结合get_sess实现与服务端配置文件,部署时建议关注以下几点:

  1. CPU 推理:默认即 CPU Provider。可调cpu_threads/intra_op_num_threads提升单算子并行度;由于服务端推理以单请求延迟为主,inter_op_num_threads建议保持默认(0,由 Runtime 决定),过大会引入线程调度开销。
  2. GPU 推理:将device设为"gpu:0"(按实际卡号调整),get_sess会自动携带device_id创建 CUDAExecutionProvider。
  3. TensorRT 限制use_trt仅对支持 TensorRT 的模型生效,FastSpeech2 与 MB-MelGAN 系列当前不能使用(源码注释明确提示),配置前应确认模型类别。
  4. 图优化开关:默认ORT_ENABLE_ALL适合绝大多数场景;若遇到算子兼容性问题或需要逐算子调试,可显式配置graph_optimization_level: 0关闭优化。
  5. 命名兼容cpu_threadsintra_op_num_threads均可配置,get_sess优先读取前者;跨引擎复制配置时注意不要两者同时设置造成困惑。

六、小结

paddlespeech.server.utils.onnx_infer.get_sess是 PaddleSpeech 服务端 ONNX 推理的底层会话工厂:一段不足 30 行的实现,统一封装了图优化、执行模式、Provider 选择(CPU/CUDA/TensorRT)与线程数配置,被在线 ASR(deepspeech2 onnx)与在线 TTS(FastSpeech2 系列 onnx + 流式声码器)引擎复用。理解它的行为,就能读懂am_predictor_conf/am_sess_conf/voc_sess_conf等配置段的全部语义,进而在实际部署中对推理性能与兼容性进行精准控制。

  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询