Compare commits

...
4 Commits
Author SHA1 Message Date
Hugo Centenoandkhluu 752a3a5044 [Bugfix] Guard mixed-dtype allreduce RMSNorm quant fusions (#48330)
Signed-off-by: hcenteno <hugo.centeno@estudiantat.upc.edu>
(cherry picked from commit 5f8e73cb8b)
2026-07-12 16:40:12 -07:00
Isotr0pyandkhluu 3c31722d6d [Bugfix] Avoid blocking model launching when no system ffmpeg available for TorchCodec (#47888)
Signed-off-by: Isotr0py <Isotr0py@outlook.com>
(cherry picked from commit 5e975eae1a)
2026-07-12 16:39:54 -07:00
Martin HickeyandHarry Mellor 702f4814fe [docs] Fix the docs build (#48008)
Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com>
Co-authored-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>
(cherry picked from commit 6cf7b26bd4)
2026-07-11 11:25:04 +01:00
Brandon Pelfreyandkhluu dd10e03f95 Pin PyNvVideoCodec to tested 2.0.4 wheel (#48056)
(cherry picked from commit 753c5039f0)
2026-07-09 12:43:21 -07:00
7 changed files with 72 additions and 11 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ torchaudio==2.11.0
# These must be updated alongside torch
torchvision==0.26.0 # Required for phi3v processor. See https://github.com/pytorch/vision?tab=readme-ov-file#installation for corresponding version
torchcodec >= 0.14
PyNvVideoCodec==2.1.0
PyNvVideoCodec==2.0.4
# FlashInfer should be updated together with the Dockerfile
flashinfer-python==0.6.13
flashinfer-cubin==0.6.13
@@ -222,6 +222,25 @@ class TestAllReduceRMSNormStaticQuantFP8Model(torch.nn.Module):
]
class TestAllReduceGemmaRMSNormStaticQuantFP8Model(
TestAllReduceRMSNormStaticQuantFP8Model
):
def __init__(
self,
hidden_size=16,
token_num=16,
eps=1e-6,
dtype: torch.dtype = torch.float16,
):
super().__init__(hidden_size, token_num, eps, dtype)
self.norm = [GemmaRMSNorm(hidden_size, eps) for _ in range(4)]
for norm in self.norm:
norm.weight.requires_grad_(False)
def ops_in_model_before(self):
return [torch.ops.vllm.all_reduce.default]
class TestAiterAllReduceRMSNormGroupQuantFP8Model(torch.nn.Module):
"""Exercises the new ROCm AITER AR+RMS+per-group-FP8-quant patterns.
@@ -416,6 +435,15 @@ class TestAllReduceFusedAddRMSNormStaticQuantFP4Model(torch.nn.Module):
reason="Not supported on ROCm platform",
),
),
pytest.param(
TestAllReduceGemmaRMSNormStaticQuantFP8Model,
True,
False,
marks=pytest.mark.skipif(
current_platform.is_rocm(),
reason="Not supported on ROCm platform",
),
),
pytest.param(
TestAllReduceRMSNormStaticQuantFP8Model,
False,
@@ -606,7 +634,10 @@ def all_reduce_fusion_pass_on_test_model(
)
backend.check_before_ops(model.ops_in_model_before(), fully_replaced=False)
backend.check_after_ops(model.ops_in_model_after())
if test_model_cls is TestAllReduceGemmaRMSNormModel:
if test_model_cls in (
TestAllReduceGemmaRMSNormModel,
TestAllReduceGemmaRMSNormStaticQuantFP8Model,
):
fused_op = torch.ops.vllm.flashinfer_trtllm_fused_allreduce_norm.default
fused_nodes = list(find_op_nodes(fused_op, backend.graph_post_pass))
assert fused_nodes
@@ -752,7 +752,12 @@ class AllReduceFusedAddRMSNormStaticQuantFP8Pattern(BasePattern):
return allreduce[4], allreduce[2]
pm.register_replacement(
pattern, replacement, self.get_inputs(), pm.fwd_only, pm_pass
pattern,
replacement,
self.get_inputs(),
pm.fwd_only,
pm_pass,
extra_check=_norm_input_weight_dtype_match,
)
@@ -941,7 +946,12 @@ class AllReduceFusedAddRMSNormStaticQuantNVFP4Pattern(BasePattern):
return allreduce[4], allreduce[2], allreduce[5]
pm.register_replacement(
pattern, replacement, self.get_inputs(), pm.fwd_only, pm_pass
pattern,
replacement,
self.get_inputs(),
pm.fwd_only,
pm_pass,
extra_check=_norm_input_weight_dtype_match,
)
@@ -186,9 +186,10 @@ def FusedMoE(
has_bias: Whether expert layers have bias terms
is_sequence_parallel: Whether sequence parallelism is enabled
reduce_results: Whether to all-reduce the final output. Setting this
to False (to fuse the all-reduce downstream) is only honored on the
late-AR path.
expert_mapping: Expert parameter mapping for weight loading
to False (to fuse the all-reduce downstream) is only honored on
the late-AR path.
ckpt_names: Checkpoint parameter name tuple (gate_proj, down_proj,
up_proj) used for weight loading
n_shared_experts: Number of shared experts to fuse into the routed
grouped GEMM (ROCm; requires aiter FSE or the router-append path)
router_logits_dtype: Data type for router logits buffers
+3 -2
View File
@@ -15,7 +15,7 @@ import torch
from vllm import envs
from vllm.logger import init_logger
from vllm.utils.import_utils import PlaceholderModule
from vllm.utils.import_utils import PlaceholderModule, check_torchcodec_available
from vllm.utils.mem_constants import MiB_bytes
from vllm.utils.registry import ExtensionManager
@@ -33,7 +33,7 @@ except ImportError:
try:
from torchcodec.decoders import VideoDecoder
except ImportError:
except (ImportError, RuntimeError):
VideoDecoder = PlaceholderModule("torchcodec").placeholder_attr( # type: ignore[assignment]
"decoders.VideoDecoder"
)
@@ -956,6 +956,7 @@ class VideoBackend(
assert not frame_recovery, (
"frame_recovery is only available for `opencv` backend"
)
check_torchcodec_available()
decoder = cls.make_torchcodec_decoder(
data,
num_ffmpeg_threads=num_ffmpeg_threads,
+18
View File
@@ -552,3 +552,21 @@ def has_cutedsl() -> bool:
def has_humming() -> bool:
"""Whether the optional `humming` package is available."""
return _has_module("humming")
def check_torchcodec_available():
"""Whether the optional `torchcodec` package is available."""
try:
import torchcodec # noqa: F401
except RuntimeError as e:
# torchcodec will raise RuntimeError during import instead
# of ImportError when system ffmpeg unavailable, with a
# message that can leak sensitive system information.
# Trim it down to avoid it.
marker = (
"The following exceptions were raised as we tried to load libtorchcodec:"
)
message = str(e)
if marker in message:
raise RuntimeError(message.split(marker, 1)[0].rstrip()) from None
raise e
+2 -2
View File
@@ -11,7 +11,7 @@ from __future__ import annotations
import time
from collections.abc import Iterable, Sequence
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
from typing import TYPE_CHECKING, Any
from typing_extensions import override
@@ -115,7 +115,7 @@ class P2PSecondaryTierManager(SecondaryTierManager):
port: int = 7777,
backends: list[str] | None = None,
num_threads: int = 4,
**kwargs,
**kwargs: Any,
) -> None:
"""Initialize the P2P secondary tier manager.