再议大模型微调之Zero策略

1. 引言

尽管关于使用Deepspeed的Zero策略的博客已经满天飞了,特别是有许多经典的结论都已经阐述了,今天仍然被问到说,如果我只有4块40G的A100,能否进行全量的7B的大模型微调呢?

正所谓“纸上得来终觉浅,绝知此事要躬行。”不能以“何不食肉糜?”来回复人家说,为啥不用4块80G的A100呢。我们也知道,如果手上有3090/4090级别的显卡,那基本上就是走lora训练,没有任何问题。如果有4块80G的A100,则闭眼走全量微调。但是如果有4块40G的A100呢?甚至说4块32G的V100行不行呢?

先说结论,可以!

2. 背景知识介绍

说到Deepspeed和Zero,相信大家对着一幅图一点都不陌生,被各个帖子广为传颂,用于介绍Zero-1/2/3之间的不同,非常形象直观,如果还想深入了解,参见《deepspeed官方介绍》(看一下,2021年Deepspeed就有这工具了,现在反而成了训练大模型的流行工具)。

在这里插入图片描述

2. 实验设置

我这里使用了1个50K样本的对话数据集,长度截断为1024,训练3个epoch,使用LLama_factory的脚本进行baichuan2的训练。其中zero_3的配置文件如下所示:

{"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","gradient_accumulation_steps": "auto","gradient_clipping": "auto","zero_allow_untested_optimizer": true,"fp16": {"enabled": "auto","loss_scale": 0,"loss_scale_window": 1000,"initial_scale_power": 16,"hysteresis": 2,"min_loss_scale": 1},"bf16": {"enabled": "auto"},"zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true},"offload_param": {"device": "cpu","pin_memory": true},"overlap_comm": true,"contiguous_gradients": true,"sub_group_size": 1e9,"reduce_bucket_size": "auto","stage3_prefetch_bucket_size": "auto","stage3_param_persistence_threshold": "auto","stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": true}
}

在4卡A100上,各个模式的训练情况如下:

模式batch大小显存占用最大GPU训练时间
Zero-3batch=2, accu=268GB15小时
Zero-3 offloading parambatch=2, accu=221G41小时
Zero-3 offloading optimizer+parambatch=2, accu=217G44小时
Zero-3 offloading optimizer+parambatch=4, accu=421G13小时
Zero-3 offloading optimizer+parambatch=8, accu=435G7小时

尽管使用了更大的batch_size可以更快地训练,但是最后一行需要50G的物理内存和100G的虚拟内存作为支撑。如果硬盘和内存的性能都不高的话,会更差一些。

因此,通过实验,我们可以知道,使用40G的A100也是可以训练的,但是通过offloading的方式可以将优化器和参数都存放到内存上,缓解显存占用情况。《Zero各个stage的状态详解》和《Zero的基础验算》会给出一个理论计算结果。

3. 其他一些训练小Tricks

3.1 使用offloading遇到AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam错误

这是由于cuda和cuda tookit的版本不一致造成的,理论上,nvidia-smi的cuda版本优先级比nvcc -V的cuda版本优先级要高,因此nvidia-smi的cuda是硬约束条件,需要保证nvcc -V的cuda版本<=nvidia-smi的cuda版本。在此基础上,就可以使用《deepspeed使用zero3 + offload报错》提供的方案:

export DS_SKIP_CUDA_CHECK=1

来解决这个错误,将此变为警告。

如果想本质解决这个问题,而又有管理员权限的话,可以考虑映射一下两者,具体参考《nvcc和cuda版本不一致问题怎么解决》。

3.2 使用offloading报错RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and CPU!

这是由于Deepspeed V0.14.1的BUG导致的,回退到V0.14.0即可。也可以参见DeepSpeed的issues。(这是一个好习惯,首先先看项目的Issue里有没有相关问题。)

3.3 训练策略

将batch_size设置为1,通过梯度累积实现任意的有效batch_size
如果OOM则,设置–gradient_checkpointing 1 (HF Trainer),或者 model.gradient_checkpointing_enable()
如果OOM则,尝试ZeRO stage 2
如果OOM则,尝试ZeRO stage 2 + offload_optimizer
如果OOM则,尝试ZeRO stage 3
如果OOM则,尝试offload_param到CPU
如果OOM则,尝试offload_optimizer到CPU
如果OOM则,尝试降低一些默认参数。比如使用generate时,减小beam search的搜索范围
如果OOM则,使用混合精度训练,在Ampere的GPU上使用bf16,在旧版本GPU上使用fp16
如果仍然OOM,则使用ZeRO-Infinity ,使用offload_param和offload_optimizer到NVME
一旦使用batch_size=1时,没有导致OOM,测量此时的有效吞吐量,然后尽可能增大batch_size
开始优化参数,可以关闭offload参数,或者降低ZeRO stage,然后调整batch_size,然后继续测量吞吐量,直到性能比较满意(调参可以增加66%的性能)

3.4 训练速度和显存需求

从左到右,越来越慢
Stage 0 (DDP) > Stage 1 > Stage 2 > Stage 2 + offload > Stage 3 > Stage 3 + offloads
从左到右,所需GPU显存越来越少
Stage 0 (DDP) < Stage 1 < Stage 2 < Stage 2 + offload < Stage 3 < Stage 3 + offloads

关于Zero-0/1/2/3/infinity的配置文件样例,参见《Deepspeed详解》和《分布式训练实践》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程状态与优先级

Linux内核源代码&#xff1a; 首先我们需要明确一点&#xff0c;Linux操作系统和操作系统的进程状态是不同的 上图大概标识了各个状态对应在操作系统的状态 普通进程 R运行状态&#xff08;running&#xff09;: 并不意味着进程一定在运行中&#xff0c;它表明进程要么是在…

ROS 2边学边练(44)-- 从头开始构建一个视觉机器人模型

前言 从此篇开始我们就开始接触URDF(Unified Robot Description Format&#xff0c;统一机器人描述格式)&#xff0c;并利用其语法格式搭建我们自己的机器人模型。 动动手 开始之前我们需要确认是否安装joint_state_publisher功能包&#xff0c;如果有安装过二进制版本的urdf_…

解密某游戏的数据加密

前言 最近有个兄弟通过我的视频号加我&#xff0c;咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注&#xff0c;于是通过抓包工具测试了下&#xff0c;发现数据有时候是明文&#xff0c;有时候确实密文&#xff0c;大致看了下有这几种加密&#xff1a;Md5aes、Md5&a…

网络层协议之 IP 协议

IP 协议格式 4 位版本&#xff1a;此处的取值只有两个&#xff0c;4&#xff08;IPv4&#xff09;和 6&#xff08;IPv6&#xff09;&#xff0c;即指定 IP 协议的版本。 4 位首部长度&#xff1a;描述了 IP 报头多长&#xff0c;IP 报头是变长的&#xff0c;因为报头中的选项部…

点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp

餐饮连锁v2版-体验后台&#xff08;复制粘贴以下地址到浏览器&#xff0c;打开网址即可登录&#xff0c;) 本文来自&#xff1a;点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp - 源码1688 演示后台&#xff1a;https://diancan.…

异构图神经网络——Heterogeneous Graph Neural Networks

相关代码见文末 1.回顾同构图 1.1 GNN GNN基本计算方法——邻接矩阵乘以节点,聚合相邻节点的特征,得到本节点的特征表达 1.2 Graph Attention Network 引入图注意力,实现边的权重可学习,最简单的方法是,将两个节点的特征进行拼接,使用一组可学习的权重参数映射为边的权…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

学习大数据,所需更要的shell基础(2)

文章目录 read读取控制台输入函数系统函数bashnamedirname 自定义函数Shell工具&#xff08;重点&#xff09;cutawk 正则表达式入门常规匹配常用特殊字符 read读取控制台输入 1&#xff09;基本语法 read (选项) (参数) ①选项&#xff1a; -p&#xff1a;指定读取值时的提示…

C++初识多态(1)

1.多态要解决的问题&#xff08;引入&#xff09; 任何一种机制的存在&#xff0c;必然是有其存在的意义的&#xff0c;例如我们前面学过的函数重载&#xff0c;运算符重载&#xff0c;以及引用等等&#xff0c;都是解决一些特殊问题的&#xff1b; 下面通过一些具体的例子&a…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…

剁手党必看——转转红包使用规则与最优组合计算全解析

​ 1、省钱攻略基础之“了解平台红包使用规则” 2、举个栗子 3、最优红包组合计算方法进化过程 3.1、初代“笛卡尔乘积”版 3.2、二代“边算边比较Map聚合”版 3.3、三代“边算边比较数组索引定位”版 4、总结 1、省钱攻略基础之“了解平台红包使用规则” 规则一&#x…

介绍 ffmpeg.dll 文件以及ffmpeg.dll丢失怎么办的五种修复方法

ffmpeg.dll 是一个动态链接库文件&#xff0c;属于 FFmpeg运行库。它在计算机上扮演着非常重要的角色&#xff0c;因为它提供了许多应用程序和操作系统所需的功能和组件。当 ffmpeg.dll 文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统崩溃。下面…

数据结构-线性表-链表-2.3-4

试编写在带头结点的单链表L中删除一个最小值结点的高效算法&#xff08;假设最小值结点是唯一的&#xff09;。 使用四个指针&#xff0c;p,pre,minp,minpre 用p从头至尾扫描单链表&#xff0c;pre指向*p结点的前驱&#xff0c;用minp保存最小结点的指针&#xff08;初始认为…

C#读sqlite数据库

using System.Data.SQLite;//若没有库需要在Nugut下载 private void ReadDatabase() { //判断有无数据库 if (!File.Exists(dbPath)) { SQLiteConnection.CreateFile(dbPath); MessageBox.Show(…

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

TCP长连接短链接

1、短连接 短连接是指通讯双方有数据交互时&#xff0c;就建立一个连接&#xff0c;数据发送完成后&#xff0c;则断开此连接&#xff0c;即每次连接只完成一项业务的发送。 2、长连接 长连接是指在一个连接上可以连续发送多个数据包&#xff0c;在连接保持期间&#xff0c;…

Nginx启动后IP加端口不能正常访问

背景介绍 新增NGINX配置文件后&#xff0c;重启nginx无法使用IP端口访问服务&#xff0c;域名可以访问服务。NGINX启动不报错&#xff0c;测试nginx配置文件nginx -t也没问题。 定位问题思路与步骤 查看NGINX配置文件 发现NGINX配置文件中的user是www user www www;查看N…

Linux中通过命令执行Shell脚本不生效问题

Linux中通过命令执行Shell脚本不生效问题 文章目录 Linux中通过命令执行Shell脚本不生效问题1. 执行.sh设置export不生效问题2. 可能导致的原因3. 解决方法1. 通过点(.)来执行shell脚本2. 通过source来执行shell脚本 1. 执行.sh设置export不生效问题 执行命令./script.sh后发现…

深度学习实战77-基于CNN+BiLSTM的异常用电行为的识别算法研究与实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战77-基于CNN+BiLSTM的异常用电行为的识别算法研究与实战。 在智能电网的快速发展背景下,电力系统的安全稳定运行显得尤为重要。异常用电行为,如非法窃电、设备故障导致的非正常耗电等,不仅影响电网的经济效益,还可能威胁…