资讯动态

WeNet 在昆仑芯 XPU 上部署与运行:离线/在线 ASR 完整指南

发布时间:2026/10/14 20:19:36 来源:尧图企业网站定制
人工智能语音深度学习预训练模型推理服务【免费下载链接】wenetProduction First and Production Ready End-to-End Speech Recognition Toolkit项目地址https://gitcode.com/gh_mirrors/we/wenet点击查看免费下载本文基于 WeNet 仓库 runtime/kunlun/README.md 及其源码实现完整介绍如何将 WeNet 的端到端语音识别模型部署到昆仑芯 XPU 上运行从环境准备、编译构建、权重目录组织到decoder_main解码测试与日志解读并深入讲解XPUAsrModel的加载流程、权重量化与 Conformer 前向计算实现帮助你快速掌握在国产 AI 芯片上落地 WeNet 的完整链路。XPU 是什么昆仑芯的通用 AI 计算架构在开始部署之前需要先理解目标运行环境。XPU 是昆仑芯KUNLUNXIN100% 自主研发的通用人工智能计算核心架构WeNet 在昆仑芯片上的运行依赖以下两层基础软件栈XREXPU Runtime Environment昆仑芯片的基础运行环境包含芯片驱动程序、runtime api 库、固件FW工具等功能模块。运行日志中出现的XPURT ... libxpurt.so loaded即来自该层。XDNNXPU Deep Neural Network Library加速深度神经网络的昆仑芯片库为应用程序提供高性能的 DNN 功能库对应源码中的#include xpu/xdnn.h。在仓库的 runtime/kunlun/xpu/xpu_asr_model.cc 中可以看到模型初始化时直接创建api::Context(api::kXPU2)上下文并通过api::ctx_guard进行 RAII 生命周期管理随后调用xpu_set_device(device_id_)绑定指定设备——这就是 XPU 运行时XRE在 WeNet 侧的实际使用方式。准备 XPU 运行环境在开始构建之前请确认已获得以下必须的环境组件作用XRE昆仑芯片基础运行环境含芯片驱动、runtime api 库、固件工具XDNN昆仑芯片深度神经网络加速库提供高性能 DNN 函数库除此之外构建阶段还需要cmake 3.14 及以上版本runtime/kunlun/CMakeLists.txt中通过cmake_minimum_required(VERSION 3.14 FATAL_ERROR)强制约束支持 C14 的 gcc/g 工具链CMakeLists.txt中设置了-stdc14 -pthread -fPICXPU API 开发包路径cmake/xpu.cmake中强制要求环境变量XPU_API_PATH必须存在否则直接FATAL_ERROR终止构建它用于引入output/include头文件目录和output/so/、../runtime/output/so/动态库目录并追加-DUSE_XPU编译宏。第一步构建 release 版本按以下步骤配置环境变量并执行构建脚本脚本位于 runtime/kunlun/compile.shexport CXX${your_g_path} export CC${your_gcc_path} export XPU_API_PATH${your_api_path} # -r : release version; -d : debug version bash ./compile.sh -rcompile.sh支持三个参数具体行为如下参数含义-r构建 Release 版本-d构建 Debug 版本-c清理构建产物-c清理 CMakeCache 等缓存-c all清空整个 build 目录后重新构建例如./compile.sh -d -c all表示清空 build 目录并构建 Debug 版本。脚本内部会先检查CXX是否设置缺失时给出建议设置以支持 C14 的警告随后生成build目录以-DINTTYPES_FORMAT:STRINGC99和对应CMAKE_BUILD_TYPE执行 cmake最后调用cmake --build ./完成编译。构建产物方面runtime/kunlun/xpu/CMakeLists.txt 会编译静态库xpu_conformer.a由xpu_asr_model.cc、xpu_conformer.cpp、xpu_util.cpp组成并额外生成测试程序xpu_conformer_test而解码主程序decoder_main由 runtime/kunlun/bin/CMakeLists.txt 定义链接decoder库后输出到build/bin/目录。第二步运行解码测试构建完成后设置设备与日志环境变量并执行decoder_main进行单条语音的识别测试## set KUNLUN XPU visible device export XPU_VISIBLE_DEVICES0 export XPUSIM_DEVICE_MODELKUNLUN2 ## set logging level export GLOG_logtostderr1 export GLOG_v3 ## set speech wav and model/weight path wav_path${your_test_wav_path} xpu_model_dir${your_xpu_weight_dir} units${your_units.txt} ## executive command ./build/bin/decoder_main \ --chunk_size -1 \ --wav_path ${wav_path} \ --xpu_model_dir ${xpu_model_dir} \ --unit_path ${units} \ --device_id 0 \ --nbest 3 21 | tee log.txt各命令行参数由 runtime/kunlun/decoder/params.h 中的 gflags 定义含义如下参数默认值说明--chunk_size16解码分块大小下采样后的帧数。-1表示非流式整句解码大于 0 即流式分块解码--wav_path单个 wav 文件路径--xpu_model_dirXPU 模型权重目录对应源码DEFINE_string(xpu_model_dir, ...)见 params.h--unit_path端到端模型 units 符号表路径用于上下文/时间戳输出--device_id0使用的 XPU 设备 ID--nbest10候选数量ctc wfst 或 prefix 搜索的 nbest--num_left_chunks-1解码时左侧 chunk 数--ctc_weight0.5最终得分中 CTC 分数的权重--rescoring_weight1.0最终得分中 rescoring 分数的权重--reverse_weight0.0双向 Transformer rescoring 权重仅 decoder 为双向模型时 0--num_bins80fbank 特征 mel 数--sample_rate16000音频采样率--feat_typekaldi特征提取类型kaldi / whisper需要注意--xpu_model_dir与 Torch/ONNX 的--model_path/--onnx_dir是并列的模型入口在 params.h 中当FLAGS_xpu_model_dir非空且编译时定义了USE_XPU时才会创建XPUAsrModel并调用SetDeviceId与Read否则直接报错提示需要-DXPUON重新构建。除wav_path外decoder_main还支持批量解码通过--wav_scp传入 wav 列表文件配合--thread_num解码线程数、--warmup预热次数、--continuous_decoding连续解码模式、--simulate_streaming模拟流式输入等开关最终会输出RTF实时率统计详见 runtime/kunlun/bin/decoder_main.cc。运行结果解读一次典型的 XPU 解码日志单条语音执行结果如下原文档示例XPURT /docker_workspace/icode-api/baidu/xpu/api/../runtime/output/so/libxpurt.so loaded I1027 06:06:21.933722 111767 params.h:152] Reading XPU WeNet model weight from /docker_workspace/icode-api/baidu/xpu/api/example/wenet-conformer/all_data/ I1027 06:06:21.934103 111767 xpu_asr_model.cc:46] XPU weight_dir is: /docker_workspace/icode-api/baidu/xpu/api/example/wenet-conformer/all_data//model_weights/ I1027 06:06:23.832731 111767 xpu_asr_model.cc:65] XPU Kunlun Model Info: I1027 06:06:23.832749 111767 xpu_asr_model.cc:66] subsampling_rate 4 I1027 06:06:23.832777 111767 xpu_asr_model.cc:67] right_context 6 I1027 06:06:23.832789 111767 xpu_asr_model.cc:68] sos 5538 I1027 06:06:23.832795 111767 xpu_asr_model.cc:69] eos 5538 I1027 06:06:23.832799 111767 xpu_asr_model.cc:70] is bidirectional decoder 1 I1027 06:06:23.832804 111767 params.h:165] Reading unit table /docker_workspace/icode-api/baidu/xpu/api/example/wenet-conformer/all_data/dict I1027 06:06:23.843475 111776 decoder_main.cc:54] num frames 418 I1027 06:06:23.843521 111776 asr_decoder.cc:104] Required 2147483647 get 418 I1027 06:06:23.843528 111776 xpu_asr_model.cc:116] Now Use XPU:0! I1027 06:06:23.843616 111776 xpu_asr_model.cc:173] max_seqlen is 418 I1027 06:06:23.843619 111776 xpu_asr_model.cc:174] q_seqlen is 103 I1027 06:06:23.843623 111776 xpu_asr_model.cc:175] att_dim is 512 I1027 06:06:23.843626 111776 xpu_asr_model.cc:176] ctc_dim is 5538 I1027 06:06:23.852284 111776 asr_decoder.cc:113] forward takes 7 ms, search takes 1 ms I1027 06:06:23.852383 111776 asr_decoder.cc:194] Partial CTC result 甚至出现交易几乎停滞的情况 I1027 06:06:23.852530 111776 asr_decoder.cc:194] Partial CTC result 甚至出现交易几乎停滞的情况 I1027 06:06:23.852537 111776 xpu_asr_model.cc:248] num_hyps is 3 I1027 06:06:23.852541 111776 xpu_asr_model.cc:249] beam_size is 3 I1027 06:06:23.852545 111776 xpu_asr_model.cc:250] new_bs is 3 I1027 06:06:23.852545 111776 xpu_asr_model.cc:251] max_hyps_len is 14 I1027 06:06:23.853902 111776 asr_decoder.cc:84] Rescoring cost latency: 1ms. I1027 06:06:23.853911 111776 decoder_main.cc:72] Partial result: 甚至出现交易几乎停滞的情况 I1027 06:06:23.853914 111776 decoder_main.cc:104] test Final result: 甚至出现交易几乎停滞的情况 I1027 06:06:23.853924 111776 decoder_main.cc:105] Decoded 4203ms audio taken 10ms. test 甚至出现交易几乎停滞的情况 I1027 06:06:23.853984 111767 decoder_main.cc:180] Total: decoded 4203ms audio taken 10ms.这段日志完整呈现了 XPU 上的解码链路可拆解为四个阶段权重加载params.h:152读取xpu_model_dirxpu_asr_model.cc:46确认权重子目录model_weights/模型元信息xpu_asr_model.cc:65打印模型配置——subsampling_rate4、right_context6、sos/eos5538、is_bidirectional_decoder1这些字段来自 xpu_asr_model.cc 的硬编码读取逻辑编码器前向num frames 418表示 418 帧 fbank 特征经过 4 倍下采样后q_seqlen103att_dim512、ctc_dim5538分别对应注意力维度与词表大小随后forward takes 7 msattention rescoringnum_hyps3、beam_size3与命令行--nbest 3对应max_hyps_len14为候选最长序列长度Rescoring cost latency: 1ms最终输出Decoded 4203ms audio taken 10ms注意此处数值为原文档示例日志实际性能以你的硬件环境为准。深入原理XPUAsrModel 的权重目录与加载流程从源码层面看XPU 部署与 Torch/ONNX 部署最大的差异在于模型权重以逐层文件形式存放在目录中而不是单一模型文件。XPUAsrModel::Read()xpu_asr_model.cc的实现逻辑为创建api::Context(api::kXPU2)与ctx_guard将model_dir拼出model_dir/model_weights/作为权重目录检查model_weights/weights_info.txt是否存在不存在则LOG(FATAL)终止调用init_encoder_params/init_decoder_params逐层加载权重读取并打印模型元信息subsampling_rate、right_context、sos/eos、双向解码标志。weights_info.txt 与逐层权重文件weights_info.txt是 XPU 权重目录的索引文件每一行格式为权重名:shape:长度解析逻辑见 runtime/kunlun/xpu/xpu_util.cpp 的get_weights_lens与get_weights_shape例如形如(512, 1, 3, 3)的 shape 描述。所有层权重以二进制文件*.dat形式存放其命名与 WeNet PyTorch 模型的 state_dict key 一一对应例如encoder.pe、encoder.global_cmvn.mean、encoder.global_cmvn.istd位置编码与全局 CMVN 参数encoder.embed.conv.0.、encoder.embed.conv.2.、encoder.embed.out.0.下采样 embedding 模块的卷积与全连接encoder.encoders.N.feed_forward_macaron.w_1.、self_attn.linear_q.、conv_module.pointwise_conv1.等每个 Conformer 层的 macaron FFN、自注意力 Q/K/V、深度可分离卷积模块ctc.ctc_lo.CTC 输出层decoder.left_decoder.decoders.N.系列Transformer decoder 各层权重。模型结构参数如层数、注意力头数、FFN 维度等一部分来自weights_info.txt中的权重 shape 推算例如head_num取pos_bias_u的第 0 维、head_dim取第 1 维一部分直接硬编码如encoder_layer_num12、decoder_layer_num3、beam_size3详见 runtime/kunlun/xpu/xpu_conformer.h 与 xpu_conformer.h 中的init_encoder_params/init_decoder_params。FP16 与权重量化XPUAsrModel内部以float16作为计算精度T以int16_t作为权重量化精度TW见 xpu_asr_model.h。权重加载时通过get_xpu_quant_dataxpu_util.cpp完成量化 找 max两步先调用api::quantization把浮点权重量化到int16_t同时计算每个张量的绝对值最大值存入max_ptr_供 XDNN 在反量化时使用。另外在init_encoder_params中还有多处算子融合优化例如get_fc_fused_param将自注意力的 Q/K/V 三个全连接融合为一个矩阵乘get_fc_ln_fused_param将全连接与 LayerNorm 的 scale/bias 融合进权重与偏置get_conv_bn_fused_param将卷积与 BatchNorm 融合假设 eps1e-5。这些融合从源码结构看是为了减少 XPU 上的 kernel 调用次数、提升推理效率。前向计算与解码流程的源码实现在 xpu_asr_model.cc 的ForwardEncoderFunc中XPU 推理的核心步骤包括数据准备将缓存特征cached_feature_与当前 chunk 特征拼接构造 batch1 的{1, num_frames, feature_dim}输入并通过xpu_memcpy以XPU_HOST_TO_DEVICE方式拷贝到设备创建流与上下文xpu_stream_create创建 XPU 流set_nsdnn(nsdnn)、set_ncluster(ncluster)设置并发参数单线程时为 nsdnn6、ncluster8构造 maskcreate_mask_according_speech_length依据语音长度生成下采样后的 padding mask等价于 PyTorch 中masks ~make_pad_mask(xs_lens, T).unsqueeze(1)与x_mask[:, :, :-2:2][:, :, :-2:2]的组合编码器前向调用xpu::wenet::conformer_encoder_wenet得到编码器输出与 CTC 概率其中q_seqlen ((max_seqlen - 1) / 2 - 1) / 2对应两层 2 倍下采样结果回传CTC 概率经api::cast_v2T, float转回 float32再逐帧XPU_DEVICE_TO_HOST拷回主机供搜索使用。解码流程与标准 WeNet 一致CTC prefix beam search在 CPU 上执行产出候选随后AttentionRescoringxpu_asr_model.cc把候选序列 padding 后送入conformer_decoder_wenet在 XPU 上跑 decoder 打分最后按score * (1 - reverse_weight) r_score * reverse_weight计算最终得分。除了decoder_main仓库还提供了两个辅助入口xpu_conformer_test编译xpu子目录时生成xpu/CMakeLists.txt支持encoder_test / decoder_test / all三种模式用于脱离完整解码链路直接验证 Conformer 编码器/解码器在 XPU 上的正确性与多线程吞吐见 conformer_test.cppwenet_api / api_mainruntime/kunlun/api/README.md 表明该 API 层借鉴 vosk 的接口设计当前已实现非流式识别流式识别、nbest、上下文热词、对齐、后处理语言支持与标签校验等功能标注为待实现。常见问题与注意事项XPU_API_PATH未设置导致构建失败cmake/xpu.cmake会在XPU选项为 ON默认值且未设置该环境变量时直接报错终止请确保其指向正确的 XPU API 安装目录且output/include、output/so/结构完整模型入口参数互斥decoder_main只能通过--model_pathTorch、--onnx_dirONNX、--xpu_model_dirXPU、--bpu_model_dirBPU、--openvino_dirOpenVINO之一加载模型XPU 权重目录内必须包含model_weights/与model_weights/weights_info.txt设备选择通过export XPU_VISIBLE_DEVICES0指定可见设备--device_id 0指定使用的设备号运行日志中会打印Now Use XPU:0!流式 vs 非流式--chunk_size -1为非流式整句解码设置正数 chunk_size 并配合--simulate_streaming可模拟流式输入解码器结构是否支持流式需要与模型训练配置一致RTF 评估批量解码后程序会输出RTF总解码时间/总音频时长可用作 XPU 推理性能的衡量指标示例见 decoder_main.cc。小结通过以上步骤你已经可以在昆仑芯 XPU 上完成 WeNet 从构建到运行的全过程使用compile.sh配合CXX、CC、XPU_API_PATH构建decoder_main组织好model_weights/weights_info.txt格式的权重目录再用--xpu_model_dir等参数执行识别。仓库源码显示这一套运行时通过XPUAsrModel封装了 XRE/XDNN 的设备管理与算子调用以 FP16 计算、int16 权重量化和算子融合为手段充分利用昆仑芯片能力同时保留了与非流式/流式解码、attention rescoring、RTF 评测等标准 WeNet 解码能力的完整对接。若需在服务化场景中使用可参考 runtime/kunlun/bin 下的 grpc/websocket/http 服务端入口并结合 runtime/kunlun/api/README.md 中已实现的非流式 API 进行扩展。赞分享人工智能语音深度学习预训练模型推理服务【免费下载链接】wenetProduction First and Production Ready End-to-End Speech Recognition Toolkit项目地址https://gitcode.com/gh_mirrors/we/wenet点击查看免费下载相关推荐PaddleClas 昆仑芯 XPU 上的 FastDeploy C 部署完整指南PaddleClas 昆仑芯 XPU 上的 FastDeploy C 部署完整指南 导读 本指南基于 PaddleClas 仓库中 deploy/fastd人工智能深度学习计算机视觉PaddleSeg 语义分割模型在昆仑芯 XPU 上的 FastDeploy Python 部署实战指南PaddleSeg 语义分割模型在昆仑芯 XPU 上的 FastDeploy Python 部署实战指南 本文以 PaddleSeg 仓库中 deploy/fa人工智能计算机视觉预训练calibre 免费电子书管理指南从建库到转换、推书新手三步上手的完整流程calibre 免费电子书管理指南从建库到转换、推书新手三步上手的完整流程 calibre 是一款完全免费的开源电子书管理软件覆盖 Windows、mac桌面应用后端上一篇如何使用WeClone从微信聊天记录创建你的AI数字分身终极指南下一篇茉莉花插件中文文献管理的智能升级方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑