main
py 61 lines 1.96 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 from unittest.mock import Mock, patch
5
6 import torch
7
8
9 def test_nemotron_h_lm_head_receives_quant_config():
10 from vllm.model_executor.models.nemotron_h import NemotronHForCausalLM
11
12 mock_quant_config = Mock()
13
14 mock_hf_config = Mock()
15 mock_hf_config.vocab_size = 128
16 mock_hf_config.hidden_size = 64
17
18 mock_vllm_config = Mock()
19 mock_vllm_config.model_config.hf_config = mock_hf_config
20 mock_vllm_config.model_config.dtype = None
21 mock_vllm_config.scheduler_config = Mock()
22 mock_vllm_config.quant_config = mock_quant_config
23
24 with (
25 patch("vllm.model_executor.models.nemotron_h.NemotronHModel") as MockModel,
26 patch("vllm.model_executor.models.nemotron_h.ParallelLMHead") as MockLMHead,
27 patch("vllm.model_executor.models.nemotron_h.LogitsProcessor"),
28 ):
29 MockModel.return_value.make_empty_intermediate_tensors = Mock()
30 MockModel.return_value.has_moe = False
31
32 NemotronHForCausalLM(vllm_config=mock_vllm_config)
33
34 MockLMHead.assert_called_once()
35 call_kwargs = MockLMHead.call_args.kwargs
36 assert call_kwargs["quant_config"] is mock_quant_config
37
38
39 def test_relu2_fp8_fusion_uses_registry():
40 from vllm.model_executor.models.nemotron_h import NemotronHMLP
41
42 projected = torch.empty((1, 1), dtype=torch.bfloat16)
43 fused = Mock()
44 act_fn = Mock()
45 down_proj = Mock(side_effect=lambda x: (x, None))
46
47 mlp = NemotronHMLP.__new__(NemotronHMLP)
48 torch.nn.Module.__init__(mlp)
49 mlp.up_proj = Mock(return_value=(projected, None))
50 mlp.down_proj = down_proj
51 mlp.act_fn = act_fn
52
53 with patch(
54 "vllm.model_executor.models.nemotron_h.maybe_fused_act_quant",
55 return_value=fused,
56 ) as maybe_fused:
57 result = mlp(Mock())
58
59 maybe_fused.assert_called_once_with(act_fn, projected, down_proj)
60 act_fn.assert_not_called()
61 assert result is fused