Skip to content

Commit 37f1ab9

Browse files
authored
Merge pull request #67 from baidu-baige/ckpt/kimi-k2-mcore-hf-convert
[ckpt] feat: support Kimi K2.x checkpoint conversion
2 parents a801e82 + 19104b9 commit 37f1ab9

34 files changed

Lines changed: 4481 additions & 123 deletions
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Kimi K2.6 Model Config
2+
3+
defaults:
4+
- ../../models/image_encoder@model.image_encoder: moon_vit_3d
5+
- ../../models/image_projector@model.image_projector: patch_merger_adapter
6+
- ../../models/kimi_k2@model.foundation: kimi_k2
7+
- _self_
8+
9+
model:
10+
model_type: kimi_k2_6
11+
loss_func: ${loss_func:default}
12+
image_encoder:
13+
model_spec: ["loongforge.models.encoder.moon_vision_models.moon_vision_layer_spec",
14+
"get_moon_vision_model_layer_with_te_spec"]
15+
image_projector:
16+
model_spec: ["loongforge.models.encoder.moon_vision_models.moon_vision_layer_spec",
17+
"get_adapeter_layer_with_te_spec"]
18+
vision_token_id: 163603

examples/kimi_k2.5/checkpoint_convert/convert_kimi_k2.5_hf_to_mcore.sh

Lines changed: 0 additions & 59 deletions
This file was deleted.

examples/kimi_k2.5/checkpoint_convert/convert_kimi_k2.5_mcore_to_hf.sh

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#! /bin/bash
2+
3+
# Copyright 2026 The LoongForge Authors.
4+
# SPDX-License-Identifier: Apache-2.0
5+
set -euo pipefail
6+
7+
export LOONGFORGE_PATH=${LOONGFORGE_PATH:-"/workspace/LoongForge"}
8+
MEGATRON_PATH=${MEGATRON_PATH:-"/workspace/Loong-Megatron"}
9+
CONVERT_CHECKPOINT_PATH="${LOONGFORGE_PATH}/tools/convert_checkpoint"
10+
TORCHRUN=${TORCHRUN:-torchrun}
11+
12+
LOAD=${LOAD:-"/mnt/cluster/huggingface.co/moonshotai/Kimi-K2.5"}
13+
SAVE=${SAVE:-"/mnt/cluster/LoongForge/moonshotai/Kimi-K2.5-entp1dtp8pp8ep16etp1"}
14+
15+
MODEL_CONFIG_FILE=${MODEL_CONFIG_FILE:-"${LOONGFORGE_PATH}/configs/models/kimi_k2.5/kimi_k2_5.yaml"}
16+
17+
FOUNDATION_CONVERT_FILE=${FOUNDATION_CONVERT_FILE:-"${LOONGFORGE_PATH}/configs/models/kimi_k2/ckpt_convert/kimi_k2_convert.yaml"}
18+
IMAGE_ENCODER_CONVERT_FILE=${IMAGE_ENCODER_CONVERT_FILE:-"${LOONGFORGE_PATH}/configs/models/image_encoder/ckpt_convert/moon_vit_3d_convert.yaml"}
19+
IMAGE_PROJECTOR_CONVERT_FILE=${IMAGE_PROJECTOR_CONVERT_FILE:-"${LOONGFORGE_PATH}/configs/models/image_projector/ckpt_convert/patch_merger_adapter_convert.yaml"}
20+
21+
ENCODER_TP=${ENCODER_TP:-1}
22+
DTP=${DTP:-8}
23+
PP=${PP:-8}
24+
EP=${EP:-16}
25+
EXPERT_TP=${EXPERT_TP:-1}
26+
VPP=${VPP:-2}
27+
CUSTOM_PIPELINE_LAYERS=${CUSTOM_PIPELINE_LAYERS:-"4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,2"}
28+
29+
# This script always uses torchrun with --distributed_convert. Defaults are for
30+
# one node; set NNODES/NODE_RANK/MASTER_ADDR/MASTER_PORT in each pod for multinode.
31+
MAX_WORKERS=${MAX_WORKERS:-4}
32+
NNODES=${NNODES:-1}
33+
NPROC_PER_NODE=${NPROC_PER_NODE:-8}
34+
NODE_RANK=${NODE_RANK:-0}
35+
MASTER_ADDR=${MASTER_ADDR:-127.0.0.1}
36+
MASTER_PORT=${MASTER_PORT:-29500}
37+
38+
mkdir -p "$SAVE/logs"
39+
LOG=${LOG:-"$SAVE/logs/convert_node${NODE_RANK}_$(date +%Y%m%d-%H%M%S).log"}
40+
exec &> >(tee "$LOG")
41+
42+
EXTRA_ARGS=(
43+
--hf-dequantize-int4
44+
--hf-dequantize-dtype "${HF_DEQUANTIZE_DTYPE:-bfloat16}"
45+
)
46+
47+
QUANT_CONFIG_FILE=${QUANT_CONFIG_FILE:-"${LOAD%/}/config.json"}
48+
if [[ -f "$QUANT_CONFIG_FILE" ]]; then
49+
EXTRA_ARGS+=(--hf-quant-config-file "$QUANT_CONFIG_FILE")
50+
else
51+
echo "WARNING: compressed-tensors config not found: $QUANT_CONFIG_FILE; using fallback Kimi INT4 quantization args."
52+
fi
53+
54+
echo "===== Kimi K2.5 HuggingFace -> M-Core conversion ($(date '+%F %T')) ====="
55+
echo ">> LOG: $LOG"
56+
echo ">> LOAD: $LOAD"
57+
echo ">> SAVE: $SAVE"
58+
echo ">> QUANT_CONFIG_FILE: ${QUANT_CONFIG_FILE:-<none>}"
59+
echo ">> MODEL_CONFIG: $MODEL_CONFIG_FILE"
60+
echo ""
61+
62+
if [[ ! -d "$LOAD" ]]; then
63+
echo "Missing HuggingFace checkpoint directory: $LOAD" >&2
64+
exit 1
65+
fi
66+
67+
if [[ ! -f "${LOAD%/}/config.json" ]]; then
68+
echo "Missing config.json under HuggingFace checkpoint directory: $LOAD" >&2
69+
exit 1
70+
fi
71+
72+
echo ">> TORCHRUN: $TORCHRUN"
73+
echo ">> NNODES: $NNODES"
74+
echo ">> NPROC_PER_NODE: $NPROC_PER_NODE"
75+
echo ">> NODE_RANK: $NODE_RANK"
76+
echo ">> MASTER_ADDR: $MASTER_ADDR"
77+
echo ">> MASTER_PORT: $MASTER_PORT"
78+
echo ">> MAX_WORKERS/rank: $MAX_WORKERS"
79+
echo ""
80+
81+
PYTHONPATH=$MEGATRON_PATH:$LOONGFORGE_PATH:${PYTHONPATH:-} \
82+
"$TORCHRUN" \
83+
--nnodes "$NNODES" \
84+
--nproc_per_node "$NPROC_PER_NODE" \
85+
--node_rank "$NODE_RANK" \
86+
--master_addr "$MASTER_ADDR" \
87+
--master_port "$MASTER_PORT" \
88+
"$CONVERT_CHECKPOINT_PATH/module_convertor/model.py" \
89+
--load_platform=huggingface \
90+
--save_platform=mcore \
91+
--config_file "$MODEL_CONFIG_FILE" \
92+
--convert_file "$FOUNDATION_CONVERT_FILE" \
93+
--adapter_convert_file "$IMAGE_PROJECTOR_CONVERT_FILE" \
94+
--vision_patch_convert_file "$IMAGE_ENCODER_CONVERT_FILE" \
95+
--encoder_tensor_model_parallel_size="$ENCODER_TP" \
96+
--tensor_model_parallel_size="$DTP" \
97+
--pipeline_model_parallel_size="$PP" \
98+
--expert_parallel_size="$EP" \
99+
--expert_tensor_parallel_size="$EXPERT_TP" \
100+
--num-virtual-stages-per-pipeline-rank="$VPP" \
101+
--custom_pipeline_layers "$CUSTOM_PIPELINE_LAYERS" \
102+
--load_ckpt_path="$LOAD" \
103+
--save_ckpt_path="$SAVE" \
104+
--enable-full-hetero-dp \
105+
--fp8_force_no_requant \
106+
--moe-grouped-gemm \
107+
--safetensors \
108+
--no_save_optim \
109+
--no_load_optim \
110+
--force_pow_2_scales \
111+
--distributed_convert \
112+
--max_workers "$MAX_WORKERS" \
113+
"${EXTRA_ARGS[@]}"
114+
115+
echo "Saved M-Core checkpoint to: $SAVE"

0 commit comments

Comments
 (0)