本书聚焦大规模深度学习的实现与扩展,围绕软件、硬件与数据的融合展开,构建了从基础到进阶的完整知识体系。全书共13章,分为三大部分:第一部分 深度学习基础 讲解深度学习数据流、计算图、硬件架构等核心概念,通过Python和PyTorch动手练习帮助读者理解模型开发与性能分析;第二部分 分布式训练 深入分布式系统通信、数据并行、模型并行等关键技术,提供多场景动手实践;第三部分 极限扩展 探讨以数据为中心的扩展、实验管理、大模型微调与基础模型开发,覆盖LoRA微调、数据质量优化等前沿内容。整体以理论+实践为核心,配套GitHub代码仓库,助力读者掌握高效扩展深度学习项目的技术与方法。
前言
我的职业生涯始于软件工程师。在此期间,我对大规模软件和系统运维产生了浓厚兴趣。我学习了分布式系统的相关知识,包括系统性能、系统优化以及可靠地规模化运行分布式系统。随后,我在工作中担任了多个角色:作为开发运维工程师,开发与运维软件系统;作为机器学习运维工程师,开发支持智能软件的辅助系统;作为机器学习工程师,部署大规模深度学习推理和开发用于深度学习的数据引擎;作为数据科学家和机器学习专家,为医疗健康和商业决策等关键领域开发多任务、多目标模型。
自从投身智能系统的构建,深度学习已成为我工作的重心。以深度学习为代表的智能系统因具有高效解决大规模问题的能力而广受青睐。然而,构建此类系统异常复杂,不仅涉及算法和数学,更关乎硬件、软件、数据与深度学习(算法以及相关技术)的相互交叉。我自认为很幸运,因为通过多个岗位的经验积累,我深入理解并细致掌握了构建和管理大规模深度学习人工智能系统的知识和方法。这些知识难以轻易获取和掌握,因为硬件、软件和数据领域的复杂程度不亚于深度学习本身。
本书旨在普及相关知识,使各类机器学习从业者,不论是不是机器学习工程师,都能够在深度学习领域得心应手。鉴于这些知识较为零散,我希望将其整合成一个系统的知识体系。这一知识体系将为你扩展深度学习的规模提供理论和实践指导,免去大量探索过程。
扩展的重要性
深度学习与扩展密不可分。深度学习能够扩展目标,从单一任务扩展至多任务、从单一模态扩展至多模态,从单一类别扩展至数千类别。只要具备可扩展的硬件、海量数据,而且所编写的软件具备扩展能力并能够高效利用所有可用的资源,一切就皆有可能。
扩展很复杂且有代价。开发一个深度学习系统需要包含很多个网络层的深度神经网络、海量的数据和能够处理计算密集型工作的硬件。扩展要求理解整个系统的弹性不仅是模型,还包括整个深度学习技术并能适应系统弹性接近极限的情况。这也是本书的另一个创作动机:帮助读者深入了解所开发的系统,明白系统何时可能会出问题,以及如何避免不必要的故障。
目标读者
本书旨在帮助读者深入理解深度学习技术,尤其是深度学习与硬件、软件和数据的交互方式。当需要扩展深度学习模型时,无论是增加硬件资源、扩大数据规模,还是提升模型的容量,本书都将是一个宝贵的参考资料。效率是所有扩展操作的核心,因此本书通篇贯穿了对效率问题的探讨,为读者提供有效扩展所需的知识和资源。
本书适合各类机器学习从业者阅读,包括工程师、数据工程师、机器学习运维人员(MLOp)、深度学习科学家、机器学习工程师,以及对大规模模型开发感兴趣的人士。本书假设读者已掌握深度学习基本概念,例如,优化器、目标函数与损失函数、模型组装与编译等,并在模型开发方面具备一定的经验。此外,熟悉Python和PyTorch对理解本书中的动手练习部分至关重要。
鉴于大规模深度学习的复杂性和广泛性,本书主要聚焦模型开发和模型训练的横向扩展,尤其着重探讨分布式训练。虽然本书前几章的内容可能对模型的部署和推理有所帮助,但推理的扩展不在本书的讨论范围之内。本书涵盖的主题包括:
模型如何被分解为计算图,以及在训练过程中数据如何在计算图中流动。
关于浮点数鲜为人知却美妙的故事,以及这些深度学习中的希格斯玻色子如何实现内存的高效利用。
加速计算如何提升训练速度,以及如何充分利用现有硬件资源。
如何利用分布式训练范式(即数据并行、模型并行、流水线并行和混合多维并行)来训练模型。本书还将介绍联邦学习及其所面临的挑战。
如何协同运用PyTorch生态系统、英伟达库和Triton以实现模型训练的扩展。
如何调试、监控并查找在训练过程中制约模型扩展的瓶颈问题。
如何加速训练周期、精简反馈流程以实现模型的迭代开发和与之相关的最佳实践。
数据处理的技巧与方法,以及如何在资源受限的情况下将其用于扩展模型训练。
如何为深度学习项目挑选合适的工具与技术。
大规模运行时管理计算资源的策略。
本书结构
本书开篇是一个介绍性章节,随后12章分为三部分,涵盖深度学习基础、分布式训练和极限扩展。各章内容基于前述概念、基础与原理逐层递进,旨在全面系统地提供深度学习知识,使读者能够高效地横向扩展训练工作负载的规模。
导论
第1章阐述与扩展时机有关的理论框架,并探讨在扩展过程中所面临的挑战。本章还将介绍深度学习的发展历程,以及规模扩展如何成为推动深度学习成功的关键因素。
第一部分:深度学习基础
第2章从计算图和数据流的角度介绍深度学习。本章将通过Python的基础练习阐释深度学习内部运行机制,对机器学习初学者来说,本章颇有裨益。资深从业人员可酌情跳过本章。
第3章深入探讨电子计算和硬件的内部运行机制,阐述计算能力的实现和扩展方法。本章还将详细介绍当今可用的各类加速硬件,为选择最适合项目的硬件提供所需的知识。
第4章将深度学习的基础知识整合起来,针对如何为具体任务构建高效且有效的智能系统,以及如何对其进行衡量和监控,提供更具实践性的指导。本章还将介绍图编译技术和一系列内存技巧,帮助读者掌握构建高效智能系统所需要的知识。
第二部分:分布式训练
第5章介绍分布式系统的基础知识,深入剖析不同类型分布式系统以及各种系统所面临的挑战。通信是分布式系统的一个关键要素,本章将从深度学习的角度对其进行阐述。本章还将介绍一些用于扩展硬件资源以实现分布式计算的方案和工具,以及用于扩展的加速硬件。
第6章深化第5章的内容,阐述分布式深度学习的理论基石。本章将介绍多种分布式深度学习的训练方法,并提供选择这些方法的决策框架。
第7章深入探讨分布式数据并行的细节,并提供一系列使用这些技术的实用练习。
第8章在数据并行之外,提供模型训练扩展的基础知识和实用技能。本章将介绍模型并行、流水线并行和多维混合并行,并通过动手练习让读者亲身体验这些技术的局限与挑战。
第9章将综合第二部分的所有内容,就如何高效地实现多维并行为读者提供相关知识和见解。
第三部分:极限扩展
第10章提供一种以数据为中心的视角,介绍多种充分利用数据的技术。本章还将阐述如何通过采样和选择方法提升数据流水线的效率。
第11章聚焦实验扩展,并提供实验规划和管理方面的见解。当进行多项实验并希望寻找性能最佳的模型时,本章将对此提供有价值的信息。本章内容涵盖模型微调、专家混合模型、对比学习等技术。
第12章探讨大模型的低秩微调技术,并提供一个动手练习。
第13章勾勒基础模型的概念框架,并概述这一持续发展的领域。
使用须知
运行本书代码示例需要一台至少配备16核CPU和16 GB(最好32 GB)内存的设备。本书第二部分的大多数练习需要硬件加速,某些练习需要多GPU(推荐英伟达GPU)系统。大部分练习的代码不依赖任何一个具体平台,并且本书会提供一个Dockerfile文件,列出运行这些练习所需的依赖项。
配置动手练习环境
本书配套的GitHub仓库( />第二部分的部分练习会有特殊说明,这些说明会针对相关的练习提供必要的解释。
排版约定
本书使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如,变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或由上下文确定的值替换的文本。
该图示表示提示或建议。
该图示表示一般性说明。
该图示表示警告或注意。
示例代码
可以从 />这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系OReilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布OReilly的示例代码则需要OReilly出版社的许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处时包含书名、作者、出版社和ISBN,例如:
Deep Learning at Scale,作者Suneeta Mall ,由OReilly出版,书号978-1-098-14528-6
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。
OReilly在线学习平台(OReilly Online Learning)
40多年来,OReilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和创新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。OReilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及OReilly和200多家其他出版商提供的大量教材和视频资源。有关的更多信息,请访问 />如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
OReilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至errata@oreilly.com.cn。
本书配套网站 />关于书籍、课程的更多新闻和信息,请访问我们的网站 />我们在LinkedIn上的地址: />我们在YouTube上的地址: />致谢
感谢我挚爱的家人们,他们在本书的创作过程中给予我坚定不移的支持和理解,对我而言,意义重大。衷心感谢我的丈夫,他的耐心和鼓励支撑着我前行。感谢我出色的孩子们,他们对学习的热情和好奇心每天都激励着我。本书是我们共同的成果。
感谢我的爸爸妈妈和公公婆婆,他们的爱、智慧、无尽的鼓励和坚定不移的信念一直是这段旅程的指路明灯。感谢我的兄弟,他的毅力无可匹敌,不断激励着我。谨以本书献给所有人。
感谢深度学习开源社区,衷心感谢全球开源社区慷慨分享知识与成果、共同协作提升了人工智能系统在实际应用中的水平。是他们在深度学习领域对创新和开放性的不懈追求,带来了革命性的变革。
由这些社区共同构建的知识、工具和资源不仅塑造了本书,更变革了机器学习的格局。我对开源社区的贡献深表感激。没有开源社区,这项工作不可能完成。我怀着无比欣喜的心情,将本书献给开源社区!
谨向敬业的技术审阅人员和编辑团队致以诚挚的谢意,他们的宝贵意见和卓越奉献让我十分感激。特别感谢技术审阅人员Tim Hauke Langer、Giovanni Alzetta、Satyarth Praveen和Vishwesh Ravi Shrimali,以及本书编辑Sara Hunter,他们的指导和建议极大地提升了本书质量。同时也要感谢策划编辑Nicole Butterfield在确定本书方向上给予的支持和指导。
Suneeta Mall是harrison.ai(一家由临床医生主导的人工智能医疗科技企业,专注于攻克重大医疗健康问题)人工智能工程部负责人。她曾任职于IBM、Expedia、悉尼大学、Nearmap,拥有扎实的计算机科学与工程专业背景。
李波,现为哈尔滨工程大学智能科学与工程学院副教授,之前曾担任加拿大麦克马斯特大学计算机与电气工程系目标跟踪与信息融合实验室科研工程师、在加拿大纽昂斯通讯公司自然语言理解应用研究软件工程师 4. 201~-2019加拿大赛伦斯科技公司语言专家,技术方向:自然语言处理、机器学习、人工智能;雷达信号处理、阵列信号处理。
目录
前言1
第1章 自然和历史在规模方面给予我们的启示9
1.1 扩展的哲学9
1.1.1 通用扩展定律10
1.1.2 通用扩展定律的历史10
1.2 可扩展系统12
1.2.1 作为可扩展系统的自然界12
1.2.2 人类视觉系统的生物学启示13
1.3 人工智能:可学习系统的演进13
1.3.1 四者协作14
1.3.2 深度学习的发展趋势22
1.4 深度学习中的扩展26
1.4.1 六大开发考虑因素26
1.4.2 扩展考量30
1.5 本章小结36
第一部分 深度学习基础
第2章 深度学习39
2.1 深度学习中数据的作用39
2.2 深度学习中的数据流40
2.3 动手练习#1:实现极简深度学习43
2.3.1 开发模型43
2.3.2 嵌入/潜在空间48
2.3.3 注意事项50
2.3.4 学习率与损失地形图51
2.3.5 扩展方面的考虑因素53
2.3.6 性能分析53
2.4 动手练习#2:PyTorch进阶55
2.4.1 模型输入数据与流水线56
2.4.2 模型56
2.4.3 辅助工具57
2.4.4 融会贯通59
2.5 计算图60
2.6 推理62
2.7 本章小结64
第3章 深度学习的计算层面65
3.1 数字世界的希格斯玻色子66
3.1.1 浮点数:看似连续的数值66
3.1.2 数据的计量单位69
3.1.3 数据存储格式:延迟与吞吐量之间的权衡70
3.2 计算机架构71
3.2.1 机电引擎的诞生71
3.2.2 内存与持久性72
3.2.3 计算与内存的融合75
3.3 电子领域中的扩展定律78
3.4 利用并行化扩展计算78
3.4.1 线程与进程:并行化单元79
3.4.2 用于加速的硬件优化库83
3.4.3 并行计算机架构:弗林和邓肯的分类法84
3.5 加速计算84
3.5.1 深度学习常用加速设备86
3.5.2 CUDA92
3.5.3 加速器基准测试102
3.6 本章小结102
第4章 整合全局:高效深度学习103
4.1 动手练习#1:GPT-2103
4.1.1 练习目标104
4.1.2 模型架构104
4.1.3 实现107
4.1.4 运行示例109
4.1.5 实验追踪109
4.1.6 通过测量来理解局限性并扩展规模110
4.1.7 从语言到视觉115
4.2 动手练习#2:卷积视觉模型116
4.2.1 模型架构116
4.2.2 运行示例119
4.2.3 观察119
4.3 使用 PyTorch 2.0 进行图编译119
4.3.1 PyTorch 2.0中的新组件120
4.3.2 PyTorch 2.0中的图执行流程121
4.4 在单个设备上扩展训练的建模技术122
4.4.1 图编译122
4.4.2 低精度训练与混合精度训练123
4.4.3 高效内存管理技巧127
4.4.4 优化器效率129
4.4.5 模型输入流水线技巧132
4.4.6 在PyTorch 2.0中利用Triton编写自定义内核132
4.5 本章小结133
第二部分 分布式训练
第5章 分布式系统与通信137
5.1 分布式系统137
5.1.1 分布式计算的八大谬论138
5.1.2 CAP定理139
5.1.3 分布式系统的扩展定律140
5.1.4 分布式系统的类型142
5.2 分布式系统中的通信144
5.2.1 通信范式144
5.2.2 通信模式144
5.2.3 通信技术148
5.2.4 MPI150
5.2.5 通信初始化:会合152
5.2.6 动手练习153
5.3 扩展计算能力153
5.3.1 基础设施搭建方案153
5.3.2 加速设备的配置156
5.3.3 工作负载管理157
5.4 深度学习基础设施综述163
5.4.1 主要深度学习集群概览163
5.4.2 当今最强大系统的共性166
5.5 本章小结167
第6章 分布式深度学习的理论基础168
6.1 分布式深度学习168
6.1.1 中心化分布式深度学习168
6.1.2 去中心化分布式深度学习175
6.2 用于扩展分布式深度学习的维度182
6.2.1 分布式深度学习的维度划分182
6.2.2 分布式深度学习的技术类型182
6.2.3 扩展技术的选择190
6.3 扩展性能度量193
6.3.1 端到端指标与基准测试193
6.3.2 在可复现环境中进行渐进式测量197
6.4 本章小结198
第7章 数据并行199
7.1 数据分区199
7.1.1 数据采样策略的影响200
7.1.2 使用远程数据集201
7.2 数据并行技术介绍201
7.2.1 动手练习#1:基于RPC实现中心化参数服务器202
7.2.2 动手练习#2:中心化梯度分区工作节点/服务器联合分布式训练205
7.2.3 动手练习#3:去中心化异步分布式训练207
7.3 中心化同步数据并行策略209
7.3.1 数据并行210
7.3.2 分布式数据并行210
7.3.3 零冗余优化器驱动的数据并行212
7.3.4 容错训练213
7.3.5 动手练习#4:使用分布式数据并行完成场景解析任务214
7.3.6动手练习#5:分布式分片数据并行217
7.4 构建高效流水线218
7.4.1 数据集格式219
7.4.2 本地与远程220
7.4.3 分阶段处理220
7.4.4 线程与进程:扩展流水线220
7.4.5 内存技巧220
7.4.6 数据增强:CPU 与 GPU 的对比221
7.4.7 JIT加速221
7.4.8 动手练习#6:利用 FFCV 提升流水线效率221
7.5本章小结222
第8章 超越数据并行的扩展:模型并行、流水线
并行、张量并行与混合并行223
8.1 纵向扩展前需要问的问题224
8.2 纵向扩展的理论基础227
8.2.1重新审视扩展的维度227
8.2.2 算子视角下的并行维度231
8.2.3 纵向扩展中的数据流与通信232
8.3 超越数据并行扩展的基本构建块240
8.3.1 PyTorch纵向扩展的基本要素240
8.3.2 处理大模型245
8.3.3 分布式检查点:保存分区模型246
8.4 本章小结247
第9章 多维扩展实践248
9.1 动手练习:模型并行、张量并行、流水线并行和混合并行248
9.1.1 数据集248
9.1.2动手练习#1:基准DeepFM249
9.1.3动手练习#2:模型并行DeepFM250
9.1.4 动手练习 #3:流水线并行DeepFM252
9.1.5 动手练习#4:使用 RPC 的流水线并行 DeepFM253
9.1.6 动手练习#5:张量并行 DeepFM255
9.1.7 动手练习#6:混合并行 DeepFM256
9.2 用于纵向扩展的工具与函数库257
9.2.1 OneFlow257
9.2.2 FairScale258
9.2.3 DeepSpeed258
9.2.4 FSDP260
9.2.5 概述与比较261
9.2.6动手练习#7:DeepSpeed自动纵向扩展262
9.2.7 观察263
9.3 本章小结263
第三部分 极限扩展
第10章 以数据为中心的扩展267
10.1 深度学习视角下数据的七个V特征268
10.2 数据扩展定律269
10.3 数据质量271
10.3.1 有效性271
10.3.2 多样性271
10.3.3 真实性283
10.3.4 数据价值与数据规模290
10.4 数据引擎与持续学习295
10.4.1 波动性296
10.4.2速度296
10.5 本章小结297
第11章 扩展实验:高效的实验规划与管理298
11.1 模型开发是一个迭代过程298
11.2 实验规划与执行299
11.2.1 化繁为简299
11.2.2 快速迭代以获得及时反馈300
11.2.3 迭代解耦301
11.2.4 可行性测试301
11.2.5 开发和扩展最小可行方案301
11.2.6 迭代执行设置302
11.3 扩展实验的技巧304
11.3.1 加速模型收敛304
11.3.2 通过优化和自动化加速学习309
11.3.3 通过增加专业知识加速学习317
11.3.4 稀缺监督学习324
11.4 动手练习325
11.4.1 动手练习#1:迁移学习325
11.4.2 动手练习 #2:超参数优化326
11.4.3动手练习#3:知识蒸馏327
11.4.4 动手练习#4:专家混合模型329
11.4.5 动手练习#5:对比学习331
11.4.6 动手练习#6:元学习331
11.5 本章小结332
第12章 大模型的高效微调333
12.1 微调技术综述333
12.1.1标准微调334
12.1.2 元学习(零样本学习/少样本学习)334
12.1.3 基于适配器的微调335
12.1.4 低秩微调335
12.2 用于参数高效微调的LoRA336
12.3 量化LoRA337
12.4 动手练习:基于QLoRA的微调338
12.4.1 实现细节338
12.4.2 推理339
12.4.3 动手练习总结340
12.5 本章小结341
第13章 基础模型342
13.1 什么是基础模型342
13.2 基础模型的演进历程343
13.3开发基础模型所面临的挑战346
13.3.1度量基础模型性能的复杂性346
13.3.2部署模型所面临的挑战347
13.3.3缺陷向所有下游模型蔓延的问题347
13.3.4法律与伦理考量347
13.3.5保持一致性与连贯性348
13.4 多模态大语言模型348
13.4.1 投影349
13.4.2门控交叉注意力350
13.4.3基于查询的编码350
13.4.4深入探索351
13.5 本章小结351