vLLM Inference Engine
vLLM으로 autoregressive LLM-based ASR 모델을 가속합니다. FunASR는 offline batch transcription, SDK-style chunked streaming, 그리고 VAD, hotword, speaker label을 포함한 WebSocket service 경로를 제공합니다.
언제 vLLM을 쓰나
vLLM은 Fun-ASR-Nano처럼 LLM decoder가 포함된 autoregressive ASR 경로의 decode throughput을 높입니다. audio frontend, encoder, adaptor, optional CTC timestamp decoder는 PyTorch에서 실행되고, LLM decoder는 prompt embedding을 vLLM에 전달해 PagedAttention, continuous batching, tensor parallelism을 활용합니다.
| 상황 | 추천 |
|---|---|
| Fun-ASR-Nano batch transcription | vLLM path를 우선 평가합니다. |
| Python app에서 progressive subtitle 필요 | Streaming SDK를 사용합니다. |
| 실시간 서비스, hotword, speaker label 필요 | WebSocket service를 사용합니다. |
| Paraformer 또는 SenseVoice만 사용 | vLLM보다 기존 PyTorch path가 맞습니다. |
지원 범위
| Model family | vLLM support | 이유 |
|---|---|---|
| Fun-ASR-Nano | Yes | LLM decoder가 있어 vLLM KV-cache decoding과 continuous batching의 이점을 받습니다. |
| Paraformer | No | non-autoregressive model이라 vLLM KV-cache가 병목을 해결하지 않습니다. |
| SenseVoice | No | 기본 inference path가 이미 compact하고 vLLM LLM decoder 경로가 아닙니다. |
처음 모델을 고르는 중이면 모델 선택 가이드를 먼저 보고, 운영 경로를 고르는 중이면 배포 선택표를 함께 확인하세요.
설치와 첫 실행
pip install funasr vllm
# first run prepares vLLM-compatible LLM weights
python - <<'PY'
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", backend="vllm", device="cuda")
print(model.generate(input="sample.wav"))
PY
첫 실행에서는 FunASR가 model.pt에서 LLM weights를 추출해 Qwen3-0.6B-vllm 같은 vLLM-compatible directory를 만들 수 있습니다. 이후 시작은 준비된 weights를 재사용합니다.
Offline batch transcription
긴 파일 묶음, benchmark, archive transcription에는 batch path가 가장 단순합니다. GPU memory와 batch size를 조정하면서 throughput과 latency를 함께 기록하세요.
python examples/funasr_nano_vllm/offline_infer.py \
--model FunAudioLLM/Fun-ASR-Nano-2512 \
--input wav.scp \
--output results.jsonl \
--tensor-parallel-size 1
SDK-style chunked streaming
FunASRNanoStreamingVLLM은 audio를 720 ms chunk로 나누고, cumulative audio를 re-encode한 뒤 chunk prompt를 vLLM에 batch로 넣습니다. fixed/unfixed text split을 반환하므로 Python app에서 progressive subtitle을 보여주기 좋습니다.
from funasr import FunASRNanoStreamingVLLM
stream = FunASRNanoStreamingVLLM(model="FunAudioLLM/Fun-ASR-Nano-2512", device="cuda")
for event in stream.generate("meeting.wav"):
print(event["fixed"], event["unfixed"])
WebSocket service
Real-time service는 streaming VAD, vLLM segment decoding, partial preview, hallucination cleanup, hotword, language hint, speaker diarization을 함께 제공합니다. 제품 API나 browser client에 붙이기 전에 실제 회의/콜센터 오디오로 reconnect와 slow client를 검증하세요.
python examples/funasr_nano_vllm/websocket_server.py \
--host 0.0.0.0 \
--port 10095 \
--model FunAudioLLM/Fun-ASR-Nano-2512 \
--device cuda
OpenAI-compatible transcription endpoint가 필요하면 Agent 연동 페이지의 funasr-server 경로가 더 짧습니다.
성능과 운영 parameter
| Parameter | Default | 설명 |
|---|---|---|
tensor_parallel_size | 1 | vLLM tensor parallel에 사용할 GPU 수. |
gpu_memory_utilization | 0.8 | vLLM KV cache에 예약할 GPU memory 비율. |
max_model_len | 4096 | vLLM maximum sequence length. |
repetition_penalty | 1.0 | 반복 transcript를 줄이기 위한 generation penalty. |
성능을 확정하기 전에는 Benchmark 페이지의 RTF/throughput 기록 방식처럼 model, device, CUDA/PyTorch/vLLM version, batch size, audio duration, warmup 제외 여부를 함께 남기세요.
FAQ
- 첫 실행이 느린 이유는?
- vLLM이 KV cache와 CUDA graph를 초기화하고, FunASR가
model.pt에서 LLM weights를 추출할 수 있습니다. 첫 실행은 60-90초 정도 걸릴 수 있습니다. - Paraformer도 vLLM을 쓰나요?
- 아니요. Paraformer는 non-autoregressive model이라 vLLM KV-cache decoding의 이점을 받지 않습니다.
- 어떤 경로부터 시험해야 하나요?
- 모델 선택은 모델 선택 가이드, deployment target은 배포 선택표, API/Agent 연동은 Agent 연동을 기준으로 고릅니다.