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/EffrcientPyTorch