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