Skip to content

Commit 73ff1c0

Browse files
author
mokai
committed
aiak-train-2128 [Task] [Feat] 支持 Kimi K2.5 mcore 转 HF 权重
Change-Id: I17b5ac4208e9691f461c03c22faa4689ce6fe4a8 (cherry picked from commit 69042be)
1 parent a801e82 commit 73ff1c0

34 files changed

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

0 commit comments

Comments
 (0)