资讯动态

GongBU如何实现多GPU并行训练?DeepSpeed ZeRO与tmux任务编排的代码级解析

发布时间:2026/10/14 1:52:05 来源:尧图企业网站定制
【免费下载链接】GongBUPaper accepted by CIKM 2024. Codes of GongBU, a LLM fine-tuning platform for domain-specific adaptation.项目地址https://gitcode.com/gh_mirrors/go/GongBU点击查看免费下载GongBU 是一个开箱即用的大语言模型微调平台核心能力之一就是多GPU并行训练它用 DeepSpeed ZeRO 把模型状态切分到多张显卡上再借助 tmux 在后台编排、监控和停止每一个训练任务。本文带你从代码层面看懂这套机制是如何运转的 第一步自动分配 GPU 设备每个微调任务启动前fintune_manager.py 中的run()函数会先确定用哪些显卡用户选择auto时调用torch.cuda.device_count()把所有可用 GPU 全部投入训练用户指定了卡号如[0, 1]时则只使用指定设备。随后把卡号列表拼成CUDA_VISIBLE_DEVICES0,1环境变量注入到训练命令中保证 PyTorch 只能看见这几张卡不会越界抢占其他任务的设备。还有一个很巧妙的细节分布式端口按任务 ID 递增。accelerate launch --main_process_port 29500 task_id也就是说任务 3 用 29503 端口任务 4 用 29504 端口……多个微调任务可以同时在同一台机器上跑互不冲突。 另外命令中还会根据环境变量DISABLE_IB_P2P在 docker-compose.prod.yaml 中默认为 1注入NCCL_IB_DISABLE1 NCCL_P2P_DISABLE1用于规避 RTX 4000 系列显卡已知的 NCCL P2P 通信问题。DeepSpeed ZeRO把显存拆着花的三个阶段单卡放不下大模型怎么办GongBU 的答案是 get_deepspeed_config.py 里的这段配置路由器它根据用户勾选的ZeRO 阶段1/2/3和是否 CPU 卸载offload返回 5 份预设 JSON 之一用户选择配置文件切分内容Stage 1deepspeed_1.json优化器状态Stage 2deepspeed_2.json优化器状态 梯度Stage 2 offloaddeepspeed_2_off.json同上 优化器卸载到 CPUStage 3deepspeed_3.json优化器 梯度 模型参数Stage 3 offloaddeepspeed_3_off.json全部切分 参数/优化器卸载到 CPU用生活化的方式理解ZeRO 就像把一份大账单拆分给多个账户分摊。Stage 1每张卡只存自己那一份优化器状态Adam 的动量等是最轻量的一档Stage 2再叠加梯度切分配置中开启了allgather_partitions、reduce_scatter、overlap_comm和contiguous_gradients让通信与计算重叠、减少显存碎片deepspeed_2.json 是大多数场景的性价比之选Stage 3连模型参数本身也切分每卡只保留一小片权重能训练最大规模的模型代价是更多的通信offload 变体把优化器状态甚至参数搬到 CPU 内存deepspeed_3_off.json 中可见offload_optimizer/offload_param的device: cpu设置显存最省但速度最慢。配置中的train_batch_size、gradient_accumulation_steps等字段都写成autoDeepSpeed 会运行期从TrainingArguments自动读取无需手动同步。选定的配置文件路径最终在 finetune_script.py 中被传入TrainingArguments的deepspeed参数——这是整条链路里真正点火的一行。accelerate 分布式启动多卡并行如何落地在 fintune_manager.py 中当zero_optimization为真时启动命令是CUDA_VISIBLE_DEVICES0,1 micromamba run -n backend accelerate launch \ --main_process_port 29502 finetune_script.py --finetune_id 2accelerate launch会为每张可见的 GPU 各拉起一个进程DeepSpeed 接管跨进程的张量切分与通信而不开启 ZeRO 时则退化为单进程python直接运行。训练脚本里还有一处关键防御代码finetune_script.py检测到多于 1 张 GPU 时主动设置model.is_parallelizable True与model.model_parallel True防止 HuggingFace Trainer 再自作主张套一层 DataParallel——避免双重并行把显存吃爆。tmux 任务编排后台启动、实时日志、一键停止训练任务动辄跑几个小时GongBU 用 tmux 把它变成一个可管理的后台会话fintune_manager.py后台启动tmux new-session -d -s finetune_task_{id}创建名为finetune_task_1、finetune_task_2… 的独立会话每个任务一个互不干扰实时落盘日志紧接着执行tmux pipe-pane -o -t {session} cat {LOG_PATH}/{session}.log把终端输出逐字节实时写入日志文件LOG_PATH由 docker-compose.prod.yaml 配置为/logs。前端进度条和故障排查都依赖这份日志优雅停止用户在前端点停止时routers/finetune.py 的/stop/{id}路由stop()方法先发送tmux send-keys -t {session} C-c相当于按 CtrlC 让进程体面退出再tmux kill-session清理现场并把数据库中的任务状态标记更新。此外FinetuneManager采用单例模式 线程安全的 SafeDict用一个任务 ID → tmux 会话名的字典跟踪所有活跃任务防止同一任务被重复启动。训练脚本内部还内置了故障兜底一旦捕获到cuda out of memory或 NCCL 相关错误finetune_script.py会通过submit_fault上报对应故障码如cuda_oom并在平台的错误日志页留档——显存不够时降一档 ZeRO 或关闭 offload 之外还能去故障页看到根因。新手实操建议怎么选场景推荐配置原因7B 以下模型 LoRA1~2 张卡关闭 ZeRO 或 Stage 1显存够用少一层通信更简单7B~13B 模型多卡微调Stage 2梯度切分性价比最高显存告急但 CPU 内存充裕Stage 2/3 offload用速度换显存超大模型多卡Stage 3 offload参数也切分能吃下最大模型 新手排错口诀任务卡住先看/logs/finetune_task_{id}.log实时日志报cuda out of memory就提高 ZeRO 阶段或开 offload多卡通信报错就确认DISABLE_IB_P2P已启用。小结GongBU 的多 GPU 并行训练由三层协作完成CUDA_VISIBLE_DEVICES 做设备隔离、DeepSpeed ZeRO 做显存切分、tmux 做任务生命周期管理。三层各司其职让用户在浏览器里勾选几个选项就能安全地在多卡机器上并发跑多个微调任务——这正是这篇 CIKM 2024 论文中无代码微调体验背后的工程支撑。赞分享【免费下载链接】GongBUPaper accepted by CIKM 2024. Codes of GongBU, a LLM fine-tuning platform for domain-specific adaptation.项目地址https://gitcode.com/gh_mirrors/go/GongBU点击查看免费下载相关推荐DeepSpeed 训练场景自动张量并行AutoTP实战Tensor Parallel ZeRO 的混合并行配置与源码解析DeepSpeed 训练场景自动张量并行AutoTP实战Tensor Parallel ZeRO 的混合并行配置与源码解析 本教程面向希望在训练阶段把人工智能大模型深度学习分布式训练预训练强化学习模型优化LightEval社区贡献指南如何为开源LLM评估生态做贡献LightEval社区贡献指南如何为开源LLM评估生态做贡献 LightEval是一款功能强大的开源LLM评估工具包支持多种后端为开发者提供全面的大语言模DeepSpeed 训练优化完全指南分布式训练、混合精度、ZeRO 与多维并行DeepSpeed 训练优化完全指南分布式训练、混合精度、ZeRO 与多维并行 DeepSpeed 面向“训练先进深度学习模型”这一复杂系统工程问题通过轻量人工智能大模型深度学习分布式训练预训练强化学习模型优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑