ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Megatron-Core 中 NVLM 1.0 多模态模型训练实战:从检查点转换、预训练/SFT 到评估的完整指南

Megatron-Core 中 NVLM 1.0 多模态模型训练实战:从检查点转换、预训练/SFT 到评估的完整指南 Megatron-Core 中 NVLM 1.0 多模态模型训练实战从检查点转换、预训练/SFT 到评估的完整指南【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM导读本文基于 Megatron-LM 仓库中 examples/multimodal/nvlm/README.md 及配套脚本系统讲解如何在 Megatron-Core 框架下复现并训练 NVLM 1.034B 与 72B 两个尺寸多模态大模型。文章覆盖从 HuggingFace 权重到 Megatron 格式的视觉/语言模型转换、视觉与语言检查点合并、基于 Megatron Energon 的数据准备、预训练与 SFT 全流程以及文本生成与评测脚本的使用方法。读完本文你将掌握一套完整可复现的 NVLM 训练流水线并理解其中涉及的张量并行TP8、流水线并行PP 重切分、InternViT 视觉编码器接入等关键实现细节。一、NVLM 1.0 与 Megatron 中的 VLM 支持概览NVLM 1.0 是由 NVIDIA 发布的多模态大语言模型VLMMegatron-LM 仓库为 34B 与 72B 两个规格提供了完整的训练与推理脚本。仓库明确指出Megatron 中的 VLM视觉语言模型仍处于积极开发阶段相关接口与行为预期会持续变化因此使用时应以当前仓库版本为准。NVLM 1.0 模型权重公开提供两种格式HuggingFace 格式NVLM-1.0-D 72BHuggingFace 上对应nvidia/NVLM-D-72BMegatron-Core 格式NVLM-1.0-D 72BHuggingFace 上对应nvidia/NVLM-D-72B-mcore。从源码结构看NVLM 在 Megatron 中由三个核心部分组成InternViT 视觉编码器vision_model、语言模型主干language_modelYi-34B 或 Qwen2-72B-Instruct以及vision projection 投影层。相关的模型组装与训练入口位于 examples/multimodal/train.py构建逻辑可参考 examples/multimodal/model.py所有 NVLM 专属脚本集中在 examples/multimodal/nvlm/ 目录下。二、环境搭建与数据集准备2.1 Docker 镜像NVLM 训练脚本依赖 Transformer Engine--use-te等环境官方要求使用仓库提供的多模态 Dockerfile 构建镜像examples/multimodal/Dockerfile该镜像包含了运行 examples/multimodal/train.py 所需的依赖。训练脚本同时支持两种启动方式见各.sh脚本末尾交互式torchrun --nproc_per_node 8 examples/multimodal/train.py ${OPTIONS}批处理/SLURM通过srun在容器内执行同样的 Python 入口并输出日志到${LOGS_DIR}。2.2 数据集准备Megatron Energon 格式NVLM 的预训练与 SFT 均使用 Megatron Energon 数据加载器对应的数据描述文件为预训练混合数据集examples/multimodal/nvlm/pretrain_blend.yamlSFT 混合数据集examples/multimodal/nvlm/sft_blend.yaml。两个文件均为 Energon 的Metadataset配置结构如下__module__: megatron.energon __class__: Metadataset splits: train: datasets: - weight: 0.579 # 数据集按其规模加权所有权重之和为 1 path: path to laion dataset subflavors: augmentation: False - weight: 0.02 path: path to coco subflavors: augmentation: False # 完整预训练数据集清单请参考 NVLM 论文 Table 4 val: datasets: - weight: 1. path: path to validation dataset subflavors: augmentation: False其中weight决定各数据集在混合采样中的占比subflavors.augmentation用于控制是否做数据增强。SFT 混合文件结构相同训练数据覆盖 COCO、CLEVR-Math 等论文 Table 6。读者需按 Megatron Energon 的数据准备规范将原始数据如 LAION、COCO、VQAv2预处理为 Energon 格式后再把对应路径填入上述 yaml。此外训练时通过--dataloader-type external启用外部数据加载器并将数据文件通过--data-path传入。三、模型权重转换从 HuggingFace 到 Megatron-Core训练前需要把 NVLM 的两个组成部分——视觉模型与语言模型——分别从 HuggingFace 格式转换为 Megatron 格式再合并成多模态检查点。3.1 视觉模型InternViT 转换NVLM 1.0 使用的视觉编码器是 HuggingFace 上的OpenGVLab/InternViT-6B-448px-V1-5448px 分辨率、6B 参数。下载后运行 examples/multimodal/model_converter/internvit_converter.py 转换python examples/multimodal/model_converter/internvit_converter.py --output-dir some output dir --use-te --tensor-parallel-size 8从转换器源码可以看到几个关键技术点参数名映射脚本把 HF 权重逐项改名为 Megatron 的命名例如embeddings.patch_embedding.weight→conv1.weight、encoder.layers.*.attn.qkv.weight→decoder.layers.*.self_attention.linear_qkv.weight、mlp.fc1.weight→mlp.linear_fc1.weight等注意力头填充InternViT 有 25 个注意力头当--tensor-parallel-size 8时由于 25 不能被 8 整除脚本会用全零的虚拟头把 25 个头补齐到 32 个头num_padded_heads 32以支持张量并行的均匀切分——这也是为什么仓库建议自行设计模型时使用偶数注意力头QKV 权重重排脚本通过order张量将 HF 的 Q/K/V 拼接顺序重排为 Megatron 期望的布局并对linear_qkv等张量沿 dim 0 做torch.chunk切分到各 TP rankTE 兼容当--use-te开启时会为linear_qkv、linear_proj、linear_fc1、linear_fc2写入空的_extra_state与 Transformer Engine 的 FP8 状态机制兼容输出布局每个 TP rank 生成iter_0000001/mp_rank_0{i}/model_optim_rng.pt。注意该脚本只支持--tensor-parallel-size 1或8两种取值其它取值会抛出NotImplementedError。3.2 34B 语言模型Yi-34B转换NVLM 1.0 34B 以 HuggingFace 上的NousResearch/Nous-Hermes-2-Yi-34B为起点使用通用转换工具 tools/checkpoint/convert.py 转换python tools/checkpoint/convert.py --bf16 --model-type GPT --loader llama_mistral --saver mcore --target-tensor-parallel-size 8 --checkpoint-type hf \ --load-dir hf model directory --save-dir output dir --tokenizer-model hf model name/directory \ --saver-transformer-impl transformer_engine --model-size yi-34B --make-vocab-size-divisible-by 1关键参数说明参数作用--model-type GPT声明为自回归 GPT 类模型--loader llama_mistral使用 LLaMA/Mistral 结构的 HF 加载器--saver mcore保存为 Megatron-Core 格式--target-tensor-parallel-size 8目标张量并行度与后续训练脚本的--tensor-model-parallel-size 8一致--checkpoint-type hf输入为 HuggingFace 检查点--saver-transformer-impl transformer_engine权重布局适配 Transformer Engine 实现--model-size yi-34B模型规模标识网络结构由模型名推导--make-vocab-size-divisible-by 1不强制把词表补齐到可整除大小3.3 72B 语言模型Qwen2-72B-Instruct转换NVLM 1.0 72B 以Qwen/Qwen2-72B-Instruct为起点转换命令几乎相同python tools/checkpoint/convert.py --bf16 --model-type GPT --loader llama_mistral --saver mcore --target-tensor-parallel-size 8 --checkpoint-type hf \ --load-dir hf model directory --save-dir output directory --tokenizer-model hf model name/directory \ --saver-transformer-impl transformer_engine --model-size qwen2.5-72Bf区别仅在于--model-size qwen2.5-72Bf。转换时同样输出 TP8 的 Megatron 检查点布局供后续合并与训练使用。3.4 合并视觉与语言检查点转换完成后用 examples/multimodal/combine_lm_vision_checkpoints.sh 把 InternViT 视觉检查点与 34B/72B 语言检查点合并为多模态检查点examples/multimodal/combine_lm_vision_checkpoints.sh language model directory vision model directory output directory nvlm该脚本对 NVLMTP8会调用 examples/multimodal/combine_state_dicts.py将 8 个 TP rank 的语言模型与视觉模型状态字典按language_model/vision_model前缀交替配对合并python examples/multimodal/combine_state_dicts.py \ --input ${MCORE_LM}/iter_0000001/mp_rank_00/model_optim_rng.pt \ ${MCORE_VISION}/iter_0000001/mp_rank_00/model_optim_rng.pt \ ...共 16 个文件LM 与 ViT 交替 \ --prefixes language_model vision_model language_model vision_model ... \ --output ${OUTPUT_DIR}/iter_0000001/mp_rank_00/model_optim_rng.pt ...共 8 个文件其原理见 combine_state_dicts.py对每个输出文件取同一 TP rank 的语言与视觉状态字典把视觉模型的所有参数键加上vision_model.前缀、语言模型参数键加上language_model.前缀后合并到一个字典中最后脚本会写入latest_checkpointed_iteration.txt。合并结果即为训练脚本中--pretrained-checkpoint指向的初始权重。四、预训练Pretraining4.1 34B 预训练运行 examples/multimodal/nvlm/pretrain_yi_34b_internvit_6b.sh需使用前面生成的 InternViT 34B 合并检查点tokenizer 直接使用 HuggingFace 的NousResearch/Nous-Hermes-2-Yi-34B。该脚本的关键配置如下模型规模60 层、hidden 7168、FFN 20480、56 注意力头、GQA8 个 query group、SwiGLU、RMSNorm、RoPE--rotary-base 5000000--language-model-type yi-34b图像编码--vision-model-type internvit--img-h/--img-w 448、--patch-dim 14开启--pixel-shuffle像素重排下采样、--image-tag-type nvlm、--disable-vision-class-token序列长度--seq-length 256图像 embedding 序列长度、--decoder-seq-length 512语言模型序列长度、--max-position-embeddings 512训练规模--global-batch-size 2048、--micro-batch-size 1、--train-samples 122880000、--lr 1e-4、cosine 衰减、--weight-decay 0.1、--clip-grad 10.0冻结策略同时--freeze-LM --freeze-ViT预训练阶段冻结视觉与语言主干只训练 vision projection 与多模态对齐部分检查点--pretrained-checkpoint指向合并检查点并配合--allow-missing-vision-projection-checkpoint允许缺失视觉投影权重与--use-checkpoint-args、--ckpt-format torch环境变量export NVTE_ALLOW_NONDETERMINISTIC_ALGO1、export NVTE_APPLY_QK_LAYER_SCALING0并行度--tensor-model-parallel-size 8交互模式下通过torchrun --nproc_per_node 8启动。脚本还内置了DEBUG1的快速调试分支micro-batch 1、dropout 0、log-interval 1以及BATCH变量切换 torchrun / srun 两种运行模式。4.2 72B 预训练运行 examples/multimodal/nvlm/pretrain_qwen20_72b_internvit_6b.sh使用 InternViT 72B 合并检查点与 HuggingFace 的Qwen/Qwen2-72B-Instructtokenizer。与 34B 的主要差异模型规模80 层、hidden 8192、FFN 29568、64 注意力头、GQA8 query groups、--add-qkv-bias、--norm-epsilon 1e-06、--rotary-base 1000000--language-model-type qwen2.0_72B并行配置显式给出--tensor-model-parallel-size 8 --pipeline-model-parallel-size 1Attention 数值稳定性增加--no-masked-softmax-fusion与--attention-softmax-in-fp32tokenizer 提示词格式--tokenizer-prompt-format qwen2p034B 脚本则为nvlm-yi-34b其余冻结策略、序列长度、--pixel-shuffle、--allow-missing-vision-projection-checkpoint等与 34B 一致。五、流水线并行检查点转换72B SFT 前置步骤72B 的预训练在 PP1 下进行而 SFT 需要 PP4。为此仓库提供了专用工具 examples/multimodal/nvlm/pp_checkpoint_converter.py用于在 PP1 与 PPN 之间互相转换。5.1 从 PP1 切分为 PP4预训练 → SFTexamples/multimodal/nvlm/pp_checkpoint_converter.py --input pretrained checkpoint directory \ --input-pipeline-parallel 1 --output some output dir --output-pipeline-parallel 4 \ --tensor-parallel 85.2 从 PP4 合并回 PP1SFT → 评测examples/multimodal/nvlm/pp_checkpoint_converter.py --input sft checkpoint directory \ --input-pipeline-parallel 4 --output some output dir --output-pipeline-parallel 1 \ --tensor-parallel 8从 pp_checkpoint_converter.py 源码可以看出其处理规则split 方向PP 1→N逐 TP rank 读取mp_rank_0{tp}/model_optim_rng.pt按层号区间把language_model.decoder.layers分发到各 PP rank视觉模型vision_model与vision_projection只保留在第一个 PP rankword_embeddings仅归第一个 PP rankoutput_layer与final_layernorm仅归最后一个 PP rank每层在所有 PP rank 上从 0 开始重新编号combine 方向PP N→1反向合并各 PP rank 的层层号按 offset 递增回填视觉/投影权重取自第一个 PP rank并把args.pipeline_model_parallel_size改回 1不均等切分当num_layers % output_pp ! 0时可用--num-layers-per-pp-rank指定每个 PP rank 的层数每个 rank 至少 1 层迭代号可用--iteration指定要处理的检查点迭代输出目录结构为iter_{iter:07}/mp_rank_0{tp}_00{pp}/model_optim_rng.pt并自动写出latest_checkpointed_iteration.txt。该脚本仅支持 PP 1↔N 两种方向其他组合会抛出NotImplementedError。六、监督微调SFT6.1 34B SFT运行 examples/multimodal/nvlm/sft_34b_internvit.sh--pretrained-checkpoint指向 34B 预训练产出的检查点。关键差异--global-batch-size 128、--lr 2e-6远低于预训练、--min-lr 2.5e-7序列长度放大--seq-length 261256 个图像 embedding 5 个 tile tag embedding、--decoder-seq-length 3200、--max-position-embeddings 3200开启动态 tile 分块--use-tiling --max-num-tiles 6 --use-thumbnail --use-tile-tags --pixel-shuffle支持把大图切分为最多 6 个 tile 并附带缩略图与 tile 标签仅--freeze-ViT语言模型参与微调数据切换到 sft_blend.yaml环境变量额外设置export NCCL_ALGO^NVLSDEBUG 分支为节省显存额外追加--freeze-LM仅用于交互调试正式训练不要使用。6.2 72B SFT运行 examples/multimodal/nvlm/sft_qwen20_72b_internvit_6b.sh使用第 5.1 节切分好的 PP4 检查点LOAD_NAMEmcore-qwen20-72b-internvit-pp4。关键差异--pipeline-model-parallel-size 4配合--tensor-model-parallel-size 8--global-batch-size 256、--lr 2e-6、--decoder-seq-length 3200、--max-position-embeddings 8192同样开启--use-tiling --max-num-tiles 6 --use-thumbnail --use-tile-tags仅--freeze-ViT。脚本注释明确提示预训练检查点必须先手动切分到 4 个 PP stage见 README 与pp_checkpoint_converter.pySFT 完成后如需评测再按第 5.2 节合并回 PP1。七、文本生成与评测7.1 文本生成评测前先用对应尺寸的推理脚本生成模型输出34Bexamples/multimodal/nvlm/run_text_generation_yi_34b_internvit_6b.sh72Bexamples/multimodal/nvlm/run_text_generation_qwen20_72b_internvit_6b.sh调用方式两者一致examples/multimodal/nvlm/run_text_generation_yi_34b_internvit_6b.sh --input-image-path /path/to/input/images --output-path /some/output/directory \ --model-path /path/to/model.pt --gt-path /path/to/groundtruth/file --task generation-task-name --use-tiling参数说明--task为评测基准名如captioning、MMMU、TextVQA--use-tiling开启动态 tile 分块此外脚本还支持--use-pixel-shuffle-only仅像素重排不分块。内部调用 examples/multimodal/run_text_generation.py默认推理配置为--micro-batch-size 1、--out-seq-length 16、--temperature 1.0、--top_k 1贪心解码、--no-load-rng --no-load-optim并可通过NUM_PARTITIONS/START/END将评测集分片并行执行。注意脚本按生成模式动态调整序列长度——开启 tiling 时--seq-length 261仅 pixel shuffle 时--seq-length 256否则为 1024语言模型解码长度固定为--decoder-seq-length 8192、--max-position-embeddings 8192。7.2 运行评测脚本生成完成后使用 examples/multimodal 下的评测脚本对输出打分例如 MMMUpython examples/multimodal/evaluate_mmmu.py --input-path /output/directory/from/generation仓库在 examples/multimodal/evaluation/ 目录提供了覆盖 AI2D、ChartQA、COCO、InfoVQA、MathVista、MMMU、OCRBench、TextVQA、VQAv2、视频类MotionBench、MVBench等十余个基准的评测实现如 evaluate_ai2d.py、evaluate_textvqa.py 等可配合--task选择对应任务。八、全流程速查与注意事项阶段34B72B视觉模型转换internvit_converter.py --use-te --tensor-parallel-size 8同左语言模型转换convert.py --loader llama_mistral --saver mcore --model-size yi-34B ...convert.py ... --model-size qwen2.5-72Bf ...检查点合并combine_lm_vision_checkpoints.sh lm vit out nvlm同左预训练pretrain_yi_34b_internvit_6b.shTP8, PP1, 冻结 LMViTpretrain_qwen20_72b_internvit_6b.shTP8, PP1, 冻结 LMViTPP 转换不需要pp_checkpoint_converter.pyPP1→PP4SFTsft_34b_internvit.shTP8, 仅冻结 ViTsft_qwen20_72b_internvit_6b.shTP8, PP4, 仅冻结 ViTPP 还原不需要pp_checkpoint_converter.pyPP4→PP1评测run_text_generation_yi_34b_*.shevaluate_*.pyrun_text_generation_qwen20_72b_*.shevaluate_*.py实战注意事项总结并行度贯穿一致从转换--target-tensor-parallel-size 8到训练--tensor-model-parallel-size 8再到推理TP8 必须保持一致72B SFT 引入 PP4 时需先用pp_checkpoint_converter.py切分评测前再合并回 PP1冻结策略有讲究预训练阶段--freeze-LM --freeze-ViT只训练投影对齐SFT 阶段仅--freeze-ViT让语言模型参与指令微调DEBUG 模式为省显存临时加--freeze-LM仅限交互测试图像预处理标志--pixel-shuffle与--use-tiling/--use-thumbnail/--use-tile-tags必须在训练/推理间保持一致且 tiling 会改变--seq-length261 vs 256 vs 1024tokenizer 配套--tokenizer-type MultimodalTokenizer配合--tokenizer-prompt-format34B 用nvlm-yi-34b72B 用qwen2p0提示词模板来自 examples/multimodal/nvlm/nvlm_prompts.json视觉头数限制InternViT 的 25 个注意力头在 TP8 下会填充为 32 个虚拟头这是当前张量并行实现不支持不均匀切分所致VLM 处于活跃开发中Megatron 的 VLM 相关接口后续可能变化请以当前仓库 examples/multimodal/nvlm/README.md 与脚本为准。【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表