ARTICLE DETAIL

资讯详情

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

InternVideo分布式训练实战:SLURM多机多卡训练配置全拆解

InternVideo分布式训练实战:SLURM多机多卡训练配置全拆解 InternVideo分布式训练实战SLURM多机多卡训练配置全拆解【免费下载链接】InternVideo[ECCV2024] Video Foundation Models Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideoInternVideo 是上海 AI Lab 开源的视频基础模型Video Foundation Models系列项目覆盖从视频预训练、图文检索到动作识别的完整多模态理解链路。要在集群上训练这些模型几乎都会用到 SLURM 调度器。本文带你从零拆解 InternVideo 仓库中 SLURM 多机多卡训练配置的核心参数、两套提交模式和常见坑位帮助新手快速上手大规模分布式训练。 为什么视频模型离不开 SLURM 分布式训练视频基础模型的输入帧数多、参数量大单机 8 卡往往不够。InternVideo 系列InternVideo1 的 ViCLIP、InternVideo2 的 CLIP/多模态分支、InternVideo3 的微调框架都默认支持在 SLURM 集群上以多机 × 多卡方式启动 PyTorch 分布式训练单机 8 卡GPUS8、GPUS_PER_NODE8多机扩展例如GPUS16、GPUS_PER_NODE8即 2 台机器各 8 卡总进程数 16仓库中可以直接找到两类现成的 SLURM 提交脚本理解了它们基本就理解了学术集群上跑分布式训练的全套路。方案一srun 直接启动 SLURM 环境变量自动寻秩以 Open-Set-Action-Recognition基于 MMAction2 的动作识别下游任务为例核心脚本是 slurm_train.sh通过srun -p ${PARTITION}指定分区队列--gresgpu:${GPUS_PER_NODE}声明每节点 GPU 数--ntasks${GPUS}决定总任务数--ntasks-per-node${GPUS_PER_NODE}决定每节点任务数两者相除就是机器数--kill-on-bad-exit1保证任一进程退出时整个作业被终止避免僵尸节点浪费资源末尾--launcherslurm告诉训练程序按 SLURM 方式寻址配套还有 slurm_test.sh推理评测多一个 CHECKPOINT 参数和带完整命令行参数解析的 slurm_train 版本支持-p分区、--gpus、--gpus_per_node、--job_name等选项。调用方式非常简洁# 训练3 个位置参数 可选覆盖 tools/slurm_train.sh [PARTITION] [JOB_NAME] [CONFIG] [PY_ARGS] # 例sbatch 后在队列中跑 bash tools/slurm_train.sh dev internvideo_k700 configs/recognition/slowfast_r50.py方案二sbatch 提交 srun torchrun 弹性寻址以 ViCLIP 预训练 和 InternVideo2 多模态训练 为代表这是更工程化的两级提交结构第一级run.py负责组装 sbatch 命令tools/run.py 会自动创建输出目录VL_EXP_DIR/jobname并用rsync把当前代码复制一份进目录保证训练中代码不被改动可复现性保障拼接sbatch --output %j.out --nodes N --gpus-per-node G --job-name...命令其中%j.out是 SLURM 自动替换的作业号日志文件支持--dependency依赖作业完成后再启动适合先预训练、后评测的流水线按宿主机名自动匹配默认 SLURM 参数如-p gpu --mem240GB -c 64 -t 2-00:00:00适配不同集群第二级submit.sh负责寻主节点并启动 torchruntools/submit.shInternVideo2 中为 torchrun.sh做了关键三件事scontrol show hostnames $SLURM_JOB_NODELIST展开作业分配到的全部节点名取第一个为 master 节点srun ... hostname --ip-address探到主节点 IP拼出--rdzv_endpointIP:PORT默认端口 40000以srun torchrun --nnodes$nnodes --nproc_per_node$ngpus --rdzv_backendc10d启动训练让 torchrun 用 c10d 后端完成多机集合通信握手InternVideo2 的 stage2 预训练脚本 里按 1B/6B 模型规模分目录存放run.shconfig.py可直接参考其节点数与显存配比。 核心参数速查表参数出现位置含义新手建议PARTITION/-psrun / sbatch队列分区名问管理员如gpu、devGPUS--ntasksslurm_train.sh总进程数 总卡数机器数 × 每机卡数GPUS_PER_NODE--gresslurm_train.sh每节点申请 GPU 数一般填 8CPUS_PER_TASK--cpus-per-taskslurm_train.sh每个训练进程的 CPU 数数据增强重时建议 ≥5--kill-on-bad-exit1slurm_train.sh任一进程挂掉则杀全作业保持开启nnodes/ngpusrun.py机器数 / 每机 GPU 数多机扩展只需改nnodes--rdzv_endpointsubmit.sh主节点地址:端口脚本已自动探测一般不用管MASTER_PORTrun.py握手端口默认随机防冲突 底层原理SLURM 环境变量如何映射到 PyTorch RankViCLIP 的 utils/distributed.py 中的init_distributed_mode是最值得读的一段逻辑它展示了经典的手动寻秩方法SLURM_PROCID→ 全局 rank第几号进程跨机器从 0 开始SLURM_LOCALID→ 本地 rank本机第几号进程对应绑定的 GPUSLURM_NNODES × SLURM_TASKS_PER_NODE→ world_size总进程数使用 NCCL 后端、60 分钟超时初始化进程组当端口被占用时自动 10 换端口重试这套逻辑解释了为什么slurm_train.sh里只需要设对ntasks-per-node代码里就自动知道自己是谁。而 InternVideo3 的微调框架 xtuner/tools/train.py 则直接兼容了 torchrun 风格的RANK/WORLD_SIZE/LOCAL_RANK环境变量两种风格在仓库中并存读源码时可对照理解。⚠️ 新手高频坑位清单GPUS≠ 机器数GPUS是总卡数机器数 GPUS ÷ GPUS_PER_NODE提交前先心算一遍队列配额不足squeue查看队列--mem内存申请要覆盖每进程 CPU 数 × 数据缓存ViCLIP 默认按 240GB/64 核申请日志只去%j.out找run.py 已把 stdout/stderr 都重定向到作业号命名的.out文件多节点日志会混在一起注意区分 rank 0 的输出别删输出目录run.py检测到VL_EXP_DIR/jobname已存在会直接报错退出防止覆盖历史实验依赖作业名要对--dep_jobname指定的作业名必须与--jobname完全一致否则依赖判断失效 快速上手总结场景推荐脚本MMAction2 风格下游训练/评测tools/slurm_train.sh / tools/slurm_test.shViCLIP / InternVideo2 多模态预训练tools/run.py tools/submit.sh参考实际训练配置scripts/pretraining/stage2掌握ntasks/gres/cpus-per-task三件套 PROCID/LOCALID两个环境变量你就能读懂并修改 InternVideo 仓库里所有的 SLURM 训练入口了。【免费下载链接】InternVideo[ECCV2024] Video Foundation Models Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表