跳到主要内容

语音识别 / ASR 工具链

WeNet 私有化部署:显存、选卡、训练时长,一次算清

WeNet 不是一个模型,是一整条从数据准备训到 Triton 上线的中文语音识别流水线。这里把每个 checkpoint 的真实体积、单流显存、官方压测数字,和对应的 NexGPU 卡型摆在一起。

WeNet 出自西工大 ASLP 与出门问问那条线,Interspeech 2021 的 WeNet 论文和 2022 年的 WeNet 2.0 定下了它的路子:U2/U2++ 用一套权重同时覆盖流式与非流式,CTC 先出候选、attention decoder 再 rescoring 两遍解码,训练完直接导出 LibTorch / ONNX Runtime / OpenVINO / TensorRT 跑生产。仓库 Apache-2.0,5200+ star,2026 年 6 月还在提交。

要注意的是它最后一个打 tag 的版本是 v3.1.0(带来 FSDP、flash attention 修复、把 Python 下限抬到 3.10、推荐 step_save 而不是 epoch_save),之后的能力全长在 main 分支上 —— 命令行工具、SenseVoice、FireRedASR、whisper-large-v3-turbo、中文标点模型都是。所以官方 README 给的安装方式是 git 安装,不是照版本号装。

于是「WeNet 需要多大显存」这个问题得先问你挂的是哪个 checkpoint:AISHELL 基线 4600 万参数、权重包 181MB,和 FireRedASR-AED-L 的 11 亿参数、权重包 4.6GB,差了二十几倍。ASR 模型整体比 LLM 小两个数量级,推理时显存主要被并发批和 beam 吃掉,真正需要多卡的是从零训练 —— WenetSpeech 一万小时的官方 recipe 就是 8 张 3090 跑 4.6 天。

01 —

能挂在 WeNet 上的模型与真实体积

权重体积取自官方 ModelScope 分发仓库的实际文件大小,显存为单流推理的实际量级

版本参数量显存上下文说明
wenetspeech u2++ conformer(CLI: -m wenetspeech)约 1.2 亿(12 层 512 维 Conformer + 3+3 BiTransformer)权重包 470MB,FP32 单流峰值约 2GB流式 640ms chunk / 非流式整句,一套权重通吃中文通用主力。官方 recipe 在 Dev / Test_Net / Test_Meeting 上 CER 做到 5.87 / 8.87 / 11.79
aishell u2++ conformer约 4600 万(12 层 256 维 Conformer,4 头、2048 FFN)权重包 181MB,FP32 单流峰值约 1.5GB动态 chunk 训练,部署时自选 chunk 大小复现和教学基线,单卡就能训。AISHELL-1 上 HLG(k2 LM)+ attention rescoring + LFMMI 做到 CER 4.11
paraformer(CLI: -m paraformer)2 亿级非自回归(Paraformer-Large 架构)权重包 909MB,FP32 单流峰值约 3GB整句一次前向出结果,没有自回归解码中英双语,延迟方差最小的常驻服务选择,长句不会被自回归拖尾
sensevoice_small(CLI: -m sensevoice_small)与 Whisper-Small 同级(2 亿级)权重包 868MB,FP32 单流峰值约 3GB非自回归,一次前向同时出文本、语种、情感与音频事件覆盖中、粤、英、日、韩。官方称同参数量下比 Whisper-Small 快 5 倍以上。注意权重走 FunASR 模型开源协议,不是 Apache-2.0
firered(FireRedASR-AED-L)11 亿权重包 4.6GB(FP32 权重约 4.3GB),单流峰值 8GB 起单条音频上限 60 秒(LLM 版是 30 秒)中文开源 CER 的天花板之一:aishell1 0.55%、aishell2 2.52%、WenetSpeech 4.88%。批量解码时同一 batch 里句长要接近
whisper-large-v3 / whisper-large-v3-turbo15.5 亿 / 8.09 亿权重包 2.43GB / 1.26GB,FP16 单流峰值约 10GB / 6GB30 秒窗口滑动切分多语种兜底。踩坑提醒:hub 里小号 Whisper 的 key 拼成了 whiper-tiny / whiper-base / whiper-small / whiper-medium,只有 large-v3 两个拼对了

02 —

按场景选卡

WeNet 的显存吃在并发和训练上,不在权重上,卡型顺着这条线选就不会错

  • 常驻一个 U2++ Conformer / Paraformer 在线转写服务

    RTX 3090 24GB$0.193/卡·时

    权重不到 1GB,24GB 全部留给并发批和 CTC prefix beam;这张卡比 T4 更便宜、显存还多 8GB

  • 对齐官方 Triton + ONNX FP16 的 GPU 压测口径

    Tesla T4 16GB$0.298/卡·时

    WeNet runtime/gpu 公布的 RTF 0.0009–0.0011、离线吞吐 88–228 请求/秒就是在 T4 上测的,同卡复现才有可比性

  • 跑 FireRedASR-AED-L 或 Whisper large-v3 做高精度批量转写

    RTX 4090 24GB$0.540/卡·时

    11 亿参数 FP32 权重就 4.3GB,24GB 才够把 batch 开大、把自回归解码的吞吐拉起来

  • 在 WenetSpeech 一万小时上从零训 U2++ Conformer

    RTX 3090 24GB × 8$0.193/卡·时(8 卡合计 $1.544/时)

    官方 recipe 的原始配置就是 8×3090、dynamic batch 36000、acc_grad 4;单节点最多能开到 14 卡,想加速直接往上堆

03 —

四步把 WeNet 跑起来

命令全部照抄官方 README 与 examples 里的 recipe,没有改写

  1. 01

    开一台 PyTorch 实例,装 WeNet

    选 PyTorch 预置镜像开机,conda 建 python 3.10 环境(v3.1.0 起要求 3.10+),官方推荐 torch 2.2.2+cu121,另外记得 conda install conda-forge::sox。安装走 git 而不是版本号 —— CLI、SenseVoice、FireRedASR 这些都只在 main 分支上。

    pip install git+https://github.com/wenet-e2e/wenet.git
  2. 02

    一行命令把识别链路跑通

    CLI 会自动去 ModelScope 拉权重缓存到本地,第一次跑 paraformer 要下 909MB、跑 firered 要下 4.6GB。换模型只改 -m:wenetspeech / paraformer / firered / sensevoice_small / whisper-large-v3-turbo,中文标点另外挂 punc(1.07GB)。

    wenet -m paraformer audio.wav
  3. 03

    多卡训练或在自有数据上微调

    recipe 用 torchrun 起 DDP,train_engine 可以切 torch_ddp / deepspeed / fsdp。上千小时的数据一定先做成 shard(打成 tar 包)再把 data_type 设成 shard,直接喂 raw list 的话 IO 会先把机器压死,这是自建训练最常见的翻车点。

    torchrun --nnodes=1 --nproc_per_node=8 wenet/bin/train.py --train_engine torch_ddp --config conf/train_u2++_conformer.yaml --data_type shard --train_data data/train/data.list --cv_data data/dev/data.list --model_dir exp/u2pp_conformer --ddp.dist_backend nccl --num_workers 8 --prefetch 100 --pin_memory
  4. 04

    导出 ONNX FP16,挂 Triton 对外

    GPU 侧走 runtime/gpu 的 Triton 方案(官方基线镜像是 Triton 22.03,gRPC 8001 / HTTP 8000)。导出脚本支持 --fp16 与 --streaming,流式默认 decoding_chunk_size 16,也就是 640ms 一块。官方实测 FP16 相对 FP32 的 CER 差异小于 0.1%。docker 起容器记得给 --shm-size=1g 和 --ulimit memlock=-1。

    python wenet/bin/export_onnx_gpu.py --config exp/u2pp_conformer/train.yaml --checkpoint exp/u2pp_conformer/final.pt --output_onnx_dir onnx_model --fp16 --streaming --decoding_chunk_size 16

一笔真实的账

推理这边:WeNet 官方在 Tesla T4 上压 AIShell-2 的 U2++ Conformer 离线模型,RTF 0.0009–0.0011、吞吐 88–228 请求/秒。按 RTF 0.001 折算,一张 T4 跑满一小时约等于转写 1000 小时音频 —— T4 $0.298/卡·时 ÷ 1000 小时音频 ≈ 每千小时音频 $0.30。就算你的真实业务音频更长更杂、把这个数字打三折,一千小时音频也就一美元出头。换成 RTX 3090($0.193/卡·时)常驻一整月 730 小时,是 0.193 × 730 ≈ $140.9。训练这边:WenetSpeech 一万小时从零训 U2++ Conformer,官方记录是 8×3090、dynamic batch 36000、acc_grad 4、130k steps、跑 4.6 天。4.6 × 24 = 110.4 小时,8 × $0.193 = $1.544/时,110.4 × 1.544 ≈ $170.5 —— 一个万小时中文 ASR 底座,一百七十美金出头。换成额外加了 AISHELL4 的 8.5 天配置:8.5 × 24 × 1.544 ≈ $315。两笔账里算力都按秒计费、按小时挂价,实例一停就不再走表;存储另算,中位价 $0.414/GB·月,出网中位价 $0.0081/GB。没有起租时长、没有开通费、不用提配额申请。

04 —

常见问题

WeNet 本地部署到底需要多大显存?

先问你挂的是哪个 checkpoint。AISHELL 基线 4600 万参数、权重包 181MB,单流 FP32 跑起来 1.5GB 就够;WenetSpeech 的 U2++ Conformer 权重包 470MB,2GB 量级;Paraformer 和 SenseVoice-Small 在 3GB 上下;换成 FireRedASR-AED-L(11 亿参数、权重包 4.6GB)要 8GB 起步,Whisper large-v3 FP16 开 beam 解码要预留 10GB。真正吃显存的从来不是权重,是并发批大小。所以最省事的做法是先在 NexGPU 上开一张 RTX 3090 24GB($0.193/卡·时),把并发压到你要的 QPS,再决定要不要换更大的卡。

WeNet 还在维护吗?最新版本是哪个?

最后一个打 tag 的版本是 v3.1.0,带来了 FSDP 支持、flash attention 修复,把 Python 下限抬到 3.10,并且推荐用 step_save 取代 epoch_save。但主仓一直在往前推,2026 年 6 月还有提交,Apache-2.0、5200+ star、1100+ fork。v3.1.0 之后加进来的命令行工具、SenseVoice、FireRedASR、whisper-large-v3-turbo、标点模型全在 main 分支,所以官方 README 给的是 git 安装。同一个 wenet-e2e 组织还在做 west(LLM 语音工具箱,内置 TouchASU / TouchTTS / TouchChat / TouchOmni)、wespeaker、wekws、WeTextProcessing、wetts,整条语音链路都能凑齐。想同时试 WeNet 主线和 west,在 NexGPU 上开两台实例并行跑,按秒计费互不打扰。

WeNet 和 FunASR、Whisper 该选哪个?

这不是三选一的题。WeNet 现在的 CLI 本身就能直接加载 Paraformer、SenseVoice-Small、FireRedASR 和 Whisper 全家,等于把 FunASR 那条线的权重也接了进来。真正的差别在工程侧:WeNet 的价值是 U2/U2++ 那套流式与非流式统一建模、CTC + attention rescoring 两遍解码、WFST 热词偏置,以及 LibTorch / ONNX Runtime / OpenVINO / TensorRT / Triton 一整套导出路径 —— 它是奔着上线去的,不是奔着刷榜。要比就在同一张卡上把几个 checkpoint 挨个跑一遍自己的测试集,这是唯一靠谱的比法。NexGPU 有 2000+ 预置镜像,PyTorch、vLLM、Whisper ASR 都是现成的,开机就能跑。

从零训一个中文 ASR 模型要多久、要几张卡?

官方 WenetSpeech recipe 里有实打实的记录:8 张 3090、dynamic batch 36000、acc_grad 4、130k steps,跑 4.6 天;早期的 Conformer 版本用了 24 张 V100 跑 26 个 epoch;额外混进 AISHELL4 的那版是 8×3090 跑 8.5 天。如果只是在自有几百小时数据上微调,4 到 8 张 3090 一两天基本够。NexGPU 单节点最多 14 张卡、最大节点显存 2152GB,RTX 3090 $0.193/卡·时、Tesla V100 32GB $0.188/卡·时 —— 8 卡开满一整天大约 $37,训完停机就不再计费。

跑 wenet -m whisper-small 报错找不到模型,是我装错了吗?

不是你的问题,是 hub 里的拼写。小号 Whisper 的 key 在代码里写成了 whiper-tiny / whiper-base / whiper-small / whiper-medium(少了一个 s),只有 whisper-large-v3 和 whisper-large-v3-turbo 拼对了,照着 wenet/cli/hub.py 里的字符串写就能下下来。另外权重是通过 ModelScope 的 OSS 接口分发的,海外机器第一次拉 firered 这种 4.6GB 的包偶尔会慢。NexGPU 在 51 个国家和地区有 1175 个已验证可租节点、2498 张 GPU,挑一个离你数据和用户都近的地方开机就好。

在线服务用流式还是非流式?延迟大概多少?

U2++ 的卖点就是一套权重两种用法:训练时动态 chunk,部署时才决定 chunk 大小。官方 Triton 流式基准用 640ms chunk,平均延迟 78–172ms、吞吐 504–805 次推理/秒;同一个模型切到离线模式,RTF 0.0009–0.0011、吞吐 88–228 请求/秒。要最高精度就走非流式加 attention rescoring 的两遍解码,要最低延迟就压 chunk。这两条路都值得在自己的音频上先量一遍再定 —— 在 NexGPU 上开一张 Tesla T4($0.298/卡·时)或 RTX 3090($0.193/卡·时),SSH 或 Jupyter 进去,半小时就有数字,遇到问题 Telegram 上有中英文支持,不排队。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。