当前位置: 首页 > news >正文

deepspeed多机多卡并行训练指南

文章目录

  • 前言
  • 离线配置训练环境
  • 共享文件系统
  • 多台服务器之间配置互相免密登录
  • pdsh
  • 多卡训练可能会碰到的问题
  • 注意
  • 总结


前言

我的配置:

7机14卡,每台服务器两张A800

问:为啥每台机只挂两张卡?
答:给我的就这样的,我倒希望单机8卡,不过这些服务器是云厂商提供的,据说都是PCIE连接,且单机最多只能挂四张卡。

服务器只允许内网访问,不能连接外网

因此,你需要先搞定如何离线配置训练环境

离线配置训练环境

具体可以参考:Anaconda 环境克隆、迁移

按照上面文章打包环境时,有可能碰到如下报错:
在这里插入图片描述
可通过增加参数--ignore-missing-files解决
如:conda pack -n 环境名 -o 新的环境名.tar.gz --ignore-missing-files

共享文件系统

正常来说,多机多卡训练,配置个共享文件系统是有很多好处的,比如数据集和模型你只需要存一份,更重要的是,在模型保存时,将模型保存到共享文件系统下,就不用保存多份模型,如果没有共享文件系统,你需要在每台服务器上都保存一份模型参数。

当你想要断点重训时,你需要手动合并每台机器上的优化器参数,非常麻烦。

如果真的没有共享文件系统,那怎么办?
解决办法:

方式1、在deepspeed里配置checkpoint参数的use_node_local_storage,如下:

"checkpoint": {"use_node_local_storage": true
}

怕大家不明白怎么加,这里给出一个deepspeed stage2的配置样例:

{"bfloat16": {"enabled": false},"fp16": {"enabled": "auto","loss_scale": 0,"loss_scale_window": 1000,"initial_scale_power": 16,"hysteresis": 2,"min_loss_scale": 1},"optimizer": {"type": "AdamW","params": {"lr": "auto","betas": "auto","eps": "auto","weight_decay": "auto"}},"zero_optimization": {"stage": 2,"allgather_partitions": true,"allgather_bucket_size": 2e8,"overlap_comm": true,"reduce_scatter": true,"reduce_bucket_size": "auto","contiguous_gradients": true},"gradient_accumulation_steps": "auto","gradient_clipping": "auto","steps_per_print": 1e5,"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","wall_clock_breakdown": false,"checkpoint": {"use_node_local_storage": true}
}

参数解释
在这里插入图片描述

原始文档:https://www.deepspeed.ai/docs/config-json/

方式2、增加在TrainingArguments中配置参数--save_on_each_node即可

其实,huggingface中的deepspeed插件文档已经对没有共享文件系统的情况做了说明,确实比较难找,位置:https://huggingface.co/docs/transformers/main/en/main_classes/deepspeed#use-of-nonshared-filesystem

在这里插入图片描述
以上两种方式,都可以解决没有共享文件系统导致无法断点重训的问题。

假如你已经使用了上面的配置,还有可能会的出现一个问题就是,当你使用resume路径去恢复训练时,你有可能卡在下图的位置:

在这里插入图片描述
代码一直卡在这,GPU有占用,GPU利用率也有显示,此时,你应该检查你的device_map是否为auto,如果不是,那肯定会卡在这

如果device_map="auto",但代码还是卡在这,可能的解决办法:在这里插入图片描述
这段图片参考自:deepspeed多机多卡训练踏过的坑

多台服务器之间配置互相免密登录

参考SSH远程登录:两台或多台服务器之间免密登录设置

这个是必须要做的,最好在一开始就做好,能节省很多时间。

pdsh

给每台服务器都安装pdsh,安装方法:

#下载解压
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pdsh/pdsh-2.29.tar.bz2 && tar -xf pdsh-2.29.tar.bz2 -C /root/pdsh
#编译安装
cd pdsh-2.29 && ./configure --with-ssh --enable-static-modules --prefix=/usr/local && make && make install
#测试
pdsh -V

把路径换成你自己的就行,若是离线服务器,你就先在有网的服务器下载好pdsh,再复制到离线的服务器去安装

多卡训练可能会碰到的问题

问题1:ninja已经安装,deepspeed 多机多卡RuntimeError: Ninja is required to load C++ extensions
答案1:
在训练代码的开头加入:

/root/anaconda3/envs/baichuan/bin:是服务器的conda虚拟环境的bin目录

local_env = os.environ.copy()
local_env["PATH"]= "/root/anaconda3/envs/baichuan/bin:" + local_env["PATH"]
os.environ.update(local_env)

问题2:libcudart.so.12.2: cannot open shared object file: No such file or directory
答案2:

1、检查文件libcudart.so.12.2是否存在(正常来说都是存在的),不存在该文件的话,需要重装cuda
2、在命令行执行 sudo ldconfig /usr/local/cuda-12.2/lib64

注意

执行训练的代码,每台机器上要有完全一致的一份,且存储的路径都要一致(包括软件的安装路径等),以免出现奇奇怪怪的报错,真的让人头秃

总结

真正跑过多机多卡训练的同学,应该能明白,这篇文章是有多细节了!毫不夸张地说,干货满满!希望各位可以点赞+收藏。

http://www.lryc.cn/news/148319.html

相关文章:

  • 9.Redis-zset
  • 云计算的三个主要服务模型:IaaS、PaaS 和 SaaS
  • spring ioc,DI,AOP概述
  • meethigher-Apache Poi 实现Excel多级联动下拉框
  • 基于食肉植物算法优化的BP神经网络(预测应用) - 附代码
  • FFDNet-pytorch版本代码训练教程
  • C语言练习7(巩固提升)
  • golangORM框架Gorm
  • Python项目实战之《飞机大战游戏》
  • Mysql数据库(2)—事务和锁
  • Shell - 加固系统配置
  • 【linux】记录archlinux软件包更新后lualatex无法编译的一种解决方案
  • 设计模式中的关系
  • C语言之数组题
  • DbContext是Entity Framework中的一个核心类
  • BTC价格预测:灰度突如其来的胜利是否会打破“九月魔咒”?
  • 软件测试/测试开发丨Selenium 高级控件交互方法
  • 算法通关村-----二分查找在二叉搜索树中的应用
  • 总结限流、降级与熔断的区别
  • windows下安装go环境 和vscode中go扩展+调试
  • 销毁 ECharts 图表
  • 并发编程的故事——Java线程
  • 菜鸟教程《Python 3 教程》笔记(13):迭代器与生成器
  • ceph架构及 IO流程
  • ssh 基本用法与免密登录
  • Unity3D 如何在ECS架构下,用Unity引擎进行游戏开发详解
  • Kotlin协程flow的debounce与管道Channel
  • 在JavaScript中,你可以使用多种方法来查找包含特定元素的数组或对象
  • 实力认证!OceanBase获“鼎信杯”优秀技术支撑奖
  • 分布式锁实现一. 利用Mysql数据库update锁