ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

XTuner 迁移 InternEvo(train_internlm)训练方案:模型、数据与训练策略差异适配全指南

2026/9/18 3:36:34 拓冰建站 浏览量
XTuner 迁移 InternEvo(train_internlm)训练方案:模型、数据与训练策略差异适配全指南 XTuner 迁移 InternEvotrain_internlm训练方案模型、数据与训练策略差异适配全指南【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner本文档是 XTuner 复现 InternEvo 训练精度的官方迁移指南源自docs/zh_cn/internevo_migration/differences.rst系统梳理从 InternEvo (train_internlm) 迁移到 XTuner 过程中在模型权重、数据集格式、变长注意力Varlen Attention、梯度累积与并行策略上的全部差异与对齐方法。读完本文你将掌握如何让 XTuner 精确复现 InternEvo 训练得到的开源模型如 internlm2-chat-7b的训练精度以及如何借助序列并行与 ZeRO 显存优化获得更快的训练速度。一、总览XTuner 与 InternEvo 的训练结果对比XTuner 可以复现 InternEvo (train_internlm) 仓库训练得到的开源模型internlm/internlm2-chat-7b的训练精度。官方在相同数据集、相同基座模型的条件下对比了 XTuner 与 InternEvo (train_internlm) 的训练结果能力类别xtunerinternevo全数据集平均(无智能体)56.4455.26全维度平均(无智能体)49.5848.96语言 Language64.7762.41知识 Knowledge52.2452.52推理 Reasoning65.563.91数学 Mathematics30.9530.26代码 Coding38.9141.06长文本 LongEval45.0943.62智能体 Agent44.8543.97数学题智能体3737.19CIBench79.0769.78PluginEval65.5765.62从对比结果看XTuner 在绝大多数能力维度上达到或超过了 InternEvo 的复现水平。在 64 卡 A100 上的训练时间对比如下xtunerinternevo15 h 55 min16 h 09 min提示使用 XTuner 提供的序列并行算法可以进一步提升训练速度使用方式可参考 训练超长序列文档。在从 InternEvo (train_internlm) 向 XTuner 迁移的过程中需要重点关注模型、数据以及训练策略三个方面的适配问题下文逐一展开。二、模型适配从 InternEvo 分片权重到 Huggingface Hub 模型2.1 InternEvo 的权重目录结构InternEvo 在训练时读取和保存的模型权重满足如下目录结构以tp2pp2为例|-- root |-- model_config.pt |-- model_tp0_pp0.pt |-- model_tp0_pp1.pt |-- model_tp1_pp0.pt |-- model_tp1_pp1.pt其中model_config.pt保存模型权重的一些 meta 信息其余 4 个 checkpoint 分别保存 4 组 GPUs 上的模型权重。因此InternEvo 训练过程中要求读取预训练权重的 tp、pp 策略与训练使用的 tp、pp 策略一致才能正常读取预训练权重进行训练。2.2 XTuner直接基于 Huggingface Hub 模型训练XTuner 支持基于 Huggingface Hub 上的模型进行训练通过修改 config 即可轻松切换基座模型。例如将基座模型从 internlm2-7b 切换为 internlm2-20b####################################################################### # PART 1 Settings # ####################################################################### # Model - pretrained_model_name_or_path internlm/internlm2-7b pretrained_model_name_or_path internlm/internlm2-20b这一设计消除了 InternEvo 中 tp/pp 切分策略必须与预训练权重一致的强约束迁移成本大幅降低。修改后模型将以AutoModelForCausalLM.from_pretrained方式加载见 internlm2_7b_w_internevo_dataset.py。三、数据适配从 InternEvo 拼接数据到 XTuner 在线打包3.1 InternEvo 的数据配置形式InternEvo 在训练过程中通常会把多条数据拼接为一个特定的最大长度随后输入模型训练其配置往往满足以下形式data dict( seq_lenSEQ_LEN, pack_sample_into_oneFalse, min_lengthMIN_LENGTH, train_folderTRAIN_FOLDER, dataset_weightsDATASET_WEIGHTS, ...)需要说明的是数据配比dataset_weightsDATASET_WEIGHTS功能 XTuner 尚未支持。TRAIN_FOLDER中的训练数据需要满足 ftdp tokenized 数据集格式|-- TRAIN_FOLDER |-- cn | |-- dataset1 | | |-- data1.bin | | |-- data1.bin.meta | |-- dataset2 | | |-- data2.bin | | |-- data2.bin.meta其中.bin文件按行存储 token 化后的 JSON 样本.bin.meta为对应的 offset/length 元信息缓存文件实现细节见 xtuner/dataset/intern_repo.py 中的JsonlDataset。3.2 在 XTuner 中复现在线数据集拼接策略XTuner 中实现在线数据集拼接策略可参考模板配置文件 internlm2_7b_w_internevo_dataset.py####################################################################### # PART 1 Settings # ####################################################################### # Data - dataset_folder /path/to/sft/data/folder dataset_folder TRAIN_FOLDER - max_length 32768 max_length SEQ_LEN ####################################################################### # PART 3 Dataset Dataloader # ####################################################################### train_dataset dict( typebuild_packed_dataset, dataset_cfgdict( typeload_intern_repo_tokenized_dataset, data_order_pathNone, folderdataset_folder, - min_length0, min_lengthMIN_LENGTH, file_type.bin), packed_lengthmax_length, seed1024)build_packed_dataset会在 rank 0 上完成打包后通过broadcast_object_list广播给其他 rank保证各卡数据一致见 xtuner/dataset/intern_repo.pyPackedDataset内部按seed打乱样本顺序并基于np.searchsorted将长度不一的样本拼接pack到packed_length同时生成cumulative_len、position_ids等变长注意力所需字段见 xtuner/dataset/intern_repo.py。注意由于训练数据喂给模型的先后顺序可能对训练结果造成影响建议不要轻易修改上述配置中的seed选项。同时可参考 获取数据顺序Case 4 步骤 3 进一步固定数据顺序。此外与 InternEvo 对齐时还应使用专用的InternRepoSampler。从源码看该 Sampler 会强制将seed固定为 1024若传入其他 seed 将给出警告For alignment accuracy, seed in InternRepoSampler must be set to 1024以保证与 InternEvo 的数据打乱行为一致见 xtuner/dataset/samplers/intern_repo.pytrain_dataloader dict( batch_sizebatch_size, num_workersdataloader_num_workers, datasettrain_dataset, samplerdict(typeInternRepoSampler, shuffleTrue, seed1024), batch_samplerdict(typeBatchSampler, drop_lastTrue, batch_size1), collate_fndict(typedefault_collate_fn, use_varlen_attnuse_varlen_attn))3.3 固定数据顺序可选get_data_order.py工具可把训练文件夹内所有目标类型文件的相对顺序导出为data_order.txt从而摆脱不同集群上os.walk顺序不一致带来的影响实现见 xtuner/tools/get_data_order.pypython xtuner/tools/get_data_order.py \ --data-folder /path/to/tokenized/data \ --save-folder /folder/to/save/data/order \ --file-type .bin得到数据顺序文件后将其路径填入 configtrain_dataset dict( typebuild_packed_dataset, dataset_cfgdict( typeload_intern_repo_tokenized_dataset, - data_order_pathNone, data_order_path/folder/to/save/data/order/data_order.txt, folderdataset_folder, min_length0, file_type.bin), packed_lengthmax_length, seed1024)四、训练策略适配4.1 Varlen Attention对齐 InternEvo 的“变长注意力机制”InternEvo 通过设置数据配置中的pack_sample_into_one参数为False来使用“变长注意力机制”。其数据配置形如data dict( pack_sample_into_oneFalse, ...)InternEvo 在pack_sample_into_oneFalse时多条不同长度的样本被打包pack进同一条序列各样本之间不互相 attend而pack_sample_into_oneTrue则会把样本真实拼接为一条长序列。这正是 XTuner 中use_varlen_attn所对应的行为。在 XTuner 中使用这一功能只需将 config 中的use_varlen_attn配置改为 True即可保证训练行为与 InternEvo 一致... ####################################################################### # PART 1 Settings # ####################################################################### # Model pretrained_model_name_or_path internlm/internlm2-7b - use_varlen_attn False use_varlen_attn True ...警告当设置use_varlen_attn True后请确保batch_size被设置为 1且pack_to_max_length被设置为 True。提示use_varlen_attn True时“单卡 batch size 等于 2拼接数据集至最大长度 2k”的配置与“单卡 batch size 等于 1拼接数据集至最大长度 4k”的配置训练行为是近似的因此 XTuner 目前只支持了batch_size_per_device 1的情况。开启use_varlen_attn后config 还会自动追加VarlenAttnArgsToMessageHubHook用于把变长注意力所需的cumulative_len等参数写入 message hub见 internlm2_7b_w_internevo_dataset.py。4.2 梯度累积对齐 micro_num / micro_bsz / total_steps在 InternEvo 的配置中与 batch_size 和 accumulative_counts 相关的配置有如下几个data dict( # micro_num means the number of micro_batch contained in one gradient update micro_numMICRO_NUM, # MICRO_BATCH_SIZE * SEQ_LEN PACKED_LENGTH micro_bszMICRO_BATCH_SIZE, total_stepsTOTAL_STEP, # 梯度累计默认等于MICRO_NUMBS gradient_accumulationGRADIENT_ACCUMULATION, ...)对齐要点如下注意InternEvo 中的micro_num等价于 XTuner 中的gradient_accumulation。注意total_steps在 XTuner 中可以不手动指定可通过max_epochs指定。警告XTuner 目前只支持micro_bsz 1。为对齐以上配置可参考 internlm2_7b_w_internevo_dataset.py 文件中的配置并进行如下修改####################################################################### # PART 1 Settings # ####################################################################### # Scheduler Optimizer - accumulative_counts 1 accumulative_counts MICRO_NUM # or GRADIENT_ACCUMULATION - max_epochs 1 max_epochs MAX_EPOCHSaccumulative_counts在 XTuner 中通过optim_wrapper的accumulative_counts字段生效见 internlm2_7b_w_internevo_dataset.py其语义与 InternEvo 的micro_num一次梯度更新包含的 micro-batch 数完全一致。五、并行策略适配5.1 ZeRO 系列显存优化XTuner 支持使用 ZeRO 系列显存优化降低训练过程中的显存消耗分别适用于单卡与多卡场景# 单卡 xtuner train ${CONFIG_NAME_OR_PATH} --deepspeed deepspeed_zero2 # 多卡 (DIST) NPROC_PER_NODE${GPU_NUM} xtuner train ${CONFIG_NAME_OR_PATH} --deepspeed deepspeed_zero2 # 多卡 (SLURM) srun ${SRUN_ARGS} xtuner train ${CONFIG_NAME_OR_PATH} --launcher slurm --deepspeed deepspeed_zero2ZeRO 的 JSON 配置位于仓库 xtuner/configs/deepspeed/ 目录下包含deepspeed_zero1.json、deepspeed_zero2.json、deepspeed_zero2_offload.json、deepspeed_zero3.json、deepspeed_zero3_offload.json等策略文件可根据显存情况按需选用。5.2 序列并行Sequence ParallelInternEvo 中支持 Data Parallel、Tensor Parallel、Pipeline Parallel 和 Sequence Parallel 四种并行策略。XTuner 目前支持了 Data Parallel 和 Sequence Parallel 两种并行策略可满足基本全部的训练需求搭配 zero3 显存优化策略可支持 70B 模型 256K 上下文训练。假定 InternEvo 训练过程中tp_world_size TPpp_world_size PPsequence_parallel True则训练的global_batch_size满足以下计算公式# 多除的一个 TP 是因为启用了 sequence parallel global_batch_size num_gpus * batch_size_per_device * gradient_accumulate / TP / PP / TP提示use_varlen_attn True时batch_size_per_device只能为 1此时若想对齐global_batch_size只需要在配置文件中综合调整gradient_accumulate和sequence_parallel_size两项的数值 from xtuner.parallel.sequence import SequenceParallelSampler sequence_parallel_size SP - accumulative_counts 1 # 1bs * 1acc * 64gpu 64 batchsize accumulative_counts TP * PP * TP / SP ####################################################################### # PART 3 Dataset Dataloader # ####################################################################### train_dataloader dict( - samplerdict(typeDefaultSampler, shuffleTrue), samplerdict(typeSequenceParallelSampler, shuffleTrue), ...)从源码看SequenceParallelSampler继承自 mmengine 的DefaultSampler通过get_data_parallel_rank/get_data_parallel_world_size在序列并行的数据并行维度上切分数据见 xtuner/parallel/sequence/sampler.py从而保证序列并行时每条序列的切分位置在各数据并行卡之间正确对齐。六、端到端实战建议导出模板 config使用xtuner copy-cfg internlm2_7b_w_internevo_dataset .在当前目录生成可编辑副本internlm2_7b_w_internevo_dataset_copy.py随后按上文第二至五节逐项替换模型路径、数据集路径、max_length、min_length、accumulative_counts等字段。数据格式要求训练数据必须为 ftdp tokenized 格式.bin.bin.meta配对路径下的所有目标类型文件都会被load_intern_repo_tokenized_dataset依序加载。OOM 处理若训练出现 OOM可依次尝试deepspeed_zero2、deepspeed_zero3等更激进的显存优化策略。结果验证可参照本文第一节的评测维度语言、知识、推理、数学、代码、长文本、智能体等对训练结果进行系统性评估验证与 InternEvo 的精度对齐情况。通过以上模型、数据与训练策略三方面的适配即可在 XTuner 上以更简洁的配置、更低的迁移成本稳定复现 InternEvo 的训练精度并借助序列并行与 ZeRO 优化获得更优的训练吞吐。【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考