Bump flashinfer version to 0.6.14 (#47669)

Signed-off-by: AmeenP <ameenp360@gmail.com> Signed-off-by: AmeenP <ameen@primeintellect.ai> Co-authored-by: AmeenP <ameen@primeintellect.ai> Co-authored-by: Jee Jee Li <pandaleefree@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Pavani Majety <pmajety@nvidia.com>

Ameen Patel committed Jul 15, 2026 at 21:00 UTC ba47bb5be1bf8e263e978178f0ee453dbc9fa9b6
6 files changed +53 -18
docker/Dockerfile
+1 -1
@@ -815,7 +815,7 @@ RUN --mount=type=cache,target=/opt/uv/cache \
815 # Install FlashInfer JIT cache (requires CUDA-version-specific index URL)
816 # https://docs.flashinfer.ai/installation.html
817 # From versions.json: .flashinfer.version
818 -ARG FLASHINFER_VERSION=0.6.13
818 +ARG FLASHINFER_VERSION=0.6.14
819 RUN --mount=type=cache,target=/opt/uv/cache \
820 uv pip install --system flashinfer-jit-cache==${FLASHINFER_VERSION} \
821 --index-url https://flashinfer.ai/whl/cu$(echo $CUDA_VERSION | cut -d. -f1,2 | tr -d '.')
docker/versions.json
+1 -1
@@ -68,7 +68,7 @@
68 "default": "true"
69 },
70 "FLASHINFER_VERSION": {
71 - "default": "0.6.13"
71 + "default": "0.6.14"
72 },
73 "GDRCOPY_CUDA_VERSION": {
74 "default": "12.8"
requirements/cuda.txt
+5 -2
@@ -11,8 +11,11 @@ torchvision==0.26.0 # Required for phi3v processor. See https://github.com/pytor
11 torchcodec >= 0.14
12 PyNvVideoCodec==2.0.4
13 # FlashInfer should be updated together with the Dockerfile
14 -flashinfer-python==0.6.13
15 -flashinfer-cubin==0.6.13
14 +# flashinfer-cubin is not on PyPI since 0.6.14; setup.py excludes it from
15 +# install_requires so the published wheel does not carry an unresolvable pin
16 +--extra-index-url https://flashinfer.ai/whl/
17 +flashinfer-python==0.6.14
18 +flashinfer-cubin==0.6.14
19 apache-tvm-ffi==0.1.9
20 tilelang==0.1.9
21 nvidia-cudnn-frontend>=1.19.1
setup.py
+5
@@ -1075,6 +1075,11 @@ def get_requirements() -> list[str]:
1075 # vllm-flash-attn is built only for CUDA 12.x.
1076 # Skip for other versions.
1077 continue
1078 + if "flashinfer-cubin" in req:
1079 + # Not on PyPI since 0.6.14 (only https://flashinfer.ai/whl), so
1080 + # it cannot be a wheel dependency; flashinfer falls back to
1081 + # fetching cubins at runtime when the package is absent.
1082 + continue
1083 if "nvidia-cutlass-dsl[cu13]" in req and cuda_major == "12":
1084 # [cu13] extra is the default; strip it on CUDA 12 builds.
1085 req = req.replace("nvidia-cutlass-dsl[cu13]", "nvidia-cutlass-dsl")
tests/test_jit_monitor.py
+20
@@ -320,6 +320,26 @@ class TestCuTeDSLHook:
320 with pytest.raises(RuntimeError, match="CuTeDSL JIT compilation"):
321 cute.compile(lambda: None, "arg", option=True)
322
323 + def test_subscripted_compile_is_monitored(self):
324 + """``cute.compile[options](...)`` (flashinfer >= 0.6.14) must work."""
325 +
326 + class FakeCompileCallable:
327 + def __getitem__(self, options):
328 + return self
329 +
330 + def __call__(self, *args, **kwargs):
331 + return "compiled"
332 +
333 + with _patch_jit_modules(_make_fake_knobs(), cute_compile=FakeCompileCallable()):
334 + import cutlass.cute as cute
335 +
336 + jit_monitor.activate()
337 + with mock.patch.object(jit_monitor.logger, "warning_once") as warning_once:
338 + result = cute.compile[("opt_level", 3)](lambda: None, "arg")
339 +
340 + assert result == "compiled"
341 + warning_once.assert_called_once()
342 +
343
344 class TestTileLangHook:
345 def test_jit_kernel_logs_warning(self):
vllm/utils/jit_monitor.py
+21 -14
@@ -267,6 +267,26 @@ def _log_cutedsl_jit_compile(fn_name: str) -> None:
267 )
268
269
270 +class _MonitoredCuteCompile:
271 + """Logs JIT compilations; a plain function would break ``cute.compile[opts]``."""
272 +
273 + def __init__(self, inner):
274 + self._inner = inner
275 +
276 + def __getitem__(self, options) -> "_MonitoredCuteCompile":
277 + return _MonitoredCuteCompile(self._inner[options])
278 +
279 + def __call__(self, *args, **kwargs):
280 + kernel = args[0] if args else kwargs.get("function")
281 + kernel_name = getattr(kernel, "__name__", None)
282 + if kernel_name is None:
283 + kernel_name = (
284 + kernel.__class__.__name__ if kernel is not None else "<unknown>"
285 + )
286 + _log_cutedsl_jit_compile(kernel_name)
287 + return self._inner(*args, **kwargs)
288 +
289 +
290 def _setup_cutedsl_jit_hook() -> None:
291 """Wrap ``cutlass.cute.compile`` to warn on compilation."""
292 global _cutedsl_hook_installed
@@ -279,20 +299,7 @@ def _setup_cutedsl_jit_hook() -> None:
299 logger.debug("CuTeDSL is not available; skipping CuTeDSL JIT monitor.")
300 return
301
282 - original_compile = cute.compile
283 -
284 - @functools.wraps(original_compile)
285 - def _compile_with_monitor(*args, **kwargs):
286 - kernel = args[0] if args else kwargs.get("function")
287 - kernel_name = getattr(kernel, "__name__", None)
288 - if kernel_name is None:
289 - kernel_name = (
290 - kernel.__class__.__name__ if kernel is not None else "<unknown>"
291 - )
292 - _log_cutedsl_jit_compile(kernel_name)
293 - return original_compile(*args, **kwargs)
294 -
295 - cute.compile = _compile_with_monitor
302 + cute.compile = _MonitoredCuteCompile(cute.compile)
303 _cutedsl_hook_installed = True
304
305