优雅谈大模型:白话ZeRO 下

2024-09-01 15:36
文章标签 优雅 模型 zero 白话 谈大

本文主要是介绍优雅谈大模型:白话ZeRO 下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习模型的复杂性和规模不断增长,分布式训练变得比以往任何时候都更加重要。训练具有数千亿参数的大型语言模型( 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 ,这些框架都提供并行方法的实现。

这篇关于优雅谈大模型:白话ZeRO 下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127346

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应