Skip to content

Commit 3861be2

Browse files
authored
Merge pull request #3492 from modelscope/codex/product-site-vllm-native-20260813
docs: validate native FunASR on vLLM 0.27.1
2 parents 1dbc9b3 + d1b22ba commit 3861be2

3 files changed

Lines changed: 183 additions & 38 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Native FunASR on vLLM 0.27.1 validation
2+
3+
Verified on 2026-08-13. This record is a reproducible compatibility and
4+
concurrency probe, not an accuracy benchmark or production capacity claim.
5+
6+
## Pinned stack
7+
8+
- GPU: NVIDIA H100 80GB HBM3; driver 550.127.08
9+
- vLLM: 0.27.1+cu129, official x86_64 release wheel
10+
- vLLM wheel SHA-256: `bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b`
11+
- Torch: 2.13.0+cu129; CUDA available
12+
- Model: `allendou/Fun-ASR-Nano-2512-vllm`
13+
- Model revision: `e718b36e2578203ec893e9b488239225f8d668e2`
14+
- Model weight SHA-256: `96dfbec48282dd24d3334369a01e9e909f321ee39a1b0003c528c5379f68c1a6`
15+
- Audio extra: av 18.1.0, scipy 1.18.0, soundfile 0.14.0, soxr 1.1.0
16+
17+
The checkpoint above is a community conversion. vLLM's FunASR architecture,
18+
transcription endpoint, hotword support, and initialization fix are upstream,
19+
but the converted checkpoint is not an official FunAudioLLM weight release.
20+
Use the [official split-engine guide](vllm_guide.md) when an official-weight
21+
chain is required.
22+
23+
## Server
24+
25+
```bash
26+
CUDA_VISIBLE_DEVICES=0 .venv/bin/vllm serve \
27+
allendou/Fun-ASR-Nano-2512-vllm \
28+
--revision e718b36e2578203ec893e9b488239225f8d668e2 \
29+
--served-model-name fun-asr-nano \
30+
--host 127.0.0.1 --port 8899 \
31+
--dtype float32 \
32+
--gpu-memory-utilization 0.40 \
33+
--enforce-eager
34+
```
35+
36+
The engine resolved `FunASRForConditionalGeneration`, retained the 40,960
37+
maximum model length, allocated 17.52 GiB of KV cache (82,016 tokens), and
38+
reported 2.00x maximum concurrency at that length. The cached second startup
39+
spent 20.30 seconds in engine profile, KV-cache creation, and warmup. API
40+
requests were sent only after `/health` returned HTTP 200.
41+
42+
`--gpu-memory-utilization 0.20` is insufficient for the full model length: it
43+
left 1.70 GiB for KV cache while one 40,960-token request required 8.75 GiB.
44+
Do not copy the 0.40 setting blindly; size it against the target GPU and load.
45+
46+
## Inputs and results
47+
48+
All timing is client wall time over localhost after the server was healthy.
49+
Audio loading, model execution, and decoding are included. Model download and
50+
server startup are excluded.
51+
52+
| Probe | Input | Result |
53+
| --- | --- | --- |
54+
| Chinese baseline | 6 s `example/zh.mp3`, SHA-256 `0e64de19e4ff9a02e682955c9112f32d2317cfdbb5bc2f3504664044c993f195` | HTTP 200 in 0.968 s: `开饭时间早上九点至下午五点。` |
55+
| Chinese hotword | Same input; `hotwords=开放时间,开放时间,开放时间` | HTTP 200 in 0.214 s: `开放时间早上九点至下午五点。` |
56+
| Two concurrent requests | 8 s English plus 8 s Japanese examples | Both HTTP 200; 1.123 s total wall time (English 1.036 s, Japanese 1.111 s) |
57+
58+
The English result was `The tribal chieftain called for the boy, and presented
59+
him with fifty pieces of gold.` The Japanese result was
60+
`うちの中学は弁当制で、持っていけない場合は、五十円の学校販売のパンを買う。`
61+
62+
A single `开放时间` hotword did not alter the baseline output. Repeating it
63+
three times changed the ambiguous phrase. This proves the request parameter
64+
reached the generation prompt, but also shows that hotword strength is a policy
65+
to validate on representative audio; it is not a deterministic correction.
66+
67+
## Operational boundaries
68+
69+
- Install `vllm[audio]`; without the audio extra, valid MP3 uploads return HTTP
70+
400 with `Invalid or unsupported audio file`.
71+
- Pass `language` explicitly for non-English audio. The current vLLM FunASR
72+
adapter defaults an omitted language to English.
73+
- Keep workers private and put authentication, TLS, rate limits, and audio
74+
size/duration limits at the gateway.
75+
- Re-run accuracy, latency, concurrency, memory, and hotword tests on the exact
76+
production GPU, driver, languages, and traffic distribution.

web-pages/product-site/data/deployments.json

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,59 +10,78 @@
1010
"workloads": ["batch", "private-api"],
1111
"hardware": ["nvidia-gpu", "kubernetes"],
1212
"priorities": ["throughput", "latency"],
13-
"models": ["Fun-ASR-Nano-2512"],
13+
"models": ["Fun-ASR-Nano-2512 (community vLLM conversion)"],
1414
"operating_systems": ["Linux"],
15-
"interfaces": ["Python", "HTTP REST", "OpenAI-compatible HTTP", "WebSocket"],
16-
"tested": {"funasr": "1.3.29", "runtime": "vLLM 0.19.1 guide", "verified": "2026-07-26"},
15+
"interfaces": ["OpenAI-compatible HTTP"],
16+
"tested": {"funasr": "Fun-ASR-Nano-2512 conversion@e718b36e", "runtime": "vLLM 0.27.1+cu129 / Torch 2.13.0+cu129", "verified": "2026-08-13"},
1717
"commands": {
18-
"install": ["pip install funasr", "pip install \"vllm==0.19.1\""],
19-
"launch": ["CUDA_VISIBLE_DEVICES=0 python examples/industrial_data_pretraining/fun_asr_nano/serve_vllm.py --port 8899 --model FunAudioLLM/Fun-ASR-Nano-2512 --gpu-memory-utilization 0.5"],
20-
"health": ["curl -fsS http://localhost:8899/health"],
21-
"smoke": ["curl -X POST http://localhost:8899/v1/audio/transcriptions -F file=@audio.wav -F model=fun-asr-nano -F response_format=verbose_json"]
18+
"install": [
19+
"curl -fL https://github.com/vllm-project/vllm/releases/download/v0.27.1/vllm-0.27.1%2Bcu129-cp38-abi3-manylinux_2_28_x86_64.whl -o vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl",
20+
"echo \"bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl\" | sha256sum -c -",
21+
"uv venv --python 3.12 .venv && uv pip install --python .venv/bin/python --torch-backend=auto \"vllm[audio] @ file://$PWD/vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl\""
22+
],
23+
"launch": [
24+
"CUDA_VISIBLE_DEVICES=0 .venv/bin/vllm serve allendou/Fun-ASR-Nano-2512-vllm --revision e718b36e2578203ec893e9b488239225f8d668e2 --served-model-name fun-asr-nano --host 127.0.0.1 --port 8899 --dtype float32 --gpu-memory-utilization 0.40 --enforce-eager"
25+
],
26+
"health": [
27+
"curl -fsS http://127.0.0.1:8899/health",
28+
"curl -fsS http://127.0.0.1:8899/v1/models"
29+
],
30+
"smoke": [
31+
"curl -fL https://huggingface.co/allendou/Fun-ASR-Nano-2512-vllm/resolve/e718b36e2578203ec893e9b488239225f8d668e2/example/zh.mp3 -o zh.mp3 && echo \"0e64de19e4ff9a02e682955c9112f32d2317cfdbb5bc2f3504664044c993f195 zh.mp3\" | sha256sum -c -",
32+
"curl -fsS http://127.0.0.1:8899/v1/audio/transcriptions -F file=@zh.mp3 -F model=fun-asr-nano -F language=zh -F response_format=json",
33+
"curl -fsS http://127.0.0.1:8899/v1/audio/transcriptions -F file=@zh.mp3 -F model=fun-asr-nano -F language=zh -F 'hotwords=开放时间,开放时间,开放时间' -F response_format=json"
34+
]
2235
},
2336
"evidence": [
24-
{"label": "vLLM guide", "url": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md"},
25-
{"label": "deployment matrix", "url": "https://github.com/modelscope/FunASR/blob/main/docs/deployment_matrix.md"}
37+
{"label": "H100 native FunASR validation record", "url": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_native_funasr_validation.md"},
38+
{"label": "vLLM 0.27.1 release and CUDA 12.9 wheel", "url": "https://github.com/vllm-project/vllm/releases/tag/v0.27.1"},
39+
{"label": "native FunASR model integration", "url": "https://github.com/vllm-project/vllm/pull/33247"},
40+
{"label": "native FunASR hotword support", "url": "https://github.com/vllm-project/vllm/pull/39674"},
41+
{"label": "FunASR initialization fix", "url": "https://github.com/vllm-project/vllm/pull/44215"},
42+
{"label": "validated community conversion at e718b36e", "url": "https://huggingface.co/allendou/Fun-ASR-Nano-2512-vllm/tree/e718b36e2578203ec893e9b488239225f8d668e2"},
43+
{"label": "official FunASR split-engine guide", "url": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md"},
44+
{"label": "FunASR deployment matrix", "url": "https://github.com/modelscope/FunASR/blob/main/docs/deployment_matrix.md"}
2645
],
2746
"benchmarks": [
2847
{
29-
"model": "Fun-ASR-Nano-2512",
30-
"runtime": "vLLM batch",
31-
"hardware": "GPU model not recorded in the cited public table",
32-
"workload": "Offline batch",
33-
"audio": "184 long-form files; 11,541 seconds",
34-
"settings": "Dynamic VAD; the public table does not record batch size or the full software and hardware stack",
35-
"timing_scope": "Offline throughput; the cited table does not state whether warmup, file I/O, and decoding are excluded",
36-
"result": "RTFx 340; CER 8.20%",
37-
"qualification": "Incomplete hardware and timing record. Use only as public reference evidence, not a capacity promise.",
38-
"source": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md",
39-
"verified": "2026-07-26"
48+
"model": "allendou/Fun-ASR-Nano-2512-vllm@e718b36e",
49+
"runtime": "vLLM 0.27.1+cu129 / Torch 2.13.0+cu129",
50+
"hardware": "NVIDIA H100 80GB",
51+
"workload": "OpenAI-compatible transcription; Chinese baseline and hotword probes plus two concurrent requests (English and Japanese)",
52+
"audio": "Pinned model-repository examples: 6 s Chinese, 8 s English, and 8 s Japanese",
53+
"settings": "FP32; eager mode; gpu-memory-utilization 0.40; max model length 40,960; explicit language; warmed server",
54+
"timing_scope": "Client wall time after /health became ready; local HTTP and decoding included; cold model download and 20.3 s engine warmup excluded",
55+
"result": "Chinese 200 in 0.968 s; repeated hotword corrected 开饭时间 to 开放时间 in 0.214 s; English and Japanese two-request batch completed in 1.123 s wall time",
56+
"qualification": "Single-H100 correctness and concurrency probe with a community-converted checkpoint, not an accuracy study or production capacity promise. Revalidate the checkpoint, target GPU, languages, traffic, and hotword policy before rollout.",
57+
"source": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_native_funasr_validation.md",
58+
"verified": "2026-08-13"
4059
}
4160
],
4261
"translations": {
4362
"zh": {
44-
"name": "vLLM GPU 高吞吐",
45-
"summary": "用 Fun-ASR-Nano 在 NVIDIA GPU 上处理批量文件或提供兼容 OpenAI 的转写接口",
46-
"fit": ["批量录音转写", "需要提高 LLM 解码吞吐", "已有 NVIDIA GPU 服务环境"],
47-
"not_fit": ["纯 CPU 或边缘设备", "Paraformer 等非自回归模型", "尚未完成显存与并发压测的公网服务"],
48-
"selection_reason": "GPU 批处理和 vLLM 调度适合以吞吐为首要目标的 Fun-ASR-Nano 工作负载",
49-
"primary_limitation": "吞吐和显存占用取决于音频切分、批量、并发、GPU 型号与 vLLM 版本,必须按目标流量复测",
63+
"name": "vLLM 原生 FunASR 服务",
64+
"summary": "通过 vLLM 内置的 FunASR 架构,在 NVIDIA GPU 上提供兼容 OpenAI 的多语言转写与热词接口",
65+
"fit": ["需要标准 /v1/audio/transcriptions 接口", "Fun-ASR-Nano 批量或并发转写", "已有 NVIDIA GPU 和 Linux 服务环境"],
66+
"not_fit": ["只接受官方发布权重、不能使用社区转换 checkpoint", "纯 CPU 或边缘设备", "尚未完成显存、并发与业务音频压测的公网服务"],
67+
"selection_reason": "vLLM 已原生注册 FunASR 架构,并提供 OpenAI 兼容转写、显存调度、并发和热词参数",
68+
"primary_limitation": "当前原生 vLLM 路径依赖社区转换 checkpoint;要求官方权重链路时使用官方 FunASR split-engine。实测仅覆盖单张 H100,必须按目标 GPU、音频、语言、热词与流量复测",
5069
"status_label": "社区验证",
51-
"operations": ["固定 FunASR、vLLM、TorchCUDA 组合", "预热模型后再采集容量数据", "记录队列等待、首结果和最终结果延迟"],
52-
"security": ["在 API 网关实现认证、限流和请求大小限制", "服务端不直接暴露到公网", "隔离模型缓存和上传临时目录"],
53-
"troubleshooting": ["先核对 NVIDIA 驱动与 vLLM 所带 CUDA", "重复输出时记录两次完整结果和精确版本", "长音频遗漏时检查 VAD 最大分段时长"]
70+
"operations": ["固定 vLLM wheel、TorchCUDA、模型 revision 与音频依赖", "等待 /health 就绪并完成预热后再采集容量数据", "记录队列等待、最终结果延迟、显存和热词命中率"],
71+
"security": ["在 API 网关实现认证、TLS、限流和音频大小/时长限制", "worker 仅绑定内网地址,不直接暴露公网", "校验 wheel、模型 revision 和示例音频摘要,隔离模型缓存与上传临时目录"],
72+
"troubleshooting": ["音频返回 400 时确认安装了 vllm[audio]", "启动时 KV cache 不足则提高显存利用率或在业务允许时降低 max-model-len", "非英文请求必须显式传 language;热词用逗号分隔并以真实业务样本验证偏置强度"]
5473
},
5574
"en": {
56-
"name": "vLLM GPU throughput",
57-
"summary": "Run Fun-ASR-Nano on NVIDIA GPUs for file batches or an OpenAI-compatible transcription endpoint.",
58-
"fit": ["Batch recording transcription", "LLM decoder throughput is the priority", "An NVIDIA GPU serving environment already exists"],
59-
"not_fit": ["CPU-only or edge devices", "Non-autoregressive models such as Paraformer", "Internet-facing service before memory and load tests"],
60-
"selection_reason": "GPU batching and vLLM scheduling fit Fun-ASR-Nano workloads that prioritize throughput.",
61-
"primary_limitation": "Throughput and memory depend on segmentation, batch size, concurrency, GPU, and vLLM version; retest with target traffic.",
75+
"name": "Native FunASR on vLLM",
76+
"summary": "Use vLLM's built-in FunASR architecture for multilingual and hotword-aware transcription through an OpenAI-compatible API on NVIDIA GPUs.",
77+
"fit": ["A standard /v1/audio/transcriptions endpoint", "Concurrent or batch Fun-ASR-Nano transcription", "An NVIDIA GPU Linux serving environment"],
78+
"not_fit": ["Deployments that accept only officially published weights and cannot use a community conversion", "CPU-only or edge devices", "Internet-facing service before memory, concurrency, and workload tests"],
79+
"selection_reason": "vLLM natively registers the FunASR architecture and provides OpenAI-compatible transcription, memory scheduling, concurrency, and hotword parameters.",
80+
"primary_limitation": "The native vLLM path currently depends on a community-converted checkpoint; use the official FunASR split-engine when an official-weight chain is required. Evidence covers one H100 only, so retest the target GPU, audio, languages, hotwords, and traffic.",
6281
"status_label": "Community verified",
63-
"operations": ["Pin the FunASR, vLLM, Torch, and CUDA combination", "Warm the model before capacity measurement", "Measure queue, first-result, and final-result latency"],
64-
"security": ["Put authentication, rate limits, and upload limits at an API gateway", "Do not expose the worker directly to the internet", "Isolate model cache and temporary upload storage"],
65-
"troubleshooting": ["Match the NVIDIA driver to vLLM's CUDA build", "Capture two complete outputs and exact versions for repetition", "Check the VAD maximum segment length when long audio loses content"]
82+
"operations": ["Pin the vLLM wheel, Torch, CUDA, model revision, and audio dependencies", "Wait for /health and warm the model before measuring capacity", "Measure queue time, final-result latency, memory, and hotword hit rate"],
83+
"security": ["Put authentication, TLS, rate limits, and audio size/duration limits at the gateway", "Bind workers to a private address instead of exposing them directly", "Verify wheel, model revision, and sample digests; isolate model cache and temporary uploads"],
84+
"troubleshooting": ["For audio HTTP 400 responses, confirm vllm[audio] is installed", "If startup reports insufficient KV cache, raise GPU utilization or lower max-model-len only when the workload permits", "Pass language explicitly for non-English audio; comma-separate hotwords and validate bias strength on production samples"]
6685
}
6786
}
6887
},

web-pages/product-site/tests/test_registry.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,56 @@ def test_language_pairs_have_identical_fields(valid_registry):
4545
assert all(set(zh) == set(en) for zh, en in deployment_pairs(valid_registry))
4646

4747

48+
def test_vllm_contract_tracks_native_funasr_release_and_h100_validation(valid_registry):
49+
entry = next(item for item in valid_registry['deployments'] if item['id'] == 'vllm')
50+
51+
assert entry['maturity'] == 'community-verified'
52+
assert entry['tested'] == {
53+
'funasr': 'Fun-ASR-Nano-2512 conversion@e718b36e',
54+
'runtime': 'vLLM 0.27.1+cu129 / Torch 2.13.0+cu129',
55+
'verified': '2026-08-13',
56+
}
57+
assert entry['models'] == ['Fun-ASR-Nano-2512 (community vLLM conversion)']
58+
install = '\n'.join(entry['commands']['install'])
59+
assert 'vllm[audio]' in install
60+
assert 'vllm-0.27.1%2Bcu129-cp38-abi3-manylinux_2_28_x86_64.whl' in install
61+
assert 'bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b' in install
62+
launch = '\n'.join(entry['commands']['launch'])
63+
for marker in (
64+
'vllm serve allendou/Fun-ASR-Nano-2512-vllm',
65+
'--revision e718b36e2578203ec893e9b488239225f8d668e2',
66+
'--served-model-name fun-asr-nano',
67+
'--dtype float32',
68+
'--gpu-memory-utilization 0.40',
69+
):
70+
assert marker in launch
71+
smoke = '\n'.join(entry['commands']['smoke'])
72+
assert '/v1/audio/transcriptions' in smoke
73+
assert 'language=zh' in smoke
74+
assert 'hotwords=开放时间,开放时间,开放时间' in smoke
75+
evidence_urls = {item['url'] for item in entry['evidence']}
76+
for url in (
77+
'https://github.com/modelscope/FunASR/blob/main/docs/vllm_native_funasr_validation.md',
78+
'https://github.com/vllm-project/vllm/releases/tag/v0.27.1',
79+
'https://github.com/vllm-project/vllm/pull/33247',
80+
'https://github.com/vllm-project/vllm/pull/39674',
81+
'https://github.com/vllm-project/vllm/pull/44215',
82+
'https://huggingface.co/allendou/Fun-ASR-Nano-2512-vllm/tree/e718b36e2578203ec893e9b488239225f8d668e2',
83+
):
84+
assert url in evidence_urls
85+
assert any(
86+
benchmark['hardware'] == 'NVIDIA H100 80GB'
87+
and 'two concurrent requests' in benchmark['workload']
88+
and '1.123 s wall time' in benchmark['result']
89+
and 'community-converted checkpoint' in benchmark['qualification']
90+
and benchmark['source'] == 'https://github.com/modelscope/FunASR/blob/main/docs/vllm_native_funasr_validation.md'
91+
for benchmark in entry['benchmarks']
92+
)
93+
limitation = entry['translations']['en']['primary_limitation'].lower()
94+
assert 'community-converted checkpoint' in limitation
95+
assert 'official funasr split-engine' in limitation
96+
97+
4898
def test_audio_cpp_contract_tracks_mainline_nano_and_sensevoice(valid_registry):
4999
entry = next(item for item in valid_registry['deployments'] if item['id'] == 'audio-cpp')
50100
llama_cpp = next(item for item in valid_registry['deployments'] if item['id'] == 'llama-cpp')

0 commit comments

Comments
 (0)