相较于社区流行的 Faster Whisper 方案,NVIDIA TensorRT-LLM 能有效将推理速度提升 50% 以上; 仅用一张 A10 GPU,Whisper Turbo[1] 的中文微调模型每秒钟可以处理 500 秒的音频; 结合 Qwen2 7B 的 ASR 模型,则可实现 0.027 的 Real Time Factor (RTF) 指标。

本文是新一代 KaldiASR 大模型训练方案的续篇, 介绍新一代 Kaldi Sherpa 中的 ASR 大模型 GPU 推理方案。


方案介绍

类似 Whisper 或者结合了 LLM 的 ASR 大模型逐渐流行。比起传统模型,更大的参数量和自回归解码的特点让这类模型的推理比较慢。借助NVIDIA TensorRT-LLM[2]和NVIDIA Triton[3]推理服务器,我们开发了针对此类模型的 GPU 推理加速方案。


ASR大模型推理方案


Whisper

Whisper 部署方案支持 OpenAI Whisper 的系列模型,也支持基于 Whisper 微调后的模型比如Huggingface Distill-whisper[4]和Icefall Whisper 中文微调模型[5]。
方案地址:https://github.com/k2-fsa/sherpa/tree/master/triton/whisper


Speech Encoder + LLM

Speech LLM 的部署方案目前支持 Whisper Encoder 与 Qwen2 LLM 1.5B 或 7B 结合。方案选取了Icefall Speech LLM 中文微调模型[6]作为示例。经过修改,该方案也可以替换 Speech Encoder 或者 LLM。
方案地址:https://github.com/k2-fsa/sherpa/tree/master/triton/speech_llm


方案性能

我们分别从 Offline 推理和 Client-Server 推理两种模式对部署方案的性能进行了测试。 测试细节如下表:



Offline 模式

Offline 模式指从本地直接推理音频,不涉及服务部署和请求调度,更多是为了展示推理引擎的性能。

测试结果如下(Batch Size 统一设置为 64):

Offline 推理结果

如上表所示,相比于社区流行的 Faster Whisper 方案,TensorRT-LLM 方案的速度提升了50%以上。
Whisper TensorRT-LLM 同时还支持 Packed Input, 也即输入的音频无需做 30 秒的 padding,最大程度减少了冗余的计算,进一步加快了推理速度。
Whisper Turbo[7]的中文微调模型(只保留两层 Decoder Layer)通过更快的自回归过程,实现了最快的速度,在 A10 GPU 上每秒钟可以处理 500 秒的音频。


Client-Server 模式

Client-Server 模式指通过 Client 给 Server 发送音频请求,可以展示推理服务的端到端性能。因为包含了请求调度等环节,Offline 推理性能可视为 Client-Server 模式的优化上限。

我们先用 Nvidia TensorRT-LLM 为模型生成了推理引擎,使用Nvidia Triton[8]实现了服务的 Server 端。为了更好模拟多路并发的场景,我们还基于 Python 的 asyncio 库实现了一个支持异步并发的client[9]。

服务的测试结果如下:


Client-Server 推理结果

上表结果都没有对输入音频做 Padding,都默认开启 Nvidia TensorRT-LLM 的continuous batching[10]模式。为了节省显存,Whisper Encoder + Qwen2 7B 使用了Int8 Weight-only Quant[11](W8A16)。

快速上手

了解 Nvidia TensorRT-LLM 和 Nvidia Triton:
1. https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/whisper
2. https://github.com/triton-inference-server/tutorials

复现 Offline 解码模式测试的流程:

git clone -b sherpa https://github.com/yuekaizhang/open_asr_leaderboard.git
cd open_asr_leaderboard/tensorrtllm
bash run_whisper.sh
bash run_faster_whisper.sh

复现 Client-Server 模式测试的流程:

# grpc client
https://github.com/yuekaizhang/Triton-ASR-Client.git
cdTriton-ASR-Client
pip install -r requirements.txt

dataset_name=yuekai/aishell
subset_name=test
split_name=test
num_task=32
service_name=infer_bls
python3 client.py \
--server-addr localhost \
--model-name $service_name \
--num-tasks $num_task \
--text-prompt "<|startoftranscript|><|zh|><|transcribe|><|notimestamps|>" \
--huggingface_dataset $dataset_name \
--subset_name $subset_name \
--split_name $split_name \
--compute-cer

# server
git clone https://github.com/k2-fsa/sherpa.git
cd sherpa/triton/whisper
# MODEL_IDs=("large-v3-turbo" "large-v3" "large-v2-turbo-multi-hans" "large-v2-multi-hans")
MODEL_ID=large-v2-turbo-multi-hans docker compose up


其它方案

除了 ASR 大模型的部署方案,我们还针对许多社区流行的 ASR 模型开发了对应的推理方案,更多细节可以参考下表:



结语

本文介绍了 Sherpa 中的 ASR 大模型部署方案。未来,我们也会不断迭代这些部署加速方案,例如增加 Speculative Decoding 的支持、使用 CUDA Graph 加速 Transducer 解码[15]等,欢迎大家关注和交流。


引用链接

[1]Whisper Turbo:https://github.com/openai/whisper/discussions/2363

[2]NVIDIA TensorRT-LLM:https://github.com/NVIDIA/TensorRT-LLM

[3]NVIDIA Triton:https://github.com/triton-inference-server/server

[4]Huggingface Distill-whisper:https://arxiv.org/abs/2311.00430

[5]Icefall Whisper 中文微调模型:https://github.com/k2-fsa/icefall/tree/master/egs/multi_zh-hans/ASR/whisper

[6]Icefall Speech LLM 中文微调模型:https://github.com/k2-fsa/icefall/blob/master/egs/speech_llm/ASR_LLM/

[7]Whisper Turbo:https://github.com/openai/whisper/discussions/2363

[8]Nvidia Triton:https://www.nvidia.cn/ai-data-science/products/triton-inference-server/

[9]client:https://github.com/yuekaizhang/Triton-ASR-Client

[10]continuous batching:https://www.baseten.co/blog/continuous-vs-dynamic-batching-for-ai-inference

[11]Int8 Weight-only Quant:https://nvidia.github.io/TensorRT-LLM/reference/precision.html#int4-and-int8-weight-only-w4a16-and-w8a16

[12]offline/streaming transducer:https://github.com/k2-fsa/sherpa/tree/master/triton

[13]offline/streaming attention rescoring, CUDA TLG:https://github.com/wenet-e2e/wenet/tree/main/runtime/gpu

[14]offline/streaming paraformer, sensevoice:https://github.com/modelscope/FunASR/tree/main/runtime/triton_gpu

[15]使用 CUDA Graph 加速 Transducer 解码:https://www.isca-archive.org/interspeech_2024/galvez24_interspeech.pdf