千卡级训练配置:Kimi-K2
本文介绍如何在 MTT S5000 集群上配置 Kimi-K2 千卡级 MoE 训练,并以 62 台机器、496 张卡的训练脚本为例。内容基于现有多机启动脚本的并行方式,并结合 Kimi-K2 官方模型配置说明模型结构。文中的主机名、目录和数据路径均为占位符。
本文不提供吞吐量、MFU、训练耗时等性能指标。
本文中的命令分为两类:标注“宿主机执行”的命令在 Docker 宿主机运行,其他命令默认在训练容器内运行;带有 <...> 的内容必须替换 为当前环境的实际值后再执行。正式训练前请记录镜像 digest、代码 commit、DeepEP 版本、数据版本和启动参数,保证任务可复现。
1. 环境准备
1.1 千卡级拓扑
run_kimi_496GPU.sh 采用以下并行组合:
| 参数 | 示例值 | 说明 |
|---|---|---|
| WORLD_SIZE | 496 | 应与 hostfile 总 slot 一致 |
| TP | 1 | 张量并行 |
| PP | 31 | 流水线并行,调整时必须重新检查层分配 |
| EP | 8 | 专家并行 |
| DP | 2 | 496 ÷ (TP × PP × EP) |
| Micro batch | 1 | 单次前向/反向的每卡样本数 |
| Microbatch 数 | 32 | 用于计算 global batch |
必须满足:
WORLD_SIZE = TP × PP × EP × DP
GLOBAL_BATCH_SIZE = MICRO_BATCH_SIZE × NUM_MICROBATCHES × DP
PP=31 与现有模型分层和启动脚本相关,不能在不检查流水线分层的情况下直接修改。
WORLD_SIZE 必须等于 hostfile 中所有 slots 的总和。调整 TP、PP 或 EP 后,应重新计算 DP,并先执行小规模 dry-run。EP、DP 的 rank 分组方式由当前 Megatron MUSA Patch 和启动脚本决定,不能只依据公式手工推断。
1.2 创建容器
以下命令在每台 Docker 宿主机执行。示例使用 v2.1.7 镜像;实际训练时应替换为近期已验证、且预先安装了与训练代码匹配 DeepEP 的 Training Suite 镜像:
docker pull registry.mthreads.com/mcctest/training-suite:v2.1.7
# 可选:记录实际使用的镜像摘要,确保所有节点使用同一镜像
docker image inspect registry.mthreads.com/mcctest/training-suite:v2.1.7 \
--format '{{index .RepoDigests 0}}'
docker run -d \
--name training_kimi_k2 \
--runtime=mthreads \
--privileged \
--network=host \
--shm-size=256g \
-e MTHREADS_VISIBLE_DEVICES=all \
-v <SHARED_ROOT>:/data/shared \
-v <CODE_ROOT>:/data/code \
registry.mthreads.com/mcctest/training-suite:v2.1.7 \
sleep infinity
进入容器:
docker exec -it training_kimi_k2 /bin/bash
1.3 检查 DeepEP 和运行环境
Kimi-K2 MoE 训练需要确认镜像中包含与训练代码匹配的 DeepEP:
mthreads-gmi
cat /usr/local/musa/version.json
python3 - <<'PY'
import importlib.util
import torch
import torch_musa
print("PyTorch:", torch.__version__)
print("torch_musa:", torch_musa.__version__)
print("MUSA available:", torch.musa.is_available())
print("DeepEP module:", importlib.util.find_spec("deep_ep"))
PY
如果 deep_ep 未找到,停止后续操作,改用包含已验证 DeepEP 的镜像或按项目发布说明安装匹配版本。
还应记录实际包版本:
python3 -m pip show deep-ep 2>/dev/null || true
git -C /data/code/megatron-lm-musa-patch rev-parse HEAD
2. 准备目录和 hostfile
2.1 目录约定
/data/shared/kimi-k2/
├── data/
├── tokenizer/
├── checkpoints/
└── logs/
/data/code/megatron-lm-musa-patch/
└── examples/kimi-k2/
2.2 创建 hostfile
本示例使用 62 个节点、每节点 8 张 GPU,总计 496 个 slot:
train-node-000 slots=8
train-node-001 slots=8
...
train-node-061 slots=8
检查 hostfile:
HOSTFILE=/data/shared/kimi-k2/hostfile
grep -Ev '^#|^$' "${HOSTFILE}" | wc -l
awk -F'slots=' '/slots=/{sum += $2} END{print sum}' "${HOSTFILE}"
不要在公开文档中写入生产 IP、用户名或 SSH 凭据。
建议在提交任务前校验规模:
NODE_COUNT=$(grep -Ev '^#|^$' "${HOSTFILE}" | wc -l)
SLOT_COUNT=$(awk -F'slots=' '/slots=/{sum += $2} END{print sum}' "${HOSTFILE}")
test "${NODE_COUNT}" -eq 62
test "${SLOT_COUNT}" -eq 496
hostfile 的顺序通常会影响 rank 分配。第一个节点是否作为 master、节点名是否可被所有节点解析,以及 launcher 使用的 SSH 用户和端口,必须以 run_kimi_496GPU.sh 的实现为准。
3. 准备模型和数据
3.1 模型结构
Kimi-K2 官方配置包含以下核心参数:
MODEL_ARGS=(
--num-layers 61
--hidden-size 7168
--num-attention-heads 64
--num-experts 384
--moe-router-topk 8
--seq-length <SEQ_LENGTH>
--max-position-embeddings 131072
--bf16
)
Kimi-K2 使用 MLA 和 MoE。实际 Megatron 参数名称可能因 MUSA Patch 版本不同而变化,应以当前代码的帮助信息和已验证脚本为准,不要只根据 Hugging Face 字段机械转换。
3.2 数据和 Tokenizer
export DATA_PATH=<MEGATRON_DATA_PREFIX>
export TOKENIZER_MODEL=<KIMI_K2_TOKENIZER_DIR>
ls -lh "${DATA_PATH}.bin" "${DATA_PATH}.idx"
test -d "${TOKENIZER_MODEL}"
多数据集场景需要确认数据权重、路径顺序和所有节点的可见性一致。
DATA_PATH 通常是不带扩展名的 Megatron 数据前缀。例如,若数据文件为 train_text_document.bin 和 train_text_document.idx,应设置为:
export DATA_PATH=/data/shared/kimi-k2/data/train_text_document
Kimi-K2 的模型权重、Tokenizer 和数据预处理方式必须与启动脚本保持一致。本文未提供内部模型和数据下载地址时,不应直接使用任意公 开权重替代。
4. 配置训练任务
4.1 并行和 batch 参数
TP_SIZE=1
PP_SIZE=31
EP_SIZE=8
WORLD_SIZE=496
MICRO_BATCH_SIZE=1
NUM_MICROBATCHES=32
DP_SIZE=$((WORLD_SIZE / (TP_SIZE * PP_SIZE * EP_SIZE)))
GLOBAL_BATCH_SIZE=$((MICRO_BATCH_SIZE * NUM_MICROBATCHES * DP_SIZE))
test $((TP_SIZE * PP_SIZE * EP_SIZE * DP_SIZE)) -eq "${WORLD_SIZE}"