模型体积砍到 1/4、CPU 推理速度翻倍:FunASR INT8 量化部署实操手册
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
体积砍到 1/4,推理时间减半,字错率不变——这是把 FunASR 的 Paraformer-large 量化成 INT8 后的效果。FunASR INT8 量化只要导出时多传一个参数,16 核 CPU 就能扛 96 路并发实时转写。下面是从导出量化模型到验证部署的完整流程。
结论先行:INT8 量化值不值得做?
拿 AISHELL-1 测试集说三件事:
- 体积:Paraformer-large 从 880MB 降到 237MB,约 1/4
- 速度:单线程 RTF 0.0777 降到 0.0446;96 并发加速比从 238 提到 452
- 精度:CER 1.95% → 1.95%,大模型上零损失
一句话结论:CPU 带 avx512_vnni 指令集的机器是纯赚;老机器主要赚体积,别指望单线程提速。
原理 60 秒:quantize_dynamic 是怎么把体积压到 1/4 的?
打个比方:FP32 权重像给每个数留了 32 位小数位,INT8 量化(用 8 位整数近似浮点权重)把它压成 1 位数字加一个每通道的缩放系数,体积自然掉到约 1/4。
具体实现在 funasr/utils/export_utils.py:导出 ONNX 后调用 onnxruntime 的quantize_dynamic,只量化 MatMul(矩阵乘,模型里占计算大头的部分)权重,逐通道(per-channel)自动算缩放系数,并且显式跳过output、bias_encoder、bias_decoder这几个敏感节点,防止精度掉链子。还有一个好处:动态量化不需要校准数据集,不用先攒几百条录音,导出即用。
动手实操四步走:从下载依赖到验证输出 🔧
第 1 步|下载 onnxruntime 与 ffmpeg,装好 Python 依赖
这一步在干什么:拿齐编译 C++ 引擎的两个依赖包,并安装模型导出、ONNX 推理需要的 Python 库。
wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/dep_libs/onnxruntime-linux-x64-1.14.0.tgz tar -zxvf onnxruntime-linux-x64-1.14.0.tgz wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/dep_libs/ffmpeg-master-latest-linux64-gpl-shared.tar.xz tar -xvf ffmpeg-master-latest-linux64-gpl-shared.tar.xz sudo apt-get install libopenblas-dev libssl-dev pip install -U modelscope funasr onnx onnxruntime funasr-onnx如何确认成功:python -c "import onnxruntime; print(onnxruntime.__version__)"能打印版本号,两个压缩包解压出onnxruntime-linux-x64-1.14.0和 ffmpeg 目录。
第 2 步|编译支持 INT8 的 C++ 推理引擎
这一步在干什么:用 CMake 构建 FunASR 仓库里的 ONNX 推理引擎(源码见 runtime/onnxruntime/),它原生支持加载 INT8 量化模型。
git clone https://gitcode.com/GitHub_Trending/fun/FunASR cd FunASR/runtime/onnxruntime && mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=release .. \ -DONNXRUNTIME_DIR=/path/to/onnxruntime-linux-x64-1.14.0 \ -DFFMPEG_DIR=/path/to/ffmpeg-master-latest-linux64-gpl-shared make -j4如何确认成功:build/bin下出现可执行文件,编译日志无红色报错。
第 3 步|一条命令导出 ONNX 并完成 INT8 量化
这一步在干什么:加载 Paraformer-large 的 PyTorch 模型,导出 ONNX 并顺手做 INT8 量化。
from funasr import AutoModel model = AutoModel(model="iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch") model.export(type="onnx", quantize=True)如何确认成功:控制台打印 "Quantizing model from ... to ...",模型目录里同时出现model.onnx和model_quant.onnx。
第 4 步|加载量化模型,验证识别与速度
这一步在干什么:用 ONNX Python 客户端(funasr-onnx包)指定quantize=True加载model_quant.onnx,跑一条样例音频确认结果正常。
from funasr_onnx import Paraformer model = Paraformer( "damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch", quantize=True, ) print(model(["asr_example.wav"]))如何确认成功:打印出正常转写文本,且与quantize=False的结果一致;对比两个模型的加载体积,量化版应小约 3.7 倍。
实测数据看板:CPU 上到底快多少?
以下数据来自 runtime/docs/benchmark_onnx.md 的 AISHELL-1 测试集实测(音频总长 36108 秒),CPU 为 Intel Xeon 8369B(16 核 32 线程,带 avx512_vnni)。
体积与精度:
| 模型 | FP32 体积 | INT8 体积 | 缩减 | 量化前 CER | 量化后 CER |
|---|---|---|---|---|---|
| Paraformer-large | 880MB | 237MB | 3.7 倍 | 1.95% | 1.95% |
| Paraformer | 275MB | 81MB | 3.4 倍 | 3.73% | 3.78% |
并发吞吐(8369B,带 vnni):
| 并发数 | FP32 RTF | INT8 RTF | 提速 |
|---|---|---|---|
| 1 | 0.0777 | 0.0446 | 1.7 倍 |
| 16 | 0.0080 | 0.0032 | 2.5 倍 |
| 32 | 0.0046 | 0.0024 | 1.9 倍 |
| 96 | 0.0042 | 0.0022 | 1.9 倍 |
这个数字意味着什么:96 路并发下 INT8 的 RTF 是 0.0022,处理 1 秒音频只要 2 毫秒,同一台机器相当于白捡一倍机器数。反面教材是 8163 这类没有 vnni 的 CPU:单线程 RTF 几乎没变(0.0820→0.0778),高并发也只提升 15%~20%——提速高度依赖 CPU 指令集。
落地选型:3 条建议避开常见坑
- 先看指令集再决定要不要量化:跑
lscpu | grep -i avx512,有avx512_vnni才是"提速+减体积"双收;没有的话 INT8 主要赚体积,单线程提速预期应该归零,别拿 96 并发的数字做预算。 - 别动节点排除名单:量化逻辑只处理 MatMul、跳过输出层和 bias 节点,因为输出层最容易先掉精度。想自己扩展量化节点,先拿小数据集对比 CER 再上线。
- 并发服务直接上量化模型:C++ 引擎加载
model_quant.onnx后,单机内存能省下 600MB 以上,多路并发场景下吞吐还有近 2 倍余量;部署流程参考 runtime/quick_start_zh.md。
下一步行动清单:
- 用
lscpu确认本机是否支持 avx512_vnni,决定量化目标 - 抽 1000 句真实业务音频,分别跑
quantize=True/False对比 CER - 确认无误后把服务里的 FP32 模型换成
model_quant.onnx,保留 FP32 模型兜底
延伸资源
- funasr/utils/export_utils.py — INT8 量化导出源码
- runtime/python/onnxruntime/README.md — ONNX Python 推理用法
- runtime/docs/benchmark_onnx.md — CPU 基准完整数据
- runtime/onnxruntime/readme.md — C++ 引擎编译说明
- runtime/quick_start_zh.md — 服务部署快速上手
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考