|
| 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