优雅谈大模型:白话ZeRO 下

news2024/11/15 11:17:30

机器学习模型的复杂性和规模不断增长,分布式训练变得比以往任何时候都更加重要。训练具有数千亿参数的大型语言模型( LLMs )将是机器学习基础设施面临的挑战。与传统的分布式计算框架不同的地方在于GPU的分布式训练需要将数据传递给GPU芯片等物理硬件层。GPU设备之间会进行频繁、大规模的数据交换以进行高效训练,今天将揭开分布式训练的神秘面纱。

上图为基本的机器学习训练框架,数据准备占据1/3,训练占据1/3,将中间版本进行保存以及调整参数占据1/3。在模型的训练过程中,若读者拥有多片GPU,那么如何让这些GPU同时工作,目前有数据并行,模型并行以及管道并行。

数据并行

数据并行是跨多个 GPU 扩展模型训练最常用的方法之一。在这种方法中,每个GPU设备都需要存储全尺寸模型并处理不同批次的训练数据。除了存储模型和训练数据之外,每个GPU设备还保存临时结果,其中包括前向传播输出和梯度下降结果。

每个副本完成前向传递阶段后, NCCL All Reduce<白话ZeRO>会跨GPU节点同步模型参数,确保模型更新就像单个节点处理过所有批次数据。 

ZeRO数据并行<白话ZeRO>是对传统数据并行的增强,旨在减少 GPU内存使用。与每个GPU存储完整模型不同,ZeRO跨GPU分割模型参数。这种方法仍然是数据并行的一种形式,因为每一层的张量计算不会跨GPU分割。GPU负责持久化模型分片,并可以在完成必要的计算后丢弃它们。

这种方法显着减少了内存消耗,使得可以在相同的硬件上训练更大的模型。PyTorch 提供完全分片数据并行 ( FSDP ),它将模型参数、优化器状态和跨分布式数据并行 ( DDP ) 等级的梯度进行分片,因此进一步减少内存消耗。

模型并行

数据并行简单直接,同时可以将训练分布在多GPU。特别大的模型而言,即便仅仅加载大型模型的单层也会对GPU的内存带来很大的压力。

在单GPU上训练模型时,若模型超过GPU内存,则训练过程中需要频繁地通过HostToDevice操作在主机内存和GPU内存之间不断地交换模型参数。这种频繁的I/O操作会导致GPU空闲,从而拖累了整个训练过程。

张量并行是模型并行的一种,模型参数被分割到多个GPU,从而实现并行计算。模型参数具备矩阵运算特点,可以切分按行或按列划分,允许每个 GPU独立执行乘法操作。最终通过将不同的GPU计算的子结果合并就可以得到最终的运算结果,也可以充分的利用所有的GPU设备。下图很直观的展示将矩阵分割,两路并行计算。

管道并行

除了数据并行和张量并行之外,管道并行可以进一步提高训练期间的GPU利用率。在管道并行性中,模型根据其层被分为块,允许前向传播和后向传播分布在不同的GPU上。这种方法可能会导致GPU出现空闲等待时间。

若模型足够小,单个GPU能够搞定,则可以使用数据并行将其扩展到多个节点。随着模型大小的增加,可能需要张量并行才能将模型分布到单个节点内的多个 GPU 上。如果模型变得更大,可以在同一节点内应用张量并行,而在不同节点之间使用管道并行。

当然需要确保参与管道并行的节点位于同一网络等级内以实现最佳 I/O 性能至关重要。对于读者而言,小编建议先从数据并行入手,熟悉和感受下分布式训练方法。目前随着分布式计算越发的成熟,涌现出许多流行的训练框架,例如PyTorch Distributed Data Parallel ( DDP )、 DeepSpeed和Megatron-LM ,这些框架都提供并行方法的实现。

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

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

相关文章

JAVAEE初阶第二节——多线程基础(下)

系列文章目录 JAVAEE初阶第二节——多线程基础(下) 多线程基础(下) 单例模式阻塞式队列定时器线程池 文章目录 系列文章目录JAVAEE初阶第二节——多线程基础(下) 多线程基础(下) 一.多线程案例 1.单例模式1.1 饿汉模式 1.2 懒汉模式 1.2.1 懒汉模式-单线程版1.2.3 懒汉模式…

[Tools: LoRA] Diffusers中Stable Diffusion的实现

实现底层原理 Diffusers中的Attention操作实现在AttnProcessor类&#xff08;diffusers.models.attention_processor.py&#xff09;&#xff0c;里面定义了单次Attention操作。添加LoRA&#xff0c;本质上是用LoRAAttnProcessor类替换AttnProcessor类。LoRAAttnProcessor中新…

github和gitlab的区别是什么

区别&#xff1a;github如果使用私有仓库&#xff0c;是需要付费的&#xff1b;而gitlab可以在上面搭建私人的免费仓库。gitlab让开发团队对他们的代码仓库拥有更多的控制&#xff0c;相对于github&#xff0c;它有不少的特色&#xff1a;允许免费设置仓库权限&#xff1b;可以…

自然语言处理-词向量转换

文章目录 一、简介1.含义2.基本原理3.常见转换方法1&#xff09;. 独热编码&#xff08;One-Hot Encoding&#xff09;2&#xff09;. 词袋模型&#xff08;Bag of Words, BoW&#xff09;3&#xff09;. TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xf…

网络工程师学习笔记——局域网和城域网

传统局域网&#xff08;LAN&#xff09; 局域网的主要特征&#xff1a;由网络拓扑结构所采用的协议类型以及介质访问的控制方法 分组广播式网络&#xff0c;所有的工作站都连接到共享的传输介质上&#xff0c;共享信道的分配技术是局域网的核心技术 局域网常见的设备&#x…

Centos Stream9网卡驱动重置无法找到网卡解决办法

1.问题原因 使用Centos Stream9系统时&#xff0c;我们正常在/etc/NetworkManager/system-connections目录下修改网络配置文件保存后&#xff0c;重置网卡会发现提示无法连接或没有找到该网卡&#xff0c;此问题有以下几点原因&#xff1a; linux系统重管理网络连接的有netwo…

巧妙的数(逐倍数判断)

cin>>s; 若s串=1236 lens=s.size(),pd=1,ys=0,p[10]={} 0<=i< l 开始运算: P[1]=p[2]=p[3]=p[6]=true; //下标做标记 若 p[6]=ture,则p[2]=p[3]=ture,p[6]=false pd=1 9>=k>1 若pd%k!=0&&p[k]=ture时,则pd*=k;

开学季老师如何发布分班?

开学啦&#xff0c;老师们又要开始忙碌了。但是&#xff0c;别担心&#xff0c;现在有个超方便的工具&#xff0c;让分班这件事变得简单又快速。以前分班可是个大工程&#xff0c;得一个个手动处理&#xff0c;现在不一样了&#xff0c;有了易查分这个小程序&#xff0c;一切都…

不可思议!分享6款AI论文大纲提纲自动生成器,导师直夸好

在当今学术研究和写作领域&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅速发展为论文写作带来了革命性的变化。AI论文大纲生成器作为其中的重要工具&#xff0c;能够显著提高论文撰写效率和质量。本文将介绍六款AI论文大纲生成器&#xff0c;这些工具不仅能够帮助学…

如何使用Docker部署MySQL

一、查询镜像 使用如下命令“docker search mysql”即可查看docker仓库中所有的mysql的镜像。 使用了 docker search mysql 命令来搜索 MySQL 相关的 Docker 镜像。结果中列出了许多与 MySQL 相关的镜像&#xff0c;每个镜像都有名称、描述、星级评分&#xff08;表示受欢迎程…

yolo8 目标检测、鉴黄

省流 看前必读 别浪费时间 &#xff1a;本文只是一个记录&#xff0c;防止自己下次被改需求时浪费时间&#xff0c;在这里就随意的写了一下文章记录整个步骤&#xff0c;但是文章想必肯定没有对应的教程讲的详细&#xff0c;该文章只适合想要快速按照步骤完成一个简单的 demo 的…

存储系统总结

内存物理组成 SAM&#xff1a;顺序存取存储器&#xff0c;按照某种顺序存取&#xff0c;存取时间和在存储体上的物理位置有关系 DAM&#xff1a;直接存取存储器&#xff0c;先寻找一块小区域&#xff0c;接着顺序查找 RAM&#xff1a;随机存取存储器&#xff0c;存取时间与物理…

第8讲 ,ISP 串口程序下载

1 硬件的连接 需要使用 串口下载软件。 flymcu 这是 正点原子的 自启动电路。 2 stm32 的串口下载的原理 stm32 下载 只能是 串口一 &#xff0c; 也就是 PA9&#xff0c; PA10 3 然后是 stm32 的启动顺序 这里使用的是 第二种的 启动模式&#xff0c; 也就是 通过 串口进行烧…

Java 入门指南:Java 并发编程 —— Condition 灵活管理线程间的同步

Condition Condition 是 Java 并发编程中的一种高级同步工具&#xff0c;它可以协助线程之间进行等待和通信。提供了一种比传统的 wait() 和 notify() 更加灵活的方式来管理线程间的同步。Condition 接口通常与 Lock 接口一起使用&#xff0c;允许更细粒度的控制线程的等待和唤…

idea插件开发的第一天-写一个小Demo

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开发此插件提供便利Tools插件安装需…

Python爬虫案例五:将获取到的文本生成词云图

基础知识&#xff1a; # 词云图 wordcloud # 1、导包 jieba wordcloud import jieba from wordcloud import WordCloud data 全年经济社会发展主要目标任务圆满完成 data_list list(jieba.cut(data)) # print(data_list) # generator数据类型# 2、构造词云图样式 》虚拟的…

LabVIEW与Python联合图像处理

LabVIEW可以将图片作为参数传递给Python进行处理。可以通过LabVIEW调用Python脚本&#xff0c;并传递图片数据。以下是如何实现这个功能的基本思路&#xff1a; 1. 在LabVIEW中读取图像 首先&#xff0c;使用LabVIEW中的图像处理函数&#xff08;如NI Vision Development Modu…

多态【C++】

文章目录 概念概念虚函数 定义及实现构成条件虚函数的重写override和final重载/重定义&#xff08;隐藏&#xff09;/重写&#xff08;覆盖&#xff09;的区别 抽象类概念接口继承和实现继承 多态的原理虚函数表 多继承关系的虚函数表 概念 概念 通俗来说&#xff0c;就是多种…

用TCC来解决多个第三方系统数据一致性问题

对于做集成的公司来说&#xff0c;会集成各种第三方系统&#xff0c;要么是通过第三方系统的api&#xff0c;要么直接集成第三方系统的设备。如果是通过api集成&#xff0c;单次请求只调用一个三方系统没问题&#xff0c;同步调用就行&#xff0c;但如果同时要调用多个三方系统…

C++中AVL树的底层逻辑原理及其实现原理和过程

小编在学习完AVL树之后觉得AVL树的底层逻辑原理不是很难&#xff0c;在实现AVL树的过程中可能在调整过程中经过旋转调整会有点难&#xff0c;但是小编可以给大家讲解清楚&#xff0c;结合旋转过程的详细解图&#xff0c;相信大家一定可以学会并且理解AVL树的底层逻辑原理及其实…