新書推薦:
《
管道的力量(畅销美国30年的财富经典,销量超100万册)
》
售價:NT$
254.0
《
长安曾有少年郎
》
售價:NT$
203.0
《
何以为园:中国江南古典私家园林的经济解释
》
售價:NT$
347.0
《
漫画图解博弈论:段位经商谋略之道 赢家是怎样炼成的
》
售價:NT$
203.0
《
斯坦福高中校长给父母的6堂课
》
售價:NT$
408.0
《
人间来过:百岁医师的人生处方
》
售價:NT$
250.0
《
湿胖2
》
售價:NT$
286.0
《
日本名厨高汤研究全书
》
售價:NT$
449.0
|
內容簡介: |
本书致力于探索如何在大规模深度学习模型训练中,最大限度地提高性能和优化显存使 用。本书面向深度学习从业者,尤其是希望深入了解并提升模型训练效率的工程师与研究 人员。随着深度学习模型和数据规模的迅速增长,如何高效利用硬件资源,减少训练时间, 成为当前AI系统工程的关键挑战。本书从硬件和软件的基础知识入手,逐步引导读者理解 和掌握PyTorch的优化技巧。内容涵盖从单机到分布式训练,从显存管理到性能分析的多种 优化策略,力求通过丰富的代码实例和深入的原理讲解,使读者能够在实践中灵活应用这些 方法。
|
關於作者: |
张爱玲,本科毕业于清华大学电子工程系,后在美国伊利诺伊大学香槟分校获得计算机科学硕士学位,是AI系统工程领域的资深技术专家。作为深度学习框架PyTorch核心团队成员,参与了多个关键组件的研发与优化工作。同时,她作为技术负责人主导了PyTorch/XLA和Taichi编译器等多个具有广泛影响力的开源项目。目前在工业界专注于大规模语言模型训练的基础设施开发与性能优化工作。
杨占略,清华大学本科,哥伦比亚大学硕士,资深技术专家。曾先后任职于苹果、百度、太极图形公司,分别从事深度学习推理框架、训练框架PaddlePaddle以及Taichi编译器的开发。现就职于大疆公司,聚焦于端侧模型优化、推理部署相关工作。
|
目錄:
|
第1章 欢迎来到这场大模型竞赛 1
1.1 模型规模带来的挑战 2
1.2 数据规模带来的挑战 3
1.3 模型规模与数据增长的应对方法 4
第2章 深度学习的硬件知识 6
2.1 CPU与内存 7
2.1.1 内存 7
2.1.2 CPU 9
2.2 硬盘 11
2.3 GPU 13
2.3.1 CPU的局限性 13
2.3.2 GPU的硬件结构 14
2.3.3 GPU编程模型及其硬件对应 18
2.3.4 GPU的关键性能指标 19
2.3.5 显存与内存间的数据传输 19
2.4 分布式系统 22
2.4.1 单机多卡的通信 22
2.4.2 多机多卡的通信 24
2.4.3 分布式系统的数据存储 24
第3章 深度学习的PyTorch知识 26
3.1 PyTorch 的张量数据结构 27
3.1.1 张量的基本属性及创建 27
3.1.2 访问张量的数据 28
3.1.3 张量的存储方式 29
3.1.4 张量的视图 32
3.2 PyTorch中的算子 33
3.2.1 PyTorch的算子库 33
3.2.2 PyTorch算子的内存分配 35
3.2.3 算子的调用过程 36
3.3 PyTorch的动态图机制 38
3.4 PyTorch的自动微分系统 41
3.4.1 什么是自动微分 41
3.4.2 自动微分的实现 42
3.4.3 Autograd 扩展自定义算子 46
3.5 PyTorch的异步执行机制 47
第4章 定位性能瓶颈的工具和方法 51
4.1 配置性能分析所需的软硬件环境 52
4.1.1 减少无关程序的干扰 52
4.1.2 提升PyTorch 程序的可重复性 53
4.1.3 控制GPU频率 58
4.1.4 控制CPU的性能状态和工作频率 59
4.2 精确测量程序运行时间 60
4.2.1 计量CPU程序的运行时间 60
4.2.2 程序预热和多次运行取平均 61
4.2.3 计量GPU程序的运行时间 62
4.2.4 精确计量GPU的运行时间 63
4.3 PyTorch性能分析器 64
4.3.1 性能分析 65
4.3.2 显存分析 66
4.3.3 可视化性能图谱 67
4.3.4 如何定位性能瓶颈 67
4.4 GPU 专业分析工具 71
4.4.1 Nsight Systems 71
4.4.2 Nsight Compute 71
4.5 CPU 性能分析工具 75
4.5.1 Py-Spy 75
4.5.2 strace 77
4.6 本章小结 78
第5章 数据加载和预处理专题 80
5.1 数据接入的准备阶段 81
5.2 数据集的获取和预处理 82
5.2.1 获取原始数据 82
5.2.2 原始数据的清洗 82
5.2.3 数据的离线预处理 84
5.2.4 数据的存储 86
5.2.5 PyTorch与第三方库的交互 88
5.3 数据集的加载和使用 89
5.3.1 PyTorch 的 Dataset 封装 90
5.3.2 PyTorch 的 DataLoader 封装 92
5.4 数据加载性能分析 93
5.4.1 充分利用CPU的多核资源 94
5.4.2 优化CPU上的计算负载 95
5.4.3 减少不必要的CPU线程 96
5.4.4 提升磁盘效率 98
5.5 本章小结 99
第6章 单卡性能优化专题 100
6.1 提高数据任务的并行度 101
6.1.1 增加数据预处理的并行度 101
6.1.2 使用异步接口提交数据传输任务 104
6.1.3 数据传输与GPU计算任务并行 106
6.2 提高GPU计算任务的效率 109
6.2.1 增大BatchSize 109
6.2.2 使用融合算子 113
6.3 减少CPU和GPU间的同步 116
6.4 降低程序中的额外开销 118
6.4.1 避免张量的创建开销 119
6.4.2 关闭不必要的梯度计算 121
6.5 有代价的性能优化 123
6.5.1 使用低精度数据进行设备间拷贝 123
6.5.2 使用性能特化的优化器实现 125
6.6 本章小结 128
第7章 单卡显存优化专题 129
7.1 PyTorch的显存管理机制 130
7.2 显存的分析方法 131
7.2.1 使用PyTorch API查询当前显存状态 132
7.2.2 使用PyTorch的显存分析器 133
7.3 训练过程中的显存占用 135
7.4 通用显存复用方法 139
7.4.1 使用原位操作算子 139
7.4.2 使用共享存储的操作 141
7.5 有代价的显存优化技巧 142
7.5.1 跨批次梯度累加 142
7.5.2 即时重算前向张量 144
7.5.3 将GPU显存下放至CPU内存 145
7.5.4 降低优化器的显存占用 147
7.6 优化Python代码以减少显存占用 149
7.6.1 Python 垃圾回收机制 150
7.6.2 避免出现循环依赖 150
7.6.3 谨慎使用全局作用域 152
7.7 本章小结 153
第8章 分布式训练专题 155
8.1 分布式策略概述 157
8.2 集合通信原语 158
8.3 应对数据增长的并行策略 161
8.3.1 数据并行策略 161
8.3.2 手动实现数据并行算法 162
8.3.3 PyTorch的DDP封装 165
8.3.4 数据并行的性价比 167
8.3.5 其他数据维度的切分 169
8.4 应对模型增长的并行策略 169
8.4.1 静态显存切分 170
8.4.2 动态显存切分 172
8.5 本章小结 176
第9章 高级优化方法专题 178
9.1 自动混合精度训练 179
9.1.1 浮点数的表示方法 179
9.1.2 使用低精度数据类型的优缺点 181
9.1.3 PyTorch 自动混合精度训练 182
9.2 自定义高性能算子 185
9.2.1 自定义算子的封装流程 185
9.2.2 自定义算子的后端代码实现 186
9.2.3 自定义算子导入Python 188
9.2.4 自定义算子导入PyTorch 189
9.2.5 在Python中使用自定义算子 190
9.3 基于计算图的性能优化 191
9.3.1 torch.compile的使用方法 192
9.3.2 计算图的提取 194
9.3.3 图的优化和后端代码生成 196
9.4 本章小结 198
第10章 GPT-2优化全流程 199
10.1 GPT模型结构简介 200
10.2 实验环境与机器配置 203
10.3 显存优化 203
10.3.1 基准模型 204
10.3.2 使用跨批次梯度累加 204
10.3.3 开启即时重算前向张量 205
10.3.4 使用显存友好的优化器模式 205
10.3.5 使用分布式方法降低显存占用—FSDP 206
10.3.6 显存优化小结 207
10.4 性能优化 208
10.4.1 基准模型 209
10.4.2 增加 BatchSize 209
10.4.3 增加数据预处理的并行度 210
10.4.4 使用异步接口完成数据传输 211
10.4.5 使用计算图优化 211
10.4.6 使用float16混合精度训练 212
10.4.7 (可选)使用自定义算子 213
10.4.8 使用单机多卡加速训练 213
10.4.9 使用多机多卡加速训练 214
10.4.10 性能优化小结 215
结语 216
|
內容試閱:
|
2022年底,由OpenAI发布的ChatGPT展现了人工智能(Artificial Intelligence,AI)与人类进行流畅对话和问答的专业能力,刚一发布就引发了巨大关注。作为生成式AI领域的第一个现象级产品,ChatGPT已经在搜索、编程、客服等多个领域显著提升了人类的工作效率。人们不仅对AI模型目前的能力感到惊讶,更对其跨行业多领域的应用潜力感到振奋,许多人甚至认为一个由人工智能驱动的第四次工业革命已经拉开序幕。
ChatGPT的成功不仅归功于其出色的模型架构,还得益于其在工程方面的极致优化—这个庞大的模型基于海量互联网文本数据,在由超过一万张GPU组成的计算集群上进行了数月的训练。这不仅需要在稳定性和性能方面对分布式训练策略进行极致优化,还充分挑战了当前软件和硬件的极限,成为了AI工程领域的里程碑。
AI系统工程(AI Systems Engineering)是AI算法与系统的交叉领域。从训练到部署,所有涉及软件和计算集群的部分几乎都可以划为AI系统工程的范围,包括持续优化的GPU硬件架构、建立高速互联的GPU数据中心、开发用户友好且可扩展的AI框架等。目前市面上有许多关于AI算法和模型架构方面的书籍和课程,但关于AI系统工程的资料却非常稀缺。这些工程实践技巧通常散落在用户手册、专家博客,甚至GitHub问题讨论中,由于覆盖面广且知识点分散,新入行的工程师在系统性构建AI系统工程知识体系时面临诸多挑战。
因此,本书致力于实现以下两个目标:
从深度学习训练的视角讲解AI工程中必要的软硬件组件,帮助读者系统性地了解深度学习性能问题的根源。详尽分析硬件参数和软件特性对训练效果的影响,并提供了一套从定位问题、分析问题到解决问题的流程。
深入探讨应对数据和模型规模快速增长的具体策略。从显存优化到训练加速,从单机单卡到分布式训练的优化,系统地介绍提升模型训练规模和性能的多种途径。我们希望读者能够理解这些策略各自的优势与局限,并根据实际情况灵活应用。
本书将通过PyTorch代码实例演示不同的特性和优化技巧,尽量避免使用晦涩难懂的公式,通过简单的例子讲清问题的来龙去脉。然而,AI系统工程是个非常宽泛的交叉领域,无论是书籍的篇幅还是笔者的实际经验都有一定的局限性,因此本书很难面面俱到地涵盖所有内容,比如:
本书不涉及模型架构的算法讲解。我们假定读者已经对要解决的问题和可能使用的模型架构有所了解,甚至已经有一些可运行的雏形代码,以此作为性能或显存优化的基础。
本书通常不会介绍PyTorch等工具的API接口和参数设置细节,除非这些信息与优化直接相关。这类信息在各工具的官方文档中已有详尽的描述和丰富的代码示例,且可能随版本更新发生变化。如果读者在使用这些接口时遇到问题,建议直接参考相关文档。本书的目标并不是成为这些文档的中文版本,而是阐释其中的原理和思路,使读者能够更灵活地使用这些工具。
本书不涵盖专门针对推理部署设计的算法、性能优化和专用加速芯片等知识。模型推理的技巧通常与特定应用紧密相关,有时为了追求极致的性能,甚至需要采用一些非常规的技巧。因此,模型推理不是本书的重点,我们将聚焦于更具通用性的训练部分。
本书在讨论自定义算子时会简要提及CUDA语言,但不会深入讲解如何使用CUDA编写高性能算子。CUDA作为一种专业性很强的编程语言,需要对GPU硬件架构和并行计算有深入了解。然而,即便没有CUDA相关背景,也不影响对本书内容的理解和应用。希望深入研究CUDA的读者,可以在网上找到大量高质量的书籍和教程。
本书将从工程的角度着手,解决模型训练中的规模和效率问题。即使读者不熟悉这些内容,也无须担心。如图0-1所示,书中内容将分为10章,由浅入深地进行讲解。
第1~4章从硬件和软件的基础知识入手,详细介绍深度学习所需的软硬件知识和定位性能瓶颈所需的工具。
第5~8章结合具体的代码实例,逐一探讨训练过程中的优化策略背后的原理和思路。
第9和10章重点介绍综合优化的方法和实践。结合GPT-2模型的优化过程,直观展示每种优化技术的使用方式和实际效果。
图0-1 本书知识架构
除此以外,本书中的示例代码是基于Linux(Ubuntu 22.04)开发和验证的,但是所使用的大部分工具也有对应的Windows版本。部分Linux专有工具如htop等,在Windows上也应能轻易找到替代品。因此,无论使用Windows还是使用Linux的读者都能顺畅阅读本书。
本书将优先使用专业术语的中文版本。然而,由于深度学习领域的许多术语缺乏统一的中文翻译,在某些场景中使用英文会更有助于读者的理解。例如,“BatchSize”在日常使用中比其中文翻译“批处理大小”更常见,而在衡量模型参数量大小时,“M”和“B”相比于它们的中文“百万”和“十亿”来说也是更通用的说法。除此以外,在部分示意图中还会出现使用“Tensor”替代“张量”的情况。综上所述,我们将在必要时使用英文术语或缩写,并在它们首次出现时在括号中提供相应的注释以帮助读者理解。
此外,本书对部分性能图谱的图片进行了黑白化处理,以便突出关键内容和标注。书中首次出现的重点概念将以黑色粗体显示,关键结论则会以蓝色粗体显示,帮助读者识别和记住这些重要内容。
致谢
在本书的写作和审阅过程中,我们得到了许多朋友的宝贵帮助和支持。在此,特向他们表示诚挚的感谢。
在技术内容方面,罗雨屏对全书进行了全面的审阅和指导;张云明对第1章和第2章提出了宝贵的建议;刘家恺对第1章至第6章提出了宝贵的意见;兰海东细致审阅并修改了第2、3、6、7章;王宇轩对第2章进行了细致的审阅和优化;许珈铭对第2章和第6章提供了具有建设性的建议;路浩对第3章和第4章进行了细致的修订;严轶飞对第4章进行了详细的校订,确保内容准确;蒋毓和田野为第5章提供了宝贵的反馈和审阅;王雨顺对第7章进行了深入的改进;申晗对第7章至第9章提出了建设性的修改建议;与Prithvi Gudapati的讨论修正了书中设置PyTorch随机数种子的方法。
在图书策划方面,姚丽斌、申美莹和栾大成在全书的策划和编辑过程中给予了宝贵的建议;王承宸为本书生成了清晰美观的代码图;戴国浩提供了实验用的机器,保障了实验的顺利进行。
此外,在本书的写作过程中,笔者借助了ChatGPT进行大量文字润色工作,大大提升了写作效率。书中的图表主要使用Keynote和FigJam进行制作,代码示例使用基于Carbon的命令行工具carbon-now-cli生成,非常感谢社区提供的这些实用工具。
最后,本书的写作时间以及笔者的经验有限,书中如有错误和疏漏,恳请读者批评指正。
代码文件
本书的代码文件下载地址为:
同时也在如下GitHub地址备份更新:
https://github.com/ailzhang/EfficientPyTorch
01 欢迎来到这场大模型竞赛
我们正迎来大模型井喷的时代,深度学习模型的创新和突破层出不穷。随着GPT 、 Stable Di?usion 、Sora等模型的问世,大模型已经在文本、图片和视频生成领域展示了其 强大的能力。读者可能会好奇,训练这些庞大模型的过程究竟是什么样的,需要多少资 源和时间?未来,普通人是否也有机会训练出属于自己的私有大模型呢?
在尝试训练一个大模型时,我们通常会遇到两个主要挑战:
l这个模型能否在现有硬件环境中运行?
l 需要多长时间才能完成一个数据集的训练?
这两个问题的核心也正是大模型的规模定律(Scaling Law1 )中提到的对模型表现有 重大影响的两个要素:模型规模和数据规模。
1 https://arxiv.org/pdf/2001.08361
第1章 欢迎来到这场大模型竞赛
1.1 模型规模带来的挑战
我们首先从模型规模说起。很多读者刚入门深度学习时,可能是从ResNet 、Google- Inception等经典模型开始学习的。然而,工业界现有模型的规模与这些入门级模型之间存 在数量级的差距。短短几年间,“大模型”的代表已经从BERT-Large的0.3B(3亿)参数 量迅速发展到GPT-2的1.5B,甚至GPT-3的175B。
我们以GPT-3为例简单估算其模型参数和优化器需要占用的显存大小。假设模型使用 单精度浮点数存储1 ,每个参数占用4字节,模型参数需要占用700GB的显存;而Adam优 化器的显存占用是参数的两倍,也就是说至少需要2100GB以上的显存才能容纳GPT-3模 型和优化器。这甚至还未包括训练过程中动态分配的显存。
目前单张NVIDIA GPU最大的显存容量为80GB(如A100、H100等),而仅GPT-3模型 和优化器所需的2100GB显存就已远远超过单卡的显存极限。这意味着,为了运行GPT-3 , 除了进行显存优化外,还必须采用分布式系统,让多个GPU节点共同承担庞大的显存需 求。因此,显存成为模型训练的硬性门槛。在实际应用中我们通常会先优化显存占用, 再优化速度。
事实上,现行工业界最大模型的规模早已超越了GPT-3,使得显存优化和分布式训练 技术的重要性愈发突出。以语言模型为例,从图1-1中可以看出,近年来其模型规模呈现 数量级的增长,过去五年间已经翻了近百倍。
图1-1 以大模型为例展示模型参数规模的增长趋势。本图基于Epoch AI Database2于2024年5月的数据绘 制,选取了语言模型领域引用次数超过100的部分模型。
1 该假设仅作为示例,实际训练中可能使用低精度的数据类型。 2 https://epochai.org/data/epochdb
2 大模型动力引擎——PyTorch性能与显存优化手册
1.2 数据规模带来的挑战
如果说模型规模的增长带来的是不断增长的显存占用,那么数据规模的增长带来 的则是越来越长的训练时间。不同于入门级的MNIST 、COCO 、ImageNet这些最多百万 样本量的数据集,工业界现行的数据集如Laion-5B 、Common Crawl等已经达到10B甚至 100B规模了。表1-1以图像领域为例展示了数据集样本数量快速增长的过程。读者可能 并不理解100B数据意味着什么,那么不妨通过训练时间来建立一些直观的认识。按照估 算1 ,GPT-3如果在100B个token2 的Common Crawl上训练,如果只用一张V100计算卡训 练,需要355年才能跑完全部的数据集—也就是要从康熙年代开始训练,才能赶上今年 发布。为了在合理的时间内完成训练,我们不仅需要进行单卡性能的极致优化,还需要 借助分布式训练系统进行并行处理,以加速模型的训练过程。
表1-1 图像领域常用数据集的数据规模
========================================
@@@0@@@数据集
@@@1@@@MNIST
@@@2@@@Coco 2017
@@@3@@@ImageNet2012
@@@4@@@Laion-400M
@@@5@@@Laion-5B
========================================
@@@0@@@样本数量
@@@1@@@~60K 图片
@@@2@@@~118K 图片
@@@3@@@~12M 图片
@@@4@@@~400M 图片文本对
@@@5@@@~5B 图片文本对
尽管当前的数据集规模已经相当庞大,但其增长速度依然惊人。今天的100B大数据 集,可能在几年后就会变成中等规模的数据集。正如图1-2所示,近年来深度学习模型训 练使用的数据规模呈现指数级增长态势。
图1-2 训练用数据量的增长趋势。本图基于Epoch AI Database3于2024年5月的数据绘制,展示了所有领 域模型训练使用的数据量并启用了”Show outstanding systems”标注。
1 https://lambdalabs.com/blog/demystifying-gpt-3
2 模型处理数据的基本单位
3 https://epochai.org/data/epochdb
第1章 欢迎来到这场大模型竞赛
模型规模与数据规模的双重增长,最终都会反映到训练模型所需的成本和训练所需 时间上。以Mosaic ML在2022年底发布的GPT系列模型的训练成本估算为例1,如图1-3所 示,随着模型参数量的增加,训练时间和成本呈指数级增长。这种增长速度凸显了大规 模模型训练在资源和时间上的巨大挑战。
图1-3 以GPT系列模型为例,展示训练成本和时间随着模型增长的趋势,数据来源于MosaicML的博客。
1.3 模型规模与数据增长的应对方法
模型规模和数据规模的增长最直观的影响就反应在训练的成本上,因为我们需要更 多的机器且需要训练更长的时间,这也使得显存优化和性能优化显得尤为重要。显存优 化可以降低模型的训练门槛,用更少的GPU实现相同规模的训练;而性能优化则可以用 更短的时间完成模型的训练,这也变相降低了训练的成本。
然而显存优化和性能优化并不是简单的工作。模型的完整训练过程包括若干不同的 训练阶段,必须搞清楚不同阶段的算力需求和特点,才能进行针对性的优化。
先来看一下完整的模型训练过程都包含哪些阶段。整体来说,对于最常见的训练过 程,每一轮训练循环都包括5个串行的阶段,分别是数据加载、数据预处理、前向传播、 反向传播、梯度更新。在此基础上,如果有多张GPU卡甚至多台训练机器可供使用,
1 https://www.databricks.com/blog/gpt-3-quality-for-500k
4 大模型动力引擎——PyTorch性能与显存优化手册
还可以把每个GPU看作一个节点,进一步将计算任务分散到不同节点形成分布式训练系 统。分布式训练也因此会多出一个额外的阶段,也就是节点通信,如图1-4所示。
图1-4 模型训练流程示意图
讨论一下,这些训练阶段各自的优化重点是什么。首先, 数据加载是指将训练数据 从硬盘读取到内存的过程。为了避免训练程序停下来等待硬盘读取数据,可以通过将数 据加载与模型计算任务重叠来进行优化,例如使用预加载技术。这部分内容将在第5章: 数据的加载和处理中详细讨论。
接下来是数据预处理,即在CPU上对加载到内存中的数据进行简单处理,以满足模 型对输入数据的要求。为了避免数据预处理成为训练的瓶颈,可以使用离线预处理技术 或优化CPU预处理代码的效率。这部分内容将在第5章:数据的加载和处理以及第6章: 单卡性能优化中讨论。
前向传播是模型训练的前向计算过程,以计算损失函数(Loss)为终点;反向传播 则是梯度计算过程;参数更新则是根据梯度方向对模型参数进行更新。这三个阶段的计 算主要依赖于GPU设备。GPU设备的峰值浮点运算能力(peak FLOPS)和显存容量是单 卡训练规模和速度的主要限制因素,也是优化的重点。因此,在第6章和第7章中,将分 别介绍一些通用的单卡性能优化和显存优化技巧。
然而,单卡的计算能力和显存容量存在较大限制。如果需要进一步提升模型规模或 加快训练速度,可以将计算和显存分配到多张GPU上,通过节点通信来协同完成更大规 模的训练。在第8章中,将详细讨论不同的分布式训练策略及其对节点通信的优化方法。
除了常规的性能优化和显存优化技术外,我们特别准备了第9章:高级性能优化技 术。这一章将深入探讨一系列“高投入、高风险、高回报”的优化方法。这些高级技巧 有望显着提升GPU的计算效率,但其原理较为复杂、调试相对耗时,因此更适合对训练 的性能优化有较高要求的读者。
在第10章:GPT-2优化全流程中,将结合实战,将本书介绍的大部分性能和显存优化 技巧串联起来。通过实际案例探索不同优化技巧的应用方法和实际效果。
第1章 欢迎来到这场大模型竞赛
|
|