DeepSpeed:PyTorch优化库,使模型分布式训练能高效使用内存和更快速

简介

DeepSpeed是一个PyTorch优化库,它能让大模型的分布式训练更加节省内存和更快速。它的核心是ZeRO,ZeRO让大规模的训练大模型成为可能。ZeRO有以下几个工作状态:

  • ZeRO-1:通过多个GPU进行 优化器状态 分布计算
  • ZeRO-2:通过多个GPU进行 梯度 分布计算
  • ZeRO-3:通过多个GPU进行 参数 分别计算

在GPU受限的环境下,ZeRO可以将优化器内存和计算从GPU卸载到CPU从而利用单个GPU训练大模型。DeepSpeed 已经集成到Transformers Trainer里面完成ZeRO所有的状态和卸载。我们需要做的只是提供一个配置文件或者使用一个已经提供好的文件模版。针对推理,Transformers支持ZeRO-3和卸载,从而允许加载超大模型。

本文将会告诉我们如何通过DeepSpeed进行训练,哪些特征我们可以启用,如何去配置不同的ZeRO状态、卸载、推理,并在不使用Trainer的情况下使用DeepSpeed。

安装

DeepSpeed可以通过PyPI或者Transformers 进行安装,具体如下:

pip install deepspeed
pip install transformers[deepspeed]

如果在安装DeepSpeed的时候遇到了困难,可以查看指导手册: DeepSpeed CUDA installation。当然DeepSpeed也可以通过PyPI包进行安装,这也是我们极力推荐的安装方式,通过源码 install it from source 进行安装能最好的适配我们的硬件和支持某些特性,比如1-bit Adam,这个通过PyPI安装是不可用的。

内存要求

在我们开始之前,一个好的策略是,检测一下我们是否有充足的GPU和CPU内存够加载我们的模型。DeepSpeed提供了一个工具来评估需要的CPU/GPU内存。例如,评估单个GPU上面运行bigscience/T0_3B模型需要的内存:

$ python -c 'from transformers import AutoModel; \
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live; \
model = AutoModel.from_pretrained("bigscience/T0_3B"); \
estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=1, num_nodes=1)'
[...]
Estimated memory needed for params, optim states and gradients for a:
HW: Setup with 1 node, 1 GPU per node.
SW: Model with 2783M total params, 65M largest layer params.
  per CPU  |  per GPU |   Options
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=1
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=0
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=1
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=0
    0.37GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=1
   15.56GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=0

num_gpus_per_node=1:一台机器上面有几个GPU卡

num_nodes=1:当前集群有几台机器

上面的评估结果显示;要么我们选择单个80G GPU不需要CPU资源,要么选择8GP GPU和 0~60GB CPU的装载。(这里的内存仅仅是参数、优化器状态和梯度的消耗,我们还需要考虑CUDA内核和活动消耗的内存)我们需要在成本和速度上做一下取舍,如果我们使用一个比较小的GPU就需要占用比较多的时间来训练我们的模型。

如果我们有充足的GPU内存来确保我们不用CPU/NVMe装载,那一切都是最快的。

选择ZeRO状态

当我们安装好DeepSpeed,并对使用我们自己的内存需求有一个大致的了解后,下一步就是选择要使用哪种ZeRO状态。为了更快和更有效率的使用内存:

FastestMemory efficient
ZeRO-1ZeRO-3 + offload
ZeRO-2ZeRO-3
ZeRO-2 + offloadZeRO-2 + offload
ZeRO-3ZeRO-2
ZeRO-3 + offloadZeRO-1

选择一个最适合我们的组合,最开始我们使用最快的组合直到我们出现OOM,然后选择下一个状态,它将会慢一点但是更节省内存。从节省内存或者最快速度可以随意的选择哪一种,最终选择一个最适合的速度和内存使用的平衡点。

一个通常的步骤供我们借鉴(从 batch size 等于 1 开始):

  1. 开启梯度 checkpointing
  2. 尝试ZeRO-2
  3. 尝试ZeRO-2 和 卸载优化器
  4. 尝试ZeRO-3
  5. 尝试ZeRO-3和 卸载参数到CPU
  6. 尝试ZeRO-3 和 卸载 参数和优化器到CPU
  7. 尝试降低各种默认值,比如:如果我们使用了generate()方法,则收窄搜索窗口
  8. 尝试在完全精度权重中混合半精度(在老的GPU架构上用FP16和在Ampere上使用bf16)
  9. 使用更多的硬件,或者将 参数和优化器卸载到NVMe
  10. 一旦我们不在出现OOM,调节有效吞吐量,然后增加 batch size 直到我们将GPU效率最大化
  11. 最后,尝试优化我们训练的启动参数:禁用一些卸载特性或者使用更快的ZeRO阶段,增加/减小 batch size 来发现速度和内容使用的最佳平衡点。

下一篇文件将会介绍DeepSpeed配置文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

函数指针示例

目录&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…

间接采购管理:主要挑战与实战策略

间接采购支出会悄然消耗掉企业的现金流&#xff0c;即使是管理完善的公司也难以避免。这是因为间接支出不直接关联特定客户、产品或项目&#xff0c;使采购人员难以跟踪。但正确管理间接支出能为企业带来显著收益——前提是要有合适的工具。本文将分享管理间接支出的关键信息与…

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上)&#xff1a;成熟可靠的传输层协议-CSDN博客 &#x1f95d;在上篇博客中&#xff0c;我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨&#xff0c;提供了初步的理解和概览。本…

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

python实现十进制转换二进制,tkinter界面

目录 需求 效果 代码实现 代码解释 需求 python实现十进制转换二进制 效果 代码实现 import tkinter as tk from tkinter import messageboxdef convert_to_binary():try:# 获取输入框中的十进制数decimal_number int(entry.get())# 转换为二进制binary_number bin(de…

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…

ubuntu使用DeepSpeech进行语音识别(包含交叉编译)

文章目录 前言一、DeepSpeech编译二、DeepSpeech使用示例三、核心代码分析1.创建模型核心代码2.识别过程核心代码 四、交叉编译1.交叉编译2.使用 总结 前言 由于工作需要语音识别的功能&#xff0c;环境是在linux arm版上&#xff0c;所以想先在ubuntu上跑起来看一看&#xff…

阿里云引领智算集群网络架构的新一轮变革

阿里云引领智算集群网络架构的新一轮变革 云布道师 11 月 8 日~ 10 日在江苏张家港召开的 CCF ChinaNet&#xff08;即中国网络大会&#xff09;上&#xff0c;众多院士、教授和业界技术领袖齐聚一堂&#xff0c;畅谈网络未来的发展方向&#xff0c;聚焦智算集群网络的创新变…

PyQt5 加载UI界面与资源文件

步骤一: 使用 Qt Designer 创建 XXX.ui文件 步骤二: 使用 Qt Designer 创建 资源文件 步骤三: Python文件中创建相关类, 使用 uic.loadUi(mainwidget.ui, self ) 加载UI文件 import sys from PyQt5 import QtCore, QtWidgets, uic from PyQt5.QtCore import Qt f…

7.高可用集群架构Keepalived双主热备原理

一. 高可用集群架构Keepalived双主热备原理 (1)主机+备机keepalived配置(192.168.1.171) ! Configuration File for keepalivedglobal_defs {# 路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_101 } #计算机节点(主机配置) vrrp_instance VI_1 {</

RHCE的学习(19)

对于RHCE的学习&#xff08;15-18&#xff09;重点总结 详细的操作还是要看之前的笔记&#xff08;甚至是RHCSA的笔记&#xff09; 1.什么是shell 一种命令解释器&#xff0c;既是用户交互的界面&#xff0c;也是控制系统的脚本语言 2.shell解释器的类型 &#xff08;bash--sh&…

微服务即时通讯系统的实现(客户端)----(2)

目录 1. 将protobuf引入项目当中2. 前后端交互接口定义2.1 核心PB类2.2 HTTP接口定义2.3 websocket接口定义 3. 核心数据结构和PB之间的转换4. 设计数据中心DataCenter类5. 网络通信5.1 定义NetClient类5.2 引入HTTP5.3 引入websocket 6. 小结7. 搭建测试服务器7.1 创建项目7.2…

【功耗现象】com.gorgeous.lite后台Camera 使用2小时平均电流200mA耗电量400mAh现象

现象 轻颜相机(com.gorgeous.lite)后台Camera 使用2小时平均电流200mA(BugReport提供的电流参考数据),耗电量400mAh 即耗电占比(200mA*2h)/(12.83h*52.68mA )400mAh/623mAh62% CameraOct 10 202321:03:08 - 23:03:372h16m15s859ms to 4h16m44s984msactive duration: 2h 0m 29…

蓝桥杯每日真题 - 第15天

题目&#xff1a;&#xff08;钟表&#xff09; 题目描述&#xff08;13届 C&C B组B题&#xff09; 解题思路&#xff1a; 理解钟表指针的运动&#xff1a; 秒针每分钟转一圈&#xff0c;即每秒转6度。 分针每小时转一圈&#xff0c;即每分钟转6度。 时针每12小时转一圈…

ctfshow-web入门-SSRF(web351-web360)

目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数&#xff0c;很典型的 SSRF 尝试使用 file 协议读文件&#xff1a; urlfile:///etc/passwd 成功读取到 /etc/passwd 同…

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…

2024-11-16-机器学习方法:无监督学习(1) 聚类(上)

文章目录 机器学习方法&#xff1a;无监督学习&#xff08;1&#xff09; 聚类&#xff08;上&#xff09;1. 聚类的基本概念1.1 聚类的概念1.2 聚类的功能1.3 聚类的算法 2. 相似度或距离2.1 闵可夫斯基距离2.2 相关系数2.3 夹角余弦 3 类或簇3.1 类的特征 4 类与类之间的距离…

Vue-组件三大组成组件通信

一、学习目标 1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法 父传子 子传父 非父子通信&#xff08;扩展&#xff09; 3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09; 拆…

Scratch 014生日贺卡(上)

知识回顾&#xff1a; 1、“面向鼠标指针”积木块 2、“重复执行直到”积木块 本次分享制作生日贺卡引入广播模块 案列效果&#xff1a; 生日贺卡上案例效果-CSDN直播 步骤拆解&#xff1a; 1、添加背景和角色 2、编辑贺卡造型添加名字 3、流程图的组成和画法 4、…

MySQL中将一个字符串字段按层级树状展开

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式&#xff1a; 1.分析 1.他的层级个数是不确定的&#xff0c;也就是说有的有2层有的有5…