Skip to content

Commit 59c2381

Browse files
Fix DeepSeek-V3 checkpoint export compatibility
1 parent 13a2f7b commit 59c2381

8 files changed

Lines changed: 62 additions & 46 deletions

File tree

tools/checkpoint/convert.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ def main():
6464
parser.add_argument(
6565
"--max-queue-size", type=int, default=50, help="Maximum number of tensors in the queue"
6666
)
67+
parser.add_argument(
68+
"--skip-mtp",
69+
action="store_true",
70+
help=(
71+
"Skip Multi-Token Prediction (MTP) modules during conversion. "
72+
"Use this when the target implementation only contains the main LM layers."
73+
),
74+
)
6775

6876
extend_cases = [["mistral", "mixtral"]]
6977

tools/checkpoint/deepseek_v3/args.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def load_args_hf2mg(args):
2323
args.swiglu = True if hidden_act == "silu" else False
2424
args.max_position_embeddings = deepseek_v3_args["max_position_embeddings"]
2525
args.init_method_std = deepseek_v3_args["initializer_range"]
26-
args.norm_epsilon = deepseek_v3_args["rms_norm_eps"]
26+
args.layernorm_epsilon = deepseek_v3_args["rms_norm_eps"]
2727
args.untie_embeddings_and_output_weights = not deepseek_v3_args["tie_word_embeddings"]
2828
args.rotary_base = deepseek_v3_args["rope_theta"]
2929
args.disable_bias_linear = not deepseek_v3_args["attention_bias"]
@@ -93,13 +93,14 @@ def load_args_hf2mg(args):
9393
def save_args_mg2hf(args):
9494
first_k_dense_replace = args.moe_layer_freq.index(1)
9595
seq_aux = True if args.moe_router_load_balancing_type == "seq_aux_loss" else False
96+
mtp_num_layers = getattr(args, "mtp_num_layers", 0) or 0
9697
config = DeepseekV3Config(
9798
vocab_size=args.vocab_size,
9899
hidden_size=args.hidden_size,
99100
intermediate_size=args.ffn_hidden_size,
100101
moe_intermediate_size=args.moe_ffn_hidden_size,
101102
num_hidden_layers=args.num_layers,
102-
num_nextn_predict_layers=args.mtp_num_layers,
103+
num_nextn_predict_layers=mtp_num_layers,
103104
num_attention_heads=args.num_attention_heads,
104105
num_key_value_heads=args.num_query_groups,
105106
n_shared_experts=args.moe_shared_expert_intermediate_size // args.moe_ffn_hidden_size,
@@ -118,7 +119,7 @@ def save_args_mg2hf(args):
118119
seq_aux=seq_aux,
119120
max_position_embeddings=args.max_position_embeddings,
120121
initializer_range=args.init_method_std,
121-
rms_norm_eps=args.norm_epsilon,
122+
rms_norm_eps=args.layernorm_epsilon,
122123
tie_word_embeddings=not args.untie_embeddings_and_output_weights,
123124
rope_theta=args.rotary_base,
124125
attention_dropout=args.attention_dropout,

tools/checkpoint/loader_mcore.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ def _load_checkpoint(queue, args):
4646
from megatron.training.checkpointing import load_args_from_checkpoint, load_checkpoint
4747
from megatron.legacy.model import module
4848
from megatron.core import mpu
49-
from megatron.legacy import fused_kernels
5049
from megatron.core.tensor_parallel.random import (
5150
get_cuda_rng_tracker, _DATA_PARALLEL_RNG_TRACKER_NAME,
5251
_EXPERT_PARALLEL_RNG_TRACKER_NAME, _MODEL_PARALLEL_RNG_TRACKER_NAME
@@ -78,7 +77,6 @@ def queue_put(name, msg):
7877
'--no-masked-softmax-fusion',
7978
'--no-bias-gelu-fusion',
8079
'--no-bias-dropout-fusion',
81-
'--no-async-tensor-model-parallel-allreduce',
8280
'--use-cpu-initialization',
8381
'--micro-batch-size', '1',
8482
'--no-load-optim',
@@ -125,20 +123,27 @@ def _set_arg(arg_name):
125123
_set_arg("hetero_pipeline_layer_split")
126124

127125
# for engram
128-
_set_arg("use_engram")
129-
_set_arg("engram_layer_ids")
130-
_set_arg("engram_hc_mult")
131-
_set_arg("engram_kernel_size")
132-
_set_arg("engram_pad_id")
133-
_set_arg("engram_seed")
134-
_set_arg("engram_vocab_size")
135-
_set_arg("engram_tokenizer_name_or_path")
136-
_set_arg("max_ngram_size")
137-
_set_arg("n_embed_per_ngram")
138-
_set_arg("n_head_per_ngram")
139-
setattr(margs, "vocab_size", args.true_vocab_size)
140-
engram_tokenizer_path_ckpt = getattr(checkpoint_args, "engram_tokenizer_name_or_path", None)
141-
setattr(margs, "engram_tokenizer_name_or_path", os.path.join(root_path, engram_tokenizer_path_ckpt))
126+
if getattr(checkpoint_args, "use_engram", False):
127+
_set_arg("use_engram")
128+
_set_arg("engram_layer_ids")
129+
_set_arg("engram_hc_mult")
130+
_set_arg("engram_kernel_size")
131+
_set_arg("engram_pad_id")
132+
_set_arg("engram_seed")
133+
_set_arg("engram_vocab_size")
134+
_set_arg("engram_tokenizer_name_or_path")
135+
_set_arg("max_ngram_size")
136+
_set_arg("n_embed_per_ngram")
137+
_set_arg("n_head_per_ngram")
138+
if args.true_vocab_size is not None:
139+
setattr(margs, "vocab_size", args.true_vocab_size)
140+
engram_tokenizer_path_ckpt = getattr(checkpoint_args, "engram_tokenizer_name_or_path", None)
141+
if engram_tokenizer_path_ckpt and not os.path.isabs(engram_tokenizer_path_ckpt):
142+
engram_tokenizer_path_ckpt = os.path.join(root_path, engram_tokenizer_path_ckpt)
143+
setattr(margs, "engram_tokenizer_name_or_path", engram_tokenizer_path_ckpt)
144+
else:
145+
setattr(margs, "use_engram", False)
146+
setattr(margs, "engram_layer_ids", [])
142147

143148
# for hetero
144149
if margs.hetero_process_meshes is not None:
@@ -259,9 +264,6 @@ def check_for_arg(arg_name, default=None):
259264
mpu._INTRA_PARTIAL_DATA_PARALLEL_GROUP_WITH_CP = fake_dp_group
260265
mpu._LAST_RANK_WHEN_USING_PIPELINE = pp_size - 1
261266

262-
# fused kernel
263-
fused_kernels.load(margs)
264-
265267
# random
266268
CUDA_RNG_STATE_TRACKER = get_cuda_rng_tracker()
267269
torch.cuda.manual_seed(42)
@@ -387,7 +389,9 @@ def get_models(count, dtype):
387389
margs.total_layer_num = total_layer_num
388390

389391
engram_layer_id = total_layer_num # get_global_layer_id
390-
if margs.use_engram and engram_layer_id in margs.engram_layer_ids:
392+
if getattr(margs, "use_engram", False) and engram_layer_id in getattr(
393+
margs, "engram_layer_ids", []
394+
):
391395
ckpt_plugin.get_engram_ckpt(message, models, engram_layer_id, margs)
392396

393397
ckpt_plugin.get_attn_ckpt(message, models, layer_id, margs)
@@ -406,9 +410,11 @@ def get_models(count, dtype):
406410
ckpt_plugin.get_output_layer_ckpt(message, models, margs)
407411
queue_put("output layer", message)
408412

409-
message = dict()
410-
if margs.mtp_num_layers:
411-
for mtp_layer_id in range(margs.mtp_num_layers):
413+
mtp_num_layers = getattr(margs, "mtp_num_layers", 0)
414+
if getattr(args, "skip_mtp", False):
415+
mtp_num_layers = 0
416+
if mtp_num_layers:
417+
for mtp_layer_id in range(mtp_num_layers):
412418
message = dict()
413419
ckpt_plugin.get_mtp_ckpt(message, models, mtp_layer_id, margs)
414420
queue_put(f"mtp module {mtp_layer_id}", message)

tools/checkpoint/loader_transformers.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def queue_put(name, msg):
7373
'--no-masked-softmax-fusion',
7474
'--no-bias-gelu-fusion',
7575
'--no-bias-dropout-fusion',
76-
'--no-async-tensor-model-parallel-allreduce',
7776
'--use-cpu-initialization',
7877
'--micro-batch-size', '1',
7978
'--no-load-optim',
@@ -192,9 +191,11 @@ def check_for_arg(arg_name, default=None):
192191
message = {"weight": hf_model.lm_head.weight.data}
193192
queue_put("output layer", message)
194193

195-
message = dict()
196-
if margs.mtp_num_layers:
197-
for mtp_layer_id in range(margs.mtp_num_layers):
194+
mtp_num_layers = getattr(margs, "mtp_num_layers", 0)
195+
if getattr(args, "skip_mtp", False):
196+
mtp_num_layers = 0
197+
if mtp_num_layers:
198+
for mtp_layer_id in range(mtp_num_layers):
198199
message = dict()
199200
ckpt_plugin.get_hf_mtp_ckpt(message, hf_model, mtp_layer_id, margs)
200201
queue_put(f"mtp module {mtp_layer_id}", message)

tools/checkpoint/qwen2_5_vl/hf2mcore_qwen2.5_vl_convertor.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ cmd="torchrun ${DISTRIBUTED_ARGS} hf2mcore_qwen2.5_vl.py \
198198
--num-attention-heads ${NUM_ATTN_HEADS} \
199199
--max-position-embeddings ${MAX_POSITION_EMBEDDINGS} \
200200
--seq-length 1 \
201-
--no-async-tensor-model-parallel-allreduce \
202201
--tokenizer-type Qwen2VLTokenizer \
203202
--extra-vocab-size ${EXTRA_VOCAB_SIZE} \
204203
--no-bias-swiglu-fusion \

tools/checkpoint/qwen3_vl/hf2mcore_qwen3_vl_convertor.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ cmd="torchrun ${DISTRIBUTED_ARGS} hf2mcore_qwen3_vl.py \
233233
--num-attention-heads ${NUM_ATTN_HEADS} \
234234
--max-position-embeddings ${MAX_POSITION_EMBEDDINGS} \
235235
--seq-length 1 \
236-
--no-async-tensor-model-parallel-allreduce \
237236
--tokenizer-type Qwen2VLTokenizer \
238237
--extra-vocab-size ${EXTRA_VOCAB_SIZE} \
239238
--no-bias-swiglu-fusion \

tools/checkpoint/saver_mcore.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ def save_checkpoint(queue, args):
5454
from megatron.training.arguments import parse_args, validate_args
5555
from megatron.training.checkpointing import save_checkpoint, get_checkpoint_name
5656
from megatron.training.global_vars import set_global_variables, get_args
57-
from megatron.training.tokenizer.tokenizer import _vocab_size_with_padding
58-
from megatron.legacy import fused_kernels
57+
from megatron.training.tokenizer.tokenizer import vocab_size_with_padding
5958
from megatron.core import mpu
6059
from megatron.core.tensor_parallel.random import (
6160
get_cuda_rng_tracker, _DATA_PARALLEL_RNG_TRACKER_NAME,
@@ -169,7 +168,6 @@ def check_message(msg):
169168
'--no-masked-softmax-fusion',
170169
'--no-bias-gelu-fusion',
171170
'--no-bias-dropout-fusion',
172-
'--no-async-tensor-model-parallel-allreduce',
173171
'--use-cpu-initialization',
174172
'--transformer-impl', 'transformer_engine',
175173
'--micro-batch-size', '1',
@@ -223,7 +221,7 @@ def check_message(msg):
223221
args_to_keep = ['tensor_model_parallel_size', 'pipeline_model_parallel_size', 'expert_model_parallel_size', 'world_size', 'params_dtype',
224222
'num_layers_per_virtual_pipeline_stage', 'virtual_pipeline_model_parallel_size',
225223
'masked_softmax_fusion', 'bias_gelu_fusion', 'bias_dropout_fusion',
226-
'sequence_parallel', 'async_tensor_model_parallel_allreduce',
224+
'sequence_parallel',
227225
'no_load_optim', 'no_load_rng', 'no_save_optim', 'no_save_rng',
228226
'vocab_file', 'tokenizer_model',
229227
'save_interval', 'save', 'load', 'use_mcore_models', 'num_experts',
@@ -292,11 +290,14 @@ def check_message(msg):
292290
margs.model_type = model_plugin.model_type
293291

294292
if md.true_vocab_size is not None:
295-
margs.padded_vocab_size = _vocab_size_with_padding(md.true_vocab_size, margs)
293+
margs.padded_vocab_size = vocab_size_with_padding(md.true_vocab_size, margs)
296294
else:
297295
# margs.padded_vocab_size will be set in ckpt_plugin.set_embedding_ckpt func
298296
margs.padded_vocab_size = None
299297

298+
if getattr(args, "skip_mtp", False):
299+
margs.mtp_num_layers = 0
300+
300301
"""
301302
use megatron args build object and init env
302303
"""
@@ -349,10 +350,6 @@ def check_message(msg):
349350
mpu._INTRA_PARTIAL_DATA_PARALLEL_GROUP_WITH_CP = fake_dp_group
350351
mpu._LAST_RANK_WHEN_USING_PIPELINE = pp_size - 1
351352

352-
353-
# fused kernel
354-
fused_kernels.load(margs)
355-
356353
# random
357354
CUDA_RNG_STATE_TRACKER = get_cuda_rng_tracker()
358355
torch.cuda.manual_seed(42)

tools/checkpoint/saver_transformers.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def save_checkpoint(queue, args):
5555

5656
try:
5757
from megatron.training.arguments import parse_args, validate_args
58-
from megatron.training.tokenizer.tokenizer import _vocab_size_with_padding
58+
from megatron.training.tokenizer.tokenizer import vocab_size_with_padding
5959
except ModuleNotFoundError:
6060
print("Unable to import Megatron, please specify the path to Megatron using --megatron-path. Exiting.")
6161
queue.put("exit")
@@ -158,7 +158,6 @@ def check_message(msg):
158158
'--no-masked-softmax-fusion',
159159
'--no-bias-gelu-fusion',
160160
'--no-bias-dropout-fusion',
161-
'--no-async-tensor-model-parallel-allreduce',
162161
'--use-cpu-initialization',
163162
'--transformer-impl', 'transformer_engine',
164163
'--micro-batch-size', '1',
@@ -205,7 +204,7 @@ def check_message(msg):
205204
args_to_keep = ['tensor_model_parallel_size', 'pipeline_model_parallel_size', 'expert_model_parallel_size', 'world_size', 'params_dtype',
206205
'num_layers_per_virtual_pipeline_stage', 'virtual_pipeline_model_parallel_size',
207206
'masked_softmax_fusion', 'bias_gelu_fusion', 'bias_dropout_fusion',
208-
'sequence_parallel', 'async_tensor_model_parallel_allreduce',
207+
'sequence_parallel',
209208
'no_load_optim', 'no_load_rng', 'no_save_optim', 'no_save_rng',
210209
'vocab_file', 'tokenizer_model',
211210
'save_interval', 'save', 'load', 'use_mcore_models', 'num_experts',
@@ -256,11 +255,15 @@ def check_message(msg):
256255
margs.transformer_impl = "transformer_engine"
257256

258257
if md.true_vocab_size is not None:
259-
margs.padded_vocab_size = _vocab_size_with_padding(md.true_vocab_size, margs)
258+
margs.padded_vocab_size = vocab_size_with_padding(md.true_vocab_size, margs)
259+
margs.vocab_size = md.true_vocab_size
260260
else:
261261
# margs.padded_vocab_size will be set in ckpt_plugin.set_embedding_ckpt func
262262
margs.padded_vocab_size = None
263263

264+
if getattr(args, "skip_mtp", False):
265+
margs.mtp_num_layers = 0
266+
264267
"""
265268
use megatron args build object and init env
266269
"""
@@ -283,7 +286,9 @@ def check_message(msg):
283286
msg = queue_get(f"transformer layer {layer_id}")
284287

285288
margs.total_layer_num = layer_id
286-
if margs.use_engram and layer_id in margs.engram_layer_ids:
289+
if getattr(margs, "use_engram", False) and layer_id in getattr(
290+
margs, "engram_layer_ids", []
291+
):
287292
ckpt_plugin.set_hf_engram_ckpt(msg, hf_model, layer_id, md, margs)
288293
ckpt_plugin.set_hf_attn_ckpt(msg, hf_model, layer_id, md, margs)
289294
ckpt_plugin.set_hf_mlp_ckpt(msg, hf_model, layer_id, md, margs)

0 commit comments

Comments
 (0)