大语言模型的工程技巧(三)——分布式计算
相关说明
这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。
本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练,是其获得成功的重要原因。
关于其他的工程技巧可以参考:
- 大语言模型的工程技巧(一)——GPU计算
- 大语言模型的工程技巧(二)——混合精度训练
关于大语言模型的内容,推荐参考这个专栏。
内容大纲
- 相关说明
- 一、概述
- 二、两种并行
- 三、数据并行
- 四、模型并行
- 五、代码实现
一、概述
本文将讨论如何巧妙地借助多台机器来优化模型训练和应用速度。在神经网络领域,常常利用GPU进行模型计算,以迅速提高计算效率。然而,正如大语言模型的工程技巧(一)——GPU计算所述,即使在同一台机器上,跨GPU的数据也无法直接运算。因此,对于分布式运算,多台机器之间的协作机制相当于不同GPU之间(不管它们是否在同一台机器上)的协作机制。为了表述简单,本节后续的讨论都只针对在多个GPU之间的分布式计算。
二、两种并行
模型计算的基础是计算图,因此,模型的分布式计算实质上就是在计算图层面进行分布式运算。关于这一主题,业界出现了两种截然不同的分布式计算方法,分别是数据并行(Data Parallelism)和模型并行(Model Parallelism)。数据并行,也就是梯度累积[TODO],它根据数据将计算图纵向切分,从而进行并行计算。与之不同,模型并行是将计算图的不同层放置在不同的GPU上进行计算。这可以被形象地理解为:数据并行将计算图从竖直方向切分,而模型并行从水平方向切分,如图1所示。
三、数据并行
在传统的观念里,模型的分布式计算意味着对数据的并行处理。这种方法的核心思想遵循著名的Map/Reduce框架1模式,如图2所示。首先,数据被智能地分发到各个GPU上。接着,完整的模型被逐一复制到每个GPU上。然后,这些GPU利用各自的数据进行向前传播和反向传播,这一系列步骤类似于“映射”(Map)操作。随后,执行“归约”(Reduce)操作(更确切地说是“All Reduce”操作2)。在这一阶段,算法将每个GPU上的反向传播梯度传递给其他GPU。简而言之,每个GPU都积累了所有GPU计算得出的梯度信息,能够独立地累加梯度,并进行后续的参数迭代更新。由于每个GPU上累加的梯度相同,因此在参数更新后得到的模型也是相同的。持续循环,直到得到最终的模型。这个过程确保了模型的并行训练和参数同步。
从每个GPU的角度来看,尽管每次迭代只处理批次数据中的一部分,但在Reduce阶段,通过梯度的传递,参与模型参数更新的梯度却基于整个批次的所有数据。换句话说,这个阶段汲取了批次中全部数据的智慧。这就好比一份试卷,一个班级的学生各自分工做不同的试题,然后相互交流答案,这样每个学生只解答了部分问题,却获得了全部答案。因此,即使硬件未经升级,GPU的学习速度也会更快,从而加速整个模型的训练过程。借助这种巧妙的分布式计算方式,我们能够汇聚个体的努力,更迅速地训练模型。
四、模型并行
近年来,随着模型规模的持续扩大,针对单个数据的模型计算量变得异常庞大,有时甚至超越了单个GPU的处理能力,导致计算难以进行。为了应对这一挑战,业界开始探索一种全新的分布式计算思路,即模型并行。如图3所示,将计算图的不同层分散到不同的GPU上,以神经网络为例,可以将神经网络的各层分配给不同的GPU。这样,每个GPU只需要负责模型的一部分,只有按照正确的顺序将它们串联在一起,才能构建出完整的模型。在计算过程中,前一个GPU的计算结果将成为后一个GPU的计算图输入,多个GPU合作完成一次计算图的计算。通过多个GPU的协同合作,我们能够有效地处理单个GPU难以胜任的大规模模型的计算。
模型并行不仅可以应对庞大的模型规模带来的挑战,还能够提升模型计算的速度。为了理解这一点,可以将模型并行的过程类比为流水线,GPU是流水线上的一环。如图3所示,在GPU:1处理第一份数据的同时,GPU:0已经开始处理第二份数据了。通过充分利用流水线的并行原理,整个模型的计算速度得到了显著提升。
五、代码实现
上述两种方法并非互斥的选择,而是可以将两者结合使用,以提升计算效率。例如,在数据并行的大框架下,当一台拥有多个GPU的机器对相应数据进行计算时,可以采用模型并行的策略将模型分散到不同的GPU上,从而进一步提升计算速度。
分布式计算本身相当复杂,除了涉及算法层面的代码实现,还涉及集群层面的构建和维护工作,如机器间的通信和错误恢复等。在这两个方面,PyTorch提供了出色的支持。在代码方面,PyTorch提供了3个优秀的封装工具3,分别是torch.distributed、torch.multiprocessing和torch.nn.parallel.DistributedDataParallel,可以帮助我们快速搭建分布式模型,具体的代码实现可以参考这个链接。在集群搭建4方面,PyTorch提供了torchrun工具,致力于更轻松地配置集群环境。
Map/Reduce框架是一种经典的分布式计算模式,整个计算过程分为两个关键阶段:Map和Reduce。它最初由Google提出,并在处理海量数据时取得了巨大成功。这个框架的设计思想旨在将复杂的任务分解成多个简单的子任务,分布在多台机器上并行执行(Map阶段),然后将结果合并(Reduce阶段)以得到最终的计算结果。 ↩︎
在经典的Map/Reduce框架中,Reduce操作只在选定的一台机器上进行,并非在全部机器上执行,因此这里的步骤被称为All Reduce。 ↩︎
这里涉及的3个工具都用于数据并行的情况,若要实现模型并行,则需要自行编写代码。幸运的是,具体的实现并不复杂,所涉及的核心流程是GPU计算中的数据复制。 ↩︎
对于用于机器学习的专用集群(通常为GPU集群),有一些更专业的工具可用于集群的搭建和管理,比如NVIDIA Bright Cluster Manager、Slurm等。这些工具旨在优化集群的性能,确保计算资源得到最大限度的利用。 ↩︎
相关文章:

大语言模型的工程技巧(三)——分布式计算
相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练,是其获得成功的重要原…...

AI开发初体验:昇腾加持,OrangePi AIpro 开发板
文章目录 一、前言二、板子介绍2.1 拆箱2.2 板子规格2.2.1 常规项目2.2.2 扩展项目2.2.3 操作系统 2.3 点板画面 三、AI程序初体验3.1 新奇的地方3.2 运行第一个AI程序3.2.1 硬件连接3.2.2 串口连接3.2.3 开启外部IP端口3.2.4 查询板子IP地址3.2.5 了解 juypter lab 启动脚本&a…...

微服务架构下Docker容器技术与Kubernetes(K8S)
Kubernetes、微服务和Docker容器技术的结合提供了一个强大、灵活且高效的平台,能够应对现代应用程序的复杂性和动态性。Kubernetes的自动化管理、服务发现、负载均衡和配置管理,与Docker的标准化打包和运行环境相结合,最大化地发挥了微服务架…...
风萧萧兮易水寒,壮士一去兮不复还 的 rm 命令
风萧萧兮易水寒,壮士一去兮不复还 的 rm 命令 风萧萧兮易水寒,壮士一去兮不复还 的 rm语法几个示例/bin/rm Argument list too long – Linux”配合find与xargs完成删除海量文件使用find的delete选项 快速删除大文件 风萧萧兮易水寒,壮士一去…...

How Diffusion Models Work
introduction intuition goal 让神经网络学到图像是什么样的,一种方式是对数据添加不同级别的噪音,让神经网络能够区分细节/总体轮廓 训练一个神经网络去产生精灵 sampling nn 图像恢复 论文 https://zhuanlan.zhihu.com/p/686235079...

antd table列选中效果实现
前言 开发中有一个需要呈现不同时间点各个气象要素的值需求,我觉得一个table可以实现这类数据的展示,只是因为时间点时关注的重点,所以需要列选中效果,清晰的展示时间点下的要素数据。我选择的是antd的table组件,这个…...

Golang实现文件复制
方法:三种 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy进行文件的复制,同时也会复制文件的所有权限 // param src 复制文件 // param des 目标文件 // return error 错误信息 func CopyFile(s…...

探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)
文章目录 文章导图Spring封装的几种线程池SpringBoot默认线程池TaskExecutionAutoConfiguration(SpringBoot 2.1后)主要作用优势使用场景如果没有它 2.1版本以后如何查看参数方式一:通过Async注解--采用ThreadPoolTaskExecutordetermineAsync…...

kubernetes(Jenkins、kubernetes核心、K8s实战-KubeSphere、)
文章目录 1. Jenkins1.1. 概述1.1.1. 简单部署1.1.2. 自动化部署1.1.3. DevOps概述1.1.4. CI/CD概述 1.2. jenkins介绍及安装1.2.1. 安装1.2.2. 解锁jenkins1.2.3. 安装推荐插件1.2.4. 创建管理员用户1.2.5. 升级jenkins版本1.2.6. 安装额外插件blue ocean1.2.7. jenkins界面说…...

国际数字影像产业园|科技与文创产品创意集市,共筑创新文化新高地
5月29日,为进一步增强园区与企业之间粘性,不断激发企业的创新活力,园区举办了“数媒大厦科技与文创产品创意集市活动”。本次活动由成都树莓信息技术有限公司主办,成都目莓商业管理有限公司、树莓科技(成都)…...

leetcode-55 跳跃游戏
leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人,从第一个下标开始,每次经过一个位置,我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…...

Vue——计算属性 computed 与方法 methods 区别探究
文章目录 前言计算属性的由来方法实现 计算属性 同样的效果计算属性缓存 vs 方法 前言 在官方文档中,给出了计算属性的说明与用途,也讲述了计算属性与方法的区别点。本篇博客只做自己的探究记录,以官方文档为准。 vue 计算属性 官方文档 …...

Java中的ORM框架——myBatis
一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象,Relational表示的是关系型数据库,Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系,这样就可以用面向对象的方式,…...

vue2生命周期和计算属性
vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…...

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发
一、概念 MapReduce是一个 分布式运算程序 的编程框架,是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 ,并发运行在一个 Hadoop集群上。 1、M…...

centos8stream 编译安装 php-rabbit-mq模块
官方GitHub:https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…...

「异步魔法:Python数据库交互的革命」(二)
哈喽,我是阿佑,上篇文章带领了大家跨入的异步魔法的大门——Python数据库交互,一场魔法与技术的奇幻之旅! 从基础概念到DB-API,再到ORM的高级魔法,我们一步步揭开了数据库操作的神秘面纱。SQLAlchemy和Djan…...
php正则中的i,m,s,x,e分别表示什么
正则表达式模式修饰符(也称为标志或模式修饰符)用于改变正则表达式的行为。这些修饰符可以附加在正则表达式的定界符之后,通常为正斜杠(/)或井号(#),以改变搜索或替换的方式。 1、i…...

最新!2023年台湾10米DEM地形瓦片数据
上次更新谷歌倾斜摄影转换生成OSGB瓦片V1.1版本,使用该版本生产了台北、台中、桃园三个地方的倾斜摄影OSGB数据,在OSGB可视化软件中进行展示,可视化效果和加载效率俱佳。已经很久没更新地形瓦片数据,主要是热点地区的原始数据没有…...
网络学习(11) |深入解析客户端缓存与服务器缓存:HTTP缓存控制头字段及优化实践
文章目录 客户端缓存与服务器缓存的区别客户端缓存浏览器缓存应用程序缓存优点缺点 服务器缓存优点缺点 HTTP缓存控制头字段Cache-ControlExpiresLast-ModifiedETag 缓存策略的优化与实践经验分享1. 使用合适的缓存头字段2. 结合使用Last-Modified和ETag3. 利用CDN进行缓存4. 实…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...