From d6c194a748b5d9ad449259332f433b65d1f4064a Mon Sep 17 00:00:00 2001 From: Flakes342 Date: Mon, 22 Sep 2025 23:11:39 +0530 Subject: [PATCH 1/3] Fix Qwen3 deterministic generation when do_sample=False --- src/transformers/generation/utils.py | 6 ++++++ tests/models/qwen3/test_modeling_qwen3.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/transformers/generation/utils.py b/src/transformers/generation/utils.py index 60b943a7e66e..d6ae07c7bb4c 100644 --- a/src/transformers/generation/utils.py +++ b/src/transformers/generation/utils.py @@ -1788,6 +1788,12 @@ def _prepare_generation_config( model_kwargs.update({"output_attentions": output_attentions} if output_attentions else {}) model_kwargs.update({"output_hidden_states": output_hidden_states} if output_hidden_states else {}) + # Enforce deterministic greedy decoding if do_sample=False and num_beams = 1 + if generation_config.do_sample is False and generation_config.num_beams == 1: + generation_config.temperature = 1.0 + generation_config.top_k = 0 + generation_config.top_p = 1.0 + return generation_config, model_kwargs def _get_initial_cache_position(self, seq_length, device, model_kwargs): diff --git a/tests/models/qwen3/test_modeling_qwen3.py b/tests/models/qwen3/test_modeling_qwen3.py index ba937656d3a6..d52b246fb768 100644 --- a/tests/models/qwen3/test_modeling_qwen3.py +++ b/tests/models/qwen3/test_modeling_qwen3.py @@ -718,3 +718,20 @@ def test_600m_generation(self): new_generated_ids = model.generate(input_ids, max_new_tokens=50)[:, input_ids.shape[1] :] with self.subTest("Eager matches flash attention"): torch.testing.assert_close(generated_ids, new_generated_ids, rtol=1e-4, atol=1e-4) + + def test_qwen3_greedy_determinism(): + """ + Ensures Qwen3 generate is deterministic when do_sample=False (greedy decoding as per HFs documentation). + """ + tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B-Base", use_fast=False) + model = Qwen3ForCausalLM.from_pretrained("Qwen/Qwen3-0.6B-Base", device_map="auto") + inputs = tokenizer("hello", return_tensors="pt") + + cfg = GenerationConfig(do_sample=False, num_beams=1, max_new_tokens=20) + + out1 = model.generate(**inputs, generation_config=cfg) + out2 = model.generate(**inputs, generation_config=cfg) + + assert torch.equal(out1, out2), ( + "Qwen3 should produce deterministic outputs with do_sample=False and num_beams=1" + ) \ No newline at end of file From 92f2a973ecc1dcf73ce8ad257b076de718a7408a Mon Sep 17 00:00:00 2001 From: Flakes342 Date: Mon, 22 Sep 2025 23:18:16 +0530 Subject: [PATCH 2/3] Fix Qwen3 deterministic generation when do_sample=False --- tests/models/qwen3/test_modeling_qwen3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/models/qwen3/test_modeling_qwen3.py b/tests/models/qwen3/test_modeling_qwen3.py index d52b246fb768..f28dbed2497e 100644 --- a/tests/models/qwen3/test_modeling_qwen3.py +++ b/tests/models/qwen3/test_modeling_qwen3.py @@ -734,4 +734,4 @@ def test_qwen3_greedy_determinism(): assert torch.equal(out1, out2), ( "Qwen3 should produce deterministic outputs with do_sample=False and num_beams=1" - ) \ No newline at end of file + ) From ec4d4102b42678453b650e0c57d62e469c31da8c Mon Sep 17 00:00:00 2001 From: Flakes342 Date: Tue, 23 Sep 2025 00:18:49 +0530 Subject: [PATCH 3/3] Iamashamed --- tests/models/qwen3/test_modeling_qwen3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/models/qwen3/test_modeling_qwen3.py b/tests/models/qwen3/test_modeling_qwen3.py index f28dbed2497e..05c5e746ba47 100644 --- a/tests/models/qwen3/test_modeling_qwen3.py +++ b/tests/models/qwen3/test_modeling_qwen3.py @@ -719,7 +719,7 @@ def test_600m_generation(self): with self.subTest("Eager matches flash attention"): torch.testing.assert_close(generated_ids, new_generated_ids, rtol=1e-4, atol=1e-4) - def test_qwen3_greedy_determinism(): + def test_qwen3_greedy_determinism(self): """ Ensures Qwen3 generate is deterministic when do_sample=False (greedy decoding as per HFs documentation). """