【大模型02---Megatron-LM】

文章目录

  • Megatron-LM
    • 数据并行
    • 模型并行
      • 张量并行
      • 流水线并行
    • 3D并行


Megatron-LM

Megatron是当前大模型训练时经常使用的一种分布式并行框架,它通过采用DP,TP,PP等来加速模型的训练,反正就是一个字,好。
大模型在训练的时候,显存占用是非常大的,比如一个175B的模型,假设模型参数用FP32表示,即4Byte,那逛模型参数就要700G,梯度700G,Adam两个动量1400G,很明显,装都装不下,所以采用这些并行技术使得它可以在有限的资源下进行训练。

补充:Adam优化器:
主要是用来动态调整学习率和梯度更新的方向,每一次更新的时候需要保存其一阶矩和二阶矩,其中一阶矩是梯度的平均值,二阶矩是梯度的平方,主要用来动态调整学习率。一阶矩和二阶矩分别表示为m和v,其相对SGD训练更加稳定。每一次更新的时候,都需要依赖上一次的计算出的一阶矩和二阶矩,也就是每一个参数都对对应一个一阶矩和二阶矩。

数据并行

假设有N张卡,每一张卡都保存一个模型的副本,现在可以将一个batch的数据分割为多个mini-batch,然后分发给每一个模型副本,进行前向传播,并计算损失和梯度,然后通过All-Reduce操作进行通信和广播,对每一个GPU计算的梯度进行规约(同步加平均),然后将梯度分发给每一个GPU,每张卡独立更新,单独更新模型参数,此时由于更新的梯度相同,模型的初始参数相同,经过更新后,每一个GPU上模型的参数也相同。
但是这种数据并行有哪些限制呢?
第一个是可以使用的GPU数量受限于batch的大小,假设batch是64,那你最多也只能用64张卡了。
另一个就是GPU利用率可能拉不满,如果batch的数量固定式512,你GPU太多,分发给每一个GPU的数据量太小,那GPU 更新块,但是通信频率也就增加了,可能会限制训练速度。
在这里插入图片描述

所有 GPU 必须一起等到梯度计算完成,才能开始 all-reduce,否则会造成阻塞卡顿。 数据并行最适合模型较小、计算量大、batch size 较大时使用。模型较大或 GPU 太多时要考虑混合并行或 ZeRO 分布式技术。 All-Reduce 是一种通信操作,由 NCCL / MPI / Gloo 等通信库负责实现。它不是库,而是库提供的功能

模型并行

梯度累积:
主要是用来模仿大batch进行更新的操作,因为大batch更新往往更见稳定,但是受限于显存,所以可以用梯度累积的方式,当累积到固定数量的batch之后再进行优化器更新,它通过将多个小 batch 的梯度累加,然后在累积到设定的步数后进行一次更新,从而 模拟了大 batch 的梯度平均效果。

激活检查点:
主要是用来缓解激活值对显存的占用压力,因为按照反向传播公式,每一个参数更新时,都需要前一层的激活值,这样的话,每一次更新的时候就需要存储每一个节点的激活值,对显存的占用太高,所以就采用梯度检查点的方式,每隔一定的步数保存激活值,两个激活值之间的没有保存的激活值,通过前向传播再算出来,这也就是用时间换空间了,总的来说,现在所占用的空间复杂度降为 Q ( N ) Q(\sqrt{N}) Q(N ),相当于在更新的时候再做了一次前向传播。
这也是为什么模型在模型在训练的时候,不考虑激活值占用显存的问题,因为它可以通过技术原因绕过去。
在这里插入图片描述

张量并行

如果一个GPU装不下一整个模型,那么就可以对模型进行拆分,相当于横着或者竖着来一刀,一般来说,对于大矩阵的乘积计算,我们可以将其分成多个小矩阵的乘积和加和,根据拆分方式的不同可以分为行并行和列并行,一般来说,列并行更好一些,因为在计算激活值的时候不需要先进行通信。通信的原因还是GELU是非线性函数,需要根据全局的信息进行计算。
在这里插入图片描述
行并行:
在这里插入图片描述
列并行:
在这里插入图片描述
在这里插入图片描述

流水线并行

流水线并行通过将模型按网络层划分为多组,每一组在一个GPU上。
目前主流的流水线并行方法包括Gpipe和PipeDream,降低空泡率。Megatron用的时Visual pipeline.1F1B,一前向一反向。
实际上流水线并行和张量并行是正交的,可以同时存在。

3D并行

在这里插入图片描述
3D并行就是混合数据并行DP,张量并行TP和流水线并行PP。四路张量,四路流水线,2路数据

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

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

相关文章

魔百和网络机顶盒CM211-1硬件解析

先来个正面照 背面照 核芯 无线网卡 支持WiFi与蓝牙 硬盘 正面内存与背面内存

Kratos 与Golang Cms的关系

Kratos 与 Golang CMS 的关系 Kratos 是 Bilibili 开源的一款轻量级 Go 语言微服务框架,专注于构建高性能、可扩展的后端服务。虽然它本身并不是一个完整的 CMS(内容管理系统),但它可以用于开发 CMS 系统的后端或 API 服务。 我们的目标是提供全面的微服务开发技术。基于…

在vue3+vite中给 Video视频 添加字幕

Video视频 添加字幕 方式一: 使用 track标签template标签中css样式修改方式二:直接读取.vtt文件方式一: 使用 track标签 参考1:https://blog.csdn.net/weixin_42321819/article/details/112442773 参考2:https://blog.csdn.net/foren_whb/article/details/80810552 template标…

UE4手动实现billboard效果让物体始终面向相机正面

一个很简单的需求,但在网上竟然没查到。首先不能用FindLookAtRotation,因为这是用location算的,是让物体朝向相机的方向,而不是朝向相机的正面。区别如下图所示: 然后想用billboard component,不过这个原生…

在阿里云上搭建n8n

0.安装docker 0.1 删除Docker相关源 #删除Docker相关源 sudo rm -f /etc/yum.repos.d/docker*.repo #卸载Docker和相关的软件包 sudo dnf -y remove \ docker-ce \ containerd.io \ docker-ce-rootless-extras \ docker-buildx-plugin \ docker-ce-cli \ docker-compose-plug…

Qt中的OpenGL (4)[纹理]

文章说明 本文是学习OpenGL的笔记,主要参考大神JoeyDeVries的LearnOpenGL第六课《纹理》,并将教程中的代码基于Qt进行实现。 学习目标 掌握纹理基本知识掌握纹理贴图目录结构 |- |-- HelloTextures|--- hello_textures.cpp|--- hello_textures.h|--- main.cpp|--- CMakeLi…

【Java多线程从青铜到王者】阻塞队列(十)

阻塞队列 阻塞队列也是一种队列,先进的先出 阻塞队列就是对普通的队列做出的拓展 阻塞队列的特性 1.线程安全的,我们普通的队列值线程不安全的 2.具有阻塞的特性: a》如果针对一个已经满了的队列进行如队列操作的话,入队列操作就…

Python打卡第52天

浙大疏锦行 作业: 对于day41的简单cnn,看看是否可以借助调参指南进一步提高精度。 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import ma…

力扣100- 环形链表

方法一 遍历 循环链表&#xff0c;查找链表节点是否重复出现 public boolean hasCycle(ListNode head) {Set<ListNode> set new HashSet<>(); if (head null) return false; while (head ! null) {if (set.contains(head)) {return true;}set.add(head);head …

Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法

在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值&#xff0c;可通过以下步骤实现&#xff1a; 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置&#xff1a; xml 复制 下载 运行 <insert id"insertUser" para…

Meta发布V-JEPA 2世界模型及物理推理新基准,推动AI在物理世界中的认知与规划能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0

在全球科技竞争加剧和供应链安全日益重要的背景下&#xff0c;实现关键软硬件的全国产化替代已成为国家战略和产业共识。在这一背景下&#xff0c;触觉智能推出RK3576核心板,率先适配开源鸿蒙OpenHarmony5.0操作系统&#xff0c;真正实现了从芯片到操作系统的全栈国产化方案&am…

前端基础知识ES6系列 - 01(var、let、const之间的区别)

一、var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量 注意&#xff1a;顶层对象&#xff0c;在浏览器环境指的是window对象&#xff0c;在 Node 指的是global对象 var a 10; console.log(window…

Python Docker 镜像构建完整指南:从基础到优化

Python 是一门广泛使用的编程语言,在容器化环境中,构建和使用 Python 镜像是非常常见的任务。本文将提供一个完整的指南,包括选择基础镜像、制作流程、不同场景下的应用、安全性最佳实践以及镜像优化策略。 1. 选择合适的基础镜像 1.1 官方 Python 镜像 Docker Hub 提供了…

【狂飙AGI】第1课:大模型概述

目录 &#xff08;一&#xff09;大模型概念解析&#xff08;二&#xff09;大模型发展历程&#xff08;三&#xff09;大模型发展现状&#xff08;1&#xff09;OpenAI&#xff08;2&#xff09;微软&#xff08;3&#xff09;谷歌&#xff08;4&#xff09;Meta &#xff08;…

vite ts 配置使用@ 允许js

1.vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { fileURLToPath, URL } from node:url import setup_extend from vite-plugin-vue-setup-extend// https://vite.dev/config/ export default defineConfig({plugins: …

使用Ollama+open-webui搭建本地AI模型

本地搭建AI模型 说明&#xff1a;1、下载Ollama2、下载模型3、pip安装open-webui&#xff08;不推荐&#xff09;1、Python版本不对应2、下载wheels失败 4、docker安装open-webui 说明&#xff1a; 在windows上搭建本地AI&#xff0c;使用Ollamaopen-webui的方式&#xff0c;可…

第 87 场周赛:比较含退格的字符串、数组中的最长山脉、一手顺子、访问所有节点的最短路径

Q1、[简单] 比较含退格的字符串 1、题目描述 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 **注意&#xff1a;**如果对空文本输入退格字符&#xff0c;文本继续为空。 示例 …

linux安装阿里DataX实现数据迁移

目录 下载datax工具包(如果下载慢&#xff0c;请尝试其他国内镜像站或其他网站下载相应资源) 解压工具包到当前目录里 接着进入conf配置目录并创建一个myjob.json&#xff08;临时测试json&#xff09;&#xff0c;myjob.json内容如下&#xff0c;用于模拟test库tab1表数据同…

C++ 引用介绍

很好&#xff01;既然你有 C 的基础&#xff0c;那么理解 C 的「引用&#xff08;reference&#xff09;」会容易很多。我们来一步步讲清楚这个概念。 &#x1f31f; 一句话总结&#xff1a; C 引用&#xff08;reference&#xff09;就是已存在变量的“别名”&#xff0c;它不…