- 设计深度学习系统
- (美)王迟 (美)司徒杰鹏
- 4775字
- 2025-03-13 16:30:18
PREFACE
前言
十多年前,我们有幸参与构建了一些面向最终用户的早期产品功能,这些功能由人工智能驱动,是一个巨大的项目。当时,收集和组织适合模型训练的数据并不是常见的做法。很少有机器学习算法可以被打包为可直接使用的库。进行实验需要手动运行管理,并构建自定义的工作流和可视化,为每种类型的模型定制服务器。除了资源密集型的科技公司外,几乎每个新的人工智能驱动的产品功能都是从头开始构建的。智能应用程序有朝一日会成为商品的梦想似乎遥不可及。
在使用了几个人工智能应用程序后,我们意识到我们每次都在重复着类似的流程,我们发现设计一种通过原型设计将人工智能产品功能交付到生产环境的系统化方式更有意义。这项工作的成果是PredictionIO——一个开源的框架软件套件,它将用于数据收集和检索、模型训练和模型服务的最先进的软件组件整合在一起。它可通过其API进行定制,并且只需几个命令即可部署为服务,还有助于缩短从运行数据科学实验到训练和部署生产模型的每个阶段所需的时间。我们很高兴地得知世界各地的开发者在使用PredictionIO创建自己的人工智能驱动应用程序后,他们的业务得到了惊人的提升。PredictionIO后来被Salesforce收购,以解决更大规模的类似问题。
在我们决定撰写这本书的时候,该行业在健康的AI软件生态系统下蓬勃发展。许多算法和工具可以用来解决不同的用例。一些云供应商,如亚马逊、谷歌和微软,甚至会提供完整的托管系统,使团队能够在一个集中的平台上合作进行实验、原型设计和生产部署。现在,无论你的目标是什么,你都有很多选择和多种方式将它们组合在一起。
然而,当我们与团队合作交付深度学习驱动的产品功能时,我们会不断面对一些问题。为什么我们的深度学习系统会设计成这样?对于其他特定用例,这是不是最佳设计?我们注意到初级软件工程师是最常问这些问题的人,所以我们采访了其中一些人,并试图找出原因。他们透露,传统的软件工程培训并没有使他们能够有效地与深度学习系统一起工作。在寻找学习资源时,他们只能找到关于特定系统组件的零散信息,几乎没有资料讨论软件组件的基本原理、为什么它们以这样的方式组合在一起,以及它们如何共同工作以形成完整的系统。
为了解决这个问题,我们开始构建一个知识库,并将其扩展成一套类似手册的学习材料,其中解释了每个系统组件的设计原则、设计决策的优点和缺点,以及技术和产品角度的基本原理。我们得知,我们的学习材料有助于新的团队成员快速提升能力,并使得没有深度学习系统建设经验的传统软件工程师也能迅速掌握相关技能。因此,我们决定将这些学习材料以书籍的形式分享给更广泛的读者。我们联系了Manning出版社,促成了本书的出版。
关于本书
本书旨在培养工程师设计、构建或调试有效的机器学习系统的能力,并根据他们可能遇到的需求和情况定制这些系统。他们开发的系统将促进、自动化并加快各种机器学习项目(尤其是深度学习项目)的发展。
在深度学习领域,模型是最受关注的。考虑到从这些模型开发的新应用程序不断涌入市场,这种关注可能是合理的——这些应用程序激发了消费者的兴趣,例如,能够检测人形的安全摄像头、在网络游戏中表现得像真人一样的虚拟角色、能够编写代码解决任意提出的问题的程序,以及可能在未来最终实现全自动驾驶汽车的高级驾驶辅助系统。在非常短的时间内,人们对深度学习领域抱有巨大的热情,并将其视作有待被完全实现的潜力领域。
但模型并非是独自运作的。为了实现产品或服务,我们需要将模型置于一个系统或平台中(这两个术语可以互换),该系统或平台为模型提供各种服务和存储支持。例如,它需要一个API、一个数据集管理器以及用于存储工件和元数据的存储空间等。因此,每一个深度学习模型开发团队的背后都有一个负责创建支撑模型及所有其他组件的基础设施的非深度学习开发者团队。
笔者在行业中观察到的问题是,负责设计深度学习系统和组件的开发者往往只对深度学习有浅显的了解。他们不理解深度学习在系统工程中需要满足的那些特定要求,因此在构建系统时倾向于采用通用的方法。例如,他们可能选择将所有与深度学习模型开发相关的工作抽象出来,交给数据科学家,而自己只专注于自动化。因此,他们构建的系统依赖于传统的作业调度系统或商业智能数据分析系统,这些系统并未针对深度学习训练工作的运行方式或深度学习特定的数据访问模式进行过优化。其结果就是,系统难以用于模型开发,模型发布的速度也很慢。造成这些问题的本质原因是,业界选择对深度学习缺乏深入理解的工程师构建支持深度学习模型的系统。其后果自然是,他们构建的工程系统效率低下,不适用于深度学习系统。
关于深度学习模型开发,已有大量从数据科学家的角度出发,涵盖数据收集、数据集增强、编写训练算法等方面的文献。但很少有书籍或者博客对支持所有这些深度学习活动的系统和服务进行讨论。
在本书中,我们将从软件开发者的角度探讨如何构建和设计深度学习系统。我们的方法是首先从整体上描述一个典型的深度学习系统,包括其主要组件以及它们之间的连接方式;然后我们会在各个单独的章节中深入探讨系统的每一个主要组件。我们会在每章开始时讨论组件的需求,接着介绍设计原则和示例服务/代码,并最终评估开源解决方案。
因为我们无法涵盖每一个现存的深度学习系统(无论是商业的还是开源的),所以我们在书中会专注于讨论需求和设计原则(并附有示例)。通过学习这些原则,尝试书中的示例服务,并阅读我们对开源选项的讨论,我们希望读者能进行自己的研究,找到最适合他们的解决方案。
谁需要阅读这本书
本书的主要受众是希望快速转向深度学习系统工程的软件工程师(包括刚刚毕业的计算机专业学生),比如那些想要从事深度学习平台工作或将一些人工智能功能(例如模型服务)集成到他们的产品中的人。
数据科学家、研究人员、管理人员以及任何其他使用机器学习来解决现实问题的人也会发现本书很有用。在了解机器学习的底层基础设施(或系统)后,他们将能够为工程团队提供精确的反馈,以改进模型开发过程的效率。
本书是一本工程书籍,你不需要具备机器学习背景,但应该熟悉基本的计算机科学概念和编程工具,比如微服务、gRPC和Docker,以运行实验并理解技术内容。不论你的背景如何,你都可以从本书的非技术性材料中获益,从而更好地理解机器学习和深度学习系统是如何将产品和服务从想法转化为生产的。
通过阅读本书,你将能够了解深度学习系统的工作原理,以及如何开发每个组件。你还将了解何时从用户那里收集需求,将需求转化为系统组件设计选项,并将组件集成到一个有机的系统中,从而帮助用户快速开发和交付深度学习功能。
本书组织结构:路线图
本书分为10章和3个附录(其中包括一个实验附录)。首先解释深度学习项目的开发周期是什么,以及基本深度学习系统的样貌。接下来深入探讨参考深度学习系统的各个功能组件。最后讨论如何将模型交付至生产环境。附录包含一个实验环节,以便读者尝试使用示例深度学习系统。
第1章描述什么是深度学习系统、系统的不同利益相关者,以及这些利益相关者如何与之交互以提供深度学习功能。我们称这种交互为深度学习开发周期。此外,你还将概念化一个深度学习系统,称为参考架构,其中包含所有基本要素,并可以根据你的要求进行调整。
第2~9章涵盖参考深度学习系统架构的各个核心组件,如数据集管理服务、模型训练服务、自动超参数优化服务和工作流编排服务等。
第10章描述如何将研究或原型阶段的最终产品转变为准备好向公众发布的产品。
附录A介绍示例深度学习系统,并演示实验练习,附录B对现有解决方案进行综述,附录C讨论Kubeflow Katib。
关于代码
我们相信最好的学习方式是通过实践和实验来学习。为了演示本书中所解释的设计原则并提供实际操作的经验,我们创建了一个示例深度学习系统和代码实验室。示例深度学习系统的所有源代码、设置说明和实验脚本都可以在GitHub上找到(https://github.com/orca3/MiniAutoML)。你还可以从本书的liveBook(在线)版本(https://livebook.manning.com/book/software-engineers-guide-to-deep-learning-system-design)和Manning网站(www.manning.com)获取可执行的代码片段。
附录A中的“Hello World”实验包含一个完整但经过简化的迷你深度学习系统,它具有最基本的组件(数据集管理、模型训练和服务)。我们建议你在读完本书的第1章后尝试“Hello World”实验,或者在尝试本书中的示例服务之前先进行此实验。该实验还提供了shell脚本和指向所有所需资源的链接,以帮助你入门。
除了代码实验室,书中还包含许多源代码示例,这些源代码在代码清单和正文中都有体现。在这两种情况下,源代码采用等宽字体,以与普通文本进行区分。书中有时也会使用等宽粗体显示代码,以突出显示与本章前面步骤不同的代码,例如,当新功能添加到现有代码行时。
在许多情况下,原始源代码都被重新格式化了,我们添加了换行符并重新排列了缩进,以适应书中的页面设置。在极少数情况下,即使这样也不够,代码清单中可能会包含行延续标记(➥)。此外,当代码在文中有描述时,源代码中的注释通常会被从代码清单中删除。许多代码清单中都有代码注释,用以突出显示重要的概念。
致谢
撰写一本书确实需要作者付出大量的努力,但若没有以下人员的帮助,笔者是无法写成本书的。
在Salesforce Einstein团队(Einstein平台、E.ai、Hawking)与不同团队的合作经历,构成了这本书大部分内容的基础。这些才华横溢、有影响力的团队成员包括Sara Asher、Jimmy Au、John Ball、Anya Bida、Gene Becker、Yateesh Bhagavan、Jackson Chung、Himay Desai、Mehmet Ezbiderli、Vitaly Gordon、Indira Iyer、Arpeet Kale、Sriram Krishnan、Annie Lange、Chan Lee、Eli Levine、Daphne Liu、Leah McGuire、Ivaylo Mihov、Richard Pack、Henry Saputra、Raghu Setty、Shaun Senecal、Karl Skucha、Magnus Thorne、Ted Tuttle、Ian Varley、Yan Yang、Marcin Zieminski和Leo Zhu。
我们还要感谢开发编辑Frances Lefkowitz。她不仅是一位能够提供很好的写作指导和内联的出色编辑,而且还是一位在整个写作过程中都能给予我们指导的优秀导师。如果没有她,这本书的质量不会如此高,也不会按计划完成。
我们感谢Manning团队在本书写作过程中对我们的指导。我们非常感谢能有机会通过Manning早期访问计划(MEAP)在本书写作的早期阶段获得读者的意见。
我们向所有审稿人致谢:Alex Blanc、Amit Kumar、Ayush Tomar、Bhagvan Kommadi、Dinkar Juyal、Esref Durna、Gaurav Sood、Guillaume Alleon、Hammad Arshad、Jamie Shaffer、Japneet Singh、Jeremy Chen、João Dinis Ferreira、Katia Patkin、Keith Kim、Larry Cai、Maria Ana、Mikael Dautrey、Nick Decroos、Nicole Königstein、Noah Flynn、Oliver Korten、Omar El Malak、Pranjal Ranjan、Ravi Suresh Mashru、Said Ech-Chadi、Sandeep D.、Sanket Sharma、Satej Kumar Sahu、Sayak Paul、Shweta Joshi、Simone Sguazza、Sriram Macharla、Sumit Bhattacharyya、Ursin Stauss、Vidhya Vinay和Wei Luo。感谢他们提出的建议,帮助我们使这本书变得更好。
我要感谢我的妻子吴培,她在写作本书的整个过程中给予了我无条件的爱和巨大的支持。她营造了一个宁静而安稳的港湾,让我在一个拥有两个可爱的孩子——天悦和天成的忙碌家庭中完成了本书的写作。
同时,我要感谢天才开发者薛晏,整个代码实验室几乎都是他完成的。在他的帮助下,我们设计的代码实验室不仅质量很高,而且易于学习。薛晏的妻子Dong全心全意地支持他,让他能够专注于本书的代码实验室工作。
我还要感谢Salesforce的一位才华横溢、经验丰富的技术作家Dianne Siebold。Dianne以她自己的写作经历启发了我,并鼓励我开始写作。
——王迟
创办PredictionIO(后来被Salesforce收购)让我学到了有关构建开源机器学习开发者产品的宝贵经验。如果彼此没有极大的信任这个充满冒险而有益的旅程不可能成为现实。他们是Kenneth Chan、Tom Chan、Pat Ferrel、Isabelle Lee、Paul Li、Alex Merritt、Thomas Stone、Marco Vivero和叶宇堃。
特别值得一提的是Simon Chan。Chan与我共同创办了PredictionIO,我也有幸在他之前的创业过程中与他一起工作和学习。他是第一个正式向我介绍编程的人,当时我们都在香港同一所中学(九龙华仁书院)就读。就读期间还有很多人鼓舞了我,包括Donald Chan、陈兆安、褚瀚文、傅家权、侯晋熙、江之钧、刘昀泰、刘锦贤、李润明、李育民、成志强、苏中平、董展鹏和黄伟良。
我非常感激我的父母和我的哥哥司徒杰生。他们让我早早接触了计算机。他们的持续支持在我最终立志成为一名计算机工程师的成长经历中扮演着至关重要的角色。
“生物深度神经网络”是世界上最令人惊奇的事物,而我的儿子Spencer就是一个活生生的证据。他是一份美好的礼物,每天都向我表明,我可以不断成长并变得更好。
我无法用言语表达妻子Vicky对我的重要性。她总是能够激发我最好的一面,让我在困难时刻保持前进。她是我梦寐以求的最佳伴侣。
——司徒杰鹏