老规矩先贴官网代码:
https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md
但是我还是没有根据这个命令跑出来,所以还是上其他方法把,有简单的就用
背景知识补充:
LLama factory 多卡 ZeRO-3 、ZeRO-2、 ZeRO-0什么意思?以及为什么没有ZeRO1
【深度学习】多卡训练__单机多GPU方法详解(torch.nn.DataParallel、torch.distributed)
Step1:先把webUI服务起起来
Step2:在webUI上配置好你的模型、数据集、输出文件夹、(可选wandb见之前的帖子)
offload操作同理
此时预览训练命令行不在这里运行,网页端无法实现单机多卡!
Step3:打开bash,启动虚拟环境,粘贴以下命令
就像这样
用deepspeed的情况下报错处理:
-
可能会提示没有deepspeed这个库,pip install 一下即可
-
–deepspeed cache/ds_z3_config.json 这句话很可能会引起报错
- 不是所有的模型都支持deepspeed3!!
报错
这个错误表明你当前的配置存在冲突:
你正在使用 DeepSpeed ZeRO stage 3 优化
同时代码尝试使用 no_sync context manager 进行梯度累积
这两个功能是不兼容的,因为:
ZeRO stage 3 会对梯度进行分区处理
而 no_sync 管理器试图阻止梯度同步,这与 ZeRO stage 3 的工作方式冲突
解决方案:
1.修改 DeepSpeed 配置,使用较低的 ZeRO stage (比如 stage 2 或 1)
2.或者调整训练参数,避免使用梯度累积(gradient accumulation):
- examples/deepspeed/ds_z3_config.json这个文件的配置坑很多,有时候需要把auto替换成整数值
错误日志
要随便改成整数
补充offload是干嘛的:
DeepSpeed Offload 是一种技术,用于在训练大规模深度学习模型时,将部分计算任务或数据从 GPU 卸载到 CPU 或 NVMe 存储设备,从而缓解显存压力,优化资源利用。它主要包含两种类型:Optimizer Offload 和 Parameters Offload。
以下是详细说明:
1. 为什么需要 Offload?
训练大型模型(如 GPT-3 或其他数十亿参数的模型)时,显存可能成为瓶颈。即使使用分布式策略,显存需求仍可能超出硬件的限制。
Offload 技术通过将部分模型的状态或计算从显存转移到更大的主机内存(CPU RAM)或高速存储设备(NVMe),有效降低 GPU 显存占用,同时兼顾性能。
2. DeepSpeed Offload 的两种类型
(1) Optimizer Offload
- 功能:将优化器的状态(如动量、二阶动量等)和梯度计算任务从 GPU 卸载到 CPU。
- 优点:
- 显著减少 GPU 显存占用。
- 适用于需要训练超大模型但 GPU 显存不足的情况。
- 缺点:
- 由于 CPU 的内存带宽和计算能力低于 GPU,性能可能受到影响,尤其是在高算力需求的任务中。
- 适用场景:显存有限但有足够的 CPU 计算能力和内存。
(2) Parameters Offload
- 功能:将模型的参数从 GPU 显存卸载到 CPU 或 NVMe。
- 优点:
- 大幅减少显存占用,使得更大的模型可以被加载和训练。
- 在 NVMe 的支持下,理论上可以训练任意大小的模型。
- 缺点:
- 依赖 CPU 内存或 NVMe 的访问速度,可能会增加训练的延迟。
- 需要高性能 NVMe 和 I/O 设计,才能确保不会显著降低训练效率。
- 适用场景:极大模型(如 100B+ 参数模型)训练,GPU 显存远远不足。
3. DeepSpeed Offload 的实际工作原理
数据转移
- 优化器状态或参数被拆分后,根据配置,在 GPU 和 CPU 或 NVMe 之间进行动态转移。
- I/O 操作和计算任务通过异步方式进行,以减少训练过程中的等待时间。
性能优化
- DeepSpeed 使用高效的通信技术和内存管理策略(如 pipelining 和分块处理)来最小化数据传输的开销。
4. 配置示例
以下是典型的 DeepSpeed Offload 配置文件:
Optimizer Offload 示例
Parameters Offload 示例
5. 优缺点总结
6. 典型应用场景
- 研究机构或公司:需要训练超大规模模型,但硬件预算有限。
- 超大模型训练:例如 GPT-3、BLOOM 等需要数十或上百亿参数的模型。
- 多用户环境:在资源共享场景下优化显存使用效率。