Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .buildkite/test_areas/models_basic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,12 @@ steps:
- tests/models/test_deepseek_v41_decoder_replay_layers.py
- tests/models/test_deepseek_v41_replay_batch.py
- tests/models/test_deepseek_v41_pcp.py
- tests/models/test_deepseek_v41_pipeline.py
- tests/models/transformers/test_layer_registry_e2e.py
- tests/models/test_deepseek_v41_replay_start.py
- tests/models/test_deepseek_v4_vl_stream_weights.py
commands:
- pytest -v -s models/test_terratorch.py models/transformers/test_backend.py models/test_registry.py models/test_deepseek_v4_vl_rocm.py models/transformers/test_layer_registry_e2e.py models/test_deepseek_v41_replay_start.py models/test_deepseek_v41_decoder_replay_layers.py models/test_deepseek_v41_replay_batch.py models/test_deepseek_v41_pcp.py models/test_deepseek_v4_vl_stream_weights.py
- pytest -v -s models/test_terratorch.py models/transformers/test_backend.py models/test_registry.py models/test_deepseek_v4_vl_rocm.py models/transformers/test_layer_registry_e2e.py models/test_deepseek_v41_replay_start.py models/test_deepseek_v41_decoder_replay_layers.py models/test_deepseek_v41_replay_batch.py models/test_deepseek_v41_pcp.py models/test_deepseek_v41_pipeline.py models/test_deepseek_v4_vl_stream_weights.py
mirror:
amd:
label: ":amd: (MI355) Basic Models (Other)"
Expand Down
70 changes: 70 additions & 0 deletions tests/models/test_deepseek_v41_pipeline.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
from importlib import import_module
from types import SimpleNamespace

import pytest
import torch

from vllm.platforms import current_platform


@pytest.mark.skipif(not current_platform.is_cuda(), reason="CUDA required")
@pytest.mark.skip_global_cleanup
def test_stage_entry_injects_engram_before_mhc_pre(monkeypatch):
model_module = import_module("vllm.models.deepseek_v41.nvidia.model")

class StopAfterMhcPre(Exception):
pass

hidden = torch.arange(24, dtype=torch.float32).reshape(2, 4, 3)
hashes = torch.arange(6).reshape(2, 3)
mask = torch.tensor([True, False])
pre_mix = torch.randn(2, 4)
engram_calls: list[tuple[torch.Tensor, torch.Tensor, torch.Tensor | None]] = []
mhc_pre_calls: list[tuple[torch.Tensor, torch.Tensor | None]] = []

class Engram:
layer_hash_index = 1

def __call__(self, residual, layer_hashes, engram_mask):
engram_calls.append((residual, layer_hashes, engram_mask))
return residual + 10

def mhc_pre(residual, *args, pre_mix=None, **kwargs):
mhc_pre_calls.append((residual, pre_mix))
raise StopAfterMhcPre

layer = SimpleNamespace(
mhc_stream=None,
engram=Engram(),
hc_attn_fn=None,
hc_attn_scale=None,
hc_attn_base=None,
rms_norm_eps=1e-6,
hc_eps=1e-6,
hc_post_alpha=1.0,
hc_sinkhorn_iters=1,
attn_norm=SimpleNamespace(weight=None, variance_epsilon=1e-6),
)
monkeypatch.setattr(model_module, "mhc_pre_delayed_tilelang", mhc_pre)

with pytest.raises(StopAfterMhcPre):
model_module.DeepseekV4DecoderLayer.forward(
layer,
hidden,
torch.arange(2),
None,
pre_mix=pre_mix,
engram_hashes=hashes,
engram_mask=mask,
)

assert len(engram_calls) == len(mhc_pre_calls) == 1
engram_residual, layer_hashes, engram_mask = engram_calls[0]
assert engram_residual is hidden
assert engram_mask is mask
torch.testing.assert_close(layer_hashes, hashes[:, 1])
mhc_residual, mhc_pre_mix = mhc_pre_calls[0]
torch.testing.assert_close(mhc_residual, hidden + 10)
assert mhc_pre_mix is pre_mix
6 changes: 6 additions & 0 deletions vllm/models/deepseek_v41/nvidia/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,12 @@ def forward(
)
else:
residual = x
if self.engram is not None and engram_hashes is not None:
residual = self.engram(
residual,
engram_hashes[:, self.engram.layer_hash_index],
engram_mask,
)
post_mix, res_mix, x, attn_pre = mhc_pre(
residual,
self.hc_attn_fn,
Expand Down
Loading