Skip to content

Commit 81d9a72

Browse files
committed
fix(tokenizer): preserve explicit options during repeated validation
Signed-off-by: Chen Cui <chcui@nvidia.com>
1 parent fcce106 commit 81d9a72

2 files changed

Lines changed: 57 additions & 4 deletions

File tree

‎src/megatron/bridge/training/tokenizers/config.py‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,15 @@ def __post_init__(self) -> None:
8585
# Don't pad vocab size since MBridge does it's own padding
8686
self.pad_vocab_size = False
8787

88-
# HuggingFace tokenizer kwargs
89-
self.tokenizer_hf_no_use_fast = not self.hf_tokenizer_kwargs.get("use_fast", True)
90-
self.tokenizer_hf_no_include_special_tokens = not self.hf_tokenizer_kwargs.get("include_special_tokens", True)
91-
self.trust_remote_code = self.hf_tokenizer_kwargs.get("trust_remote_code", False)
88+
# Explicit legacy values retain precedence; absent keys must not reset
89+
# direct fields when validation reruns this initialization method.
90+
legacy_kwargs = self.hf_tokenizer_kwargs or {}
91+
if "use_fast" in legacy_kwargs:
92+
self.tokenizer_hf_no_use_fast = not legacy_kwargs["use_fast"]
93+
if "include_special_tokens" in legacy_kwargs:
94+
self.tokenizer_hf_no_include_special_tokens = not legacy_kwargs["include_special_tokens"]
95+
if "trust_remote_code" in legacy_kwargs:
96+
self.trust_remote_code = legacy_kwargs["trust_remote_code"]
9297
if self.hf_tokenizer_kwargs:
9398
warn_rank_0(
9499
"`hf_tokenizer_kwargs` is deprecated and will be removed soon. "

‎tests/unit_tests/recipes/kimi/test_kimi_k3.py‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved.
22
"""K3 recipe integration without checkpoint downloads or model allocations."""
33

4+
from dataclasses import replace
45
from unittest.mock import MagicMock
56

67
import pytest
@@ -9,6 +10,8 @@
910
from megatron.bridge.models.kimi.kimi_k3_provider import KimiK3ModelProvider
1011
from megatron.bridge.recipes.kimi import kimi_k3
1112
from megatron.bridge.recipes.kimi.kimi_k3_runtime import configure_kimi_k3_kernels
13+
from megatron.bridge.training.tokenizers.config import TokenizerConfig
14+
from megatron.bridge.training.utils.omegaconf_utils import process_config_with_overrides
1215

1316

1417
@pytest.fixture
@@ -64,3 +67,48 @@ def test_local_snapshot_and_short_run_keep_optimizer_contract(offline_bridge, mo
6467
assert cfg.model.recompute_num_layers == 1
6568
assert cfg.dataset.seq_length == cfg.model.seq_length == 8192
6669
assert "early, perf not optimized" in kimi_k3.kimi_k3_pretrain_config.__doc__
70+
71+
72+
def test_runner_overrides_preserve_k3_tokenizer_and_hook(offline_bridge):
73+
cfg = kimi_k3.kimi_k3_pretrain_config()
74+
cfg = process_config_with_overrides(
75+
cfg,
76+
cli_overrides=[
77+
"train.train_iters=10",
78+
"dataset.seq_length=8192",
79+
"dataset.split='100,0,0'",
80+
"checkpoint.save=null",
81+
],
82+
)
83+
# ConfigContainer.validate reruns initialization for subconfigs without finalize.
84+
cfg.tokenizer.__post_init__()
85+
assert cfg.tokenizer.trust_remote_code is True
86+
assert cfg.tokenizer.vocab_file.endswith("tiktoken.model")
87+
assert configure_kimi_k3_kernels in cfg.model._pre_wrap_hooks
88+
assert cfg.scheduler.lr_decay_iters == 10000
89+
90+
91+
@pytest.mark.parametrize("legacy_kwargs", [{}, None])
92+
def test_direct_tokenizer_options_survive_reconstruction(legacy_kwargs):
93+
cfg = TokenizerConfig(
94+
trust_remote_code=True,
95+
tokenizer_hf_no_use_fast=True,
96+
tokenizer_hf_no_include_special_tokens=True,
97+
hf_tokenizer_kwargs=legacy_kwargs,
98+
)
99+
copied = replace(cfg, tokenizer_model="local-snapshot")
100+
assert copied.trust_remote_code is True
101+
assert copied.tokenizer_hf_no_use_fast is True
102+
assert copied.tokenizer_hf_no_include_special_tokens is True
103+
104+
105+
def test_explicit_legacy_tokenizer_options_keep_precedence():
106+
cfg = TokenizerConfig(
107+
trust_remote_code=True,
108+
tokenizer_hf_no_use_fast=True,
109+
tokenizer_hf_no_include_special_tokens=True,
110+
hf_tokenizer_kwargs={"trust_remote_code": False, "use_fast": True, "include_special_tokens": True},
111+
)
112+
assert cfg.trust_remote_code is False
113+
assert cfg.tokenizer_hf_no_use_fast is False
114+
assert cfg.tokenizer_hf_no_include_special_tokens is False

0 commit comments

Comments
 (0)