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-turbo | 15.5 亿 / 8.09 亿 | 权重包 2.43GB / 1.26GB,FP16 单流峰值约 10GB / 6GB | 30 秒窗口滑动切分 | 多语种兜底。踩坑提醒: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,没有改写
- 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 - 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 - 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 - 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 —
