|
23 | 23 | import os |
24 | 24 | from dataclasses import replace |
25 | 25 | from types import SimpleNamespace |
| 26 | +from unittest.mock import Mock |
26 | 27 |
|
27 | 28 | import pytest |
28 | 29 | import torch |
@@ -326,6 +327,53 @@ def test_shared_embedding_or_output_weight(self, hf_config): |
326 | 327 | weight_no_decoder = model_no_decoder.shared_embedding_or_output_weight() |
327 | 328 | assert weight_no_decoder is None |
328 | 329 |
|
| 330 | + @pytest.mark.parametrize( |
| 331 | + ("vocab_size", "should_pad_vocab", "expected_vocab_size"), |
| 332 | + [ |
| 333 | + (151669, True, 152064), |
| 334 | + (248077, True, 248320), |
| 335 | + (151936, False, 151936), |
| 336 | + ], |
| 337 | + ) |
| 338 | + def test_language_model_honors_vocab_padding_policy( |
| 339 | + self, |
| 340 | + hf_config, |
| 341 | + monkeypatch, |
| 342 | + vocab_size, |
| 343 | + should_pad_vocab, |
| 344 | + expected_vocab_size, |
| 345 | + ): |
| 346 | + """Apply tokenizer-derived padding before constructing the Qwen language model.""" |
| 347 | + self._setup_parallel_state(tp_size=1, ep_size=1, pp_size=1) |
| 348 | + pg_collection = ProcessGroupCollection.use_mpu_process_groups() |
| 349 | + language_transformer_config = self.get_language_transformer_config(hf_config) |
| 350 | + language_transformer_config.vocab_size = vocab_size |
| 351 | + language_transformer_config.should_pad_vocab = should_pad_vocab |
| 352 | + language_transformer_config.make_vocab_size_divisible_by = 128 |
| 353 | + language_transformer_config.tensor_model_parallel_size = 4 |
| 354 | + |
| 355 | + language_model = Mock() |
| 356 | + language_model.config.cuda_graph_impl = "none" |
| 357 | + language_model.share_embeddings_and_output_weights = False |
| 358 | + language_model_constructor = Mock(return_value=language_model) |
| 359 | + monkeypatch.setattr( |
| 360 | + "megatron.bridge.models.qwen_vl.modelling_qwen3_vl.model.Qwen3VLGPTModel", |
| 361 | + language_model_constructor, |
| 362 | + ) |
| 363 | + |
| 364 | + Qwen3VLModel( |
| 365 | + vision_transformer_config=self.get_vision_transformer_config(hf_config), |
| 366 | + language_transformer_config=language_transformer_config, |
| 367 | + language_transformer_layer_spec=self.get_language_model_layer_spec(), |
| 368 | + pre_process=False, |
| 369 | + post_process=True, |
| 370 | + add_encoder=False, |
| 371 | + add_decoder=True, |
| 372 | + pg_collection=pg_collection, |
| 373 | + ) |
| 374 | + |
| 375 | + assert language_model_constructor.call_args.kwargs["vocab_size"] == expected_vocab_size |
| 376 | + |
329 | 377 | @pytest.mark.timeout(50) |
330 | 378 | def test_set_input_tensor(self, hf_config): |
331 | 379 | """Test set_input_tensor method.""" |
|
0 commit comments