哈佛-CS249r-机器学习系统-全-

哈佛 CS249r:机器学习系统(全)

原文:Machine Learning Systems

译者:飞龙

协议:CC BY-NC-SA 4.0>

摘要

机器学习系统提供了理解和构建机器学习(ML)系统的一个系统框架。这本教科书架起了理论基础与实践工程之间的桥梁,强调构建有效 AI 解决方案所需的系统视角。与主要关注算法和模型架构的资源不同,本书突出了 ML 系统运行的更广泛背景,包括数据工程、模型优化、硬件感知训练和推理加速。读者将能够对 ML 系统架构进行推理,并应用持久工程原则来构建灵活、高效和健壮的机器学习系统。

支持我们的使命

2025 目标:10,000 个 GitHub ⭐s(已达成 ✓) 感谢您的支持 🙏 下一个目标:到 2026 年达到 100,000 个。我们正在追踪到 2030 年达到 100 万学习者的路径。像 EDGE AI 基金会 这样的赞助商将每个星星与支持学习的资金相匹配。

加载... ⭐ 在 GitHub 上星标

新!我们刚刚启动了一个 Open Collective。了解更多 →

我们为什么写这本书

问题: 学生们学会了训练 AI 模型,但很少有人理解如何构建使它们在生产中实际工作的系统。当教授 ML 系统概念时,学生们往往只学习单个组件,而没有掌握整体架构——他们只看到了树木,却错过了森林。

未来: 随着 AI 越来越自主,瓶颈将不仅仅是算法——将是能够构建高效、可扩展和可持续系统的 AI 工程师。

“如果你想走得快,就一个人走。如果你想走得更远,就一起走。”——非洲谚语

我们的方法: 这个愿景源于哈佛大学 CS249r 的协作工作,在那里学生、教师和行业合作伙伴聚集在一起,探索 ML 的系统方面。内容是在 2023 年秋季通过学生的实际贡献开发的。最初是课堂笔记,现在已经变成了一本我们现在在全球范围内共享的全面教育资源。

想要了解更多故事?阅读我们的 作者笔记,了解推动这个项目的灵感和价值观。

收听 AI 播客

这段简短的播客,由 Google 的 Notebook LM 创建,并受到我们 IEEE 教育观点论文 的见解启发,提供了本书关键思想和主题的易于理解的概述。

<../media/file0.mpega>

您的浏览器不支持音频元素。

全球推广

感谢所有我们的读者和访客。您与材料的互动让我们保持动力。

这本教科书已经吸引了全球的读者,超过 100 个国家的访客正在与材料互动。国际社区包括学生、教育工作者、研究人员和推动机器学习系统领域发展的实践者。从北美和欧洲的大学到亚洲的研究机构和全球各地的科技中心,内容满足了多样化的学习需求和不同文化背景。

交互式分析仪表板可在mlsysbook.ai的在线版本中找到

想要帮忙吗?

这是一个协作项目,您的贡献非常重要!如果您想做出贡献,请查看我们的贡献指南。欢迎提供反馈、纠正和新想法。只需在 GitHub 上提交问题即可。

我们热切邀请您通过贡献您的专业知识、反馈和想法加入我们的旅程。

作者注记

人工智能注定将以深刻的方式改变世界,就像计算机和互联网在 20 世纪革命性地改变了社会的每一个方面一样。从生成文本和图像等创造性内容的系统到推动药物发现和科学研究突破的系统,人工智能正在引领一个新时代——一个在范围和影响上可能更加变革性的时代。但是,我们如何让它对每个人来说都触手可及呢?

随着其变革力量的到来,那些使用它或与之合作的人也承担着同样重大的责任。正如我们期望公司以道德的方式行使他们的影响力一样,我们这些学术界的人也承担着相应的责任:公开分享我们的知识,使其惠及每个人——而不仅仅是少数人。这种信念激励了这本书的创建——一个开源资源,旨在使人工智能教育,尤其是人工智能工程和系统,对所有行业的人都是包容的和可访问的。

我对创造、编辑和整理这些内容的热情深受那些深刻塑造了我的学术和个人旅程的里程碑式教科书的影响。无论是从头到尾研读它们,还是从关键段落中汲取灵感,这些资源从根本上塑造了我的思维方式。我反思了引导我道路的书籍:图灵奖得主大卫·帕特森和约翰·亨尼斯的作品——计算机架构和系统设计的先驱——以及像杨立昆、杰弗里·辛顿和约书亚·本吉奥这样的杰出人物的基础性研究论文,他们开创了现代深度学习。在某种程度上,我的希望是这本书能够激励学生规划他们自己独特的道路。

我对人工智能的未来持乐观态度。它有潜力以我们尚未想象的方式解决全球挑战并激发创造力。然而,为了实现这一目标,我们必须培养下一代人工智能工程师和实践者——那些能够将新颖的人工智能算法转化为可扩展、可靠的系统,并在现实世界环境中运行的人。这本书就是朝着构建下一代人工智能工程师迈出的一步,他们将把今天的愿景转化为明天的现实。

这本书仍在不断完善中,但知道即使一个学习者从其内容中受益,这也激励我不断改进和扩展它。为此,如果读者们能做一件事,那就是:请通过在这里GitHub 仓库上给这本书加星来表示您的支持。您的星号⭐反映了您对这个使命的信念——不仅是对我,也是对日益增长的全球学习者、教育者和实践者社区。这一小举动不仅仅具有象征意义——它放大了使人工智能教育可访问的重要性。

我是我自己写作的学生,这本书的每一章都教会了我新的东西——感谢那些在塑造这项工作中扮演并继续扮演重要角色的众多人。教授们、学生、实践者和研究人员通过提出建议、分享专业知识、识别错误和提出改进意见做出了贡献。从详细的批评到简单的纠正,每一次互动都是协作知识创造的教训。这些贡献不仅完善了材料,也加深了我对知识如何通过协作增长的理解。因此,这本书不仅仅是我的作品;它是一个共同的努力,反映了那些致力于分享知识和努力的集体精神。

这本书献给我父亲永恒的怀念。他对教育的热情、无尽的好奇心、分享知识的慷慨以及对他所做之事质量的坚定不移的承诺,每天都激励我努力追求卓越。为了纪念他,我将这个献词扩展到世界各地的教师和导师,他们的努力和指导每天都在改变人们的生活。你们的无私贡献提醒我要坚持不懈。

最后但同样重要的是,没有我亲爱的妻子和孩子们坚定不移的支持,这项工作是不可能完成的。他们的爱、耐心和鼓励构成了我追求激情并使这项工作得以实现的基础。为此,以及更多,我深表感激。

—— 维贾伊·贾纳帕·雷迪教授

关于本书

概述

本节提供了关于本书目的、发展背景以及读者可以从他们的学习之旅中期待什么的必要背景信息。

本书目的

本书的目标是为寻求理解机器学习系统原理和实践的教育者和学习者提供资源。本书不断更新,以纳入最新的见解和有效的教学策略。我们希望它仍然是这个快速发展的领域中的一个宝贵资源。所以请经常查看!

背景和发展

本书起源于学生、研究人员和从业者的协作努力。在保持其学术严谨性和现实世界的适用性的同时,它通过定期的更新和精心的策划不断进化,以反映机器学习系统领域的最新发展。

期待内容

本教科书遵循精心设计的教学法进展,反映了专家机器学习系统工程师发展技能的方式。学习之旅在五个不同的阶段展开:

第一阶段:理论 - 通过基础设计原则建立你的概念基础,确立支撑所有有效系统工作的心智模型。

第二阶段:性能 - 掌握性能工程,将理论理解转化为在资源受限的真实世界环境中高效运行的系统。

第三阶段:实践 - 探索稳健部署挑战,学习如何在开发环境的控制之外使系统可靠地工作。

第四阶段:伦理 - 探索可信系统,以确保你的系统能够有益且可持续地为社会服务。

第五阶段:愿景 - 展望机器学习系统前沿,了解新兴范式并为下一代挑战做好准备。

实验室练习在核心理论基础之后有策略地安排,让你能够通过在多个嵌入式平台上的动手经验应用概念。全书,测验提供了在关键学习里程碑上巩固理解的快速自我检查。

教学哲学:基础先行

机器学习系统代表固有的复杂工程挑战。然而,它们是由必须彻底理解的基本构建块构成的,在向复杂实现迈进之前必须理解这些构建块。这种教学法与既定的教育进展平行:学生在解决分布式系统之前掌握基本算法,或者在参与高级机器学习理论之前发展线性代数的熟练度。机器学习系统同样具有必要的基础组件,这些组件是所有后续学习的基础。

我们的课程强调掌握这些核心构建块:

  • 模型与硬件之间的交互

  • 数据流通过系统

  • 计算模式出现

  • 单个系统内的优化原则

通过对这些基础知识的全面理解,学生可以发展出有效的分析框架,以应对包括分布式训练架构、多设备协调协议和新兴技术范式在内的复杂场景。

这种以基础为先的方法优先考虑概念深度而非主题广度。这种方法使学生能够构建稳健的心智模型,这些模型将作为他们机器学习系统持续演变的职业生涯中的持久智力资源。

学习目标

本节概述了指导本书设计的教育框架和读者将实现的具体学习目标。

关键学习成果

本书的结构是以[布卢姆分类法](https://cft.vanderbilt.edu/guides-sub- pages/blooms-taxonomy/)为依据的(图 1),它定义了从基础知识到高级创造性思维六个学习层次:

图片

图 1:布卢姆分类法(2021 年版)。

  1. 记忆: 回忆基本事实和概念。

  2. 理解: 解释想法或过程。

  3. 应用: 在新情况下使用知识。

  4. 分析: 将信息分解为组成部分。

  5. 评估: 根据标准做出判断。

  6. 创造: 产生原创作品或解决方案。

学习目标

本书支持读者在机器学习系统生命周期中发展实用专业知识:

  1. 系统思维: 理解机器学习系统与传统软件的区别,并推理硬件-软件交互。

  2. 工作流程工程: 设计端到端机器学习管道,从数据工程到部署和维护。

  3. 性能优化: 应用系统方法使系统更快、更小、更高效地使用资源。

  4. 生产部署: 解决包括可靠性、安全性、隐私和可扩展性在内的现实世界挑战。

  5. 负责任的发展: 探索伦理影响并实施可持续的、有益于社会的 AI 系统。

  6. 未来技能: 培养判断力以评估新兴技术并适应不断发展的范式。

  7. 动手实施: 在各种嵌入式平台和资源限制下获得实践经验。

  8. 自主学习: 使用集成评估和交互式工具跟踪进度并深化理解。

人工智能学习伴侣

在整个资源中,您将找到SocratiQ,这是一个旨在增强您学习体验的人工智能学习助手。SocratiQ 受到苏格拉底教学方法的启发,结合了互动测验、个性化协助和实时反馈,帮助您巩固理解并建立新的联系。作为我们集成生成式人工智能技术的一部分,SocratiQ 鼓励批判性思维和与材料的积极互动。

SocratiQ 仍在开发中,我们欢迎您的反馈以使其变得更好。有关 SocratiQ 如何工作以及如何充分利用它的更多详细信息,请访问 AI 学习伴侣页面。

如何使用本书

书籍结构

本书带你从概念上理解机器学习系统,到在实践中构建和部署它们。每一部分都发展了特定的能力:

核心内容:

  1. 基础 掌握基础知识。建立对机器学习系统与传统软件差异的直觉,理解硬件-软件堆栈,并熟练掌握基本架构和数学基础。

  2. 设计原则 设计完整的流程。学习设计端到端机器学习管道,管理复杂的数据工程挑战,选择适当的框架,并协调大规模训练。

  3. 性能工程 针对实际约束进行优化。通过模型优化、硬件加速和系统性能分析,发展使系统更快、更小、更高效的技能。

  4. 稳健部署 构建生产就绪的系统。从单个设备约束进步到系统级操作。随着系统规模的扩大,掌握设备学习、安全和隐私,以及应对故障的鲁棒性和协调生产部署的机器学习操作。

  5. 可信系统 负责任地设计。导航机器学习系统的社会和环境影响,实施负责任的 AI 实践,并创造服务于公共利益的科技。

  6. 机器学习系统前沿 为未来做准备。理解新兴范式,预测未来挑战,并发展评估新技术的判断力,随着技术的出现。

动手学习:

  1. 实验室练习 实施你所学的一切。从基于微控制器的系统进步到边缘计算平台,体验嵌入式机器学习中的资源约束和优化挑战的全谱系。

建议阅读路径

  • 初学者:从基础开始,建立概念理解,然后通过设计原则,选择相关的实验室练习以获得实践经验。

  • 从业者:关注设计原则性能工程稳健部署,以获得实用的系统设计见解,辅以特定平台的实验室练习。

  • 研究人员:探索性能工程可信系统机器学习系统前沿的高级主题,以及共享工具实验室部分的比较分析。

  • 动手学习者:将任何核心内容部分与 Arduino、Seeed、Grove Vision 和 Raspberry Pi 平台上的综合实验室练习相结合,以获得实践经验。

针对不同背景的学生

这本教科书欢迎来自不同学术背景的学生,无论您来自计算机科学、工程、数学还是其他领域。理解机器学习系统如何与您现有的知识相联系有助于将理论概念与实际应用联系起来:

计算机科学学生:机器学习系统将熟悉的概念扩展到新的领域。如果您已经与算法和数据结构工作过,可以将机器学习视为学习算法,这些算法根据数据模式自动优化自己,而不是遵循固定的指令。

您在系统设计、内存管理、并行处理和分布式系统方面的经验直接适用于机器学习部署。底层计算复杂性分析仍然适用——我们分别分析训练和推理阶段的时间和空间复杂性。

电气和计算机工程学生:机器学习系统代表了信号处理和控制系统原理的自然演变。机器学习可以被视为高级信号处理,我们从嘈杂、高维信号中提取有意义的模式。

神经网络执行类似于滤波器的操作——图像处理中的卷积层实际上是您已经学习过的卷积操作。您在计算机系统组织和架构方面的背景对于理解机器学习算法如何映射到不同的硬件平台至关重要,而您对内存层次结构的理解有助于优化大规模训练系统中的数据移动。

来自其他背景的学生:将机器学习系统比作现代工厂的装配线。正如工厂通过协调的阶段将原材料转化为成品,机器学习系统通过相互连接的组件将原始数据转化为有用的预测。

数学——线性代数、概率和微积分——是这个工厂的“工具”,但您不需要成为工具专家就能理解装配线是如何工作的。大多数概念通过具体的例子变得清晰,例如通过思考图书管理员如何根据您的阅读历史推荐书籍来理解推荐系统的工作原理。

关键技能是系统思维:理解数据管道、训练过程和部署基础设施如何协同工作,就像供应链、制造和分销在任何复杂操作中必须协调一样。

模块化设计

本书旨在设计灵活的学习方式,允许读者独立探索章节或遵循建议的顺序。每一章都整合了:

  • 互动测验用于自我评估和知识巩固

  • 实践练习将理论与实现联系起来

  • 实验室经验提供针对特定平台的动手学习平台

我们采用迭代的方法来开发内容——在有价值的信息可用时分享,而不是等待完美。您的反馈帮助我们不断改进和精炼这一资源。

我们还借鉴了该领域专家的优秀工作,培养了一个知识共享、扩展和共同进步的协作学习生态系统。

透明度和协作

这本书最初是一个由 CS249r 的学生、哈佛及其它同事以及更广泛的机器学习系统社区共同推动的项目。其内容通过开放协作、深思熟虑的反馈和现代编辑工具(包括基于规则的脚本和生成式 AI 技术)而演变。在一种合适的转折中,我们在这本书中研究的系统帮助精炼了其页面,突显了人类专业知识和机器智能之间的相互作用。幸运的是,它们还没有准备好自己设计系统——至少,目前还没有。

作为主要作者、编辑和策展人,我(Vijay Janapa Reddi 教授)提供人工监督,以确保教科书材料保持准确、相关且质量最高。尽管如此,没有人是完美的——所以可能存在错误。欢迎并鼓励您的反馈。这种协作模式对于保持质量并确保知识保持开放、演变和全球可访问至关重要。

版权和许可

这本书是开源的,通过 GitHub 进行协作开发。除非另有说明,本作品根据Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)许可证授权。

贡献者保留对其个人贡献的版权,这些贡献是捐赠给公共领域或以与原始项目相同的开源许可证发布的。有关作者身份和贡献的更多信息,请访问GitHub 仓库

加入社区

这本教科书不仅仅是一个资源——它是一份邀请,邀请我们一起协作和学习。参与社区讨论,分享见解,应对挑战,并与同学、研究人员和从业者一起学习。

无论你是刚开始学习的学生,还是在解决现实世界挑战的从业者,还是探索高级概念的研究人员,你的贡献将丰富这个学习社区。自我介绍,分享你的目标,让我们共同构建对机器学习系统的更深入理解。

书籍变更日志

这本机器学习系统教科书不断进化。这个变更日志旨在记录所有更新和改进,帮助您了解最新和精炼的内容。

自动变更日志

这些变更日志条目是自动从我们的开发过程中生成的,应该大部分是准确的。它们追踪代码变更、内容更新以及整本书的改进。虽然条目很全面,但偶尔可能包含一些小的错误或过于技术性的细节。

对于完整且最新的变更日志,请访问在线版本,链接为 mlsysbook.ai/changelog

致谢

本书灵感来源于TinyML edX 课程和哈佛大学的 CS294r。它代表了与学生们、研究人员和从业者多年的合作,他们塑造了本书的发展。我们对那些开创性工作为其奠定基础的人们深表感激。

通过这次合作,我们对机器学习系统的理解加深了,我们意识到基本原理适用于所有规模,从小型嵌入式系统到大规模部署。这一认识促使本书从 TinyML 扩展到提供适用于所有机器学习系统实施规模的基石。

资助机构和公司

学术支持

我们感谢学术支持,这使得我们能够雇佣教学助理来帮助改进教学材料和教学质量:

图片

图片

图片

非营利机构和机构支持

我们衷心感谢以下非营利组织和机构对教育推广工作的支持,为发展中国家学生提供奖学金资金,并组织研讨会使用这些材料:

图片

图片

企业支持

以下公司为本书实验室提供了硬件套件,支持了动手教育材料的发展,提供了技术工具和调试协助,或提供了基础设施和托管服务:

图片

图片

图片

图片

图片

贡献者

我们对开源社区中的学习者、教育者和贡献者表示衷心的感谢。每个贡献,无论是章节部分还是单个单词的纠正,都显著提高了这一资源的质量。我们还感谢那些在幕后分享见解、识别问题并提供宝贵反馈的人。

本书受益于一个不断发展的贡献者社区。有关所有 GitHub 贡献者的完整和最新列表,请访问在线版本mlsysbook.ai/acknowledgements。这个开源项目的协作性质意味着新贡献者会定期加入。对于有兴趣贡献的人,请参阅我们的GitHub 仓库

SocratiQ AI

在线 AI 学习伴侣

SocratiQ(发音为“苏格拉底”)是仅在此教科书的在线版本中提供的 AI 学习助手,位于mlsysbook.ai。受苏格拉底教学法启发,SocratiQ 提供:

  • 互动测验,针对每个部分定制并提供即时反馈

  • 当您选择文本并提问时,提供个性化解释

  • 进度跟踪,带有成就徽章和性能分析

  • 对话式辅助,用于复杂的机器学习系统概念

要体验 SocratiQ 的全部功能,请访问在线版本,在那里您可以:

  • 通过简单的切换启用 SocratiQ

  • 每个部分之后进行自动生成的测验

  • 通过选择任何文本来获取上下文帮助

  • 使用个人仪表板跟踪您的学习进度

在我们的研究论文中了解更多关于 SocratiQ 的设计和教学法:SocratiQ:个性化教育和更广泛可访问性的生成式 AI 学习伴侣

访问 mlsysbook.ai 以访问这些交互式学习功能。

引言

DALL·E 3 提示:一个详细的、矩形的、平面的 2D 插图,展示了一本关于机器学习系统章节的路线图,背景为清晰、干净的白色。图像中有一条蜿蜒的道路穿过各种象征性的地标。每个地标代表一个章节主题:引言、机器学习系统、深度学习、AI 工作流程、数据工程、AI 框架、AI 训练、高效 AI、模型优化、AI 加速、AI 基准测试、设备上学习、嵌入式 AIOps、安全与隐私、负责任 AI、可持续 AI、AI 做善事、鲁棒 AI、生成 AI。风格简洁、现代、扁平,适合技术书籍,每个地标都清楚地标有其章节标题。

图片

目的

为什么我们必须掌握治理能够学习、适应和在大规模上运行的系统的工程原则?

机器学习代表了自可编程计算机以来计算领域最重大的变革,它使得系统的行为从数据中产生,而不是从明确的指令中产生。这种变革需要新的工程基础,因为传统的软件工程原则无法解决基于经验学习和适应的系统。从气候建模和医疗诊断到自主交通,每一个主要的技术挑战都需要能够处理大量数据并在不确定性下可靠运行的系统。理解机器学习系统工程决定了我们解决超出人类认知能力复杂问题的能力。这一学科为构建能够在部署环境中扩展的系统提供了基础,从大型数据中心到资源受限的边缘设备,为 21 世纪的技术进步奠定了技术基础。

学习目标

  • 将机器学习系统定义为包含数据、算法和基础设施的集成计算系统

  • 通过故障模式分析区分机器学习系统工程与传统软件工程

  • 使用 AI 三角形框架分析数据、算法和计算基础设施之间的相互依赖关系

  • 跟踪从符号系统到统计学习再到深度学习的 AI 范式的历史演变

  • 评估 Sutton 的“苦涩教训”对现代机器学习系统工程优先级的含义

  • 将机器学习系统中的静默性能下降与传统软件故障模式进行比较

  • 对比机器学习系统生命周期阶段与传统软件开发

  • 将机器学习系统中的现实挑战按数据、模型、系统和伦理类别进行分类

  • 应用五支柱框架评估机器学习系统架构

人工智能的工程革命

今天的工程实践正处于一个转折点,其重要性可与科技史上最具变革性的时期相媲美。工业革命确立了机械工程作为一门管理物理力的学科,而数字革命则正式化了计算工程,以处理算法复杂性。如今,人工智能系统需要一种新的工程范式来应对表现出学习行为、自主适应和操作规模超越传统软件工程方法的新系统。

这种转变重新定义了工程系统的本质。传统的确定性软件架构根据显式编程的指令运行,对给定的输入产生可预测的输出。相比之下,机器学习系统是概率性架构,其行为源于从训练数据中提取的统计模式。这种转变引入了工程挑战,这些挑战定义了机器学习系统工程的学科:确保在行为是通过学习而非编程的系统中的可靠性,实现处理 PB 级 1 数据集并服务于数十亿并发用户时的可扩展性,以及在操作数据分布与训练数据分布不一致时保持鲁棒性。

这些挑战为机器学习系统工程作为一门独立的学术学科的理论和实践基础奠定了基础。本章提供了理解这一领域的创建历史和区分机器学习系统与传统软件架构的工程原则的概念基础。分析综合了来自计算机科学、系统工程和统计学习理论的观点,为智能系统的系统研究建立了一个框架。

我们的调查从人工智能作为研究目标与机器学习作为实现智能行为的计算方法之间的关系开始。然后我们确定了构成机器学习系统的要素,即该学科构建的包含数据、算法和基础设施的集成计算系统。通过历史分析,我们追溯了人工智能范式的演变,从符号推理系统到统计学习方法,再到当代深度学习架构,展示了每个过渡都要求新的工程解决方案。这一进展照亮了 Sutton 的“苦涩教训”:领域通用的计算方法最终会超越手工构建的知识表示,将系统工程定位为人工智能进步的核心。

这个历史和技术基础使我们能够正式定义这一学科。遵循计算机工程从电气工程和计算机科学中诞生的模式,我们将它确立为一个专注于在计算平台构建可靠、高效和可扩展机器学习系统的领域。这个正式定义既涵盖了实践中使用的术语,也涵盖了从业者实际构建的技术范围。

在这个基础上,我们引入了结构化本文本中机器学习系统分析的理论框架。AI 三角提供了一个理解数据、算法和计算基础设施之间相互依赖关系的概念模型。我们考察机器学习系统生命周期,将其与传统软件开发方法进行对比,以突出问题制定、数据整理、模型开发、验证、部署和持续维护等独特阶段,这些阶段是机器学习系统工程的特征。

这些理论框架通过考察代表性的部署场景得到证实,这些场景展示了应用领域内工程需求的多样性。从在网络边缘运行且具有严格延迟约束的自动驾驶汽车到通过云基础设施为数十亿用户提供服务的推荐系统,这些案例研究说明了部署环境如何塑造系统架构和工程权衡。

分析通过确定建立机器学习系统工程为必要且复杂学科的核心理念而结束:需要专门监控方法的静默性能退化模式,数据质量问题和分布变化损害了模型的有效性,对模型在高风险应用中的鲁棒性和可解释性的要求,超出传统分布式系统的基础设施可扩展性需求,以及强加新的系统要求类别的伦理考量。这些挑战为构建文本的五支柱组织框架提供了基础,将机器学习系统工程划分为相互关联的子学科,以促进稳健、可扩展和负责任的人工智能系统的发展。

本章为第一部分:系统基础,建立了理论基础,介绍了所有后续对机器学习系统工程分析的基础原则。这里引入的概念框架提供了将在后续章节中完善和应用的分析工具,最终形成一个能够在生产环境中可靠地交付人工智能能力的系统工程方法。

从人工智能愿景到机器学习实践

在确立了人工智能在社会各领域的变革性影响之后,一个问题随之而来:我们实际上如何创建这些智能能力?理解人工智能与机器学习之间的关系是回答这个问题的关键,也是本书后续所有内容的中心。

人工智能代表了创建能够执行需要类似人类智能的任务的系统的广泛目标:识别图像、理解语言、做出决策和解决问题。人工智能是“什么”,是智能机器可以学习、推理和适应的愿景。

机器学习(ML)代表了创建表现出智能行为的系统的方法论方法和实践学科。而不是通过预定的规则实现智能,机器学习提供了通过数学过程自动发现数据中模式的计算技术。这种方法将人工智能的理论洞察转化为功能系统。

以棋类系统的演变为例,说明这种转变。人工智能的目标保持不变:“创建一个可以像人类一样下棋的系统。”然而,方法不同:

  • 符号人工智能方法(预机器学习):用所有棋规和手工策略,如“控制中心”和“保护国王”,编程计算机。这需要专家程序员明确编码数千条棋理,从而创建出脆弱的系统,这些系统在处理新位置时遇到困难。

  • 机器学习方法:让计算机分析数百万场棋局,从数据中自动学习获胜策略。而不是编程特定的走法,系统通过分析游戏结果进行统计分析,发现导致胜利的模式。

这种转变说明了为什么机器学习已成为主导方法:在基于规则的系统中,人类将领域专业知识直接转换为代码。在机器学习系统中,人类整理训练数据,设计学习架构,并定义成功指标,使系统能够从示例中提取自己的操作逻辑。数据驱动系统可以适应程序员从未预料到的情况,而基于规则的系统仍然受限于其原始编程。

机器学习系统通过与人学习模式平行的过程获得识别能力。物体识别通过接触大量示例而发展,而自然语言处理系统通过广泛的文本分析获得语言能力。这些学习方法将人工智能研究中发展的智能理论转化为实际操作,建立在我们在整篇文章中系统建立的数学基础上。

AI 作为研究愿景与 ML 作为工程方法之间的区别对系统设计具有重大影响。现代 ML 的数据驱动方法需要能够收集、处理和从大量数据中学习的基础设施。通过广泛的研究和主要范式转变 2,机器学习成为人工智能的一种实用方法,将关于智能的理论原则转化为形成今天智能能力算法基础的运行系统。

人工智能(AI)是计算机科学的一个领域,专注于创建执行需要类似人类智能的任务的系统,包括学习推理适应

机器学习(ML)是使系统能够从数据中自动学习模式并做出决策的 AI 方法,而不是遵循明确的编程规则。

从基于规则的 AI 到数据驱动的 ML 的演变代表了计算历史上最重大的转变之一。这种转变解释了为什么机器学习系统工程成为一门学科:通往智能系统的道路现在是通过构建能够从大量数据中有效学习的系统这一工程挑战。

定义 ML 系统

在探索我们如何到达现代机器学习系统之前,我们首先必须确立我们所说的“ML 系统”的含义。这个定义为我们理解历史演变和随之而来的当代挑战提供了概念框架。

对于机器学习系统尚无普遍接受的定义,这反映了该领域的快速演化和跨学科性质。然而,基于我们对现代 ML 依赖于大规模数据驱动方法的了解,这本教科书采用了一种涵盖算法运行整个生态系统的视角:

机器学习系统是由三个相互依存的组件组成的集成计算系统:数据指导行为,算法学习模式,以及计算基础设施使训练推理成为可能。

如图 1.1 所示,任何机器学习系统的核心由三个相互关联的组件组成,形成一个三角形的依赖关系:模型/算法、数据和计算基础设施。每个元素都塑造了其他元素的可能性。模型架构决定了训练和推理的计算需求,以及有效学习所需的数据量和结构。数据的规模和复杂性影响所需的存储和处理基础设施,同时确定哪些模型架构是可行的。基础设施能力为模型规模和数据处理能力设定了实际限制,为其他组件必须运行的框架。

图片

图 1.1:组件相互依赖性:机器学习系统性能依赖于模型、数据和计算基础设施的协调交互;任何一个组件的限制都会约束其他组件的能力。有效的系统设计需要平衡这些相互依赖关系,以优化整体性能和可行性。

每个组件都服务于一个独特但相互关联的目的:

  • 算法:从数据中学习模式以进行预测或决策的数学模型和方法

  • 数据:收集、存储、处理、管理和为训练和推理提供数据的流程和基础设施

  • 计算:支持大规模训练、服务和管理模型的硬件和软件基础设施

如三角形所示,没有任何一个元素可以独立运作。算法需要数据和计算资源,大量数据集需要算法和基础设施才能发挥作用,而基础设施需要算法和数据才能实现任何目的。

太空探索为这些关系提供了一个恰当的类比。算法开发者类似于探索新领域的宇航员和发现者。数据科学团队就像任务控制专家,确保任务操作中关键信息和资源的持续流动。计算基础设施工程师类似于火箭工程师,设计和构建支持任务的系统。正如太空任务需要宇航员、任务控制和火箭系统的无缝集成一样,机器学习系统需要仔细协调算法、数据和计算基础设施。

当考察人工智能历史上的突破性时刻时,这些相互依赖关系变得清晰。2012 年的 AlexNet3 突破体现了定义现代机器学习系统工程的硬件-软件协同设计原则。这次深度学习革命之所以成功,是因为算法创新(卷积神经网络)与硬件能力(并行 GPU 架构)相匹配,原本为游戏设计的图形处理单元被重新用于人工智能计算,为机器学习任务提供了 10-100 倍的速度提升。卷积操作本质上是并行的,这使得它们非常适合 GPU 的数千个并行核心。这种协同设计方法继续塑造整个行业中的机器学习系统开发。

在建立这个三组件框架之后,我们必须理解一个基本区别,这个区别区分了机器学习系统与传统软件:AI 三角形组件中失败的表现。

机器学习系统与传统软件的区别

AI 三角形框架揭示了机器学习系统由什么组成:指导行为的资料,提取模式的算法,以及使学习和推理成为可能的基础设施。然而,仅仅理解这些组件并不能捕捉到使机器学习系统工程与传统软件工程根本不同的地方。关键的区别在于这些系统如何失败。

传统软件表现出明显的故障模式。当代码出错时,应用程序会崩溃,错误信息会传播,监控系统会触发警报。这种即时反馈使得快速诊断和修复成为可能。系统要么正确运行,要么出现可观察到的故障。机器学习系统在根本上是不同的范式:它们可以在性能下降的同时继续运行,而不会触发传统的错误检测机制。算法继续执行,基础设施继续提供预测服务,但学习到的行为变得越来越不准确或与上下文不相关。

考虑一下自动驾驶汽车的感知系统如何说明这种区别。传统的汽车软件表现出二元的操作状态:发动机控制单元要么正确管理燃油喷射,要么触发诊断警告。通过标准监控,故障模式仍然是可观察的。基于机器学习的感知系统提出了一个质的不同挑战:由于季节变化——不同的光照条件、服装模式或训练数据中未充分代表的天气现象,该系统在几个月内检测行人的准确性可能会从 95%下降到 85%。车辆继续运行,成功检测到大多数行人,但性能下降创造了只有通过系统性地监控边缘情况和全面评估才能显现的安全风险。传统的错误记录和警报机制在系统变得可测量地不安全时保持沉默。

这种无声的退化体现在 AI 三角形的三个组成部分中。随着世界的变化,数据分布也在变化:用户行为在演变,季节性模式出现,新的边缘情况出现。算法继续基于过时的学习模式进行预测,而不知道它们的训练分布已经不再与操作现实相匹配。基础设施忠实地服务于这些越来越不准确的预测,放大了问题。一个经历这种退化的推荐系统可能会在六个月内从 85%的准确率下降到 60%,因为用户偏好发生变化,训练数据变得陈旧。系统继续生成推荐,用户收到结果,基础设施报告健康的服务时间指标,但商业价值却在无声地侵蚀。这种退化通常源于训练-服务偏差,即训练和服务管道中计算的特征不同,导致模型性能下降,尽管代码没有改变,这是一个表现为算法失败的基础设施问题。

这种基本不同的失败模式以要求新的工程实践的方式将机器学习系统与传统软件区分开来。传统的软件开发侧重于消除错误和确保确定性行为。机器学习系统工程必须解决概率行为、演化的数据分布以及没有代码更改发生的性能退化。监控系统必须跟踪的不仅仅是基础设施健康,还有模型性能、数据质量和预测分布。部署实践必须能够实现数据分布变化时的持续模型更新。整个系统生命周期,从数据收集到模型训练再到推理服务,必须考虑到无声的退化。

这种操作现实确立了为什么在研究环境中开发的机器学习系统需要专门的工程实践才能达到生产部署。机器学习系统所要求的独特生命周期和监控需求直接源于这种失败特征,确立了机器学习系统工程作为一个独立学科的内在动机。

理解机器学习系统如何以不同的方式失败,提出了一个重要的问题:鉴于 AI 三角形的三个组成部分——数据、算法和基础设施——我们应该优先考虑哪个来推进人工智能的能力?我们应该投资于更好的算法、更大的数据集,还是更强大的计算基础设施?这个问题的答案揭示了为什么系统工程已经成为人工智能进步的核心。

《痛苦的教训:为什么系统工程很重要》

70 年人工智能研究最大的教训是,能够利用大规模计算的系统能够最终获胜。这就是为什么系统工程,而不仅仅是算法的巧妙性,已经成为人工智能进步的瓶颈。

从符号人工智能到统计学习再到深度学习的演变,对系统构建者提出了一个基本问题:我们应该专注于开发更复杂的算法、整理更好的数据集,还是构建更强大的基础设施?

这个问题的答案塑造了我们对构建人工智能系统的方法,并揭示了为什么系统工程已成为一门学科。

历史提供了统一的答案。在数十年的 AI 研究中,最大的突破并非来自对人类知识的更好编码或更多的算法技术,而是找到了更有效地利用更多计算资源的方法。这种模式,由强化学习先驱理查德·萨顿在 2019 年的文章《苦涩的教训》(Sutton 2019)中阐述,表明系统工程已成为人工智能成功的决定因素。

萨顿观察到,强调人类专业知识和领域知识的途径,虽然能带来短期改进,但始终被能够利用大量计算资源的一般方法超越。他写道:“从 70 年的 AI 研究中可以得出的最大教训是,利用计算的一般方法最终是最有效的,并且差距很大。”

这一原则在人工智能的突破中得到了验证。在棋类游戏中,IBM 的 Deep Blue 在 1997 年击败了世界冠军加里·卡斯帕罗夫(Campbell, Hoane, and Hsu 2002),并非通过编码棋类策略,而是通过每秒评估数百万个位置的暴力搜索。在围棋中,DeepMind 的 AlphaGo(Silver et al. 2016)通过自我对弈学习而非研究数百年的围棋智慧,实现了超人类的表现。在计算机视觉中,直接从数据中学习特征的卷积神经网络超越了数十年的手工特征工程。在语音识别中,端到端深度学习系统优于基于详细的人类语音学和语言学的模型的方法。

这节课的“苦涩”之处在于我们的直觉误导了我们。我们自然地认为,将人类专业知识编码化应该是通往人工智能的道路。然而,在足够大的规模下,反复证明的是,利用计算从数据中学习的系统优于依赖人类知识的系统。这一模式在符号人工智能、统计学习和深度学习时代都得到了保持——我们将在下一节追踪人工智能的历史演变时详细探讨这一一致性。

考虑现代语言模型如 GPT-4 或图像生成系统如 DALL-E。它们的强大功能并非源于人类编码的语言或艺术理论,而是通过在大量数据上使用巨大的计算资源训练通用神经网络而实现的。训练 GPT-3 消耗了大约 1,287 MWh 的能源 (Strubell, Ganesh, and McCallum 2019a; D. Patterson et al. 2021a),相当于 120 个美国家庭一年的能源消耗,而服务于数百万用户则需要消耗兆瓦级持续功率的数据中心。工程挑战在于构建能够管理这种规模系统的系统:收集和处理 PB 级的训练数据,协调数千个每个消耗 300-500 瓦的 GPU 进行训练,以毫秒级延迟向数百万用户提供模型服务,同时管理热能和电力限制 5,并基于实际性能持续更新系统。

这些规模需求揭示了技术现实:现代机器学习系统的主要限制不是计算能力,而是内存带宽 6,即数据在存储和处理单元之间移动的速度。这个内存墙代表了决定系统性能的主要瓶颈。现代机器学习系统受内存限制,矩阵乘法操作只能达到理论峰值 FLOPS 的 1-10%,因为处理器大部分时间都在等待数据而不是计算。将 1GB 数据从 DRAM 移动需要大约比 32 位乘法操作多 1000 倍的能源,使得数据移动成为性能和能耗的主要因素。Amdahl 定律 7 量化了这种基本限制:如果数据移动消耗了 80% 的执行时间,即使有无限的计算能力也只能提供 1.25 倍的速度提升(因为只有剩余的 20% 可以加速)。这个内存墙推动了所有现代架构创新,从内存计算和近数据处理到将计算和存储元素协同定位的专用加速器。这些系统级挑战代表了本书系统性地探讨的核心工程问题。

Sutton 的惨痛教训有助于解释本书的动机。如果人工智能的进步取决于我们有效扩展计算的能力,那么理解如何构建、部署和维护这些计算系统就成为了人工智能从业者最重要的技能。机器学习系统工程变得重要,因为创建现代系统需要协调多个数据中心中的数千个 GPU,处理 PB 级的文本数据,并以毫秒级延迟向数百万用户提供模型服务。这一挑战需要分布式系统 8、数据工程、硬件优化和运营实践方面的专业知识,这代表了一个全新的工程学科。

这些系统级挑战的汇聚表明,没有现有学科能够满足现代 AI 的需求。虽然计算机科学推动了机器学习算法的发展,而电气工程开发了专门的 AI 硬件,但单独的这两个学科都无法提供部署、优化和大规模维持 ML 系统所需的工程原则。这个差距需要一个新的工程学科。但为了理解为什么这个学科现在出现以及它采取的形式,我们必须首先追溯 AI 本身的演变,从早期的符号系统到现代机器学习。

AI 范式的历史演变

通过“苦涩教训”我们确立的系统中心视角并非一夜之间出现。它是在数十年的 AI 研究中逐渐形成的,每一次主要转变都揭示了算法、数据和计算基础设施之间关系的新见解。追踪这一演变不仅帮助我们理解技术进步,还解释了今天对可扩展系统的重视背后的方法转变。

理解为什么现在会发生这种向系统化机器学习的转变,需要认识到在过去十年中三个因素的汇聚:

  1. 大规模数据集:互联网时代通过网页内容、社交媒体、传感器网络和数字交易创造了前所未有的数据量。像 ImageNet(数百万个标记图像)和 Common Crawl(数十亿个网页)这样的公共数据集为学习复杂模式提供了原材料。

  2. 算法突破:深度学习在计算机视觉到自然语言处理等多个领域都证明非常有效。像 transformers、注意力机制和迁移学习等技术使得模型能够从数据中学习可泛化的表示。

  3. 硬件加速:最初为游戏设计的图形处理单元(GPU)为机器学习计算提供了 10-100 倍的加速。云计算基础设施使得这种计算能力在没有大量资本投资的情况下变得可访问。

这种汇聚解释了为什么我们从理论模型转向了需要新工程学科的大规模部署系统。每个因素都放大了其他因素:更大的数据集需要更多的计算,更好的算法证明了更大的数据集的合理性,而更快的硬件使得更多的算法成为可能。这种汇聚将 AI 从学术好奇心转变为需要稳健工程实践的生产技术。

AI 的演变,如图 1.2 所示的时间线所示,突出了关键里程碑,如 1957 年由 Frank Rosenblatt(Wolfe et al. 2024)开发的感知器 9,这是一种早期的计算学习算法。1965 年的计算机实验室 10 中运行着能够证明基本数学定理或玩简单的游戏如井字棋的主机。尽管这些早期的人工智能系统在当时具有开创性,但它们与今天在医学图像中检测癌症或理解人类语音的机器学习系统相比,存在很大差异。时间线显示了从 1966 年的 ELIZA11 聊天机器人等早期创新到 1997 年 IBM 的 Deep Blue 击败国际象棋冠军 Garry Kasparov 等重要突破的进展(Campbell, Hoane, and Hsu 2002)。更近期的进步包括 2020 年 OpenAI 的 GPT-3 和 2023 年的 GPT-4(OpenAI et al. 2023)的引入,展示了几十年间 AI 系统的显著演变和日益增加的复杂性。

图 1.2:AI 发展时间线:早期 AI 研究侧重于符号推理和基于规则的系统,而现代 AI 利用如神经网络等数据驱动方法来实现越来越复杂的任务。这种进展揭示了从手编智能到学习智能的转变,以感知器、Deep Blue 和 GPT-3 等大型语言模型等里程碑为标志。

检查这个时间线可以揭示几个不同的发展时期,每个时期都是在其前辈的教训基础上建立起来的,同时解决阻碍早期方法实现其承诺的限制。

符号人工智能时代

机器学习的故事始于 1956 年的历史性达特茅斯会议 12,在那里,像 John McCarthy、Marvin Minsky 和 Claude Shannon 这样的先驱首次提出了“人工智能”一词(McCarthy et al. 1955)。他们的方法假设智力可以归结为符号操作。1964 年 Daniel Bobrow 的 STUDENT 系统(Bobrow 1964)通过自然语言理解解决代数文字问题,是这个时代的典范。

Problem: "If the number of customers Tom gets is twice the
square of 20% of the number of advertisements he runs, and
the number of advertisements is 45, what is the number of
customers Tom gets?"

STUDENT would:

1\. Parse the English text
2\. Convert it to algebraic equations
3\. Solve the equation: n = 2(0.2 × 45)²
4\. Provide the answer: 162 customers

早期的 AI,如 STUDENT,存在一个限制:它们只能处理与它们预先编程的模式和规则完全匹配的输入。这种“脆弱性”13 意味着,尽管这些解决方案在处理为它们设计的非常具体的案例时可能看起来很智能,但面对即使是微小的变化或现实世界的复杂性时,它们会完全崩溃。这种限制推动了向统计方法演化的进程,我们将在下一节中探讨。

专家系统时代

认识到符号人工智能的局限性,到 20 世纪 70 年代中期,研究人员承认通用人工智能过于雄心勃勃,并将他们的重点转向在特定、定义明确的领域中捕获人类专家知识。MYCIN(Shortliffe 1975),由斯坦福大学开发,成为第一个大规模专家系统之一,旨在诊断血液感染。

Rule Example from MYCIN:
IF
  The infection is primary-bacteremia
  The site of the culture is one of the sterile sites
  The suspected portal of entry is the gastrointestinal tract
THEN
  Found suggestive evidence (0.7) that infection is bacteroid

MYCIN 代表了医疗人工智能的一个重大进步,拥有 600 条专家规则用于诊断血液感染,但它也揭示了当代机器学习中持续存在的关键挑战。从人类专家那里获取领域知识并将其转化为精确的规则既耗时又困难,因为医生往往无法准确解释他们是如何做出决定的。与能够做出有根据的猜测的人类医生不同,MYCIN 在处理不确定或不完整信息时遇到了困难。随着 MYCIN 的增长,维护和更新规则库变得更加复杂,因为添加新规则往往与现有规则冲突,而医学知识本身也在不断演变。知识捕获、不确定性处理和维护仍然是现代机器学习中的关注点,通过不同的技术方法来解决。

统计学习时代

这些与知识捕获和系统维护相关的挑战促使研究人员转向不同的方法。20 世纪 90 年代标志着人工智能领域的转变,该领域从手编规则转向了统计学习方法。

三个汇聚的因素使得统计方法变得可能且强大。首先,数字革命意味着大量数据可用于训练算法。其次,摩尔定律(G. E. Moore 1998)14 提供了处理这些数据所需的计算能力。第三,研究人员开发了新的算法,如支持向量机,并改进了神经网络,这些算法可以从数据中学习模式,而不是遵循预先编程的规则。

这种组合转变了人工智能的发展:机器不再直接编码人类知识,而是可以从示例中自动发现模式,从而创建更稳健和适应性强的系统。

电子邮件垃圾邮件过滤器的演变说明了这种转变。早期的基于规则的系统使用了显式模式,但表现出与符号人工智能系统相同的脆弱性,证明它们很容易被规避。统计系统采取了不同的方法:如果“viagra”这个词在 90%的垃圾邮件中出现,但在正常邮件中只占 1%,我们可以利用这个模式来识别垃圾邮件。统计系统不是编写显式规则,而是自动从数千封示例邮件中学习这些模式,使它们能够适应新的垃圾邮件技术。其数学基础依赖于贝叶斯定理来计算给定特定单词的电子邮件是垃圾邮件的概率:[语义内容] P(spam|word)=P(word|spam)×P(spam)/P(word)P(\text{spam}|\text{word}) = P(\text{word}|\text{spam}) \times P(\text{spam}) / P(\text{word})。对于包含多个单词的电子邮件,我们假设单词在类别(垃圾邮件或非垃圾邮件)给定条件下的条件独立性,将整个消息中的这些概率结合起来,尽管简化假设是单词之间相互独立,但这也允许高效计算。

Rule-based (1980s):
IF contains("viagra") OR contains("winner") THEN spam

Statistical (1990s):
P(spam|word) = (frequency in spam emails) / (total frequency)

Combined using Naive Bayes:
P(spam|email) ∝ P(spam) × ∏ P(word|spam)

统计方法引入了三个在人工智能发展中仍然处于核心地位的概念。首先,训练数据的质量和数量与算法本身一样重要。人工智能只能学习其训练示例中存在的模式。其次,为了衡量人工智能的性能,需要严格的评估方法,这导致了可以衡量成功并比较不同方法的指标。第三,精确度(在做出预测时正确)和召回率(捕捉到我们应该找到的所有案例)之间存在紧张关系,迫使设计者根据其应用需求做出明确的权衡。这些挑战需要系统性的方法:第六章涵盖了数据质量和漂移检测,而第十二章则涉及评估指标和精确度-召回率权衡。垃圾邮件过滤器可能容忍一些垃圾邮件以避免阻止重要邮件,而医疗诊断系统则优先考虑捕捉每一个潜在的病例,即使增加了误报。

表 1.1 总结了人工智能方法的进化历程,突出了每个范例出现的关键优势和功能。从左到右的移动揭示了重要趋势。在考察浅层和深层学习之前,了解现有方法之间的权衡提供了重要背景。

表 1.1:人工智能范例进化:从符号人工智能到统计方法的转变通过优先考虑数据数量和质量,使机器学习能够进行严格性能评估,并需要明确在精确度和召回率之间进行权衡以优化特定应用的行为。该表概述了每个范例如何应对这些挑战,揭示了向数据驱动系统发展的进程,这些系统能够处理复杂、现实世界的问题。

方面 符号人工智能 专家系统 统计学习 浅层/深层学习
关键优势 逻辑推理 领域专业知识 通用性 模式识别
最佳用例 明确定义,基于规则的问题 特定领域问题 各种结构化数据问题 复杂,非结构化数据问题
数据处理 需要最少数据 基于领域知识 需要适度数据 大规模数据处理
适应性 固定规则 领域特定适应性 适应各种领域 高度适应各种任务
问题复杂性 简单,基于逻辑 复杂,领域特定 复杂,结构化 高度复杂,非结构化

这种分析将早期方法与浅层和深层学习领域的最新发展联系起来。它解释了为什么某些方法在不同时代获得了突出地位,以及每个范例是如何在解决前辈局限性的同时建立在它们的基础之上的。早期方法继续影响着现代人工智能技术,尤其是在基础模型开发方面。

这些从统计学习(数据质量、评估指标和精确度-召回率权衡)中涌现的核心概念成为了机器学习后续所有发展的基础。

浅层学习时代

在这些统计基础之上,21 世纪标志着机器学习历史上的一个重要时期,被称为“浅层学习”时代。术语“浅层”指的是架构深度:浅层学习通常采用一到两个处理层,与后来出现的深层学习的多层层次结构形成对比。

在这段时间里,几种算法主导了机器学习领域。每种算法都为不同的问题带来了独特的优势:决策树 15 通过做出类似于流程图的选择提供了可解释的结果。K 最近邻通过在历史数据中寻找相似示例进行预测,就像向经验最丰富的邻居寻求建议。线性回归和逻辑回归提供了简单、可解释的模型,适用于许多现实世界的问题。支持向量机 16 (SVMs) 通过使用“核技巧”17 在类别之间找到复杂的边界,表现出色。这种技术通过将数据投影到更高维度来转换复杂模式,在那里线性分离成为可能。这些算法构成了实用机器学习的基础。

2005 年的一种典型的计算机视觉解决方案体现了这种方法:

1\. Manual Feature Extraction
  - SIFT (Scale-Invariant Feature Transform)
  - HOG (Histogram of Oriented Gradients)
  - Gabor filters
2\. Feature Selection/Engineering
3\. "Shallow" Learning Model (e.g., SVM)
4\. Post-processing

这个时代的混合方法结合了人工设计的特征和统计学习。它们有强大的数学基础(研究人员可以证明为什么它们有效)。即使在有限的数据下,它们也表现出色。它们计算效率高。它们产生了可靠、可重复的结果。

Viola-Jones 算法(Viola 和 Jones, n.d.)18(2001)是这个时代的典范,它使用简单的矩形特征和级联分类器 19 实现了实时人脸检测。这个算法为数字相机的人脸检测提供了近十年的动力。

深度学习时代

当支持向量机通过数学变换在类别之间找到复杂的边界时,深度学习采用了受大脑结构启发的不同方法。深度学习不是依赖于人工设计的特征,而是使用受大脑神经元启发的简单计算单元的层,每一层将输入数据转换成越来越抽象的表示。虽然第三章建立了神经网络数学基础,第四章探讨了实现这种分层学习方法的详细架构。

在图像处理中,这种分层方法系统性地工作。第一层检测简单的边缘和对比度,后续层将这些组合成基本形状和纹理,更高层识别特定的特征,如胡须和耳朵,最终层将这些组合成如“猫”这样的概念。

与需要精心设计特征的浅层学习方法不同,深度学习网络自动从原始数据中发现有用的特征。这种从简单模式到复杂概念的学习分层方法定义了“深度”学习,并证明了对图像、语音和文本等复杂、现实世界数据是有效的。

如图 1.3 所示,AlexNet 在 2012 年 ImageNet20 竞赛中取得了突破,通过算法创新与硬件能力的完美结合,改变了机器学习。该网络需要两块 NVIDIA GTX 580 GPU,每块 3GB 内存,每块 GPU 提供 2.3 TFLOPS 的峰值性能,但真正的突破是内存带宽利用率。每块 GTX 580 提供了 192.4 GB/s 的内存带宽,而 AlexNet 的卷积操作需要大约 288 GB/s 的总内存带宽(理论峰值)来喂养计算引擎——这使得这是第一个专门围绕内存带宽约束而不是仅仅计算需求设计的神经网络。6000 万个参数需要 240MB 的存储空间,而在 120 万张图像上进行训练需要复杂的内存管理来分割网络跨越 GPU 边界并协调梯度更新。训练消耗了大约 1,287 GPU 小时,在 6 天内完成,与第二名的 26.2%相比,实现了 15.3%的 top-5 错误率,相对提高了 42%,这证明了硬件-软件协同设计的力量。这代表了比 CPU 实现快 10-100 倍的速度提升,将训练时间从数月缩短到数天,并证明专用硬件可以解锁以前难以处理的算法(Krizhevsky, Sutskever, and Hinton 2017a)。

AlexNet 的成功不仅仅是一个技术成就;它是一个分水岭时刻,证明了深度学习的实际可行性。这一突破需要算法创新和系统工程方面的进步。这一成就不仅仅是算法上的,它得益于像 Theano 这样的框架基础设施,能够协调 GPU 并行处理,在规模上处理自动微分,并管理深度学习所要求的复杂计算工作流程。没有这些框架基础,算法洞察力将仍然在计算上难以处理。

这种需要算法和系统突破的双重模式定义了自那时以来每一个主要的人工智能进步。现代框架代表了将算法可能性转化为实际现实的基础设施。自动微分(autograd)系统可能是使现代深度学习成为可能的最重要创新,它自动处理梯度计算,并使我们能够使用今天所使用的复杂架构。理解这种以框架为中心的视角(即主要的人工智能能力来自算法和系统工程交叉点)对于构建稳健、可扩展的机器学习系统非常重要。这一单一结果引发了深度学习研究与应用的爆炸式增长,这一趋势至今仍在继续。使这一突破成为可能的设施需求代表了算法创新与系统工程融合的汇聚,这正是本书所探讨的。

图片

图 1.3:卷积神经网络架构:AlexNet 证明了深度神经网络能够自动从图像中学习有效的特征,在传统计算机视觉方法上取得了显著的超越。这一突破表明,在足够的数据和计算能力下,神经网络能够在图像识别任务中达到显著的准确性。

深度学习随后进入了一个规模空前的时代。到 2010 年代末,谷歌、Facebook 和 OpenAI 等公司训练的神经网络比 AlexNet 大数千倍。这些庞大的模型,通常被称为“基础模型”21,将深度学习的能力扩展到了新的领域。

2020 年发布的 GPT-3(T. Brown 等人 2020)包含 1750 亿个参数,需要大约 350GB 来存储参数(完整训练基础设施需要 800GB+),比早期的 BERT-Large22(3.4 亿个参数)增加了 1000 倍。训练 GPT-3 消耗了大约 314 泽塔 FLOPs23 的计算能力,在 1,024 个 V100 GPU24 上跨越数周,训练成本估计为 460 万美元。该模型以大约 1.7GB/s 的内存带宽处理文本,并需要专门的设施以亚秒延迟服务数百万用户。这些模型展示了仅在规模上出现的显著涌现能力:撰写类似人类的文本、参与复杂的对话、根据描述生成图像以及编写功能性的计算机代码。这些能力源于计算和数据规模,而不是明确的编程。

一个关键的洞见出现了:在更多数据上训练的更大神经网络能够解决越来越复杂的任务。这种规模引入了重大的系统挑战 25。高效训练大型模型需要数千个并行 GPU,存储和提供数百 GB 大小的模型,以及处理庞大的训练数据集。

2012 年的深度学习革命建立在始于 20 世纪 50 年代的神经网络研究之上。故事始于 1957 年弗兰克·罗森布拉特(Frank Rosenblatt)的感知器(Perceptron),它通过展示一个简单的人工神经元如何学习分类模式而吸引了研究者的想象力。尽管它仅限于线性可分问题,正如 Minsky 和 Papert 在 1969 年的著作《感知器》(“Perceptrons”)(Minsky and Papert 2017)所证明的那样,它引入了可训练神经网络的核心理念。20 世纪 80 年代带来了更多重要的突破:Rumelhart、Hinton 和 Williams 在 1986 年引入了反向传播(Rumelhart, Hinton, and Williams 1986),提供了一种系统地训练多层网络的方法,而 Yann LeCun 则展示了它在使用专门为图像处理设计的神经网络识别手写数字中的实际应用(Y. LeCun et al. 1989)26。

这些网络在 1990 年代和 2000 年代停滞不前,并不是因为理念本身错误,而是因为它们在必要的技术发展之前出现。该领域缺乏三个重要的要素:训练复杂网络所需的大量数据、处理这些数据所需的足够计算能力,以及训练非常深层的网络所需的技术创新。

深度学习的潜力需要我们探索的三个 AI 三角形组件的融合:训练复杂网络所需的大量数据、处理这些数据所需的足够计算能力,以及训练非常深层的网络所需的算法突破。这个延长的发展期解释了为什么 2012 年 ImageNet 的突破代表了累积研究的顶点,而不是一场突然的革命。这一演变确立了机器学习系统工程作为一门学科,它将理论进步与实际实施相结合,在 AI 三角形所代表的互联框架内运作。

这种演变揭示了一个关键洞察:随着人工智能从符号推理发展到统计学习和深度学习,应用变得越来越雄心勃勃和复杂。然而,这种增长引入了超越算法的挑战,需要构建能够大规模部署和维持人工智能的整个系统。理解这些现代机器学习系统在实际中的运作方式需要检查它们的生命周期特征和部署模式,这些特征和模式从根本上将它们与传统软件系统区分开来。

理解机器学习系统生命周期和部署

通过追踪人工智能从符号系统到统计学习再到深度学习的演变,我们现在可以探索这些现代机器学习系统在实际中的运作方式。理解机器学习生命周期和部署景观非常重要,因为这些因素塑造了我们做出的每一个工程决策。

机器学习开发生命周期

机器学习系统在开发和运营生命周期上与传统软件有根本的不同。传统软件遵循可预测的模式,开发者编写显式的指令,这些指令以确定性方式执行 27。这些系统建立在数十年的既定实践之上:版本控制维护精确的代码历史,持续集成管道 28 自动化测试,静态分析工具衡量质量。这个成熟的基础设施使得遵循明确工程原则的可靠软件开发成为可能。

机器学习系统偏离了这种范式。虽然传统系统执行显式的编程逻辑,但机器学习系统从通过训练发现的数据模式中推导出其行为。这种从代码到数据作为主要行为驱动因素的转变引入了现有软件工程实践无法解决的复杂性。这些挑战需要专门的流程,第五章对此进行了阐述。

图 1.4 说明了机器学习系统如何在连续循环中运行,而不是传统软件从设计到部署的线性进展。

图 1.4:机器学习系统生命周期:连续迭代定义了成功的机器学习系统,需要反馈循环来优化模型并解决数据收集、模型训练、评估和部署过程中的性能退化。这一循环过程与传统软件开发形成对比,强调了在动态环境中持续监控和适应以保持系统可靠性和准确性的重要性。

机器学习系统的数据依赖性特性产生了需要持续监控和适应的动态生命周期。与仅通过开发者修改而变化的源代码不同,数据反映了现实世界的动态。分布变化可以在没有任何代码更改的情况下静默地改变系统行为。为确定性基于代码的系统设计的传统工具在管理此类数据依赖系统方面证明是不够的:版本控制擅长跟踪离散的代码更改,但在处理大型、不断发展的数据集时遇到困难;为确定性输出设计的测试框架需要适应概率预测。这些挑战需要专门的实践:第六章讨论了数据版本和质量管理,而第十三章涵盖了处理概率行为而不是确定性输出的监控方法。

在生产中,生命周期阶段要么创造良性循环,要么创造恶性循环。当高质量的数据促进有效的学习,强大的基础设施支持高效的处理,以及精心设计的系统促进更好的数据收集时,就会产生良性循环。当数据质量差削弱了学习,基础设施不足阻碍了处理,以及系统限制阻止了数据收集改进时,就会产生恶性循环——每个问题都会加剧其他问题。

部署光谱

管理机器学习系统复杂性的方法在不同部署环境中有所不同,每个环境都提出了独特的约束和机会,这些约束和机会塑造了生命周期决策。

在光谱的一端,基于云的机器学习系统在大型数据中心 29 中运行。这些系统包括大型语言模型和推荐引擎,在同时服务数百万用户的同时处理 PB 级的数据。它们利用几乎无限的计算资源,但管理着巨大的运营复杂性和成本。构建此类大规模系统的架构方法在第二章和第十一章中有所介绍。

在光谱的另一端,TinyML 系统在微控制器 30 和嵌入式设备上运行,在严格的内存、计算能力和能耗限制下执行机器学习任务。像 Alexa 或 Google Assistant 这样的智能家居设备必须使用比 LED 灯泡更少的电力来识别语音命令,而传感器必须在电池供电下检测数月或数年的异常。在第九章和第十章中探讨了在如此受限的设备上部署机器学习的专用技术,而嵌入式机器学习系统的独特挑战在第十四章中有所介绍。

在这两个极端之间,存在着丰富的机器学习系统,它们适应了不同的环境。边缘机器学习系统将计算更靠近数据源,减少延迟 31 和带宽需求,同时管理本地计算资源。移动机器学习系统必须在复杂的性能和严格的限制之间取得平衡:现代智能手机通常有 4-12GB 的 RAM,1.5-3 GHz 的 ARM 处理器,以及 2-5 瓦的电力预算,这些电力必须分配给所有系统功能。例如,在智能手机上运行最先进的图像分类模型可能会消耗 100-500mW 的电力,并在 10-100ms 内完成推理,而云服务器可以使用 200+瓦的电力,但结果在 1ms 以下完成。企业机器学习系统通常在特定的业务约束下运行,专注于特定任务,同时与现有基础设施集成。一些组织采用混合方法,将机器学习能力分布在多个层级,以平衡各种需求。

部署如何塑造生命周期

我们概述的部署范围不仅仅代表不同的硬件配置。每个部署环境都创造了一个要求、限制和权衡的相互作用,这影响着机器学习生命周期的每个阶段,从最初的数据收集到持续运行和演变。

性能要求通常驱动初始架构决策。对延迟敏感的应用,如自动驾驶汽车或实时欺诈检测,尽管资源有限,可能需要边缘或嵌入式架构。相反,需要大量计算能力进行训练的应用,如大型语言模型,自然倾向于集中式云架构。然而,原始性能只是复杂决策空间中的一个考虑因素。

资源管理在架构之间差异很大,并直接影响生命周期阶段。云系统必须优化大规模成本效率,平衡昂贵的 GPU 集群、存储系统和网络带宽。这影响了训练策略(多久重新训练模型)、数据保留策略(保留哪些历史数据)和服务架构(如何分配推理负载)。边缘系统面临固定的资源限制,这限制了模型复杂度和更新频率。移动和嵌入式系统在最为严格的约束下运行,每个字节的内存和毫瓦特的电力都至关重要,迫使进行激进的模型压缩 32 和仔细安排训练更新。

随着系统分布的增加,操作复杂性也随之增加,在整个生命周期中产生级联效应。虽然集中式云架构受益于成熟的部署工具和管理服务,但边缘和混合系统必须处理分布式系统管理的复杂性。这体现在所有生命周期阶段:数据收集需要协调具有不同连接性的分布式传感器;版本控制必须跟踪部署在数千个边缘设备上的模型;评估需要考虑不同的硬件能力;部署必须处理分阶段推出并具有回滚能力;监控必须汇总来自地理分布系统的信号。系统化的卓越运营方法,包括生产级机器学习系统的故障响应和调试方法,在第十三章中得到充分阐述。

数据考虑因素引入了相互竞争的压力,这些压力重塑了生命周期工作流程。隐私要求或数据主权法规可能会推动向边缘或嵌入式架构发展,其中数据保持本地化,从根本上改变了数据收集和训练策略——可能需要联邦学习 33 方法,其中模型在分布式数据上训练而不进行集中化。然而,对大规模训练数据的需求可能更倾向于云方法,具有集中式数据聚合。数据的速度和体积也会影响架构选择:实时传感器数据可能需要边缘处理来管理收集过程中的带宽,而批量分析可能更适合云处理,并定期更新模型。

进化和维护需求必须从最初的设计阶段就考虑。云架构提供了系统进化的灵活性,易于模型更新和 A/B 测试 34,但可能产生显著的持续成本。边缘和嵌入式系统可能更难更新(需要通过空中更新 35 进行,并需仔细管理带宽),但可能提供更低的运营开销。机器学习系统的持续循环——收集数据、训练模型、评估性能、部署更新、监控行为——在分布式架构中尤其具有挑战性,其中更新模型和维护系统健康需要在多个层级上进行仔细的编排。

这些权衡很少是简单的二元选择。现代机器学习系统通常采用混合方法,根据具体用例和约束平衡这些考虑因素。例如,自动驾驶汽车可能出于延迟原因在边缘进行实时感知和控制,同时将数据上传到云端以改进模型并定期下载更新模型。语音助手可能在设备上执行唤醒词检测以保护隐私并减少延迟,但将完整语音发送到云端进行复杂自然语言处理。

关键的洞见在于理解部署决策如何在整个系统生命周期中产生连锁反应。在嵌入式设备上部署的选择不仅限制了模型大小,还影响了数据收集策略(哪些传感器是可行的)、训练方法(是否使用联邦学习)、评估指标(准确性 vs. 延迟 vs. 功耗)、部署机制(空中更新)和监控能力(可以收集哪些遥测数据)。这些相互关联的决策展示了 AI 三角形框架在实践中的应用,其中某一组件的约束会在整个系统中产生连锁效应。

通过对机器学习系统在其生命周期和部署范围内的操作方式的理解,我们现在可以检查具体示例,这些示例说明了这些原则在实际中的应用。以下案例研究展示了不同的部署选择如何在整个系统生命周期中创造独特的工程挑战和解决方案。

现实世界机器学习系统的案例研究

在建立了 AI 三角形框架、生命周期阶段和部署光谱之后,我们现在可以检查这些原则在现实世界系统中的运作情况。我们不是对多个系统进行表面调查,而是专注于一个代表性的案例研究——自动驾驶汽车,它说明了 ML 系统工程挑战在整个三个组件、多个生命周期阶段和复杂的部署约束中的光谱。

案例研究:自动驾驶汽车

Waymo,Alphabet Inc.的子公司,处于自动驾驶技术的前沿,代表了迄今为止机器学习系统最雄心勃勃的应用之一。从 2009 年启动的谷歌自动驾驶汽车项目演变而来,Waymo 的自动驾驶方法展示了 ML 系统如何跨越从嵌入式系统到云基础设施的整个光谱。本案例研究展示了在安全关键、现实世界环境中复杂 ML 系统的实际实施,将实时决策与长期学习和适应相结合。

数据考虑因素

支撑 Waymo 技术的数据生态系统庞大且动态。每辆汽车都充当一个移动的数据中心,其传感器套件包括激光雷达 36、雷达 37 和高分辨率摄像头,每小时行驶过程中产生大约一太字节的数据。这些现实世界的数据得到了一个更加庞大的模拟数据集的补充,Waymo 的车辆在模拟中行驶了超过 200 亿英里,在公共道路上行驶了超过 2000 万英里。挑战不仅在于数据的量,还在于其异构性和实时处理的需求。Waymo 必须同时处理结构化数据(例如,GPS 坐标)和非结构化数据(例如,摄像头图像)。数据管道从车辆本身的边缘处理到大规模基于云的存储和处理系统。鉴于应用的安全关键性,需要复杂的数据清洗和验证过程。以适合机器学习的形式表示车辆环境,提出了重大的挑战,需要复杂的预处理将原始传感器数据转换为有意义的功能,以捕捉交通场景的动态性。

算法考虑因素

Waymo 的机器学习堆栈代表了一组复杂的算法集合,旨在解决自动驾驶的多方面挑战。感知系统采用专门的神经网络来处理视觉数据以进行目标检测和跟踪。预测模型,用于预测其他道路使用者的行为,使用能够理解道路使用者行为随时间变化的模式 38 的神经网络。构建这样的复杂多模型系统需要第四章中的架构模式和第七章中涵盖的框架基础设施。Waymo 开发了像 VectorNet 这样的定制机器学习模型来预测车辆轨迹。规划和决策系统可能采用经验学习技术来处理复杂的交通场景。

基础设施考虑

支持 Waymo 自动驾驶汽车的计算基础设施体现了在从边缘到云端的整个范围内部署机器学习系统的挑战。每辆车都配备了一个定制的计算平台,能够实时处理传感器数据并做出决策,通常利用像 GPU 或张量处理单元(TPUs)这样的专用硬件 39。这种边缘计算通过广泛使用云基础设施得到补充,利用谷歌数据中心的力量来训练模型、运行大规模模拟和进行车队范围内的学习。这样的系统需要专门的硬件架构(第十一章)和边缘-云协调策略(第二章)来处理大规模的实时处理。这些层级之间的连接至关重要,车辆需要可靠、高带宽的通信来进行实时更新和数据上传。Waymo 的基础设施必须设计为具有鲁棒性和容错性,即使在硬件故障或网络中断的情况下也能确保安全运行。Waymo 运营的规模在数据管理、模型部署和地理分布的车队系统监控方面提出了重大挑战。

未来影响

Waymo 的影响超越了技术进步,可能彻底改变交通、城市规划以及日常生活的许多方面。在亚利桑那州凤凰城推出的商业叫车服务 Waymo One,使用自动驾驶汽车,代表了在安全关键应用中实际部署人工智能系统的重大里程碑。Waymo 的进展对开发稳健、现实世界的人工智能系统具有更广泛的影响,推动了传感器技术、边缘计算和人工智能安全方面的创新,这些创新的应用远远超出了汽车行业。然而,它也引发了关于责任、伦理以及人工智能系统与人类社会之间互动的重要问题。随着 Waymo 继续扩大其运营范围并探索卡车运输和最后一英里配送的应用,它成为高级机器学习系统的重要测试平台,推动了持续学习、稳健感知和人类-人工智能交互等领域的发展。Waymo 案例研究突出了机器学习系统在转型行业中的巨大潜力以及将人工智能应用于现实世界所涉及的复杂挑战。

对比部署场景

虽然 Waymo 展示了混合边缘-云机器学习系统的全部复杂性,但其他部署场景呈现了不同的约束配置文件。FarmBeats,微软研究院的一个农业物联网项目,位于光谱的另一端——在偏远地区进行严重资源受限的边缘部署,连接性有限。FarmBeats 展示了机器学习系统工程如何适应约束:可以在低功耗微控制器上运行的简单模型,使用电视白空间等创新连接解决方案,以及最小化数据传输的本地处理。挑战包括在恶劣条件下保持传感器的可靠性,在有限的人类监督下验证数据质量,以及在可能长时间离线的设备上更新模型。

相反,AlphaFold (Jumper et al. 2021) 代表了纯云端的科学机器学习,其中计算资源基本上是无限的,但准确性至关重要。AlphaFold 的蛋白质结构预测需要使用 128 个 TPUv3 核心,持续数周时间,处理来自多个数据库的数亿个蛋白质序列。系统挑战与 Waymo 或 FarmBeats 明显不同:管理庞大的训练数据集(蛋白质数据银行包含超过 180,000 个结构),协调跨专用硬件的分布式训练,以及将预测与实验真实情况进行验证。与 Waymo 的延迟约束或 FarmBeats 的电力约束不同,AlphaFold 优先考虑计算吞吐量以探索广阔的搜索空间——训练成本超过 10 万美元,但实现了科学突破。

这三个系统——Waymo(混合型,延迟关键型)、FarmBeats(边缘型,资源受限型)和 AlphaFold(云型,计算密集型)——说明了部署环境如何塑造每一个工程决策。基本的三组件框架适用于所有系统,但具体的约束和优化优先级差异很大。对于机器学习系统工程师来说,理解这种部署多样性至关重要,因为相同的算法洞察可能需要根据操作环境完全不同的系统实现。

在确立了具体例子之后,我们现在可以检查不同部署场景和生命周期阶段出现的挑战。

机器学习系统中的核心工程挑战

Waymo 案例研究和比较部署场景揭示了 AI 三角形框架如何在数据、算法和基础设施之间创造相互依赖的挑战。我们已经建立了如何从失败模式和性能退化方面来看,机器学习系统与传统软件的不同。现在我们可以检查由此差异产生的具体挑战类别。

数据挑战

任何机器学习系统的基础是其数据,管理这些数据引入了几个核心挑战,这些挑战可能会悄无声息地降低系统性能。数据质量成为首要关注点:现实世界的数据通常是杂乱无章的、不完整的和不一致的。Waymo 的传感器套件必须应对环境干扰(雨模糊摄像头、湿表面上的激光雷达反射)、随着时间的推移传感器退化,以及多个传感器在不同速率上捕获信息时的数据同步。与输入验证可以捕获格式错误数据的传统软件不同,机器学习系统必须处理现实世界观察中固有的模糊性和不确定性。

规模代表另一个关键维度。Waymo 每小时每辆车生成大约一太字节的数据——管理这些数据量需要复杂的收集、存储、处理和训练期间高效访问的基础设施。挑战不仅仅是存储 PB 级的数据,还要维护数据质量元数据、数据集的版本控制和模型训练的高效检索。随着系统扩展到多个城市的数千辆车,这些数据管理挑战呈指数级增加。

可能最严重的是数据漂移 40,随着时间的推移,数据模式逐渐变化,悄无声息地降低了模型性能。Waymo 的模型遇到了训练数据中不存在的新的交通模式、道路配置、天气条件和驾驶行为。一个主要在凤凰城驾驶训练的模型,当部署在纽约时可能会因为分布变化而表现不佳:更密集的交通、更具侵略性的驾驶员、不同的道路布局。与规格保持恒定的传统软件不同,机器学习系统必须随着它们所模拟的世界的发展而适应。

这种适应性要求引入了一个经常被忽视的重要约束。虽然机器学习系统可以通过学习到的统计模式泛化到未见过的情境,但一旦训练完成,模型的学习行为就会固定。模型在部署期间无法修改其理解;它只能应用在训练期间学到的模式。当分布偏移发生时,模型会遵循这些过时的学习模式,就像确定性代码遵循过时的规则一样。如果施工区域频率增加三倍,或者新的车辆类型定期出现,模型固定的响应可能并不比为不同运营环境编写的硬编码逻辑更合适。机器学习的优势不在于运行时适应性,而在于能够使用新数据重新训练的能力,这个过程需要故意的工程干预。

分布式偏移通过多种途径表现出来。季节性变化通过改变太阳角度和降水模式影响传感器性能。基础设施的修改改变道路布局。城市增长演变交通模式。每一次变化都可能降低特定模型组件的性能:在冬季条件下,行人检测的准确性可能会下降,而在新铺路的道路上,车道跟随的信心可能会降低。检测这些变化需要对输入分布和模型性能在运营环境中的持续监控。

管理这些数据挑战(质量保证、版本控制、漂移检测和修复策略)的系统方法在第六章中有详细说明。关键洞察是,机器学习系统中的数据挑战是持续和动态的,需要持续的工程关注,而不是一次性解决方案。

模型挑战

创建和维护机器学习模型本身又带来了一组新的挑战。现代机器学习模型,尤其是在深度学习领域,可能非常复杂。以 GPT-3 这样的语言模型为例,它有数百亿个参数需要通过训练过程进行优化 41。这种复杂性带来了实际挑战:这些模型需要巨大的计算能力来训练和运行,这使得在资源有限的环境中部署它们变得困难,例如在手机或物联网设备上。

有效训练这些模型本身就是一个重大挑战。与传统的编程不同,我们不是编写明确的指令,而是机器学习模型从例子中学习。这个过程涉及许多架构和超参数选择:我们应该如何构建模型?我们应该训练多长时间?我们如何判断它是否在学习正确的模式而不是记住训练数据?做出这些决定通常需要技术专长和大量的试错。

现代实践越来越多地依赖于迁移学习——将针对一个任务开发的模型作为相关任务的起点。而不是从头开始训练一个新的图像识别模型,从业者可能会从一个在数百万张图像上预训练的模型开始,并将其调整到他们特定的领域(例如,医学成像或农业监测)。这种方法显著减少了训练数据和计算需求,但引入了确保预训练模型偏差不会转移到新应用的新挑战。这些训练挑战——迁移学习、分布式训练和偏差缓解——需要系统性的方法,第八章中对此进行了探讨,并建立在第七章中框架基础设施的基础上。

一个特别重要的挑战是确保模型在训练数据之外的实际情况中也能良好工作。这种泛化差距,即训练性能与实际性能之间的差异,代表了机器学习中的一个核心挑战。一个模型可能在训练数据上达到 99%的准确率,但由于微妙的分布差异,在生产中可能只有 75%的准确率。对于自动驾驶汽车或医疗诊断系统等重要应用,理解和最小化这一差距对于安全部署变得必要。

系统挑战

让机器学习系统在现实世界中可靠工作引入了自己的挑战集。与遵循固定规则的传统软件不同,机器学习系统需要处理输入和输出的不确定性和变化性。它们通常还需要训练系统(用于从数据中学习)和服务系统(用于做出预测),每个系统都有不同的要求和约束。

考虑一家正在构建语音识别系统的公司。他们需要收集和存储音频数据的基础设施,用于在此数据上训练模型系统,以及处理用户实时语音的独立系统。这个流程的每一部分都需要可靠且高效地工作,并且所有部分需要无缝协作。构建这样稳健的数据管道的工程原则在第六章中有详细阐述,而维护这些系统在生产中的操作实践则在第十三章中进行了探讨。

这些系统也需要持续的监控和更新。我们如何知道系统是否工作正确?我们如何在不中断服务的情况下更新模型?我们如何处理错误或意外输入?当机器学习系统服务于数百万用户时,这些操作挑战变得尤为复杂。

伦理考量

随着机器学习系统在我们日常生活中的日益普及,它们对社会产生的更广泛影响越来越需要考虑。一个主要担忧是公平性,因为机器学习系统有时会学会做出歧视某些人群的决定。这种情况通常是无意的,因为系统会吸收其训练数据中存在的偏见。例如,一个求职申请筛选系统可能会无意中学会偏爱某些人口统计群体,如果这些群体在历史上更有可能被雇佣。检测和减轻这种偏见需要对不同人口统计群体的训练数据和模型行为进行仔细审计。

另一个重要的考虑因素是透明度和可解释性。许多现代机器学习模型,尤其是具有数百万或数十亿参数的深度学习模型,作为黑盒系统运行——在这些系统中,我们可以观察到输入和输出,但难以理解内部推理。就像一个接收信号并产生声音但没有大多数用户理解内部电子的收音机一样,这些模型通过复杂的数学变换做出预测,这些变换抗拒人类的解释。一个深度神经网络可能能够从 X 光片中正确诊断出医疗状况,但解释它为什么做出这样的诊断——它考虑了哪些视觉特征最为重要——仍然是一个挑战。当机器学习系统在医疗保健、刑事司法或金融服务等领域做出影响人们生活的重大决策时,这种不透明性变得尤为成问题,在这些领域,利益相关者合理地期望对影响他们的决策进行解释。

隐私也是一个主要担忧。机器学习系统通常需要大量数据才能有效工作,但这些数据可能包含敏感的个人信息。我们如何平衡数据需求与保护个人隐私的需求?我们如何确保模型不会无意中通过推理攻击 42 记忆并泄露私人信息?这些挑战不仅仅是需要解决的技术问题,而是持续考虑的问题,这些考虑塑造了我们如何处理机器学习系统设计和部署的方法。这些问题需要综合方法:第十七章讨论了公平性和偏见检测,第十五章涵盖了隐私保护技术和推理攻击缓解,而第十六章确保系统在对抗条件下具有弹性。

理解挑战之间的相互联系

正如 Waymo 案例研究所示,挑战在 AI 三角形的各个层面层层叠加和累积。数据质量问题(传感器噪声、分布偏移)会降低模型性能。模型复杂度限制(延迟预算、功率限制)迫使架构做出妥协,这可能会影响公平性(更简单的模型可能表现出更多的偏差)。系统级故障(空中更新问题)可能会阻止部署解决伦理问题的改进模型。

这种相互依赖性解释了为什么机器学习系统工程需要整体思考,考虑 AI 三角形的各个组成部分,而不是独立优化它们。决定使用更大的模型以获得更好的准确性会产生连锁反应:需要更多的训练数据,更长的训练时间,更高的服务成本,增加的延迟,如果训练数据没有仔细整理,可能会出现更明显的偏差。成功导航这些权衡需要理解一个维度的选择如何影响其他维度。

挑战的地形也解释了为什么许多研究模型无法达到生产阶段。学术机器学习通常专注于在基准数据集上最大化准确性,可能忽略了实际约束,如推理延迟、训练成本、数据隐私或运营监控。生产机器学习系统必须在准确性、部署可行性、运营成本、伦理考虑和长期可维护性之间取得平衡。研究重点与生产现实之间的差距促使本书强调系统工程而非纯算法创新。

这些相互关联的挑战,从数据质量和模型复杂度到基础设施可扩展性和伦理考量,将机器学习系统与传统软件工程区分开来。从算法创新到系统集成挑战的转变,加上我们考察的独特运营特性,确立了需要一种独特的工程学科。我们称这个新兴领域为人工智能工程。

定义人工智能工程

在探讨了机器学习系统在历史演变、生命周期特性、实际应用和核心挑战方面的历史演变后,我们现在可以正式确立解决这些系统级问题的学科。

人工智能工程是专注于机器学习算法数据计算基础设施系统级集成的工程学科,旨在构建和运营可靠高效可扩展的生产系统。

随着我们回顾人工智能的历史,发生了根本性的转变。虽然人工智能曾经包括符号推理、专家系统和基于规则的途径,但现在基于学习的方法主导了该领域。当组织今天构建人工智能时,它们构建的是机器学习系统。Netflix 的推荐引擎处理数十亿次的观看事件来训练服务于数百万订阅者的模型。Waymo 的自动驾驶汽车运行数十个神经网络实时处理传感器数据。训练 GPT-4 需要协调数据中心内的数千个 GPU,消耗兆瓦的电力。现代人工智能压倒性地是机器学习:其能力源于从数据中学习到的模式。

这种融合使得“人工智能工程”成为该学科的天然名称,尽管本文特别关注机器学习系统作为其主题。这个术语反映了人工智能在实际中是如何构建和部署的。

人工智能工程涵盖了构建生产级智能系统的完整生命周期。一个突破性的算法需要高效的数据收集和处理,数百或数千台机器上的分布式计算,对用户提供具有严格延迟要求的可靠服务,以及基于实际性能的持续监控和更新。该学科在每一层面都解决了基本挑战:为专用硬件设计高效算法,优化每日处理 PB 级数据的管道,在数千个 GPU 上实施分布式训练,部署服务于数百万并发用户的模型,以及维护随着数据分布变化而演变的系统。能源效率不仅仅是事后考虑,而是与准确性和延迟一样是第一类约束。内存带宽限制的物理、Dennard 缩放效应的崩溃以及数据移动的能量成本塑造了从芯片设计到数据中心部署的每一个架构决策。

人工智能工程作为一门独立学科的兴起,反映了计算机工程在 20 世纪 60 年代末和 70 年代初的诞生过程。43 随着计算系统变得更加复杂,仅靠电气工程或计算机科学单独是无法解决构建可靠计算机的综合性挑战的。计算机工程应运而生,成为连接这两个领域的完整学科。如今,人工智能工程在算法、基础设施和运营实践交汇处面临着类似的挑战。虽然计算机科学推动了机器学习算法的发展,电气工程开发了专门的 AI 硬件,但这两个学科都没有完全涵盖构建大规模生产级 AI 系统所需的系统级集成、部署策略和运营实践。

随着 AI 工程现在正式被定义为学科,本文的其余部分将讨论构建和运营机器学习系统的实践。我们全篇使用“ML 系统工程”来描述这一实践——设计、部署和维护构成现代 AI 的机器学习系统的工作。这些术语指的是同一个学科:AI 工程是我们所称呼的,ML 系统工程是我们所执行的。

在将 AI 工程确立为学科之后,我们现在可以将其实践组织成一个连贯的框架,系统地解决我们已识别出的挑战。

组织机器学习系统工程:五支柱框架

本书将机器学习系统工程组织在五个相互关联的学科周围,这些学科直接针对我们已识别出的挑战类别。这些支柱,如图 1.5 所示,代表了连接研究原型和能够在大规模上可靠运行的系统所需的核心工程能力。

图片

五个工程学科

图 1.5:ML 系统生命周期:机器学习系统工程涵盖了五个相互关联的学科,这些学科解决了在规模上构建、部署和维护 AI 系统的现实挑战。每个支柱代表连接研究原型和能够可靠地在大规模上运行的系统之间的关键工程能力。

我们所探讨的挑战,从无声的性能退化到数据漂移,再到模型复杂性和伦理问题,揭示了为什么机器学习系统工程已成为一个独立的学科。我们之前讨论的独特故障模式证明了需要专门的方法:传统的软件工程实践无法解决那些不会明显失败而是悄悄退化的系统。仅通过算法创新无法解决这些挑战;它们需要贯穿整个系统生命周期的系统化工程实践,从最初的数据收集到持续运行和演变。

如图 1.5 所示的五支柱框架直接源于区分机器学习与传统软件的系统挑战。每个支柱都针对特定的挑战类别,同时认识到它们之间的相互依赖性:

数据工程 (第六章) 解决了我们确定的数据相关挑战:质量保证、规模管理、漂移检测和分布偏移。这一支柱包括构建健壮的数据管道,确保质量,处理大规模数据,维护隐私,并为所有机器学习系统提供基础设施。对于像 Waymo 这样的系统,这意味着管理每辆车数 TB 的传感器数据,实时验证数据质量,检测不同城市和不同天气条件下的分布偏移,以及维护数据血缘以进行调试和合规性。涉及的技术包括数据版本控制、质量监控、漂移检测算法和隐私保护数据处理。

训练系统 (第八章) 应对与模型相关的复杂性和规模挑战。这一支柱涵盖了开发能够管理大型数据集和复杂模型,同时在分布式环境中优化计算资源利用的训练系统。现代基础模型需要协调数千个 GPU,实施并行化策略,管理训练故障和重启,以及平衡训练成本与模型质量。本章探讨了分布式训练架构、优化算法、大规模超参数调整以及使大规模训练成为可能的框架。

部署基础设施 (第十三章, 第十四章) 解决了训练与服务分离以及操作复杂性的系统相关挑战。这一支柱包括构建可靠的部署基础设施,能够大规模地提供服务模型,优雅地处理故障,并适应生产环境中的不断变化的需求。部署涵盖了从每秒处理数百万请求的云服务到在严重延迟和电源限制下运行的边缘设备的全谱系。技术包括模型服务架构、边缘部署优化、A/B 测试框架以及分阶段推出策略,这些策略在降低风险的同时,使快速迭代成为可能。

运营和监控 (第十三章, 第十二章) 直接针对我们识别为机器学习系统特有的静默性能退化模式。这个支柱涵盖了创建监控和维护系统,确保持续的性能,实现早期问题检测,并支持生产中的安全系统更新。与关注基础设施指标的常规软件监控不同,机器学习运营需要我们讨论的四维监控:基础设施健康、模型性能、数据质量和业务影响。本章探讨了指标设计、警报策略、事件响应程序、生产机器学习系统的调试技术以及连续评估方法,这些方法可以在退化影响用户之前捕捉到它。

伦理和治理 (第十七章, 第十五章, 第十八章) 解决了围绕公平、透明度、隐私和安全的社会和伦理挑战。这个支柱在整个系统生命周期中实施负责任的 AI 实践,而不是将伦理视为事后考虑的事情。对于像自动驾驶汽车这样的关键安全系统,这包括正式验证方法、基于场景的测试、偏差检测和缓解、隐私保护学习技术和支持调试和认证的可解释性方法。这些章节涵盖了技术方法(差分隐私、公平性指标、可解释性技术)和组织实践(伦理审查委员会、事件响应协议、利益相关者参与)。

连接组件、生命周期和学科

五个支柱自然地从我们之前确立的 AI 三角形框架和生命周期阶段中产生。每个 AI 三角形组件映射到特定的支柱:数据工程处理数据组件的完整生命周期;训练系统和部署基础设施解决算法在不同生命周期阶段与基础设施的交互;运营通过监控它们的交互连接所有组件;伦理与治理跨越所有组件,确保在整个生命周期中实施负责任的做法。

我们确定的挑战类别在特定的支柱中找到解决方案:数据挑战 → 数据工程。模型挑战 → 训练系统。系统挑战 → 部署基础设施和运营。伦理挑战 → 伦理与治理。正如我们在 AI 三角形框架中确立的那样,这些支柱必须协调一致,而不是孤立运作。

这种结构反映了人工智能如何从以算法为中心的研究发展到以系统为中心的工程,将重点从“我们能否让这个算法工作?”转移到“我们能否构建能够可靠地部署、运营和维护这些算法的系统?”五个支柱代表了回答“是”所需的工程能力。

机器学习系统工程的未来方向

虽然这五个支柱为机器学习系统工程提供了一个稳定的框架,但该领域仍在不断发展。了解当前趋势有助于预测核心挑战和权衡在未来系统中将如何体现。

应用层面的创新越来越多地以具有代理能力的系统为特征,这些系统能够超越反应性预测,实现自主行动。能够规划、推理和执行复杂任务的系统对决策框架和安全约束提出了新的要求。这些进步并没有消除五个支柱,而是增加了它们的重要性:能够采取重要行动的自主系统需要更加严格的数据质量、更可靠的部署基础设施、更全面的监控和更强的伦理保障。

系统架构的演进解决了随着模型规模扩大而变得至关重要的可持续性和效率问题。模型压缩、高效训练技术和专用硬件的创新源于环境和经济压力。未来的架构必须在追求更强大的模型与日益增长的资源限制之间取得平衡。这些效率创新主要影响训练系统和部署基础设施支柱,引入了量化、剪枝和神经架构搜索等新技术,这些技术可以同时优化多个目标。

基础设施的发展持续重塑部署的可能性。从强大的数据中心芯片到高效的边缘处理器,专用 AI 加速器正在整个范围内出现。这种异构计算环境使得可以根据能力和条件在各个层级动态分配模型,模糊了云、边缘和嵌入式系统之间的传统边界。这些基础设施创新影响了所有五个支柱的运作方式——新的硬件使得新的算法成为可能,这需要新的训练方法,这又要求新的监控策略。

人工智能技术的民主化使得机器学习系统对各种规模的开发者和组织更加可访问。云服务提供商提供预训练模型和自动机器学习平台,降低了部署人工智能解决方案的专业知识门槛。这种可访问性趋势并没有减少系统工程的重要性——如果有什么不同的话,它增加了对稳健、可靠的系统需求,这些系统可以在没有持续专家监督的情况下运行。随着机器学习系统向传统科技公司以外的领域扩散,五个支柱变得更加关键。

这些趋势有一个共同的主题:它们创造了更强大、更广泛的机器学习系统,但同时也使得这些系统在可靠地设计上更加复杂。五个支柱框架为导航这一领域提供了基础,尽管每个支柱内的具体技术将继续进步。

系统知识本质

机器学习系统工程在认识论上与纯理论计算机科学学科不同。虽然算法、复杂性理论或形式验证等领域通过数学证明和严格的推导来构建知识,但机器学习系统工程是一种实践,一种通过构建、部署和维护大规模系统来学习的技艺。这种区别在 MLOps 等主题中变得明显,在那里你会遇到更少的定理和更多来自生产经验的经过实战检验的模式。这里的知识不是关于证明最优解的存在,而是关于识别在现实世界约束下哪些方法能够可靠地工作。

这种实用导向反映了机器学习系统工程作为系统学科的本质。与其他工程领域——如土木、电气、机械工程一样——核心挑战在于管理复杂性和权衡,而不是推导封闭形式的解决方案。你将学会推理关于延迟与准确性的权衡,识别数据质量问题将如何破坏甚至复杂的模型,预测基础设施选择如何在整个系统架构中传播。这种系统思维是通过具体场景的经验、调试生产故障以及理解为什么某些设计模式在不同应用中持续存在来发展的。

学习的启示是显著的:掌握知识来自于对模式建立直觉、理解权衡空间以及识别不同系统组件如何相互作用。当你阅读关于监控策略或部署架构的内容时,目标不是记住特定的配置,而是发展对不同方法适合何种情境的判断。本书提供了框架、原则和代表性示例,但专业知识最终是通过将这些概念应用于实际问题、犯错误以及建立区分经验丰富的系统工程师和仅理解单个组件的人的模式识别来发展的。

如何使用这本教科书

对于接触这些材料的读者,章节系统地建立在这些基础概念之上:

基础章节(第二章,第三章,第四章)探讨了算法和架构基础,为理解系统级决策提供了技术背景。这些章节在回答“我们要构建什么?”之后,再讨论“我们如何可靠地构建它?”

支柱章节遵循五学科组织结构,每个支柱包含多个章节,从基础到高级主题逐步推进。读者可以线性地阅读所有章节,或者关注与他们的工作相关的特定支柱,尽管理解我们讨论的相互依赖性有助于欣赏一个支柱中的决策如何影响其他支柱。

专门主题(第十九章,第十八章,第二十章)探讨了机器学习系统工程如何应用于特定领域和新兴挑战,展示了框架在多样化应用中的灵活性。

本书全书的交叉引用系统有助于导航联系——当某一章节讨论了在其他地方详细阐述的概念时,引用会引导你找到相关材料。这种相互关联的结构反映了 AI 三角形框架的现实:机器学习系统工程需要理解数据、算法和基础设施如何相互作用,而不是孤立地研究它们。

如需了解本书的学习成果、目标受众、先决条件和如何最大化利用此资源,请参阅关于本书部分,该部分还提供了关于我们的学习社区和额外资源的详细信息。

本介绍为后续内容建立了概念基础。我们首先理解了人工智能作为愿景与机器学习作为方法论之间的关系。我们将机器学习系统定义为我们所构建的工件:由数据、算法和基础设施组成的集成计算系统。通过痛苦的教训和人工智能的历史演变,我们发现了系统工程为何成为人工智能进步的基础,以及基于学习的方法如何成为该领域的支配力量。这种背景使我们能够正式定义人工智能工程作为一个独立的学科,遵循计算机工程出现的模式,将其确立为致力于在所有计算平台上构建可靠、高效和可扩展的机器学习系统的领域。

前面的旅程系统地探讨了人工智能工程的每个支柱,提供了对构建生产级机器学习系统的概念理解和实用技术。我们识别出的挑战——无声的性能退化、数据漂移、模型复杂性、运营开销、伦理问题——贯穿于这些章节,但现在有了基于实际经验和最佳实践的特定工程解决方案。

欢迎来到人工智能工程。


机器学习系统

DALL·E 3 提示:以矩形格式展示嵌入式系统与嵌入式人工智能融合的插图。图像的左侧展示了传统的嵌入式系统,包括微控制器和处理器,细节丰富且精确。右侧展示了人工智能的世界,以抽象的形式展示了机器学习模型、神经元和数据流。两部分明显分开,强调嵌入式技术和人工智能的个体重要性,但在中心和谐地结合在一起。

图片

目的

机器学习运行的环境如何塑造这些系统的本质,是什么推动了它们在计算平台上的广泛应用?

机器学习系统必须适应截然不同的计算环境,每个环境都施加独特的约束和机遇。云部署利用庞大的计算资源,但面临网络延迟,而移动设备提供用户接近性,但受到严重的电源限制。嵌入式系统通过本地处理最小化延迟,但限制了模型复杂性,而小型设备使广泛感知成为可能,但将内存限制在千字节。这些部署环境从根本上决定了系统架构、算法选择和性能权衡。了解特定环境的要求为机器学习系统中的工程决策奠定了基础。这种知识使工程师能够选择适当的部署范式并设计在计算平台之间平衡性能、效率和实用性的架构。

学习目标

  • 解释物理约束(光速、功率墙、内存墙)如何导致多样化的机器学习部署范式

  • 通过资源配置和最佳用例区分云、边缘、移动和 TinyML 范式

  • 分析资源权衡(计算能力、延迟、隐私、能源效率),以确定特定应用的适当部署策略

  • 应用系统部署决策框架,评估机器学习应用的隐私、延迟、计算和成本需求

  • 设计集成多个部署范式的混合机器学习架构

  • 评估现实世界的机器学习系统,以确定正在使用哪些部署范式并评估其有效性

  • 批判常见的部署谬误和误解,以避免在机器学习系统设计中做出不良的架构决策

  • 综合通用设计原则,创建在部署环境中有效平衡性能、效率和实用性的机器学习系统

部署范式框架

前面的介绍将机器学习系统确立为包含三个基本组成部分:数据、算法和计算基础设施。虽然这个三重框架提供了一个理论基础,但从概念理解到实际应用的过渡引入了一个关键维度,这一维度从根本上决定了系统设计:部署环境。本章分析了计算环境如何塑造机器学习系统中的架构决策,为以部署为导向的设计原则建立了理论基础。

当代机器学习应用展示了由部署限制驱动的显著架构多样性。以计算机视觉领域 1 为例:用于图像分类的卷积神经网络在部署到不同环境时表现为截然不同的系统。在基于云的医疗影像中,系统利用几乎无限的计算资源来实现集成方法 2 和复杂的预处理流程。当部署在移动设备上进行实时目标检测时,相同的根本算法经过架构转换以满足严格的延迟要求,同时保持可接受的准确性。在工厂自动化应用中,设计空间进一步受到限制,优先考虑能源效率和确定性的响应时间,而不是模型复杂性。这些变化代表了针对同一计算问题的不同架构解决方案,这些解决方案由环境限制而不是算法考虑所塑造。

本章提出了机器学习部署范例的系统分类法,分析了涵盖从云数据中心到基于微控制器的嵌入式系统的计算谱系的四个主要类别。每个范例都源于不同的操作要求:计算资源可用性、功耗限制、延迟规格、隐私要求以及网络连接假设。这里开发的框架为在生产机器学习系统中做出明智的架构决策提供了分析基础。

现代部署策略超越了传统集中式和分布式处理的二分法。当代应用越来越多地实施混合架构,战略性地在多个范式之间分配计算任务,以优化系统级性能。语音识别系统是这种架构复杂性的例证:唤醒词检测在超低功耗嵌入式处理器上运行,以实现持续监控,语音到文本转换使用移动处理器以保持隐私并最小化延迟,而语义理解则利用云基础设施进行复杂自然语言处理。这种多范式方法反映了工程现实,即最佳的机器学习系统需要架构异质性。

部署范式空间展现出清晰的维度结构。云机器学习在接受网络引入的延迟约束的同时,最大化计算能力。边缘计算在延迟要求不允许基于云的处理时,将推理计算定位在数据源附近。移动机器学习将计算能力扩展到个人设备,其中用户接近性和离线操作是关键要求。微型机器学习使资源受限的设备能够实现分布式智能,其中能效优于计算复杂性。

通过对这些部署范式的全面分析,本章发展了设计有效平衡算法能力和操作约束的机器学习架构所需的系统工程视角。这种以系统为导向的方法为将理论机器学习进步转化为在生产系统中展示可靠性能的规模化系统提供了基本方法论基础。分析以混合架构的范式集成策略和识别所有机器学习部署环境中起主导作用的核心设计原则告终。

图 2.1 展示了计算资源、延迟要求和部署约束如何创建这种部署频谱。虽然第七章探讨了使机器学习跨越这些范式成为可能的软件工具,而第十一章则考察了推动它们的专用硬件,但本章重点讨论了支配系统架构决策的基本部署权衡。后续分析系统地处理每个范式,旨在理解它们如何整合到现代机器学习系统中。

部署频谱

从云到嵌入式系统的部署范围并非出于选择,而是由物理定律强加于计算系统的必要性所决定的。这些不可改变的约束创造了无法被工程进步克服的硬边界,迫使专门部署范例的演变,这些范例针对不同的操作环境进行了优化。

光速确立了绝对的最小延迟,这限制了实时应用。光在光纤中传播的速度约为每秒 200,000 公里,在加利福尼亚和弗吉尼亚之间理论上最小的往返时间为 40 毫秒。互联网路由、DNS 解析和处理开销通常会增加另外 60-460 毫秒,导致云服务的总延迟为 100-500 毫秒。这种由物理定律造成的延迟使得对于需要低于 10 毫秒响应时间的安全关键应用,如自动驾驶车辆的紧急制动或工业机器人的精确控制,云部署变得不可能。

功耗墙,由于 2005 年左右 Dennard 缩放效应的崩溃而形成,改变了计算的经济性。晶体管缩小不再降低功率密度,这意味着芯片不能在功率消耗和热量生成成比例增加的情况下任意加速。这种限制迫使在计算性能和能源效率之间进行权衡,直接推动了在移动和嵌入式系统中对专用低功耗架构的需求。数据中心现在将 30-40%的电力预算用于冷却,而移动设备必须实施热管理以防止组件损坏。

内存墙代表了处理器速度和内存带宽之间不断扩大的差距。虽然计算能力通过增加处理单元线性扩展,但由于物理布线限制,内存带宽大约与芯片面积的平方根成正比。这导致处理器成为数据饥渴,花费更多时间等待内存传输而不是进行计算,从而形成了越来越严重的瓶颈。大型机器学习模型加剧了这个问题,需要的数据集参数量远远超过可用的内存带宽。

规模经济产生了显著的单位成本差异,这为不同的部署方法提供了合理性。一台成本为 50,000 美元的云服务器可以通过虚拟化支持成千上万的用户,实现每个用户的成本低于 50 美元。然而,需要保证响应时间或私人数据处理的应用程序不能共享资源,消除了这种经济优势。与此同时,成本在 5-50 美元之间的嵌入式处理器使得在数十亿个端点部署成为可能,而单个云连接在经济上是不切实际的。

这些物理约束不是暂时的工程挑战,而是塑造计算景观的永久性限制。理解这些边界解释了为什么存在部署范围,并为在机器学习系统中做出明智的架构决策提供了理论基础。

图 2.1:分布式智能频谱:机器学习系统设计涉及计算资源、延迟和连接性的权衡,从而产生从集中式云基础设施到资源受限的边缘和微型机器学习设备的部署选项频谱。此图映射了这些选项,突出显示每种方法如何平衡处理位置与设备能力和网络依赖性。来源:(ABI Research 2024)。

部署范式基础

图 2.1 中所示的部署范围并非出于设计偏好,而是由不可变的物理和硬件约束驱动的必要性。理解这些限制揭示了为什么机器学习系统不能采用统一的方法,而必须跨越从云到嵌入式设备的完整部署范围。

第一章 建立了机器学习系统(数据、算法和基础设施)的三个基础组件作为一个统一的框架,这些部署范式现在基于物理约束不同地优化。云机器学习通过丰富的基础设施优先考虑算法复杂性,而移动机器学习强调数据局部性,在受限的基础设施下,而微型机器学习在极端基础设施限制下最大化算法效率。

现代计算中最关键的瓶颈源于内存带宽扩展速度与计算能力不同。虽然计算能力通过额外的处理单元线性扩展,但由于物理路由约束,内存带宽大约以芯片面积的平方根扩展。这创造了一个逐渐恶化的瓶颈,处理器变得数据匮乏。在实践中,这表现为机器学习模型花费更多时间等待内存传输而不是进行计算,这对需要比能高效传输的数据更多的 3 大型模型尤其成问题。

在这些内存挑战的基础上,Dennard 缩放 4 的崩溃在 2005 年左右改变了计算约束,当时晶体管缩小停止了降低功率密度的过程。现在,每单位面积的功耗保持不变或随着每一代技术的进步而增加,为计算密度设定了硬性限制。对于移动设备来说,这意味着当持续计算产生过多热量时,性能会降低,即热管理。数据中心在规模上也面临类似的约束,需要大量的冷却基础设施,这可能消耗总电力预算的 30-40%。这些功率密度限制直接推动了在移动和嵌入式环境中对专用低功耗架构的需求,并解释了为什么在电力预算受限时边缘部署变得必要。

除了功率考虑之外,物理限制设定了无法通过工程优化克服的最小延迟。光速在加利福尼亚和弗吉尼亚之间建立了固有的 80ms 往返时间,而互联网路由、DNS 解析和处理开销通常又贡献了额外的 20-420ms。这 100-500ms 的总延迟使得纯云部署中的实时应用变得不可行。网络带宽面临物理限制:光纤电缆有理论上的限制,而无线通信仍然受限于频谱可用性和信号传播物理。这些通信约束创造了硬边界,需要为延迟敏感型应用进行本地处理,并推动边缘部署决策。

随着计算密度的增加,散热成为另一个限制因素。移动设备必须降低性能以防止组件损坏并保持用户舒适,而数据中心需要广泛的冷却系统,这限制了放置选项并增加了运营成本。热约束会产生级联效应:高温降低半导体可靠性,增加错误率,并加速组件老化。这些热现实需要在计算性能和可持续运行之间进行权衡,推动云环境中的专用冷却解决方案和嵌入式系统中的超低功耗设计。

这些基本约束推动了本概述中概述的四种不同部署范例的演变(第 2.2 节)。理解这些核心约束对于选择适当的部署范例和建立现实性能预期至关重要。

这些理论限制在部署谱系中表现为具体的硬件差异。为了理解这些物理限制的实际影响,表 2.1 提供了每个类别的代表性硬件平台。这些示例展示了 ML 系统谱系中的计算资源、功耗和成本考虑的范围 5,说明了每种部署方法的实际影响。6

这些定量阈值反映了计算需求、能耗和部署可行性之间的基本关系。这些缩放关系决定了分布式云部署相对于边缘或移动替代方案何时具有优势。理解这些定量权衡,能够使从业者在对 ML 系统谱系进行部署决策时做出明智的选择。

图 2.2 展示了云 ML、边缘 ML、移动 ML 和 Tiny ML 在硬件规格、延迟特性、连接要求、功耗和模型复杂度约束方面的差异。随着系统从云过渡到边缘再到 Tiny ML,可用资源急剧减少,这对机器学习模型的部署提出了重大挑战。这种资源差异在将 ML 模型部署到微控制器(Tiny ML 的主要硬件平台)时尤为明显。这些设备具有严重受限的内存和存储容量,对于传统的复杂 ML 模型来说是不够的。

表 2.1:硬件谱系:机器学习系统设计需要在计算资源、功耗和成本之间进行权衡,正如适用于云、边缘、移动和 TinyML 部署的多样化硬件平台所例证。此表量化了这些权衡,揭示了从云数据中心中的专用 ML 加速器到嵌入式系统中的低功耗微控制器,设备能力如何塑造每个平台可以有效地支持的模式和任务。这些定量阈值提供了具体的决策标准,以帮助从业者确定他们应用的最合适的部署范式。

类别 示例设备 处理器 内存 存储 功耗 价格范围 示例模型/任务 定量阈值
云 ML Google TPU v4 Pod 4,096x TPU v4 芯片(峰值 1.1 exaflops) 131 TB HBM2 云规模(PB 规模) ~3 MW 云服务(仅限租赁) 大型语言模型、大规模训练 >1000 TFLOPS 计算、实时视频处理、>100GB/s 内存带宽、PUE 1.1-1.3,100-500ms 延迟
Edge ML NVIDIA DGX Spark GB10 Grace Blackwell Superchip (20-core Arm, 1 PFLOPS AI) 128 GB LPDDR5x 4 TB NVMe ~200 W ~$5,000 模型微调,本地推理,原型开发 ~1 PFLOPS AI 计算,>270 GB/s 内存带宽,桌面部署,本地处理
Mobile ML iPhone 15 Pro A17 Pro (6-core CPU, 6-core GPU) 8 GB RAM 128 GB-1 TB 3-5 W $999+ 面容识别,计算摄影,语音识别 1-10 TOPS 计算,<2W 持续功率,<50ms UI 响应
Tiny ML ESP32-CAM 双核 @ 240MHz 520 KB RAM 4 MB Flash 0.05-0.25 W $10 图像分类,运动检测 <1 TOPS 计算,<1mW 功耗,微秒级响应时间

图 2.2:设备内存限制:AI 模型部署跨越了具有截然不同内存容量的广泛设备,从 16 GB 的云服务器到只有 320 kb 的基于微控制器的系统。这种进步需要专门的优化技术和高效的架构,以在有限的资源下实现设备上的智能。来源:(Ji Lin, Zhu, et al. 2023)。

云 ML:最大化计算能力

在确定了塑造 ML 部署范例的约束和进化进程之后,本分析系统地处理每个范例,从云 ML 开始,这是其他范例出现的基石。这种方法在接受延迟约束的同时最大化计算资源,当计算能力比响应时间更重要时提供最佳选择。云部署对于可以容忍网络延迟的复杂训练任务和推理工作负载来说证明是理想的。

云机器学习利用集中基础设施的扩展性和能力 7 来处理计算密集型任务:大规模数据处理、协作模型开发以及高级分析。云数据中心利用分布式架构和专用资源来训练复杂模型并支持多样化的应用,从推荐系统到自然语言处理 8。后续分析将讨论使云 ML 系统适用于大规模应用的部署特性。

云机器学习(Cloud ML) 是在 集中数据中心基础设施 上部署机器学习模型,以 巨大的计算能力可扩展性 来降低训练和部署复杂模型的成本,但代价是 网络延迟连接依赖性

图 2.3 提供了云 ML 功能的概述,我们将在本节中详细讨论。

图 2.3:云机器学习能力:云机器学习系统通过集中式计算基础设施和专用硬件解决与规模、复杂性和资源管理相关的挑战。此图概述了在云中部署模型的关键考虑因素,包括需要可靠的基础设施和高效的资源分配,以处理大型数据集和复杂的计算。

云基础设施和规模

要理解云机器学习在部署谱系中的位置,我们首先必须考虑其定义特征。云机器学习的主要区别特征是其集中式基础设施,在前所未有的规模上运行。图 2.4 通过谷歌云 TPU9 数据中心的一个例子来说明这一概念。正如表 2.1 中详细说明的那样,像谷歌的 TPU v4 Pod 这样的云系统,与移动设备相比,具有 100-1000 倍的计算优势,拥有>1000 TFLOPS 的计算能力和兆瓦级功耗。云服务提供商在全球分布的数据中心中提供具有>100GB/s 内存带宽的虚拟平台 10。这些集中式设施使得在资源受限的设备上无法完成的计算工作成为可能。然而,这种集中化引入了关键的权衡:100-500ms 的网络往返延迟消除了实时应用,而运营成本与使用量成线性增长。

图片

图 2.4:云数据中心规模:大规模机器学习系统需要具有巨大计算资源和存储容量的集中式基础设施。谷歌的云 TPU 数据中心提供了这一需求,拥有专门的人工智能加速器硬件,以高效地管理训练和部署复杂模型的需求。来源:(DeepMind 2024))。

云机器学习在处理大量数据方面表现出色,通过并行化架构。通过第十章中详细说明的技术,跨数百个 GPU 的分布式训练使得在单个设备上需要数月的处理可以在短时间内完成,而第十一章涵盖了支撑这一性能的内存带宽分析。这使得在需要数百 PB 存储和 PFLOPS 计算的数据库上进行训练成为可能,这些资源在受限设备上是不可能实现的。

集中式基础设施通过云 API11 创造了卓越的部署灵活性,使得训练好的模型可以通过移动、Web 和物联网平台在全球范围内访问。无缝协作使得多个团队可以同时访问项目,并使用集成版本控制。按需付费的定价模式 12 消除了前期资本支出,同时资源可以根据需求弹性扩展。

一个常见的误解是认为云机器学习庞大的计算资源使其在所有替代部署方法中普遍优于其他方法。云基础设施提供了卓越的计算能力和存储,但这种优势并不自动转化为所有应用的理想解决方案。云部署引入了显著的权衡,包括网络延迟(通常是 100-500 毫秒的往返延迟)、传输敏感数据时的隐私问题、随着使用量增加的持续运营成本,以及对网络连接的完全依赖。边缘和嵌入式部署在需要实时响应的场景中表现卓越(自动驾驶汽车需要低于 10 毫秒的决策制定),在需要严格数据隐私(处理患者数据的医疗设备)、可预测的成本(一次性硬件投资与持续云费用)、或在断开连接的环境中运行(偏远地区的工业设备)方面表现出色。最佳的部署范式取决于具体的应用需求,而不是原始的计算能力。

云机器学习权衡与限制

云机器学习(Cloud ML)的显著优势伴随着固有的权衡,这些权衡影响着部署决策。延迟是最大的物理限制。网络往返延迟通常在 100-500 毫秒之间,这使得云处理不适合需要低于 10 毫秒响应时间的实时应用,例如自动驾驶汽车和工业控制系统。除了基本的定时限制外,不可预测的响应时间使得在地理上分布的基础设施中进行性能监控和调试变得复杂。

在采用云部署时,隐私和安全问题带来了重大挑战。将敏感数据传输到远程数据中心可能产生潜在的安全漏洞并使合规性复杂化。处理受 GDPR13 或 HIPAA14 等法规约束的数据的组织必须实施包括加密、严格的访问控制和持续监控在内的全面安全措施,以满足严格的数据处理要求。

成本管理随着支出的增加而引入了运营复杂性。考虑一个每天处理 100 万次推理的生产系统,每次推理的费用为 0.001 美元:年费用达到 365,000 美元,而一次性购买等效边缘硬件的费用为 100,000 美元。盈亏平衡点出现在大约 100,000-1,000,000 次请求时,这直接影响部署策略。不可预测的使用高峰进一步复杂化了预算编制,需要复杂的监控和成本治理框架。

网络依赖性创造了另一个关键约束。任何连接中断都会直接影响系统可用性,在网络访问受限或不稳定的地方尤其成问题。供应商锁定进一步复杂化了这一局面,因为对特定工具和 API 的依赖在切换提供商时创造了可移植性和互操作性挑战。组织必须根据应用需求和风险承受能力,仔细权衡这些约束与云的好处,并在第十六章中详细阐述弹性策略。

大规模训练和推理

云机器学习的计算优势在面向消费者的应用中表现得最为明显,这些应用需要巨大的规模。Siri 和 Alexa 等虚拟助手展示了云机器学习处理计算密集型自然语言处理的能力,利用广泛的计算资源处理大量并发交互,并通过接触不同的语言模式和用例不断改进。

Netflix 和 Amazon 部署的推荐引擎展示了云资源另一个令人信服的应用。这些系统使用协同过滤 15 和其他机器学习技术处理大量数据集,以揭示用户偏好和行为中的模式。随着用户数据的增长,云计算资源能够实现持续更新和优化,Netflix 每天处理超过 1000 亿个数据点,以提供个性化的内容推荐,这些推荐直接增强了用户参与度。

金融机构通过云机器学习能力实现了欺诈检测的革命。通过实时分析大量交易数据,基于历史欺诈模式训练的机器学习算法可以检测数百万账户中的异常和可疑行为,从而实现主动的欺诈预防,最大限度地减少财务损失。

这些应用展示了云机器学习的计算优势如何转化为大规模、复杂处理任务的变革性能力。除了这些旗舰应用之外,云机器学习通过社交媒体上的个性化广告、电子邮件服务中的预测文本、电子商务中的产品推荐、增强的搜索结果以及连续监控大规模网络威胁的安全异常检测系统,渗透到日常在线体验中。

Edge ML:降低延迟和隐私风险

云机器学习的计算优势伴随着固有的权衡,这限制了其在许多现实场景中的应用。我们考察的 100-500 毫秒延迟和隐私问题为需要即时响应或本地数据处理的应用创造了基本障碍。Edge ML 作为对这些特定限制的直接回应出现,将计算更靠近数据源,以 100 毫秒以下的延迟和本地数据主权为代价,换取了无限的计算资源。

这种范式转变对于云的 100-500 毫秒往返延迟被认为不可接受的应用至关重要。需要瞬间决策的自主系统和要求实时响应的工业物联网 16 应用不能容忍网络延迟。同样,受到严格数据隐私法规约束的应用必须在本地处理信息,而不是将其传输到远程数据中心。边缘设备(网关和物联网中心 17)在部署谱中占据中间位置,在中间资源约束下保持可接受的性能。

边缘机器学习(Edge ML)是在网络边缘的本地基础设施上部署机器学习模型,通过在网关和工业控制器等静止设备上本地计算,实现低延迟处理数据隐私

图 2.5 提供了 Edge ML 关键维度的概述,本分析将详细阐述这些维度。

图片

图 2.5:边缘机器学习维度:此图概述了边缘机器学习的关键考虑因素,对比了挑战与好处,并提供了代表性的示例和特征。理解这些维度有助于在资源受限的设备上设计和部署有效的 AI 解决方案。

分布式处理架构

边缘机器学习(Edge ML)的多样性涵盖了可穿戴设备、工业传感器和智能家居设备,这些设备在本地 18 处理数据而不依赖于中央服务器(图 2.6)。边缘设备在计算资源、功耗和成本方面介于云系统和移动设备之间。25-100 GB/s 的内存带宽使得需要 100MB-1GB 参数的模型能够通过优化技术(第十章)实现与云模型相比 2-4 倍的加速。本地处理消除了网络往返延迟,实现了<100 毫秒的响应时间,同时产生了大量的带宽节省:本地处理 1000 个摄像头流避免了 1Gbps 的上行成本,并每年减少 10,000-100,000 美元的云费用。

边缘机器学习(Edge ML)的好处和部署挑战

边缘机器学习提供了可量化的好处,解决了关键云限制。从云部署中的 100-500ms 延迟降低到边缘的 1-50ms 延迟,使得需要实时响应的安全关键应用 19 成为可能。带宽节省同样显著:一家拥有 50 个摄像头的零售店通过本地处理和仅传输元数据,可以将带宽需求从 100 Mbps(每月成本 1,000-2,000 美元)降低到不到 1 Mbps,减少了 99%。通过本地处理,隐私得到改善,消除了传输风险并简化了合规性。运营弹性确保系统在网络中断期间继续运行,这对于制造、医疗保健和建筑管理应用至关重要。

这些好处伴随着相应的限制。有限的计算资源 20 显著限制了模型复杂性:边缘服务器通常提供的处理能力比云基础设施低 10-100 倍,将可部署的模型限制在数百万参数而不是数十亿参数。管理分布式网络引入的复杂性随着部署规模的非线性增长。在数千台设备上协调版本控制和更新需要复杂的编排系统 21。随着物理可访问性的增加,安全挑战加剧——在零售店或公共基础设施中部署的边缘设备面临篡改风险,需要基于硬件的保护机制。硬件异构性进一步复杂化了部署,因为具有不同能力的各种平台需要不同的优化策略。边缘服务器的初始部署成本为 500-2,000 美元,创造了大量的资本需求。部署 1,000 个地点需要 50 万至 200 万美元的前期投资,尽管这些成本可以通过长期运营节省来抵消。

图片

图 2.6:边缘设备部署:从可穿戴设备到家用电器,各种物联网设备通过本地执行推理,实现了去中心化机器学习,减少了对于云连接的依赖,并提高了响应时间。来源:Edge Impulse。

实时工业和物联网系统

行业在低延迟、数据隐私和运营弹性可以证明分布式处理额外复杂性的情况下广泛部署边缘机器学习。自动驾驶汽车可能是最具有挑战性的应用,其中基于无法传输到远程服务器的传感器数据,必须在毫秒内做出安全关键的决定。像特斯拉的全自动驾驶系统这样的系统通过定制的边缘硬件,以每秒 36 帧的速度处理来自八个摄像头的输入,在 10ms 以下的延迟下做出驾驶决策,这是由于网络延迟,使用云处理无法实现的物理上不可能的响应时间。

智能零售环境展示了边缘机器学习在隐私敏感、带宽密集型应用中的实际优势。亚马逊 Go 商店通过本地边缘服务器处理来自数百个摄像头的视频,跟踪顾客的移动和商品选择,以实现无结账购物。这种基于边缘的方法解决了技术和隐私方面的担忧:从数百个摄像头传输高分辨率视频需要超过 200 Mbps 的持续带宽,而本地处理确保顾客的视频永远不会离开场所,从而解决隐私问题和监管要求。

工业物联网 22 利用边缘机器学习,在毫秒级响应直接影响生产效率和工人安全的应用中。制造设施部署边缘机器学习系统进行实时质量控制,视觉系统以每分钟超过 60 个零件的速度检查焊接,以及监控每个设施超过 10,000 个工业资产的预测性维护 23 应用。这种方法在各种制造行业证明了 25-35%的不计划停机时间减少。

智能建筑利用边缘机器学习优化能源消耗,同时在网络中断期间保持运营连续性。配备基于边缘的建筑管理系统的商业建筑处理来自 5,000-10,000 个传感器的数据,监测温度、占用率、空气质量和能源使用,边缘处理将云传输需求减少了 95%,同时实现了亚秒级响应时间。医疗保健应用同样利用边缘机器学习进行患者监测和手术辅助,通过本地处理保持 HIPAA 合规性,同时实现实时手术指导的 100ms 以下延迟。

移动机器学习:个人和离线智能

虽然边缘机器学习解决了云部署的延迟和隐私限制,但它引入了新的限制:需要专用边缘基础设施、持续的网络安全连接和大量的前期硬件投资。数十亿个人计算设备(智能手机、平板电脑和可穿戴设备)的普及创造了将智能直接带到用户手中的机会,从而进一步扩展机器学习能力。移动机器学习代表了智能分布的下一步,优先考虑用户接近性、离线能力和个性化体验,同时在电池供电设备的严格功率和热限制下运行。

移动机器学习将机器学习直接集成到智能手机和平板电脑等便携式设备中,为用户提供实时、个性化的功能。当用户隐私、离线操作和即时响应比计算复杂性更重要时,这种范式表现卓越。移动机器学习支持语音识别 24、计算摄影 25 和健康监测等应用,同时通过设备端计算保持数据隐私。这些电池供电设备必须在性能和功耗、热管理之间取得平衡,使其成为频繁、短时 AI 任务的理想选择。

移动机器学习(Mobile ML) 是将机器学习模型直接部署在便携式、电池供电设备上,在严格的能源和资源限制下实现个性化隐私离线操作

本节从四个关键维度分析移动机器学习,揭示这一范式如何平衡能力和限制。图 2.7 提供了移动机器学习能力概述。

图 2.7:移动机器学习能力:移动机器学习系统通过设备端处理、专用硬件加速和优化框架,在性能和资源限制之间取得平衡。此图概述了在移动设备上部署机器学习模型的关键考虑因素,包括计算效率、电池寿命和模型性能之间的权衡。

电池和热限制

移动设备体现了中间限制:8GB RAM、128GB-1TB 存储、1-10 TOPS 通过神经网络单元 26 进行 AI 计算,消耗 3-5W 功率。片上系统架构 27 将计算和内存集成以最小化能源成本。25-50 GB/s 的内存带宽限制了模型参数为 10-100MB,需要积极的优化(第十章)。电池限制(18-22Wh 容量)使能源优化变得至关重要:1W 连续的机器学习处理将设备寿命从 24 小时减少到 18 小时。专用框架(TensorFlow Lite28、Core ML29)提供硬件优化的推理,使 UI 响应时间低于 50ms。

移动机器学习优势和资源限制

移动机器学习在提供响应迅速、保护隐私的用户体验方面表现出色。实时处理实现了低于 10 毫秒的延迟,实现了几乎不可察觉的响应:人脸检测以 60fps 的速度运行,延迟低于 5 毫秒,而语音唤醒词检测在 2-3 毫秒内响应。通过设备上的处理实现完全的数据主权,确保了隐私保障:面部识别在硬件隔离的安全区域 30 内处理生物识别数据,键盘预测在用户数据上本地训练,健康监测无需复杂的基础设施即可保持 HIPAA 合规性。离线功能消除了对网络的依赖:Google Maps 在本地分析数百万个路段以进行导航,翻译 31 支持 40 多个语言对,使用 35-45MB 的模型实现 90%的云端准确性,音乐识别与设备数据库进行匹配。通过利用数月积累的行为数据,个性化达到了前所未有的深度:iOS 以 70-80%的准确性预测用户将打开哪个应用,通知管理根据个人模式优化交付时间,相机系统通过隐式反馈持续适应用户偏好。

这些好处需要接受重大的资源限制。旗舰手机只为单个机器学习应用分配了 100MB-1GB 的内存,仅占总内存的 0.5-5%,迫使模型保持低于 100-500MB,而云服务可以部署 350GB+的模型。电池寿命 32 使用深度估计和分割网络实现类似单反相机的散景效果,夜间模式通过基于机器学习的降噪技术捕捉并对齐 9-15 帧,降低噪声 10-20dB,而像 Google Pixel 这样的系统则对每张照片处理 10-15 个不同的机器学习模型,用于 HDR 合并、超分辨率和场景优化。

基于语音的交互展示了移动机器学习如何改变人机通信。这些系统结合了超低功耗的唤醒词检测,消耗不到 1mW,以及设备上的语音识别,简单命令的延迟低于 10ms。键盘预测已发展到上下文感知的神经网络模型,实现了 60-70%的短语预测准确性,减少了 30-40%的打字工作量。实时相机翻译在 15-30fps 的速度下处理超过 100 种语言,完全在设备上完成,无需互联网连接即可实现即时视觉翻译。

通过 Apple Watch 等可穿戴设备进行健康监测,从传感器数据中提取复杂的见解,同时保持完全的隐私。这些系统在活动检测中达到超过 95%的准确性,包括 FDA 批准的心房颤动检测,灵敏度超过 98%,完全在设备上处理极其敏感的健康数据,以保持 HIPAA 合规性。无障碍功能通过持续本地处理展示了变革性的社会影响:实时文本识别从摄像头流中检测和识别文本,声音识别通过触觉反馈提醒聋人用户环境提示,语音覆盖生成视觉内容的自然语言描述。

增强现实框架利用移动机器学习在 60fps 的速度下实现实时环境理解。ARCore 和 ARKit 以厘米级的精度追踪设备位置,同时绘制 3D 周围环境,实现手部追踪,提取 21 个关节的 3D 姿态和 50 多个地标网格的面部分析,以实现实时效果。这些应用需要保持 16ms 以下的帧时间,使得仅在设备上处理成为提供用户期望的无缝体验的唯一可行方案。

尽管移动机器学习已经展示了其能力,但一个常见的陷阱是试图直接将桌面训练的模型部署到移动或边缘设备上,而不进行架构修改。在强大的工作站上开发的模型在部署到资源受限的设备上时往往表现糟糕。一个需要 4GB 内存进行推理(包括激活和批量处理)和每推理 4 亿次浮点运算(FLOPs)的 ResNet-50 模型无法在具有 512MB RAM 和 1 GFLOP/s 处理器的设备上运行。除了简单的资源违规之外,桌面优化的模型可能使用移动硬件不支持的操作(专门的数学操作),假设嵌入式系统中不可用的浮点精度,或者需要与单样本推理不兼容的批量处理。成功的部署需要从一开始就进行架构感知设计,包括为移动设备专门设计的架构技术(A. G. Howard 等人 2017),仅使用整数的微控制器操作,以及保持准确性的同时减少计算量的优化策略。

微型机器学习:大规模无处不在的感知

从云到边缘再到移动机器学习的进步展示了智能在计算平台上的分布越来越广泛,然而每一步仍然需要大量的资源。即使是拥有复杂处理器和数 GB 内存的移动设备,在全球计算格局中也处于相对有利的地位,需要消耗瓦特的电力和数百美元的硬件投资。对于真正无处不在的智能(每个表面都有传感器,每台机器都有监控,每个物体都有智能),这些资源需求仍然具有阻碍性。微型机器学习通过将智能推向绝对极限,使用成本低于 10 美元且功耗低于 1 毫瓦的设备,从而完成了部署光谱。这种范式使得无处不在的感知不仅在技术上可行,而且在大规模上经济上也是实用的。

在移动机器学习仍然需要具有数 GB 内存和多核处理器的复杂硬件时,微型机器学习在具有千字节 RAM 和单价仅为数美元的微控制器上运行。这种极端的限制迫使我们在机器学习部署方法上发生重大转变,优先考虑超低功耗和最小成本,而不是计算复杂性。结果是使得在其它任何规模下都不可行的全新类别应用成为可能。

小型机器学习(Tiny ML)将智能带到最小的设备中,从微控制器 34 到嵌入式传感器,使在资源严重受限的环境中实现实时计算成为可能。这种范式在需要无处不在的感知、自主操作和极端能源效率的应用中表现出色。Tiny ML 系统为预测性维护、环境监测和简单的手势识别等应用提供动力,同时优化能源效率 35,通常在有限的电源,如纽扣电池 36 上运行数月或数年。这些系统在电力、连接性和维护访问不切实际的环境中提供可操作的见解。

微型机器学习(Tiny ML)是在微控制器超受限设备上部署机器学习模型,使应用需要数年电池寿命时,能够以毫瓦级功耗实现自主决策

本节通过四个关键维度分析 Tiny ML,这些维度定义了它在机器学习部署谱中的独特位置。图 2.8 概括了本节讨论的 Tiny ML 的关键方面。

图 2.8:TinyML 系统特性:受限设备需要关注效率,在模型复杂度、准确性和能耗之间进行权衡,同时在嵌入式应用中实现本地智能和实时响应。此图概述了 TinyML 的关键方面,包括资源限制的挑战、示例应用和设备上机器学习的益处。

极端资源限制

TinyML 在硬件极端条件下运行:Arduino Nano 33 BLE Sense(256KB RAM,1MB 闪存,0.02-0.04W,$35)和 ESP32-CAM(520KB RAM,4MB 闪存,0.05-0.25W,$10)与云系统相比,内存减少了 30,000-50,000 倍,与图 2.9 相比,功耗降低了 160,000 倍。这些限制使设备能够实现数月或数年的自主运行 37,但需要专门的算法,在<1 TOPS 的计算能力和微秒级响应时间内提供可接受的性能。设备大小从手掌大小到 5x5mm 的芯片 38 不等,使在以前不可能的情境中实现无处不在的感知成为可能。

图 2.9:TinyML 系统规模:这些设备套件展示了 TinyML 能够实现的极端小型化,使机器学习能够在有限的电源和内存的受限设备上部署。这些紧凑的系统扩大了 ML 的应用范围,包括以前无法访问的边缘应用,如可穿戴传感器和嵌入式物联网设备。来源:(Warden 2018)

TinyML 优势和操作权衡

TinyML 的极端资源限制使其在其它规模下无法实现的独特优势成为可能。微秒级延迟消除了所有传输开销,实现了 10-100μs 的响应时间,这使得需要亚毫秒级决策的应用成为可能:工业振动监测过程在低于 50μs 的延迟下进行 10kHz 采样,音频唤醒词检测在低于 100μs 下分析 16kHz 音频流,精密制造系统每分钟检查超过 1000 个部件。经济优势证明了大规模部署的变革性:完整的 ESP32-CAM 系统成本为 8-12 美元,使得 1000 个传感器的部署成本为 1 万美元,而基于蜂窝网络的替代方案成本为 50 万至 100 万美元。农业监测可以通过 5000 美元的设备进行,而基于摄像头的系统则需要超过 5 万美元,而城市规模的 10 万个传感器的网络在 100 万至 200 万美元的成本下变得经济可行,而边缘替代方案的成本为 5000 万至 1 亿美元。能源效率使得设备能够在仅消耗 1-10mW 的纽扣电池上运行 1-10 年,支持像野生动物追踪这样的应用数年无需重新捕获,在建设期间嵌入混凝土中的结构健康监测,以及在电力基础设施不存在的地区部署的农业传感器。甚至可以从太阳能、振动或热源中收集能量,从而实现永续运行。通过物理数据封装,隐私超越了所有其他范式——数据永远不会离开传感器,提供了在加密强度无论多强的情况下,网络化系统中不可能实现的数学保证。

这些能力需要巨大的权衡。计算限制施加了严格的限制:微控制器提供 256KB-2MB 的 RAM,而智能手机提供 12-24GB(相差 5,000-50,000 倍),迫使模型保持小于 100-500KB,参数在 10,000-100,000 之间,与移动设备的 1-1000 万个参数相比。开发复杂性需要跨越神经网络优化、硬件级内存管理、嵌入式工具链以及使用示波器和 JTAG 调试器在多种微控制器架构上进行专业调试的专家知识。模型精度因极端压缩而受损:TinyML 模型通常达到云模型精度的 70-85%,而移动设备为 90-95%,限制了其在需要高精度应用中的适用性。部署的不灵活性限制了适应性,因为设备通常运行单个固定的模型,需要耗电的固件更新,这些更新可能会损坏设备。设备的使用寿命跨越数年,初始部署决策变得至关重要。微控制器供应商和机器学习框架之间的生态系统碎片化 39 创造了巨大的开发开销和平台锁定挑战。

环境与健康监测

Tiny ML 在各个领域都取得了显著的成果,其独特的优势——超低功耗、最小成本和完全的数据隐私——使得其他范式无法实现的应用成为可能。工业预测性维护展示了 TinyML 通过分布式智能改造传统基础设施的能力。制造设施部署了成千上万的振动传感器,这些传感器在 5-10 年内连续运行,使用纽扣电池,平均功耗低于 2mW。这些传感器的成本为 15-50 美元,而传统的有线传感器每点的成本为 500-2,000 美元,将部署成本从 10,000 个监测点的 5-20 百万美元降低到 150,000-500,000 美元。本地异常检测提供了 7-14 天的设备故障预警,使公司能够将非计划停机时间减少 25-45%。

唤醒词检测代表了 TinyML 最明显的消费级应用,数十亿设备在低于 1mW 的持续功耗下使用始终倾听的功能。这些系统通过包含 5,000-20,000 个参数的神经网络处理 16kHz 音频,这些参数被压缩到 10-50KB,以超过 95%的准确率检测唤醒词。亚马逊 Echo 设备使用专门的 TinyML 芯片,如 AML05,检测功耗低于 10mW,仅在唤醒词触发时激活主处理器——将平均功耗降低了 10-20 倍 40。

精准农业利用了 TinyML 的经济优势,在传统解决方案成本过高的情况下。监测 100 公顷大约需要 1,000 个监测点,而 TinyML 只需 15,000-30,000 美元,相比之下,使用蜂窝连接的替代方案需要 100,000-200,000 美元以上。这些传感器在电池上运行 3-5 年,同时本地分析时间模式,仅传输可操作的见解而不是原始数据流。

野生动物保护展示了 TinyML 在远程环境监测方面的变革潜力。研究人员部署了太阳能供电的音频传感器,功耗为 100-500mW,这些传感器处理连续的音频流以进行物种识别。通过本地分析,这些系统将卫星传输需求从每天 4.3GB 减少到检测摘要的 400KB,减少了 10,000 倍,使得 100-1,000 个传感器的规模化部署在经济上可行。医疗可穿戴设备在 5mW 以下功耗下实现了 FDA 批准的心脏监测,灵敏度达到 95-98%,每秒处理 250-500 个 ECG 样本。这种效率使得连续监测时间从基于智能手机的替代方案的数小时延长到一周,同时将诊断成本从传统实验室研究的 2,000-5,000 美元降低到家庭测试的 100 美元以下。

混合架构:结合范式

我们对个别部署范式的考察——从云的强大计算能力到微型 ML 的超高效传感——揭示了一系列工程权衡,每个都有其独特的优势和局限性。云 ML 最大化算法的复杂性,但引入了延迟和隐私限制。边缘 ML 减少了延迟,但需要专用基础设施并限制了计算资源。移动 ML 优先考虑用户体验,但运行在严格的电池和热限制内。微型 ML 通过极端效率实现普遍性,但严重限制了模型复杂性。每个范式都占据一个独特的细分市场,针对特定的约束和使用案例进行了优化。

然而,在实践中,生产系统很少局限于单一范式,因为每种方法的局限性都为互补集成创造了机会。一个使用微型 ML 进行唤醒词检测、移动 ML 进行本地语音识别、边缘 ML 进行上下文处理和云 ML 进行复杂自然语言理解的语音助手,展示了一种更强大的方法。混合机器学习将这种集成策略形式化,创建了利用每个范式互补优势的同时减轻个别局限性的统一系统。

混合机器学习(Hybrid ML)是将多种部署范式集成到统一系统中,战略性地在计算层之间分配工作负载,以实现单范式方法无法实现的可扩展性隐私性能

多层集成模式

混合机器学习(Hybrid ML)设计模式提供了可重用的架构解决方案,以有效地集成范式。每个模式代表了一种战略方法,用于在计算层之间分配机器学习工作负载,针对特定的延迟、隐私、资源效率和可扩展性权衡进行了优化。

该分析确定了五个基本模式,这些模式解决了混合机器学习系统中常见的集成挑战。

训练-服务分离

最常见的混合模式之一是训练-服务分离,其中模型训练在云端进行,但推理发生在边缘、移动或小型设备上。这种模式利用云端的强大计算资源进行训练阶段,同时受益于设备端推理的低延迟和隐私优势 41。例如,智能家居设备通常使用在云端基于大型数据集训练的模型,但本地运行推理以确保快速响应时间和保护用户隐私。在实践中,这可能涉及在具有百亿级计算能力和数百 TB 内存的强大云系统(如 TPU Pods)上训练模型,然后再将优化版本部署到边缘服务器或嵌入式边缘设备上进行高效的推理。同样,用于计算摄影的移动视觉模型通常在强大的云基础设施上训练,但部署到手机硬件上以实现高效运行。

分层处理

分层处理创建了一个多级系统,其中数据和智能在机器学习堆栈的不同层级之间流动。这种模式有效地结合了云机器学习系统的能力(如前几节讨论的大规模训练基础设施)和多个边缘机器学习系统(如边缘服务器和我们的边缘部署示例中的嵌入式设备),以平衡中央处理能力和本地响应性。在工业物联网应用中,微型传感器可能执行基本的异常检测,边缘设备汇总并分析来自多个传感器的数据,而云系统处理复杂的分析和模型更新。例如,我们可能会看到 ESP32-CAM 设备(来自我们的小型机器学习示例)在传感器级别使用最小的 520 KB RAM 执行基本的图像分类,将数据传输到边缘服务器或嵌入式系统进行更复杂分析,并最终连接到云基础设施进行复杂分析和模型更新。

这种层次结构允许每个层级处理适合其能力的任务。小型机器学习设备处理即时、简单的决策;边缘设备管理本地协调;云系统处理复杂的分析和学习任务。智能城市安装通常使用这种模式,街级传感器将数据传输到社区级的边缘处理器,后者再连接到城市级的云分析。

渐进式部署

渐进式部署通过系统性地压缩模型,通过计算层级的适应性创建分层智能架构。一个模型可能从一个大型云版本开始,然后通过第十章中详细描述的技术逐步优化边缘服务器、移动设备和最终的小型传感器。

亚马逊 Alexa 是这种模式的例证:唤醒词检测在 TinyML 设备上使用<1KB 模型,消耗<1mW,边缘处理使用 1-10MB 模型在 1-10W 下处理简单命令,而复杂的自然语言理解则需要云基础设施中的 GB+模型。这种分层方法将云推理成本降低了 95%,同时保持了用户体验。

然而,渐进式部署引入了操作复杂性:层间的模型版本管理、确保各代之间的一致性、在连接丢失期间管理故障级联以及协调数百万设备之间的更新。生产团队必须维护涵盖小型机器学习优化、边缘编排和云扩展的专门专业知识。

联邦学习

联邦学习42 允许从分布式数据中学习同时保持隐私。谷歌的生产系统处理 60 亿个移动键盘,在保持输入文本本地化的同时训练改进的模型。每一轮训练涉及 100-10,000 个设备贡献模型更新,需要编排来管理设备可用性、网络条件和计算异构性。

生产部署面临重大的运营挑战:训练轮次中的设备掉线率高达 50-90%,网络带宽限制更新频率,以及差分隐私机制防止信息泄露。聚合服务器必须处理间歇性连接、不同的设备能力,并确保在非独立同分布数据分布的情况下实现收敛。这需要专门的监控基础设施来跟踪分布式训练进度并调试问题,而无需访问原始数据。

协作学习

协作学习使得同一层级的设备之间能够进行点对点学习,通常补充了层次结构。43 例如,自动驾驶车队可以在车辆之间直接共享关于道路状况或交通模式的学习,同时与云基础设施进行通信。这种横向协作使得系统可以共享时间敏感信息,并从彼此的经验中学习,而无需始终通过中央服务器路由。

生产系统案例研究

现实世界的实现将多个设计模式整合成统一的解决方案,而不是孤立地应用它们。生产机器学习系统形成相互连接的网络,其中每个范式都扮演特定的角色,并与他人通信,遵循利用我们的四范式框架中确立的强项并解决局限性的集成模式(第 2.2 节)。

图 2.10 通过具体的连接类型说明了这些关键交互:“部署”路径显示了模型如何从云训练流向各种设备,“数据”和“结果”显示了信息如何从传感器通过处理阶段流动,“分析”显示了处理后的信息如何达到云分析,“同步”展示了设备协调。注意数据通常从传感器通过处理层向上流向云分析,而模型部署则从云训练向下流向各种推理点。这些交互并非严格分层。移动设备可以直接与云服务和微型传感器通信,而边缘系统可以帮助移动设备处理复杂的处理任务。

图片

图 2.10:混合系统交互:数据从传感器通过处理层向上流向云分析以获取洞察,而训练好的模型从云向下部署,以在边缘、移动和 Tiny ML 设备上实现推理。这些连接类型(部署、数据/结果、分析和同步)建立了一个分布式架构,其中每个范式都为整体机器学习系统贡献独特的功能。

生产系统在多种应用中展示了这些集成模式,在这些应用中,没有任何单一范式能够提供所需的功能。工业缺陷检测是模型部署模式的例证:云基础设施在多个设施的数据集上训练视觉模型,然后将优化的版本分发到管理工厂运营的边缘服务器、质量检查员使用的平板电脑以及制造设备上的嵌入式摄像头。这展示了单个机器学习解决方案如何从集中式训练流向多个计算规模上的推理点。

农业监测说明了分层数据流:土壤传感器执行本地异常检测,将结果传输到边缘处理器,这些处理器从数十个传感器汇总数据,然后将洞察传递到云基础设施进行农场范围的统计分析,同时更新农民的移动应用程序。信息通过处理层向上传递,每一层都添加了适合其计算资源的分析复杂性。

健身追踪器是 Tiny ML 和移动设备之间的网关模式的例证:可穿戴设备使用针对微控制器执行优化的算法持续监控活动,将处理后的数据同步到结合来自多个来源的指标的智能手机,然后定期将更新传输到云基础设施进行长期分析。这使得小型设备能够在缺乏直接网络连接的情况下参与大规模系统。

这些集成模式揭示了部署范式如何通过协调数据流、模型部署和跨层协助相互补充。工业系统将云、边缘、移动和 Tiny ML 的能力组合成分布式架构,同时优化延迟、隐私、成本和运营需求。范式之间的交互往往比单个组件的能力更能决定系统成功。

部署范式中的共享原则

尽管它们多样化,但所有机器学习部署范式都共享核心原则,这些原则使得系统性的理解和有效的混合组合成为可能。图 2.11 说明了从云到小型设备的实现如何汇聚到核心系统挑战:管理数据管道、平衡资源约束和实现可靠的架构。这种汇聚解释了为什么技术能够在范式之间有效转移,并且混合方法在实践中能够成功工作。

图片

图 2.11:机器学习系统收敛:不同的机器学习部署(云、边缘、移动和微型)在数据管道、资源管理和系统架构方面共享基础原则,使得混合解决方案和系统化设计方法成为可能。理解这些共享原则允许从业者跨不同范式调整技术,并在不同的约束和优化目标下构建一致、高效的机器学习工作流程。

图 2.11 揭示了三个不同的抽象层,这些层统一了不同部署环境下的机器学习系统设计。

顶层代表机器学习系统的实现——本章中检验的四个部署范式。云机器学习在数据中心进行大规模训练,边缘机器学习执行本地处理,专注于推理,移动机器学习在个人设备上运行,用于用户应用,而 TinyML 在资源受限的嵌入式系统上执行。尽管它们表面上存在差异,但这些实现共享更深层次的共同点,这些共同点在底层中显现出来。

中间层识别出将所有范式统一起来的核心系统原则。数据管道管理(第六章)控制着从收集到部署的信息流,无论是在云端数据中心处理 PB 级数据还是在微控制器上处理 KB 级数据,都保持一致的模式。资源管理在所有规模上创造着平衡计算、内存、能源和网络容量之间竞争需求的普遍挑战。系统架构原则指导着无论部署环境如何,模型、硬件和软件组件的集成。即使实施方式在可用资源上存在数量级的差异,这些基础原则仍然非常一致。

底层展示了系统考虑如何在实际维度上体现这些原则。优化和效率策略(第十章)在各个规模上采取不同的形式:云 GPU 集群训练、边缘模型压缩、移动热管理以及 TinyML 数值精度,但所有这些都在追求在可用资源内最大化性能。操作方面(第十三章)通过针对范式特定方法的部署、监控和更新来应对根本性相似挑战。可信赖的人工智能(第十七章,第十六章)对安全、隐私和可靠性的要求普遍适用,尽管实现技术必然要适应每个部署环境。

这种三层结构解释了为什么技术能够在不同规模之间有效转移。云训练的模型成功部署到边缘设备,因为训练和推理在不同的约束下优化了相似的目标。移动优化见解为云效率策略提供了信息,因为两者都管理着相同的根本资源权衡。TinyML 的创新推动了跨范例的进步,正是因为极端的限制迫使解决方案解决所有规模都存在的核心问题。混合方法(训练-服务拆分、分层处理、联邦学习)有效,因为底层原则在范例之间是一致的,即使在可用资源存在巨大差异的情况下也能实现无缝集成。

比较分析和选择框架

基于对共享原则的理解,对部署范例的系统比较揭示了应驱动部署决策的精确权衡,并突出了每个范例表现优异的场景,为从业者提供了解决方案分析框架,以便做出明智的架构选择。

计算资源与部署位置之间的关系构成了机器学习系统中最重要的比较之一。随着我们从云部署转向微型设备,我们观察到可用的计算能力、存储和能耗发生了显著下降。云机器学习系统凭借其数据中心基础设施,几乎可以无限制地利用资源,以 PB 级规模处理数据,并使用具有数十亿参数的模型进行训练。边缘机器学习系统虽然受到更多限制,但通过边缘 GPU 和神经处理单元等专用硬件,仍然提供了显著的计算能力。移动机器学习代表了中间地带,在智能手机和平板电脑等设备上平衡计算能力和能源效率。在光谱的另一端,TinyML 在严格的资源限制下运行,通常仅限于千字节级的内存和毫瓦级的能耗。

表 2.2:部署位置:机器学习系统的计算位置各不相同,从集中的云服务器到本地边缘设备,再到超低功耗的 TinyML 芯片,每个都影响着延迟、带宽和能耗。本表按处理位置和相关特征对这些部署进行分类,有助于做出关于系统架构和资源分配的明智决策。

方面 云机器学习 边缘机器学习 移动机器学习 TinyML
性能
处理位置 集中云服务器(数据中心) 本地边缘设备(网关、服务器) 智能手机和平板电脑 超低功耗微控制器和嵌入式系统
延迟 高(100 ms-1000 ms+) 中等(10-100 ms) 低-中等(5-50 ms) 非常低(1-10 ms)
计算能力 非常高(多个 GPU/TPU) 高(Edge GPU) 中等(移动 NPUs/GPU) 非常低(MCU/小型处理器)
存储容量 无限(PB+) 大(TB) 中等(GB) 非常有限(KB-MB)
能源消耗 非常高(kW-MW 范围) 高(100 s W) 中等(1-10 W) 非常低(mW 范围)
可扩展性 极佳(几乎无限) 良好(受边缘硬件限制) 中等(按设备扩展) 有限(固定硬件)
操作
数据隐私 基本到中等(数据离开设备) 高(数据留在本地网络) 高(数据留在手机上) 非常高(数据从不离开传感器)
所需连接 持续高带宽 断续 可选 无需
离线能力 良好 极佳 完全
实时处理 依赖于网络 良好 非常良好 极佳
部署
成本 高(每月 1000 美元以上) 中等(100-1000 美元) 低(0-10 美元) 非常低(1-10 美元)
硬件要求 云基础设施 Edge 服务器/网关 现代智能手机 MCU/嵌入式系统
开发复杂性 高(需要云专业知识) 中等到高(边缘+网络) 中等(移动 SDK) 高(嵌入式专业知识)
部署速度 快速 中等 快速 慢速

表 2.2 在性能、操作和部署维度上量化了这些范式差异,揭示了延迟(云:100-1000ms → 边缘:10-100ms → 移动:5-50ms → 微型:1-10ms)和隐私保证(TinyML 的完全本地处理最强)的明显梯度。

图 2.12 通过雷达图展示了性能和操作特性。图 a)对比了计算能力和可扩展性(Cloud ML 的优势)与延迟和能源效率(TinyML 的优势),Edge 和 Mobile ML 位于中间位置。

图 2.12: ML 系统权衡: 雷达图量化了云、边缘、移动和 Tiny ML 范式在性能和操作特性方面的差异,揭示了计算能力、延迟、能源消耗和可扩展性之间的固有权衡。这些可视化有助于根据特定应用的限制和优先级,选择最合适的部署方法。

图 b)强调了 TinyML 在操作维度上的优势(隐私、连接独立性、离线能力)与 Cloud ML 对集中式基础设施和持续连接的依赖。

开发复杂性随着硬件能力的增加而减少:云和 TinyML 需要深厚的专业知识(分别对应云基础设施和嵌入式系统),而移动和边缘则利用更易获取的 SDK 和工具。成本结构也显示出类似的反转:云产生持续的操作费用(每月 1000 美元以上),边缘需要适度的前期投资(100-1000 美元),移动利用现有设备(0-10 美元),而 TinyML 最小化硬件成本(1-10 美元)的同时,要求更高的开发投资。

理解这些权衡对于选择适当的部署策略至关重要,这些策略将应用需求与范式能力相一致。

部署选择中的一个关键陷阱是仅根据模型准确度指标选择范式,而不考虑系统级约束。团队通常通过单独比较模型准确度来选择部署策略,忽略了决定实际可行性的关键系统要求。如果一个云部署的模型达到 99%的准确度,但网络延迟超过了反应时间要求,那么它对自动驾驶紧急制动就毫无用处。同样,一个复杂的边缘模型可能在几分钟内耗尽移动设备的电池,尽管其准确度更高。成功的部署需要同时评估多个维度:延迟要求、电源预算、网络可靠性、数据隐私法规和总拥有成本。在模型开发之前建立这些约束,以避免在项目后期进行昂贵的架构调整。

部署选择决策框架

选择合适的部署范式需要系统地评估应用约束,而不是组织偏见或技术趋势。图 2.13 提供了一个分层决策框架,通过关键要求过滤选项:隐私(数据能否离开设备?)、延迟(需要低于 10 毫秒的响应?)、计算需求(需要大量处理?)和成本约束(预算限制?)。这种结构化方法确保部署决策源于应用需求,基于之前建立的物理约束(第 2.2.1 节)和定量比较(第 2.9 节)。

图片

图 2.13:部署决策逻辑:此流程图通过系统地评估隐私要求和处理约束,引导选择合适的机器学习部署范式,最终在性能、成本和数据安全之间取得平衡。通过导航决策树,帮助实践者确定云、边缘、移动或微型机器学习最适合特定应用。

该框架按顺序评估四个关键决策层。隐私限制形成第一个过滤器,确定数据是否可以外部传输。在 GDPR、HIPAA 或专有权限下处理敏感数据的应用程序要求本地处理,立即排除了仅限云的部署。延迟要求通过响应时间预算建立第二个限制:需要低于 10 毫秒响应时间的应用程序不能使用云处理,因为物理施加的网络延迟本身就超过了这个阈值。计算需求形成第三个评估层,评估应用程序是否需要只有云或边缘系统提供的高性能基础设施,或者它们是否可以在移动或微型设备的资源限制内运行。成本考虑通过在整个预期部署寿命内平衡资本支出、运营费用和能源效率来完成框架。

技术限制本身并不能证明部署决策的充分性。组织因素通过决定团队是否具备实施和维护所选范例的能力,对成功起着至关重要的作用。团队的专业技能必须与范例要求相一致:云机器学习需要分布式系统知识,边缘机器学习需要设备管理能力,移动机器学习需要特定平台的优化技能,而微型机器学习需要嵌入式系统专业知识。缺乏适当技能的组织将面临延长的发展周期和持续的维护挑战,从而削弱了技术优势。监控和维护能力同样通过其时间模式决定大规模的可行性:边缘部署需要分布式设备编排,而微型机器学习需要许多组织缺乏的专业固件管理。成本结构通过其时间模式进一步复杂化决策:云产生持续的经营费用,有利于不可预测的工作负载,边缘需要大量的前期投资,但通过较低的持续成本得到补偿,移动利用用户提供的设备以最小化基础设施费用,而微型机器学习最小化硬件和连接成本,同时要求显著的开发投资。

成功的部署来自于平衡技术优化与组织能力。范例选择代表了系统工程挑战,这些挑战远远超出了纯粹的技术要求,包括团队技能、运营能力和经济限制。这些决策仍然受到在第 9.3 节中探讨的基本扩展定律的限制,运营方面在第十三章中详细说明,而基准测试方法在第十二章中介绍。

谬误和陷阱

理解部署范式需要识别可能导致不良架构决策的常见误解。这些谬误通常源于对指导机器学习系统设计的核心权衡的过度简化思考。

谬误:“一种范式适用于所有” - 最普遍的误解是认为一种部署方法可以解决所有机器学习问题。团队往往在云、边缘或移动解决方案上标准化,而不考虑特定应用的约束。这种谬误忽略了在第 2.2.1 节中讨论的物理限制。实时机器人无法容忍云延迟,而复杂的语言模型超出了小型设备的处理能力。有效的系统通常需要混合架构,战略性地利用多个范式。

谬误:“边缘计算总是减少延迟” - 许多从业者认为边缘部署会自动提高响应时间。然而,边缘系统引入了处理延迟、负载平衡开销和可能的网络跳跃,这些可能超过直接云连接。设计不良、本地计算能力不足的边缘部署可能表现出比优化云服务更差的延迟。只有当本地处理时间加上减少的网络距离超过基础设施复杂性成本时,边缘优势才会显现。

谬误:“移动设备可以通过优化处理任何工作负载” - 这种误解低估了电池寿命和热管理带来的基本限制。团队常常假设模型压缩技术可以任意减少资源需求,同时保持性能。然而,移动设备面临硬性物理限制:电池容量与体积成正比,而计算需求与模型复杂性成正比。某些应用需要的计算资源,任何优化都无法在移动电源预算内适应。

谬误:“小型机器学习只是更小的移动机器学习” - 这种谬误误解了资源受限范式之间的定性差异。小型机器学习在如此严格的限制下运行,以至于需要不同的算法方法。微控制器环境施加的内存限制是以千字节计,而不是兆字节,需要使用量化等专门技术,这超出了移动优化的范畴。适用于小型机器学习的应用代表了一个根本不同的问题类别,而不仅仅是移动应用的缩小版。

谬误:“成本优化等于资源最小化” - 团队经常假设最小化计算资源会自动降低成本。这种观点忽略了运营复杂性、开发时间和基础设施开销。云部署可能会消耗更多的计算资源,但通过降低维护成本、自动扩展和共享基础设施,提供更低的总体拥有成本。最佳成本解决方案通常涉及接受更高的单位资源消耗,以换取简化操作和更快的开发周期。

摘要

本章分析了机器学习系统的多样化景观,揭示了部署环境如何直接影响系统设计的各个方面。从拥有大量计算资源的云环境到在极端限制下运行的微型设备,每个范式都提供了独特的机遇和挑战,这些机遇和挑战直接影响架构决策、算法选择和性能权衡。从云到边缘到移动再到微型机器学习的谱系,不仅仅代表了计算规模的不同,它反映了我们在计算基础设施上分布智能的重大演变。

从集中式云系统到分布式边缘和移动部署的演变展示了资源限制如何推动创新,而不仅仅是限制能力。每个范式都是为了解决其前辈的具体限制而出现的:云机器学习利用集中式力量进行复杂处理,但必须应对延迟和隐私问题。边缘机器学习将计算更靠近数据源,减少延迟,同时引入中间资源限制。移动机器学习将这些能力扩展到个人设备,平衡用户体验与电池寿命和热管理。微型机器学习将资源推向极限,使无处不在的感知和智能成为以前不可能部署环境中的可能。这一演变展示了深思熟虑的系统设计如何将限制转化为专门优化的机会。

关键要点

  • 部署环境比算法偏好更多地驱动架构决策

  • 资源限制创造了创新的机会,而不仅仅是限制

  • 混合方法正在成为机器学习系统设计的未来

  • 隐私和延迟考虑因素越来越有利于分布式智能

这些范例反映了向针对特定操作需求精细调优的系统转变的趋势,超越了“一刀切”的方法,转向了情境感知的系统设计。随着这些部署模型成熟,混合架构应运而生,结合了它们的优点:基于云的训练与边缘推理相结合,跨移动设备的联邦学习,以及优化整个频谱的分层处理。这一演变展示了部署情境将继续推动系统架构、训练方法和优化技术的创新,创造更加复杂和情境感知的机器学习系统。

然而,部署情境只是系统设计的一个维度。在这些环境中执行的计算算法同样影响资源需求、计算模式和优化策略。一个需要数 GB 内存和数十亿浮点运算的神经网络,与一个只需要数 KB 和整数比较的决策树相比,需要根本不同的部署方法。下一章(第三章)将探讨神经网络的数学基础,揭示为什么某些部署范例适合特定的算法,以及算法选择如何在整个系统堆栈中传播。


深度学习入门

DALL·E 3 提示:一个在干净白色背景上分为两半的矩形插图。左侧详细且多彩地描绘了一个生物神经网络,展示了相互连接的神经元、发光的突触和树突。右侧展示了一个时尚现代的人工神经网络,由相互连接的节点和边组成的网格表示,类似于数字电路。两边的过渡既明显又和谐,每半部分清楚地说明了其各自的主题:左侧是生物的,右侧是人工的.

图片

目的

为什么深度学习系统工程师需要对神经网络操作有深入数学理解,而不是将它们视为黑盒组件?

现代深度学习系统依赖于神经网络作为其核心计算引擎,但成功的工程需要理解控制其行为的数学。神经网络数学决定了内存需求、计算复杂度和优化景观,这些直接影响系统设计决策。如果不能掌握梯度流、激活函数和反向传播机制等概念,工程师无法预测系统行为、诊断训练失败或优化资源分配。每个数学运算都对应特定的硬件要求:矩阵乘法需要每秒数 GB 的内存带宽,而激活函数的选择决定了移动处理器的兼容性。理解这些操作将神经网络从不可见组件转变为可预测、可工程化的系统。

学习目标

  • 跟踪人工智能从基于规则的系统到神经网络的演变,并确定驱动工程挑战

  • 分析神经网络操作(矩阵乘法、激活、梯度)及其硬件影响

  • 通过选择适当的层配置、激活函数和连接模式,根据计算约束和任务需求设计神经网络架构

  • 通过多层网络实现前向传播,计算加权总和并应用激活函数将原始输入转换为层次特征表示

  • 执行反向传播算法来计算梯度并更新网络权重,展示预测误差如何通过网络层反向传播

  • 比较训练和推理操作阶段,分析它们不同的计算需求、资源需求和针对不同部署场景的优化策略

  • 评估损失函数和优化算法,解释这些选择如何影响训练动态、收敛行为和最终模型性能

  • 评估深度学习管道以识别计算瓶颈和优化机会

深度学习系统工程基础

考虑到看似简单的任务,比如在照片中识别猫。使用传统的编程方法,你需要编写显式规则:寻找三角形的耳朵,检查是否有胡须,验证是否有四条腿,检查毛皮图案,并处理无数的光照、角度、姿势和品种的变化。每个边缘情况都需要额外的规则,从而创建越来越复杂的决策树,但仍然会在遇到意外变化时失败。这种限制,即无法手动编码复杂现实世界问题的所有模式,推动了从基于规则的编程到机器学习的演变。

深度学习代表了这一演变的顶峰,通过直接从数百万只猫和非猫图像中学习来解决猫识别问题。我们不是编写规则,而是提供示例,让系统自动发现模式。这种从显式编程到学习表示的转变对我们设计和工程计算系统的方式产生了影响。

深度学习系统提出了一个工程挑战,这使得它们与传统软件区别开来。虽然传统系统执行基于显式规则的确定性算法,但深度学习系统通过数学过程学习数据表示来运行。这种转变要求工程师理解这些系统背后的数学操作,以便于它们的设计、实施和维护。

这种数学复杂性的工程影响非常重要。当生产系统表现出降低的性能特征时,传统的调试方法证明是不够的。性能异常可能源于优化过程中的梯度不稳定性 1,激活计算中的数值精度限制,或者张量操作固有的内存访问模式 2。没有基础数学素养,系统工程师无法有效地区分实现失败和算法约束,准确预测计算资源需求,或系统地优化由底层数学操作产生的性能瓶颈。

深度学习是机器学习的一个子领域,它使用具有多层神经网络来自动从数据中学习层次化表示,从而消除了显式特征工程的需求。

深度学习通过解决限制早期方法的局限性,已成为现代人工智能的主导方法。虽然基于规则的系统需要详尽的手动指定决策路径,而传统的机器学习技术需要特征工程专业知识,但神经网络架构可以直接从原始数据中发现模式表示。这种能力使得以前被认为难以处理的应用成为可能,尽管它引入了需要重新考虑系统架构设计原则的计算复杂性。如图 3.1 图所示,神经网络在机器学习和人工智能更广泛层次结构中构成了一个基础组成部分。

图片

图 3.1:AI 层次结构:神经网络通过在大数据集中建模模式,成为机器学习和人工智能领域深度学习的一个核心组成部分。机器学习算法使系统能够作为更广泛人工智能领域的一部分从数据中学习。

向神经网络架构的转变代表了一种超越算法演变的转变,需要重新概念化系统设计方法。神经网络通过大量并行矩阵运算执行计算,这些运算与专用硬件架构配合良好。这些系统通过迭代优化过程学习,这些过程产生独特的内存访问模式并施加严格的数值精度要求。推理的计算特征与训练阶段大不相同,需要为每种操作模式制定不同的优化策略。

本章建立了有效工程神经网络系统所需的数学素养。我们不是将这些架构视为不透明的抽象,而是检查决定系统行为和性能的数学运算。我们研究生物神经网络过程如何启发人工神经元模型,分析单个神经元如何组成复杂的网络拓扑,以及这些网络如何通过数学优化获取知识。每个概念都直接与实际系统工程考虑相关:理解矩阵乘法运算可以阐明内存带宽需求,理解梯度计算机制可以解释数值精度约束,而识别优化动态可以指导资源分配决策。

我们首先考察人工智能方法是如何从基于规则的编程发展到自适应学习系统的。然后,我们研究启发人工神经元模型的生物神经网络过程,建立控制神经网络操作的数学框架,并分析使这些系统能够从复杂数据集中提取模式的优化过程。在整个探索过程中,我们关注每个数学原理的系统工程意义,构建设计、实施和优化生产规模深度学习系统所需的理论基础。

在完成本章学习后,学生将不再将神经网络视为晦涩的算法结构,而是将其视为可工程化的计算系统,其数学运算为其实际实施和操作部署提供直接指导。

机器学习范式的演变

为了理解为什么深度学习成为需要专门计算基础设施的主导方法,我们考察了人工智能方法随时间的发展。当前的 AI 时代代表了从基于规则的编程通过经典机器学习到现代神经网络的最新进化阶段。理解这一进展揭示了每种方法是如何建立在前辈的基础上并解决其局限性的。

传统基于规则的编程局限性

传统编程要求开发者明确定义规则,告诉计算机如何处理输入并产生输出。考虑一个简单的游戏,如 Breakout[3],如图 3.2[2]所示。程序需要对每个交互进行明确的规则定义:当球击中砖块时,代码必须指定砖块应该被移除,球的运动方向应该反转。虽然这种方法对于具有明确物理和有限状态的游戏是有效的,但它展示了基于规则系统的局限性。

图片

图 3.2:基于规则的系统:传统编程依赖于明确定义的规则来将输入映射到输出,这限制了其在复杂或不确定环境中的适应性,因为必须预测并编码所有可能的场景。这种方法与深度学习形成对比,在深度学习中,系统从数据中学习模式,而不是依赖于预编程的逻辑。

不仅仅局限于单个应用,这种基于规则的范式扩展到了所有传统编程,如图 3.3[1]所示。程序需要同时处理规则和输入数据以产生输出。早期的人工智能研究探讨了这种方法是否可以通过编码足够的规则来捕捉智能行为,从而扩展到解决复杂问题。

图片

图 3.3:基于规则的编程:传统程序通过明确定义的规则操作数据,构成了早期人工智能系统的基础,但缺乏现代机器学习方法的适应性。这种方法与深度学习形成对比,在深度学习中,系统从示例中推断规则,而不是依赖于预编程的逻辑。

尽管它们表面上看起来很简单,但在复杂的现实世界任务中,基于规则的局限性变得明显。识别人类活动(图 3.4)说明了这一挑战:将低于 4 英里/小时的速度归类为行走似乎很简单,直到现实世界的复杂性出现。速度变化、活动之间的转换和边界情况都需要额外的规则,从而产生难以管理的决策树。计算机视觉任务加剧了这些困难:检测猫需要关于耳朵、胡须和身体形状的规则,同时还要考虑观察角度、光照、遮挡和自然变化。早期系统只在具有明确约束的受控环境中取得了成功。

图片

图 3.4:基于规则的编程:传统程序依赖于明确定义的规则来操作数据,构成了早期人工智能系统的基础,但在复杂任务中缺乏适应性。

认识到这些局限性,20 世纪 70 年代和 80 年代人工智能研究中的知识工程方法试图系统地创建规则。专家系统 4 将领域知识编码为明确规则,在具有明确参数的特定领域显示出希望,但在人类自然执行的任务,如物体识别、语音理解或自然语言解释方面却遇到了困难。这些局限性凸显了一个挑战:许多智能行为的方面依赖于难以用基于规则的显式表示的隐式知识。

经典机器学习

面对基于规则的系统的可扩展性障碍,研究人员开始探索可以从数据中学习的方法。机器学习提供了一个有希望的方向:而不是为每种情况编写规则,研究人员可以编写识别示例中模式的程序。然而,这些方法的成功仍然在很大程度上依赖于人类洞察力来定义相关模式,这个过程被称为特征工程。

这种方法引入了特征工程:将原始数据转换为学习算法可以揭示模式的表示。方向梯度直方图(HOG)方法(Dalal 和 Triggs,未注明日期)5(图 3.5)是这种方法的例证,它识别亮度急剧变化的边缘,将图像划分为单元格,并测量每个单元格内的边缘方向。这把原始像素转换成对光照变化和微小位置变化具有鲁棒性的形状描述符。

图片

图 3.5:HOG 方法:通过识别图像中的边缘来创建梯度直方图,将像素值转换为形状描述符,这些描述符对光照变化不变。

补充方法如 SIFT (Lowe 1999)6(尺度不变特征变换)和 Gabor 滤波器 7 捕捉了不同的视觉模式——SIFT 检测出在不同尺度和方向变化中保持稳定的特征点,而 Gabor 滤波器识别纹理和频率。每个都编码了关于视觉模式识别的领域专业知识。

这些工程努力在 2000 年代推动了计算机视觉的进步。系统现在能够以一定的鲁棒性识别对象,以应对现实世界的各种变化,从而在人脸检测、行人检测和物体识别等领域得到应用。尽管取得了这些成功,但这种方法也有局限性。专家需要为每个新问题仔细设计特征提取器,而结果的特征可能会错过在设计时未预料到的重要模式。

深度学习:自动模式发现

神经网络代表了我们在计算机上解决问题的方法的一次转变,确立了一种新的编程方法,它从数据中学习而不是遵循明确的规则。这种转变在考虑诸如计算机视觉等任务时尤其明显,特别是识别图像中的对象。

深度学习通过直接从原始数据中学习而有所不同。如我们之前在图 3.3 中看到的,传统的编程需要规则和数据作为输入来产生答案。机器学习颠倒了这种关系,如图 3.6 所示。我们不是编写规则,而是提供示例(数据)及其正确答案,以自动发现潜在的规则。这种转变消除了人类指定哪些模式重要的需求。

图片

图 3.6:数据驱动规则发现:深度学习模型直接从数据中学习模式和关系,消除了手动指定规则的需求,并能够从原始输入中自动提取特征。这与传统编程不同,在传统编程中,规则和数据都是生成输出的必要条件,以及与经典机器学习不同,在经典机器学习中,规则是从标记数据中推断出来的。

通过这个自动化过程,系统从示例中发现了这些模式。当展示数百万张猫的图片时,系统学会识别越来越复杂的视觉模式,从简单的边缘到更复杂的组合,这些组合构成了猫的特征。这与人眼视觉系统的运作方式相平行,从基本的视觉元素到复杂物体构建理解。

基于这种分层学习原理,深度网络学习分层表示,其中复杂模式从简单模式中产生。每一层学习越来越抽象的特征:边缘 → 形状 → 对象 → 概念。更深的网络可以用多项式级更多的参数表达指数级更多的函数,这就是为什么“深度”在理论上很重要的原因。组合性原则解释了为什么深度学习有效:复杂的现实世界模式通常具有与网络表示偏差相匹配的分层结构。

这种分层结构带来了一种优势:与传统方法中性能达到平台期不同,深度学习模型随着额外数据的增加(识别更多变化)和计算的进行(发现更细微的模式)而持续改进。这种可扩展性推动了性能的显著提升。图像识别的准确性从 2012 年的 74%提高到了今天的 95%以上 8。

神经网络的性能遵循可预测的缩放关系,这些关系直接影响系统设计。这些缩放定律解释了为什么现代人工智能系统优先考虑更大的模型而不是更长的训练时间:GPT-4 的参数比 GPT-1 多约 1000 倍,但训练时间却相似。因此,内存带宽和存储容量成为主要的限制因素,而不是原始的计算能力。这些缩放定律的详细数学公式及其定量分析在第八章中有所介绍,而第十章探讨了它们的实际应用。

除了性能提升之外,这种方法对人工智能系统的构建也有影响。深度学习直接从原始数据中学习的能力消除了手动特征工程的需求,同时也带来了新的要求。需要高级基础设施来处理大量数据集,强大的计算机来处理这些数据,以及专门的硬件来高效地执行复杂的数学计算。深度学习的计算需求推动了专用计算机芯片的发展,这些芯片针对这些计算进行了优化。

实证证据强烈支持这些说法。深度学习在计算机视觉中的成功证明了当给予足够的数据和计算时,这种方法如何超越传统方法。这种模式在许多领域重复出现,从语音识别到游戏,确立了深度学习作为人工智能变革性方法的地位。

然而,这种转变也伴随着权衡:深度学习的计算需求重塑了系统需求。了解这些需求为以下关于神经网络的技术细节提供了背景。

计算基础设施需求

从传统编程到深度学习的转变不仅代表了我们在解决问题方式上的转变,而且代表了计算系统需求的变化,这直接影响着机器学习系统设计的各个方面。当我们考虑机器学习系统的完整范围时,这种转变变得尤为重要,从大规模云部署到资源受限的 Tiny ML 设备。

传统程序遵循可预测的模式。它们执行顺序指令,以常规模式访问内存,并以理解良好的方式使用计算资源。一个典型的基于规则的图像处理系统可能会系统地扫描像素,应用固定操作,具有适度和可预测的计算和内存需求。这些特征使得传统程序在不同计算平台上的部署相对简单。

表 3.1:系统资源演变:编程范式从顺序计算转向具有特征工程的有序并行,最终转向深度学习中的大规模矩阵运算和复杂内存层次结构。此表阐明了深度学习如何从根本上改变系统需求,与传统编程和具有工程特征的机器学习相比,影响计算和内存访问模式。

系统方面 传统编程 具有特征的机器学习 深度学习
计算 顺序、可预测的路径 结构化并行操作 大规模矩阵并行
内存访问 小型、可预测的模式 中型、批量导向 大型、复杂分层模式
数据移动 简单的输入/输出流 结构化批量处理 交叉系统间的密集移动
硬件需求 以 CPU 为中心 带有向量单元的 CPU 专用加速器
资源扩展 固定需求 与数据大小成线性关系 与复杂性成指数关系

随着我们向数据驱动方法迈进,具有工程特征的经典机器学习引入了新的复杂性。特征提取算法需要更密集的计算和结构化数据移动。例如,前面讨论过的 HOG 特征提取器需要多次遍历图像数据,计算梯度并构建直方图。虽然这增加了计算需求和内存复杂性,但资源需求仍然可预测且可扩展。

然而,深度学习在多个维度上重塑了系统需求,如表 3.1 所示。理解这些演变变化很重要,因为差异以多种方式显现,影响整个机器学习系统范围。

并行矩阵运算模式

当比较这些方法时,计算范式转变立即变得明显。传统的程序遵循顺序逻辑流程。相比之下,深度学习需要在矩阵上进行大规模并行操作。这种转变解释了为什么专为顺序处理设计的传统 CPU 在神经网络计算中效率低下。

这种并行计算模型创造了新的瓶颈。基本挑战是内存墙:虽然可以通过添加更多处理单元来增加计算能力,但为这些单元提供内存带宽的增长并不那么有利 9。现代加速器通过具有多个缓存级别和专门内存架构的分层内存系统来解决这个问题,这些架构能够实现数据重用。关键洞察是保持数据靠近其处理位置——在更快、更小的缓存中,而不是在较慢、较大的主内存中——可以显著提高性能。

这些内存层次结构的挑战解释了为什么神经网络加速器专注于最大化数据重用。成功的架构不是反复从慢速的主内存中获取相同的权重,而是将频繁访问的数据保存在快速的本地存储中,并仔细安排操作以最小化数据移动。这些内存系统及其性能特性的详细定量分析在第十一章中有所介绍。

并行处理的需求推动了专用硬件架构的采用,从强大的云 GPU 到专用移动处理器再到 Tiny ML 加速器。第十一章 sec-ai-acceleration 中探讨了特定硬件架构及其在机器学习工作负载中的权衡。

分层内存架构

内存需求带来了另一个转变。传统的程序通常保持较小的、固定的内存占用。相比之下,深度学习模型必须管理复杂内存层次结构中的参数。内存带宽往往成为主要的性能瓶颈,给资源受限的系统带来挑战。

这种内存密集型特性为神经网络计算创造了独特的性能瓶颈。矩阵乘法——神经网络的核心操作——通常是内存带宽限制的,而不是计算限制的 10。基本问题是处理器可以比从内存中获取数据更快地执行计算。每个权重都必须从内存中加载以执行乘法,如果内存系统不能快速提供数据,计算单元就会空闲等待值到来。这种计算能力和内存带宽之间的不平衡解释了为什么仅仅增加更多的处理单元并不能成比例地提高性能。

GPU 通过更高的内存带宽和巨大的并行性来应对这一挑战,实现了比传统 CPU 更好的利用率。然而,根本的约束仍然存在:神经网络中的能耗主要由数据移动而非计算主导。将数据从主内存移动到处理单元比实际的数学运算消耗更多的能量。这种能量层次结构解释了为什么专用处理器专注于减少数据移动的技术,使数据更接近处理的地方。

这种基本的内存-计算权衡在不同部署场景中表现出不同的特点。云服务器可以承担更多的内存和电力以最大化吞吐量,而移动设备必须仔细优化以在严格的电力预算内运行。训练系统即使在更高的能源成本下也优先考虑计算吞吐量,而推理系统则强调能源效率。这些不同的限制驱使着机器学习系统范围内的不同优化策略,从内存丰富的云部署到高度优化的 Tiny ML 实现。

第十章(第十章)详细介绍了内存优化策略,如量化剪枝,而第十一章(第十一章)探讨了硬件架构及其内存系统。

分布式计算需求

研究人员发现,深度学习改变了系统的扩展方式以及效率的重要性。传统的程序具有相对固定的资源需求,具有可预测的性能特征。随着复杂性的增加,深度学习模型可以消耗指数级更多的资源。这种模型能力与资源消耗之间的关系使得系统效率成为一个关注点。第九章涵盖了优化这种关系的技巧,包括在保持模型性能的同时减少计算需求的方法。

将算法概念与硬件现实联系起来变得至关重要。虽然传统的程序可以相对直接地映射到标准计算机架构,但深度学习需要仔细考虑:

  • 如何有效地将矩阵运算映射到物理硬件上(第十一章涵盖了针对特定硬件的优化策略)

  • 最小化跨内存层次结构数据移动的方法

  • 平衡计算能力与资源限制的方法(第九章探讨了扩展定律和效率权衡)

  • 优化算法和系统级效率的技术(第十章提供了模型压缩技术)

这些转变解释了为什么深度学习激发了整个计算堆栈的创新。从专用硬件加速器到新的内存架构,再到复杂的软件框架,深度学习的需求持续重塑计算机系统设计。

在确立了从基于规则的系统到神经网络的历史演变以及这一演变所要求的计算基础设施之后,我们现在考察这些系统的根本灵感。神经网络计算答案的起点不是硅和软件,而是生物学——具体来说,是我们大脑中的神经网络,这些神经网络启发了现代人工智能系统所依赖的人工神经网络。

从生物学到硅

在考察了编程方法如何从规则发展到数据驱动学习,以及这种演变如何推动我们今天看到的计算基础设施需求之后,我们现在转向一个问题:这些神经网络实际上在计算什么?答案不是从硅开始,而是从生物学开始。

我们刚刚考察的巨大计算需求(专用处理器、分层内存系统、高带宽数据移动)都源于一个简单的灵感:生物神经元。了解自然界如何用 20 瓦的功率解决信息处理问题,揭示了人工神经网络系统的潜力和挑战。当我们考察生物神经元及其人工对应物时,注意寻找一个模式:我们选择实现或近似的每个生物特征都会产生特定的计算需求,将树突和突触模型直接与刚刚讨论的处理能力和内存带宽需求联系起来。

本节通过考察三个关键转换来连接生物灵感和系统实现:生物神经元如何启发人工神经元设计,神经网络原理如何转化为数学运算,以及这些运算如何推动我们之前概述的系统需求。到最后,你将理解为什么即使实现简化的神经网络计算也需要现代机器学习系统所要求的专用硬件基础设施。

生物神经网络处理原理

从系统角度来看,生物神经网络为我们刚刚讨论的计算挑战提供了解决方案:它们实现了大规模并行处理、高效的内存使用和自适应学习,同时消耗最少的能量。四个来自生物智能的关键原则直接影响了人工神经网络的设计:

自适应学习:大脑根据经验持续修改神经网络连接,通过与环境的互动来细化响应。这种生物能力启发了机器学习的核心原则:从数据中改进,而不是遵循固定的、预先编程的规则。

并行处理:大脑同时处理大量信息,不同区域专注于特定功能,同时协同工作。这种分布式、并行架构与传统顺序计算形成对比,并影响了现代人工智能系统设计。

模式识别:生物系统在识别复杂、嘈杂数据中的模式方面表现出色——在人群中识别面孔,在嘈杂环境中理解语音,从部分信息中识别物体。这种能力启发了计算机视觉和语音识别的应用,尽管人工系统仍在努力匹配大脑的效率。

能源效率:生物系统以非凡的能源效率进行处理。人脑的 20 瓦功率消耗 11 形成了一个显著的效率差距,人工系统仍在努力弥合这一差距。理解和复制这种效率在第十八章中通过环境影响分析和能源效率优化策略进行了探讨。

这些生物学原理为人工神经网络提出了关键要求:简单处理单元整合多个输入,可调节的连接强度,基于输入阈值的非线性激活,并行处理架构,以及通过连接强度修改进行学习。以下章节将探讨我们如何将这些生物学洞察转化为数学运算和硅基实现。

这些生物学原理塑造了人工智能中的两种方法。第一种试图直接模仿神经网络的结构和功能,创建了结构上类似于生物网络的的人工神经网络。第二种采取更抽象的方法,将生物学原理适应于在计算机硬件约束下高效工作,而不必精确复制生物结构。

要理解这两种方法在实际中的工作原理,我们首先必须考察使神经网络计算成为可能的基本单元:单个神经元。通过理解生物神经元如何处理信息,我们就可以看到这一过程如何转化为驱动人工神经网络的数学运算。

生物神经元结构

将这些高级原理转化为实际实现需要考察生物学信息处理的基本单元:神经元。这个细胞构建块为其人工对应物提供了蓝图,并揭示了复杂神经网络如何从简单的协同工作组件中产生。

在生物系统中,神经元(或细胞)代表神经系统的基本功能单元。理解其结构对于将人工系统与之类比至关重要。图 3.7 展示了生物神经元的结构。

图片

图 3.7:生物神经元映射:人工神经元从其生物对应物中抽象出关键功能,在树突接收加权输入,在细胞体中求和,并通过轴突产生输出,类似于人工神经网络中的激活函数。这种抽象使得能够构建复杂的人工神经网络,能够进行复杂的信息处理。来源:geeksforgeeks。

生物神经元由几个关键组件组成。中心部分是细胞体,或称为细胞核,其中包含细胞核并执行细胞的基本生命过程。从细胞体延伸出分支状结构,称为树突,它们作为接收器接收来自其他神经元的信号。神经元之间的连接发生在突触 12,它们调节传输信号的强度。最后,一个细长的突起称为轴突,将电脉冲从细胞体传导到其他神经元。

将这些结构组件整合,神经元的功能如下:树突作为接收器,从其他神经元收集输入信号。这些连接处的突触调节每个信号的强度,决定每个输入的影响程度。细胞体将这些加权信号综合起来,并决定是否触发输出信号。如果触发,轴突将此信号传输到其他神经元。

生物神经元的每个元素在人工系统中都有一个计算上的类似物,反映了自然界中发现的原理,如学习、适应性和效率。为了更好地理解生物智能如何影响人工系统,表 3.2 捕捉了生物神经元和人工神经元组件之间的映射。这应该与图 3.7 一起查看,以获得完整的图景。它们共同展示了从生物到人工神经元的映射。

表 3.2:神经元对应关系:生物神经元通过类似组件启发人工神经元的设计——树突对应输入(接收信号),突触对应权重(调节连接强度),细胞体对应净输入,轴突对应输出——为智能计算建模奠定基础。此表阐明了生物神经元的哪些关键功能被抽象并在人工神经网络中实现,从而实现学习和信息处理。

生物神经元 人工神经元
细胞 神经元/节点
树突 输入
突触 权重
细胞体 净输入
轴突 输出

理解这些对应关系对于掌握人工系统如何近似生物智能至关重要。每个组件通过不同的机制执行类似的功能,对人工神经网络具有特定的含义。

  1. 细胞 \longleftrightarrow 神经元/节点:人工神经元或节点作为基本的计算单元,反映了生物系统中细胞的作用。

  2. 树突 \longleftrightarrow 输入:生物神经元的树突接收来自其他神经元的信号,这与输入如何进入人工神经元的方式类似。它们充当信号接收器,就像收集信息的天线一样。

  3. 突触 \longleftrightarrow 权重:突触调节神经元之间连接的强度,这与人工神经元中的权重直接相似。这些权重是可以调整的,通过控制每个输入的影响程度,使得学习与优化可以在时间上得到实现。

  4. 胞体 \longleftrightarrow 净输入:人工神经元中的净输入将加权输入相加以确定激活,这与生物神经元中胞体整合信号的方式相似。

  5. 轴突 \longleftrightarrow 输出:人工神经元的输出将处理过的信息传递给后续的网络层,这与轴突将信号传递给其他神经元的方式非常相似。

这种映射展示了人工神经网络如何简化并抽象生物过程,同时保留其基本的计算原理。理解单个神经元只是开始。神经网络的真实力量来自于这些基本单元如何在更大的系统中协同工作。

从系统工程的角度来看,这种从生物到人工的翻译揭示了为什么神经网络具有如此高的计算要求。每个简单的生物过程都映射到密集的数学运算,这些运算必须并行执行数百万或数十亿次。

人工神经网络设计原则

从生物灵感到实际实施的桥梁,将生物原理转换为人工计算需要深刻理解生物神经网络在细胞和网络层面上的有效性,以及为什么在硅中复制这些能力会带来如此重大的系统挑战。大脑通过在数十亿个神经元之间进行分布式计算来处理信息,每个神经元的运行速度相对于硅晶体管来说相对较慢。尽管存在速度限制,但大脑的并行架构能够实现对复杂感官输入、决策和行为控制的复杂实时处理。

尽管在速度上存在明显劣势,但这种计算效率源于大脑的基本组织原则。每个神经元作为一个简单的处理单元,整合来自数千个其他神经元的输入,并根据这个综合输入是否超过阈值产生一个二进制输出信号。神经元之间的连接强度,通过突触介导,会通过经验不断修改。这种突触可塑性构成了生物神经网络学习和适应的基础。

在人工系统中复制生物效率需要克服基本权衡。虽然大脑仅用 20 瓦(如前所述)就能实现非凡的效率,但与之相当的的人工神经网络则需要数量级更多的电力。例如,大型语言模型在训练期间可能消耗兆瓦电力,在推理期间消耗千瓦电力——比大脑的电力多出数千到数百万倍。这种显著的效率差距推动了工程领域对专用硬件、量化技术和架构创新的关注。

从这些组织洞察中汲取灵感,生物系统提出了人工神经网络中所需的一些关键计算元素:

  • 集成多个输入的简单处理单元

  • 单元之间可调节的连接强度

  • 基于输入阈值的非线性激活

  • 并行处理架构

  • 通过修改连接强度进行学习

现在的问题变成了:我们如何将这些抽象的生物原理转化为计算机可以执行的具体数学操作?

神经概念数学翻译

将生物洞察力转化为实际系统,我们面临着在数字系统的刚性框架内捕捉神经计算本质的挑战。正如我们在神经元模型分析中确立的(参见表 3.2),人工神经元将生物过程简化为三个关键操作:加权输入处理(突触强度)、求和(信号整合)和激活函数(基于阈值的触发)。

表 3.3 提供了一个系统性的视角,展示了这些生物特征如何映射到它们的计算对应物,揭示了数字神经实现的可能性与局限性。

表 3.3:生物-计算类比:人工神经元抽象了生物神经网络系统的关键原则,将神经元触发映射到激活函数,突触强度映射到加权连接,将信号整合映射到求和操作——为数字神经实现奠定了基础。生物系统中的分布式记忆和并行处理在权重矩阵和并发计算中找到计算对应物,突显了这种抽象的强大和局限性。

生物特征 计算翻译
神经元激发 激活函数
突触强度 加权连接
信号整合 求和操作
分布式内存 权重矩阵
并行处理 并发计算

使用前面概述的生物到人工映射原理,这种数学抽象保留了关键的计算原理,同时实现了高效的数字实现。权重、求和和激活操作直接对应于我们在神经元对应分析中确定的突触强度、信号整合和阈值激发机制。

这种抽象具有计算成本。在生物学中轻松完成的事情,在人工系统中需要密集的数学计算。正如在记忆系统部分所讨论的,这些操作由于内存带宽限制而产生了显著的计算需求。

人工神经网络中的记忆与生物系统有着显著不同的形式。虽然生物记忆分布在突触连接和神经网络模式中,但人工网络将信息存储在离散的权重和参数中。这种架构差异反映了当前计算硬件的限制,其中内存和处理在物理上是分离的,而不是像生物系统那样集成。尽管这些实现方式不同,但人工神经网络在模式识别和学习方面实现了类似的功能能力。

大脑的巨大并行性在人工实现中是一个挑战。虽然生物神经网络通过数亿个同时工作的神经元处理信息,但人工系统通过如 GPU 和张量处理单元等专用硬件来近似这种并行性。这些设备有效地计算构成人工神经网络数学基础矩阵运算,以不同于生物系统的规模和粒度实现并行处理。

硬件和软件需求

神经原理的计算翻译产生了来自生物和人工实现之间关键差异的基础设施需求,这直接塑造了系统设计。

表 3.4 展示了每个计算元素如何驱动特定的系统需求。这种映射显示了在计算翻译中做出的选择如何直接影响实施所需的硬件和系统架构。

表 3.4:计算需求:人工神经网络的设计直接转化为特定的系统需求;例如,高效的激活函数需要快速的非线性操作单元,而大规模的权重存储需求需要高带宽的内存访问。理解这种映射有助于指导硬件和系统架构的选择,以有效地实施人工智能。

计算元素 系统要求
激活函数 快速非线性操作单元
权重操作 高带宽内存访问
并行计算 专用并行处理器
权重存储 大规模内存系统
学习算法 梯度计算硬件

存储架构代表了一个关键需求,由生物系统和人工系统处理内存的关键差异所驱动。在生物系统中,记忆和处理是内在集成的——突触既存储连接强度又处理信号。然而,人工系统必须在处理单元和内存之间保持清晰的分离。这需要既有高容量存储来存储数百万或数十亿个连接权重,又有高带宽路径来快速在存储和处理单元之间移动这些数据。这种数据移动的效率通常成为生物系统不面临的临界瓶颈。

学习过程本身对人工系统提出了独特的要求。虽然生物网络通过局部化学过程修改突触强度,但人工网络必须在整个网络中协调权重更新。这会在训练期间产生计算和内存需求,因为系统不仅必须存储当前权重,还必须为梯度和中途计算保留空间。反向传播错误信号的需求,没有真正的生物类似物,使得系统架构复杂化。确保这些大型模型和保护敏感训练数据引入了复杂的要求,这些要求在第十六章中得到了解决。

能效成为最后一个关键需求,突显了生物和人工实现之间可能的最鲜明对比。人脑惊人的能效,大约 20 瓦特,与人工神经网络的大量电力需求形成鲜明对比。当前系统通常需要数量级更多的能量来实现类似的功能。这一差距推动了更高效硬件架构的研究,并对神经网络的实际部署产生了深远影响,尤其是在资源受限的环境,如移动设备或边缘计算系统中。这一能源消耗的环境影响和可持续 AI 发展的策略在第十八章中进行了探讨。

这些系统需求直接推动了我们在构建机器学习系统时所做的架构选择,从第十一章(ch017.xhtml#sec-ai-acceleration)中涵盖的专用硬件加速器到第八章(ch014.xhtml#sec-ai-training)中讨论的分布式训练系统。理解这些需求存在的原因,即根植于生物计算和人工计算之间的关键差异,对于做出关于系统设计和优化的明智决策至关重要。

神经网络计算的发展

我们可以通过硬件和算法的进步来欣赏深度学习领域是如何演变以应对这些挑战的。这一旅程始于 20 世纪 50 年代的早期人工神经网络,以感知器(Rosenblatt 1958)13 的引入为标志。虽然这些早期系统在概念上具有突破性,但它们受到了其时代计算能力的严重限制,主要是缺乏处理能力和内存容量的大型计算机,这些能力对于复杂网络来说是必需的。

20 世纪 80 年代反向传播算法的发展(Rumelhart, Hinton, and Williams 1986)是一个理论上的突破 14,并为训练多层网络提供了一种系统性的方法。该算法的计算需求远远超过了可用的硬件能力。即使是训练一个适度的网络也可能需要数周时间,这使得实验和实际应用变得具有挑战性。算法需求与硬件能力之间的这种不匹配导致了对神经网络兴趣的下降期。

图片

图 3.8:计算增长:计算能力的指数级增长——最初从 1952 年到 2010 年以 1.4 倍的速度增长,然后从 2012 年到 2022 年加速到每 3.4 个月翻一番——使得深度学习模型的扩展成为可能。这种趋势,加上 2015 年后大型模型 10 个月翻一番的周期,直接解决了训练复杂神经网络的历史瓶颈,并推动了该领域的近期进展。来源:(Sardanelli et al. 2023)。

虽然我们在前面的章节中已经建立了深度学习的技术基础,但这个术语本身在 2010 年代获得了显著的关注,这与计算能力的显著进步和数据可访问性的提高相吻合。该领域呈指数级增长,如图图 3.8 所示。该图表揭示了两个显著的趋势:以每秒浮点运算次数(FLOPS)衡量的计算能力最初从 1952 年到 2010 年遵循了1.4×1.4\times的改进模式,然后从 2012 年到 2022 年加速到 3.4 个月的翻倍周期。也许更引人注目的是,2015 年到 2022 年间大规模模型的出现(在图中未明确显示或容易看到),其增长速度比一般趋势快 2 到 3 个数量级,遵循了激进的 10 个月翻倍周期。

进化趋势是由三个维度的并行进步驱动的:数据可用性、算法创新和计算基础设施。这三个因素在良性循环中相互加强,至今仍在推动该领域的进步。如图图 3.9 所示,更强大的计算基础设施使得处理更大的数据集成为可能。更大的数据集推动了算法创新。更好的算法需要更复杂的计算系统。

图片

图 3.9

数据革命改变了神经网络所能实现的可能性。互联网和数字设备的兴起为训练数据提供了前所未有的访问。图像分享平台提供了数百万个标记图像。数字文本集合实现了大规模的语言处理。传感器网络和物联网设备产生了连续的实时数据流。这种数据丰富性为神经网络有效地学习复杂模式提供了所需的原始材料。

算法创新使得有效地使用这些数据成为可能。新的网络初始化方法和控制学习率的方法使训练更加稳定。防止过拟合 15 的技术使模型能够更好地泛化到新的数据。研究人员发现,神经网络性能与模型大小、计算和数据量呈可预测的比例关系,导致越来越雄心勃勃的架构。

计算基础设施的发展以满足这些不断增长的需求。在硬件方面,图形处理单元(GPU)提供了高效神经网络计算所需的并行处理能力。像 TPU16(Norman P. Jouppi 等人,2017d)这样的专用 AI 加速器进一步提升了性能。高带宽内存系统和快速互连解决了数据移动挑战。同样重要的是软件的进步——使构建和训练网络更容易的框架和库 17,能够实现大规模训练的分布式计算系统,以及优化模型部署的工具。

数据可用性、算法创新和计算基础设施的融合为现代深度学习奠定了基础。构建有效的机器学习系统需要理解驱动基础设施需求的计算操作。简单的数学运算,当扩展到数百万个参数和数十亿个训练示例时,创造了塑造这一演变的巨大计算需求。

神经网络基础

在追踪了神经网络从生物启发到历史里程碑再到现代系统的演变之后,我们现在将重点从“为什么深度学习成功”转移到“神经网络实际上是如何计算的”。本节发展了机器学习系统工程所必需的数学和架构基础。

我们采取自下而上的方法,从简单到复杂:执行加权求和的单个神经元 → 组织并行计算的层 → 将原始输入转换为预测的完整网络。每个概念都引入了数学原理及其系统影响。在阅读时,请注意每个看似简单的操作——这里的点积,那里的激活函数——如何累积成我们之前讨论的计算需求:数百万个参数需要数吉字节内存,数十亿个操作需要专用硬件,大量数据集需要分布式训练。

神经架构的最新发展和建立在这些基础之上的新兴范例在第二十章中进行了探讨。目前,我们建立所有神经网络共有的基础概念,从简单的分类器到大型语言模型。

网络架构基础

神经网络的架构决定了信息如何从输入流向输出,通过系统流动。虽然现代网络可以非常复杂,但它们都建立在几个关键的组织原则之上,这些原则直接影响系统设计。理解这些原则对于实现神经网络和欣赏为什么它们需要我们讨论的计算基础设施至关重要。

为了将这些概念具体化,我们将在本节中使用手写数字识别作为例子——具体来说,是来自 MNIST 数据集(Lecun 等人,1998)的图像分类任务。这个看似简单的任务揭示了神经网络的所有基本原理,同时为更复杂的应用提供了直观感受。

任务:给定一个 28×28 像素的手写数字灰度图像,将其分类为十个数字之一(0-9)。

输入表示:每个图像包含 784 个像素(28×28),值从 0(白色)到 255(黑色)。我们通过除以 255 将这些值归一化到[0,1]的范围内。当输入到神经网络时,这 784 个值形成我们的输入向量 𝐱784\mathbf{x} \in \mathbb{R}^{784}

输出表示:网络产生 10 个值,每个可能的数字一个。这些值代表网络对输入图像包含每个数字的置信度。置信度最高的数字成为预测结果。

为什么选择这个例子:MNIST 数据集足够小,可以完全理解(784 个输入,一个简单网络大约有 10 万个参数),但又足够大,具有现实性。这个任务直观易懂——每个人都知道“识别一个手写的 7”是什么意思——使其成为学习可以扩展到更大问题的神经网络原理的理想选择。

网络架构预览:一个典型的 MNIST 分类器可能使用:784 个输入神经元(每个像素一个)→ 128 个隐藏神经元 → 64 个隐藏神经元 → 10 个输出神经元(每个数字类别一个)。随着我们开发概念,我们将参考这个特定的架构。

驱动实际系统设计,每个架构选择——从神经元如何连接到层如何组织——都创造了必须高效映射到硬件的特定计算模式。这种网络架构与计算需求之间的映射对于构建可扩展的机器学习系统至关重要。

非线性激活函数

所有神经网络架构的核心都是一个基本构建块:人工神经元或感知器,它实现了之前建立的生物到人工的翻译原则。从系统角度来看,理解感知器的数学操作至关重要,因为这些简单的操作在网络上重复数百万次时,就形成了我们之前讨论的计算瓶颈。

考虑我们的 MNIST 数字识别任务。28×28 图像中的每个像素都成为我们网络的输入。第一隐藏层中的一个神经元可能学会检测特定的模式——比如在数字“1”或“7”中出现的垂直边缘。这个神经元必须以某种方式将所有 784 个像素值组合成一个输出,以指示其模式是否存在。

感知机通过加权求和来完成这项任务。它接受多个输入 x1,x2,...,xnx_1, x_2, ..., x_n(在我们的例子中,n=784n=784个像素值),每个输入代表分析对象的一个特征。对于数字识别,这些特征仅仅是原始像素强度,而对于其他任务,它们可能是预测房价的房屋特征或预测歌曲流行度的歌曲属性。

这个乘法过程揭示了看似简单的操作背后的计算复杂性。从计算的角度来看,每个输入都需要在内存中存储并在处理过程中检索。当在深度网络中的数百万个神经元上乘法时,这些内存访问模式成为主要的性能瓶颈。这就是为什么我们之前讨论的内存层次结构和带宽考虑对神经网络性能如此关键的原因。

理解这个加权求和过程后,感知机可以被配置为执行回归或分类任务。对于回归,实际数值输出 ŷ\hat{y} 被使用。对于分类,输出取决于 ŷ\hat{y} 是否超过某个阈值。如果 ŷ\hat{y} 超过这个阈值,感知机可能会输出一个类别(例如,“是”),如果没有,则输出另一个类别(例如,“否”)。

图 3.10:加权输入求和:感知机计算多个输入的加权总和,这些输入代表特征值,并将结果传递给激活函数以产生输出。每个输入 xix_i 在聚合之前被乘以相应的权重 wijw_{ij},这构成了从数据中学习复杂模式的基础。使用此图。

通过可视化这些数学概念,图 3.10 展示了感知器的基本构建块,它是更复杂神经网络的基础。超越单个单元的扩展,感知器层协同工作,每一层的输出作为下一层的输入。这种层次结构创建了能够处理越来越复杂任务的深度学习模型,从图像识别到自然语言处理。

拆解计算机制,每个输入 xix_i 都有一个相应的权重 wijw_{ij},感知器只是将每个输入与其匹配的权重相乘。中间输出 zz 是作为输入的加权总和来计算的:z=(xiwij) z = \sum (x_i \cdot w_{ij})

这种数学表达式的表面简单性掩盖了其计算复杂性。当扩展到数百万个神经元和数十亿个参数时,这些内存访问模式成为神经网络计算中的主要性能瓶颈。

为了增强模型的灵活性,在这个中间计算中,添加了一个偏置项 bb,允许模型通过上下移动线性输出函数来更好地拟合数据。因此,感知器计算出的中间线性组合包括偏置项变为:z=(xiwij)+b z = \sum (x_i \cdot w_{ij}) + b

这个数学公式直接决定了我们之前讨论的硬件需求。求和操作需要累加器单元,乘法操作需要高吞吐量的算术单元,而内存访问则需要高带宽的内存系统。理解数学运算与硬件需求之间的这种联系对于设计高效的机器学习系统至关重要。

除了线性变换之外,激活函数是非线性变换的关键,它通过将线性加权求和转换为非线性输出,使神经网络能够学习复杂模式。没有激活函数,多层线性层会塌缩成一个单一的线性变换,严重限制了网络的表达能力。图 3.11 展示了最常用的四种激活函数及其特征形状。

图 3.11:常见激活函数:神经网络依赖于非线性激活函数来近似复杂关系。每个函数都表现出独特的特征:sigmoid 将输入映射到(0,1)(0,1),具有平滑的梯度,tanh 提供以零为中心的输出(1,1)(-1,1),ReLU 通过对于负输入输出零来引入稀疏性,softmax 将 logits 转换为概率分布。这些不同的行为使得网络能够学习不同类型的模式和关系。

激活函数的选择对学习效果和计算效率有深远的影响。理解每个函数的数学特性对于设计有效的神经网络至关重要。最常用的激活函数包括:

Sigmoid

Sigmoid 函数将任何输入值映射到 0 和 1 之间的有界范围:σ(x)=11+ex \sigma(x) = \frac{1}{1 + e^{-x}}

这种 S 形曲线(如图 3.11(ch009.xhtml#fig-activation-functions)左上角所示)产生的输出可以解释为概率,这使得 sigmoid 特别适用于二元分类任务。对于非常大的正输入,函数趋近于 1;对于非常大的负输入,它趋近于 0。sigmoid 平滑、连续的特性使其在所有地方都是可微的,这对于基于梯度的学习是必要的。

然而,sigmoid 函数有一个显著的局限性:对于绝对值较大的输入(远离零),梯度变得极其小——这种现象称为梯度消失问题18。在反向传播过程中,这些小的梯度在层之间相乘,导致早期层的梯度呈指数级减小。这实际上阻止了深度网络的学习,因为权重更新变得微不足道。

Sigmoid 的输出不是零中心(所有输出都是正数)。这种不对称性可能导致优化过程中的权重更新效率低下,因为连接到 sigmoid 单元的权重的梯度都将具有相同的符号。

双曲正切函数

双曲正切函数通过将输入映射到范围 (1)(-1, 1) 来解决 sigmoid 的零中心限制: tanh(x)=exexex+ex \tanh(x) = \frac{e^x - e{-x}}{ex + e^{-x}}

如 图 3.11(右上角)所示,tanh 产生一个类似于 sigmoid 的 S 形曲线,但中心在零点。负输入映射到负输出,而正输入映射到正输出。这种对称性有助于在训练期间平衡梯度流动,通常比 sigmoid 导致更快的收敛。

与 sigmoid 类似,tanh 在任何地方都是平滑且可微的。它对于具有大数值的输入仍然受到梯度消失问题的困扰。当函数饱和(接近 -1 或 1)时,梯度变得非常小。尽管存在这种局限性,但 tanh 的零中心输出使其在许多架构中比 sigmoid 更适合隐藏层,特别是在循环神经网络中,保持时间步之间的激活平衡非常重要。

ReLU

矩形线性单元(ReLU)通过提供一个简单的解决方案来解决梯度消失问题(Nair 和 Hinton 2010)19:ReLU(x)=max(0,x)={xif x>00if x0 \text{ReLU}(x) = \max(0, x) = \begin{cases} x & \text{if } x > 0 \ 0 & \text{if } x \leq 0 \end{cases}

图 3.11(左下角)显示了 ReLU 的特征形状:对于正输入是直线,对于负输入是零。这种简单性提供了几个优点:

梯度流:对于正输入,ReLU 的梯度正好是 1,允许梯度在网络中不变地流动。这防止了 sigmoid 和 tanh 在深层架构中遇到的梯度消失问题。

稀疏性:通过将所有负激活设置为零,ReLU 在网络上引入了自然稀疏性。通常,ReLU 网络中的大约 50%的神经元对于任何给定的输入都会输出零。这种稀疏性有助于减少过拟合,并使网络更具可解释性。

计算效率:与需要昂贵的指数计算的 sigmoid 和 tanh 函数不同,ReLU 通过简单的比较和条件操作进行计算:output = (input > 0) ? input : 0。这种简单性转化为更快的计算和更低的能耗,这对于在资源受限的设备上部署尤为重要。

ReLU 并非没有缺点。死亡 ReLU 问题发生在神经元“卡住”并输出零的情况下。如果一个神经元的权重更新使得其加权输入始终为负,该神经元将输出零,并在反向传播期间贡献零梯度。这个神经元实际上变得非功能性,并且永远无法恢复。仔细初始化和学习率选择有助于减轻这个问题。

Softmax

与之前独立作用于每个值的激活函数不同,softmax 同时考虑所有值以产生一个概率分布:softmax(zi)=ezij=1Kezj \text{softmax}(z_i) = \frac{e{z_i}}{\sum_{j=1}K e^{z_j}}

对于一个包含KK个值(通常称为 logits)的向量,softmax 将其转换为KK个概率,这些概率之和为 1。图 3.11(右下角)显示了 softmax 输出的一个组成部分;在实践中,softmax 处理整个向量,其中每个元素的输出都取决于所有输入值。

Softmax 几乎仅用于多类分类问题的输出层。通过将任意实值 logits 转换为概率,softmax 使网络能够在多个类别中表达信心。概率最高的类别成为预测类别。指数函数确保较大的 logits 获得不成比例的高概率,当网络有信心时,这会在类别之间创建清晰的区分。

输入 logits 与输出概率之间的数学关系是可微分的,这使得在训练期间梯度可以通过 softmax 反向传播。当与交叉熵损失(在第八章中讨论)结合使用时,softmax 产生特别干净的梯度表达式,有效地指导学习。

系统视角:激活函数与硬件

为什么 ReLU 在实践中的统治地位:除了避免梯度消失等数学优势之外,ReLU 的硬件效率解释了其广泛的应用。计算max(0,x)\max(0,x)只需要一个比较操作,而 sigmoid 和 tanh 需要计算指数——这些操作在时间和能量上都要昂贵得多。这种计算简单性意味着 ReLU 可以在任何处理器上更快地执行,并且消耗的电量显著减少,这对于电池供电设备来说是一个关键考虑因素。激活函数的计算和硬件影响,包括性能基准和现代加速器的实现策略,将在第八章 Chapter 8 中探讨。

图 3.12:非线性激活:神经网络通过将输入的加权和应用非线性激活函数来模拟复杂关系,从而能够表示非线性决策边界。这些函数通过点的排列转换输入值,从而具有学习复杂模式的能力,这些模式超出了线性组合的范围。来源:Medium,sachin kaushik。

如上所述的激活函数部分详细说明,这些非线性变换将线性输入和转换成非线性输出:ŷ=σ(z) \hat{y} = \sigma(z)

因此,感知器的最终输出,包括激活函数,可以表示为:

图 3.12 展示了数据表现出非线性模式,而线性方法无法充分模拟的例子,这说明了为什么前面讨论的非线性激活函数对于复杂模式识别是至关重要的。

泛化逼近定理 20 确立了具有激活函数的神经网络可以逼近任意函数。这一理论基础,结合上述讨论的 ReLU 和 sigmoid 等特定激活函数的计算和优化特性,解释了神经网络在复杂任务中的实际有效性。

将线性组合与激活函数相结合,完整的感知器计算如下:ŷ=σ((xiwij)+b) \hat{y} = \sigma\left(\sum (x_i \cdot w_{ij}) + b\right)

层和连接

虽然单个感知器可以模拟简单的决策,但神经网络的力量来自于将多个神经元组合成层。层是一组并行处理信息的神经元。层中的每个神经元独立地对相同的输入进行操作,但具有自己的一套权重和偏置,这使得层能够从相同的数据中学习不同的特征或模式。

在典型的神经网络中,我们以层次化的方式组织这些层:

  1. 输入层:接收原始数据特征

  2. 隐藏层:通过多个阶段处理和转换数据

  3. 输出层:生成最终的预测或决策

图 3.13 展示了这种分层架构。当数据通过这些层流动时,每一层都会转换数据的表示,逐渐构建更复杂和抽象的特征。这种层次化处理赋予了深度神经网络学习复杂模式非凡的能力。

图 3.13:分层网络架构:深度神经网络通过连续的层转换数据,使提取越来越复杂的特征和模式成为可能。每一层都对前一层的输出应用非线性转换,最终将原始输入映射到期望的输出。来源:brunellon。

数据在网络层中的流动

当数据通过网络流动时,在每一层都会进行转换以提取有意义的模式。我们为单个神经元建立的加权求和和激活过程扩展到整个网络:每一层都对其所有神经元并行应用这些操作,一个层的输出成为下一层的输入。这创建了一个层次化的管道,其中早期层检测到的简单特征在深层层中组合成越来越复杂的模式——使神经网络能够从原始数据中学习复杂的表示。

参数和连接

神经网络的可学习参数主要由权重和偏置组成,它们共同决定了信息在网络中的流动方式以及如何对输入数据进行变换。本节探讨了这些参数在神经网络中的组织和结构。我们探讨了连接层的权重矩阵,定义网络拓扑的连接模式,提供变换灵活性的偏置项,以及实现高效计算的参数组织策略。

权重矩阵

权重决定了输入如何强烈地影响神经元输出。在较大的网络中,这些权重会组织成矩阵,以便在层之间进行高效的计算。例如,在一个具有nn个输入特征和mm个神经元的层中,权重形成一个矩阵𝐖n×m\mathbf{W} \in \mathbb{R}^{n \times m}。这个矩阵中的每一列代表层中单个神经元的权重。这种组织方式使得网络能够同时处理多个输入,这对于有效地处理现实世界数据是一个基本特征。

回想一下,对于一个单个神经元,我们计算了z=i=1n(xiwij)+bz = \sum_{i=1}^n (x_i \cdot w_{ij}) + b。当我们有一个具有mm个神经元的层时,我们可以分别计算每个神经元的输出,但矩阵运算提供了一种更有效的方法。而不是单独计算每个神经元,矩阵乘法使我们能够同时计算所有mm个输出:𝐳=𝐱T𝐖+𝐛 \mathbf{z} = \mathbf{x}^T\mathbf{W} + \mathbf{b}

这种矩阵组织不仅仅是数学上的便利,它反映了现代神经网络为了效率而实施的实现方式。每个权重wijw_{ij}代表了输入特征ii和层中神经元jj之间连接的强度。

网络连接架构

在最简单和最常见的情况下,一个层中的每个神经元都与前一层的每个神经元相连,形成了我们所说的“密集”或“全连接”层。这种模式意味着每个神经元都有机会从前一层的所有可用特征中学习。虽然本章专注于全连接层以建立基础原理,但替代的连接模式(在第四章第四章中探讨)可以通过根据问题特征限制连接来显著提高结构化数据的效率。

图 3.14 展示了这些层之间的密集连接。对于一个具有大小为(n1,n2,n3)(n_1, n_2, n_3)的网络的权重矩阵将具有以下维度:

  • 在第一层和第二层之间:𝐖(1)n1×n2\mathbf{W}^{(1)} \in \mathbb{R}^{n_1 \times n_2}

  • 在第二层和第三层之间:𝐖(2)n2×n3\mathbf{W}^{(2)} \in \mathbb{R}^{n_2 \times n_3}

图 3.14:全连接层:多层感知器(MLPs)利用层之间的密集连接,使每个神经元能够整合前一层的所有神经元的信 息。定义这些连接的权重矩阵—𝐖(1)n1×n2\mathbf{W}^{(1)} \in \mathbb{R}^{n_1 \times n_2}𝐖(2)n2×n3\mathbf{W}^{(2)} \in \mathbb{R}^{n_2 \times n_3}—决定了这些整合的强度,并有助于从输入数据中学习复杂的模式。来源:J. McCaffrey。

偏置项

层中的每个神经元也都有一个相关的偏置项。虽然权重决定了输入的相对重要性,但偏置允许神经元移动其激活函数。这种移动对于学习至关重要,因为它为网络提供了适应更复杂模式的灵活性。

对于具有 mm 个神经元的层,偏置项形成一个向量 𝐛m\mathbf{b} \in \mathbb{R}^m。当我们计算层的输出时,这个偏置向量被添加到输入的加权和:𝐳=𝐱T𝐖+𝐛 \mathbf{z} = \mathbf{x}^T\mathbf{W} + \mathbf{b}

偏置项 21 有效地允许每个神经元具有不同的“阈值”以激活,这使得网络更具表现力。

权重和偏置存储组织

神经网络中权重和偏置的组织遵循一种系统模式。对于一个具有 LL 层的网络,我们保持:

  • 每个层的权重矩阵 𝐖(l)\mathbf{W}^{(l)}

  • 每个层 ll 的偏置向量 𝐛(l)\mathbf{b}^{(l)}

  • 每个层 ll 的激活函数 f(l)f^{(l)}

这给出了完整的层计算:𝐡(l)=f(l)(𝐳(l))=f(l)(𝐡(l1)T𝐖(l)+𝐛(l)) \mathbf{h}^{(l)} = f{(l)}(\mathbf{z}) = f{(l)}(\mathbf{h}\mathbf{W}^{(l)} + \mathbf{b}^{(l)}) 其中 𝐡(l)\mathbf{h}^{(l)} 表示应用激活函数后的层的输出。

检查点:神经网络架构基础

在继续到网络拓扑和训练之前,验证你对我们已经涵盖的基础概念的理解:

核心概念

系统影响

自测示例:对于一个具有 784→100→10 层的数字识别网络,计算:(1)每个权重矩阵中的参数数量,(2)总参数数量,(3)在推理过程中存储的单个图像的激活。

如果这些内容有任何不清楚的地方,请在继续之前回顾第 3.4 节(神经网络基础)、第 3.4.1.1 节(神经元和激活)或第 3.4.2 节(权重和偏差)。接下来的关于训练和优化的章节直接建立在这些基础上。

架构设计

网络拓扑描述了单个神经元如何组织成层并连接形成完整的神经网络。构建直觉从 AI 历史中一个简单的问题开始,这个问题变得闻名 22。

考虑一个学习 XOR 函数的网络——这是一个需要非线性的经典问题。输入 x1x_1x2x_2 可以是 0 或 1,当输入不同时 XOR 输出 1,当它们相同时输出 0。

网络结构:2 个输入 → 2 个隐藏神经元 → 1 个输出

前向传递示例:对于输入 (1,0)(1, 0):

  • 隐藏神经元 1:h1=ReLU(1w11+0w12+b1)h_1 = \text{ReLU}(1 \cdot w_{11} + 0 \cdot w_{12} + b_1)

  • 隐藏神经元 2:h2=ReLU(1w21+0w22+b2)h_2 = \text{ReLU}(1 \cdot w_{21} + 0 \cdot w_{22} + b_2)

  • 输出:y=sigmoid(h1w31+h2w32+b3)y = \text{sigmoid}(h_1 \cdot w_{31} + h_2 \cdot w_{32} + b_3)

这个简单的网络展示了隐藏层如何使学习非线性模式成为可能——这是单层无法实现的。

XOR 示例建立了基本的三层架构,但现实世界的网络需要系统地考虑设计约束和计算规模 23。使用 MNIST(Lecun et al. 1998)24 数据集识别手写数字说明了问题结构如何决定网络维度,同时隐藏层配置仍然是一个关键的设计决策。

前馈网络架构

将三层架构应用于 MNIST 揭示了数据特性和任务需求如何限制网络设计。如图图 3.15a)\text{a)}所示,一个28×2828\times 28像素的手写数字灰度图像必须通过输入、隐藏和输出层进行处理,以产生分类输出。

输入层的宽度直接由我们的数据格式决定。如图图 3.15b)\text{b)}所示,对于一个28×2828\times 28像素的图像,每个像素成为一个输入特征,需要 784 个输入神经元(28×28=784)(28\times 28 = 784)。我们可以将其视为一个 2D 像素网格,或者是一个 784 个值的扁平向量,其中每个值代表一个像素的强度。

输出层的结构由我们的任务需求决定。对于数字分类,我们使用 10 个输出神经元,每个可能的数字(0-9)一个。当呈现一个图像时,网络为每个输出神经元产生一个值,其中更高的值表示图像代表该特定数字的可能性更大。

在这些固定的输入和输出层之间,我们在设计隐藏层拓扑结构方面具有灵活性。隐藏层结构的选择,包括要使用的层数及其相应的宽度,是神经网络中的关键设计决策之一。增加额外的层增加了网络的深度,使其能够通过连续的转换学习更抽象的特征。每一层的宽度提供了在每个抽象层次上学习不同特征的能力。

图片

图 3.15: a)\text{a)} 用于分类 MNIST 数字的神经网络拓扑,展示了如何处理一个28×2828\times 28像素图像。左侧的图像显示了原始数字,并标注了尺寸。右侧的网络显示了每个像素如何连接到隐藏层,最终产生 10 个输出以进行数字分类。 b)\text{b)} MNIST 网络拓扑的另一种可视化,展示了二维图像在网络处理之前被展平成一个 784 维向量。这种表示强调了空间数据是如何转换成适合神经网络处理格式的。

这些基本的拓扑选择对网络的性能和计算需求都有重大影响。每一层或神经元的增加都会增加在训练和推理过程中必须存储和计算的数量。然而,如果没有足够的深度或宽度,网络可能缺乏学习数据中复杂模式的能力。

设计权衡:深度 vs 宽度 vs 性能

神经网络拓扑的设计集中在三个关键决策上:层数(深度)、每层的大小(宽度)以及这些层如何连接。每个选择都会影响网络的学习能力及其计算需求。

网络深度决定了可达到的抽象程度:堆叠的层通过连续的转换构建越来越复杂的特征。对于 MNIST,浅层检测边缘,中间层将边缘组合成笔画,深层组装成完整的数字模式。然而,增加深度会增加计算成本、训练难度(梯度消失)和架构复杂性,而不会带来保证的好处。

每一层的宽度,由它包含的神经元数量决定,控制了网络在每一阶段可以并行处理多少信息。更宽的层可以同时学习更多特征,但需要成比例更多的参数和计算。例如,如果隐藏层在我们的数字识别任务中处理边缘特征,其宽度决定了它可以同时检测多少不同的边缘模式。

在拓扑设计中的一个非常重要的考虑因素是总参数数。对于一个具有大小为(n1,n2,,nL)(n_1, n_2, \ldots, n_L)的层的网络,每一对相邻层lll+1l+1需要nl×nl+1n_l \times n_{l+1}个权重参数,以及nl+1n_{l+1}个偏置参数。这些参数必须在内存中存储并在训练过程中更新,这使得参数数成为实际应用中的一个关键约束。

网络设计需要平衡学习容量、计算效率和训练可追踪性。虽然基本方法是将每个神经元连接到下一层的每个神经元(全连接),但这并不总是最有效的策略。全连接方法假设每个输入元素都可能与其他每个元素交互——然而,现实世界的数据很少表现出这种无约束的关系。

考虑 MNIST 示例:一个 28×28 的图像有 784 个像素,可以形成 306,936 个可能的像素对(784×7832\frac{784 \times 783}{2})。一个包含 100 个神经元的全连接第一层学习 78,400 个权重,实际上检查了每个可能的像素关系。相邻像素(形成数字的边缘)之间的交互比相对角上的像素更多。全连接层通过参数和计算学习像素(1,1)与像素(28,28)之间没有强烈的交互,这些关系我们可以通过结构编码。专门的架构(在第四章中探讨)通过根据问题结构限制连接来解决这个问题的不效率,通过利用空间局部性、时间顺序或其他特定领域的模式,以 10-100×更少的参数实现更优的结果。

信息在网络中的流动代表了另一个重要的考虑因素。虽然基本流程是从输入到输出,但一些网络设计包括额外的路径,如跳跃连接或残差连接。这些替代路径通过作为在需要时允许更直接信息流的捷径来促进训练并提高学习复杂模式的有效性,类似于人类大脑在物体识别过程中结合详细和一般印象的方式。

这些设计决策具有重大的实际意义,包括存储网络参数的内存使用、训练和推理过程中的计算成本、训练行为和收敛性,以及网络泛化到新示例的能力。这些权衡的最佳平衡在很大程度上取决于具体问题、可用的计算资源以及数据集特征。成功的网络设计需要对这些因素进行仔细考虑,同时考虑实际约束。

在我们建立了对网络架构的理解——神经元如何连接到层,层如何堆叠成网络,以及设计选择如何影响计算需求之后——我们现在可以解决核心问题:这些网络是如何学习的?架构提供了结构,但学习过程通过发现使准确预测成为可能的权重值,使这种结构变得生动。

系统视角:架构决定部署可行性

从设计到部署:每一个架构决策——层数、层宽、连接模式——直接决定了内存需求和计算成本。一个拥有 100 万个参数的网络,仅为了存储权重就需要大约 4MB 的内存,在考虑推理过程中的激活之前。随着模型变得更深更宽,它们的内存占用和计算需求呈平方增长,而不是线性增长。这种架构与资源需求之间的数学关系解释了为什么相同的架构模式不能在所有平台上统一部署。系统工程的洞察:架构设计必须从一开始就考虑目标部署约束,因为事后压缩只能部分恢复架构与资源不匹配的问题。

层连接设计模式

神经网络可以通过层之间的不同连接模式进行结构化,每种模式都为学习和计算提供了独特的优势。理解这些模式可以提供对网络如何处理信息和从数据中学习表示的见解。

密集连接表示每个神经元都与后续层中的每个神经元相连的标准模式。在我们的 MNIST 示例中,将我们的 784 维输入层连接到 100 个神经元的隐藏层需要 78,400 个权重参数。这种完全连接使网络能够学习输入和输出之间的任意关系,但参数数量与层宽度的平方成正比。

稀疏连接模式在神经元层间连接的方式上引入了有意的限制。而不是保持所有可能的连接,神经元只连接到相邻层中的一部分神经元。这种方法从生物神经网络系统中汲取灵感,其中神经元通常只与有限数量的其他神经元形成连接。在我们的 MNIST 示例等视觉处理任务中,神经元可能只连接到表示附近像素的输入,反映了视觉特征的局部性质。

随着网络的加深,从输入到输出的路径变长,可能会使学习过程复杂化。跳跃连接通过在非相邻层之间添加直接路径来解决这个问题。这些连接提供了信息流的替代路径,补充了标准的层间逐层进展。在我们的数字识别示例中,跳跃连接可能允许后续层直接引用高级模式和原始像素值。

这些连接模式对神经网络的理沦能力和实际应用都有重大影响。密集连接以牺牲计算效率为代价最大化学习灵活性。稀疏连接可以减少计算需求,同时可能提高网络学习结构化模式的能力。跳跃连接有助于在更深的网络中保持有效的信息流。

模型大小和计算复杂度

神经网络中参数(权重和偏置)的排列决定了其学习能力和计算需求。虽然拓扑结构定义了网络的结构,但参数的初始化和组织在学习和性能中起着至关重要的作用。

参数数量随着网络宽度和深度的增加而增长。对于我们的 MNIST 示例,考虑一个具有 784 维输入层、两个各有 100 个神经元的隐藏层和一个 10 个神经元的输出层的网络。第一层需要 78,400 个权重和 100 个偏置,第二层需要 10,000 个权重和 100 个偏置,输出层需要 1,000 个权重和 10 个偏置,总共 89,610 个参数。每个参数都必须在内存中存储并在学习过程中更新。

参数初始化对网络行为至关重要。将所有参数设置为零会导致同一层的神经元行为相同,从而阻止多样化的特征学习。相反,权重通常随机初始化,而偏差通常从小的常数值或甚至零开始。这些初始值的规模至关重要,因为过大或过小的值可能导致学习动态不佳。

参数的分布影响信息通过层的流动。在数字识别中,如果权重太小,重要的输入细节可能无法传播到后续层。如果太大,网络可能会放大噪声。偏差有助于调整每个神经元的激活阈值,使网络能够学习最佳决策边界。

不同的架构可能对参数组织施加特定的约束。一些在网络区域之间共享权重,以编码位置不变的模式识别。其他可能将某些权重限制为零,实现稀疏连接模式。

在我们理解了网络架构、神经元和参数之后,我们现在可以解决一个基本问题:这些随机初始化的参数如何变得有用?答案在于将网络从初始随机状态转换成能够做出准确预测的系统这一学习过程。

学习过程

神经网络通过在示例上进行训练的过程来学习执行任务。这个过程将网络从初始状态(正如我们刚才讨论的,权重随机初始化)转换到训练状态,在这些状态下,相同的权重编码了来自训练数据的具有意义的模式。理解这一过程对于深度学习模型的理论基础和实践实现都是至关重要的。

从标记示例中进行监督学习

建立在我们的建筑基础之上,神经网络训练的核心原则是从标记示例中进行监督学习。以我们的 MNIST 数字识别任务为例:我们有一个包含 60,000 个训练图像的数据集,每个图像都是一个28×2828\times 28像素的灰度图像,并配对其正确的数字标签。网络必须通过预测和权重调整的迭代过程来学习这些图像与其对应数字之间的关系。确保训练数据的质量和完整性对于模型的成功至关重要,如第六章所述。

输入和输出之间的关系驱动了训练方法。训练作为一个循环进行,其中每个迭代涉及处理一个称为批次的训练示例子集 25。对于每个批次,网络执行几个关键操作:

  • 通过网络层进行正向计算以生成预测

  • 使用损失函数评估预测精度

  • 基于预测误差计算权重调整

  • 更新网络权重以改善未来的预测

将这种迭代方法形式化,这个过程可以用数学表达式表示。给定一个输入图像xx及其真实标签yy,网络计算其预测:ŷ=f(x;θ) \hat{y} = f(x; \theta)其中ff表示神经网络函数,θ\theta表示所有可训练参数(权重和偏置,我们之前讨论过)。网络的误差通过损失函数LL来衡量:loss=L(ŷ,y) \text{loss} = L(\hat{y}, y)

这种预测质量的量化成为学习的基础。这种误差测量通过称为“反向传播”的过程驱动网络参数的调整,我们将在后面详细探讨。

超越单个示例的缩放,在实践中,训练是在示例批次上进行的,而不是单个输入。对于 MNIST 数据集,每个训练迭代可能会同时处理 32、64 或 128 个图像。这种批量处理有两个目的:它通过并行处理使现代计算硬件得到有效利用,并通过在多个示例中平均误差来提供更稳定的参数更新。

这种基于批次的处理方法既提高了计算效率,又保证了训练的稳定性。训练周期会持续进行,直到网络达到足够的准确度或达到预定的迭代次数。在整个过程中,损失函数充当指南,其最小化表示网络性能的改善。正如在第十二章 Chapter 12 中讨论的那样,建立适当的指标和评估协议对于评估训练效果至关重要。

前向传递计算

正向传播,如图 3.16 图所示,是神经网络中的核心计算过程,其中输入数据通过网络层流动以生成预测。理解这个过程很重要,因为它既是网络推理的基础,也是训练的基础。我们通过我们的 MNIST 数字识别示例来考察正向传播是如何工作的。

图片

图 3.16:前向传播过程:神经网络通过在相互连接的层中按顺序应用加权求和和激活函数,将输入数据转换为预测,从而实现复杂模式识别。这种分层计算构成了在训练过程中进行推理和更新模型参数的基础。

当一个手写数字的图像进入我们的网络时,它将通过层进行一系列的转换。每个转换将加权输入与学习到的模式相结合,逐步提取相关特征。在我们的 MNIST 示例中,一个 28×28 像素的图像通过多个层进行处理,最终为每个可能的数字(0-9)生成概率。

该过程从输入层开始,其中每个像素的灰度值成为输入特征。对于 MNIST 来说,这意味着 784 个输入值(28×28=784),每个值在 0 到 1 之间归一化。然后这些值通过隐藏层向前传播,其中每个神经元根据其学习的权重组合其输入,并应用非线性激活函数。

从计算角度来看,每次通过我们的 MNIST 网络(784→128→64→10)的前向传递都需要大量的矩阵运算。仅第一层就每个样本执行近 10 万个乘加运算。当批量处理多个样本时,这些运算相应地相乘,需要仔细管理内存带宽和计算资源。专门的硬件如 GPU 可以通过并行处理高效地执行这些运算。

单个层处理

通过神经网络的正向计算是系统性的,每一层都将其输入转换为越来越抽象的表示。在我们的 MNIST 网络中,这个过程发生在不同的阶段。

在每一层,计算涉及两个关键步骤:输入的线性变换后跟一个非线性激活。线性变换应用我们之前见过的相同的加权求和操作,但现在使用跟踪我们所在层级的符号:𝐙(l)=𝐖(l)𝐀(l1)+𝐛(l) \mathbf{Z}^{(l)} = \mathbf{W}{(l)}\mathbf{A} + \mathbf{b}^{(l)}

在这里,𝐖(l)\mathbf{W}^{(l)} 代表第 ll 层的权重矩阵,𝐀(l1)\mathbf{A}^{(l-1)} 包含上一层的激活值(应用激活函数后的输出),而 𝐛(l)\mathbf{b}^{(l)} 是偏置向量。上标 (l)(l) 用于追踪每个参数属于哪一层。

在此线性变换之后,每一层应用一个非线性激活函数 ff𝐀(l)=f(𝐙(l)) \mathbf{A}^{(l)} = f(\mathbf{Z}^{(l)})

此过程在每个层级上重复,形成一个变换链:

输入 → 线性变换 → 激活 → 线性变换 → 激活 → … → 输出

在我们的 MNIST 示例中,像素值首先通过第一隐藏层的权重进行变换,将 784 维输入转换为中间表示。每个后续层进一步变换这一表示,最终产生一个 10 维输出向量,表示网络对每个可能的数字的置信度。

矩阵乘法公式

完整的前向传播过程可以表示为函数的组合,每个函数代表一层变换。将这一过程数学化是基于 MNIST 示例的。

对于具有LL层的网络,我们可以将完整的正向计算表示为:𝐀(L)=f(L)(𝐖(L)f(L1)(𝐖(L1)(f(1)(𝐖(1)𝐗+𝐛(1)))+𝐛(L1))+𝐛(L)) \mathbf{A}^{(L)} = f{(L)}\Big(\mathbf{W}f{(L-1)}\Big(\mathbf{W}\cdots\big(f{(1)}(\mathbf{W}\mathbf{X} + \mathbf{b}^{(1)})\big)\cdots + \mathbf{b}^{(L-1)}\Big) + \mathbf{b}^{(L)}\Big)

虽然这个嵌套表达式可以捕捉到整个过程,但我们通常是一步一步地计算它:

  1. 第一层:<semantics><mrow><msup><mi>𝐙</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo>=</mo><msup><mi>𝐖</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mi>𝐗</mi><mo>+</mo><msup><mi>𝐛</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup></mrow> <annotation encoding="application/x-tex">\mathbf{Z}^{(1)} = \mathbf{W}^{(1)}\mathbf{X} + \mathbf{b}^{(1)}</annotation></semantics> <semantics><mrow><msup><mi>𝐀</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mrow><mo stretchy="true" form="prefix">(</mo><msup><mi>𝐙</mi><mrow><mo stretchy="true" form="prefix">(</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo stretchy="true" form="postfix">)</mo></mrow></mrow> <annotation encoding="application/x-tex">\mathbf{A}^{(1)} = f^{(1)}(\mathbf{Z}^{(1)})</annotation></semantics>

  2. 隐藏层 <semantics><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo>=</mo><mn>2</mn><mo>,</mo><mi>…</mi><mo>,</mo><mi>L</mi><mo>−</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow><annotation encoding="application/x-tex">(l = 2,\ldots, L-1)</annotation></semantics>: <semantics><mrow><msup><mi>𝐙</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo>=</mo><msup><mi>𝐖</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup><msup><mi>𝐀</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo>−</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo>+</mo><msup><mi>𝐛</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup></mrow> <annotation encoding="application/x-tex">\mathbf{Z}^{(l)} = \mathbf{W}^{(l)}\mathbf{A}^{(l-1)} + \mathbf{b}^{(l)}</annotation></semantics> <semantics><mrow><msup><mi>𝐀</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup><mrow><mo stretchy="true" form="prefix">(</mo><msup><mi>𝐙</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>l</mi><mo stretchy="true" form="postfix">)</mo></mrow></msup><mo stretchy="true" form="postfix">)</mo></mrow></mrow> <annotation encoding="application/x-tex">\mathbf{A}^{(l)} = f^{(l)}(\mathbf{Z}^{(l)})</annotation></semantics>

  3. 输出层: 𝐙(L)=𝐖(L)𝐀(L1)+𝐛(L) \mathbf{Z}^{(L)} = \mathbf{W}{(L)}\mathbf{A} + \mathbf{b}^{(L)} 𝐀(L)=f(L)(𝐙(L)) \mathbf{A}^{(L)} = f{(L)}(\mathbf{Z})

在我们的 MNIST 示例中,如果我们有一批BB图像,这些操作的维度是:

  • 输入 𝐗\mathbf{X}: B×784B \times 784

  • 第一层权重 𝐖(1)\mathbf{W}^{(1)}: n1×784n_1\times 784

  • 隐藏层权重 𝐖(l)\mathbf{W}^{(l)}: nl×nl1n_l\times n_{l-1}

  • 输出层权重 𝐖(L)\mathbf{W}^{(L)}: 10×nL110 \times n_{L-1}

步骤计算序列

理解这些数学运算如何转化为实际计算需要检查一批 MNIST 图像的前向传播过程。这个过程说明了数据如何从原始像素值转换为数字预测。

考虑一个包含 32 张图像的批次进入我们的网络。每张图像最初是一个 28×2828\times 28 的像素值网格,我们将其展平成一个 784 维的向量。对于整个批次,这给我们一个大小为 𝐗\mathbf{X} 的输入矩阵 32×78432\times 784,其中每一行代表一张图像。这些值通常被归一化,使其位于 0 和 1 之间。

每一层的转换过程如下:

  • 输入层处理:网络接收我们的输入矩阵 𝐗\mathbf{X} (32×784)(32\times 784) 并使用第一层的权重进行转换。如果我们的第一个隐藏层有 128 个神经元,𝐖(1)\mathbf{W}^{(1)} 是一个 784×128784\times 128 的矩阵。得到的计算 𝐗𝐖(1)\mathbf{X}\mathbf{W}^{(1)} 产生一个 32×12832\times 128 的矩阵。

  • 隐藏层转换:这个矩阵中的每个元素然后都会加上相应的偏置并通过激活函数。例如,使用 ReLU 激活函数时,任何负值变为零,而正值保持不变。这种非线性转换使网络能够学习数据中的复杂模式。

  • 输出生成:最后一层将其输入转换为 32×1032\times 10 矩阵,其中每一行包含 10 个值,对应于网络对每个可能数字的置信度分数。通常,这些分数会通过 softmax 函数转换为概率:P(digit j)=ezjk=110ezk P(\text{digit } j) = \frac{e{z_j}}{\sum_{k=1} e^{z_k}}

对于批处理中的每一张图像,这会产生一个可能的数字的概率分布。概率最高的数字代表网络的预测。

实现和优化考虑

前向传播的实现需要仔细关注几个影响计算效率和内存使用的实际方面。当处理大量数据或使用深度网络时,这些考虑变得尤为重要。

内存管理在前向传播期间起着重要作用。每个层的激活必须存储起来,以便在训练期间的逆传播中使用。对于我们的 MNIST 示例,批处理大小为 32,如果我们有三个大小为 128、256 和 128 的隐藏层,激活存储需求为:

  • 第一隐藏层:32×128=4,09632\times 128 = 4,096 个值

  • 第二隐藏层:32×256=8,19232\times 256 = 8,192 个值

  • 第三隐藏层:32×128=4,09632\times 128 = 4,096 个值

  • 输出层:32×10=32032\times 10 = 320 个值

这会产生总共 16,704 个值,在训练过程中必须为每个批次保留在内存中。内存需求与批次大小成线性关系,对于更大的网络来说,内存需求变得相当大。

批处理引入了重要的权衡。更大的批次可以更有效地进行矩阵运算和更好的硬件利用率,但需要更多的内存。例如,将批次大小加倍到 64 将使激活的内存需求加倍。批次大小、内存使用和计算效率之间的关系指导了实际中批次大小的选择。

计算的组织也会影响性能。矩阵运算可以通过仔细的内存布局和专门的库进行优化。激活函数的选择会影响网络的学习能力以及计算效率,因为某些函数(如 ReLU)的计算量比其他函数(如 tanh 或 sigmoid)少。

神经网络的计算特性有利于并行处理架构。虽然传统的 CPU 可以执行这些操作,但专为并行计算设计的 GPU 可以在矩阵运算上实现显著的加速——通常比矩阵运算快 10-100 倍。专门的 AI 加速器通过降低精度算术、专门的内存架构以及针对神经网络计算模式的数据流优化等技术,实现了更高的效率。

能耗在硬件平台之间也有显著差异。CPU 提供灵活性,但每个操作的能耗更高。GPU 提供高吞吐量,但功耗也更高。专门的边缘加速器优化能耗效率,以更少的功率完成相同的计算——这对于移动和嵌入式部署来说是一个关键考虑因素。这种能耗差异源于基本的内存层次结构挑战,其中数据移动主导了计算成本。

这些考虑构成了理解神经网络系统需求的基础,我们将在第四章中更详细地探讨。

现在我们已经了解了神经网络如何通过正向传播处理输入以生成预测,一个关键问题随之出现:我们如何确定这些预测是否良好?答案在于损失函数,它为衡量预测质量提供了数学框架。

损失函数

神经网络通过衡量和最小化预测误差来学习。损失函数提供了量化这些误差的算法结构,作为指导学习过程的必要反馈机制。通过损失函数,我们可以将“做出良好预测”的抽象目标转化为具体的优化问题。

为了理解损失函数的作用,让我们继续使用我们的 MNIST 数字识别示例。当网络处理一个手写数字图像时,它输出十个数字,代表它对每个可能数字(0-9)的置信度。损失函数衡量这些预测与真实答案的偏差程度。例如,如果一个图像显示的是“7”,网络应该对数字“7”表现出高置信度,而对其他所有数字表现出低置信度。当网络的预测偏离这个目标时,损失函数会对网络进行惩罚。

考虑一个具体的例子:如果网络看到一个“7”的图像,并输出置信度:[0.1,0.1,0.1,0.0,0.0,0.0,0.2,0.3,0.1,0.1] \mathtt{[0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.2, 0.3, 0.1, 0.1]}

最高的置信度(0.3)分配给了数字“7”,但这个置信度相当低,表明预测存在不确定性。一个好的损失函数会在这里产生一个高的损失值,表明网络需要显著改进。相反,如果网络输出:[0.0,0.0,0.0,0.0,0.0,0.0,0.9,0.0,0.1] \mathtt{[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.0, 0.1]}

损失函数应该产生一个较低的值,因为这样的预测更接近理想值。这说明了损失函数如何通过提供预测质量的反馈来指导网络改进。

错误测量基础

损失函数衡量网络的预测与正确答案之间的距离。这种差异用一个单一的数字表示:较低的损失意味着预测更准确,而较高的损失则表明网络需要改进。在训练过程中,损失函数通过帮助网络调整其权重以做出更好的预测来指导网络。例如,在识别手写数字时,损失将惩罚对正确数字信心较低的预测。

从数学上讲,损失函数LL接受两个输入:网络的预测ŷ\hat{y}和真实值yy。在我们的 MNIST 任务中,对于单个训练示例:L(ŷ,y)=预测与真实值之间差异的度量 L(\hat{y}, y) = \text{measure of discrepancy between prediction and truth}

当使用数据批次进行训练时,我们通常计算批次中所有示例的平均损失:Lbatch=1Bi=1BL(ŷi,yi) L_{\text{batch}} = \frac{1}{B}\sum_{i=1}^B L(\hat{y}_i, y_i) 其中 BB 是批次大小,并且 (ŷi,yi)(\hat{y}_i, y_i) 代表第 ii 个示例的预测和真实值。

损失函数的选择取决于任务类型。对于我们的 MNIST 分类问题,我们需要一个能够:

  1. 处理多个类别的概率分布

  2. 提供有意义的梯度以进行学习

  3. 有效地惩罚错误预测

  4. 与批量处理具有良好的扩展性

交叉熵和分类损失函数

对于像 MNIST 数字识别这样的分类任务,“交叉熵”(香农 1948)26 损失函数已经成为标准选择。这种损失函数特别适合于比较预测的概率分布与真实的类别标签。

对于单个数字图像,我们的网络输出的是十个可能数字的概率分布。我们将真实标签表示为一个 one-hot 向量,其中除了正确数字位置上的 1 之外,所有条目都是 0。例如,如果真实数字是“7”,标签将是:y=[0,0,0,0,0,0,0,1,0,0] y = \big[0, 0, 0, 0, 0, 0, 0, 1, 0, 0\big]

此例中的交叉熵损失为:L(ŷ,y)=j=110yjlog(ŷj) L(\hat{y}, y) = -\sum_{j=1}^{10} y_j \log(\hat{y}_j) 其中 ŷj\hat{y}_j 表示网络对数字 j 的预测概率。鉴于我们的独热编码,这简化为:L(ŷ,y)=log(ŷc) L(\hat{y}, y) = -\log(\hat{y}_c) 其中 cc 是正确类别的索引。这意味着损失只取决于对正确数字的预测概率——网络根据其对正确答案的信心程度受到惩罚。

例如,如果我们的网络预测以下概率为“7”的图像:

Predicted: [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.0, 0.1]
True: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]

损失将是 log(0.8)-\log(0.8),这大约是 0.223。如果网络更有信心,并预测正确的数字为 0.9,则损失将降低到大约 0.105。

批量损失计算方法

损失的实际计算涉及对数值稳定性和批量处理的考虑。当处理数据批次时,我们计算批次中所有示例的平均损失。

对于 B 个样本的批次,交叉熵损失变为:Lbatch=1Bi=1Bj=110yijlog(ŷij) L_{\text{batch}} = -\frac{1}{B}\sum_{i=1}^B \sum_{j=1}^{10} y_{ij} \log(\hat{y}_{ij})

高效计算这个损失需要仔细考虑数值精度。对非常小的概率取对数可能导致数值不稳定性。考虑一种情况,我们的网络预测正确类别的概率为 0.0001。直接计算log(0.0001)\log(0.0001)可能会造成下溢或导致结果不精确。

为了解决这个问题,我们通常通过以下两个关键修改来实现损失计算:

  1. 添加一个小的ε值以防止取零的对数:L=log(ŷ+ϵ) L = -\log(\hat{y} + \epsilon)

  2. 为了提高数值稳定性,应用 log-sum-exp 技巧:softmax(zi)=exp(zimax(z))jexp(zjmax(z)) \text{softmax}(z_i) = \frac{\exp\big(z_i - \max(z)\big)}{\sum_j \exp\big(z_j - \max(z)\big)}

对于我们的 MNIST 示例,批大小为 32,这意味着:

  • 处理 32 组 10 个概率值

  • 计算 32 个单独的损失值

  • 平均这些值以产生最终的批损失

对学习动态的影响

理解损失函数如何影响训练有助于解释深度学习模型中的关键实现决策。

在每次训练迭代中,损失值具有多重作用:

  1. 性能指标:它量化了当前网络的准确性

  2. 优化目标:其梯度指导权重更新

  3. 收敛信号:其趋势表示训练进度

对于我们的 MNIST 分类器,在训练过程中监控损失可以揭示网络的学习轨迹。典型的模式可能显示:

  • 初始高损失(2.3\sim 2.3,相当于在 10 个类别中的随机猜测)

  • 在早期训练迭代中迅速下降

  • 随着网络微调其预测,逐渐改进

  • 最终稳定在较低的损失(0.1\sim 0.1,表示有信心做出正确的预测)

损失函数相对于网络输出的梯度提供了驱动反向传播的初始误差信号。对于交叉熵损失,这些梯度具有特别简单的形式:预测概率与真实概率之间的差异。这种数学特性使得交叉熵损失特别适合分类任务,因为它即使在预测非常错误的情况下也能提供强大的梯度。

损失函数的选择也会影响其他训练决策:

  • 学习率选择(较大的损失梯度可能需要较小的学习率)

  • 批大小(批间损失平均影响梯度稳定性)

  • 优化算法行为

  • 收敛标准

一旦我们通过损失函数量化了网络的预测误差,下一步关键步骤就是确定如何调整网络的权重以减少这些误差。这引出了反向传播,这是神经网络从错误中学习的一种机制。

梯度计算和反向传播

反向传播 是一种算法,通过系统地应用链式法则反向通过网络层,高效地计算神经网络损失函数相对于所有参数的梯度。

反向传播,通常称为反向传播,是神经网络训练的算法基石,它通过基于梯度的优化系统地调整权重。

为了对这一复杂过程建立直观理解,可以通过工厂装配线类比来考虑“信用分配”问题。想象一个汽车工厂,其中车辆通过多个站点:站点 A 安装底盘,站点 B 添加发动机,站点 C 安装轮子,站点 D 进行最终装配。当生产线末端的质检员发现一辆有缺陷的汽车时,他们面临一个关键问题:哪个站点对问题贡献最大,每个站点应该如何调整其工艺?

解决方案从缺陷开始逆向工作。检查员首先检查最终装配(站点 D)并确定其工作如何影响质量问题。站点 D 随后查看它从站点 C 接收到的内容,并计算问题中有多少来自轮子与它自己的装配工作。这种反馈逆向流动:站点 C 检查站点 B 的发动机,站点 B 则审查站点 A 的底盘。每个站点都会收到一个与其工作对缺陷贡献成比例的“调整信号”。如果站点 B 的发动机安装是主要原因,它会收到一个强烈的信号来改变其工艺,而执行正确的站点则会收到较小或没有调整信号。

反向传播系统地解决了神经网络中的“信用分配”问题。输出层(如站点 D)接收关于出了什么错的直接反馈最多。它计算其从前一层的输入对错误的影响,并通过网络发送特定的调整信号。每一层都会根据其对预测错误的贡献接收相应的指导,并相应地调整其权重。这个过程确保每一层都能从错误中学习,最有责任感的连接会做出最大的调整。

在神经网络中,每一层就像装配线上的一个站点,反向传播确定每个连接对最终预测错误的贡献程度。这种从错误中学习的系统方法构成了神经网络通过经验改进的基础。

本节介绍了完整的优化框架,从梯度计算到实际训练实现的整个过程。

反向传播算法步骤

当正向传播计算预测时,反向传播确定如何调整网络的权重以改进这些预测。为了理解这个过程,可以考虑我们的 MNIST 示例,其中网络预测一个“3”来表示一个“7”的图像。反向传播提供了一种系统的方法来调整网络中的权重,通过计算每个权重对错误的影响,使这种错误在未来发生的可能性降低。

这个过程从网络的输出层开始,我们比较预测的数字概率与真实标签。这个错误随后通过网络反向流动,每一层的权重根据其对最终预测的贡献接收一个更新信号。计算遵循微积分的链式法则,将权重与最终错误之间的复杂关系分解成可管理的步骤。

反向传播的数学基础为训练神经网络提供了理论基础,但实际实现需要复杂的软件框架。现代框架如 PyTorch 和 TensorFlow 实现了自动微分系统,可以自动处理梯度计算,消除了手动导数实现的需求。这些框架的系统工程方面,包括计算图和优化策略,在第七章中得到了全面介绍。

错误信号传播

梯度通过神经网络的流动遵循与正向传播相反的路径。从输出层的损失开始,梯度反向传播,计算每一层,最终每个权重如何影响了最终的预测误差。

在我们的 MNIST 示例中,考虑当网络错误地将一个“7”分类为“3”时会发生什么。损失函数在输出层生成一个初始错误信号,本质上表明“7”的概率应该增加,而“3”的概率应该减少。然后,这个错误信号通过网络层反向传播。

对于具有 L 层的网络,梯度流可以用数学公式表示。在每一层 l,我们计算该层的输出如何影响最终损失:L𝐀(l)=L𝐀(l+1)𝐀(l+1)𝐀(l) \frac{\partial L}{\partial \mathbf{A}^{(l)}} = \frac{\partial L}{\partial \mathbf{A}^{(l+1)}} \frac{\partial \mathbf{A}^{(l+1)}}{\partial \mathbf{A}^{(l)}}

这个计算过程通过网络向后级联,每一层的梯度依赖于它之前一层计算的梯度。这个过程揭示了每一层的转换是如何贡献到最终预测误差的。例如,如果早期层中的一些权重强烈影响了错误分类,它们将获得更大的梯度值,这表明需要更大幅度的调整。

这个过程在深层网络中面临挑战。随着梯度通过许多层向后流动,它们可能消失或爆炸。当梯度在许多层中反复相乘时,它们可以变得指数级小,特别是在 sigmoid 或 tanh 激活函数的情况下。这导致早期层学习非常缓慢或根本不学习,因为它们接收到的更新微乎其微。相反,如果梯度值始终大于 1,它们可以指数级增长,导致训练不稳定和权重更新破坏性。

导数计算过程

梯度的实际计算涉及到在每一层计算几个偏导数。对于每一层,我们需要确定权重、偏差和激活的变化如何影响最终的损失。这些计算直接来自微积分的链式法则,但必须高效实现以适应实际的神经网络训练。

在每一层 ll,我们计算三个主要的梯度分量:

  1. 权重梯度:L𝐖(l)=L𝐙(l1)𝐀(l1)T \frac{\partial L}{\partial \mathbf{W}^{(l)}} = \frac{\partial L}{\partial \mathbf{Z}^{(l)}} {\mathbf{A}{(l-1)}}T

  2. 偏差梯度:L𝐛(l)=L𝐙(l) \frac{\partial L}{\partial \mathbf{b}^{(l)}} = \frac{\partial L}{\partial \mathbf{Z}^{(l)}}

  3. 输入梯度(用于传播到前一层):L𝐀(l1)=𝐖(l)TL𝐙(l) \frac{\partial L}{\partial \mathbf{A}^{(l-1)}} = {\mathbf{W}{(l)}}T \frac{\partial L}{\partial \mathbf{Z}^{(l)}}

在我们的 MNIST 示例中,考虑网络输出数字概率的最后一层。如果网络预测了“7”图像的[0.1,0.2,0.5,,0.05][0.1, 0.2, 0.5,\ldots, 0.05],梯度计算将:

  1. 从这些概率中的误差开始

  2. 计算权重调整如何影响这个误差

  3. 将这些梯度反向传播以帮助调整早期层的权重

这些数学公式精确地描述了梯度计算,但系统突破的亮点在于框架如何自动实现这些计算。考虑一个简单的操作,如矩阵乘法后跟 ReLU 激活:output = torch.relu(input @ weight)。数学梯度涉及计算 ReLU 的导数(对于负输入为 0,对于正输入为 1)并应用矩阵乘法的链式法则。框架通过以下方式自动处理:

  1. 在正向传递期间将操作记录在计算图中

  2. 存储必要的中间值(用于梯度计算的预 ReLU 激活)

  3. 自动为每个操作生成反向传递函数

  4. 优化整个图中的内存使用和计算顺序

这种自动化将梯度计算从需要深厚数学专业知识且容易出错的手动过程转变为一种可靠的系统功能,它能够实现快速实验和部署。该框架在优化计算效率、内存使用和硬件利用率的同时确保正确性。

计算实现细节

反向传播的实际实现需要仔细考虑计算资源和内存管理。这些实现细节对训练效率和可扩展性有重大影响。

在反向传播过程中的内存需求主要来自两个来源。首先,我们需要存储正向传播过程中的中间激活值,因为这些值是计算梯度所必需的。对于我们的 MNIST 网络,批大小为 32,每一层的激活值必须被维护:

  • 输入层:32×78432\times 784 个值 (~100KB 使用 32 位数字)

  • 隐藏层 1:32×51232\times 512 个值 (~64KB)

  • 隐藏层 2:32×25632\times 256 个值 (~32KB)

  • 输出层:32×1032\times 10 个值 (~1.3KB)

其次,我们必须在反向传播过程中为每个参数存储梯度。对于我们的示例网络,该网络大约有 500,000 个参数,这需要几个兆字节的内存来存储梯度。像 Adam27 这样的高级优化器需要额外的内存来存储动量项,这大约将梯度存储需求翻倍。

内存带宽需求与模型大小和批大小成比例。每个训练步骤都需要加载所有参数、存储梯度和访问激活值——这会产生大量的内存流量。对于像我们的 MNIST 示例这样的适度网络,这种流量在典型的内存系统能力范围内仍然是可管理的。然而,随着模型变得更大,内存带宽可能成为一个重要的瓶颈,最大的模型可能需要专用的高带宽内存系统来维持训练效率。

其次,我们需要存储梯度本身的空间。对于每一层,我们必须维护与权重和偏置相似维度的梯度。以我们之前的例子,一个具有大小为 128、256 和 128 的隐藏层的网络为例,这意味着需要存储:

  • 第一层梯度:784×128784\times 128 个值

  • 第二层梯度:128×256128\times 256 个值

  • 第三层梯度:256×128256\times 128 个值

  • 输出层梯度:128×10128\times 10 个值

反向传播的计算模式遵循特定的顺序:

  1. 在当前层计算梯度

  2. 更新存储的梯度

  3. 将错误信号传播到前一层

  4. 重复直到达到输入层

对于批量处理,这些计算在批处理中的所有示例上同时执行,从而能够有效地使用矩阵运算和并行处理能力。

现代框架通过复杂的自动微分引擎处理这些计算。当你调用 PyTorch 中的 loss.backward() 时,框架会自动管理内存分配、操作调度以及在计算图上的梯度累积。系统跟踪哪些张量需要梯度,并在需要时通过梯度检查点优化内存使用,并安排操作以最大化硬件利用率。这种自动管理允许实践者专注于模型设计,而不是梯度计算实现的复杂细节。

权重更新和优化

训练神经网络需要通过迭代优化过程系统地调整权重和偏差,以最小化预测误差。在本节中,基于我们在生物到人工翻译中建立的计算基础,我们将探讨神经网络优化的核心机制,从基于梯度的参数更新到实际训练实现。

参数更新算法

梯度下降是一种迭代优化算法,通过反复调整参数的方向来最小化损失函数,该方向由参数的梯度计算得出。

优化过程通过梯度下降 28 调整网络权重,这是一种系统方法,它实现了从我们的生物神经网络分析中推导出的学习原则。这个迭代过程计算每个权重对误差的贡献,并更新参数以减少损失,逐渐提高网络的预测能力。

基本更新规则结合了反向传播的梯度计算与参数调整:θnew=θoldαθL \theta_{\text{new}} = \theta_{\text{old}} - \alpha \nabla_{\theta}L 其中 θ\theta 代表任何网络参数(权重或偏差),α\alpha 是学习率,而 θL\nabla_{\theta}L 是通过反向传播计算出的梯度。

对于我们的 MNIST 示例,这意味着调整权重以提高数字分类的准确性。如果网络经常将“7”与“1”混淆,梯度下降将修改权重以更好地区分这些数字。学习率α\alpha29 控制调整幅度——过大值会导致超过最佳参数,而太小值会导致收敛缓慢。

尽管神经网络的损失地形高度非凸,具有多个局部最小值,但在实践中梯度下降可靠地找到有效的解决方案。涉及彩票假设(Frankle 和 Carbin 2018)、隐含偏差(Neyshabur 等人 2017)和过度参数化优势(Nakkiran 等人 2019)等概念的理论原因仍然是活跃的研究领域。对于实际的机器学习系统工程,关键洞察是具有适当的学习率、初始化和正则化的梯度下降可以持续训练神经网络以达到高性能。

小批量梯度更新

神经网络在训练过程中通常同时处理多个示例,这种方法被称为小批量梯度下降。我们不是在更新每个单独的图像后更新权重,而是在更新之前计算一批示例的平均梯度。

对于大小为BB的一批,损失梯度变为:θLbatch=1Bi=1BθLi \nabla_{\theta}L_{\text{batch}} = \frac{1}{B}\sum_{i=1}^B \nabla_{\theta}L_i

在我们的 MNIST 训练中,典型的批大小为 32,这意味着:

  1. 通过正向传播处理 32 个图像

  2. 计算所有 32 个预测的损失

  3. 将所有 32 个示例的梯度平均

  4. 使用这个平均梯度更新权重

系统视角:批大小和硬件利用率

批量大小的权衡:较大的批次可以提高硬件效率,因为矩阵运算可以以处理一个实例的计算成本处理多个实例。然而,批次中的每个实例都需要内存来存储其激活,这创造了一个基本的权衡:较大的批次更有效地使用硬件,但需要更多的内存。因此,可用内存成为批量大小的硬约束,反过来又影响硬件的利用效率。这种算法设计(批大小)与硬件能力(内存)之间的关系说明了为什么机器学习系统工程需要同时考虑这两个方面。

迭代学习过程

完整的训练过程将前向传播、反向传播和权重更新组合成一个系统的训练循环。这个循环会重复,直到网络达到令人满意的性能或达到预定的迭代次数。

整个训练数据集的一次遍历称为一个 epoch30。对于 MNIST,有 60,000 个训练图像和 32 个批量大小的数据,每个 epoch 包含 1,875 个批次数迭代。训练循环结构如下:

  1. 对于每个 epoch:

    • 打乱训练数据以防止学习顺序依赖的模式

    • 对于每个批次:

      • 执行前向传播

      • 计算损失

      • 执行反向传播

      • 使用梯度下降更新权重

    • 评估网络性能

在训练过程中,我们监控几个关键指标:

  • 训练损失:最近批次的平均损失

  • 验证准确率:在保留的测试数据上的性能

  • 学习进度:网络改进的速度

对于我们的数字识别任务,我们可能会观察到网络在多个 epoch 的训练后,准确率从 10%(随机猜测)提高到超过 95%。

收敛和稳定性考虑

成功实施神经网络训练需要关注几个关键的实际方面,这些方面对学习效果有显著影响。这些考虑因素架起了理论与实践之间的桥梁。

当机器学习模型学习到特定于训练数据的特定模式,而这些模式无法推广到未见数据时,就会发生过拟合,导致训练准确率高但测试性能差。

学习率选择可能是影响训练的最关键参数。对于我们的 MNIST 网络,学习率的选择极大地影响了训练动态。一个大的学习率 0.1 可能会导致不稳定的训练,其中损失振荡或爆炸,因为权重更新超出了最优值。相反,一个非常小的学习率 0.0001 可能会导致收敛极其缓慢,需要更多的 epoch 才能达到良好的性能。一个适中的学习率 0.01 通常在训练速度和稳定性之间提供了良好的平衡,使网络能够稳步进步,同时保持稳定的学习。

在训练过程中,收敛监控提供了关键反馈。随着训练的进行,我们通常观察到损失值稳定在某个特定值附近,表明网络正在接近局部最优。验证准确率也往往会达到平台期,这表明网络已经从数据中提取了大部分可学习的模式。训练和验证性能之间的差距可以揭示网络是否过拟合或对新示例泛化良好。在生产环境中监控模型的操作方面,包括检测模型退化性能漂移,这些方面在第十三章中得到了全面覆盖。

随着我们扩展神经网络训练,资源需求变得越来越重要。内存占用必须容纳模型参数和反向传播所需的中间计算。计算与批大小成线性关系,影响训练速度和硬件利用率。现代训练通常利用 GPU 加速,因此,对于实际实施来说,高效利用并行计算能力至关重要。

训练神经网络也带来了一些挑战。当网络对训练数据过于专业化时,就会发生过拟合,它在已见示例上表现良好,但在新示例上表现较差。梯度不稳定性可能表现为梯度消失或梯度爆炸,使得学习变得困难。批大小、可用内存和计算资源之间的相互作用通常需要仔细平衡,以在硬件约束内实现高效的训练。

检查点:神经网络学习过程

你现在已经完成了完整的训练周期——数学工具,它使得神经网络能够从数据中学习。在转向推理和部署之前,验证你的理解:

正向传播:

损失函数:

反向传播:

优化:

完整的训练循环:

自测:对于我们的 MNIST 网络(784→128→64→10),追踪在批大小为 32 的一次训练迭代中发生了什么:哪些矩阵相乘?什么被存储?需要多少内存?计算了哪些梯度?

如果任何概念感觉不清楚,请回顾第 3.5.2 节(正向传播)、第 3.5.3 节(损失函数)、第 3.5.4 节(反向传播)或第 3.5.5 节(优化过程)。这些机制构成了理解训练与推理区别的下一个探索的基础。

推理管道

在详细探讨了训练过程之后,我们现在转向神经网络的运营阶段。神经网络有两个不同的目的:在训练期间从数据中学习,在推理期间进行预测。虽然我们已经探讨了网络通过前向传播、反向传播和权重更新来学习的方式,但预测阶段的工作方式不同。在推理期间,网络使用其学习到的参数将输入转换为输出,而不需要学习机制。这个更简单的计算过程仍然需要仔细考虑数据如何通过网络流动以及系统资源如何被利用。理解预测阶段至关重要,因为它代表了神经网络如何实际部署来解决现实世界问题,从分类图像到生成文本预测。

生产部署和预测流程

神经网络的运营部署集中在推理上,这是使用训练好的模型对新数据进行预测的过程。与需要迭代参数更新和大量计算资源的训练不同,推理代表了在生产系统中提供价值的运营工作量。理解这两个阶段之间的基本差异对于设计高效的机器学习系统至关重要,因为每个阶段都对硬件、内存和软件架构提出了不同的要求。本节从系统性地比较训练开始,探讨将输入转换为预测的计算流程,来考察推理的核心特征。

这个阶段转换引入了一个关于模型适应性的重要约束,这对系统设计产生了重大影响。虽然训练好的模型通过学习到的统计模式在未见过的输入上表现出泛化能力,但学习到的参数在整个部署过程中保持固定。一旦训练结束,模型就应用其学习到的概率分布而不做修改。当运营数据分布与训练分布不同时,模型继续执行其固定的计算路径,而不考虑这种变化。考虑一个自动驾驶车辆感知系统:如果施工区域频率显著增加或部署中出现新的车辆配置,模型的响应将反映训练期间学习的统计模式,而不是适应演变的运营环境。机器学习系统适应能力并非来自运行时模型的修改,而是来自使用更新数据进行的系统重训练,这是一个在第八章中详细描述的故意工程过程。

运营阶段差异

神经网络操作分为两个基本不同的阶段,这两个阶段对计算要求和系统约束产生了显著的不同。训练需要通过网络进行正向和反向传递来计算梯度并更新权重,而推理仅涉及正向传递计算。这种架构简化意味着在推理期间每个层只执行一组操作,使用学习到的权重将输入转换为输出,而不跟踪中间值以进行梯度计算,如图图 3.17 所示。

这些计算差异直接体现在硬件需求和部署策略中。训练集群通常使用高内存的 GPU31 和大量的冷却基础设施。推理部署优先考虑不同平台上的延迟和能效:移动设备使用低功耗的神经网络处理器(通常为 2-4W),边缘服务器部署专门的推理加速器 32,而云服务使用推理优化的实例,降低数值精度以提高吞吐量 33。每天处理数百万请求的生产推理系统需要复杂的基础设施,包括负载均衡、自动扩展和故障转移机制,这些在训练环境中通常是无需的。

图片

图 3.17:推理与训练流程:在推理过程中,神经网络仅利用学习到的权重进行正向传递计算,简化了数据流并降低了与训练相比的计算成本,因为训练需要正向和反向传递来更新权重。这种简化的流程使得训练好的模型能够高效地部署以进行实时预测。

参数冻结代表了训练和推理阶段之间另一个主要的区别。在训练过程中,权重和偏差持续更新以最小化损失函数。在推理过程中,这些参数保持固定,作为从训练数据中学习到的静态转换。这种参数冻结不仅简化了计算,还使得在训练期间无法实现的优化成为可能,例如权重量化或剪枝。

训练循环与推理传递之间的结构差异对系统设计有显著影响。训练在迭代循环中运行,通过多个批次的数据重复处理多个 epoch 来细化网络的参数。相比之下,推理通常只处理每个输入一次,通过单次正向传递生成预测。这种从迭代细化到单次预测的转变影响了我们为部署而构建系统的方式。

这些结构上的差异在训练和推理之间创造了显著不同的内存和计算需求。训练需要大量的内存来存储反向传播的中间激活、权重更新的梯度和优化状态。推理消除了这些内存密集型需求,只需要足够的内存来存储模型参数并计算单次前向传播。这种内存足迹的减少,加上更简单的计算模式,使得推理可以在从强大的服务器到资源受限的边缘设备更广泛的设备上高效运行。

通常情况下,训练阶段需要更多的计算资源和内存来进行学习,而推理过程则被优化以实现高效的预测。表 3.5 总结了训练和推理之间的关键差异。

表 3.5:训练与推理对比:神经网络从计算密集的训练阶段——需要带有更新参数的前向和反向传播——过渡到使用固定参数和仅前向传播的效率推理阶段。这种区别使得在资源受限的设备上部署成为可能,通过最小化预测期间的内存需求和计算负载。

方面 训练 推理
计算流程 前向和反向传播,梯度计算 仅前向传播,直接从输入到输出
参数 持续更新的权重和偏差 固定/冻结的权重和偏差
处理模式 多个 epoch 的迭代循环 网络的单次遍历
内存需求 高 – 存储激活、梯度、优化器状态 低 – 仅存储模型参数和当前输入
计算需求 重 – 梯度更新,反向传播 较轻 – 仅矩阵乘法
硬件需求 用于高效训练的 GPU/专用硬件 可在更简单的设备上运行,包括移动/边缘设备

训练和推理阶段之间的这种鲜明对比突出了为什么系统架构在开发和部署环境之间往往存在显著差异。虽然训练需要大量的计算资源和专用硬件,但推理可以针对效率进行优化,并部署在更广泛的设备上。

训练和推理允许不同的架构优化。训练需要高精度的算术和反向传播计算,推动了具有灵活计算单元的专用硬件的采用。推理允许进行各种效率优化和利用更简单计算流的专用架构。这些差异解释了为什么专用推理处理器与通用训练硬件相比,可以实现更高的能效。

内存使用模式也差异很大:训练存储所有激活以进行反向传播(需要 2-3 倍更多的内存),而推理可以在使用后立即丢弃激活。

端到端预测工作流程

在实际应用中实现神经网络需要完整的处理管道,这个管道不仅限于网络本身。这个管道,如图 3.18 所示,通过一系列不同的阶段将原始输入转换为有意义的输出,每个阶段对于系统的运行都是必不可少的。理解这个完整的管道对于深度学习系统的设计和部署提供了关键见解。

图片

图 3.18:推理管道:机器学习系统通过一系列连续的阶段将原始输入转换为最终输出——预处理、神经网络计算和后处理——每个阶段对于准确预测和部署都至关重要。这个管道强调了模型架构与实际应用所需的完整系统之间的区别。

从图中可以看出,深度学习系统作为混合架构运行,结合了传统的计算操作和神经网络计算。神经网络组件,专注于通过矩阵操作学习到的转换,只是更广泛的计算框架中的一个元素。这个框架包括输入数据的准备和网络输出的解释,这些过程主要依赖于传统的计算方法。

考虑数据如何在图 3.18 中通过管道流动:

  1. 原始输入以原始形式到达,可能是图像、文本、传感器读数或其他数据类型

  2. 预处理将这些输入转换为神经网络可消费的格式

  3. 神经网络执行其学习到的转换

  4. 网络的原始输出通常以数值形式出现

  5. 后处理将这些输出转换为有意义的、可操作的结果

这个管道结构揭示了深度学习系统的一些关键特征。尽管神经网络在计算上非常复杂,但它仍然是一个更大系统中的组件。性能瓶颈可能出现在管道的任何阶段,而不仅仅是神经网络计算中。因此,系统优化必须考虑整个管道,而不仅仅是关注神经网络的操作。

这种架构的混合性质对系统实现有重大影响。虽然神经网络计算可能从专用硬件加速器中受益,但预处理和后处理操作通常在传统处理器上执行。这种计算在异构硬件资源上的分布是系统设计中的一个基本考虑因素。

数据预处理和归一化

预处理阶段将原始输入转换为适合神经网络计算格式的数据。虽然在理论讨论中经常被忽视,但这一阶段在现实世界数据和神经网络操作之间形成了一个关键的桥梁。以我们的 MNIST 数字识别示例来说:在我们之前设计的神经网络处理手写数字图像之前,它必须经过几个转换。手写数字的原始图像以各种格式、大小和像素值范围到达。例如,在图 3.19 中,我们可以看到数字的大小各不相同,甚至同一个人写的数字 6 也有不同的写法。

图片

图 3.19:手写数字的可变性:现实世界的数据在风格、大小和方向上表现出显著的差异,这需要强大的预处理技术来保证可靠的机器学习性能。这些图像展示了数字识别的挑战,即使看似简单的输入也需要进行归一化和特征提取,才能被神经网络有效处理。来源:o. augereau。

预处理阶段通过传统的计算操作对这些输入进行标准化:

  • 将图像缩放到所需的28×2828\times 28像素尺寸,相机图像通常较大(r)。

  • 像素值归一化从[0,255][0,255][0,1][0,1],大多数相机生成彩色图像。

  • 将 2D 图像数组展平为 784 维向量,为神经网络做准备。

  • 基本验证以确保数据完整性,确保网络预测正确。

预处理与神经网络计算的区别在于它依赖于传统的计算操作而不是学习到的转换。虽然神经网络通过训练学习识别数字,但预处理操作仍然是固定的、确定性的转换。这种区别对系统有重要的影响:预处理在传统的 CPU 上而不是在专门的神经网络硬件上运行,其性能特征遵循传统的计算模式。

预处理的有效性直接影响系统性能。不良的归一化可能导致准确性降低,不一致的缩放可能引入伪影,低效的实现可能造成瓶颈。理解这些影响有助于设计在现实条件下表现良好的鲁棒深度学习系统。

前向传递计算管道

推理阶段代表神经网络的操作状态,其中学习的参数被用来将输入转换为预测。与之前讨论的训练阶段不同,推理仅关注具有固定参数的前向计算。

模型加载和设置

在处理任何输入之前,神经网络必须正确初始化以进行推理。这个初始化阶段包括将训练期间学习的模型参数加载到内存中。对于我们的 MNIST 数字识别网络,这意味着为每一层加载特定的权重矩阵和偏置向量。我们架构的确切内存需求如下:

  • 第一隐藏层输入:

    • 权重矩阵:784×100=78,400784\times 100 = 78,400 个参数

    • 偏置向量:100 个参数

  • 第一到第二隐藏层:

    • 权重矩阵:100×100=10,000100\times 100 = 10,000 个参数

    • 偏置向量:100 个参数

  • 第二隐藏层到输出:

    • 权重矩阵:100×10=1,000100\times 10 = 1,000 个参数

    • 偏置向量:10 个参数

该架构的完整参数需求在下面的资源需求部分中详细说明。对于处理单个图像,这意味着为以下内容分配空间:

  • 第一隐藏层激活值:100 个值

  • 第二隐藏层激活值:100 个值

  • 输出层激活值:10 个值

这种内存分配模式与训练阶段有显著差异,在训练阶段需要额外的内存用于梯度、优化器状态和反向传播计算。

在实际推理部署中,采用各种内存优化技术以减少资源需求同时保持可接受的准确性。系统可能将多个请求组合在一起以更好地利用硬件能力并满足响应时间要求。对于资源受限的部署,各种模型压缩方法有助于模型适应可用内存同时保持功能。

推理前向传递执行

在推理过程中,数据通过网络的层使用初始化的参数传播。这个前向传播过程,虽然结构与训练时的对应过程相似,但具有不同的计算约束和优化。计算遵循从输入到输出的确定性路径,在每个层使用学习到的参数转换数据。

对于我们的 MNIST 数字识别网络,考虑每一层的精确计算。网络通过连续的转换处理一个表示为 784 维向量的预处理图像:

  1. 第一隐藏层计算:

    • 输入转换:784 个输入与 78,400 个权重通过矩阵乘法结合

    • 线性计算:𝐳(1)=𝐱𝐖(1)+𝐛(1)\mathbf{z}^{(1)} = \mathbf{x}\mathbf{W}^{(1)} + \mathbf{b}^{(1)}

    • 激活:𝐚(1)=ReLU(𝐳(1))\mathbf{a}^{(1)} = \text{ReLU}(\mathbf{z}^{(1)})

    • 输出:100 维激活向量

  2. 第二隐藏层计算:

    • 输入转换:100 个值与 10,000 个权重结合

    • 线性计算:𝐳(2)=𝐚(1)𝐖(2)+𝐛(2)\mathbf{z}^{(2)} = \mathbf{a}{(1)}\mathbf{W} + \mathbf{b}^{(2)}

    • 激活函数: 𝐚(2)=ReLU(𝐳(2))\mathbf{a}^{(2)} = \text{ReLU}(\mathbf{z}^{(2)})

    • 输出: 100 维激活向量

  3. 输出层计算:

    • 最终转换:100 个值与 1,000 个权重结合

    • 线性计算: 𝐳(3)=𝐚(2)𝐖(3)+𝐛(3)\mathbf{z}^{(3)} = \mathbf{a}{(2)}\mathbf{W} + \mathbf{b}^{(3)}

    • 激活函数: 𝐚(3)=softmax(𝐳(3))\mathbf{a}^{(3)} = \text{softmax}(\mathbf{z}^{(3)})

    • 输出: 10 个概率值

表 3.6 展示了这些计算,虽然从数学上与训练时的正向传播相同,但显示了重要的操作差异:

表 3.6: 正向传播优化:在推理过程中,神经网络通过仅保留当前层的激活并释放中间状态来优先考虑计算效率,这与训练时维护完整的激活历史以供反向传播不同。这种优化通过将资源集中在即时计算而不是梯度准备上,简化了输出生成过程。

特性 训练正向传播 推理正向传播
激活存储 维护完整的激活历史以供反向传播 仅保留当前层的激活
内存模式 在正向传播过程中保留中间状态 层计算完成后释放内存
计算流程 结构化以准备梯度计算 优化以直接生成输出
资源配置文件 训练操作需要更高的内存要求 最小化内存占用以实现高效执行

这种简化的计算模式能够在保持网络学习能力的同时实现高效的推理。内存需求减少和计算流程简化使得推理特别适合部署在资源受限的环境中,如移动机器学习和微型机器学习。

内存和计算资源

与训练相比,神经网络在推理过程中消耗的计算资源不同。在推理过程中,资源利用率主要集中于高效的正向传递计算和最小的内存开销。检查 MNIST 数字识别网络的特定要求揭示:

推理过程中的内存需求可以精确量化:

  1. 静态内存(模型参数):

    • 第一层:78,400 个权重 + 100 个偏置

    • 第二层:10,000 个权重 + 100 个偏置

    • 第三层:1,000 个权重 + 10 个偏置

    • 总计:89,610 个参数 (358.44\approx 358.44 KB 在 32 位浮点精度下 34)

  2. 动态内存(激活值):

    • 第一层输出:100 个值

    • 第二层输出:100 个值

    • 第三层输出:10 个值

    • 总计:210 个值 (0.84\approx 0.84 KB 在 32 位浮点精度下)

对于每个输入,计算需求遵循固定的模式:

  • 第一层:78,400 次乘加操作

  • 第二层:10,000 次乘加操作

  • 输出层:1,000 次乘加操作

  • 总计:每次推理 89,400 次乘加操作

这种资源配置文件与训练需求形成鲜明对比,训练时需要额外的梯度内存和反向传播的计算开销显著增加了资源需求。推理计算的预测性和简化的特性使得各种优化机会和高效的硬件利用成为可能。

性能提升技术

推理计算的固定特性提供了在训练期间不可用的优化机会。一旦神经网络的参数被冻结,可预测的计算模式允许在内存使用和计算效率方面进行系统性的改进。

批处理大小选择是推理优化中的一个关键权衡。在训练过程中,为了稳定梯度计算,需要大批次,但推理提供了更多的灵活性。处理单个输入可以最小化延迟,使其对于需要即时响应的实时应用非常理想。然而,批处理可以通过更好地利用并行计算能力显著提高吞吐量,尤其是在 GPU 上。对于我们 MNIST 网络,考虑内存影响:处理单个图像需要存储 210 个激活值,而 32 个图像的批次需要 6,720 个激活值,但在并行硬件上可以快 32 倍处理图像。

推理过程中的内存管理可以比训练过程中更加高效。由于中间值仅用于正向计算,内存缓冲区可以仔细管理并重复使用。每一层的激活值只需存在到下一层计算完成即可。这使可能的情况下可以进行原地操作,从而减少总的内存占用。推理的固定性质允许进行精确的内存对齐和访问模式,这些模式针对底层硬件架构进行了优化。

在推理过程中,针对硬件的优化变得尤为重要。在 CPU 上,计算可以组织起来以最大化缓存利用率,并利用并行处理能力,即同时将相同的操作应用于多个数据元素。GPU 部署得益于优化的矩阵乘法例程和高效的内存传输模式。这些优化不仅超越了纯计算效率,还可以显著影响功耗和硬件利用率,这在实际部署中是关键因素。

推理的可预测性也使得像降低数值精度这样的优化成为可能。虽然训练通常需要全浮点精度以保持稳定的学习,但推理通常可以在保持可接受精度的同时使用较低的精度。对于我们 MNIST 网络,这样的优化可以显著减少内存占用,同时提高计算效率。

这些优化原则,虽然通过我们简单的 MNIST 前馈网络进行说明,但仅代表了神经网络优化的基础。更复杂的架构引入了额外的考虑和机会,包括专门为空间数据处理、顺序计算和基于注意力的计算模式设计的架构。这些架构变化及其优化在第四章、第十章和第九章中进行了探讨。

输出解释和决策制定

将神经网络输出转换为可操作的预测需要回归到传统的计算范式。正如预处理将现实世界数据连接到神经计算一样,后处理将神经输出重新连接到传统的计算系统。这完成了我们之前检查的混合计算管道,其中神经计算和传统计算操作协同工作以解决现实世界问题。

后处理的复杂性不仅限于简单的数学变换。现实世界的系统必须处理不确定性、验证输出,并与更大的计算系统集成。在我们的 MNIST 示例中,一个数字识别系统可能不仅需要最可能的数字,还需要置信度度量来确定何时需要人工干预。这引入了额外的计算步骤:置信度阈值、二级预测检查和错误处理逻辑,所有这些都在传统的计算框架中实现。

后处理的计算需求与神经网络推理大相径庭。虽然推理受益于并行处理和专用硬件,但后处理通常在传统的 CPU 上运行,遵循顺序逻辑模式。这种回归到传统的计算既带来了优势也带来了限制。操作比神经计算更灵活且更容易修改,但如果不仔细实现,它们可能会成为瓶颈。例如,为一批预测计算 softmax 概率需要与神经网络层的矩阵乘法不同的优化策略。

系统集成考虑通常主导后处理设计。输出格式必须与下游系统要求匹配,错误处理必须与更广泛系统协议保持一致,性能必须满足系统级约束。在一个完整的邮件分拣系统中,后处理阶段不仅必须识别数字,还必须将这些预测格式化为分拣机械,适当地处理不确定性情况,并保持与物理邮件流动速度相匹配的处理速度。

这种回归到传统的计算范式完成了深度学习系统的混合特性。正如预处理为神经计算准备现实世界数据一样,后处理将神经输出调整为现实世界的应用。理解这种混合特性,即神经计算与传统计算之间的相互作用,对于设计和实现有效的深度学习系统至关重要。

我们现在已经涵盖了神经网络的完整生命周期:从架构设计到训练动态再到推理部署。每个概念——神经元、层、前向传播、反向传播、损失函数、优化——都代表了一个拼图的一部分。但在实践中,这些部分是如何组合在一起的?以下检查点帮助您验证对这些组件如何整合到完整系统中的理解,之后我们将考察一个历史案例研究,该研究将这些原则在实际部署中付诸实践。

检查点:完整的神经网络系统

在检查这些概念如何在现实世界的部署中整合之前,验证您对完整神经网络生命周期的理解:

跨阶段集成:

从训练到部署:

推理与部署:

系统集成:

端到端流程:

自我测试:对于一个在生产中部署的 MNIST 数字分类器(784→128→64→10):(1)解释为什么训练此模型需要约 12GB GPU 内存,而推理只需要约 400MB。(2)追踪一个数字图像从相机捕获到预处理、推理和后处理的最终预测。(3)识别在每秒处理 100 个图像的实时系统中可能出现的瓶颈。(4)描述您如何在生产中监控模型退化。

以下案例研究展示了这些概念如何在大规模部署的生产系统中整合。注意观察架构选择、训练策略和部署约束如何结合以创建一个工作的机器学习系统。

案例研究:美国邮政服务数字识别

我们从第一性原理探讨了神经网络——神经元如何计算,层如何转换数据,训练如何调整权重,以及推理如何做出预测。这些概念可能看起来很抽象,但它们都在第一个大规模神经网络部署中汇集在一起:美国邮政服务的手写数字识别系统。这个历史案例说明了我们所学的数学原理如何转化为实际工程决策、系统权衡和现实世界的性能约束。

神经网络的理沦基础在解决大规模现实世界问题的系统中得到了具体体现。20 世纪 90 年代部署的美国邮政服务手写数字识别系统就是这种从理论到实践的例证。这一早期的生产部署确立了现代机器学习系统中许多仍然相关的原则:稳健的预处理管道的重要性、自动化决策中置信度阈值的需要,以及在不断变化的现实世界条件下维持系统性能的挑战。虽然今天的系统在更强大的硬件上部署了更加复杂的架构,但研究这个基础案例研究揭示了本章早期建立的优化原则如何结合在一起创建生产系统——这些经验教训从 20 世纪 90 年代的邮件分类扩展到 2025 年的边缘人工智能部署。

邮件分类挑战

美国邮政服务(USPS)每天处理超过一亿件邮件,每件邮件都需要根据手写的 ZIP 代码进行准确的路线规划。在 20 世纪 90 年代初,人工操作员主要执行这项任务,使其成为世界上最大的手动数据录入操作之一。通过神经网络自动化这一过程代表了人工智能早期和成功的大规模部署,体现了许多神经计算的核心原则。

这个任务的复杂性变得显而易见:ZIP 代码识别系统必须处理在多种条件下捕获的手写数字图像——不同的书写风格、笔的类型、纸张颜色和环境因素(图 3.20)。它必须在毫秒内做出准确的预测,以保持邮件处理速度。识别错误可能导致邮件误投,造成重大延误和成本。这个现实世界的限制意味着系统不仅需要高精度,还需要可靠的预测置信度度量,以确定何时需要人工干预。

图片

图 3.20:手写数字的变异性:现实世界中的手写数字在笔画宽度、倾斜度和字符形成方面存在显著差异,这对 USPS 使用的自动化识别系统等系统构成了挑战。这些示例说明了在光学字符识别(OCR)任务中实现高精度所需的鲁棒特征提取和模型泛化。

这个具有挑战性的环境提出了涵盖我们讨论的神经网络实现各个方面的要求,从生物启发到实际部署考虑。系统的成功或失败不仅取决于神经网络的准确性,还取决于从图像捕获到最终分类决策的整个流程。

工程流程和设计决策

USPS 数字识别系统的发展需要在每个阶段都进行仔细考虑,从数据收集到部署。这个过程说明了神经网络的理论原理如何转化为实际工程决策。

数据收集带来了第一个主要挑战。与受控的实验室环境不同,邮政设施需要处理具有极大多样性的邮件件。训练数据集必须捕捉这种多样性。不同年龄、教育背景和书写风格的人所写的数字只是挑战的一部分。信封的颜色和质感各不相同,图像是在不同的光照条件和方向下捕获的。这项广泛的数据收集工作后来为我们在示例中使用的 MNIST 数据库的创建做出了贡献。

网络架构设计需要平衡多个约束条件。虽然更深层的网络可能实现更高的准确性,但它们也会增加处理时间和计算需求。处理单个数字的28×2828\times 28像素图像需要在严格的时间限制内完成,同时还要在可用的硬件上可靠运行。网络必须在不同的条件下保持一致的准确性,从书写良好的数字到匆忙的涂鸦。

训练网络引入了额外的复杂性。系统不仅需要在测试数据集上实现高准确性,还需要在无尽多样的现实世界书写风格上实现高准确性。仔细的预处理将输入图像标准化,以考虑大小和方向的变化。数据增强技术增加了训练样本的多样性。团队在不同的人口群体中验证了性能,并在实际操作条件下进行了测试,以确保稳健的性能。

工程团队面临着一个关于置信度阈值的关键决策。将这些阈值设置得太高会将太多邮件件路由给人工操作员,从而违背了自动化的目的。将这些阈值设置得太低则可能存在投递错误的风险。解决方案是通过分析正确与错误预测的置信度分布得出的。这种分析确定了优化自动化率和错误率之间权衡的阈值,确保高效运行的同时保持可接受的准确性。

生产系统架构

跟随一封邮件通过 USPS 识别系统,可以说明我们讨论的概念如何整合成一个完整的解决方案。从物理邮件件到分拣信件的旅程展示了传统计算、神经网络推理和物理机械之间的相互作用。

当信封到达成像站时,过程开始。高速相机以每秒超过几件邮件(例如,10 件)的速度捕捉 ZIP 代码区域。此图像获取过程必须适应不断变化的信封颜色、书写风格和环境条件。尽管操作速度很快,但系统必须保持一致的图像质量,因为运动模糊和适当的照明带来了重大的工程挑战。

预处理将这些原始相机图像转换为适合神经网络分析的形式。系统必须定位 ZIP 代码区域,分割单个数字,并对每个数字图像进行归一化。这一阶段采用传统的计算机视觉技术:图像阈值化适应信封背景颜色,连通分量分析识别单个数字,尺寸归一化产生标准的 28×28 像素图像。速度仍然至关重要;这些操作必须在毫秒内完成,以保持吞吐量。

神经网络随后处理每个归一化的数字图像。经过训练的网络,具有我们之前详细说明的 89,610 个参数,执行正向传播以生成预测。每个数字通过两个各有 100 个神经元的隐藏层,最终产生十个输出值,代表数字的概率。这一推理过程虽然计算密集,但得益于我们在上一节中讨论的优化。

后处理将这些神经网络输出转换为分类决策。系统对每个数字预测应用置信度阈值。一个完整的 ZIP 代码需要所有五个数字都高度置信,一个不确定的数字会将整个邮件标记为需要人工审查。当置信度达到阈值时,系统将分类指令传输到机械系统,这些系统将物理地将邮件件引导到其适当的分类箱中。

整个管道在严格的时序约束下运行。从图像捕获到分类决策,处理必须在邮件件到达分类点之前完成。系统同时维护多个邮件件在各个管道阶段,需要计算和机械系统之间的仔细同步。这种实时操作说明了我们在推理和后处理中讨论的优化为什么在实际应用中变得至关重要。

性能结果和运营影响

基于神经网络的 ZIP 代码识别的实施改变了美国邮政服务(USPS)的邮件处理操作。到 2000 年,全国多个设施采用了这项技术,每天处理数百万件邮件。这一实际部署展示了神经网络系统在关键任务应用中的潜力和局限性。

性能指标揭示了验证许多基本原理的有趣模式。系统在清晰书写的数字上达到了最高的准确率,这些数字与训练数据中的类似。然而,性能因现实世界因素而显著变化。光照条件影响了预处理的有效性。不寻常的书写风格有时会混淆神经网络。环境振动也可能影响图像质量。这些挑战导致了物理系统和神经网络管道的持续改进。

经济影响是显著的。在自动化之前,手动分拣需要操作员以平均每秒处理一件的速度读取和输入 ZIP 代码。神经网络系统以十倍于此的速度处理物品,同时降低了劳动力成本和错误率。然而,该系统并没有完全消除人工操作员;他们的角色转变为处理不确定案例和维护系统性能。这种结合人工和人类智能的混合方法成为其他自动化项目的典范。

系统还揭示了在生产环境中部署神经网络的宝贵经验。训练数据质量至关重要;网络在训练集中代表良好的数字风格上表现最佳。定期重新训练有助于适应不断变化的书写风格。维护需要硬件专家和深度学习专家,引入了新的运营考虑。这些见解影响了神经网络在其他工业应用中的后续部署。

研究人员发现,这种实现展示了理论原则如何转化为实际约束。神经网络生物启发的数字识别提供了基础,但成功的部署需要仔细考虑系统级因素:处理速度、错误处理、维护需求和与现有基础设施的集成。这些经验教训继续为现代深度学习部署提供信息,其中类似的规模、可靠性和集成挑战仍然存在。

关键工程教训和设计原则

美国邮政服务 ZIP 代码识别系统展示了从生物启发到实际神经网络部署的历程。它展示了从预处理到推理再到后处理的神经网络基本原理如何结合解决现实世界问题。

系统的开发展示了理解理论基础和实践考虑的重要性。虽然生物视觉系统可以轻松处理手写数字,但将这种能力转化为人工系统需要仔细考虑网络架构、训练程序和系统集成。

这种早期大规模神经网络部署的成功帮助确立了我们现在认为是标准的许多实践:详尽训练数据的重要性、信心指标的需求、预处理和后处理的作用以及系统级优化的关键性。

USPS 系统所展示的原则——稳健的预处理、基于信心的决策以及人机混合工作流程——在现代部署中仍然是基础性的,尽管规模和复杂性发生了巨大变化。当时 USPS 部署的网络在专用硬件上以每秒 10 张的速度处理约 10 万个参数的图像,消耗 50-100W 的功率,而今天的移动设备部署的模型具有 1-1000 万个参数,每秒处理 30 多帧图像,用于实时视觉任务,在神经处理器上消耗的功率小于 2W。2025 年的边缘 AI 系统——从智能手机面部识别到自动驾驶车辆感知——面临着类似的挑战,即在准确性和计算约束之间取得平衡,但运行在远为紧张的功率预算(毫瓦与瓦特)和更严格的延迟要求(毫秒与数十毫秒)之下。核心的系统工程原则保持不变:理解数学运算使硬件-软件协同设计成为可能,预处理管道决定了对现实世界变化的鲁棒性,而信心阈值将需要人工判断的情况与自动化处理的情况分开。因此,这个历史案例研究不仅提供了历史背景,还为从云到边缘到微型设备的整个范围内现代机器学习系统部署的推理提供了一个模板。

深度学习与 AI 三角形

我们在本章中探讨的神经网络概念直接映射到控制所有深度学习系统的 AI 三角形框架。这种联系阐明了为什么深度学习需要对计算架构和系统设计原则进行如此根本性的重新思考。

算法:我们已涵盖的数学基础——前向传播、激活函数、反向传播和梯度下降——定义了深度学习系统的算法核心。我们做出的架构选择(层深度、神经元数量、连接模式)直接决定了计算复杂度、内存需求和训练动态。每个激活函数的选择,从 ReLU 的计算效率到 sigmoid 的饱和梯度,都代表了具有深远系统影响的算法决策。区分神经网络与经典方法的层次特征学习正是源于这些算法构建块,但成功在很大程度上取决于其他两个三角形组件。

数据:学习过程完全依赖于标记数据来计算损失函数并通过反向传播指导权重更新。我们的 MNIST 示例展示了数据质量、分布和规模如何直接决定网络性能——算法保持不变,但数据特征决定了学习是否成功。从手动特征工程到自动表示学习的转变并没有消除数据依赖性;它将挑战从设计特征转变为整理能够捕捉现实世界模式全部复杂性的数据集。数据预处理、增强和验证策略成为算法设计决策,这些决策塑造了整个学习过程。

基础设施:前向传播和反向传播所需的巨大矩阵乘法数量揭示了为什么专门的硬件基础设施对于深度学习成功变得至关重要。我们探讨的内存带宽限制、有利于 GPU 架构的并行计算模式以及训练与推理的不同计算需求,都源自我们研究的数学运算。从 CPU 到 GPU 再到专门的 AI 加速器的演变,直接响应了神经网络算法固有的计算模式。理解这些数学基础使工程师能够就硬件选择、内存层次结构设计和分布式训练策略做出明智的决策。

这三个组件的相互依存性通过我们章节的进展而显现:算法定义了必要的计算,数据决定了这些计算是否能够学习有意义的模式,基础设施决定了系统是否能够在规模上高效执行。神经网络之所以成功,并不是因为任何单个组件有所改进,而是因为这三个领域的进步是一致的——更复杂的算法、更大的数据集和专门的硬件产生了一种协同效应,从而改变了人工智能。

这种 AI 三角形的视角解释了为什么深度学习工程需要超越传统软件开发的系统思维。不考虑其他组件而优化任何单个组件会导致次优结果:最优雅的算法在没有高质量数据的情况下失败,最佳数据集在没有足够的计算基础设施的情况下仍然无法使用,最强大的硬件如果没有能够有效从数据中学习的算法,将一无所获。

谬误与陷阱

深度学习代表了从显式编程到从数据学习的范式转变,这产生了关于何时以及如何应用这些强大但复杂的系统的独特误解。神经网络数学基础和统计性质往往导致对其能力、局限性和适当用例的误解。

谬误: 神经网络是“黑盒”,无法理解或调试。

尽管神经网络缺乏传统算法的显式规则基础透明度,但多种技术能够理解和调试其行为。激活可视化揭示了神经元对哪些模式做出响应,梯度分析显示了输入如何影响输出,而注意力机制突出了哪些特征影响决策。层级相关性传播追踪决策路径通过网络,而消融研究确定了关键组件。难以理解的感觉通常源于试图通过传统的编程范式而不是统计和可视化分析方法来理解神经网络。现代可解释性工具提供了对网络行为的洞察,尽管这确实不同于逐行代码调试。

谬误: 深度学习消除了对领域专业知识和仔细的特征工程的需求。

自动特征学习的承诺导致了这样的误解,即深度学习可以独立于领域知识运作。实际上,成功的深度学习应用需要广泛的领域专业知识来设计适当的架构(例如,对于空间数据使用卷积层,对于序列使用循环结构),选择有意义的训练目标,创建代表性的数据集,并在特定情境下解释模型输出。USPS 数字识别系统之所以成功,正是因为它结合了邮政服务关于邮件处理、数字书写模式和操作限制的专业知识。领域知识指导着关于数据增强策略、验证指标和部署要求的关键决策,这些决策决定了实际应用的成功。

陷阱: 对于可以用更简单方法解决的问题使用复杂的深度学习模型。

团队经常部署复杂的神经网络来完成可以用线性模型或决策树解决的问题,这引入了不必要的复杂性、计算成本和维护负担。一个训练时间只需毫秒的线性回归模型,在数据有限或关系真正线性时,可能比需要数小时训练的神经网络表现更好。在采用深度学习之前,使用简单模型建立基线性能。如果一个逻辑回归模型在分类任务上达到了 95%的准确率,那么神经网络带来的边际改进很少能证明增加的复杂性是合理的。将深度学习保留用于那些表现出层次结构模式、非线性关系或高维交互的问题,这些是简单模型无法捕捉的。

陷阱: 在不理解潜在数据分布的情况下训练神经网络。

许多从业者将神经网络训练视为一种机械过程,通过标准架构输入数据,忽略了决定成功的关键数据特征。在不平衡数据集上训练的网络,除非通过重采样或损失加权来解决,否则在少数类别上表现将不佳。非平稳分布需要持续的重训练或自适应机制。异常值可能会主导梯度更新,防止收敛。USPS 系统在达到生产就绪性能之前,需要对数字频率分布、书写风格变化和图像质量因素进行仔细分析。成功的训练需要彻底的探索性数据分析、对统计特性的理解,以及在训练过程中持续监控数据质量指标。

陷阱: 假设研究级模型可以直接部署到生产系统中,而不考虑系统级因素。

许多团队将模型开发视为与系统部署分开,当研究原型遇到生产限制时会导致失败。一个在干净数据集上实现出色准确率的神经网络,当与实时数据管道、遗留数据库或分布式服务基础设施集成时可能会失败。生产系统需要考虑延迟预算、内存限制、并发用户负载和容错机制,这些在研究环境中很少出现。从研究代码到生产系统的转变需要仔细关注数据预处理管道、模型序列化格式、服务基础设施的可扩展性和监测系统,以检测性能下降。成功的部署需要数据科学和系统工程团队早期合作,以将模型需求与操作限制相一致。

摘要

神经网络通过用从数据中学习模式的自适应系统取代基于规则的编程,改变了计算方法。在本章中探索的从生物到人工神经元映射的基础上,这些系统创建了处理复杂信息并通过经验提高性能的实用实现。

神经网络架构展示了层次化处理,其中每一层从原始数据中逐步提取更抽象的模式。训练通过迭代优化调整连接权重以最小化预测误差,而推理则将学习到的知识应用于对新数据的预测。这种学习阶段和应用阶段的分离,为计算资源、内存使用和处理延迟等系统设计部署策略创造了不同的系统需求。

本章通过全连接架构建立了数学和系统含义。在这里探索的多层感知器展示了通用函数逼近。只要有足够的神经元和适当的权重,这样的网络理论上可以学习任何连续函数。这种数学的普遍性伴随着计算成本。以我们的 MNIST 示例来说:一个 28×28 像素的图像包含 784 个输入值,一个全连接网络独立地处理每个像素,仅在第一层就学习到 61,400 个权重(784 个输入 × 100 个神经元)。相邻像素高度相关,而远距离像素很少交互。全连接架构在学习无关的长距离关系上消耗了计算资源。

关键要点

  • 神经网络用从数据中通过分层处理架构发现的自适应模式替换了手工编码的规则。

  • 全连接网络提供了通用逼近能力,但通过平等对待所有输入关系而牺牲了计算效率。

  • 训练和推理代表了不同的操作阶段,具有不同的计算需求和系统设计要求。

  • 完整的处理管道将传统计算与神经计算集成到预处理、推理和后处理阶段。

  • 系统级考虑——从激活函数的选择到批量大小配置再到网络拓扑——直接决定了在云、边缘和微型设备上的部署可行性。

  • 专用架构(CNNs、RNNs、Transformers)将问题结构编码到网络设计中,在完全连接的替代方案上实现了显著的效率提升。

实际问题表现出通用全连接网络无法有效利用的结构:图像具有空间局部性,文本具有序列依赖性,图具有关系模式,时间序列数据具有时间动态性。这种结构盲点造成了三个关键问题:计算浪费(学习不存在的关联关系)、数据效率低下(需要更多的训练示例来学习可以结构化编码的模式),以及可扩展性差(随着输入维度的增加,参数数量激增)。

下一章(第四章)通过引入直接将问题结构编码到网络设计中的专用架构来解决这些限制。卷积神经网络通过限制连接和权重共享,利用空间局部性进行视觉任务,通过更少的参数(10-100×)实现了最先进的性能。循环神经网络通过隐藏状态捕获序列数据的时间依赖性,尽管序列处理创造了并行化挑战。变换器通过注意力机制实现序列的并行处理,革命性地改变了自然语言处理,同时也引入了新的内存扩展挑战。

每一项架构创新都带来了系统工程的权衡,这些权衡直接建立在本章建立的基础之上。卷积层需要与全连接层不同的内存访问模式,循环网络面临不同的并行化约束,而注意力机制创造了新的计算瓶颈。数学运算仍然是我们在研究中学习的矩阵乘法和非线性激活,但它们的组织方式改变了系统需求。

理解这些专业架构代表着在机器学习系统工程中的自然下一步——将我们已掌握的前向传播、梯度下降和激活函数的原则应用于旨在计算效率和特定问题结构的架构中。随着我们探索如何构建不仅学习效果良好,而且在现实世界计算系统约束下也能学习的神经网络,从生物灵感到数学公式再到系统实现的过程持续进行。


DNN 架构

DALL·E 3 提示:一个视觉上引人注目的矩形图像,展示了深度学习算法(如 CNN、RNN 和注意力网络)与机器学习系统的相互作用,相互连接。构图包括神经网络图与处理器、图和数据流等计算系统表示的完美融合。明亮的霓虹色调与黑暗的未来背景形成对比,象征着尖端技术和复杂的系统复杂性。

目的

为什么神经网络中的架构选择会影响决定计算可行性、硬件需求和部署约束的系统设计决策?

神经网络架构代表了直接决定系统性能和部署可行性的工程决策。每个架构选择都会在整个系统堆栈中产生级联效应:内存带宽需求、计算复杂性模式、并行化机会和硬件加速兼容性。理解这些架构影响使工程师能够在模型能力和系统约束之间做出明智的权衡,在问题发生之前预测计算瓶颈,并选择合适的硬件平台。架构决策决定了机器学习系统是否能在可用的计算资源内满足性能要求。这种理解对于构建可扩展的 AI 系统至关重要,这些系统可以在不同的环境中有效部署。

学习目标

  • 区分四种主要神经网络架构家族(MLPs、CNNs、RNNs、Transformers)的计算特性和归纳偏差

  • 分析架构设计选择如何决定计算复杂性、内存需求和并行化机会

  • 评估架构模式对硬件利用率、内存带宽和部署约束的系统级影响

  • 将架构选择框架应用于匹配数据特征与特定应用中适当的神经网络设计

  • 使用复杂性分析评估不同架构方法之间的计算和内存权衡

  • 检查基本计算原语(矩阵乘法、卷积、注意力)如何映射到硬件加速机会

  • 批判常见的架构选择谬误及其对系统性能和部署成功的影响

  • 综合统一的归纳偏差框架,解释架构-数据兼容性模式

架构原则与工程权衡

将神经网络计算系统地组织成有效的架构,是当代机器学习系统中最具影响力的进展之一。基于第三章中建立的神经网络计算的数学基础,本章探讨了支配操作(矩阵乘法、非线性激活和基于梯度的优化)如何结构化以解决复杂计算问题的架构原则。这种架构视角架起了数学理论与实际系统实现之间的桥梁,考察了网络层面的设计选择如何决定整个系统的性能特征。

本章聚焦于贯穿机器学习系统设计的工程权衡。虽然数学理论,尤其是通用逼近结果,表明神经网络具有非凡的表示灵活性,但实际部署需要通过明智的架构专门化才能实现的计算效率。这种紧张关系在多个维度上体现出来:理论上的通用性与计算上的可处理性,表示的完备性与内存效率,以及数学的普遍性与领域特定优化。通过架构创新解决这些紧张关系是推动机器学习系统进步的主要驱动力。

当代神经网络架构源于对在结构化数据上部署通用数学框架时遇到的具体计算挑战的系统响应。每个架构范式都体现了独特的归纳偏差(关于数据结构和关系的隐含假设),这使高效学习成为可能,同时以领域适当的方式约束假设空间。这些架构创新代表了将计算原语组织成模式以实现表示能力与计算效率之间最佳平衡的工程解决方案。

本章考察了四个架构家族,它们共同定义了现代神经网络的概念景观。多层感知器作为通用逼近理论的典范实现,展示了密集连接如何实现通用模式识别,并说明了架构通用性的计算成本。卷积神经网络引入了空间架构专业化的范例,利用平移不变性和局部连接来实现显著的效率提升,同时保持对空间数据的表示能力。循环神经网络将架构专业化扩展到时间域,通过引入显式的记忆机制,使序列处理能力成为前馈架构所不具备的。注意力机制和 Transformer 架构代表了当前的进化前沿,用动态的、内容相关的计算取代了固定的结构假设,在并行化操作中保持了计算效率,同时实现了显著的能力。

这些架构模式在系统工程中的重要性不仅限于算法考虑。每个架构选择都会创建独特的计算特征,这些特征会传播到实现堆栈的每一层,从而确定内存访问模式、并行化策略、硬件利用特性,并在资源约束下最终决定系统的可行性。理解这些架构影响对于负责系统设计、资源分配和生产环境性能优化的工程师来说至关重要。

本章采用了一种面向系统的分析框架,阐明了架构抽象与具体实现要求之间的关系。对于每个架构家族,我们系统地检查确定硬件资源需求的计算原语、实现高效算法的组织原则、影响系统可扩展性的内存层次影响,以及架构复杂性与计算开销之间的权衡。

分析方法系统地建立在第三章中建立的神经网络基础之上,通过考察架构专业化如何组织这些操作以利用特定问题的结构,扩展了前向传播、反向传播和基于梯度的优化等核心概念。理解将这些架构范式及其独特的计算特性连接起来的进化关系,从业者发展了进行架构选择、资源规划和复杂部署场景中系统优化的原则性决策所必需的概念工具。

多层感知器:密集模式处理

多层感知器(MLP)代表了在第三章(ch009.xhtml#sec-dl-primer)中引入的全连接架构,现在通过架构选择和系统权衡的视角来审视。MLP 体现了一种归纳偏差:它们假设数据中没有先验结构,允许任何输入与任何输出相关联。这种架构选择通过将所有输入关系视为同等可能的,从而提供了最大灵活性,使 MLP 与专用替代方案相比具有多功能性但计算密集。它们的计算能力通过通用逼近定理(UAT)1(Cybenko 1989;Hornik, Stinchcombe, and White 1989)从理论上得到证实,我们在第三章(ch009.xhtml#sec-dl-primer)中作为脚注遇到了它。该定理指出,具有非线性激活函数的足够大的 MLP 可以在紧凑域上逼近任何连续函数,前提是给定适当的权重和偏差。

多层感知器(MLP)全连接神经网络,其中每个神经元都与相邻层的所有神经元连接,通过通用逼近提供最大灵活性,但代价是高参数计数计算强度

在实践中,UAT(用户接受测试)解释了为什么 MLP(多层感知器)能够在各种任务中取得成功,同时揭示了理论能力与实际实施之间的差距。定理保证了某些MLP 可以逼近任何函数,但并未提供关于所需网络大小或权重确定的指导。这种差距在现实世界的应用中变得至关重要:虽然 MLP 在理论上可以解决任何模式识别问题,但要实现这种能力可能需要不切实际的大型网络或大量的计算。这种理论能力推动了 MLP 在表格数据、推荐系统和输入关系未知的问题中的应用选择,而这些实际限制促使开发了专门架构,这些架构利用数据结构以提高计算效率,如第 4.1 节中详细所述。

当应用于 MNIST 手写数字识别挑战 2 时,MLP 通过将一个28×2828\times 28像素图像转换为数字分类,展示了其计算方法。

模式处理需求

深度学习模型经常遇到任何输入特征都可能影响任何输出的问题,这些关系没有内在的约束。金融市场分析是这一挑战的例子:任何经济指标都可能影响任何市场结果。同样,在自然语言处理中,一个词的意义可能取决于句子中的任何其他词。这些场景需要一种能够学习所有输入特征之间任意关系的建筑模式。

密集模式处理通过几个关键能力来解决这些挑战。首先,它实现了无限制的特征交互,其中每个输出可以依赖于任何输入组合。其次,它支持学习特征重要性,使系统能够确定哪些连接是重要的,而不是依赖于预定的关系。最后,它提供自适应表示,使网络能够根据数据重新塑造其内部表示。

MNIST 数字识别任务说明了这种不确定性:虽然人类可能专注于数字的特定部分(例如‘6’中的环或‘8’中的交叉),但用于分类的像素组合仍然是未确定的。带有装饰线的‘7’可能与‘2’共享像素模式,而手写的变体意味着判别特征可能出现在图像的任何位置。关于特征关系的这种不确定性需要密集处理方法,其中每个像素都可能影响分类决策。

这种无限制连接的要求直接导致 MLPs 的数学基础。

算法结构

MLPs enable unrestricted feature interactions through a direct algorithmic solution: complete connectivity between all nodes. This connectivity requirement manifests through a series of fully-connected layers, where each neuron connects to every neuron in adjacent layers, the “dense” connectivity pattern introduced in 第三章.

这种建筑原则将密集连接模式转换为矩阵乘法操作 3,建立了使 MLPs 在计算上可处理的数学基础。如图图 4.1 所示,每一层通过在第三章深度学习基础中引入的基本操作转换其输入:

𝐡(l)=f(𝐡(l1)𝐖(l)+𝐛(l)) \mathbf{h}^{(l)} = f\big(\mathbf{h}{(l-1)}\mathbf{W} + \mathbf{b}^{(l)}\big)

回想一下,𝐡(l)\mathbf{h}^{(l)} 代表第 ll 层的输出(激活向量),𝐡(l1)\mathbf{h}^{(l-1)} 代表来自前一层的数据输入,𝐖(l)\mathbf{W}^{(l)} 表示第 ll 层的权重矩阵,𝐛(l)\mathbf{b}^{(l)} 表示偏置向量,而 f()f(\cdot) 表示激活函数(例如 ReLU,详见第三章)。这种层级的转换在概念上很简单,但创建的计算模式效率取决于我们如何针对不同的问题结构组织这些操作。

图 4.1:层状变换:多层感知器(MLPs)通过序列矩阵乘法和非线性激活实现密集连接,支持复杂特征交互和输入数据的层次表示。每一层将前一层输入向量转换,生成一个新的向量作为下一层的输入,如文本中的方程所示。来源:(Reagen 等人 2017)。

这些操作的维度揭示了密集模式处理的计算规模:

  • 输入向量:𝐡(0)din\mathbf{h}^{(0)} \in \mathbb{R}^{d_{\text{in}}}(在本公式中作为行向量处理)代表所有潜在输入特征

  • 权重矩阵:𝐖(l)din×dout\mathbf{W}^{(l)} \in \mathbb{R}^{d_{\text{in}} \times d_{\text{out}}}捕捉所有可能的输入输出关系

  • 输出向量:𝐡(l)dout\mathbf{h}^{(l)} \in \mathbb{R}^{d_{\text{out}}}产生转换后的表示

考虑一个由 3 个神经元隐藏层处理的简化 4 像素图像:

输入𝐡(0)=[0.8,0.2,0.9,0.1]\mathbf{h}^{(0)} = [0.8, 0.2, 0.9, 0.1](4 个像素强度)

权重矩阵: 𝐖(1)=[0.50.10.20.30.80.40.20.40.60.70.30.1]\mathbf{W}^{(1)} = \begin{bmatrix} 0.5 & 0.1 & -0.2 \ -0.3 & 0.8 & 0.4 \ 0.2 & -0.4 & 0.6 \ 0.7 & 0.3 & -0.1 \end{bmatrix} (4×3 矩阵)

计算: 𝐳(1)=𝐡(0)𝐖(1)=[0.5×0.8+(0.3)×0.2+0.2×0.9+0.7×0.10.1×0.8+0.8×0.2+(0.4)×0.9+0.3×0.1(0.2)×0.8+0.4×0.2+0.6×0.9+(0.1)×0.1]=[0.650.170.47]\begin{gather} \mathbf{z}^{(1)} = \mathbf{h}{(0)}\mathbf{W} = \begin{bmatrix} 0.5×0.8 + (-0.3)×0.2 + 0.2×0.9 + 0.7×0.1 \ 0.1×0.8 + 0.8×0.2 + (-0.4)×0.9 + 0.3×0.1 \ (-0.2)×0.8 + 0.4×0.2 + 0.6×0.9 + (-0.1)×0.1 \end{bmatrix} \ = \begin{bmatrix} 0.65 \ -0.17 \ 0.47 \end{bmatrix} \end{gather} ReLU 后: 𝐡(1)=[0.65,0,0.47]\mathbf{h}^{(1)} = [0.65, 0, 0.47] (negative values zeroed)

每个隐藏神经元将所有输入像素以不同的权重组合起来,展示了无限制的特征交互。

MNIST 示例展示了这些操作的实用规模:

  • 每个由 784 维输入(28×2828\times 28像素)连接到第一隐藏层中的每个神经元

  • 一个包含 100 个神经元的隐藏层需要一个784×100784\times 100权重矩阵

  • 这个矩阵中的每个权重代表一个可学习的输入像素和隐藏特征之间的关系

这种算法结构解决了任意特征关系的需求,同时创建了计算机系统必须适应的特定计算模式。

架构特性

这种密集连接方法既带来了优势,也带来了权衡。密集连接提供了之前建立的通用逼近能力,但引入了计算冗余。虽然这种理论上的能力使得 MLP 在足够宽的情况下能够模拟任何连续函数,但这种灵活性需要大量参数来学习相对简单的模式。密集连接确保每个输入特征影响每个输出,以最大计算成本换取最大表达能力。

这些权衡促使了复杂的优化技术,在保持模型能力的同时减少计算需求。结构化剪枝可以消除 80-90%的连接,同时最小化精度损失,而量化将精度要求从 32 位降低到 8 位或更低。虽然第十章详细介绍了这些压缩策略,但这里建立的架构基础决定了哪种优化方法对于密集连接模式最为有效,而第十一章探讨了利用规则矩阵操作结构的特定硬件实现。

计算映射

密集矩阵乘法的数学表示映射到系统必须处理的特定计算模式。这种映射从数学抽象到计算现实,正如在第一个实现列表 4.1 中所示。

函数 mlp_layer_matrix 直接反映了数学方程,使用高级矩阵操作(matmul)在单行中表达计算,同时抽象了底层复杂性。这种实现风格是深度学习框架的特征,其中优化的库管理实际的计算。

列表 4.1:这个实现展示了神经网络通过矩阵运算在层之间执行加权求和和激活函数。代码强调了多层感知器中的核心计算模式。

def mlp_layer_matrix(X, W, b):
    # X: input matrix (batch_size × num_inputs)
    # W: weight matrix (num_inputs × num_outputs)
    # b: bias vector (num_outputs)
    H = activation(matmul(X, W) + b)
    # One clean line of math
    return H

要理解这种架构的系统影响,我们必须查看高级框架调用的“内部结构”。从硬件的角度来看,优雅的单行矩阵乘法output = matmul(X, W)实际上是一系列嵌套循环,这些循环揭示了系统真正的计算需求。这种从逻辑模型到物理执行的转换揭示了决定内存访问、并行化策略和硬件利用的关键模式。

第二种实现方式,mlp_layer_compute(如列表 4.2 所示),通过嵌套循环揭示了实际的计算模式。这个版本揭示了当我们计算层的输出时真正发生的事情:我们处理批处理中的每个样本,通过累积所有输入的加权贡献来计算每个输出神经元。

列表 4.2:这个实现通过累积批处理中所有输入的加权贡献来计算每个输出神经元。详细的逐步过程揭示了神经网络中单个层如何处理数据,强调了偏差和加权总和在产生输出中的作用。

def mlp_layer_compute(X, W, b):
    # Process each sample in the batch
    for batch in range(batch_size):
        # Compute each output neuron
        for out in range(num_outputs):
            # Initialize with bias
            Z[batch, out] = b[out]
            # Accumulate weighted inputs
            for in_ in range(num_inputs):
                Z[batch, out] += X[batch, in_] * W[in_, out]

    H = activation(Z)
    return H

这种从数学抽象到具体计算的转换揭示了密集矩阵乘法如何分解为更简单操作的嵌套循环。外层循环处理批处理中的每个样本,中间循环计算每个输出神经元的值。在内层循环中,系统执行重复的乘加操作 4,将每个输入与其对应的权重组合。

在 MNIST 示例中,每个输出神经元需要 784 次乘加操作和至少 1,568 次内存访问(784 次用于输入,784 次用于权重)。虽然实际实现使用 BLAS5 或 cuBLAS 等库进行优化,但这些模式驱动着关键的系统设计决策。加速这些矩阵操作的硬件架构,包括 GPU 张量核心 6 和专门的 AI 加速器,在第十一章中有所介绍。

系统影响

神经网络架构表现出独特的系统级特征,这些特征在系统分析中具有三个核心维度:内存需求、计算需求和数据移动。这个框架使得对算法模式如何影响系统设计决策进行一致分析成为可能,揭示了共性和架构特定的优化。我们在分析每个架构家族时都应用了这个框架。这些系统级考虑因素直接建立在第三章中讨论的神经网络计算模式、内存系统和系统扩展的基础概念之上。

内存需求

对于密集模式处理,内存需求源于存储和访问权重、输入和中间结果。在我们的 MNIST 示例中,将 784 维输入层连接到 100 个神经元的隐藏层需要 78,400 个权重参数。每次正向传递都必须访问所有这些权重,以及输入数据和中间结果。全全连接模式意味着这些访问没有固有的局部性;每个输出都需要每个输入及其对应的权重。

这些内存访问模式通过精心组织数据和使用优化。现代处理器通过专门的方法处理这些密集访问模式:CPU 利用其缓存层次结构进行数据重用,而 GPU 采用专为高带宽访问大参数矩阵设计的内存架构。框架通过高性能矩阵操作(如我们早期分析中所述)抽象这些优化。

计算需求

核心计算围绕嵌套循环中的乘加操作进行。每个输出值需要的乘加次数与输入数量相同。对于 MNIST,每个输出神经元需要 784 次乘加。在隐藏层有 100 个神经元的情况下,单个输入图像需要进行 78,400 次乘加。虽然这些操作很简单,但它们的数量和排列对处理资源提出了特定的要求。

这种计算结构使得现代硬件能够实现特定的优化策略。密集矩阵乘法模式可以在多个处理单元之间并行化,每个单元处理不同的神经元子集。现代硬件加速器通过专门的矩阵乘法单元利用这一点,而软件框架自动将这些操作转换为优化的 BLAS(基本线性代数子程序)调用。CPU 和 GPU 都可以通过仔细地分块计算来利用缓存局部性,以最大化数据重用,尽管它们的具体方法基于其架构优势而有所不同。

数据移动

MLPs 中的全全连接模式产生了显著的数据移动需求。每个乘加操作需要三份数据:一个输入值、一个权重值和运行总和。对于我们的 MNIST 示例层,计算单个输出值需要将 784 个输入和 784 个权重移动到计算发生的任何地方。这种移动模式对每个 100 个输出神经元都重复一次,在内存和计算单元之间产生了大量的数据传输需求。

可预测的数据移动模式使得战略数据调度和传输优化成为可能。不同的架构通过各种机制来应对这一挑战;CPU 使用预取和多级缓存,而 GPU 则采用高带宽内存系统和通过大量线程隐藏延迟。软件框架通过内存管理系统来编排这些数据移动,减少冗余传输并增加数据重用。

对 MLP 计算需求的这种分析揭示了一个关键见解:虽然密集连接提供了通用逼近能力,但当数据表现出固有结构时,它会产生显著的不效率。这种架构假设与数据特征之间的不匹配促使开发出专门的方法,这些方法可以利用结构模式来实现计算上的收益。

CNNs:空间模式处理

MLPs 的计算强度和参数需求在应用于结构化数据时揭示了不匹配。在第 4.1 节中概述的计算复杂性考虑的基础上,这种低效促使开发出利用固有数据结构的架构模式。

卷积神经网络(CNNs)作为解决这一挑战的方案出现(Lecun 等人 1998;Krizhevsky, Sutskever, 和 Hinton 2017a),体现了一种特定的归纳偏差:它们假设空间局部性和平移不变性,即附近的像素相关,模式可以出现在任何地方。这种架构假设使得两个关键创新得以实现,从而提高了空间结构数据的效率。参数共享允许相同的特征检测器应用于不同的空间位置,将参数从数百万减少到数千,同时提高泛化能力。局部连接性将连接限制在空间相邻区域,反映了空间邻近与特征相关性的见解。

卷积神经网络(CNNs) 是一种利用局部连接参数共享通过可学习滤波器构建具有比全连接网络少得多的参数的层次表示的神经网络架构。

这些建筑创新代表了深度学习设计中的权衡:当数据表现出已知结构时,为了实现实际效率的提升而牺牲了 MLPs 的理论通用性。虽然 MLPs 独立处理每个输入元素,但 CNNs 通过利用空间关系来实现计算节省和提升在视觉任务上的性能。

模式处理需求

空间模式处理解决数据点之间的关系依赖于它们的相对位置或邻近性的场景。考虑处理自然图像:像素与其邻居的关系对于检测边缘、纹理和形状很重要。这些局部模式随后以分层的方式组合,形成更复杂的功能:边缘形成形状,形状形成对象,对象形成场景。

这种分层空间模式处理在许多领域都有出现。在计算机视觉中,局部像素模式形成边缘和纹理,这些纹理组合成可识别的对象。语音处理依赖于邻近时间段的模式来识别音素和单词。传感器网络分析物理邻近传感器之间的相关性,以理解环境模式。医学成像依赖于识别组织模式,这些模式指示生物结构。

专注于图像处理来阐述这些原则,如果我们想在图像中检测一只猫,必须识别某些空间模式:耳朵的三角形形状、脸部圆润的轮廓、毛发的纹理。重要的是,这些模式无论出现在图像的哪个位置都保持其意义。猫无论出现在左上角还是右下角,仍然是猫。这表明空间模式处理有两个关键要求:检测局部模式的能力以及识别这些模式而不考虑它们位置的能力 7。图 4.2 展示了卷积神经网络通过分层特征提取实现这一点,简单模式在连续层中组合成越来越复杂的表示。

图片

图 4.2:空间特征提取:卷积神经网络通过在整个输入上应用可学习的过滤器来识别图像中独立于其位置的图案,从而实现鲁棒的对象识别。这些过滤器检测局部特征,并在图像上重复应用这些特征创建平移不变性,即无论图案的位置如何都能识别图案的能力。

这引导我们到卷积神经网络架构(CNN),由 Yann LeCun8 和 Y. LeCun 等人 1989 开创。CNN 通过几个关键创新实现这一点:参数共享 9、局部连接和平移不变性 10。

算法结构

CNN 中的核心操作可以用数学表达式表示为:

这个方程描述了 CNN 如何处理空间数据。 𝐇i,j,k(l)\mathbf{H}^{(l)}{i,j,k} 是在层 ll 的通道 kk 中空间位置 (i,j)(i,j) 的输出。三重求和遍历滤波器维度:(di,dj)(di,dj) 扫描空间滤波器大小,而 cc 覆盖输入通道。 𝐖di,dj,c,k(l)\mathbf{W}^{(l)} 表示滤波器权重,捕捉局部空间模式。与将所有输入连接到输出的 MLPs 不同,CNN 只连接局部空间邻域。

进一步分解符号,(i,j)(i,j) 对应空间位置,kk 指的是输出通道,cc 指的是输入通道,而 (di,dj)(di,dj) 覆盖了局部感受野 11。与 MLPs 的密集矩阵乘法不同,这个操作:

  • 处理局部邻域(通常是 3×33\times 35×55\times 5

  • 在每个空间位置重复使用相同的权重

  • 在其输出中保持空间结构

为了具体说明这一过程,考虑 MNIST 数字分类任务,该任务使用28×2828\times 28灰度图像。每个卷积层应用一组过滤器(例如,3×33\times 3),这些过滤器在图像上滑动,计算局部加权求和。如果我们使用 32 个过滤器并使用填充来保持维度,该层将产生一个28×28×3228\times 28\times 32输出,其中每个空间位置包含其局部邻域的 32 个不同特征测量。这与多层感知器(MLP)方法形成鲜明对比,在处理之前,整个图像被展平成一个 784 维向量。

该算法结构直接实现了空间模式处理的需求,创建了影响系统设计的独特计算模式。与 MLPs 不同,卷积网络保留了空间局部性,利用上述建立的分层特征提取原则。这些特性推动了人工智能加速器中的架构优化,其中数据重用、瓦片化和并行滤波计算等操作对于性能至关重要。

数学背景

群论为理解数据中的对称性和变换提供了数学框架。平移等变性意味着输入的平移会产生相应平移的输出——这是 CNN 能够识别位置无关模式的关键属性。

群论为理解卷积神经网络(CNN)的有效性 12 提供了框架,这为理解数据中的对称性提供了数学框架。平移不变性出现是因为卷积与平移群等变——如果我们移动输入图像,输出特征图也会以相同的量移动。从数学上讲,如果TvT_v表示由向量vv进行的平移,那么一个卷积层ff满足:f(Tvx)=Tvf(x)f(T_v x) = T_v f(x)。这种等变性属性使得 CNN 能够学习跨空间位置的泛化特征。

卷积的选择反映了关于神经网络设计中归纳偏置 13 的更深层原则。通过限制连接到局部邻域并在空间位置间共享参数,CNN 编码了关于视觉数据结构的先验知识:重要的特征是局部的和平移不变的。这种架构约束减少了网络必须搜索的假设空间 14,与全连接网络相比,这使得从有限数据中学习更加高效。

CNN 通过其分层结构自然地实现了层次化表示学习。早期层检测具有小感受野的低级特征,如边缘和纹理,而深层层将这些特征组合成具有更大感受野的越来越复杂的模式。这种层次化组织反映了视觉皮层的结构,使得 CNN 能够构建组合表示:复杂对象被表示为更简单部分的组合。这种数学基础的来源是,堆叠卷积层创建了一个树状依赖结构,其中每个深层神经元依赖于一个指数级大的输入像素集,从而能够有效地表示层次化模式。

建筑特性

与 MLP 相比,参数共享通过在空间位置间重用相同的过滤器大大减少了复杂性。这种共享体现了这样的假设:有用的特征(如边缘或纹理)可以出现在图像的任何地方,使得相同的特征检测器在所有空间位置都有价值。

CNNs 的架构效率使得可以通过专用技术进行进一步优化。深度可分离卷积将标准卷积分解为深度和点操作,对于典型的移动部署,计算量减少了 8-9 倍。通道剪枝根据重要性指标消除整个特征图,在小于 1%的精度损失下实现了 40-50%的 FLOPs 减少。这些优化策略建立在空间局部性原理之上,第十章探讨了特定硬件的实现,第十一章详细说明了现代处理器如何利用卷积固有的数据重用模式。

如图 4.3 所示,卷积操作涉及在输入图像上滑动一个小滤波器以生成特征图 15。此过程捕捉局部结构同时保持平移不变性。对于卷积网络的交互式视觉探索,CNN Explainer项目提供了一个有见地的演示,展示了这些网络是如何构建的。

图片

图 4.3:卷积操作通过使用在图像上滑动的滤波器进行局部特征提取来处理输入数据,以识别位置无关的模式。

计算映射

卷积操作创建的计算模式与 MLP 密集矩阵乘法不同。这种从数学运算到实现细节的转换揭示了独特的计算特性。

第一种实现,conv_layer_spatial(如列表 4.3 所示),使用高级卷积操作简洁地表达计算。这在深度学习框架中很典型,其中优化的库处理底层复杂性。

列表 4.3:这种分层方法通过使用结合核和偏置的卷积操作进行特征提取来处理输入数据,然后在应用激活函数之前。

def conv_layer_spatial(input, kernel, bias):
    output = convolution(input, kernel) + bias
    return activation(output)

逻辑模型与物理执行之间的桥梁对于理解 CNN 系统需求至关重要。虽然高级卷积操作看起来像是一个简单的滑动窗口计算,但硬件必须编排复杂的数据移动模式并利用空间局部性以提高效率。

第二种实现,conv_layer_compute(见列表 4.4),揭示了实际的计算模式:嵌套循环处理每个空间位置,将相同的滤波器权重应用于输入的局部区域。这七个嵌套循环揭示了卷积计算结构的真正本质以及它所创造的优化机会。

列表 4.4:嵌套循环:卷积层通过多个嵌套循环处理批量图像、空间维度、输出通道、核窗口和输入特征,揭示了卷积操作的详细计算结构。

def conv_layer_compute(input, kernel, bias):
    # Loop 1: Process each image in batch
    for image in range(batch_size):

        # Loop 2&3: Move across image spatially
        for y in range(height):
            for x in range(width):

                # Loop 4: Compute each output feature
                for out_channel in range(num_output_channels):
                    result = bias[out_channel]

                    # Loop 5&6: Move across kernel window
                    for ky in range(kernel_height):
                        for kx in range(kernel_width):

                            # Loop 7: Process each input feature
                            for in_channel in range(
                                num_input_channels
                            ):
                                # Get input value from correct window position
                                in_y = y + ky
                                in_x = x + kx
                                # Perform multiply-accumulate operation
                                result += (
                                    input[
                                        image, in_y, in_x, in_channel
                                    ]
                                    * kernel[
                                        ky,
                                        kx,
                                        in_channel,
                                        out_channel,
                                    ]
                                )

                    # Store result for this output position
                    output[image, y, x, out_channel] = result

七层嵌套循环揭示了计算的各个方面:

  • 外层循环(1-3)管理位置:哪个图像以及图像中的位置

  • 中间循环(4)处理输出特征:计算不同的学习模式

  • 内层循环(5-7)执行实际的卷积操作:滑动核窗口

详细考察此过程,外两层循环(for yfor x)遍历输出特征图中的每个空间位置(对于 MNIST 示例,这遍历了所有28×2828\times 28位置)。在每个位置,计算每个输出通道的值(for k循环),代表不同的学习特征或模式——32 个不同的特征检测器。

内层三个循环在每个位置实现实际的卷积操作。对于每个输出值,我们处理输入的局部3×33\times 3区域(dydx循环)以及所有输入通道(for c循环)。这产生了一个滑动窗口效果,其中相同的3×33\times 3滤波器在图像上移动,执行滤波器权重和局部输入值之间的乘加操作。与 MLP 的全局连接性不同,这种局部处理模式意味着每个输出值只依赖于输入的小邻域。

对于我们的 MNIST 示例,使用3×33\times 3滤波器和 32 个输出通道,每个输出位置只需要每个输入通道 9 次乘加操作,而我们的 MLP 层需要 784 次操作。这个操作必须对每个空间位置(28×28)(28\times 28)和每个输出通道(32)重复进行。

尽管每个输出使用的操作较少,但空间结构创建了不同的内存访问和计算模式,系统必须处理。这些模式影响系统设计,既带来了优化挑战,也带来了优化机会。

系统影响

CNN 在三个分析维度上显示出与 MLP 密集连接显著不同的系统级模式。

内存需求

对于卷积层,内存需求主要集中在两个关键组件上:滤波器权重和特征图。与需要存储完整连接矩阵的 MLP 不同,CNN 使用小型、可重用的滤波器。对于一个典型的 CNN 处理 224×224 的 ImageNet 图像,一个包含 64 个3×33\times 3大小滤波器的卷积层只需要存储 576 个权重参数(3×3×64)(3\times 3\times 64),这比等效的全连接处理所需的数百万个权重少得多。系统必须存储所有空间位置的特征图,从而产生不同的内存需求。一个 224×224 的输入和 64 个输出通道需要存储 320 万个激活值(224×224×64)。

这些内存访问模式表明,通过权重重用和仔细的特征图管理可以实现优化的机会。处理器通过缓存用于跨位置重用的滤波器权重来优化这些空间模式,同时流式传输特征图数据。框架通过专门的内存布局实现空间优化,这些布局能够实现滤波器重用和特征图访问的空间局部性。CPU 和 GPU 采用不同的方法来处理这个问题。CPU 使用其缓存层次结构来保持常用滤波器的驻留,而 GPU 则采用专为图像处理的空间访问模式设计的专用内存架构。这些专用处理器的详细架构设计原则在第十一章中有所介绍。

计算需求

CNNs 的核心计算涉及在空间位置上反复应用小型滤波器。每个输出值都需要在滤波器区域内进行局部乘累加操作。对于使用3×33\times 3滤波器和 64 个输出通道的 ImageNet 处理,计算一个空间位置涉及 576 次乘累加(3×3×64)(3\times 3\times 64),并且这必须在所有 50,176 个空间位置(224×224)上重复进行。虽然每个单独的计算涉及的运算比 MLP 层少,但由于空间重复,总的计算负载仍然很大。

这种计算模式比 MLPs 提供了不同的优化机会。卷积操作的规则、重复性质通过结构化并行化实现了高效的硬件利用。现代处理器以各种方式利用这种模式。CPU 利用 SIMD 指令 16 同时处理多个过滤器位置,而 GPU 在空间位置和通道上并行化计算。包括专门的卷积优化和稀疏模式在内的进一步降低这些计算需求的模型优化技术,在第十章中详细说明。

数据移动

卷积的滑动窗口模式创建了一个独特的数据移动配置文件。与 MLPs 中每个权重在每个前向传递中只使用一次不同,CNN 的过滤器权重在过滤器在空间位置上滑动时被多次重用。对于 ImageNet 处理,每个3×33\times 3过滤器权重被重用 50,176 次(在 224×224 特征图中的每个位置都使用一次)。这带来了不同的挑战:系统必须在保持过滤器权重稳定的同时,将输入特征流经计算单元。

可预测的空间访问模式使得数据移动优化成为可能。不同的架构通过专门的机制来处理这种移动模式。CPU 在流经输入特征的同时,将频繁使用的过滤器权重保持在缓存中。GPU 采用针对空间局部性优化的内存架构,并为高效的滑动窗口操作提供硬件支持。深度学习框架通过组织计算来最大化过滤器权重的重用并最小化冗余的特征图访问,从而协调这些移动。

RNNs:序列模式处理

卷积神经网络通过利用空间局部性实现了效率提升,但当模式依赖于时间顺序而不是空间邻近性时,其架构假设就会失败。虽然 CNN 在通过共享特征检测器识别数据中的“什么”方面表现出色,但它们无法捕捉“何时”事件发生或它们随时间如何相关。这种限制在诸如自然语言处理等领域表现出来,其中词义取决于句子上下文,以及在时间序列分析中,未来的值依赖于历史模式。

序列数据提出了与空间处理不同的挑战:模式可以跨越任意的时间距离,使得固定大小的核无效。虽然空间卷积利用了邻近像素通常相关的原理,但时间关系运作方式不同。重要的连接可能跨越数百或数千个时间步,与邻近性没有相关性。传统的前馈架构,包括 CNN,独立处理每个输入,无法维持这些长距离依赖所需的时序上下文。

循环神经网络通过体现时间归纳偏差来解决这个问题(Elman 1990;Hochreiter 和 Schmidhuber 1997):它们假设序列依赖性,即信息的顺序很重要,过去影响现在。这个架构假设指导了将记忆作为计算模型组件的引入。RNNs 不是独立处理输入,而是维持一个内部状态,将信息从先前的时间步传播出去,使网络能够根据历史上下文条件化其当前输出。这种架构体现了一种另一种权衡:虽然 CNN 牺牲了理论上的通用性以换取空间效率,但 RNN 引入了计算依赖性,这挑战了并行执行,以换取时序处理能力。

循环神经网络 (RNNs) 是一种序列神经网络架构,通过循环连接在时间步长中维持内部记忆状态,以序列计算为代价实现可变长度序列处理

覆盖说明

本节涵盖了 RNNs,强调了它们对序列处理的核心贡献以及影响现代注意力机制的架构原则。虽然 RNNs 引入了关键概念——记忆状态、时序依赖和序列计算——但当代实践越来越倾向于基于注意力的架构进行序列建模。我们专注于基础原则而不是广泛的实现变体,对注意力机制和 Transformer(第 4.5 节)进行了深入探讨,这些机制在很大程度上已经取代了 RNNs 在生产系统中的应用,同时直接基于循环架构的见解。

模式处理需求

序列模式处理解决当前输入解释依赖于先前信息的情况。在自然语言处理中,词义往往严重依赖于句子中的先前单词。上下文决定了解释,正如根据周围术语的不同,单词的多种含义所证明的那样。同样,在语音识别中,音素解释依赖于周围的声音,而金融预测需要理解历史数据模式。

序列处理中的挑战在于随着时间的推移维护和更新相关上下文。人类的文本理解并不是从每个单词开始重新启动;相反,随着新信息的处理,一个持续的理解在不断发展。同样,时间序列数据处理会遇到跨越不同时间尺度的模式,从即时依赖关系到长期趋势。这需要一种能够随着时间的推移保持状态并根据新输入更新状态的架构。

这些需求转化为特定的架构要求:系统必须维护内部状态以捕捉时间上下文,根据新输入更新此状态,并学习哪些历史信息对当前预测是相关的。与处理固定大小输入的 MLPs 和 CNNs 不同,序列处理必须适应可变长度的序列,同时保持计算效率。这些需求最终导致了循环神经网络(RNN)架构的出现。

算法结构

RNNs 通过循环连接处理序列处理,使其与 MLPs 和 CNNs 区分开来。RNNs 不仅仅是将输入映射到输出,而是在每个时间步更新内部状态,创建一种记忆机制,将信息向前传播。这种时间依赖性建模能力最初由 Elman (1990) 探索,他展示了 RNN 识别时间依赖数据结构的能力。基本的 RNNs 受到梯度消失问题 17 的困扰,限制了它们学习长期依赖的能力。

基本 RNN 的核心操作可以用数学公式表示为:𝐡t=f(𝐖hh𝐡t1+𝐖xh𝐱t+𝐛h) \mathbf{h}t = f(\mathbf{W}\mathbf{h}{t-1} + \mathbf{W}\mathbf{x}_t + \mathbf{b}_h) 其中 𝐡t\mathbf{h}t 表示时间 tt 的隐藏状态,𝐱t\mathbf{x}t 表示时间 tt 的输入,𝐖hh\mathbf{W} 包含循环权重,而 𝐖xh\mathbf{W} 包含输入权重,如图图 4.4 中的展开网络结构所示。

在词序列处理中,每个词可以表示为一个 100 维向量(𝐱t\mathbf{x}_t),具有 128 维的隐藏状态(𝐡t\mathbf{h}_t)。在每一个时间步,网络将当前输入与其先前状态结合以更新其序列理解,建立一个能够捕捉时间步之间模式的记忆机制。

这种循环结构通过保持内部状态并向前传播信息来满足序列处理需求。RNNs 不是独立处理所有输入,而是通过迭代更新一个基于当前输入和先前隐藏状态的隐藏状态来处理序列数据,如图图 4.4 所示。这种架构适用于包括语言建模、语音识别和时间序列预测在内的任务。

RNN 实现了一种递归算法,其中每个时间步的函数调用依赖于前一个调用的结果。类似于通过调用栈维护状态的递归函数,RNN 通过其隐藏向量来维护状态。数学公式𝐡t=f(𝐡t1,𝐱t)\mathbf{h}t = f(\mathbf{h}, \mathbf{x}_t)直接对应于递归函数定义,其中f(n) = g(f(n-1), input(n))。这种对应关系解释了 RNN 处理可变长度序列的能力:正如递归算法通过递归应用相同的函数来处理任意长度的列表一样,RNN 通过应用相同的循环计算来处理任意长度的序列。

效率和优化

顺序处理会创建计算瓶颈,但为内存使用提供了独特的效率特性。RNN 在隐藏状态存储方面实现恒定的内存开销,无论序列长度如何,这使得它们在处理长序列时极为内存高效。而 Transformers 需要 O(n²)的内存来处理长度为 n 的序列,RNN 则保持固定的内存使用,使得在适度硬件上处理数千步长的序列成为可能。

隐藏到隐藏连接的结构化剪枝可以实现 10 倍的速度提升,同时保持序列建模能力。循环权重矩阵WhhW_{hh}通常占大隐藏状态参数数量的主导地位,但基于幅度的剪枝表明,其中 70-80%的连接对时间依赖性的贡献很小。块结构化剪枝在保持计算效率的同时,实现了显著的模型压缩。

顺序操作会累积量化误差,需要仔细放置量化点和进行梯度缩放以实现稳定的低精度训练。与量化误差保持局部化的前馈网络不同,RNN 误差会随时间传播,使得 INT8 量化更具挑战性。需要采用每时间步量化方案和仔细处理隐藏状态精度,以在量化 RNN 部署中保持准确性。

图片

图 4.4:循环神经网络展开:RNN 通过维护一个包含先前时间步信息的状态来处理顺序数据,如图所示。展开的结构明确表示了由循环权重建模的时间依赖性,使网络能够学习可变长度序列中的模式。

计算映射

RNN 顺序处理创建的计算模式与 MLPs 和 CNNs 都不同,扩展了第 4.1 节中讨论的架构多样性。这种实现方法表明时间依赖性转化为特定的计算需求。

如列表 4.5 所示,rnn_layer_step函数展示了在深度学习框架中找到的高级矩阵运算的使用。它处理单个时间步,接受当前输入x_t和前一个隐藏状态h_prev,以及两个权重矩阵:W_hh用于隐藏到隐藏连接,W_xh用于输入到隐藏连接。通过矩阵乘法运算(matmul),它将先前状态和当前输入合并以生成下一个隐藏状态。

列表 4.5:RNN 层步骤:神经网络通过整合当前输入和过去状态的转换来处理顺序数据。

def rnn_layer_step(x_t, h_prev, W_hh, W_xh, b):
    # x_t: input at time t (batch_size × input_dim)
    # h_prev: previous hidden state (batch_size × hidden_dim)
    # W_hh: recurrent weights (hidden_dim × hidden_dim)
    # W_xh: input weights (input_dim × hidden_dim)
    h_t = activation(matmul(h_prev, W_hh) + matmul(x_t, W_xh) + b)
    return h_t

理解 RNN 系统的影响需要检查优雅的数学抽象如何转化为硬件执行模式。简单的递归关系h_t = tanh(W_hh h_{t-1} + W_xh x_t + b)隐藏了一个创建独特挑战的计算结构:防止并行化的顺序依赖性、与前馈网络不同的内存访问模式,以及影响系统设计的状态管理需求。

详细实现(列表 4.6)揭示了数学抽象背后的计算现实。嵌套循环结构揭示了顺序处理如何在系统优化中创造限制和机会。

列表 4.6:循环层计算:通过涉及先前状态和当前输入的顺序转换来计算每个时间步的隐藏状态。

def rnn_layer_compute(x_t, h_prev, W_hh, W_xh, b):
    # Initialize next hidden state
    h_t = np.zeros_like(h_prev)

    # Loop 1: Process each sequence in the batch
    for batch in range(batch_size):
        # Loop 2: Compute recurrent contribution
        # (h_prev × W_hh)
        for i in range(hidden_dim):
            for j in range(hidden_dim):
                h_t[batch, i] += h_prev[batch, j] * W_hh[j, i]

        # Loop 3: Compute input contribution (x_t × W_xh)
        for i in range(hidden_dim):
            for j in range(input_dim):
                h_t[batch, i] += x_t[batch, j] * W_xh[j, i]

        # Loop 4: Add bias and apply activation
        for i in range(hidden_dim):
            h_t[batch, i] = activation(h_t[batch, i] + b[i])

    return h_t

rnn_layer_compute中的嵌套循环揭示了 RNNs 的核心计算模式(参见列表 4.6)。循环 1 独立处理批次中的每个序列,从而允许批处理级别的并行性。在每个批次项中,循环 2 通过循环权重W_hh计算前一个隐藏状态如何影响下一个状态。然后,循环 3 通过输入权重W_xh将当前输入的新信息纳入。最后,循环 4 添加偏差并应用激活函数以产生新的隐藏状态。

对于输入维度为 100 和隐藏状态维度为 128 的序列处理任务,每个时间步需要两次矩阵乘法:一次是用于循环连接的128×128128\times 128,另一次是用于输入投影的100×128100\times 128。虽然单个时间步可以在批处理元素之间并行处理,但时间步本身必须按顺序处理。这创建了一种独特的计算模式,系统必须处理。

系统影响

在为 MLPs 建立的解析框架之后,RNN 在内存需求、计算需求和数据处理方面表现出独特的模式,与密集和空间处理架构有显著差异。

内存需求

RNN 需要存储两组权重(输入到隐藏和隐藏到隐藏)以及隐藏状态。对于输入维度为 100 和隐藏状态维度为 128 的例子,这需要存储 12,800 个用于输入投影的权重(100×128)(100\times 128)和 16,384 个用于循环连接的权重(128×128)(128\times 128)。与 CNN 中权重在空间位置间重用不同,RNN 的权重在时间步间重用。系统必须维护隐藏状态,这是内存使用和访问模式的关键因素。

这些内存访问模式与 MLPs 和 CNNs 不同。处理器通过在缓存中保持权重矩阵并流过时间元素来优化顺序模式。框架通过批处理序列和管理时间步之间的隐藏状态存储来优化时间处理。CPU 和 GPU 通过不同的策略来处理这个问题;CPU 利用其缓存层次结构来实现权重重用;同时,GPU 使用专为在顺序操作中维护状态而设计的专用内存架构。关于顺序处理的专用硬件优化,包括内存银行和流水线架构,在第十一章中详细说明。

计算需求

RNN 的核心计算涉及在时间步内反复应用权重矩阵。对于每个时间步,我们执行两次矩阵乘法:一次是与输入权重相乘,另一次是与循环权重相乘。在我们的例子中,处理单个时间步需要 12,800 次乘加操作用于输入投影(100×128)(100\times 128)和 16,384 次乘加操作用于循环连接(128×128)(128\times 128)

这种计算模式在关键方面与 MLP 和 CNN 不同:虽然我们可以在批处理元素之间并行化,但由于顺序依赖性,我们不能在时间步之间并行化。每个时间步必须在开始计算之前等待前一个步骤的隐藏状态。这就在算法的固有顺序性质和现代硬件中并行执行的需求之间产生了紧张关系。

处理器通过专门的方法解决顺序约束问题。CPU 在时间步内对操作进行流水线处理,同时保持时间顺序。GPU 将多个序列批量处理在一起,以维持高吞吐量,尽管存在顺序依赖性。软件框架通过序列打包和跨多个时间步展开计算等技术进一步优化,在可能的情况下,使并行处理资源的利用更加高效,同时尊重循环架构中固有的顺序约束。

数据移动

RNN 中的顺序处理创建了一种独特的数据移动模式,这种模式与 MLP 和 CNN 都不同。虽然 MLP 在每次前向传递中只需要每个权重一次,而 CNN 在空间位置上重复使用权重,但 RNN 在时间步内重复使用其权重,同时需要仔细管理隐藏状态数据流。

对于我们的例子,具有 128 维隐藏状态,每个时间步必须:加载前一个隐藏状态(128 个值),访问两个权重矩阵(来自输入和循环连接的总权重为 29,184),并存储新的隐藏状态(128 个值)。这种模式在序列的每个元素上重复。与 CNN 不同,我们无法根据空间模式预测和预取数据,RNN 的数据移动是由时间依赖性驱动的。

不同的架构通过专门的机制处理这种顺序数据移动。CPU 在通过序列元素并管理隐藏状态更新时,在缓存中维护权重矩阵。GPU 采用优化了的状态信息维护的内存架构,在并行处理多个序列的同时,处理顺序操作。深度学习框架通过管理时间步之间的数据传输和优化批量操作来协调这些移动。

虽然 RNN 为顺序处理建立了概念,但它们的架构约束创造了瓶颈:顺序依赖性阻止了时间步之间的并行化,固定容量的隐藏状态为长序列创造了信息瓶颈,并且当重要关系跨越遥远位置时,时间邻近性假设就会崩溃。这些限制促使注意力机制的发展,通过动态、内容依赖的连接消除顺序处理约束。下一节将探讨注意力机制如何解决这些 RNN 限制,同时引入新的计算挑战。这种广泛的处理反映了注意力机制在现代机器学习系统中的主导地位以及它们对顺序模式处理的根本性重新构想。

注意力机制:动态模式处理

循环神经网络成功地引入了记忆来处理顺序依赖性,但它们的固定顺序处理创造了限制。RNN 按时间顺序处理信息,这使得难以捕捉远距离元素之间的关系,并且无法在序列位置之间并行化计算。更重要的是,RNN 假设时间邻近性与重要性相关——即附近的单词或时间步比远处的更相关。这种假设在许多实际场景中都会崩溃。

考虑以下句子:“The cat, which was sitting by the window overlooking the garden, was sleeping.” 在这里,“cat”和“sleeping”被多个间隔词分开,但它们构成了核心的主谓关系。RNN 架构会按顺序处理所有间隔元素,可能会在它们的固定容量隐藏状态中丢失这个关键联系。这种限制揭示了需要能够根据内容而不是位置识别和加权关系的架构。

注意力机制通过引入根据输入内容自适应的动态连接模式,成为解决这种架构约束的解决方案(Bahdanau, Cho, and Bengio 2014)。与按预定顺序处理具有固定关系的元素不同,注意力机制计算所有元素对之间的相关性,并相应地加权它们的交互。这代表了一种从结构约束到学习依赖的数据处理模式的转变。

注意力机制是计算序列元素之间内容相关关系的神经网络组件,通过查询-键-值操作,实现选择性关注相关信息和长距离依赖,而不受位置约束。

虽然注意力机制最初被用作循环架构中的组件,但 Transformer 架构(Vaswani 等人 2017)证明了仅注意力本身就可以完全取代顺序处理,创造了一种新的架构范式。

Transformer是基于注意力机制的神经网络架构,使用多头自注意力位置编码来并行处理序列,而不是顺序处理,从而实现大规模的效率和推理。

模式处理需求

动态模式处理解决的是元素之间的关系不是由架构固定,而是从内容中产生的场景。语言翻译就是这种挑战的例证:在翻译“河边的银行”时,理解“银行”需要关注“河”,但在“银行批准了贷款”中,重要的关系是与“批准”和“贷款”。与按顺序处理信息的 RNN 或使用固定空间模式的 CNN 不同,需要一个能够动态确定哪些关系重要的架构。

超越语言,这种对动态处理的需求出现在许多领域。在蛋白质结构预测中,氨基酸之间的相互作用取决于它们的化学性质和空间排列。在图分析中,节点关系根据图结构和节点特征而变化。在文档分析中,不同部分之间的连接取决于语义内容,而不仅仅是邻近性。

综合这些需求,动态处理要求我们的处理架构具备特定的能力。系统必须计算所有元素对之间的关系,根据内容权衡这些关系,并使用这些权重来选择性地组合信息。与具有固定连接模式的前一代架构不同,动态处理需要根据输入本身修改其计算图的能力。这些能力自然引导我们到注意力机制,它是以下章节中详细探讨的 Transformer 架构的基础。图 4.5 显示了注意力如何实现这种动态信息流。

图片

图 4.5:注意力权重:Transformer 的注意力机制动态评估子词之间的关系,为序列中更相关的连接分配更高的权重,使模型能够关注关键信息。这些学习到的权重,以连接强度可视化,揭示了模型在处理语言时如何关注输入的不同部分。

基本注意力机制

注意力机制代表了从固定架构连接到序列元素之间动态、基于内容的交互的转变。本节探讨了注意力的数学基础,探讨了查询-键-值操作如何实现灵活的模式处理。我们分析了计算需求、内存访问模式和系统影响,这些使得注意力既强大又计算密集。

算法结构

注意力机制通过根据其内容计算元素之间的加权连接,形成了动态模式处理的基础(Bahdanau, Cho, 和 Bengio 2014)。这种方法处理的关系不是由架构固定的,而是从数据本身中产生的。注意力机制的核心是一个可以用数学表达式表示的操作:

注意力(𝐐,𝐊,𝐕)=softmax(𝐐𝐊Tdk)𝐕 \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax} \left(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V}

这个方程展示了缩放点积注意力。 𝐐\mathbf{Q}(查询)和 𝐊\mathbf{K}(键)通过矩阵乘法计算相似度分数,除以 dk\sqrt{d_k}(键维度)以实现数值稳定性,然后通过 softmax18 进行归一化以获得注意力权重。这些权重应用于 𝐕\mathbf{V}(值)以产生输出。结果是加权组合,其中每个位置根据内容相似性从所有相关位置接收信息。

在这个方程中,𝐐\mathbf{Q}(查询)、𝐊\mathbf{K}(键)和𝐕\mathbf{V}(值)19 代表输入的学习投影。对于一个长度为NN且维度为dd的序列,这个操作创建了一个N×NN\times N注意力矩阵,确定每个位置应该如何关注所有其他位置。

注意力操作涉及几个关键步骤。首先,它为序列中的每个位置计算查询、键和值投影。接下来,它通过查询-键交互生成一个N×NN\times N注意力矩阵。这些步骤在图 4.6 中得到了说明。最后,它使用这些注意力权重来组合值向量,生成输出。

图片

图 4.6:查询-键-值交互:Transformer 注意力机制通过计算查询、键和值之间的关系,动态地权衡输入序列元素,使模型能够关注相关信息。这些投影有助于创建一个注意力矩阵,该矩阵决定了每个值向量对最终输出的贡献,有效地捕捉序列中的上下文依赖关系。来源:Transformer 解释器.

关键在于,与之前架构中发现的固定权重矩阵不同,如图 4.7 所示,这些注意力权重是针对每个输入动态计算的。这使得模型能够根据动态内容调整其处理方式。

图片

图 4.7:动态注意力权重:Transformer 模型根据查询、键和值向量之间的关系动态计算注意力权重,使模型能够在每个处理步骤中关注输入序列的相关部分。这与固定权重架构形成对比,并允许自适应模式处理以处理变长输入和复杂依赖关系。来源:Transformer 解释器.

计算映射

注意力机制创建的计算模式与之前的架构有显著差异。在 列表 4.7 中展示的实现方法表明,动态连接性转化为特定的计算需求。

列表 4.7:注意力机制:Transformer 模型通过查询-键-值交互来计算注意力,从而在输入序列上实现动态关注,以改善语言理解。

def attention_layer_matrix(Q, K, V):
    # Q, K, V: (batch_size × seq_len × d_model)
    scores = matmul(Q, K.transpose(-2, -1)) / sqrt(
        d_k
    )  # Compute attention scores
    weights = softmax(scores)  # Normalize scores
    output = matmul(weights, V)  # Combine values
    return output


# Core computational pattern
def attention_layer_compute(Q, K, V):
    # Initialize outputs
    scores = np.zeros((batch_size, seq_len, seq_len))
    outputs = np.zeros_like(V)

    # Loop 1: Process each sequence in batch
    for b in range(batch_size):
        # Loop 2: Compute attention for each query position
        for i in range(seq_len):
            # Loop 3: Compare with each key position
            for j in range(seq_len):
                # Compute attention score
                for d in range(d_model):
                    scores[b, i, j] += Q[b, i, d] * K[b, j, d]
                scores[b, i, j] /= sqrt(d_k)

        # Apply softmax to scores
        for i in range(seq_len):
            scores[b, i] = softmax(scores[b, i])

        # Loop 4: Combine values using attention weights
        for i in range(seq_len):
            for j in range(seq_len):
                for d in range(d_model):
                    outputs[b, i, d] += scores[b, i, j] * V[b, j, d]

    return outputs

将注意力数学上的优雅性转换为硬件执行,揭示了动态连接性的计算成本。虽然注意力方程 Attention(Q,K,V) = softmax(QK^T/√d_k)V 看起来是一个简单的矩阵运算,但物理实现需要协调成千上万的成对计算,这比之前的架构产生了不同的系统需求。

attention_layer_compute 中的嵌套循环揭示了注意力的真实计算特征(参见 列表 4.7)。第一个循环独立处理批处理中的每个序列。第二个和第三个循环计算所有位置对之间的注意力分数,形成了使注意力既强大又计算密集的二次计算模式。第四个循环使用这些注意力权重来组合所有位置的价值,完成定义注意力机制的动态连接模式。

系统影响

注意力机制通过其动态连接性需求展现出与之前架构不同的系统级模式。

内存需求

在内存需求方面,注意力机制需要存储注意力权重、键-查询-值投影和中间特征表示。对于一个长度小于 <semantics><mi>N</mi><annotation encoding="application/x-tex">N</annotation></semantics> 的序列和维度 d,每个注意力层必须为批处理中的每个序列存储一个 <semantics><mrow><mi>N</mi><mo>×</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">N\times N</annotation></semantics> 的注意力权重矩阵,三组投影矩阵用于查询、键和值(每个大小为 <semantics><mrow><mi>d</mi><mo>×</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">d\times d</annotation></semantics>),以及大小为 <semantics><mrow><mi>N</mi><mo>×</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">N\times d</annotation></semantics> 的输入和输出特征图。为每个输入动态生成注意力权重创建了一个内存访问模式,其中中间注意力权重成为内存使用的一个重要因素。

计算需求

注意力机制中的计算需求集中在两个主要阶段:生成注意力权重并将它们应用于值。对于每个注意力层,系统在多个计算阶段执行许多乘加操作。仅查询-键交互就需要N×N×dN\times N\times d次乘加操作,应用注意力权重到值也需要相同数量的操作。还需要额外的计算来处理投影矩阵和 softmax 操作。这种计算模式与之前的架构不同,因为它与序列长度呈二次关系,并且需要对每个输入进行新鲜的计算。

数据移动

注意力机制中的数据移动提出了独特的挑战。每个注意力操作都涉及对每个位置的查询、键和值向量进行投影和移动,存储和访问完整的注意力权重矩阵,并在加权组合阶段协调值向量的移动。这创造了一种数据移动模式,其中中间注意力权重成为系统带宽需求的主要因素。与 CNN 的更可预测的访问模式或 RNN 的顺序访问不同,注意力操作需要频繁地在内存层次结构中移动动态计算的权重。

注意力机制在内存、计算和数据移动方面的独特特性对系统设计和优化具有重大影响,为更高级架构如传输器的开发奠定了基础。

传输器:仅注意力架构

当注意力机制引入了动态模式处理的概念时,它们最初被作为现有架构的补充应用,尤其是在序列到序列任务中用于循环神经网络(RNNs)。这种混合方法仍然受到循环架构的基本限制:序列处理约束阻止了有效的并行化,以及处理非常长序列的困难。突破性的洞察是认识到,仅注意力机制本身就可以完全取代卷积和循环处理。

Vaswani 等人在里程碑式的论文 "Attention is All You Need"20 中介绍了 Transformers,该论文发表于 2017。该论文体现了一种革命性的归纳偏差:它们假设没有先验结构,但允许模型根据内容动态地学习所有成对关系。这种架构假设代表了在 第 4.1 节 中详细阐述的架构演变的最终成果,通过消除所有结构约束,以纯内容依赖处理为代价。Transformers 不是向 RNNs 添加注意力,而是围绕注意力机制构建了整个架构,引入自注意力作为主要的计算模式。这一架构决策以 CNNs 的参数效率和 RNNs 的序列一致性为代价,换取了最大的灵活性和并行性。

这代表了我们架构旅程的最终一步:从连接一切到一切的 MLPs,到连接局部的 CNNs,再到按顺序连接的 RNNs,最后到基于学习到的内容关系动态连接的 Transformers。每一次演变都牺牲了约束以换取能力,Transformers 在 第 4.1 节 中确立的计算成本下实现了最大的表达能力。

算法结构

Transformers 的关键创新在于它们使用了自注意力层。在 Transformers 所使用的自注意力机制中,查询(Query)、键(Key)和值(Value)向量都来自相同的输入序列。这与早期注意力机制的关键区别在于,查询可能来自解码器,而键和值来自编码器。通过使所有组件都自参照,自注意力允许模型在编码每个位置时,根据内容动态地权衡同一序列中不同位置的重要性。例如,在处理句子“动物没有过街,因为它太宽了”时,自注意力允许模型将“它”与“街道”联系起来,捕捉到传统序列模型难以处理的长期依赖关系。

自注意力机制可以用类似于基本注意力机制的形式进行数学表达:SelfAttention(𝐗)=softmax(𝐗𝐖𝐐(𝐗𝐖𝐊)Tdk)𝐗𝐖𝐕 \text{SelfAttention}(\mathbf{X}) = \text{softmax} \left(\frac{\mathbf{XW_Q}(\mathbf{XW_K})^T}{\sqrt{d_k}}\right)\mathbf{XW_V}

在这里,𝐗\mathbf{X} 是输入序列,而 𝐖𝐐\mathbf{W_Q}𝐖𝐊\mathbf{W_K}𝐖𝐕\mathbf{W_V} 分别是用于查询、键和值的学到的权重矩阵。这种公式突出了自注意力如何从相同的输入中推导出所有组件,从而创建一个动态的、内容相关的处理模式。

建立在这样一个基础上,Transformers 使用多头注意力,通过并行运行多个注意力函数来扩展自注意力机制。每个“头”都涉及一组独立的查询/键/值投影,可以关注输入的不同方面,使模型能够同时关注来自不同表示子空间的信息。这种多头结构为模型提供了更丰富的表示能力,使其能够同时捕捉数据中的各种类型的关系。

多头注意力的数学公式为:MultiHead(𝐐,𝐊,𝐕)=Concat(head1,,headh)𝐖O \text{MultiHead}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)\mathbf{W}^O 其中每个注意力头是按照以下方式计算的:headi=Attention(𝐐𝐖iQ,𝐊𝐖iK,𝐕𝐖iV) \text{head}_i = \text{Attention}(\mathbf{Q}\mathbf{W}_i^Q, \mathbf{K}\mathbf{W}_i^K, \mathbf{V}\mathbf{W}_i^V)

在自注意力和多头注意力中,一个关键组件是缩放因子 dk\sqrt{d_k},它具有重要的数学作用。这个因子防止点积变得过大,这会将 softmax 函数推向梯度极小的区域。对于维度为 dkd_k 的查询和键,它们的点积具有方差 dkd_k,因此除以 dk\sqrt{d_k} 将方差归一化到 1,保持稳定的梯度并实现有效的学习。21

除了数学机制之外,注意力机制可以从概念上理解为实现了内容可寻址内存系统的一种形式。类似于基于键匹配检索值的哈希表,注意力计算查询与所有可用键之间的相似度,然后检索相应值的加权组合。点积相似度Q·K就像一个哈希函数,它衡量每个键与查询匹配的程度。softmax 归一化确保权重之和为 1,实现了概率检索机制。这种联系解释了为什么注意力对于需要灵活信息检索的任务是有效的——它提供了对数据库查找操作的微分近似。

从信息论的角度来看,注意力机制在不确定性下实现了最优的信息聚合。注意力权重代表了关于哪些输入部分包含当前处理步骤的相关信息的不确定性。softmax 操作实现了最大熵原理:在所有可能的将注意力分配到输入位置的方式中,softmax 选择具有最大熵的分布,同时满足相似度分数决定相对重要性的约束(Cover 和 Thomas 2001)。

效率和优化

注意力机制高度冗余,许多头部学习相似的模式。通过头部剪枝和低秩注意力因子分解,可以在谨慎实施的情况下将计算量减少 50-80%。对大型 Transformer 模型的分析表明,大多数注意力头部都落入几种常见的模式(位置、句法、语义),这表明显式的架构专业化可以替代学习到的冗余。

注意力操作由于 softmax 操作和注意力分数的二次数量,对量化特别敏感。需要为 Q、K、V 投影制定单独的量化方案,并仔细处理 softmax 操作,以确保稳定的量化。训练后 INT8 量化通常会导致 2-3%的精度损失,而 INT4 量化则需要更复杂的量化感知训练方法。

与序列长度的二次缩放创造了效率限制。稀疏注意力模式(如局部窗口、步进模式或学习到的稀疏性)可以将复杂度从 O(n²)降低到 O(n log n)或 O(n),同时保持大多数建模能力。线性注意力近似以牺牲一些表达能力为代价,实现了线性缩放,使得在有限的硬件上能够处理更长的序列。

这种信息论解释揭示了为什么注意力对于选择性处理如此有效。该机制自动平衡两个相互竞争的目标:关注最相关的信息(最小化熵)同时保持足够的广度以避免遗漏重要细节(最大化熵)。注意力模式作为这些目标之间的最佳权衡出现,解释了为什么变换器可以有效地处理长序列和复杂依赖关系。

自注意力学习输入序列中的动态激活模式。与使用固定滤波器的 CNN 或使用固定递归模式的 RNN 不同,注意力根据其内容学习哪些元素应该一起激活。这创造了一种自适应连接形式,其中每个输入的有效网络拓扑都会发生变化。最近的研究表明,训练模型中的注意力头通常专门用于检测特定的语言或语义模式(Clark 等人 2019),这表明该机制自然地发现了数据中的可解释结构规律。

变换器架构利用这种自注意力机制,在更广泛的结构中,通常包括前馈层、层归一化和残差连接(参见图 4.8)。这种组合允许变换器并行处理输入序列,捕捉复杂依赖关系,而无需进行顺序计算。因此,变换器在从自然语言处理到计算机视觉的广泛任务中展示了显著的有效性,跨越了不同领域的深度学习架构。

图片

图 4.8:注意力头:神经网络通过查询-键-值交互计算注意力,使子词能够动态聚焦,从而提高句子理解能力。来源:Attention Is All You Need.

计算映射

虽然变换器自注意力建立在基本注意力机制之上,但它引入了独特的计算模式,使其与众不同。为了理解这些模式,我们必须检查变换器中自注意力的典型实现(参见列表 4.8):

列表 4.8:自注意力机制:变换器模型通过查询-键-值交互计算注意力,使输入序列能够动态聚焦,从而提高语言理解能力。

def self_attention_layer(X, W_Q, W_K, W_V, d_k):
    # X: input tensor (batch_size × seq_len × d_model)
    # W_Q, W_K, W_V: weight matrices (d_model × d_k)

    Q = matmul(X, W_Q)
    K = matmul(X, W_K)
    V = matmul(X, W_V)

    scores = matmul(Q, K.transpose(-2, -1)) / sqrt(d_k)
    attention_weights = softmax(scores, dim=-1)
    output = matmul(attention_weights, V)

    return output


def multi_head_attention(X, W_Q, W_K, W_V, W_O, num_heads, d_k):
    outputs = []
    for i in range(num_heads):
        head_output = self_attention_layer(
            X, W_Q[i], W_K[i], W_V[i], d_k
        )
        outputs.append(head_output)

    concat_output = torch.cat(outputs, dim=-1)
    final_output = matmul(concat_output, W_O)

    return final_output

系统影响

这种实现揭示了适用于基本注意力机制的关键计算特性,其中 Transformer 自注意力代表了一个具体案例。首先,自注意力使得在整个序列的所有位置上实现并行处理。这在同时计算所有位置的QKV的矩阵乘法中表现得非常明显。与按顺序处理输入的循环架构不同,这种并行性质允许更有效的计算,尤其是在为并行操作设计的现代硬件上。

第二,注意力分数计算结果是一个大小为 (seq_len × seq_len) 的矩阵,导致序列长度上的二次复杂度。当处理长序列时,这种二次关系成为一个显著的计算瓶颈,这也促使人们研究更有效的注意力机制。

第三,多头注意力机制有效地并行运行多个自注意力操作,每个操作都有其自己的学习投影集。虽然这会随着头数的增加而线性增加计算负载,但它允许模型捕捉到相同输入中的不同类型的关系,从而增强了模型的表示能力。

第四,自注意力中的核心计算主要由大矩阵乘法组成。对于一个长度为 NN 的序列和嵌入维度 dd,主要操作涉及大小为 (N×d)(N\times d)(d×d)(d\times d)(N×N)(N\times N) 的矩阵。这些密集的矩阵运算非常适合在专门的硬件(如 GPU)上加速,但它们也显著增加了模型的整体计算成本。

最后,自注意力生成了内存密集的中间结果。注意力权重矩阵(N×N)(N\times N)以及每个注意力头的中间结果创建了大量的内存需求,尤其是对于长序列。这可能在内存受限的设备上部署时提出挑战,并需要在实现中仔细管理内存。

这些计算模式为 Transformer 的自注意力机制创造了一个独特的轮廓,与之前的架构不同。计算的并行性使得 Transformer 非常适合现代并行处理硬件,但序列长度的二次复杂性对处理长序列提出了挑战。因此,许多研究都集中在开发优化技术,如稀疏注意力模式或低秩近似,以解决这些挑战。每种优化都在计算效率和模型表达能力之间提供了自己的权衡,这在实际应用中必须仔细考虑。

对四种不同架构家族的考察揭示了它们的个体特征和集体演变。与其将这些架构孤立看待,不如当我们考虑它们之间的关系以及它们如何建立在共同基础上时,会获得更深入的理解。

建筑模块

在考察了四个主要架构家族——MLP、CNN、RNN 和 Transformer——每个都具有独特的计算特性和系统影响后,一个统一的视角出现了。虽然在前面的章节中,深度学习架构被作为不同的方法提出,但它们更好地被理解为随着时间的推移而演变的模块组合。就像由基本砖块构建的复杂乐高结构一样,现代神经网络结合并迭代了数十年来研究产生的核心计算模式(杨·勒克文、本吉奥和辛顿 2015)。每一次架构创新都引入了新的模块,同时发现了现有模块的新应用。

这些模块及其演变过程照亮了现代建筑设计。简单的感知器(罗森布拉特 1958)演变为多层网络(鲁梅尔哈特、辛顿和威廉姆斯 1986),随后又产生了专门用于空间和序列处理的模式。每一次进步都保留了前辈的有用元素,同时引入了新的计算原语。当代架构,如 Transformer,代表了这些模块精心设计的组合。

这一进展揭示了神经网络的发展以及核心计算模式的发现和改进,这些模式仍然相关。在第 4.1 节中概述的架构进展的基础上,每个新的架构都引入了独特的计算需求和系统级挑战。

表 4.1 总结了这一演变,突出了每个深度学习发展阶段的关键原语和系统关注点。这张表捕捉了深度学习架构设计的主要转变以及系统级考虑的相应变化。这一进展涵盖了从针对 CPU 优化的早期密集矩阵操作,通过利用 GPU 加速的卷积和需要复杂内存层次结构的顺序操作,到当前需要灵活加速器和高速内存的注意力机制时代。

表 4.1:深度学习演变:神经网络架构已从简单的全连接层发展到利用专用硬件和解决顺序数据依赖的复杂模型。这张表将架构时代映射到关键计算原语和相应的系统级优化,揭示了一个历史趋势,即向更高的并行性和内存带宽需求发展。

时代 主导架构 关键原语 系统关注点
早期神经网络 MLP 稠密矩阵操作 CPU 优化
CNN 革命 CNN 卷积 GPU 加速
序列建模 RNN 序列操作 内存层次结构
注意力时代 Transformer 注意力,动态计算 灵活的加速器,高速内存

对这些构建块的考察显示,原语在演变和组合中创造越来越强大的神经网络架构。

从感知器到多层网络的演变

虽然我们在第 4.2 节中考察了 MLP 作为密集模式处理机制的机制,但在这里我们关注的是它们如何建立了贯穿深度学习的构建块。从感知器到 MLP 的演变引入了几个关键概念:层堆叠的力量、非线性转换的重要性以及基本的正向计算模式。

在输入和输出之间引入隐藏层,为几乎每个现代架构中出现的特征转换创建了一个模板。即使在像 Transformer 这样的复杂网络中,我们也能找到执行特征处理的 MLP 风格的前馈层。通过连续的非线性层转换数据的概念已经成为超越特定架构类型的范式。

最重要的是,MLPs 的发展确立了反向传播算法 22,这一算法至今仍然是神经网络优化的基石。这一关键贡献使得深度架构的发展成为可能,并影响了后续架构的设计,以保持梯度流。

这些构建块,包括分层特征转换、非线性激活和基于梯度的学习,为更专业的架构奠定了基础。后续的创新通常集中在以新的方式构建这些基本组件,而不是完全取代它们。

从密集处理到空间处理的演变

CNNs 的发展标志着架构创新,特别是我们能够专门化 MLPs 的密集连接以处理空间模式的认识。在保留层状处理的核心概念的同时,CNNs 引入了几个将影响所有未来架构的构建块。

第一个关键创新是参数共享的概念。与每个连接都有自己的权重不同,CNNs 展示了相同的参数可以在输入的不同部分重复使用。这不仅使网络更高效,还引入了强大的思想,即架构结构可以编码关于数据的有用先验信息 (Lecun et al. 1998)。

可能更具影响力的是通过 ResNets23 (K. He et al. 2015)引入的跳跃连接。最初它们被设计用来帮助训练非常深的 CNNs,跳跃连接已经成为几乎每个现代架构中出现的构建块。它们展示了如何通过网络中的直接路径帮助梯度流和信息传播,这一概念现在已成为 Transformer 设计中的核心。

CNNs 还引入了批量归一化,这是一种通过归一化中间特征来稳定神经网络优化的技术 (Ioffe and Szegedy 2015a)。这种特征归一化的概念,虽然起源于 CNNs,但演变成了层归一化,现在已成为现代架构的关键组成部分。

这些创新,如参数共享、跳跃连接和归一化,超越了它们在空间处理中的起源,成为深度学习工具箱中的基本构建块。

序列处理的发展

当 CNNs 专门用于空间模式的多层感知器(MLPs)时,序列模型适应了神经网络以处理时间依赖性。循环神经网络(RNNs)引入了维持和更新状态的概念,这是影响网络如何处理序列信息的一个构建块,(Elman 1990)。

LSTM24 和 GRU25 的发展将复杂的门控机制引入了神经网络(Hochreiter 和 Schmidhuber 1997;Cho 等人 2014)。这些门控机制,本身是小型 MLP,展示了如何通过简单的前馈计算来组合以控制信息流。这种使用神经网络调节其他神经网络的概念成为架构设计中的常见模式。

也许最显著的是,序列模型展示了自适应计算路径的力量。与 MLPs 和 CNNs 的固定模式不同,RNNs 展示了网络如何通过在时间上重复使用权重来处理可变长度的输入。这一洞察,即架构模式可以适应输入结构,为更灵活的架构奠定了基础。

序列模型通过编码器-解码器架构(Bahdanau, Cho, 和 Bengio 2014)也普及了注意力概念。最初作为机器翻译的改进而引入,注意力机制展示了网络如何学习动态关注相关信息。这个构建块后来成为 Transformer 架构的基础。

现代架构:综合与统一

现代架构,尤其是 Transformer,代表了这些基本构建块的高级综合。它们并非引入全新的模式,而是通过战略性地组合和改进现有组件进行创新。Transformer 架构就是这一方法的例证:在其核心,MLP 风格的前馈网络在注意力层之间处理特征。注意力机制本身建立在序列模型概念之上,同时消除了循环连接,转而采用受 CNN 直觉启发的位置嵌入。该架构广泛利用跳跃连接(见图 4.9),这些连接是从 ResNets 继承而来的,而层归一化(从 CNN 批归一化演变而来)则稳定了优化过程(Ba, Kiros, 和 Hinton 2016)。

图片

图 4.9:残差连接:跳跃连接将层的输入添加到其输出中,使得梯度可以直接通过网络流动,缓解了深层架构中的梯度消失问题。这允许训练深度更大的网络,正如在 resnets 中看到的那样,并被现代 Transformer 架构采用以改善优化和性能。

这种构建块的组合创造了超越单个组件总和的涌现能力。自注意力机制在先前注意力概念的基础上,实现了新型动态模式处理。这些组件的排列——注意力机制后跟前馈层,带有跳过连接和归一化——已被证明足够有效,成为新架构的模板。

视觉和语言模型中的最近创新遵循这种重新组合构建块的模式。视觉 Transformer26 将 Transformer 架构应用于图像,同时保持其基本组件(Dosovitskiy 等人 2021)。大型语言模型扩展了这些模式,同时引入了分组查询注意力或滑动窗口注意力等改进,但仍然依赖于通过这种架构演变建立的核心理念(T. Brown 等人 2020)。这些现代架构创新展示了第九章中涵盖的高效扩展原则,而其实际实施挑战和优化将在第十章中探讨。

下面对不同神经网络架构中原始利用率的比较显示了现代架构在先前方法的基础上综合和创新:

表 4.2:原始利用率:神经网络架构在核心计算和内存访问模式上有所不同,这影响了硬件需求和效率。Transformer 独特地将矩阵乘法与注意力机制相结合,导致随机的内存访问和数据移动模式,与顺序的 RNN 或步进 CNN 不同。

原始类型 MLP CNN RNN Transformer
计算 矩阵乘法 卷积(矩阵乘法) 矩阵乘法 + 状态更新 矩阵乘法 + 注意力
内存访问 顺序 步进 顺序 + 随机 随机(注意力)
数据移动 广播 滑动窗口 顺序 广播 + 收集

如表 4.2 所示,Transformer 结合了先前架构的元素,同时引入了新的模式。它们保留了所有架构共有的核心矩阵乘法操作,但通过其注意力机制引入了更复杂的内存访问模式。它们的数据移动模式融合了 MLP 的广播操作和类似更动态架构的收集操作。

这种在 Transformers 中对原语的合成表明,现代架构通过重新组合和改进在第 4.1 节中确立的现有构建块,而不是发明全新的计算范式,来进行创新。这一进化过程指导了未来架构的发展,并有助于设计支持它们的效率系统。

系统级构建块

对不同深度学习架构的考察使得可以将它们的系统需求提炼为支撑硬件和软件实现的原语。这些原语代表了一些操作,在保持其基本特征的同时无法进一步分解。正如复杂分子是由基本原子构建而成,复杂的神经网络也是由这些操作构建而成。

核心计算原语

三种操作是所有深度学习计算的基础构建块:矩阵乘法、滑动窗口操作和动态计算。这些操作是原语,因为如果不失去其基本的计算属性和效率特性,就无法进一步分解。

矩阵乘法代表了特征集转换的基本形式。当我们用一个输入矩阵乘以一个权重矩阵时,我们正在计算加权组合,这是神经网络的核心操作。例如,在我们的 MNIST 网络中,每个 784 维输入向量与一个784×100784\times 100权重矩阵相乘。这种模式无处不在:MLPs 直接用它进行层计算,CNNs 将卷积重塑为矩阵乘法(将一个3×33\times 3卷积转换为矩阵操作,如图图 4.10 所示),并且 Transformers 在其注意力机制中广泛使用它。

计算构建块

现代神经网络通过三种计算模式在所有架构中运行。这些模式解释了不同架构如何实现其计算目标,以及为什么某些硬件优化是有效的。

对稀疏计算模式的详细分析,包括结构化和非结构化稀疏性、硬件感知优化策略和算法-硬件协同设计原则,在第十章和第十一章中讨论。

图片

图 4.10:卷积作为矩阵乘法:使用im2col技术将卷积层重塑为矩阵乘法,可以有效地使用优化的 BLAS 库进行计算,并允许在标准硬件上进行并行处理。这种转换对于加速卷积神经网络至关重要,并构成了在多种平台上实现卷积的基础。

im2col27(图像到列)技术,由英特尔在 20 世纪 90 年代开发,通过展开重叠的图像块到矩阵的列中来实现矩阵重塑,如图图 4.10 所示。卷积中的每个滑动窗口位置在转换矩阵中成为一列,而滤波器核则按行排列。这使得卷积操作可以表示为一个标准的 GEMM(通用矩阵乘法)操作。这种转换以内存消耗——在窗口重叠处复制数据——为代价,换取计算效率,使得卷积神经网络可以利用数十年的 BLAS 优化,并在 CPU 上实现 5-10 倍的加速。在现代系统中,这些矩阵乘法映射到特定的硬件和软件实现。硬件加速器提供专门的张量核心,可以并行执行数千次乘加操作;NVIDIA 的 A100 张量核心可以针对混合精度(TF32)工作负载达到高达 312 TFLOPS,或通过这些操作的巨大并行化实现 156 TFLOPS 的 FP32。像 PyTorch 和 TensorFlow 这样的软件框架自动将这些高级操作映射到优化的矩阵库(NVIDIA cuBLAS,Intel MKL),这些库利用了这些硬件能力。

滑动窗口操作通过将相同的操作应用于数据块来计算局部关系。在卷积神经网络处理 MNIST 图像时,一个3×33\times 3卷积滤波器在28×2828\times 28输入上滑动,需要26×2626\times 26个计算窗口,假设步长大小为 1。现代硬件加速器通过专门的内存访问模式和数据缓冲方案来实现这一点,这些方案优化了数据重用。例如,谷歌的 TPU 使用一个128×128128\times 128的收缩阵列 28,其中数据有系统地通过处理单元流动,允许每个输入值在多个计算中重用而不访问内存。

动态计算,其中操作本身取决于输入数据,随着关注机制的出现而变得突出,但代表了自适应处理所需的能力。在 Transformer 关注中,每个查询动态确定其与所有键的交互权重;对于长度为 512 的序列,必须在运行时动态计算 512 种不同的权重模式。与预先知道计算图的固定模式不同,动态计算需要运行时决策。这创造了特定的实现挑战:硬件必须提供灵活的数据路由(现代 GPU 采用动态调度)并支持可变的计算模式,而软件框架需要高效的机制来处理数据相关的执行路径(PyTorch 的动态计算图,TensorFlow 的动态控制流)。

这些原语在现代架构中以复杂的方式组合。一个处理 512 个标记序列的 Transformer 层清楚地展示了这一点:它使用矩阵乘法进行特征投影(512×512512\times 512操作,通过张量核心实现),可能使用滑动窗口对长序列进行高效的关注(使用针对局部区域的专用内存访问模式),并且需要动态计算关注权重(在运行时计算512×512512\times 512关注模式)。这些原语之间的交互方式对系统设计提出了具体要求,从内存层次结构组织到计算调度。

我们所讨论的构建块有助于解释为什么某些硬件特性存在(如用于矩阵乘法的张量核心)以及为什么软件框架以特定方式组织计算(如将类似的操作一起批处理)。当我们从计算原语转向考虑内存访问和数据移动模式时,认识到这些操作如何塑造对内存系统和数据传输机制的特定要求变得至关重要。计算原语的实施和组合方式对数据在系统内部存储、访问和移动的需求有直接影响。

内存访问原语

深度学习模型的效率在很大程度上取决于内存访问和管理。内存访问通常是现代机器学习系统中的主要瓶颈;即使矩阵乘法单元可能能够在每个周期执行数千次操作,如果没有在所需时间提供数据,它将保持空闲。例如,从 DRAM 访问数据通常需要数百个周期,而片上计算只需要几个周期。

在深度学习架构中,三种内存访问模式占主导地位:顺序访问、步长访问和随机访问。每种模式都对内存系统提出了不同的要求,并提供了不同的优化机会。

顺序访问是最简单且最有效的模式。考虑一个执行 MNIST 图像批处理矩阵乘法的 MLP:它需要顺序访问 784×100 的权重矩阵和输入向量。这种模式很好地映射到现代内存系统;DRAM 可以在突发模式下进行顺序读取(在现代 GPU 中达到高达 400 GB/s),硬件预取器可以有效地预测和获取即将到来的数据。软件框架通过确保数据在内存中连续排列并对齐到缓存行边界来优化这一点。

步长访问在 CNN 中尤为突出,其中每个输出位置需要以固定间隔访问输入值的一个窗口。对于一个处理 MNIST 图像的 CNN,使用 3×3 的过滤器,每个输出位置需要以与输入宽度匹配的步长访问 9 个输入值。虽然不如顺序访问高效,但硬件通过模式感知的缓存策略和专门的内存控制器来支持这一点。软件框架通常通过数据布局重组将这些步长模式转换为顺序访问,其中深度学习框架中的 im2col 转换将卷积的步长访问转换为高效的矩阵乘法。

随机访问对系统效率提出了最大的挑战。在一个处理 512 个标记序列的 Transformer 中,每个注意力操作可能需要访问序列中的任何位置,从而创建不可预测的内存访问模式。随机访问可能会通过缓存未命中(可能每次访问造成 100+个周期延迟)和不可预测的内存延迟严重影响性能。系统通过大型缓存层次结构(现代 GPU 具有几个 MB 的 L2 缓存)和复杂的预取策略来解决这个问题,而软件框架则采用诸如注意力模式剪枝等技术来减少随机访问需求。

这些不同的内存访问模式对每个架构的整体内存需求做出了贡献。为了说明这一点,表 4.3 比较了 MLPs、CNNs、RNNs 和 Transformers 的内存复杂度。

表 4.3:内存访问复杂度:不同的神经网络架构表现出不同的内存访问模式和存储需求,这会影响系统性能和可扩展性。参数存储随着输入依赖和模型大小而扩展,而激活存储代表了显著的运行时成本,尤其是在序列模型中,当序列长度超过隐藏状态大小时(n>hn > h),循环神经网络(RNN)在参数效率上具有优势。

架构 输入依赖 参数存储 激活存储 缩放行为
MLP 线性 O(N×W)O(N \times W) O(B×W)O(B \times W) 可预测的
CNN 常数 O(K×C)O(K \times C) O(B×HimgO(B\times H_{\text{img}} ×Wimg)\times W_{\text{img}}) 高效的
RNN 线性 O(h2)O(h²) O(B×T×h)O(B \times T \times h) 具挑战性
Transformer 二次 O(N×d)O(N \times d) O(B×N2)O(B \times N²) 存在问题

其中:

  • NN: 输入或序列大小

  • WW: 层宽度

  • BB: 批处理大小

  • KK: 核大小

  • CC: 通道数

  • HimgH_{\text{img}}: 输入特征图的高度(CNN)

  • WimgW_{\text{img}}: 输入特征图的宽度(CNN)

  • hh: 隐藏状态大小(RNN)

  • TT: 序列长度

  • dd: 模型维度

表 4.3 展示了内存需求如何随着不同的架构选择而变化。例如,在 Transformer 中的激活存储的二次扩展突出了为基于 Transformer 的工作负载设计的系统中需要大内存容量和高效内存管理的必要性。相比之下,由于参数共享和局部处理,CNN 显示出更有利的内存扩展。这些内存访问模式补充了随后在 表 4.6 中考察的计算扩展行为,完成了每个架构资源需求的图景。这些内存复杂度考虑因素为系统级设计决策提供了信息,例如选择内存层次结构配置和开发内存优化策略。

当我们考虑数据重用机会时,这些模式的影响变得明显。在 CNN 中,每个输入像素参与多个卷积窗口(通常为3×33\times 3滤波器),这使得有效的数据重用对于性能至关重要。现代 GPU 提供多级缓存层次结构(L1、L2、共享内存)来捕获这种重用,而软件技术如循环分块确保数据一旦加载就保持在缓存中。

工作集大小,即同时用于计算所需的数据量,在架构之间差异很大。处理 MNIST 图像的 MLP 层可能只需要几百 KB(权重加激活),而处理长序列的 Transformer 可能只需要几个 MB 来存储注意力模式。这些差异直接影响硬件设计选择,如计算单元和片上内存之间的平衡,以及软件优化,如激活检查点或注意力近似技术。

随着架构的发展,理解这些内存访问模式至关重要。例如,从 CNN 到 Transformer 的转变推动了具有更大片上内存和更复杂缓存策略的硬件的发展,以处理更大的工作集和更动态的访问模式。未来的架构可能会继续由它们的内存访问特性以及它们的计算需求来塑造。

数据移动原语

当计算和内存访问模式定义了操作发生在何处时,数据移动原语描述了信息如何通过系统流动。这些模式至关重要,因为数据移动通常比计算本身消耗更多的时间和能量,将数据从片外内存移动到芯片通常需要比执行浮点运算多 100-1000 倍(使用 LaTeX 语法表示)的能量。

在深度学习架构中,四种数据移动模式很常见:广播、散射、收集和归约。图 4.11 展示了这些模式及其关系。广播操作同时将相同的数据发送到多个目的地。在批量大小为 32 的矩阵乘法中,每个权重都必须进行广播以并行处理不同的输入。现代硬件通过专用互连支持这一点,NVIDIA GPU 提供硬件多播功能,实现高达 600 GB/s 的广播带宽,而 TPU 使用专用的广播总线。软件框架通过重构计算(如矩阵分块)来优化广播,以最大化数据重用。

图片

图 4.11:集体通信模式:深度学习训练和推理通常需要在处理单元之间进行数据交换;此图概述了四个核心模式(广播、散列、聚合和减少),这些模式定义了数据如何在分布式系统中移动以及如何影响整体性能。理解这些模式能够优化数据移动,这在现代机器学习工作负载中至关重要,因为通信成本通常占主导地位。

散列操作将不同的元素分配到不同的目的地。当将512×512512\times 512矩阵乘法并行化到 GPU 核心时,每个核心都会接收到计算的一部分。这种并行化对于性能至关重要,但具有挑战性,因为内存冲突和负载不平衡可能会降低效率 50%或更多。硬件提供了灵活的互连(如 NVIDIA 的 NVLink 提供 600 GB/s 的双向带宽),而软件框架采用复杂的工作分配算法以保持高利用率。

聚合操作从多个来源收集数据。在序列长度为 512 的 Transformer 注意力中,每个查询必须从 512 个不同的键值对中收集信息。这些不规则的访问模式具有挑战性,随机收集可能比顺序访问慢10×10\times。硬件通过高带宽互连和大型缓存来支持这一点,而软件框架采用诸如注意力模式剪枝等技术来减少收集开销。

减少操作通过求和等操作将多个值合并成一个单一的结果。在计算 Transformer 中的注意力分数或 MLP 中的层输出时,高效的减少操作至关重要。硬件实现了树状结构的减少网络(将延迟从O(n)O(n)减少到O(logn)O(\log n)),而软件框架使用优化的并行减少算法,可以实现接近理论峰值性能。

这些模式以复杂的方式结合在一起。序列长度为 512 且批大小为 32 的 Transformer 注意力操作涉及:

  • 广播查询向量(512×64512\times 64个元素)

  • 收集相关键和值(512×512×64512\times 512\times 64元素)

  • 降低注意力分数(512×512512\times 512元素每个序列)

从 CNN 到 Transformer 的演变增加了对收集和归约操作的需求,推动了更灵活互连和更大片上内存等硬件创新的产生。随着模型的增长(一些现在超过 1000 亿参数 29),高效数据移动变得越来越关键,导致了近内存处理和复杂数据流优化等创新。

系统设计影响

我们所探讨的计算、内存访问和数据移动原语构成了深度学习系统设计的根本要求。这些原语如何影响硬件设计、创造共同瓶颈并推动权衡,对于开发高效有效的机器学习系统至关重要。

这些原语对系统设计最显著的影响之一是推动专用硬件的发展。深度学习中矩阵乘法和卷积的普遍存在导致了张量处理单元(TPUs)30 和 GPU 中的张量核心的发展,这些单元专门设计用于高效执行这些操作。

存储系统也受到了深度学习原语需求的深远影响。为了高效地支持顺序和随机访问模式,推动了复杂内存层次结构的发展。高带宽内存(HBM)31 已在人工智能加速器中变得常见,以支持大量数据移动需求,特别是对于 Transformer 中的注意力机制等操作。片上内存层次结构变得更加复杂,具有多级缓存和快速存储器 32,以支持不同神经网络层的不同工作集大小。

数据移动原语特别影响了互连和片上网络的设计。支持高效广播、收集和归约的需求导致了更灵活和更高带宽的互连的发展。一些人工智能芯片现在具有专门设计的片上网络,旨在加速神经网络中的常见数据移动模式。

表 4.4 总结了这些原语对系统的含义:

表 4.4:原语-硬件协同设计:高效的机器学习系统需要算法原语与底层硬件之间的紧密集成;此表将常见的原语映射到特定的硬件加速和软件优化,突出了其实现中的关键挑战。专用硬件,如张量核心和数据路径,解决了矩阵乘法和滑动窗口等原语的计算需求,而批处理和动态图执行等软件技术进一步提升了性能。

原语 硬件影响 软件优化 关键挑战
矩阵乘法 张量核心 批处理,GEMM 库 并行化,精度
滑动窗口 专用数据路径 数据布局优化 步长处理
动态计算 灵活路由 动态图执行 负载均衡
顺序访问 爆发模式 DRAM 连续分配 访问延迟
随机访问 大容量缓存 内存感知调度 缓存未命中
广播 专用互连 操作融合 带宽
收集/分散 高带宽内存 工作分配 负载均衡

尽管取得了这些进步,但深度学习模型中仍存在几个瓶颈。内存带宽通常仍然是关键限制,特别是对于具有大工作集或需要频繁随机访问的模型。数据移动的能量成本,尤其是在片外内存和处理单元之间,仍然是一个重大问题。对于大规模模型,分布式训练中的通信开销可能成为瓶颈,限制扩展效率。

架构间的能耗分析

神经网络架构的能耗模式差异很大,对数据中心部署和边缘计算场景都有影响。每种架构模式都表现出独特的能耗特征,这些特征可以指导部署决策和优化策略。

在 MLP 中的密集矩阵操作实现了出色的算术强度 33(每数据移动的计算量),但消耗了显著的绝对能量。每次乘加操作消耗大约 4.6pJ,而数据从 DRAM 移动到 32 位值需要 640pJ。对于典型的 MLP 推理,70-80% 的能量用于数据移动而不是计算,这使得内存带宽优化对于能效至关重要。

卷积操作通过数据重用减少能耗,但效率因实现方式而异。基于 Im2col 的卷积实现以简单性换取内存,通常加倍内存需求和能耗。直接卷积实现通过消除冗余数据移动,尤其是在较大的内核尺寸下,实现了 3-5 倍更好的能效。

RNNs 中的顺序处理通过时间数据的重复使用创造了能源效率的机会。RNN 隐藏状态的恒定内存足迹使得可以采用积极的缓存策略,对于长序列,可以减少 80-90%的 DRAM 访问能源。顺序依赖性限制了并行化机会,通常导致硬件利用率低下和每操作更高的能耗。

由于二次扩展和复杂的数据移动模式,Transformers 中的注意力机制在每操作中表现出最高的能耗。由于不规则的内存访问模式和需要存储注意力矩阵,自注意力操作每 FLOP 比标准矩阵乘法消耗 2-3 倍的能源。这种能源成本与序列长度成二次方关系,使得没有架构修改的长序列处理成为能源禁止的。

系统设计者必须在不同原语的支持之间进行权衡,每个原语都有其独特的特性,这些特性会影响系统设计和性能。例如,为 MLP 和 CNN 中常见的密集矩阵运算进行优化可能会以牺牲注意力机制中更动态计算所需的灵活性为代价。支持 Transformers 的大工作集可能需要牺牲能源效率。

平衡这些权衡需要考虑目标工作负载和部署场景。理解每个原语的本质指导了机器学习系统中硬件和软件优化的开发,使得设计者能够就系统架构和资源分配做出明智的决定。

对架构模式、计算原语和系统影响的分析为解决一个实际挑战奠定了基础:工程师如何系统地选择适合他们特定问题的正确架构?神经网络架构的多样性,每个架构都针对不同的数据模式和计算约束进行了优化,需要一种结构化的架构选择方法。这个选择过程不仅要考虑算法性能,还要考虑第二章中涵盖的部署约束和第十三章中详细说明的操作效率要求。

架构选择框架

从密集 MLP 到动态 Transformers 的神经网络架构的探索展示了每个设计如何体现对数据结构和计算模式的具体假设。MLP 假设任意特征关系,CNN 利用空间局部性,RNN 捕获时间依赖性,而 Transformers 模拟复杂的关联模式。对于面临现实世界问题的从业者来说,一个问题出现了:如何系统地选择适用于特定用例的适当架构?

可用架构的多样性让从业者感到不知所措,因为每种架构都声称适用于不同的场景。成功的架构选择需要理解原则而不是跟随趋势:将数据特性与架构优势相匹配,评估计算约束与系统能力,以及平衡精度要求与部署现实。

这种架构选择的系统性方法借鉴了前述分析中探讨的计算模式和系统影响。通过理解不同架构如何处理信息和相应的资源需求,工程师可以做出符合问题需求和实际约束的明智决策。该框架将高效 AI 设计第九章的原则与 ML 操作第十三章中讨论的实际部署考虑因素相结合。

数据到架构映射

系统性架构选择的第一个步骤涉及理解不同数据类型如何与架构优势相匹配。每个神经网络架构都是为了解决数据中的特定模式而演化的:MLPs 处理表格数据中的任意关系,CNNs 利用图像中的空间局部性,RNNs 捕捉序列中的时间依赖性,而 Transformers 则模拟任何元素可能影响任何其他元素的复杂关系模式。

这种匹配并非偶然。它反映了计算权衡。与数据特性匹配的架构可以利用自然结构提高效率,而与设计假设不匹配的架构必须与之对抗,导致性能不佳或资源消耗过多。

表 4.5 提供了一个系统框架,用于匹配数据特性到适当的架构:

表 4.5:架构选择框架:基于计算需求和模式类型,系统地匹配数据特性与神经网络架构。

架构 数据类型 关键特性 示例应用
MLPs 表格/结构化 • 无空间/时间 • 任意关系 • 密集连接 • 金融建模 • 医学测量 • 推荐系统
卷积神经网络(CNNs 空间/网格状 • 局部模式 • 平移等变性 • 参数共享 • 图像识别 • 2D 传感器数据 • 信号处理
循环神经网络(RNNs 序列/时间 • 时间依赖性 • 变长 • 时间上的记忆 • 时间序列预测 • 简单语言任务 • 语音识别
Transformers 复杂关系 • 长距离依赖性 • 注意力机制 • 动态关系 • 语言理解 • 机器翻译 • 复杂推理任务

虽然数据特性指导了初始架构选择,但计算约束通常决定了最终的可行性。理解每种架构的扩展行为可以促进合理的资源规划和部署决策。

计算复杂性考虑

架构选择必须考虑到计算和内存权衡,这些权衡决定了部署的可行性。每种架构都表现出独特的扩展行为,随着问题规模的增加,会形成不同的瓶颈。理解这些模式可以促进合理的资源规划,并在部署期间避免昂贵的架构不匹配。

每种架构的计算特征反映了其背后的设计理念。密集架构如 MLP 通过全连接优先考虑表示能力,而结构化架构如 CNN 通过参数共享和局部性假设实现效率。顺序架构如 RNN 以内存效率为代价换取并行化,而基于注意力的架构如 Transformers 则以内存换取计算灵活性。为了全面性,我们从计算扩展和内存访问两个角度(参见表 4.3)考察了这些相同的架构,因为每个视角都揭示了不同的优化机会和系统设计考虑。

表 4.6 总结了每种架构的关键计算特性:

表 4.6:计算复杂性比较:主要神经网络架构的扩展行为和资源需求。变量:dd = 维度,hh = 隐藏层大小,kk = 核大小,cc = 通道数,H,WH,W = 空间维度,TT = 时间步长,nn = 序列长度,bb = 批处理大小。

架构 参数 正向传播 内存 并行化
MLPs O(din×O(d_{\text{in}}\times dout)d_{\text{out}}) 每层 O(din×O(d_{\text{in}}\times dout)d_{\text{out}}) 每层 O(d2)O(d²) 权重 O(d×b)O(d\times b) 激活 优秀的矩阵操作并行
CNNs O(k2×O(k²\times cin×c_{\text{in}}\times cout)c_{\text{out}}) 每层 O(H×W×O(H\times W\times k2×k²\times cin×c_{\text{in}}\times cout)c_{\text{out}}) O(H×W×c)O(H\times W\times c) 特征 O(k2×c2)O(k²\times c²) 权重
RNNs O(h2+h×d)O(h²+h\times d) 总计 O(T×h2)O(T\times h²) 对于 TT 时间步 O(h)O(h) 隐藏状态(常数) 较差的序列依赖性
Transformers O(d2)O(d²) 投影 O(d2×h)O(d²\times h) 多头 O(n2×d+nO(n²\times d+n ×d²)\times d²) 每层 O(n2)O(n²) 注意力 O(n×d)O(n\times d) 序列 优秀(位置)受限于内存

可扩展性和生产考虑因素

生产部署引入了超出算法性能的约束,包括延迟要求、内存限制、能源预算和容错需求。每种架构都表现出独特的生产特性,这些特性决定了实际应用的可行性。

MLPs 和 CNNs 通过数据并行性在多个设备上具有良好的可扩展性,通过适当的批量大小缩放实现接近线性的加速。RNNs 由于序列依赖性而面临并行化挑战,需要管道并行或其他专用技术。Transformers 在序列位置上实现了出色的并行化,但受到二次内存缩放的限制,这限制了批量大小和有效利用率。

MLPs 提供与层大小成比例的可预测延迟,这使得它们适合具有严格 SLA 要求的实时应用。CNNs 的延迟根据实现策略和硬件能力而变化,优化实现可以达到亚毫秒级的推理。RNNs 会根据序列长度创建延迟依赖,这使得它们在交互式应用中具有挑战性。Transformers 为批量处理提供了出色的吞吐量,但由于注意力开销,在单次推理延迟方面存在困难。

在生产环境中,不同架构的内存需求差异很大。MLPs 需要与模型大小成比例的固定内存,这使得容量规划变得简单。CNNs 需要可变内存来存储特征图,其大小与输入分辨率成比例,对于可变大小的输入需要动态内存管理。RNNs 维护隐藏状态的常量内存,但对于非常长的序列可能需要无界的内存。Transformers 面临二次内存增长,这在生产中为序列长度设置了硬性限制。

容错和恢复特性在架构之间差异显著。MLPs 和 CNNs 表现出无状态计算,这使得简单的检查点和恢复成为可能。RNNs 维护时间状态,这使分布式训练和故障恢复过程复杂化。Transformers 结合了无状态计算和巨大的内存需求,使得检查点大小成为大型模型的一个实际关注点。

硬件映射效率在架构模式之间差异很大。现代 MLPs 在专门的张量单元上实现了 80-90%的峰值硬件性能。CNNs 的效率取决于层配置和内存层次结构设计,通常在 60-75%之间。RNNs 由于顺序约束和不规则的内存访问模式,通常只能达到峰值性能的 30-50%。Transformers 对于大批次大小可以达到 70-85%的效率,但对于小批次由于注意力开销而显著下降。

硬件映射和优化策略

不同的架构模式需要不同的优化策略来实现高效的硬件映射。理解这些模式能够实现系统性的性能调整和硬件选择决策。

MLPs 中的密集矩阵运算自然映射到张量处理单元和 GPU 张量核心。这些操作受益于几个关键优化:矩阵分块以适应缓存层次结构,混合精度计算以加倍吞吐量,以及操作融合以减少内存流量。最优的分块大小取决于缓存层次结构,通常是 64x64 用于 L1 缓存和 256x256 用于 L2,而张量核心通过特定的维度倍数达到峰值效率,例如 Volta 架构中的 16x16 块。

CNNs 得益于专门的卷积算法和数据布局优化,这些优化与密集矩阵运算有显著差异。Im2col 变换将卷积转换为矩阵乘法,但会加倍内存使用。Winograd 算法通过降低 3x3 卷积的算术复杂度 2.25 倍来提高效率,但以数值稳定性为代价。使用自定义内核的直接卷积实现了最优的内存效率,但需要针对特定架构进行调整。

RNN 由于其时间依赖性,需要不同的优化方法。循环展开减少了控制开销,但增加了内存使用。状态向量化使得可以在多个序列上执行 SIMD 操作。波前并行化利用时间步之间的独立性进行双向处理。

Transformer 由于其二次方复杂度,需要专门的注意力优化。FlashAttention 算法通过在线 softmax 计算和梯度重计算,将内存使用从 O(n²) 降低到 O(n)。包括局部、步进和随机方法在内的稀疏注意力模式在降低复杂度的同时保持建模能力。多查询注意力在头部之间共享键和值投影,将内存带宽降低了 30-50%。

多层感知器代表了最直接的计算模式,其成本主要由矩阵乘法决定。使 MLP 能够建模任意关系的密集连接以二次方参数增长为代价。每个神经元都与前一层中的每个神经元相连,创建了大量的参数,这些参数随着网络宽度的增加而二次方增长。计算主要由矩阵-向量乘法主导,这在现代硬件上得到了高度优化。矩阵操作本质上是并行的,并且可以有效地映射到 GPU 架构,每个输出神经元都是独立计算的。降低这些参数数量的优化技术,包括修剪和低秩近似,特别是针对密集层的,在第十章中进行了介绍。

卷积神经网络通过参数共享和空间局部性实现计算效率,但其成本随着空间维度和通道深度的增加而增加。卷积操作的计算强度很大程度上取决于内核大小和特征图分辨率。与等效的 MLP 相比,跨空间位置的参数共享大大减少了内存使用,而计算成本随着图像分辨率线性增长,随着内核大小二次方增长。特征图内存的使用占主导地位,对于高分辨率输入变得难以承受。空间独立性使得可以在不同的空间位置和通道之间进行并行处理,尽管内存带宽经常成为限制因素。

循环神经网络在牺牲并行化的代价下优化内存效率。它们的顺序特性创造了计算瓶颈,但允许以恒定的内存开销处理可变长度的序列。对于大隐状态,隐藏到隐藏的连接(h2项)占参数数量的主导地位。顺序依赖性阻止了时间上的并行处理,使得循环神经网络在本质上比前馈替代方案慢。它们对隐藏状态存储的恒定内存使用使得循环神经网络在长序列中内存效率高,但这种效率是以计算速度为代价的。

通过注意力机制,Transformer 实现了最大的灵活性,但付出了高昂的内存使用代价。它们与序列长度的二次关系限制了它们可以处理的序列长度。参数数量与模型维度成比例,但与序列长度无关。对于长序列,注意力计算中的n2项占主导地位,而来自前馈层的n×d2n \times d²项在短序列中占主导地位。注意力矩阵创建了主要的内存瓶颈,因为每个注意力头必须存储所有序列位置之间的成对相似性,导致长序列的内存使用不可承受。虽然序列位置和注意力头之间的并行化非常出色,但二次内存需求通常迫使批量大小更小,限制了有效的并行化。

这些复杂性模式定义了每个架构的最佳领域。当参数效率不是关键因素时,MLPs 表现卓越;对于中等分辨率的空間数据,CNNs 占主导地位;RNNs 在内存受限的非常长序列中仍然可行;而 Transformer 在复杂关系任务中表现卓越,其计算成本通过优越的性能得到证明。

建筑比较总结

对每个架构家族的系统分析揭示了不同的计算特征,这些特征决定了它们在不同部署场景中的适用性。表 4.7 提供了关键系统指标的定量比较,使工程师能够在模型能力和计算约束之间做出明智的权衡。

表 4.7:定量架构比较:对四个主要神经网络架构的计算复杂性分析。参数随网络维度缩放(N=神经元,M=输入,K=核大小,C=通道,D=深度,H=隐藏层大小,T=时间步长,d=模型维度)。内存需求反映训练期间的峰值激活存储。并行性表示适合并行计算。关键瓶颈代表典型部署中的主要性能限制因素。

指标 MLP CNN RNN Transformer
参数 O(N×M) O(K²×C×D) O(H²) O(N×d²)
(每样本 FLOPs) O(N×M) O(K²×H×W×C) O(T×H²) O(N²×d)
内存 O(B×M) O(B×H×W×C) O(B×T×H) O(B×N²)
(激活)
并行性 低(顺序)
关键瓶颈 内存带宽 内存带宽 顺序依赖 内存(N²)

这个定量框架通过明确揭示决定计算可行性的缩放行为,使系统性的架构选择成为可能。MLP 和 CNN 实现高并行性,但随着模型大小的增长面临内存带宽限制。RNN 保持恒定的内存使用,但为了顺序处理牺牲了并行性。Transformer 实现最大表达能力,但面临二次内存缩放,限制了序列长度。理解这些权衡对于将架构选择与部署限制相匹配至关重要。

决策框架

有效的架构选择需要平衡多个相互竞争的因素:数据特征、计算资源、性能要求和部署限制。虽然数据模式提供初始指导,复杂性分析建立可行性界限,但最终的架构选择通常涉及细微的权衡,需要系统性的评估。

图 4.12:架构选择决策框架:基于数据特征和部署限制的系统流程图,用于选择神经网络架构。该过程从数据类型识别(文本/序列/图像/表格)开始,以选择初始架构候选者(Transformer/RNN/CNN/MLPs),然后迭代评估内存预算、计算成本、推理速度、准确度目标和硬件兼容性。

图 4.12 提供了一种结构化的架构选择决策方法,确保考虑所有相关因素,同时避免基于新颖性或感知复杂性的常见陷阱。决策流程图通过首先将数据特征与架构优势相匹配,然后验证实际限制,来指导系统性的架构选择。该过程本质上是迭代的——资源限制或性能差距通常需要重新考虑早期选择。

此框架通过四个关键步骤应用。首先,数据分析:数据中的模式类型提供了最强的初始信号。空间数据自然与卷积神经网络(CNNs)相匹配,序列数据与循环神经网络(RNNs)相匹配。其次,渐进式约束验证:每个约束检查(内存、计算预算、推理速度)都充当一个过滤器。任何约束失败都需要降低当前架构的规模或考虑一个根本不同的方法。

第三,当准确性目标未达成时,进行迭代权衡处理。可能需要额外的模型容量,这需要回到约束检查。如果部署硬件无法支持所选架构,可能需要重新考虑整个架构方法。第四,预期多次迭代,因为真实项目通常在实现数据拟合、计算可行性和部署要求之间的最佳平衡之前,会多次循环通过此框架。

这种系统方法防止仅基于新颖性或感知到的复杂性选择架构,确保选择与问题要求和系统能力相一致。

统一框架:归纳偏差

探索的架构多样性——从多层感知器(MLPs)到转换器(Transformers)——共享一个统一的理论框架:每个架构体现特定的归纳偏差,这些偏差限制了假设空间并指导学习,以适应不同的数据类型和问题结构。

不同的架构形成了一个递减的归纳偏差层次。卷积神经网络(CNNs)通过局部连接、参数共享和平移等变性表现出最强的归纳偏差。这些约束大大减少了参数空间,同时限制了局部结构的空间数据的灵活性。循环神经网络(RNNs)通过序列处理和共享时间权重表现出适度的归纳偏差。隐藏状态机制假定过去的信息会影响当前的处理,这使得它们适用于时间序列。

多层感知器(MLPs)在层内处理之外保持最小的架构偏差。密集连接允许建模任意关系,但需要更多数据来学习其他架构明确编码的结构。转换器通过学习到的注意力模式表示自适应归纳偏差。该架构可以根据数据动态调整其归纳偏差,结合灵活性以及发现相关结构规律的能力。

所有成功的架构都实现了某种形式的分层表示学习,但通过不同的机制。CNN 通过逐步扩展感受野构建空间层次结构,应用了第 4.3 节中详细描述的空间模式处理框架。RNN 通过隐藏状态演变构建时间层次结构,扩展了第 4.4 节中的顺序处理方法。转换器通过多头注意力构建内容相关的层次结构,应用了第 4.5 节中描述的动态模式处理机制。

这种分层组织反映了一个原则:复杂的模式可以通过简单组件的组合有效地表示。深度学习成功的原因在于发现,当提供适当的架构归纳偏差时,基于梯度的优化可以有效地学习这些组合结构。

关于表示学习的理论洞察对系统工程有直接影响。分层表示需要能够高效地将较低级别的特征组合成高级抽象的计算模式。这推动了系统设计决策:

  • 存储层次结构必须与表示层次结构对齐以最小化数据移动成本

  • 并行化策略必须尊重分层计算的依赖结构

  • 硬件加速器必须高效地支持实现特征组合的矩阵运算

  • 软件框架必须提供抽象,以实现跨不同架构的高效分层计算

将架构视为体现不同的归纳偏差有助于解释它们的优点和系统需求,为架构选择和系统优化决策提供原则性的基础。

谬误与陷阱

神经网络架构代表为不同数据类型和问题域设计的专用计算结构,这导致了关于它们选择和部署的常见误解。从密集网络到转换器等丰富的架构模式往往导致工程师基于新颖性或感知的复杂性而非特定任务的要求和计算约束做出选择。

谬误更复杂的架构总是比简单的架构表现更好

这种误解促使团队立即采用基于 transformer 的模型或复杂的架构,而不了解其需求。虽然像 transformer 这样的复杂架构在处理需要长距离依赖的复杂任务方面表现出色,但它们需要显著更多的计算资源和内存。对于许多问题,尤其是那些数据有限或具有明显结构模式的问题,简单的架构(如 MLPs 或 CNNs)在显著减少计算开销的情况下也能达到相当的准确度。架构选择应与问题复杂性相对应,而不是默认选择最先进的选择。

陷阱: 在模型选择过程中忽视了架构选择的计算影响。

许多从业者仅根据学术论文中的准确度指标选择架构,而没有考虑计算需求。CNN 的空间局部性假设可能为图像任务提供出色的准确度,但需要特定的内存访问模式。同样,RNN 的序列依赖性创建了序列瓶颈,限制了并行化机会。这种疏忽导致模型在生产环境中无法满足延迟要求或超出内存限制时部署失败。

谬误: 架构性能与硬件特性无关。

这种信念假设所有架构在不同硬件平台上表现都一样好。实际上,不同的架构利用不同的硬件特性:CNN 受益于专门的张量核心,MLPs 利用高带宽内存,而 RNN 需要高效的序列处理能力。在 GPU 上实现最佳性能的模型可能在移动设备或嵌入式处理器上表现不佳。理解硬件-架构对齐对于有效的部署策略至关重要。

陷阱: 在不了解其交互效应的情况下混合架构模式。

结合不同的架构组件(例如向 CNN 添加注意力层或在 RNN 中使用跳过连接)可能会产生意外的计算瓶颈。每种架构模式都表现出独特的内存访问模式和计算特性。简单的组合可能会消除单个组件的性能优势或产生内存带宽冲突。成功的混合架构需要仔细分析不同模式在系统层面的交互。

陷阱: 在设计架构时没有考虑部署管道中全硬件-软件协同设计的全部影响。

许多架构决策优化高端 GPU 性能,而没有考虑从开发到部署的整个系统生命周期。为大规模计算集群设计的架构可能由于内存限制、缺乏专用计算单元或有限的并行化能力,不适合边缘部署。同样,针对推理延迟优化的架构可能会牺牲开发效率,导致更长的开发周期和更高的计算成本。有效的架构选择需要分析整个系统堆栈,包括计算基础设施、模型编译和优化工具、目标部署硬件和操作约束。在 CNN 深度和宽度、Transformer 头配置或激活函数之间的选择会对内存带宽利用率、缓存效率和数值精度要求产生级联效应,这些都需要整体考虑,而不是孤立地考虑。

摘要

神经网络架构形成了专门的计算结构,针对处理不同类型的数据和解决不同类别的问题。多层感知器通过密集连接处理表格数据,卷积网络利用图像中的空间局部性,循环网络处理序列信息。每个架构都体现了对数据结构和计算模式的具体假设。现代 Transformer 架构通过注意力机制统一了许多这些概念,该机制根据相关性而不是固定的连接模式动态路由信息。

尽管这些架构在表面上看起来多样化,但它们共享基本的计算原语,这些原语在不同设计中反复出现。矩阵乘法操作构成了计算核心,无论是在密集层、卷积还是注意力机制中。内存访问模式在架构之间差异很大,一些架构需要滑动窗口操作进行局部处理,而另一些架构则要求全局信息聚合。注意力机制中的动态计算模式创建了数据依赖的执行流程,这对传统的优化方法构成了挑战。

关键要点

  • 不同的架构对数据结构有特定的假设:MLPs 用于表格数据,CNNs 用于空间关系,RNNs 用于序列,Transformers 用于灵活的注意力

  • 包括矩阵运算、滑动窗口和动态路由在内的共享计算原语构成了跨不同架构的基础

  • 内存访问模式和数据处理需求在架构之间差异很大,这直接影响系统性能和优化策略

  • 理解算法意图与系统实现之间的映射关系,能够实现有效的性能优化和硬件选择

本章中建立的建筑学基础——计算模式、内存访问特性和数据移动原语——直接指导了后续章节中探讨的专用硬件和优化策略的设计。理解 CNN 表现出空间局部性使得可以开发针对卷积操作的谐振阵列优化(第十一章)。认识到 Transformer 需要二次方内存扩展促使了如 FlashAttention 和稀疏注意力模式等注意力特定优化(第十章)。从架构理解到硬件设计再到算法优化的发展过程代表了机器学习系统工程的系统方法。

随着架构变得更加动态和复杂,算法创新与系统优化之间的关系对于在现实世界的部署中实现实际性能提升变得越来越关键。在第十三章中讨论了在生产环境中部署和维护这些复杂架构的操作挑战,而在第十八章中探讨了可持续人工智能发展的更广泛影响,包括由架构选择引起的能源效率考虑。


AI 工作流程

DALL·E 3 提示:创建一个代表 AI 工作流程/管道的矩形流程图。从左到右,按以下顺序描绘阶段:'数据收集'用数据库图标表示,'数据预处理'用过滤器图标表示,'模型设计'用大脑图标表示,'训练'用权重图标表示,'评估'用勾选标记表示,'部署'用火箭表示。用箭头连接每个阶段,引导观众水平通过 AI 流程,强调这些步骤的顺序性和相互关联性。

图片

目的

什么系统框架指导着从初始开发到生产部署的机器学习系统的工程化?

生产机器学习系统需要系统思维和结构化框架。工作流程将机器学习开发组织成标准化的阶段:数据收集、模型开发、验证和部署。这些结构化流程管理数据质量和一致性,协调模型训练和实验,自动化优化流程,并在不同环境中协调部署。这些系统方法将实验直觉转化为工程学科,为机器学习系统建立心理框架。这种纪律性的基础使系统开发可重复,维护质量标准,并在整个机器学习生命周期中做出明智的决策。

学习目标

  • 将机器学习生命周期阶段与传统软件开发进行比较,并识别基本差异

  • 分析六个核心机器学习生命周期阶段(从问题定义到维护)及其相互关联的反馈关系

  • 应用系统思维原则,追踪约束传播如何影响多个生命周期阶段的决策

  • 使用特定的定量指标评估模型性能与部署约束之间的权衡

  • 设计考虑现实世界部署环境和操作要求的收集数据策略

  • 实施监控框架,从生产机器学习系统中捕获多尺度反馈循环

  • 评估问题定义决策对后续模型开发和部署选择的影响

  • 构建在资源受限环境中平衡计算效率与性能要求的部署架构

机器学习开发系统框架

在第一部分的基础原则(系统特性、部署环境、数学框架和架构模式)的基础上,本章从组件级分析推进到系统级工程。从理论理解到操作实施的转变需要一个系统框架来规范生产机器学习系统的发展。

本章介绍了机器学习工作流程作为系统化机器学习系统开发的指导方法论。传统的软件工程通过确定性的需求到实现的路径进行,而机器学习系统开发表现出根本不同的特征。ML 系统通过迭代实验 1 进化,其中模型从数据中提取模式,性能指标经过统计验证,部署约束创建反馈机制,从而告知早期开发阶段。这种经验主义、以数据为中心的方法需要专门的流程方法,以适应不确定性,协调并行开发流,并建立持续改进机制。

这里提出的系统框架为理解第二部分的设计原则奠定了理论基础。这种工作流程视角阐明了专门数据工程管道(第六章)的合理性,软件框架在启用迭代方法(第七章)中的作用,以及模型训练在综合系统生命周期中的整合(第八章)。没有这种概念框架,后续的技术组件看起来像是分散的工具,而不是一个连贯的工程学科中的集成元素。

本章以糖尿病视网膜病变筛查系统开发作为教学案例研究,展示了工作流程原则如何连接实验室研究和临床部署。这个例子说明了数据获取策略、架构设计决策、部署约束管理和满足运营需求之间的复杂相互依赖关系,这些是生产规模机器学习系统的特征。这些系统模式不仅适用于医学应用,而且展示了在多个领域可靠地运行机器学习系统所需的工程学科。

理解机器学习生命周期

机器学习生命周期是一个结构化、迭代的流程,它指导机器学习系统的开发、评估和改进。这种方法在时间上整合了系统实验、评估和适应,建立在几十年的结构化开发方法(Chapman et al. 2000)2 的基础上,同时解决数据驱动系统的独特挑战。

理解这个生命周期需要一种系统思维 3 方法,认识到四种基本模式:约束传播(一个阶段的决策如何影响所有其他阶段)、多尺度反馈循环(系统如何适应不同的时间尺度)、涌现复杂性(系统级行为与组件行为的不同)和资源优化(权衡如何创造相互依赖)。这些模式在我们关于糖尿病视网膜病变的案例研究中得到探索,为我们提供了理解为什么机器学习系统需要集成工程方法而不是顺序组件优化的分析框架。

机器学习生命周期 是一个迭代过程,通过反馈驱动的阶段来开发部署优化机器学习系统,强调对不断变化的数据和需求进行持续改进

图 5.1 通过两个并行管道可视化这个完整的生命周期:数据管道(绿色,顶部行)通过收集、摄取、分析、标记、验证和准备将原始输入转换为机器学习准备好的数据集。模型开发管道(蓝色,底部行)将这些数据集通过训练、评估、验证和部署来创建生产系统。关键洞察在于它们的相互连接——曲线反馈箭头显示了部署洞察如何触发数据优化,从而创建区分机器学习与传统线性开发的持续改进循环。

图 5.1

图 5.1:机器学习生命周期阶段:突出的反馈箭头(以粗体颜色显示的粗曲线线)强调了机器学习开发的迭代性质,其中监控洞察力持续地告知数据优化,评估结果触发模型改进,部署经验重塑数据收集策略。这些视觉反馈循环代表了机器学习生命周期的主要驱动因素,将其与线性开发方法区分开来,在后者中,后期阶段很少影响早期阶段。

这个工作流程框架是后续技术章节的支架。这里展示的数据管道在第六章中得到了全面处理,该章节讨论了如何确保数据质量并在机器学习生命周期中管理数据。模型训练扩展到第八章,涵盖了如何高效地大规模训练模型。使这种迭代开发过程成为可能的软件框架在第七章(ch013.xhtml#sec-ai-frameworks)中详细描述。部署和持续运营扩展到第十三章,讨论了系统如何在生产中保持性能。本章建立了在深入探讨每个部分之前这些部分如何相互连接——理解整个系统使专门的组件变得有意义。

本章重点介绍机器学习生命周期的概念阶段——开发过程的“是什么”和“为什么”。通过自动化、工具和基础设施实现这一生命周期的操作实施——“如何”——是 MLOps 的领域,我们将在第十三章(ch019.xhtml#sec-ml-operations)中详细探讨。这种区别至关重要:生命周期提供了理解机器学习开发阶段的系统框架,而 MLOps 提供了实施这些阶段的操作实践。理解这一生命周期基础使得专门的 MLOps 工具和实践变得有意义,而不是看起来像是分散的操作关注点。

机器学习 vs 传统软件开发

机器学习需要专门的周期性方法,因为机器学习开发与传统软件开发在本质上存在差异。传统的周期性方法包括一系列连续的阶段:需求收集、系统设计、实现、测试和部署 (Royce 1987)4。每个阶段都会产生特定的工件,这些工件作为后续阶段的输入。在金融软件开发中,需求阶段会产生关于交易处理、安全协议和合规性的详细规范。这些规范通过显式编程直接转化为系统行为,与第一章中探讨的机器学习系统的概率性质形成鲜明对比。

机器学习系统需要一种根本不同的方法。传统软件的确定性,其中行为是明确编程的,与机器学习系统的概率性质形成对比。以金融交易处理为例:传统系统遵循预定的规则(如果账户余额大于交易金额,则允许交易),而基于机器学习的欺诈检测系统 5 则从历史交易数据中学习识别可疑模式。这种从显式编程到学习行为的转变重塑了开发周期,改变了我们对待系统可靠性和鲁棒性的方法,这在第十六章(ch022.xhtml#sec-robust-ai)中有详细说明。

这些在系统行为上的基本差异引入了新的动态,改变了生命周期阶段之间的相互作用。这些系统需要通过持续的反馈循环进行持续优化,这些反馈循环能够从部署阶段获得洞察力,从而影响早期开发阶段。机器学习系统本质上是动态的,必须通过持续的部署 6 实践来适应不断变化的数据分布和目标。

当我们考察开发生命周期维度之间的具体差异时,这些对比变得更加清晰。以下表 5.1 总结了关键的区别。这些差异反映了在系统设计中将数据作为一等公民处理的核心挑战,这是传统软件工程方法未设计来处理的 7。

表 5.1:传统与 ML 开发:由于机器学习的数据驱动和迭代特性,传统软件和机器学习系统在开发过程中存在差异。机器学习生命周期强调实验和演变目标,需要阶段之间的反馈循环,而传统软件遵循具有预定义规范的线性进展。

方面 传统软件生命周期 机器学习生命周期
问题定义 预先定义精确的功能规范。 随着问题空间的探索,以性能为导向的目标会演变。
开发过程 功能实现的线性进展。 对数据、特性和模型进行迭代实验。
测试和 确定性、二进制通过/失败 统计验证和指标,
验证 测试标准。 涉及不确定性。
部署 行为保持静态,直到明确更新。 由于数据分布的变化,性能可能会随时间变化。
维护 维护涉及修改代码以解决错误或添加功能。 持续监控、更新数据管道、重新训练模型以及适应新的数据分布。
反馈循环 最小化;后期阶段很少影响早期阶段。 频繁的;部署和监控的见解通常完善早期阶段,如数据准备和模型设计。

这六个维度揭示了一个基本模式:机器学习系统用概率优化替换确定性规范,用动态适应替换静态行为,用隔离开发替换持续反馈。这种转变解释了为什么传统的项目管理方法在没有修改的情况下应用于机器学习项目时会失败。

机器学习中的实验与传统软件中的测试在本质上存在差异。在 ML 中,实验构成了核心的开发过程本身,而不仅仅是错误检测。它涉及系统地测试关于数据源、特征工程方法、模型架构和超参数的假设,以产生最佳性能。这代表了一种发现过程的科学方法,而不仅仅是质量保证步骤。传统的软件测试根据预定的规范验证代码行为,而 ML 实验探索不确定的空间,以发现产生最佳经验结果的优化组合。

这些差异强调了需要强大的机器学习生命周期框架,以适应迭代开发、动态行为和数据驱动的决策。理解这些区别使得我们可以考察机器学习项目在其生命周期阶段中的展开情况,每个阶段都提出了传统软件方法无法充分解决的独特挑战。

这个基础使得我们可以探索构成机器学习生命周期的具体阶段以及它们如何应对这些独特的挑战。

六个核心生命周期阶段

人工智能系统需要专门的开发方法。构成机器学习生命周期的具体阶段提供了这种专门的框架。这些阶段作为一个综合框架运作,其中每个阶段都建立在先前的基础上,同时为后续阶段做准备。

从图 5.1 的详细管道视图转向,我们现在展示一个更高层次的概念视角。图 5.2 将这些详细管道整合为六个主要生命周期阶段,为理解机器学习系统开发的整体进展提供了一个简化的框架。这种抽象有助于我们思考更广泛的阶段,而不会迷失在管道特定细节中。虽然早期图强调了数据和模型的并行处理,但这个概念视角强调了通过主要开发阶段的顺序进展——尽管我们将探讨,这些阶段通过连续反馈保持相互关联。

图 5.2 说明了六个核心阶段,这些阶段定义了成功的 AI 系统开发:问题定义确立目标和约束,数据收集与准备涵盖了整个数据管道,模型开发与训练涵盖了模型创建,评估与验证确保质量,部署与集成将系统带入生产,监控与维护确保持续的有效性。这些阶段通过连续反馈循环运作,后期阶段的见解经常为早期阶段的改进提供信息。这种循环性质反映了将机器学习开发与传统软件工程区分开来的实验性和数据驱动特征。

图片

图 5.2:机器学习系统生命周期:连续反馈循环(通过从监控到数据收集的突出返回路径强调)驱动了定义成功机器学习系统的迭代开发。这个周期通过问题定义、数据准备、模型构建、评估、部署和持续监控进行,但大的反馈箭头说明了后期阶段的见解如何持续地告知和改进早期阶段,从而能够适应不断变化的需求和数据分布。

生命周期始于问题定义和需求收集,在这一阶段,团队明确界定要解决的问题,建立可衡量的性能目标,并识别关键约束。精确的问题定义确保了系统目标与期望结果之间的一致性,为所有后续工作奠定了基础。

在这个基础上,下一个阶段汇集实现这些目标所需的数据资源。数据收集和准备包括收集相关数据、对其进行清理,并为其模型训练做准备。这个过程涉及整理多样化的数据集,确保高质量标注,并开发预处理管道以解决数据中的变化。这一阶段的复杂性在第六章(ch012.xhtml#sec-data-engineering)中探讨。

在数据资源到位的情况下,开发过程创建能够从这些资源中学习的模型。模型开发和训练包括选择合适的算法、设计模型架构以及使用准备好的数据进行模型训练。成功取决于选择适合问题的技术,并对模型设计进行迭代以实现最佳性能。高级训练方法和分布式训练策略在第八章(ch014.xhtml#sec-ai-training)中详细说明,而底层架构在第四章(ch010.xhtml#sec-dnn-architectures)中介绍。

模型训练完成后,严格的评估确保它们在部署前满足性能要求。这一评估和验证阶段涉及对模型性能进行严格测试,以预定义的指标为基准,并验证其在不同场景中的行为,确保模型在实际条件下准确、可靠且稳健。

验证完成后,模型通过谨慎的部署流程从开发环境过渡到运营系统。部署和集成需要解决实际挑战,如系统兼容性、可扩展性和在不同部署环境中的运营约束,这些环境从云端到边缘环境不等,如第二章(ch008.xhtml#sec-ml-systems)所述。

最后一个阶段认识到部署的系统需要持续的监督以维持性能并适应变化条件。这一监控和维护阶段侧重于持续跟踪系统在现实环境中的性能,并在必要时进行更新。有效的监控确保系统随着时间的推移保持相关性和准确性,适应数据、需求或外部条件的变化。

案例研究:糖尿病视网膜病变筛查系统

为了将这些生命周期原则与现实相结合,我们考察了糖尿病视网膜病变(DR)筛查系统从最初的研究到广泛临床部署的发展过程(Gulshan 等人 2016)。在本章中,我们利用这一案例作为教学工具,展示生命周期阶段在实际中的相互联系,展示一个阶段的决策如何影响后续阶段。

注意:虽然这个叙述借鉴了糖尿病视网膜病变筛查部署的记录经验,包括谷歌的工作,但我们已经调整和综合了细节,以说明在医疗人工智能系统中遇到的常见挑战。我们的目标是教育性的——通过一个现实案例展示生命周期原则——而不是提供任何特定项目的纪录片描述。所提出的技术选择、限制和解决方案代表了医疗人工智能开发中的典型模式,这些模式阐明了更广泛系统思维原则。

从研究成功到临床现实

DR 筛查挑战最初看起来很简单:开发一个能够分析视网膜图像并准确检测糖尿病视网膜病变迹象的人工智能系统,其准确度与专家眼科医生相当。最初的研究结果在受控的实验室条件下达到了专家级的表现。然而,从研究成功到临床影响的过程揭示了人工智能生命周期的复杂性,其中技术卓越必须与运营现实、监管要求和现实世界的部署限制相结合。

这个医疗挑战的规模解释了为什么人工智能辅助筛查成为医学上的必需品,而不仅仅是技术上的有趣。糖尿病视网膜病变影响全球超过 1 亿人,是导致可预防失明的首要原因 8。图 5.3 展示了临床挑战:区分健康视网膜和出现早期视网膜病变迹象的视网膜,如可见的暗红色出血点。虽然这似乎是一个简单的图像分类问题,但从实验室成功到临床部署的路径展示了人工智能生命周期复杂性的各个方面。

图片

图 5.3:视网膜出血:糖尿病视网膜病变在视网膜图像中引起可见的出血,为医学图像分析中模型训练和评估提供了一个关键视觉指标。这些图像代表了用于开发自动检测和分类视网膜疾病的算法的输入数据,最终有助于早期诊断和治疗。来源:谷歌。

系统工程教训

DR 系统开发展示了生命周期各阶段的基本人工智能系统原则。数据质量问题导致分布式数据验证的创新。农村诊所的基础设施限制推动了边缘计算 9 优化的突破。与临床工作流程的集成揭示了人机协作设计的重要性。这些经验表明,构建健壮的人工智能系统不仅需要准确模型;成功需要系统性的工程方法,这些方法解决现实世界的部署复杂性。

这场穿越现实世界部署挑战的全面旅程反映了医疗人工智能发展的更广泛模式。在整个生命周期阶段,DR 案例研究展示了早期阶段做出的决策如何影响后续阶段,反馈循环如何推动持续改进,以及如何需要整体解决方案来应对新兴的系统行为。这些部署挑战反映了医疗人工智能 10 中的更广泛问题,这些问题影响大多数现实世界的医学机器学习应用。

这条叙事线索展示了人工智能生命周期的集成性质从一开始就需要系统思维。DR 案例表明,可持续的人工智能系统源于对所有生命周期阶段之间复杂交互的理解和设计,而不是从优化独立的各个组件中产生。

在建立这个框架和案例研究之后,对每个生命周期阶段的考察从问题定义开始。

问题定义阶段

机器学习系统开发始于与传统软件开发不同的挑战:不仅要定义系统应该做什么,还要定义系统应该如何学习去做。传统的软件需求直接转化为实施规则,而机器学习系统需要团队考虑系统如何在现实世界的约束条件下从数据中学习 11。如图 5.2 图所示,这一阶段为机器学习生命周期中所有后续阶段奠定了基础。

DR 筛查示例说明了这种复杂性在实际中的体现。糖尿病视网膜病变筛查系统的问题定义揭示了看似简单的医学成像任务背后的复杂性。最初看似简单的计算机视觉实际上需要定义多个相互关联的目标,这些目标塑造了每个后续的生命周期阶段。

开发团队在这些系统中平衡相互冲突的约束:诊断准确性以确保患者安全、计算效率以适应农村诊所的硬件、工作流程集成以促进临床应用、符合监管要求以获得医疗设备批准,以及成本效益以实现可持续部署。每个约束都会影响其他约束,从而形成一个复杂的优化问题,传统软件开发方法无法解决。这种多维问题定义推动了数据收集策略、模型架构选择和部署基础设施决策在整个项目生命周期中的发展。

平衡相互冲突的约束

问题定义决策贯穿于系统设计。DR 筛查系统中的需求分析从最初关注诊断准确性指标,发展到包括部署环境约束和机遇。

实现检测可参考糖尿病视网膜病变的 90%以上的灵敏度可以防止视力丧失,同时保持 80%以上的特异性可以避免因假阳性而使转诊系统不堪重负。这些指标必须在多样化的患者群体、摄像头设备和资源有限环境中的典型图像质量条件下实现。

农村诊所部署施加了严格的约束,反映了来自第二章的边缘部署挑战:模型必须在计算能力有限的设备上运行,在断断续续的互联网连接下可靠运行,并在临床工作流程时间框架内产生结果。这些系统需要由接受过最少技术培训的医疗保健工作者操作。

医疗设备法规要求进行广泛的验证、审计跟踪和性能监控能力,这些都会影响数据收集、模型开发和部署策略。

这些相互关联的需求展示了在机器学习系统中进行问题定义需要理解系统将运行的完整生态系统。早期识别这些约束使团队能够做出对成功部署至关重要的架构决策,而不是在重大开发投资之后才发现限制。

协同问题定义流程

建立清晰且可操作的问题定义涉及一个系统性的工作流程,该流程连接了技术、运营和用户考虑因素。该过程从确定系统的核心目标开始:它必须执行的任务和必须满足的约束。团队与利益相关者合作,收集领域知识,概述需求,并预测在现实世界部署中可能出现的挑战。

在 DR 类型的项目中,这一阶段涉及与临床医生的紧密合作,以确定农村诊所的诊断需求。在此阶段,关键决策,如平衡模型复杂性与硬件限制,以及确保医疗提供者的可解释性,会浮现出来。此方法必须考虑到监管方面的考虑,例如患者隐私和符合医疗标准。这一合作过程确保了问题定义既与技术可行性相一致,也与临床相关性相符。

适应规模变化的定义

随着机器学习系统的规模扩大,其问题定义必须适应新的运营挑战 12。一个 DR 类型的系统最初可能专注于具有一致成像设置的有限数量的诊所。然而,当这样的系统扩展到包括具有不同设备、员工专业知识和患者人口统计的诊所 13 时,原始问题定义需要调整以适应这些变化。

规模化也引入了数据挑战。更大的数据集可能包括更多样化的边缘案例,这可能会暴露出初始模型设计中的弱点。将部署扩展到新地区会引入成像设备和患者群体的变化,这需要进一步调整系统。从一开始就定义一个能够适应这种多样性的问题,确保系统在未来扩展时无需进行全面重新设计。

在我们的 DR 示例中,问题定义过程塑造了数据收集策略。多人群验证的需求推动了多样化训练数据的需求,而边缘部署的限制影响了数据预处理方法。合规性需求决定了注释协议和质量保证标准。这些相互关联的需求展示了有效的问题定义如何预见在后续生命周期阶段中可能出现的问题,为集成系统开发奠定了基础,而不是顺序的、孤立的优化。

在明确的问题定义建立之后,开发过程转向组装实现这些目标所需的数据资源。

数据收集与准备阶段

数据收集和准备是机器学习生命周期中的第二个阶段(图 5.2),在这一阶段,原始数据被收集、处理并准备用于模型开发。这一阶段提出了超越收集足够训练示例 14 的独特挑战。这些挑战构成了第六章的核心关注点。对于像 DR 筛查这样的医疗人工智能系统,数据收集必须在统计严谨性和操作可行性之间取得平衡,同时满足诊断准确性的最高标准。

在 DR 示例中,问题定义决策塑造了数据需求。建立的多维成功标准(跨不同人群的准确性、硬件效率和法规遵从性)要求的数据收集策略超越了典型的计算机视觉数据集。

在这样一个系统中建立这个基础可能需要组装一个包含 128,000 张视网膜眼底照片的开发数据集,每张照片都由 54 位专家中的 3-7 位眼科专家审查 15。这种专家共识方法解决了医疗诊断中的固有主观性,同时建立了可以经受监管审查的地面真实标签。标注过程捕捉了与临床相关的特征,如微动脉瘤、出血和硬性渗出物,涵盖了疾病严重程度的全谱。

高分辨率视网膜扫描通常根据分辨率和压缩比生成 10-120 兆字节的文件,这创造了巨大的基础设施挑战。典型的诊所每天处理 50 名患者,每周生成的影像数据量为 5-15 GB,这取决于图像质量和压缩比,很快就会超过农村互联网连接的容量(通常限于 2-10 Mbps 的上传速度)。这种数据量限制迫使架构决策转向边缘计算解决方案,而不是基于云的处理。

桥接实验室和现实世界数据

从实验室质量训练数据过渡到现实世界部署时,当这样的系统转移到农村诊所环境时,会暴露出基本差距。

当部署开始在泰国和印度等地区的农村诊所开始时,现实世界数据与精心策划的训练集差异很大。图像来自各种相机设备,由不同专业水平的员工操作,通常在光照条件不佳和患者定位不一致的情况下进行。这些变化威胁到模型性能,并揭示了需要强大的预处理和质量保证系统。

这个数据量限制驱动了在第二章中讨论的部署范例之间的基本架构决策:边缘计算部署而不是基于云的推理。本地预处理将带宽需求减少了 95%(从每周 15 GB 减少到 750 MB 传输),但需要 10 倍更多的本地计算资源,这决定了模型优化策略和部署硬件需求,使用专门的边缘设备如 NVIDIA Jetson16。

典型的解决方案架构源于数据收集限制:NVIDIA Jetson 边缘设备(2-32GB RAM,64-2048 CUDA 核心,取决于模型)用于本地推理,诊所聚合服务器(8 核 CPU,32GB RAM)用于数据管理,以及使用 32-GPU 集群进行每周模型更新的云训练基础设施。这种分布式方法实现了低于 80 毫秒的推理延迟,并在覆盖 200 多个诊所位置的部署中实现了 94%的可用性。

患者隐私法规要求采用联邦学习架构,允许在不集中敏感患者数据的情况下进行模型训练。这种方法增加了数据收集工作流程和模型训练基础设施的复杂性,但对于获得监管批准和临床采用至关重要。

这些经验说明了我们之前建立的约束传播原则:数据收集的生命周期决策在系统开发过程中产生约束和机会,这些约束和机会会传播到整个系统,从基础设施设计到模型架构塑造一切。

分布式部署的数据基础设施

在大规模下,了解数据特性和部署限制如何驱动架构决策变得至关重要。每个视网膜图像都遵循复杂的旅程:在诊所摄像头中捕获,本地存储和初步处理,质量验证,安全传输到中央系统,以及与训练数据集的集成。

不同的数据访问模式需要不同的存储解决方案。团队通常实施分层方法,平衡成本、性能和可用性:频繁访问的训练数据需要高速存储以实现快速模型迭代,而历史数据集可以容忍较慢的访问时间,以换取成本效益。智能缓存系统根据使用模式优化数据访问,确保相关数据始终易于获取。

农村诊所部署面临重大的连接限制,需要灵活的数据传输策略。对于有可靠互联网的诊所,实时传输效果良好,而存储转发系统则允许在间歇性连接的地区进行操作。这种自适应方法确保了无论当地基础设施限制如何,系统都能保持一致运行。

基础设施设计必须能够预见从试点部署到数百个诊所的增长。该架构能够适应不同的数据量、不同的硬件配置以及多样化的运营需求,同时保持数据一致性和系统可靠性。当系统扩展到新区域时,这一可扩展性基础证明是至关重要的。

大规模数据管理

在扩展规模时应用系统思维,随着机器学习系统的扩展,数据收集挑战呈指数级增长。在我们的 DR 示例中,从初始诊所扩展到更广泛的网络引入了突现的复杂性:设备、工作流程和操作条件存在显著差异。每个诊所实际上成为一个独立的数据节点 17,但系统需要确保所有地点的性能一致。遵循之前建立的协作协调模式,团队实施专门的编排,共享工件存储库、版本化 API 和自动测试管道,从而能够高效地管理大型诊所网络。

将此类系统扩展到更多的诊所也会带来数据量的增加,因为更高分辨率的成像设备成为标准,生成更大、更详细的图像。这些进步放大了对存储和处理基础设施的需求,需要优化以保持效率而不影响质量。患者人口统计学、诊所工作流程和连接模式的不同进一步强调了需要稳健的设计来优雅地处理这些变化。

扩展挑战突出了在数据收集阶段做出的决策如何在整个生命周期中产生连锁反应,影响后续阶段,如模型开发、部署和监控。例如,在收集过程中容纳更高分辨率的直接影响了训练和推理的计算需求,强调了即使在早期阶段也需要考虑生命周期思维。

质量保证与验证

质量保证是数据收集过程的一个组成部分,确保数据满足下游阶段的要求。在我们的 DR 示例中,在收集点进行的自动检查会标记出诸如焦点不佳或构图不正确等问题,允许诊所工作人员立即解决问题。这些主动措施确保低质量数据不会在管道中传播。

验证系统通过验证图像质量、适当的标签、患者关联以及符合隐私法规来扩展这些努力。在本地和集中级别运行,这些系统确保数据可靠性和鲁棒性,保护整个机器学习管道的完整性。

在此类系统中的数据收集经验直接指导模型开发方法。在数据收集期间发现的架构限制(有限的带宽、多样化的硬件、间歇性的连接)为模型效率建立了要求,这些要求推动了架构决策。受隐私限制所需的分布式联邦学习方法影响了训练管道的设计。在不同临床环境中观察到的质量变化塑造了验证策略和鲁棒性要求。这种数据收集洞察与模型开发策略之间的耦合展示了如何通过综合的生命周期规划超越顺序阶段优化。

图 5.4展示了这些关键的反馈循环,这些循环使得系统能够持续改进。在数据收集期间建立的基础既使可用的技术方法能够创建有效的模型,又对其施加了限制——这种动态在我们现在过渡到模型开发阶段时变得明显。

图片

图 5.4:机器学习生命周期依赖性:迭代反馈循环连接数据收集、准备、模型训练、评估和监控,强调每个阶段都在连续过程中影响和影响后续阶段。有效的机器学习系统开发需要承认这些依赖关系,以优化数据、重新训练模型并保持长期性能。

模型开发与训练阶段

模型开发和训练(图 5.2 中的第三阶段)是机器学习系统的核心,但这一阶段提出了超越选择算法和调整超参数的独特挑战 18。训练方法、基础设施要求和分布式训练策略在第八章中有所介绍。在医疗保健等高风险领域,每个设计决策都会影响临床结果,因此将技术性能与操作限制相结合至关重要。

在我们的 DR 示例中,早期生命周期决策通过模型开发层层递进。所建立的问题定义要求(专家级准确性与边缘设备兼容性)创建了一个优化挑战,这要求对模型架构和训练策略都采取创新方法。

迁移学习是将在大规模数据集上预训练的模型应用于新任务的技巧,通过利用学习到的表示,显著减少训练时间数据需求

通过使用从 ImageNet19 迁移学习并结合精心标注的 128,000 张图像的数据集,此类项目中的开发者实现了 0.91-0.95 的 F 分数 20,在受控环境中与眼科医生的表现相当或更好。这一结果验证了将大规模预训练与领域特定微调相结合的方法——一种利用第三章中的基于梯度的优化原则的训练策略,以适应第四章中预训练的卷积架构,用于医学成像。

实现高精度只是第一个挑战。关于边缘部署约束的数据收集见解对效率提出了严格的要求:模型必须在 98MB 以下运行,达到低于 50ms 的推理延迟,并在运行时消耗低于 400MB 的 RAM。最初的研究模型(一个 2.1GB 的集成 21,实现 95.2%的准确率)违反了所有部署约束,需要系统优化以达到最终 96MB 模型,同时保持 94.8%的准确率并满足所有操作要求。

这些约束推动了架构创新,包括用于尺寸缩减、推理加速和高效部署场景的模型优化技术——平衡第四章中提到的深度卷积网络的计算需求与第二章中详细说明的边缘设备资源限制。

按照建立的迭代开发框架,模型开发过程需要在精度优化和效率优化之间进行持续迭代。每个架构决策(从卷积层的数量到第三章中涵盖的激活函数选择,再到第四章中探索的整体网络深度)都必须通过测试集指标和数据收集期间确定的基础设施约束进行验证。这种多目标优化方法体现了相互依赖原则,即部署约束塑造开发决策。

平衡性能和部署约束

我们 DR 示例中的模型开发经验展示了临床有效性和部署可行性之间的基本权衡,这是现实世界 AI 系统的特征。

医疗应用需要特定的性能指标 22,这些指标与第三章中引入的标准分类指标有显著差异。DR 系统需要>90%的灵敏度(以防止因漏诊而导致的视力丧失)和>80%的特异性(以避免过度占用转诊系统)。这些指标必须在不同的患者群体和图像质量条件下得到保持。

仅优化临床性能是不够的。数据收集阶段边缘部署的约束施加了额外的要求:模型必须在资源有限的硬件上高效运行,同时保持与临床工作流程兼容的实时推理速度。这创造了一个多目标优化问题,其中某一维度的改进往往以牺牲其他维度为代价,这是模型容量(在第四章中探讨)和部署可行性(在第二章中讨论)之间的基本紧张关系。团队发现,一个原始的 2GB 模型,准确率达到 95.2%,可以通过系统应用量化、剪枝和知识蒸馏 23 技术优化到 96MB,准确率保持在 94.8%,同时满足部署要求并保持临床效用。

选择使用轻量级模型集合而不是单个大型模型,体现了模型开发决策如何通过系统生命周期传播。这个架构决策降低了单个模型的复杂性(使边缘部署成为可能),但增加了推理管道的复杂性(影响部署和监控策略)。团队必须为模型集合开发编排逻辑,并创建能够跟踪多个模型组件性能的监控系统。

这些模型开发经验强化了我们之前建立的生命周期集成原则。从选择用于空间特征提取的 CNN 架构(第四章)到配置训练超参数(第三章)的架构决策会影响数据预处理管道、训练基础设施需求以及部署策略。这表明,成功的模型开发需要预测后续生命周期阶段的约束,而不是孤立地优化模型,反映了我们的系统思维方法。

受约束的开发流程

实际约束从初始探索到最终优化的整个模型开发过程,要求系统性的实验方法。

开发始于数据科学家和领域专家(如医学成像中的眼科医生)之间的协作,以识别指示目标条件的特征。这种跨学科方法确保模型架构能够捕获临床相关特征,同时满足在数据收集期间确定的计算限制。

计算限制深刻地塑造了实验方法。生产级机器学习工作流程产生乘法成本:10 个模型变体 × 5 个超参数搜索(探索从 1e-4 到 1e-2 的学习率,从 16 到 128 的批量大小,以及从第三章中的优化算法)× 3 个预处理方法(原始图像,直方图均衡化,自适应滤波)= 150 次训练运行。根据硬件和持续时间的不同,每次训练运行的费用大约在$500-2000 之间,迭代成本可以达到每个实验周期$150K。这种经济现实推动了高效实验的创新:智能作业调度减少了 60%的空闲 GPU 时间,缓存中间结果节省了 30%的预处理时间,早期停止技术在完成 20%后终止无望的实验,以及自动资源优化实现了 2.3 倍的成本效率。

机器学习模型开发表现出涌现行为,使得结果本质上具有不确定性,需要科学方法论原则:通过固定的随机种子和环境版本进行变量控制,进行系统性的消融研究 24 以隔离组件贡献,通过混杂因素分析将架构效应与优化效应分开,以及使用 A/B 测试 25 框架在多次运行中进行统计显著性测试。这种方法对于区分真正的性能改进和统计噪声至关重要。

在整个开发过程中,团队将模型与早期生命周期阶段中确定的部署约束进行验证。每个架构创新都必须评估其准确性改进以及与边缘设备限制和临床工作流程要求兼容性。这种双重验证方法确保开发工作与部署目标保持一致,而不是优化实验室条件,这些条件无法转化为实际世界的性能。

从原型到生产规模开发

随着类似我们的 DR 示例项目从原型发展到生产系统,团队在多个维度上遇到涌现的复杂性:更大的数据集、更复杂的模型、并发实验和分布式训练基础设施。这些扩展挑战展示了适用于大型规模 AI 系统开发的系统思维原则。

从单机训练转向分布式系统引入了协调需求,这要求在提高训练速度和增加系统复杂性之间进行平衡。这导致实施容错机制和自动故障恢复系统。编排框架允许基于组件的管道构建,具有可重用阶段、自动资源扩展和对分布式组件的监控。

随着实验生成包括模型检查点、训练日志和性能指标等工件 26,系统跟踪变得至关重要。如果没有结构化的组织,团队可能会从他们的实验努力中失去机构知识。解决这个问题需要实施系统性的实验识别、自动工件版本控制和通过性能特征和配置参数查询实验的能力。

大规模模型开发需要在训练计算和支撑基础设施之间进行资源分配。虽然有效的实验管理需要计算开销,但这种投资通过系统性的性能分析和优化加速了开发周期并提高了模型质量。

模型开发过程既建立了能力,也建立了直接影响下一生命周期阶段的限制。边缘优化的集成架构使得诊所部署成为可能,但需要复杂的服务基础设施。规定验证要求塑造了部署验证协议。这些相互关联的需求展示了开发决策如何为部署方法奠定基础并设定限制。

这些模型开发成就最终为部署阶段带来了新的挑战。一个满足边缘设备约束的优化集成架构仍然需要复杂的服务基础设施。能够实现快速迭代的分布式训练方法需要模型版本控制和诊所部署的同步。指导模型开发的规定验证要求也指导了部署验证和监控策略。这些相互关联展示了成功的模型开发必须预见部署挑战,确保技术创新可以转化为能够创造价值的运营系统。

部署与集成阶段

在部署和集成阶段(图 5.2 中的第五阶段),训练好的模型被集成到生产系统和流程中。部署需要解决实际挑战,如系统兼容性、可扩展性和运营限制。成功的集成确保模型在现实世界环境中的预测是准确且可执行的,在这些环境中,资源限制和工作流程中断可能构成障碍。部署和维护的操作方面在第十三章中有详细说明。

在我们的灾难恢复(DR)示例中,部署策略是由我们之前确定的多样化环境所塑造的。边缘部署允许在具有间歇性连接的农村诊所中本地处理视网膜图像,而自动质量检查则会标记出低质量的图像以便重新捕获,确保预测的可靠性。这些措施展示了部署必须将技术复杂性与技术可用性和临床环境中的可扩展性相结合。

技术和运营需求

部署需求既源于模型的技术规范,也源于其预期环境的运营限制。在我们的 DR 类型系统中,模型必须在具有有限计算资源和间歇性互联网连接的农村诊所中运行。它必须适应现有的临床工作流程,需要快速、可解释的结果来协助医疗保健提供者,而不会造成干扰。

这些要求影响了部署策略。虽然基于云的部署在技术上更简单,但由于许多诊所的连接不可靠,可能不可行。相反,团队通常选择边缘部署,其中模型在诊所硬件上本地运行。这种方法需要模型优化以满足特定的硬件约束:目标指标可能包括小于 98MB 的模型大小、低于 50ms 的推理延迟以及在边缘设备上低于 400MB 的 RAM 使用。实现这些目标需要系统地应用优化技术,以减少模型大小和计算需求,同时平衡准确性的权衡。

与现有系统的集成带来了额外的挑战。机器学习系统必须与医院信息系统(HIS)接口,以访问患者记录并存储结果。隐私法规要求在每一步都进行安全的数据处理,这影响着部署决策。这些考虑确保系统遵守临床和法律标准,同时保持日常使用的实用性。

分阶段推广和集成流程

在我们的 DR 示例中,部署和集成工作流程突出了模型功能、基础设施和用户体验之间的复杂相互作用。该过程从在模拟环境中进行彻底测试开始,这些模拟环境复制了目标诊所的技术约束和工作流程。这些模拟有助于早期识别潜在的瓶颈和不兼容性,使团队能够在全面推广之前完善部署策略。

一旦部署策略确定,团队通常会实施分阶段推广。初始部署仅限于几个试点站点,允许在真实世界条件下进行受控测试。这种方法提供了来自临床医生和技术人员的宝贵反馈,有助于识别在模拟中未出现的問題。

集成工作侧重于确保机器学习系统与现有工具之间无缝交互。例如,这样的 DR 系统必须从 HIS 中提取患者信息,处理连接的摄像头中的视网膜图像,并以临床医生易于解释的格式返回结果。这些任务需要开发健壮的 API、实时数据处理管道和针对医疗保健提供者需求的用户友好界面。

多地点部署挑战

在多个诊所地点部署我们的 DR 类型系统揭示了将 AI 系统扩展到受控实验室环境之外的基本挑战。每个诊所都提出了独特的约束:不同的成像设备、不同的网络可靠性、不同的操作员专业知识水平以及不同的工作流程模式。

从开发到部署的转变暴露了显著的性能挑战。成像设备和操作员技能的差异性导致数据质量不一致,这使得模型难以处理。基础设施限制可能迫使进行紧急模型优化,展示了部署现实如何反向传播到开发过程,影响预处理策略、架构决策和验证方法。

团队发现部署架构决策在整个系统中产生级联效应。边缘部署最小化了实时临床工作流程的延迟,但对模型复杂性施加了严格的限制。云部署使模型具有灵活性,但可能引入对时间敏感的医疗应用不可接受的延迟。

成功的部署需要不仅仅是技术优化。临床医生反馈通常表明,初始系统界面需要重大重新设计才能实现广泛采用。团队必须在技术复杂性和临床可用性之间取得平衡,认识到用户信任和熟练程度与算法性能一样关键。

管理分布式部署的改进需要复杂的协调机制。集中式版本控制系统和自动更新管道确保性能改进到达所有部署站点,同时最大限度地减少对临床运营的干扰。如图图 5.4 所示,部署挑战创造了多个反馈路径,推动系统持续改进。

确保临床级可靠性

在临床环境中,可靠性至关重要。DR 型系统需要在各种条件下无缝运行,从高患者数量到次优成像设置。为确保稳健性,团队实施安全措施,以检测和处理常见问题,例如不完整或质量较差的数据。这些机制包括自动图像质量检查和系统遇到错误时的回退工作流程。

测试在确保可靠性方面发挥着核心作用。团队进行广泛的压力测试,以模拟峰值使用场景,验证系统在高吞吐量下不会性能下降。关键组件中内置冗余,以最小化停机风险,并且所有与外部系统(如 HIS)的交互都经过严格的兼容性和安全性测试。

在此类系统中的部署经验揭示了这一阶段如何从以开发为中心的活动过渡到以运营为中心的关注点。现实世界的部署反馈(从临床医生可用性关注到硬件性能问题)产生了见解,这些见解为最终的生命周期阶段提供了信息:持续的监控和维护策略。分布式边缘部署架构为系统级监控和协调更新创造了新的要求。与医院信息系统集成的挑战确立了管理系统进化的协议,而不会干扰临床工作流程。

成功的部署为有效的监控和维护奠定了基础,创建了使持续改进成为可能的运营基础设施和反馈机制。部署经验表明,这一阶段不是终点,而是过渡到持续运营阶段,这一阶段体现了我们的系统思维方法。

监控与维护阶段

一旦人工智能系统从部署过渡到生产运营,它们将进入与传统软件系统截然不同的运营阶段。如图 5.2 图所示,反馈循环从最终阶段返回到数据收集,监控和维护创建了一个持续循环,使系统可靠地运行。传统应用程序保持静态行为,直到明确更新,而机器学习系统必须考虑不断变化的数据分布、使用模式的改变和模型性能漂移。

监控和维护是确保部署的机器学习系统持续有效性和可靠性的持续、关键过程。传统的软件维护静态行为,而机器学习系统必须考虑数据分布的变化 27、使用模式的改变以及不断发展的运营需求 28。监控提供了适应这些挑战所需的反馈,而维护确保系统不断进化以满足新的需求。这些运营实践构成了第十三章的基础。

正如我们在图 5.4 图中看到的,监控作为系统改进的中心枢纽,产生了三个关键的反馈循环:“性能见解”返回到数据收集以解决差距,“数据质量问题”触发数据准备的改进,以及“模型更新”在性能漂移时启动重新训练。在我们的 DR 示例中,这些反馈循环使系统持续改进:识别代表性不足的患者人口统计学(触发新的数据收集)、检测图像质量问题(改进预处理)以及解决模型漂移(启动重新训练)。

对于 DR 筛查系统,持续监控跟踪不同诊所的系统性能,检测可能影响准确性的问题,如患者人口统计学的变化或新的成像技术。主动维护包括计划纳入 3D 成像模式,如 OCT,扩大系统的诊断能力,以诊断更广泛的疾病。这证明了设计能够适应未来挑战的系统的重要性,同时保持符合严格的医疗保健法规和第十七章中探讨的负责任 AI 原则。

动态系统的生产监控

监控和维护的需求既来自技术需求,也来自运营现实。在我们的 DR 示例中,从技术角度进行监控需要持续跟踪模型性能、数据质量和系统资源使用情况。然而,运营限制增加了复杂性:监控系统必须与临床工作流程相一致,检测患者人口统计学的变化,并向技术团队和医疗保健提供者提供可操作的见解。

初始部署通常突出显示几个系统未能满足现实需求的地方,例如,5 年以上的设备在诊所中准确性降低 15-25%,或分辨率低于 1024x1024 像素的图像。监控系统检测到特定子组的性能下降:增殖性糖尿病视网膜病变(影响 2%的筛查人群)的患者准确性降低 18%,以及有显著白内障的图像(影响 65 岁以上老年人的 12%)的敏感性损失 22%。这些盲点在实验室验证期间可能看不见,但在临床实践中至关重要 29,这些信息指导了维护策略,包括针对性的数据收集(添加 15,000 张受白内障影响的照片)和架构改进(使用专门的病理检测器的集成模型)。

这些需求对系统设计产生了重大影响。这些系统的关键性质要求实时监控能力,而不是定期的离线评估。团队通常建立明确的定量性能阈值和行动触发器:P95 延迟超过基线的 2 倍将生成立即警报,并具有 5 分钟响应 SLA,模型准确性下降超过 5%将触发每日警报,并具有自动重新训练工作流程,数据漂移人口稳定性指数(PSI)30 得分高于 0.2 将启动每周警报,并通知数据团队,资源利用率超过 80%将激活自动扩展机制和成本监控。

监控需求也会影响模型设计,因为团队会整合细粒度性能跟踪和异常检测的机制。甚至系统的用户界面也会受到影响,需要以清晰、可操作的方式向临床和技术人员展示监控数据。

通过反馈循环实现持续改进

我们 DR 示例中的监控和维护工作流程揭示了自动化系统、人类专业知识和不断发展的医疗实践之间错综复杂的相互作用。此工作流程从定义完整的监控框架开始,建立关键绩效指标(KPIs),并实施仪表板和警报系统。此框架必须在监控深度与系统性能和隐私考虑之间取得平衡,收集足够的数据以检测问题,而不会过度负担系统或违反患者隐私。

随着系统的成熟,维护成为一个越来越动态的过程。由新的医学知识或性能改进驱动的模型更新需要仔细验证和受控的发布。团队采用 A/B 测试框架来评估实际条件下的更新,并在问题出现时实施回滚机制 31 以快速解决问题。与处理代码更改的传统软件不同,机器学习系统必须考虑数据演变 33 对模型行为的影响,这是传统 CI/CD 管道未设计用来处理的方式。

监控和维护构成一个迭代周期,而不是离散的阶段。监控的见解为维护活动提供信息,而维护工作往往需要更新监控策略。团队开发工作流程,以便无缝地从问题检测过渡到解决,涉及技术和临床领域的跨领域协作。

分布式系统大规模监控

如我们的 DR 示例所示,从 5 个试点站点扩展到 200 多个诊所部署,监控和维护的复杂性呈指数增长。每个额外的诊所每周产生 2-5 GB 的操作日志(包括推理时间、图像质量指标、错误率和使用模式),每周在系统范围内产生 400-1000 GB 的数据量,需要自动分析。每个诊所还引入了环境变量:15+种不同的摄像头型号(从 200 万像素的移动设备到 1200 万像素的专业系统)、不同的操作技能水平(从受过培训的技术人员到社区健康工作者),以及多样的人口统计模式(城市与农村,平均年龄差异 20+年)。

需要监控全局性能指标和特定站点行为的需求需要复杂的基础设施。监控系统跟踪阶段级指标,包括分布式工作流程中的处理时间、错误率和资源利用率,维护完整的数据血缘 34 跟踪,包括从源到预测的审计跟踪以符合监管要求,将生产问题与特定的训练实验相关联以实现快速根本原因分析,并为跨团队和项目的资源使用提供成本归因跟踪。

持续适应增加了额外的复杂性。现实世界的使用使系统暴露于不断扩大的场景范围。从这些场景中捕捉洞察力并使用它们来驱动系统更新,需要将新数据集成到训练管道中并部署改进模型,而不破坏临床工作流程的有效机制。

预测和防止系统退化

仅靠反应性维护对于动态运营环境来说是不够的。主动策略变得至关重要,以预测和防止问题在影响临床运营之前发生。

预测性维护模型根据运营数据中的模式识别潜在问题。持续学习管道允许系统根据新数据进行重新训练和适应,确保其与临床实践或患者人口统计学的演变保持相关性。这些能力需要仔细平衡,以确保安全性和可靠性,同时保持系统性能。

评估适应性和弹性的指标与准确性一样重要,反映了系统与其运营环境一起演变的能力。主动维护确保系统能够处理未来的挑战,而不会牺牲可靠性。

这些监控和维护经验使我们的生命周期之旅圆满结束,展示了图 5.1 中所示的持续反馈循环。生产洞察力为精炼的问题定义、数据质量改进、架构增强和后续迭代的基础设施规划提供信息——关闭了区分 ML 系统与传统线性开发的循环。

这种持续的反馈和改进周期体现了将 AI 系统与传统软件开发区分开来的系统思维方法。成功不是来自孤立地完善各个生命周期阶段,而是来自构建通过理解所有组件如何相互连接来学习、适应和改进的系统。

集成系统思维原则

通过我们的糖尿病视网膜病变案例研究检查 AI 生命周期的每个阶段,系统级模式浮现出来,这些模式区分了成功的 AI 项目与那些在集成挑战中挣扎的项目。DR 示例表明,构建有效的机器学习系统不仅需要技术卓越,还需要理解技术决策如何创建在整个开发和部署过程中级联的相互依赖关系。

从我们的分析中出现了四个基本的系统思维模式:约束传播、多尺度反馈、涌现的复杂性和资源优化。这些模式为理解后续技术章节如何相互关联提供了分析框架,展示了为什么专门的数据工程、框架、培训和运营方法共同实现了个体优化无法实现的集成系统。

决策如何通过系统级联

约束传播代表了机器学习开发中最关键的系统思维模式:早期的决策会产生级联效应,塑造每一个后续阶段。我们的 DR 示例清楚地说明了这一模式:>90%的敏感性要求推动数据收集策略(需要专家共识标签),这影响了模型架构的选择(需要高容量网络),这决定了部署约束(需要边缘优化),这塑造了监控方法(需要分布式性能跟踪)。

这种传播是双向的,它创建的是动态约束网络而不是线性依赖。当乡村诊所部署揭示带宽限制(平均 2-10 Mbps)时,团队必须重新设计数据预处理管道以实现 95%的压缩比率,这需要针对压缩输入优化的模型架构,这影响了考虑数据退化的训练策略。理解这些级联关系使团队能够做出适应系统约束而不是与之对抗的架构决策。

在多个时间尺度上协调反馈

机器学习系统通过在多个时间尺度上协调反馈循环而成功,每个循环服务于不同的系统优化目的。我们的 DR 部署体现了这一模式:分钟级循环(实时质量检查,自动图像验证),日循环(200 多个诊所的模型性能监控),周循环(汇总精度分析,漂移检测),月循环(人口统计数据偏差评估,硬件性能审查),以及季度循环(架构评估,为新地区进行容量规划)。

这些反馈循环的时间结构反映了机器学习系统的内在动态。快速循环能够快速纠正操作问题——一个诊所配置错误的摄像头可以在几分钟内被检测并纠正。较慢的循环能够实现战略适应——认识到人口统计数据的变化需要扩展训练数据,需要数月的监控来可靠地检测。这种多尺度方法防止了反应性变化(过度响应日常波动)和缓慢适应(对有意义趋势反应不足)。

理解系统级行为

复杂系统表现出在分析单个组件时不可见的涌现行为,但在系统尺度上变得明显。我们的 DR 部署揭示了这一模式:单个诊所可能显示出稳定的 94%准确率,但系统级分析检测到影响特定人口群体的微妙性能退化——这些模式在单一站点监控中不可见,但对于公平的医疗保健提供至关重要。

机器学习系统中的涌现复杂性在表现上与传统软件不同。虽然传统的分布式系统通过确定性级联(服务器崩溃、网络分区)失败,但机器学习系统通过数据漂移、模型偏差放大和跨异构环境的微妙性能侵蚀表现出概率性退化。管理这种复杂性需要分析框架,这些框架可以检测分布式部署中的统计模式,在系统级问题显现之前进行主动干预。

多维度资源权衡

机器学习系统中的资源优化涉及多维度权衡,这些权衡在传统软件开发中不存在,产生了复杂的相互依赖关系。我们的 DR 案例说明了这些权衡:将模型精度从 94.8%提高到 95.2%,需要将模型大小从 96MB 扩展到 180MB,这迫使部署从边缘设备(每个 200-600 美元)转移到更强大的硬件(每个 800-2000 美元),在 200 多个诊所中乘以——这导致基础设施成本增加了 16 万美元,而精度仅提高了 0.4%。

这些资源权衡表现出非线性关系,难以用简单的优化方法解决。训练时间与数据大小呈二次方关系,但模型精度改进的回报递减。边缘部署将推理延迟减少了 85%,但将模型复杂性限制了 90%。云部署允许无限的模型复杂性,但引入了 200ms 以上的延迟,违反了临床工作流程要求。理解这些权衡关系使团队能够做出战略性的架构决策,而不是试图孤立地优化单个组件。

机器学习系统工程学科

这四种系统思维模式——约束传播、多尺度反馈、涌现复杂性和资源优化——汇聚在一起,定义了一种工程机器学习系统的基本不同的方法。与可以独立优化的传统软件不同,机器学习系统需要同时考虑跨组件依赖关系、时间动态和资源约束的集成优化。

DR 案例研究证明了这种集成方法产生的系统比通过逐个阶段顺序优化开发的系统更稳健、更适应性强、更有效。当团队设计出能够预见部署限制的数据收集策略,创建能够适应运营现实情况的设计架构,并实施能够推动持续改进的监控系统时,他们能够达到孤立优化方法无法达到的性能水平。这种系统的集成代表了将机器学习从实验技术转变为可靠系统工程实践的核心工程学科。

谬误和陷阱

机器学习的发展引入了与传统软件开发不同的独特复杂性,然而许多团队在未认识到这些差异的情况下,试图应用熟悉的开发模式。机器学习的实验性质、数据质量的核心作用以及模型的概率行为,都创造了传统方法无法解决的问题的工作流程挑战。

谬误: 机器学习开发可以遵循传统的软件开发工作流程而不做修改。

这种误解导致团队直接将传统的软件开发实践应用于机器学习项目。正如我们在传统与 AI 生命周期比较中确立的,ML 系统通过数据可变性、算法随机性和不断发展的模型性能引入了基本的不确定性,这是传统的确定性方法无法处理的。将 ML 项目强制纳入僵化的瀑布或标准敏捷方法,通常会导致错过截止日期、模型验证不足和部署失败。成功的 ML 工作流程需要专门的数据验证阶段(第六章)、实验跟踪阶段(第七章)和迭代模型细化阶段(第八章)。

陷阱: 将数据准备视为一次性预处理步骤。

许多从业者将数据收集和预处理视为初始工作流程阶段,一旦完成,在整个项目生命周期中保持静态。这种方法未能考虑到现实世界数据的动态性,其中分布变化、质量变化和新数据源持续出现。生产系统需要持续的数据验证、漂移监控和适应性预处理管道,如第六章中详细所述。将数据准备视为已完成里程碑的团队,在部署系统遇到与训练条件不同的数据时,往往会遇到意外的模型退化,这突显了第十六章中探讨的鲁棒性挑战。

谬误: 开发环境中的模型性能准确预测生产性能。

这种信念假设在开发期间实现良好的指标可以确保成功的部署。开发环境通常使用干净、精心整理的数据集和受控的计算资源,创造出很少与生产现实相匹配的人工条件。生产系统面临数据质量问题、延迟限制、资源限制和开发期间不存在的不利输入。在开发中表现优异的模型可能会因为这些环境差异而在生产中失败,需要专门设计的工作流程阶段,通过第十三章中涵盖的鲁棒部署实践和第二章中的系统设计原则来弥合这一差距。

陷阱: 跳过系统验证阶段以加速开发时间表。

在快速交付的压力下,团队通常会绕过验证、测试和文档阶段。这种方法将验证视为额外负担,而不是基本工程学科。不充分的验证会导致具有隐藏偏差、泛化能力差或仅在生产中出现的意外故障模式的模型。在部署后修复这些问题所需的成本超过了系统验证所需的时间投资。健壮的工作流程将验证嵌入到整个开发过程中,而不是将其视为最终检查点,并纳入第十二章中详细说明的基准测试和评估原则。

摘要

本章将机器学习生命周期确立为工程机器学习系统的系统性框架,这是一条思维路线图,它组织了数据、模型和部署基础设施在整个开发过程中的相互联系。图 5.1 通过两个并行管道可视化了这个框架:数据管道通过收集、摄取、分析、标记、验证和准备将原始输入转换为机器学习准备好的数据集,而模型开发管道将这些数据集通过训练、评估、验证和部署创建生产系统。关键洞察在于它们的相互联系:反馈箭头显示了部署洞察如何触发数据优化,从而创建区分机器学习与传统线性开发的持续改进循环。

理解这个框架可以解释为什么机器学习系统需要与传统的软件截然不同的专门方法。机器学习工作流程用概率优化取代了确定性规范,用动态适应取代了静态行为,用连续反馈循环取代了孤立开发。这种系统性的视角认识到,成功并非来自孤立地完善各个阶段,而是来自理解数据质量如何影响模型性能,部署限制如何塑造训练策略,以及生产洞察如何指导每个后续的开发迭代。

关键要点

  • 机器学习生命周期为理解后续技术章节之间的相互联系提供了框架——数据工程、框架、训练和操作各自处理这个完整系统中的特定组件。

  • 两个并行管道定义了机器学习开发的特点:数据处理(收集→准备)和模型开发(训练→部署),它们通过连续反馈循环统一。

  • 机器学习工作流程通过迭代实验、数据驱动适应和反馈机制与传统的软件截然不同,这些机制使系统能够持续改进。

  • 系统思维模式——约束传播、多尺度反馈、涌现复杂性和资源优化——涵盖了后续章节中探讨的所有技术实现。

这里建立的工作流程框架为第二部分的技术章节提供了组织结构。数据工程(第六章)扩展了我们探讨的数据管道阶段,讨论了如何确保数据在整个生命周期中的质量和数据管理。框架(第七章)考察了支持这种迭代开发过程的软件工具。训练(第八章)详细说明了如何高效地大规模训练模型。运营(第十三章)探讨了系统如何通过图 5.1 中展示的反馈循环在生产中维持性能。每一章后续章节都假设你理解其特定技术如何适应这个完整的流程,并在此基础上构建系统性的视角。


数据工程

DALL·E 3 提示:创建一个矩形插图,可视化数据工程的概念。包括原始数据源、数据处理管道、存储系统和精炼数据集。展示原始数据如何通过清理、处理和存储转化为有价值的信息,这些信息可以用于分析和决策制定。

图片

目的

为什么数据质量作为基础,决定了机器学习系统在生产环境中成功或失败?

机器学习系统依赖于数据质量:没有算法可以克服糟糕的数据,但优秀的数据工程甚至可以使简单的模型取得显著的结果。与逻辑明确的传统软件不同,机器学习系统从数据模式中推导行为,使质量成为系统可靠性的主要决定因素。理解数据工程原理为构建在多样化生产环境中一致运行、随时间保持性能并随着数据量和复杂性的增加而有效扩展的机器学习系统提供了基础。

学习目标

  • 应用四支柱框架(质量、可靠性、可扩展性、治理)来系统地评估数据工程决策

  • 计算机器学习系统的基础设施需求,包括存储容量、处理吞吐量和标注成本

  • 设计数据管道,以保持训练-服务一致性,防止生产中机器学习失败的主要原因

  • 根据质量-成本-规模权衡来评估获取策略(现有数据集、网络抓取、众包、合成数据)

  • 设计适合不同机器学习工作负载模式的存储系统(数据库、数据仓库、数据湖、特征存储)

  • 在数据生命周期中实施数据治理实践,包括血缘跟踪、隐私保护和偏差缓解

数据工程作为系统学科

在上一章中探讨的系统方法为机器学习发展的程序基础奠定了基础,然而,在这些工作流程的每个阶段都存在一个基本前提:强大的数据基础设施。在传统软件中,计算逻辑由代码定义。在机器学习中,系统行为由数据定义。这种范式转变使得数据成为工程过程中的第一公民,类似于源代码,需要一个新的学科,即数据工程,以同样的严谨性来管理它。

虽然工作流程方法为构建机器学习系统提供了组织框架,但数据工程提供了实现这些方法的技术基础。高级建模技术和严格的验证程序无法弥补数据基础设施的不足,而精心设计的数据系统甚至可以使传统方法实现显著的性能提升。

本章探讨了数据工程作为一门系统性的工程学科,其重点在于设计、构建和维护将异构原始信息转化为适合机器学习应用的高质量、可靠数据集的基础设施。与计算逻辑保持明确和确定性的传统软件系统不同,机器学习系统从其底层数据模式中推导出其行为特征,将数据基础设施质量作为系统效能的主要决定因素。因此,关于数据获取、处理、存储和治理的架构决策影响着机器学习系统在生产环境中是否能够实现预期的性能。

数据工程是设计和维护将原始数据转化为可靠可访问分析就绪数据集的数据基础设施的系统学科,通过原则性的获取、处理、存储和治理实践实现。

当考察数据质量问题如何在机器学习系统中传播时,数据工程决策的关键重要性变得显而易见。传统的软件系统在遇到格式不正确的输入时通常会生成可预测的错误响应或明确的拒绝,使开发者能够实施立即的纠正措施。机器学习系统则提出了不同的挑战:数据质量缺陷表现为微妙的性能下降,这些下降在整个处理管道中累积,通常在生产环境中直到系统发生灾难性故障才被发现。虽然单个错误标记的训练实例可能看似无关紧要,但系统性的标记不一致会系统地破坏整个特征空间中的模型行为。同样,生产环境中的数据分布逐渐变化会逐渐降低系统性能,直到需要进行全面模型重新训练。

这些挑战需要超越临时解决方案和反应性干预的系统工程方法。有效的数据工程需要对基础设施需求进行系统分析,这与应用于工作流程设计的纪律性方法相平行。本章发展了一个数据工程决策的原则性理论框架,围绕四个基础支柱(质量、可靠性、可扩展性和治理)组织,为从初始数据获取到生产部署的技术选择提供系统指导。我们考察了这些工程原则在整个数据生命周期中的体现,明确了构建支持当前机器学习工作流程的数据基础设施所需的系统级思维,同时保持系统需求演变时的适应性和可扩展性。

我们不是孤立地分析单个技术组件,而是检查工程决策之间的系统性相互依赖关系,展示了数据基础设施系统的内在互联性。这种综合分析视角在我们准备检查处理这些精心设计的计算数据集的计算框架时尤为重要,这是后续章节的主要关注点。

四支柱框架

构建有效的机器学习系统不仅需要理解数据工程是什么,还需要实施一个结构化的框架,以做出关于数据基础设施的原则性决策。关于存储格式、摄取模式、处理架构和治理政策的决策需要系统性的评估,而不是临时选择。这个框架围绕四个基础支柱组织数据工程,确保系统实现功能性、鲁棒性、可扩展性和可靠性。

四个基础支柱

每个数据工程决策,从选择存储格式到设计摄取管道,都应该与四个基础原则进行评估。每个支柱通过系统性的决策制定为系统成功做出贡献。

首先,数据质量是系统成功的基础。在整个机器学习生命周期中,质量问题会通过称为“数据级联”的现象(第 6.3 节)累积放大,其中早期失败会传播并放大到下游。质量包括准确性、完整性、一致性和适合于预期机器学习任务的程度。高质量的数据对于模型成功至关重要,这种关系的数学基础在第三章和第四章中进行了探讨。

在这个质量基础上,机器学习系统需要一致、可预测的数据处理,能够优雅地处理失败。可靠性意味着构建即使在组件故障、数据异常或意外负载模式的情况下也能继续运行的系统。这包括在整个数据管道中实施全面的错误处理、监控和恢复机制。

虽然可靠性确保了持续运行,但可扩展性解决了增长挑战。随着机器学习系统从原型发展到生产服务,数据量和处理需求急剧增加。可扩展性涉及设计能够处理增长的数据量、用户基础和计算需求,而无需进行完整的系统重新设计。

最后,治理提供了质量、可靠性和可扩展性运行的框架。数据治理确保系统在法律、伦理和业务约束下运行,同时保持透明度和问责制。这包括隐私保护、偏差缓解、合规监管以及建立明确的数据所有权和访问控制。

图片

图 6.1:数据工程四支柱:质量、可靠性、可扩展性和治理构成了机器学习数据系统的基本框架。每个支柱都贡献了基本能力(实线箭头),而支柱之间的权衡(虚线)需要仔细平衡:验证开销影响吞吐量,一致性约束限制分布式扩展,隐私要求影响性能,而偏差缓解可能会减少可用的训练数据。有效的数据工程需要系统地管理这些紧张关系,而不是孤立地优化任何单个支柱。

通过系统思维整合支柱

虽然单独理解每个支柱提供了重要的见解,但认识到它们的个体重要性只是有效数据工程的第一步。如图 6.1 所示,这四个支柱不是独立的组件,而是统一系统的相互关联的方面,其中某一领域的决策会影响所有其他领域。质量改进必须考虑到可扩展性约束,可靠性要求会影响治理实施,而治理政策会塑造质量指标。这种系统视角指导我们对数据工程的探索,检查每个技术主题如何支持并平衡这些基础原则,同时管理它们固有的紧张关系。

如图 6.2 所示,根据各种行业调查,数据科学家将 60-80%的时间花在数据准备任务上 1。这一统计数据反映了当前的状态,即数据工程实践往往是临时的而不是系统的。通过一致地应用四支柱框架来解决这个问题,团队可以减少数据准备时间,同时构建更可靠和可维护的系统。

图片

图 6.2:数据科学家时间分配:数据准备消耗了数据科学工作的大部分努力,高达 60%,强调了系统化数据工程实践的需求,以防止下游模型失败并确保项目成功。优先考虑数据质量和管道开发比仅仅关注高级算法能带来更大的回报。来源:各种行业报告。

框架在数据生命周期中的应用

这个四支柱框架指导我们从问题定义到生产操作的整个数据工程系统探索过程。我们首先建立清晰的问题定义和治理原则,这些原则塑造了所有后续的技术决策。然后,框架引导我们通过数据获取策略,其中质量和可靠性要求决定了我们如何获取和验证数据。处理和存储决策自然地遵循可扩展性和治理约束,而运营实践确保整个系统生命周期中维护这四个支柱。

此框架指导我们系统地探索数据工程的每个主要组件。在后续章节中,当我们检查数据获取、摄取、处理和存储时,我们考察这些支柱如何在具体技术决策中体现:平衡质量与可扩展性的来源技术、支持治理约束下的性能的存储架构,以及处理管道在处理大规模数据时保持可靠性。

表 6.1 提供了每个支柱如何在数据管道主要阶段体现的全面视图。此矩阵既作为系统设计的规划工具,也作为在不同管道阶段出现问题时进行故障排除的参考。

表 6.1:数据管道各阶段应用的四项支柱:此矩阵说明了质量、可靠性、可扩展性和治理原则如何在数据工程管道的每个主要阶段体现。每个单元格显示了在该阶段实施相应支柱的具体技术和实践,提供了一个全面的框架,用于系统决策和故障排除。

阶段 质量 可靠性 可扩展性 治理
获取 典型抽样,偏差检测 多样化来源,冗余收集策略 网络爬虫,合成数据生成 同意,匿名化,道德来源
摄取 架构验证,数据概要分析 死信队列,优雅降级 批量处理与流处理,自动扩展管道 访问控制,审计日志,数据血缘
处理 一致性验证,训练-服务一致性 幂等变换,重试机制 分布式框架,横向扩展 血缘追踪,隐私保护,偏差监控
存储 数据验证检查,新鲜度监控 备份,复制,灾难恢复 分层存储,分区,压缩优化 访问审计,加密,保留策略

为了将这些概念扎根于实际现实,我们以关键词检测(KWS)系统作为贯穿的案例研究,展示框架原则如何转化为工程决策。

数据级联和系统基础的需求

机器学习系统面临一种独特的失败模式,这使它们与传统软件工程区别开来:“数据级联”,2 由 Sambasivan 等人 2021 提出的现象,其中早期阶段的数据质量问题在整个管道中放大,导致下游模型失败、项目终止和潜在的用户伤害。与传统软件中不良输入通常产生即时错误不同,ML 系统在质量问题时会默默退化,直到问题严重到需要完全重建系统。

当团队在开始数据收集和处理工作之前跳过建立明确的质量标准、可靠性要求和治理原则时,就会发生数据级联。这种基本漏洞促使我们提出四支柱框架:质量、可靠性、可扩展性和治理提供了防止级联失败和构建稳健机器学习系统所需的系统基础。

图 6.3 展示了每个阶段潜在的数据陷阱以及它们如何影响后续整个流程。数据收集错误的影響尤为明显。如图所示,任何在这个初始阶段的疏忽将在第八章(ch014.xhtml#sec-ai-training)和第十三章(ch019.xhtml#sec-ml-operations)中讨论的模型评估和部署阶段变得明显,可能导致放弃整个模型并重新开始的昂贵后果。因此,从一开始就投资于数据工程技术将帮助我们及早发现错误,减轻这些级联效应。

图片

图 6.3:数据质量级联:在机器学习工作流程早期引入的错误会在后续阶段放大,增加成本,并可能导致预测错误或有害结果。认识到这些级联现象会促使我们积极投资于数据工程和质量控制,以减轻风险并确保系统性能可靠。来源:(Sambasivan 等人 2021)。

早期建立治理原则

在理解了质量问题如何在机器学习系统中级联之后,我们必须建立治理原则,确保我们的数据工程系统在道德、法律和商业约束范围内运行。这些原则不是事后才考虑的应用,而是塑造每个技术决策的基础性要求。

这些治理原则的核心是,数据系统必须在整个生命周期中保护用户隐私并维护安全性。这意味着从初始系统设计开始实施访问控制、加密和数据最小化实践,而不是作为后续的增强功能添加。隐私要求直接影响数据收集方法、存储架构和处理方法。

除了隐私保护之外,数据工程系统必须积极努力识别和减轻数据收集、标注和处理中的偏差。这需要多样化的数据收集策略、代表性的抽样方法,以及在整个流程中的系统性偏差检测。关于数据来源、标注方法和质量指标的技术选择都会影响系统的公平性。数据中的隐藏分层——即子群体代表性不足或表现出不同模式,即使在表现良好的模型中也可能导致系统性失败(Oakden-Rayner 等人 2020),这强调了为什么人口平衡和代表性需要从一开始就融入数据收集。

补充这些公平性努力,系统必须保持关于数据来源、处理决策和质量标准的清晰文档。这包括实施数据血缘跟踪、维护处理日志,并明确数据质量决策的所有权和责任。

最后,数据系统必须遵守相关的法规,如 GDPR、CCPA 和特定领域的需求。合规要求影响数据保留政策、用户同意机制和跨境数据传输协议。

这些治理原则与我们的质量、可靠性和可扩展性等技术支柱相辅相成。如果一个系统侵犯了用户隐私,那么它就不再是真正可靠的,如果质量指标持续产生不公平的结果,那么它们也就没有意义。

结构化问题定义方法

在这些治理基础之上,我们需要一个系统性的方法来定义问题。正如 Sculley 等人(2021)强调的,机器学习系统需要的问题框架超越了传统的软件开发方法。无论是开发处理数百万用户交互的推荐引擎,分析医学图像的计算机视觉系统,还是处理多样化文本数据的自然语言模型,每个系统都带来了独特挑战,需要在我们的治理和技术框架内进行仔细考虑。

在此背景下,确立明确的目标提供了统一的方向,指导整个项目,从数据收集策略到部署操作。这些目标必须在技术性能和治理要求之间取得平衡,创造可衡量的成果,包括准确性指标和公平性标准。

这种系统性的问题定义方法确保了治理原则和技术要求从一开始就得到整合,而不是事后进行修改。为了实现这种整合,我们确定了任何数据收集工作之前必须采取的关键步骤:

  1. 确定并明确表述问题定义

  2. 设定明确的目标以满足

  3. 建立成功基准

  4. 理解最终用户的参与/使用情况

  5. 理解部署的约束和限制

  6. 进行数据收集。

  7. 迭代和改进。

通过关键词检测案例研究应用框架

为了展示这些系统化原则在实际中的运作方式,关键词检测(KWS)系统为我们提供了一个理想的案例研究,用于将我们的四支柱框架应用于现实世界的数据工程挑战。这些系统为智能手机和智能扬声器等语音激活设备提供动力,必须在连续的音频流中检测特定的唤醒词(如“OK, Google”或“Alexa”),同时在严格的资源限制下运行。

如图 6.4 所示,KWS 系统作为轻量级、始终开启的前端运行,触发更复杂的语音处理系统。这些系统展示了我们框架四个支柱之间的相互挑战(第 6.2 节):质量(跨不同环境的准确性)、可靠性(一致的电池供电操作)、可扩展性(严重的内存限制)和治理(隐私保护)。这些限制解释了为什么许多 KWS 系统只支持有限的语言:由于治理和可扩展性的挑战,为较小的语言群体收集高质量、代表性的语音数据变得难以承受,这证明了所有四个支柱必须协同工作才能实现成功的部署。

图片

图 6.4:关键词检测系统:在语音激活设备中典型部署的关键词检测(KWS)技术,其中持续监听的系统检测到唤醒词以启动进一步处理。本例演示了 KWS 如何作为轻量级、始终开启的前端,为更复杂的语音界面服务。

在建立这个框架理解之后,我们可以将我们的问题定义方法应用于我们的 KWS 示例,展示四个支柱如何指导实际工程决策:

  1. 识别问题:KWS 在环境声音和其他说话声中检测特定关键词。主要问题在于设计一个能够以高精度、低延迟和最小化误报或漏报识别这些关键词的系统,尤其是在计算资源有限的设备上。为开发新的 KWS 模型制定一个明确的问题定义,应确定所需的关键词以及预期的应用和部署场景。

  2. 设定明确目标:KWS 系统的目标必须平衡多个相互竞争的要求。性能目标包括实现高准确率(关键词检测准确率达到 98%)的同时确保低延迟(关键词检测和响应在 200 毫秒内完成)。资源限制要求最小化功耗以延长嵌入式设备的电池寿命,并确保模型大小针对设备上可用的内存进行了优化。

  3. 成功的基准:建立明确的指标来衡量 KWS 系统的成功。关键性能指标包括真正阳性率(正确识别的关键词占所有说话关键词的百分比)和假阳性率(包括静音、背景噪音和不在词汇表中的词被错误地识别为关键词的百分比)。检测/错误权衡曲线通过比较每小时假接受率(总评估音频持续时间内的假阳性)与假拒绝率(评估音频中未识别的关键词与说话关键词的比例)来评估 KWS 在代表现实部署场景的流式音频上的表现,如 Nayak 等人所展示的(2022)。操作指标跟踪响应时间(关键词语音到系统响应)和功耗(关键词检测期间的平均功耗)。

  4. 利益相关者参与和理解:与利益相关者进行互动,这些利益相关者包括设备制造商、硬件和软件开发者以及最终用户。了解他们的需求、能力和限制。不同的利益相关者会带来相互竞争的优先级:设备制造商可能会优先考虑低功耗,软件开发者可能会强调易于集成,而最终用户则会优先考虑准确性和响应速度。在整个开发过程中,平衡这些相互竞争的要求将塑造系统架构决策。

  5. 理解嵌入式系统的限制和局限性:嵌入式设备自带一套挑战,这些挑战塑造了关键词识别系统(KWS)的设计。内存限制需要极其轻量级的模型,通常小至 16 KB 以适应 SoC 的始终在线岛 3,这一限制仅涵盖模型权重,而预处理代码也必须适应严格的内存限制。来自有限的计算能力(几百兆赫的时钟速度)的处理能力限制要求对模型进行激进优化以提高效率。功耗变得至关重要,因为大多数嵌入式设备都使用电池供电,要求 KWS 系统在持续监听期间实现亚毫瓦的功耗。环境挑战又增加了一层复杂性,因为设备必须在从安静的卧室到嘈杂的工业环境等不同的部署场景中有效运行。

  6. 数据收集和分析:对于一个 KWS 系统来说,数据质量和多样性决定了成功。数据集必须通过包括不同年龄和性别的各种口音的说话者来捕捉人口统计学上的多样性,以确保广泛的识别支持。关键词的变化需要关注,因为人们发音唤醒词的方式不同,需要数据集捕捉这些发音细微差别和轻微变化。背景噪声的多样性证明是至关重要的,需要包括或增强不同环境噪声的数据样本,以训练模型适应从安静环境到嘈杂条件等现实世界的场景。

  7. 迭代反馈和改进:最后,一旦开发出一个原型 KWS 系统,团队必须确保系统随着时间的推移和用例的发展与定义的问题和目标保持一致。这需要在现实世界场景中进行测试,收集有关某些用户或部署场景相对于其他用户或场景是否遇到性能不足的反馈,并根据观察到的失败模式迭代地改进数据集和模型。

在这个问题定义的基础上,我们的关键词唤醒系统(KWS)展示了不同的数据收集方法如何在项目生命周期中有效地结合。现有的数据集,如谷歌的语音命令(Warden 2018),为初始开发提供了基础,提供了精心挑选的常见唤醒词的语音样本。然而,这些数据集通常在口音、环境和语言方面缺乏多样性,需要额外的策略。

为了解决覆盖范围上的差距,网络爬虫通过从视频平台和语音数据库收集多样化的语音样本来补充基线数据集,捕捉自然语言模式和唤醒词的变化。众包平台如亚马逊机械师(4)允许针对不同人口统计学和环境收集唤醒词样本,对于代表性不足的语言或特定的声学条件特别有价值。

最后,通过语音合成(Werchniak et al. 2021)和音频增强,合成数据生成填补了剩余的空白,在声学环境、说话者特征和背景条件下创建无限的唤醒词变化。这种全面的方法使得 KWS 系统能够在各种现实世界条件下稳健地运行,同时展示了如何通过系统性的问题定义指导整个项目生命周期中的数据策略。

通过 KWS 案例研究建立我们的框架原则,我们现在探讨这些抽象概念如何通过数据管道架构转化为操作现实。

数据管道架构

数据管道是我们四支柱框架的系统化实现,将原始数据转换为机器学习准备格式,同时保持质量、可靠性、可扩展性和治理标准。这些不是简单的线性数据流,而是复杂的系统,必须协调多个数据源、转换过程和存储系统,同时确保在不同负载条件下的性能一致性。管道架构将我们的抽象框架原则转化为操作现实,其中每一支柱都表现为关于验证策略、错误处理机制、吞吐量优化和可观察性基础设施的具体工程决策。

为了说明这些概念,我们的关键词提取系统(KWS)的管道架构必须处理连续的音频流,保持低延迟处理以实现实时关键词检测,并确保数据处理的隐私保护。该管道必须从处理样本音频文件的开发环境扩展到处理数百万并发音频流的生产部署,同时保持严格的质量和治理标准。

图片

图 6.5:数据管道架构:模块化管道摄取、处理和交付数据以供机器学习任务使用,使组件能够独立扩展,并提高数据质量控制。不同的阶段(摄取、存储和准备)将原始数据转换为适合模型训练和验证的格式,形成可靠机器学习系统的基础。

如架构图所示,机器学习数据管道由几个不同的层组成:数据源、摄取、处理、标记、存储和机器学习训练(图 6.5)。每一层在数据准备工作流程中扮演着特定的角色,为每一层选择适当的技术需要理解我们的四个框架支柱在每个阶段的表现。我们不是将这些层视为独立的组件分别优化,而是考察一个阶段的质量要求如何影响另一个阶段的可扩展性约束,可靠性需求如何塑造治理实施,以及支柱如何相互作用以确定整体系统有效性。

这些设计决策的核心是,数据管道设计受限于存储层次结构和 I/O 带宽限制,而不是 CPU 容量。理解这些限制能够构建能够处理现代机器学习工作负载的高效系统。从高延迟对象存储(适用于归档)到低延迟内存存储(对于实时服务至关重要)的存储层次结构权衡,以及带宽限制(100-200 MB/s 的旋转磁盘与 50-200 GB/s 的 RAM)塑造了每个管道决策。详细的存储架构考虑因素在第 6.9 节中有所介绍。

考虑到这些性能限制,设计决策应与特定要求一致。对于流数据,考虑你是否需要消息持久性(重放失败处理的能 力)、排序保证(保持事件序列)或地理分布。对于批量处理,关键决策因素包括与内存相比的数据量、处理复杂性和计算是否必须分布式。对于千兆级数据,单机工具就足够了,但对于太字节级处理,则需要分布式框架,将工作分区到集群中。通过我们的四支柱视角来看这些层之间的交互,决定了系统的整体有效性,并指导我们在以下小节中检查的具体工程决策。

通过验证和监控实现质量

质量是可靠机器学习系统的基石,管道通过在每个阶段进行系统性的验证和监控来实现质量。生产经验表明,数据管道问题代表机器学习失败的主要来源,研究表明,模式更改导致下游处理中断、分布漂移降低模型精度或数据损坏静默引入错误的归因率在 30-70%之间(Sculley 等人 2021)。这些故障证明尤其狡猾,因为它们通常不会引起明显的系统崩溃,而是以只有影响用户后才会显现的方式缓慢降低模型性能。质量支柱要求主动监控和验证,以在问题演变成模型失败之前捕捉到它们。

在实践中理解这些指标需要检查生产团队如何实施大规模监控。大多数组织采用基于严重程度的警报系统,不同类型的故障触发不同的响应协议。最关键的警报表明系统完全故障:管道完全停止处理,超过 5 分钟内显示零吞吐量,或者主要数据源完全不可用。这些情况需要立即关注,因为它们会停止所有下游模型训练或服务。更微妙的退化模式需要不同的检测策略。当吞吐量降至基线水平的 80%或错误率上升至 5%以上,或者质量指标偏离训练数据特征超过 2 个标准差时,系统会发出需要紧急但非立即关注的退化信号。这些渐进性故障往往比完全中断更危险,因为它们可以在数小时或数天内未被检测到,默默地破坏模型输入并降低预测质量。

考虑这些原则如何应用于处理用户交互事件的推荐系统。在基准吞吐量为每秒 50,000 条记录的情况下,监控系统跟踪几个相互依赖的信号。如果处理速度低于每秒 40,000 条记录超过 10 分钟,即时吞吐量警报就会触发,这既考虑了正常交通变化,也捕捉到了真正的容量或处理问题。数据流中的每个特征都有自己的质量配置文件:如果一个特征,如用户年龄,在训练数据中少于 1%的空值时,在超过 5%的记录中显示空值,那么上游数据源可能出现了问题。在样本数据上运行重复检测,观察同一事件出现多次——这可能是重试逻辑出错或数据库查询意外重复返回相同记录的模式。

当考虑端到端延迟时,这些监控维度变得尤为重要。系统必须跟踪的不仅是数据是否到达,还有从事件发生到结果特征可用于模型推理的整个管道的流动时间。当一个具有 10 秒服务级别协议的系统在 95%的百分位延迟超过 30 秒时,监控系统需要确定是哪个管道阶段引入了延迟:摄取、转换、验证或存储。

质量监控不仅限于简单的模式验证,还包括统计属性,这些属性可以捕捉到服务数据是否类似于训练数据。生产系统不仅仅是检查值是否在有效范围内,而是在 24 小时窗口内跟踪滚动统计。对于像交易金额或会话持续时间这样的数值特征,系统会持续计算平均值和标准差,然后应用如柯尔莫哥洛夫-斯米诺夫检验 6 等统计检验,以比较服务分布与训练分布。

分类别特征需要不同的统计方法。监控系统不是比较平均值和方差,而是跟踪类别频率分布。当出现训练数据中从未存在的新类别,或者当现有类别在相对频率上发生实质性变化——例如,“移动”与“桌面”流量的比例变化超过 20%,系统会标记潜在的数据质量问题和真正的分布变化。这种统计警觉性可以捕捉到简单模式验证完全忽略的微妙问题:想象一下,如果年龄值保持在 18-95 的有效范围内,但分布从主要 25-45 岁的人转变为主要 65 岁以上的人,这表明数据源发生了会影响模型性能的变化。

在管道级别的验证包括多种策略协同工作。模式验证在数据进入管道时同步执行,立即拒绝格式不正确的记录,防止它们传播到下游。现代工具如 TensorFlow 数据验证(TFDV)7 自动从训练数据推断模式,捕获预期的数据类型、值范围和存在要求。

这种同步验证必然保持简单和快速,在微秒级检查可以评估的属性。更复杂的验证,需要比较服务数据与训练数据分布或跨多个记录汇总统计,必须异步运行以避免阻塞数据摄取管道。统计验证系统通常抽样 1-10%的服务流量——足以检测到有意义的变动,同时避免分析每条记录的计算成本。这些样本累积在滚动窗口中,通常是 1 小时、24 小时和 7 天,不同的窗口揭示不同的模式。每小时窗口检测到数据源突然切换到具有不同特性的备份,而每周窗口揭示用户群体或行为的逐渐漂移。

可能最隐蔽的验证挑战来自训练-服务偏差 8,在训练与服务环境中,相同的特征计算方式不同。这通常发生在训练管道使用一组库或逻辑批量处理数据时,而服务系统使用不同的实现实时计算特征。推荐系统可能在训练中通过将用户配置文件与完整的交易历史记录连接来计算“user_lifetime_purchases”,而服务系统无意中使用了仅每周更新的缓存物化视图 9。

通过优雅降级实现可靠性

当质量监控检测到问题时,可靠性确保系统在出现问题时仍能有效地继续运行。管道面临持续的挑战:数据源暂时不可用,网络分区分离组件,上游模式变更破坏了解析逻辑,或意外的负载峰值耗尽资源。可靠性支柱要求系统能优雅地处理这些故障,而不是导致完全中断。这种弹性来自系统的故障分析、智能错误处理和自动恢复策略,即使在不利条件下也能保持服务连续性。

对机器学习数据管道的系统故障模式分析揭示了需要特定工程对策的预测性模式。数据损坏故障发生在上游系统引入微妙的格式变化、编码问题或字段值修改时,这些修改通过了基本验证但破坏了模型输入。日期字段从“YYYY-MM-DD”格式切换到“MM/DD/YYYY”格式可能不会触发模式验证,但会破坏任何基于日期的特征计算。当源系统添加字段、重命名列或更改数据类型时,如果没有协调,就会发生模式演变 10 故障,这会破坏下游处理假设,这些假设期望特定的字段名称或类型。资源耗尽表现为当数据量增长超过容量规划时,性能逐渐下降,最终在高峰负载期间导致管道故障。

基于这次故障分析,有效的错误处理策略确保问题得到系统性控制并恢复。对于瞬时错误,如网络中断或临时服务中断,实现智能重试逻辑需要指数退避策略以避免压倒恢复中的服务。简单的线性重试每秒尝试重新连接,可能会使服务陷入连接尝试的洪流中,从而可能阻止其恢复。指数退避——在 1 秒后重试,然后 2 秒,然后 4 秒,每次尝试翻倍——给服务提供恢复的空间,同时仍然保持持续性。许多机器学习系统采用死信队列的概念 11,为多次重试后处理失败的数据使用单独的存储。这允许在不妨碍主管道的情况下,对有问题的数据进行后续分析和可能的重新处理(Kleppmann 2016)。处理金融交易的管道遇到格式错误的数据时,可以将其路由到死信队列,而不是丢失关键记录或停止所有处理。

超越临时的错误处理,级联故障预防需要断路器 12 模式和舱壁隔离来防止单个组件故障在整个系统中传播。当一个特征计算服务失败时,断路器模式在检测到重复失败后会停止调用该服务,防止调用者等待可能导致其自身失败的超时。

自动恢复工程实现了超越简单重试逻辑的复杂策略。渐进式超时增加防止压倒努力的服务,同时保持对短暂问题的快速恢复——初始请求在 1 秒后超时,但在检测到服务退化后,超时时间延长到 5 秒,然后是 30 秒,给服务稳定的时间。多层回退系统在主数据源失败时提供降级服务:当实时计算失败时,提供稍微陈旧的缓存特征,或者当精确计算超时时使用近似特征。一个无法从过去 30 天内计算用户偏好的推荐系统可能会回退到过去 90 天的偏好,提供稍微不准确但仍然有用的推荐,而不是完全失败。全面的警报和升级程序确保在自动化恢复失败时发生人工干预,在失败期间捕获足够的诊断信息,以便快速调试。

当考虑一个处理市场数据的金融机器学习系统时,这些概念变得具体。错误处理可能涉及在实时数据源失败时回退到稍微延迟的数据源,同时同时通知操作团队该问题。死信队列捕获异常的价格更新以供调查,而不是静默地丢弃它们。断路器在恢复期间防止系统压倒一个努力的市场数据提供商。这种全面的错误管理方法确保了即使面对分布式系统在规模上不可避免的故障,下游过程也能访问到可靠、高质量的数据,用于训练和推理任务。

可扩展性模式

虽然质量和可靠性确保了系统的正确运行,但可扩展性解决了一个不同的挑战:随着数据量的增长和机器学习系统从原型发展到生产服务,系统如何演变。在千兆规模上有效运行的管道,如果没有能够实现分布式处理的架构变化,通常会在太字节规模上失效。可扩展性涉及设计能够处理不断增长的数据量、用户基础和计算需求,而不需要完全重新设计的系统。关键洞察是,可扩展性约束在管道的不同阶段表现出不同的形式,需要不同的架构模式来处理摄取、处理和存储。

机器学习系统通常遵循两种主要的摄入模式,每种模式都具有独特的可扩展性特征。批处理摄入涉及在指定时间段内收集数据组,然后再进行处理。当实时数据处理不是关键且数据可以按计划间隔处理时,这种方法是合适的。一家零售公司可能会使用批处理摄入在夜间处理每日销售数据,每天早上更新库存预测的机器学习模型。批处理通过在大数据量上分摊启动成本,从而有效地利用计算资源——处理一个千兆字节的工作可能需要 100 台机器 10 分钟,比维护始终在线的基础设施具有更好的资源效率。

与这种计划方法相反,流式处理在数据到达时实时处理数据。这种模式对于需要立即数据处理的应用程序至关重要,在数据价值迅速丧失的场景中,以及需要响应事件的应用程序中。金融机构可能会使用流式处理进行实时欺诈检测,在交易发生时立即处理每个交易以标记可疑活动。然而,当下游系统无法跟上时,流式处理必须处理背压 13——当突然的交通高峰产生比处理能力更快的数据时,系统必须缓冲数据(需要内存)、采样(丢失一些数据)或将数据推回生产者(可能造成故障)。数据新鲜度服务级别协议(SLA)14 正式化了这些要求,指定了数据生成与可用处理之间的最大可接受延迟。

认识到单独采用任何一种方法的局限性,许多现代机器学习系统采用混合方法,结合批处理和流式处理来处理不同的数据速度和用例。这种灵活性使得系统可以同时处理批量历史数据和实时数据流,从而提供对数据景观的全面视图。生产系统必须在成本与延迟之间进行权衡:实时处理可能比批处理成本高 10-100 倍。这种成本差异源于几个因素:流式系统需要始终在线的基础设施而不是可调度资源,需要维护冗余处理以实现容错,需要低延迟的网络和存储,并且无法从批处理通过在大数据量上分摊启动成本所实现的规模经济中受益。在第十三章中详细介绍了在规模上管理流式系统的技术,包括背压处理和成本优化。

除了摄取模式之外,当单机无法处理数据量或处理复杂性时,分布式处理变得必要。分布式系统中的挑战在于数据必须在多个计算资源之间分区,这引入了协调开销。分布式协调受网络往返时间的限制:本地操作在微秒内完成,而网络协调需要毫秒,这造成了 1000 倍的延迟差异。这一限制解释了为什么需要全局协调的操作,如跨 100 台机器计算归一化统计信息,会形成瓶颈。每个分区可以快速计算本地统计信息,但合并它们需要所有分区的信息,而收集结果的网络往返时间决定了总执行时间。

在这个规模上,数据局部性变得至关重要。在 10GB/s 的速度下,将 1TB 的训练数据通过网络传输需要 100 多秒,而本地 SSD 访问只需要 5GB/s 的速度下 200 秒。网络传输和本地存储之间相似的性能推动了机器学习系统设计向计算跟随数据架构的转变,即处理移动到数据而不是数据移动到处理。当处理节点以 RAM 速度(50-200 GB/s)访问本地数据,但必须通过限于 1-10 GB/s 的网络进行协调时,带宽不匹配创造了基本的瓶颈。地理分布放大了这些挑战:跨数据中心协调必须处理网络延迟(区域间 50-200ms)、网络分区期间的局部故障,以及防止数据跨境的监管限制。了解哪些操作容易并行化,而哪些操作需要昂贵的协调,决定了系统架构和性能特征。

对于我们的 KWS 系统,这些可扩展性模式通过定量容量规划具体体现,为工作负载需求适当地调整基础设施。开发使用样本数据集的批量处理来快速迭代模型架构。当模型复杂性或数据集大小(2300 万个示例)超过单机容量时,训练扩展到 GPU 集群的分布式处理。生产部署需要流处理,以在数百万并发设备上实现实时唤醒词检测。当新闻事件触发同步使用时,系统必须处理流量高峰——数百万用户同时询问突发新闻。

为了使这些扩展挑战具体化,考虑一下为我们的关键词语音识别(KWS)训练基础设施进行尺寸计算所需的工程计算。在 16 kHz 采样率(16 位 PCM15)下,平均每秒 1 秒的 2300 万音频样本,原始存储需要大约:

存储=23×106 样本×1 ×16,000 样本/秒×2 字节=736 GB \text{存储} = 23 \times 10⁶ \text{样本} \times 1 \text{秒} \times 16,000 \text{样本/秒} \times 2 \text{字节} = 736 \text{GB}

将这些样本处理成 MFCC 特征(13 个系数,每秒 100 帧)可以减少存储需求,但会增加计算需求。在现代 CPU 上进行的特征提取大约是实时处理速度的 100 倍(每秒计算 100 秒的音频),需要:

处理时间=23×106 秒音频100 加速比=230,000 64 小时单核处理时间\text{处理时间} = \frac{23 \times 10⁶ \text{秒音频}}{100 \text{加速比}} = 230,000 \text{秒} \approx 64 \text{小时单核处理时间}

分布在 64 个核心上可以将时间缩短到一小时,展示了并行化如何实现快速迭代。当将训练数据从存储传输到 GPU 服务器时,网络带宽成为瓶颈——在 10 GB/s 的网络吞吐量下,传输 736 GB 需要 74 秒,与训练周期时间相当。这一分析揭示了为什么高吞吐量存储(实现 5-7 GB/s 的 NVMe SSD)和网络基础设施(25-100 Gbps 互连)对于数据移动时间与计算时间相当的人工智能工作负载至关重要。

可扩展性架构使得从开发到生产的整个过程中都能保持效率,同时通过容量规划确保基础设施能够适当地适应工作负载需求。

通过可观察性进行治理

通过质量、可靠性和可扩展性解决了功能需求后,我们转向治理支柱。治理支柱在管道中表现为全面的可观察性——理解数据通过系统流动、如何转换以及谁访问它的能力。有效的治理需要跟踪数据来源通过转换到最终数据集,维护审计跟踪以符合规定,并实施访问控制以执行组织政策。与其他主要关注系统功能的支柱不同,治理确保操作在法律、伦理和商业约束内进行,同时保持透明度和问责制。

数据来源跟踪捕获每个数据集的完整来源:哪些原始来源贡献了数据,应用了哪些转换,何时进行加工,以及执行了哪个版本的加工代码。对于机器学习系统,来源对于调试模型行为和确保可重复性至关重要。当一个模型预测被证明是错误的时,工程师需要通过管道回溯:哪些训练数据贡献了这个预测,这些数据有什么质量指标,应用了哪些转换,我们能否为调查重新创建这个确切场景?现代来源系统如 Apache Atlas、Amundsen 或商业产品通过为管道添加元数据来自动捕获这种流动。每个管道阶段都会用描述其来源的元数据注释数据,创建一个审计跟踪,既可用于调试又可用于合规性。

审计跟踪通过记录谁访问了数据以及何时访问来补充数据来源。像 GDPR 这样的监管框架要求组织证明适当的数据处理,包括跟踪对个人信息访问的记录。机器学习管道在数据访问点实现审计日志记录:当训练作业读取数据集时,当服务系统检索特征时,或者当工程师查询数据进行分析时。这些日志通常捕获用户身份、时间戳、访问的数据和目的。对于医疗保健机器学习系统,审计跟踪通过显示只有授权人员访问了患者数据,访问是出于合法的医疗目的,并且数据没有保留超过允许的时间来证明合规性。生产系统中的审计日志规模可能很大——高流量的推荐系统每天可能会生成数百万审计事件——需要高效的日志存储和查询基础设施。

访问控制强制执行关于谁可以在每个管道阶段读取、写入或转换数据的策略。除了简单的读写权限之外,机器学习系统通常实现基于属性的访问控制,其中策略考虑数据敏感性、用户角色和访问上下文。数据科学家可以自由访问匿名化训练数据,但需要批准包含个人信息的原始数据。生产服务系统可能读取特征数据,但从不写入,以防止意外损坏。访问控制与维护数据敏感度、合规性要求和使用限制元数据的数据目录集成,使得在数据通过管道流动时能够实现自动策略执行。

版本元数据使可重复性成为调试和合规性的必要条件。当六个月前训练的模型比当前模型表现更好时,团队需要重新创建那个训练环境:确切的数据版本、转换参数和代码版本。机器学习系统通过全面的元数据捕获来实现这一点:训练作业记录数据集校验和、转换参数值、用于可重复性的随机种子和代码版本哈希。特征存储维护历史特征值,使得可以重建训练条件。对于我们关键词识别系统来说,这意味着跟踪哪个版本的强制对齐生成了标签,应用了哪些音频归一化参数,使用了哪些合成数据生成设置,以及哪些众包批次贡献了训练数据。

这些治理机制的集成将管道从透明度低的数据转换器转变为可审计、可重复的系统,可以证明适当的数据处理。这种治理基础设施不仅对于合规性至关重要,而且对于维护机器学习系统在做出越来越影响用户生活的关键决策时的信任至关重要。

在建立全面的管道架构之后——通过验证和监控确保质量,通过优雅降级确保可靠性,通过适当的模式确保可扩展性,通过可观察性确保治理——我们现在必须确定实际上通过这些精心设计的系统流动的是什么。我们选择的数据源塑造了我们机器学习系统的每个下游特征。

战略数据获取

数据采集不仅仅是简单地收集训练示例。它是一个战略决策,决定了我们系统的能力和局限性。我们选择用于获取训练数据的方法直接塑造了我们的质量基础、可靠性特征、可扩展潜力以及治理合规性。我们不是将数据来源视为基于便利性或熟悉度选择的独立选项,而是将它们视为必须与我们的既定框架要求相一致的战略选择。每种数据获取策略(现有数据集、网络爬取、众包、合成生成)在质量、成本、规模和伦理考量方面都提供了不同的权衡。关键洞察是没有任何单一方法能满足所有要求;成功的机器学习系统通常结合多种策略,平衡它们的互补优势与竞争性约束。

回到我们的关键词检测系统,数据来源决策对我们框架的所有支柱都有深远的影响,如我们在第 6.3.3 节的综合案例研究中所示。在多样化的声学环境中实现 98%的准确性(质量支柱)需要涵盖口音、年龄和录音条件的代表性数据。尽管设备存在差异,但保持一致的检测(可靠性支柱)需要来自不同硬件的数据。支持数百万并发用户(可扩展性支柱)需要手动收集无法经济提供的数据量。在始终倾听的系统中保护用户隐私(治理支柱)限制了收集方法,并需要仔细的匿名化。这些相互关联的要求说明了为什么获取策略必须通过系统评估而不是通过临时的来源选择来评估。

数据来源评估和选择

在确立了数据采集的战略重要性之后,我们以质量作为首要驱动力开始。当质量要求主导获取决策时,在精选数据集、专家众包和受控网络爬取之间的选择取决于准确性目标、所需的领域专业知识以及指导模型开发的基准要求。质量支柱要求我们不仅理解数据看起来是正确的,而且它准确地代表了部署环境,并提供了足够的边缘案例覆盖,这些边缘案例可能导致失败。

类似于 KaggleUCI 机器学习仓库 这样的平台为机器学习从业者提供了现成的数据集,这些数据集可以加速系统开发。这些现有的数据集在构建机器学习系统时尤其有价值,因为它们提供了立即访问经过清洗、格式化的数据以及已建立的基准。它们的主要优势之一是成本效益,因为从头开始创建数据集需要大量的时间和资源,尤其是在构建需要大量高质量训练数据的生产级机器学习系统时。在此基础上,许多这些数据集,例如 ImageNet,已经成为机器学习社区的标准基准,使得在不同模型和架构之间进行一致的性能比较成为可能。对于机器学习系统开发者来说,这种标准化提供了明确的指标来评估模型改进和系统性能。这些数据集的即时可用性使得团队可以开始实验和原型设计,而无需在数据收集和预处理上延迟。

尽管有这些优势,机器学习从业者必须仔细考虑现有数据集的质量保证方面。例如,ImageNet 数据集被发现验证集中有 3.4% 的标签错误 (Northcutt, Athalye, and Mueller 2021)。虽然流行的数据集受益于社区审查,有助于识别和纠正错误和偏差,但大多数数据集仍然是“无人照料的花园”,如果未能妥善解决质量问题,可能会对下游系统性能产生重大影响。正如 (Gebru et al. 2021a) 在她的论文中指出的那样,仅仅提供数据集而不提供文档可能会导致误用和误解,从而放大数据中存在的偏差。

除了质量方面的担忧之外,现有数据集的伴随文档是无价的,但通常只存在于广泛使用的数据集中。良好的文档提供了对数据收集过程和变量定义的见解,有时甚至提供基线模型性能。这些信息不仅有助于理解,而且促进了研究的可重复性,这是科学诚信的基石;目前,机器学习系统中提高可重复性的危机正在加剧(Pineau 等人 2021;Henderson 等人 2018)。当其他研究人员能够访问相同的数据时,他们可以验证发现,测试新的假设,或应用不同的方法,从而使我们能够更快地构建在彼此工作之上的成果。数据质量的问题尤其扩展到大数据场景,其中体积和多样性加剧了质量担忧(Gudivada,Rao 等人 2017),需要在大规模上采用系统性的质量验证方法。

即使有适当的文档,理解数据收集的上下文也变得必要。研究人员在使用像 ImageNet(Beyer 等人 2020)这样的流行数据集时必须避免潜在的过拟合,这些数据集可能导致性能指标膨胀。有时,这些数据集并不能反映真实世界的数据

在这些上下文担忧的核心,对于机器学习系统的一个关键考虑是现有数据集如何好地反映现实世界的部署条件。依赖标准数据集可能会在训练和生产环境之间产生令人担忧的脱节。当多个机器学习系统在相同的数据集上训练时,这种不匹配变得尤其有问题(图 6.6),可能会在整个部署模型生态系统中传播偏差和局限性。

图片

图 6.6:数据集收敛:共享数据集可能会掩盖局限性并传播偏差到多个机器学习系统中,可能导致过度乐观的性能评估和降低对未见数据的泛化能力。依赖公共数据集会在模型生态系统中产生一种虚假的进步感,阻碍稳健和可靠的 AI 应用的发展。

对于我们的关键词识别系统,像 Google 的 Speech Commands(Warden 2018)这样的现有数据集提供了基本起点,提供了精心挑选的常见唤醒词的语音样本。这些数据集使得快速原型设计成为可能,并建立了基线性能指标。然而,一旦将它们与我们的质量要求进行比较,就会立即发现覆盖范围不足:有限的口音多样性、主要是在安静的环境中录音,以及仅支持主要语言。以质量为导向的获取策略认识到这些限制,并计划补充方法来应对这些限制,展示了基于框架的思维方式如何指导源选择,而不仅仅是选择可用的数据集。

可扩展性和成本优化

虽然以质量为导向的方法擅长创建准确、精心整理的数据集,但它们面临着固有的可扩展性限制。当可扩展性需求占主导地位——需要数百万或数十亿个示例,而人工整理在经济上无法提供时——网络爬取和合成生成提供了通往大规模数据集的途径。可扩展性支柱要求理解不同获取策略背后的经济模型:每标注一个示例的成本、吞吐量限制以及这些如何随着数据量的增加而变化。在千个示例规模上证明是成本效益的方法,在百万个示例规模上往往变得难以承受,而需要高设置成本的方法在大规模上则有利可图。

网络爬取提供了一种强大的方法,用于大规模收集训练数据,尤其是在现有数据集不足的领域。这种从网站提取数据的自动化技术已成为现代机器学习系统开发的关键,使团队能够构建符合其特定需求的定制数据集。当人工标注数据稀缺时,网络爬取展示了其价值。以计算机视觉系统为例:像ImageNetOpenImages这样的大型数据集就是通过系统性的网络爬取构建的,极大地推动了计算机视觉领域的发展。

超越这些计算机视觉应用,网络爬取的影响远远超出了图像识别系统。在自然语言处理领域,网络爬取数据已促使越来越复杂的机器学习系统的发展。大型语言模型,如 ChatGPT 和 Claude,依赖于从公共互联网和媒体爬取的大量文本来学习语言模式并生成响应(Groeneveld 等人 2024)。同样,像 GitHub 的 Copilot 这样的专业机器学习系统展示了如何通过有针对性的网络爬取(在这种情况下是代码仓库),可以创建强大的特定领域助手(陈等人 2021)。

建立在这些基础发展之上,生产级机器学习系统通常需要持续的数据收集来保持相关性和性能。网络爬虫通过收集如股价、天气模式或产品信息等结构化数据,为分析应用提供了便利。这种持续收集为机器学习系统带来了独特的挑战。数据一致性变得至关重要,因为网站结构或内容格式的变化可能会中断数据管道并影响模型性能。通过数据库或仓库进行适当的数据管理不仅对于存储至关重要,而且对于维护数据质量和实现模型更新也变得至关重要。

然而,随着这些强大功能的出现,网络爬虫也带来了几个挑战,机器学习系统开发者必须仔细考虑。法律和伦理限制可能会限制数据收集,因为并非所有网站都允许爬取,违反这些限制可能会产生严重后果。当使用爬取的数据构建机器学习系统时,团队必须仔细记录数据来源,并确保遵守服务条款和版权法。在处理用户生成内容时,隐私考虑变得重要,通常需要系统性的匿名化程序。

除了这些法律和伦理限制之外,技术限制也会影响网络爬取训练数据的可靠性。网站的速率限制可能会减慢数据收集,而网络内容的动态性可能会引入影响模型训练的不一致性。如图 6.7 所示,网络爬取可能会产生意外或不相关的数据,例如,在当代图像搜索中出现的旧图像,这可能会污染训练数据集并降低模型性能。这些问题突出了在基于网络爬取数据的机器学习管道中,进行彻底的数据验证和清理过程的重要性。

图片

图 6.7:数据源噪声:网络爬虫将无关或过时的数据引入训练集,需要系统性的数据验证和清理,以维持模型性能并防止虚假相关性。在当代搜索中出现的旧图像就是这种噪声的例子,强调了在来自网络的数据集中进行仔细过滤和质量控制的需要。来源:Vox。

众包提供了一种可扩展的方法,利用分布式的人类计算来加速数据集的创建。例如,Amazon Mechanical Turk平台展示了众包如何通过将标注任务分配给全球劳动力来促进这一过程。这使得能够快速收集复杂任务(如情感分析、图像识别和语音转录)的标签,显著加快了数据准备阶段。机器学习领域众包最具影响力的例子之一是ImageNet 数据集的创建。ImageNet 通过将图像标注任务分配给贡献者(通过 Amazon Mechanical Turk)而建立,这些贡献者将数百万张图像分类成数千个类别,使研究人员能够训练和基准测试用于广泛视觉识别任务的模型。

建立在这次大规模标注工作之上,数据集的可用性推动了深度学习的发展,包括 2012 年取得的突破性成果 AlexNet 模型(Krizhevsky, Sutskever, and Hinton 2017a),该模型展示了大规模神经网络的威力,并展示了大规模、众包数据集如何推动创新。ImageNet 的成功突显了利用多元化贡献者进行标注如何使机器学习系统实现前所未有的性能。在学术研究之外,众包潜力的另一个例子是谷歌的Crowdsource平台,这是一个志愿者贡献标注数据以改善人工智能系统在语言翻译、手写识别和图像理解等应用中的平台。

除了这些静态数据集创建的努力之外,众包还在传统数据集标注之外的应用中发挥了重要作用。例如,导航应用Waze使用用户提供的众包数据提供实时交通更新、路线建议和事故报告。这些多样化的应用突显了众包的一个主要优势:其可扩展性。通过将微任务分配给大量受众,项目可以快速且经济高效地处理大量数据。这种可扩展性对于需要大量数据集以实现高性能的机器学习系统尤其有益。贡献者的多样性引入了广泛的视角、文化洞察和语言变体,丰富了数据集并提高了模型在人群中的泛化能力。

补充这一可扩展性优势,灵活性是众包的关键好处。任务可以根据初始结果动态调整,从而允许在数据收集中进行迭代改进。例如,谷歌的reCAPTCHA系统利用众包来验证人类用户,同时为训练机器学习模型的数据集进行标注。

超越了人类生成数据,合成数据生成代表了终极可扩展性解决方案,通过算法生成而不是手动收集来创建无限的训练示例。这种方法通过从方程式中去除人力劳动而改变了数据获取的经济性。如图 6.8 图 6.8 所示,合成数据与历史数据集相结合,创建了更大、更多样化的训练集,这些训练集手动收集是不切实际的。

图片

图 6.8:合成数据增强:将算法生成数据与历史数据集相结合,扩大了训练集的大小和多样性,减轻了由稀缺或偏颇的实际情况数据造成的限制,并提高了模型泛化能力。这种方法在获取足够真实世界数据不切实际或不道德时,能够促进稳健的机器学习系统开发。来源:anylogic.

在这个基础上,生成建模技术的进步大大提高了合成数据的质量。现代人工智能系统可以生成与真实世界分布非常相似的数据,使其适用于从计算机视觉到自然语言处理的各种应用。例如,生成模型已被用于创建用于物体识别任务的合成图像,产生了与真实世界图像非常接近的多样化数据集。同样,合成数据已被用于模拟语音模式,增强了语音识别系统的鲁棒性。

除了这些质量改进之外,合成数据在获取真实世界数据既不切实际又昂贵的情况下变得特别有价值。汽车行业已经采用合成数据来训练自动驾驶车辆系统;你只能物理撞击有限数量的汽车来获取可能帮助机器学习系统了解如何避免碰撞的碰撞测试数据。捕捉真实世界场景,特别是罕见边缘情况,如接近事故或异常道路条件,本质上很困难。合成数据允许研究人员在受控的虚拟环境中模拟这些场景,确保模型被训练以处理广泛的条件。这种方法对于提高自动驾驶汽车的能力已被证明非常有价值。

补充这些安全关键应用,合成数据另一个重要的应用在于增强现有数据集。在数据集中引入变化可以通过使模型接触到不同的条件来增强模型的鲁棒性。例如,在语音识别中,像 SpecAugment(D. S. Park 等人 2019)这样的数据增强技术引入噪声、偏移或音调变化,使模型能够更好地在不同环境和说话人风格之间泛化。这一原则也适用于其他领域,其中合成数据可以填补在代表性不足的场景或边缘情况中的空白。

对于我们的关键词识别(KWS)系统,可扩展性支柱推动了在 50 种语言中收集 2300 万个训练样本的需求——这是一个手工收集在经济上无法提供的数量。网络爬虫通过从视频平台补充基线数据集,增加了多样化的声音样本。众包使得对代表性不足的语言进行有针对性的收集成为可能。通过语音合成(Werchniak 等人 2021)和音频增强,合成数据生成填补了剩余的空白,在声学环境、说话人特征和背景条件下创造了无限的唤醒词变化。这种综合的多源策略展示了可扩展性要求如何塑造获取决策,每种方法都为整体数据生态系统贡献了特定的能力。

多样化条件下的可靠性

除了质量和规模考虑之外,可靠性支柱解决了一个关键问题:我们收集的数据是否能够使模型在部署环境的全部条件下保持一致的性能?一个数据集可能通过既定的指标达到高质量,但如果它没有捕捉到部署过程中遇到的各种多样性,则可能无法支持可靠的系统。鲁棒模型的覆盖要求不仅包括简单的数量,还包括地理多样性、人口代表性、时间变化和边缘情况包含,这些都会对模型行为进行压力测试。

理解覆盖范围需求需要检查潜在的失败模式。当训练数据主要来自特定地区时,会出现地理偏差,导致模型在其他地区表现不佳。一项关于图像数据集的研究发现,地理偏差显著,主要使用西方图像进行训练的图像识别系统在其他地区的图像上表现不佳(T. Wang 等,2019)。当训练数据不代表完整用户群体时,会出现人口统计偏差,可能导致歧视性结果。当现象随时间变化时,时间变化很重要——仅使用历史数据训练的欺诈检测模型可能无法应对新的欺诈模式。边缘案例收集特别具有挑战性但至关重要,因为罕见场景通常代表高风险情况,失败会造成最大的损害。

边缘案例收集的挑战在自动驾驶车辆开发中变得明显。虽然通过测试车队运营可以轻松捕捉正常驾驶条件,但接近事故、不寻常的行人行为或罕见的天气条件发生的频率较低。合成数据生成通过模拟罕见场景来帮助解决这个问题,但验证合成示例是否准确代表真实边缘案例需要仔细的工程。一些组织采用针对性的数据收集,测试驾驶员故意创建边缘案例,或者工程师从事故报告中识别需要更好覆盖的场景。

数据集收敛性,如前文图 6.6 所示,代表了另一个可靠性挑战。当多个系统在相同的数据集上训练时,它们会继承相同的盲点和偏见。整个模型生态系统可能因为所有模型都是在具有相同覆盖范围缺失的数据上训练的,而在相同的边缘情况下失败。这种系统性风险促使采用多样化的数据来源策略,其中每个组织收集超出常见基准的补充数据,确保其模型发展出不同的优势和劣势,而不是共享的失败模式。

对于我们的关键词唤醒系统(KWS),可靠性表现为在从安静的卧室到嘈杂的街道等不同的声学环境中,从各种地理区域的口音,以及从儿童到老年人的年龄范围内,都能保持一致的唤醒词检测。数据来源策略明确地解决了这些多样性需求:网络爬虫从多样化的视频来源中捕获自然语言变化,众包针对代表性不足的人口和环境,合成数据系统地探索声学条件的参数空间。如果没有这种在数据来源上的故意多样性,系统可能在测试集上实现高精度,但在生产部署中却可能不可靠。

数据来源的治理与伦理

数据获取的治理支柱包括法律合规、对数据贡献者的道德待遇、隐私保护和关于数据来源和限制的透明度。与其他侧重于系统能力的支柱不同,治理确保数据来源在适当的法律和道德边界内进行。治理失败带来的后果不仅限于系统性能,还包括声誉损害、法律责任,以及可能对不恰当地收集或使用其数据的个人造成的潜在伤害。

法律约束在不同司法管辖区和领域中对数据收集方法产生了显著限制。并非所有网站都允许抓取数据,违反这些限制可能会产生严重后果,正如围绕大型语言模型训练数据的持续诉讼所展示的那样。版权法规定了哪些公开内容可用于训练,不同司法管辖区出现了不同的标准。服务条款协议可能禁止使用数据进行机器学习训练,即使技术上可以访问。欧洲的 GDPR 和加州的 CCPA 等隐私法规对个人数据收集提出了严格的要求,包括需要同意、允许删除请求,有时还要求对算法决策进行解释(Wachter, Mittelstadt, and Russell 2017)。医疗数据在美国属于 HIPAA 等额外法规的管辖,要求对病人信息采取特定的保护措施。组织必须谨慎地处理这些法律框架,记录数据来源,并在整个获取过程中确保合规。

除了法律合规之外,道德来源还需要公平对待人类贡献者。我们之前考察的众包示例——OpenAI 将数据标注外包给肯尼亚的工人,每小时支付低至 1.32 美元来审查创伤性内容——突显了当经济压力压倒道德考量时可能发生的治理失败。据报道,许多工人因接触令人不安的材料而遭受心理伤害,而没有得到足够的心理健康支持。这一案例强调了当将数据工作外包给经济不发达地区时可能出现的权力失衡。缺乏公平的补偿、对处理创伤性内容的工人支持不足,以及对工作条件缺乏足够的透明度,这些都是影响人类福利的治理失败,而不仅仅是系统性能。

针对这种担忧,行业范围内的道德众包标准已经开始出现。公平补偿意味着至少支付当地最低工资,理想情况下与工人所在地区的类似工作进行比较。工人的福祉需要为处理敏感内容的人提供心理健康资源,限制接触创伤性材料,并确保合理的工作条件。透明度要求明确沟通任务目的、贡献如何被使用以及工人的权利。像人工智能伙伴关系这样的组织已经发布了道德众包指南,确立了可接受实践的基础。

虽然,质量、可扩展性和可靠性关注系统能力,治理支柱确保我们的数据采集在适当的道德和法律边界内进行。隐私保护是另一个关键的治理问题,尤其是当涉及未明确同意用于机器学习训练的个人数据时。在处理敏感数据时,匿名化成为一个关键能力。从系统工程的角度来看,匿名化不仅代表法规遵从,它构成了一个核心设计约束,影响着数据管道架构、存储策略和处理效率。机器学习系统必须在整个生命周期中处理敏感数据:在收集、存储、转换、模型训练甚至在错误日志和调试输出中。一次隐私泄露不仅会损害单个记录,还可能损害整个数据集,使系统在未来开发中无法使用。

实践者已经开发了一系列匿名化技术来减轻隐私风险。最直接的方法是掩码,它涉及更改或模糊敏感值,以便它们不能直接追溯到原始数据主体。例如,金融账户号码或信用卡号码中的数字可以用星号、固定哑字符或散列值替换,以在显示或记录过程中保护敏感信息。

基于这种直接保护方法,泛化通过降低数据的精确度或粒度来减少重新识别的可能性。而不是透露确切的出生日期或地址,数据被汇总到更广泛的类别,例如年龄范围或邮政编码前缀。例如,一个用户确切的 37 岁年龄可能被泛化到 30-39 岁的年龄范围,而他们的确切地址可能被归类到城市级别的粒度。这种技术通过以汇总形式共享数据来降低重新识别风险,尽管仔细选择粒度至关重要——过于粗糙会失去分析价值,而过于精细在某些条件下仍可能使重新识别成为可能。

当泛化降低数据精度时,伪匿名化通过用人工标识符或“假名”替换直接标识符——姓名、社会保障号码、电子邮件地址——采取不同的方法。这些假名不得揭示或容易被追踪到原始数据主体,从而允许分析将同一个人的记录联系起来,而不暴露他们的身份。

超越简单的标识符替换,k-匿名性提供了一种更正式的方法,确保数据集中的每个记录至少与其他 k-1 个记录不可区分。这是通过抑制或泛化准标识符——这些属性组合起来可能被用来重新识别个人,例如邮政编码、年龄和性别——来实现的。例如,如果 k=5,每个记录必须与至少四个其他记录共享相同的准标识符组合,从而防止攻击者仅通过查看这些属性就定位个人。这种方法提供了正式的隐私保证,但可能需要显著的数据扭曲,并且不能防止同质性或背景知识攻击。

在这个谱系的最高端,差分隐私(Dwork, n.d.)向查询结果或数据集添加精心校准的噪声或随机数据扰动。目标是确保包括或排除任何单个个体的数据不会显著影响输出,从而隐藏他们的存在。引入的噪声由ε-Differential Privacy 中的ε参数控制,平衡数据效用和隐私保证。这种方法提供了强大的数学隐私保证,在学术和工业环境中得到广泛应用,尽管添加的噪声可能会影响数据准确性和模型性能,需要仔细的参数调整以平衡隐私和实用性。

表 6.2 总结了每种匿名化方法的关键特征,以帮助从业者根据他们特定的隐私要求和数据效用需求选择适当的技巧。

表 6.2:匿名化技术比较

技术 数据效用 隐私级别 实现 最佳用例
掩码 低-中等 简单 显示敏感数据
泛化 中等 中等 中等 年龄范围、位置分桶
伪匿名化 中等 中等 需要个人跟踪
k-匿名性 低-中等 复杂 正式的隐私保证
差分隐私 中等 非常高 复杂 统计保证

如比较表所示,有效的数据匿名化在隐私和效用之间取得平衡。如掩码、泛化、匿名化、k-匿名性和差分隐私等技术分别针对重新识别风险的不同方面。通过精心选择和组合这些方法,组织可以在尊重包含在敏感数据集中个人的隐私权利和期望的同时,负责任地从这些数据集中提取价值。

对于我们的关键词语音识别(KWS)系统,治理约束贯穿了整个获取过程。语音数据本身包含需要隐私保护的生物识别信息,这推动了匿名化、同意要求和数据保留政策等决策。多语言支持引发了公平性问题——系统是否仅适用于商业价值高的语言,还是也能服务于较小的语言社区?公平的众包实践确保提供语音样本或标签的标注者获得适当的补偿,并了解他们的贡献将如何被使用。关于数据来源和局限性的透明度使用户能够理解系统的能力及其潜在偏见。这些治理考虑不仅限制了获取,还塑造了哪些方法在伦理上可接受和合法上可行。

集成获取策略

在考察了每一根支柱如何塑造获取选择之后,我们现在明白为什么现实世界的机器学习(ML)系统很少单独使用一种获取方法。相反,它们战略性地结合方法,以平衡相互竞争的支柱要求,认识到每种方法都贡献了互补的优势。数据获取的艺术在于理解这些来源如何协同工作,以创建同时满足质量、可扩展性、可靠性和治理约束的数据集。

我们的 KWS 系统展示了这种集成方法的典范。谷歌的语音命令(Speech Commands)数据集提供了一个质量保证的基线,使得快速原型设计和建立性能基准成为可能。然而,将之与我们的需求进行对比时,我们发现存在差距:口音多样性有限,仅覆盖主要语言,录音环境以清洁为主。通过从视频平台和语音数据库收集多样化的语音样本,网络抓取解决了部分差距,捕捉了在不同声学条件下的自然语音模式。这种方法在规模上超越了人工收集所能提供的,同时通过自动化过滤保持了合理的质量。

群智外包填补了现有数据集和网页抓取都无法充分解决的针对性缺口:代表性不足的口音、特定的群体或被识别为薄弱环节的特定声学环境。通过精心设计具有明确指导和质量控制的群智外包任务,系统在平衡规模和质量的同时,确保对贡献者的道德待遇。通过系统地探索参数空间:变化的后景噪声水平、说话人年龄、麦克风特性和唤醒词发音,合成数据生成技术完善了这一过程。这解决了难以自然收集的罕见条件长尾问题,同时使关于哪些声学变化最影响模型性能的受控实验成为可能。

这些方法的综合展示了我们的框架如何指导策略。质量要求驱动了精选数据集和专家审查的使用。可扩展性需求促使合成生成和网页抓取。可靠性需求要求在人口统计和环境中的多样化来源。治理约束塑造了同意要求、匿名化实践和公平补偿政策。而不是基于便利性选择来源,综合策略通过互补方法系统地解决每个支柱的要求。

通过多源获取实现的多样性——质量不一的群智外包音频、完美一致性的合成数据、格式不可预测的网页抓取内容——在外部数据进入我们受控管道环境的边界处创造了特定的挑战。

数据摄取

数据摄取代表了关键节点,精心获取的数据进入我们的机器学习系统,从各种外部格式转换为标准化的管道输入。这个边界层必须处理由于我们的多源获取策略而产生的异质性,同时保持我们已建立的质量、可靠性、可扩展性和治理标准。从外部来源到受控管道环境的这种转变提出了几个挑战,这些挑战在我们框架的各个支柱中明显不同。质量支柱要求在问题传播到下游之前在入口点进行验证。可靠性支柱需要错误处理,即使在源失败和数据异常的情况下也能保持操作。可扩展性支柱需要吞吐量优化,以处理不断增长的数据量和速度。治理支柱在系统边界执行访问控制和审计跟踪,外部数据进入可信环境。摄取代表了关键边界,精心工程可以防止问题进入管道,同时使机器学习系统所需的数据流得以实现。

批量与流式摄取模式

为了系统地解决摄取挑战,机器学习系统通常遵循两种主要模式,这些模式反映了不同的数据流时序和处理方法。每种模式都有独特的特性和用例,这些特性和用例塑造了系统如何平衡延迟、吞吐量、成本和复杂性。了解何时应用批量摄取与流摄取,或者它们的组合,需要分析工作负载特性与我们的框架要求之间的对应关系。

批量摄取涉及在指定时间段内收集数据分组或批次,然后再进行处理。当实时数据处理不是关键且数据可以按预定间隔处理时,这种方法是合适的。批量方法通过在大数据量上分摊启动成本并在资源可用或成本最低时处理数据,从而有效地利用计算资源。例如,一家零售公司可能会使用批量摄取在夜间处理每日销售数据,每天早上更新其库存预测的机器学习模型(Akidau 等人 2015)。批量作业可能使用数十台机器处理数吉字节的事务数据 30 分钟,然后释放这些资源供其他工作负载使用。这种计划处理比保持始终在线的基础设施更具成本效益,尤其是在预测的轻微滞后不会影响业务结果的情况下。

批量处理也简化了错误处理和恢复。当一个批处理作业在中间失败时,系统可以重试整个批次或从检查点恢复,而不需要复杂的状态管理。数据科学家可以轻松检查失败的批次,了解出了什么问题,并在修复后重新处理。批量处理的确定性特性——处理相同的输入数据总是产生相同的输出——简化了调试和验证。这些特性使得即使在实时处理技术上可行但不是必需的情况下,批量摄取对机器学习工作流程仍然具有吸引力。

与这种计划方法相反,流摄取在数据到达时实时处理数据,持续消耗事件而不是等待积累批次。这种模式对于需要立即数据处理的用例至关重要,例如数据价值迅速丧失的场景,以及需要响应事件发生的系统。金融机构可能会使用流摄取进行实时欺诈检测,在交易发生时处理每笔交易,以便在交易完成前立即标记可疑活动。如果欺诈检测发生在欺诈交易完成后数小时,那么欺诈检测的价值将大幅下降——到那时,资金已经转移,账户已被破坏。

然而,流式处理引入了批量处理所避免的复杂性。系统必须处理下游系统无法跟上数据流入速率时的背压。在流量峰值期间,当突然的激增产生比处理能力更快的数据时,系统必须要么缓冲数据(需要内存并引入延迟),要么采样(丢失一些数据),或者将数据推回生产者(可能造成其失败)。数据新鲜度服务级别协议(SLA)正式化了这些要求,指定了数据生成与可用处理之间的最大可接受延迟。满足 100 毫秒的新鲜度 SLA 所需的架构与满足 1 小时 SLA 所需的架构不同,这影响着从网络到存储再到处理架构的各个方面。

认识到单独采用任何一种方法的局限性,许多现代机器学习系统采用混合方法,结合批量和流式摄取来处理不同的数据速度和用例。这种灵活性允许系统同时处理历史数据批量处理和实时数据流,提供全面的数据景观视图。推荐系统可能会使用流式摄取来实时更新基于会话的推荐,例如点击、查看、购买,而使用批量摄取来处理用户资料、项目特征和不需要实时更新的协同过滤模型,这些模型可以在夜间进行处理。

生产系统在选择模式时必须平衡成本与延迟之间的权衡:实时处理可能比批量处理贵 10-100 倍。这种成本差异源于几个因素:流式系统需要始终在线的基础设施,而不是可以根据工作负载启动和关闭的可调度资源;为了容错而维护冗余处理以确保不丢失任何事件;需要低延迟的网络和存储以满足毫秒级的服务水平协议(SLA);并且无法从批量处理通过在大数据量中分摊启动成本所实现的规模经济中受益。处理一个千兆字节的批量作业可能需要 100 台机器运行 10 分钟,而处理相同数据 24 小时的流式系统则需要持续可用的专用资源。每处理一个字节的 100 倍成本差异驱动了许多关于哪些数据真正需要实时处理以及哪些可以容忍批量延迟的架构决策。

ETL 与 ELT 比较

除了根据时间要求选择摄取模式之外,设计有效的数据摄取管道还需要了解提取、转换、加载(ETL)16 和提取、加载、转换(ELT)17 方法之间的差异,如图 6.9 所示。这些范式决定了数据转换相对于加载阶段发生的时间,这对机器学习管道的灵活性和效率有重大影响。ETL 和 ELT 之间的选择会影响计算资源消耗的位置、数据变得可用于分析的速度以及转换逻辑如何随着需求的变化而演变。

图片

图 6.9:数据管道架构:ETL 管道在将数据加载到数据仓库之前对其进行转换,而 ELT 管道首先加载原始数据,然后在仓库内进行转换,这影响了机器学习工作流程的系统灵活性和资源分配。选择 ETL 和 ELT 取决于数据量、转换复杂性和目标数据存储系统的功能。

ETL 是一种成熟的方法论,其中数据首先从源收集,然后转换以匹配目标模式或模型,最后加载到数据仓库或其他存储库。这种方法通常导致数据以可查询的格式存储,这对于需要一致、预处理的机器学习系统来说可能是有利的。转换步骤在数据到达仓库之前在单独的处理层中发生,使得在持久化之前可以进行验证和标准化。例如,一个预测客户流失的机器学习系统可能会使用 ETL 来标准化和汇总来自多个来源的客户交互数据——将不同的时间戳格式转换为 UTC,将文本编码标准化为 UTF-8,并计算汇总特征,如“过去 30 天的总购买额”——然后再加载到适合模型训练的格式中(Inmon 2005)。

在具有明确定义的模式和转换要求的场景中,ETL 的优势变得明显。只有经过清洗、验证和转换的数据才会进入仓库,从而减少了存储需求并简化了下游查询。在转换过程中可以强制执行安全性和隐私合规性,确保敏感数据在到达存储之前被屏蔽或加密。在加载之前进行质量验证,防止损坏或无效数据进入仓库。对于具有稳定特征管道和明确数据质量要求的机器学习系统,ETL 在杂乱的数据源和精心整理的培训数据之间提供了清晰的分离。

然而,当模式或需求频繁变化时,ETL 可能不够灵活,这在不断发展的机器学习项目中是一个常见现象。当转换逻辑发生变化——添加新特征、修改聚合或纠正错误时,所有源数据都必须通过 ETL 管道重新处理以更新数据仓库。这种重新处理可能需要数小时或数天,对于大型数据集来说,会减慢机器学习开发中的迭代速度。转换层需要专用基础设施和专业知识,增加了数据管道的操作复杂性和成本。

这就是 ELT 方法提供优势的地方。ELT 通过首先加载原始数据,然后在目标系统内按需应用转换来反转顺序。这种方法通常在现代数据湖或读取模式环境中看到,当处理机器学习系统中的不断发展的分析需求时,允许采取更敏捷的方法。原始源数据快速加载到可扩展的存储中,使用仓库的计算资源应用转换。现代云数据仓库如 BigQuery、Snowflake 和 Redshift 提供巨大的计算能力,可以在几分钟内执行复杂转换,处理 PB 级数据。

通过推迟转换,ELT 可以适应同一数据集的多种用途,这在机器学习项目的探索性数据分析阶段或同时开发多个具有不同数据需求模型时特别有用。一个团队可能计算每日汇总,而另一个团队可能计算每小时汇总,每个团队以不同的方式转换相同的原始数据。当发现转换逻辑错误时,团队可以通过简单地重新运行转换查询来重新处理数据,而不是从源重新摄取。这种灵活性加速了机器学习实验,其中特征工程需求迅速演变。

然而,ELT 对存储系统和查询引擎的要求更高,它们必须处理大量未处理的信息。原始数据存储的增长大于转换数据,增加了成本。当转换在相同的原始数据上重复执行而不是读取预计算的结果时,查询性能可能会受到影响。当原始敏感数据在存储中持续存在而不是在摄取时被掩码时,隐私和合规性变得更加复杂。

在实践中,许多机器学习系统采用混合方法,根据每个数据源或机器学习模型的具体需求,逐个案例选择 ETL 或 ELT。例如,一个系统可能会使用 ETL 来处理来自关系数据库的结构化数据,其中模式定义良好且稳定,而对于文本或图像等非结构化数据,可能会采用 ELT,因为随着机器学习模型的优化,转换需求可能会发生变化。高流量的点击流数据可能会使用 ELT 来实现快速加载和灵活的转换,而敏感的财务数据可能会使用 ETL 在持久化之前进行加密和掩码。

在 ETL/ELT 架构中实现流组件时,分布式系统原则变得至关重要。CAP 定理 18 从根本上限制了流系统设计的选择。Apache Kafka19 优先考虑一致性和分区容错性,使其在可靠的事件排序方面表现理想,但在网络分区期间可能会出现可用性问题。Apache Pulsar 强调可用性和分区容错性,提供更好的容错性,但一致性保证有所放宽。Amazon Kinesis 通过仔细配置平衡所有三个属性,但需要理解这些权衡以进行适当的部署。

多源集成策略

不论是使用 ETL 还是 ELT 方法,将多样化的数据源集成到机器学习系统中代表数据摄取的关键挑战。数据可能来自各种来源,包括数据库、API、文件系统和物联网设备。每个源可能有自己的数据格式、访问协议和更新频率。集成挑战不仅在于连接到这些源,而且在于将它们不同的特性规范化到一个后续处理阶段可以可靠消费的统一管道中。

考虑到这种数据源多样性,机器学习工程师必须为每个数据源开发健壮的连接器或适配器,以有效地集成这些源。这些连接器处理数据提取的细节,包括身份验证、速率限制和错误处理。例如,当与 REST API 集成时,连接器将管理 API 密钥,遵守 API 文档或 HTTP 头中指定的速率限制,并适当地处理 HTTP 状态码——在短暂错误(500、503)上重试,在身份验证失败(401、403)上中止,并在速率限制(429)时退避。一个设计良好的连接器将这些细节从下游处理中抽象出来,无论数据是否来自 API、数据库或文件系统,都提供一个一致的接口。

除了基本的连接性之外,源集成通常涉及在摄取点进行数据转换。这可能包括将 JSON20 或 XML 响应解析为结构化格式,将时间戳转换为标准时区和格式(通常是 UTC 和 ISO 8601),或执行基本的数据清理操作,如修剪空白或规范化文本编码。目标是标准化数据格式,使其进入机器学习管道,简化下游处理。这些转换不同于 ETL 或 ELT 中的业务逻辑转换——它们解决的是技术格式变化,而不是内容语义转换。

除了数据格式标准化外,考虑数据源的可靠性和可用性至关重要。一些来源可能会出现停机或数据质量不一致的情况。实现具有指数退避的重试机制可以优雅地处理暂时性故障。在摄取时进行数据质量检查可以早期捕捉到系统性问题——如果某个来源突然开始为之前必需的字段产生空值,立即检测可以防止损坏的数据流向下游。后备程序可以在主要来源失败时继续操作:切换到备用数据源,提供缓存数据,或者优雅地降级而不是完全失败。如果实时数据源失败,股价摄取系统可能会回退到延迟价格,以略微陈旧的数据维持服务,而不是完全中断。

案例研究:为 KWS 选择摄取模式

将这些摄取概念应用于我们的 KWS 系统,生产实现展示了流式和批量模式协同工作,反映了我们在问题定义期间建立的两种操作模式。摄取架构直接实现了我们四支柱框架的要求:通过验证音频特征来保证质量,通过一致操作来保证可靠性,尽管来源多样化;通过处理数百万并发流来保证可扩展性,通过来源认证和跟踪来保证治理。

流式摄取模式处理来自活跃设备的实时音频数据,在这些设备上必须在我们的 200 毫秒延迟要求内检测到唤醒词。这需要谨慎实现发布-订阅机制,使用如 Apache Kafka 这样的系统来缓冲传入的音频数据,并允许多个推理服务器之间的并行处理。流式路径优先考虑我们的可靠性和可扩展性支柱:在设备负载和网络条件变化的情况下保持一致的低延迟操作,同时处理部署设备上的数百万并发音频流。

与此同时,批量处理处理模型训练和更新的数据。这包括我们在获取过程中建立的各种数据源:来自众包努力的新的唤醒词录音,如第 6.5 节中讨论的,以及解决我们识别的覆盖范围差距的语音生成系统的合成数据,以及验证过的用户交互,这些交互提供了成功检测和错误拒绝的真实世界示例。批量处理通常遵循 ETL 模式,其中音频数据经过预处理——标准化到标准音量水平,过滤以去除极端噪声,并分割成一致的时间段——然后存储在针对模型训练优化的格式中。此处理通过确保训练数据经历一致的转换来维护区分唤醒词和背景语音的声学特征,从而解决我们的质量支柱。

将这些不同的数据源集成到 KWS 系统中带来了独特的挑战。实时音频流需要速率限制,以防止在使用高峰期间系统过载——想象数百万用户同时向他们的语音助手询问突发新闻。众包数据需要系统性的验证,以确保录音质量符合我们在问题定义期间设定的规格:足够的信号与噪声比,适当的说话人距离,以及正确的标签。合成数据必须经过验证,以确保唤醒词变体的现实表示,而不是生成声学上不可能的样本,这些样本会误导模型训练。

当处理实时音频时,语音交互系统所需的复杂错误处理机制变得明显。死信队列存储失败的识别尝试,以便后续分析,有助于识别假阴性或系统故障中的模式,这些模式可能表明我们在数据收集期间未能充分覆盖的声学条件。例如,处理唤醒词“Alexa”的智能家居设备必须验证几个音频质量指标:信号与噪声比高于我们在需求定义期间设定的最低阈值,适当的采样率与训练数据规格相匹配,录音时长在一到两秒的预期范围内,以及说话人距离指示器表明话语是针对设备而非偶然的言语。无效样本被路由到死信队列进行分析,而不是完全丢弃——这些失败通常揭示了需要在下一个模型迭代中注意的边缘情况。有效样本流向实时处理以进行唤醒词检测,同时被记录下来,以备将来可能包含在训练数据中,展示了生产系统如何通过仔细的数据工程不断改进。

这种摄取架构完成了外部数据进入我们控制管道的边界层。在建立了可靠的数据摄取——验证数据质量、优雅地处理错误、扩展到所需的吞吐量以及维护治理控制后——我们现在转向系统化数据处理,将摄取的原始数据转换为机器学习准备好的特征,同时保持生产系统所必需的训练-服务一致性。

系统化数据处理

在建立了可靠的数据摄取后,我们进入了管道中最具技术挑战性的阶段:系统化数据处理。在这里,一个基本要求——在训练和部署时应用相同的转换——成为大约 70%的生产机器学习失败的原因(Sculley 等人,2021)。这个引人注目的统计数据强调了为什么训练-服务一致性必须成为所有处理决策的核心组织原则。

数据处理实现了我们在问题定义阶段定义的质量要求,在保持可靠性和可扩展性标准的同时,将原始数据转换为机器学习准备好的格式。处理决策必须在提高模型准备度的同时保持数据完整性,并且在整个转换管道中遵守治理原则。每个转换——从归一化参数到分类编码再到特征工程逻辑——都必须在两个上下文中应用一致。考虑一个简单的例子:在训练过程中通过去除货币符号并将金额转换为浮点数来归一化交易金额,但忘记在服务过程中应用相同的预处理。这种看似微小的不一致性可能会使模型准确性降低 20-40%,因为模型接收到的输入格式与其训练时不同。这个问题的严重性使得训练-服务一致性成为处理系统设计的核心组织原则。

对于我们的关键词检测系统(KWS),处理决策直接影响到我们在问题定义中确立的四个支柱(第 6.3.3 节)。质量转换必须保留对唤醒词检测至关重要的声学特征,并在不同的录音条件下进行标准化。可靠性要求在通过我们的多源采集策略收集到的不同音频格式下保持一致的处理。可扩展性需要处理部署设备上数百万个音频流的效率算法。治理确保在处理过程中保护用户语音数据隐私的转换。

确保训练-服务一致性

我们将质量视为数据处理的基础。在这里,质量支柱表现为确保在训练期间应用的转换与在服务期间应用的转换完全匹配。这一致性挑战不仅限于应用相同的代码——它要求在训练数据上计算出的参数(归一化常数、编码字典、词汇映射)在服务期间被存储和重用。如果没有这种纪律,模型在服务期间接收到的输入与它们训练时的输入根本不同,导致性能下降,这种下降往往是微妙且难以调试的。

数据清洗涉及识别和纠正数据集中的错误、不一致性和不准确之处。原始数据经常包含缺失值、重复项或异常等问题,如果未解决,这些都会严重影响模型性能。关键见解是,清洗操作必须是确定性和可重复的:给定相同的输入,清洗必须在训练或服务期间执行时产生相同的输出。这一要求决定了哪些清洗技术在生产机器学习系统中是安全的。

数据清洗可能包括基于确定性键删除重复记录,通过规则进行插补或删除以处理缺失值,以及系统地纠正格式不一致性。例如,在一个客户数据库中,姓名可能不一致地大写或格式化。数据清洗过程将标准化这些条目,确保“John Doe”、“john doe”和“DOE, John”都被视为同一实体。清洗规则——转换为标题格式、重新排序为“First Last”格式——必须被捕获在代码中,该代码在训练和服务期间执行相同。正如本章所强调的,每个清洗操作都必须在这两个环境中以相同的方式应用,以保持系统可靠性。

异常检测和处理是数据清洗的另一个重要方面,但同时也引入了一致性挑战。异常有时可以代表关于罕见事件的宝贵信息,但它们也可能是由测量错误或数据损坏引起的。机器学习从业者必须在决定如何处理异常时仔细考虑其数据的性质和其模型的要求。基于阈值的简单异常移除(移除比平均值超过 3 个标准差的值)如果平均值和标准差是在训练数据上计算并在服务期间重用的,则可以保持训练-服务一致性。然而,更复杂的异常检测方法,考虑特征之间的关系或时间模式,需要仔细的工程来实现一致的应用。

质量评估与数据清洗相辅相成,提供了一种系统性的方法来评估数据的可靠性和有用性。这个过程包括检查数据质量的各个方面,包括准确性、完整性、一致性和时效性。在生产系统中,数据质量以基本指标无法捕捉的微妙方式下降:从未包含空值的字段突然出现稀疏模式,数值分布偏离其训练范围,或者在模型开发期间未出现过的分类值。

为了解决这些微妙的退化模式,生产质量监控需要超越简单缺失值计数之外的特定指标,正如第 6.4.1 节中讨论的那样。关键指标包括按特征(突然增加可能表明上游故障)的空值模式、计数异常(10 倍增加通常表明数据重复或管道错误)、值范围违规(价格变为负数,年龄超过现实界限)以及数据源之间的连接失败率。通过监控特征随时间的变化,包括均值、方差和分位数,进行统计漂移检测 21 变得至关重要,以便在它影响模型性能之前捕捉到渐进式退化。例如,在一个电子商务推荐系统中,由于网站设计的改进,平均用户会话长度可能在六个月内从 8 分钟逐渐增加到 12 分钟,但突然下降到 3 分钟可能表明存在数据收集错误。

支持这些监控需求,质量评估工具从简单的统计指标到基于复杂机器学习的方法都有。数据概要分析工具提供总结统计和可视化,有助于识别潜在的质量问题,而高级技术则采用无监督学习算法来检测大型数据集中的异常或不一致性。建立明确的质量指标和阈值确保进入机器学习管道的数据满足可靠模型训练和推理的必要标准。关键是保持训练和部署过程中的相同质量标准和验证逻辑,以防止质量问题的出现导致训练-部署偏差。

转换技术将数据从其原始形式转换为更适合分析和建模的格式。这个过程可以包括从简单的转换到复杂的数学变换的广泛操作。有效的转换的核心任务包括归一化和标准化,这些任务将数值特征缩放到一个共同的范围或分布。例如,在房价预测模型中,像面积和房间数量这样的特征可能在很大程度上有不同的尺度。归一化这些特征确保它们对模型预测的贡献更加平等(Bishop 2006)。保持训练-服务一致性需要将训练数据上计算的归一化参数(均值、标准差)存储并应用于服务期间完全相同。这意味着将这些参数与模型本身一起持久化——通常在模型工件或单独的参数文件中——并在服务初始化期间加载它们。

除了数值缩放之外,其他转换可能包括对分类变量进行编码、处理日期和时间数据,或创建派生特征。例如,独热编码通常用于将分类变量转换为许多机器学习算法可以轻松理解的格式。分类编码必须处理训练期间存在的类别以及服务期间遇到的未知类别。一种稳健的方法是在训练期间计算类别词汇表(所有观察到的类别集合),将其与模型一起持久化,并在服务期间将未知类别映射到特殊的“未知”标记或使用默认值。如果没有这种纪律,服务期间可能会遇到模型在训练期间从未见过的类别,这可能导致错误或性能下降。

特征工程是使用领域知识创建新特征的过程,这些特征可以使机器学习算法更有效地工作。这一步骤通常被认为更多的是一种艺术而不是科学,需要创造力和对数据和待解决问题有深刻的理解。特征工程可能涉及组合现有特征、从复杂的数据类型中提取信息,或根据领域洞察创建全新的特征。例如,在零售推荐系统中,工程师可能会创建捕捉客户购买的新近性、频率和货币价值的特征,这被称为 RFM 分析(Kuhn 和 Johnson 2013)。

在这些创意可能性面前,特征工程的重要性不容小觑。精心设计的特征往往能显著提升模型性能,有时甚至超过算法选择或超参数调整的影响。然而,特征工程所需的创造力必须与生产系统的一致性要求相平衡。每个工程化的特征在训练和部署时都必须以相同的方式进行计算。这意味着特征工程逻辑应该实现于库或模块中,这些库或模块可以在训练和部署代码之间共享,而不是分别重新实现。许多组织构建特征存储库,如第 6.9.4 节所述,专门用于确保跨环境中的特征计算一致性。

将这些处理概念应用于我们的 KWS 系统,流经我们摄入管道的音频录音——无论来自众包、合成生成还是现实世界的捕捉——都需要进行仔细的清理,以确保可靠的唤醒词检测。原始音频数据通常包含我们的问题定义所预期的缺陷:来自各种环境的背景噪声(从安静的卧室到嘈杂的工业环境)、录音电平问题导致的剪辑信号、不同麦克风和扬声器的不同音量,以及来自不同捕获设备的采样率不一致。清理管道必须标准化这些变化,同时保留区分唤醒词和背景语音的声学特征——这是一个直接影响我们 98%准确率目标的保质量要求。

对于关键词语音识别(KWS)的质量评估,在通用原则的基础上增加了音频特定的指标。除了检查空值或模式符合性之外,我们的系统还跟踪背景噪声水平(信噪比超过 20 分贝)、音频清晰度评分(频率谱分析)和说话速率一致性(唤醒词持续时间在 500-800 毫秒之间)。质量评估管道自动标记那些背景噪声会妨碍准确检测、唤醒词说话过快或不够清晰以至于模型无法区分,或者剪辑或失真已损坏音频信号的录音。这种自动过滤确保只有高质量的样本进入模型开发,防止我们已在图 6.3 中识别出的“垃圾输入,垃圾输出”级联。

对于关键词检测(KWS)的音频数据处理,涉及将原始波形转换为适合机器学习模型的格式,同时保持训练和服务的连贯性。如图 6.10 图 6.10 所示,转换管道将音频信号转换为标准化的特征表示——通常是梅尔频率倒谱系数(MFCCs)22 或频谱图 23,这些表示强调了与语音相关的特征,同时减少了不同录制条件下的噪声和可变性。

图片

图 6.10:音频特征转换:高级音频特征将原始音频波形压缩成强调机器学习任务中感知相关特性的表示。这种转换减少了噪声和数据维度,同时保留了重要的语音信息,提高了在关键词检测等应用中的模型性能。

构建幂等数据转换

在质量基础之上,我们转向可靠性。虽然质量关注的是哪些转换会产生什么结果,但可靠性确保它们如何持续稳定地运行。处理可靠性意味着在相同的输入下,转换会产生相同的输出,无论何时、何地或执行多少次。这种特性,称为幂等性,对于可能因故障而重试处理、可能因修复错误而重新处理数据,或相同数据通过多个处理路径流动的生产级机器学习系统来说至关重要。

为了直观理解幂等性,考虑一个开关。将开关翻转到“开”的位置会打开灯。再次将其翻转到“开”的位置,灯仍然亮着;操作可以重复进行而不会改变结果。这是幂等行为。相比之下,每次按下都会改变状态的切换开关不是幂等的:重复按下会在开和关的状态之间交替。在数据处理中,我们希望有开关的行为,即重新应用相同的转换会产生相同的结果,而不是切换开关的行为,重复应用会不可预测地改变结果。

幂等转换使可靠的错误恢复成为可能。当处理作业中途失败时,系统可以安全地重试处理相同的数据,而不用担心重复的转换或不一致的状态。非幂等转换可能会向现有记录中添加数据,因此重试会创建重复项。幂等转换会更新数据(如果不存在则插入,如果存在则更新),因此重试会产生相同的状态。这种区别在分布式系统中变得至关重要,因为在分布式系统中,部分故障很常见,重试是主要的恢复机制。

处理部分失败需要仔细的状态管理。处理管道应该设计成每个阶段可以独立重试,而不会影响其他阶段。检查点-重启机制可以从最后一个成功的处理状态恢复,而不是从头开始重新启动。对于在 TB 级数据集上运行的长运行数据处理作业,每几分钟检查点进度意味着在接近结束时失败只需要重新处理最近的数据,而不是整个数据集。检查点逻辑必须仔细跟踪已处理的数据和剩余的数据,确保没有数据丢失或重复处理。

确定性转换是指对于相同的输入总是产生相同输出的转换,而不依赖于时间、随机数或可变的全局状态等外部因素。依赖于当前时间的转换(例如,基于当前日期计算“事件以来的天数”)会破坏确定性——重新处理历史数据会产生不同的结果。解决方案是明确捕获时间参考点:而不是“事件以来的天数”,计算“事件到参考日期的天数”,其中参考日期是固定的并持续存在。随机操作应使用带种子的随机数生成器,其中种子可以从输入数据中确定性推导出来,确保可重复性。

对于我们的关键词识别系统,可靠性需要可重复的特征提取。音频预处理必须是确定性的:对于相同的原始音频文件,无论何时处理或哪个服务器执行,总是计算相同的 MFCC 特征。这使调试模型行为(可以始终为有问题的示例重新创建精确的特征)成为可能,当错误被修复时重新处理数据(产生一致的结果),以及分布式处理(不同的工作者从相同的输入产生相同特征)。处理代码捕获所有参数——FFT 窗口大小、跳长、MFCC 系数的数量——在配置中版本化,与代码一起版本化,确保跨时间和执行环境的可重复性。

通过分布式处理进行扩展

在质量和可靠性得到确立之后,我们面临着规模化的挑战。随着数据集的增长和机器学习系统的复杂性增加,数据处理的可扩展性成为限制因素。考虑我们讨论过的数据处理阶段——清理、质量评估、转换和特征工程。当这些操作必须处理 TB 级的数据时,单台机器就不够用了。在内存中处理 GB 级数据的清理技术必须重新设计,以便在分布式系统中工作。

当质量评估必须处理数据比其到达得更快时,当特征工程操作需要在转换单个记录之前计算整个数据集的统计信息时,以及当转换管道在大量数据中创建瓶颈时,这些挑战就会显现出来。处理必须从开发(笔记本电脑上的千兆字节)扩展到生产(集群上的太字节),同时保持一致的行为。

为了解决这些扩展瓶颈,数据必须在多个计算资源之间分区,这引入了协调挑战。分布式协调从根本上受到网络往返时间的限制:本地操作在微秒内完成,而网络协调需要毫秒,这造成了 1000 倍的延迟差异。这一限制解释了为什么需要全局协调的操作(如跨 100 台机器计算归一化统计信息)会形成瓶颈。每个分区可以快速计算本地统计信息,但合并它们需要所有分区的信息。

在这个规模下,数据局部性变得至关重要。在每秒 10 千兆字节的速率下,将 1 太字节的训练数据通过网络传输需要 100 多秒,而本地 SSD 访问仅需 200 秒(每秒 5 千兆字节),这促使机器学习系统设计转向数据跟随计算架构。当处理节点以 RAM 速度(每秒 50-200 千兆字节)访问本地数据,但必须通过每秒限制在 1-10 千兆字节的网络进行协调时,带宽不匹配会形成基本瓶颈。地理分布放大了这些挑战:跨数据中心协调必须处理网络延迟(区域间 50-200 毫秒)、部分故障,以及防止数据跨境的监管限制。理解哪些操作可以轻松并行化,而哪些操作需要昂贵的协调,决定了系统架构和性能特征。

当设计得当时,单机处理对于出人意料大的工作负载是足够的。现代服务器具有 256 千兆字节的 RAM,可以使用脱核处理来处理数个太字节的数集,该处理方式从磁盘流式传输数据。Dask 或 Vaex 等库能够启用类似 pandas 的 API,自动在多个核心上流式传输和并行化计算。在投资分布式处理基础设施之前,团队应该充分利用单机优化:使用高效的数据格式(Parquet24 而不是 CSV),最小化内存分配,利用向量操作,并利用多核并行性。单机处理的操作简单性——无需网络协调、无部分故障、调试简单——使得在性能足够时更受欢迎。

当数据量或计算需求超过单机容量时,分布式处理框架变得必要,但通过并行化实现的加速速度受到 Amdahl 定律描述的根本限制:

Speedup1S+PN\text{Speedup} \leq \frac{1}{S + \frac{P}{N}}

其中,SS 表示无法并行化的工作序列分数,PP 表示并行分数,NN 表示处理器数量。这解释了为什么将我们的关键词提取特征提取分布在 64 个核心上,当工作具有明显的并行性时(S0S \approx 0),只能实现 64 倍的速度提升,但像计算全局归一化统计这样的协调密集型操作,即使有 64 个核心,也可能只能实现 10 倍的速度提升,这是由于序列聚合阶段。理解这种关系指导了架构决策:具有高序列分数的操作应该在较少、较快的核心上运行,而不是在许多较慢的核心上运行,而高度并行的作业从最大分布中受益,这在第八章中进一步探讨。

Apache Spark 提供了一个分布式计算框架,该框架可以在机器集群之间并行化转换,自动处理数据分区、任务调度和容错。Beam 提供了一个统一的 API,用于批处理和流处理,使得相同的转换逻辑可以在多个执行引擎(Spark、Flink、Dataflow)上运行。TensorFlow 的 tf.data API 优化了机器学习训练中的数据加载管道,支持分布式读取、预取和转换。框架的选择取决于处理是批处理还是流处理,转换如何并行化,以及可用的执行环境。

另一个重要的考虑因素是预处理和即时计算的平衡。虽然大量的预处理可以加快模型训练和推理的速度,但它也可能导致存储需求增加和潜在的数据过时。生产系统通常实施混合方法,预处理计算成本高昂的特征,同时在即时计算快速变化的特征。这种平衡取决于存储成本、计算资源以及每个用例特定的数据新鲜度要求。计算成本高昂但变化缓慢的特征(如用户人口统计摘要、项目流行度得分)从预处理中受益。变化快速的特征(如当前会话状态、实时库存水平)必须即时计算,尽管计算成本较高。

对于我们的关键词识别(KWS)系统,可扩展性在多个阶段显现。开发阶段使用单机处理在样本数据集上快速迭代。大规模训练需要分布式处理,当数据集大小(2300 万示例)超过单机容量或多个实验同时运行时。处理管道自然并行化:音频文件是独立的,因此转换它们不需要在工作者之间进行协调。每个工作者从分布式存储中读取分配给它的音频文件,计算特征,并将结果写回——这是一个简单的并行模式,实现了接近线性的可扩展性。生产部署需要在边缘设备上进行实时处理,这些设备资源受限(我们的 16 千字节内存限制),需要仔细优化和量化,以确保处理在设备能力范围内。

跟踪数据转换血缘

完善我们关于数据处理四支柱的观点,治理确保了问责制和可重复性。治理支柱要求跟踪应用了哪些转换、何时执行、运行了哪个版本的代码处理以及使用了哪些参数。这种转换血缘使得可重复性成为调试、符合需要可解释性的法规以及发现转换错误时的迭代改进所必需的。没有全面的血缘,团队无法重现训练数据,无法解释模型为何做出特定的预测,也无法在没有风险不一致的情况下安全地修复处理错误。

转换版本控制记录了哪个版本的代码处理生成了每个数据集。当转换逻辑发生变化——修复错误、添加功能或提高质量时——版本号会增加。数据集会标记上创建它们的转换版本,以便在修复错误时识别所有需要重新处理的数据。这种版本控制不仅限于代码版本,还涵盖了整个处理环境:库版本(不同的 NumPy 版本可能会产生略微不同的数值结果)、运行时配置(影响行为的环境变量)和执行基础设施(影响浮点精度的 CPU 架构)。

参数跟踪维护转换过程中使用的特定值。对于归一化,这意味着存储在训练数据上计算出的均值和标准差。对于分类编码,这意味着存储词汇表(所有观察到的类别的集合)。对于特征工程,这意味着存储在特征计算中使用的任何常数、阈值或参数。这些参数通常与模型工件一起序列化,确保服务使用与训练相同的参数。现代机器学习框架如 TensorFlow 和 PyTorch 提供了将预处理参数与模型捆绑的机制,简化了部署并确保了一致性。

可重现性处理谱系追踪从原始数据到最终特征的完整转换历史。这包括读取了哪些原始数据文件,应用了哪些转换以及它们的顺序,使用了哪些参数,以及处理发生的时间。Apache Atlas、Amundsen 或商业产品等谱系系统通过自动捕获此流程来对管道进行工具化。当模型预测证明不正确时,工程师可以通过谱系回溯:哪些训练数据导致了这种行为,这些数据有什么质量评分,应用了哪些转换,并且能否重现这一确切场景以进行调查?

代码版本将处理结果与生成它们的精确代码关联起来。当处理代码存在于版本控制(Git)中时,每个数据集应记录创建它的代码的提交哈希。这允许重现精确的处理环境:检出特定的代码版本,安装该版本列出的依赖项,并使用相同的参数运行处理。容器技术如 Docker 通过捕获整个处理环境(代码、依赖项、系统库)在一个不可变镜像中,可以几个月或几年后以相同的结果重新运行来简化这一过程。

对于我们的关键词识别(KWS)系统,转换治理跟踪对模型行为有重要影响的音频处理参数。当音频被标准化到标准音量时,参考音量级别被持久化。当 FFT 将音频转换到频域时,记录窗口大小、跳长和窗口函数(汉明、汉宁等)。当计算 MFCC 时,捕获系数数量、频率范围和梅尔滤波器组参数。这种全面的参数跟踪使几个关键功能成为可能:在调试模型故障时精确重现训练数据,验证服务使用与训练相同的预处理,以及系统地研究预处理选择如何影响模型精度。没有这种治理基础设施,团队将求助于手动文档,这些文档不可避免地会过时或错误,导致微妙的训练-服务偏差,降低生产性能。

端到端处理管道设计

整合这些清理、评估、转换和特征工程步骤,处理管道将各种数据处理步骤组合成一个连贯、可重现的工作流程。这些管道确保数据在训练和推理阶段的一致性准备,降低数据泄露的风险,并提高机器学习系统的可靠性。管道设计决定了团队迭代处理逻辑的容易程度,处理随数据增长而扩展的效果,以及系统维护训练-服务一致性的可靠性。

现代的机器学习框架和工具通常提供构建和管理数据处理管道的能力。例如,Apache Beam 和 TensorFlow Transform 允许开发者定义可以在模型训练和服务期间一致应用的数据处理步骤。数据处理框架的选择必须与第七章(ch013.xhtml#sec-ai-frameworks)中讨论的更广泛的机器学习框架生态系统相一致,其中框架特定的数据加载器和预处理实用程序可以显著影响开发速度和系统性能。

除了工具选择之外,有效的管道设计还涉及模块化、可扩展性和版本控制等方面的考虑。模块化管道允许轻松更新和维护单个处理步骤。每个转换阶段应实现为一个独立的模块,具有清晰的输入和输出,以便在隔离状态下进行测试和替换,而不会影响其他阶段。管道的版本控制至关重要,确保数据处理的变化可以被跟踪并与模型性能的变化相关联。当模型精度下降时,版本控制可以确定处理变化是否导致了退化。

这种对管道组件的模块化分解在图 6.11 中得到了很好的体现,该图展示了从初始数据摄取到最终模型部署的完整流程。该图演示了数据如何通过验证、转换和特征工程阶段,在达到模型训练之前流动。管道中的每个组件都可以独立地进行版本控制、测试和扩展,同时保持整体系统的一致性。

图片

图 6.11:数据处理管道:一个模块化的端到端机器学习管道,如 TensorFlow Extended 中实现的那样,突出了从原始数据摄取到训练模型部署和服务的各个关键阶段。这种分解使得每个组件可以独立地进行开发、版本控制和扩展,从而提高了机器学习系统的可维护性和可重复性。

在集成这些处理组件时,我们的关键词语音识别(KWS)处理管道必须同时处理训练的批量处理和推理的实时处理,同时保持这两种模式之间的一致性。管道设计确保了在服务期间存储和应用与训练数据上计算出的相同归一化参数——平均音量水平、频率响应曲线和持续时间统计——保持一致。这一架构决策反映了我们的可靠性支柱:用户期望无论其设备是在何时制造的或运行的是哪个模型版本,都能实现一致的唤醒词检测,这需要处理管道在训练迭代和部署环境中保持稳定行为。

有效的数据处理是成功机器学习系统的基石。通过仔细清洗、转换和通过我们的四支柱框架进行数据工程——通过训练-服务一致性保证质量,通过幂等转换保证可靠性,通过分布式处理保证可扩展性,通过全面溯源保证治理——从业者可以显著提高其模型的表现力和可靠性。随着机器学习领域的持续发展,数据处理的技术和工具也在不断发展,这使得这一领域成为了一个既令人兴奋又充满活力的研究领域和实践领域。在系统化处理建立之后,我们现在来考察数据标注,它将人类判断引入了我们原本自动化的管道中,同时在质量、可靠性、可扩展性和治理维度上保持了相同的框架纪律。

数据标注

在系统化数据处理建立之后,数据标注作为数据工程领域中的一个特别复杂的系统挑战显现出来。随着训练数据集增长到数百万或数十亿个示例,支持标注操作的基础设施对系统性能变得越来越关键。标注代表了人机交互的系统工程,我们的四个支柱以与自动化管道阶段截然不同的方式指导基础设施决策。质量支柱表现为通过共识机制和黄金标准验证确保标签准确性。可靠性支柱要求平台架构能够协调数千个并发标注者,而不会出现数据丢失或损坏。可扩展性支柱推动人工智能辅助增强人类判断,而不是取代它。治理支柱要求公平补偿、偏见缓解和对创造训练数据以使机器学习系统得以运行的人类贡献者的道德待遇。

现代机器学习系统必须高效地处理其数据管道中标签的创建、存储和管理。系统架构必须支持各种标注工作流程,同时保持数据一致性、确保质量和有效管理计算资源。当处理大规模数据集或实时标注需求时,这些要求会变得更加复杂。系统性的挑战不仅限于存储和管理标签——生产级机器学习系统需要强大的管道,将标注工作流程与数据摄取、预处理和训练组件集成,同时保持高吞吐量和适应不断变化的需求。

标注类型及其系统要求

要构建有效的标签系统,我们首先必须理解不同类型的标签如何影响我们的系统架构和资源需求。考虑一个实际例子:构建一个智能城市系统,该系统需要从视频流中检测和跟踪各种对象,如车辆、行人和交通标志。标签捕捉关于关键任务或概念的信息,每种标签类型都施加独特的存储、计算和验证需求。

分类标签代表最简单的形式,通过特定的标签或(在多标签分类中)标签如将图像标记为“汽车”或“行人”来对图像进行分类。虽然概念上简单明了,但处理数百万视频帧的生产系统必须有效地存储和检索这些标签。存储需求是适度的——每张图像一个整数或字符串——但检索模式很重要:训练通常随机采样子集,而验证需要按顺序访问所有标签,这推动了不同的索引策略。

边界框通过识别对象位置,围绕每个感兴趣的对象画一个框,超越了简单的分类。我们的系统现在不仅需要跟踪存在哪些对象,还需要跟踪它们在每个帧中的位置。这种空间信息引入了新的存储和处理挑战,尤其是在跟踪视频帧中的移动对象时。每个边界框需要存储四个坐标(x,y,宽度,高度)以及对象类别,与分类相比,存储增加了 5 倍。更重要的是,边界框标注需要比分类精确 10-20 倍的像素级定位,这极大地影响了标注吞吐量和成本。

分割图通过在像素级别对对象进行分类,以不同的颜色突出显示每个对象,提供了最全面的信息。对于我们的交通监控系统,这可能意味着精确地勾勒出每一辆车、行人和交通标志。这些详细的标注显著增加了我们的存储和处理需求。一个 1920x1080 图像的分割掩码需要 200 万个标签(每个像素一个),而可能只有 10 个边界框或一个分类标签。这种 10 万倍存储的增加以及每张图像手动分割所需的小时数,使得这种方法仅在像素级精度至关重要时适用。

图片

图 6.12:数据标注粒度:数据标注的细节级别从边界框到像素级分割,既影响标注成本也影响潜在模型精度。细粒度分割为训练提供了更丰富的信息,但比粗粒度标注需要显著更多的标注努力和存储容量。

图 6.12 展示了这些常见的标签类型及其不断增加的复杂性。考虑到这些不断增加的复杂性级别,标签格式的选择在很大程度上取决于我们的系统需求和资源限制 (Johnson-Roberson 等人 2017)。虽然分类标签可能足以满足简单的交通计数,但自动驾驶汽车需要详细的分割地图来做出精确的导航决策。领先的自动驾驶汽车公司通常维护混合系统,为相同的数据存储多个标签类型,从而在不同应用中实现灵活使用。一个单独的相机帧可能包含分类标签(场景类型:高速公路、城市、乡村)、边界框(用于障碍物检测的车辆和行人)以及分割掩码(用于路径规划的路面),每种标签类型都服务于不同的下游模型。

超出这些基本标签类型,生产系统还必须处理对维护数据质量和调试模型行为至关重要的丰富元数据。Common Voice 数据集 (Ardila 等人 2020) 体现了语音识别中复杂的元数据管理:跟踪说话者人口统计信息以实现模型公平性、记录质量指标以进行数据过滤、验证状态以验证标签可靠性以及语言信息以支持多语言。如果我们的交通监控系统在雨天表现不佳,数据收集期间的天气条件元数据有助于识别和解决问题。现代标签平台已经建立了复杂的元数据管理系统,能够高效地索引和查询这些元数据,与主要标签一起,在训练数据选择期间进行过滤,并在模型失败被发现时进行事后分析。

这些元数据需求展示了标签类型选择如何贯穿整个系统设计。为简单分类标签构建的系统需要对分割地图进行重大修改才能有效处理。基础设施必须优化所选标签格式的存储系统,实现高效的数据检索模式以进行训练,维护在第 6.7.1 节中建立的验证质量控制管道,并管理标签更新的版本控制。当标签被纠正或细化时,系统必须跟踪哪些模型版本使用了哪些标签版本,以便在标签质量改进和模型性能提升之间建立关联。

实现标签准确性和共识

在标注领域,质量面临独特的挑战。这里的质量支柱侧重于确保标签的准确性,尽管许多标注任务固有的主观性和模糊性。即使有明确的指南和仔细的系统设计,一些标签不可避免地会错误——Thyagarajan 等人(2022)。挑战不是完全消除标注错误——这是一个不可能的目标,而是系统地测量和管理错误率,以保持它们在不会降低模型性能的范围内。

如图 6.13 所示,标签错误源于两个不同的来源,需要不同的工程响应。一些错误源于数据质量问题,其中底层数据确实模糊不清或损坏——就像模糊的青蛙图像,即使专家标注者也无法确定物种。其他错误需要深厚的领域专业知识,正确的标签只能由具有专门知识的专家确定,例如黑鹳的识别。这些不同的失败模式推动了关于标注者资格、任务路由和共识机制的建筑决策。

图片

图 6.13:标签模糊性:主观或困难的例子,如模糊图像或稀有物种,如何在数据标注过程中引入错误,突出了仔细的质量控制和可能需要专家标注的必要性。来源:(Northcutt, Athalye, and Mueller 2021)。

鉴于这些基本的质量挑战,生产级机器学习系统实施了多层质量控制。系统性的质量检查通过随机抽样标注数据供专家审查和统计方法来标记潜在错误,持续监控标注流程。基础设施必须高效地处理这些检查,跨越数百万个示例,而不造成瓶颈。抽样策略通常验证 1-10%的标签,在检测灵敏度和审查成本之间取得平衡。高风险应用,如医疗诊断或自动驾驶汽车,可能通过多次独立审查验证 100%的标签,而低风险应用,如产品推荐,可能只通过抽查验证 1%的标签。

除了随机抽样方法之外,对每个数据点收集多个标签,通常称为“共识标注”,有助于识别有争议或模糊不清的案例。专业的标注公司已经为这一过程开发了复杂的基础设施。例如,Labelbox 提供了共识工具,可以跟踪标注者之间的协议率,并自动将争议案例路由给专家审查。Scale AI 实施了分级质量控制,经验丰富的标注者会验证新团队成员的工作。共识基础设施通常对每个示例收集 3-5 个标签,使用如 Fleiss 的 kappa 等指标来计算标注者之间的协议,这些指标衡量的是超出偶然发生的协议。协议度低的示例(kappa 低于 0.4)将被路由到专家审查,而不是强迫从真正模糊不清的案例中达成共识。

共识方法反映了可扩展系统中必要的经济权衡。专家审查的成本比众包标注高出 10-50 倍,但通过非专家的多数投票强迫对模糊案例达成一致会产生系统性的偏差标签。通过仅将真正模糊不清的案例路由给专家——通常是通过低标注者之间协议率识别的 5-15%的示例——系统在成本和质量之间取得平衡。这种分级方法使得以经济的方式处理数百万个示例,同时通过有针对性的专家干预保持质量标准。

虽然技术基础设施为质量控制提供了基础,但成功的标注系统还必须考虑人为因素。在与标注者合作时,组织需要强大的培训和指导系统。这包括良好的文档,其中包含正确标注的清晰示例,边缘案例的视觉演示以及如何处理这些案例,以及定期的反馈机制,显示标注者在黄金标准示例上的准确性,还有校准会议,标注者在此讨论模糊不清的案例以发展共同理解。对于复杂或特定领域的任务,系统可能会实施分级访问级别,将具有适当专业知识的标注者路由到具有类似示例上展示的准确性的挑战性案例。

质量监控生成大量数据,这些数据必须被高效地处理和跟踪。组织通常监控标注者之间的互评一致性比率(跟踪多个标注者是否对同一示例达成一致),标签置信度分数(标注者对其标签的确定性),每个标注所花费的时间(过快可能表明工作粗心,过慢可能表明困惑),错误模式和类型(系统性的偏差或误解),标注者性能指标(在黄金标准示例上的准确性),以及偏差指标(某些标注者的人口统计特征是否系统地以不同的方式标注)。这些指标必须在数百万个示例中高效地计算和更新,通常需要专门的分析管道,以近乎实时地处理标注数据,以便在这些问题影响大量数据之前捕捉到质量问题。

构建可靠的标注平台

从标签质量转向系统可靠性,我们考察平台架构如何支持一致的操作。虽然质量关注标签准确性,但可靠性确保平台架构本身在规模上保持一致。在保持质量的同时,将标注从数百个示例扩展到数百万个示例需要理解生产标注系统如何在多个架构组件之间分离关注点。基本挑战在于,标注代表一个有人工智能参与的流程,其中系统性能不仅取决于基础设施,还取决于管理人类注意力、专业知识和一致性。

在基础层是一个耐用的任务队列,它持久地存储标注任务,确保在系统重启或标注者断开连接时不会丢失任何工作。大多数生产系统使用像 Apache Kafka 或 RabbitMQ 这样的消息队列而不是数据库来达到这个目的,因为消息队列提供了自然排序、并行消费和重放功能,而这些是数据库难以支持的。每个任务都携带除要标注的数据之外的元数据:任务的类型(分类、边界框、分割),所需的专业知识水平,紧急程度,以及任何用于准确标注的上下文——可能是相关示例或相关文档。

将任务路由到标注者的任务分配服务实现了比简单的轮询分配更复杂的匹配逻辑。医学图像标注系统会将胸部 X 光片特别路由到那些已经证明具有放射学专业知识且与专家标签在黄金标准示例上达成一致性的标注者。但仅凭专业知识匹配是不够的——只看到胸部图像或只看到特定病理的标注者可能会形成盲点,在熟悉的例子上表现良好,但在不常见的案例上表现较差。因此,生产系统对分配进行约束,确保没有标注者从单一类别中接收超过 30%的任务,保持广泛的接触,防止过度专业化降低不熟悉例子上的质量。

当任务需要多个标注以确保质量时,共识引擎确定何时收集了足够的标签以及如何汇总可能存在冲突的意见。简单的多数投票适用于大多数标注者自然达成一致明确的分类任务:确定图像中是否包含汽车很少产生分歧。但像情感分析或识别细微图像属性这样的更主观的任务会在深思熟虑的标注者之间产生合法的分歧。一种常见的模式是通过每个例子收集 3-5 个标签,使用 Fleiss 的 kappa(它衡量的是超出偶然性的协议)来计算标注者间的一致性,并将一致性低的例子——通常是 kappa 低于 0.4 的例子——路由到专家评审,而不是从真正模糊的案例中强制达成共识。

这种分层方法反映了塑造平台架构的基本经济权衡。专家评审的成本比众包标注每例高出 10-50 倍,但通过非专家的多数投票来强制对模糊例子达成一致会产生系统性的偏差——倾向于更容易标注的模式,这可能无法反映对模型鲁棒性重要性的复杂性。通过仅将真正模糊的案例路由到专家那里——通常是通过低标注者间一致性识别出的 5-15%的例子——系统在成本和质量之间取得平衡。平台必须有效地实施这种路由逻辑,跟踪哪些例子需要专家评审,并确保它们被适当地合格的标注者接收,同时避免形成瓶颈。

在大规模下保持质量需要通过黄金标准注入进行持续测量。系统定期将已知正确标签的示例插入到任务流中,而不透露哪些示例是黄金标准。这使计算每个标注者的准确率成为可能,避免了霍桑效应,即测量改变行为——如果标注者不知道哪些是黄金标准示例,他们就不能在黄金标准示例上“更加努力”。那些在黄金标准上得分持续低于 85%的标注者将获得额外的培训材料、更详细的指南,或者如果表现没有改善,则从池中移除。除了简单的准确性之外,系统还从多个维度跟踪质量:与同一任务的同行标注者达成一致(检测到系统性的不一致表明对指南的理解有误),每个任务的时间(太快表明工作粗心大意,太慢表明困惑),以及一致性,即同一标注者在几天后看到相似的示例,以衡量他们是否能够可靠地随时间应用标签。

这些系统的性能要求在扩展时变得非常苛刻。每小时处理 10,000 个标注的平台必须在延迟要求和数据库写入容量之间取得平衡。将每个标注立即写入持久数据库(如 PostgreSQL)以实现持久性将需要每秒 2-3 次写入,这在数据库容量范围内。但是,任务服务——向 100,000 个并发标注者交付新任务——需要亚秒级响应时间,而当请求分散到许多标注者时,数据库在提供服务时很难提供这样的响应时间。因此,生产系统维护一个双层存储架构:Redis 缓存活动任务,以实现低于 100 毫秒的任务分配延迟,而标注则每 100 个标注(通常每 30-60 秒)批量写入 PostgreSQL,提供持久性而不使数据库因小写入而超载。

这些系统的水平扩展需要仔细的数据分区。通过 task_id 对任务进行分片,以实现独立的任务队列扩展,通过 annotator_id 对标注者性能指标进行分片,以便在分配决策期间快速查找,以及通过 example_id 对聚合标签进行分片,以便在模型训练期间高效检索。这种分区策略使每天处理数百万个任务的系统能够支持 10,000+个并发标注者,平均任务分配延迟低于 50 毫秒,证明了当适当架构时,人机交互系统可以扩展以匹配全自动化管道。

除了这些架构考虑因素之外,了解标签操作的经济效益揭示了为什么通过人工智能辅助实现的可扩展性变得至关重要。数据标注代表了机器学习系统最大的隐藏成本之一,然而,在主要关注计算基础设施和模型训练费用的项目规划中,它往往被忽视。虽然团队会仔细优化 GPU 利用率并跟踪以每小时美元计算的培训成本,但以每个示例美元计算的标注费用通常受到较少的审查,尽管它经常以数量级超过计算成本。了解完整的经济模型揭示了为什么随着机器学习系统的成熟和数据需求增长到数百万或数十亿个标注示例,通过人工智能辅助实现的可扩展性不仅有益,而且从经济角度来看是必要的,正如第十三章所考察的,在机器学习生命周期中运营成本会叠加。

标签操作的成本结构遵循一个乘法模型,它同时捕捉直接标注成本和质量控制开销:

总成本=N×成本标注×(1+R审查)×(1+R返工)\text{总成本} = N \times \text{Cost}{\text{label}} \times (1 + R{\text{review}}) \times (1 + R_{\text{rework}})

其中,NN 表示示例数量,Costlabel\text{Cost}{\text{label}} 是每个标注的基础成本,RreviewR{\text{review}} 是需要专家审查的比例(通常为 0.05-0.15),而RreworkR_{\text{rework}} 考虑了需要修正的标注(通常为 0.10-0.30)。此方程揭示了质量要求如何增加成本:一个需要 100 万个标注且每个标注成本为 0.10 美元的数据集,如果 10%需要专家审查(成本增加 5 倍,或 0.50 美元)和 20%需要重做,总成本将达到 13.8 万美元,而不是简单的计算所暗示的 10 万美元。相比之下,在这个数据集上训练一个 ResNet-50 模型可能只需 50 美元的计算成本——这比标注成本低近 3000 倍,这说明了为什么标注经济学在总系统成本中占主导地位,但在规划阶段却经常受到忽视。

每个标注的成本因任务复杂性和所需的专业知识而大幅变化。简单的图像分类在众包时每个标注的成本在 0.01-0.05 美元之间,但需要专家验证时则上升至 0.50-2.00 美元。对于简单情况,边界框的成本为每个框 0.05-0.20 美元,但对于密集场景中许多重叠物体的场景,成本为 1.00-5.00 美元。语义分割的成本可能达到每张图像 5-50 美元,具体取决于精度要求和物体边界。放射科医生对医学图像的标注成本为每项研究 50-200 美元。当计算机视觉系统需要 1000 万个标注图像时,每标注 0.02 美元和 0.05 美元之间的差异代表着 30 万美元的项目成本——这通常超过了整个基础设施预算,但往往在标注开始后才被发现。

使用人工智能辅助标注进行扩展

随着现代机器学习系统对标注需求呈指数级增长,可扩展性变得至关重要。可扩展性支柱推动人工智能辅助作为人类标注的倍增器,而不是替代品。仅靠人工标注无法跟上现代机器学习系统对数据的需求,而完全自动化的标注则缺乏人类提供的细微判断。人工智能辅助标注找到了最佳平衡点:利用自动化处理明确案例并加速标注,同时保留人类对模糊或高风险决策的判断。如图图 6.14 所示,人工智能辅助提供了多种扩展标注操作的方法,每种方法都需要仔细的系统设计来平衡速度、质量和资源使用。

图片

图 6.14:AI 增强标注:通过以潜在标注错误为代价提高吞吐量,程序化标注、远程监督和主动学习扩展了数据标注,这需要仔细的系统设计来平衡标注速度、成本和模型质量。这些策略使机器学习系统能够克服仅由人工标注带来的限制,从而促进在数据稀缺环境中的部署。来源:斯坦福 AI 实验室。

现代 AI 辅助标注通常采用在管道中协同工作的多种方法的组合。预标注涉及使用 AI 模型为数据集生成初步标签,然后人类可以对其进行审查和纠正。主要的标注平台在这项技术上进行了大量投资。Snorkel AI使用程序化标注(Ratner 等人,2018)通过基于规则的启发式方法和弱监督信号自动生成初始标签。Scale AI 部署预训练模型以加速特定领域(如自动驾驶)的标注,其中目标检测模型预先标注车辆和行人,然后由人类验证和改进。像SuperAnnotate这样的公司提供自动预标注工具,可以减少计算机视觉任务的 50-80%的人工工作量。这种方法通常采用半监督学习技术(Chapelle、Scholkopf 和 Zien,2009),可以节省大量时间,尤其是在处理极其庞大的数据集时。

大型语言模型(LLMs)如 ChatGPT 的出现进一步改变了标注流程。除了简单的分类之外,LLMs 可以生成丰富的文本描述,从示例中创建标注指南,甚至解释它们对标签分配的推理。例如,内容审查系统使用 LLMs 进行初始内容分类,并为政策违规生成解释,供人类审查员验证。然而,集成 LLMs 引入了新的系统挑战,包括推理成本(API 调用可能根据复杂性每例花费 0.01-1 美元)、速率限制(云 API 通常限制每分钟 100-10,000 次请求)和输出验证(LLMs 偶尔会生成自信但错误的标签,需要系统验证)。许多组织采用分层方法,使用较小的专用模型处理常规案例,而将较大的 LLMs 保留用于需要细微判断或罕见领域专业知识的复杂场景。

活动学习等方法通过智能地优先处理哪些示例需要人类关注来补充这些方法(Coleman 等人 2022)。这些系统持续分析模型的不确定性,以识别有价值的标注候选者。与其对未标记数据进行随机样本标注,活动学习会选择当前模型最不确定或标签最能提高模型性能的示例。基础设施必须有效地计算不确定性指标(通常是预测熵或集成模型之间的不一致性),维护按信息量排序的任务队列,并根据传入的标签调整优先级策略。考虑一个医学影像系统:活动学习可能会识别出需要专家审查的不寻常病理,同时通过预标注处理常规案例,专家只需验证。与随机抽样相比,这种方法可以将所需的标注减少 50-90%,尽管它需要仔细的工程来防止模型的不确定性偏差导致哪些数据被标注的反馈循环。

随着这些 AI 组件的交互,质量控制变得越来越重要。系统必须通过系统指标监控 AI 和人类的表现。模型置信度校准很重要:如果 AI 表示有 95%的信心,但实际上在该置信水平下只有 75%的准确率,预标注会误导人类审查员。人机一致性比率揭示了 AI 辅助是否有助于或阻碍:当人类频繁地覆盖 AI 建议时,预标注可能会引入偏差而不是加速工作。这些指标需要在标注管道的每个阶段进行仔细的仪器化,不仅要跟踪最终标签,还要跟踪人类和 AI 在每个阶段的交互。

在自动驾驶汽车等安全关键领域,这些系统在处理大量传感器数据时必须保持特别严格的标准。据报道,Waymo 的标注基础设施每天处理数百万个传感器帧,使用 AI 预标注来标注常见物体(车辆、行人、交通标志),并将不寻常的场景(施工区域、紧急车辆、不寻常的道路状况)路由给人类专家。尽管规模如此之大,系统仍需保持实时性能,采用分布式架构,其中预标注在 GPU 集群上运行,而人类审查则横向扩展到数千名标注者,通过仔细的负载平衡确保没有任何组件成为瓶颈。

现实世界的部署在多个领域展示了这些原则的规模化应用。医学影像系统(Krishnan, Rajpurkar, and Topol 2022)结合了对常见状况的预标注(识别正常组织、标准解剖结构)和针对不寻常案例的主动学习(罕见病理、模糊发现),同时通过具有全面审计跟踪的安全标注平台保持严格的病人隐私。自动驾驶车辆系统协调多个 AI 模型对多种传感器数据进行标注:一个模型预标注摄像头图像,另一个处理激光雷达点云,第三个处理雷达数据,融合逻辑在人工审查前结合预测。社交媒体平台每小时处理数百万条内容,采用分层方法,简单模型处理明显的违规行为(垃圾邮件、明显的仇恨言论),而复杂内容则路由到更复杂的模型或人工审查员,当初始分类不确定时。

确保道德和公平的标注

与之前章节中治理重点在数据和流程不同,标注治理以人类福祉为中心。这里的治理支柱关注人类贡献者的道德待遇、偏差缓解和公平补偿——这些挑战在自动化管道阶段中与治理明显不同,因为人类的福祉直接受到威胁。虽然处理中的治理关注数据溯源和合规性,但标注中的治理需要确保创建训练数据的人类被道德对待、公平补偿并受到保护,免受伤害。

然而,尽管众包具有这些令人信服的优势,但现实世界中的例子所凸显的挑战表明治理不能是事后之想。在开发像 OpenAI 的 ChatGPT 这样的大型 AI 系统期间,公平补偿和道德数据来源的问题被尖锐地聚焦。报告显示OpenAI 将数据标注任务外包给肯尼亚的工人,雇佣他们来审查内容并识别模型可能生成的有害或不适当的内容。这包括审查和标记令人不安的内容,如暴力画面和露骨材料,以训练 AI 识别并避免此类输出。虽然这种方法使 OpenAI 能够提高 ChatGPT 的安全性和实用性,但关于工作条件、任务性质以及给予肯尼亚工人的补偿的伦理问题引起了重大的关注。

据报道,许多贡献者每小时仅获得 1.32 美元的报酬,用于审查和标记高度创伤性的材料。这种工作的情感负担,加上低工资,引发了关于众包过程公平性和透明度的严重质疑。这一争议突显了道德众包实践中的关键差距。这些工人,通常来自经济不发达地区,没有得到足够的支持来应对他们任务的心理影响。缺乏心理健康资源和补偿不足凸显了当将数据标注任务外包给低收入地区时可能出现的权力不平衡。

不幸的是,ChatGPT 肯尼亚争议所凸显的挑战并不仅限于 OpenAI。许多依赖众包进行数据标注的组织面临类似的问题。随着机器学习系统变得更加复杂并需要更大的数据集,对标注数据的需求将继续增加。这表明需要行业范围内的标准和最佳实践来确保道德数据来源。公平的补偿意味着至少支付当地最低工资,理想情况下与工人所在地区的类似工作进行比较——不仅仅是法律规定的最低工资,而是对于需要持续注意的熟练工作所认为的公平工资。对于敏感内容审核,这通常意味着反映心理负担的溢价支付,有时是基础工资的 2-3 倍。

工人的福祉需要为处理敏感内容的人提供心理健康资源。像Scale AI这样的组织已经实施了结构化的支持措施,包括:限制接触创伤性内容(通过不同内容类型轮换标注者,限制每天处理令人不安材料的时长),为工人提供免费的心理咨询服务,以及当标注者遇到特别令人不安的内容时提供即时支持渠道。这些措施增加了运营成本,但对于道德运营至关重要。透明度要求明确沟通任务目的、贡献如何被使用、工人可能遇到的内容类型,以及工人的权利,包括跳过引起不适的任务的能力。

除了工作条件之外,数据标注中的偏见代表了另一个关键的治理关注点。标注员在标注过程中会带入自己的文化、个人和专业偏见,这些偏见可能会反映在生成的数据集中。例如,T. 王等人(2019)发现,主要由来自一个地理区域的标注员标注的图像数据集在物体识别任务中表现出偏见,对来自其他地区的图像表现不佳。这突显了需要多样化的标注员群体,其中标注员之间的人口统计学多样性有助于抵消个人偏见,尽管这并不能完全消除它们。定期进行偏见审计,检查标注员人口统计学中标签分布是否系统性地不同,监控可能表明系统性偏见的模式(来自某些地区的所有图像都获得较低的质量评分),以及通过额外的培训或指南细化来应对识别出的偏见,确保标签支持公平的模型行为。

数据隐私和伦理考量也在数据标注中提出了挑战。领先的数据标注公司已经为这些挑战开发了专门的解决方案。例如,Scale AI 维护了专门处理医疗保健和金融领域敏感数据的团队和安全的基础设施,拥有符合 HIPAA 标准的标注平台和严格的数据访问控制。Appen 实施了严格的数据访问控制和匿名协议,确保标注员在不需要时永远不会看到个人可识别信息。Labelbox 为具有严格安全要求的组织提供私有云部署,允许在不离开组织边界的情况下进行标注。这些保护隐私的技术直接关联到我们在未来章节中探讨的安全考量 25,其中将检查保护整个机器学习生命周期中敏感数据的综合方法。

除了隐私和工作条件之外,现实世界数据的动态性也带来了另一个限制。在标注时准确无误的标签可能会随着时间推移,数据的基本分布发生变化而变得过时或不相关。这个概念被称为概念漂移,需要持续进行标注工作,并定期重新评估现有标签。治理框架必须考虑到标签版本控制(跟踪标签的创建时间和创建者)、重新标注政策(当概念演变时系统地重新标注数据),以及退役策略(确定何时应该弃用旧标签而不是用于训练)。

最后,在处理边缘案例或罕见事件时,当前标注方法的局限性变得明显。在许多实际应用中,不寻常或罕见的情况往往是至关重要的(例如,医学诊断中的罕见疾病,或自动驾驶中的不寻常道路条件)。然而,根据定义,这些案例在大多数数据集中代表性不足,可能在大规模标注工作中被忽视或错误标注。治理需要针对处理罕见事件的明确策略:针对代表性不足场景的目标收集活动,对罕见案例的专家审查要求,以及系统跟踪确保即使频率低,罕见事件也能得到适当的关注。

这个案例强调了在考虑人工智能系统背后的人力劳动的重要性。虽然众包提供了可扩展性和多样性,但也带来了不能忽视的伦理责任。在构建推动人工智能创新的数据库时,组织必须优先考虑贡献者的福祉和公平待遇。在标签标注的治理最终意味着认识到训练数据不仅仅是比特和字节,而是值得尊重、公平补偿和道德对待的人力劳动成果。

案例研究:KWS 系统中的自动标注

在我们的 KWS 案例研究中继续通过标注阶段——在确立了系统性的问题定义(第 6.3.3 节)、解决质量和覆盖要求的多样化数据收集策略、处理批量和工作流流式传输的摄入模式,以及确保训练-服务一致性的处理管道之后——我们现在面临一个在规模化的语音系统中独特的挑战。在没有成比例的人力标注成本的情况下生成数百万个标注唤醒词样本,需要超越我们之前考察的手动和众包方法。多语言口语词汇语料库(MSWC)(Mazumder 等人 2021)展示了通过其创新的方法生成标注唤醒词数据如何解决这一挑战,包含超过 2340 万个一秒钟的口语示例,涵盖了 50 种不同语言中的 340000 个关键词。

这个规模直接反映了我们在实践中框架的支柱。要实现我们在各种环境中达到 98%准确性的质量目标,需要数百万个训练示例,这些示例涵盖了我们在问题定义期间识别出的声学变化。可靠性要求在多种声学条件下进行表示——不同的背景噪音、说话风格和录音环境。可扩展性需要自动化而不是人工标记,因为 2340 万个示例即使在每标签 10 秒的情况下也需要大约 26000 人年的人工,这使得人工标注在经济上不可行。治理要求透明的来源和语言多样性,确保语音激活技术服务于多种语言的说话者,而不仅仅是集中在最有商业价值的市场上。

如图 6.15 所示,这个自动化系统从配对句子音频记录和相应的转录开始,这些转录来自像Common Voice或多语言字幕内容平台的项目。系统通过强制对齐 26 对这些输入进行处理——这是一种计算技术,通过同时分析音频和转录来识别连续语音中的精确单词边界。

图片

图 6.15:多语言数据准备:强制对齐和分割将配对音频-文本数据转换为标记的一秒段,创建了一个大规模语料库,用于在 50 多种语言中训练关键词检测模型。这个自动化过程通过有效地从常见的语音资源(如 common voice 和多语言字幕内容)中生成训练示例,使得 KWS 系统的可扩展开发成为可能。

在这些精确的时间标记的基础上,提取系统生成干净的关键词样本,同时处理我们的问题定义所预期的工程挑战:背景噪音干扰单词边界,说话者意外地拉伸或压缩单词,超出我们目标 500-800 毫秒的持续时间,以及超过一秒边界的长单词。MSWC 提供自动质量评估,分析音频特征以识别录音质量、语音清晰度或背景噪音方面可能的问题——这对于在 2.3 亿个样本中保持一致标准至关重要,避免了手动审查费用,否则这种规模将是不可行的。

现代语音助手开发者通常基于这个自动标注的基础进行构建。虽然自动语料库可能不包含产品所需的具体唤醒词,但它们为 KWS 原型设计提供了起点,尤其是在商业数据集不存在的欠发达语言中。生产系统通常针对具有挑战性的案例——如不寻常的口音、罕见词汇或自动化系统难以处理的困难声学环境——进行目标人类录音和验证,需要能够优雅地在自动化处理和人类专业知识之间协调的基础设施。这展示了四个支柱如何指导整合:通过目标人类验证保证质量,通过自动化一致性保证可靠性,通过强制对齐保证可扩展性,通过透明来源和多语言覆盖保证治理。

强制对齐、提取和质量控制的复杂编排展示了深思熟虑的数据工程如何直接影响生产机器学习系统。当语音助手对其唤醒词做出响应时,它会利用这个标注基础设施,结合我们在本章中考察的收集策略、管道架构和处理转换。我们接下来要讨论的存储架构,通过确定这些精心标注的数据集在整个机器学习生命周期中的组织、访问和维护方式,完成了这幅图景,使得高效的训练迭代和大规模可靠服务成为可能。

战略存储架构

在建立将原始数据转换为机器学习准备格式的系统处理管道之后,我们必须设计支持整个机器学习生命周期的存储架构,同时保持我们的四支柱框架。存储决策决定了我们如何有效地维护数据质量,确保在变化负载下的可靠访问,扩展以处理不断增长的数据量,并实施治理控制。看似简单的问题“我们应该在哪里存储这些数据”,实际上涵盖了访问模式、成本限制、一致性要求和性能特性之间的复杂权衡,这些权衡从根本上塑造了机器学习系统的运行方式。

ML 存储需求与驱动传统应用的交易系统存在根本区别。而不是优化频繁的小型写入和点查询,这些是电子商务或银行系统所特有的,ML 工作负载优先考虑高吞吐量顺序读取,而非频繁写入,大规模扫描而非行级更新,以及模式灵活性而非刚性结构。一个服务于电子商务应用的数据库每秒处理数百万个单独的产品查询表现良好,但需要在整个产品目录上重复扫描以进行训练的 ML 训练作业则需要完全不同的存储优化。本节将探讨如何将存储架构与 ML 工作负载特性相匹配,在探讨专门的 ML 基础设施(如特征存储)之前,比较数据库、数据仓库和数据湖。

ML 存储系统架构选项

存储系统选择是一个关键架构决策,它影响 ML 生命周期的各个方面,从开发到生产操作。数据库、数据仓库和数据湖之间的选择不仅决定了数据存放的位置,还决定了团队在开发期间可以多快迭代,模型如何访问训练数据,以及生产中服务系统如何检索特征。理解这些权衡需要检查基本存储特性以及不同 ML 任务的特定访问模式。

关键的洞察是,不同的 ML 工作负载根据其访问模式和延迟需求具有根本不同的存储需求:

  • 数据库(OLTP):适用于需要低延迟、随机访问单个记录的在线特征服务。一个在实时推理期间查找用户配置文件的推荐系统就是这种模式的例子:对特定用户特征(年龄、位置、偏好)进行毫秒级查找以生成个性化推荐。

  • 数据仓库(OLAP):优化用于结构化数据上的模型训练,其中需要高吞吐量、对大型、干净表进行顺序扫描。训练一个处理数百万交易且每笔交易有数百个特征的欺诈检测模型,得益于仅高效读取相关特征的列式存储。

  • 数据湖:处理对非结构化数据(图像、音频、文本)的探索性分析和训练,其中需要灵活性和低成本存储以处理海量数据。一个计算机视觉系统存储了数以千计的原始图像以及元数据、注释和中间处理结果,需要数据湖提供的模式灵活性和成本效益。

数据库在操作和事务目的上表现出色,能够以强一致性保证和低延迟的点查询来维护产品目录、用户资料或交易历史。对于机器学习工作流程,数据库很好地扮演了特定角色:存储频繁变化的特征元数据、管理交易一致性至关重要的实验跟踪,或者维护需要原子更新的模型注册表。一个处理结构化用户属性(如 user_id、年龄、国家、偏好)的 PostgreSQL 数据库,可以为需要实时提供单个用户特征的系统提供毫秒级的查询。然而,当机器学习训练需要跨多个 epoch 重复扫描数百万条记录时,数据库就力不从心。优化事务查询的行存储在训练只需要从每条记录中读取 20 个 100 个列时变得效率低下,因为必须读取整个行来提取这些列。

数据仓库填补了这一分析空白,优化了跨集成数据集的复杂查询,这些数据集已转换为标准化的模式。现代仓库如 Google BigQuery、Amazon Redshift 和 Snowflake 使用列式存储格式(Stonebraker 等人 2018),允许读取特定特征而不需要加载整个记录——当表中包含数百个列但训练只需要子集时这一点至关重要。这种列式组织与基于行的格式相比,在典型的机器学习负载中可以减少五到十倍的 I/O。考虑一个有 100 个列的欺诈检测数据集,其中模型通常使用 20 个特征——列式存储只读取所需的列,在考虑压缩之前就能实现 80%的 I/O 减少。许多成功的机器学习系统从仓库中抽取训练数据,因为结构化环境简化了探索性分析和迭代开发。数据分析师可以快速计算汇总统计,识别特征之间的相关性,并使用熟悉的 SQL 接口验证数据质量。

然而,仓库假设相对稳定的模式,并且难以处理真正非结构化数据——图像、音频、自由文本,或者在实验性机器学习管道中常见的快速演变格式。当计算机视觉团队想要存储原始图像以及提取的特征、来自不同标注供应商的多个标注格式、中间模型预测和嵌入向量时,将这些全部强制放入严格的仓库模式中,产生的摩擦大于价值。模式演变变得痛苦:添加新的特征类型需要 ALTER TABLE 操作,在大型数据集上可能需要数小时,这会阻塞其他操作并减缓迭代速度。

数据湖通过以原生格式存储结构化、半结构化和非结构化数据来解决这些限制,将模式定义推迟到读取点——这种模式称为读取时模式。这种灵活性在早期机器学习开发期间非常有价值,当时团队正在尝试不同的数据源,并且不确定哪些特征将是有用的。推荐系统可能存储在相同的数据湖中:事务日志作为 JSON,产品图像作为 JPEG,用户评论作为文本文件,点击流数据作为 Parquet,模型嵌入作为 NumPy 数组。而不是一开始就将这些异构类型强制到共同的模式中,数据湖保留了它们的原生格式。应用程序仅在读取时施加模式,使不同的消费者能够以不同的方式解释相同的数据——一个团队从事务日志中提取购买金额,而另一个分析时间模式,每个团队都应用适合其分析的方案。

这种灵活性伴随着严重的治理挑战。如果没有纪律性的元数据管理和编目,数据湖会退化成“数据沼泽”——一个无序的存储库,在其中找到相关数据几乎是不可能的,从而削弱了推动其采用的生产力优势。一个数据湖可能包含成千上万的数据集,分布在数百个目录中,目录名称如“userdata_v2_final”和“userdata_v2_final_ACTUALLY_FINAL”,只有原始作者(他们已经离开公司)才理解它们之间的区别。成功的数据湖实施维护有关数据血缘、质量指标、更新频率、所有权和访问模式的可搜索元数据——本质上在湖规模数据上提供类似仓库的可发现性。像 AWS Glue 数据编目、Apache Atlas 或 Databricks Unity 编目这样的工具提供了这一元数据层,使团队能够在投入处理之前发现和理解数据。

表 6.3 总结了跨存储系统类型的这些基本权衡:

表 6.3:存储系统特征:不同的存储系统根据数据结构和目的适合机器学习工作流程的不同阶段;数据库管理事务数据,数据仓库支持分析报告,数据湖容纳多样化、原始数据以供未来处理。了解这些特征能够实现有效的数据管理,并支持机器学习应用程序的可扩展性。

属性 传统数据库 数据仓库 数据湖
目的 操作和事务 分析和报告 用于未来处理的原始和多样化数据的存储
数据类型 结构化 结构化 结构化、半结构化和非结构化
规模 小到中等规模 中等到大规模 大量多样化数据
性能优化 优化用于事务查询(OLTP) 优化用于分析查询(OLAP) 优化用于可扩展的存储和检索
示例 MySQL, PostgreSQL, Oracle DB Google BigQuery, Amazon Redshift, Microsoft Azure Synapse Google Cloud Storage, AWS S3, Azure Data Lake Storage

选择合适的存储需要系统地评估工作负载需求,而不是跟随技术趋势。当数据量保持在十太字节以下时,数据库是最优选择,查询模式涉及频繁的更新和复杂的连接,延迟需求要求亚秒级响应,并且强一致性是强制性的。一个为实时推荐服务的用户配置文件存储就是这种模式的例子:每个用户的记录量以千字节计算,随着偏好的更新而频繁读写,严格的致性确保用户能立即看到自己的更新,并且延迟需求低于 10 毫秒。当分析查询必须跨越需要表扫描的大型数据集,特征需求变化导致模式演变频繁,或者存储成本超过每月每太字节 500 美元时,数据库变得不适用——此时更便宜的替代方案在经济上变得有吸引力。

数据仓库在数据量在一到一百太字节之间时表现卓越,分析查询模式主导事务操作,以分钟到小时计的批量处理延迟是可以接受的,且具有相对稳定模式的结构化数据是主要的工作负载。模型训练数据准备、批量特征工程和历史分析都符合这一特征。数据库向仓库的迁移通常发生在查询复杂性增加时——需要跨表进行聚合或连接,总表大小达到千兆字节而不是兆字节,或者当分析工作负载开始降低事务系统性能时。当需要以秒为延迟的实时流式摄取,或者非结构化数据占工作负载的 20%以上时,仓库变得不适用,因为仓库模式刚性为异构数据创造了过多的摩擦。

当数据量超过 100 太字节时,数据湖变得至关重要,因为数据模式的灵活性对于不断变化的数据源或实验性特征至关重要,成本优化至关重要(通常比仓库规模便宜 10 倍),并且必须共存多种数据类型。大规模模型训练,尤其是结合文本、图像、音频和结构化特征的复模系统,需要数据湖的灵活性。考虑一个自动驾驶汽车系统存储:来自测试车辆的数太字节相机图像和激光雷达点云,车辆遥测作为时间序列数据,手动标注的对象和行为识别,用于罕见场景的自动生成合成数据,以及与地面真相进行比较的模型预测。将这些多样化的类型强制纳入仓库模式将需要大量的转换工作,并丢弃原生格式保留的细微差别。然而,数据湖需要复杂的目录管理和元数据治理,以防止质量下降——这是生产性数据湖和不可用的数据沼泽之间的关键区别。

之间存储类型的迁移模式随着机器学习系统的成熟和扩展而遵循可预测的轨迹。早期项目通常从数据库开始,受到熟悉的 SQL 接口和现有组织基础设施的吸引。当数据集增长超过数据库效率阈值或分析查询开始影响操作性能时,团队会迁移到仓库。仓库在稳定的生产阶段表现良好,具有既定的特征管道和相对固定的模式。当团队需要整合新的数据类型——用于计算机视觉增强的图像、用于自然语言特征的未结构化文本或用于语音应用的音频,或者当在千兆或太字节规模上成本优化变得关键时,迁移到数据湖发生。成熟的机器学习组织通常采用所有三种存储类型,通过统一的数据目录进行协调:数据库用于操作数据和实时服务,仓库用于精选的分析数据和特征工程,数据湖用于原始异构数据和大规模训练数据集。

机器学习存储需求与性能

除了存储系统之间的功能差异外,成本和性能特征直接影响到机器学习系统的经济性和迭代速度。理解这些定量权衡有助于基于工作负载要求做出明智的架构决策。

表 6.4:存储成本-性能权衡:不同的存储层提供不同的成本-性能特征,这些特征决定了它们对特定机器学习工作负载的适用性。训练数据加载需要高吞吐量的顺序访问,在线服务需要低延迟的随机读取,而归档存储在合规性和历史数据方面优先考虑成本而非访问速度。

存储层级 成本(美元/每 TB/每月) 顺序读取 吞吐量 随机读取 延迟 典型机器学习用例
NVMe SSD (本地) $100-300 5-7 GB/s 10-100 μs 训练数据加载,活跃特征服务
对象存储 (S3, GCS) $20-25 100-500 MB/s (每连接) 10-50 ms 数据湖原始存储,模型工件
数据仓库 (BigQuery, Redshift) $20-40 1-5 GB/s (列式扫描) 100-500 ms (查询启动) 训练数据查询,特征工程
内存缓存 (Redis, Memcached) $500-1000 20-50 GB/s 1-10 μs 在线特征服务,实时推理
归档存储 (Glacier, Nearline) $1-4 10-50 MB/s (检索后) 小时(检索) 历史保留,合规归档

如表 6.4 所示,这些指标揭示了为什么机器学习系统采用分层存储架构。考虑存储我们的 KWS 训练数据集(736 GB)的经济性:对象存储每月成本为 15-18 美元,使得长期保留原始音频变得经济可行,同时在工作集上使用 NVMe 进行活跃训练的成本为每月 74-220 美元,但提供了 50 倍更快的数据加载速度。性能差异直接影响到迭代速度——以 5 GB/s 的速度加载数据的训练在 150 秒内完成数据集加载,而典型对象存储速度下需要 7,360 秒,这是 50 倍的性能差异,决定了团队是否可以每天多次迭代,或者必须在实验之间等待数小时。

除此之外,我们已探讨的基本存储能力之外,机器学习工作负载引入了传统数据库和仓库未设计来处理的独特需求。理解这些特定于机器学习的需求和它们的性能影响,塑造了贯穿整个开发生命周期的基础设施决策,从实验笔记本到每秒处理数百万请求的生产服务系统。

现代机器学习模型包含数百万到数十亿个参数,需要高效的存储和检索模式,这与传统数据大相径庭。GPT-3(T. Brown 等人 2020)以 32 位浮点数存储时,模型权重大约需要 700GB——比许多组织的整个运营数据库还要大。这一轨迹揭示了规模加速的趋势:从 2012 年 AlexNet 的 6000 万个参数(Krizhevsky, Sutskever, 和 Hinton 2017a)到 2020 年 GPT-3 的 1750 亿个参数,模型大小在八年内增长了约 2900 倍。存储系统必须高效地处理这些密集的数值数组,以处理容量和访问速度。在分布式训练期间,多个工作者需要协调访问模型检查点,存储带宽变得至关重要。与典型的文件不同,其中顺序组织对可读性很重要,模型权重得益于块对齐的存储,这允许跨参数组的并行读取。当 64 个 GPU 在分布式训练初始化期间同时从共享存储中读取不同的参数碎片时,存储系统必须提供接近网络接口限制的总带宽——通常是每秒 25 吉比特或更高——而不引入会导致昂贵的计算资源闲置的同步瓶颈。

机器学习发展的迭代性质引入了与传统软件截然不同的版本要求。虽然 Git 在跟踪以文本为主、增量修改较小的文件代码变化方面表现出色,但在处理大型二进制文件时却无能为力,即使是微小的模型变化也会导致全新的检查点。天真地存储一个 10GB 模型的 10 个版本将消耗 100GB 的空间,但大多数机器学习版本控制系统只存储版本之间的差异,按模型实际变化的比例减少存储空间。像 DVC(数据版本控制)和 MLflow 这样的工具维护模型工件指针而不是存储副本,从而在保持重现任何历史模型能力的同时实现高效的版本控制。典型的机器学习项目在超参数调整期间会生成数百个模型版本——每个训练运行一个版本,工程师们在此过程中探索学习率、批量大小、架构和正则化策略。如果没有系统地记录训练配置、准确度指标和训练数据版本,与模型权重一起,当昨天的模型表现优于今天的模型但团队无法确定是哪种配置产生了它时,重现结果变得不可能。这一重现性挑战直接关联到治理要求第 6.10 节,其中监管合规通常要求证明具体模型预测是由哪些数据和过程产生的。

分布式训练会产生大量的中间数据,需要存储系统处理大规模的并发读写操作。当在 64 个 GPU 上训练 ResNet-50 时,每个处理单元处理其数据的一部分,需要存储系统处理每几秒同步时的大约 100 兆字节的中间结果的 64 个并发写入。以存储空间换取计算空间的内存优化策略减少了内存需求,但增加了存储 I/O,因为中间值写入磁盘。存储系统必须提供低延迟访问以支持高效的同步——如果工作者花费更多的时间等待存储而不是执行计算,分布式处理就会变得事倍功半。同步模式因并行化策略而异:一些方法需要从所有工作者那里收集结果,其他方法需要工作者之间的顺序通信,而混合策略将这两种模式与复杂的数据依赖相结合。

带宽层次结构从根本上限制了机器学习系统设计,创造了任何计算优化都无法克服的瓶颈。虽然 RAM 在现代服务器上提供每秒 50 到 200 千兆字节的带宽,但网络存储系统通常只提供每秒 1 到 10 千兆字节,即使是高端 NVMe SSDs 的顺序吞吐量也最多达到每秒 1 到 7 千兆字节。现代 GPU 可以比存储更快地处理数据,从而产生昂贵的加速器空闲等待数据的情况。考虑 ResNet-50 的训练,其中模型包含 2500 万个参数,总计 100 兆字节,处理每批 32 张图像,消耗 5 兆字节的输入数据,每前向传递执行 400 亿次操作。这产生了每次操作 26 字节的移动——与传统计算工作负载相比,这非常之高,传统计算工作负载的操作每秒低于 1 字节。当 GPU 理论上每秒可以处理 10 千兆字节的计算,但存储只能提供每秒 1 千兆字节的数据时,10 倍的带宽不匹配成为限制训练吞吐量的主要瓶颈。无论多少 GPU 优化——更快的矩阵乘法内核、改进的内存访问模式或更好的并行化——都无法克服这种基本的 I/O 限制。

理解这些定量关系,可以做出关于存储系统选择和数据管道优化的明智的架构决策,这在分布式训练中尤为重要,如第八章(ch014.xhtml#sec-ai-training)所述。训练吞吐量方程揭示了关键的依赖关系:

训练吞吐量=min(计算能力,数据供应速率)\text{训练吞吐量} = \min(\text{计算能力}, \text{数据供应速率})

数据供应速率=存储带宽×(1开销)\text{数据供应速率} = \text{存储带宽} \times (1 - \text{开销})

当存储带宽成为限制因素时,团队必须通过更快的介质、并行化或缓存来提高存储性能,或者通过压缩、量化或架构变更来减少数据移动需求。大型语言模型训练可能每小时需要处理数百吉字节文本,而处理高分辨率图像的计算机视觉模型可能需要分布式集群中超过每秒 50 吉字节的数据速率。这些需求解释了专用机器学习存储系统的兴起,这些系统优化了数据加载管道:PyTorch DataLoader 通过多个工作进程并行化 I/O,TensorFlow tf.data API 通过预取和缓存,以及像 NVIDIA DALI(数据加载库)这样的框架,将数据增强卸载到 GPU 上,而不是从存储中加载预增强的数据。

文件格式选择通过影响 I/O 体积和解压缩开销,对吞吐量和延迟产生重大影响。与 CSV 或 JSON 等基于行的格式相比,Parquet 或 ORC 等列式存储格式在典型的机器学习工作负载中可以减少 5 到 10 倍的 I/O。这种减少来自两种机制:只读取所需的列而不是整个记录,以及利用列内值模式进行列级压缩。考虑一个有 100 列的欺诈检测数据集,其中模型通常使用 20 个特征——列式格式只读取所需的列,在压缩前就能实现 80%的 I/O 减少。列压缩对于有限基数分类特征特别有效:一个包含 1000 万条记录中 200 个唯一值的国家代码列,通过字典编码压缩 20 到 50 倍,而运行长度编码通过只存储值变化来压缩排序的列。这种组合可以将与未压缩行格式相比的总 I/O 减少 20 到 100 倍,这直接转化为更快的训练迭代和降低基础设施成本。

压缩算法选择需要在压缩比和解压速度之间进行权衡。虽然 gzip 实现了六到八倍的更高压缩比,但 Snappy 只能实现两到三倍的压缩比,但解压速度达到每秒 500 兆字节——大约比 gzip 的每秒 120 兆字节快三到四倍。对于机器学习训练,其中吞吐量比存储成本更重要,Snappy 的速度优势通常超过了 gzip 的空间节省。在用 gzip 压缩的 100 吉字节数据集上训练需要 17 分钟的解压时间,而 Snappy 只需要 5 分钟。当训练迭代 50 个 epoch 时,每个 epoch 的 12 分钟差异累积到总共 10 小时——这可能是夜间运行实验与等待多天结果之间的区别。这一选择会级联到整个系统中:更快的解压速度允许更大的批量大小(解压后在内存中容纳更多示例),减少缓冲需求(需要暂存的数据量更少),以及更好的 GPU 利用率(减少空闲等待数据的时间)。

存储性能优化不仅限于格式和压缩,还包括数据布局策略。基于常用查询参数的数据分区显著提高了检索效率。一个处理用户交互的推荐系统可能会按日期和用户人口统计属性分区数据,使得在不需要扫描整个数据集的情况下,可以在最近的数据子集或特定用户群体上进行训练。分区策略与分布式训练模式相互作用:按用户 ID 进行范围分区可以实现数据并行训练,其中每个工作进程处理一致的用户子集,而随机分区确保工作进程看到不同的数据分布。分区粒度很重要——分区太少会限制并行性,而分区太多会增加元数据开销并降低分区内顺序读取的效率。

机器学习生命周期中的存储

随着机器学习系统从初始开发到生产部署和持续维护,存储需求发生了显著变化。了解这些变化的需求能够设计出支持整个生命周期的高效基础设施,而不是在系统扩展或需求变化后对存储进行改造。相同的数据集在探索性分析(用于可视化的随机抽样)、模型训练(epochs 的顺序扫描)和生产服务(单个预测的随机访问)期间可能会有非常不同的访问方式,需要能够适应这些不同模式的存储架构。

在开发过程中,存储系统必须支持探索性数据分析与迭代模型开发,其中灵活性和协作比原始性能更重要。数据科学家同时处理各种数据集,实验特征工程方法,并快速迭代模型设计以完善方法。关键挑战在于管理数据集版本,而不会耗尽存储容量。一种天真地将整个数据集复制到每个实验中的方法会迅速耗尽存储空间——在 100GB 数据集上进行 10 次实验就需要 1TB。像 DVC 这样的工具通过指针跟踪数据集版本,并仅存储差异,从而实现高效的实验。系统从原始数据通过转换到最终训练数据集维护了血缘关系,支持在成功实验需要几个月后重新创建时实现可重复性。

开发过程中的协作需要平衡数据可访问性与安全性。数据科学家需要高效地访问数据集进行实验,但组织机构必须同时保护敏感信息。许多团队实施了分级访问控制,其中合成或匿名数据集广泛可用以进行实验,而访问包含敏感信息的生产数据则需要批准和审计跟踪。这平衡了探索速度与治理要求,使得在无需不必要地暴露敏感信息的情况下,能够快速迭代代表性数据。

训练阶段的需求显著转向吞吐量优化。现代深度学习训练过程在数十或数百个 epoch 中重复处理大量数据集,使得 I/O 效率对于可接受的迭代速度至关重要。高性能存储系统必须提供足够的吞吐量,以同时向多个 GPU 或 TPU 加速器提供数据,而不会造成瓶颈。当在 ImageNet 的 120 万张图像上使用 8 个 GPU 训练 ResNet-50 时,每个 GPU 在每个 epoch 中以 256 个图像批次大小处理大约 4,000 张图像。每个 epoch 需要 30 秒,这意味着所有 GPU 每秒需要加载 40,000 张图像——大约每秒 500 兆字节的未压缩图像数据。无法维持这种吞吐量的存储系统会导致 GPU 空闲等待数据,直接降低训练效率并增加基础设施成本。

在训练过程中,预处理和即时计算的平衡变得至关重要。广泛的预处理减少了训练时间的计算,但增加了存储需求并增加了数据过时的风险。计算机视觉的特征提取可能从图像中预计算 ResNet 特征,将 150 千字节的图像转换为 5 千字节的特征向量——实现 30 倍的存储减少并消除重复计算。然而,当特征提取逻辑发生变化时,预计算的特征会过时,需要在整个数据集上重新计算。生产系统通常实施混合方法:预计算昂贵的、稳定的转换,如特征提取,同时在训练期间即时计算快速变化的特征。这根据每个特征的特定特性平衡了存储成本、计算时间和新鲜度。

部署和服务的需求优先考虑低延迟随机访问而不是高吞吐量顺序扫描。实时推理需要能够在毫秒时间内检索模型参数和相关特征的存储解决方案。对于一个每秒处理 10,000 个请求且具有 10 毫秒延迟预算的推荐系统,特征存储必须支持每秒 100,000 次随机读取。内存数据库如 Redis 或复杂的缓存策略对于满足这些延迟要求变得至关重要。边缘部署场景引入了额外的约束:嵌入式设备上的存储容量有限,与中央数据存储的间歇性连接,以及在不会中断推理的情况下进行模型更新的需求。许多边缘系统实施分层存储,其中频繁更新的模型本地缓存,而很少变化的参考数据定期从云存储中拉取。

模型版本控制在部署过程中变得操作上至关重要。存储系统必须促进模型版本之间的平稳过渡,确保最小化服务中断,同时在新版本表现不佳时能够快速回滚。影子部署模式,即新模型与现有模型并行运行以进行验证,要求存储系统能够高效地为多个模型版本同时提供服务。A/B 测试框架需要按请求选择模型版本,这需要快速加载模型而不需要在内存中同时维护数十个模型版本。

监控和维护阶段引入了长期存储考虑因素,这些考虑因素集中在调试、合规性和系统改进上。在预测结果的同时捕获传入数据,可以持续分析,检测数据漂移,识别模型故障,并保持法规合规。对于边缘和移动部署,存储限制使数据收集复杂化——系统必须在收集足够的数据以进行漂移检测与有限的设备存储和网络带宽上传到中央分析系统之间进行平衡。受监管的行业通常需要不可变存储以支持审计:医疗保健机器学习系统不仅需要保留预测,还需要保留完整的数据来源,显示哪些训练数据和模型版本产生了每个诊断建议,可能需要数年或数十年。

在高流量生产系统中,日志和监控数据量显著增长。一个服务于 1000 万用户的推荐系统每天可能会生成数 TB 的交互日志。存储策略通常实施分层保留:热存储保留最近的数据(过去一周)以进行快速分析,温存储保留中期数据(过去一个季度)以进行定期分析,而冷存档存储保留长期数据(过去几年)以符合规定和进行罕见深度分析。层级之间的转换涉及访问延迟、存储成本和检索复杂性的权衡,系统必须随着数据老化自动管理。

特征存储:连接训练和部署

特征存储 27 已成为解决在训练和部署环境中保持一致性以及跨模型和团队实现特征重用这一独特挑战的关键基础设施组件。传统的机器学习架构通常在训练期间离线计算特征,而在部署期间在线计算特征,这种训练-部署偏差会无声地降低模型性能。

当检查典型的机器学习开发工作流程时,特征存储解决的根本问题变得清晰。在模型开发过程中,数据科学家在笔记本或脚本中编写特征工程逻辑,通常使用与生产部署系统不同的库和语言。训练可能使用 SQL 聚合历史数据来计算用户的“过去 30 天的总购买额”,而部署则使用微服务来逐步更新缓存的值。这些实现应该产生相同的结果,但细微的差异——处理时区转换、处理缺失数据或四舍五入数值——导致训练和部署特征发生偏差。一项针对生产机器学习系统的研究发现,Uber 的 30%到 40%的初始部署都受到了训练-部署偏差的影响,这促使他们开发了集成了特征存储的 Michelangelo 平台。

特征存储为特征定义提供了一个单一的真实来源,确保了机器学习生命周期所有阶段的连贯性。当数据科学家定义一个特征,如“user_purchase_count_30d”时,特征存储维护其定义(SQL 查询、转换逻辑或计算图)并一致地执行它,无论是提供历史特征值用于训练还是提供实时值用于服务。这种架构模式消除了一个整个类别的微妙错误,这些错误证明非常难以调试,因为模型在训练中表现良好,但在生产中表现不佳,而没有明显的错误。

除了一致性之外,特征存储能够在模型和团队之间实现特征重用,显著减少重复工作。当多个团队构建需要类似特征的模型时——例如,用于流失预测和交叉销售模型的客户终身价值,用于推荐和个性化的用户人口统计特征,用于搜索排名和相关商品推荐的商品属性——特征存储防止每个团队重新实现具有细微差异的相同特征。集中式特征计算减少了开发时间和基础设施成本,同时提高了模型之间的一致性。推荐系统可能会计算代表数百个维度的用户嵌入向量,这是一项昂贵的计算,需要汇总数月的交互历史。而不是每个模型团队重新计算嵌入向量,特征存储只计算一次并将它们提供给所有消费者。

建筑模式通常实现针对不同访问模式优化的双重存储模式。离线存储使用类似 Parquet 的列式格式在对象存储上,优化了训练期间的批量访问,在此期间对数百万个示例进行顺序扫描是常见的。在线存储使用如 Redis 这样的键值系统,优化了服务期间的随机访问,在此期间必须以毫秒级检索单个特征向量。存储之间的同步变得至关重要:随着训练使用当前特征值生成新模型,这些模型部署到生产环境时,期望在线存储提供一致的特征。特征存储通常实现计划好的批量更新,将新的特征值从离线存储传播到在线存储,更新频率取决于特征新鲜度的要求。

时间旅行功能将复杂特征存储与简单缓存层区分开来。训练需要访问特定时间点存在的特征值,而不仅仅是当前值。以训练流失预测模型为例:对于在 1 月 15 日流失的用户,模型应使用 1 月 14 日计算的特征值,而不是反映他们流失状态的当前特征值。时间点正确性确保训练数据与生产条件相匹配,在生产条件中,预测使用目前可用的特征来预测未来结果。实现时间旅行需要存储特征历史记录,而不仅仅是当前值,这大大增加了存储需求,但允许在历史数据上进行正确的训练。

特征存储的性能特征直接影响训练吞吐量和服务延迟。对于训练,离线存储必须支持高吞吐量批量读取,通常在训练开始时每分钟加载数百万个特征向量。列式存储格式允许从包含数百个潜在列的宽特征表中高效地读取特定特征。对于服务,在线存储必须支持每秒数千到数百万次读取,以单数毫秒延迟。这种双模式优化反映了不同的访问模式:训练执行大顺序扫描,而服务执行小随机查找,需要针对每种模式优化不同的存储技术。

生产部署在特征新鲜度和成本管理方面面临额外的挑战。需要立即更新的实时特征对在线存储容量和同步逻辑造成压力。当用户将商品添加到购物车时,推荐系统希望在几秒钟内而不是几小时内更新反映当前购物车内容的特征。流式特征计算管道实时处理事件,而不是通过定期批量作业不断更新在线存储。然而,流式处理引入了关于一次处理语义、处理迟到事件和管理每秒更新数百万次特征的计算成本的复杂性。

特征存储的成本管理在规模扩大时变得重要。为了实现时间旅行功能而存储全面的特征历史会成倍增加存储需求:保留一年的每日特征快照需要仅保留当前值的存储量的 365 倍。生产系统实施保留策略,在时间点正确性和存储成本之间进行平衡,可能保留一年的每日快照,五年的每周快照,除非需要遵守规定,否则清除更早的历史记录。在线存储成本随着特征维度和实体数量的增加而增长:为 1 亿用户存储 512 维嵌入向量需要大约 200 千兆字节的单精度(32 位浮点数),通常跨区域复制以提高可用性和低延迟访问,从而大幅增加成本。

特征存储迁移对于拥有现有机器学习基础设施的组织来说是一项重大任务。传统系统在众多存储库和管道中临时计算特征,使得集中化变得困难。成功的迁移通常逐步进行:从特征存储中的新特征开始,逐步迁移高价值的传统特征,优先考虑那些在多个模型中使用或导致已知的训练-服务偏差问题的特征。维护能够实现应用无关特征访问的抽象层,可以防止与特定特征存储实现紧密耦合,便于在需求演变或出现更优技术时进行未来的迁移。

现代特征存储实现包括开源项目如 Feast 和 Tecton,来自 Databricks Feature Store 和 AWS SageMaker Feature Store 的商业产品,以及主要技术公司定制的解决方案。每个解决方案在支持的特征类型(结构化对非结构化)、支持的基础设施(云原生对本地化)以及与机器学习框架的集成方面都有不同的权衡。向特征存储作为必要机器学习基础设施的趋同反映了这样一个认识,即特征工程代表了机器学习开发工作的大量努力,并且支持特征的系统化基础设施为整个组织的机器学习组合提供了累积效益。

案例研究:KWS 系统的存储架构

[使用我们之前已创建的 KWS 存储部分 - 早期内容]

在完成我们的全面 KWS 案例研究——从初始问题定义追踪到数据收集策略、管道架构、处理转换和标注方法——之后,我们现在考察存储架构如何支持整个数据工程生命周期。这里做出的存储决策直接反映了并支持了早期阶段做出的选择。我们在第 6.3.3 节中确立的众包策略决定了原始音频的体积和多样性需求。我们在第 6.7 节中设计的处理管道定义了必须高效存储和检索的中间特征。我们从第 6.7.1 节中获得的质量指标塑造了元数据存储需求,以跟踪数据溯源和质量分数。存储架构将这些线索交织在一起,使得系统能够从开发到生产部署协同工作。

典型的关键词语音识别(KWS)存储架构实现了本节之前讨论过的分层方法,每个层级服务于从我们早期工程决策中产生的不同目的。来自各种来源的原始音频文件——通过我们设计的活动收集的众包录音、生成以填补覆盖范围空白的合成数据,以及从部署的设备中捕获的现实世界数据——存储在数据湖中,使用如 S3 或 Google Cloud Storage 这样的云对象存储服务。这一选择反映了我们的可扩展性支柱:随着我们收集数百万个不同示例以实现 98%的环境准确性,音频文件积累到数百或数千吉字节。数据湖灵活的架构适应了不同的采样率、音频格式和录音条件,而不对异构源施加刚性结构。对象存储提供的每吉字节低成本——通常是数据库存储成本的十分之一——使得在不产生禁止性费用的情况下,能够保留全面的数据历史以用于模型改进和调试。

数据湖存储了我们治理支柱所需的综合溯源元数据,这些元数据在早期管道阶段已被证明至关重要。对于每个音频文件,系统维护着源类型(众包、合成或现实世界)、收集日期、在道德上收集并同意的时的人口统计信息、由我们的验证管道计算的质量评估分数,以及显示已应用哪些转换的处理历史。这些元数据使得在训练数据选择期间可以进行过滤,并支持隐私法规和道德人工智能实践的合规性要求第 6.10 节进行了考察。

处理后的特征——包括由我们的处理流程计算出的频谱图、MFCCs 和其他机器学习准备好的表示形式——进入一个针对训练访问优化的结构化数据仓库。这解决了从原始存储中不同的性能需求:虽然原始音频访问频率较低(主要在处理流程执行期间,当我们转换新数据时),但在训练周期中,处理后的特征会被反复读取,因为模型在数据集上迭代数十次。仓库使用如 Parquet 这样的列式格式,使得在训练期间高效加载特定特征成为可能。对于像 MSWC 这样的包含 2300 万个示例的数据集,与基于行的格式相比,列式存储可以将训练 I/O 减少五到十倍,直接影响到模型开发中的迭代速度——即训练时间从数小时到数天的差异。

KWS 系统从我们考察的架构模式实现的特征存储中受益显著。常用的音频表示可以一次性计算并存储,以便在不同实验或模型版本之间重复使用,从而避免冗余计算。特征存储实现了一种双架构:一个离线存储,使用对象存储上的 Parquet 来存储训练数据,提供高吞吐量以支持在训练负载数百万个示例时的顺序读取;以及一个在线存储,使用 Redis 来实现低延迟推理,支持我们在问题定义期间建立的 200 毫秒延迟要求。这种双架构解决了训练的批量访问模式——顺序读取数百万个示例——与服务的随机访问模式——在用户说出唤醒词时实时检索单个音频片段的特征——之间的基本紧张关系。

在生产环境中,由于我们的系统部署到资源受限的设备上,边缘存储需求变得至关重要。模型必须足够紧凑,以满足从问题定义中我们 16 千字节内存限制的设备,同时保持快速参数访问以实现实时唤醒词检测。边缘设备通常使用如 TensorFlow Lite 的 FlatBuffers 这样的专用格式来存储量化模型,这允许通过内存映射访问,避免了违反延迟要求的反序列化开销。缓存应用于多个层级:频繁访问的模型层存储在 SRAM 中以实现最快的访问,完整模型存储在闪存中以实现跨电源周期的持久性,并且基于云的模型更新会定期获取,以保持当前的唤醒词检测模式。这种多级缓存确保设备即使在间歇性网络连接的情况下也能有效运行——这对于在网络环境多样的消费设备中部署的设备来说是一个可靠性要求,从网络连接有限的农村地区到网络拥堵的城市环境。

数据治理

我们所考察的存储架构——数据湖、仓库、特征存储——不仅仅是技术基础设施,也是治理执行机制,它决定了谁可以访问数据,如何跟踪使用情况,以及系统是否遵守监管要求。我们在这章中做出的每一个架构决策,从获取策略到处理管道再到存储设计,都承载着治理含义,这些含义在系统面临监管审计、隐私侵犯或道德挑战时最为明显地表现出来。数据治理从抽象政策转变为具体工程:访问控制系统强制执行谁可以读取训练数据,审计基础设施跟踪每次数据访问以符合规定,隐私保护技术保护个人同时允许模型训练,以及记录原始音频录音如何成为生产模型的溯源系统。

我们的 KWS 系统展示了当复杂的存储遇到敏感数据时出现的治理挑战。始终处于监听状态的架构使得便捷的语音激活成为可能,这引发了深刻的隐私担忧:设备在用户家中持续处理音频,特征存储维护着数百万用户的语音模式历史,边缘存储缓存了从全民训练数据中提取的声学模型。这些使我们能够满足质量、可靠性和可扩展性要求的技术能力,同时也在同意管理、数据最小化、访问审计和删除权等方面产生了治理义务,这些都需要同样复杂的工程解决方案。如图图 6.16 所示,有效的治理通过在整个机器学习生命周期中系统地实施隐私保护、安全控制、合规机制和问责基础设施来解决这些相互关联的挑战。

图片

图 6.16:数据治理支柱:通过在整个数据生命周期中优先考虑隐私、公平性、透明度和问责制,稳健的数据治理建立了道德和可靠的机器学习系统。这些相互关联的支柱解决了机器学习工作流程中的独特挑战,确保了负责任的数据使用和可审计的决策过程。

安全和访问控制架构

生产级机器学习系统实施分层安全架构,其中治理要求在各个管道阶段转化为可执行的技术控制。现代特征存储通过实施基于角色的访问控制(RBAC)来体现这种集成,该控制将组织政策映射到数据库权限,以防止未经授权的访问——数据科学家可以读取训练特征,服务系统可以读取在线特征,但两者都不能修改原始源数据。这些访问控制系统跨越了我们考察的存储层:对象存储如 S3 强制执行存储桶策略,以确定哪些服务可以读取训练数据;数据仓库实施列级安全,隐藏敏感字段如用户标识,以防止大多数查询;特征存储维护不同的读写路径,具有不同的权限要求。

我们的 KWS 系统需要特别复杂的访问控制,因为语音数据跨越了组织和设备边界。边缘设备在本地存储量化模型和缓存的音频特征,需要加密以防止在设备被破坏时提取——尽管语音助手的模型参数单独来看并不敏感,但可能允许竞争性的逆向工程或揭示训练数据特征。特征存储维护单独的安全区域:一个生产区域,其中服务系统使用具有只读访问权限的服务凭据检索实时特征;一个训练区域,其中数据科学家使用用于审计目的的个体凭据访问历史特征;一个操作区域,其中 SRE 团队可以访问管道健康指标,而无需查看实际的语音数据。这种架构分离通过在云部署中实施 Kubernetes 命名空间和具有单独 IAM 角色的 IAM 角色来实现,确保破坏一个组件——比如,服务系统的漏洞——不会暴露训练数据或授予对生产特征的写入访问权限。

访问控制系统在整个数据生命周期中与加密集成。存储在数据湖中的训练数据使用服务器端加密,通过专用密钥管理服务(AWS KMS、Google Cloud KMS)管理密钥,以强制执行分离:训练作业凭据可以解密当前训练数据,但不能解密已使用的旧版本,通过限制访问范围实现数据最小化。特征存储在静态存储和传输过程中都实施加密——使用平台管理的密钥加密存储,以及使用 TLS 1.3 加密管道组件和特征存储之间的所有通信。对于 KWS 边缘设备,从云训练系统传输到数百万分布式设备的模型更新需要端到端加密和代码签名,以验证模型完整性,防止可能损害设备安全或用户隐私的对抗性模型注入。

技术隐私保护方法

当访问控制决定谁可以使用数据时,隐私保护技术则决定了信息系统能向授权用户暴露哪些信息。我们在第十七章中深入探讨了差分隐私,它提供了形式化的数学保证,确保单个训练示例不会通过模型行为泄露。在生产环境中实施差分隐私需要仔细的工程:在模型开发过程中添加校准噪声,跟踪所有数据使用中的隐私预算——每个查询或训练运行都会消耗预算,强制执行系统范围内的总隐私损失限制,并通过测试基础设施验证部署的模型是否满足隐私保证,该测试基础设施试图通过成员推理攻击提取训练数据。

KWS 系统面临特别严重的隐私挑战,因为始终处于监听状态的架构需要在最小化数据保留和暴露的同时连续处理音频。生产系统通过架构选择实现隐私保护:在设备上处理,其中唤醒词检测完全在本地运行,使用存储在边缘闪存中的模型,除非检测到唤醒词,否则不会传输音频;联邦学习方法,其中设备在本地音频上训练以改进唤醒词检测,但只共享聚合的模型更新,而不是原始音频,返回到中央服务器;以及自动删除策略,其中检测到的唤醒词音频仅保留很短的时间用于质量监控,然后永久从存储中删除。这些不仅仅是政策声明,而是体现在存储系统设计中的工程要求——数据湖实现生命周期策略,在 30 天后自动删除语音样本,除非明确标记为长期研究用途并附加额外同意,特征存储实现生存时间(TTL)字段,导致用户语音模式过期并被从在线服务存储中清除。

实施复杂性扩展到处理 GDPR 和类似法规要求的删除请求。当用户行使他们的“被遗忘权”时,系统必须定位并删除不仅包括源音频记录,还包括存储在特征存储中的派生特征、可能编码语音特征的模式嵌入以及引用用户的审计日志——同时保持审计完整性以符合法规。这需要复杂的数据血缘跟踪,我们将在下一部分探讨,使系统能够识别用户语音样本在分布式存储层和管道阶段中派生的所有数据工件。

遵守法规的架构设计

合规要求从法律义务转变为系统架构约束,这些约束塑造了管道设计、存储选择和操作程序。GDPR 的数据最小化原则要求将收集和保留限制在实现声明的目的所必需的范围内——对于 KWS 系统,这意味着需要证明为什么语音样本需要保留在训练之外,记录保留期限在系统设计文档中,并在期限到期后实施自动删除。行使“访问权”要求系统检索与用户相关的所有数据——在实践中,查询分布式存储系统(数据湖、仓库、特征存储)并合并结果,这需要所有存储层和索引中的一致用户标识符,以及能够实现高效用户级查询而不是全表扫描的索引。

在全球范围内运营的语音助手面临着特别复杂的合规环境,因为监管要求因司法管辖区而异,并根据用户的年龄、数据敏感性和处理位置不同而有所不同。加利福尼亚州的 CCPA 赋予了类似于 GDPR 的删除权,但具有不同的时间表和例外情况。儿童的语音数据在美国引发了 COPPA 要求,在收集 13 岁以下用户的数据之前需要可验证的家长同意——当语音特征不能可靠地揭示年龄时,这是一个技术挑战,需要补充的认证机制。欧洲对跨境数据传输的要求限制了将欧盟用户的语音数据存储在指定国家以外的服务器上,除非存在特定的安全措施,这推动了关于区域数据湖、特征存储复制策略和处理本地化的架构决策。

标准化的文档框架,如数据卡片(Pushkarna, Zaldivar, and Kjartansson 2022) (图 6.17),将这些合规要求转化为操作性的工件。数据卡片不再是与系统分开维护的法律文件,而是可执行规范:训练管道在处理之前会检查输入数据集是否具有有效的数据卡片,模型注册要求所有训练数据都提供数据卡片引用,并且服务系统强制执行只有基于合规数据训练的模型才能部署到生产环境中。对于我们关键词语音识别(KWS)的训练管道,数据卡片不仅记录了 MSWC 数据集的特征,还包括同意基础(研究用途、商业部署)、地理限制(可以训练全球模型,但如果没有额外同意则不能训练特定区域的模型),以及保留承诺(音频在特征提取后删除,特征保留以供模型迭代)。

图片

图 6.17:数据治理文档:数据卡标准化关键数据集信息,使透明度和问责制得以实现,这对于符合 GDPR 和 HIPAA 等法律的要求至关重要。通过提供数据集特征、预期用途和潜在风险的系统概述,数据卡促进了负责任的 AI 实践并支持数据主体的权利。

构建数据血缘基础设施

数据血缘从合规文档转变为推动整个机器学习生命周期治理能力的运营基础设施。现代血缘系统,如 Apache Atlas 和 DataHub28,与管道编排器(Airflow、Kubeflow)集成,以自动捕获关系:当 Airflow DAG 从 S3 读取音频文件,将其转换为频谱图,并将特征写入仓库时,血缘系统会记录每个步骤,创建一个图,可以追踪任何特征回溯到其源音频文件,并向前追踪到使用该特征训练的所有模型。这种自动跟踪对于删除请求至关重要——当用户调用 GDPR 权利时,血缘图会识别所有必须删除或重新训练的派生工件(提取的特征、计算的嵌入、训练的模型版本)。

生产级的关键词语音识别(KWS)系统在本章所考察的所有阶段都实施了血缘跟踪。源音频摄取创建血缘记录,将每个音频文件与其获取方法(众包平台、网络爬虫源、合成生成参数)链接起来,从而验证同意要求。处理管道执行扩展血缘图,随着音频成为 MFCC 特征、频谱图和嵌入,每个转换都会添加节点,不仅记录输出工件,还包括代码版本、超参数和执行时间戳。训练作业从特征集合创建血缘边到模型工件,记录哪些数据版本训练了哪些模型版本。当语音助手设备下载模型更新时,血缘跟踪记录部署,以便在训练数据后来发现质量或合规性问题的情况下进行召回。

运营价值不仅限于合规,还扩展到调试和可重现性。当针对特定口音的 KWS 准确性下降时,血缘系统可以追踪受影响的预测回溯到部署的模型到训练特征,确定训练数据缺乏对该口音的充分代表性。当研究团队想要重现六个月前的实验时,血缘图会捕获产生那些结果的确切数据版本、代码提交和超参数。特征存储集成血缘:每个特征都包含有关源数据、转换逻辑和计算时间的元数据,使得查询如“哪些模型依赖于用户位置数据”能够指导数据源更改时的影响分析。

审计基础设施和问责制

虽然谱系追踪数据的存在和转换情况,但审计系统记录了谁访问了数据以及何时访问,创建了符合 HIPAA 和 SOX 等法规要求的问责制记录。29。生产级机器学习系统生成巨大的审计量——每一次训练数据访问、特征存储查询和模型预测都可能生成审计事件,对于大规模系统来说,这些事件每天会迅速累积到数十亿个。这种规模需要专门的架构:不可变追加存储(通常使用如 AWS CloudTrail 或 Google Cloud Audit Logs 等云原生服务)以防止篡改历史记录,高效的索引(通常是 Elasticsearch 或类似系统)允许在不进行全面扫描的情况下查询特定用户或数据集的访问,以及自动分析,以检测异常模式,这些模式可能表明潜在的安全漏洞或违规行为。

关键词识别(KWS)系统实施多级审计架构,在粒度、性能和成本之间取得平衡。边缘设备本地记录关键事件——唤醒词检测、模型更新、隐私设置更改,并将日志定期上传到集中存储以符合保留要求。特征存储记录每个查询,包括请求元数据:哪个服务请求了特征、哪些用户 ID 被访问以及检索了哪些特征,这为安全调查提供了分析,如“谁访问了这位特定用户的语音模式”。训练基础设施记录数据集访问,记录哪些作业读取了哪些数据分区以及何时读取,实施必要的问责制,以证明已删除的用户数据不再出现在新的模型版本中。

谱系和审计系统的集成创建了全面的治理可观察性。当监管机构审计语音助手提供商时,显示用户音频如何成为模型的谱系图和证明谁访问了该音频的审计日志的结合,提供了证明合规性所需的透明度。当安全团队调查疑似数据泄露时,审计日志识别可疑的访问模式,而谱系图揭示了受损害凭证可能触及的数据。当机器学习团队调试模型质量问题时,谱系追踪将问题追溯到特定的训练数据,而审计日志确认没有发生未经授权的修改。这种操作治理基础设施,系统地构建在我们本章检查的数据工程实践中,将抽象的合规性要求转化为可执行的技术控制,以保持随着机器学习系统在复杂性和影响力方面的扩展而维持信任。

随着机器学习系统越来越多地嵌入高风险应用(如医疗诊断、金融决策、自动驾驶汽车),应用于治理基础设施的工程严谨性不仅将决定法规遵从性,还将决定公众信任和系统问责制。受区块链启发的可篡改日志 30 和通过基础设施即代码的自动化政策执行等新兴方法承诺使治理控制更加稳健和可审计,尽管它们也引入了自身的复杂性和成本权衡,组织必须仔细评估这些权衡是否符合其具体需求。

谬误和陷阱

数据工程是每个机器学习系统的基石,但它仍然是机器学习开发中最被低估的方面之一。管理数据管道、确保质量和维护治理的复杂性创造了众多可能导致成本高昂的错误的机会,这些错误甚至可能破坏最复杂的模型。

谬误: 更多的数据总是导致更好的模型性能。

这种普遍的信念驱使团队收集大量数据集,而不考虑数据质量或相关性。虽然适当整理的数据可以改善性能,但原始数量的增加往往引入噪声、不一致性和不相关示例,从而降低模型性能。一个较小、高质量的数据集,经过适当的标注和代表性覆盖,通常优于一个存在质量问题的较大数据集。大量数据集的计算成本和存储需求也创造了实际限制,限制了实验和部署选项。有效的数据工程优先考虑数据质量和代表性,而不是单纯的数量。

陷阱: 将数据标注视为一个简单的机械任务,可以外包而无需监督。

组织通常将数据标注视为低技能工作,可以由外部团队或众包平台快速完成。这种方法忽略了领域专业知识、一致性要求和必要的质量控制,这些对于可靠的标签至关重要。糟糕的标注指南、不足的工人培训和不足的质量验证导致标签噪声,这从根本上限制了模型性能。在模型训练受到影响后纠正标注错误的花费远超过对适当的标注基础设施和监管的投资。

谬误: 数据工程是一次性设置,可以在模型开发开始之前完成。

这种误解将数据管道视为静态基础设施,而不是需要持续维护和适应的演变系统。现实世界中的数据源会随着时间的推移通过模式演变、质量下降和分布变化而发生变化。在生产环境中部署的模型会遇到需要管道更新和质量检查的新数据模式。那些将数据工程视为已完成的基础设施而不是持续工程实践团队的,当他们的管道无法适应变化的需求时,往往会经历系统故障。

谬误: 训练和测试数据分割足以确保模型泛化。

虽然适当的训练/测试分割可以防止过度拟合训练数据,但它并不能保证现实世界的性能。由于时间变化、地理差异或人口变化,生产数据通常与开发数据集有显著差异。一个在精心策划的测试集上达到 95%准确率的模型,在部署到新地区或时间段时可能会失败得非常严重。稳健的评估需要理解数据收集偏差,实施持续监控,并维护代表性的验证集,以反映实际的部署条件。

陷阱: 在构建数据管道时没有考虑故障模式和恢复机制。

数据管道通常是为一切正常工作的“快乐路径”而设计的,忽略了数据源会失败、格式会改变、质量会下降的现实。团队只有在生产系统崩溃或无声地产生错误结果时才会发现这些问题。一个处理金融交易的管道,如果没有对格式不正确的数据进行适当错误处理,可能会丢失关键记录或重复交易。稳健的数据工程需要明确处理失败,包括数据验证、检查点、回滚能力和在影响下游系统之前检测异常的警报机制。

摘要

数据工程作为将原始信息转化为机器学习系统基础的基础设施,不仅决定了模型性能,还决定了系统可靠性、道德合规性和长期可维护性。本章揭示了数据管道的每个阶段,从初始问题定义到获取、存储和治理,都需要仔细的工程决策,这些决策贯穿整个机器学习生命周期。看似简单的“准备数据”任务实际上包含了数据质量与获取成本、实时处理与批量效率、存储灵活性与查询性能以及隐私保护和数据效用之间的复杂权衡。

数据系统的技术架构展示了工程决策如何在整个管道中累积,从而创建既强大又可扩展的基础设施,或者脆弱且维护成本高的技术债务。数据获取策略必须应对现实,即完美的数据集在自然界中很少存在,需要从众包和合成生成到精心管理和主动学习等复杂方法。从传统数据库到现代数据湖和特征存储的存储架构代表了关于数据如何通过系统的基本选择,影响着从训练速度到服务延迟的各个方面。流式数据处理和实时特征存储的出现反映了对于能够持续适应不断变化的环境同时保持一致性和可靠性的机器学习系统日益增长的需求。

关键要点

  • 四个支柱——质量、可靠性、可扩展性和治理——构成一个相互关联的框架,其中优化一个支柱会与其他支柱产生权衡,需要系统性地平衡而不是孤立的优化。

  • 训练-服务一致性代表了最关键的数据工程挑战,当训练环境和服务环境之间的转换逻辑不同时,会导致大约 70%的生产机器学习失败。

  • 数据标注成本通常比模型训练成本高 1000-3000 倍,但在项目规划期间却得到不足的关注。理解完整的经济模型(基础成本 × 审查开销 × 重新工作乘数)对于现实预算至关重要。

  • 有效的数据获取需要战略性地结合多种方法——现有数据集用于质量基准,网络爬虫用于规模,众包用于覆盖,以及合成生成用于边缘情况——而不是依赖任何单一方法。

  • 存储架构决策贯穿整个机器学习生命周期,影响着训练迭代速度、服务延迟、特征一致性和运营成本。分层存储策略在性能需求和经济约束之间取得平衡。

  • 数据治理超越了合规性,以实现技术能力:血缘跟踪有助于调试和可重复性,访问控制有助于保护隐私的架构,偏差监测有助于在整个系统演变过程中提高公平性。

在整个流程中整合稳健的数据治理实践确保了随着复杂性和影响的扩大,机器学习系统始终保持可信、合规和透明。数据卡片、血缘追踪和自动化监控创建了所需的可观察性,以便在它们影响模型行为之前检测到数据漂移、隐私违规和质量下降。这些工程基础使得第八章中的分布式训练策略、第十章中的模型优化技术和第十三章中的 MLOps 实践成为可能,可靠的数据基础设施成为有效扩展机器学习系统的先决条件。


AI 框架

DALL·E 3 提示:以矩形格式绘制插图,专为专业教科书设计,内容覆盖整个宽度。充满活力的图表展示了机器学习的训练和推理框架。TensorFlow、Keras、PyTorch、ONNX 和 TensorRT 的图标分布在整个水平空间中,并垂直排列。每个图标旁边都有简要的注释,详细说明其功能。明亮的蓝色、绿色和橙色突出显示图标和部分,背景为柔和的渐变。通过颜色编码的部分强调了训练和推理框架之间的区别,清晰的线条和现代的字体保持了清晰度和焦点。

图片

目的

为什么机器学习框架代表了决定生产 AI 系统中系统可扩展性、开发速度和架构灵活性的关键抽象层?

机器学习框架作为连接理论概念和实际实现的临界抽象层,将抽象的数学概念转化为高效、可执行的代码,同时提供标准化接口以实现硬件加速、分布式计算和模型部署。没有框架,每个 ML 项目都需要重新实现如自动微分和并行计算等核心操作,使得大规模开发在经济上不可行。这一抽象层使两个关键能力成为可能:通过预优化的实现加速开发和跨 CPU、GPU 和专用加速器的硬件可移植性。框架选择成为最具影响力的工程决策之一,决定了整个开发生命周期中的系统架构约束、性能特征和部署灵活性。

学习目标

  • 跟踪机器学习框架从数值计算库到深度学习平台再到专用部署变体的进化过程

  • 解释现代框架中计算图、自动微分和张量操作的结构和实现

  • 通过分析其在开发灵活性、调试能力和生产优化方面的权衡,比较静态和动态执行模型

  • 分析主要框架(研究优先、生产优先、函数式编程)背后的设计理念及其对系统架构的影响

  • 通过系统地评估模型需求、硬件约束和部署环境来评估框架选择标准

  • 为特定部署场景选择设计框架策略,包括云、边缘、移动和微控制器环境

  • 批判常见的框架选择谬误并评估其对系统性能和可维护性的影响

框架抽象和必要性

将原始的计算原语转化为机器学习系统代表了现代计算机科学中最具挑战性的工程任务之一。在本章中,基于上一章建立的数据管道,我们考察了支持在多样化的计算架构上高效实现机器学习算法的软件基础设施。尽管机器学习的数学基础(线性代数运算、优化算法和梯度计算)已经确立,但在生产系统中高效实现这些基础需要软件抽象,以将理论公式与实际实施约束相连接。

现代机器学习算法的计算复杂性说明了这些抽象的必要性。训练一个当代语言模型需要协调分布式硬件配置中的数十亿次浮点运算,这要求精确协调内存层次、通信协议和数值精度管理。从正向传播到反向传播的每个算法组件都必须分解为可以映射到异构处理单元的基本操作,同时保持数值稳定性和计算可重复性。从基本计算原语实现这些系统的工程复杂性将使大多数组织的规模化机器学习开发在经济上变得不可行。

当考虑具体的实现挑战时,这种复杂性立即显现出来。手动实现一个简单的三层感知器的反向传播需要数百行细致的微积分和矩阵操作代码。现代框架只需一行代码就能完成:loss.backward()。框架不仅使机器学习变得更容易,而且通过管理梯度计算、硬件优化以及数百万参数的分布式执行复杂性,使得现代深度学习成为可能

机器学习框架构成了介于高级算法规范和低级计算实现之间的基本软件基础设施。这些平台解决了计算机器学习中的核心抽象问题:在多样化的硬件架构上保持计算效率的同时,实现算法的表达能力。通过提供标准化的计算图、自动微分引擎和优化的算子库,框架使研究人员和实践者能够专注于算法创新,而不是实现细节。这一抽象层已被证明在加速机器学习系统的科研发现和工业部署方面发挥了关键作用。

机器学习框架是提供抽象工具的软件平台,用于完整的机器学习生命周期,通过标准化的接口将应用代码计算基础设施连接起来,以实现模型开发、训练和部署。

机器学习框架的进化轨迹反映了该领域从实验研究到工业规模部署的更广泛成熟。早期的计算框架主要解决数学运算的高效表达,专注于优化线性代数原语和梯度计算。当代平台已扩展其范围,涵盖完整的机器学习开发生命周期,包括数据预处理管道、分布式训练编排、模型版本控制系统和产品部署基础设施。这种架构演变展示了该领域认识到可持续的机器学习系统需要解决不仅仅是算法性能,还包括可扩展性、可靠性、可维护性和可重复性等运营问题的工程解决方案。

这些框架内嵌的架构设计决策对基于它们的机器学习系统的特性和能力产生深远影响。关于计算图表示、内存管理策略、并行化方案和硬件抽象层的设计选择,直接决定了系统性能、可扩展性限制和部署灵活性。这些架构约束贯穿于每个开发阶段,从最初的研究原型到生产优化,确立了算法创新可以实际实现的边界。

本章将机器学习框架视为软件工程工件和当代人工智能系统的促进者。我们分析了这些平台的架构原则,调查了塑造其设计的权衡,并检查了它们在更广泛的机器学习基础设施生态系统中的作用。通过系统地研究框架进化、架构模式和实现策略,学生将发展出必要的专业技术理解,以便做出明智的框架选择决策,并在设计和实现生产机器学习系统中有效地利用这些抽象。

历史发展轨迹

要理解现代框架如何实现这些功能,我们可以追溯它们如何从简单的数学库演变为今天的平台。机器学习框架的进化反映了人工智能和计算能力的更广泛发展,由三个关键因素驱动:模型复杂性的增长、数据集规模的增加和硬件架构的多样化。

这些驱动力塑造了不同的进化阶段,既反映了技术进步,也反映了人工智能社区需求的变化。本节探讨了框架如何从早期的数值计算库发展到现代深度学习框架。这一演变建立在第一章中介绍的 AI 发展历史背景之上,并展示了软件基础设施如何使机器学习理论进步的实用化成为可能。

框架发展时间线

机器学习框架的发展建立在计算库几十年的基础工作之上。从 BLAS 和 LAPACK 的早期构建块到现代框架如 TensorFlow、PyTorch 和 JAX,这一旅程代表了向更高层次抽象的稳步进步,使得机器学习更加易于访问和强大。

当考察这些基础技术之间的关系时,发展轨迹变得清晰。查看图 7.1,我们可以追溯这些数值计算库如何为现代机器学习发展奠定基础。BLAS 和 LAPACK 建立的数学基础使得 NumPy 和 SciPy 等更用户友好的工具得以创建,这些工具反过来又为今天的深度学习框架奠定了基础。

图片

图 7.1:计算库演变:现代机器学习框架建立在数十年的数值计算进步之上,从 BLAS 和 LAPACK 等低级例程过渡到 numpy、scipy 等高级抽象,最终到 TensorFlow 和 PyTorch 等深度学习框架。这一进步反映了向机器学习系统开发中开发生产力和可访问性增加的转变。

这种进步展示了框架如何通过渐进式创新实现其功能,在先辈们建立的基础之上构建计算的可访问性。

基础数学计算基础设施

现代机器学习框架的基础始于计算的核心层面:矩阵运算。机器学习计算主要是矩阵-矩阵和矩阵-向量乘法,因为神经网络通过作用于多维数组的线性变换 1 来处理数据。1979 年开发的基本线性代数子程序2(BLAS)提供了这些基本的矩阵运算,这些运算将成为机器学习的计算骨干(H. T. Kung and Leiserson 1979)。这些低级操作在组合和执行时,能够实现训练神经网络和其他机器学习模型所需的复杂计算。

基于 BLAS,线性代数包(LAPACK)3 于 1992 年出现,通过高级线性代数运算扩展了这些功能,如矩阵分解、特征值问题和线性系统求解。这种从基本矩阵计算构建越来越复杂运算的分层方法,成为机器学习框架的一个定义性特征。

优化线性代数运算的基础为更高层次的抽象奠定了舞台,使得数值计算更加易于访问。2006 年NumPy的发展标志着这一进化的一个重要里程碑,它建立在 Numeric 和 Numarray 的基础上,成为 Python 中数值计算的主要包。NumPy 引入了多维数组对象和基本数学函数,为这些底层的 BLAS 和 LAPACK 操作提供了高效的接口。这种抽象允许开发者使用高级数组运算,同时保持优化低级矩阵计算的性能。

这种趋势随着SciPy的推出而持续,SciPy 建立在 NumPy 的基础上,提供了用于优化、线性代数和信号处理的专用函数,其首个稳定版本发布于 2008 年。这种分层架构,从基本的矩阵运算到数值计算,为未来的机器学习框架奠定了蓝图。

早期机器学习平台开发

下一个进化阶段代表了从通用数值计算到特定领域机器学习工具的概念飞跃。从数值库到专用机器学习框架的转变标志着抽象的重要进化。虽然底层计算仍然根植于矩阵运算,但框架开始将这些运算封装到更高层次的机器学习原语中。怀卡托大学于 1993 年推出了 Weka(Witten and Frank 2002),这是最早的机器学习框架之一,它将矩阵运算抽象为数据挖掘任务,尽管其 Java 实现和关注小规模计算的限制限制了其发展。

这种范式转变在Scikit-learn的推出中变得明显,Scikit-learn 于 2007 年出现,是机器学习抽象的一个重要进步。它建立在 NumPy 和 SciPy 的基础上,将基本的矩阵运算转化为直观的机器学习算法。例如,在逻辑回归模型中,一系列的矩阵乘法和梯度计算变成了简单的fit()方法调用。这种抽象模式,在干净的 API 背后隐藏复杂的矩阵运算,将成为现代机器学习框架的一个定义性特征。

Theano4,在蒙特利尔学习算法研究所(MILA)开发并于 2007 年出现,是一项重大进步,引入了两个革命性的概念:计算图 5 和 GPU 加速(T. T. D. Team 等人 2016)。计算图将数学运算表示为有向图,其中矩阵运算作为节点,数据在它们之间流动。这种基于图的方法允许对底层矩阵运算进行自动微分和优化。更重要的是,它使框架能够自动将这些运算路由到 GPU 硬件,极大地加速了矩阵计算。

随着 2002 年在纽约大学创建的基于 Lua 的先祖Torch7(PyTorch 的前身),出现了一条并行开发路径,它采取了不同的矩阵运算处理方法。它强调操作的即时执行(即时执行 6)并为神经网络实现提供了可适应的接口。

Torch 的设计理念是在保持高性能的同时优先考虑开发者体验,这确立了后来影响 PyTorch 等框架的设计模式。其架构展示了如何平衡高级抽象与高效的低级矩阵运算,引入了随着深度学习复杂性增加而证明至关重要的概念。

深度学习计算平台创新

深度学习的出现产生了前所未有的计算需求,暴露了现有框架的局限性。深度学习革命要求框架在处理矩阵运算方面进行重大转变,这主要归因于三个因素:计算规模的巨大、通过深度网络的梯度计算的复杂性以及分布式处理的需求。为经典机器学习算法设计的传统框架无法处理训练深度神经网络所需的数十亿次矩阵运算。

这一计算挑战激发了学术研究环境中的创新,这将重塑框架开发。现代深度学习框架的基础源于学术研究。蒙特利尔大学在 2007 年发布的Theano确立了未来框架将采用的概念(Bergstra 等人 2010)。它引入了诸如用于自动微分和 GPU 加速的计算图等关键概念,展示了如何组织和优化复杂的神经网络计算。

Caffe,由加州大学伯克利分校于 2013 年发布,通过引入卷积操作的专用实现(Y. Jia 等人 2014)推动了这一进化。虽然卷积在数学上等同于特定的矩阵乘法模式,但 Caffe 针对计算机视觉任务对这些模式进行了优化,展示了专用矩阵操作实现如何能显著提高特定网络架构的性能。

下一个突破来自工业界,计算规模的需求要求新的架构方法。谷歌的 TensorFlow7 于 2015 年推出,通过将矩阵操作视为分布式计算问题的一部分,彻底改变了该领域(Jeffrey Dean 和 Ghemawat 2008)。它将所有计算,从单个矩阵乘法到整个神经网络,表示为一个静态计算图 8,可以跨多个设备分割。这种方法通过在计算机集群和专用硬件上分配矩阵操作,实现了前所未有的模型大小的训练。TensorFlow 的静态图方法虽然最初限制了灵活性,但通过内核融合 9(将多个操作组合成一个内核以提高效率)和内存规划 10(为操作预分配内存)等技术,允许对矩阵操作进行积极的优化。

随着不同组织解决特定的计算挑战,深度学习框架生态系统继续多样化。微软的 CNTK 于 2016 年进入该领域,为语音识别和自然语言处理任务提供了实现(Seide 和 Agarwal 2016)。其架构强调在分布式系统中的可扩展性,同时保持基于序列模型的计算效率。

同时,Facebook 的 PyTorch11,也于 2016 年推出,在处理矩阵计算方面采取了截然不同的方法。PyTorch 不是使用静态图,而是引入了可以即时修改的动态计算图(Paszke 等人 2019)。这种动态方法虽然可能牺牲了优化机会,但简化了研究人员对其模型中矩阵操作流程的调试和分析。PyTorch 的成功表明,对于研究应用来说,能够动态内省和修改计算的能力与原始性能同样重要。

框架的发展随着 Amazon 的MXNet的推出而继续扩展,MXNet 通过关注内存效率和跨不同硬件配置的可扩展性来应对大规模矩阵运算的挑战。它引入了一种混合方法,结合了静态和动态图的特点,使得模型开发具有适应性同时保持对底层矩阵运算的激进优化。

这些不同的方法揭示了没有单一解决方案能够满足所有深度学习需求,这导致了专用工具的发展。随着深度学习应用变得更加多样化,对专用和高级抽象的需求变得明显。Keras在 2015 年出现,以解决这一需求,提供了一个可以在多个底层框架之上运行的统一接口(Chollet 等人 2015)。这种高级抽象方法展示了框架如何专注于用户体验同时利用现有系统的计算能力。

同时,2018 年引入的 Google 的JAX12,将函数式编程原则引入了深度学习计算,使得新的模型开发模式成为可能(Bradbury 等人 2018)。FastAI基于 PyTorch 构建,将常见的深度学习模式打包成可重用组件,使得高级技术对实践者更加易于获取(J. Howard 和 Gugger 2020)。这些高级框架展示了抽象如何简化开发同时保持其底层实现性能的优势。

硬件驱动的框架架构演变

框架的演变与计算硬件的进步密不可分,形成了软件能力和硬件创新之间的动态关系。硬件的发展显著改变了框架实现和优化矩阵运算的方式。2007 年NVIDIA 的 CUDA 平台13 的引入,通过在 GPU 上实现通用计算,标志着框架设计的一个关键时刻(Nickolls 等人 2008)。这是具有变革性的,因为 GPU 擅长并行矩阵运算,为深度学习中的计算提供了数量级的速度提升。虽然 CPU 可能按顺序处理矩阵元素,但 GPU 可以同时处理数千个元素,这显著改变了框架处理计算调度的方式。

现代 GPU 架构在 ML 工作负载上展示了可量化的效率优势。NVIDIA A100 GPU 在 FP16 精度下提供 312 TFLOPS 的张量操作,内存带宽为 1.6 TB/s,而典型的 CPU 配置只能提供 1-2 TFLOPS,内存带宽为 50-100 GB/s。这些硬件特性显著改变了框架优化策略。框架必须设计计算图,通过确保足够的计算强度(以每字节传输的 FLOPS 衡量)来饱和可用的内存带宽,从而最大化 GPU 利用率。

当框架针对 GPU 加速时,内存带宽优化变得至关重要。内存带宽与计算比(每 FLOP 的字节数)决定了操作是计算受限还是内存受限。具有大维度(通常为 N×N,其中 N > 1024)的矩阵乘法操作具有高计算强度,成为计算受限,从而实现接近峰值 GPU 利用率。然而,像激活函数这样的逐元素操作通常成为内存受限,只能达到峰值性能的 10-20%。框架通过算子融合技术来解决这个问题,将内存受限操作组合成单个内核,以减少内存传输。

除了通用的 GPU 加速之外,针对特定硬件的加速器的发展进一步革命化了框架设计。谷歌的 Tensor Processing Units (TPUs)14,首次于 2016 年部署,专为张量运算而设计,这是深度学习计算的基本构建块。TPUs 引入了脉动阵列 15 架构,这些架构特别适用于矩阵乘法和卷积操作。这种硬件架构促使像 TensorFlow 这样的框架开发出专门的编译策略,可以直接将高级操作映射到 TPU 指令,绕过传统的以 CPU 为中心的优化。

TPU 架构通过定量指标展示了专门的效率提升。TPU v4 芯片在 1.2 TB/s 的内存带宽下实现了 275 TFLOPS 的 BF16 计算,同时消耗 200W 功率,提供 1.375 TFLOPS/W 的功率效率。这代表了相对于当代 GPU 在大矩阵操作上的 3-5 倍能效提升。然而,TPUs 专门优化密集矩阵操作,对于稀疏计算或需要复杂控制流的操作效率降低。针对 TPU 的框架必须设计计算图,以最大化密集矩阵操作的使用,同时最小化芯片上高带宽内存(32 GB,1.2 TB/s)和芯片外内存之间的数据移动。

移动硬件加速器,如苹果的神经引擎(2017)和高通的神经处理单元,为框架设计带来了新的约束和机遇。这些设备强调的是能效而非原始的计算速度,要求框架开发新的量化策略和算子融合策略。移动框架如 TensorFlow Lite(最近更名为LiteRT)和PyTorch Mobile需要在模型准确性和能耗之间取得平衡,这导致了矩阵操作调度和执行方式的创新。

移动加速器展示了混合精度计算在能效中的关键重要性。苹果 A17 Pro 芯片中的神经引擎提供了 35 TOPS(每秒万亿操作)的 INT8 性能,同时消耗大约 5W 的功率,实现了 7.2 TOPS/W 的效率。这比同一芯片上 FP32 计算的能效提高了 10-15 倍。针对移动硬件的框架必须提供自动混合精度策略,以确定每个操作的优化精度,在能耗和精度下降之间取得平衡。

稀疏计算框架解决了移动硬件的内存带宽限制问题。稀疏神经网络可以通过减少 50-90%的内存流量来优化具有结构化稀疏模式的网络,这直接提高了能效,因为内存访问比移动处理器上的算术操作消耗 10-100 倍的能量。像 Neural Magic 的 SparseML 这样的框架可以自动生成保持准确性的稀疏模型,同时符合硬件稀疏支持。高通的 Neural Processing SDK 提供了针对 2:4 结构化稀疏操作的专用内核,其中每 4 个连续权重中有 2 个为零,从而在最小化精度损失的情况下实现 1.5-2 倍的速度提升。

定制 ASIC16(专用集成电路)解决方案的出现进一步丰富了硬件格局。像GraphcoreCerebrasSambaNova这样的公司为矩阵计算开发了独特的架构,每个架构都有不同的优势和优化机会。这种专用硬件的增长推动了框架采用更适应性的矩阵操作中间表示 17,从而在保持通用高级接口的同时实现针对特定目标的优化。

可重构硬件的出现增加了另一层复杂性和机会。现场可编程门阵列(FPGAs)为框架优化引入了另一个维度。与固定功能的 ASIC 不同,FPGAs 允许配置可重构的电路,这些电路可以针对特定的矩阵运算模式进行优化。响应这一能力的框架开发了即时编译策略,可以根据模型的具体需求生成优化的硬件配置。

这种由硬件驱动的演变展示了框架设计如何必须不断适应以利用新的计算能力。在追踪了框架如何从简单的数值库发展到由硬件创新驱动的平台之后,我们现在转向理解使现代框架能够管理这种计算复杂性的核心概念。这些关键概念(计算图、执行模型和系统架构)构成了所有框架能力建立的基础。

基本概念

现代机器学习框架通过集成四个关键层来运行:基础、数据处理、开发者接口和执行与抽象。这些层共同作用,为模型开发和部署提供了一个结构化和高效的基石,如图图 7.2 所示。

图片

图 7.2:框架层交互:现代机器学习框架将功能组织成不同的层(基础、数据处理、开发者接口和执行与抽象),这些层协同工作以简化模型构建和部署。这种分层架构实现了模块化,并允许开发者专注于机器学习工作流程的特定方面,而无需管理底层基础设施。

基础层通过计算图建立了这些框架的结构基础。这些图使用有向无环图(DAG)表示,实现了自动微分和优化。通过组织操作和数据依赖关系,计算图为框架提供了在多种硬件平台上分配工作负载和执行计算的能力。

在这个结构基础之上,数据处理层管理着机器学习工作流程中必不可少的数值数据和参数。该层的关键是专门的数据结构,例如张量,它们在处理高维数组的同时优化内存使用和设备放置。内存管理和数据移动策略确保计算工作负载能够有效执行,尤其是在硬件资源多样或有限的环境中。

开发者接口层提供了用户与框架交互的工具和抽象。编程模型允许开发者以适合其特定需求的方式定义机器学习算法。这些模型分为命令式或符号式。命令式模型提供灵活性和易于调试,而符号模型则优先考虑性能和部署效率。执行模型通过定义计算是立即执行(急切执行)还是作为预优化的静态图来进一步塑造这种交互。

在这个架构堆栈的底部,执行和抽象层将这些高级表示转换为高效的硬件可执行操作。核心操作包括从基本的线性代数到复杂的神经网络层的一切,针对不同的硬件平台进行了优化。这一层还包括分配资源和动态管理内存的机制,确保在训练和推理设置中都具有可扩展的性能。

这四个层通过精心设计的接口和依赖关系协同工作,创建了一个平衡可用性和性能的统一系统。理解这些相互关联的层对于有效地利用机器学习框架至关重要。每一层在促进实验、优化和部署中扮演着独特而又相互依赖的角色。通过掌握这些概念,从业者可以就资源利用、扩展策略以及特定框架对各种任务的适用性做出明智的决策。

我们的探索从计算图开始,因为它们构成了所有其他框架功能的结构基础。这个核心抽象提供了自动微分、优化和硬件加速能力的数学表示,这些能力使现代框架与简单的数值库区分开来。

计算图

计算图是框架将直观的模型描述转换为高效硬件执行的中央抽象。这种表示组织数学运算及其依赖关系,以实现自动优化、并行化和硬件专门化。

计算图基础

计算图作为机器学习框架中的一个关键抽象,用于解决深度学习模型日益增长的复杂性。随着模型变得更大和更复杂,跨不同硬件平台的高效执行变得必要。计算图将高级模型描述转换为高效的低级硬件执行(Baydin 等人 2017),将机器学习模型表示为一个有向无环图 18(DAG),其中节点代表操作,边代表数据流。这种 DAG 抽象使得在多样化的硬件平台上实现自动微分和高效优化成为可能。

例如,一个节点可能代表矩阵乘法操作,接受两个输入矩阵(或张量)并生成一个输出矩阵(或张量)。为了可视化这一点,可以考虑图 7.3 中的简单示例。这个有向无环图计算 z=x×yz = x \times y,其中每个变量只是数字。

图片

图 7.3:计算图:有向无环图将机器学习模型表示为一系列相互连接的操作,从而实现高效的计算和自动微分。本例展示了一个简单的计算,z=x×yz = x \times y,其中节点定义操作,边指定它们之间的数据流。

这个简单示例说明了基本原理,但真实的机器学习模型需要更复杂的图结构。如图 7.4 图 7.4 所示,计算图的结构涉及定义相互连接的层,如卷积、激活、池化和归一化,这些层在执行前进行优化。该图还展示了关键的系统级交互,包括内存管理和设备放置,展示了静态图方法如何实现完整的预执行分析和资源分配。

图片

图 7.4:计算图:此图表示计算为一个有向无环图,其中节点表示变量,边表示操作。通过以这种形式表达计算,系统可以高效地执行自动微分,这对于通过基于梯度的优化训练机器学习模型至关重要,并在执行前优化资源分配。

层和张量

现代机器学习框架通过两个关键抽象实现神经网络计算:层和张量。层代表执行卷积、池化或密集变换等操作的计算单元。每个层在模型训练过程中保持内部状态,包括权重和偏差。当数据通过这些层流动时,它以张量的形式存在,张量是不可变的数学对象,用于存储和传输数值。

层与张量之间的关系反映了传统编程中操作与数据之间的区别。一个层定义了如何将输入张量转换为输出张量,就像一个函数定义了如何将其输入转换为输出一样。然而,层增加了一个额外的维度:它们在训练过程中维护和更新内部参数。例如,卷积层不仅指定了如何执行卷积操作,而且还学习并存储了给定任务的优化卷积滤波器。

当框架自动化图构建过程时,这种抽象变得特别强大。当开发者编写tf.keras.layers.Conv2D时,框架构建必要的图节点以进行卷积操作、参数管理和数据流,从而屏蔽开发者的实现复杂性。

神经网络构建

计算图的力量不仅限于基本的层操作。激活函数,对于在神经网络中引入非线性至关重要,成为图中的节点。像 ReLU、sigmoid 和 tanh 这样的函数将层的输出张量进行转换,使网络能够近似复杂的数学函数。框架提供了这些激活函数的优化实现,使得开发者可以尝试不同的非线性,而无需担心实现细节。

现代框架通过提供完整的模型架构作为预配置的计算图来扩展这种模块化方法。像 ResNet 和 MobileNet 这样的模型可以直接使用,允许开发者自定义特定层并利用预训练权重的迁移学习。

系统级影响

使用之前建立的计算图抽象,框架可以在执行开始之前分析和优化整个计算。数据的显式依赖表示使得基于梯度的优化可以进行自动微分。

除了优化能力之外,这种图结构还提供了执行上的灵活性。相同的模型定义可以在不同的硬件平台上高效运行,从 CPU 到 GPU 再到专门的加速器。框架处理将操作映射到特定硬件能力的复杂性,优化内存使用,并协调并行执行。图结构还使模型序列化成为可能,允许训练好的模型在不同的环境中保存、共享和部署。

这些系统优势将计算图与更简单的可视化工具区分开来。虽然神经网络图有助于可视化模型架构,但计算图有更深层次的目的。它们提供了将直观模型设计转化为高效执行所需的精确数学表示。理解这种表示揭示了框架如何将高级模型描述转化为优化、针对不同硬件实现的实现,使得现代深度学习在规模上变得可行。

区分计算图和神经网络图(如多层感知器(MLPs)的图)是很重要的,这些图描绘了节点和层。神经网络图可视化了通过节点和层的架构和数据流,提供了对模型结构的直观理解。相比之下,计算图提供了实现和训练这些网络所需的底层数学运算和数据依赖的低级表示。

这些表示能力对框架设计和性能有深远的影响。从系统角度来看,计算图提供了几个关键能力,这些能力影响整个机器学习流程。它们实现了自动微分,我们将在下一部分进行探讨,为分析数据依赖和潜在的并行性提供了清晰的架构,并作为可以针对不同硬件目标进行优化和转换的中间表示。然而,计算图的力量取决于它们如何以及何时执行,这使我们来到了静态和动态图执行模型之间的基本区别。

预定义的计算结构

静态计算图,由 TensorFlow 早期版本首创,实现了“定义后运行”的执行模型。在这种方法中,开发者在执行开始之前必须指定整个计算图。这种架构选择对系统性能和开发工作流程都有重大影响,我们将在后面进行探讨。

静态计算图在操作的定义和它们的执行之间实现了明确的分离。在定义阶段,每个数学运算、变量和数据流连接都被明确声明并添加到图结构中。这个图是对计算的完整规范,但并不执行任何实际计算。相反,框架构建了所有操作及其依赖关系的内部表示,这些将在后续阶段执行。

这种预先定义允许强大的系统级优化。框架可以分析完整的结构,以识别操作融合的机会,通过内核融合消除不必要的中间结果,并通过内核融合将内存流量减少 3-10 倍。内存需求可以精确计算并在事先优化,从而实现高效的分配策略。静态图使编译框架如 XLA19(加速线性代数)能够执行激进的优化。图重写可以消除大量冗余操作,而针对特定硬件的内核生成可以在通用实现之上提供显著的加速。这种抽象虽然优雅,但给可表达的计算施加了基本约束:静态图通过牺牲控制流和动态计算模式的灵活性来实现这些性能提升。一旦验证,相同的计算可以以高信心重复运行,对其行为和性能特征有很高的信心。

图 7.5 展示了这种基本的两阶段方法:首先,构建并优化完整的计算图;然后,在执行阶段,实际数据流经图以产生结果。这种分离使得框架能够在任何执行开始之前对整个计算进行彻底的分析和优化。

图 7.5:静态计算图:机器学习框架首先将计算定义为操作图,在数据流通过系统之前,实现操作融合和高效资源分配的全局优化。这种两阶段方法将图构建和优化与执行分离,提高了性能和可预测性。

运行时自适应计算结构

动态计算图,由 PyTorch 推广,实现了一种“运行时定义”的执行模型。这种方法在执行过程中构建图,为模型定义和调试提供了更大的灵活性。与依赖于预定义内存分配的静态图不同,动态图在操作执行时分配内存,这使得它们在长时间运行的任务中容易受到内存碎片化的影响。虽然动态图在表达控制流方面以效率换取灵活性,但它们显著限制了编译器的优化机会。在执行前无法分析完整的计算,阻止了静态图所允许的激进内核融合和图重写优化。

如图 7.6 所示,每个操作都是在定义、执行和完成之后,才继续定义下一个操作。这与静态图形成鲜明对比,在静态图中,所有操作都必须预先定义。当一个操作被定义时,它立即执行,其结果可供后续操作或调试期间检查使用。这个周期一直持续到所有操作都完成。

图片

图 7.6:动态图执行:机器学习框架在运行时按顺序定义和执行操作,从而实现灵活的模型构建和中间结果的即时评估。这与需要完全预先定义的静态图形成对比,并支持在模型训练和推理期间的调试和自适应计算。

动态图在需要条件执行或动态控制流的场景中表现出色,例如在处理可变长度序列或实现复杂分支逻辑时。它们在开发过程中提供即时反馈,使得识别和修复计算管道中的问题更加容易。这种灵活性自然地与大多数开发者熟悉的命令式编程模式相吻合,允许他们在运行时检查和修改计算。这些特性使得动态图在机器学习项目的研发阶段特别有价值。

框架架构权衡

静态和动态计算图之间的架构差异对机器学习系统的设计和执行方式有多个影响。这些影响涉及内存使用、设备利用、执行优化和调试的各个方面,所有这些都对系统的效率和可扩展性起着重要作用。我们重点关注内存管理和设备放置作为基础概念,优化技术将在第八章中详细讨论。这使我们能够在探索更复杂的话题,如优化和容错性之前,建立清晰的理解。

内存管理

在执行计算图时发生内存管理。静态图受益于其预定义的结构,允许在执行前进行精确的内存规划。框架可以预先计算内存需求,通过内存重用等技术优化分配,并最小化开销。这种结构化方法有助于确保一致的性能,尤其是在资源受限的环境中,如移动和微型 ML 系统。对于大型模型,框架必须高效地处理从 100GB/s(较小模型)到超过 1TB/s(具有数十亿参数的大型语言模型)的内存带宽需求,这使得内存规划对于实现最佳吞吐量至关重要。

相比之下,动态图在执行操作时动态分配内存。虽然这种灵活性对于处理动态控制流或可变输入大小非常有价值,但它可能导致更高的内存开销和碎片化。这些权衡在开发期间最为明显,动态图使快速迭代和调试成为可能,但可能需要额外的优化以进行生产部署。当由于碎片化和不理想的访问模式导致内存带宽利用率低于可用容量的 50%时,动态分配开销变得尤为重要。

设备放置

设备放置,即将操作分配给硬件资源(如 CPU、GPU 或专门的 ASIC 如 TPU)的过程,是另一个系统级考虑因素。静态图允许进行详细的预执行分析,使框架能够将计算密集型操作映射到设备上,同时最小化通信开销。这种能力使静态图非常适合优化在专用硬件上的执行,其中性能提升可能非常显著。

与之相反,动态图在运行时处理设备放置。这使得它们能够适应不断变化的情况,例如硬件可用性或工作负载需求。然而,在执行之前缺乏完整的图结构可能会使完全优化设备利用率变得具有挑战性,可能导致大规模或分布式设置中的效率低下。

更广阔的视角

静态图与动态图之间的权衡远不止内存和设备考虑。如表 7.1 所示,这些架构影响优化潜力、调试能力、可扩展性和部署复杂性。这些更广泛的影响在第八章中详细探讨,该章节讨论了训练工作流程,以及在第十一章中讨论了系统级优化。

这些混合解决方案旨在在开发期间提供动态图的灵活性,同时在生产环境中实现静态图的性能优化。静态图与动态图的选择通常取决于具体的项目需求,平衡开发速度、生产性能和系统复杂性等因素。

表 7.1:图计算模式:静态图在开始计算前定义整个计算过程,从而实现优化,而动态图在运行时动态构建计算,为可变长度输入和控制流提供灵活性。这种区别影响执行效率和模型开发及调试的易用性。

方面 静态图 动态图
内存管理 精确的分配规划,优化的内存使用 灵活但可能效率较低的分配合适
优化潜力 可能进行全面的图级优化 由于运行时限制,仅限于局部优化
硬件利用率 可以生成高度优化的特定于硬件的代码 可能会牺牲特定于硬件的优化
开发体验 需要更多的前期规划,更难调试 更好的调试,更快的迭代周期
调试工作流程 框架特定的工具,堆栈跟踪脱节 标准 Python 调试(pdb、print、inspect)
错误报告 执行时错误与定义脱节 直观的堆栈跟踪指向确切行
研究速度 由于定义后运行的要求而迭代较慢 更快的原型设计和模型实验
运行时灵活性 固定的计算结构 可以适应运行时条件
生产性能 在规模上通常有更好的性能 可能因图构建而产生开销
与旧代码集成 定义和执行之间有更多的分离 与命令式代码自然集成
内存开销 由于计划分配而具有较低的内存开销 由于动态分配而具有较高的开销
部署复杂性 由于固定结构而部署更简单 可能需要额外的运行时支持

基于图的梯度计算实现

计算图不仅作为执行计划,而且是使反向模式自动微分可行和高效的核心数据结构。理解这种联系揭示了框架如何通过任意复杂的神经网络计算梯度。

在正向传递期间,框架构建一个计算图,其中每个节点代表一个操作,并存储结果以及计算梯度所需的信息。这个图不仅是一个可视化工具,而且是一个实际的数据结构,它在内存中维护。当调用loss.backward()时,框架以反向拓扑顺序遍历此图,并在每个节点上系统地应用链式法则。

关键的洞察是图结构编码了链式法则所需的所有依赖关系。图中的每条边代表一个偏导数,反向遍历会根据链式法则自动组合这些偏导数。正向传递构建计算历史,反向传递则是一个简单的图遍历算法,通过跟随记录的依赖关系来累积梯度。

此设计使自动微分能够扩展到具有数百万个参数的网络,因为其复杂性是操作数的线性关系,而不是变量数的指数关系。图结构确保每个梯度计算恰好执行一次,并且通过图表示中内置的依赖关系跟踪正确处理共享子计算。

自动微分

机器学习框架必须解决一个核心计算挑战:通过复杂的数学运算链准确且高效地计算导数。这种能力使得通过计算数百万个参数需要调整以改进模型性能来训练神经网络成为可能(Baydin 等人 2017)。

列表 7.1 展示了一个简单的计算,说明了这一挑战。

列表 7.1:自动微分:使复杂函数的梯度计算高效,这对于优化神经网络参数至关重要。

def f(x):
    a = x * x  # Square
    b = sin(x)  # Sine
    return a * b  # Product

即使在这个基本例子中,手动计算导数也需要仔细应用微积分规则——乘积规则、链式法则和三角函数的导数。现在想象一下将其扩展到具有数百万个操作的神经网络。这就是自动微分(AD)20 成为关键的地方。

自动微分通过将函数分解为基本操作来计算作为计算机程序实现的函数的导数。在我们的例子中,AD 将 f(x) 分解为三个基本步骤:

  1. 计算 a = x * x(平方)

  2. 计算 b = sin(x)(正弦函数)

  3. 计算最终乘积 a * b

对于每一步,AD 都知道基本的导数规则:

  • 对于平方:d(x²)/dx = 2x

  • 对于正弦:d(sin(x))/dx = cos(x)

  • 对于乘积:d(uv)/dx = u(dv/dx) + v(du/dx)

通过跟踪这些操作如何组合并系统地应用链式法则,AD 通过整个计算过程计算精确的导数。当在 PyTorch 或 TensorFlow 等框架中实现时,这可以自动计算任意神经网络架构的梯度,这对于第八章中详细介绍的训练算法和优化技术至关重要。这种对 AD 如何分解和跟踪计算的基本理解,为检查其在机器学习框架中的实现奠定了基础。我们将探讨其数学原理、系统架构影响以及使现代机器学习成为可能的性能考虑。

前向和反向模式微分

自动微分可以使用两种主要的计算方法实现,每种方法在效率、内存使用以及对不同问题类型的适用性方面都有独特的特点。本节将探讨前向模式和反向模式自动微分,分析它们的数学基础、实现结构、性能特征以及在机器学习框架中的集成模式。

前向模式

前向模式自动微分在原始计算的同时计算导数,跟踪变化如何从输入传播到输出。在第 7.3.2 节中介绍的基本 AD 概念的基础上,前向模式模仿了手动导数计算,使其易于理解和实现。

考虑我们之前的例子,进行轻微修改以展示前向模式的工作方式(参见列表 7.2)。

列表 7.2:前向模式自动微分:使用乘积法则在函数评估的同时计算导数,说明了输入变化如何传播到输出。

def f(x):  # Computing both value and derivative
    # Step 1: x -> x²
    a = x * x  # Value: x²
    da = 2 * x  # Derivative: 2x

    # Step 2: x -> sin(x)
    b = sin(x)  # Value: sin(x)
    db = cos(x)  # Derivative: cos(x)

    # Step 3: Combine using product rule
    result = a * b  # Value: x² * sin(x)
    dresult = a * db + b * da  # Derivative: x²*cos(x) + sin(x)*2x

    return result, dresult

前向模式通过为每个数字增加其导数值,创建数学家所说的“双数”,从而实现这种系统的导数计算。在列表 7.3 中的例子展示了当 x = 2.0 时,这种计算是如何在数值上工作的:计算跟踪了两个值及其导数:

列表 7.3:前向模式:该例子使用双数在函数值的同时计算导数,展示了如何跟踪结果及其变化率的变化。

x = 2.0  # Initial value
dx = 1.0  # We're tracking derivative with respect to x

# Step 1: x²
a = 4.0  # (2.0)²
da = 4.0  # 2 * 2.0

# Step 2: sin(x)
b = 0.909  # sin(2.0)
db = -0.416  # cos(2.0)

# Final result
result = 3.637  # 4.0 * 0.909
dresult = 2.805  # 4.0 * (-0.416) + 0.909 * 4.0
实现结构

前向模式 AD 通过程序同时跟踪值和导数来结构化计算。这种计算的构成可以在列表 7.4 中再次看到,其中每个中间操作都被明确表示。

列表 7.4:前向模式 AD 结构:每个操作同时跟踪值和导数,突出了前向模式自动微分中计算的构成。

def f(x):
    a = x * x
    b = sin(x)
    return a * b

当框架以前向模式执行此函数时,它增强每个计算以携带两份数据:值本身以及该值相对于输入的变化。这种值和导数的配对运动反映了我们如何考虑变化率,如列表 7.5 所示。

列表 7.5:双数跟踪:每个计算同时跟踪其值和导数,说明了前向模式自动微分在实际中的工作方式。这个例子有助于理解在函数评估期间如何同时计算值及其变化率。

# Conceptually, each computation tracks (value, derivative)
x = (2.0, 1.0)  # Input value and its derivative
a = (4.0, 4.0)  # x² and its derivative 2x
b = (0.909, -0.416)  # sin(x) and its derivative cos(x)
result = (3.637, 2.805)  # Final value and derivative

这种导数信息的正向传播在框架的计算机制中自动发生。框架:1. 为每个值增加导数信息 2. 将每个基本操作转换为处理值和导数 3. 通过计算将此信息向前传播

这种方法的优点是它遵循计算的自然流程——随着值通过程序向前移动,它们的导数也随之移动。这使得前向模式特别适合于具有单个输入和多个输出的函数,因为导数信息遵循与常规计算相同的路径。

性能特征

前向模式 AD 表现出独特的性能模式,这影响了框架何时以及如何使用它。理解这些特征有助于解释为什么框架为不同的场景选择不同的 AD 方法。

前向模式在每个原始操作旁边执行一次导数计算。对于一个只有一个输入变量的函数,这意味着计算工作量大约翻倍——一次用于值,一次用于导数。成本与程序中的操作数量成线性关系,这使得它对于简单计算来说是可预测和可管理的。

然而,考虑一个神经网络层,它计算权重和输入之间的矩阵乘法的导数。为了计算所有权重的导数,前向模式需要为每个权重参数执行一次计算,可能多达数千次。这揭示了一个重要的特征:前向模式的效率取决于我们需要对多少输入变量求导。

前向模式的内存需求相对较小。它需要存储原始值、单个导数值以及在计算过程中的临时结果。无论计算变得多么复杂,内存使用量都保持不变。这种可预测的内存模式使得前向模式特别适合于内存有限的嵌入式系统、需要一致内存使用的实时应用,以及内存带宽成为瓶颈的系统。

这种计算随输入变量缩放但内存使用量恒定的组合产生了特定的权衡,影响了框架设计决策。前向模式在输入少但输出多的场景中表现出色,其简单实现和可预测的资源使用超过了多次遍历的计算成本。

用例

虽然前向模式自动微分不是训练完整神经网络的首选,但在现代机器学习框架中它扮演着几个重要的角色。它的优势在于我们需要理解输入的微小变化如何影响网络行为的情况下。考虑一个数据科学家试图理解他们的模型为何做出某些预测。他们可能需要分析改变图像中的一个像素或数据中的特定特征如何影响模型输出,如列表 7.6 所示。

列表 7.6:敏感性分析:输入图像中的微小变化通过前向模式自动微分影响神经网络预测。通过此代码理解这些影响有助于调试模型并提高其鲁棒性。

def analyze_image_sensitivity(model, image):
    # Forward mode tracks how changing one pixel
    # affects the final classification
    layer1 = relu(W1 @ image + b1)
    layer2 = relu(W2 @ layer1 + b2)
    predictions = softmax(W3 @ layer2 + b3)
    return predictions

当计算通过每一层进行时,前向模式携带值和导数,这使得我们可以直观地看到输入扰动如何传播到最终的预测。对于每个操作,我们可以精确地追踪微小变化是如何向前传播的。

神经网络解释展示了另一个引人入胜的应用。当研究人员生成显著性图或归因分数时,他们通常会计算每个输入元素如何影响输出,如列表 7.7 所示。

列表 7.7:前向模式 AD:通过跟踪网络操作中的输入扰动来有效地计算特征重要性。

def compute_feature_importance(model, input_features):
    # Track influence of each input feature
    # through the network's computation
    hidden = tanh(W1 @ input_features + b1)
    logits = W2 @ hidden + b2
    # Forward mode efficiently computes d(logits)/d(input)
    return logits

在专门的培训场景中,尤其是在涉及在线学习且模型在单个示例上更新的情况下,前向模式具有优势。该框架可以跟踪单个示例通过网络的反导数,尽管当处理批量训练或同时更新多个模型参数时,这种方法变得不太实用。

理解这些用例有助于解释为什么机器学习框架在保持其他微分策略的同时,还维持前向模式的能力。虽然反向模式处理完整模型训练的重活,但前向模式为特定分析任务提供了一种优雅的解决方案,在这些任务中,其计算模式与问题结构相匹配。

反向模式

反向模式自动微分构成了现代神经网络训练的计算核心。这不是偶然的 - 反向模式的结构完美地符合我们训练神经网络的需求。在训练过程中,我们有一个标量输出(损失函数)和需要数百万个参数(网络权重)的导数。反向模式在计算这种导数模式方面特别高效。

仔细查看列表 7.8 可以揭示反向模式微分是如何构建的。

列表 7.8:反向模式自动微分的简单示例

def f(x):
    a = x * x  # First operation: square x
    b = sin(x)  # Second operation: sine of x
    c = a * b  # Third operation: multiply results
    return c

在列表 7.8 中展示的此函数中,我们有三个操作创建了一个计算链。注意“x”如何通过两种不同的路径影响最终结果“c”:一次是通过平方(a = x²),一次是通过正弦(b = sin(x))。在计算导数时,必须考虑这两条路径。

首先,前向传递计算并存储值,如列表 7.9 所示。

列表 7.9:前向传递:计算通过不同路径对最终输出有贡献的中间值。

 x = 2.0             # Our input value
 a = 4.0             # x * x = 2.0 * 2.0 = 4.0
 b = 0.909           # sin(2.0) ≈ 0.909
 c = 3.637           # a * b = 4.0 * 0.909 ≈ 3.637

然后是反向传递。这正是反向模式展现其优雅之处的地方。这个过程在列表 7.10 中得到了演示,其中我们从输出开始计算梯度。

列表 7.10:反向传递:通过多条路径计算梯度以更新模型参数。这个标题直接告知学生反向传递在计算参数更新梯度中的目的,强调其在训练机器学习模型中的作用。

#| eval: false
dc/dc = 1.0    # Derivative of output with respect to itself is 1

# Moving backward through multiplication c = a * b
dc/da = b      # ∂(a*b)/∂a = b = 0.909
dc/db = a      # ∂(a*b)/∂b = a = 4.0

# Finally, combining derivatives for x through both paths
# Path 1: x -> x² -> c    contribution: 2x * dc/da
# Path 2: x -> sin(x) -> c contribution: cos(x) * dc/db
dc/dx = (2 * x * dc/da) + (cos(x) * dc/db)
      = (2 * 2.0 * 0.909) + (cos(2.0) * 4.0)
      = 3.636 + (-0.416 * 4.0)
      = 2.805

当我们考虑如果添加更多依赖于 x 的操作会发生什么时,反向模式的力量变得明显。正向模式需要通过每个新路径跟踪导数,但反向模式可以在单个反向传播中处理所有路径。这正是神经网络的情况,其中每个权重可以通过网络中的多个路径影响最终损失。

实现结构

在机器学习框架中实现反向模式需要仔细协调计算和内存。正向模式只是增强每个计算,而反向模式需要维护正向计算的记录以实现反向传播。现代框架通过计算图和自动梯度累积 21 来完成此任务。

我们将之前的例子扩展到一个小型神经网络计算。请参阅代码列表 7.11 以了解代码结构。

代码列表 7.11:反向模式:神经网络通过在分层计算上进行反向传播来计算梯度。

def simple_network(x, w1, w2):
    # Forward pass
    hidden = x * w1  # First layer multiplication
    activated = max(0, hidden)  # ReLU activation
    output = activated * w2  # Second layer multiplication
    return output  # Final output (before loss)

在正向传播期间,框架不仅计算值。它同时构建一个操作图并跟踪中间结果,如代码列表 7.12 所示。

代码列表 7.12:正向传播:使用线性和非线性变换计算中间状态,以产生最终输出。训练流程:将数据集划分为不同的训练、验证和测试集,以确保模型鲁棒性和无偏评估。

x = 1.0
w1 = 2.0
w2 = 3.0

hidden = 2.0  # x * w1 = 1.0 * 2.0
activated = 2.0  # max(0, 2.0) = 2.0
output = 6.0  # activated * w2 = 2.0 * 3.0

请参阅代码列表 7.13 以了解反向传播期间梯度计算的逐步分解。

代码列表 7.13:反向传播:此代码计算神经网络中的权重梯度,突出了如何通过层反向传播以更新参数。

d_output = 1.0  # Start with derivative of output

d_w2 = activated  # d_output * d(output)/d_w2
# = 1.0 * 2.0 = 2.0
d_activated = w2  # d_output * d(output)/d_activated
# = 1.0 * 3.0 = 3.0

# ReLU gradient: 1 if input was > 0, 0 otherwise
d_hidden = d_activated * (1 if hidden > 0 else 0)
# 3.0 * 1 = 3.0

d_w1 = x * d_hidden  # 1.0 * 3.0 = 3.0
d_x = w1 * d_hidden  # 2.0 * 3.0 = 6.0

此示例说明了几个关键的实施考虑因素:1. 框架必须跟踪操作之间的依赖关系 2. 中间值必须存储以供反向传播使用 3. 梯度计算遵循正向计算的逆拓扑顺序 4. 每个操作都需要正向和反向实现

内存管理策略

内存管理代表了在机器学习框架中实现反向模式微分的一个关键挑战。与正向模式不同,我们可以在进行过程中丢弃中间值,反向模式需要存储正向传播的结果,以便在反向传播期间计算梯度。

此要求在代码列表 7.14 中得到了说明,它扩展了我们的神经网络示例,以突出中间激活必须保留以供梯度计算使用。

代码列表 7.14:反向模式内存管理:在反向传播期间存储中间值以进行梯度计算。

def deep_network(x, w1, w2, w3):
    # Forward pass - must store intermediates
    hidden1 = x * w1
    activated1 = max(0, hidden1)  # Store for backward
    hidden2 = activated1 * w2
    activated2 = max(0, hidden2)  # Store for backward
    output = activated2 * w3
    return output

每个用于梯度计算的中间值必须保存在内存中,直到其反向传递完成。随着网络的加深,这种内存需求会线性增长。对于一个典型的处理图像批次的深度神经网络,这可能意味着需要存储数十亿字节的活动。

框架采用几种策略来管理这种内存负担。其中一种方法在列表 7.15 中展示。

列表 7.15: 内存管理策略: 训练涉及层叠的变换,其中内存被管理以优化性能。检查点允许在训练期间释放中间值,减少内存使用,同时通过解释:代码来保持计算完整性。这强调了在深度学习系统中内存管理和模型复杂度之间的权衡。

def training_step(model, input_batch):
    # Strategy 1: Checkpointing
    with checkpoint_scope():
        hidden1 = activation(layer1(input_batch))
        # Framework might free some memory here
        hidden2 = activation(layer2(hidden1))
        # More selective memory management
        output = layer3(hidden2)

    # Strategy 2: Gradient accumulation
    loss = compute_loss(output)
    # Backward pass with managed memory
    loss.backward()

现代框架自动平衡内存使用和计算速度。它们可能在反向传递期间重新计算某些中间值,而不是存储所有内容,尤其是在内存密集型操作中。这种内存和计算之间的权衡在大型规模训练场景中变得尤为重要。

优化技术

机器学习框架中的反向模式自动微分采用了几种关键优化技术来提高训练效率。当训练大型神经网络,计算和内存资源被推到极限时,这些优化变得至关重要。

现代框架实现了梯度检查点 22,这是一种战略性地平衡计算和内存的技术。这种网络的简化正向传递在列表 7.16 中展示。

列表 7.16: 正向传递: 神经网络通过一系列变换的层来处理输入,以产生输出,突出了深度学习架构的层次性质。

def deep_network(input_tensor):
    # A typical deep network computation
    layer1 = large_dense_layer(input_tensor)
    activation1 = relu(layer1)
    layer2 = large_dense_layer(activation1)
    activation2 = relu(layer2)
    # ... many more layers
    output = final_layer(activation_n)
    return output

框架可以战略性地在反向传递过程中重新计算某些值,而不是存储所有中间激活。列表 7.17 展示了框架如何实现这种内存节省。框架可能只在每几层中保存激活。

列表 7.17: 检查点: 通过在正向传递过程中选择性地存储中间激活来减少内存使用。框架在存储需求和计算效率之间进行平衡,以优化模型训练。

# Conceptual representation of checkpointing
checkpoint1 = save_for_backward(activation1)
# Intermediate activations can be recomputed
checkpoint2 = save_for_backward(activation4)
# Framework balances storage vs recomputation

另一个关键的优化涉及操作融合 23。框架不是单独处理每个数学运算,而是将常见一起发生的操作组合起来。例如,矩阵乘法后跟偏置加法可以融合成一个单一的操作,减少内存传输并提高硬件利用率。

通过重新排序计算以最大化硬件效率来优化反向传播本身。考虑卷积层的梯度计算——而不是直接将数学定义转换为代码,框架实现了专门的反向操作,这些操作利用了现代硬件的能力。

这些优化共同工作,使得大型神经网络的训练变得可行。没有它们,许多现代架构在内存使用和计算时间上都会变得过于昂贵。

自动微分框架实现

将自动微分集成到机器学习框架中需要仔细的系统设计,以平衡灵活性、性能和可用性。现代框架如 PyTorch 和 TensorFlow 通过高级 API 暴露 AD 功能,同时保持复杂的底层机制。

框架通过各种接口向用户呈现 AD。PyTorch 的一个典型例子在列表 7.18 中展示。

列表 7.18:自动微分接口:PyTorch 在神经网络执行过程中透明地跟踪操作,以实现高效的反向传播。训练需要仔细管理梯度和模型参数,突出了自动微分在实现最佳性能中的重要性。

# PyTorch-style automatic differentiation
def neural_network(x):
    # Framework transparently tracks operations
    layer1 = nn.Linear(784, 256)
    layer2 = nn.Linear(256, 10)

    # Each operation is automatically tracked
    hidden = torch.relu(layer1(x))
    output = layer2(hidden)
    return output


# Training loop showing AD integration
for batch_x, batch_y in data_loader:
    optimizer.zero_grad()  # Clear previous gradients
    output = neural_network(batch_x)
    loss = loss_function(output, batch_y)

    # Framework handles all AD machinery
    loss.backward()  # Automatic backward pass
    optimizer.step()  # Parameter updates

虽然这段代码看起来很简单,但它掩盖了相当大的复杂性。框架必须:

  1. 在正向传播过程中跟踪所有操作

  2. 构建和维护计算图

  3. 管理中间值的内存

  4. 高效安排梯度计算

  5. 与硬件加速器接口

这种集成不仅限于基本训练。框架必须处理复杂场景,如高阶梯度,其中我们计算导数的导数,以及混合精度训练。在列表 7.19 中展示了计算二阶导数的能力。

列表 7.19:高阶梯度:二阶梯度揭示了模型参数的变化如何影响一阶梯度,这对于高级优化技术至关重要。

# Computing higher-order gradients
with torch.set_grad_enabled(True):
    # First-order gradient computation
    output = model(input)
    grad_output = torch.autograd.grad(output, model.parameters())

    # Second-order gradient computation
    grad2_output = torch.autograd.grad(
        grad_output, model.parameters()
    )
系统工程突破

尽管自动微分的数学基础几十年前就已经确立,但在机器学习框架中的实际实现代表了重大的系统工程成就。理解这一视角可以阐明为什么自动微分系统推动了深度学习革命。

在自动化系统出现之前,实现梯度计算需要手动推导和编写神经网络中每个操作的梯度。对于一个简单的全连接层,这意味着需要编写单独的前向和后向函数,仔细跟踪中间值,并确保数十个操作中的数学正确性。随着卷积层、注意力机制或自定义操作等架构变得更加复杂,这种手动过程变得容易出错且耗时。

针对这些挑战,自动微分领域的突破不在于数学创新,而在于软件工程。现代框架必须处理内存管理、操作调度、数值稳定性和跨不同硬件的优化,同时保持数学正确性。考虑其复杂性:单个矩阵乘法需要根据哪些输入需要梯度、张量形状、硬件能力和内存限制进行不同的梯度计算。自动微分系统透明地处理这些变化,使研究人员能够专注于模型架构而不是梯度实现的细节。

除了简化现有工作流程外,autograd 系统还使架构创新成为可能,这在手动梯度实现中是不可能的。现代架构如 Transformer 涉及数百个操作,具有复杂的依赖关系。手动计算复杂架构组件、层归一化和残差连接的梯度需要数月的仔细推导和调试。自动微分系统可以正确且高效地计算这些梯度,从而能够快速实验新型架构。

这种系统视角解释了为什么深度学习在框架成熟后加速发展:不是因为数学发生了变化,而是因为软件工程最终使数学能够在大规模上实际应用。前面讨论的计算图提供了基础设施,但自动微分系统提供了正确且高效遍历这些图的智能。

梯度计算中的内存管理

自动微分的内存需求源于一个基本要求:在反向传播期间计算梯度时,我们必须记住正向传播期间发生的事情。这个看似简单的需求为机器学习框架带来了有趣的挑战。与可以一使用完就丢弃中间结果的传统程序不同,AD 系统必须仔细保存计算历史。

这种必要性在列表 7.20 中得到了说明,该列表展示了神经网络正向传播期间发生的情况。

列表 7.20:正向传播:神经网络按顺序计算值,存储中间结果以便反向传播准确计算梯度。

def neural_network(x):
    # Each operation creates values that must be remembered
    a = layer1(x)  # Must store for backward pass
    b = relu(a)  # Must store input to relu
    c = layer2(b)  # Must store for backward pass
    return c

当这个网络处理数据时,每个操作不仅创建其输出,还产生内存需求。层 1 中的乘法操作需要记住其输入,因为计算其梯度时将需要它们。即使是看似简单的 relu 函数也必须跟踪哪些输入是负的,以正确传播梯度。随着网络变深,这些内存需求会累积,如列表 7.21 所示。

在深度神经网络中,这个内存挑战变得特别有趣。

列表 7.21:内存累积:深度神经网络中的每一层都保留着反向传播所需的信息,突显了随着网络加深而增长的内存需求。

# A deeper network shows the accumulating memory needs
hidden1 = large_matrix_multiply(input, weights1)
activated1 = relu(hidden1)
hidden2 = large_matrix_multiply(activated1, weights2)
activated2 = relu(hidden2)
output = large_matrix_multiply(activated2, weights3)

每层的计算都增加了我们的内存负担。框架必须将隐藏 1 保留在内存中,直到通过隐藏 2 计算梯度后,才能安全地丢弃它。这产生了一波内存使用,当开始反向传播时达到峰值,随着我们计算梯度而逐渐消退。

现代框架自动处理这种内存编排。它们跟踪每个中间值的生命周期——它必须保留在内存中的时间,以便进行梯度计算。在训练大型模型时,这种谨慎的内存管理与数值计算本身一样重要。框架一旦不再需要用于梯度计算,就释放内存,确保我们的内存使用,尽管必然很大,但尽可能高效。

生产系统集成挑战

自动微分集成到机器学习框架中提出了重要的系统级考虑因素,这些因素影响框架设计和训练性能。当训练大型神经网络时,这些考虑因素尤其明显,因为每一层的效率都很重要。

如列表 7.22 所示,典型的训练循环处理计算和系统级交互。

列表 7.22:训练流程:机器学习工作流程将数据集划分为训练集、验证集和测试集,以确保稳健的模型开发和无偏评估。

def train_epoch(model, data_loader):
    for batch_x, batch_y in data_loader:
        # Moving data between CPU and accelerator
        batch_x = batch_x.to(device)
        batch_y = batch_y.to(device)

        # Forward pass builds computational graph
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)

        # Backward pass computes gradients
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

这个简单的循环掩盖了复杂的系统交互。自动微分系统必须与多个框架组件协调:内存分配器、设备管理器、操作调度器和优化器。每次梯度计算都可能触发设备之间、内存分配以及在加速器上的内核启动之间的数据移动。

列表 7.23 展示了在现代硬件加速器上调度自动微分操作的示例。

列表 7.23:并行计算:操作可以在神经网络中并发运行,说明了有效组合结果需要同步。通过以下代码

def parallel_network(x):
    # These operations could run concurrently
    branch1 = conv_layer1(x)
    branch2 = conv_layer2(x)

    # Must synchronize for combination
    combined = branch1 + branch2
    return final_layer(combined)

AD 系统必须跟踪依赖关系,不仅是为了正确的梯度计算,还要为了高效的硬件利用。它需要确定哪些梯度计算可以并行运行,哪些必须等待其他计算完成。这种依赖关系跟踪跨越了正向和反向传播,从而产生了一个复杂的调度问题。

现代框架在保持用户简单接口的同时处理这些系统级关注点。在幕后,它们在操作调度、内存分配和数据移动方面做出复杂的决策,同时确保通过计算图进行正确的梯度计算。

这些系统级关注点展示了现代框架所处理的复杂工程,使开发者能够专注于模型设计,而不是底层实现细节。

框架特定的微分策略

虽然自动微分原理在各个框架中保持一致,但实现方法差异很大,这直接影响研究工作流程和开发体验。理解这些差异有助于开发者选择合适的框架,并解释他们在实践中观察到的性能特征。

PyTorch 的动态自动微分系统

PyTorch 通过基于动态带的系统实现自动微分,在执行过程中构建计算图。这种方法直接支持前面动态图部分讨论的研究工作流程和调试能力。

列表 7.24 展示了 PyTorch 在正向执行过程中透明地跟踪梯度的方法。

列表 7.24:PyTorch Autograd 实现:正向传播期间的动态带构建使得梯度计算透明,并具有即时的调试能力。

import torch

# PyTorch builds computational graph during execution
x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)

# Each operation adds to the dynamic tape
z = x * y  # Creates MulBackward node
w = z + x  # Creates AddBackward node
loss = w**2  # Creates PowBackward node

# Graph exists only after forward pass completes
print(f"Computation graph: {loss.grad_fn}")
# Output: <PowBackward0 object>

# Backward pass traverses the dynamically built graph
loss.backward()
print(f"dx/dloss = {x.grad}")  # Immediate access to gradients
print(f"dy/dloss = {y.grad}")

PyTorch 的动态方法为研究工作流程提供了几个优势。操作自动跟踪,无需预先定义图,使得 Python 控制流(如条件语句和循环)自然实现。反向传播完成后,梯度立即可用,支持交互式调试和实验。

动态带系统也自然地处理可变长度的计算。列表 7.25 展示了 PyTorch 如何适应运行时确定的计算图。

列表 7.25:动态长度计算:PyTorch 的 autograd 自然地处理变量计算模式,使得模型架构能够灵活地适应输入特征。

def dynamic_model(x, condition):
    # Computation graph varies based on runtime conditions
    hidden = torch.relu(torch.mm(x, weights1))

    if condition > 0.5:  # Runtime decision affects graph structure
        # More complex computation path
        hidden = torch.relu(torch.mm(hidden, weights2))
        hidden = torch.relu(torch.mm(hidden, weights3))

    output = torch.mm(hidden, final_weights)
    return output


# Different calls create different computational graphs
result1 = dynamic_model(input_data, 0.3)  # Shorter graph
result2 = dynamic_model(input_data, 0.7)  # Longer graph

# Both handle backpropagation correctly despite different structures

这种灵活性伴随着内存和计算开销。PyTorch 必须在反向传播完成之前将整个计算图保持在内存中,并且梯度计算不能从需要完整图分析的全球图优化中受益。

TensorFlow 的静态图优化

TensorFlow 对自动微分的传统方法利用静态图分析来实现激进的优化。虽然 TensorFlow 2.x 默认使用即时执行,但理解静态图方法可以阐明灵活性和优化之间的权衡。

历史背景:TensorFlow 1.x 代码

以下示例使用 TensorFlow 1.x 风格的代码,包括placeholderSessionfeed_dict模式。这些 API 在 TensorFlow 2.x 中已弃用,TensorFlow 2.x 默认使用即时执行。我们包括这些示例是因为(1)它们清楚地说明了图和即时执行之间的概念差异,(2)你可能会遇到使用这些模式的遗留代码库,以及(3)理解图执行有助于解释为什么现代框架如tf.function存在。

列表 7.26 展示了 TensorFlow 的静态图微分,它将图构建与执行分离。

列表 7.26:TensorFlow 1.x 静态图 AD:在图构建期间进行符号微分,可以启用全局优化和高效的重复执行。

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

# Graph definition phase - no actual computation
x = tf.placeholder(tf.float32, shape=())
y = tf.placeholder(tf.float32, shape=())

# Define computation symbolically
z = x * y
w = z + x
loss = w**2

# Symbolic gradient computation during graph construction
gradients = tf.gradients(loss, [x, y])

# Execution phase - actual computation occurs
with tf.Session() as sess:
    # Same graph can be executed multiple times efficiently
    for step in range(1000):
        grad_vals, loss_val = sess.run(
            [gradients, loss], feed_dict={x: 2.0, y: 3.0}
        )
        # Optimized execution with compiled kernels

静态图方法使动态系统无法实现的强大优化成为可能。TensorFlow 可以分析完整的梯度计算图,并应用操作融合、内存布局优化和并行执行调度。这些优化可以为大型模型提供 2-3 倍的性能提升。

静态图还使高效的重复执行成为可能。一旦编译,相同的图可以以最小的开销处理多个批次,这使得静态图在处理许多请求的相同模型结构的生产服务中特别有效。

然而,这种方法在历史上需要更复杂的调试工作流程,并且对动态计算模式缺乏灵活性。现代 TensorFlow 通过即时执行来解决这些限制,同时通过tf.function编译保持静态图功能。

JAX 的函数微分

JAX 基于函数编程原则和程序转换的方法对自动微分采取了根本不同的方法。这种方法与 JAX 的函数编程哲学相一致,这在框架比较部分将进一步讨论。

列表 7.27 展示了 JAX 基于转换的微分方法。

列表 7.27:JAX 函数微分:程序转换方法使前向和反向模式微分具有数学透明性和可组合性。

import jax
import jax.numpy as jnp


# Pure function definition
def compute_loss(params, x, y):
    z = x * params["w1"] + y * params["w2"]
    return z**2


# JAX transforms functions rather than tracking operations
grad_fn = jax.grad(compute_loss)  # Returns gradient function
value_and_grad_fn = jax.value_and_grad(compute_loss)

# Multiple gradient modes available
forward_grad_fn = jax.jacfwd(compute_loss)  # Forward mode
reverse_grad_fn = jax.jacrev(compute_loss)  # Reverse mode

# Function transformations compose naturally
batched_grad_fn = jax.vmap(grad_fn)  # Vectorized gradients
jit_grad_fn = jax.jit(grad_fn)  # Compiled gradients

# Execution with immutable parameters
params = {"w1": 2.0, "w2": 3.0}
gradients = grad_fn(params, 1.0, 2.0)
print(f"Gradients: {gradients}")

JAX 的函数方法提供了几个独特的优势。同一个函数可以根据不同的微分模式、执行模式和优化策略进行转换。前向和反向模式微分同样容易访问,可以根据问题特性进行最佳选择。

转换方法还使强大的组合模式成为可能。列表 7.28 展示了不同的转换如何自然地结合。

列表 7.28:JAX 转换组合:多个程序转换可以自然组合,通过简单的函数组合实现复杂的优化。

# Compose multiple transformations
def model_step(params, batch_x, batch_y):
    predictions = model_forward(params, batch_x)
    return compute_loss(predictions, batch_y)


# Build complex training function through composition
batch_grad_fn = jax.vmap(jax.grad(model_step), in_axes=(None, 0, 0))
compiled_batch_grad_fn = jax.jit(batch_grad_fn)
parallel_batch_grad_fn = jax.pmap(compiled_batch_grad_fn)

# Result: vectorized, compiled, parallelized gradient function
# Created through simple function transformations

这种函数式方法需要不可变的数据结构和纯函数,但能够对程序转换进行数学推理,这在有状态系统中是不可能的。

研究生产力和创新加速

这些实现差异对研究生产力和开发工作流程有直接影响。PyTorch 的动态方法加速了实验和调试,但可能需要针对生产部署进行优化。TensorFlow 的静态图功能提供了生产就绪的性能,但历史上需要更多结构化的开发方法。JAX 的功能转换能够实现强大的数学抽象,但需要函数式编程的纪律。

理解这些权衡有助于研究人员选择适合他们特定用例的框架,并解释他们在开发和部署期间观察到的性能特征。动态灵活性、静态优化和函数式转换之间的选择通常取决于项目优先级:快速实验、生产性能或数学优雅。

自动微分系统设计原则

自动微分系统将数学概念中的导数转换为高效的实现。通过检查正向和反向模式,我们可以看到框架如何在现代神经网络训练中平衡数学精度和计算效率。

自动微分系统的实现揭示了机器学习框架中的关键设计模式。其中一种模式在列表 7.29 中展示。

列表 7.29:AD 机制:框架通过代码跟踪操作,在训练期间进行高效的反向传递。此示例强调了跟踪中间计算以实现有效的梯度计算的重要性,这是机器学习系统中自动微分的核心方面。

def computation(x, w):
    # Framework tracks operations
    hidden = x * w  # Stored for backward pass
    output = relu(hidden)  # Tracks activation pattern
    return output

这个简单的计算体现了几个基本概念:

  1. 导数计算的跟踪操作

  2. 中间值的内存管理

  3. 系统协调以实现高效执行

如列表 7.30 所示,现代框架在保持高性能的同时,在干净的接口后面抽象了这些复杂性。

列表 7.30:最小 API:通过跟踪正向计算和高效计算梯度,简化了自动微分,从而实现有效的模型优化。

loss = model(input)  # Forward pass tracks computation
loss.backward()  # Triggers efficient reverse mode AD
optimizer.step()  # Uses computed gradients

自动微分系统的有效性源于其对竞争需求的精心平衡。它们必须在保持足够的计算历史以获得准确梯度的同时管理内存限制,高效调度操作同时保持正确性,并在优化性能的同时提供灵活性。

理解这些系统对于框架开发者和实践者来说至关重要。框架开发者必须实现高效的 AD 以支持现代深度学习,而实践者在设计和训练模型时从理解 AD 的能力和限制中受益。

自动微分提供了基于梯度的学习的计算基础,但其实际应用高度依赖于框架如何组织和操作数据。这引出了我们接下来的主题:在机器学习框架中实现高效计算和内存管理的数据结构。这些结构不仅必须支持 AD 操作,还必须为现代机器学习所依赖的多样化硬件平台提供高效的访问模式。

未来框架架构方向

我们所探讨的自动微分系统为神经网络训练提供了计算基础,但它们并非独立运作。这些系统需要高效的方式来表示和操作通过它们的数据流。这引出了我们接下来的主题:机器学习框架用来组织和处理信息的那些数据结构。

考虑我们之前示例中如何处理数值(列表 7.31)。

列表 7.31:层叠变换:神经网络通过在输入数据上执行顺序操作来计算输出,说明了权重和激活函数如何影响最终预测。数值在神经网络计算中被处理,突出了权重乘法和激活函数的作用。通过数据流:以下代码

def neural_network(x):
    hidden = w1 * x  # What exactly is x?
    activated = relu(hidden)  # How is hidden stored?
    output = w2 * activated  # What type of multiplication?
    return output

这些操作看似简单,但它们提出了重要的问题。框架如何表示这些值?它们如何组织数据以实现高效计算和自动微分?它们如何构建数据结构以利用现代硬件?

下一节将探讨框架如何通过专门的数据结构,特别是张量,来回答这些问题,张量是机器学习计算的基本构建块。

数据结构

机器学习框架通过扩展计算图与专门的数据结构相结合,将高级计算与实际实现相连接。这些数据结构有两个基本目的:它们为驱动机器学习模型的数值数据提供容器,并管理这些数据在不同内存空间和设备之间的存储和移动。

虽然计算图指定了操作的逻辑流程,但数据结构决定了这些操作如何在内存中实际访问和操作数据。这种在组织数值数据以供模型计算的同时处理内存管理和设备放置复杂性的双重角色,决定了框架如何将数学运算转换为在多样化的计算平台上的高效执行。

机器学习框架的有效性在很大程度上取决于其底层的数据组织。虽然机器学习理论可以通过数学方程式表达,但将这些方程式转化为实际实现需要仔细考虑数据组织、存储和处理。现代机器学习模型在训练和推理过程中必须处理大量数据,这使得在多样化的硬件平台上实现高效的数据访问和内存使用变得至关重要。

框架的数据结构必须在三个关键领域表现出色。首先,它们必须提供高性能,支持在不同硬件上快速的数据访问和高效的内存使用。这包括优化内存布局以提高缓存效率,并允许在不同内存层次结构和设备之间实现平滑的数据传输。其次,它们必须提供灵活性,以适应各种模型架构和训练方法,同时支持不同的数据类型和精度要求。第三,它们应该为开发者提供清晰直观的接口,同时在幕后处理复杂的内存管理和设备放置。

这些数据结构架起了数学概念和实际计算系统之间的桥梁。机器学习中的操作,如矩阵乘法、卷积和激活函数,为数据组织设定了基本要求。这些结构必须在保持数值精度和稳定性的同时,实现常见操作的高效实现和自动梯度计算。然而,它们也必须在现实世界的计算约束下工作,处理有限的内存带宽、变化的硬件能力和分布式计算的需求。

在实现这些数据结构时所做的设计选择,在很大程度上影响了机器学习框架能够实现什么。在数据结构设计上的不良决策可能导致过度使用内存,限制模型大小和批量处理能力。它们可能会创建性能瓶颈,减慢训练和推理速度,或者产生易于编程错误的接口。另一方面,深思熟虑的设计能够实现内存使用和计算的自动优化,跨硬件配置的高效扩展,以及支持快速实现新技术直观的编程接口。

通过探索特定的数据结构,我们将研究框架如何通过精心设计决策和优化方法来应对这些挑战。这种理解对于使用机器学习系统的从业者至关重要,无论是开发新模型、优化现有模型还是创建新的框架功能。分析从张量抽象开始,这是现代机器学习框架的基本构建块,然后探索更专业的结构,用于参数管理、数据集处理和执行控制。

张量

张量是多维数组,在机器学习系统中作为基本的数据结构,提供了对标量、向量、矩阵以及更高维数据的统一表示,并具有硬件优化的操作

机器学习框架将数值数据作为张量进行处理和存储。神经网络中的每一次计算,从处理输入数据到更新模型权重,都是在张量上进行的。训练图像批次、卷积网络中的激活图以及在反向传播过程中的参数梯度都采取了张量的形式。这种统一的表示方式使得框架能够实现数据操作的一致接口,并优化不同硬件架构上的操作。

张量结构和维度

张量是一个数学对象,它将标量、向量和矩阵推广到更高维度。维度形成一个自然的层次结构:标量是一个包含单个值的零维张量,向量是一个包含一系列值的单维张量,矩阵是一个包含按行和列排列的值的二维张量。更高维的张量通过嵌套结构扩展这一模式;例如,如图图 7.7 所示,一个三维张量可以表示为矩阵的堆叠。因此,向量和矩阵可以被认为是具有 1D 和 2D 维度的张量的特殊情况。

图 7.7:三维张量:高阶张量通过在嵌套结构中排列数据来扩展标量、向量和矩阵的概念;此图将三维张量表示为矩阵的堆叠,从而能够表示复杂的多维数据关系。阶数大于二的高阶张量对于在图像处理和自然语言处理等领域表示数据至关重要,这些领域的数据具有固有的多维结构。

在实际应用中,处理复杂数据结构时自然会涌现出张量。如图图 7.8 所示,图像数据特别有效地说明了这一概念。彩色图像由三个通道组成,每个通道代表红色、绿色或蓝色的强度值,作为一个独立的矩阵。这些通道组合在一起形成完整的彩色图像,形成一个自然的 3D 张量结构。在同时处理多个图像的情况下,例如在批量操作中,可以添加一个第四维来创建 4D 张量,其中每个切片代表一个完整的三个通道图像。这种层次结构展示了张量如何有效地处理多维数据,同时保持清晰的结构的关联性。

图片

图 7.8:多维数据表示:图像自然映射到张量,其维度代表图像高度、宽度和颜色通道,形成一个三维数组;堆叠多个图像创建一个第四维以进行批量处理和高效计算。来源:niklas lang towardsdatascience.com/what-are-tensors-in-machine-learning-5671814646ff

在机器学习框架中,张量除了其数学定义之外还具备额外的属性,以满足现代机器学习系统的需求。虽然数学张量提供了作为具有变换属性的多维数组的基石,但机器学习引入了实际计算的要求。这些要求决定了框架如何在数学精度和计算性能之间取得平衡。

框架张量将数值数据数组和计算元数据相结合。其维度结构,或形状,范围从简单的向量和矩阵到表示复杂数据(如图像批次或序列模型)的高维数组。这种维度信息在操作验证和优化中起着关键作用。例如,矩阵乘法操作依赖于形状元数据来验证维度兼容性并确定最佳计算路径。

内存布局实现为张量设计引入了独特的挑战。虽然张量提供了多维数据的抽象,但物理计算机内存仍然是线性的。步长模式通过在多维张量索引和线性内存地址之间创建映射来解决这种差异。这些模式通过确定张量操作期间的内存访问模式,对计算性能产生重大影响。图 7.9 使用 2×3 张量演示了这一概念,显示了行主序和列主序内存布局及其相应的步长计算。

图片

图 7.9:张量内存布局:2×3 的张量可以使用行主序(C 风格)或列主序(Fortran 风格)的顺序存储在线性内存中。步长定义了在通过内存移动时每个维度需要跳过的元素数量,使得框架能够计算张量[i,j]的内存地址为基本地址 + i×步长[0] + j×步长[1]。内存布局的选择对缓存性能和计算效率有重大影响。

理解这些内存布局模式对于框架性能优化至关重要。行主序布局(由 NumPy、PyTorch 使用)按行存储元素,使得行操作更友好地使用缓存。列主序布局(由一些 BLAS 库使用)按列存储元素,优化列访问模式。步长值编码了这种布局信息:对于 2×3 的张量,行主序布局中移动到下一行需要跳过 3 个元素(步长[0]=3),而移动到下一列需要跳过 1 个元素(步长[1]=1)。

将步长模式与硬件内存层次结构进行仔细对齐,可以最大化缓存效率和内存吞吐量,最优布局可以达到理论内存带宽的 80-90%(在现代 GPU 上通常是 100-500GB/s),而次优模式可能只能达到 20-30%的利用率。

类型系统和精度

张量实现使用类型系统来控制数值精度和内存消耗。在机器学习中,标准的选项一直是 32 位浮点数(float32),在精度和效率之间提供了平衡。现代框架通过为不同需求提供多种数值类型来扩展这一点。整数类型支持索引和嵌入操作。低精度类型,如 16 位浮点数,可以实现高效的移动部署。8 位整数允许在专用硬件上进行快速推理。

数值类型的选择会影响模型行为和计算效率。神经网络训练通常需要 float32 精度以保持稳定的梯度计算。推理任务通常可以使用较低精度(int8甚至int4),减少内存使用并提高处理速度。混合精度训练方法通过使用 float32 进行关键累积,同时在较低精度下执行大多数计算来结合这些优点。

之间不同数值表示的类型转换需要谨慎管理。对具有不同类型的张量进行操作需要显式的转换规则以保持数值正确性。这些转换引入了计算成本并可能导致精度损失。框架提供类型转换功能,但依赖于开发者保持操作过程中的数值精度。

设备和内存管理

异构计算的兴起改变了机器学习框架管理张量操作的方式。现代框架必须无缝地在 CPU、GPU、TPU 和各种其他加速器之间运行,每个都提供不同的计算优势和内存特性。这种多样性创造了一个基本挑战:张量必须在执行机器学习工作负载的过程中高效地在设备之间移动,同时保持计算一致性。

设备放置决策显著影响计算性能和内存利用率。在设备之间移动张量会引入延迟成本,并消耗系统互连上的宝贵带宽。在多个设备上保持张量的多个副本可以通过减少数据移动来加速计算,但这种策略会增加整体内存消耗,并需要仔细管理副本之间的一致性。因此,框架必须实施复杂的内存管理系统,以跟踪张量位置并协调数据移动,同时考虑这些权衡。

这些内存管理系统维护可用设备内存的动态视图,并实施有效的数据传输策略。当操作需要位于不同设备上的张量时,框架必须移动数据或重新分配计算。这个决策过程与框架的计算图执行和操作调度深度集成。单个设备上的内存压力、数据传输成本和计算负载都会影响放置决策。现代系统必须优化数据传输速率,从 CPU-GPU 通信的 PCIe Gen4 的 32GB/s 到 GPU-to-GPU 传输的 NVLink 的 600GB/s,网络互连通常为跨节点通信提供 10-100Gbps。

设备放置与内存管理之间的相互作用不仅限于简单的数据移动。框架必须预测未来的计算需求,以有效地预取数据,管理跨设备内存碎片化,并处理内存需求超过设备能力的情况。这需要在内存管理系统和操作调度器之间进行紧密协调,尤其是在涉及跨多个设备的并行计算或跨机器边界分布式训练的场景中。有效的预取策略可以通过将数据移动与计算重叠来隐藏延迟成本,即使在单个传输仅以峰值带宽的 10-20%运行时,也能保持持续的吞吐量。

领域特定数据组织

虽然张量是机器学习框架的构建块,但它们并不是有效系统操作所需的所有结构。框架依赖于一系列专门的数据结构,这些结构针对数据处理、模型参数管理和执行协调的独特需求进行了定制。这些结构确保整个工作流程,从原始数据摄取到硬件上的优化执行,都能无缝且高效地进行。

数据集结构

数据集结构处理将原始输入数据转换为适合机器学习计算格式的关键任务。这些结构无缝地将各种数据源与模型所需的张量抽象连接起来,自动化读取、解析和预处理数据的过程。

数据集结构必须支持高效的内存使用,同时处理一次无法全部装入内存的大量输入数据。例如,在训练大型图像数据集时,这些结构从磁盘加载图像,将它们解码成与张量兼容的格式,并在实时应用归一化或增强等转换。框架实现数据流、缓存和洗牌等机制,以确保预处理批次供应稳定,无瓶颈。

数据集结构的设计直接影响训练性能。设计不良的结构可能会产生显著的开销,限制数据吞吐量到 GPU 或其他加速器。相比之下,优化的数据集处理可以利用 CPU 核心、磁盘 I/O 和内存传输的并行性,以全容量向加速器提供数据。现代训练管道必须维持 1-10GB/s 的数据加载速率,以匹配 GPU 的计算吞吐量,这需要仔细优化存储 I/O 模式和预处理管道。框架通过并行数据加载、批预取和高效的数据格式选择(例如,优化的格式可以将加载开销从训练时间的 80%降低到 10%以下)等技术来实现这一点。

在大型、多系统分布式训练场景中,数据集结构还处理节点间的协调,确保每个工作器处理数据的不同子集,同时在洗牌等操作中保持一致性。这种协调防止了重复计算,并支持跨多个设备和机器的可扩展性。

参数结构

参数结构存储定义机器学习模型的数值。这包括神经网络层的权重和偏差,以及辅助数据,如批归一化统计信息和优化器状态。与数据集不同,参数在模型训练和推理的生命周期中持续存在。

参数结构的设计必须在计算期间的快速访问与高效存储之间取得平衡。例如,卷积神经网络需要滤波器、全连接层和归一化层的参数,每个都有独特的形状和内存对齐要求。框架将这些参数组织成紧凑的表示,以最小化内存消耗并实现快速读写操作。

参数结构的一个关键挑战是在多个设备之间高效地管理内存(M. Li 等人,2014)。在分布式训练期间,框架可能会在 GPU 之间复制参数以实现并行计算,同时在 CPU 上保持同步的主副本。这种策略确保了一致性,同时减少了梯度更新的延迟。参数结构通常利用内存共享技术来最小化重复,例如将梯度优化器状态存储在原地以节省内存。参数同步的通信成本可能很大。在 8 个 GPU 上同步一个 7B 参数模型需要传输大约 28GB 的梯度(假设 FP32 精度),在 25Gbps 的网络速度下,不进行优化就需要超过 9 秒,这突显了为什么框架实现梯度压缩和高效的通信模式,如环形全归约。

参数结构也必须适应各种精度要求。虽然训练通常使用 32 位浮点精度以确保稳定性,但为了推理和大规模训练,越来越使用 16 位浮点精度甚至 8 位整数精度。框架通过实现类型转换和混合精度管理来启用这些优化,同时不牺牲数值精度。

执行结构

执行结构协调如何在硬件上执行计算,确保操作在尊重设备约束的同时高效执行。这些结构与计算图紧密合作,确定数据如何通过系统流动以及如何为中间结果分配内存。

执行结构的主要角色之一是内存管理。在训练或推理期间,如激活图或梯度等中间计算可能会消耗大量内存。执行结构动态分配和释放内存缓冲区,以避免碎片化并最大化硬件利用率。例如,深度神经网络可能会跨层重用为激活图分配的内存,从而减少整体内存占用。

这些结构还处理操作调度,确保计算以正确的顺序和最优的硬件利用率执行。例如,在 GPU 上,执行结构可以重叠计算和数据传输操作,隐藏延迟并提高吞吐量。在多个设备上运行时,它们同步依赖的计算以避免不必要的延迟,同时保持一致性。

分布式训练引入了额外的复杂性,因为执行结构必须在多个节点上管理数据和计算。这包括划分计算图、同步梯度和根据需要重新分配数据。高效的执行结构最小化通信开销,使得分布式系统可以随着额外硬件的增加而线性扩展(McMahan 等人 2017b)。图 7.10 展示了分布式训练如何在一个加速器网格上定义,以在多个维度上并行化以提高吞吐量。

图 7.10:3D 并行性:通过在多个维度(数据、管道阶段和模型层)上划分计算,分布式训练通过扩展吞吐量。这允许在加速器网格上并发执行。这种方法通过在设备之间重叠计算和通信来最小化通信开销并最大化硬件利用率。

编程和执行模型

开发者编写代码(编程模型)的方式与框架执行它的方式(执行模型)紧密相关。理解这种关系揭示了为什么不同的框架会做出不同的设计权衡,以及这些决策如何影响开发体验和系统性能。这种统一的视角展示了编程范式如何直接映射到执行策略,从而形成具有不同框架特性的独特框架,这些特性影响着从调试工作流程到生产优化的各个方面。

在机器学习框架中,我们可以识别出三种主要范式,它们将编程风格与执行策略相结合:具有即时执行的命令式编程、具有图执行的符号编程和具有即时编译(JIT)的混合方法。每种方法都代表了开发者灵活性系统优化能力之间不同的平衡。

声明式模型定义和优化执行

符号编程涉及首先构建计算的抽象表示,然后执行它们。这种编程范式直接映射到图执行,其中框架在执行开始之前构建一个完整的计算图。符号编程与图执行的紧密耦合在需要开发者从完整的计算工作流程的角度思考的同时,提供了强大的优化机会。

例如,在符号编程中,变量和操作表示为符号。这些符号表达式在明确执行之前不会进行评估,允许框架在运行之前分析和优化计算图。

考虑列表 7.32 中的符号编程示例。

列表 7.32:符号计算(TensorFlow 1.x):符号表达式在执行前不进行即时评估,允许在机器学习工作流程中执行前进行优化。

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

# Expressions are constructed but not evaluated
weights = tf.Variable(tf.random.normal([784, 10]))
input_data = tf.placeholder(tf.float32, [None, 784])
output = tf.matmul(input_data, weights)

# Separate evaluation phase
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(output, feed_dict={input_data: data})

这种方法使框架能够在整个计算上应用全局优化,使其在部署场景中效率更高。静态图可以序列化并在不同的环境中执行,增强了可移植性。预定义的图也促进了高效的并行执行策略。然而,调试可能具有挑战性,因为错误通常在执行过程中而不是在图构建时出现,并且动态修改静态图比较繁琐。

带即时执行的交互式开发

命令式编程采用更传统的做法,在遇到操作时立即执行。这种编程范式直接映射到即时执行,其中操作在调用时立即计算。命令式编程与即时执行之间的联系创建了在执行过程中演变的动态计算图,以牺牲优化机会为代价提供了灵活性。

在这种编程范式下,计算在代码执行时直接进行,与大多数通用编程语言的程序化风格非常相似。这可以在列表 7.33 中看到,其中每个操作都是立即评估的。

列表 7.33:命令式执行:每个操作在代码运行时立即评估,突出了计算如何在动态计算图中逐步进行。

# Each expression evaluates immediately
weights = torch.randn(784, 10)
input = torch.randn(32, 784)
output = input @ weights  # Computation occurs now

立即执行模型直观且符合常见的编程实践,使其更容易使用。错误可以在执行过程中立即检测和解决,简化了调试。动态图允许即时调整,对于需要可变图结构的任务(如强化学习或序列建模)非常理想。然而,在运行时创建动态图可能会引入计算开销,并且由于逐步执行过程,框架优化整个计算图的能力受到限制。

性能与开发生产力的平衡

在符号编程和命令式编程模型之间的选择显著影响机器学习框架如何管理系统级特性,如内存管理和优化策略。

性能考虑

在符号编程中,框架可以在一开始就分析整个计算图。这允许采用高效的内存分配策略。例如,内存可以用于在计算后期阶段不再需要的中间结果。这种全局视角还使得高级优化技术,如操作融合、自动微分和针对特定硬件的内核选择成为可能。这些优化使得符号编程在性能至关重要的生产环境中非常有效。

相比之下,命令式编程使得内存管理和优化更具挑战性,因为决策必须在运行时做出。每个操作立即执行,这阻止了框架对计算进行全局分析。然而,这种权衡为开发者提供了更大的灵活性,并在开发过程中提供了即时反馈。除了系统级特性之外,编程模型的选择还会影响开发者体验,尤其是在模型开发和调试期间。

开发和调试

符号编程要求开发者将他们的模型概念化为完整的计算图。这通常需要额外的步骤来检查中间值,因为符号执行将计算推迟到显式调用。例如,在 TensorFlow 1.x 中,开发者必须使用会话和 feed 字典来调试中间结果,这可能会减慢开发过程。

命令式编程提供了一个更直接的调试体验。操作立即执行,允许开发者随着代码的运行检查张量值和形状。这种即时反馈简化了实验,并使得识别和修复模型中的问题变得更加容易。因此,命令式编程非常适合快速原型设计和迭代模型开发。

管理权衡

符号编程和命令式编程模型之间的选择通常取决于项目的具体需求。符号编程在性能和优化至关重要的场景中表现出色,例如生产部署。相比之下,命令式编程提供了研究和开发所需的灵活性和易用性。

通过运行时编译进行自适应优化

现代框架已经认识到,在编程范式之间的选择不一定是二元的。混合方法通过即时编译(JIT)结合了两种范式的优点,允许开发者以命令式风格编写代码,同时实现图执行的性能优势。

JIT 编译代表了编程和执行模型的现代综合。开发者编写自然、命令式的代码,在开发和调试期间急切执行,但框架可以自动将频繁执行的代码路径转换为优化后的静态图,以用于生产部署。这种方法提供了两者的最佳结合:直观的开发体验和优化的执行性能。

这种混合方法的例子包括 TensorFlow 的tf.function装饰器,它将命令式 Python 函数转换为优化的图执行,以及 PyTorch 的torch.jit.script,它将动态 PyTorch 模型编译成静态图。JAX 通过其jit转换进一步发展,提供了自动图编译和优化。

这些混合方法展示了现代框架如何超越了传统的符号与命令式之间的分歧,认识到编程模型和执行模型可以解耦,以提供开发者和系统性能。

执行模型技术实现

在确立了三种主要的编程-执行范式之后,我们可以检查它们的实现特性和性能影响。每个范式都涉及特定的权衡,包括内存管理、优化能力和开发工作流程,这些都会直接影响系统性能和开发者生产力。

急切执行

急切执行是最直接且直观的执行范式。在这个模型中,操作会立即在代码中被调用时执行。这种方法与传统命令式编程语言的工作方式非常相似,因此对许多开发者来说都很熟悉。

列表 7.34 展示了急切执行,其中操作是立即评估的。

列表 7.34:急切执行:操作在代码中被调用时立即评估,提供更直观和灵活的开发体验。

import tensorflow as tf

x = tf.constant([[1.0, 2.0], [3.0, 4.0]])
y = tf.constant([[1, 2], [3, 4]])
z = tf.matmul(x, y)
print(z)

在这个代码片段中,每行都是顺序执行的。当我们创建张量xy时,它们会立即在内存中实例化。矩阵乘法tf.matmul(x, y)立即计算,并将结果存储在z中。当我们打印z时,我们立即看到计算的结果。

急切执行提供了几个优点。它提供了即时反馈,允许开发者轻松检查中间值。这使得调试更加直接和直观。它还允许代码结构更加动态和灵活,因为计算图可以随着每次执行而改变。

然而,急切执行也有其权衡。由于操作是立即执行的,框架优化整体计算图的机会较少。这可能导致与更优化的执行范式相比性能较低,尤其是在处理复杂模型或大数据集时。

贪婪执行特别适合研究、交互式开发和快速原型设计。它允许数据科学家和研究人员快速迭代他们的想法并立即看到结果。许多现代 ML 框架,包括 TensorFlow 2.x 和 PyTorch,由于其开发者友好的特性,使用贪婪执行作为默认模式。

图执行

图执行,也称为静态图执行,在 ML 框架中对计算操作采取了不同的方法。在这个范式下,开发者首先定义整个计算图,然后作为一个单独的步骤执行它。

列表 7.35 通过 TensorFlow 1.x 风格的示例说明了图执行。

列表 7.35:图执行(TensorFlow 1.x):定义了一个计算图,并提供基于会话的评估来执行它,突出了图定义与执行之间的分离。

import tensorflow.compat.v1 as tf

tf.disable_eager_execution()

# Define the graph
x = tf.placeholder(tf.float32, shape=(2, 2))
y = tf.placeholder(tf.float32, shape=(2, 2))
z = tf.matmul(x, y)

# Execute the graph
with tf.Session() as sess:
    result = sess.run(
        z,
        feed_dict={x: [[1.0, 2.0], [3.0, 4.0]], y: [[1, 2], [3, 4]]},
    )
    print(result)

在这个代码片段中,我们首先定义我们计算的结构。placeholder 操作在图中创建用于输入数据的节点,而 tf.matmul 创建表示矩阵乘法的节点。在定义阶段不会发生任何实际计算。

当我们创建会话并调用 sess.run() 时,图执行发生。此时,我们通过 feed_dict 参数提供实际输入数据。然后框架拥有完整的图,可以在运行计算之前进行优化。

图执行提供了几个优点。它允许框架提前看到整个计算过程,从而实现全局优化,这可以提高性能,特别是对于复杂模型。一旦定义,图可以轻松保存并部署到不同的环境中,增强可移植性。它特别适用于相同的计算多次重复使用不同数据输入的场景。

然而,图执行也有其权衡之处。它要求开发者从构建图的角度思考,而不是编写顺序操作,这可能不太直观。调试可能更具挑战性,因为错误通常只有在图执行时才会出现。使用静态图实现动态计算可能更困难。

图执行非常适合生产环境,在这些环境中性能和部署一致性至关重要。它通常用于涉及大规模分布式训练以及在高吞吐量应用中部署模型进行预测的场景。

动态代码生成和优化

智能即时编译 24 是贪婪执行和图执行之间的折中方案。这个范式旨在结合贪婪执行的灵活性和图优化的性能优势。

列表 7.36 展示了在 PyTorch 中脚本函数是如何编译和重用的。

列表 7.36:PyTorch JIT 编译:编译脚本函数以实现高效重用,展示了即时编译如何在机器学习工作流程中平衡灵活性和性能。

import torch


@torch.jit.script
def compute(x, y):
    return torch.matmul(x, y)


x = torch.randn(2, 2)
y = torch.randn(2, 2)

# First call compiles the function
result = compute(x, y)
print(result)

# Subsequent calls use the optimized version
result = compute(x, y)
print(result)

在这个代码片段中,我们定义了一个名为compute的函数,并用@torch.jit.script装饰器装饰它。这个装饰器告诉 PyTorch 使用其 JIT 编译器编译函数。第一次调用compute时,PyTorch 分析函数,优化它,并生成高效的机器代码。这种编译过程发生在函数执行之前,因此得名“即时”。

后续对compute的调用将使用优化版本,可能提供显著的性能提升,尤其是在复杂操作或重复调用时。

JIT 编译在开发灵活性运行时性能之间提供了平衡。它允许开发者以自然、急切风格的方式编写代码,同时仍然受益于与图执行相关联的许多优化。

这种方法提供了几个优点。它保持了急切执行立即反馈和直观调试的特点,因为大部分代码仍然以急切方式执行。同时,它可以为计算的关键部分带来性能提升。JIT 编译还可以适应特定的数据类型和形状,可能产生比静态图编译更高效的代码。

然而,JIT 编译也有一些考虑因素。编译函数的第一次执行可能由于编译过程的开销而较慢。一些复杂的 Python 结构可能不易于 JIT 编译,需要开发者了解什么可以被有效优化。

JIT 编译在需要开发原型和生产的灵活性以及编译性能优势的场景中特别有用。它通常用于需要快速迭代但性能仍然是一个关注点的科研环境中。

许多现代机器学习框架集成了 JIT 编译,为开发者提供易用性和性能优化的平衡,如表 7.2 所示。这种平衡体现在多个维度上,从逐渐引入优化概念的曲线到结合即时反馈和性能提升的运行时行为。表格突出了 JIT 编译如何弥合急切执行编程简单性和图执行性能优势之间的差距,尤其是在内存使用和优化范围等方面。

表 7.2:执行模型权衡:机器学习框架提供不同的执行策略(急切执行、图执行和即时编译),在编程灵活性和运行时性能之间取得平衡。该表详细说明了每种方法在调试便捷性、内存消耗以及模型训练和推理期间应用优化技术范围方面的差异。

方面 急切执行 图执行 即时编译
方法 遇到每个操作时立即计算 首先构建整个计算计划,然后执行 在运行时分析代码,创建优化版本
内存使用 在整个计算过程中保持中间结果 通过规划完整的数据流来优化内存 根据实际执行模式调整内存使用
优化范围 限于局部操作模式 在整个计算链上全局优化 将运行时分析与有针对性的优化相结合
调试方法 在计算过程中的任何一点检查值 必须在图中设置特定的监控点 初始运行显示原始行为,然后进行优化
速度与灵活性 优先考虑灵活性而非速度 优先考虑性能而非灵活性 平衡灵活性和性能

分布式执行

随着机器学习模型在规模和复杂性上不断增长,在单个设备上训练它们通常不再可行。大型模型需要大量的计算能力和内存,而大规模数据集需要跨多台机器的高效处理。为了解决这些挑战,现代 AI 框架提供了内置的分布式执行支持,允许计算在多个 GPU、TPU 或分布式集群之间分割。通过抽象并行执行的复杂性,这些框架使从业者能够高效地扩展机器学习工作负载,同时保持易用性。

分布式执行的核心是两种主要策略:数据并行 25 和模型并行 26。数据并行允许多个设备在不同的数据子集上训练相同的模型,确保在没有增加内存需求的情况下更快地收敛。另一方面,模型并行将模型本身分割到多个设备上,允许训练那些无法适应单个设备内存的架构。虽然模型并行有几种变体,这些变体在第八章中进行了详细探讨,但两种技术对于高效训练现代机器学习模型都是必不可少的。随着模型规模增长到第九章中讨论的大小,这些分布式执行策略变得越来越重要,它们的实现需要第十一章中涵盖的硬件加速技术。

数据并行

数据并行是分布式训练中最广泛使用的方法,它使得机器学习模型能够在多个设备上扩展,同时保持效率。在此方法中,每个计算设备持有模型的一个相同副本,但处理的是训练数据的独特子集,如图图 7.11 所示。一旦计算完成,每个设备上计算出的梯度在更新模型参数之前会进行同步,确保所有副本的一致性。这种方法允许模型并行地从更大的数据集中学习,而无需增加每个设备的内存需求。

图片

图 7.11

数据并行将训练数据分布在多个设备上,同时在每个设备上保持相同的模型副本,这为大型数据集提供了显著的加速。AI 框架提供了内置机制来管理数据并行执行的关键挑战,包括数据分布、梯度同步和性能优化。在 PyTorch 中,DistributedDataParallel (DDP)模块自动化这些任务,确保跨多个 GPU 或节点的有效训练。TensorFlow 提供tf.distribute.MirroredStrategy,它使得多 GPU 训练的梯度同步无缝。类似地,JAX 的pmap()函数促进了跨多个加速器的并行执行,优化了设备间的通信以减少开销。这些框架抽象了梯度聚合的复杂性,对于大型模型可能需要 10-100Gbps 的网络带宽。例如,同步一个 175B 参数模型在 1024 个 GPU 上的梯度,每个训练步骤(FP32 精度)需要大约 700GB 的数据通信,这需要复杂的算法来实现接近线性的扩展效率。

通过自动处理同步和通信,这些框架使得分布式训练对广泛的用户变得可行,从探索新型架构的研究人员到部署大规模 AI 系统的工程师。虽然实现细节各不相同,但基本目标保持一致:在不要求用户手动管理底层并行化的情况下,实现高效的跨设备训练。

模型并行

尽管数据并行对于许多机器学习工作负载来说非常有效,但有些模型太大,无法适应单个设备的内存。模型并行通过将模型本身分割到多个设备上来解决这一限制,使得每个设备可以处理计算的不同部分。与数据并行不同,在数据并行中整个模型在每个设备上都会被复制,模型并行将层、张量或特定操作分配到可用的硬件资源中,如图图 7.12 所示。这种方法使得训练大规模模型成为可能,否则这些模型会受到单设备内存限制的约束。

图片

Figure 7.12

模型并行通过将模型的各个部分分布到多个设备上,解决了内存限制问题,使得单个设备无法训练的大型模型得以训练。AI 框架提供了结构化的 API 来简化模型并行执行,抽象出与工作负载分配和通信相关的许多复杂性。PyTorch 通过torch.distributed.pipeline.sync支持管道并行,允许不同的 GPU 处理模型的连续层,同时保持高效的执行流程。TensorFlow 的TPUStrategy允许在 TPU 核心之间自动划分大型模型,优化高速互连的执行。DeepSpeed 和 Megatron-LM 等框架通过实现高级模型分片技术扩展 PyTorch,包括张量并行,这种技术将模型权重分布在多个设备上以减少内存开销。这些技术必须管理大量的通信开销。张量并行通常需要 100-400GB/s 的设备间带宽以保持效率,而管道并行由于管道阶段之间较少但较大的激活传输,可以在较低的带宽(10-50Gbps)下有效运行。

模型并行有多种变体,每种都适合不同的架构和硬件配置。对于不同的架构和硬件配置,存在多种并行策略。这些技术的具体权衡和用途在第八章中进行了探讨,该章节讨论了分布式训练策略,图 7.13 展示了比较并行策略的一些初步直觉。无论具体方法如何,AI 框架在管理工作负载分区、高效调度计算和最小化通信开销方面发挥着重要作用,确保即使是最大的模型也能进行大规模训练。

Figure 7.13: 并行策略:张量并行将单个层分散到多个设备上,减少了每个设备的内存需求,而管道并行将连续层分布到不同的设备上,通过重叠计算和通信来增加吞吐量。此图对比了这些方法,突出了张量并行如何在设备间复制层参数,以及管道并行如何划分模型的计算图。

核心操作

机器学习框架采用三层操作层次结构,将高级模型描述转换为高效的硬件计算。图 7.14 说明了硬件抽象操作如何管理计算平台复杂性,基本数值操作实现数学计算,以及系统级操作如何协调资源和执行。

图 7.14:框架操作层次结构:机器学习框架通过分层操作(调度、内存管理和资源优化)抽象硬件复杂性,使数学模型能够在不同的计算平台上高效执行。这种层次结构通过协调资源和管理工作,将高级模型描述转换为实际实现。

硬件抽象操作

硬件抽象操作构成了基础层,隔离了高级别与平台特定细节,同时保持计算效率。这一层处理计算内核管理、内存系统抽象以及跨不同计算平台的执行控制。

计算内核管理

计算内核管理涉及为不同的硬件架构选择和调度数学运算的最佳实现。这需要维护多个核心操作的实现和复杂的调度逻辑。例如,矩阵乘法运算可能使用现代 CPU 上的 AVX-512 向量指令、NVIDIA GPU 上的cuBLAS或 AI 加速器上的专用张量处理指令来实现。内核管理器在选择实现时必须考虑输入大小、数据布局和硬件能力。它还必须处理当专用实现不可用或不合适时的回退路径。

内存系统抽象

内存系统抽象管理数据在复杂内存层次结构中的移动。这些抽象必须处理各种内存类型(注册的、固定的、统一的)及其特定的访问模式。数据布局通常需要在硬件首选格式之间进行转换——例如,在行主序和列主序矩阵布局之间,或在交错和平面图像格式之间。内存系统还必须管理对齐要求,这些要求可以从 CPU 上的 4 字节对齐变化到某些加速器上的 128 字节对齐。此外,它还处理多个执行单元访问相同数据时的缓存一致性问题时。

执行控制

执行控制操作协调多个执行单元和内存空间之间的计算。这包括管理执行队列、处理事件依赖关系和控制异步操作。现代硬件通常支持可以并发操作的多条执行流。例如,独立的 GPU 流或 CPU 线程池。执行控制器必须管理这些流,处理同步点,并确保依赖操作的正确顺序。它还必须提供针对特定硬件故障的错误处理和恢复机制。

基本数值操作

在上述建立的硬件抽象层基础上,框架实现基本的数值运算,在数学精度和计算效率之间取得平衡。通用矩阵乘法(GEMM)操作主导了机器学习的计算成本,遵循以下模式 C = αAB + βC,其中 A、B 和 C 是矩阵,α 和 β 是缩放因子。

GEMM 操作的实现需要复杂的优化技术。这包括用于缓存效率的阻塞,其中矩阵被分成适合缓存内存的小块;循环展开以增加指令级并行性;以及针对不同矩阵形状和稀疏模式的专用实现。例如,全连接神经网络层通常使用常规密集的 GEMM 操作,而卷积层通常采用利用输入局部性模式的专用 GEMM 变体。

除了 GEMM 之外,框架还必须高效地实现 BLAS 操作,如向量加法(AXPY)、矩阵-向量乘法(GEMV)和不同的归约操作。这些操作需要不同的优化策略。AXPY 操作通常受内存带宽限制,而 GEMV 操作必须平衡内存访问模式与计算效率。

元素级操作形成另一个关键类别,包括基本的算术运算(加法、乘法)和超越函数(指数、对数、三角函数)。虽然从概念上比 GEMM 简单,但这些操作通过向量化和操作融合提供了显著的优化机会。例如,多个元素级操作通常可以融合成一个单独的内核,以减少内存带宽需求。这些操作的效率在神经网络激活函数和归一化层中尤为重要,在这些层中,它们处理大量数据。

现代框架还必须处理具有不同数值精度要求的操作。例如,训练通常需要 32 位浮点精度以保证数值稳定性,而推理通常可以使用降低精度的格式,如 16 位浮点或甚至 8 位整数。因此,框架必须在保持可接受的精度的同时,提供跨多个数值格式的有效实现。

系统级操作

系统级操作建立在计算图基础和硬件抽象之上,通过操作调度、内存管理和资源优化来管理整体计算流程和资源利用。

操作调度利用前面讨论的计算图结构来确定执行顺序。使用静态或动态图表示,调度器必须在尊重依赖关系的同时识别并行化机会。静态图和动态图的实现挑战不同,静态图中整个依赖结构事先已知,而动态图中依赖关系在执行过程中出现。调度器还必须处理高级执行模式,如条件操作和循环,这些操作在图结构内创建动态控制流。

内存管理在计算图中实现复杂的策略来分配和释放内存资源。不同的数据类型需要不同的管理策略。模型参数通常在整个执行过程中持续存在,可能需要特定的内存类型以实现高效访问。中间结果具有由操作图定义的有限生命周期。例如,激活值仅在反向传播期间需要。内存管理器采用诸如引用计数自动清理、内存池以减少分配开销和工作空间管理以处理临时缓冲区等技术。它还必须处理内存碎片化,特别是在长时间运行的训练会话中,其中分配模式可能会随时间变化。

资源优化将调度和内存决策整合在一起,以在系统约束条件下最大化性能。一个关键的优化是梯度检查点,其中一些中间结果被丢弃并重新计算,而不是存储,以节省内存换取计算时间。优化器还必须管理并发执行流,平衡可用计算单元之间的负载,同时尊重依赖关系。对于具有多种可能实现的操作,它根据运行时条件选择替代方案 - 例如,根据矩阵形状和系统负载选择矩阵乘法算法。

这些操作层共同建立在第 7.3.1 节中建立的计算图基础上,以高效执行机器学习工作负载,同时从模型开发者那里抽象出实现复杂性。这些层之间的交互决定了整体系统性能,并为第十章和第十一章中讨论的高级优化技术奠定了基础。

在探讨了使框架功能化的基本概念之后,我们现在考察这些概念是如何打包成实际开发接口的。框架架构定义了底层计算机制如何通过 API 和抽象暴露给开发者,这些 API 和抽象在可用性和性能之间取得平衡。

框架架构

虽然基本概念提供了计算基础,但实际框架的使用依赖于精心设计的架构接口,这些接口使得这种能力对开发者来说易于访问。框架架构将我们讨论过的能力(计算图、执行模型和优化操作)组织成结构化的层,服务于开发工作流程的不同方面。理解这些架构选择有助于开发者有效地利用框架,并为他们的特定需求选择合适的工具。

API 和抽象

机器学习框架的 API 层提供了开发者与框架功能交互的主要接口。这一层必须平衡多个相互竞争的需求:它必须足够直观以支持快速开发,足够灵活以支持多样化的用例,并且足够高效以实现高性能的实现。

现代框架 API 实现了多个抽象级别,以解决相互竞争的需求。低级 API 提供了对张量操作和计算图构建的直接访问,暴露了之前讨论的基本操作,以实现对计算的精细控制,如列表 7.37 所示。

列表 7.37:手动张量操作:使用 pytorch 的低级 API 执行自定义计算,突出定义复杂转换的灵活性。

import torch

# Manual tensor operations
x = torch.randn(2, 3)
w = torch.randn(3, 4)
b = torch.randn(4)
y = torch.matmul(x, w) + b

# Manual gradient computation
y.backward(torch.ones_like(y))

在这个低级基础上,框架提供了更高层次的 API,将常见模式打包成可重用的组件。神经网络层就是这种方法的例证,其中预构建的层抽象处理实现细节,而不是需要手动进行张量操作,如列表 7.38 所示。

列表 7.38:中级抽象:使用卷积层和全连接层等层构建神经网络,展示了如何通过基本张量操作构建高级模型以实现高效实现。

import torch.nn as nn


class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv = nn.Conv2d(3, 64, kernel_size=3)
        self.fc = nn.Linear(64, 10)

    def forward(self, x):
        x = self.conv(x)
        x = torch.relu(x)
        x = self.fc(x)
        return x

这种分层方法最终导致全面的工作流程自动化。在最高级别(列表 7.39),框架通常提供模型级别的抽象,以自动化常见的工作流程。例如,Keras API 提供了一个高度抽象的接口,隐藏了大多数实现细节:

列表 7.39:高级模型定义:使用 Keras 定义卷积神经网络架构,展示了层堆叠用于特征提取和分类。训练工作流程:通过编译模型并使用优化器和损失函数,然后将其拟合到多个 epoch 的数据中来自动化训练过程。

from tensorflow import keras

model = keras.Sequential(
    [
        keras.layers.Conv2D(
            64, 3, activation="relu", input_shape=(32, 32, 3)
        ),
        keras.layers.Flatten(),
        keras.layers.Dense(10),
    ]
)

# Automated training workflow
model.compile(
    optimizer="adam", loss="sparse_categorical_crossentropy"
)
model.fit(train_data, train_labels, epochs=10)

这些 API 层的组织反映了框架设计中的基本权衡。低级 API 提供了最大的灵活性,但需要更多的专业知识才能有效使用。高级 API 提高了开发者的生产力,但可能会限制实现选择。因此,框架 API 必须提供清晰的抽象层之间的路径,允许开发者根据其特定用例的需要混合不同级别的抽象。

这些精心设计的 API 层为开发者和框架功能之间提供了接口,但它们只是完整开发体验的一个组成部分。虽然 API 定义了开发者如何与框架交互,但完整的开发体验取决于围绕核心框架的更广泛生态系统中的工具、库和资源。这个生态系统将框架能力扩展到基本模型实现之外,涵盖了整个机器学习生命周期。

框架生态系统

机器学习框架将它们的基本能力组织成不同的组件,这些组件协同工作,提供完整的发展和部署环境。这些组件创建了抽象层,使得框架既适用于高级模型开发,又适用于低级执行。了解这些组件之间的交互有助于开发者有效地选择和使用框架,尤其是在它们支持完整的机器学习生命周期时,从数据预处理第六章到训练第八章,再到部署第十三章。这种生态系统方法将第三章中提出的理论基础与第二章中描述的生产机器学习系统的实际需求联系起来。

核心库

每个机器学习框架的核心都包含一系列核心库,这些库构成了所有其他组件构建的基础。这些库为机器学习操作提供了必要的构建块,实现了作为数值计算骨干的基本张量操作。这些操作经过高度优化以提高性能,通常利用底层编程语言和针对特定硬件的优化,以确保矩阵乘法等任务的执行效率,而矩阵乘法是神经网络计算的基础。

这些计算原语支持更高级的功能。除了这些基本操作外,核心库还实现了自动微分功能,能够高效地计算复杂函数的梯度。这一特性对于大多数神经网络优化的基于梯度的训练至关重要。实现这一功能通常涉及复杂的图操作和符号计算技术,从而将梯度计算的复杂性抽象化,让最终用户无需关注。

这些基础能力使得高级抽象得以加速开发。在这些基本操作的基础上,核心库通常提供预实现的神经网络层,如各种神经网络层类型。这些现成的组件让开发者无需为常见的模型架构重新发明轮子,从而能够专注于高级模型设计,而不是低级实现细节。同样,优化算法也提供现成,进一步简化了模型开发过程。

这些组件的集成创造了一个统一的开发环境。以下是如何在实际中可能使用这些组件的简化示例:列表 7.40。

列表 7.40:训练流程:机器学习工作流程将数据集划分为训练集、验证集和测试集,以确保稳健的模型开发和无偏的评估。

import torch
import torch.nn as nn

# Create a simple neural network
model = nn.Sequential(nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1))

# Define loss function and optimizer
loss_fn = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# Forward pass, compute loss, and backward pass
x = torch.randn(32, 10)
y = torch.randn(32, 1)
y_pred = model(x)
loss = loss_fn(y_pred, y)
loss.backward()
optimizer.step()

本例演示了核心库如何提供模型创建、损失计算和优化的高级抽象,同时内部处理低级细节。这些组件的无缝集成展示了核心库如何为更广泛的框架生态系统奠定基础。

扩展和插件

虽然核心库提供了基本功能,但现代机器学习框架的真正力量往往在于其可扩展性。扩展和插件扩展了框架的功能,使其能够满足特定需求并利用最新的研究进展。例如,特定领域的库针对特定领域,如计算机视觉或自然语言处理,提供预训练模型、专门的数据增强技术和特定任务的层。

除了领域专业化之外,性能优化驱动着另一个关键的扩展类别。硬件加速插件在性能优化中扮演着重要角色,因为它使得框架能够利用专门的硬件,如 GPU 或 TPU。这些插件显著加快了计算速度,并允许在不同硬件后端之间无缝切换,这是现代机器学习工作流程可扩展性和灵活性的关键特征。

现代机器学习的规模不断扩大,产生了额外的扩展需求。随着模型和数据集在规模和复杂性上的增长,分布式计算的扩展也变得至关重要。这些工具使得可以在多个设备或机器上训练,处理复杂任务,如数据并行、模型并行和计算节点之间的同步。这种能力对于解决大规模机器学习问题的研究人员和企业至关重要。

为了支持研究和开发过程,这些计算工具之外,还需要可视化工具和实验跟踪扩展。可视化工具提供了对训练过程和模型行为的宝贵见解,显示实时指标,甚至提供交互式调试功能。实验跟踪扩展有助于管理机器学习研究的复杂性,允许系统地记录和比较不同的模型配置和超参数。

集成开发和调试环境

除了核心框架及其扩展之外,围绕机器学习框架的开发工具生态系统进一步增强了其有效性和普及度。交互式开发环境,如 Jupyter 笔记本,在机器学习工作流程中几乎无处不在,允许快速原型设计和代码、文档和输出的无缝集成。许多框架为这些环境提供定制扩展,以增强开发体验。

机器学习系统的复杂性需要专业的开发支持。调试和性能分析工具解决了机器学习模型带来的独特挑战。专业的调试器允许开发者在训练和推理过程中检查模型的内部状态,而性能分析工具则识别模型执行中的瓶颈,指导优化工作。这些工具对于开发高效和可靠的机器学习系统至关重要。

随着项目复杂性的增加,版本控制集成变得越来越重要。允许对代码、模型权重、超参数和训练数据进行版本控制的工具,有助于管理模型开发的迭代性质。这种全面的版本控制方法确保了可重复性,并促进了大规模机器学习项目中的协作。

最后,部署工具简化了开发和生产环境之间的过渡。这些工具处理诸如模型压缩、转换为部署友好格式以及与服务基础设施集成等任务,从而简化了将模型从实验设置转移到实际应用的过程。

系统集成

从开发环境转移到生产部署需要仔细考虑系统集成挑战。系统集成是在现实世界环境中实施机器学习框架。本节探讨了 ML 框架如何与更广泛的软件和硬件生态系统集成,并解决集成过程中的每个层次的挑战和考虑因素。

硬件集成

有效的硬件集成对于优化机器学习模型性能至关重要。现代 ML 框架必须适应各种计算环境,从高性能 GPU 集群到资源受限的边缘设备。

这种适应从加速计算平台开始。对于 GPU 加速,TensorFlow 和 PyTorch 等框架提供了强大的支持,允许无缝利用 NVIDIA 的 CUDA 平台。这种集成使得训练和推理任务都显著加速。同样,TensorFlow 中对 Google 的 TPU 的支持允许进一步加速特定的工作负载。

在分布式计算场景中,框架必须通过复杂的协调抽象有效地管理多设备和多节点设置。数据并行性在设备间复制相同的模型,并需要全量减少通信模式。框架实现了环形全量减少算法,以最优带宽利用率实现 O(N)通信复杂度,对于大型梯度通常在高速互连(如 InfiniBand,100-400Gbps)上达到理论网络带宽的 85-95%。模型并行性将不同的模型分区分布到硬件单元中,需要分区间的点对点通信以及正向和反向传递的仔细同步,当每个节点的网络带宽低于 25Gbps 时,通信开销通常消耗总训练时间的 20-40%。在规模扩大时,故障变得不可避免:谷歌报告称 TPU pod 训练作业每隔几小时就会因内存错误、硬件故障和网络分区而失败。现代框架通过弹性训练能力来应对这一问题,这些能力可以动态地适应集群大小的变化,并通过每 N 次迭代保存模型状态的检查点策略。像 Horovod27 这样的框架和像 DeepSpeed 这样的专用系统已经出现,以抽象不同后端框架中的分布式训练复杂性,优化通信模式以维持训练吞吐量,即使当总网络带宽利用率超过可用容量的 80%。

对于边缘部署,框架越来越多地提供针对移动和物联网设备优化的轻量级版本。例如,TensorFlow Lite 和 PyTorch Mobile 提供模型压缩和优化的工具,确保在计算资源有限和功率受限的设备上高效执行。

框架基础设施依赖

将机器学习框架集成到现有的软件堆栈中带来了独特的挑战和机遇。一个关键考虑因素是机器学习系统如何与数据处理管道接口。框架通常提供连接器,连接到流行的大数据工具,如 Apache Spark 或 Apache Beam,允许数据处理系统和机器学习训练环境之间的无缝数据流。

容器化技术如 Docker 已成为机器学习工作流程中的关键,确保开发环境和生产环境之间的一致性。Kubernetes 已成为编排容器化机器学习工作负载的流行选择,为复杂的部署提供可扩展性和可管理性。

机器学习框架还必须与其他企业系统(如数据库、消息队列和 Web 服务)进行交互。例如,TensorFlow Serving 提供了一个灵活、高性能的机器学习模型服务系统,可以轻松集成到现有的微服务架构中。

生产环境集成要求

将机器学习模型部署到生产环境涉及几个关键考虑因素。模型服务策略必须在性能、可扩展性和资源效率之间取得平衡。方法范围从用于大规模离线处理的批量预测到用于交互式应用的实时服务。

将机器学习系统扩展以满足生产需求通常涉及像推理服务器水平扩展、频繁预测的缓存以及跨多个模型版本之间的负载均衡等技术。TensorFlow Serving 和 TorchServe 等框架为许多这些扩展挑战提供了内置解决方案。

监控和日志记录对于维护生产中的机器学习系统至关重要。这包括跟踪模型性能指标,检测概念漂移,以及记录预测输入和输出以供审计。像 Prometheus 和 Grafana 这样的工具通常与机器学习服务系统集成,以提供全面的监控解决方案。

端到端机器学习管道管理

管理端到端机器学习管道需要协调多个阶段,从数据准备和模型训练到部署和监控。MLOps 实践应运而生,以解决这些挑战,将 DevOps 原则引入机器学习工作流程。

持续集成和持续部署(CI/CD)实践正在适应机器学习工作流程。这包括自动化模型测试、验证和部署过程。Jenkins 或 GitLab CI 等工具可以通过添加机器学习特定的阶段来扩展,以创建用于机器学习项目的强大 CI/CD 管道。

自动化模型重新训练和更新是机器学习工作流程编排的另一个关键方面。这包括设置系统以自动在新数据上重新训练模型,评估其性能,并在满足某些标准时无缝更新生产模型。像 Kubeflow 这样的框架提供了端到端的机器学习管道,可以自动化许多这些流程。图 7.15 展示了示例编排流程,其中用户提交 DAGs,即工作负载的有向无环图,以进行处理和训练。

对机器学习资产(包括数据、模型架构和超参数)进行版本控制对于可重复性和协作至关重要。DVC(数据版本控制)和 MLflow 等工具的出现是为了解决这些特定的机器学习版本控制需求。

图片

图 7.15:工作流程编排:数据工程和机器学习管道从像 Airflow 这样的编排工具中受益,这些工具自动化任务调度、分布式执行和结果监控,以实现可重复和可扩展的模型训练和部署。有向无环图(DAGs)定义了这些工作流程,使得复杂的操作序列可以有效地作为 CI/CD 系统的一部分进行管理。

主要框架平台分析

在探讨了定义现代框架的基本概念、架构和生态系统组件之后,我们现在考察这些原则如何在现实世界的实现中体现。机器学习框架表现出相当大的架构复杂性。多年来,已经出现了几个机器学习框架,每个都有其独特的优势和生态系统,但很少有框架成为行业标准。本节考察了该领域的确立和主导框架,分析其设计哲学如何将讨论的概念转化为实际的开发工具。

TensorFlow 生态系统

TensorFlow 是由 Google Brain 团队开发的,并于 2015 年 11 月 9 日作为开源软件库发布。它旨在使用数据流图进行数值计算,并因此成为广泛机器学习应用的流行选择。

这种全面的设计方法反映了 TensorFlow 的生产导向哲学。TensorFlow 是一个训练和推理框架,它提供内置功能来处理从模型创建和训练到部署的各个方面,如图图 7.16 所示。自其最初开发以来,TensorFlow 生态系统已经发展到包括许多不同的“品种”的 TensorFlow,每种都旨在让用户能够在不同的平台上支持机器学习。

  1. TensorFlow Core:大多数开发者与之交互的主要包。它提供了一个完整、灵活的平台,用于定义、训练和部署机器学习模型。它包括tf.keras作为其高级 API。

  2. TensorFlow Lite:专为在移动、嵌入式和边缘设备上部署轻量级模型而设计。它提供工具将 TensorFlow 模型转换为更适合资源有限设备的更紧凑格式,并为移动设备提供优化的预训练模型。

  3. TensorFlow Lite Micro:专为在资源有限的微控制器上运行机器学习模型而设计。它无需操作系统支持、标准 C 或 C++库或动态内存分配,仅使用几 KB 的内存即可运行。

  4. TensorFlow.js:允许在浏览器或 Node.js 中直接训练和部署机器学习模型的 JavaScript 库。它还提供工具,用于将预训练的 TensorFlow 模型转换为浏览器友好的格式。

  5. TensorFlow 在边缘设备(Coral)上:由 Google 提供的硬件组件和软件工具平台,允许在边缘设备上执行 TensorFlow 模型,利用 Edge TPUs 进行加速。

  6. TensorFlow Federated (TFF):用于在去中心化数据上执行机器学习和其他计算的框架。TFF 促进了联邦学习,允许在许多设备上跨设备进行模型训练,而不需要集中数据。

  7. TensorFlow Graphics:使用 TensorFlow 执行图形相关任务的库,包括 3D 形状和点云处理,使用深度学习。

  8. TensorFlow Hub:可重用机器学习模型组件的存储库,允许开发者重用预训练模型组件,促进迁移学习和模型组合。

  9. TensorFlow Serving:为生产环境中的推理部署和部署机器学习模型设计的框架。它提供工具,用于版本控制和动态更新已部署模型,而不会中断服务。

  10. TensorFlow Extended (TFX):为生产环境设计的端到端平台,用于部署和管理机器学习管道。TFX 包括数据验证、预处理、模型训练、验证和服务组件。

图 7.16:TensorFlow 2.0 架构:此图概述了 TensorFlow 的模块化设计,将急切执行与图构建分离,以增加灵活性和便于调试。TensorFlow 核心提供基础 API,而 Keras 作为其高级接口,简化了模型构建和训练,支持跨各种平台和硬件加速器的部署。来源:TensorFlow..

生产规模部署

实际的工业生产系统展示了框架选择如何直接影响在操作约束下的系统性能。框架优化通常可以实现显著的改进:通过包括量化、操作融合和特定硬件加速的系统优化,生产系统通常可以看到 4-10 倍的延迟减少和 2-5 倍的成本节约。

然而,这些优化需要大量的工程投入,通常需要 4-12 周的专业努力来实现自定义操作实现、验证测试和性能调整。框架选择成为一个系统工程决策,它远远超出了 API 偏好的范畴,涵盖了整个优化和部署管道。

详细的生产部署示例、优化技术和定量权衡分析在第十三章中得到了全面覆盖,其中系统地解决了操作约束和部署策略。

PyTorch

与 TensorFlow 的生产优先方法相比,由 Facebook 的人工智能研究实验室开发的 PyTorch 在机器学习社区中获得了显著的吸引力,尤其是在研究人员和学者中。其设计理念强调易用性、灵活性和动态计算,这与研究和实验的迭代性质非常吻合。

PyTorch 的研究导向哲学体现在其动态计算图系统中。与 TensorFlow 的传统静态图不同,PyTorch 通过“运行时定义”方法在执行过程中动态构建计算图。这使模型设计直观,调试更容易,并在模型内部提供标准的 Python 控制流。动态方法支持可变长度的输入和复杂架构,同时提供即时执行和检查能力。

与其他框架共享基本抽象的 PyTorch,包括作为核心数据结构的张量以及无缝的 CUDA 集成以实现 GPU 加速。autograd 系统自动跟踪操作以进行基于梯度的优化。

JAX

JAX 代表了一种第三种独特的方法,由 Google Research 为高性能数值计算和高级机器学习研究开发。与 TensorFlow 的静态图或 PyTorch 的动态执行不同,JAX 侧重于函数式编程原则和转换的组合。

JAX 作为一个与 NumPy 兼容的库,具有自动微分和即时编译功能,对科学 Python 开发者来说感觉熟悉,同时提供了强大的优化工具。JAX 可以对原生 Python 和 NumPy 函数进行微分,包括具有循环、分支和递归的函数,不仅限于简单的转换,还能实现向量化和即时编译。

JAX 的编译策略比 TensorFlow 更集中地利用 XLA,为各种硬件加速器优化 Python 代码。函数式编程方法使用纯函数和不可变数据,创建可预测、易于优化的代码。JAX 的可组合转换包括自动微分(grad)、向量化(vmap)和并行执行(pmap),这些功能使它区别于命令式框架。

定量平台性能分析

表 7.3 提供了三个主要机器学习框架:TensorFlow、PyTorch 和 JAX 的简洁比较。虽然这些框架服务于类似的目的,但它们在设计理念和技术实现方面存在根本性的差异。

表 7.3:框架特性:TensorFlow、PyTorch 和 JAX 在图构建(静态、动态或函数式)方面存在差异,这影响了编程风格和执行速度。核心区别包括数据可变性(JAX 中的数组是不可变的)和自动微分能力,JAX 支持前向和反向模式。所示的性能特性是代表性的基准,可以根据工作负载、硬件配置和优化设置有显著差异。JAX 通常实现更高的 GPU 利用率和分布式扩展效率,而 PyTorch 通过动态图提供最直观的调试体验。

方面 TensorFlow PyTorch JAX
图类型 静态(1.x),动态(2.x) 动态 函数式转换
编程模型 命令式(2.x),符号式(1.x) 命令式 函数式
核心数据结构 张量(可变) 张量(可变) 数组(不可变)
执行模式 想法式(2.x 默认),图 想法式 即时编译
自动微分 反向模式 反向模式 前向和反向模式
硬件加速 CPU,GPU,TPU CPU,GPU CPU,GPU,TPU
编译优化 XLA:3-10 倍加速 TorchScript:2 倍 XLA:3-10 倍加速
内存效率 85% GPU 利用率 82% GPU 利用率 91% GPU 利用率
分布式可扩展性 92%效率(1024 个 GPU) 88%效率 95%效率(1024 个 GPU)

这些架构差异体现在不同的编程范式和 API 设计选择上。以下示例说明了相同的简单神经网络(将 10 个输入映射到 1 个输出的单个线性层)在这些主要框架中的巨大差异,揭示了它们的基本设计理念。

下面是如何在主要框架中查看相同的简单神经网络,以说明语法差异:

# PyTorch - Dynamic, Pythonic
import torch.nn as nn


class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(10, 1)

    def forward(self, x):
        return self.fc(x)


# TensorFlow/Keras - High-level API
import tensorflow as tf

model = tf.keras.Sequential(
    [tf.keras.layers.Dense(1, input_shape=(10,))]
)

# JAX - Functional approach
import jax.numpy as jnp
from jax import random


def simple_net(params, x):
    return jnp.dot(x, params["w"]) + params["b"]


key = random.PRNGKey(0)
params = {
    "w": random.normal(key, (10, 1)),
    "b": random.normal(key, (1,)),
}

PyTorch 的实现展示了面向对象设计,通过从nn.Module显式继承类来定义。开发者可以在__init__()中定义模型架构,在forward()中定义计算流程,从而在结构和执行之间提供清晰的分离。这种命令式风格允许动态图构建,在执行期间构建计算图,从而实现灵活的控制流和调试。

相比之下,TensorFlow/Keras 通过序列层组合展示了声明式编程。Sequential API 抽象了实现细节,在幕后自动处理层连接、权重初始化和前向传递编排。实例化时,Sequential 创建一个管理计算图的容器,自动将每一层的输出连接到下一层的输入。这种方法反映了 TensorFlow 向即时执行的演变,同时保持了与基于图的优化在生产部署中的兼容性。

JAX 采取了一种根本不同的方法,通过不可变数据结构和显式参数管理来拥抱函数式编程原则 28。simple_net函数手动实现线性变换,使用jnp.dot(x, params['w']) + params['b'],显式执行 PyTorch 和 TensorFlow 自动处理的矩阵乘法和偏置添加。参数存储在一个包含权重'w'和偏置'b'的字典结构(params)中,使用 JAX 的随机数生成和显式播种(random.PRNGKey(0))分别初始化。这种分离意味着模型函数是无状态的 29;它内部不包含任何参数,完全依赖于外部参数传递。这种设计使得像自动向量化 30 (vmap)、即时编译 31 (jit)和自动微分 32 (grad)这样的强大程序转换成为可能,因为这些函数在数学上保持纯净,没有隐藏状态或副作用。

框架设计哲学

机器学习框架不仅体现了其创造者的优先考虑和预期用例,还体现了独特的设计哲学。理解这些哲学方法有助于开发者选择与项目需求和工作风格相一致的框架。框架的设计哲学影响着从 API 设计到性能特征的一切,最终影响开发者的生产力和系统性能。

研究为先的哲学:PyTorch

PyTorch 体现了以研究为先的哲学,优先考虑开发者体验和实验灵活性,而非性能优化。关键设计决策包括支持即时检查能力的即时执行,采用 Python 的本地控制结构而非特定领域的语言,以及暴露计算细节以供研究人员精确控制。这种方法使得快速原型设计和调试成为可能,推动了在探索和实验至关重要的学术环境中的采用。

可扩展性和部署优化设计

TensorFlow 优先考虑生产部署和可扩展性,反映了谷歌在处理大规模机器学习系统方面的经验。这种以生产为先的方法强调通过 XLA 编译进行静态图优化,通过操作融合和硬件特定的代码生成提供 3-10 倍的性能提升。该框架包括全面的生产工具,如 TensorFlow Serving 和 TFX,旨在进行分布式部署和大规模服务。高级抽象如 Keras 优先考虑可靠性而非灵活性,而 API 的演变强调向后兼容性和生产稳定性的逐步迁移路径。

数学转换和可组合性重点

JAX 代表了一种强调数学纯净性和程序转换能力的函数式编程方法。不可变数组和纯函数使自动向量化(vmap)、并行化(pmap)和微分(grad)成为可能,而不必担心隐藏状态。JAX 不提供特定于机器学习的抽象,而是提供通用的程序转换,这些转换可以组合以创建复杂的行为,将计算与执行策略分离。在保持 NumPy 兼容性的同时,函数式约束使强大的优化能力成为可能,使研究代码类似于数学算法描述。

与项目需求相匹配的框架哲学

这些哲学上的差异对框架选择有实际的影响。从事探索性研究的团队通常从 PyTorch 以研究为先的哲学中受益。专注于大规模部署模型的组织可能更喜欢 TensorFlow 以生产为先的方法。致力于基本算法开发的科研团队可能会选择 JAX 的功能方法来进行程序转换和数学推理。

理解这些哲学有助于团队预测当前的能力和未来的演变。PyTorch 的研究重点表明持续投资于开发者体验。TensorFlow 的生产导向意味着持续的部署和工具开发。JAX 的功能哲学指向持续的程序转换探索。

框架哲学的选择往往对项目的发展轨迹有持久的影响,影响着从代码组织到调试工作流程再到部署策略的各个方面。将框架选择与他们的基本优先级和工作风格相一致的组织通常比那些只关注技术规格的组织实现更好的长期成果。

针对特定部署环境的框架

除了上述探索的核心框架哲学之外,机器学习框架已经显著发展,以满足不同计算环境的不同需求。随着 ML 应用从传统数据中心扩展到边缘设备、移动平台,甚至微型微控制器,对专用框架的需求变得越来越明显。

这种多样化反映了部署异质性的基本挑战。框架专业化指的是根据特定部署环境对机器学习框架进行定制,以优化性能、效率和功能。这种专业化至关重要,因为计算资源、功率限制和用例在不同平台之间差异很大。

专用框架的激增创造了潜在的碎片化挑战,机器学习社区通过标准化努力解决了这些问题。机器学习框架通过标准化模型格式解决了互操作性挑战,其中开放的神经网络交换(ONNX)33 已成为广泛采用解决方案。ONNX 定义了神经网络模型的通用表示,使得在不同框架和部署环境之间实现无缝转换成为可能。

这种标准化解决了实际工作流程需求。ONNX 格式有两个主要目的。首先,它提供了一个框架中立的规范,用于描述模型架构和参数。其次,它包括可以在不同硬件平台上执行这些模型的运行时实现。这种标准化消除了在框架之间移动时手动转换或重新实现模型的需要。

在实践中,ONNX 简化了生产级机器学习系统中的重要工作流程模式。例如,一个研究团队可能会使用 PyTorch 的动态计算图开发和训练一个模型,然后将其导出为 ONNX 格式,以便使用 TensorFlow 的生产优化服务基础设施进行部署。同样,模型可以通过使用专门的运行时(如 ONNX Runtime)转换为 ONNX 格式,在边缘设备上执行。这种互操作性,如图 7.17 所示,随着机器学习生态系统的扩展而变得越来越重要。组织通常需要在机器学习生命周期的各个阶段利用不同框架的优势,从研发阶段开始。

图片

图 7.17:框架互操作性:开放的神经网络交换(ONNX)格式允许模型在不同机器学习框架之间进行移植,使得研究人员可以在一个框架(例如 PyTorch)中训练模型,并使用另一个框架(例如 TensorFlow)进行部署,而无需重写代码。这种标准化简化了机器学习工作流程,并促进了在多样化的硬件平台上利用专门的运行时(如 ONNX 运行时)。

部署目标的多样性需要为不同环境制定不同的专业化策略。机器学习部署环境塑造了框架专业化和演化的方式。云机器学习环境利用高性能服务器,为复杂操作提供丰富的计算资源。边缘机器学习在具有适度计算能力的设备上运行,其中实时处理通常优先。移动机器学习适应智能手机和平板电脑的变异性能和能源限制。TinyML 在微控制器和其他资源极少的严格限制设备上运行。

这些环境限制驱动了特定的架构决策。每个环境都提出了独特的挑战,这些挑战影响着框架的设计。云框架优先考虑可扩展性和分布式计算。边缘框架专注于低延迟推理和对不同硬件的适应性。移动框架强调能源效率和与特定设备功能的集成。TinyML 框架专注于在资源严重受限的环境中实现极端资源优化。

我们将探讨机器学习框架如何适应这些环境中的每一个。我们将检查特定的技术和设计选择,这些技术和设计选择使框架能够解决每个领域的独特挑战,突出框架专业化的权衡和优化。

分布式计算平台优化

云环境提供了最丰富的计算资源,使框架能够优先考虑可扩展性和复杂的优化,而不是资源限制。云机器学习框架是复杂的软件基础设施,旨在利用云环境中可用的庞大计算资源。这些框架在三个主要领域专业化:分布式计算架构、大规模数据和模型的管理以及与云原生服务的集成。

第一个专业化领域反映了云部署中可用的规模优势。分布式计算是云机器学习框架的基本专业化。这些框架在多台机器或图形处理单元(GPU)之间实施高级策略,以分区和协调计算任务。这种能力对于在大型数据集上训练大规模模型至关重要。TensorFlow 和 PyTorch 这两个领先的云机器学习框架都提供了强大的分布式计算支持。TensorFlow 的基于图的(在其 1.x 版本中)方法特别适合分布式执行,而 PyTorch 的动态计算图允许更灵活的分布式训练策略。

处理大规模数据和模型的能力是另一个关键专业化领域。云机器学习框架经过优化,可以处理远超单机容量的数据集和模型。这种专业化体现在这些框架的数据结构中。例如,TensorFlow 和 PyTorch 都使用可变的 Tensor 对象作为它们的主要数据结构,允许对大型数据集进行高效的就地操作。JAX,作为一个较新的框架,使用不可变数组,这可以在函数式编程范式和分布式环境中的优化机会方面提供好处。

与云原生服务的集成是第三个主要的专业化领域。这种集成使得资源自动扩展、无缝访问云存储以及整合基于云的监控和日志系统成为可能。不同框架的执行模式在这里发挥着作用。TensorFlow 2.x 和 PyTorch 默认采用即时执行,这有助于更容易地与云服务集成和调试。JAX 的即时编译通过针对特定硬件优化计算,在云环境中提供了潜在的性能优势。

硬件加速是云机器学习框架的一个重要方面。所有主要框架都支持 CPU 和 GPU 执行,TensorFlow 和 JAX 还提供了对谷歌 TPU 的原生支持。NVIDIA 的 TensorRT34 是一个针对基于 GPU 推理的优化工具,提供了诸如层融合、精度校准和内核自动调优等复杂优化,以最大化在 NVIDIA GPU 上的吞吐量。这些硬件加速选项允许云机器学习框架有效地利用云环境中可用的各种计算资源。

这些框架的自动微分能力在云环境中尤为重要,因为这里常见的是具有数百万参数的复杂模型。虽然 TensorFlow 和 PyTorch 主要使用反向模式微分,但 JAX 对正向和反向模式微分的支持在某些大规模优化场景中可以提供优势。

这些专业化使云机器学习框架能够充分利用云基础设施的可扩展性和计算能力。然而,这种能力在部署和管理方面带来了更高的复杂性,通常需要专业知识才能充分利用这些框架。对可扩展性和集成的关注使云机器学习框架特别适合于大规模研究项目、企业级机器学习应用以及需要大量计算资源的场景。

本地处理和低延迟优化

从资源丰富的云环境转移到边缘部署引入了新的重大约束,这些约束重塑了框架的优先级。边缘机器学习框架是专门设计的软件工具,旨在促进边缘计算环境中的机器学习操作,这些环境以数据源附近、严格的延迟要求和有限的计算资源为特征。流行的边缘机器学习框架的例子包括TensorFlow LiteEdge Impulse。这些框架的专业化解决了三个主要挑战:实时推理优化、适应异构硬件和资源受限的运行。这些挑战直接关联到第九章中讨论的效率技术,并需要第十一章中涵盖的硬件加速策略。

实时推理优化是边缘机器学习框架的关键特性。这通常涉及利用不同的执行模式和图类型。例如,虽然 TensorFlow Lite(TensorFlow 的边缘版本)使用静态图方法来优化推理,但像PyTorch Mobile这样的框架则保持动态图功能,以牺牲一些性能为代价,允许更灵活的模型结构。在边缘框架中,静态和动态图之间的选择通常是在优化潜力和模型灵活性之间的一种权衡。

适应异构硬件对于边缘部署至关重要。边缘机器学习框架扩展了它们云版本硬件加速的能力,但专注于边缘特定硬件。例如,TensorFlow Lite 支持在移动 GPU 和边缘 TPU 上的加速,而像ARM 的 Compute Library这样的框架针对 ARM 处理器进行优化。这种专业化通常涉及自定义算子实现和针对边缘硬件的低级优化。

在资源受限的环境中运行是边缘机器学习框架专业化的另一个方面。这体现在这些框架的数据结构和执行模型中。例如,许多边缘框架使用量化张量作为它们的主要数据结构,用降低精度(例如,8 位整数而不是 32 位浮点数)来表示值,以减少内存使用和计算需求。这些量化技术,以及其他优化方法如剪枝和知识蒸馏,在第十章中进行了详细探讨。虽然自动微分能力对于云环境中的训练至关重要,但在边缘框架中通常会被削减或完全移除,以减小模型大小并提高推理速度。

边缘机器学习框架通常还包括模型版本控制和更新的功能,允许以最小的系统停机时间部署新模型。一些框架支持有限的设备上学习,使模型能够适应本地数据,同时不损害数据隐私。这些设备上学习的能力在第十四章中进行了深入探讨,而隐私影响则在第十五章中得到了全面覆盖。

边缘机器学习框架的专业化共同使得在资源受限的环境中实现高性能推理成为可能。这种能力扩大了 AI 在云连接有限或实时处理至关重要的领域的应用潜力。然而,有效利用这些框架需要仔细考虑目标硬件规格和应用特定要求,需要在模型准确性和资源利用之间取得平衡。

资源受限设备优化

移动环境引入了比通用边缘计算中发现的约束更多的限制,尤其是在能效和用户体验要求方面。移动机器学习框架是为在智能手机和平板电脑上部署和执行机器学习模型而设计的专业软件工具。例如包括 TensorFlow Lite 和苹果的 Core ML。这些框架解决了移动环境中的独特挑战,包括有限的计算资源、受限的功耗和多样化的硬件配置。移动机器学习框架的专业化主要关注设备上的推理优化、能效以及与移动特定硬件和传感器的集成。

在移动机器学习框架中对设备上的推理优化通常涉及在图类型和执行模式之间进行仔细的平衡。例如,TensorFlow Lite,也是一个流行的移动机器学习框架,采用静态图方法来优化推理性能。这与 PyTorch Mobile 的动态图能力形成对比,后者在牺牲一些性能的代价下提供了更多的灵活性。在移动框架中选择静态图和动态图是在优化潜力和模型适应性之间的一种权衡,这在多样化的移动环境中至关重要。

移动机器学习框架中的数据结构针对高效内存使用和计算进行了优化。虽然基于云的框架如 TensorFlow 和 PyTorch 使用可变张量,但移动框架通常采用更专业的数据结构。例如,许多移动框架使用量化张量,用降低精度的值(例如,8 位整数而不是 32 位浮点数)来减少内存占用和计算需求。鉴于移动设备的有限 RAM 和计算能力,这种专业化至关重要。

能效,在移动环境中的一个关键关注点,影响了移动机器学习框架中执行模式的设计。与可能为了开发便利而使用急切执行的云框架不同,移动框架通常优先考虑基于图的执行,以实现潜在的节能。例如,苹果的 Core ML 采用编译模型方法,将机器学习模型转换为 iOS 设备可以高效执行的形式,优化性能和能耗。

与移动特定硬件和传感器的集成是另一个关键专门化领域。移动机器学习框架扩展了其云对应方的硬件加速能力,但重点在于移动特定处理器。例如,TensorFlow Lite 可以利用许多现代智能手机中发现的移动 GPU 和神经处理单元(NPUs)。高通的神经处理 SDK 旨在高效利用 Snapdragon SoC 中存在的 AI 加速器。这种针对特定硬件的优化通常涉及自定义算子实现和针对移动处理器的低级优化。

自动微分对于云环境中的训练至关重要,但在移动框架中通常被最小化或完全移除,以减少模型大小并提高推理速度。相反,移动机器学习框架专注于高效的推理,模型更新通常在设备外执行,然后部署到移动应用程序中。

移动机器学习框架通常包括模型更新和版本控制功能,允许在不需要完整应用更新的情况下部署改进的模型。一些框架支持有限的设备上学习,使模型能够适应用户行为或环境变化,同时不损害数据隐私。设备上学习的具体技术和实现策略在第十四章中详细说明,而隐私保护技术在第十五章中介绍。

移动机器学习框架的专门化共同使得在资源受限的移动设备上部署复杂的机器学习模型成为可能。这扩大了人工智能在移动环境中的潜在应用,从实时图像和语音识别到个性化用户体验。然而,有效地利用这些框架需要仔细考虑目标设备的性能、用户体验要求以及隐私影响,需要在模型性能和资源利用之间取得平衡。

微控制器和嵌入式系统实现

在资源限制的极端端,TinyML 框架在推动计算可行性的边界条件下运行。TinyML 框架是专为在极端资源受限的设备上部署机器学习模型而设计的专用软件基础设施,通常用于微控制器和低功耗嵌入式系统。这些框架解决了小型设备特有的处理能力、内存和能耗的严重限制。TinyML 框架的专门化主要关注极端模型压缩、严重受限环境的优化以及与微控制器特定架构的集成。

在 TinyML 框架中实现极端模型压缩是将移动和边缘框架中提到的量化技术推向了逻辑上的极限。虽然移动框架可能使用 8 位量化,但 TinyML 通常采用更加激进的技巧,例如模型参数的 4 位、2 位甚至 1 位(二进制)表示。例如,TensorFlow Lite Micro 框架就体现了这种做法(David 等人,2021),将模型压缩的边界推向了适合微控制器上千字节内存的极限。

TinyML 框架中的执行模型高度专门化。与一些云和移动框架中看到的动态图功能不同,TinyML 框架几乎只使用静态、高度优化的图。在 JAX 等框架中看到的即时编译方法在 TinyML 中通常不可行,因为内存限制。相反,这些框架通常采用提前编译技术来生成高度优化的、特定于设备的代码。

TinyML 框架中的内存管理比其他环境要受限制得多。虽然边缘和移动框架可能使用动态内存分配,但 TinyML 框架如uTensor通常依赖于静态内存分配以避免运行时开销和碎片化。这种方法需要在编译时仔细规划内存布局,与基于云的框架中更为灵活的内存管理形成鲜明对比。

TinyML 框架中的硬件集成高度特定于微控制器架构。与云框架中普遍看到的通用 GPU 支持或移动框架中移动 GPU/NPU 支持不同,TinyML 框架通常为特定的微控制器指令集提供优化。例如,ARM 的 CMSIS-NN(Lai, Suda, 和 Chandra,2018)为 Cortex-M 系列微控制器提供了优化的神经网络内核,这些内核通常集成到 TinyML 框架中。

自动微分的概念,在基于云的框架中至关重要,并在边缘和移动框架中存在一定程度的体现,但在 TinyML 框架中通常不存在。重点几乎完全集中在推理上,由于严重的计算限制,任何学习或模型更新通常都在设备外进行。

TinyML 框架在某种程度上也专注于电源管理,这在其他机器学习环境中是看不到的。像轮询和超低功耗唤醒功能这样的特性通常直接集成到机器学习管道中,使得始终在线的传感应用能够在小型电池上运行数年。

TinyML 框架的极端专业化使得机器学习部署在之前不可行的环境中成为可能,从智能尘埃传感器到植入式医疗设备。然而,这种专业化在模型复杂性和准确性方面带来了显著的权衡,需要仔细考虑机器学习能力与目标设备严重资源限制之间的平衡。

性能和资源优化平台

除了特定于部署的专业化之外,现代机器学习框架越来越多地将效率作为一级设计原则。以效率为导向的框架是专门工具,将计算效率、内存优化和能耗视为主要设计约束,而不是次要考虑因素。这些框架满足了日益增长的实用人工智能部署需求,其中资源限制从根本上塑造了算法选择。

传统框架通常将效率优化视为可选的附加功能,在模型开发之后应用。相比之下,以效率为导向的框架将优化技术直接集成到开发工作流程中,使开发者能够从开始就使用量化、剪枝和压缩约束来训练和部署模型。这种以效率为先的方法使得在传统框架计算上不可行的部署场景成为可能。

随着人工智能应用扩展到资源受限的环境,以效率为导向的框架的重要性也随之增长。现代生产系统需要能够在推理延迟(通常要求低于 10 毫秒)、内存使用(适应 GPU 内存限制)、能耗(延长电池寿命)和计算成本(减少云基础设施费用)等方面进行平衡的模型。这些限制与拥有丰富计算资源的科研环境相比,产生了显著不同的框架需求。

模型大小和计算缩减技术

以效率为导向的框架通过压缩感知的计算图设计来区分自己。与独立优化数学运算的传统框架不同,这些框架在整个计算管道中优化压缩表示。这种集成影响了框架堆栈的每一层,从数据结构到执行引擎。

神经网络压缩技术需要框架支持专门的数据类型和操作。量化感知训练需要能够在训练期间模拟降低精度算术的框架,同时保持全精度梯度以稳定优化。Intel Neural Compressor 是这种方法的例证,它提供了无缝集成 INT8 量化的 API,这些 API 可以集成到现有的 PyTorch 和 TensorFlow 工作流程中。该框架在训练期间自动插入模拟量化操作,使模型能够适应量化约束同时保持精度。

结构化剪枝技术需要能够高效处理稀疏张量操作的框架。这涉及到专门的存储格式(如压缩稀疏行表示)、优化的稀疏矩阵操作以及可以利用结构零的运行时系统。Apache TVM 展示了高级稀疏张量编译,自动为不同硬件后端生成稀疏操作的效率代码。

知识蒸馏工作流程代表了另一种以效率为导向的框架能力。这些框架必须协调教师-学生训练管道,管理运行多个模型同时产生的计算开销,同时提供用于自定义蒸馏损失的 API。Hugging Face Optimum 提供了全面的蒸馏工作流程,自动配置各种模型架构的教师-学生训练,减少了实现效率优化的工程复杂性。

集成硬件-框架性能调优

以效率为导向的框架在硬件-软件协同设计中表现出色,这种设计将框架架构和硬件能力一起优化。这种方法超越了通用的硬件加速,转向针对特定优化策略,这些策略在算法设计期间考虑硬件约束。

混合精度训练框架展示了这种协同设计理念。NVIDIA 的 PyTorch 自动混合精度(AMP)自动识别可以使用 FP16 算术操作的操作,同时保持 FP32 精度以保持数值稳定性。该框架分析计算图以确定最佳精度策略,在训练速度提升(在现代 GPU 上可达 1.5-2 倍)与数值精度要求之间取得平衡。这种分析需要在框架调度和硬件能力之间进行深度集成。

稀疏计算框架将这种协同设计方法扩展到利用硬件稀疏性支持。现代硬件,如 NVIDIA A100 GPU,包括专门的稀疏矩阵乘法单元,可以实现 2:4 结构化稀疏度(特定模式中 50% 的零),同时性能下降最小。像 Neural Magic 的 SparseML 这样的框架提供了用于训练符合这些特定硬件稀疏模式的模型的自动化工具,在不损失精度的同时实现显著的加速。

编译框架代表了硬件-软件协同设计的最复杂形式。Apache TVM 和 MLIR 提供了用于表达特定硬件优化的领域特定语言。这些框架分析计算图以自动为特定硬件目标生成优化的内核,包括定制 ASIC 和专用加速器。编译过程考虑硬件内存层次结构、指令集和并行化能力,以生成通常优于手动优化的代码。

真实世界部署性能要求

以效率为导向的框架通过系统性的资源管理和性能优化方法解决生产部署挑战。生产环境施加的约束与研究环境大不相同:推理延迟必须满足实时要求,内存使用必须适合分配的资源,能耗必须保持在预算内。

推理优化框架,如 NVIDIA TensorRT 和 ONNX Runtime,为生产部署提供了全面的工具链。TensorRT 应用激进优化技术,包括层融合(将多个操作组合成单个内核)、精度校准(自动确定最佳量化级别)和内存优化(减少操作之间的内存传输)。这些优化与未优化的框架相比,可以实现 3-7 倍的推理速度提升,同时保持精度在可接受的范围内。

内存优化代表了生产中的一个关键约束。DeepSpeed 和 FairScale 展示了高级内存管理技术,这些技术使得训练和推理超出 GPU 内存容量的模型成为可能。DeepSpeed 的 ZeRO 优化器将优化器状态、梯度和参数分区到多个设备上,与传统数据并行相比,内存使用量减少 4-8 倍。这些技术使得在标准硬件配置上训练具有数百亿参数的模型成为可能。

能量感知框架应对计算可持续性日益增长的重要性。功耗直接影响到云环境中的部署成本和移动应用中的电池寿命。例如,NVIDIA 的 Triton 推理服务器提供了功率感知调度,可以动态调整推理批处理和频率缩放,以满足能源预算同时保持吞吐量要求。

系统性性能评估方法

评估效率导向型框架需要综合指标,这些指标捕捉了精度、性能和资源消耗之间的多维权衡。传统的机器学习评估主要关注精度指标,但效率评估必须考虑计算效率(FLOPS 减少、推理加速)、内存效率(峰值内存使用、内存带宽利用率)、能源效率(功耗、每推理能耗)和部署效率(模型尺寸减少、部署复杂性)。

定量框架比较需要标准化的基准,这些基准测量代表性工作负载中的效率维度。MLPerf 推理提供了测量不同框架和硬件配置推理性能的标准基准。这些基准测量了常见模型架构的延迟、吞吐量和能耗,使得框架效率特性的直接比较成为可能。

性能分析框架使开发者能够了解其特定应用中的效率瓶颈。NVIDIA Nsight Systems 和 Intel VTune 提供了框架执行的详细分析,识别内存带宽限制、计算瓶颈和优化机会。这些工具与效率导向型框架集成,为提高应用性能提供可操作的见解。

效率导向型框架的演变代表了机器学习系统设计中的一次根本性转变,其中计算约束从开发初期就塑造了算法选择。这种方法使得在资源受限的环境中实现实用的人工智能部署成为可能,同时保持了现代机器学习框架作为强大开发工具的灵活性和表现力。

系统性框架选择方法

选择合适的机器学习框架需要系统性的评估,平衡技术需求与运营约束。这一决策过程不仅超越了简单的功能比较,还涵盖了整个系统生命周期,从开发到部署和维护。工程师必须评估多个相互关联的因素:技术能力(支持的运算、执行模型、硬件目标)、运营需求(部署约束、性能需求、可扩展性需求)和组织因素(团队专业知识、开发时间表、维护资源)。

框架选择过程遵循一种结构化方法,考虑三个主要维度:模型需求决定了框架必须支持哪些操作和架构,软件依赖定义了操作系统和运行时要求,硬件约束确立了内存和处理限制。这些技术考虑必须与团队专业知识、学习曲线、社区支持和长期维护承诺等实际因素相平衡。

这个决策过程还必须考虑第二章中概述的更广泛的系统架构原则,并与第十三章中详细说明的部署模式相一致。不同的部署场景通常青睐不同的框架架构:云训练需要高吞吐量和分布式能力,边缘推理优先考虑低延迟和最小资源使用,移动部署在性能和电池限制之间取得平衡,嵌入式系统优化最小内存占用和实时执行。

为了说明这些因素在实际中的相互作用,我们考察了 TensorFlow 生态系统,它通过其变体:TensorFlow、TensorFlow Lite 和 TensorFlow Lite Micro,展示了权衡的范围。虽然 TensorFlow 是我们的详细案例研究,但同样的选择方法广泛适用于框架景观,包括 PyTorch 用于研究型工作流程、ONNX 用于跨平台部署、JAX 用于函数式编程方法,以及针对特定领域的专用框架。

表 7.4 展示了 TensorFlow 变体之间的关键差异。每个变体代表了计算能力和资源需求之间的特定权衡。这些权衡在支持的运算、二进制大小和集成需求中体现出来。

表 7.4:TensorFlow 变体权衡:TensorFlow、TensorFlow lite 和 TensorFlow lite micro 代表了一系列设计选择,这些选择在模型表达能力、二进制大小和资源限制之间进行平衡,以适应不同的部署场景。支持的运算从完整的 TensorFlow 中的大约 1400 个减少到 TensorFlow lite micro 中的 50 个,反映了从训练能力到边缘设备上高效推理的转移;本机量化工具能够进一步优化资源受限环境。

TensorFlow TensorFlow Lite TensorFlow Lite for Microcontrollers
训练
推理 是(但边缘效率低) 是(且效率高) 是(且更高效)
操作数量 ~1400 ~130 ~50
本机量化工具

工程师在选择框架时分析三个主要方面:

  1. 模型需求决定了框架必须支持哪些操作和架构

  2. 软件依赖定义了操作系统和运行时要求

  3. 硬件限制确立了内存和处理限制

这种系统分析使工程师能够选择与其特定的部署要求和组织环境相一致的框架。当我们详细检查 TensorFlow 变体时,我们将探讨每个选择维度如何影响框架选择并塑造系统能力,提供一种可以应用于评估任何框架生态系统的方法。

模型要求

TensorFlow 变体之间的模型架构能力差异很大,在功能与效率之间有明显的权衡。表 7.4 量化了这四个关键维度之间的差异:训练能力、推理效率、操作支持和量化功能。

动态与静态计算图

框架之间一个关键的建筑区分在于它们的计算图构建方法。静态图(TensorFlow 1.x)需要在执行前定义整个计算,类似于在运行程序之前编译程序。动态图(PyTorch、TensorFlow 2.x eager 模式)在执行期间构建图,类似于解释型语言。这影响了调试的容易程度(动态图允许标准的 Python 调试)、优化机会(静态图允许更激进的优化)和部署复杂性(静态图简化了部署但需要更多的前期设计)。

TensorFlow 支持大约 1,400 个操作,并支持训练和推理。然而,正如表 7.4 所示,其推理能力对于边缘部署来说效率不高。TensorFlow Lite 将操作数量减少到大约 130 个操作,同时提高了推理效率。它消除了训练支持但添加了原生量化工具。TensorFlow Lite Micro 进一步限制了操作集到大约 50 个操作,通过这些限制实现了更高的推理效率。与 TensorFlow Lite 一样,它包括原生量化支持但移除了训练能力。

这种操作的逐步减少使得在越来越受限的设备上部署成为可能。在 TensorFlow Lite 和 TensorFlow Lite Micro 中添加原生量化提供了在完整 TensorFlow 框架中缺失的必要优化能力。量化将模型转换为使用更低精度的操作,从而减少了资源受限部署的计算和内存需求。这些优化技术,在第十章中进一步详细说明,在选择适用于特定部署场景的框架时,必须与第六章中讨论的数据管道需求一起考虑。

软件依赖

表 7.5 展示了区分 TensorFlow 变体的三个关键软件考虑因素:操作系统要求、内存管理能力和加速器支持。这些差异反映了每个变体针对特定部署的优化。

表 7.5:TensorFlow 变体权衡:TensorFlow、TensorFlow Lite 和 TensorFlow Lite Micro 在操作系统依赖性、内存管理和硬件加速方面提供不同的功能,反映了针对不同部署场景的设计选择。这些区别使开发者能够选择最适合资源受限设备或大规模服务器部署的变体,在功能与效率之间取得平衡。

TensorFlow TensorFlow Lite TensorFlow Lite for Microcontrollers
需要操作系统
模型内存映射
委托给加速器

操作系统依赖性在变体之间划定了根本的区别。TensorFlow 和 TensorFlow Lite 需要操作系统支持,而 TensorFlow Lite Micro 则无需操作系统支持。这使得 TensorFlow Lite Micro 能够减少内存开销和启动时间,尽管在需要时它仍然可以与实时操作系统如 FreeRTOS、Zephyr 和 Mbed OS 集成。

内存管理能力也区分了这些变体。TensorFlow Lite 和 TensorFlow Lite Micro 支持模型内存映射,允许直接从闪存存储访问模型,而不是将其加载到 RAM 中。TensorFlow 缺乏这种功能,反映了其针对内存资源丰富的环境的设计。随着部署转向资源受限的设备,内存映射变得越来越重要。

加速器委托能力进一步区分了这些变体。TensorFlow 和 TensorFlow Lite 都支持将计算委托给加速器,从而实现高效的计算分配。TensorFlow Lite Micro 缺少了这一功能,承认在嵌入式系统中专用加速器的可用性有限。这种设计选择保持了框架的最小占用空间,同时匹配典型的嵌入式硬件配置。

硬件限制

表 7.6 通过三个指标:基础二进制大小、内存占用和处理器架构支持,量化了 TensorFlow 变体之间的硬件要求。这些指标展示了针对受限计算环境的渐进式优化。

表 7.6:TensorFlow 硬件优化:随着 TensorFlow 变体针对越来越受限的硬件架构进行优化,它们展现出的资源需求(二进制大小和内存占用)逐渐减少,从而使得在从服务器到微控制器等不同设备上部署成为可能。优化的架构反映了这一趋势,从通用 CPU 和 GPU 转向适用于资源受限环境的 Arm Cortex-M 处理器和数字信号处理器。

TensorFlow TensorFlow Lite TensorFlow Lite for Microcontrollers
基础二进制大小 ~3-5 MB(根据平台和构建配置而变化) 100 KB ~10 KB
基础内存占用 ~5+ MB(最小运行开销) 300 KB 20 KB
优化架构 X86, TPUs, GPUs Arm Cortex A, x86 Arm Cortex M, DSPs, MCUs

如第 7.4 表第 7.4 表所示,不同变体之间的二进制文件大小显著减小:从 TensorFlow 的 3+ MB 到 TensorFlow Lite 的 100 KB,再到 TensorFlow Lite Micro 的 10 KB,反映了逐步减少功能和优化。

内存占用遵循类似的减少模式。TensorFlow 大约需要 5 MB 的基础内存,而 TensorFlow Lite 在 300 KB 内运行。TensorFlow Lite Micro 进一步降低内存需求至 20 KB,使得在高度受限的设备上部署成为可能。

处理器架构支持与每个变体的预期部署环境相匹配。TensorFlow 支持 x86 处理器和包括 TPU 和 GPU 在内的加速器,如第十一章第十一部分中详细所述,从而在数据中心实现高性能计算。TensorFlow Lite 针对移动和边缘处理器,支持 Arm Cortex-A 和 x86 架构。TensorFlow Lite Micro 专注于微控制器部署,支持 Arm Cortex-M 核心、数字信号处理器(DSPs)以及包括 STM32、NXP Kinetis 和 Microchip AVR 在内的各种微控制器单元(MCUs)。第十一章第十一部分中讨论的硬件加速策略和架构为理解这些处理器优化选择提供了基本背景。

生产就绪评估因素

嵌入式系统的框架选择不仅超越了模型架构的技术规范、硬件要求和软件依赖,还包括其他因素,这些因素会影响开发效率、维护需求和部署成功。框架迁移带来了重大的操作挑战,包括向后兼容性中断、版本间的自定义算子迁移以及生产停机风险。这些迁移问题在第十三章第十三部分中得到全面解决,该章节涵盖了迁移规划、测试程序和回滚策略。这些因素需要系统评估,以确保框架选择的最佳性。

性能优化

嵌入式系统中的性能涵盖了多个指标,而不仅仅是计算速度。框架评估必须考虑效率维度的定量权衡:

推理延迟决定了系统的响应性和实时处理能力。对于移动应用,典型的目标是图像分类的 10-50ms 和关键词检测的 1-5ms。边缘部署通常需要亚毫秒级响应时间以用于工业控制应用。与移动 CPU 上的 TensorFlow 相比,TensorFlow Lite 在典型的推理工作负载上实现了 2-5 倍的延迟降低,而像 TensorRT 这样的专用框架可以通过内核融合和精度优化在 NVIDIA 硬件上实现 10-20 倍的速度提升。

内存利用率影响静态存储需求和运行时效率。框架内存开销差异很大:TensorFlow 需要 5+ MB 的基线内存,TensorFlow Lite 在 300KB 内运行,而 TensorFlow Lite Micro 在 20KB 内运行。模型内存缩放遵循类似的模式:MobileNetV2 模型在 TensorFlow 中消耗大约 14MB,但在 TensorFlow Lite 中量化后仅消耗 3.4MB,这代表了一个 4 倍减少,同时保持了 95%以上的准确性。

功耗影响电池寿命和热管理需求。在典型的移动处理器上,量化 INT8 推理比 FP32 操作节省 4-8 倍的能量。与基于 CPU 的 FP32 计算的 0.1-0.5 TOPS/W 相比,苹果的神经网络引擎在 INT8 操作上实现了 7.2 TOPS/W 的效率。当框架支持针对特定硬件优化的结构化稀疏模式时,稀疏计算可以提供额外的 2-3 倍能量节省。

以 FLOPS 衡量的计算效率提供了标准化的性能比较。现代移动框架在高性能智能手机处理器上实现 10-50 GFLOPS,而像谷歌的 Edge TPU 这样的专用加速器在 2W 的功耗预算下提供 4 TOPS(INT8)。包括操作融合在内的框架优化技术可以将 FLOPS 利用率从典型工作负载的 10-20%提高到理论峰值性能的 60-80%。

部署可扩展性

可扩展性需求涵盖了技术能力和运营考虑因素。框架支持必须扩展到部署规模和场景:

设备缩放使得从微控制器到更强大的嵌入式处理器的一致部署成为可能。运营缩放支持从开发原型到生产部署的过渡。版本管理促进了部署设备上的模型更新和维护。框架必须在这些缩放维度上保持一致的性能特征。

TensorFlow 生态系统展示了框架设计如何在不同的部署场景中平衡相互竞争的需求。通过这个案例研究(分析模型需求、软件依赖、硬件约束以及运营因素)所展示的系统评估方法为评估任何框架生态系统提供了一个模板。无论是比较 PyTorch 用于研究工作流程的动态执行模型、ONNX 用于部署灵活性的跨平台标准化、JAX 用于性能优化的函数式编程方法,还是针对特定应用领域的专业框架,相同的分析框架指导着与项目需求和组织约束相一致的有信息决策。

开发支持与长期可行性评估

框架选择不仅超越了技术能力,还包括决定长期可行性和开发速度的更广泛生态系统。围绕框架的社区和生态系统对其演变、支持质量和集成可能性有重大影响。理解这些生态系统动态有助于预测框架在项目生命周期中的可持续性和开发生产力。

开发者资源和知识共享网络

框架社区的活力影响着开发和部署的多个实际方面。活跃的社区推动着更快的错误修复、更全面的文档和更广泛的硬件支持。社区规模和参与度指标(如 GitHub 活动、Stack Overflow 问题数量和会议出席情况)提供了框架势头和持久性的指标。

PyTorch 的学术社区推动了研究导向功能的快速创新,为新颖架构和实验技术提供了广泛的支持。这种社区关注导致了优秀的教育资源、研究可重复性工具和高级功能开发。然而,生产工具在历史上一直落后于研究能力,尽管像 PyTorch Lightning 和 TorchServe 这样的倡议解决了许多运营差距。

TensorFlow 的企业社区强调了现成工具和可扩展部署解决方案。这种关注产生了健壮的服务基础设施、全面的监控工具和企业集成能力。更广泛的 TensorFlow 生态系统包括专门工具,如用于生产机器学习管道的 TensorFlow Extended (TFX)、用于可视化的 TensorBoard 以及用于模型评估和验证的 TensorFlow Model Analysis。

JAX 的函数式编程社区专注于数学严谨性和程序转换能力。这种专业化的关注导致了强大的研究工具和优雅的数学抽象,但对于不熟悉函数式编程概念的开发者来说,学习曲线较为陡峭。

支持基础设施和第三方兼容性

框架的实际效用往往更多地取决于其生态系统工具,而不是其核心能力。这些工具决定了开发速度、调试有效性和部署灵活性。

Hugging Face 已成为自然语言处理模型库的事实标准,为 PyTorch、TensorFlow 和 JAX 后端提供一致的 API。高质量预训练模型和微调工具的可用性可以显著加速项目开发。TensorFlow Hub 和 PyTorch Hub 提供官方模型存储库,尽管第三方集合通常提供更广泛的选择和更新的架构。

PyTorch Lightning 在保持研究灵活性的同时,抽象了 PyTorch 大部分训练模板代码,解决了 PyTorch 在结构化训练工作流程中的历史弱点。Weights & Biases 和 MLflow 提供了跨多个框架的实验跟踪,使得无论底层框架选择如何,都能实现一致的工作流程管理。TensorBoard 已发展成为跨框架的可视化工具,尽管其集成与 TensorFlow 的结合最为紧密。

TensorFlow Serving 和 TorchServe 提供了生产就绪的服务解决方案,尽管它们的特性和操作特性差异很大。ONNX Runtime 已成为框架无关的服务解决方案,以牺牲一些框架特定优化为代价,实现了部署灵活性。云提供商的 ML 服务(如 AWS SageMaker、Google AI Platform、Azure ML)通常为特定框架提供原生集成,同时通过容器化部署支持其他框架。

框架特定的优化工具可以提供显著的性能优势,但会创造供应商锁定。TensorFlow 的 XLA 编译器和 PyTorch 的 TorchScript 提供了框架本地的优化路径,而像 Apache TVM 这样的工具则提供了跨框架的优化能力。框架特定与跨框架优化工具的选择会影响性能和部署灵活性。

长期技术投资考虑因素

长期框架决策必须考虑生态系统的发展和可持续性。框架的流行度可能会因技术创新、社区动力或企业战略变化而迅速变化。组织应通过多个指标评估生态系统健康:贡献者多样性(避免单一公司依赖)、资金稳定性、路线图透明度和向后兼容性承诺。

生态系统视角也影响着招聘和团队发展策略。框架选择会影响可用的人才库、培训需求和知识转移能力。团队必须考虑他们的框架选择是否与当地的专业知识、教育机构课程和行业招聘趋势相一致。

与现有组织工具和流程的集成代表另一个关键的生态系统考虑因素。框架与持续集成系统、部署管道、监控基础设施和安全工具的兼容性可以显著影响运营成本。一些框架与特定的云提供商或企业软件堆栈集成得更自然,从而创造运营优势或供应商依赖。

虽然深度生态系统集成可以提供开发速度优势,但团队应保持对迁移路径和跨框架兼容性的意识。使用标准化的模型格式如 ONNX,维护框架无关的数据管道,以及记录框架特定的定制化,可以保留未来框架转换的灵活性。

生态系统视角提醒我们,框架选择不仅涉及选择一个软件库,而且是加入一个社区并承诺一个不断发展的技术生态系统。理解这些更广泛的影响有助于团队做出在整个项目生命周期中保持可行和有利的框架决策。

系统框架性能评估

对框架效率的系统评估需要全面的指标,这些指标能够捕捉准确度、性能和资源消耗之间的多维度权衡。传统的机器学习评估主要关注准确度指标,但生产部署需要系统地评估计算效率、内存利用率、能耗和操作限制。

框架效率评估包括四个主要维度,这些维度反映了现实世界的部署需求。计算效率衡量框架有效利用可用硬件资源的能力,通常通过 FLOPS 利用率、内核效率和并行化有效性来量化。内存效率评估峰值内存使用和内存带宽利用率,这对于在资源受限设备上的部署是关键因素。能源效率量化功耗特性,对于移动应用和可持续计算至关重要。部署效率评估操作特性,包括模型大小、初始化时间和集成复杂性。

定量多维度性能分析

标准化比较需要跨代表性工作负载和硬件配置的定量指标。表 7.7 提供了使用代表生产部署场景的基准工作负载,对主要框架在效率维度上的系统比较。

表 7.7:框架效率比较:使用代表性硬件(服务器框架的 NVIDIA A100 GPU,移动框架的 ARM Cortex-A78)上的 ResNet-50 推理对主要机器学习框架在效率维度上的定量比较。指标反映了具有准确度保持在基线 1%以内的生产代表性工作负载。硬件利用率表示在典型操作中达到理论峰值性能的百分比。

框架 推理 延迟 (ms) 内存 使用 (MB) 能耗 (mJ/inference) 模型大小 缩减 硬件 利用率 (%)
TensorFlow 45 2,100 850 35
TensorFlow Lite 12 180 120 4x (量化) 65
TensorFlow Lite Micro 8 32 45 8x(剪枝+量化) 75
PyTorch 52 1,800 920 32
PyTorch Mobile 18 220 180 3x (量化) 58
ONNX Runtime 15 340 210 2x (优化) 72
TensorRT 3 450 65 2x (精度优化) 88
Apache TVM 6 280 95 3x (编译) 82

标准化基准测试协议

系统性框架评估需要标准化的基准测试方法,以捕捉不同部署场景下的效率特征。评估方法采用代表性的模型架构(ResNet-50 用于视觉,BERT-Base 用于语言处理,MobileNetV2 用于移动部署),标准化数据集(ImageNet 用于视觉,GLUE 用于语言),以及一致的硬件配置(NVIDIA A100 用于服务器评估,ARM Cortex-A78 用于移动评估)。

性能分析使用仪器测量框架开销、内核效率和资源利用模式。内存分析包括峰值分配测量、内存带宽利用率评估和垃圾收集开销量化。能耗测量采用硬件级功率监控(NVIDIA-SMI 用于 GPU 功率,专用移动功率测量工具)以捕捉推理和训练操作的实际能耗。

准确度保持验证确保效率优化在可接受的范围内保持模型质量。量化感知训练验证 INT8 模型实现<1%的准确度下降。剪枝技术验证稀疏模型在达到指定压缩比的同时保持目标准确度。知识蒸馏确认压缩模型保留了教师模型的能力。

实际操作性能考虑因素

框架效率评估必须考虑影响实际部署成功的运营约束。延迟分析包括冷启动性能(框架初始化时间)、预热特性(性能稳定要求)和稳态推理速度。内存分析包括静态要求(框架二进制大小、模型存储)和动态使用模式(峰值分配、内存碎片、清理效率)。

可扩展性评估评估框架在以下生产负载条件下的行为:并发请求处理、批处理效率以及多个模型实例之间的资源共享。集成测试验证框架与生产基础设施的兼容性,包括容器部署、服务网格集成、监控系统兼容性和可观察性工具支持。

可靠性评估评估框架在长时间运行下的稳定性、错误处理能力和恢复机制。性能一致性测量识别在持续负载条件下的执行时间、内存使用稳定性和热行为的变化。

结构化框架选择流程

系统化的框架选择需要结构化的评估,平衡效率指标与运营要求和组织约束。决策框架评估技术能力(支持的操作、硬件加速、优化功能),运营要求(部署灵活性、监控集成、维护开销),以及组织因素(团队专业知识、开发速度、生态系统兼容性)。

效率要求规范定义了精度和性能之间的可接受权衡,建立了资源限制(内存限制、电力预算、延迟要求),并确定了关键优化功能(量化支持、剪枝能力、硬件特定加速)。这些要求指导框架评估优先级,并消除无法满足基本限制的选项。

风险评估考虑框架成熟度、生态系统稳定性和迁移复杂性。供应商依赖性评估评估框架治理、许可条款和长期支持承诺。迁移成本分析估计采用框架所需的工作量、团队培训需求和基础设施修改。

对框架效率的系统评估方法为部署决策提供了定量基础,同时考虑了决定生产成功的更广泛的运营环境。这种方法使团队能够选择针对其特定效率要求的框架,同时保持适应不断变化的部署场景所需的灵活性。

常见框架选择误区

机器学习框架代表复杂的软件生态系统,它们在代表开发者做出关键架构决策的同时,抽象了大量的计算复杂性。可用的框架多样性(每个框架都有独特的设计哲学和优化策略)往往导致对它们可互换性和适当选择标准的误解。了解这些常见的谬误和陷阱有助于从业者做出更明智的框架选择。

谬误: 所有框架为同一模型提供等效的性能。

这种误解导致团队在选择框架时仅基于 API 的便利性或熟悉度,而没有考虑性能影响。不同的框架使用不同的优化策略、内存管理方法和硬件利用模式来实现操作。一个在 PyTorch 中表现高效的模型可能在 TensorFlow 中执行不佳,这是由于不同的图优化策略。同样,框架开销、自动微分实现和张量操作调度甚至对于相同的模型架构也能造成显著的性能差异。框架选择需要基准测试实际的工作负载,而不是假设性能等效。

陷阱: 根据流行度而非项目需求选择框架。

许多从业者根据社区规模、教程可用性或行业采用率来选择框架,而没有分析他们的具体技术需求。流行的框架通常针对通用用例,而不是专门的部署场景。针对大规模云训练优化的框架可能不适合移动部署,而专注于研究的框架可能缺乏生产部署能力。有效的框架选择需要将技术能力与特定需求相匹配,而不是跟随流行趋势。

谬误: 框架抽象隐藏了所有系统级复杂性。

这种信念假设框架会自动处理所有性能优化和硬件利用,而不需要开发者理解。虽然框架提供了便利的抽象,但要实现最佳性能需要理解它们背后的计算模型、内存管理策略和硬件映射方法。将框架视为黑盒的开发者经常会遇到意外的性能瓶颈、内存问题或部署失败。有效的框架使用需要理解提供的抽象及其背后的实现影响。

陷阱: 通过框架特定的模型格式和 API 实现供应商锁定。

团队通常围绕单个框架构建整个开发工作流程,而不考虑互操作性需求。框架特定的模型格式、自定义操作和专有优化技术创建了复杂的依赖关系,这些依赖关系会使得迁移、部署或跨不同工具的协作变得复杂。当部署需求变化、性能需求发展或框架开发方向与项目目标不一致时,这种锁定变得问题重重。维护模型的可移植性需要关注基于标准的格式,并避免无法跨平台转换的框架特定功能。在实施可能需要在不同部署环境中进行模型审计、公平性测试或偏差缓解的负责任 AI 实践第十七章时,这些考虑变得尤为重要。

陷阱: 在选择开发框架时忽视生产基础设施需求。

许多团队在选择框架时基于开发便利性,而没有考虑它们如何与生产基础设施集成以进行模型服务、监控和生命周期管理。一个在研究和原型设计方面出色的框架可能缺乏强大的模型服务能力,无法与现有的监控系统集成,或提供不足的 A/B 测试和逐步部署支持。生产部署通常需要额外的组件,如负载均衡、缓存、模型版本控制和回滚机制,这些可能与选定的开发框架不太匹配。一些框架在训练方面表现出色,但需要单独的服务系统,而其他框架提供集成管道,可能不符合企业安全或可扩展性要求。有效的框架选择必须考虑整个生产生态系统,包括容器编排、API 网关集成、可观察性工具和操作程序,而不仅仅是关注模型开发的便利性。

摘要

机器学习框架代表了将数学概念转化为构建和部署 AI 系统的实用计算工具的软件抽象。这些框架封装了复杂的操作,如自动微分、分布式训练和硬件加速,通过程序员友好的接口实现,从而在多样化的应用领域内实现高效的开发。从基本的数值库到现代框架的演变展示了软件基础设施如何塑造机器学习开发的可访问性和能力。

这种进化产生了一个具有不同优化策略的多样化生态系统。当代框架体现了不同的设计理念,反映了机器学习开发中的不同优先级。以研究为重点的框架优先考虑灵活性和快速实验,使开发者能够快速迭代新的架构和算法。面向生产的框架强调可扩展性、可靠性和大规模系统的部署效率。专门化的框架针对特定的部署环境,从云规模的分布式系统到资源受限的边缘设备,每个框架都针对不同的性能和效率要求进行优化。

关键要点

  • 框架通过开发者友好的接口抽象了复杂的计算操作,如自动微分和分布式训练

  • 不同的框架体现了不同的设计理念:研究灵活性 vs 生产可扩展性 vs 部署效率

  • 在不同的计算环境中进行专业化需要针对云、边缘、移动和微控制器部署进行优化的框架变体

  • 对框架架构的理解能够使开发者在不同部署环境中进行明智的工具选择、性能优化和有效的调试

框架开发持续向提高开发者生产力、更广泛的硬件支持和更灵活的部署选项进化。跨平台编译、动态优化和统一的编程模型旨在降低在多样化的计算环境中开发和部署机器学习系统的复杂性。了解框架的能力和限制使开发者能够为第十章中的模型优化技术、第十一章中的硬件加速策略和第十三章中的部署模式做出明智的架构决策。


AI 训练

DALL·E 3 提示:一幅用于 AI 训练的插图,描绘了一个神经网络的神经元正在被修复和激活。场景包括一个庞大的神经元网络,每个神经元都在发光和激活,以表示活动和学习。在这些神经元中,类似工程师和科学家的微小人物正在积极工作,修复和调整神经元。这些微型工人象征着训练网络的过程,调整权重和偏差以实现收敛。整个场景是 AI 训练中复杂且协作努力的视觉隐喻,工人代表着神经网络内部的持续优化和学习。背景是一个复杂的相互连接的神经元阵列,营造出深度和复杂性的感觉。

图片

目的

为什么现代机器学习问题需要新的分布式计算和系统架构方法?

机器学习训练产生的计算需求超出了单机能力,需要协调多个设备和数据中心计算的分布式系统。训练工作负载具有独特的特征:庞大的数据集无法全部装入内存,拥有数十亿参数的模型需要协调更新,以及需要跨分布式资源持续同步的迭代算法。这些扩展需求在内存管理、通信效率、容错性和资源调度方面给系统带来了挑战,而传统系统并未设计来处理这些挑战。随着模型复杂性的指数增长,理解分布式训练系统对于任何具有实际意义的机器学习应用都变得必要。为大规模训练开发的系统工程原则直接影响着部署架构、成本结构和跨行业的解决方案可行性。

学习目标

  • 解释神经网络中的数学运算(矩阵乘法、激活函数、反向传播)如何转化为计算和内存系统需求

  • 分析训练管道中的性能瓶颈,包括数据加载、内存带宽限制和计算利用率模式

  • 高效地设计集成数据预处理、计算遍历和参数更新的训练管道架构

  • 应用单机优化技术,包括混合精度训练、梯度累积和激活检查点,以最大化资源利用率

  • 比较分布式训练策略(数据并行、模型并行、流水线并行),并根据模型特性和硬件约束选择适当的方法

  • 评估用于训练工作负载的专用硬件平台(GPU、TPU、FPGA、ASIC),并针对特定架构特性优化代码

  • 在训练框架中实现优化算法(SGD、Adam、AdamW)的同时,理解它们的内存和计算影响

  • 批判常见的训练系统设计决策,以避免性能陷阱和扩展瓶颈

训练系统演变与架构

训练是机器学习系统中最具挑战性的阶段,在这一阶段,理论结构通过计算优化变为实际现实。在第二章 Chapter 2 中建立的系统设计方法、第六章 Chapter 6 中探索的数据管道架构以及第七章 Chapter 7 中考察的计算框架的基础上,本章探讨了算法理论、数据处理和硬件架构如何在智能系统的迭代优化中相互融合。

训练构成了机器学习系统生命周期中最计算密集的阶段,需要谨慎地运用分布式系统工程原则来编排数学优化过程。当代的训练工作负载对计算能力提出了超出传统计算范式的需求:拥有数十亿参数的模型需要 TB 级的内存容量,训练语料库跨越 PB 级存储系统,基于梯度的优化算法需要在数千个处理单元之间进行同步计算。这些计算规模在内存层次管理、节点间通信效率和资源分配策略上为系统工程带来了挑战,这些挑战将训练基础设施与通用计算架构区分开来。

在前几章中建立的设计方法在训练阶段充当了架构基础。第二章中提到的模块化系统架构 Chapter 2 使得分布式训练编排成为可能,第六章中提到的工程化数据处理管道 Chapter 6 提供了持续的训练样本流,第七章中提到的计算框架 Chapter 7 提供了必要的算法抽象。训练系统集成代表了理论设计原则与性能工程约束相遇的地方,为第三部分中探讨的优化技术建立了计算基础。

本章开发了可扩展训练基础设施的系统工程基础。我们探讨了在参数模型中将数学运算转换为具体计算需求的过程,分析了训练管道中的性能瓶颈,包括内存带宽限制和计算吞吐量约束,并设计了在保持容错保证的同时实现高效率的系统。通过探索单节点优化策略、分布式训练方法和专用硬件利用模式,本章发展了构建能够从实验原型扩展到生产级部署的训练基础设施所需的系统工程视角。

灯塔示例:训练 GPT-2

本章使用训练 GPT-2(15 亿参数)作为一个一致的参考点,将抽象概念具体化。GPT-2 是一个理想的教学示例,因为它:

  • 跨越规模范围:足够大,需要严肃的优化,足够小,无需大规模基础设施进行训练

  • 具有完善的架构文档:48 个 transformer 层,1280 个隐藏维度,20 个注意力头

  • 表现出所有关键训练挑战:内存压力、计算强度、数据管道复杂性

  • 代表现代机器学习系统:基于 Transformer 的模型主导着当代机器学习

Transformer 架构入门

GPT-2 使用 Transformer 架构(在第四章中详细说明),通过自注意力机制处理文本。理解这些关键计算模式为本章中的训练示例提供了必要的背景:

  • 自注意力:通过矩阵运算(查询×键的转置)计算序列中所有单词之间的关系,产生注意力分数,这些分数衡量每个单词对其他单词的影响程度

  • 多头注意力:在多个“头”之间并行化注意力(GPT-2 使用 20 个),每个“头”学习不同的关系模式

  • Transformer 层:堆叠注意力与前馈网络(GPT-2 有 48 层),实现层次化特征学习

  • 关键计算模式:主要由大型矩阵乘法(注意力分数计算、前馈网络)主导,这些计算模式受益于 GPU 并行化

这种架构对矩阵乘法和顺序依赖的严重依赖,为我们探索的具体训练系统挑战创造了条件:巨大的激活内存需求、分布式训练中的通信瓶颈以及混合精度优化的机会。

关键 GPT-2 规格

  • 参数:1.542B(确切计数为 1,558,214,656)

  • 训练数据:OpenWebText(约 40GB 文本,约 90 亿个标记)

  • 批处理配置:通常在 8-32 个 GPU 上实现 512 个有效批处理大小

  • 内存占用:约 3GB 参数(FP16:16 位浮点数,每个值使用 2 字节,而 FP32 使用 4 字节),约 18GB 激活(batch_size=32)

  • 训练时间:在 32 个 V100 GPU 上约为 2 周

关于精度格式的说明:在本章中,我们参考了FP32(32 位)和FP16(16 位)浮点数格式。FP16 将内存需求减半,并允许在现代具有 Tensor Core 的 GPU 上实现更快的计算。混合精度训练(详见第 8.5.4 节)策略性地将 FP16 用于大多数操作与 FP32 用于数值稳定性相结合,实现了 2 倍的内存节省和 2-3 倍的速度提升,同时保持精度。

🔄 GPT-2 示例标记出现在该特定模型阐明讨论中的概念的关键点。每个示例都提供了定量规格、性能权衡以及在训练此模型时遇到的具体实现决策。

训练系统

现代机器学习模型的发展依赖于专门的计算框架,这些框架管理着迭代优化的复杂过程。这些系统与传统计算基础设施不同,需要仔细协调数据处理、梯度计算、参数更新以及跨可能成千上万的设备进行分布式协调。理解构成训练系统及其与通用计算的不同,为后续的架构决策和优化策略提供了基础。

机器学习训练系统是执行模型参数的迭代优化的计算框架,通过协调数据处理梯度计算和跨硬件和软件基础设施的分布式计算

设计有效的训练架构需要认识到机器学习训练系统代表一类独特的计算工作负载,对硬件和软件基础设施有独特的需求。当你在 PyTorch 或 TensorFlow 等框架中执行训练命令时,这些系统必须高效地在大数据集上管理重复计算,同时处理超出通用计算架构能力的内存需求和数据移动模式。

训练工作负载表现出三个特征,使其与传统计算区分开来:从大规模模型中进行的迭代梯度计算带来的极端计算强度,存储参数、激活和优化器状态时产生的巨大内存压力,以及需要跨分布式资源同步参数更新的复杂数据依赖。对于大型语言模型的一次训练运行大约需要约102310^{23}次浮点运算(T. Brown 等人 2020),包括激活存储在内的内存占用达到数太字节,以及数千台设备的协调——这些需求是通用系统从未设计来处理的。

理解为什么当代训练系统演变成当前的架构需要考察计算系统如何逐步适应日益增长的工作负载。虽然训练侧重于迭代的优化以实现学习,但推理系统(本书中详细阐述)优化的是低延迟的预测服务。这些代表了两种互补但不同的计算范式。从通用计算到专用训练系统的架构演进揭示了现代训练基础设施设计所依据的系统原则。与传统的超高性能计算工作负载不同,训练系统表现出特定的特征,这些特征影响了它们的设计和实现。

机器学习训练的计算架构演变

计算系统架构经历了不同的世代演变,每个新时代都是在前一代进步的基础上建立的,同时引入了针对新兴应用需求的专用优化(图 8.1)。这种演变与第七章中详细介绍的机器学习框架和软件堆栈的发展并行,它们与硬件共同进化,以实现这些计算资源的有效利用。这一进展展示了硬件如何适应应用需求来塑造现代机器学习系统。

图片

图 8.1:计算系统演变:硬件进步持续适应机器学习工作负载不断增长的需求,从集中式主机过渡到如 gpu 和针对并行处理和大规模数据集优化的 AI 超计算系统等专用架构。这一进展反映了通过增加计算能力和内存带宽来加速模型训练和推理的趋势。

电子计算始于主机时代。ENIAC1(1945 年)证明了大规模电子计算的可行性,而 IBM System/3602(1964 年)引入了标准化指令集和内存层次结构的架构原则。这些基本概念为所有后续计算系统提供了基础。

在这些基础计算原则的基础上,高性能计算(HPC)系统(Thornton 1965)专门用于科学计算。CDC 66003 和后来的系统如 CM-54 (T. M. Corporation 1992)针对密集矩阵运算和浮点计算进行了优化。

HPC 系统为科学工作负载实现了特定的架构特性:用于数组操作的高带宽内存系统、用于数学计算的向量处理单元以及用于集体通信模式的专用互连。科学计算需要强调数值精度和稳定性,处理器和内存系统设计用于常规、可预测的访问模式。互连支持紧密同步的并行执行,使计算节点之间的集体操作效率更高。

随着对互联网规模处理需求的增长,仓库规模计算标志着下一个进化步骤。谷歌数据中心实现 5 (Barroso and Hölzle 2007)为互联网规模数据处理引入了新的优化。与专注于紧密耦合科学计算的高性能计算系统不同,仓库计算处理松散耦合的任务,具有不规则的数据访问模式。

WSC 系统引入了架构变化,以支持独立任务的高吞吐量,具有强大的容错和恢复机制。存储和内存系统适应了高效处理稀疏数据结构,远离了 HPC 的密集数组优化。资源管理系统演变为支持多个应用程序共享计算基础设施,与 HPC 的专用应用程序执行模型形成对比。

高性能计算和仓库规模系统都没有完全满足机器学习训练的独特需求。每个计算时代都针对不同的工作负载特征进行了优化,这些特征仅部分符合 AI 训练需求:

  • 高性能计算:针对密集、浮点运算量大、紧密耦合的模拟进行了优化。高性能计算为 AI 训练所需的高带宽互连和并行数值计算奠定了基础,但专注于常规、可预测的访问模式,不适合神经网络训练的动态内存需求。

  • 仓库规模计算:针对稀疏、整数密集型、松散耦合的数据处理进行了优化。仓库规模计算展示了在生产人工智能系统中必要的容错性和大规模,但强调了独立并行任务,这与分布式训练中所需的同步梯度更新形成对比。

  • AI 训练:提出了独特的挑战,需要同时进行密集的 FP16/FP32 计算(如高性能计算)和大规模数据量(如仓库规模计算),同时还要处理迭代、同步的梯度更新带来的复杂性。这种独特的需求组合——密集的参数更新、复杂的内存访问模式以及协调的分布式计算——推动了今天专门化人工智能超计算系统的发展。

2012 年 AlexNet6 (Krizhevsky, Sutskever, and Hinton 2017a) 的成功证明了现有系统无法有效地处理这种需求的融合。神经网络训练需要新的内存管理和设备间通信方法,而高性能计算的科学重点紧密耦合和仓库计算的数据处理松散耦合都没有解决这些问题。

这种专业化的需求引领了人工智能超计算时代的到来,始于 2015 年,这是这一进化链的最新一步。NVIDIA GPU7 和 Google TPU8 引入了专门针对神经网络计算进行优化的硬件设计,超越了现有架构的适应性。这些系统实现了新的并行处理、内存访问和设备通信方法,以处理模型训练的独特模式。这些架构在满足科学计算的数值精度需求的同时,也满足了仓库系统的规模要求,并增加了对神经网络优化迭代特性的专门支持。这些专用训练加速器的全面设计原则、架构细节和优化策略在第十一章中进行了详细探讨,而本章则专注于训练系统编排和管道优化。

这种架构的演进说明了为什么传统的计算系统在神经网络训练方面证明是不够的。如表 8.1 所示,虽然高性能计算系统为并行数值计算提供了基础,而仓库规模系统展示了大规模的分布式处理,但它们都没有完全解决模型训练的计算模式。现代神经网络以密集的参数更新、复杂的内存访问模式和协调的分布式计算相结合的方式,要求新的架构方法。

理解这些独特的特征及其从先前计算时代的演变,可以解释为什么现代 AI 训练系统需要专门的硬件特性和优化的系统设计。这一历史背景为详细检查机器学习训练系统架构提供了基础。

表 8.1:计算时代演变:系统架构逐渐适应不断变化的工作负载需求,从通用计算过渡到针对神经网络训练优化的专用设计。高性能计算(HPC)确立了并行处理基础,而仓库规模系统实现了分布式计算;然而,现代神经网络需要平衡密集参数更新、复杂内存访问和协调分布式计算的架构。

时代 主要工作负载 内存模式 处理模型 系统重点
主机 顺序批处理 简单的内存层次结构 单指令流 通用计算
HPC 科学模拟 规则数组访问 同步并行 数值精度,集体操作
仓库规模 互联网服务 稀疏,不规则访问 独立并行任务 吞吐量,容错性
AI 超计算 神经网络训练 参数密集,混合访问 混合并行,分布式 训练优化,模型规模

机器学习开发生命周期中的训练系统

训练系统通过专门的计算框架运行。现代机器学习模型的发展依赖于用于训练和优化的专用系统。这些系统结合了硬件和软件组件,必须高效地处理大量数据集,同时保持数值精度和计算稳定性。尽管这些系统快速发展和实施多样化,但训练系统具有共同的特征和需求,使其与传统计算基础设施区分开来。

这些训练系统提供了开发预测模型所需的核心基础设施。它们执行模型参数的数学优化,将输入数据转换为用于模式识别、语言理解和决策自动化等任务的计算表示。训练过程涉及对数据集的系统迭代,以最小化误差函数并实现最佳模型性能。

训练系统作为更广泛机器学习流程中的基本组成部分,建立在第一章中引入的基础概念之上。它们与预处理框架接口,这些框架标准化并转换原始数据,同时连接到部署架构,以实现模型服务。训练系统的计算效率和可靠性直接影响从初始实验到模型验证再到生产部署的开发周期。这种端到端视角将训练优化与第十三章中探讨的更广泛人工智能系统生命周期考虑因素联系起来。

随着最近架构的进步,这种操作范围已经扩大。Transformer 架构 9 和大规模模型的出现为训练系统引入了新的要求。当前的实现必须高效地处理 PB 级数据集,协调跨多个加速器的分布式训练,并优化包含数十亿参数的模型的内存利用率。数据并行 10、模型并行 11 和跨设备通信的管理在现代训练架构中提出了技术挑战。这些分布式系统复杂性促使专门的 AI 工作流程管理工具(第五章)自动化大规模训练编排的许多方面。

训练系统还对机器学习开发的操作考虑产生影响。系统设计必须解决多个技术约束:计算吞吐量、能耗、硬件兼容性和随着模型复杂性的增加的可扩展性。虽然本章重点介绍训练系统的计算和架构方面,但能源效率和可持续性考虑在第十八章中进行了探讨。这些因素决定了机器学习实现在不同规模和应用中的技术可行性和操作可行性。

训练基础设施的系统设计原则

训练实现需要系统视角。训练模型的实际执行与系统设计紧密相连。训练不仅仅是数学优化问题;它是一个系统驱动的流程,需要仔细编排计算硬件、内存和数据移动。

训练工作流程由相互依赖的阶段组成:数据预处理、正向和反向传递以及参数更新,这些阶段扩展了来自第三章的基本神经网络概念。每个阶段都对系统资源提出特定的要求。例如,数据预处理阶段依赖于存储和 I/O 子系统为计算硬件提供连续输入。输入数据的质量和可靠性至关重要——数据验证、损坏检测、特征工程、模式强制和管道可靠性策略在第六章中有详细说明。虽然第六章侧重于确保数据质量和一致性,但本章探讨了在训练过程中数据移动、转换吞吐量和交付给计算资源的系统级效率。

虽然传统的处理器如 CPU 能够有效地处理许多训练任务,但日益复杂的模型推动了硬件加速器的采用。图形处理单元(GPUs)和专门的机器学习处理器可以并行处理数学运算,为矩阵密集型计算提供显著加速。这些加速器与 CPU 一起处理梯度计算和参数更新等操作,使得能够训练具有理论基础的分层表示,这些理论基础在第四章中进行了探讨。这些阶段的性能取决于系统如何管理内存带宽和通信延迟等瓶颈。

这些相互关联的工作流程阶段揭示了系统架构如何直接影响训练效率。系统限制通常决定了训练工作负载的性能限制。现代加速器通常受内存带宽的限制,因为数据在内存层次结构之间的移动可能比计算本身慢且能耗更高(David A. Patterson and Hennessy 2021a)。在分布式设置中,设备间的同步引入了额外的延迟,而互连的性能(例如,NVLink、InfiniBand)在其中发挥着重要作用。

通过第 8.5.1 节中详细说明的系统化方法,优化训练工作流程克服了这些限制。像重叠计算与数据加载、混合精度训练(Micikevicius et al. 2017)和高效内存分配等技术解决了限制训练性能的三个主要瓶颈。这些低级优化补充了第十章中涵盖的高级模型压缩策略,形成了一种综合的训练效率方法。

系统思维不仅超越了基础设施优化,还扩展到了设计决策。系统级约束通常指导新的模型架构和训练方法的开发。在第十一章中讨论的硬件-软件协同设计原则 Chapter 11 展示了理解系统能力如何激发全新的架构创新。例如,内存限制推动了更高效神经网络架构的研究(Vaswani et al. 2017),而分布式系统中的通信开销影响了优化算法的设计。这些调整展示了如何在给定的计算范围内,实际系统考虑如何塑造机器学习方法的演变。

例如,训练大型 Transformer 模型 12 需要在多个设备上划分数据和模型参数。这引入了同步挑战,尤其是在梯度更新期间。如NVIDIA 的集体通信库(NCCL)之类的通信库能够实现高效的梯度共享,为分布式训练优化技术提供了基础。第十二章中讨论的基准测试方法 Chapter 12 提供了评估这些分布式训练性能特性的系统方法。这些例子说明了系统级考虑如何影响现代训练工作流程的可行性和效率。

数学基础

上述建立的系统视角揭示了为什么理解训练核心的数学操作至关重要。这些操作不是抽象的概念,而是具体的计算,它们决定了训练系统设计的各个方面。神经网络数学的计算特性直接决定了硬件需求、内存架构和并行化约束。当系统架构师选择 GPU 而不是 CPU、设计内存层次结构或选择分布式训练策略时,他们是在回应这些数学操作的具体需求。

上述讨论的专业化训练系统是专门设计来高效执行这些操作的。理解这些数学基础是至关重要的,因为它们直接决定了系统需求:操作类型决定了硬件专业化的需求(为什么矩阵乘法单元在现代加速器中占主导地位),内存访问模式影响了缓存设计(为什么激活存储成为瓶颈),计算依赖性塑造了并行化策略(为什么某些操作不能简单地分布式)。当我们之前讨论人工智能超计算与高性能计算系统不同时,这种区别源于每个系统必须执行的数学操作的不同。

训练系统必须反复执行三类操作。首先,前向传播通过矩阵乘法和激活函数计算预测。其次,通过反向传播计算梯度,使用存储的激活和链式法则来计算参数更新。第三,参数更新使用保持动量和自适应学习率状态的优化算法应用梯度。每一类都表现出独特的计算模式和系统要求,训练架构必须适应。

这些操作的计算特性直接影响了之前讨论的系统设计决策。矩阵乘法主导了前向和后向传播,占用了 60-90%的训练时间(K. He et al. 2016),这也解释了为什么专门的矩阵单元(GPU 张量核心、TPU 收缩阵列)成为了训练硬件的核心。这种计算主导性塑造了现代训练架构,从硬件设计选择到软件优化策略。用于梯度计算的激活存储产生了与批量大小和网络深度成比例的内存压力,这促使我们探索内存层次结构和梯度检查点等优化技术。前向传播、梯度计算和参数更新之间的迭代依赖关系阻止了任意并行化,限制了可扩展的分布式训练策略。理解这些数学操作及其系统级影响是理解现代训练系统如何实现效率的基础。

神经网络计算

神经网络训练包括重复的矩阵操作和非线性变换。虽然这些操作在概念上很简单,但它们创造了系统级挑战,这些挑战主导了现代训练基础设施。通过引入反向传播和开发高效的矩阵计算库,例如 BLAS(Dongarra et al. 1988),Rumelhart、Hinton 和 Williams(1986)的基础性工作为现代训练架构奠定了基础。

神经网络中的数学操作

神经网络的核心是前向传播的过程,在最简单的情况下,它涉及两个主要操作:矩阵乘法和激活函数的应用。矩阵乘法构成了网络每一层的线性变换的基础。这个方程代表了信息如何通过神经网络每一层流动:

在第 ll 层,计算可以描述为:A(l)=f(W(l)A(l1)+b(l)) A^{(l)} = f\left(W^{(l)} A^{(l-1)} + b^{(l)}\right) 其中:

  • A(l1)A^{(l-1)} 表示前一层(或第一层的输入层)的激活值,

  • W(l)W^{(l)} 是第 ll 层的权重矩阵,其中包含网络学习到的参数,

  • b(l)b^{(l)} 是第 ll 层的偏置向量,

  • f()f(\cdot) 是逐元素应用激活函数(例如 ReLU、sigmoid)以引入非线性。

矩阵运算

理解这些数学运算如何转化为系统需求需要检查神经网络中的计算模式,这些模式围绕各种类型的矩阵运算展开。理解这些运算及其演变揭示了为什么在机器学习训练系统中出现了特定的系统设计和优化。

稠密矩阵-矩阵乘法

基于上述建立的矩阵乘法主导地位,这些计算模式的演变推动了算法和硬件的创新。早期的神经网络实现依赖于基于标准 CPU 的线性代数库,但现代训练的规模需要专门的优化。从斯特拉斯恩算法 13,它将原始的O(n3)O(n³)复杂度降低到大约O(n2.81)O(n^{2.81}) (Strassen 1969),到当代的硬件加速库如cuBLAS,这些创新不断推动计算效率的极限。

这种计算主导地位推动了系统级优化。现代系统通过多个单元的并行处理实现分块矩阵计算。随着神经网络规模的扩大,这些乘法开始需要大量的内存资源,因为权重矩阵和激活矩阵都必须在训练期间的逆传播过程中保持可访问。硬件设计适应了优化这些密集乘法模式,同时管理不断增长的内存需求。

GPT-2 注意力层计算

每个 GPT-2 层执行注意力计算,这些计算体现了密集矩阵乘法的需求。对于一个 batch_size=32,sequence_length=1024,hidden_dim=1280 的单个注意力头:

查询、键、值投影(3 次独立的矩阵乘法):FLOPS=3×(batch×seq×hidden×hidden) \text{FLOPS} = 3 \times (\text{batch} \times \text{seq} \times \text{hidden} \times \text{hidden}) =3×(32×1024×1280×1280)=161 billion FLOPS = 3 \times (32 \times 1024 \times 1280 \times 1280) = 161 \text{ billion FLOPS}

注意力分数计算(Q × K^T):FLOPS=batch×heads×seq×seq×hidden/heads \text{FLOPS} = \text{batch} \times \text{heads} \times \text{seq} \times \text{seq} \times \text{hidden/heads} =32×20×1024×1024×64=42.9 billion FLOPS = 32 \times 20 \times 1024 \times 1024 \times 64 = 42.9 \text{ billion FLOPS}

计算规模

  • 单个注意力层的总量:~204B FLOPS 正向传递

  • 在 GPT-2 的 48 层中:每训练步骤~9.8 万亿次 FLOPS

  • 在 50K 个训练步骤后:~490 petaFLOPS 总训练计算

系统影响:V100 GPU 的影响:一个 V100 GPU(峰值 FP16 为 125 TFLOPS,带有 Tensor Cores 时为 28 TFLOPS,不带时为 28 TFLOPS)在 100%利用率下,仅注意力计算每步就需要 79 秒。实际的训练步骤需要 180 到 220 毫秒,需要 8 到 32 个 GPU 才能达到这种吞吐量。

矩阵-向量操作

在矩阵-矩阵操作之外,随着神经网络架构中归一化技术的引入,矩阵-向量乘法变得至关重要。尽管在计算上比矩阵-矩阵乘法简单,但这些操作在系统上提出了挑战。由于它们的并行化潜力有限,它们表现出较低的硬件利用率。这一特性影响了硬件设计和模型架构决策,尤其是在处理顺序输入或计算层统计的网络中。

批量操作

认识到矩阵-向量操作的局限性,批次的引入 14 改变了神经网络中的矩阵计算。通过同时处理多个输入,训练系统将矩阵-向量操作转换为更高效的矩阵-矩阵操作。这种方法提高了硬件利用率,但增加了存储中间结果的内存需求。现代实现必须在批处理大小和可用内存之间进行平衡,导致内存管理和计算调度方面的特定优化。

类似于谷歌 TPU(Norman P. Jouppi 等人 2017b)的硬件加速器反映了这种演变,它们结合了专门化的矩阵单元和用于这些多样化乘法模式的内存层次结构。这些硬件适应性使得通过高效处理各种矩阵操作来训练大规模模型如 GPT-3(T. Brown 等人 2020)成为可能。

系统影响:为什么 GPU 在训练中占主导地位

上文所述的矩阵运算直接解释了现代训练硬件架构。GPU 主导训练的原因是:

  • 大规模并行性:矩阵乘法的独立元素计算与 GPU 的数千个核心(NVIDIA A100:6,912 CUDA 核心)完美映射

  • 专用硬件单元:Tensor 核心通过为占主导地位的工作负载提供专用硬件,将矩阵运算加速 10-20 倍

  • 内存带宽优化:分块矩阵计算模式能够有效地利用 GPU 内存层次结构(L1/L2 缓存→共享内存→全局内存)

当 GPT-2 的例子后来显示为什么 V100 GPU 通过混合精度(第 2018 行)实现 2.4 倍的速度提升时,这种加速来自于执行我们刚刚分析的矩阵乘法的 Tensor 核心。理解矩阵操作特性是欣赏为什么流水线优化如混合精度训练提供如此巨大好处的前提。

激活函数

在第三章中,我们确立了激活函数——sigmoid、tanh、ReLU 和 softmax——为神经网络学习复杂模式提供必要的非线性。我们考察了它们的数学特性:sigmoid 的(0,1)(0,1)有界输出,tanh 的零中心(1,1)(-1,1)范围,ReLU 的梯度流优势,以及 softmax 的概率分布。回想一下图 3.11 中每个函数如何以不同的方式转换输入,对梯度行为和学习动态有独特的含义。

虽然激活函数是逐元素应用的,与矩阵运算相比,它们只贡献了总计算时间的 5-10%,但它们的实现特性对训练系统性能的影响很大。面对机器学习系统工程师的问题不是数学上什么激活函数——这个基础已经确立——而是如何在规模上高效地实现它们。为什么 ReLU 在 CPU 上比 sigmoid 快 3 倍,但在 GPU 上却表现出不同的相对性能?硬件加速器如何优化这些操作?不同的激活函数在反向传播过程中会创建什么样的内存访问模式?

本节从系统角度考察激活函数,分析计算成本、硬件实现策略和性能权衡,这些权衡决定了实际训练效率。了解这些实际限制,有助于在设计针对特定硬件环境的训练系统时做出明智的架构决策。

基准测试激活函数

神经网络中的激活函数对数学特性和系统级性能都有显著影响。激活函数的选择直接影响了训练时间、模型可扩展性和硬件效率,这主要通过三个主要因素来实现:计算成本、梯度行为和内存使用。

在 Apple M2 单线程 CPU 上对常见激活函数进行基准测试揭示了有意义的性能差异,如图 8.2 图 8.2 所示。数据显示,Tanh 和 ReLU 在 CPU 架构上比 Sigmoid 执行效率更高,这使得它们特别适合实时应用和大规模系统。

图片

图 8.2:激活函数性能:在 CPU 执行时间上,常见激活函数之间存在显著差异,tanh 和 relu 在当前架构上相对于 sigmoid 提供了显著的速度优势。这些差异影响了系统级考虑因素,如训练时间和实时推理能力,指导了性能关键应用的激活函数选择。

虽然这些基准测试结果提供了有价值的见解,但它们仅代表了没有硬件加速的 CPU 性能。在生产环境中,现代硬件加速器如 GPU 可以显著改变激活函数的相对性能特征。因此,系统架构师在评估计算效率时必须考虑其特定的硬件环境和部署上下文。

回顾第三章,我们知道每个激活函数都表现出不同的梯度行为、稀疏特性和计算复杂度。现在的问题是:这些数学属性如何转化为硬件约束和系统性能?以下小节将检查每个函数的实现特性,重点关注软件与硬件之间的权衡,这些权衡决定了现实世界的训练效率:

Sigmoid

Sigmoid 的平滑(0,1)(0,1)有界输出使其在概率解释方面很有用,但其消失梯度问题和非零中心输出带来了优化挑战。从系统角度来看,指数函数的计算成为关键瓶颈。在软件中,这种计算既昂贵又低效 15,尤其是在深度网络或大型数据集中,每次前向传递都会发生数百万次 sigmoid 评估。

在硬件中,这些计算挑战的处理方式不同。现代加速器如 GPU 和 TPU 通常避免直接计算指数函数,而是使用查找表(LUTs)或分段线性近似来平衡精度和速度。尽管这些硬件优化有所帮助,但多次内存查找和插值计算仍然使得 sigmoid 比起 ReLU 等简单函数更占用资源,即使在高度并行的架构上也是如此。

Tanh

虽然 tanh 在其 (1,1)(-1,1) 零中心输出方面优于 sigmoid,但它与 sigmoid 一样,存在计算负担。tanh 所需的指数计算在软件和硬件实现中都造成了类似的性能瓶颈。在软件中,这种计算开销可能会减慢训练速度,尤其是在处理大型数据集或深度模型时。

在硬件中,tanh 利用其与 sigmoid(缩放和移位版本)的数学关系来优化实现。现代硬件通常采用混合方法实现 tanh:对于常见输入范围使用查找表,对于边缘情况使用分段近似。这种方法有助于平衡精度和计算效率,尽管 tanh 仍然比简单函数更占用资源。尽管存在这些挑战,tanh 仍然在需要平衡梯度的 RNN 和 LSTM16 中很常见。

ReLU

ReLU 代表了激活函数设计的转变。其数学简单性—max(0,x)\max(0,x)—避免了梯度消失并引入了有益的稀疏性,尽管它可能遭受神经元死亡的问题。这种简单形式对系统性能有深远的影响。在软件中,ReLU 的简单阈值操作与 sigmoid 或 tanh 相比,计算速度大大加快,只需要进行一次比较而不是指数计算。

ReLU 的硬件实现展示了它为何成为现代神经网络中占主导地位的激活函数。其简单的max(0,x)\max(0,x)操作只需要一次比较和条件设置,转化为最小的电路复杂性 17。现代 GPU 和 TPU 可以通过简单的多路复用器实现 ReLU,该复用器检查输入的符号位,从而实现极其高效的并行处理。这种硬件效率,加上它引入的稀疏性,导致计算时间减少和内存带宽需求降低。

Softmax

Softmax 与上述逐元素函数不同。它不是独立处理输入,而是通过全局归一化将 logits 转换为概率分布,从而创建独特的计算挑战。其计算涉及对每个输入值进行指数运算并按它们的和进行归一化,随着输出空间变大,这个过程变得越来越复杂。在软件中,这为自然语言处理等任务带来了显著的计算开销,其中词汇量可能达到数十万个术语。该函数还要求在计算过程中保持所有值在内存中,因为每个输出概率都依赖于整个输入向量。

在硬件层面,softmax 面临独特的挑战,因为它不能像其他激活函数那样独立处理每个值。与 ReLU 的简单阈值或甚至 sigmoid 的逐值计算不同,softmax 需要访问所有值以执行归一化。这在现代变压器架构 18 中尤其要求高,其中注意力机制中的 softmax 计算同时处理数千个值。为了管理这些需求,硬件实现通常使用近似技术或 softmax 的简化版本,尤其是在处理大型词汇表或注意力机制时。

表 8.2 总结了这些常用激活函数的权衡,并强调了这些选择如何影响系统性能。

表 8.2:激活函数权衡:比较激活函数揭示了影响系统性能的固有优势和劣势;例如,softmax 的归一化要求在大规模变压器模型中给硬件带来挑战,而 relu 提供了计算效率,但可能遭受神经元死亡的问题。此表阐明了激活函数的选择如何影响模型行为和机器学习系统设计的实际约束。

函数 主要优势 主要劣势 系统影响
Sigmoid 平滑梯度;输出在(0,1)(0, 1)之间。 梯度消失;非零中心输出。 指数计算增加开销;在现代加速器上深度网络的扩展性有限。
Tanh 零中心输出在(1,1)(-1, 1)之间;稳定梯度。 大输入时梯度消失。 比 ReLU 更昂贵;在 RNNs/LSTMs 中仍常用,但在 CNNs 和 Transformers 中较少使用。
ReLU 计算效率高;避免梯度消失;引入稀疏性。 死亡神经元;无界输出。 简单操作在 GPU/TPU 上优化良好;稀疏激活减少内存和计算需求。
Softmax 将 logits 转换为概率;总和为11 大输出时计算成本高。 大词汇表的成本高;在 NLP 任务中需要层次化或采样 softmax 以实现可扩展性。

激活函数的选择应在计算考虑与它们的数学属性之间取得平衡,例如处理梯度消失或在神经激活中引入稀疏性。此数据强调了在设计神经网络时评估理论和实际性能的重要性。对于大规模网络或实时应用,ReLU 由于其效率和可扩展性通常是最佳选择。然而,对于需要概率输出,如分类的任务,尽管计算成本高,softmax 仍然不可或缺。最终,理想的激活函数取决于具体任务、网络架构和硬件环境。

GPT-2 GELU 激活函数

虽然上表涵盖了经典的激活函数,但 GPT-2 使用高斯误差线性单元(GELU),定义为:GELU(x)=xΦ(x)=x12[1+erf(x2)] \text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]

其中 Φ(x)\Phi(x) 是标准正态分布的累积分布函数。

为什么 GPT-2 选择 GELU?

  • 比 ReLU 更平滑的梯度,减少了神经元死亡问题

  • 随机正则化效应:通过概率性地丢弃输入,类似于 dropout

  • 在语言建模任务上具有更好的经验性能

系统性能权衡

  • 计算成本:比 ReLU 贵 3 到 4 倍(需要评估 erf 函数)

  • 内存:与 ReLU 相同(逐元素操作)

  • 训练时间影响:对于 GPT-2 的 48 层,GELU 将总前向传递时间增加了约 5%到 8%

  • 值得:改进的模型质量(更低的困惑度)抵消了计算开销

快速近似:现代框架(PyTorch、TensorFlow)通过优化的近似实现 GELU:

# Fast GELU approximation (used in practice)
GELU(x) ≈ 0.5 * x * (1 + tanh(sqrt(2/π) * (x + 0.044715 * x³)))

这种近似将计算成本降低到约 1.5 倍 ReLU,同时保持 GELU 的优点,展示了生产系统如何平衡数学属性与实现效率。

系统影响:内存带宽瓶颈

激活函数揭示了关键的系统原理:并非所有操作都是计算密集型的。虽然矩阵乘法会饱和 GPU 的计算单元,但激活函数通常会成为内存带宽限制

  • 低算术强度:逐元素操作每访问一次内存进行的计算很少(ReLU:每次加载进行 1 次操作)

  • 有限的并行化优势:简单操作完成速度比内存传输时间快

  • 带宽限制:现代 GPU 的计算吞吐量比内存带宽高 10-100 倍

这解释了为什么激活函数的选择不如预期那么重要——ReLU 与 sigmoid 之间的差异仅为 2-3 倍,尽管它们的计算复杂度差异很大,因为两者都受限于内存访问。前向传播必须仔细管理激活存储,以防止内存带宽限制整体训练吞吐量。

优化算法

优化算法在神经网络训练中发挥着重要作用,通过指导模型参数的调整以最小化损失函数。这个过程使神经网络能够从数据中学习,并涉及找到最佳参数集,以在给定任务上实现最佳模型性能。广义上,这些算法可以分为两类:经典方法,它提供了理论基础;以及先进方法,它引入了改进性能和效率的增强。

这些算法探索复杂的高维损失函数表面,识别出函数达到最低值的位置。这项任务具有挑战性,因为损失函数表面很少是平滑或简单的,通常具有局部最小值、鞍点和尖锐的梯度。有效的优化算法旨在克服这些挑战,确保收敛到一个对未见数据具有良好泛化能力的解决方案。虽然本节涵盖了训练期间使用的优化算法,但包括量化、剪枝和知识蒸馏在内的先进优化技术将在第十章(Chapter 10)中详细说明。

优化算法的选择和设计对系统级影响重大,例如计算效率、内存需求以及扩展到大型数据集或模型的能力。包括网格搜索、贝叶斯优化和自动化机器学习工作流程在内的超参数优化系统方法将在第五章(Chapter 5)中介绍。对这些算法的深入了解对于解决精度、速度和资源使用之间的权衡至关重要。

基于梯度的优化方法

现代神经网络训练依赖于梯度下降的变体来进行参数优化。这些方法在处理训练数据的方式上有所不同,导致系统级影响各不相同。

梯度下降

梯度下降是神经网络训练的数学基础,通过迭代调整参数以最小化损失函数。基本的梯度下降算法计算每个参数相对于损失的梯度,然后更新参数以梯度相反的方向:θt+1=θtαL(θt) \theta_{t+1} = \theta_t - \alpha \nabla L(\theta_t)

梯度下降在训练系统中的有效性揭示了优化理论中的深层次问题。与梯度下降保证找到全局最小值的凸优化不同,神经网络损失表面包含指数数量的局部最小值。然而,梯度下降始终找到泛化良好的解决方案,这表明优化过程具有对具有理想特性的解决方案的隐含偏差。现代过参数化网络,参数数量多于训练示例,反常地实现了比小模型更好的泛化,挑战了传统的优化直觉。

在训练系统中,这种数学运算转化为特定的计算模式。对于每次迭代,系统必须:

  1. 计算前向传递的激活值

  2. 计算损失值

  3. 通过反向传播计算梯度

  4. 使用梯度值更新参数

梯度下降的计算需求随着模型大小和数据集大小的增加而增加。考虑一个具有MM个参数的神经网络在NN个示例上进行训练。计算梯度需要在前向传递过程中存储中间激活值,以便在反向传播中使用。这些激活值消耗的内存与网络的深度和正在处理的示例数量成比例。

传统梯度下降过程在每个迭代中处理整个数据集。对于一个包含一百万个示例的训练集,计算梯度需要评估和存储每个示例的结果,然后再进行参数更新。这种方法带来了重大的系统挑战:所需内存=N×(激活内存 + 梯度内存) \text{所需内存} = N \times \text{(激活内存 + 梯度内存)}

在现代硬件上,内存需求往往超过可用的硬件资源。使用这种方法处理 ImageNet 规模的数据集需要数百 GB 的内存。在每个更新之前处理整个数据集会创建长的迭代时间,从而降低了模型从数据中学习的速率。

随机梯度下降

这些系统约束导致了开发出与硬件能力更好地对齐的变体。关键洞察是,虽然精确的梯度计算在数学上很有吸引力,但对于有效的学习来说并非必要。这一认识为以改进的系统效率为代价换取梯度精度的方法打开了大门。

这些系统限制促使开发了更高效的优化方法。SGD19 是优化策略的一次重大转变。与在整个数据集上计算梯度不同,SGD 使用单个训练示例来估计梯度:θt+1=θtαL(θt;xi,yi) \theta_{t+1} = \theta_t - \alpha \nabla L(\theta_t; x_i, y_i) 其中 (xi,yi)(x_i, y_i) 代表一个单独的训练示例。这种方法大大减少了内存需求,因为任何时刻只需要存储一个示例的激活和梯度。

然而,处理单个示例会带来新的系统挑战。现代加速器通过并行计算达到峰值性能,同时处理多个数据元素。单个示例更新导致大多数计算资源闲置,导致硬件利用率低下。频繁的参数更新也增加了内存带宽需求,因为必须为每个示例读取和写入权重,而不是将这些操作分摊到多个示例上。

小批量处理

批量处理 是同时计算 训练示例组 的梯度的技术,在模型训练期间实现高效的 并行计算 和改进的 硬件利用率

小批量梯度下降成为全批量与随机方法之间的一种实用折衷方案。它对示例的小批量计算梯度,使得与现代 GPU 架构相匹配的并行计算成为可能(Jeffrey Dean 和 Ghemawat 2008)。θt+1=θtα1Bi=1BL(θt;xi,yi) \theta_{t+1} = \theta_t - \alpha \frac{1}{B} \sum_{i=1}^B \nabla L(\theta_t; x_i, y_i)

小批量处理与现代硬件能力相匹配。考虑使用 GPU 硬件的训练系统。这些设备包含成千上万的用于并行计算的内核。小批量处理允许这些内核同时计算多个示例的梯度,从而提高硬件利用率。批次大小 B 成为关键系统参数,影响计算效率和内存需求。

批次大小与系统性能之间的关系遵循清晰的模式,揭示了硬件与软件之间的权衡。内存需求与批次大小成线性关系,但具体成本因模型架构而异:内存需求=B×(激活内存+梯度内存+参数内存) \begin{aligned} \text{内存需求} = B \times (&\text{激活内存} \ &+ \text{梯度内存} \ &+ \text{参数内存}) \end{aligned}

为了具体理解,考虑使用不同批次大小的 ResNet-50 训练。在批次大小为 32 时,模型每个 GPU 需要大约 8GB 的激活内存,4GB 用于梯度,以及 200MB 用于参数。将批次大小加倍到 64,这些内存需求也加倍到 16GB 的激活内存和 8GB 的梯度。这种线性扩展很快就会耗尽 GPU 内存,高端训练 GPU 通常提供 40-80GB 的 HBM。

较大的批量通过提高并行性和更好的内存访问模式来实现更有效的计算。GPU 利用效率展示了这种权衡:256 或更高的批量大小通常在现代训练加速器上实现超过 90% 的硬件利用率,而较小的 16-32 批量可能只能达到 60-70% 的利用率,因为并行性不足,无法充分利用硬件。

这在训练系统中确立了一个中心主题:在内存约束和计算效率之间的硬件-软件权衡。训练系统必须选择批量大小,以最大化硬件利用率同时适应可用的内存。最佳选择通常需要在内存约束阻止使用高效的大批量时进行梯度累积,以增加的计算量换取相同的有效批量大小。

自适应和基于动量的优化器

高级优化算法引入了如动量和自适应学习率等机制来提高收敛性。这些方法在解决经典方法的不效率方面发挥了关键作用(Kingma 和 Ba 2014)。

基于动量的方法

动量方法通过在迭代过程中累积速度向量来增强梯度下降。动量更新方程引入了一个额外的项来跟踪参数更新的历史:vt+1=βvt+L(θt)θt+1=θtαvt+1\begin{gather} v_{t+1} = \beta v_t + \nabla L(\theta_t) \ \theta_{t+1} = \theta_t - \alpha v_{t+1} \end{gather} 其中 β\beta 是动量系数,通常设置在 0.9 和 0.99 之间。从系统角度来看,动量引入了额外的内存需求。训练系统必须维护一个与参数向量相同维度的速度向量,实际上将优化状态的内存需求翻倍。

自适应学习率方法

RMSprop 通过维护每个参数的平方梯度的移动平均来修改基本的梯度下降更新:st=γst1+(1γ)(L(θt)(L(θt)(θt)2θt+1=θtαL(θt)st+ϵ\begin{gather} s_t = \gamma s_{t-1} + (1-\gamma)\big(\nabla L(\theta_t)\big)² \ \theta_{t+1} = \theta_t - \alpha \frac{\nabla L(\theta_t)}{\sqrt{s_t + \epsilon}} \end{gather}

这种每参数的适应需要存储移动平均 sts_t,这会创建与动量方法类似的内存开销。与基本梯度下降相比,RMSprop 中的逐元素操作也引入了额外的计算步骤。

Adam 优化

Adam 算法结合了动量和 RMSprop 的概念,为每个参数维护两个移动平均值:mt=β1mt1+(1β1)L(θt)vt=β2vt1+(1β2)(L(θt))2θt+1=θtαmtvt+ϵ\begin{gather} m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla L(\theta_t) \ v_t = \beta_2 v_{t-1} + (1-\beta_2)\big(\nabla L(\theta_t)\big)² \ \theta_{t+1} = \theta_t - \alpha \frac{m_t}{\sqrt{v_t + \epsilon}} \end{gather}

Adam 算法的系统影响比之前的方法更为显著。优化器必须为每个参数存储两个额外的向量(mtm_tvtv_t),这将优化状态所需的内存增加三倍。对于一个拥有 1 亿个参数且使用 32 位浮点数的模型,额外的内存需求大约为 800 MB。

优化算法系统影响

优化算法的实际实现,无论是经典还是高级方法,都需要仔细考虑系统资源和硬件能力。理解这些影响有助于指导算法选择和系统设计决策。

优化权衡

优化算法的选择会创建特定的计算和内存访问模式,从而影响训练效率。内存需求从基本的梯度下降到更复杂的方法逐渐增加:MemorySGD=SizeparamsMemoryMomentum=2×SizeparamsMemoryAdam=3×Sizeparams\begin{gather} \text{Memory}{\text{SGD}} = \text{Size}{\text{params}} \ \text{Memory}{\text{Momentum}} = 2 \times \text{Size}{\text{params}} \ \text{Memory}{\text{Adam}} = 3 \times \text{Size}{\text{params}} \end{gather}

这些内存成本必须与收敛收益相平衡。虽然 Adam 通常需要更少的迭代次数才能达到收敛,但其每迭代内存和计算开销可能会影响内存受限系统上的训练速度。

GPT-2 Adam 优化器内存需求

GPT-2 训练使用 Adam 优化器,其超参数如下:

  • β₁ = 0.9(动量衰减)

  • β₂ = 0.999(第二动量衰减)

  • 学习率:在前 500 步从 0 预热到 2.5e-4,然后进行余弦衰减

  • 权重衰减:0.01

  • 梯度裁剪:全局范数裁剪至 1.0

内存开销计算

对于 GPT-2 的 1.5B 参数在 FP32(每个 4 字节)中:

  • 参数:1.5B × 4 字节 = 6.0 GB

  • 梯度:1.5B × 4 字节 = 6.0 GB

  • Adam 第一动量(m):1.5B × 4 字节 = 6.0 GB

  • Adam 第二动量(v):1.5B × 4 字节 = 6.0 GB

  • 总优化器状态:24 GB

这解释了为什么在考虑激活内存之前,GPT-2 训练需要 32GB+ V100 GPU。

由优化器驱动的系统决策

  1. 混合精度训练(FP16 参数,FP32 优化器状态)将此降至约 15GB

  2. 梯度累积(将有效批次拆分为更小的微批次,在更新前跨多个正向/反向传递累积梯度,详情见第 8.5.5 节)允许在内存限制下有效使用 batch_size=512

  3. 优化器状态分片(ZeRO-2)将 Adam 状态分布在分布式训练中的 GPU 上

收敛权衡: Adam 的内存开销是值得的。GPT-2 在大约 50K 步内收敛,而使用 SGD+动量则需要大约 150K+步,尽管每步的成本更高,但节省了数周的训练时间。

实现考虑因素

训练框架中优化算法的高效实现取决于直接影响性能的战略性系统级考虑。关键因素包括内存带宽管理、操作融合技术和数值精度优化。这些元素共同决定了优化器在多种硬件架构上的计算效率、内存利用率和可扩展性。

内存带宽是优化器实现中的主要瓶颈。现代框架通过操作融合来解决这个问题,通过将多个操作组合成一个单独的内核来减少内存访问开销。例如,当单独执行操作时,Adam 优化器的内存访问需求可以随着参数大小线性增长:带宽单独=5×大小params \text{带宽}{\text{单独}} = 5 \times \text{大小}{\text{params}}

然而,将这些操作融合成一个单一的计算内核显著降低了带宽需求:带宽融合=2×大小params \text{带宽}{\text{融合}} = 2 \times \text{大小}{\text{params}}

这些技术在 cuDNN 和其他优化内存带宽使用和操作融合的 GPU 加速框架(Chetlur 等人 2014;Norman P. Jouppi 等人 2017b)中得到了有效展示。

内存访问模式也在确定缓存利用率效率方面发挥着重要作用。对参数和优化器状态向量的顺序访问最大化了缓存命中率以及有效内存带宽。这一原则在 GPU 和张量处理单元(TPU)等硬件中表现得尤为明显,优化的内存布局显著提高了性能(Norman P. Jouppi 等人 2017b)。

数值精度是实现中的另一个重要权衡。经验研究表明,即使使用降低精度格式(如 16 位浮点数(FP16)),优化器状态仍然保持稳定。从 32 位到 16 位格式的转换可以减少内存需求,如 Adam 优化器所示:MemoryAdam-FP16=32×Sizeparams \text{Memory}{\text{Adam-FP16}} = \frac{3}{2} \times \text{Size}{\text{params}}

混合精度训练 20 已被证明可以达到相当的精度,同时显著减少内存消耗和计算开销 (Micikevicius et al. 2017; Krishnamoorthi 2018)。

上述实现因素决定了深度学习系统中优化算法的实际性能,强调了根据底层硬件架构调整内存、计算和数值策略的重要性 (T. Chen et al. 2015)。

优化器权衡

神经网络训练中优化算法的发展揭示了算法效率与系统性能之间的交集。虽然优化器最初是为了提高模型收敛而开发的,但它们的实现方式对内存使用、计算需求和硬件利用率产生了显著影响。

对流行的优化算法进行更深入的考察,可以发现它们对系统资源的影响各不相同。如表 8.3 所示,每个优化器在内存使用、计算模式和收敛行为之间都有独特的权衡。SGD 保持最小的内存开销,只需存储模型参数和当前梯度。这种轻量级的内存占用是以较慢的收敛速度和由于其顺序更新特性而可能导致的硬件利用率不佳为代价的。

表 8.3:优化器内存占用:不同的优化算法由于存储中间值(如梯度、速度和平方梯度)而产生了不同的内存成本;理解这些权衡对于资源受限的部署和大规模模型训练非常重要。选择优化器需要平衡收敛速度与可用内存和计算资源。

属性 SGD 动量 RMSprop Adam
内存开销 速度项 平方梯度 速度和平方梯度
内存成本 1×1\times 2×2\times 2×2\times 3×3\times
访问模式 顺序 顺序 随机 随机
操作/参数 2 3 4 5
硬件效率 中等 最高
收敛速度 最慢 中等 最快

动量方法通过为每个参数存储速度项,引入额外的内存需求,与 SGD 相比,内存占用翻倍。这种增加的内存成本通过更好的梯度估计带来改进的收敛,同时保持相对高效的内存访问模式。动量更新的顺序性质允许有效的硬件预取和缓存利用。

RMSprop 通过跟踪平方梯度统计信息来为每个参数调整学习率。它的内存开销与动量方法相当,但其计算模式变得更加不规则。该算法需要额外的算术操作来维护运行平均值和计算自适应学习率,将每参数的计算强度从 3 增加到 4 次操作。

Adam 算法结合了动量和自适应学习率的优点,但系统资源成本最高。表 8.3 显示,它同时维护速度项和平方梯度统计信息,与 SGD 相比,内存需求增加了三倍。该算法的计算模式涉及每个参数更新时的 5 次操作,但由于这些操作的规则结构和并行化潜力,这些操作通常能更有效地利用硬件。

在选择优化策略时,训练系统设计者必须平衡这些权衡。现代硬件架构影响了这些决策。GPU 在自适应方法所需的并行计算方面表现出色,而内存受限的系统可能更倾向于简单的优化器。优化器的选择不仅影响训练动态,还影响最大可行模型大小、可实现的批量大小、硬件利用效率以及整体训练时间到收敛。

现代训练框架持续发展,开发出诸如优化器状态分片、混合精度存储和融合操作等技术,以更好地平衡这些竞争需求。理解这些系统影响有助于从业者根据其特定的硬件约束和训练需求,做出关于优化策略的明智决策。

框架优化器接口

虽然 SGD、动量和 Adam 的数学公式为参数优化建立了理论基础,但框架提供了标准化的接口,将这些算法抽象为实用的训练循环。理解像 PyTorch 这样的框架如何实现优化器 API,展示了复杂数学运算如何通过干净的抽象变得可访问。

框架优化器接口遵循一种一致的模式,将梯度计算与参数更新分离。这种分离使得数学算法可以系统性地应用于不同的模型架构和训练场景。

框架优化器实现了一个四步训练周期,将数学运算封装在一个干净的 API 中。以下示例演示了 Adam 优化如何集成到标准训练循环中:

import torch
import torch.nn as nn
import torch.optim as optim

# Initialize Adam optimizer with model parameters
# and learning rate
optimizer = optim.Adam(
    model.parameters(), lr=0.001, betas=(0.9, 0.999)
)
loss_function = nn.CrossEntropyLoss()

# Standard training loop implementing the four-step optimization cycle
for epoch in range(num_epochs):
    for batch_idx, (data, targets) in enumerate(dataloader):
        # Step 1: Clear accumulated gradients from previous iteration
        optimizer.zero_grad()

        # Step 2: Forward pass - compute model predictions
        predictions = model(data)
        loss = loss_function(predictions, targets)

        # Step 3: Backward pass - compute gradients via
        # automatic differentiation
        loss.backward()

        # Step 4: Parameter update - apply Adam optimization equations
        optimizer.step()

optimizer.zero_grad() 调用解决了框架实现的一个关键细节:梯度在多次调用 backward() 之间累积,需要在批次之间显式清除。这种行为使得可以针对大型有效批次大小实现梯度累积模式,但在标准训练循环中需要仔细管理。

optimizer.step() 方法封装了数学更新方程。对于 Adam 优化,这个单一调用自动实现了动量估计、平方梯度跟踪、偏差校正和参数更新计算。以下代码说明了优化器内部发生的数学运算:

# Mathematical operations implemented by optimizer.step() for Adam
# These computations happen automatically within the framework

# Adam hyperparameters (typically β₁=0.9, β₂=0.999, ε=1e-8)
beta_1, beta_2, epsilon = 0.9, 0.999, 1e-8
learning_rate = 0.001

# For each parameter tensor in the model:
for param in model.parameters():
    if param.grad is not None:
        grad = param.grad.data  # Current gradient

        # Step 1: Update biased first moment estimate
        # (momentum)
        # m_t = β₁ * m_{t-1} + (1-β₁) * ∇L(θₜ)
        momentum_buffer = (
            beta_1 * momentum_buffer + (1 - beta_1) * grad
        )

        # Step 2: Update biased second moment estimate
        # (squared gradients)
        # v_t = β₂ * v_{t-1} + (1-β₂) * (∇L(θₜ))²
        variance_buffer = beta_2 * variance_buffer + (
            1 - beta_2
        ) * grad.pow(2)

        # Step 3: Compute bias-corrected estimates
        momentum_corrected = momentum_buffer / (
            1 - beta_1**step_count
        )
        variance_corrected = variance_buffer / (
            1 - beta_2**step_count
        )

        # Step 4: Apply parameter update
        # θ_{t+1} = θₜ - α * m_t / (√v_t + ε)
        param.data -= (
            learning_rate
            * momentum_corrected
            / (variance_corrected.sqrt() + epsilon)
        )

框架实现还处理优化器权衡中的内存管理挑战。优化器自动为动量项和平方梯度统计分配存储空间,透明地管理 2-3 倍的内存开销,同时提供针对底层硬件优化的高效内存访问模式。

学习率调度器集成

框架将学习率调度直接集成到优化器接口中,使训练期间动态调整学习率 α 成为可能。这种集成展示了框架如何通过模块化设计模式组合多个优化技术。

学习率调度器根据预定义的计划修改优化器的学习率,例如余弦退火、指数衰减或阶梯式减少。以下示例演示了如何将余弦退火与 Adam 优化集成:

import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
import math

# Initialize optimizer with initial learning rate
optimizer = optim.Adam(
    model.parameters(), lr=0.001, weight_decay=1e-4
)

# Configure cosine annealing scheduler
# T_max: number of epochs for one complete cosine cycle
# eta_min: minimum learning rate (default: 0)
scheduler = lr_scheduler.CosineAnnealingLR(
    optimizer,
    T_max=100,  # Complete cycle over 100 epochs
    eta_min=1e-6,  # Minimum learning rate
)

# Training loop with integrated learning rate scheduling
for epoch in range(num_epochs):
    # Track learning rate for monitoring
    current_lr = optimizer.param_groups[0]["lr"]
    print(f"Epoch {epoch}: Learning Rate = {current_lr:.6f}")

    # Standard training loop
    for batch_idx, (data, targets) in enumerate(dataloader):
        optimizer.zero_grad()
        predictions = model(data)
        loss = loss_function(predictions, targets)
        loss.backward()
        optimizer.step()

    # Update learning rate at end of epoch
    # Implements: lr = eta_min + (eta_max - eta_min) * (1 + cos(π * epoch / T_max)) / 2
    scheduler.step()

这种组合模式允许实践者将基础优化算法(SGD、Adam)与调度策略(余弦退火、线性预热)结合起来,而无需修改核心数学实现。框架处理组件之间的协调,同时保持每个算法的数学属性。

优化器接口展示了框架如何在数学严谨性和实用性之间取得平衡。底层算法实现了我们研究的精确数学公式,而 API 设计使得实践者可以专注于模型架构和训练动态,而不是优化实现的细节。

反向传播原理

反向传播算法 21 通过系统地遍历神经网络的计算图来计算梯度。虽然之前的讨论介绍了反向传播的数学原理,但在训练系统中实现此算法需要仔细管理内存、计算和数据流。

反向传播算法原理

神经网络通过调整其参数来减少误差,这是通过反向传播算法实现的,该算法通过系统地遍历网络的计算图来计算每个参数对误差的贡献。

在前向传播过程中,每一层执行计算并产生激活值,这些激活值必须被存储以供反向传播使用:z(l)=W(l)a(l1)+b(l)a(l)=f(z(l))\begin{gather} z^{(l)} = W{(l)}a + b^{(l)} \ a^{(l)} = f(z^{(l)}) \end{gather} 其中 z(l)z^{(l)} 表示前激活值,而 a(l)a^{(l)} 表示在第 ll 层的激活值。这些中间值的存储创建了特定的内存需求,这些需求随着网络深度和批量大小而扩展。

对于每一层具有参数 WiW_i 的网络,计算 LWi\frac{\partial L}{\partial W_i} 确定了调整每个参数时损失 L 的变化量。链式法则提供了一种组织这些计算的系统方法:LfullLi=AiLiLi+1Ai...AnLnLfullAn \frac{\partial L_{full}}{\partial L_{i}} = \frac{\partial A_{i}}{\partial L_{i}} \frac{\partial L_{i+1}}{\partial A_{i}} ... \frac{\partial A_{n}}{\partial L_{n}} \frac{\partial L_{full}}{\partial A_{n}}

这个方程揭示了训练系统的关键要求。计算早期层的梯度需要所有后续层的信息,从而在数据存储和访问中创建特定的模式。每次梯度计算都需要访问正向传播中存储的激活值,从而在训练系统中创建特定的内存访问和计算模式,这些模式必须被高效地管理。这些模式直接影响前面讨论的 SGD 或 Adam 等优化算法的效率。现代训练系统使用自动微分 22 来自动处理这些计算,但底层系统要求保持不变。

激活内存需求

训练系统必须在正向传播过程中维护中间值(激活值),以便在反向传播过程中计算梯度。这一要求增加了优化算法的内存需求。对于每一层 l,系统必须存储:

  • 正向传播的输入激活

  • 应用层操作后的输出激活

  • 正在优化的层参数

  • 用于参数更新的计算梯度

考虑一个训练示例批次通过网络。正向传播计算并存储:z(l)=W(l)a(l1)+b(l)a(l)=f(z(l))\begin{gather} z^{(l)} = W{(l)}a + b^{(l)} \ a^{(l)} = f(z^{(l)}) \end{gather}

两个 z(l)z^{(l)}a(l)a^{(l)} 都必须在反向传播过程中进行缓存。这会在内存使用上产生乘法效应:每一层的内存需求都会乘以批量大小,并且优化器的内存开销(在上一节中讨论)适用于每个参数。

总内存需求与以下因素成比例:

  • 网络深度(层数)

  • 层宽度(每层的参数数量)

  • 批量大小(一起处理的示例数量)

  • 优化器状态(如 Adam 等算法的额外内存)

这产生了一系列复杂的权衡。较大的批量大小可以更有效地进行计算并获得更好的梯度估计,但需要按比例更多的内存来存储激活。更复杂的优化器,如 Adam,可以实现更快的收敛,但每个参数都需要额外的内存。

GPT-2 激活内存分解

对于批量大小为 32,序列长度为 1024,隐藏维度为 1280,48 层的 GPT-2:

每层激活内存

  • 注意力激活:batch × seq × hidden × 4(Q, K, V, 输出)= 32 × 1024 × 1280 × 4 × 2 字节(FP16)= 335 MB

  • FFN 激活:batch × seq × (hidden × 4)(中间扩展)= 32 × 1024 × 5120 × 2 字节 = 335 MB

  • 层归一化状态:最小(每层约 10 MB)

  • 每层的总量:~680 MB

全模型激活内存

  • 48 层 × 680 MB = 32.6 GB 仅用于激活

  • 参数(FP16):3 GB

  • 梯度:3 GB

  • 优化器状态(Adam, FP32):12 GB

  • 训练期间的峰值内存:~51 GB

这超过了单个 V100 的 32GB 容量。

系统解决方案应用

  1. 梯度检查点:在反向传播期间重新计算激活,通过增加 33%的计算成本,将激活内存减少 75%(至约 8 GB)

  2. 激活 CPU 卸载:将一些激活存储在 CPU RAM 中,在反向传播期间进行传输

  3. 混合精度:FP16 激活(如上所述)与 FP32(将是 65 GB)

  4. 减少批量大小:使用每个 GPU 的 batch_size=16 + 2 步的梯度累积 = 有效批量大小=32

训练配置:大多数 GPT-2 实现使用梯度检查点 + 每个 GPU 的 batch_size=16,舒适地适应 32GB V100s,同时保持训练效率。

内存-计算权衡

训练系统必须在内存使用和计算效率之间进行平衡。网络中的每一前向传递都会生成一组激活,这些激活必须存储以供反向传递使用。对于一个具有LL层的神经网络,处理一个包含BB个示例的批量需要存储:每批次的内存=B×l=1L(sl+al) \text{Memory per batch} = B \times \sum_{l=1}^L (s_l + a_l) 其中 sls_l 表示中间计算的大小(如 z(l)z^{(l)})和 ala_l 表示第 l 层的激活输出。

这种内存需求与上一节中讨论的优化器的内存需求相叠加。训练系统的总内存消耗包括存储的激活和优化器状态:总内存=每批次的内存+内存优化器 \text{总内存} = \text{每批次的内存} + \text{优化器内存}

为了管理这些巨大的内存需求,训练系统使用了几种复杂的策略。梯度检查点是一种基本方法,在反向传播过程中战略性地重新计算一些中间值,而不是存储它们。虽然这增加了计算工作量,但它可以显著减少内存使用,从而在内存受限的硬件上训练更深的网络或更大的批量大小(T. Chen 等人 2016)。

这些内存管理策略的效率在很大程度上取决于底层硬件架构。GPU 系统,尽管具有高计算吞吐量但内存带宽有限,通常会遇到与 CPU 系统不同的瓶颈。GPU 上的内存带宽限制意味着即使存在足够的存储空间,数据在内存和计算单元之间的移动也可能成为主要的性能瓶颈(Norman P. Jouppi 等人 2017b)。

这些硬件考虑因素自然引导了现代训练系统中反向传播的实现。为了应对这些限制,专门针对卷积等操作的内存高效算法在瓦片或块中计算梯度,以适应可用的内存带宽。动态内存管理在整个计算图中跟踪中间值的生命周期,一旦张量对后续计算不再必要,就立即释放内存(Paszke 等人 2019)。

数学基础系统影响

我们所考察的数学运算——前向传播、梯度计算和参数更新——定义了训练系统必须计算的内容。用数学术语理解这些操作提供了基本知识,但在实际训练系统中实现它们需要将数学抽象转化为协调的计算工作流程。这种转换引入了以资源协调、时序和数据移动为中心的特定挑战。

高效执行训练需要协调这些数学运算与数据加载管道、预处理工作流程、硬件加速器和监控系统。主导正向和反向传播的矩阵乘法必须安排与数据传输操作重叠,以防止 GPU 空闲时间。正向传播的激活存储需求影响批次大小选择和内存分配策略。反向传播强加的顺序依赖性限制了并行化机会并塑造了分布式训练架构。这些系统级考虑将数学运算转化为具体的计算管道。

管道架构

上文所考察的数学运算定义了训练系统必须计算的内容。管道架构决定了如何在具有有限内存和带宽约束的真实硬件上高效地编排这些计算。训练管道提供了组织框架,协调数学运算与数据移动、系统资源和操作监控。这种架构视角不仅优化了单个操作,还优化了整个训练过程中的操作编排。

如图 8.3 所示,训练管道由三个主要组件组成:用于摄取和预处理的 数据管道、处理模型更新的训练循环,以及用于评估性能的评估管道。这些组件以协调一致的方式协同工作,处理后的批次从数据管道流向训练循环,评估指标提供反馈以指导训练过程。

图片

图 8.3:管道架构:机器学习系统通过相互连接的数据、训练和评估管道组织训练,从而实现迭代模型优化和性能评估。数据按顺序通过这些组件流动,评估指标提供反馈以优化训练过程并确保可重复的结果。

架构概述

要了解这些数学运算如何转化为实际系统,训练管道的架构围绕三个相互关联的组件组织:数据管道、训练循环和评估管道。这些组件共同处理原始数据、训练模型并评估其性能,确保训练过程高效且有效。

这种模块化组织结构使得资源利用效率高,关注点分离清晰。数据管道通过摄入原始数据并将其转换为适合模型格式的数据来启动过程。这些数据传递给训练循环,模型在此处执行其核心计算以从输入中学习。定期,评估管道使用单独的验证数据集来评估模型性能。这种模块化结构确保每个阶段都高效运行,同时为整体工作流程做出贡献。

数据管道

理解每个组件的作用从数据管道开始,它负责管理数据的摄入、预处理和批处理,以便进行训练。原始数据通常从本地存储加载,并在训练过程中动态转换,以避免冗余并增强多样性。例如,图像数据集可能经过归一化、调整大小和增强等预处理步骤,以提高模型的鲁棒性。这些操作实时执行,以最小化存储开销并适应特定任务的要求(Yann LeCun 等人,1998)。一旦处理完毕,数据就被打包成批次并传递给训练循环。

训练循环

训练循环是管道的计算核心,模型在此处从准备好的数据中学习。图 8.4 展示了这一过程,突出了在单个 GPU 上进行的正向传递、损失计算和参数更新:

图片

图 8.4:GPU 加速训练:现代深度学习依赖于 GPU 来并行化矩阵运算,显著加速了训练期间参数更新所需的前向和反向传递。这种单 GPU 工作流程通过计算损失函数的梯度并将其应用于最小化预测误差来迭代地细化模型参数。

训练循环的每次迭代涉及几个关键步骤:

  1. 步骤 1 – 正向传递:从数据集传递一个批次的数据到 GPU 上的神经网络,以生成预测。模型应用矩阵乘法和激活函数将输入转换为有意义的输出。

  2. 步骤 2 – 计算梯度:将预测值与真实标签进行比较,使用损失函数计算误差。损失函数输出一个标量值,量化模型的性能。然后,使用反向传播将这个误差信号反向传播通过网络,反向传播应用微分链式法则来计算每一层参数的梯度。这些梯度指示了所需的调整,以最小化损失。

  3. 步骤 3 – 更新参数:计算出的梯度传递给优化器,优化器通过更新模型的参数来最小化损失。不同的优化算法,如 SGD 或 Adam,影响参数调整的方式。优化器的选择影响收敛速度和稳定性。

此过程在多个批次和 epoch 中迭代重复,逐渐细化模型以提高其预测准确性。

评估管道

完成管道架构后,评估管道在训练期间定期提供关于模型性能的反馈。使用单独的验证数据集,将模型的预测与已知结果进行比较,以计算准确度或损失等指标。这些指标有助于监控进度并检测过拟合或欠拟合等问题。评估通常在固定间隔进行,例如在每个 epoch 结束时,确保训练过程与预期目标一致。

组件集成

在单独检查了每个组件之后,我们现在可以理解它们是如何协同工作的。数据管道、训练循环和评估管道紧密集成,以确保流畅和高效的流程。数据准备通常与计算重叠,例如在训练循环中处理当前批次的同时预处理下一个批次。同样,评估管道与训练同步运行,提供有关调整模型或训练过程的信息。这种集成最小化了系统资源的空闲时间,并确保训练过程不间断进行。

数据管道

我们现在可以详细检查每个组件,从数据管道开始。数据管道在训练过程中将数据从存储移动到计算设备。就像高速公路系统将车辆从社区移动到市中心一样,数据管道通过多个阶段将训练数据传输到计算资源。

尽管本节重点介绍数据移动和预处理以提高训练效率的系统方面,但上游数据工程实践,包括数据质量保证、特征工程、模式验证和数据集版本控制,在第六章中有所涵盖。这些实践共同确保了高质量的训练数据和高效的数据传输到计算资源。本章探讨了在数据工程准备并验证了格式正确的数据集后,如何优化数据管道的吞吐量、内存使用和协调。

图片

图 8.5:数据管道架构:现代机器学习系统利用管道高效地将数据从存储移动到 GPU 进行并行处理,从而实现更快的模型训练和推理。此图展示了典型的管道,包括格式化、预处理、批处理和将数据分发到多个 GPU 工作者的阶段。

在 CPU 上运行的管道作为原始数据存储和 GPU 计算之间的桥梁。如图图 8.5 所示,该管道由三个主要区域组成:存储、CPU 预处理和 GPU 训练。每个区域在准备和交付数据以供模型训练方面都发挥着独特的作用。

在存储区域,原始数据存储在磁盘上,通常以图像文件(用于计算机视觉任务)或文本文件(用于自然语言处理)等格式存在。CPU 预处理区域通过多个阶段处理这些原始数据。例如,在一个图像识别模型中,这些阶段包括:

  1. 格式转换:读取图像文件并将它们转换为标准格式

  2. 处理:应用诸如调整大小、归一化和数据增强等操作

  3. 批处理:将处理后的示例组织成批量以进行高效的 GPU 计算

最后一个区域显示了多个 GPU 接收预处理后的批量数据以进行训练。这种组织确保每个 GPU 都能保持稳定的数据供应,最大化计算效率并最小化空闲时间。该管道的有效性直接影响训练性能,因为数据准备中的任何瓶颈都可能使昂贵的 GPU 资源得不到充分利用。

核心组件

机器学习系统的性能主要受限于存储访问速度,这决定了训练数据可以检索的速度。在第六章中描述的数据工程实践——包括数据格式选择(Parquet、TFRecord、Arrow)、数据分区策略和数据本地性优化——直接影响到这些存储性能特性。本节探讨了在训练过程中数据访问模式和吞吐量限制的系统级影响。

这种访问速度受两个主要硬件限制:磁盘带宽和网络带宽。最大理论吞吐量由以下关系确定:Tstorage=min(Bdisk,Bnetwork)T_{\text{storage}} =\min(B_{\text{disk}}, B_{\text{network}}) 其中 BdiskB_{\text{disk}} 是物理磁盘带宽(从存储设备读取数据的速率)和 BnetworkB_{\text{network}} 代表网络带宽(跨分布式存储系统的数据传输速率)。这两个量都是以每秒字节数来衡量的。

训练操作期间实际达到的吞吐量低于这个理论最大值,因为数据访问模式是非顺序的。有效吞吐量可以表示为:Teffective=Tstorage×FaccessT_{\text{effective}} = T_{\text{storage}} \times F_{\text{access}} 其中 FaccessF_{\text{access}} 代表访问模式因子。在典型的训练场景中,FaccessF_{\text{access}} 近似为 0.1,这意味着有效吞吐量仅达到理论最大值的 10%。这种显著降低的原因是存储系统针对顺序访问模式进行了优化,而不是训练过程中常见的随机访问模式。

理论吞吐量和实际吞吐量之间的关系对系统设计和训练优化具有重要意义。了解这些限制条件使从业者能够就数据管道架构和训练方法做出明智的决策。

预处理

随着数据的可用性,数据预处理将原始输入数据转换为适合模型训练的格式。这个过程,传统上通过提取-转换-加载(ETL)或提取-加载-转换(ELT)管道 23 实现,是训练系统性能的关键决定因素。预处理操作的吞吐量可以用数学公式表示为:<semantics><mrow><msub><mi>T</mi><mtext mathvariant="normal">preprocessing</mtext></msub><mo>=</mo><mfrac><msub><mi>N</mi><mtext mathvariant="normal">workers</mtext></msub><msub><mi>t</mi><mtext mathvariant="normal">transform</mtext></msub></mfrac></mrow><annotation encoding="application/x-tex">T_{\text{preprocessing}} = \frac{N_{\text{workers}}}{t_{\text{transform}}}</annotation></semantics>

该方程捕捉了两个关键因素:

  • <semantics><msub><mi>N</mi><mtext mathvariant="normal">workers</mtext></msub><annotation encoding="application/x-tex">N_{\text{workers}}</annotation></semantics> 表示并行处理线程的数量

  • <semantics><msub><mi>t</mi><mtext mathvariant="normal">transform</mtext></msub><annotation encoding="application/x-tex">t_{\text{transform}}</annotation></semantics> 表示每个转换操作所需的时间

现代训练架构采用多个处理线程以确保预处理与消耗率保持同步。这种并行处理方法对于保持高效的处理器利用率至关重要。

预处理阶段的最后一步是将处理后的数据传输到计算设备(通常是 GPU)。整体训练吞吐量受三个因素的限制,表示为:<semantics><mrow><msub><mi>T</mi><mtext mathvariant="normal">training</mtext></msub><mo>=</mo><mo>min</mo><mrow><mo stretchy="true" form="prefix">(</mo><msub><mi>T</mi><mtext mathvariant="normal">preprocessing</mtext></msub><mo>,</mo><msub><mi>B</mi><mtext mathvariant="normal">GPU_transfer</mtext></msub><mo>,</mo><msub><mi>B</mi><mtext mathvariant="normal">GPU_compute</mtext></msub><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">T_{\text{training}} =\min(T_{\text{preprocessing}}, B_{\text{GPU\_transfer}}, B_{\text{GPU\_compute}})</annotation></semantics> 其中:

  • <semantics><msub><mi>B</mi><mtext mathvariant="normal">GPU_transfer</mtext></msub><annotation encoding="application/x-tex">B_{\text{GPU\_transfer}}</annotation></semantics> 表示 GPU 内存带宽

  • <semantics><msub><mi>B</mi><mtext mathvariant="normal">GPU_compute</mtext></msub><annotation encoding="application/x-tex">B_{\text{GPU\_compute}}</annotation></semantics> 表示 GPU 计算吞吐量

这种关系说明了训练系统设计中的一个关键原则:系统的整体性能受其最慢组件的限制。无论是预处理速度、数据传输速率还是计算能力,瓶颈阶段决定了整个系统的有效训练吞吐量。理解这些关系使系统架构师能够设计平衡的训练管道,其中预处理能力与计算资源相匹配,确保最佳资源利用。

GPT-2 语言模型数据管道

训练如 GPT-2 之类的语言模型需要一个针对文本处理优化的专用数据管道。

管道阶段

  1. 原始文本存储(存储区)

    • OpenWebText 数据集:约 40GB 原始文本文件

    • 存储在 NVMe SSD 上:3.5 GB/s 顺序读取带宽

    • 随机访问不同文档:约 0.35 GB/s 有效(F_access ≈ 0.1)

  2. 分词(CPU 预处理区)

    • BPE (字节对编码) 分词器(50,257 词汇量)将文本转换为标记 ID

    • BPE 将文本分割成子词单元(例如,“unbreakable” → [“un”, “break”, “able”])

    • 处理速率:每个 CPU 核心约 500K 标记/秒

    • 对于 batch_size=32,seq_len=1024:需要 32K 标记/批

    • 单核:32K 标记 ÷ 500K 标记/秒 = 每批 64ms

    • 瓶颈:GPU 正向传递仅需要 80ms

  3. 批处理与填充(CPU)

    • 将序列填充到统一长度(1024 个标记)

    • 打包成张量:[32, 1024] int64 = 每批 256KB

    • 简单时间:<5ms

  4. GPU 传输(PCIe)

    • PCIe Gen3 x16:15.75 GB/s 理论值

    • 每批 256KB ÷ 15.75 GB/s = 0.016ms(可忽略不计)

瓶颈分析

  • 分词:64ms

  • GPU 计算:80ms

  • 传输:<1ms

系统平衡(分词 ≈ GPU 计算),但分词成为瓶颈,随着 GPU 速度的提高(A100:45ms 计算意味着分词限制了吞吐量)。

应用优化

  • 多工作者数据加载:8 个 CPU 工作者并行分词 → 64ms ÷ 8 = 8ms

  • 预取:在 GPU 处理当前批次的文本时,分词下一个批次

  • 结果:GPU 利用率>95%,训练吞吐量:8×V100 上的 380 个样本/秒

关键见解:文本分词是 CPU 密集型(与 I/O 密集型的图像预处理不同)。语言模型训练需要与视觉模型不同的管道优化。

字节对编码是一种子词分词算法,它将文本分割成频繁的子词单元,而不是完整的单词,从而在固定词汇量下实现高效的表示,并通过组合处理罕见单词。这个预处理步骤将可变长度的文本转换为固定长度的整数序列,适合神经网络处理。

系统影响

数据管道架构与计算资源之间的关系直接决定了机器学习训练系统的性能。这种关系可以通过一个基本的吞吐量方程简单地表达:Tsystem=min(Tpipeline,Tcompute)T_{\text{system}} =\min(T_{\text{pipeline}}, T_{\text{compute}}) 其中 TsystemT_{\text{system}} 代表整体系统吞吐量,受管道吞吐量(TpipelineT_{\text{pipeline}})和计算速度(TcomputeT_{\text{compute}})的双重限制。

为了说明这些限制,可以考虑图像分类系统。其性能动态可以通过两个关键指标来分析。GPU 处理速率(RGPUR_{\text{GPU}})表示 GPU 每秒可以处理的图像最大数量,由模型架构复杂性和 GPU 硬件能力决定。管道交付速率(RpipelineR_{\text{pipeline}})是数据管道将预处理图像交付给 GPU 的速率。

在这种情况下,从高层次来看,系统的有效训练速度由这两个速率中较低的一个决定。当 RpipelineR_{\text{pipeline}} 小于 RGPUR_{\text{GPU}} 时,系统会经历 GPU 资源的低利用率。GPU 利用度的程度可以表示为:GPU Utilization=RpipelineRGPU×100%\text{GPU Utilization} = \frac{R_{\text{pipeline}}}{R_{\text{GPU}}} \times 100%

考虑一个例子。在现代 GPU 硬件上实现的 ResNet-50 模型可能达到每秒处理 1000 张图片的速率。然而,如果数据管道只能每秒提供 200 张图片,GPU 利用率将仅为 20%,这意味着 GPU 有 80% 的时间处于空闲状态。这会导致训练效率显著降低。即使拥有更强大的 GPU 硬件,这种低效性仍然存在,因为管道吞吐量成为系统性能的限制因素。这证明了为什么平衡的系统设计,其中管道和计算能力相匹配,对于最佳训练性能是必要的。

数据流

机器学习系统通过多个内存层级 24 管理复杂的数据流,同时协调管道操作。内存带宽约束与管道执行之间的相互作用直接影响训练性能。通过内存层次结构的数据传输最大速率受限于:Tmemory=min(Bstorage,Bsystem,Baccelerator)T_{\text{memory}} =\min(B_{\text{storage}}, B_{\text{system}}, B_{\text{accelerator}}) 其中,不同层级的带宽差异很大:

  • 存储 (BstorageB_{\text{storage}}): NVMe 存储设备提供 1-2 GB/s

  • 系统 (BsystemB_{\text{system}}): 主内存的数据传输速率为 50-100 GB/s

  • 加速器(BacceleratorB_{\text{accelerator}}):GPU 内存达到 900 GB/s 或更高

这些数量级上的差异创造了必须仔细管理的独特性能特征。每个训练迭代所需的总时间包括多个流水线操作:titeration=max(tfetch,tprocess,ttransfer)t_{\text{iteration}} =\max(t_{\text{fetch}}, t_{\text{process}}, t_{\text{transfer}})

该方程捕捉了三个组件:存储读取时间(tfetch?t_{\text{fetch?}})、预处理时间(tprocesst_{\text{process}})和加速器传输时间(ttransfert_{\text{transfer}})。

现代训练架构通过重叠这些操作来优化性能。当一个批次进行预处理时,系统同时从存储中检索下一个批次,同时将之前处理过的批次传输到加速器内存中。

这种协调运动需要精确管理系统资源,尤其是内存缓冲区和处理单元。内存层次结构必须考虑到带宽差异,同时保持连续的数据流。有效的流水线通过仔细的缓冲区大小和内存分配策略最小化空闲时间,最大化资源利用。这些组件的成功编排使得在内存层次结构中高效训练成为可能,同时管理每个层的固有带宽限制。

实际架构

ImageNet 数据集是理解现代机器学习系统中数据管道需求的一个典型示例。该分析考察了在大型图像数据集上训练视觉模型时的系统性能特征。

实际系统中的存储性能遵循理论吞吐量和实际吞吐量之间的定义关系:Tpractical=0.5×BtheoreticalT_{\text{practical}} = 0.5 \times B_{\text{theoretical}}

为了说明这种关系,考虑一个具有 3GB/s 理论带宽的 NVMe 存储设备。这样的设备大约能达到 1.5GB/s 的持续读取性能。然而,用于训练数据洗牌所需的随机访问模式进一步将有效带宽降低了 90%。系统设计者必须通过仔细的内存缓冲区设计来考虑这种降低。

系统的总内存需求根据以下关系随批次大小而扩展:Mrequired=(Bprefetch+Bprocessing+Btransfer)×SbatchM_{\text{required}} = (B_{\text{prefetch}} + B_{\text{processing}} + B_{\text{transfer}}) \times S_{\text{batch}}

在这个公式中,BprefetchB_{\text{prefetch}} 表示分配给数据预取的内存,BprocessingB_{\text{processing}} 表示用于主动预处理操作的内存需求,BtransferB_{\text{transfer}} 表示分配给加速器传输的内存,而 SbatchS_{\text{batch}} 表示训练批次大小。

预处理操作引入了额外的计算需求。常见的操作,如图像缩放、增强和归一化,消耗 CPU 资源。这些预处理操作必须满足一个基本的时间约束:tpreprocessing<tGPU_computet_{\text{preprocessing}} < t_{\text{GPU_compute}}

这个不等式决定了系统效率。当预处理时间超过 GPU 计算时间时,加速器的利用率成比例下降。因此,预处理和计算时间之间的关系在训练系统设计中建立了效率限制。

正向传播

在数据管道提供准备好的批次后,我们现在可以检查训练循环如何处理这些数据。正向传播实现了在第 8.3.1.1 节中描述的数学运算,其中输入数据通过模型传播以生成预测。虽然概念流程遵循之前建立的层叠式转换 A(l)=f(W(l)A(l1)+b(l))A^{(l)} = f\left(W^{(l)} A^{(l-1)} + b^{(l)}\right),但系统级实现提出了几个对高效执行至关重要的挑战。

计算操作

正向传播协调了在第 8.3.1.2 节中引入的计算模式,并针对特定的神经网络操作进行优化。基于矩阵乘法的基础,系统必须高效执行每个层所需的N×M×BN \times M \times B浮点运算,其中典型的层,其维度为512×1024512\times1024处理 64 个样本的批次,执行超过 3300 万次操作。

现代神经网络架构不仅扩展到这些基本的矩阵运算,还包括专门的计算模式。例如,卷积网络 25 在输入张量上执行系统的核运算。考虑一个典型的输入张量,其维度为64×224×224×364 \times 224 \times 224 \times 3(批量大小 ×\times 高度 ×\times 宽度 ×\times 通道),由7×77 \times 7核处理。每个位置需要 147 次乘加运算,并且有 64 个过滤器在218×218218 \times 218空间维度上操作,计算需求变得相当大。

Transformer 架构引入了注意力机制 26,这些机制计算序列之间的相似度分数。这些操作结合了矩阵乘法与 softmax 归一化,需要在不同序列长度上执行高效的广播和归约操作。这里的计算模式与卷积显著不同,需要硬件加速器灵活的执行策略。

在这些网络中,逐元素操作扮演着重要的辅助角色。激活函数如 ReLU 和 sigmoid 独立地转换值。虽然概念上简单,但这些操作可能会因为内存带宽而不是计算能力而成为瓶颈,因为它们在每次内存访问中进行的计算相对较少。批量归一化也面临着类似的挑战,它在批处理维度上计算统计数据并归一化值,同时在计算管道中创建同步点。

现代硬件加速器,尤其是 GPU,通过大规模并行化优化这些多样化的计算。实现峰值性能需要仔细关注硬件架构。GPU 在固定大小的线程块中处理数据,这些线程块称为 warp(在 NVIDIA 架构中)或 wavefront(在 AMD 架构中)。当矩阵维度与这些硬件特定的尺寸对齐时,峰值效率发生。例如,NVIDIA GPU 在处理对齐到32×3232\times32维度的矩阵时通常达到最佳性能。

类似于 cuDNN 这样的库通过为每种操作类型提供优化的实现来解决这些挑战。这些系统根据输入维度、硬件能力和内存限制动态选择算法。选择过程在计算效率和内存使用之间取得平衡,通常需要通过经验测量来确定特定硬件配置的最佳配置。

这些硬件利用模式强化了之前建立的效率原则。当批量大小从 32 减少到 16 时,由于未完全占用 warp,GPU 利用率通常会下降。在更大的批量大小(更好的利用率)和内存限制(迫使批量更小)之间的张力,体现了中央硬件-软件权衡如何渗透到训练系统设计的所有层面。

内存管理

内存管理在一般情况下是一个关键挑战,但在正向传播期间尤其重要,因为必须存储中间激活以供后续反向传播。总内存占用随着网络深度和批量大小的增加而增长,遵循一个基本关系。 总内存B×l=1LAl \text{总内存} \sim B \times \sum_{l=1}^{L} A_l 其中 BB 代表批量大小,LL 是层数,AlA_l 代表第 ll 层的激活大小。这个简单的方程掩盖了实践中相当大的复杂性。

考虑一个代表性的大型模型,如 ResNet-50(一个广泛使用的图像分类架构),以 32 个批次的尺寸处理分辨率为224×224224\times224的图像。初始卷积层产生维度为112×112×64112\times112\times64的激活图。使用单精度浮点格式(每个值 4 字节),这一层激活的存储需要大约 98 MB。随着网络通过其 50 层,累积的内存需求显著增加:完整的正向传递激活总量大约为 8GB,梯度需要额外的 4GB,模型参数消耗 200MB。这 12.2GB 的总数代表了高端 A100 GPU 40GB 内存容量的 30%以上,对于一个单个批次。

内存缩放模式揭示了关键的硬件利用权衡。将批次大小加倍到 64,将激活内存增加到 16GB,梯度内存增加到 8GB,总计 24.2GB,接近内存限制。在 GPT-3(175B 参数,代表当前的大型语言模型)的规模上训练更大的模型,仅参数就需要大约 700GB 的 FP32(FP16 为 350GB),这需要跨多个高内存节点分布式内存策略。

现代 GPU 在高性能训练配置中通常提供 40-80 GB 的内存,这必须容纳不仅仅是这些激活,还包括模型参数、梯度和优化状态。这一限制促使出现了几种内存管理策略:

激活检查点通过在反向传递期间有策略地丢弃和重新计算激活,以计算成本换取内存效率。而不是存储所有中间值,系统在选定的层上维护检查点。在反向传播过程中,它从这些检查点重新生成必要的激活。虽然这种方法可以将内存使用量减少 50%以上,但它通常会增加计算时间 20-30%。

混合精度训练提供了另一种提高内存效率的方法。通过将激活存储在半精度(FP16)格式而不是单精度(FP32)格式,内存需求立即减半。现代硬件架构为这些低精度操作提供了专门的支持,通常在保持计算吞吐量的同时节省内存。

批次大小与内存使用之间的关系在训练制度中创造了实际的权衡。虽然较大的批次大小可以提高计算效率,但它们按比例增加内存需求。机器学习从业者可能会在较小网络上的初始开发中使用较大的批次大小,然后在扩展到更深层的架构或与内存受限的硬件一起工作时将其调整下来。

在最先进的模型中,这种内存管理挑战变得尤为尖锐。最近的转换器架构可能只需要数十 GB 的激活,这就需要复杂的内存管理策略或分布式训练方法。理解这些内存约束和管理策略对于有效地设计和部署机器学习系统至关重要。

反向传递

在前向传递计算预测和损失之后,反向传递实现了第 8.3.3.1 节中详细描述的反向传播算法。这一计算密集的阶段使用之前建立的链式法则公式,通过网络传播梯度。系统级实现涉及计算和内存系统之间的复杂交互,需要仔细分析计算需求和数据移动模式。

计算操作

反向传递执行第 8.3.3.1 节中描述的梯度计算,通过网络的层反向处理参数梯度。正如算法机制部分所确立的,计算梯度需要矩阵运算,这些运算结合存储的激活和梯度信号,需要比前向计算多一倍的内存。

梯度计算LW(l)=δ(l)(a(l1))T\frac{\partial L}{\partial W^{(l)}} = \delta^{(l)} \cdot \left(a{(l-1)}\right)T构成了主要的计算负载,其中梯度信号与转置激活相乘,正如数学框架中详细描述的那样。对于具有 1000 个输入特征和 100 个输出特征的层,这会导致数百万次浮点运算,如算法机制分析中所计算的。

内存操作

反向传播在内存和计算单元之间移动大量数据。每次层计算梯度时,它都会协调一系列内存操作。GPU 首先从内存中加载存储的激活,然后读取传入的梯度信号,最后将计算出的梯度写回内存。

要了解这些记忆转移的规模,可以考虑一个处理 64 张图像批次的卷积层。每张图像有 3 个颜色通道,像素尺寸为224×224224\times 224。仅激活图就占用 0.38 GB 的内存,存储 64 张输入图像的副本。梯度信号显著增加了内存使用量——每个层的 64 个过滤器需要 8.1 GB 来存储梯度。即使是只存储卷积核更新信息的权重梯度,也需要 0.037 GB。

神经网络的反向传播需要通过分层内存系统协调数据移动。在反向传播过程中,每次计算都需要从正向传播中获取特定的激活值,从而在内存级别之间创建数据移动模式。这种移动模式决定了神经网络训练的性能特征。

这些反向传播的计算操作跨越了一个平衡速度和容量要求的内存层次结构。在计算梯度时,处理器必须检索存储在 HBM 或系统内存中的激活值,将它们传输到快速的静态 RAM(SRAM)进行计算,并将结果写回更大的存储。每次梯度计算都会触发这一系列的内存传输,使内存访问模式成为反向传播性能的关键因素。频繁地在内存级别之间的转换引入了延迟,这些延迟在反向传播计算链中累积。

生产注意事项

考虑在 ImageNet 数据集上使用 64 张图像的批次训练 ResNet-50 模型。第一层卷积应用了 64 个大小为7×77 \times 7的过滤器到尺寸为224×224224\times 224的 RGB 图像。在反向传播过程中,这一层的计算需要:每张图像的内存=224×224×64×4 字节 \text{Memory per image} = 224 \times 224 \times 64 \times 4 \text{ bytes}

总内存需求乘以 64 个批处理大小,仅用于存储梯度就达到大约 3.2 GB。当我们加上激活、权重更新和中间计算所需的内存时,单个层的内存需求接近许多 GPU 的内存限制。

在网络的深层,具有更多滤波器的层需要更多的资源。一个中间卷积层可能使用 256 个滤波器,这会使内存和计算需求增加四倍。反向传播必须在保持高效计算的同时管理这些资源。每一层的计算只能在接收到后续层的梯度信号后开始,从而在内存使用和计算模式上创建严格的顺序依赖性。

这种依赖性意味着 GPU 必须在反向传播过程中保持一个大的工作集内存。随着梯度在网络中反向流动,每个层在其计算阶段暂时需要峰值内存使用。系统不能释放这些内存,直到层完成其梯度计算并将结果传递给前一层。

参数更新和优化器

完成训练循环周期,更新模型参数的过程是机器学习系统中的核心操作。在训练过程中,在反向传播计算梯度后,系统必须为参数及其梯度分配和管理内存,然后执行更新计算。优化器的选择不仅决定了数学更新规则,还决定了训练所需的系统资源。

列表 8.1 展示了机器学习框架中的参数更新过程。

列表 8.1:参数更新:计算梯度并应用优化算法来根据损失函数调整模型参数。训练需要通过反向传播计算梯度,然后使用优化器更新权重以最小化损失,确保模型性能在多个训练周期中提高。

loss.backward()  # Compute gradients
optimizer.step()  # Update parameters

这些操作启动了一系列内存访问和计算。系统必须从内存中加载参数,使用存储的梯度计算更新,并将修改后的参数写回内存。不同的优化器在内存需求和计算模式上有所不同,这直接影响系统性能和资源利用率。

优化器内存需求

优化器的选择不仅仅是一个算法决策;它也是内存消耗和系统资源分配的主要驱动因素。虽然像 Adam 这样的高级优化器可以加速收敛,但它们是以 2-3 倍的内存使用增加为代价的,与像 SGD 这样的简单方法相比,因为它们必须存储历史梯度信息。这种权衡在内存受限的环境中变得至关重要,因为优化器状态可能超过模型参数内存需求。

梯度下降,我们之前讨论的最基本的优化算法,说明了参数更新中的核心内存和计算模式。从系统角度来看,每次参数更新必须:

  1. 从内存中读取当前参数值

  2. 从内存中访问计算出的梯度

  3. 执行乘法和减法操作

  4. 将新的参数值写回内存

由于梯度下降只需要存储参数和梯度的内存,与更复杂的优化器相比,它的内存开销相对较低。然而,更高级的优化器引入了额外的内存需求和计算复杂性,这直接影响系统设计。例如,正如我们之前讨论的,Adam 为每个参数维护两个额外的向量:一个用于第一矩(梯度的移动平均值)和一个用于第二矩(平方梯度的移动平均值)。这使内存使用量增加了三倍,但可以导致更快地收敛——这是经典系统在内存效率和训练速度之间的权衡。考虑有 100,000 个参数的情况,每个梯度需要 4 字节(32 位):

  • 梯度下降:100,000 ×\times 4 bytes = 400,000 bytes = 0.4 MB

  • Adam: 3 ×\times 100,000 ×\times 4 bytes = 1,200,000 bytes = 1.2 MB

对于具有数十亿参数的模型,这个问题尤其明显,因为模型大小(不计优化器状态和梯度)本身就已经占据了 GPU 内存的很大一部分。作为解决这个问题的一种方法,GaLoRE 的作者通过压缩优化器状态和梯度,并在压缩空间中计算更新,从而大大减少了内存占用,如图 8.6 所示。

图 8.6:内存占用分解:大型语言模型需要大量的内存,优化器状态和梯度通常超过模型权重的本身大小。此图量化了 llama-7B 模型的内存使用情况,揭示了压缩等技术的如何通过最小化优化器数据的存储需求来显著减少整体占用空间。

计算负载

参数更新的计算成本也取决于优化器的复杂性。对于梯度下降,每次更新都涉及简单的梯度计算和应用。更复杂的优化器,如 Adam,需要额外的计算,例如计算梯度和其平方的运行平均值。这增加了每个参数更新的计算负载。

这些计算在现代硬件(如 GPU 和 TPU)上的效率取决于优化器操作并行化的程度。虽然 Adam 中的矩阵运算可能被这些加速器高效处理,但一些复杂优化器中的操作可能无法很好地并行化,这可能导致硬件利用率不足。

优化器的选择直接影响系统内存需求和计算负载。更复杂的优化器通常以增加内存使用和计算复杂度为代价,以换取可能更快的收敛速度,这对系统设计和机器学习系统中的资源分配提出了重要的考虑。

批量大小与参数更新

批量大小是机器学习系统中的一个关键超参数,对参数更新过程、内存使用和硬件效率有显著影响。它决定了在模型参数更新之前,单次迭代中处理的训练样本数量。

较大的批量大小通常提供更准确的梯度估计,可能带来更快的收敛速度和更稳定的参数更新。然而,它们也按比例增加内存需求:批量的内存=批量大小×单个训练样本的大小 \text{批量的内存} = \text{批量大小} \times \text{单个训练样本的大小}

内存使用量的增加直接影响到参数更新过程,因为它决定了每次迭代中可用于计算梯度的数据量。

建立在前面章节中建立的效率模式之上,更大的批量可以提升硬件利用率,尤其是在针对并行处理优化的 GPU 和 TPU 上。这导致参数更新更加高效,训练时间更快,前提是有足够的内存可用。

如前所述,这种计算效率伴随着内存成本。内存有限的系统必须减少批量大小,从而产生与训练系统架构相关的根本性权衡。

批量大小的选择与优化过程的各个方面相互作用。例如,它影响参数更新的频率:较大的批量导致更新频率较低,但可能影响更大。批量大小影响自适应优化算法的行为,可能需要根据批量大小进行不同的调整。在分布式训练场景中,批量大小通常决定了数据并行的程度,影响梯度计算和参数更新如何在设备之间分布。

确定最佳批次大小需要在硬件约束内平衡这些因素。这通常需要实验来找到最佳点,以最大化学习效率和硬件利用率,同时确保有效的参数更新。

管道优化

即使是设计良好的管道架构,如果没有针对性的优化,也很难达到最佳性能。理论硬件能力与实际训练吞吐量之间的差距通常达到 50-70%:标称 300 TFLOPS 的 GPU 在训练工作负载中可能只能提供 90-150 TFLOPS,而总容量为 1000 TFLOPS 的分布式系统通常只能实现低于 500 TFLOPS 的有效吞吐量(L. Wang 等人 2018)。这种效率差距源于优化技术可以解决的系统性瓶颈。

下表提供了一个路线图,用于将优化技术与其解决的问题相匹配,作为系统性能改进的实用指南:

表 8.4:优化技术路线图:每个主要瓶颈类别都有针对性的解决方案,以解决特定的性能限制。这种映射指导系统优化,通过将技术与其分析结果相匹配。

瓶颈 主要解决方案
数据移动延迟 预取与管道重叠
计算吞吐量 混合精度训练
内存容量 梯度累积与激活检查点

训练管道性能受三个主要瓶颈的限制,这些瓶颈决定了整体系统效率(表 8.4):数据移动延迟、计算吞吐量限制和内存容量限制。当训练批次无法足够快地从存储通过预处理到计算单元流动,以保持加速器的利用率时,就会出现数据移动延迟。当数学运算由于次优并行化、精度选择或内核效率低下而低于硬件峰值性能时,就会出现计算吞吐量限制。内存容量限制既限制了我们可以训练的模型大小,也限制了我们可以处理的批次大小,直接限制了模型复杂度和训练效率。这些瓶颈在不同系统规模上表现不同——一个 100GB 的模型面临与 1GB 模型不同的限制,但它们的系统识别和缓解遵循一致的原则。

这些瓶颈以复杂的方式相互作用。当数据加载成为瓶颈时,GPU 会空闲等待批次。当计算次优时,内存带宽得不到充分利用。当内存受限时,我们不得不使用较小的批次,这降低了 GPU 的效率。优化挑战在于识别当前限制性能的瓶颈,然后选择解决该特定约束的技术,同时不会在别处引入新的瓶颈。

系统优化框架

上述建立的管道架构为有针对性的优化创造了机会。有效的优化遵循一种系统的方法论,这种方法论适用于任何系统规模或模型架构。这个三阶段框架为所有优化工作提供了基础:分析以识别瓶颈,为识别到的约束选择适当的技巧,并组合解决方案以同时解决多个瓶颈,而不产生冲突。

分析阶段使用 PyTorch Profiler、TensorFlow Profiler 或 NVIDIA Nsight Systems 等工具来揭示训练迭代过程中时间花费在哪里。这些是在概述中介绍过的相同分析方法——现在系统地应用来量化哪个瓶颈占主导地位。一个分析可能显示 40%的时间用于数据加载,35%用于计算,25%用于内存操作——明显表明数据加载是优化的主要目标。

选择阶段将优化技巧与识别到的瓶颈相匹配。我们检查的每种技巧都针对特定的约束:预取解决数据移动延迟,混合精度训练解决计算吞吐量和内存约束,梯度累积管理内存限制。选择不仅需要理解哪些瓶颈存在,还需要理解影响技巧有效性的硬件、模型架构和训练配置的特点。

组合阶段结合多种技术以实现累积效益。预取和混合精度训练相互补充——一个解决数据加载问题,另一个解决计算和内存问题——允许同时应用。然而,某些组合会产生冲突:激进的预取会增加内存压力,可能与其他内存受限配置冲突。成功的组合需要理解技巧之间的相互作用和依赖关系。

这个系统框架——分析、选择、组合——将三个核心优化技术应用于主要瓶颈类别。预取通过协调数据传输与计算来重叠目标数据移动延迟。混合精度训练通过降低精度算术来解决计算吞吐量和内存约束。梯度累积和检查点通过以计算换取内存使用来管理内存约束。这些技术不是互斥的;有效的优化通常结合多种方法以实现累积效益。

生产优化决策框架

虽然系统框架确立了方法论,但生产环境引入了额外的操作约束。生产决策框架通过在真实部署环境中影响技巧选择的操作因素扩展了系统方法。

生产优化决策必须在性能改进与实现复杂性、操作监控需求和系统可靠性之间取得平衡。四个因素指导技术选择:性能影响潜力量化预期的加速或内存节省,实现复杂性评估开发和调试所需的工作量,操作开销评估持续的监控和维护需求,以及系统可靠性影响检查技术如何影响容错性和可重复性。

高影响、低复杂度的优化,如数据预取,应首先实施,以提供即时的好处,同时风险最小。如梯度检查点这样的复杂优化需要仔细的成本效益分析,包括开发时间、调试复杂性和持续维护需求。我们通过生产视角来审视每种优化技术,提供关于实施优先级、监控要求和操作考虑的具体指导,以便从业者能够为他们的特定部署环境做出明智的决定。

数据预取和管道重叠

为了说明系统框架的实际应用,我们首先从预取和重叠技术开始,这些技术通过协调数据传输与计算来针对数据移动延迟瓶颈。当分析表明计算单元在等待数据传输完成时处于空闲状态时,这种优化证明最为有效。

训练机器学习模型涉及在存储、内存和计算单元之间的大量数据移动。数据管道由一系列连续的传输组成:从磁盘存储到 CPU 内存,CPU 内存到 GPU 内存,以及通过 GPU 处理单元。在标准实现中,每个传输必须在下一个开始之前完成,如图 8.7 所示,这导致计算效率低下。

图片

图 8.7:顺序数据传输:标准数据提取管道一次执行从磁盘到 CPU、CPU 到 GPU 以及通过 GPU 处理单元的传输,创建瓶颈并限制模型训练期间的计算吞吐量。这种串行方法阻止了计算和数据移动的重叠,阻碍了资源的高效利用。

预取技术通过在预定计算时间之前将数据加载到内存中来解决这些低效问题。在处理当前批次的过程中,系统会加载并准备后续批次,保持持续的数据供应(Martín Abadi 等人 2015)。

重叠通过协调多个管道阶段以并发执行来建立在预取的基础上。系统在处理当前批次的同时,通过数据加载和预处理操作准备未来的批次。这种协调在训练管道中建立了连续的数据流,如图 8.8 所示。

图片

图 8.8:管道并行性:通过并发处理数据和准备后续批次,重叠计算和数据获取减少了整体作业完成时间。这种优化实现了 40%的速度提升,完成时间为 00:40 秒,而使用简单的顺序获取则需要 01:30 秒。

这些优化技术在涉及大规模数据集、预处理密集型数据、多 GPU 训练配置或高延迟存储系统的场景中显示出特别的价值。下一节将探讨在现代训练系统中实现这些技术的具体机制。

预取机制

预取和重叠优化了训练流程,通过使数据处理和计算的各个阶段能够并发而不是顺序执行。这些技术通过解决数据传输和预处理中的瓶颈来最大化资源利用率。

正如你所回忆的那样,训练数据经历三个主要阶段:从存储中检索、转换为合适的格式以及在模型训练中的利用。未优化的管道按顺序执行这些阶段。GPU 在数据获取和预处理期间处于空闲状态,等待数据准备完成。这种顺序执行在训练过程中产生了显著的低效率。

预取通过在模型计算期间异步加载数据来消除等待时间。数据加载器作为独立的线程或进程运行,在当前批次训练的同时准备下一批次。这确保了当前批次完成后 GPU 可以立即获得数据。

重叠通过同时协调所有三个管道阶段来扩展这种效率。当 GPU 处理一个批次时,预处理开始于下一个批次,而数据获取开始于后续批次。这种协调在所有管道阶段保持恒定的活动。

现代机器学习框架通过内置实用程序实现这些技术。PyTorch 的DataLoader类展示了这种实现。这种用法的示例在列表 8.2 中给出。

列表 8.2:管道优化:机器学习工作流程通过批处理和预取来高效处理数据,以保持 GPU 的持续利用率。

loader = DataLoader(
    dataset, batch_size=32, num_workers=4, prefetch_factor=2
)

参数num_workersprefetch_factor控制并行处理和数据缓冲。多个工作进程同时处理数据加载和预处理,而prefetch_factor确定预先准备批次的数量。

缓冲区管理在流水线效率中扮演着关键角色。预取缓冲区的大小需要仔细调整以平衡资源利用率。缓冲区过小会导致 GPU 等待数据准备,重新引入这些技术旨在消除的空闲时间。相反,分配过大的缓冲区会消耗本可以存储模型参数或更大批次的内存。

实现依赖于有效的 CPU-GPU 协调。CPU 管理数据准备任务,而 GPU 处理计算。这种劳动分工,加上存储 I/O 操作,创建了一个高效的流水线,最大限度地减少了硬件资源上的空闲时间。

这些优化技术在涉及慢速存储访问、复杂数据预处理或大数据集的场景中特别有益。这些技术在不同的训练环境中提供特定的优势,具体取决于计算和数据特征。

预取优势

预取和重叠是两种技术,通过解决数据处理和计算中的关键瓶颈,显著提高了训练流水线的效率。为了说明这些益处的影响,表 8.5 展示了以下比较:

表 8.5:流水线优化:通过启用并行数据加载和计算,预取和重叠最大化了硬件利用率并减少了训练时间,克服了顺序流水线中固有的瓶颈。增加的资源使用和适应不同瓶颈的能力展示了这些技术的可扩展性优势。

方面 传统流水线 带有预取和重叠
GPU 利用率 经常空闲 接近恒定
训练时间 由于顺序操作而更长 通过并行化而减少
资源使用 常常次优 在可用硬件上最大化
可扩展性 受限于最慢的组件 适应各种瓶颈

这些方法最关键的优点之一是提高了 GPU 的利用率。在传统的未优化流水线中,GPU 经常在等待数据被检索和预处理时处于空闲状态。这种空闲时间产生了低效,尤其是在数据增强或预处理涉及复杂转换的工作流程中。通过引入异步数据加载和重叠,这些技术确保 GPU 始终有数据可供处理,消除了不必要的延迟。

另一个重要的好处是减少了整体训练时间。预取和重叠处理允许计算管道持续运行,多个阶段同时工作而不是顺序进行。例如,当 GPU 处理当前批次时,数据加载器可以检索并预处理下一批次,确保数据通过系统的稳定流动。这种并行性最小化了训练迭代之间的延迟,使得训练周期可以更快完成,尤其是在涉及大规模数据集的场景中。

这些技术具有高度的可扩展性和适应性,可以适应各种硬件配置。预取缓冲区和重叠机制可以根据系统的具体要求进行调整,无论是瓶颈在于缓慢的存储、有限的网络带宽还是计算限制。通过将数据管道与底层硬件的能力相匹配,预取和重叠处理最大化了资源利用率,对于大规模机器学习工作流程来说是无价的。

总体而言,预取和重叠处理直接解决了训练管道中最常见的效率低下问题。通过优化数据流和计算,这些方法不仅提高了硬件效率,还能够在更短的时间内训练更复杂的模型。

数据管道优化应用

预取和重叠是高度通用的技术,可以应用于各种机器学习领域和任务,以提升管道效率。它们的益处在数据处理和预处理计算成本高昂或大规模数据集可能造成数据传输和加载瓶颈的场景中最为明显。

其中一个主要的应用场景是计算机视觉,数据集通常包含需要大量预处理的高分辨率图像。图像分类、目标检测或语义分割等任务通常涉及调整大小、归一化和数据增强等操作,所有这些操作都可能显著增加预处理时间。通过采用预取和重叠处理,这些操作可以与计算同时进行,确保 GPU 在训练过程中保持忙碌。

例如,一个典型的图像分类管道可能包括随机裁剪(10 ms)、颜色抖动(15 ms)和归一化(5 ms)。如果没有预取,这 30 ms 的预处理将延迟每个训练步骤。预取允许这些操作在上一批次的计算期间进行。

NLP 工作流程也受益于这些技术,尤其是在处理大量文本数据的大型语料库时。例如,预处理文本数据包括分词(将单词转换为数字)、填充序列以获得相同长度,以及可能的子词分词。在 BERT 模型训练流程中,这些步骤可能每批处理数千个句子。预取允许这种文本处理与模型训练同时进行。预取确保这些转换与训练并行发生,而重叠优化了数据传输和计算。这在基于转换器的模型(如 BERT 或 GPT)中特别有用,这些模型由于计算需求高,需要保持一致的吞吐量以维持效率。

分布式训练系统涉及多个 GPU 或节点,是预取和重叠的另一个关键应用。在分布式设置中,网络延迟和数据传输速率通常成为主要的瓶颈。预取通过确保在特定 GPU 需要之前数据已准备好并可用来缓解这些问题。重叠通过在中央计算继续的同时协调各个节点上的数据预处理,进一步优化分布式训练流程,从而减少整体同步延迟。

除了这些领域之外,预取和重叠在涉及存储在远程或基于云系统上的大规模数据集的工作流程中尤其有价值。在云平台上进行训练时,数据可能需要通过网络或从分布式存储中获取,这引入了额外的延迟。在这种情况下使用预取和重叠有助于最小化这些延迟的影响,确保即使在较慢的数据访问速度下,训练也能顺利进行。

这些用例说明了预取和重叠如何解决各种机器学习管道中的低效问题。通过优化数据和计算的流动,这些技术使各种应用中的训练工作流程更快、更可靠。

管道优化实现挑战

虽然预取和重叠是优化训练流程的有用技术,但它们的实现也伴随着某些挑战和权衡。理解这些限制对于有效地将这些方法应用于现实世界的机器学习工作流程中非常重要。

其中一个主要挑战是预取和重叠伴随的内存使用增加。按设计,这些技术依赖于维护一个预取数据批次的缓冲区,这需要额外的内存资源。对于大型数据集或高分辨率输入,这种内存需求可能变得相当大,尤其是在内存容量有限的 GPU 上训练时。如果缓冲区大小没有仔细调整,可能会导致内存不足错误,迫使从业者减少批大小或调整其他参数,这可能会影响整体效率。

例如,当使用预取因子为 2 和批处理大小为 256 的高分辨率图像(1024×10241024\times1024像素)时,缓冲区可能需要额外的 2 GB GPU 内存。当训练需要大量内存来存储其参数和激活的视觉模型时,这尤其具有挑战性。

另一个困难在于调整控制预取和重叠的参数。例如,在 PyTorch 中的num_workersprefetch_factor设置,或其他框架中的缓冲区大小,需要针对特定的硬件和工作负载进行优化。例如,增加工作线程的数量可以在一定程度上提高吞吐量,但超过这个点,可能会导致对 CPU 资源的竞争,甚至由于过多的上下文切换而降低性能。确定最佳配置通常需要经验测试,这可能很耗时。一个常见的起点是将num_workers设置为可用的 CPU 核心数。然而,在一个 16 核心的系统上处理大图像时,使用所有核心进行数据加载可能会留下不足的 CPU 资源用于其他基本操作,这可能会减慢整个管道的速度。

在采用预取和重叠的管道中,调试也变得更加复杂。异步数据加载和多线程或多进程引入了潜在的竞争条件、死锁或同步问题。在这样系统中诊断错误可能具有挑战性,因为执行流程不再简单。开发者可能需要投入额外的努力来监控、记录和调试工具,以确保管道可靠运行。

在某些情况下,预取和重叠可能只提供微小的好处。例如,在存储访问或网络带宽显著快于计算本身的系统中,这些技术可能不会明显提高吞吐量。在这种情况下,预取引入的额外复杂性和内存开销可能不足以证明其使用是合理的。

最后,预取和重叠需要在训练管道的不同组件之间进行仔细的协调,例如存储、CPU 和 GPU。设计不良的管道可能导致不平衡,其中一个阶段成为瓶颈,抵消了这些技术的优势。例如,如果数据加载过程太慢,无法跟上 GPU 的处理速度,重叠的好处将受到限制。

尽管存在这些挑战,但预取和重叠仍然是优化训练管道时不可或缺的工具,只要使用得当。通过理解和解决它们的权衡,从业者可以有效地实施这些技术,确保更平滑、更高效的机器学习工作流程。

混合精度训练

当前的预取优化数据移动,而混合精度训练通过在可能的情况下战略性地使用降低精度的算术,同时保持数值稳定性,来解决计算吞吐量限制和内存容量约束。当分析表明训练受限于 GPU 内存容量或由于内存带宽限制导致计算单元未充分利用时,这种技术证明最为有效。

混合精度训练在模型训练过程中结合不同的数值精度以优化计算效率。这种方法使用 FP32、16 位浮点数(FP16)和脑浮点数(bfloat16)格式的组合来减少内存使用并加快计算速度,同时保持模型精度(Micikevicius 等人 2017;王勇和 Kanwar 2019)。

在 FP32 中训练的神经网络每个参数需要 4 个字节,而 FP16 和 bfloat16 都使用 2 个字节。对于一个具有10910⁹个参数的模型,这种减少将内存使用从 4 GB 降低到 2 GB。这种内存减少使得在相同硬件上能够使用更大的批量大小和更深的架构。

这些格式之间的数值精度差异决定了它们的使用场景。FP32 表示的数值范围大约从±1.18×1038\pm1.18 \times 10^{-38}±3.4×1038\pm3.4 \times 10^{38},具有 7 位小数的精度。FP16 的范围从±6.10×105\pm6.10 \times 10^{-5}±65,504\pm65,504,具有 3-4 位小数的精度。由 Google Brain 开发的 Bfloat16 保持了与 FP32 相同的动态范围(±1.18×1038\pm1.18 \times 10^{-38}±3.4×1038\pm3.4 \times 10^{38}),但精度有所降低(3-4 位小数)。这种范围保持使得 bfloat16 特别适合深度学习训练,因为它比 FP16 更有效地处理大范围和小范围的梯度。

混合精度方法分为三个主要阶段,如图图 8.9 所示。在正向传播过程中,输入数据转换为降低精度(FP16 或 bfloat16),矩阵乘法以这种格式执行,包括激活函数的计算。在梯度计算阶段,反向传播以降低精度计算梯度,但结果存储在 FP32 主权重中。最后,在权重更新期间,优化器以 FP32 更新主权重,并且这些更新的权重在下一个正向传播中转换回降低精度。

图片

图 8.9:混合精度训练:降低精度格式(FP16,bfloat16)通过在正向和反向传播过程中减少内存带宽和计算需求来加速深度学习。存储在 FP32 精度的主权重从降低精度的梯度中累积更新,在利用低精度算术的性能提升的同时,保持精度。

现代硬件架构专门设计用于加速降低精度计算。NVIDIA 的 GPU 包括针对 FP16 和 bfloat16 操作优化的 Tensor Cores(Xianyan Jia 等人 2018)。Google 的 TPU 原生支持 bfloat16,因为这种格式专门为机器学习工作负载而设计。这些架构优化通常使降低精度操作的计算吞吐量比 FP32 高一个数量级,使得混合精度训练在现代硬件上特别高效。

FP16 计算

在混合精度训练中,大多数操作,如矩阵乘法和激活函数,都是在 FP16 精度下执行的。降低精度使得这些计算可以更快地执行,并且与 FP32 相比,内存消耗更少。FP16 操作在配备 Tensor Cores 的现代 GPU 上尤其有效,这些核心专为加速涉及半精度值的计算而设计。这些核心能够原生地执行 FP16 操作,从而实现显著的加速。

FP32 累积

虽然 FP16 效率高,但其有限的精度可能导致数值不稳定性,尤其是在梯度更新等关键操作中。为了减轻这一点,混合精度训练在权重更新和梯度累积等某些步骤中保留了 FP32 精度。通过保持这些计算的高精度,系统避免了梯度下溢或上溢的风险,确保模型在训练过程中正确收敛。

损失缩放

FP16 的一个关键挑战是其降低的动态范围 27,这增加了梯度值变得太小而无法准确表示的可能性。通过在反向传播期间临时放大梯度值,损失缩放解决了这个问题。具体来说,在计算梯度之前,损失值通过一个大的因子(例如,2102^{10})进行缩放,确保它们保持在 FP16 的可表示范围内。

现代机器学习框架,如 PyTorch 和 TensorFlow,提供了内置的混合精度训练支持。这些框架抽象了管理不同精度的复杂性,使得从业者可以以最小的努力实现混合精度工作流程。例如,PyTorch 的torch.cuda.amp(自动混合精度)库自动处理选择在 FP16 或 FP32 中执行哪些操作的过程,并在必要时应用损失缩放。

结合 FP16 计算、FP32 累加和损失缩放,我们可以实现混合精度训练,从而在不牺牲训练过程的精度或稳定性的情况下,显著减少内存使用和计算开销。以下章节将探讨这种方法的实际优势及其对现代机器学习工作流程的影响。

混合精度优势

混合精度训练提供了使其成为现代机器学习工作流程优化技术的优势。通过减少内存使用和计算负载,它使得从业者能够训练更大的模型,处理更大的批量,并实现更快的成果,同时保持模型精度和收敛性。

混合精度训练减少了内存消耗。FP16 计算只需要 FP32 计算一半的内存,这直接减少了训练期间激活、权重和梯度的存储需求。例如,一个具有 10 亿个参数的 transformer 模型在 FP32 中需要 4GB 的内存来存储权重,但在 FP16 中只需要 2GB。这种内存效率允许更大的批量大小,这可能导致更稳定的梯度估计和更快的收敛。由于每个操作消耗的内存更少,从业者可以在相同的硬件上训练更深、更复杂的模型,解锁之前受内存限制的能力。

混合精度训练也加速了计算。现代 GPU,如配备 Tensor 核的 GPU,专门针对 FP16 操作进行了优化。这些核心使硬件在每个周期内可以处理比 FP32 更多的操作,从而实现更快的训练时间。利用前面详细说明的矩阵乘法模式,FP16 可以在这些主导操作上比 FP32 实现高达 2-3 倍的速度提升。这种计算速度提升在大规模模型中尤为明显,例如变压器和卷积神经网络,这些模式集中了计算工作负载。

混合精度训练还通过更好地匹配现代加速器的功能来提高硬件利用率。在传统的 FP32 工作流程中,GPU 的计算吞吐量往往由于并行处理的设计而未被充分利用。FP16 操作要求较低,允许同时执行更多计算,确保硬件接近其满负荷运行。

最后,混合精度训练与分布式和基于云的系统需求相吻合。在分布式训练中,大规模模型在多个 GPU 或节点上训练,内存和带宽成为关键约束。通过减少设备间交换的张量大小,混合精度不仅加快了设备间通信,还降低了整体资源需求。这使得它在可扩展性和成本效益优先的环境中特别有效。

总体而言,混合精度训练的好处不仅限于性能提升。通过优化内存使用和计算,这项技术使机器学习从业者能够更有效地训练高级模型,成为现代机器学习的基石。

GPT-2 混合精度训练影响

GPT-2 训练严重依赖混合精度(FP16)以适应 GPU 内存限制。

内存节省

FP32 基准:

  • 参数:1.5B × 4 字节 = 6.0 GB

  • 激活(批处理=32):约 ~65 GB

  • 梯度:6.0 GB

  • 总计:约 ~77 GB(超过任何单个 GPU)

FP16 混合精度:

  • 参数(FP16):1.5B × 2 字节 = 3.0 GB

  • 激活(FP16):约 ~32.6 GB

  • 梯度(FP16):3.0 GB

  • 优化器状态(FP32 主权重):12.0 GB(Adam m, v)

  • 总计:约 ~51 GB(仍然很紧凑,但通过优化可以管理)

使用混合精度 + 梯度检查点:

  • 激活减少到 ~8 GB(反向传播时重新计算)

  • 总计:约 ~26 GB → 舒适地适应 32GB V100

计算加速

在 NVIDIA V100(启用 Tensor 核)上:

  • FP32 吞吐量:约 ~90 个样本/秒

  • FP16 吞吐量:约 ~220 个样本/秒

  • 加速:2.4 倍更快的训练

关键实现细节

  1. 损失缩放:起始缩放=2¹⁵,如果检测到溢出则动态减少。注意层中的梯度可以从 10^-6 到 10³,因此损失缩放可以防止下溢。

  2. FP32 主权重:在 FP32 中进行的优化器更新可以防止权重停滞。小的学习率(2.5e-4)乘以 FP16 梯度可能会四舍五入为零;FP32 累积保留了这些微小的更新。

  3. 选择性 FP32 操作:

    • LayerNorm:在 FP32 中计算(方差计算需要高精度)

    • Softmax:在 FP32 中计算(指数需要全范围)

    • 所有其他操作:FP16

训练成本影响

  • FP32:在 32 个 V100 上运行 2 周大约需要$50,000

  • FP16:在 32 个 V100 上运行 1.2 周大约需要$28,000

  • 节省:$22,000 + 6 天更快的迭代

质量影响: 最小。GPT-2 的困惑度在 FP32 基线 0.5%以内,远在噪声范围内。

混合精度训练应用

混合精度训练已成为机器学习工作流程中的关键要素,尤其是在计算效率和内存优化至关重要的领域和场景中。它能够实现更快的训练和更大的模型容量,使其在各种机器学习任务和架构中高度适用。

最突出的用例之一是在训练大规模机器学习模型。在自然语言处理中,BERT(345M 参数)、GPT-3(175B 参数)以及基于 Transformer 的架构是本章讨论的计算模式的典型例子。混合精度训练允许这些模型以更大的批量大小或更深的配置运行,从而加快收敛速度并提高在大量数据集上的准确性。

在计算机视觉中,图像分类、目标检测和分割等任务通常需要处理高分辨率图像并应用计算密集型的卷积操作。通过利用混合精度训练,这些工作负载可以更有效地执行,使得在实用的资源限制内训练 ResNet、EfficientNet 和视觉 Transformer 等高级架构成为可能。

混合精度训练在强化学习(RL)中也特别有价值,其中模型与环境交互以优化决策策略。强化学习通常涉及高维状态空间,并且需要大量的计算资源来训练模型和进行模拟。混合精度减少了这些过程的开销,使研究人员能够专注于更大的环境和更复杂的策略网络。

另一个关键应用是在分布式训练系统中。当在多个 GPU 或节点上训练模型时,内存和带宽成为可扩展性的限制因素。混合精度通过减少设备之间交换的激活、权重和梯度的尺寸来解决这些问题。例如,在一个包含 8 个 GPU 的分布式训练设置中,将张量大小从 FP32 减少到 FP16 可以将通信带宽需求从 320 GB/s 减半到 160 GB/s。这种优化在基于云的环境中非常有用,因为在云环境中资源分配和成本效率至关重要。

混合精度训练在语音处理、生成建模和科学模拟等领域得到越来越广泛的应用。这些领域的模型通常需要大量数据和参数,这可能会超出传统 FP32 工作流程的极限。通过优化内存使用并利用 Tensor 核心提供的加速,从业者可以更快、更经济地训练高级模型。

混合精度训练对不同任务和领域的适应性凸显了其在现代机器学习中的重要性。无论应用于大规模自然语言模型、计算密集型视觉架构还是分布式训练环境,这项技术都赋予研究人员和工程师推动计算可行性的边界。

混合精度训练局限性

虽然混合精度训练在内存效率和计算速度方面提供了显著优势,但它也引入了几个挑战和权衡,必须谨慎管理以确保成功实施。

其中一个主要挑战在于 FP16 的精度降低。虽然 FP16 计算更快且内存需求更低,但它们的有限动态范围(±65,504)可能导致数值不稳定性,尤其是在梯度计算期间。小于 6×10^-5 的小梯度值在 FP16 中变得太小,无法准确表示,从而导致下溢。虽然损失缩放通过将梯度乘以 2⁸ 到 2¹⁴ 这样的因子来解决此问题,但实现和调整此缩放因子会增加训练过程的复杂性。

另一个权衡涉及收敛问题的风险增加。虽然许多现代机器学习任务在混合精度训练下表现良好,但某些模型或数据集可能需要更高的精度才能实现稳定可靠的结果。例如,具有长序列的循环神经网络在 FP16 中往往会积累数值误差,需要仔细的梯度裁剪和精度管理。在这种情况下,从业者可能需要尝试选择性地启用或禁用特定操作的 FP16 计算,这可能会使训练工作流程复杂化。

调试和监控混合精度训练也需要额外的关注。在梯度或激活中出现的 NaN(非数字)值等数值问题在 FP16 工作流程中更为常见,如果没有适当的工具和日志记录,可能难以追踪。例如,在深度网络中,梯度爆炸可能在混合精度中表现出不同的现象,在 FP16 中表现为无穷大,而在 FP32 中则不会。

另一个挑战是对专用硬件的依赖。混合精度训练在很大程度上依赖于针对 FP16 操作优化的 GPU 架构,例如 NVIDIA GPU 中的 Tensor Cores。虽然这些 GPU 正在变得越来越普遍,但并非所有硬件都支持混合精度操作,这限制了该技术在某些环境中的应用。

最后,存在一些场景,混合精度训练可能不会带来显著的好处。计算需求相对较低(参数少于 10M)或参数规模较小的模型可能无法充分利用 FP16 操作提供的加速。在这种情况下,混合精度工作流程的额外复杂性可能超过了它们的潜在优势。

尽管存在这些挑战,混合精度训练仍然是大多数大规模机器学习任务的高效优化技术。通过理解和解决其权衡,从业者可以利用其优势,同时最大限度地减少潜在缺点,确保高效且可靠的训练工作流程。

梯度累积和检查点

补充混合精度对内存优化的方法,梯度累积和检查点技术通过以减少内存使用为代价来换取计算时间,解决了内存容量限制。当分析表明训练受限于可用内存而不是计算吞吐量时,这些技术证明最为有效,从而在内存受限的硬件上实现更大的模型或批大小。

训练大型机器学习模型通常需要大量的内存资源,尤其是存储三个关键组件:激活(中间层输出)、梯度(参数更新)和模型参数(权重和偏置)在正向和反向传播过程中。然而,GPU 上的内存限制可能会限制可以训练的批大小或模型的复杂性。

梯度累积和激活检查点是两种旨在通过优化训练过程中的内存使用来克服这些限制的技术。这两种技术都使研究人员和从业者能够训练更大、更复杂的模型,成为现代深度学习工作流程中不可或缺的工具。了解何时应用这些技术需要对特定训练场景中的内存使用模式和性能瓶颈进行仔细分析。

梯度累积与检查点机制

梯度累积和激活检查点操作基于不同的原理,但两者都旨在通过修改前向和反向计算的处理方式来优化训练过程中的内存使用。

梯度累积

梯度累积通过将单个有效批次拆分为更小的“微批次”来模拟更大的批次大小。如图 8.10 所示,在每次前向和反向传递过程中,计算微批次的梯度并将其添加到累积梯度缓冲区中。这个过程不是立即将梯度应用于更新模型参数,而是对多个微批次重复此过程。一旦累积了有效批次中所有微批次的梯度,就使用组合梯度来更新参数。

图片

图 8.10:梯度累积:通过在更新模型参数之前累积多个微批次的梯度,有效批次大小增加,而每步内存需求不增加,从而模拟使用更大批次的训练。这项技术使得在内存有限的情况下能够使用大型模型或数据集进行训练,提高训练的稳定性和潜在的泛化性能。

此过程允许模型在不需要一次性存储整个批次的情况下,获得使用较大批次训练的好处,例如改进的梯度估计和收敛稳定性。例如,在 PyTorch 中,可以通过按比例调整学习率以匹配累积的微批次数量,并在处理完整个有效批次后调用 optimizer.step() 来实现这一点。

梯度累积的关键步骤是:

  1. 对微批次执行前向传递。

  2. 在反向传递期间计算梯度。

  3. 在不更新模型参数的情况下,将梯度累积到一个缓冲区中。

  4. 对有效批次中的所有微批次重复步骤 1-3。

  5. 在处理完所有微批次后,使用累积的梯度更新模型参数。

激活检查点

激活检查点通过丢弃并选择性地重新计算激活来减少反向传递期间的内存使用。在标准训练中,前向传递的激活存储在内存中,用于反向传播期间的梯度计算。然而,这些激活可能会消耗大量的内存,尤其是在深度网络中。

使用检查点技术,前向传播过程中仅保留激活子集。在反向传播过程中需要计算梯度时,被丢弃的激活将根据需要重新计算,如图 8.11 所示。这种方法以计算效率为代价换取内存节省,因为重新计算增加了训练时间,但允许在有限的内存约束下训练更深的模型。该图显示了通过避免存储前向传播中不必要的较大中间张量来节省内存,并在反向传播过程中按需重新计算这些张量。

实现涉及:

  1. 将模型分成段。

  2. 在前向传播过程中仅保留这些段落的边界激活。

  3. 在需要时,在反向传播过程中重新计算中间层的激活。

图 8.11:激活检查点:在反向传播过程中通过交换内存使用和重新计算来训练更深的神经网络。通过仅存储前向传播中的一部分激活并在需要时重新计算其他部分,该技术以增加训练时间为代价,减少了峰值内存需求。

类似于 PyTorch 的框架提供了如torch.utils.checkpoint之类的工具来简化此过程。检查点技术在非常深的架构(如变换器或大型卷积网络)中特别有效,其中存储激活所需的内存可能超过 GPU 的容量。

梯度累积和检查点之间的协同作用使得训练更大、更复杂的模型成为可能。梯度累积管理与批量大小相关的内存约束,而检查点优化了中间激活的内存使用。这些技术共同扩展了可以在现有硬件上训练的模型范围。

内存和计算效益

梯度累积 28 和激活检查点 29 为在训练大规模机器学习模型时遇到的内存限制提供了解决方案。通过优化训练过程中内存的使用方式,这些技术使得即使在资源受限的硬件上也能开发和部署复杂的架构。

梯度累积的主要优点之一是它能够模拟更大的批量大小,而无需增加存储完整批量的内存需求。更大的批量大小已知可以改善梯度估计,从而实现更稳定的收敛和更快的训练。使用梯度累积,实践者可以在使用适合 GPU 内存的小微批量时实现这些好处。这种灵活性在训练高分辨率数据(如大图像或 3D 体数据)的模型时非常有用,即使单个批次也可能超过可用内存。

激活检查点,另一方面,在正向传递期间显著减少了中间激活的内存占用。这允许训练更深的模型,否则由于内存限制而不可行。通过按需丢弃和重新计算激活,检查点释放出可用于更大模型、额外层或更高分辨率数据的内存。这在高级架构中尤为重要,例如 transformer 或密集卷积网络,这些架构需要大量内存来存储中间计算。

这两种技术都增强了机器学习工作流程的可扩展性。在资源受限的环境中,如基于云的平台或边缘设备,这些方法提供了一种在无需昂贵硬件升级的情况下高效训练模型的方法。它们使研究人员能够尝试更大和更复杂的架构,推动计算可行性的边界。

除了内存优化之外,这些技术还促进了成本效率。通过降低训练的硬件要求,梯度累积和检查点降低了整体开发成本,对预算紧张的组织来说非常有价值。这对于初创公司、学术机构或运行在共享计算资源上的项目尤其相关。

梯度累积和激活检查点提供了技术和实践上的优势。这些技术创造了一种更灵活、可扩展且成本效益高的训练大规模模型的方法,使从业者能够应对日益复杂的机器学习挑战。

GPT-2 梯度累积策略

GPT-2 的训练配置展示了梯度累积的必要作用。

内存限制

  • V100 32GB GPU 带有梯度检查点:可以适应 batch_size=16(如激活内存示例所示)

  • 所需的有效批量大小:512(transformer 收敛的最优值)

  • 问题:512 ÷ 16 = 仅为了批量大小就需要 32 个 GPU

梯度累积解决方案

不是使用 32 个 GPU,而是使用 8 个 GPU 进行梯度累积:

配置:

  • 每个 GPU 的微批量:16

  • 累积步骤:4

  • 每个 GPU 的有效批量:16 × 4 = 64

  • 全局有效批量:8 GPUs × 64 = 512

训练循环:

optimizer.zero_grad()
for step in range(4):  # Accumulation steps
    micro_batch = next(dataloader)  # 16 samples
    loss = model(micro_batch) / 4  # Scale loss
    loss.backward()  # Accumulate gradients
# Now gradients represent 64 samples
all_reduce(gradients)  # Sync across 8 GPUs
optimizer.step()  # Update with effective batch=512

性能影响

没有累积(天真方法):

  • 32 GPUs × batch_size=16 = 512 个有效批量

  • 梯度同步:32 个 GPU → 高通信开销

  • 成本:$16/hour × 32 GPUs = $512/hour

有累积(实际的 GPT-2 方法):

  • 8 GPUs × (16 × 4 累积) = 512 个有效批量

  • 梯度同步:仅每 4 步进行一次,只有 8 个 GPU

  • 成本:$16/hour × 8 GPUs = $128/hour

  • 节省:$384/hour = 75%成本降低

权衡分析

  • 计算开销:每次更新 4 次正向传递 = ~8%更慢(管道重叠一些成本)

  • 内存开销:梯度累积缓冲区 = 可忽略(梯度已经需要)

  • 通信效益:同步频率降低 4 倍 → 通信时间降低 75%

  • 成本效益:在 8 个 GPU 上训练 2 周 = $21.5K,而在 32 个 GPU 上 = $86K

收敛质量

  • 有效批量 512,累积:困惑度 18.3

  • 真实批量 512,不累积:困惑度 18.2

  • 差异:0.5%(在噪声范围内)

为什么这种方法有效: 梯度累积在数学上等同于更大的批量,因为梯度是可加的:Lbatch=1Ni=1NL(xi)=14j=14[116k=116L(xjk)] \nabla L_{\text{batch}} = \frac{1}{N}\sum_{i=1}^N \nabla L(x_i) = \frac{1}{4}\sum_{j=1}⁴ \left[\frac{1}{16}\sum_{k=1}^{16} \nabla L(x_{jk})\right]

关键见解: 对于像 GPT-2 这样的内存受限模型,梯度累积加上适中的 GPU 数量比扩展到多个 GPU 的小批量更具有成本效益。

梯度累积和检查点应用

梯度累积和激活检查点技术在训练过程中硬件内存限制带来重大挑战的场景中尤其有价值。这些技术在训练大规模模型、处理高分辨率数据以及优化资源受限环境中的工作流程中得到了广泛应用。

梯度累积的一个常见用例是在训练需要大批量以实现稳定收敛的模型时。例如,像 GPT、BERT 和其他 Transformer 架构的模型由于它们的梯度估计改进,通常从更大的批量中受益。然而,这些批量大小可能会迅速超过 GPU 的内存容量,尤其是在处理高维输入或多个 GPU 时。通过在多个较小的微批量上累积梯度,梯度累积使得在不超出内存限制的情况下使用有效的大批量成为可能。这对于语言建模、序列到序列学习和图像分类等任务特别有益,在这些任务中,批量大小对训练动态有显著影响。

激活检查点技术使得训练具有众多层或复杂计算的深度神经网络成为可能。在计算机视觉领域,如 ResNet-152、EfficientNet 和 DenseNet 等架构,在训练过程中需要大量内存来存储中间激活值。通过战略性地重新计算激活值,检查点技术减少了内存需求,使得在 GPU 内存限制内训练这些更深层的架构成为可能。

在自然语言处理领域,像 GPT-3 或 T5 这样的模型,具有数百层和数十亿参数,严重依赖检查点来管理内存使用。这些模型通常超出了单个 GPU 的内存容量,使得检查点对于高效训练成为必要。同样,在涉及生成器和判别器模型的生成对抗网络(GANs)中,检查点有助于在训练过程中管理两个网络的联合内存需求。

另一个关键应用是在资源受限的环境中,如边缘设备或基于云的平台。在这些情况下,内存通常是限制因素,而升级硬件可能并不总是可行的选择。梯度累积和检查点技术为在现有硬件上训练模型提供了一种成本效益高的解决方案,使得能够实现高效的流程,而无需额外投资资源。

这些技术在研究和实验中也是不可或缺的。它们允许从业者原型化和测试更大、更复杂的模型,探索由于内存限制而无法实现的创新架构。这对学术研究人员和预算有限的初创公司尤其有价值。

梯度累积和激活检查点技术解决了在内存受限环境中训练大规模模型的核心挑战。这些技术已成为自然语言处理、计算机视觉、生成建模和边缘计算从业者的重要工具,促进了高级机器学习架构的更广泛采用。

内存-计算权衡挑战

虽然梯度累积和激活检查点技术在优化训练期间的内存使用方面是有用的工具,但它们的实现引入了几个挑战和权衡,必须谨慎管理以确保高效和可靠的流程。

激活检查点的一个主要权衡是其引入的额外计算开销。按设计,检查点通过在反向传播过程中丢弃和重新计算中间激活来节省内存。这种重新计算增加了训练时间,因为必须多次执行前向传播的部分。例如,在一个有 12 层的 transformer 模型中,如果每 4 层放置一个检查点,每个中间激活在反向传播过程中需要重新计算多达三次。这种开销的程度取决于模型如何分割以进行检查点,以及每个段落的计算成本。从业者必须在内存节省和额外计算时间之间找到平衡,这可能会影响整体训练效率。

梯度累积虽然能够有效地模拟更大的批量大小,但可能会导致参数更新速度变慢。由于梯度是在多个微批次上累积的,因此与使用完整批次训练相比,模型参数更新的频率较低。这种更新延迟可能会影响收敛速度,尤其是在对批量大小动态敏感的模型中。梯度累积需要仔细调整学习率。例如,如果累积 4 个微批次的梯度来模拟 128 个批量大小时,通常需要将学习率乘以 4,以保持与使用完整批次训练相同的有效学习率。有效批量大小随着累积而增加,需要相应地调整学习率以保持稳定的训练。

使用这些技术时,调试和监控也变得更加复杂。在激活检查点中,可能在重新计算过程中出现错误,这使得将问题追溯到其源头变得更加困难。同样,梯度累积需要确保梯度在每个有效的批次之后被正确累积和重置,如果不妥善处理,可能会引入错误。

另一个挑战是实现过程中的复杂性增加。虽然现代框架如 PyTorch 提供了简化梯度累积和检查点的工具,但有效使用这些工具仍然需要理解其背后的原理。例如,激活检查点需要适当地分割模型以最小化重新计算的开销,同时实现有意义的内存节省。不恰当的分割可能导致性能不佳或计算成本过高。

这些技术在某些场景中可能也具有有限的益处。例如,如果激活检查点中重新计算的计算成本相对于内存节省过高,可能会抵消该技术的优势。同样,对于不需要大批量的模型或数据集,梯度累积引入的复杂性可能不足以证明其使用。

尽管存在这些挑战,梯度累积和激活检查点对于在内存受限条件下训练大规模模型仍然是不可或缺的。通过仔细管理它们的权衡并针对特定工作负载进行定制,从业者可以最大化这些技术的效率和有效性。

优化技术比较

如表 8.6 总结所示,这些技术在实现复杂性、硬件要求、对计算速度和内存使用的影响方面存在差异。选择合适的优化策略取决于诸如特定用例、可用的硬件资源以及训练过程中性能瓶颈的性质等因素。

表 8.6:优化策略:预取、混合精度训练和梯度累积针对 AI 训练管道中的不同瓶颈——数据传输、内存消耗和反向传播——以提高计算效率并支持更大模型。选择合适的策略需要在实现复杂性、速度提升和资源利用率之间取得平衡,这取决于硬件和工作负载的特点。

方面 预取和重叠 混合精度训练 梯度累积和检查点
主要目标 最小化数据传输延迟并最大化 GPU 利用率 减少内存消耗和计算开销 克服反向传播和参数更新期间的内存限制
关键机制 异步数据加载和并行处理 结合 FP16 和 FP32 计算 模拟更大的批量大小和选择性激活存储
内存影响 增加预取缓冲区的内存使用 通过使用 FP16 减少内存使用 减少激活和梯度的内存使用
计算速度 通过减少空闲时间来提高 使用 FP16 加速计算 由于检查点中的重新计算可能会减慢
可扩展性 高度可扩展,特别是对于大型数据集 支持训练更大模型 允许在有限的硬件上训练更深的模型
硬件要求 受益于快速存储和多核 CPU 需要支持 FP16 的 GPU(例如,Tensor 核心) 在标准硬件上运行
实现复杂性 中等(需要调整预取参数) 低到中等(有框架支持) 中等(需要仔细分割和累积)
主要优势 减少训练时间,提高硬件利用率 加快训练速度,支持更大模型,减少内存使用 支持更大的批量大小和更深的模型
主要挑战 调整缓冲区大小,增加内存使用 可能出现数值不稳定性,需要损失缩放 增加计算开销,参数更新速度减慢
理想用例 大数据集,复杂的预处理 大规模模型,尤其是在 NLP 和计算机视觉领域 非常深的网络,内存受限的环境

虽然这三种技术代表了机器学习中的核心优化策略,但它们是更广泛优化方法的一部分,这些方法超越了单机边界。在某个点上,即使是完美优化的单机训练也会达到极限:内存容量限制阻碍了更大模型的使用,计算吞吐量限制训练速度,数据集大小超过了单机的存储能力。

为单机优化建立的系统级分析方法论也适用于确定何时分布式方法变得必要。当分析表明瓶颈无法通过单机技术解决时,扩展到多台机器就成为逻辑上的下一步。

多机缩放基础

从单机到分布式训练的转变代表了优化策略和系统复杂性的转变。虽然单机优化侧重于通过我们已经探索的技术——预取、混合精度、梯度累积——来高效利用可用资源,但分布式训练引入了质的不同挑战,这些挑战需要新的概念框架和工程方法。

多机训练需求

三个具体信号表明分布式训练变得必要而非仅仅有益。首先,当模型参数、优化器状态和激活存储超过单设备容量,即使应用了梯度检查点和混合精度后,也会出现内存耗尽。对于 Transformer 模型,这个阈值通常出现在当前一代具有 40-80GB 内存的 GPU 上,大约有 10-20 亿个参数(Rajbhandari 等人 2020b)。其次,当单设备训练需要数周或数月才能收敛时,会出现不可接受的训练时长,使得迭代变得不可能。在单个 V100 GPU 上训练 GPT-3 需要大约 355 年(T. Brown 等人 2020),这使得分布式方法不再是可选的,而是必需的。第三,当训练数据达到数个 TB 时,数据集规模超过了单机的存储能力,这在大规模视觉或语言建模任务中很常见。

分布式训练复杂性权衡

分布式训练引入了单机场景中不存在的三个主要复杂性维度。通信开销来自梯度同步,每个训练步骤必须汇总所有设备上的梯度。对于一个参数分布在DD个设备上的模型,所有-reduce 操作必须每步传输大约2N(D1)/D2N(D-1)/D字节。在商品网络基础设施(10-100 Gbps)上,这种通信可以主导小于 10 亿参数的模型计算时间(Sergeev 和 Balso 2018)。随着集群规模的增加,容错要求呈指数增长:一个拥有 100 个节点且每个节点可靠性为 99.9%的集群平均每几个小时就会发生故障,这需要检查点和恢复机制。算法考虑因素发生变化,因为分布式训练改变了优化动态——来自数据并行的较大批量大小会影响收敛行为,需要学习率缩放和预热策略,而单机训练则不需要这些策略(Goyal 等人 2017)。

从单机到分布式过渡

为单机训练建立的系统优化方法经过重要调整后扩展到分布式环境。现在,性能分析必须捕捉设备间的通信模式和同步开销,除了计算和内存指标。像 NVIDIA Nsight Systems 和 PyTorch 的分布式分析工具可以揭示训练是受通信限制还是受计算限制,从而指导选择并行化策略。解决方案空间从单机技术扩展到包括数据并行(分发训练示例)、模型并行(分发模型参数)、流水线并行(分发模型层)以及结合多种策略的混合方法。原则保持一致——识别瓶颈、选择适当的技术、组合解决方案,但实现复杂性显著增加。

分布式系统

建立在单机优化基础之上,分布式训练将我们的系统优化框架扩展到多台机器。当单机技术已经用尽——预取消除了数据加载瓶颈,混合精度最大化了内存效率,梯度累积达到实用极限时——分布式方法提供了下一级别的扩展能力。

分布式训练是通过协调的数据分区和梯度同步,在多个计算设备上并行化模型训练的过程,使得能够训练超出单机内存或时间限制的模型。

从单机训练到分布式训练的演进遵循一个自然的扩展路径:首先本地优化,然后横向扩展。这种演进确保了分布式系统在每个节点上高效运行,同时增加了多机训练所需的协调机制。由于模型复杂性和数据集大小的增加,训练机器学习模型通常需要超出单机的扩展。计算能力、内存和存储的需求可能会超过单个设备的能力,尤其是在自然语言处理、计算机视觉和科学计算等领域。分布式训练 31 通过将工作负载分散到多台机器上来解决这一挑战,这些机器协调起来以高效地训练单个模型。

这种协调依赖于共识协议和同步原语,以确保参数更新在各个节点上保持一致。虽然基本的屏障同步对于研究来说足够了,但生产部署需要仔细的容错性、检查点和恢复机制,这些将在后续章节关于操作实践的章节中介绍。

从单设备到分布式训练的路径涉及不同的复杂阶段,每个阶段都建立在之前级别的挑战之上。单 GPU 训练只需要本地内存管理和直接的正向/反向传递,从而确立了基本的计算模式。扩展到单个节点内的多个 GPU 引入了高带宽通信需求,通常通过 NVLink32 或带有 NCCL33 优化的 PCIe 连接来处理,同时保持了单机的容错性和调度简单性。

实际分布式训练的复杂性

虽然像 PyTorch (FSDP)和 DeepSpeed 这样的框架抽象掉了大部分复杂性,但高效实现分布式训练仍然是一个重大的工程挑战。生产部署需要仔细的网络配置(例如,InfiniBand)、基础设施管理(例如,Kubernetes、Slurm)以及调试复杂的非本地问题,如同步挂起或通信瓶颈。对于大多数团队来说,利用托管云服务通常比从头开始构建和维护这种基础设施更为实际。

分布式训练过程本身涉及将数据集分割成非重叠的子集,将每个子集分配给不同的 GPU,并在每个设备上独立执行正向和反向传递。一旦在每个 GPU 上计算了梯度,它们就会在更新模型参数之前进行同步和聚合,确保所有设备以一致的方式学习。图 8.12 展示了这个过程,显示了如何分割输入数据,将其分配给多个 GPU 进行计算,然后同步以集体更新模型。

图片

图 8.12:数据并行训练:分布式机器学习通过将数据集分割到多个 GPU 上,实现梯度的并发计算,然后将这些梯度聚合以更新共享模型参数,从而通过利用并行处理加速模型训练,同时保持所有设备上模型的一致性。

这种协调引入了分布式训练系统必须解决的几个关键挑战。分布式训练系统必须通过分割工作、管理机器间的通信以及在训练过程中保持同步来编排多机计算。了解这些基本需求为考察分布式训练的主要方法提供了基础:数据并行,它将训练数据分割到机器上;模型并行,它将模型本身分割;流水线并行,它结合了两者的一些方面;以及集成多种策略的混合方法。

分布式训练效率指标

在考察具体的并行策略之前,了解控制分布式训练效率的定量指标是至关重要的。这些指标为做出关于扩展策略、硬件选择和优化方法的明智决策提供了基础。

通信开销是分布式训练系统中的主要瓶颈。在数据并行系统中,AllReduce 操作消耗了 10-40%的总训练时间,随着规模的增加,这种开销显著增加。对于在 128 个 GPU 上的 BERT-Large,通信开销达到总运行时间的 35%,而 GPT-3 规模模型在 1,024 个 GPU 上经历了 55%的通信开销。通信时间随着 O(n)的环-AllReduce 和 O(log n)的基于树的减少而扩展,这使得互连选择对于大规模部署至关重要。

高效分布式训练的带宽需求很大,尤其是对于 Transformer 模型。高效的系统需要每个节点 100-400 GB/s 的总带宽来支持 Transformer 架构。BERT-Base 在每个迭代中需要 8 GB 的参数同步,跨越 64 个 GPU,要求在<50ms 的同步延迟下保持 200 GB/s 的持续带宽。具有 175B 参数的语言模型需要 700 GB/s 的总带宽来维持 80%的并行效率,这需要 InfiniBand HDR 或等效的互连。

同步频率在通信效率和收敛行为之间构成了一个权衡。梯度累积降低了同步频率,但增加了内存需求,可能会影响收敛。每 4 步同步可以减少 60%的通信开销,但将梯度存储的内存使用量增加 3 倍。异步方法完全消除了同步成本,但引入了可能导致大学习率收敛降低 15-30%的陈旧性。

扩展效率在不同数量的 GPU 之间遵循可预测的模式。在 2-32 个 GPU 的线性扩展范围内,系统通常达到 85-95%的并行效率,因为通信开销仍然很小。在 64-256 个 GPU 的通信限制范围内,即使有最优的互连,效率也会下降到 60-80%。超过 512 个 GPU 时,协调开销变得占主导地位,由于集体操作的延迟,效率限制在 40-60%。

硬件选择对这些扩展特性有重要影响。配备 NVLink 的 NVIDIA DGX 系统实现了 600 GB/s 的分割带宽,每个节点最多支持 8 个 GPU 达到 90%的并行效率。多节点扩展需要 InfiniBand 网络,其中 EDR(100 Gbps)支持多达 64 个节点的有效训练,而 HDR(200 Gbps)则使扩展到 256 个以上节点成为可能,效率超过 70%。

这些效率指标直接影响了并行策略的选择。数据并行在线性扩展范围内表现良好,但在大规模下会受限于通信。模型并行解决了内存限制问题,但引入了限制效率的顺序依赖性。流水线并行减少了设备空闲时间,但引入了管理微批次的复杂性。理解这些权衡使得架构师能够为他们的特定工作负载选择合适的策略。

数据并行

基于上述效率特性,数据并行化代表了最直接的分布式方法,在通信开销可管理的线性扩展区域尤其有效。这种方法通过将数据集分割成更小的子集来在多个设备上分配训练过程。每个设备使用分配给它的数据子集的完整模型副本进行训练。例如,当使用 4 个 GPU 在 100 万张图像上训练图像分类模型时,每个 GPU 将处理 25 万张图像,同时保持模型架构的相同副本。

当数据集很大但模型大小可管理时,这种方法尤其有效,因为每个设备必须在内存中存储模型的完整副本。这种方法在图像分类和自然语言处理等场景中得到广泛应用,在这些场景中,数据集可以并行处理,而数据样本之间没有依赖关系。例如,当在 ImageNet 上训练 ResNet 模型时,每个 GPU 可以独立处理其图像部分,因为一张图像的分类不依赖于另一张图像的结果。

数据并行化的有效性源于我们在优化基础中确立的随机梯度下降的一个属性。在不同的 minibatch 上计算的梯度可以在保持与单设备训练的数学等价性的同时进行平均。这一属性使得跨设备进行并行计算成为可能,其数学基础直接来源于期望的线性。

考虑一个在数据集DD上训练的参数θθ的模型。单个数据点xix_i的损失函数是L(θ,xi)L(θ, x_i)。在标准 SGD(批量大小为BB)中,minibatch 的梯度更新为:g=1Bi=1BθL(θ,xi) g = \frac{1}{B} \sum_{i=1}^B \nabla_θ L(θ, x_i)

在具有 NN 个设备的数据并行中,每个设备 kk 都会计算其自己的小批量 BkB_k 的梯度:gk=1|Bk|xiBkθL(θ,xi) g_k = \frac{1}{|B_k|} \sum_{x_i \in B_k} \nabla_θ L(θ, x_i)

全局更新平均这些局部梯度:gglobal=1Nk=1Ngk g_{\text{global}} = \frac{1}{N} \sum_{k=1}^N g_k

这种平均在数学上等同于在合并后的批次上计算梯度 Btotal=k=1NBkB_{\text{total}} = \bigcup_{k=1}^N B_k: gglobal=1|Btotal|xiBtotalθL(θ,xi) g_{\text{global}} = \frac{1}{|B_{\text{total}}|} \sum_{x_i \in B_{\text{total}}} \nabla_θ L(θ, x_i)

这种等价性说明了为什么数据并行能够保持 SGD 训练的统计特性。该方法将不同的数据子集分配到各个设备上,独立计算局部梯度,并将这些梯度平均以近似全批梯度。

该方法与梯度累积平行,其中单个设备在更新参数之前通过多个正向传递累积梯度。这两种技术都使用梯度的加性属性来高效处理大型批量。

生产现实:大规模数据并行

生产环境中的数据并行涉及超出理论框架的几个操作考虑因素:

  • 通信效率:在规模上,梯度同步的 AllReduce 操作成为瓶颈。生产系统使用如 NCCL 这样的优化库,采用环形或树状通信模式以最小化开销

  • 容错性:大规模训练中的节点故障需要检查点/重启策略。生产系统实施具有本地和分布式存储的分层检查点

  • 动态扩展:云环境需要弹性扩展能力,根据需求和成本限制添加/删除工作者,同时需要维护梯度同步。

  • 成本优化:生产数据并行考虑不同实例类型和可抢占实例的每 GPU 小时成本,在训练时间和基础设施成本之间进行平衡

  • 网络带宽需求:大型模型需要仔细的网络拓扑规划,因为梯度通信可能消耗 10-50%的训练时间,具体取决于模型大小和批量大小

生产团队通常在部署大型分布式训练作业之前对通信模式和扩展效率进行基准测试,以确定最佳配置。

数据并行实现

数据并行的过程可以分解为一系列不同的步骤,每个步骤都在确保系统高效运行中扮演着其角色。这些步骤在图 8.13 中进行了说明。

图片

图 8.13:数据并行:分布式训练在多个设备上复制模型,每个设备在聚合梯度以更新模型参数之前处理数据的一个子集,从而加速训练过程。这种方法与模型并行相对立,模型本身在设备之间进行分区。

数据集拆分

数据并行的第一步是将数据集划分为更小的、非重叠的子集。这确保每个设备处理数据的一个独特部分,避免冗余并能够有效利用可用硬件。例如,对于一个包含 100,000 个训练示例和 4 个 GPU 的数据集,每个 GPU 将被分配 25,000 个示例。现代框架如 PyTorch 的 DistributedSampler 会自动处理这种分配,实现预取和缓存机制以确保数据可以随时用于处理。

设备正向传递

一旦数据子集被分配,每个设备独立执行正向传播。在这个阶段,模型处理其分配的批次数据,生成预测并计算损失。例如,在 ResNet-50 模型中,每个 GPU 会独立计算其批次的卷积、激活和最终损失。正向传播是计算密集型的,并受益于硬件加速器,如 NVIDIA V100 GPU 或 Google TPUs,这些加速器针对矩阵运算进行了优化。

反向传播和计算

在正向传播之后,每个设备在反向传播期间计算损失相对于模型参数的梯度。现代框架如 PyTorch 和 TensorFlow 通过它们的 autograd 系统自动处理这一点。例如,如果一个模型有 5000 万个参数,每个设备计算所有参数的梯度,但仅基于其本地数据子集。

梯度同步

为了保持分布式系统的一致性,每个设备计算出的梯度必须进行同步。这种协调代表了分布式系统的一个挑战:在最小化通信复杂性的同时实现全局共识。环形全归约算法是这种权衡的一个例子,它将设备组织在一个逻辑环中,其中每个 GPU 只与其邻居通信。算法的通信轮次复杂度为 O(n),但需要序列依赖性,这可能会限制并行性。

例如,对于共享 100 MB 模型梯度的 8 个 GPU,环形全归约只需要 7 个通信步骤,而不是原始全全同步所需的 56 个步骤。环形拓扑结构会创建瓶颈:环形中最慢的链路决定了整体同步时间,并且网络分区可能会停止整个训练过程。像 tree-reduce 这样的替代算法以增加根节点带宽需求为代价,实现了 O(log n)的延迟。现代系统通常实现分层拓扑,在节点内使用高速链路,在节点之间使用低带宽连接来优化这些权衡。

参数更新

在梯度聚合之后,每个设备使用选定的优化算法(如带有动量的 SGD 或 Adam)独立更新模型参数。这种去中心化的更新策略,在 PyTorch 的 DistributedDataParallel (DDP)等框架中实现,能够在不要求中央协调服务器的情况下实现高效的参数更新。由于所有设备在同步后都具有相同的梯度值,因此它们执行数学上等效的更新,以保持分布式系统中的模型一致性。

例如,在一个有 8 个 GPU 的系统上训练 ResNet 模型时,每个 GPU 根据其数据子集计算局部梯度。通过环全归一化平均梯度后,每个 GPU 都有相同的全局梯度值。然后每个设备独立使用优化器的更新规则应用这些梯度。如果使用学习率为 0.1 的 SGD,更新将是weights = weights - 0.1 * gradients。这个过程保持了与单设备训练的数学等价性,同时实现了分布式计算。

这个过程涉及数据拆分、执行计算、同步结果和更新参数,对于每一批数据都会重复进行。现代框架自动化了这个循环,使得开发者能够专注于模型架构和超参数调整,而不是分布式计算的物流。

数据并行优势

数据并行提供了几个关键优势,使其成为分布式训练的主要方法。通过将数据集拆分到多个设备上,并允许每个设备训练模型的一个相同副本,这种方法有效地解决了现代 AI 训练系统中的核心挑战。

数据并行的主要优势是其与大数据集的线性扩展能力。随着数据集增长到千兆字节范围,单机处理它们变得耗时且成本高昂。例如,在单个 GPU 上训练 ImageNet(120 万张图片)的视觉转换器可能需要几周时间,但分布在 8 个 GPU 上只需几天。这种可扩展性在语言建模等领域的价值尤为突出,其中数据集可以超过数十亿个标记。

硬件利用率效率代表另一个重要好处。数据并行通过确保每个设备积极处理其数据部分,通常保持高于 85%的高 GPU 利用率。现代实现通过异步数据加载和梯度计算与通信重叠来实现这一点。例如,当一个批次计算梯度时,下一个批次的数据已经被加载并预处理。

实现简单性使数据并行与其他分布式策略区分开来。现代框架将复杂的分布式训练简化为几行代码。例如,将 PyTorch 模型转换为使用数据并行通常只需要将其包裹在DistributedDataParallel中并初始化分布式环境。这种易用性极大地促进了其在研究和工业界的广泛应用。

这种方法还提供了跨模型架构的灵活性。无论是训练 ResNet(视觉)、BERT(语言)还是图神经网络(图数据),相同的并行数据原则都适用,无需修改。这种通用性使其成为分布式训练的默认选择,尤其有价值。

训练时间减少可能是最直接的好处。在适当的实现下,数据并行可以实现接近线性的加速,并随着额外设备的增加。在单个 GPU 上需要 100 小时的训练可能在 8 个 GPU 上大约需要 13 小时完成,假设高效的梯度同步和最小的通信开销。

虽然这些好处使数据并行具有吸引力,但要实现这些优势需要仔细的系统设计。必须解决几个挑战才能完全实现这些好处。

GPT-2 数据并行扩展:1→8→32 GPU

这个例子展示了数据并行在实际中的扩展情况,包括效率下降。

单个 GPU 基线

  • 批处理大小:16(使用梯度检查点,适合 32GB)

  • 每步时间:1.8 秒

  • 训练吞吐量:约 9 个样本/秒

  • 到 50K 步的时间:25 小时

8 个 GPU:单个节点使用 NVLink

配置:

  • 每 GPU 批处理:16,全局批处理:128

  • 梯度同步:3GB @ 600 GB/s(NVLink)= 5ms

性能结果:

  • 计算:每步 180ms

  • 通信:每步 5ms

  • 总计:每步 185ms

  • 加速:1.8s ÷ 0.185s = 9.7×(并非 8×)

  • 并行效率:9.7 ÷ 8 = 121%

为什么超过 100%的效率?更大的全局批处理(128 比 16)将 GPU 利用率从 72%提高到 89%。这种“超线性”加速在 ML 的小规模中很常见,当基线利用率较差时。

训练时间:25 小时 ÷ 9.7 = 2.6 小时

32 个 GPU:4 个节点使用 InfiniBand

配置:

  • 每 GPU 批处理:16,全局批处理:512

  • 节点内通信:5ms(NVLink)

  • 节点间通信:3GB @ 12.5 GB/s(InfiniBand)= 240ms

性能结果:

  • 计算:180ms(占时间的 42%)

  • 通信:245ms(占时间的 58%)

  • 总计:每步 425ms

  • 加速:1.8s ÷ 0.425s = 4.2×更快 → 5.9 小时

  • 并行效率:4.2 ÷ 32 = 13%

通信成为主导并成为瓶颈。

更好的方法:8 个 GPU 使用梯度累积

  • 配置:8 个 GPU × 批量 16 × 4 累积步骤 = 512 个有效批量

  • 通信开销:5ms ÷ (4 × 180ms) = 0.7%

  • 训练时间:3.8 小时

  • 成本:$128/小时 × 3.8 小时 = $486,与 32 个 GPU 的$3,021 相比

  • 节省:$2,535(减少 84%),仅多 1 小时训练时间

关键见解

  1. NVLink 使单个节点内高效扩展成为可能(97%效率)

  2. 节点间通信摧毁了效率(降至 13%)

  3. 梯度累积优于朴素缩放,适用于内存受限的模型

  4. GPT-2 的最佳点:每个节点 8 个 GPU,使用梯度累积,而不是朴素扩展到 32+个 GPU

OpenAI 的 GPT-2 论文报告了在 4 个节点上使用优化通信(可能是梯度累积与流水线并行相结合)在 32 个 V100 上进行的训练,而不是纯数据并行。

数据并行局限性

虽然数据并行是分布式训练的有效方法,但它引入了几个挑战,必须解决这些挑战才能实现高效和可扩展的训练系统。这些挑战源于计算和通信之间的固有权衡,以及硬件和网络基础设施施加的限制。

通信开销是数据并行中最显著的瓶颈。在梯度同步期间,每个设备必须交换梯度更新,对于大型模型,每一步可能需要传输数百兆字节的数据。使用 8 个 GPU 训练一个 10 亿参数的模型时,每个同步步骤可能需要在网络上传输数吉字节的数据。虽然高速互连如 NVLink(300 GB/s)或 InfiniBand(200 Gb/s)有所帮助,但开销仍然很大。NCCL 的环-allreduce 算法 34 通过将设备组织成环形拓扑来减轻这种负担,但通信成本仍然随着模型大小和设备数量的增加而增长。

随着设备数量的增加,可扩展性限制变得明显。虽然 8 个 GPU 可能实现7×7\times的速度提升(87.5%的扩展效率),但扩展到 64 个 GPU 通常只能提供 45-50×\times的速度提升(70-78%的效率),这是因为同步成本不断增加。扩展效率,即速度提升除以设备数量,衡量了额外硬件如何有效地转化为减少训练时间。完美的线性扩展将产生 100%的效率,但通信开销和同步障碍通常随着设备数量的增加而降低效率。这种非线性扩展意味着设备数量加倍很少能将训练时间减半,尤其是在超过 16-32 个设备的配置中。

内存限制对数据并行构成了硬性限制。考虑一个具有 1750 亿参数的 Transformer 模型,仅存储模型参数在 FP32 格式下就需要大约 350 GB。考虑到优化器状态和激活内存,总需求通常超过每个设备 1 TB。由于即使是高端 GPU 通常也只提供 80 GB 或更少,因此此类模型不能使用纯数据并行。

工作负载不平衡对异构系统影响显著。在一个混合 A100 和 V100 GPU 的集群中,A100s 可能处理批次的速度比 V100s 快1.7×1.7\times,迫使它们等待 V100s 赶上。这种空闲时间在没有适当的负载平衡机制的情况下,可能会降低集群利用率 20-30%。

最后,分布式训练系统中与容错和可靠性相关的关键挑战。在规模扩大时,节点故障变得不可避免:当有 100 个 GPU 持续运行时,每周会发生多次硬件故障,如第十六章中详细所述。一次花费数百万美元的训练运行不能每次单个 GPU 故障时都从头开始。现代分布式训练系统实现了复杂的检查点策略,每 N 次迭代存储一次模型状态以最小化丢失的计算。检查点频率会产生权衡:频繁的检查点减少了故障的潜在损失,但增加了存储 I/O 开销和训练延迟。生产系统通常每 100-1000 次迭代进行一次检查点,在容错和性能之间取得平衡。

实现复杂性加剧了这些可靠性挑战。虽然现代框架抽象了许多复杂性,但实现健壮的分布式训练系统需要显著的工程专业知识。当节点子集失败时实现优雅降级、在网络分区的情况下保持梯度同步,以及从瞬时故障中自动恢复,都需要对机器学习和分布式系统原理有深入的理解。

尽管存在这些挑战,数据并行性仍然是分布式训练的重要技术,有许多策略可以解决其局限性。监控这些分布式系统需要专门的工具来跟踪节点间的梯度范数、通信模式和硬件利用率——生产监控策略在第十三章中有介绍,而系统级故障处理和训练可靠性在第十六章中有所讨论。模型并行性为扩展训练提供了另一种策略,特别适合处理无法适应单个设备的极大型模型。

模型并行性

虽然数据并行性可以扩展数据集的处理,但某些模型本身超过了单个设备的内存容量。当模型的参数超过单个设备的内存限制时,模型并行性将神经网络分割到多个计算设备上。与数据并行性不同,其中每个设备都包含完整的模型副本,模型并行性将不同的模型组件分配到不同的设备上(Shazeer, Mirhoseini, Maziarz, Davis, 等人 2017)。

存在多种模型并行实现。基于层的划分中,设备按顺序处理不同的层组。例如,第一个设备可能计算层 1-4,而第二个设备处理层 5-8。基于通道的划分将每个层内的通道分布在设备之间,例如第一个设备处理 512 个通道,而第二个设备管理剩余的通道。对于 Transformer 架构,注意力头划分将不同的注意力头分配到不同的设备上。

这种分布方法使得可以训练大规模模型。拥有 1750 亿参数的 GPT-3 依赖模型并行进行训练。处理高分辨率 16k ×\times 16k 像素图像的视觉 Transformer 使用模型并行来管理内存限制。混合专家架构使用这种方法在其条件计算路径上跨硬件进行分布。

在训练过程中,设备协调遵循特定的模式。在正向传播中,数据按顺序通过不同设备上的模型段。反向传播通过这些段以相反的顺序传播梯度。在参数更新期间,每个设备仅修改其分配的模型部分。这种协调确保了与单个设备上训练的数学等价性,同时能够处理超过单个设备内存容量的模型。

模型并行实现

模型并行将神经网络分布在多个计算设备上,每个设备计算模型操作的特定部分。这种划分允许训练参数数量超过单个设备内存容量的模型。该技术包括设备协调、数据流管理和分布式模型段间的梯度计算。模型并行的机制在图 8.14 中展示。以下步骤将进行描述:

图 8.14:模型划分:将神经网络分布在多个设备上,使得可以训练比单个设备内存容量更大的模型。这种方法需要仔细协调设备间的数据流和梯度计算,以保持训练效率。

模型划分

模型并行第一步是将模型划分为更小的段。例如,在深度神经网络中,层通常分布在设备之间。在具有两个 GPU 的系统上,前半部分层可能位于 GPU 1 上,而后半部分层位于 GPU 2 上。另一种方法是分割单个层内的计算,例如在 Transformer 模型中将矩阵乘法分布在设备之间。

模型正向传播

在正向传播期间,数据按顺序通过分区流动。例如,GPU 1 上第一组层处理的数据被发送到 GPU 2,以便下一组层进行处理。这种顺序流动确保了整个模型被使用,即使它分布在多个设备上。高效的跨设备通信对于最小化此步骤中的延迟很重要(研究 2021)。

反向传播和计算

反向传播通过分布式模型段以相反的顺序计算梯度。每个设备计算其参数的局部梯度,并将必要的梯度信息传播到之前的设备。在 Transformer 模型中,这意味着在设备边界之间反向传播通过注意力计算和前馈网络。

例如,在一个具有注意力机制在设备之间分割的两个设备设置中,反向计算的工作方式如下:第二个设备计算最终前馈层和注意力头的梯度。然后,它将注意力输出的梯度张量发送到第一个设备。第一个设备使用这些接收到的梯度来计算其注意力参数和早期层权重的更新。

参数更新

参数更新在每个设备上独立发生,使用计算出的梯度和优化算法。持有注意力层参数的设备仅使用为这些特定参数计算出的梯度进行更新。这种局部更新方法与需要跨设备梯度平均的数据并行不同。

优化步骤如下:每个设备应用其选择的优化器(如 Adam 或 AdaFactor)来更新其模型参数的部分。持有前六个 Transformer 层的设备仅更新这些层的权重和偏差。这种局部参数更新消除了在优化步骤中跨设备同步的需求,从而减少了通信开销。

迭代过程

与其他训练策略一样,模型并行对每个数据批次重复这些步骤。随着数据集在多次迭代中处理,分布式模型趋向于最佳性能。

并行变体

模型并行可以通过不同的策略来实现,这些策略用于在设备之间划分模型。三种主要方法为层划分、操作级划分和管道并行,每种方法都适合不同的模型结构和计算需求。

层划分

层级划分将不同的模型层分配到独立的计算设备上。在转换器架构中,这意味着特定的设备管理定义好的注意力和前馈块集合。如图 8.15 所示,一个分布在四个设备上的 24 层转换器模型将六个连续的转换器块分配给每个设备。设备 1 处理块 1-6,设备 2 处理块 7-12,以此类推。

图片

图 8.15:分层模型并行:将转换器模型分布在多个 GPU 上,将连续的层分配给每个设备,从而实现输入数据的并行处理并加速训练。这种分区策略允许每个 GPU 操作模型的一部分层,减少每个设备的内存占用和计算负载。

这种顺序处理引入了设备空闲时间,因为每个设备必须等待前一个设备完成其计算后才能开始工作。例如,当设备 1 处理初始块时,设备 2、3 和 4 保持不活跃。同样,当设备 2 开始计算时,设备 1 处于空闲状态。这种等待和空闲时间的模式与其它并行化策略相比,降低了硬件利用率效率。

层级划分将不同的模型层分配到独立的计算设备上。在转换器架构中,这意味着特定的设备管理定义好的注意力和前馈块集合。一个分布在四个设备上的 24 层转换器模型将六个连续的转换器块分配给每个设备。设备 1 处理块 1-6,设备 2 处理块 7-12,以此类推。

管道并行

管道并行通过引入微批次扩展了层级的分区,以最小化设备空闲时间,如图 8.16 所示。图 8.16。不是等待整个批次顺序通过所有设备,而是将计算分成更小的段,称为微批次(D. Narayanan 等人 2019)。如图中行所示,每个设备同时处理其分配的不同微批次的模型层。例如,正向传播涉及设备将激活传递到下一阶段(例如,F0,0F_{0,0}F1,0F_{1,0})。反向传播将梯度通过管道反向传递(例如,B3,3B_{3,3}B2,3B_{2,3})。这种重叠计算减少了空闲时间,提高了吞吐量,同时在设备间保持操作逻辑的顺序。

图 8.16:管道并行:微批次将模型层分布在设备上,允许并发计算,在正向和反向传播过程中最小化空闲时间,以加速训练。正向传播期间,激活在设备之间顺序流动,而在反向传播期间,梯度反向传播,有效地创建了一个用于高效资源利用的管道。

在一个分布在四个设备上的变压器模型中,设备 1 将处理微批次N+1N+1的块 1-6,而设备 2 计算微批次NN的块 7-12。同时,设备 3 执行微批次N1N-1的块 13-18,设备 4 处理微批次N2N-2的块 19-24。每个设备维护其分配的变压器块,但操作不同的微批次,从而创建一个连续的计算流。

设备间隐藏状态转移是持续发生的,而不是在特定阶段发生。当设备 1 完成处理一个微批次后,它立即将形状为[microbatch_size, sequence_length, hidden_dimension]的输出张量传输到设备 2,并开始处理下一个微批次。这种重叠计算模式在保持模型数学属性的同时,保持了硬件的充分利用。

操作级并行性

操作级并行性将单个神经网络操作分散到设备上。在变压器模型中,这通常意味着拆分注意力计算。考虑一个具有 64 个注意力头和隐藏维度为 4096 的变压器。两个设备可能如下拆分此计算:设备 1 处理注意力头 1-32,为其分配的头计算查询、键和值。设备 2 同时处理头 33-64。每个设备处理[batch_size, sequence_length, 2048]维度的张量的注意力计算。

前馈网络中的矩阵乘法操作也受益于操作级拆分。一个输入维度为 4096,中间维度为 16384 的前馈层可以在中间维度上跨设备拆分。设备 1 计算前 8192 个中间特征,而设备 2 计算剩余的 8192 个特征。这种划分减少了峰值内存使用,同时保持了与原始计算的数学等价性。

摘要

每种分区方法都针对训练大型模型中的特定挑战,其适用性取决于模型架构和可用资源。通过选择合适的策略,实践者可以训练超出单个设备限制的模型,从而促进高级机器学习系统的发展。

模型并行性优势

模型并行性提供了几个显著的好处,使其成为训练超出单个设备容量的大规模模型的关键策略。这些优势源于其能够在多个设备之间分配工作负载的能力,从而使得训练更复杂和资源密集型的架构成为可能。

内存扩展是模型并行性的主要优势。当前的变压器架构包含多达数百亿个参数。一个包含 1750 亿个参数且以 32 位浮点精度存储的模型,仅存储其参数就需要 700 GB 的内存。在考虑训练过程中的激活、优化器状态和梯度时,内存需求会成倍增加。模型并行性通过将这些内存需求分配到设备上,使得训练此类架构成为可行。

另一个关键优势是高效利用设备内存和计算能力。由于每个设备只需要存储和处理模型的一部分,内存使用在系统内部分布。这使得从业者可以处理更大的批量大小或更复杂的层,而不会超过内存限制,这也可以提高训练的稳定性和收敛性。

模型并行性也为不同的模型架构提供了灵活性。无论是模型是顺序的,如许多自然语言处理任务中那样,还是由计算密集型操作组成,如基于注意力的模型或卷积网络,都存在一种适合该架构的分区策略。这种适应性使得模型并行性适用于广泛的任务和领域。

最后,模型并行性是其他分布式训练策略的自然补充,例如数据并行性和流水线并行性。通过结合这些方法,可以训练出既大又需要大量数据的模型。这种混合灵活性在高级研究和生产环境中特别有价值,在这些环境中,同时扩展模型和数据集对于实现最佳性能至关重要。

虽然模型并行性提供了这些好处,但其有效性取决于仔细的分区策略设计,以下章节将解决具体挑战,并讨论其使用中的权衡。

模型并行性局限性

虽然模型并行性为训练大规模模型提供了一种有效的方法,但它也引入了独特的挑战。这些挑战源于模型分区的复杂性以及训练期间分区之间的依赖关系。解决这些问题需要仔细的系统设计和优化。

模型并行性中的一个主要挑战是在设备之间平衡工作负载。模型的所有部分并不需要相同数量的计算。例如,在层状分区中,某些层可能比其他层执行的操作显著更多,导致工作分布不均。负责更重计算任务的设备可能成为瓶颈,而其他设备则未被充分利用。这种不平衡降低了整体效率并减慢了训练速度。确定最优分区策略对于确保所有设备均匀贡献至关重要。

另一个挑战是设备之间的数据依赖性。在正向传播过程中,形状为[batch_size, sequence_length, hidden_dimension]的激活张量必须在设备之间传输。对于一个典型的具有批次大小 32、序列长度 2048 和隐藏维度 2048 的 transformer 模型,每次传输大约移动 512 MB 的 float32 精度数据。在反向传播中的梯度传输,单个训练步骤可能需要几个 GB 的跨设备通信。在理论带宽为 64 GB/s 的 PCIe 互连系统中,这些传输引入了显著的延迟。

模型并行化也增加了实现和调试的复杂性。对模型进行分区、确保适当的数据流以及跨设备同步梯度需要详细的协调。任何这些步骤中的错误都可能导致梯度更新不正确,甚至模型发散。在分布式系统中,调试此类错误通常更困难,因为问题可能仅在特定条件或工作负载下出现。

另一个挑战是管道并行中的管道气泡。在具有 m 个管道阶段的系统中,随着管道的填充,前m1m-1个步骤的效率会降低。例如,在一个 8 设备管道中,第一个设备立即开始处理,但第八个设备在 7 个步骤中保持空闲。这个预热期大约减少了约(m1)/b(m-1)/b百分比的硬件利用率,其中bb是训练步骤中的批次数量。

最后,对于某些架构,如高度相互依赖的操作的模型,模型并行可能效果较差。在这种情况下,分割模型可能导致过度的通信开销,超过了并行计算的好处。对于此类模型,数据并行或混合方法等替代策略可能更合适。

尽管存在这些挑战,模型并行化仍然是训练大型模型不可或缺的工具。通过仔细优化和现代框架的使用,许多这些问题可以得到缓解,从而实现大规模高效的分布式训练。

混合并行化

认识到数据和模型约束可能同时发生,混合并行化在训练神经网络时结合了模型并行和数据并行(D. Narayanan 等人 2021b)。一个模型可能太大,无法存储在一个 GPU 上(需要模型并行),同时还需要高效地处理大量数据(需要数据并行)。

在包含 3000 亿个标记的数据集上训练一个 1750 亿参数的语言模型展示了混合并行在实际中的应用。神经网络层通过模型并行分布在多个 GPU 上,而数据并行使得不同的 GPU 组能够处理不同的批次。混合方法协调这两种并行化形式。

此策略解决了两个关键约束。首先,当模型参数超过单个设备内存容量时,会出现内存约束。其次,当数据集大小需要分布式处理时,计算需求增加。

混合并行实现

混合并行通过结合模型分区和数据集拆分的过程,确保了跨设备内存和计算的效率利用。这种集成使得大规模机器学习系统能够克服单个并行策略强加的约束。

模型和数据分区

混合并行将模型架构和训练数据分割到设备上。模型通过层或操作级别的分区来分割,其中 GPU 处理不同的神经网络段。同时,数据集拆分成子集,允许每个设备组在不同的批次上训练。一个转换器模型可能将其注意力层分布在四个 GPU 上,而每个 GPU 组处理一个独特的 1000 个示例批次。这种双重分区分配了内存需求和计算工作量。

正向传播

在正向传播过程中,输入数据流经分布式模型。每个设备使用其持有的数据子集处理分配给它的模型部分。例如,在一个包含四个设备的混合系统中,两个设备可能处理模型的不同的层(模型并行),同时处理不同的数据批次(数据并行)。设备之间的通信确保模型分区中间输出无缝传递到后续分区。

反向传播和梯度计算

在反向传播过程中,为每个设备上存储的模型分区计算梯度。处理相同模型子集但不同数据批次的并行数据设备汇总其梯度,确保更新反映了整个数据集的贡献。对于模型并行设备,梯度在本地计算并按反向顺序传递到下一层。例如,在两个设备的模型并行配置中,第一个设备计算第 1-3 层的梯度,然后将这些梯度传输到第二个设备以计算第 4-6 层。这种梯度同步和设备间通信的组合确保了分布式系统的一致性。

参数更新

在梯度同步之后,模型参数使用选定的优化算法进行更新。在数据并行工作模式下的设备会一致地更新它们共享的模型分区,而模型并行设备则对其局部段应用更新。在这一步骤中,高效的通信至关重要,以最小化延迟并确保更新能够正确地传播到所有设备。

迭代过程

混合并行遵循与其他训练策略类似的迭代过程。模型和数据分布的结合允许系统在多个训练周期内有效地处理大型数据集和复杂模型。通过平衡计算工作负载和内存需求,混合并行使得训练原本不可行的先进机器学习模型成为可能。

并行变化

混合并行可以在不同的配置中实现,这取决于模型架构、数据集特征和可用的硬件。这些变化允许针对特定的训练需求定制解决方案,以优化性能和可扩展性。

层次并行

层次混合并行首先将模型并行应用于跨设备划分模型,然后在数据集分布之上应用层数据并行。例如,在一个包含八个设备的系统中,四个设备可能持有模型的不同分区,而每个分区在其他四个设备上复制以进行数据并行处理。这种方法非常适合具有数十亿参数的大型模型,其中内存限制是一个主要关注点。

层次混合并行确保模型大小在设备之间分布,减少内存需求,而数据并行确保多个数据样本可以同时处理,提高吞吐量。这种双层方法对于像变压器这样的模型尤其有效,因为每一层可能都有一个显著的内存占用。

层内并行

层内混合并行将模型并行和数据并行结合到模型的各个层中。例如,在变压器架构中,注意力机制可以跨多个设备分割(模型并行),而每个设备处理不同的数据批次(数据并行)。这种细粒度集成允许系统在单个操作级别优化资源使用,从而能够训练具有极其大量中间计算的模型。

这种变化在特定层,如注意力或前馈层,具有计算密集型操作且难以仅使用模型或数据并行有效分配的场景中特别有用。层内混合并行通过同时应用这两种策略来解决这一挑战。

层间并行

层间混合并行主义专注于在特定模型层级别之间分配模型并行和数据并行的工作负载。例如,神经网络的前几层可能使用模型并行进行分布,而后续层则使用数据并行。这种方法与观察到的某些模型层可能更内存密集,而其他层则从增加的数据吞吐量中受益的观察结果相一致。

这种配置允许动态分配资源,适应模型中不同层的特定需求。通过将并行策略定制到每一层的独特特征,层间混合并行主义在内存使用和计算效率之间实现了最佳平衡。

混合并行主义优势

在机器学习系统中采用混合并行主义解决了由模型和数据集规模不断增长所提出的某些最重大的挑战。通过结合模型并行和数据并行的优势,这种方法为现代机器学习工作负载的扩展提供了解决方案。

混合并行主义最突出的好处之一是它能够在模型和数据集之间无缝扩展。现代神经网络,特别是在自然语言处理和视觉应用中使用的变压器,通常包含数十亿个参数。这些模型与庞大的数据集相结合,使得在单个设备上进行训练变得不切实际,甚至不可能。混合并行主义使得模型可以在多个设备之间划分,以管理内存限制,同时将数据集分布到处理大量数据的设备上,从而有效地进行数据分发。这种双重能力确保了训练系统可以无妥协地处理最大模型和数据集的计算和内存需求。

另一个关键优势在于硬件利用率。在许多分布式训练系统中,当设备在计算或同步的不同阶段处于空闲状态时,可能会出现效率低下的问题。混合并行主义通过确保所有设备都处于活跃状态来缓解这个问题。无论设备是在通过其模型部分进行前向计算还是处理数据批次,混合策略都最大化了资源使用,从而缩短了训练时间并提高了吞吐量。

灵活性是混合并行主义的另一个显著特点。机器学习模型在架构和计算需求上差异很大。例如,卷积神经网络优先处理空间数据处理,而变压器在注意力机制中需要执行如矩阵乘法等密集操作。混合并行主义通过允许实践者有选择地应用模型并行和数据并行来适应这些多样化的需求。这种适应性确保了混合方法可以根据特定模型的特定要求进行定制,使其成为多样化训练场景的多功能解决方案。

混合并行计算可以减少通信瓶颈,这是分布式系统中常见的问题。通过在分布式模型计算和数据处理之间取得平衡,混合策略最小化了训练过程中所需的设备间通信量。这种高效的协调不仅加快了训练过程,还使得在可能限制性能的网络延迟情况下,能够有效地使用大规模分布式系统。

最后,混合并行计算支持现代人工智能研究开发的雄心壮志规模。它提供了一个框架,用于利用高级硬件基础设施,包括 GPU 或 TPU 集群,来训练推动可能性的边界模型。没有混合并行计算,由于资源限制,许多人工智能的突破,包括大型语言模型和高级视觉系统,将无法实现。

通过实现可扩展性、最大化硬件效率和提供灵活性,混合并行计算已成为训练最复杂机器学习系统的基本策略。它不仅是解决当前挑战的解决方案,也是人工智能未来的基础,其中模型和数据集将继续在复杂性和规模上增长。

混合并行计算局限性

虽然混合并行计算为机器学习训练提供了强大的框架,但它也引入了需要仔细考虑的复杂性。这些挑战源于有效集成模型和数据并行所需的复杂协调。理解这些障碍对于设计高效的混合系统并避免潜在的瓶颈至关重要。

混合并行计算的主要挑战之一是通信开销。模型并行和数据并行都涉及大量的设备间通信。在模型并行中,设备必须交换中间输出和梯度以保持计算的顺序流程。在数据并行中,计算在不同数据子集上的梯度必须在设备间同步。混合并行计算同时要求这两个过程都进行高效的通信。如果管理不当,产生的开销可能会抵消并行化的好处,尤其是在具有较慢互连或高网络延迟的大规模系统中。

另一个关键挑战是实现的复杂性。混合并行需要深入理解模型并行和数据并行技术,以及底层硬件和软件基础设施。设计有效的混合策略涉及决定如何分区模型、如何分配数据以及如何在设备间同步计算。这个过程通常需要大量的实验和优化,特别是对于定制架构或非标准硬件配置。虽然现代框架如 PyTorch 和 TensorFlow 提供了分布式训练的工具,但在规模上实现混合并行仍然需要显著的工程专业知识。

工作负载均衡在混合并行中也提出了挑战。在一个分布式系统中,并非所有设备都拥有相同的计算能力。一些设备可能比其他设备更快地处理数据或计算梯度,导致效率低下,因为较快的设备需要等待较慢的设备完成其任务。此外,某些模型层或操作可能比其他操作需要更多的资源,从而在计算负载上造成不平衡。管理这种差异需要仔细调整分区策略和采用动态工作负载分配技术。

即使在混合配置中,内存限制仍然是一个问题。虽然模型并行解决了将大型模型放入设备内存的问题,但数据并行(如存储多个数据批次和梯度缓冲区)的额外内存需求仍然可能超过可用容量。这对于具有极端大型中间计算(如具有高维注意力机制的变压器)的模型尤其如此。在设备间平衡内存使用对于防止训练过程中资源耗尽至关重要。

最后,混合并行还带来了与容错和调试相关的问题。分布式系统天生更容易受到硬件故障和同步错误的影响。在混合配置中调试问题可能比在独立模型或数据并行系统中要复杂得多,因为错误可能源于两种方法之间的交互。确保强大的容错机制和设计用于监控和调试分布式系统的工具对于保持可靠性至关重要。

尽管存在这些挑战,混合并行仍然是训练大规模机器学习模型不可或缺的策略。通过优化通信协议、智能分区策略和强大的容错系统来克服这些障碍,从业者可以充分发挥混合并行的潜力,并推动人工智能研究和应用的创新。

并行策略比较

数据并行、模型并行、流水线并行和混合并行的特点总结在表 8.7 中。此比较突出了它们各自的焦点、内存需求、通信开销、可扩展性、实现复杂性和理想用例。通过分析这些因素,从业者可以确定最适合其训练需求的方法。

表 8.7:并行训练策略:数据、模型、流水线和混合并行策略通过在设备间分配工作负载来解决机器学习训练扩展性的挑战,它们在如何划分数据和模型参数以优化内存使用、通信和可扩展性方面有所不同。理解这些权衡有助于从业者选择最适合其特定模型和基础设施的最有效方法。

方面 数据并行 模型并行 流水线并行 混合并行
焦点 在设备间分配数据集,每个设备拥有完整的模型副本 在设备间分配模型,每个设备处理模型的一部分 在流水线中分配模型阶段,同时处理微批处理 结合多种并行策略以实现平衡的可扩展性
每设备的内存需求 高(每个设备上都有整个模型) 低(模型在设备间分割) 低到中等(阶段在设备间分割) 中等(在设备间分割模型和数据集)
通信开销 中等到高(设备间的梯度同步) 高(中间激活和梯度的通信) 中等(阶段间的激活传递) 非常高(需要模型和数据的同步)
可扩展性 适用于大型数据集,模型大小适中 适用于非常大的模型,数据集较小 适用于具有许多层的深度模型 适用于极其大型模型和数据集
实现复杂度 低到中等(使用现有工具相对简单) 中等到高(需要仔细划分和协调) 中等到高(需要流水线调度和微批处理管理) 高(多个并行策略的复杂集成)
理想用例 大型数据集,模型适合单个设备 超大模型,超出单个设备的内存限制 具有顺序阶段的深度模型,可以容忍微批处理延迟 在大规模系统中训练大量模型和大数据集

图 8.17 提供了在分布式训练系统中选择并行策略的一般指南。虽然该图表基于模型大小、数据集大小和扩展约束提供了一个结构化的决策过程,但它是有意简化的。现实场景通常涉及额外的复杂性,如硬件异构性、通信带宽和工作负载不平衡,这些都可能影响并行技术选择。该图表最好被视为理解并行策略选择中的权衡和决策点的基石工具。从业者应将此指南视为起点,并根据其系统的具体需求和约束进行调整,以实现最佳性能。

图片

图 8.17:并行策略选择:分布式训练系统根据模型大小、数据集大小和扩展约束使用数据、模型或混合并行来加速训练和高效利用资源。此流程图指导从业者通过决策过程,认识到现实世界的部署通常需要根据硬件异构性和工作负载不平衡等因素进行调整。

框架集成

虽然分布式训练的理论基础确立了跨多个设备的扩展的数学原理,但现代框架提供了抽象,使这些概念对从业者可访问。理解框架如 PyTorch 如何将分布式训练理论转化为实际 API,弥合了数学概念和实现之间的差距。

数据并行框架 API

我们之前探索的数据并行机制——梯度平均、AllReduce 通信和参数同步——通过框架 API 进行抽象,这些 API 自动处理复杂的协调。PyTorch 提供了两种主要方法,展示了简单性和性能之间的不同权衡。

torch.nn.DataParallel 代表了一种更简单的方法,自动在单个节点内可用的 GPU 上复制模型。此 API 抽象了梯度收集和平均过程,需要最小化对现有单 GPU 训练脚本的代码更改。然而,这种简单性伴随着性能限制,因为实现使用参数服务器方法,当扩展到 4-8 个 GPU 以上时可能会创建通信瓶颈。

# Simple data parallelism - framework handles gradient synchronization
model = torch.nn.DataParallel(model)
# Training loop remains unchanged - framework automatically:
# 1\. Splits batch across GPUs
# 2\. Replicates model on each device
# 3\. Gathers gradients and averages them
# 4\. Broadcasts updated parameters

对于生产规模的训练,torch.distributed提供了之前讨论过的有效 AllReduce 通信模式的性能替代方案。此 API 需要显式初始化进程组和分布式协调,但能够实现对于大规模训练至关重要的线性扩展特性。

# Production distributed training - explicit control over communication
import torch.distributed as dist

dist.init_process_group(backend="nccl")  # NCCL for GPU communication
model = torch.nn.parallel.DistributedDataParallel(model)
# Framework now uses optimized AllReduce instead of parameter server

关键的洞察是DistributedDataParallel自动实现了高效的环状 AllReduce 算法,将我们讨论的 O(n)通信复杂度转化为实际代码,在规模上实现了 90%以上的并行效率。框架处理设备放置、梯度桶化以实现高效的通信,以及计算与通信的重叠。

模型并行框架支持

模型并行需要更明确的协调,因为框架必须管理跨设备的张量放置和数据流。PyTorch 通过手动设备放置和新兴的torch.distributed.pipeline API 来解决这一问题。

# Manual model parallelism - explicit device placement
class ModelParallelNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.layers_gpu0 = nn.Sequential(...).to("cuda:0")
        self.layers_gpu1 = nn.Sequential(...).to("cuda:1")

    def forward(self, x):
        x = self.layers_gpu0(x.to("cuda:0"))
        x = self.layers_gpu1(
            x.to("cuda:1")
        )  # Cross-GPU data transfer
        return x

这种手动方法揭示了模型并行中固有的顺序依赖和通信开销,需要仔细管理设备间的张量移动。框架自动处理设备边界之间的反向传播梯度流,但实践者必须考虑频繁设备转移的性能影响。

通信原语

现代框架通过高级 API 暴露了支持分布式训练的通信操作。这些原语抽象了低级的 NCCL 操作,同时保持性能:

# Framework-provided collective operations
dist.all_reduce(tensor)  # Gradient averaging across all devices
dist.broadcast(tensor, src=0)  # Parameter broadcasting from master
dist.all_gather(
    tensor_list, tensor
)  # Collecting tensors from all devices

这些 API 直接转换为之前讨论的 NCCL 集体操作,实现了高效的通信模式,展示了框架如何提供易于访问的接口来复杂分布式系统概念,同时保持生产训练所必需的性能特征。

框架抽象使实践者能够专注于模型架构和训练动态,同时利用复杂的分布式系统优化。这种关注点的分离——数学基础由框架处理,模型设计由实践者控制——展示了现代机器学习系统如何在易用性和性能之间取得平衡。

性能优化

建立在我们对管道优化和分布式训练方法的理解之上,高效训练机器学习模型依赖于识别和解决限制性能和可扩展性的因素。本节探讨了各种优化技术,旨在提高训练系统的效率。通过针对特定瓶颈、优化软硬件交互以及采用可扩展的训练策略,这些方法帮助实践者构建有效利用资源同时最小化训练时间的系统。

瓶颈分析

有效优化训练系统需要一种系统性的方法来识别和解决性能瓶颈。瓶颈可能出现在多个层面,包括计算、内存和数据处理,它们直接影响训练过程的效率和可扩展性。

计算瓶颈可能会显著影响训练效率。一个常见瓶颈发生在计算资源,如 GPU 或 TPU,利用率低时。这可能是由于工作负载不平衡或不高效的并行化策略造成的。例如,如果一个设备比其他设备更快地完成其分配的计算,它将保持空闲状态,等待较慢的设备赶上。这种低效降低了整体训练吞吐量。

在处理大型模型时,与内存相关的瓶颈尤其具有挑战性。内存不足可能导致数据在设备内存和较慢的存储之间频繁交换,从而显著减慢训练过程。在某些情况下,存储正向和反向传递中中间激活所需的内存可能超过可用容量,迫使系统采用梯度检查点等技术,这些技术以牺牲计算效率来节省内存。

数据处理瓶颈可能会严重限制计算资源的利用率。训练系统通常依赖于连续的数据供应来保持计算资源充分利用。如果数据加载和预处理没有得到优化,计算设备可能会空闲等待新批次数据到达。当在存储在网络文件系统或远程存储解决方案上的大型数据集上训练时,这个问题尤为普遍。如图 8.18 图所示,分析跟踪可以揭示由于数据加载缓慢导致的 GPU 利用率低的情况,突出了高效输入管道的重要性。

图片

图 8.18:GPU 利用率低:分析显示,数据加载成为瓶颈,阻碍了训练过程中的 GPU 充分利用,并增加了整体训练时间。GPU 活动中的间隙表明设备经常等待输入数据,这表明优化数据管道对于最大化计算吞吐量是必要的。

识别这些瓶颈通常涉及使用分析工具来分析训练系统的性能。集成到机器学习框架中的工具,如 PyTorch 的torch.profiler或 TensorFlow 的tf.data分析工具,可以提供有关训练期间时间和资源消耗的详细信息。通过确定导致延迟的具体阶段或操作,从业者可以设计有针对性的优化来有效解决这些问题。

系统级技术

在识别训练系统中的瓶颈后,下一步是在系统级别实施优化。这些优化针对底层硬件、数据流和资源分配,以提高整体性能和可扩展性。

一种基本技术是分析训练工作负载 35。分析涉及收集关于系统在训练期间性能的详细指标,例如计算时间、内存使用和通信开销。这些指标有助于揭示低效之处,例如资源使用不平衡或训练管道特定阶段的过度时间消耗。NVIDIA Nsight Systems 或 TensorFlow Profiler 等分析工具可以提供可操作的见解,使开发者能够对他们的训练配置做出明智的调整。

利用特定硬件的功能是系统级优化的另一个关键方面。现代加速器,如 GPU 和 TPU,包括可以显著提高性能的专用功能。例如,混合精度训练,使用 FP16 或 bfloat16 等低精度浮点格式进行计算,可以显著减少内存使用并提高吞吐量,而不会牺牲模型精度。同样,NVIDIA GPU 中的张量核心旨在加速矩阵运算,这是深度学习中常见的计算工作负载,使它们非常适合优化正向和反向传播。

数据管道优化也是系统级的一个重要考虑因素。确保数据被高效地加载、预处理并交付给训练设备,可以消除由缓慢的数据传输引起的潜在瓶颈。例如,缓存常用数据、预取批次以重叠计算和数据加载,以及使用 TFRecord 或 RecordIO 等高效数据存储格式等技术,可以帮助保持数据流向计算设备的一致性。

软件级技术

除了系统级调整之外,软件级优化还关注提高训练算法及其在机器学习框架中的实现效率。

一种有效的软件级优化是使用融合内核。在传统实现中,矩阵乘法、激活函数和梯度计算等操作通常作为单独的步骤执行。融合内核将这些操作组合成一个单一的优化例程,减少了启动多个操作相关的开销,并提高了缓存利用率。许多框架,如 PyTorch 和 TensorFlow,会自动在可能的情况下应用内核融合,但开发者可以通过显式使用 cuBLAS 或 cuDNN 等库进一步优化自定义操作。

动态图执行是软件级别优化的另一种有用技术。在支持动态计算图框架中,如 PyTorch,操作图在每个训练迭代中实时构建。这种灵活性允许根据特定迭代的特定输入和输出进行细粒度优化。动态图还使得更有效地处理可变长度序列成为可能,例如在自然语言处理任务中遇到的情况。

梯度累积是一种可以在软件级别实施的额外策略,用于解决内存限制问题。不是在每次批量更新后更新模型参数,梯度累积允许系统在多个较小的批量上计算梯度,并在聚合后更新参数。这种方法有效地增加了批量大小,而不需要额外的内存,使得可以在更大的数据集或模型上进行训练。

扩展策略

扩展技术旨在通过优化训练配置和资源分配来扩展训练系统的能力,以处理更大的数据集和模型。

批量大小扩展是一种常见的扩展技术。增加批量大小可以减少训练过程中所需的同步步骤数量,因为处理相同数量的数据需要的更新较少。这种方法与推理服务中使用的动态批量策略形成对比,后者旨在优化可变长度请求的吞吐量,而不是训练收敛。然而,较大的批量大小可能会引入挑战,如收敛速度变慢或泛化能力降低。学习率缩放和预热计划等技术可以帮助缓解这些问题,确保即使在大批量情况下也能进行稳定有效的训练。

层冻结策略为高效扩展训练系统提供了另一种方法。在许多场景中,尤其是在迁移学习中,模型的底层捕获了通用特征,不需要频繁更新。通过冻结这些层,只允许上层进行训练,可以节省内存和计算资源,使系统能够集中精力微调模型的最关键部分。

虽然分布式训练技术提供了一个扩展维度,但分布式系统内单个设备的计算效率决定了整体性能。我们探索的优化技术和并行化策略只有在执行于旨在最大化机器学习工作负载吞吐量的硬件架构上时才能发挥其全部潜力。这促使我们研究专门化的硬件平台,这些平台可以加速所有训练场景背后的数学运算。

硬件加速

我们所讨论的优化技术是在底层硬件架构的限制下进行的。专用机器学习硬件的发展代表了应对现代训练系统计算需求的重要进展。每种硬件架构,如 GPU、TPU、FPGA 和 ASIC,都体现了独特的设计哲学和工程权衡,以优化训练过程的特定方面。这些专用处理器显著改变了机器学习系统的可扩展性和效率约束,使得模型复杂度和训练速度的进步成为可能。这种硬件演变建立在第二章中建立的 ML 系统设计原则的基础之上。我们简要考察了每种硬件类型的架构原则、性能特征和实际应用,突出了它们在塑造机器学习训练系统未来能力方面的重要作用。

GPU

机器学习训练系统需要巨大的计算能力来处理大量数据集,执行梯度计算和高效更新模型参数。GPU 已成为满足这些需求的关键技术(图 8.19),这主要归功于其高度并行的架构和执行神经网络训练中至关重要的密集线性代数运算的能力(Dally, Keckler, 和 Kirk 2021)。

图片

图 8.19:GPU 加速趋势:连续的 GPU 代际带来了 FLOPS 的指数级增长,使得训练越来越大型和复杂的机器学习模型成为可能,并在自然语言处理等领域推动了突破。从 pascal 到 blackwell 的这些进步展示了专用硬件在克服现代人工智能计算需求中的关键作用。

从训练管道架构的角度来看,GPU 解决了几个关键瓶颈。GPU 中大量核心的存在允许同时处理数千个矩阵乘法,从而加速训练的前向和反向传递。在数据吞吐量限制 GPU 利用率的系统中,预取和缓存机制有助于保持数据流的稳定。这些优化,在训练管道设计中已讨论过,对于释放 GPU 的全部潜力至关重要(David A. Patterson 和 Hennessy 2021b)。

在分布式训练系统中,GPU 使得可扩展策略如数据并行和模型并行成为可能。NVIDIA 的生态系统,包括NCCL37 等用于多 GPU 通信的工具,促进了高效的参数同步,这是大规模设置中常见的挑战。例如,在训练像 GPT-338 这样的大型模型时,GPU 与分布式框架协同使用,将计算分布在数千个设备上,同时解决内存和计算扩展问题(T. Brown 等人 2020)。

硬件特定的特性进一步提升了 GPU 的性能。例如,NVIDIA 的 tensor cores39 针对混合精度训练进行了优化,这减少了内存使用量,同时保持了数值稳定性(Micikevicius 等人 2017)。这直接解决了训练大规模模型时常见的内存限制瓶颈。结合软件层面的优化,如融合内核,GPU 在单设备和多设备配置中都能提供显著的加速。

一个体现 GPU 在机器学习训练中作用的案例研究是 OpenAI 使用 NVIDIA 硬件进行大型语言模型的训练。训练拥有 1750 亿参数的 GPT-3 需要数千个 V100 GPU 的分布式处理。GPU 优化框架、高级通信协议和硬件特性的结合使得 OpenAI 能够高效地实现这一雄心勃勃的规模(T. Brown 等人 2020)。这种大规模训练的隐私和安全影响,包括数据治理和模型安全,在第十五章中综合讨论。

尽管 GPU 具有优势,但它们并非没有挑战。有效利用 GPU 需要仔细关注工作负载平衡和设备间通信。训练系统还必须考虑成本影响,因为 GPU 资源密集,需要优化的数据中心才能大规模运行。然而,随着NVLinkCUDA-X 库40 等创新的出现,这些挑战正在不断得到解决。

由于其多功能性、可扩展性和与高级软件框架的集成,GPU 对于现代机器学习训练系统来说是不可或缺的。这里讨论的架构原则不仅限于训练,还影响了推理部署策略,如第十一章中详细所述,其中类似的并行化概念适用于生产环境。通过解决计算、内存和分布中的关键瓶颈,GPU 在实现大规模训练管道中发挥着基础性作用。

GPT-2 GPU 硬件比较

硬件选择对 GPT-2 的训练经济性和时间表有重大影响。此比较显示了实际的性能差异。

训练吞吐量(样本/秒)

GPU 代数 FP32 FP16(混合精度) 内存 每小时成本
V100 (2017) 90 220 32GB $3.06
A100 (2020) 180 450 80GB $4.10
H100 (2022) 320 820 80GB $8.00

达到 50K 步的训练时间(8 个 GPU)

  • V100: 14 天,费用:约$10,252

  • A100: 7 天,费用:约$6,877

  • H100: 3.5 天,费用:约$6,720

注意:云服务器的定价差异很大,并且经常因供应商而异。

关键硬件驱动的权衡

  1. 内存容量允许更大的批量:V100 的 32GB 限制了 batch_size=16,而 A100 的 80GB 允许 batch_size=32 → 更快的收敛

  2. Tensor Core 代数:H100 的第四代 Tensor Core 在 FP16 操作上比 V100 快 3.7 倍

  3. NVLink 带宽:H100 的 900 GB/s(与 V100 的 300 GB/s 相比)将梯度同步时间减少了 65%

为什么 H100 尽管每小时费用更高仍能获胜

  • 由于 4 倍快的训练,总成本更低

  • 更快地为其他工作负载释放 GPU

  • 减少能耗(3.5 天与 14 天运行时间相比)

硬件选择启发式方法: 对于像 GPT-2 这样的模型,其训练需要数天/数周,通常具有更高吞吐量的新 GPU 尽管每小时费用更高,但通常提供更好的总拥有成本。对于快速实验(<1 小时),较旧的 GPU 可能更经济。

TPUs

张量处理单元(TPUs)和其他定制加速器旨在解决大规模机器学习训练的独特挑战。与通用性强、适用于广泛应用的 GPU 不同,TPUs 专门针对深度学习中发现的计算模式进行优化,如矩阵乘法和卷积操作(Norman P. Jouppi 等人 2017b)。这些设备通过提供高吞吐量、专门的内存处理和与机器学习框架的紧密集成来缓解训练瓶颈。

如图 8.20 所示,TPUs 经历了重大的架构演变,每一代都引入了针对日益增长的 AI 工作负载的优化。第一代 TPU 于 2015 年推出,旨在用于内部推理加速。随后的迭代专注于大规模分布式训练、内存优化和效率提升,最终在最新的 Trillium 架构中达到顶峰。这些进步展示了特定领域加速器如何继续推动 AI 性能和效率的边界。

图 8.20:TPU 发展历程:连续几代张量处理单元展示了针对深度学习工作负载的架构进步,从推理加速过渡到大规模分布式训练,最终 culminating in the trillium architecture。这些专用加速器通过增强内存处理、提高吞吐量和与机器学习框架紧密集成,满足了现代 AI 的计算需求。

通过专门设计的 AI 加速器,如 TPUs,机器学习框架可以在训练效率上实现显著提升。然而,要最大化这些好处,需要仔细关注硬件感知优化,包括内存布局、数据流编排和计算效率。

Google 开发了 TPUs,其主要目标是:在降低与传统硬件相关的能源和基础设施成本的同时,大规模加速机器学习工作负载。其架构针对从批处理中受益的任务进行了优化,因此在将大量数据集分割到多个设备上的分布式训练系统中特别有效。TPU 的一个关键特性是其收缩阵列架构 41,通过将数据流通过处理元素网络进行高效矩阵乘法。这种设计最小化了数据移动开销,降低了延迟和能耗——这对于训练大规模模型(如变压器)至关重要(Norman P. Jouppi 等人 2017b)。

从训练流程优化的角度来看,TPUs 简化了与 TensorFlow 生态系统中数据管道的集成。TPU 运行时和 TensorFlow 的 tf.data API 等功能使得数据预处理、缓存和批处理无缝,从而有效地为加速器提供数据(Martín Abadi 等人 2016)。TPUs 设计为在 pod 中工作——相互连接的 TPU 设备集群,允许实现大规模并行性。在这种配置中,TPU pod 通过结合设备间的数据并行性和设备内的模型并行性,实现了混合并行策略,同时解决内存和计算限制。

TPUs 在训练大规模模型(如 BERT 和 T5)方面发挥了关键作用。例如,Google 使用 TPUs 训练 BERT 的做法展示了它们处理大型变压器模型的内存密集型需求以及分布式设置中的同步挑战的能力(Devlin 等人 2018a)。通过将模型分割到 TPU 内核并优化通信模式,Google 实现了优异的结果,同时与传统硬件相比显著减少了训练时间。

除了 TPUs 之外,如AWS TrainiumIntel Gaudi这样的定制加速器芯片也在机器学习生态系统中获得了关注。这些设备旨在通过提供类似性能优势的同时满足多样化的云和本地环境需求,与 TPUs 竞争。例如,AWS Trainium 提供了与 AWS 生态系统的深度集成,使用户能够通过Amazon SageMaker等服务无缝扩展其训练管道。

虽然 TPUs 和定制加速器在吞吐量和能效方面表现出色,但它们的专用性质引入了限制。在考虑边缘部署场景时,专用硬件性能与部署灵活性之间的权衡变得尤为重要,正如在第十四章第十四章中探讨的那样。例如,TPUs 与谷歌的生态系统紧密耦合,使得它们对使用替代框架的从业者来说不太容易获得。同样,TPU 集群所需的高前期投资可能会阻碍小型组织或预算有限的组织。尽管存在这些挑战,但定制加速器提供的性能提升使它们成为大规模训练任务的有力选择。

TPUs 和定制加速器解决了机器学习训练系统中许多关键挑战,从处理大规模数据集到优化分布式训练。它们独特的架构和与特定生态系统的深度集成,使它们成为寻求扩展其训练工作流程的组织的有力工具。随着机器学习模型和数据集的不断增长,这些加速器很可能在塑造 AI 训练的未来中扮演越来越核心的角色。

现场可编程门阵列(FPGAs)

场可编程门阵列(FPGAs)是灵活的硬件解决方案,允许开发者针对特定的机器学习工作负载定制其架构。与设计有固定架构的 GPU 或 TPU 不同,FPGAs 可以动态重新配置,提供独特级别的灵活性。这种适应性使它们对于需要定制优化、低延迟处理或尝试新算法的应用程序特别有价值。

如图 8.21 所示,微软已经探索了一段时间使用 FPGA,一个突出的例子是Project Brainwave。这个项目利用 FPGA 加速 Azure 云中的机器学习工作负载。微软选择 FPGA 是因为它们能够在保持高吞吐量的同时提供低延迟推理(而非训练)。这种方法对于实时预测至关重要的场景有利,如搜索引擎查询或语言翻译服务。通过将 FPGA 直接集成到数据中心网络中 42,微软实现了显著的性能提升,同时最小化了能耗。

图片

图 8.21:FPGA 推理演进:微软逐步开发了现场可编程门阵列(FPGA)以加速云服务中的机器学习推理,从最初的 Catapult 项目设计转向更高级的迭代,最终到 Brainwave 项目。这些可重构硬件解决方案提供了低延迟处理和高吞吐量,对于实时应用如搜索和语言翻译特别有价值。

从训练的角度来看,FPGA 在优化训练管道方面提供了独特的优势。它们的可重构性允许它们实现针对特定模型要求定制的自定义数据流架构。虽然这种以训练为导向的定制与更常见的以推理为导向的 FPGA 应用不同,但两种方法都使用了区分 FPGA 与固定功能加速器的灵活性。例如,数据预处理和增强步骤,这些步骤在基于 GPU 的系统中往往成为瓶颈,可以卸载到 FPGA 上,从而释放 GPU 用于核心训练任务。FPGA 可以被编程执行诸如稀疏矩阵乘法等操作,这在推荐系统和基于图的模型中很常见,但在传统加速器上效率较低(Putnam 等人 2014)。

在分布式训练系统中,FPGA 提供了对通信模式的精细控制。这种控制允许开发者优化设备间通信和内存访问,解决诸如参数同步开销等挑战。例如,FPGA 可以被配置为实施定制的 all-reduce 算法以实现梯度聚合,与通用硬件相比,这可以降低延迟。

尽管 FPGA 具有优势,但也存在挑战。编程 FPGA 需要掌握硬件描述语言(HDLs)如 Verilog 或 VHDL 的专长,这对许多机器学习从业者来说可能是一个障碍。为了解决这个问题,像Xilinx 的 Vitis AI英特尔的开源 VINO这样的框架通过提供针对 AI 工作负载定制的工具和库,简化了 FPGA 编程。然而,与 GPU 和 TPU 等成熟的生态系统相比,学习曲线仍然很陡峭。

微软对 FPGA 的使用突出了它们无缝集成到现有机器学习工作流程中的潜力。这种方法展示了 FPGA 的通用性,与它们在推理优化中更为常见的应用相比,在训练加速中扮演着不同但互补的角色,尤其是在边缘部署中。通过将 FPGA 整合到 Azure 中,微软展示了这些设备如何补充其他加速器,优化训练和推理的端到端管道。这种混合方法利用 FPGA 在特定任务中的优势,同时依赖 GPU 或 CPU 处理其他任务,创建了一个平衡且高效的系统。

FPGAs 为需要定制、低延迟或新颖优化的机器学习训练系统提供了一个有吸引力的解决方案。虽然它们的采用可能受到编程复杂性的限制,但工具和现实世界的实施,如微软的 Project Brainwave 项目,表明它们在 AI 硬件生态系统中的相关性正在增长。

ASICs

应用特定集成电路(ASICs)代表一类为特定任务设计的硬件,通过摒弃通用灵活性,如 GPU 或 FPGA,提供了无与伦比的效率和性能。在机器学习训练中,最创新的 ASIC 示例之一是Cerebras 晶圆级引擎(WSE),如图 8.22 所示,它因其独特的解决训练大规模机器学习模型的计算和内存挑战的方法而独树一帜。

图片

图 8.22:晶圆级集成:这块 300mm 的硅晶圆包含 260 亿个晶体管,使单个芯片能够容纳整个 AI 训练系统,并克服分布式训练设置中常见的内存带宽限制。通过将庞大的计算资源集成到单个晶圆上,WSE 显著减少了数据传输瓶颈,并加速了大规模机器学习应用模型训练。

Cerebras WSE 与传统芯片不同,它是一个单片级处理器,覆盖整个硅晶圆而不是切割成更小的芯片。这种架构使得 Cerebras 能够在单个设备上集成 260 亿个晶体管和 85 万个核心 43。这些核心通过高带宽、低延迟的互连连接,允许数据在芯片内部移动,而不受离散 GPU 或 TPU 之间外部通信瓶颈的影响(Feldman 等人 2020)。

从机器学习训练的角度来看,WSE 解决了几个关键瓶颈:

  1. 数据移动:在传统的分布式系统中,大量时间用于在设备之间传输数据。WSE 通过将所有计算和内存保持在单个晶圆上,消除了这一点,大大减少了通信开销。

  2. 内存带宽:WSE 集成了 40 GB 的高速片上内存,直接位于其处理核心附近。这种邻近性使得数据访问几乎瞬间完成,克服了 GPU 在访问片外内存时经常遇到的延迟挑战。

  3. 可扩展性:虽然传统的分布式系统依赖于复杂的软件框架来管理多个设备,但 WSE 通过将所有资源整合到一个巨大的芯片上,简化了可扩展性。这种设计特别适合于训练大型语言模型和其他需要大量并行的深度学习架构。

Cerebras 公司的影响力的一个关键例子是其自然语言处理领域的应用。使用 WSE 的组织已经展示了在训练 Transformer 模型方面的显著加速,这些模型因其依赖注意力机制而计算密集。这种强大训练能力的负责任部署,包括对能耗、可访问性和社会影响的考虑,在第十七章中进行了探讨。通过利用芯片的巨大并行性和内存带宽,与基于 GPU 的系统相比,BERT 等模型的训练时间已经显著减少(T. Brown 等人 2020)。

然而,Cerebras WSE 也存在局限性。其单片设计针对特定用例进行了优化,例如深度学习中的密集矩阵计算,但可能不如 GPU 或 FPGA 等多用途硬件灵活。获取和整合此类专用设备的成本可能对小型组织或具有多样化工作负载的组织构成障碍。

Cerebras 针对最大规模模型的策略与之前讨论的趋势相一致,例如对扩展技术和混合并行策略的日益重视。WSE 的独特设计解决了内存瓶颈和设备间通信开销等问题,使其成为下一代 AI 工作负载的先驱性解决方案。

Cerebras Wafer-Scale Engine 举例说明了 ASICs 如何推动机器学习训练可能性的边界。通过解决计算和数据移动中的关键瓶颈,WSE 为 AI 专用硬件的未来提供了一个窗口,其中高度优化的、特定任务的架构集成解锁了前所未有的性能。

谬误和陷阱

训练是机器学习系统开发中最计算密集的阶段,其中复杂的优化算法、分布式计算挑战和资源管理约束相交。现代训练工作负载的规模和复杂性为性能优化、资源利用和系统设计选择方面的误解提供了许多机会。

谬误: 训练更大的模型总是能带来更好的性能。

这种普遍的信念驱使团队不断扩展模型大小,而没有考虑模型容量和可用数据之间的关系。虽然更大的模型可以捕捉更复杂的模式,但它们也需要指数级更多的数据和计算来有效训练。超过一定阈值,增加模型大小会导致在有限数据集上的过拟合、性能改进的边际效益递减和不可持续的计算成本。有效的训练需要将模型容量与数据可用性和计算资源相匹配,而不是仅仅追求规模本身。

陷阱: 假设分布式训练会自动加速模型开发。

许多从业者期望增加更多设备将成比例地减少训练时间,而没有考虑到通信开销和同步成本。分布式训练引入了协调复杂性、梯度聚合瓶颈和可能减缓训练的收敛问题。小型模型或数据集在单设备上训练可能比分布式系统更快,因为通信开销。成功的分布式训练需要仔细分析模型大小、批量大小需求和通信模式,以实现实际的速度提升效益。

谬误: 适用于小模型的学习率调度可以直接应用于大规模训练。

这种误解假设超参数,尤其是学习率,会随着模型大小或数据集大小的线性增长。由于梯度噪声特性、批量大小效应和收敛行为变化,大规模训练通常需要不同的优化动态。针对小规模实验优化的学习率调度在应用于分布式训练场景时,往往会引起不稳定性或收敛不良。有效的分布式训练需要针对训练环境的规模和分布式特性进行特定的超参数调整。

陷阱: 忽视训练的可重复性和实验跟踪。

在追求快速结果的压力下,团队常常通过不一致地使用随机种子、未能跟踪超参数或在没有适当版本控制的情况下运行实验来牺牲训练的可重复性。这种方法使得无法重现成功的结果、公平地比较实验或调试训练失败。复杂的分布式训练设置放大了这些问题,其中设备配置、数据加载顺序或软件版本中的细微差异可以造成显著的结果变化。系统性的实验跟踪和可重复性实践是至关重要的工程学科,而不是可选的额外开销。

陷阱:低估分布式训练系统中的基础设施复杂性和故障模式。

许多团队将分布式训练视为一个简单的扩展练习,而没有充分规划在规模扩大时出现的基础设施挑战。分布式训练系统引入了复杂的故障模式,包括节点故障、网络分区、由不平衡负载分布引起的内存压力以及可能导致整个训练运行在执行数小时或数天后失败的同步死锁。训练集群中的硬件异构性造成了性能不平衡,其中较慢的节点成为瓶颈,而网络拓扑和带宽限制可能使通信成本主导计算时间。有效的分布式训练需要强大的检查点和恢复机制、负载平衡策略、健康监控系统以及处理部分故障的回退程序。基础设施还必须考虑到动态资源分配、云环境中的 spot 实例中断以及维护分布式工作者之间一致软件环境的操作复杂性。

摘要

训练是机器学习系统的计算核心,在这里数学算法、内存管理策略和分布式计算架构汇聚在一起,将数据转化为智能模型。在本章中,我们看到了看似简单的迭代参数优化概念需要仔细的工程解决方案来处理现代机器学习工作负载的规模和复杂性。前向和反向传播的操作变成了矩阵运算、内存分配和梯度计算的编排,这些必须仔细平衡以符合硬件约束和性能要求。

我们从单设备训练到分布式系统的探索展示了计算瓶颈如何推动架构创新,而不仅仅是限制能力。数据并行通过分布训练示例实现跨多个设备的扩展,而模型并行通过在硬件资源间划分模型参数来解决内存限制。梯度累积、混合精度训练和流水线并行等高级技术展示了训练系统如何同时优化内存使用、计算吞吐量和收敛稳定性。这些策略之间的相互作用表明,有效的训练系统设计需要深入理解算法特性和硬件特性,以实现最佳资源利用。

这种协同设计原则——算法、软件框架和硬件架构共同进化——塑造了现代训练基础设施。矩阵运算模式推动了 GPU Tensor Core 的发展,框架通过混合精度 API 暴露出来,使得算法技术如 FP16 训练得以实现,这进一步影响了下一代硬件设计。理解计算需求与系统能力之间的反馈循环,使从业者能够做出利用现代训练系统全部潜力的明智的架构决策。

本章中探讨的训练优化为后续章节中检查的模型级效率技术和部署策略提供了基础。这些系统原则自然地从训练基础设施扩展到生产推理系统,展示了从优化训练工作流程中获得的经验如何影响更广泛的机器学习系统生命周期。

关键要点

  • 训练效率取决于优化从数据加载到梯度计算和参数更新的整个流程

  • 分布式训练策略必须平衡通信开销和计算并行性,以实现扩展带来的好处

  • 梯度检查点和混合精度等内存管理技术对于在硬件约束下训练大型模型至关重要

  • 成功的训练系统需要算法、软件框架和硬件架构的协同设计

这些原则和技术为理解模型优化、硬件加速和部署策略如何建立在训练基础设施之上,以创建完整的机器学习系统提供了基础。随着模型在规模和复杂性上的持续增长,这些训练技术对于使高级人工智能能力在多样化的应用领域和计算环境中变得可访问和实用变得越来越关键。


高效人工智能

DALL·E 3 提示:使用造船厂类比的概念插图展示人工智能中的效率。场景展示了一个繁忙的造船厂,其中集装箱代表数据位或字节。这些集装箱被起重机和车辆高效地移动,象征着人工智能系统中信息处理的流畅和快速。造船厂组织得井井有条,说明了在有限资源约束下的最优性能概念。在背景中,船只停靠,代表不同的平台和人工智能应用的场景。氛围应传达先进技术,并带有可持续性和广泛适用性的主题。

目的

是什么关键权衡塑造了机器学习系统中对效率的追求,为什么工程师必须平衡竞争目标?

机器学习系统效率需要在算法复杂性、计算资源和数据利用之间进行权衡。在某一维度的改进往往会导致其他维度的性能下降,从而产生需要系统方法的工程紧张关系。理解这些相互依赖的关系使工程师能够在时间、能源和成本的实际约束内设计出性能最优的系统。

学习目标

  • 分析扩展定律关系,以确定计算预算、模型大小和数据集要求的最佳资源分配策略

  • 比较和对比在云、边缘、移动和 TinyML 部署环境中算法、计算和数据效率的权衡

  • 使用吞吐量、延迟、能耗和资源利用率等效率指标评估机器学习系统

  • 应用剪枝、量化和知识蒸馏等技术,在资源约束内优化模型性能

  • 通过根据部署要求和操作约束优先优化维度来设计上下文感知的效率策略

  • 通过识别饱和点并提出效率驱动的替代方案来批判基于扩展的方法

  • 评估机器学习系统设计中效率选择的环境和可访问性影响

效率必要性

随着模型从简单的统计方法过渡到复杂、资源密集型架构,机器学习效率已经从次要考虑转变为基本学科。理论能力与实际部署之间的差距显著扩大,产生了影响系统可行性和可扩展性的效率约束。

大规模语言模型体现了这一挑战。GPT-3 的训练成本估计为 460 万美元(Lambda Labs 估计)和 1287 兆瓦时的能耗(D. Patterson 等,2021b)。操作需求,包括推理时超过 700GB 的内存占用(半精度为 350GB),在资源受限的环境中造成了部署障碍。这些限制揭示了模型表达性和系统实用性之间的紧张关系,这需要严格的分析和优化策略。

效率研究不仅超越了资源优化,还包括学习系统设计的理论基础。工程师必须了解算法复杂性、计算架构和数据利用策略如何相互作用,以确定系统的可行性。这些相互依赖性创造了多目标优化问题,其中某一维度的改进可能会在其他维度上降低性能。

本章节在第三部分性能工程课程中为分析机器学习系统中的效率建立了框架。这里的效率原则为第十章中的优化技术提供了信息,其中量化剪枝方法实现了算法效率目标,第十一章中的硬件加速策略最大化了计算效率,以及第十二章中的测量方法用于验证效率改进。

定义系统效率

以为智能手机构建一个照片搜索应用为例。你面临三个相互竞争的压力:模型必须足够小,以便适应内存(一个算法挑战),它必须在手机处理器上运行得足够快,而不会耗尽电池(一个计算挑战),并且它必须从用户的个人照片中学习,而无需数百万个示例(一个数据挑战)。高效的 AI 是导航这些相互关联权衡的学科。

解决这些效率挑战需要跨三个相互关联的维度进行协调优化,这些维度决定了系统的可行性。

机器学习系统效率是指通过改进算法硬件利用率数据使用,在保持性能的同时,最小化计算内存能量需求。

理解这些相互依赖性对于设计在实用约束内实现最大性能的系统是必要的。研究这三个维度在实际中的相互作用,揭示了扩展定律如何暴露这些限制。

效率相互依赖性

三个效率维度紧密相连,形成了一个复杂的优化景观。算法效率通过更好的算法和架构减少计算需求,但可能会增加开发复杂性或需要专用硬件。计算效率通过优化的实现和专用处理器最大化硬件利用率,但可能会限制模型的表达能力或需要特定的算法方法。数据效率通过改进的训练程序和数据利用率,使用更少的示例进行学习,但可能需要更复杂的算法或额外的计算资源。

一个具体的例子通过为智能手机设计照片搜索应用程序来说明这些相互联系。系统必须在 2GB 内存(计算限制)内运行,使用有限的训练数据实现可接受的准确性(数据限制),并在 50 毫秒内完成搜索(算法限制)。单独优化任何单一维度都证明是不够的:

算法效率关注模型架构。使用具有 5000 万个参数的紧凑型视觉语言模型而不是具有 10 亿个参数的模型,可以将内存需求从 4GB 减少到 200MB,并将推理时间从 2 秒缩短到 100 毫秒。然而,准确性从 92%下降到 85%,需要仔细评估权衡的接受度。

计算效率关注硬件利用率。优化后的模型在智能手机处理器上运行高效,每小时仅消耗 10%的电量。如 8 位量化等技术可以在保持质量的同时减少计算,批处理 1 可以同时处理多个查询。然而,这些优化需要算法修改以支持降低精度的操作。

数据效率塑造了模型的学习方式。系统不需要数百万个标记的图像-文本对,而是利用预训练的基础模型,并仅使用数千个用户特定的示例进行适应。从用户交互中持续学习提供了隐式反馈,而无需显式标记。这种数据效率需要更复杂的算法方法,并在适应过程中仔细管理计算资源。

这些维度之间的协同作用产生了新兴的好处:更小的模型(算法效率)使得设备上处理(计算效率)成为可能,这有助于从私有用户数据中学习(数据效率),而无需将个人图像传输到远程服务器。这种集成提供了增强的性能和隐私保护,展示了效率如何使那些使用低效方法无法实现的能力成为可能。

这些相互依赖性出现在所有部署环境中,从资源丰富的云系统到受严重限制的边缘设备。如图图 9.1 所示,在考察扩展定律如何揭示基本效率限制之前,理解这些关系是至关重要的。

图片

图 9.1:效率相互依赖性:三个效率维度(算法、计算和数据)相互重叠并相互影响,在机器学习系统中创造了系统性的权衡。优化一个效率维度通常需要仔细考虑其对其他维度的影响,从而塑造整体系统性能和资源利用。

通过对效率维度相互作用的这种理解,我们可以探讨为什么仅仅 brute-force scaling(暴力扩展)无法解决现实世界的效率需求。扩展定律为理解这些限制提供了定量框架。

人工智能扩展定律

机器学习系统遵循了一个一致的模式:通过参数、训练数据和计算资源增加模型规模通常可以提高性能。这一经验观察推动了自然语言处理、计算机视觉和语音识别等领域的进步,在这些领域,基于大量数据集训练的更大模型持续实现最先进的结果。

这些扩展定律可以看作是理查德·萨顿在第一章中提到的“苦涩教训”的定量表达:机器学习中的性能主要是由在巨大规模上利用通用方法所驱动的。可预测的幂律关系显示了计算在扩展时如何产生更好的模型。

这种扩展轨迹引发了关于效率和可持续性的关键问题。随着计算需求呈指数增长和数据需求增加,何时扩展成本超过性能收益的问题浮现出来。研究人员已经开发了扩展定律 2,这些定律量化了模型性能与训练资源之间的关系,揭示了为什么随着系统复杂性的增加,效率变得越来越重要。

本节介绍了扩展定律,探讨了它们在不同维度上的表现,并分析了它们对系统设计的影响,确立了为什么多维度效率优化框架是一个基本要求。

扩展定律的经验证据

过去十年人工智能能力的快速进化是这种扩展轨迹的例证。GPT-1(2018)包含 1.17 亿个参数,展示了基本的句子完成能力。GPT-2(2019)扩展到 15 亿个参数,实现了连贯的段落生成。GPT-3(2020)扩展到 1750 亿个参数,并在多个领域展示了复杂的文本生成能力。模型规模的每次增加都带来了显著的能力提升,但成本呈指数级增长。

这种模式不仅限于语言模型。在计算机视觉中,当训练数据成比例增加时,加倍神经网络大小通常会产生一致的准确度提升。AlexNet(2012)有 6000 万个参数,VGG-16(2014)扩展到 1.38 亿个,现代大型视觉 Transformer 可以超过 6 亿个参数。每一代都实现了更好的图像识别准确度,但需要成比例更多的计算资源和训练数据。

放大假设是这一进步的基础:更大的模型具有更强的能力来捕捉复杂的数据模式,从而促进准确性和泛化能力的提高。然而,这种放大轨迹引入了关键资源限制。训练 GPT-3 需要大约 314 万亿 3 次浮点运算(314 后面跟着 21 个零),相当于连续运行一台现代游戏 PC 超过 350 年,这带来了巨大的财务和环境成本。

这些资源需求揭示了为什么理解放大定律对于效率是必要的。图 9.2 显示了训练最先进模型的计算需求以不可持续的速度增长,增长速度超过了摩尔定律在硬件方面的改进。

图 9.2:模型训练计算趋势:模型训练计算以越来越快的速度增长,尤其是在最近的深度学习时代。来源:(Sevilla 等人 2022b。)

放大定律为理解这些权衡提供了一个定量框架。它们揭示了随着资源的增加,模型性能表现出可预测的模式,遵循幂律关系,其中性能持续改进但回报递减 4。这些定律表明,最优资源分配需要协调模型大小、数据集大小和计算预算,而不是孤立地放大任何单一维度。

复习:Transformer 计算特性

回想一下 第四章 中提到的,Transformer 使用自注意力机制处理序列,该机制计算所有标记对之间的关系。这种架构的计算成本与序列长度成二次方关系,这使得资源分配对于语言模型尤其关键。术语“FLOPs”(浮点运算)量化了总计算工作量,而“标记”代表模型在训练过程中处理的单个文本单元(通常是子词)。

计算最优资源分配

大型语言模型(LLMs)的经验研究表明一个关键见解:对于任何固定的计算预算,存在一个最优的模型大小和数据集大小(以标记 5 衡量)之间的平衡,以最小化训练损失。

图 9.3 通过三个相关视图展示了这一原理。左侧面板显示了‘IsoFLOP 曲线’,其中每条曲线对应于在 transformer7 训练过程中恒定的浮点运算次数(FLOPs6)。这些曲线的谷底确定了在训练自回归 8 语言模型时,每个计算预算下最有效的模型大小。中间和右侧面板揭示了随着计算预算的增加,最佳参数数量和标记数量如何可预测地扩展,证明了协调扩展以最大化资源利用的必要性。

图片

图 9.3:最佳计算分配:对于固定的计算预算,语言模型性能取决于平衡模型大小和训练数据量;左侧面板将训练损失映射到参数数量,确定了每个 FLOP 级别的效率最佳点。中间和右侧面板量化了随着计算的增加,最佳参数数量和标记需求如何可预测地扩展,证明了在大规模语言模型中需要协调扩展模型和数据以最大化资源利用的需求。来源:(Hoffmann 等人 2022)。

Kaplan 等人(2020)证明了基于 transformer 的语言模型可以与三个因素可预测地扩展:模型参数数量、训练数据集的体积(以标记衡量)和总计算预算(以浮点运算衡量)。当这些因素成比例增加时,模型会表现出一致的性能改进,而无需进行架构修改或特定任务的调整。

这些模式的实际表现清晰地体现在图 9.4 中,该图展示了从10310³10910⁹参数范围的模型测试损失曲线。该图揭示了两个关键见解。首先,较大的模型表现出更高的样本效率,在更少的训练标记下达到目标性能水平。其次,随着计算资源的增加,最佳模型大小相应增长,当计算资源分配得当时,损失会可预测地减少。

图片

图 9.4:缩放定律与计算最优性:更大的模型在增加训练数据和计算资源的情况下始终能实现更好的性能,但递减的回报需要训练过程中仔细的资源分配。最优模型大小和训练持续时间取决于可用的计算预算,正如不同参数规模和训练标记数量下损失曲线收敛所证明的那样。来源:(Kaplan et al. 2020).

这种理论缩放关系定义了最优的计算分配:对于固定的预算,关系 DN0.74D \propto N^{0.74} (Hoffmann et al. 2022) 表明数据集大小 DD 和模型大小 NN 必须以协调的比例增长。这意味着随着模型大小的增加,数据集应该以大约三分之四的速率增长,以保持计算最优效率。

这些理论预测假设了完美的计算利用率,这在分布式训练场景中变得具有挑战性。现实世界的实现面临着与系统规模不利的通信开销,这造成了带宽瓶颈,降低了有效利用率。超过 100 个节点后,通信开销可能会降低预期性能提升 20-40%,具体取决于工作负载和互连方式,将预测的改进转化为更实际的现实结果。

数学基础和操作规则

观察到的缩放行为中的可预测模式可以用幂律关系来数学表达,尽管理解这些模式背后的直觉对于大多数从业者来说比精确的数学公式更重要。

形式化的数学公式

对于对形式化数学框架感兴趣的读者,缩放定律可以表示为幂律关系。一般公式为:

(N)=ANα+B \mathcal{L}(N) = A N^{-\alpha} + B

其中,损失 \mathcal{L} 随着资源数量 NN 的增加而减少,遵循一个以速率 α\alpha 为特征的幂律衰减,加上一个基线常数 BB。在这里,(N)\mathcal{L}(N) 表示使用资源数量 NN 所达到的损失,AABB 是与任务相关的常数,而 α\alpha 是表征性能改进速率的缩放指数。较大的 α\alpha 值表示在缩放方面的性能改进更有效。

这些理论预测在多个模型配置中得到了强有力的实证支持。图 9.5 显示,提前停止的测试损失随着数据集大小和模型大小的变化而可预测地变化,并且可以通过适当的参数化将不同配置下的学习曲线对齐。

资源受限缩放区域

在实践中应用缩放定律需要识别出三种不同的资源分配区域,这些区域源于计算预算、数据可用性和最佳资源分配之间的权衡。这些区域为在资源约束下导航的系统设计者提供了实际指导。

计算受限区域描述了尽管有丰富的训练数据,但可用的计算资源限制了缩放潜力的场景。拥有有限硬件预算或严格的训练时间约束的组织处于这个区域。最佳策略是训练较小的模型更长时间,通过延长训练计划而不是更大的架构来最大化利用可用的计算资源。这种方法对于学术机构、初创公司或基础设施访问受限的项目尤其相关。

当计算资源超过数据集限制下能够有效利用的资源时,会出现数据受限机制。与专门领域、专有数据集或隐私受限数据工作的资源丰富组织经常遇到这种情况。最佳策略是在较少的优化步骤中训练更大的模型,利用模型容量从有限的训练示例中提取最大信息。这种机制通常出现在医学成像或专有商业数据集等专用应用中。

最佳机制(Chinchilla 前沿)代表了在计算最优扩展定律下计算资源和数据资源的平衡分配。这种机制通过按比例扩展模型大小和训练数据,实现了最大性能效率,正如 DeepMind 的 Chinchilla 模型所展示的,它通过最优资源分配超过了更大的模型(Hoffmann 等人 2022)。在这个机制内运行需要复杂的资源规划,但每单位计算投资都能带来卓越的性能。

认识到这些机制使得从业者能够就资源分配策略做出明智的决策,避免常见的低效情况,例如过度参数化的模型训练数据不足或参数不足的模型未能有效利用可用的计算资源。

图片

图 9.5: 损失与模型和数据集大小: 早期停止的测试损失随着数据集大小和模型大小的变化而可预测地变化,突出了在固定计算预算下平衡扩展对于最佳性能的重要性。

扩展定律表明,性能改进遵循可预测的模式,这些模式根据资源可用性而变化,并在不同维度上表现出不同的行为。出现了两种重要的扩展机制:数据驱动机制,描述了性能如何随着数据集大小而变化,以及时间机制,描述了在机器学习生命周期中何时应用额外的计算。

数据受限扩展机制

泛化误差与数据集大小之间的关系表现出三种不同的机制,如图图 9.6 所示。当可用的示例有限时,高泛化误差是由于统计估计不足造成的。随着数据可用性的增加,泛化误差随着数据集大小的增加而可预测地降低,遵循幂律关系,为数据扩展提供了最实用的好处。最终,性能达到饱和,接近由内在数据限制或模型容量决定的底部,在此之后,额外的数据带来的改进微乎其微。

图片

图 9.6: 数据缩放机制:数据集大小与泛化误差之间的关系遵循不同的缩放机制。随着数据集大小的增加,最初根据幂律关系减少泛化误差,但最终会达到一个由内在数据限制或模型容量决定的不可减少的错误地板(Hestness 等人 2017)。这种行为揭示了数据缩放带来的收益递减,并指导了机器学习系统中数据收集工作的实际决策。

这种三阶段模式不仅体现在数据之外的不同资源维度上。在幂律区域内操作提供了资源投资的最可靠回报。达到这一阶段需要最低的资源阈值,而在此区域内保持操作则需要仔细的资源分配,以避免过早饱和。

时间缩放机制

虽然数据驱动机制描述了性能如何随数据集大小变化,但一个互补的视角是检查机器学习生命周期内计算资源的时序分配。最近的研究已经确定了三个不同的时间缩放机制,这些机制描述了模型开发和部署的不同阶段。

预训练缩放涵盖了传统的缩放定律领域,描述了模型性能如何随着更大架构、扩展的数据集和初始训练期间增加的计算资源而提高。在基础模型中进行的广泛研究已经确立了资源和能力之间的明确幂律关系。

训练后缩放描述了通过微调、提示工程和特定任务适应性等技术,在初始训练后实现的改进。这一机制在基础模型中获得了显著的关注,其中适应性而不是重新训练通常在资源需求适中的情况下提供了提高性能的最有效途径。

测试时缩放描述了性能改进如何通过在推理期间额外分配计算资源而实现,而不修改模型参数。这包括集成预测、思维链提示和迭代细化等方法,使模型能够为每个输入分配额外的处理时间。

图 9.7 显示了这些时间机制在性能改进的计算资源分配上表现出不同的特征。预训练需要大量资源,同时提供广泛的能力,训练后提供在适度要求下的针对性增强,测试时缩放则允许灵活的性能-计算权衡,可根据推理进行调整。

图片

图 9.7: 时间缩放机制: 不同的时间缩放机制提供了不同的方法,通过不同的计算投资来提高模型性能。预训练通过从头开始的大规模训练建立广泛的技能,后训练通过额外的训练阶段细化现有模型,测试时缩放在推理过程中动态分配计算资源以增强每个样本的结果。理解这些机制有助于明确前期投资与灵活的按需资源分配之间的权衡,以实现最佳系统性能。

数据驱动和时间缩放机制对于系统设计至关重要,揭示了除了仅扩展训练资源之外,还有多种提高性能的途径。对于资源受限的部署,后训练和测试时缩放可能比完全重新训练模型提供更实用的方法,而数据高效的技术能够在幂律区域内使用较小的数据集有效运行系统。

系统设计中的实际应用

缩放定律为实际系统设计和资源规划提供了深刻的见解。一致观察到幂律趋势表明,在定义良好的操作区域内,模型性能主要取决于规模,而不是独特的架构创新。然而,递减回报现象表明,每次额外的改进都需要指数级增加资源,同时带来越来越小的收益。

OpenAI 对 GPT-3 的开发展示了这一原则。作者们没有进行昂贵的架构搜索,而是应用了从早期实验中推导出的缩放定律来确定最佳训练数据集大小和模型参数数量 (T. Brown 等人 2020)。他们沿着计算最优前沿扩展了一个已建立的 Transformer 架构,达到 1750 亿个参数和大约 3000 亿个标记,从而能够提前预测模型性能和资源需求。这种方法展示了缩放定律在大规模系统规划中的实际应用。

缩放定律在系统设计中具有多种实用功能。它们使从业者能够在资源预算期间估计不同资源分配的投资回报。在固定的计算预算下,设计者可以利用经验缩放曲线来确定跨模型大小、数据集扩展或训练持续时间的最佳性能改进策略。

系统设计者可以利用缩放趋势来确定何时架构变化相对于仅通过缩放获得的收益产生显著改进,从而避免详尽的架构搜索。当一个模型系列表现出有利的缩放行为时,扩展现有架构可能比过渡到更复杂但未经验证的设计更有效。

在资源预算受限的边缘和嵌入式环境中,理解模型缩放下的性能下降情况,使设计者能够选择在部署约束内提供可接受精度的较小配置。通过量化缩放-性能权衡,缩放定律确定何时暴力缩放变得低效,并指出采用包括模型压缩、高效知识迁移、稀疏技术和硬件感知设计等替代方法的必要性。

缩放定律还充当诊断工具。尽管增加了资源,但性能却出现平台期,这可能表明维度饱和——例如相对于模型大小的数据不足——或计算资源利用效率低下。这种诊断能力使缩放定律既具有预测性又具有指导性,有助于系统地识别和解决瓶颈。

可持续性和成本影响

缩放定律揭示了性能提升的途径,同时揭示了资源需求的快速增加。随着模型规模的扩大,训练和部署的资源需求不成比例增长,在通过缩放获得性能提升和系统效率之间产生了紧张关系。

训练大规模模型需要大量的处理能力,通常需要由数百或数千个加速器组成的分布式基础设施 9。最先进的语言模型训练可能需要数万个 GPU 天,消耗数百万千瓦时的电力。这些分布式训练系统在通信开销、同步和缩放效率方面引入了额外的复杂性,如第八章详细所述。能源需求超过了摩尔定律的进步,引发了关于长期可持续性的关键问题。

大型模型需要广泛、高质量、多样化的数据集才能发挥其全部潜力。数据收集、清洗和标注过程消耗大量时间和资源。当模型接近可用高质量数据的饱和度,尤其是在自然语言处理领域,通过数据缩放获得额外性能提升变得越来越困难。这一现实强调了数据效率作为暴力缩放方法必要补充的重要性。

财务和环境影响加剧了这些挑战。大型基础模型的训练运行可能产生数百万美元的计算费用,相关的碳足迹 10 也受到了越来越多的关注。这些成本限制了尖端研究的可及性,并加剧了获取先进人工智能系统的差距。效率障碍带来的民主化挑战直接关联到第十九章第十九章中解决的访问性目标。第十八章第十八章探讨了机器学习系统中环境可持续性的综合方法,包括碳足迹测量和绿色计算实践。

这些权衡表明,扩展定律为理解性能增长提供了有价值的框架,但并不构成改善的畅通无阻之路。每一次性能的提升都需要与相应的资源需求进行评估。当系统接近实际扩展极限时,重点必须从单纯的扩展转移到高效扩展——这是一种平衡性能、成本、能耗和环境影响的综合方法。

扩展定律的失效条件

扩展定律在特定操作范围内表现出显著的稳定性,但存在固有的局限性。随着系统规模的扩大,它们不可避免地会遇到边界,在这些边界下,平滑、可预测扩展的基本假设不再成立。这些失效点揭示了关键的低效性,并强调了改进系统设计方法的必要性。

为了使扩展定律保持有效,模型大小、数据集大小和计算预算必须协调一致地增加。在一维上过度投资而保持其他维度不变通常会导致次优结果。例如,在不扩大训练数据集的情况下增加模型大小可能会导致过拟合,而在不重新设计模型的情况下增加计算资源可能会导致资源利用效率低下 (Hoffmann 等人 2022)。

大规模模型需要精心调整的训练计划和学习率,以充分利用可用资源。当由于提前停止、批大小不匹配或无效的并行性导致计算资源分配不足时,尽管投入了大量的基础设施投资,模型可能无法达到其性能潜力。

扩展定律假设在足够训练数据的情况下持续提高性能。然而,在许多领域,高质量、人工标注的数据是有限的。随着模型消耗越来越大的数据集,它们会达到边际效用递减的点,此时额外的数据贡献的信息很少。超过这个阈值,更大的模型可能表现出记忆而不是泛化。

随着模型的增长,它们需要更大的内存带宽 11、互连容量和 I/O 吞吐量。即使在专用加速器的情况下,这些硬件限制也变得越来越具有挑战性。在集群中分配万亿参数模型需要精心管理数据并行性、通信开销和容错性。

在极端规模下,模型可能接近从训练分布中可以学习到的极限。在基准测试上的性能可能继续提高,但这些改进可能不再反映泛化或理解的实质性提升。模型可能变得越来越脆弱,容易受到对抗性样本的影响,或者倾向于生成看似合理但实际不准确的结果。

表 9.1 综合了扩展失败的主要原因,概述了典型的分解类型、潜在原因和代表性场景,作为预测低效和指导平衡系统设计的参考。

表 9.1:扩展分解类型:模型大小、数据量和计算资源之间的不平衡扩展会导致特定的失败模式,如过拟合或递减回报,影响系统性能和效率。该表对这些分解进行分类,确定其根本原因,并提供代表性场景以指导更有效的系统设计和资源分配。

维度扩展 分解类型 潜在原因 示例场景
模型大小 过拟合 模型容量超出可用数据 在有限数据集上的十亿参数模型
数据量 递减回报 新或多样化信息的饱和 超过有用阈值的网络文本扩展
计算预算 资源未充分利用 训练步骤不足或使用效率低下 训练时间缩短的大型模型
不平衡扩展 低效 模型/数据/计算的不协调增加 没有更多数据或时间的情况下加倍模型大小
所有维度 语义饱和 领域中可学习模式的耗尽 尽管扩展了所有输入,但不再有进一步收益

这些分解点表明,扩展定律描述了在特定条件下的经验规律,在规模扩大时越来越难以维持。随着机器学习系统的持续发展,确定扩展何时不再有效变得必要,这推动了开发不依赖规模就能提高性能的策略。

整合效率和扩展

扩展定律(数据饱和、基础设施瓶颈和递减回报)所暴露的局限性表明,仅靠 brute-force 扩展无法实现可持续的人工智能系统。这些限制需要从扩大规模转向以减少资源的方式实现更高的效率。

这一转变需要三个相互关联的维度之间的协调优化:算法效率通过更好的模型设计解决计算强度问题,计算效率最大化硬件利用率,将算法改进转化为实际收益,数据效率从有限的示例中提取最大信息,因为高质量数据变得稀缺。这三个维度共同提供了系统方法,以实现仅通过缩放无法可持续实现的目标,同时解决关于人工智能能力公平获取和环境影响的更广泛问题。

在考察了缩放定律如何揭示基本约束之后,我们现在转向效率框架,该框架提供了在约束内有效操作的切实策略。下一节将详细说明三个效率维度如何协同工作,以实现可持续、可访问的机器学习系统。

效率框架

通过缩放定律(即持续进步需要系统效率优化)确定的约束促使三个互补的效率维度。每个维度解决一个特定的限制:算法效率解决计算强度问题,计算效率解决硬件利用率差距,数据效率解决数据饱和问题。

这三个维度共同提供了一个系统框架,用于解决缩放定律揭示的约束。在算法设计、硬件利用和数据使用方面的针对性优化可以实现蛮力缩放无法实现的目标:可持续、可访问的高性能人工智能系统。

多维效率协同

优化性能需要跨多个维度进行协调优化。没有任何单一资源——无论是模型参数、训练数据还是计算预算——可以无限扩展以实现效率。现代技术展示了潜力:通过优化架构实现算法效率的 10-100 倍提升,通过专用处理器实现硬件利用率的 5-50 倍改进,通过高级学习方法实现数据需求的 10-1000 倍减少。

该框架的力量源于维度之间的相互联系,如图图 9.8 所示。算法创新通常能够提高硬件利用率,而硬件进步则解锁新的算法可能性。数据高效技术减少计算需求,而计算高效方法使得在更大的数据集上进行训练成为可能。理解这些协同作用对于构建实用的机器学习系统至关重要。

图片

图 9.8: 历史效率趋势: 算法、计算和数据效率各自为人工智能能力的显著提升做出了贡献,尽管它们的增长速度不同,且收益递减。理解这些历史趋势有助于阐明这些效率维度之间的相互作用,并为在数据有限的环境中扩展机器学习系统提供策略。

具体优先级在不同部署环境中有所不同。资源丰富的云系统优先考虑可扩展性和吞吐量,而边缘设备面临严重的内存和电力限制。移动应用必须在性能和电池寿命之间取得平衡,而 TinyML 部署需要极端的资源效率。理解这些特定情境的模式使设计者能够就优先考虑哪些效率维度以及如何解决它们之间不可避免的权衡做出明智的决策。

实现算法效率

算法效率通过优化的模型架构和训练过程实现了每单位计算的最大性能。现代技术实现了计算需求 10-100 倍的改进,同时保持或提高准确度,为实际人工智能部署提供了最直接的途径。

这些改进的基础在于一个关键观察:大多数神经网络都存在显著过参数化的问题。彩票假设揭示了网络中存在稀疏子网络,通常是原始参数的 10-20%(尽管这因架构和任务而显著变化),当单独训练时可以达到相当的准确度(Frankle 和 Carbin 2019)。这一发现将压缩转化为一种原则性的方法:大型模型作为寻找高效架构的初始化策略。

模型压缩基础

三种主要方法主导了现代算法效率,每种方法针对模型低效的不同方面:

模型压缩系统地从神经网络中移除冗余组件。剪枝技术通过移除不必要的权重和结构,实现了 2-4 倍的推理速度提升,同时精度损失在 1-3%之间。研究表明,ResNet-50 可以被减少到原始参数的 20%,同时保持 99%的 ImageNet 准确度(Gholami 等人 2021)。具体的剪枝算法,包括基于幅度的选择、结构化与非结构化方法以及层敏感性分析,在第十章中进行了详细阐述。

精度优化通过量化减少计算需求,将高精度浮点值映射到低精度表示。神经网络显示出对精度降低的固有鲁棒性,INT8 量化实现了 4 倍的内存减少和 2-4 倍的推理速度提升,同时通常保持 98-99%的 FP32 精度(Jacob 等人 2018a)。现代技术从简单的训练后量化到复杂的量化感知训练都有涉及。具体的量化算法、校准方法和训练过程在第十章(ch016.xhtml#sec-model-optimizations)中详细说明。

知识迁移将大型教师模型的能力提炼到高效的学生模型中。知识蒸馏 12 实现了 40-60%的参数减少,同时保留了 95-97%的原有性能,通过需要更少的训练样本来提高计算效率和数据效率。具体的蒸馏算法、损失函数和训练过程在第十章(ch016.xhtml#sec-model-optimizations)中介绍。

硬件-算法协同设计

单独的算法优化是不够的;它们的实际效益取决于软硬件协同设计。优化技术必须针对目标硬件特性(内存带宽、计算能力和精度支持)进行定制,以实现实际的加速效果。例如,INT8 量化在具有张量核心支持的 NVIDIA V100 GPU 上实现了 2.3 倍的加速,但在缺乏专用整数指令的硬件上可能提供最小的效益。

成功的协同设计需要理解工作负载是内存受限(受数据移动限制)还是计算受限(受处理能力限制),然后应用解决实际瓶颈的优化。如操作融合等技术通过组合操作来减少内存流量,而精度降低则利用了专门的硬件单元。虽然第十章涵盖了硬件感知优化的算法方面,但第十一章详细介绍了系统化协同设计方法如何利用特定硬件架构以实现最大效率。

架构创新以提高效率

现代效率需要针对资源限制设计的架构。MobileNet13、EfficientNet14 和 SqueezeNet15 等模型表明,紧凑的设计可以通过架构创新而不是通过扩大现有设计来提供高性能。

不同的部署环境需要不同的效率权衡。云推理优先考虑吞吐量,可以容忍更高的内存使用,有利于并行友好型操作。边缘部署优先考虑延迟和内存效率,需要最小化内存访问的架构。移动部署限制能源使用,要求架构优化以实现节能操作。

参数高效适应

参数高效微调 16 技术展示了三个效率维度如何协同工作。这些方法更新不到 1%的模型参数,同时实现完全微调性能,解决所有三个效率支柱:通过减少参数更新提高算法效率,通过降低内存需求和加快训练提高计算效率,以及通过利用需要较少任务特定示例的预训练表示提高数据效率。

实际影响是变革性的:传统的 GPT-3 微调需要存储 175 亿个参数的梯度,消耗超过 700GB 的 GPU 内存。LoRA 通过学习权重更新的低秩分解,将这一需求降低到 10GB 以下,使得在单个消费级 GPU 上实现高效适应成为可能,同时只需要数百个示例而不是数千个即可实现有效的适应。

如图 9.9 所示,在 ImageNet18 分类上实现 AlexNet17 级别性能所需的神经网络训练计算资源在 2012 年至 2019 年之间减少了大约44×44\times。这种每 16 个月减半的改进超过了摩尔定律 19 的硬件效率提升,展示了算法进步在推动效率方面的作用 (Hernandez, Brown, 等人 2020)。

图片

图 9.9:算法效率进步:神经网络训练的计算需求在 2012 年至 2019 年之间下降了 44 倍,超过了硬件改进,并展示了算法进步对模型效率的显著影响。通过每 16 个月计算量减半,模型架构和优化技术的创新可以推动人工智能系统可持续性的实质性提升。来源:(Hernandez, Brown, 等人 2020)。

从基本的压缩到硬件感知优化和参数高效适应,算法效率的演变展示了这些技术在机器学习进步中的核心地位。随着该领域的发展,算法效率将继续是设计高性能、可扩展和可持续系统的核心。

计算效率

计算效率关注于有效利用硬件和计算资源来训练和部署机器学习模型。它包括减少能源消耗、优化处理速度以及利用硬件能力以实现可扩展和可持续的系统性能的策略。虽然本章重点介绍效率原则和权衡,但硬件加速的详细技术实现,包括 GPU 架构、TPU 设计、内存系统以及定制加速器,将在第十一章中介绍。

从 CPU 到 AI 加速器

计算效率的演变揭示了为什么专用硬件变得至关重要。在机器学习的早期,中央处理器(CPUs)塑造了可能实现的内容。CPU 擅长顺序处理和复杂的决策,但并行性有限,通常有 4-16 个核心,优化用于多种任务,而不是机器学习占主导地位的重复矩阵运算。模型的训练时间以天或周计算,即使是相对较小的数据集也推高了硬件的界限。

这个受 CPU 限制的时代随着像 AlexNet 和 ResNet20 这样的深度学习模型展示了神经网络的潜力,迅速超越了传统的 CPU 能力而结束。如图图 9.10 所示,这标志着计算使用量指数增长的开始。OpenAI 的分析显示,从 2012 年到 2018 年,用于 AI 训练的计算量增加了大约 300,000 倍,在此期间大约每 3.4 个月翻一番——这个速度远超过了摩尔定律(Amodei, Hernandez, et al. 2018)。

图片

图图 9.10:AI 训练计算增长:从 2012 年到 2019 年,AI 训练的计算需求增加了 300,000 倍,超过了摩尔定律预测的增长率,推动了专用硬件的需求(Amodei, Hernandez, et al. 2018)。这种指数增长突显了 AI 模型日益复杂化以及支持持续进步的高效计算基础设施的需求。

这种快速增长是由图形处理单元(GPUs)的采用所驱动的,它们提供了无与伦比的并行处理能力。虽然 CPU 可能有 16 个核心,但现代高端 GPU 如 NVIDIA H100 包含超过 16,000 个 CUDA 核心 21。像 Google 的 Tensor Processing Units (TPUs)这样的专用硬件加速器通过为机器学习工作负载设计芯片,优化了神经网络中最常见的特定数据类型和操作,进一步革命化了计算效率。

可持续计算和能源意识

随着系统进一步扩展,计算效率与可持续性紧密相连。训练最先进的大型语言模型需要巨大的计算资源,这导致了对环境影响的高度关注。图 9.11 中显示的数据中心预计电力使用量突显了这一担忧。在 2010 年至 2030 年之间,预计电力消耗将急剧上升,尤其是在最坏的情况下,到 2030 年可能超过 8,000 太瓦时(N. Jones 2018)。

图片

图 9.11:数据中心能源预测:在 2010 年至 2030 年之间,数据中心电力使用量预计将急剧增加,尤其是在最坏的情况下,到 2030 年消费量可能超过 8,000 太瓦时(N. Jones 2018)。这一预测强调了在 AI 系统中提高能源效率的迫切需要。

这种显著的增长凸显了计算效率的紧迫性,因为即使是大型数据中心也面临着由于电网容量限制而导致的能源约束。仅仅提高效率可能无法保证环境效益,因为存在一种称为杰文斯悖论的现象。

以燃油效率高的汽车发明为例。虽然每辆车每英里使用的汽油更少,但驾驶成本的降低鼓励人们更频繁地驾驶,住得离工作地点更远。结果可能是总汽油消费量的增加。这就是杰文斯悖论:效率的提高可能被消费量的增加所抵消。在 AI 中,这意味着使模型效率提高 10 倍可能会导致其使用量增加 100 倍,如果不谨慎管理,可能会导致净负面的环境影响。

应对这些挑战需要优化云和边缘环境中的硬件利用率,同时最小化能耗,并关注增加部署可能带来的潜在反弹效应。

主要趋势包括采用能源感知的调度和资源分配技术,这些技术能够高效地在可用硬件上分配工作负载(D. Patterson 等人 2021b)。研究人员还在开发动态调整训练和推理中精度水平的方法,使用低精度操作(例如,混合精度训练)来降低功耗,同时不牺牲精度。

分布式系统通过在多台机器之间分配工作负载来实现计算效率。模型并行 22 和数据并行 23 等技术允许大规模模型更有效地进行训练,利用 GPU 或 TPU 集群来最大化吞吐量,同时最小化空闲时间。

在边缘,计算效率解决了在能源受限环境中对实时处理不断增长的需求。硬件感知的模型优化、轻量级推理引擎和自适应计算架构等创新,使得边缘系统高度高效,这对于自动驾驶汽车和智能家居设备等应用至关重要。

生产部署模式

实际世界的效率优化在部署环境中展示了实际影响。生产系统通过协调应用优化技术,通常实现 5-10 倍的效率提升,同时保持 95%以上的原始模型性能。

移动应用程序通过联合量化、剪枝和蒸馏,实现了 4-7 倍的模型尺寸缩减和 3-5 倍的延迟改进,从而在中端设备上实现了实时推理。现代移动人工智能系统根据功率、性能和实时约束,将工作负载分配到专用处理器(用于超低功耗推理的 NPU、用于并行计算的 GPU、用于控制逻辑的 CPU)。

自动驾驶系统通过硬件感知的架构设计和混合精度量化,优化了安全关键性小于 10 毫秒的延迟要求,在严格的功率和热约束下处理多个高带宽传感器流。

云服务基础设施通过结合动态批处理、量化和知识蒸馏的系统优化,降低了 70-80%的成本,在可比的质量水平上服务 4-5 倍更多的请求。

边缘物联网部署通过极端模型压缩和占空比优化,实现了长达一个月的电池寿命,在毫瓦级的功率预算下运行,同时保持实际应用可接受的准确性。

这些效率提升源于系统性的优化策略,这些策略协调了多种技术,而不是孤立地应用单个优化。实现这些生产结果的具体优化序列、技术组合和工程实践在第十章中详细说明。

计算效率补充了算法和数据效率。紧凑的模型减少了计算需求,而高效的数据管道简化了硬件使用。计算效率的演变(从早期对 CPU 的依赖到专用加速器再到可持续计算实践)对于构建可扩展、可访问和负责任的机器学习系统至关重要。

数据效率

数据效率专注于优化训练机器学习模型所需的数据量和质量。随着数据收集、存储和处理成本的上升,以及可用高质量数据的限制,数据效率已成为一个关键维度。

最大化从有限数据中学习

在早期的机器学习中,数据效率并不是主要关注点,因为数据集相对较小且易于管理。挑战通常是获取足够的标记数据来有效训练模型。研究人员依赖于如UCI 机器学习仓库24 这样的整理数据集,使用特征选择和降维技术如主成分分析(PCA)25 从有限的数据中提取最大价值。

2010 年代深度学习的出现改变了数据的作用。像 AlexNet 和 GPT-3 这样的模型表明,更大的数据集往往会导致更好的性能,标志着“大数据”时代的开始。然而,这种依赖引入了低效。数据收集变得昂贵且耗时,需要大量标记数据来进行监督学习。

即使数据集在增长,研究人员也开发了提高数据效率的技术。迁移学习 26 允许在较小的数据集上微调预训练模型,减少特定任务的数据需求(Yosinski 等人 2014)。数据增强 27 通过创建现有样本的新变体来人工扩大数据集。主动学习 28 优先标记最具信息量的数据点(Settles 2012a)。

随着系统规模的持续增长,大数据集的低效性变得明显。数据为中心的 AI29 已成为一个关键范式,强调数据质量而非数量。这种方法侧重于增强预处理、去除冗余和提高标记效率。研究表明,经过仔细整理和过滤,可以使用只有原始数据量的一小部分实现相当或更优的性能(Penedo 等人 2024)。

几种技术支持这种过渡。自监督学习 30 使模型能够从未标记的数据中学习有意义的表示,减少对昂贵的人类标记数据集的依赖。主动学习策略有选择性地识别用于标记的最具信息量的示例,而课程学习 31 则将训练结构化,从简单示例逐步过渡到复杂示例,提高学习效率。

数据效率在基础模型 32 中尤为重要。随着这些模型在规模和能力上的增长,它们接近了可用高质量训练数据的极限,尤其是在语言任务中,如图 9.12 所示。这种稀缺性推动了数据处理和整理技术的创新。

图片

图 9.12:数据集增长:基础模型越来越多地在大规模数据集上训练,反映了人类生成文本的日益增长。这一趋势突显了随着规模增加,在保持模型性能的同时,数据稀缺性的挑战。来源:Sevilla 等(2022c)。

数据质量影响证据在不同部署规模中均有体现。在 Tiny ML33 应用中,如 Wake Vision 等数据集展示了性能如何严重依赖于仔细的数据整理(C. Banbury 等,2024)。在更大规模上,基于网络规模数据集训练的语言模型研究显示,智能过滤和选择策略显著提高了下游任务的表现(Penedo 等,2024)。第十二章建立了衡量这些数据质量改进的严格方法。

这个数据效率的现代时代代表了系统处理数据利用方式的一种转变。通过关注质量而非数量,并开发用于数据选择和处理的复杂技术,该领域正朝着更可持续和有效的模型训练和部署方法迈进。数据效率对于可扩展系统至关重要,它影响着模型和计算效率。更小、质量更高的数据集可以缩短训练时间和计算需求,同时实现更好的泛化。这些原则与第十五章中探讨的隐私保护技术相辅相成,其中最小化数据需求可以增强效率和用户隐私保护。

实际世界的效率策略

在单独探讨了每个效率维度及其相互关系之后,我们考察了这些维度如何在不同的部署环境中体现出来。机器学习系统的效率源于在特定操作环境中理解算法、计算和数据效率之间的关系。

上下文特定的效率需求

在部署环境中,具体的优先级和权衡差异很大。正如我们的开篇示例所示,这些范围从资源丰富的云系统到内存和电源限制严重的边缘设备。 表 9.2 展示了这些限制如何转化为效率优化优先级。

表 9.2:按部署环境优化的效率优先级:每个环境都根据独特的约束条件,在算法、计算和数据优化策略之间进行不同的权衡。云系统优先考虑可扩展性,边缘部署侧重于实时性能,移动应用在性能与电池寿命之间取得平衡,而 TinyML 则要求极端的资源效率。

部署环境 主要约束 效率优先级 代表性应用
规模成本、能源消耗 吞吐量、可扩展性、运营效率 大型语言模型 API、推荐引擎、视频处理
边缘 延迟、本地计算能力、连接性 实时性能、能效 自动驾驶汽车、工业自动化、智能摄像头
移动 电池寿命、内存、热限制 能效、模型大小、响应性 语音助手、照片增强、增强现实
TinyML 极端功耗/内存限制 极低功耗、最小模型大小 物联网传感器、可穿戴设备、环境监测

理解这些特定于上下文的模式,使设计者能够做出明智的决定,关于优先考虑哪些效率维度以及如何应对不可避免的权衡。

可扩展性与可持续性

系统效率是环境可持续性的驱动因素。当系统针对效率进行优化时,它们可以大规模部署,同时最小化环境影响。这种关系创造了一个正反馈循环,如图图 9.13 所示。

图 9.13:效率和可持续性反馈循环:优化的机器学习系统实现更大的可扩展性,这反过来又激励可持续设计实践和进一步的效率改进,从而形成一个增强反馈循环,对长期影响产生积极影响。

高效系统本质上具有可扩展性。通过轻量级模型、针对性数据集和优化的计算利用来减少资源需求,使系统能够广泛部署。当高效系统扩展时,它们通过减少整体能源消耗和计算浪费来放大其对可持续性的贡献。可持续性强化了对效率的需求,形成一个反馈循环,从而加强整个系统。

效率权衡与挑战

在有利条件下,三个效率维度可以协同工作,但现实世界中的系统经常面临改善一个维度会降低另一个维度的场景。使效率成为必要的相同资源限制迫使做出艰难的选择:减少模型大小可能会牺牲准确性,针对实时性能可能会增加能源消耗,以及精心制作更小的数据集可能会限制泛化。

效率权衡的基本来源

这些紧张关系以各种方式在机器学习系统中体现。理解其根本原因对于解决设计挑战至关重要。每个效率维度都会影响其他维度,形成一个动态的相互作用,从而塑造系统性能。

算法效率与计算需求

算法效率关注于设计紧凑的模型,以最小化计算和内存需求。通过减小模型大小或复杂性,在资源受限的设备上部署变得可行。过度简化模型可能会降低准确性,尤其是在复杂任务中。为了弥补这种损失,在训练或部署期间可能需要额外的计算资源,从而对计算效率造成压力。

计算效率与实时需求

计算效率旨在最小化训练和推理所需的资源,以减少能耗、处理时间和内存使用。在需要实时响应的场景(如自动驾驶汽车、增强现实)中,保持计算效率变得更加困难。图 9.14 展示了这一挑战:实时系统通常需要高性能硬件来即时处理数据,这与能源效率目标或增加系统成本相冲突。

图片

图 9.14:实时系统限制:自动驾驶汽车需要在计算效率和低延迟之间进行仔细的平衡。增加处理能力以减少延迟可能会与能源和成本限制相冲突,而牺牲延迟会通过增加反应时间和制动距离来降低安全性。

数据效率与模型泛化

数据效率旨在最小化训练模型所需的数据量,同时不牺牲性能。通过精心挑选更小、质量更高的数据集,训练过程变得更快且资源消耗更少。理想情况下,这可以同时加强算法和计算效率。然而,减小数据集大小可能会限制多样性,使得模型更难泛化到未见过的场景。为了解决这个问题,可能需要额外的计算资源或模型复杂性,从而在数据效率和更广泛系统目标之间产生紧张关系。

实践中的反复权衡模式

当考察特定场景时,效率维度之间的权衡变得尤为明显。具有数百万或数十亿参数的复杂模型可以通过捕捉复杂模式来实现更高的准确性,但需要大量的计算能力和内存。一个云数据中心中的推荐系统可能会使用高度复杂的模型以获得更好的推荐,但代价是更高的能耗和运营成本。在资源受限的设备如智能手机或自动驾驶汽车上,紧凑的模型可能运行效率较高,但需要更复杂的数据预处理或训练程序来补偿其减少的容量。

能效和实时性能通常将系统推向相反的方向。像自动驾驶汽车或增强现实应用这样的实时系统依赖于高性能硬件来快速处理大量数据,但这通常会增加能耗。自动驾驶汽车必须实时处理来自摄像头、激光雷达和雷达的传感器数据以做出导航决策,这需要消耗大量能量的专用加速器。在电池供电或能源有限的边缘部署中,这种权衡变得更加关键。

较大的数据集通常提供更大的多样性和覆盖范围,使模型能够捕捉细微的模式并降低过拟合风险。然而,在大数据集上训练的计算和内存需求可能很大。在资源受限的环境中,如 TinyML 部署,监测环境条件的物联网设备可能需要一个在不同条件下都能良好泛化的模型,但由于存储和计算限制,收集大量数据可能不切实际。较小、精心挑选的数据集或合成数据可以用来减少计算压力,但这也可能导致错过关键边缘情况。

这些权衡不仅仅是学术上的关注,而是塑造所有部署环境中系统设计决策的实际情况。

战略性权衡管理

机器学习系统设计中固有的权衡需要深思熟虑的策略来有效地导航。实现正确的平衡涉及受特定目标和部署环境约束的困难决策。

环境驱动的效率优先级

效率目标很少是普遍适用的。应用程序或部署场景的具体需求极大地影响了哪个维度——算法、计算或数据——优先。根据具体情况优先考虑正确的维度是有效管理权衡的第一步。

在移动机器学习部署中,电池寿命通常是主要约束,对计算效率提出了更高的要求。为了保持操作时间,必须最小化能耗,因此即使这意味着牺牲一些精度或需要额外的数据预处理,轻量级模型也被优先考虑。

在云机器学习系统中,可扩展性和吞吐量至关重要。这些系统必须处理大量数据并同时服务数百万用户。虽然计算资源更为丰富,但能效和运营成本仍然很重要。算法效率在确保系统可以扩展而不会压倒基础设施方面发挥着关键作用。

边缘机器学习系统有不同的优先级。自动驾驶汽车或实时监控系统需要低延迟处理以确保安全和可靠运行,这使得实时性能和计算效率至关重要,往往以能耗为代价。然而,硬件限制意味着这些系统仍需仔细管理能源和计算资源。

TinyML部署由于严重的硬件和能源限制,需要极高的效率。算法和数据效率是首要任务,模型高度紧凑,能够在具有最小内存和计算能力的微控制器上运行,而训练则依赖于小型、精心挑选的数据集。

推理过程中的动态资源分配

通过推理过程中的动态资源分配可以增强系统适应性。这种方法认识到资源需求即使在特定的部署环境中也可能波动。通过在推理时调整计算努力,系统可以微调性能以满足即时需求。

例如,一个基于云的视频分析系统可能会使用简化模型处理标准流以保持高吞吐量,但在检测到关键事件时,会动态分配更多资源给复杂模型以实现更高的精度。同样,移动语音助手可能会使用轻量级模型处理常规命令以节省电池,但在处理复杂查询时会临时激活资源密集型模型。

实现测试时计算引入了新的挑战。动态资源分配需要复杂的监控和控制机制。收益递减——计算能力超过一定阈值可能不会带来显著的性能提升。动态增加计算能力也可能导致高性能 AI 访问的不平等,引发公平性问题。尽管存在这些挑战,测试时计算仍然是提高系统适应性的宝贵策略。

端到端协同设计和自动化优化

高效的机器学习系统很少是孤立优化的产物。在效率维度上实现平衡需要端到端的协同设计视角,其中每个系统组件都是与其他组件一起设计的。这种整体方法使模型架构、硬件平台和数据管道能够无缝协同工作。

在资源受限的环境中,协同设计变得至关重要。模型必须与硬件能力精确匹配——8 位模型需要硬件对高效整数运算的支持,而剪枝模型则受益于稀疏张量运算。边缘加速器通常优化特定的操作,如卷积,这会影响模型架构的选择。详细的硬件架构考虑因素在第十一章中得到了全面覆盖。

自动化和优化工具有助于管理导航权衡的复杂性。自动化机器学习(AutoML)34 允许探索不同的模型架构和超参数配置。在第五章(ch011.xhtml#sec-ai-workflow)中介绍的系统化机器学习工作流程的基础上,AutoML 工具自动化了许多传统上需要大量手动调整的效率优化决策。

神经架构搜索(NAS)35 通过设计针对特定硬件或部署场景定制的模型架构,进一步推进了自动化,评估广泛的架构可能性,以最大化性能同时最小化计算需求。

数据效率也得益于自动化。自动化数据集整理、增强和主动学习的工具可以减少训练数据集的大小,同时不牺牲性能,优先考虑高价值数据点以加快训练并减少计算开销 (Settles 2012b)。第七章探讨了现代机器学习框架如何整合这些自动化能力。

测量和监控效率权衡

技术自动化之外,还存在着更广泛的系统评估挑战。效率优化需要一种结构化的方法来评估权衡,这种方法超越了纯粹的技术考虑。随着系统从研究过渡到生产,成功标准必须包括算法性能、经济可行性和运营可持续性。

效率改进相关的成本贯穿于工程努力(研究、实验、集成)中,与运行效率较低系统的持续运营费用相平衡。效益跨越多个领域——除了直接成本降低之外,高效的系统通常能够实现定性上的新能力,如资源受限环境中的实时处理或部署到边缘设备。

这个评估框架必须辅以持续的评估机制。生产中机器学习系统的动态特性需要持续监控效率特性。随着模型的发展、数据分布的变化和基础设施的变更,效率属性可能会退化。实时监控能够快速检测效率退化,而历史分析则提供了对长期趋势的洞察,揭示了在变化条件下效率改进是否可持续。

高效 AI 的工程原则

设计一个高效的机器学习系统需要一种全面的方法。真正的效率在于将整个系统作为一个整体来考虑,确保在 ML 管道的所有阶段(从数据收集到部署)的权衡都得到平衡。这种端到端视角改变了系统设计。

全面管道优化

效率不是通过孤立的优化实现的,而是通过将整个管道视为一个统一的整体来实现的。每个阶段——数据收集、模型训练、硬件部署和推理——都对整体系统效率做出贡献。一个阶段的决策会影响到其他阶段,从而影响性能、资源使用和可扩展性。

数据收集和预处理是起点。第六章提供了数据管道设计决策如何贯穿整个系统的全面概述。精心策划的小型、高质量数据集可以在训练期间降低计算成本,同时简化模型设计。然而,数据多样性不足可能会影响泛化能力,需要采取补偿措施。

模型训练是另一个关键阶段。架构选择、优化技术和超参数必须考虑部署硬件约束。为高性能云系统设计的模型可能强调准确性和可扩展性,而针对边缘设备的模型则必须在准确性与大小和能源效率之间取得平衡。

部署和推理需要精确的硬件对齐。每个平台都提供独特的功能——GPU 擅长并行矩阵运算,TPU 优化特定的神经网络计算,而微控制器提供节能处理。一个智能手机语音识别系统可能会利用 NPU 的专用卷积单元,在低功耗下实现毫秒级的推理,而自动驾驶车辆的 FPGA 则可以以微秒级的延迟处理多个传感器流。

终端到端的角度确保权衡得到全面解决,而不是在管道阶段之间转移低效率。这种系统思维方法在部署到资源受限的环境中尤为重要,如第十四章中所述。

生命周期和环境考虑因素

效率需求因生命周期阶段和部署环境而显著不同——从研究原型到生产系统,从高性能云到资源受限的边缘。

在研究中,主要关注的是模型性能,效率则处于次要位置。原型通过丰富的计算资源进行训练,这允许探索大型架构和广泛的超参数调整。生产系统必须优先考虑效率,以在实用约束条件下运行,这通常涉及重大的优化,如模型剪枝、量化或重新训练。生产还需要持续监控效率指标和运营框架,以在规模上管理权衡——综合生产效率管理策略在第十三章中详细阐述。

基于云的系统使用相对丰富的资源处理大量工作负载,尽管能源效率和运营成本仍然至关重要。第二章中涵盖的机器学习系统设计原则为构建可扩展、效率优化的云部署提供了架构基础。相比之下,边缘和移动系统在严格的约束下运行,这些约束在我们的效率框架中详细说明,需要优先考虑效率而非原始性能。

一些系统,如推荐引擎,需要频繁重新训练以保持有效性,严重依赖数据效率,包括具有积极标记的数据集和采样策略。其他系统,如医疗设备中的嵌入式模型,需要长期稳定性,更新最少。第十六章探讨了关键应用中的可靠性要求如何影响效率优化策略。

社会和伦理影响

虽然机器学习的效率通常被视为一个技术挑战,但它也与更广泛的关于 AI 系统目的和影响的问题密切相关。设计高效的系统不仅需要处理实际上的权衡,还需要考虑复杂的伦理和哲学问题。第十七章提供了一个全面框架,用于解决这些伦理问题。

平等与接入

效率有可能降低成本、提高可扩展性和扩大可接入性。然而,实现效率所需的资源——先进的硬件、精心挑选的数据集、最先进的优化技术——通常集中在资金充足的组织中,这导致了利用效率收益的不平等。

训练像 GPT-4 和 Gemini Ultra 这样的最先进模型的成本需要数千万美元的算力(Maslej 等人 2024)。OECD.AI的研究表明,全球 90%的 AI 算力集中在仅五个国家(OECD.AI 2021)。学术机构通常缺乏复制最先进结果所需的硬件,这阻碍了资金不足领域的创新。像 TinyML 或 Mobile ML 的加速器这样的节能计算技术为民主化提供了有希望的途径。通过在低成本、低功耗设备上实现强大的处理能力,这些技术使得没有高端基础设施的组织也能构建有影响力的系统。

在高质量数据集稀缺的地方,数据效率至关重要,但实现它并不均衡。为低资源语言开发的自然语言处理(NLP)因缺乏足够的训练数据而受到严重影响,导致性能差距显著。像 Masakhane 项目这样的努力,为非洲语言建立开源数据集,展示了协作倡议如何解决这个问题,尽管在全球范围内进行扩展需要更大的投资。民主化数据效率需要更开放地共享预训练模型和数据集。像 Hugging Face 的开放访问 transformers 或 Meta 的“没有语言被落下”这样的倡议旨在使最先进的 NLP 模型在全球范围内可用,降低数据稀缺地区的障碍。

算法效率在通过使低成本、资源受限的设备具备高级功能来民主化机器学习方面发挥着至关重要的作用。智能手机上的 AI 诊断工具正在改变偏远地区的医疗保健,而低功耗的 TinyML 模型使得在没有可靠电力的地区进行环境监测成为可能。

类似于TensorFlow LitePyTorch Mobile这样的技术允许开发者将轻量级模型部署到日常设备上,在资源受限的环境中扩大了访问权限。共享预先优化的模型(如 MobileNet 或 EfficientNet)的开源努力通过允许资源不足的组织部署最先进解决方案发挥了关键作用。

平衡创新与效率的需求

追求效率往往在优化已知内容与探索新内容之间产生紧张关系。这种紧张关系加剧了公平性问题:资金充足的组织的资源集中使得他们能够进行昂贵的探索性研究,而资源受限的机构必须专注于渐进式改进,优先考虑效率而非新颖性。

效率通常有利于经过验证的成熟技术。通过剪枝、量化或蒸馏来优化神经网络通常是对现有架构的改进,而不是开发全新的架构。考虑从传统机器学习到深度学习的转变:1990 年代到 2000 年代早期的神经网络研究需要大量资源,并且往往无法超越更简单的方法,但研究人员坚持不懈,最终导致了定义现代人工智能的突破。

开创性研究往往需要大量资源。像 GPT-4 或 PaLM 这样的大型语言模型本身并不高效——它们的训练消耗了巨大的计算和能源。然而,这些模型开辟了全新的可能性,促使进步最终导致更高效的系统,如更小的微调版本。

这种对资源密集型创新的依赖引发了关于谁能够参与的问题。资金充足的机构能够承担探索新领域,而较小的机构可能只能局限于渐进式改进,优先考虑效率而非新颖性。

以效率为导向的设计通常需要遵守严格的约束,如减少模型大小或延迟。虽然约束可以激发创新,但它们也可能限制探索范围。然而,对效率的追求可以积极影响创新——约束迫使创造性思考,导致在紧张的资源配置预算内最大化性能的新方法。例如,NAS(神经架构搜索)和注意力机制的出现部分源于平衡性能和效率的需求。

组织和研究人员必须认识到何时应优先考虑效率,何时应接受实验风险。适用于现实世界部署的应用系统可能需要严格的效率,而探索性研究实验室可以专注于推动边界。创新与效率之间的关系不是对抗性的,而是互补性的——高效的系统为可扩展的应用程序奠定基础,而资源密集型的实验推动突破,重新定义了可能性的界限。

优化限制

公平、创新和效率之间的紧张关系最终源于优化的一个基本特征:收益递减。优化对于构建高效的机器学习系统至关重要,但它并非无限。随着系统变得更加精细,每次额外的改进都需要指数级更多的努力、时间或资源,同时带来的好处越来越小。

优化(No Free Lunch,NFL)定理 36 说明了固有的局限性。根据 NFL 定理,没有单个优化算法可以在所有可能的问题上优于所有其他算法,这意味着优化技术的高效性高度依赖于特定问题(Wolpert 和 Macready 1997)。

例如,压缩机器学习模型可以最初显著减少内存和计算需求,同时最小化精度损失。然而,随着压缩的进行,保持性能变得越来越具有挑战性。实现额外的收益可能需要诸如针对特定硬件的优化或广泛的重新训练等复杂技术,增加复杂性和成本。这些成本不仅包括财务投资,还包括时间、专业知识、迭代测试,以及在鲁棒性和泛化性之间可能存在的权衡。

NFL(No Free Lunch)定理强调了不存在通用的优化解决方案,强调了在追求效率的同时需要考虑实际因素。过度优化可能导致资源浪费和适应性降低,复杂化未来的更新。确定系统何时“足够好”可以确保资源得到有效分配。

同样,为了提高训练效率而优化数据集可能最初会节省资源,但过度减少数据集大小可能会损害多样性和削弱泛化能力。将硬件性能推至极限可能会提高诸如延迟等指标,但相关的可靠性和工程成本可能会超过收益。

理解优化极限对于创建平衡效率、实用性和可持续性的系统至关重要。这种观点有助于避免过度优化,并确保资源投资于具有实质性回报的领域。

摩尔定律案例研究

优化极限的最有洞察力的例子之一出现在摩尔定律及其背后的经济曲线上。虽然摩尔定律因其作为指数计算能力增长预测者的角色而受到赞誉,但其成功依赖于复杂的经济平衡。集成度与成本之间的关系为机器学习优化中的收益递减提供了一个引人入胜的类比。

图 9.15 展示了随着集成电路中组件数量的增加,每个组件的相对制造成本。最初,随着越来越多的组件被集成到芯片上,每个组件的成本会因规模经济而降低——更高的集成度减少了封装和互连的需求。从数百个组件增加到数千个组件,成本大幅降低,性能得到提升 (G. Moore 2021)。

图 9.15: 摩尔定律的经济效应:最初,每个组件的制造成本下降推动了集成电路复杂性的指数级增长,但最终收益递减限制了成本的进一步降低。这种关系反映了机器学习中优化挑战的优化问题,其中模型复杂性的增加相对于计算成本而言,性能提升逐渐减少。来源:(G. Moore 2021)。

然而,随着集成度的继续提高,曲线开始上升。更紧密地封装在一起的组件面临可靠性问题,如散热增加和信号干扰。解决这些问题需要更复杂的制造技术——先进的光刻、纠错、改进的材料——增加了复杂性和成本。这个 U 形曲线捕捉了基本权衡:早期的改进带来了实质性的好处,但超过某个点,每个额外的收益都伴随着更高的成本。

这些动态反映了机器学习优化挑战。压缩深度学习模型以减小尺寸和能耗遵循类似的轨迹。初始优化,如剪枝冗余参数或降低精度,通常会导致显著的节省,同时对准确性的影响最小。然而,随着压缩的进行,性能损失变得更加难以恢复。量化或针对特定硬件的调整等技术可以恢复一些性能,但这些增加了复杂性和成本。

类似地,在数据效率方面,减少训练数据集的大小最初往往可以提高计算效率。然而,随着数据集进一步缩小,它们可能会失去多样性,损害泛化能力。解决这个问题通常需要合成数据或复杂的增强,这需要额外的工程努力。

摩尔定律的图表作为一个视觉提醒,表明优化并非无限。成本效益平衡总是依赖于具体情境,而收益递减的点会根据系统目标和限制而变化。机器学习从业者,如半导体工程师,必须确定何时进一步的优化不再提供有意义的效益。过度优化可能导致资源浪费、适应性降低,以及系统过度专门化于初始条件。

谬误与陷阱

在人工智能系统中,效率涉及在多个竞争目标之间进行复杂的权衡,这些目标往往朝不同的方向拉扯。扩展定律的数学优雅可能会产生关于可预测优化路径的虚假信心,而多样化的部署环境要求会产生关于通用效率策略的误解。

谬误: 效率优化总是能提升系统性能的所有指标。

这种误解导致团队在未理解权衡和副作用的情况下应用效率技术。为了计算效率而优化可能会降低准确性,提高内存效率可能会增加延迟,而减小模型大小通常需要更复杂的训练过程。在一个维度上的效率提升往往在其他维度上产生成本,这些成本在特定场景中可能是不可以接受的。有效的效率优化需要仔细分析哪些指标最重要,并接受某些性能方面必然会被牺牲。

陷阱: 假设扩展定律可以线性预测所有模型大小的效率要求。

团队常常基于扩展定律关系外推效率要求,而没有考虑这些定律不再适用的断裂点。扩展定律对于适度的增加是有用的指导,但未能考虑到在极端规模出现的涌现行为、架构限制和基础设施限制。将扩展定律预测应用于验证范围之外可能导致资源估计严重不准确和部署失败。成功的效率规划需要理解扩展定律框架的效用和限制。

谬误: 边缘部署的效率要求仅仅是云要求的缩小版。

这种信念假设边缘部署仅仅是云部署,只是模型更小,计算更少。边缘环境引入了质的不同限制,包括实时处理需求、功耗限制、热管理需求以及连接性变化。在云环境中有效的优化策略在边缘环境中往往失败得非常惨重。边缘效率需要不同的方法,优先考虑可预测的性能、能源效率和在不同条件下的稳健运行。

陷阱: 专注于算法效率,而忽略系统级效率因素。

许多从业者优化算法复杂度指标,如 FLOPs 或参数计数,而没有考虑这些改进如何转化为实际系统性能。实际系统效率取决于内存访问模式、数据移动成本、硬件利用特性以及可能与理论复杂度指标不相关的软件堆栈开销。具有较少参数的模型可能由于不规则的内存访问模式或较差的硬件映射而表现得更差。全面的效率优化需要衡量和优化实际系统性能,而不仅仅依赖于算法复杂度指标。

摘要

效率已成为一种设计原则,它改变了我们对待机器学习系统的方式,超越了简单的性能优化,转向全面资源管理。本章揭示了规模定律如何提供实证见解,深入到模型性能与计算资源之间的关系,将效率确立为战略优势,使更广泛的可访问性、可持续性和创新成为可能。算法、计算和数据效率之间的相互依赖性创造了一个复杂的景观,其中某一维度的决策会影响到整个系统,需要从整体视角平衡整个机器学习管道中的权衡。

设计高效系统的实际挑战突出了情境感知决策的重要性,其中部署环境塑造了效率优先级。云系统利用丰富的资源实现可扩展性和吞吐量,而边缘部署在严格的电源限制内优化实时性能,而 TinyML 应用将最小资源下可实现的边界推向极限。这些不同的需求要求复杂的策略,包括端到端协同设计、自动化优化工具以及基于操作约束的谨慎优先级排序。规模定律崩溃和创新与效率之间的紧张关系强调了最佳系统设计不仅需要解决技术权衡,还需要考虑更广泛的公平性、可持续性和长期影响。

关键要点

  • 效率是一种战略推动者,它使不同部署环境下的 AI 能力普及化

  • 规模定律为资源分配提供了预测框架,但它们的局限性揭示了架构创新的机遇

  • 算法、计算和数据效率之间的权衡相互关联且取决于具体情境,需要整体优化策略

  • 自动化工具和端到端协同设计方法可以将效率限制转化为系统协同的机会

在建立了三支柱效率框架并探讨了作为资源分配定量基础的比例定律之后,接下来的章节提供了在每个维度上实现效率的具体工程技术。第十章通过系统地降低模型复杂性的同时保持性能来关注算法效率。该章节涵盖了降低数值精度的量化技术、消除冗余参数的剪枝方法以及将能力从大型模型转移到较小模型的知识蒸馏方法。

第十一章通过探讨专用硬件和优化软件实现如何最大化每单位计算资源的性能来处理计算效率问题。主题包括 GPU 优化、AI 加速器架构以及提高吞吐量和降低延迟的系统级优化。第十二章提供了量化所有三个维度效率提升的测量方法,涵盖了性能评估框架、能量测量技术和比较分析方法。

从原则到具体技术再到测量方法的发展过程反映了实现机器学习系统中实际效率所需的系统化工程方法。每一章都建立在在此建立的基础理解之上,创建了一个全面的性能工程工具包,该工具包解决了定义高效 AI 系统设计的复杂、相互关联的权衡。

这些效率原则为在第十章中探讨的具体优化技术奠定了基础,该章节详细介绍了量化、剪枝和知识蒸馏的算法,为实现此处概述的效率目标提供了具体工具。随着机器学习系统在复杂性和范围上的持续扩展,高效设计的原则对于创建不仅性能出色而且可持续、可访问且与更广泛的社会目标——负责任的 AI 发展目标相一致的系统仍然至关重要。


模型优化

DALL·E 3 提示:展示一个作为繁忙建筑工地表示的神经网络模型,有各种族、男女各种族的建设工人,被标记为‘剪枝’、‘量化’和‘稀疏性’。他们共同努力使神经网络更高效、更小,同时保持高精度。‘剪枝’工人,一位西班牙裔女性,正在从网络的中间剪除不必要的连接。‘量化’工人,一位白人男性,正在调整或微调所有地方的权重。‘稀疏性’工人,一位非洲裔女性,正在移除不必要的节点以缩小模型。背景中有建筑卡车和起重机,协助工人完成任务。神经网络在视觉上从复杂的大型结构转变为更简洁、更小的结构。

图片

目的

研究优化模型与生产部署约束之间的不匹配如何在机器学习系统中创造关键工程挑战?

机器学习研究优先考虑精度,产生了在需要的地方无法部署的卓越性能模型:资源受限的移动设备、成本敏感的云环境或延迟关键的前端应用。模型优化连接了理论能力和实际部署,将计算密集型研究模型转化为高效系统,在满足对内存、能源、延迟和成本严格的约束的同时保持性能。没有系统化的优化技术,高级人工智能能力仍然被困在研究实验室中。理解优化原理使工程师能够通过使复杂模型在多样化的部署环境中可访问,从而民主化人工智能能力,从在移动设备上运行的数十亿参数语言模型到嵌入式传感器。

学习目标

  • 比较包括剪枝、量化、知识蒸馏和神经架构搜索在内的模型优化技术,从其机制和应用方面进行比较

  • 评估数值精度级别与其对模型精度、能耗和硬件兼容性的影响之间的权衡

  • 将三分优化框架(模型表示、数值精度、架构效率)应用于设计针对特定硬件约束的部署策略

  • 分析硬件感知设计原则如何影响模型架构决策和不同部署平台上的计算效率

  • 实施稀疏性利用和动态计算技术,在管理精度保持的同时提高推理性能

  • 设计集成优化管道,结合多种技术,在资源约束内实现特定的部署目标

  • 评估自动化优化方法及其在发现超出手动调整之外的新优化策略中的作用

模型优化基础

成功部署机器学习系统需要解决模型复杂性与计算可行性之间的紧张关系。当代机器学习研究产生了越来越强大的模型,其资源需求往往超过了现实世界部署环境的实际限制。这代表了将理论进步转化为可行系统的经典工程挑战,影响了机器学习应用的可用性和可扩展性。

这种资源差距的幅度是巨大的,并且是多方面的。最先进的语言模型可能需要数百 GB 的内存来存储全精度参数(T. B. Brown, Mann, Ryder, Subbiah, Kaplan, Dhariwal, Neelakantan, Shyam, Saxena, 等人 2020;Chowdhery 等人 2022),而目标部署平台如移动设备通常只提供几 GB 的可用内存。这种差异不仅限于内存限制,还包括计算吞吐量、能耗和延迟要求。部署环境的异构性质进一步加剧了这一挑战,每个环境都施加独特的约束和性能要求。

生产型机器学习系统运行在一个复杂的优化景观中,该景观由多个、通常是冲突的性能目标组成。实时应用施加严格的延迟限制,移动部署需要节能以保护电池寿命,嵌入式系统必须在热约束范围内运行,而云服务需要在大规模上实现成本效益的资源利用。这些限制共同定义了一个多目标优化问题,需要系统的方法来实现所有相关性能维度的满意解决方案。

模型优化是对机器学习模型进行系统性的转换,以最大化计算效率同时保持任务性能,使部署能够跨越多样化的硬件约束

模型优化这一工程学科已经通过将算法创新与硬件感知设计原则相结合的系统方法来应对这些挑战。有效的优化策略需要深入理解模型架构、数值精度、计算模式和目标硬件特性之间的相互作用。这种跨学科的方法将优化从一种临时的技术集合转变为一个由理论基础和经验验证指导的原则性工程学科。

本章建立了一个围绕三个相互关联维度构建的全面理论和实践框架,这三个维度是:模型表示中的结构效率、通过精度优化实现的数值效率以及通过硬件感知实现计算效率。通过这个框架,我们研究了量化等现有技术如何实现内存减少和推理加速,剪枝方法如何消除参数冗余同时保持模型精度,以及知识蒸馏如何使复杂模型到高效架构的能力迁移。总体目标超越了简单的性能指标,使复杂的机器学习能力能够在整个计算环境和应用领域得到部署。

优化框架

优化过程通过三个相互关联的维度进行,这些维度将软件算法与硬件执行连接起来,如图 10.1 所示。图 10.1 展示了这些维度及其关系,理解这些维度及其关系为本章探讨的所有技术提供了概念基础。

优化框架图

图 10.1:优化栈:模型优化通过三个层次(高效模型表示、高效数值表示和高效硬件实现)进行,每个层次都针对系统性能和资源利用的不同方面。这些层次允许在模型精度、计算成本和内存占用之间进行结构化权衡,以满足不同部署环境的需求。

理解这些层之间的相互作用揭示了优化工程的系统性。模型表示技术(剪枝、蒸馏、结构化近似)降低计算复杂性,同时为数值精度优化创造机会。量化和低精度算术利用硬件能力实现更快执行,而架构效率技术使计算模式与处理器设计相匹配。软件优化通过创建结构化、可预测的工作负载,为硬件加速奠定基础,这些工作负载可以由专用处理器高效执行。

本章从工程角度审视每个优化层,提供了量化(训练后量化和量化感知训练)、剪枝策略(基于幅度、结构化和动态)以及蒸馏程序(温度缩放、特征迁移)的具体算法。我们探讨了这些技术如何协同作用,以及它们的有效性如何依赖于目标硬件特性。该框架指导系统性的优化决策,确保模型转换与部署约束相一致,同时保留基本功能。

本章通过系统地应用优化原则,将早期基础中的效率概念转化为可操作的工程实践。掌握量化、剪枝和蒸馏技术为从业者提供了部署复杂机器学习模型到各种计算环境的基本工具。所提出的优化框架弥合了理论模型能力与实际部署需求之间的差距,使机器学习系统能在现实应用中提供性能和效率。

部署环境

机器学习模型作为更大系统的一部分运行,具有复杂的约束、依赖和权衡。模型优化不能被视为一个纯粹算法问题;它必须被视为一个系统级挑战,需要考虑计算效率、可扩展性、部署可行性和整体系统性能。第十三章中的操作原则为理解模型优化的系统视角提供了基础,强调了优化为何重要,驱动优化努力的约束关键,以及定义有效优化策略的原则。

实际部署

现代机器学习模型在基准数据集上通常能实现令人印象深刻的准确性,但使它们适用于实际应用远非易事。机器学习系统在计算、内存、延迟和能源约束下运行,这些约束对训练和推理都有重大影响 (Choudhary et al. 2020)。在研究环境中表现良好的模型,在集成到更广泛的系统中时可能证明不切实际,无论部署环境包括云环境、智能手机集成还是微控制器实现。

除了这些部署复杂性之外,实际可行性包括训练、存储和执行效率,而不仅仅是准确性。1

效率要求在不同部署环境中表现不同。在大规模云机器学习设置中,优化模型有助于最小化训练时间、计算成本和功耗,使大规模人工智能工作负载更加高效 (Jeff Dean, Patterson, and Young 2018)。相比之下,边缘机器学习 2 要求模型在有限的计算资源下运行,需要优化以减少内存占用和计算复杂性。移动机器学习引入了额外的约束,如电池寿命和实时响应性,而微型机器学习 3 将效率推向极致,要求模型适应超低功耗设备的内存和处理限制 (C. R. Banbury et al. 2020)。

优化有助于可持续和可访问的人工智能部署,遵循在第十八章 Chapter 18 中确立的可持续性原则。随着人工智能工作负载的扩展,减少模型的能耗足迹非常重要,有助于减轻大规模机器学习训练和推理的环境影响(D. Patterson et al. 2021a)。同时,优化的模型可以扩大机器学习的应用范围,支持在资源匮乏的环境中的应用,从农村医疗保健到在野外运行的自主系统。

平衡权衡

准确性与效率之间的紧张关系推动了所有维度的优化决策。增加模型容量通常可以增强预测性能,同时增加计算成本,导致推理速度变慢,资源消耗更多。这些改进引入了与内存占用 4、推理延迟、功耗和训练效率相关的挑战。随着机器学习系统部署在广泛的硬件平台上,平衡准确性和效率成为模型优化中的关键挑战。

这种紧张关系在不同的部署环境中表现不同。训练需要与模型大小成比例的计算资源,而推理则要求实时应用中具有严格的延迟和功耗限制。

框架应用与导航

本节提供了将优化技术应用于实际问题的实用指导,探讨系统约束如何映射到优化维度,并提供了技术选择导航策略。

约束映射

了解系统约束如何映射到优化维度,在检查具体技术之前提供了一个导航框架。面对部署挑战时,这种映射指导实践者走向最相关的方法。内存带宽限制表明了模型表示和数值精度优化的关注领域,而延迟瓶颈则建议检查模型表示和架构效率技术。

表 10.1 总结了不同的系统约束如何映射到模型优化的三个核心维度。

表 10.1:优化维度:系统约束推动优化沿着三个核心维度——模型表示、数值精度和架构效率——进行,每个维度解决不同的资源限制和性能目标。该表将计算成本映射到精度和效率,内存/存储映射到表示和精度,延迟/吞吐量映射到表示和效率,指导选择适当的优化技术。

系统约束 模型表示 数值精度 架构效率
计算成本
内存和存储
延迟和吞吐量
能源效率
可扩展性

这种系统映射建立在第九章(ch015.xhtml#sec-efficient-ai)中确立的效率原则之上。在这里,我们特别关注通过具体技术实现这些效率原则的模型级优化。尽管每个系统约束主要与一个或多个优化维度相对应,但关系并非严格一对一。许多优化技术同时影响多个约束。沿着这三个维度构建模型优化并将技术映射到特定的系统约束,使从业者能够更有效地分析权衡并选择与部署要求最佳匹配的优化。

导航策略

本章介绍了一套全面的优化技术工具包,涵盖了模型表示、数值精度和架构效率。然而,并非所有技术都适用于每个问题,而且种类繁多可能会让人感到不知所措。本导航指南帮助您根据具体的约束和目标确定从哪里开始。

表 10.1 识别了哪些优化维度针对特定的瓶颈。内存或模型大小限制表明应关注模型表示和数值精度技术,这些技术可以减少参数数量和位宽。推理延迟需求表明应检查模型表示和架构效率方法,这些方法可以减少计算工作量并提高硬件利用率。训练或推理成本约束优先考虑数值精度和架构效率方法,这些方法可以最小化每操作的计算成本。不接受的精度下降表明应将训练感知优化技术集成到训练过程中,而不是事后应用。

生产系统通常遵循既定模式,而不是随机技术探索。快速部署方法应用后训练修改,需要最少的代码更改,在几小时内实现 4-8 倍的压缩,精度损失在 1-2% (Gholami 等人 2021;Nagel 等人 2021a)。生产级优化按顺序结合多种技术(减少参数,通过训练细化恢复精度,然后应用量化),在几周内实现 8-15 倍的压缩,精度损失小于 1%。针对小于 1MB 模型的极端约束场景需要从开始就进行架构更改,包括自动架构发现和超低精度,这需要数月的专门工程。

模型优化代表的是一个系统工程挑战,而不是一个通用的解决方案。优化的好处高度依赖于目标硬件,相同的量化技术在专用加速器上可以实现 4 倍的速度提升,而在通用处理器上只能实现 1.5 倍(Jacob 等人 2018b;Krishnamoorthi 2018)。准确性的保持因模型架构和任务而异,因为视觉模型通常比语言模型更能有效地容忍激进优化。优化需要迭代测量而不是单一应用。当数据预处理或网络 I/O 主导延迟时,系统级瓶颈可能会限制好处,使得模型优化效果最小化。在优化投资之前进行系统级分析仍然至关重要(在策略和实施部分详细说明)。

这章全面支持非线性阅读方法。部署现有模型的 ML 工程师可以从数值精度部分的训练后技术中受益,这些技术通过最小的代码更改提供快速改进。研究人员和高级实践者需要进行彻底的审查,特别关注数学公式和集成原理。对优化新接触的学生来说,遵循渐进的复杂性标记是有益的,从基础技术到高级方法,从基本概念到专用算法。每个主要部分都是系统地从易到难的方法构建的。

优化维度

每个优化维度都值得详细审查。如图 10.1 图所示,模型表示优化减少了需要执行的计算,数值精度优化改变了计算执行的方式,而架构效率优化确保操作在目标硬件上高效运行。

模型表示

第一个维度,模型表示优化,专注于消除机器学习模型结构中的冗余。大型模型通常包含过多的参数 5,这些参数对整体性能贡献不大,但会显著增加内存占用和计算成本。优化模型表示涉及的技术包括去除不必要的组件同时保持预测准确性。这些技术包括剪枝、知识蒸馏和自动架构搜索方法,这些方法可以细化模型结构以平衡效率和准确性。这些优化主要影响模型在算法层面的设计,确保它们在计算上可管理的同时保持有效性。

数值精度

虽然表示技术修改了执行的计算,但精度优化通过降低权重、激活和算术操作的数值精度来改变这些计算的执行方式。第二个维度,数值精度优化,关注机器学习模型中数值的表示和处理方式。本节中详细介绍的精度优化技术解决了这些效率挑战。量化技术将高精度权重和激活映射到低比特表示,使得在 GPU、TPU 和专用 AI 芯片等硬件加速器上高效执行成为可能(第十一章)。混合精度训练 6 在训练过程中动态调整精度水平,在效率和精度之间取得平衡。

仔细的数值精度优化可以在保持可接受的精度水平的同时,显著降低计算成本,在资源受限的环境中提供复杂的模型访问。

架构效率

第三维,架构效率,关注训练和推理期间的计算性能效率。当执行仍然不理想时,良好的模型结构证明是不够的。许多机器学习模型在其计算图中包含冗余,导致操作调度和执行的不效率。稀疏性 7 代表了一种关键的架构效率技术,其中模型利用零值参数来减少计算。

架构效率涉及利用模型权重和激活中的稀疏性,将大型计算组件分解成更有效的形式 8,并根据输入复杂性动态调整计算的技术。

这些架构优化方法提高了不同硬件平台上的执行效率,降低了延迟和功耗。这些效率原则自然地扩展到训练场景,其中梯度检查点和低秩适应 9 等技术有助于减少内存开销和计算需求。

三维优化框架

当检查技术交互时,这个三维框架的相互关联性显现出来。剪枝主要解决模型表示问题,但通过减少推理操作也影响了架构效率。量化主要关注数值精度,但会影响内存占用和执行效率。理解这些相互依赖关系可以使得优化组合达到最佳。

这种相互关联的特性意味着优化选择是由系统约束驱动的,这些约束定义了模型必须在其内运行的实用限制。在数据中心部署的机器学习模型与在移动设备或嵌入式系统上运行的模型有不同的约束。计算成本、内存使用、推理延迟和能效都会影响针对特定场景最合适的优化方案。对于资源受限的设备来说,如果模型过大,可能需要进行激进的剪枝和量化,而对于对延迟敏感的应用程序,可能从算子融合 10 和硬件感知调度中受益。

在表 10.1 中建立的约束-维度映射展示了优化策略与现实世界约束之间的相互依赖性。这些关系超越了一对一的对应关系,因为许多优化技术同时影响多个约束。

对每个维度的系统审查从模型表示优化开始,包括修改神经网络结构和参数以消除冗余同时保持准确性的技术。

结构化模型优化方法

模型表示优化通过修改神经网络结构和参数来提高效率同时保持准确性。现代模型通常优先考虑准确性而不是效率,包含过多的参数,这增加了成本并减慢了推理速度。这种优化通过两个目标来解决低效:消除冗余(利用过度参数化,即模型在更少的参数下也能达到相似的性能)以及通过梯度检查点 11 和并行处理模式 12 等技术对计算进行结构化以实现高效的硬件执行。

优化挑战在于平衡相互竞争的约束 13。激进的压缩可能会降低准确性,使得模型在生产使用中不可靠,而优化不足则可能导致模型过大或运行速度过慢,不适合目标部署环境。选择适当的技术需要理解模型大小、计算复杂性和泛化性能之间的权衡。

三种关键技术应对这一挑战:剪枝消除低影响参数,知识蒸馏将能力转移到更小的模型,而 NAS 针对特定约束自动化架构设计。每种技术提供独特的优化路径,同时保持模型性能。

这三种技术代表了我们优化框架中独特但互补的方法。剪枝和知识蒸馏减少了现有模型中的冗余,而 NAS 从底层构建优化架构。在许多情况下,它们可以结合使用,以实现更大的优化。

剪枝

存储墙限制了系统性能:随着模型变大,内存带宽成为瓶颈,而不是计算能力。修剪通过参数消除来降低内存需求,直接解决了这一限制。最先进的机器学习模型通常包含数百万或数十亿个参数,其中许多对最终预测的贡献很小。虽然大型模型增强了表示能力和泛化能力,但它们也引入了内存占用、计算成本和可扩展性的低效,这影响了在云、边缘和移动环境中的训练和部署。

为了保持准确度,参数的必要性差异很大。许多权重对决策过程的影响很小,通过去除这些权重可以实现显著的效率提升,而不会对性能造成实质性下降。这种冗余存在的原因是现代神经网络过度参数化严重,这意味着它们拥有的权重远多于解决任务所必需的。这种过度参数化在训练期间提供了多个优化路径,并有助于避免局部最小值,但在部署期间为压缩创造了机会。模型压缩通过来自第三章的信息论原理来保持性能,其中神经网络的过度参数化创造了压缩机会。这一观察结果促使人们进行修剪,这是一种优化技术,它系统地去除冗余参数,同时保持模型准确度。

修剪是一种模型优化技术,它从神经网络中去除冗余参数,同时保持性能,以减少模型大小计算成本,从而实现高效的部署。

修剪技术使得模型可以变得更小、更快、更高效,而无需重新设计架构。通过消除冗余,修剪直接解决了机器学习系统在内存、计算和可扩展性方面的限制,使其在跨不同硬件平台部署模型时变得至关重要。

现代框架提供了内置的 API,使得这些优化技术易于访问。PyTorch 提供了torch.nn.utils.prune用于修剪操作,而 TensorFlow 提供了模型优化工具包 14,其中包括tfmot.sparsity.keras.prune_low_magnitude()等函数。这些工具将复杂的研究算法转化为实用的函数调用,使得所有级别的从业者都能实现优化。

修剪示例

修剪可以通过系统性的示例来展示。修剪识别对模型预测贡献最小的权重,并在保持准确度的同时去除它们。最直观的方法是检查权重的大小,因为绝对值较小的权重通常对输出影响很小,因此它们是移除的候选者。

代码列表 10.1 演示了在 3×3 权重矩阵上基于幅度的剪枝,展示了如何通过简单的阈值规则创建稀疏性。

代码列表 10.1:基于幅度的剪枝:移除低于阈值的权重以创建稀疏矩阵,将非零参数的数量从 9 减少到 4。

import torch
import torch.nn.utils.prune as prune

# Original dense weight matrix
weights = torch.tensor(
    [[0.8, 0.1, -0.7], [0.05, -0.9, 0.03], [-0.6, 0.02, 0.4]]
)

# Simple magnitude-based pruning: remove weights with magnitude < 0.5
threshold = 0.5
mask = torch.abs(weights) >= threshold
pruned_weights = weights * mask

print("Original:", weights)
print("Pruned:", pruned_weights)
# Result: 4 out of 9 weights remain (56% sparsity)

这个例子说明了核心剪枝目标:在保持模型性能的同时最小化参数数量。我们将非零参数从 9 减少到 4(仅保留 4 个权重,因此预算为k=4k=4)。幅度最小的权重(0.4, 0.1, 0.05, 0.03, 0.02)被移除,而幅度最大的四个权重(0.8, -0.7, -0.9, -0.6)被保留。

将这种直觉扩展到完整的神经网络需要考虑两个问题:要移除多少个参数(稀疏度水平)以及要移除哪些参数(选择标准)。接下来的可视化展示了这一过程在更大的权重矩阵上的应用。

如图 10.2 所示,剪枝通过消除小幅度值来减少非零权重数量,将密集的权重矩阵转换为稀疏表示。这种对稀疏性的显式强制与我们的优化公式中的0\ell_0-范数约束相一致。

图 10.2:稀疏矩阵转换:剪枝移除小幅度权重(在右侧矩阵中显示为白色/零),同时保留大幅度权重(以颜色显示),创建一个既减少内存使用和计算,又保持模型精度的稀疏表示。

数学公式

剪枝的目标可以简单地陈述:我们希望找到我们的模型版本,它具有最少的非零权重(最小尺寸),同时引起预测误差(损失)的最小增加。这个直观的目标转化为一个数学优化问题,指导实际的剪枝算法。

剪枝过程可以形式化为一个优化问题。给定一个具有参数WW的训练模型,我们寻求一个稀疏版本Ŵ\hat{W},它仅保留最重要的参数。目标被表达为:

minŴ(Ŵ)subject toŴ0k \min_{\hat{W}} \mathcal{L}(\hat{W}) \quad \text{subject to} \quad |\hat{W}|_0 \leq k

其中,(Ŵ)\mathcal{L}(\hat{W}) 表示剪枝后的模型损失函数,Ŵ\hat{W} 表示剪枝模型的参数,Ŵ0|\hat{W}|_0 是 L0 范数(非零参数的数量),而kk 是约束最大模型大小的参数预算。

L0 范数直接通过计数非零参数来衡量模型大小,这决定了内存使用和计算成本。然而,L0 范数最小化是 NP 难的,这使得这种优化具有挑战性。实际的剪枝算法使用基于幅度的选择、基于梯度的重要性或二阶敏感性等启发式方法来有效地近似解。

在列表 10.1 中,这个约束变得具体:我们将Ŵ0|\hat{W}|_0从 9 减少到 4(满足k=4k=4),使用幅度阈值作为我们的选择启发式方法。使用 L1 或 L2 范数的替代公式鼓励小的权重,但不能保证精确为零,没有明确的阈值就无法减少实际的内存或计算。

为了使剪枝在计算上可行,实际方法用软正则化项替换了硬约束:minW(W)+λW1 \min_W \mathcal{L}(W) + \lambda | W |_1 其中 λ\lambda 控制稀疏度。1\ell_1-范数鼓励较小的权重值并促进稀疏性,但并不严格强制零值。其他方法使用迭代启发式算法,在连续步骤中剪除幅度最小的参数,随后进行微调以恢复丢失的精度 (Gale, Elsen, and Hooker 2019a; Labarge, n.d.)。

目标结构

剪枝方法根据从神经网络中移除的结构而有所不同。主要目标包括神经元、通道和层,每个都对模型的架构和性能有独特的含义。

  • 神经元剪枝移除整个神经元及其相关的权重和偏差,从而减少层的宽度。这种技术通常应用于全连接层。

  • 通道剪枝(或称为滤波器剪枝),在卷积神经网络中常用,它消除了整个通道或滤波器。这减少了特征图的深度,影响了网络提取某些特征的能力。通道剪枝在图像处理任务中尤其有价值,在这些任务中,计算效率是首要考虑的因素。

  • 层剪枝从网络中移除整个层,显著减少深度。虽然这种方法可以带来显著的效率提升,但它需要仔细平衡,以确保模型保留足够的容量来捕捉复杂模式。

图 10.3 展示了通道剪枝和层剪枝之间的差异。当剪枝一个通道时,模型的架构必须调整以适应结构变化。具体来说,后续层的输入通道数量必须修改,需要改变应用于移除通道的层的滤波器深度。相比之下,层剪枝移除层中的所有通道,需要更大的架构修改。在这种情况下,必须重新配置剩余层之间的连接以绕过移除的层。无论采用哪种剪枝方法,微调都是重要的,以适应剩余网络并恢复性能。

图 10.3:剪枝策略:通道剪枝调整层内的滤波器大小,而层剪枝则移除整个层,并需要重新连接剩余的网络组件。这些方法可以减少模型大小和计算成本,但需要微调以减轻由于模型容量减少而导致的性能损失。

无结构剪枝

无结构剪枝在保留整体网络架构的同时移除单个权重。在训练过程中,一些连接变得冗余,对最终计算贡献甚微。剪除这些弱连接可以减少内存需求,同时保留模型的大部分精度。

无结构剪枝的数学基础有助于理解稀疏性是如何系统地引入的。从数学上讲,无结构剪枝将稀疏性引入神经网络的权重矩阵中。用 Wm×nW \in \mathbb{R}^{m \times n} 表示网络给定层的权重矩阵。剪枝通过应用二进制掩码 M{0,1}m×nM \in {0,1}^{m \times n} 来移除权重的一个子集,从而得到剪枝后的权重矩阵:Ŵ=MW \hat{W} = M \odot W 其中 \odot 表示逐元素 Hadamard 积。掩码 MM 是基于剪枝标准构建的,通常是权重幅度。一种常见的方法是基于幅度的剪枝,它移除幅度最低的权重的一部分。这是通过定义一个阈值 τ\tau 来实现的,使得:Mi,j={1,if |Wi,j|>τ0,otherwise M_{i,j} = \begin{cases} 1, & \text{if } |W_{i,j}| > \tau \ 0, & \text{otherwise} \end{cases} 其中 τ\tau 被选择以确保只有最大的 (1s)(1 - s) 权重分数保留。这种方法假设较大的幅度权重对网络的函数贡献更多,因此它们更适合保留。

非结构化剪枝的主要优势是内存效率。通过减少非零参数的数量,剪枝模型需要更少的存储空间,这在将模型部署到内存有限的嵌入式或移动设备时尤其有益。

然而,非结构化剪枝并不一定能在现代机器学习硬件上提高计算效率。标准 GPU 和 TPU 针对密集矩阵乘法进行了优化,而稀疏权重矩阵通常无法充分利用硬件加速,除非有专门的稀疏计算内核。因此,非结构化剪枝主要有利于模型存储,而不是推理加速。虽然非结构化剪枝在参数级别上提高了模型效率,但它并没有改变网络的架构组织。

结构化剪枝

与非结构化剪枝从神经网络中移除单个权重不同,结构化剪枝 15 移除整个计算单元,例如神经元、滤波器、通道或层。这种方法特别有利于硬件效率,因为它产生了更小的密集模型,可以直接映射到现代机器学习加速器。与需要专用执行内核来利用计算优势的非结构化剪枝不同,结构化剪枝通过减少网络架构的整体大小,在通用硬件上实现更有效的推理。

结构化剪枝的动机源于观察到的现象:并非所有神经元、滤波器或层对模型预测的贡献程度相同。一些单元主要携带冗余或低影响的信息,移除它们不会显著降低模型性能。挑战在于识别哪些结构可以被剪枝同时保持准确性。

图 10.4 展示了非结构化剪枝和结构化剪枝之间的关键差异。在左侧,非结构化剪枝移除单个权重(表示为虚线连接),创建了一个稀疏权重矩阵。这可能会破坏原始网络结构,如图所示,在完全连接的网络中,某些连接已被随机剪枝。虽然这减少了活跃参数的数量,但结果稀疏性需要专用执行内核才能充分利用计算优势。

与之相反,结构化剪枝(如图中中间和右侧部分所示)在保留网络整体结构的同时移除整个神经元或滤波器。在中间部分,剪枝后的全连接网络保持了其全连接的特性,但神经元数量减少。在右侧,结构化剪枝应用于卷积神经网络(CNN),通过移除卷积核或整个通道(虚线方块)来实现。这种方法在保持 CNN 核心卷积操作的同时减少了计算负担,使其更兼容硬件加速器。

图片

图 10.4:剪枝策略:非结构化剪枝通过移除单个权重来实现稀疏性,需要专用硬件进行高效计算,而结构化剪枝移除整个神经元或滤波器,保留网络结构,并允许在标准硬件上加速。此图对比了两种方法产生的权重矩阵和网络架构,突出了稀疏程度和计算效率之间的权衡。来源:(C. Qi 等 2021)。

结构化剪枝的常见方法是基于幅度的剪枝,其中根据相关权重的幅度移除整个神经元或滤波器。这种方法背后的直觉是,幅度较小的参数对模型输出的贡献较小,因此它们是消除的理想候选者。神经元或滤波器的重要性通常使用范数函数来衡量,例如对与该单元相关的权重应用1\ell_1-范数或2\ell_2-范数。如果范数低于预定义的阈值,则相应的神经元或滤波器将被剪枝。这种方法易于实现,并且除了在层间计算范数之外,不需要额外的计算开销。

另一种策略是激活基于的剪枝,它评估神经元或滤波器在数据集上的平均激活值。持续产生低激活的神经元对网络决策过程的贡献较小,可以安全地移除。这种方法捕捉了网络的动态行为,而不是仅仅依赖于静态的权重值。激活基于的剪枝需要在代表性数据集上对模型进行配置文件分析,以在剪枝决策之前估计平均激活幅度。

基于梯度的剪枝使用模型训练过程中的信息来识别不太重要的神经元或滤波器。关键思想是,梯度幅度较小的单元对减少损失函数的贡献较小,因此对学习的重要性较低。通过根据梯度值对神经元进行排名,结构化剪枝可以移除对模型优化影响最小的那些。与基于幅度或基于激活的剪枝不同,后者依赖于训练模型的静态属性,基于梯度的剪枝需要访问梯度计算,并且通常在训练期间而不是作为后处理步骤应用。

这些方法在计算复杂度和有效性方面都存在权衡。基于幅度的剪枝计算成本低,易于实现,但未考虑神经元在不同数据分布中的行为。基于激活的剪枝提供了一种更数据驱动的剪枝方法,但需要额外的计算来估计神经元的重要性。基于梯度的剪枝利用训练动态,但如果应用于大规模模型可能会引入额外的复杂性。方法的选择取决于目标部署环境的特定约束和剪枝模型的性能要求。

动态剪枝

传统的剪枝方法,无论是无结构的还是结构的,通常涉及静态剪枝,即在训练后或训练期间固定间隔内永久移除参数。然而,这种方法假设参数的重要性是固定的,这并不总是如此。相比之下,动态剪枝根据输入数据或训练动态调整剪枝决策,允许模型实时调整其结构。

动态剪枝可以通过运行时稀疏技术实现,其中模型根据输入特征主动确定要利用哪些参数。激活条件剪枝通过选择性地停用对特定输入表现出低激活值的神经元或通道来例证这种方法(J. Hu 等人 2023)。这种方法引入了输入相关的稀疏模式,在推理期间有效地减少了计算工作量,而不会永久修改模型架构。

例如,考虑一个处理具有不同复杂度图像的卷积神经网络。在推理主要由均匀区域组成的简单图像时,许多卷积滤波器可能产生可忽略的激活。动态剪枝识别这些低影响滤波器,并暂时将它们排除在计算之外,从而提高效率,同时保持对当前输入的准确性。这种自适应行为在延迟敏感的应用中特别有利,在这些应用中,必须根据输入复杂度合理分配计算资源,这与性能测量策略(第十二章)相联系。

另一类动态剪枝发生在训练过程中,其中稀疏性逐渐引入并在整个优化过程中进行调整。例如,渐进幅度剪枝从密集网络开始,随着训练的进行逐渐增加剪枝参数的比例。这些方法不是永久移除参数,而是允许网络通过在训练后期证明重要的连接重新生长来从剪枝引起的容量损失中恢复。

动态剪枝相较于静态剪枝具有多个优势。它允许模型适应不同的工作负载,在保持精度的同时可能提高效率。与静态剪枝不同,静态剪枝可能会过度剪枝并降低性能,动态剪枝提供了一个机制,在必要时可以选择性重新激活参数。然而,实现动态剪枝需要额外的计算开销,因为剪枝决策必须在实时进行,无论是在训练期间还是在推理期间。这使得它比静态剪枝更难集成到标准的机器学习流程中,需要更复杂的生产部署策略和监控框架,这些内容在第十三章中有详细说明。

尽管存在挑战,动态剪枝在边缘计算和自适应人工智能系统中特别有用(第十四章),在这些系统中,不同输入的资源约束和实时效率要求各不相同。下一节将探讨在选择适合特定机器学习系统的剪枝方法时涉及的实际考虑因素和权衡。

剪枝权衡

剪枝技术在内存效率、计算效率、精度保持、硬件兼容性和实现复杂性方面提供了不同的权衡。剪枝策略的选择取决于机器学习系统的具体约束和部署环境,需要与操作考虑因素相结合(第十三章)。

无结构化剪枝在减少模型大小和内存占用方面特别有效,因为它在保持整体模型架构完整的同时移除了单个权重。然而,由于机器学习加速器针对密集矩阵操作进行了优化,无结构化剪枝并不总是能转化为显著的计算速度提升,除非使用了专门的稀疏执行内核。

相比之下,结构化剪枝会消除整个神经元、通道或层,从而得到一个更符合硬件的模型。这种技术提供了直接的计算节省,因为它减少了推理过程中所需的浮点运算次数(FLOPs)16。

不足之处在于,修改网络结构可能会导致精度下降更大,需要仔细微调以恢复丢失的性能。

动态剪枝通过在运行时根据输入数据或训练动态调整要剪枝的参数,将适应性引入剪枝过程。这允许在精度和效率之间取得更好的平衡,因为模型保留了在需要时重新引入先前剪枝参数的灵活性。然而,动态剪枝增加了实现复杂性,因为它需要额外的计算来确定哪些参数需要即时剪枝。

表 10.2 总结了这些剪枝方法之间的关键结构差异,概述了每种方法如何修改模型及其执行的影响。

表 10.2:剪枝策略:无结构、结构化和动态剪枝以不同的方式修改模型权重,影响模型大小和计算效率;无结构剪枝提供最大的压缩,但需要专用硬件,而动态剪枝则根据输入数据调整以在精度和资源使用之间取得平衡。

方面 无结构剪枝 结构化剪枝 动态剪枝
移除的内容 模型中的单个权重 整个神经元、通道、滤波器或层 根据运行时条件调整剪枝
模型结构 稀疏权重矩阵;原始架构保持不变 模型架构被修改;剪枝层被完全移除 结构动态适应
对内存的影响 通过消除非零权重来减少模型存储 通过移除整个组件来减少模型存储 根据实时剪枝而变化
对计算的影响 有限;除非使用专门的稀疏计算,否则仍需要密集矩阵运算 直接减少 FLOPs 并加快推理速度 动态平衡精度和效率
硬件兼容性 稀疏权重矩阵需要专门的执行支持以提高效率 与标准深度学习硬件高效工作 需要自适应推理引擎
是否需要微调 剪枝后通常需要微调以恢复精度 由于较大的结构修改,更有可能需要微调 动态调整,减少重新训练的需求
用例 内存高效的模型压缩,尤其是针对云部署 实时推理优化、移动/边缘 AI 和高效训练 自适应 AI 应用、实时系统

剪枝策略

在无结构、结构化和动态剪枝的广泛类别之外,不同的剪枝工作流程可以影响模型效率和精度保持。两种广泛使用的剪枝策略是迭代剪枝和一次性剪枝,每种策略都有其自身的优点和权衡。

迭代剪枝

迭代剪枝通过多次剪枝循环和后续的微调实现结构移除的渐进式方法。在每一轮中,算法基于预定义的重要性指标移除一小部分结构。然后,模型进行微调以适应这些结构修改,然后再进行下一轮剪枝迭代。这种方法有助于防止精度突然下降,同时允许网络逐步调整到降低的复杂性。

为了说明这个过程,考虑从卷积神经网络中剪除六个通道,如图图 10.5 所示。迭代剪枝不是一次性移除所有通道,而是在三个周期内每次迭代移除两个通道。在每个剪枝步骤之后,模型都会进行微调以恢复性能。第一次迭代移除两个通道导致准确率从 0.995 降至 0.971,但随后的微调将准确率恢复到 0.992。完成两个额外的剪枝-微调周期后,最终模型达到 0.991 的准确率,这仅比原始模型减少了 0.4%,同时运行时通道数减少了 27%。通过将结构修改分布在多个迭代中,网络在实现改进的计算效率的同时保持了其性能能力。

图 10.5:迭代剪枝性能:逐步移除通道并穿插微调可以在减少模型尺寸的同时保持高准确率;此图显示通道减少了 27%,准确率下降了 0.4%,展示了将结构修改分布在多个迭代中的好处。这种方法与单步剪枝形成对比,后者通常会导致性能显著下降。

单步剪枝

单步剪枝在单步中移除多个架构组件,随后进行广泛的微调阶段以恢复模型准确率。这种激进的方法可以快速压缩模型,但风险是更大的准确率下降,因为网络必须同时适应重大的结构变化。

考虑将单步剪枝应用于迭代剪枝示例中的相同网络。与每次迭代移除两个通道不同,单步剪枝同时消除所有六个通道,如图图 10.6 所示。同时移除网络 27%的通道会导致准确率显著下降,从 0.995 降至 0.914。即使经过微调,网络也只能恢复到 0.943 的准确率,这比原始未剪枝网络下降了 5%。虽然迭代和单步剪枝最终产生相同的网络结构,但迭代剪枝的渐进方法更好地保留了模型性能。

图 10.6:单步剪枝影响:像图中显示的 27%的通道这样的架构组件的激进移除会导致显著的初始准确率损失,因为网络难以同时适应重大的结构变化。微调部分恢复了性能,但确立了迭代剪枝比单步方法更有效地保留准确率。

选择修剪策略需要仔细考虑几个关键因素,这些因素会影响模型效率和性能。期望的参数减少水平,或稀疏度目标,直接影响策略选择。较高的减少目标通常需要迭代方法来维持准确性,而适度的稀疏度目标可能通过更简单的单次方法实现。

可用的计算资源对策略选择有重大影响。迭代修剪需要为多个微调周期提供大量资源,而单次方法需要的资源较少,但可能牺牲准确性。这种资源考虑与性能要求相联系,具有严格准确性要求的应程序通常从逐步、迭代的修剪中受益,以仔细保留模型能力。具有更灵活性能约束的用例可能更适合更激进的单一方法。

开发时间表也会影响修剪决策。单次方法在时间有限时能实现更快的部署,尽管迭代方法在足够的优化周期内通常能实现更好的结果。最后,目标平台的能力显著影响策略选择,因为某些硬件架构可能更好地支持特定的稀疏模式,使得特定的修剪方法在部署上更有优势。

在修剪策略之间进行选择需要仔细评估项目需求和约束。单次修剪可以通过同时移除多个参数来实现快速模型压缩,这使得它在部署速度比准确性更受重视的场合适用。然而,这种激进的方法通常会导致与更渐进的方法相比性能下降更大。另一方面,迭代修剪虽然计算密集且耗时,但通常通过在多个周期中结构化参数减少,通常能实现更高的准确性保持。这种方法使网络能够逐步适应结构变化,保留维持模型性能的重要连接。这种权衡是增加了优化时间和计算开销。通过系统地评估这些因素,从业者可以选择一种修剪方法,以最佳方式平衡效率提升与特定用例的模型性能。

彩票假设

修剪技术被广泛用于减少神经网络的大小和计算成本,但在确定要移除哪些参数的过程中并不总是直接的。虽然传统的修剪方法基于权重的大小、结构或动态条件来消除权重,但最近的研究表明,修剪不仅仅是减少冗余;它还可能揭示存在于原始模型中的本质上高效的子网络。

这种观点导致了彩票假设 17(LTH),它通过提出在大型神经网络中存在小型、良好初始化的子网络,称为“中奖彩票”,当独立训练时可以达到与完整模型相当准确度,从而挑战了传统的剪枝工作流程。LTH 不是将剪枝仅仅视为训练后的压缩步骤,而是建议它可以作为一种发现机制,在训练早期就识别这些高效的子网络。

LTH 通过迭代剪枝过程得到验证,如图 10.7 图 10.7 所示。首先训练一个大型网络到收敛。然后剪除最低幅度的权重,并将剩余的权重重置到它们的原始初始化状态,而不是重新随机化。这个过程迭代进行,逐渐减小网络的大小同时保持性能。经过多次迭代后,剩余的子网络,被称为“中奖彩票”,证明能够训练到与原始完整模型相同或更高的准确度。

图片

图 10.7:中奖彩票发现:迭代剪枝和权重重置识别出在大模型内部的子网络,当独立训练时,可以达到相当或更高的准确度,挑战了将剪枝视为仅仅是压缩技术的传统观点。这个过程证明了良好初始化的子网络存在,并且可以高效地训练,暗示大型网络的大部分容量可能是冗余的。

彩票假设的启示超出了传统的剪枝技术。LTH 建议,而不是训练大型模型然后在后面剪枝,可以直接从开始训练紧凑、高性能的子网络,从而消除对过度参数化的需求。这一见解挑战了传统的假设,即模型大小对于有效学习是必要的。它还强调了初始化的重要性,因为只有在将中奖彩票重置到其原始权重值时,它们才能保持其性能。这一发现引发了关于初始化在塑造网络学习轨迹中作用的更深层次问题。

该假设进一步强化了迭代剪枝相对于一次性剪枝的有效性。逐渐细化模型结构允许网络在每个阶段进行适应,比一次性移除模型的大部分部分更有效地保留准确度。这个过程与实际部署中使用的剪枝策略非常吻合,在部署中,在减少计算的同时保持准确度非常重要。

尽管前景广阔,但在实践中应用 LTH 仍然计算成本高昂,因为识别获胜的子网络需要多次剪枝和重新训练的周期。正在进行的研究探索是否可以在不进行完整训练的情况下早期检测到获胜的子网络,这可能导致更有效的稀疏训练技术。如果此类方法变得实用,LTH 将从根本上改变机器学习模型的训练方式,将重点从训练后剪枝大型网络转移到从一开始就发现和训练重要组件。

虽然 LTH 在剪枝方面提供了一个有说服力的理论视角,但实际实现依赖于已建立的框架级工具来集成结构和无结构剪枝技术。

剪枝实践

几个机器学习框架提供了内置工具来应用结构和无结构剪枝,微调剪枝模型,并优化云、边缘和移动环境中的部署。

如 PyTorch、TensorFlow 和 ONNX 等机器学习框架提供专门的剪枝实用工具,允许从业者高效地实现这些技术,同时确保与部署硬件的兼容性。

在 PyTorch 中,剪枝可以通过 torch.nn.utils.prune 模块实现,该模块提供了将基于幅度的剪枝应用于单个层或整个模型的功能。用户可以通过将最小幅度的权重设置为零来执行无结构剪枝,或者应用结构化剪枝以移除整个神经元或滤波器。PyTorch 还允许自定义剪枝策略,用户可以定义超出权重幅度的剪枝标准,例如基于激活或梯度的剪枝。一旦模型被剪枝,就可以进行微调以恢复丢失的精度,然后再导出用于推理。

TensorFlow 通过 TensorFlow 模型优化工具包(TF-MOT)提供剪枝支持。此工具包通过应用稀疏性诱导正则化直接将剪枝集成到训练过程中。TensorFlow 的剪枝 API 支持全局和层级剪枝,根据权重幅度动态选择要移除的参数。与 PyTorch 不同,TensorFlow 的剪枝通常在训练期间应用,允许模型从一开始就学习稀疏表示,而不是在训练后进行剪枝。TF-MOT 还提供导出工具,将剪枝模型转换为 TFLite 格式,使其与移动和边缘设备兼容。

ONNX18,一种用于模型表示的开源标准,不直接实现剪枝,但为从 PyTorch 和 TensorFlow 剪枝的模型提供导出和兼容性支持。由于 ONNX 旨在实现硬件无关性,它允许在不同框架中经过剪枝的模型针对 TensorRT19、OpenVINO 和 EdgeTPU 等推理引擎进行优化。这些推理引擎可以进一步利用结构化和动态剪枝来提高执行效率,尤其是在专用硬件加速器上。

尽管在框架层面上的剪枝支持已经取得了显著进展,但在实际应用中实施剪枝需要仔细考虑硬件兼容性和软件优化。标准 CPU 和 GPU 通常不原生加速稀疏矩阵运算,这意味着无结构剪枝可能减少内存使用,但不会提供显著的计算速度提升。相比之下,结构化剪枝在推理引擎中支持更广泛,因为它直接减少了执行过程中所需的计算量。动态剪枝,当与推理引擎正确集成时,可以根据工作负载变化和硬件约束优化执行,对自适应人工智能应用尤其有益。

在实际层面,选择合适的剪枝策略取决于几个关键权衡,包括内存效率、计算性能、准确度保持和实现复杂性。这些权衡影响剪枝方法在实际机器学习工作流程中的应用,影响基于资源约束和系统要求的部署选择。

为了帮助指导这些决策,表 10.3 提供了这些权衡的高级比较,总结了实践者在选择剪枝方法时必须考虑的关键效率和可用性因素。

这些权衡突出了将剪枝方法与实际部署需求对齐的重要性。例如,PyTorch、TensorFlow 和 ONNX 等框架使开发者能够实施这些策略,但剪枝方法的有效性取决于底层硬件和应用需求。

表 10.3:剪枝权衡:不同的剪枝策略在内存效率、计算速度、准确度保持和硬件兼容性之间取得平衡,影响实际模型部署选择和系统性能。无结构剪枝提供高内存节省,但需要专用硬件,而结构化剪枝以降低准确度为代价,优先考虑计算效率。

标准 无结构剪枝 结构化剪枝 动态剪枝
内存效率 ↑↑ 高 ↑ 中等 ↑ 中等
计算效率 → 中性 ↑↑ 高 ↑ 高
准确度保持 ↑ 中等 ↓↓ 低 ↑↑ 高
硬件兼容性 ↓ 低 ↑↑ 高 → 中立
实现复杂性 → 中立 ↑ 中等 ↓↓ 高

例如,结构化剪枝由于其与标准推理引擎的兼容性,常用于移动和边缘应用,而动态剪枝则更适合需要动态调整稀疏度级别的自适应人工智能工作负载。虽然非结构化剪枝对于减少内存占用很有用,但需要专门的稀疏执行内核才能完全实现计算节省。

在实际环境中部署剪枝模型时,理解这些权衡很重要。一些知名模型已经成功地将剪枝集成到优化性能中。MobileNet,一种为移动和嵌入式应用设计的轻量级卷积神经网络,已被剪枝以减少推理延迟,同时保持准确性(A. G. Howard 等人 2017)。BERT20,一种广泛使用的自然语言处理变压器模型,已经经历了注意力头和中间层的结构化剪枝,创建了如 DistilBERT21 和 TinyBERT 等高效的版本,这些版本在减少计算开销的同时保留了大部分原始性能(Sanh 等人 2019)。在计算机视觉领域,EfficientNet22 已被剪枝以去除不必要的滤波器,优化其在资源受限环境中的部署(Tan 和 Le 2019a)。

知识蒸馏

想象一位世界级的教授(教师模型),他阅读了数千本书,对某一学科有着深刻而细腻的理解。现在,想象一位聪明的学生(学生模型),他需要快速学习这门学科。教师不是仅仅给学生提供教科书上的答案(硬标签),而是提供丰富的解释,指出为什么一个答案比另一个答案更好,以及不同概念之间的关系(软标签)。学生从这种丰富的指导中比从教科书本身学到的更多。这就是知识蒸馏的精髓。

知识蒸馏通过从更大的预训练教师模型中获取指导来训练一个较小的学生模型,学习教师丰富的输出分布,而不是简单的正确/错误标签。这种区别很重要,因为教师模型提供的比真实标签更丰富的学习信号。以图像分类为例:一个真实标签可能说“这是一只狗”(独热编码:[0, 1, 0, 0, …])。但一个训练好的教师模型可能会输出[0.02, 0.85, 0.08, 0.05, …],表明“狗”是最可能的,但图像与“狼”(0.08)和“狐狸”(0.05)有一些共同的特征。这种类间相似性信息有助于学生学习特征关系,这是硬标签无法传达的。

知识蒸馏与剪枝不同。虽然剪枝从现有模型中移除参数,但蒸馏使用来自较大预训练教师模型的指导来训练一个单独的、较小的架构 (Gou 等人 2021)。学生模型优化以匹配教师的软预测(类别的概率分布)而不是简单地从标记数据中学习 (Jiong Lin 等人 2020)。

图 10.8 展示了蒸馏过程。教师模型使用带有温度TT的软化的 softmax 函数生成概率分布,学生模型使用这两个软目标和真实标签进行训练。

图片

图 10.8:知识蒸馏:学生模型从预训练教师模型生成的软概率分布中学习,将知识传递到硬标签之外。这个过程使学生模型能够通过使用教师模型的泛化能力和类间关系,以更少的参数达到与教师模型相当的性能。

学生模型的训练过程包含两个损失项:

  • 蒸馏损失:一个损失函数(通常基于 Kullback-Leibler (KL) 散度 23),它最小化学生模型和教师模型的软标签分布之间的差异。

  • 学生损失:一个标准的交叉熵损失,确保学生模型正确分类硬标签。

这两个损失函数的组合使学生模型能够吸收来自教师模型的有序知识以及来自数据集的标签监督。这种方法允许较小的模型达到接近其较大教师模型的准确度水平,使知识蒸馏成为模型压缩和高效部署的关键技术。

知识蒸馏允许较小的模型达到通过标准训练单独实现难以达到的准确度水平。这使得它在以推理效率为优先的机器学习系统中特别有用,例如实时应用、云到边缘模型压缩和低功耗 AI 系统 (S. Sun 等人 2019)。

蒸馏理论

知识蒸馏基于这样一个观点:一个训练良好的教师模型编码了关于数据分布的信息,而不仅仅是正确的类标签。在传统的监督学习中,模型被训练以最小化其预测与真实标签之间的交叉熵损失 24。然而,这种方法只为每个类提供了一个硬决策边界,丢弃了关于模型如何将不同类相互关联的潜在有用信息 (G. Hinton, Vinyals, and Dean 2015)。

知识蒸馏通过通过教师模型产生的软概率分布来传递额外的信息,解决了这一限制。它不是训练学生模型仅匹配正确的标签,而是训练学生模型匹配教师对所有可能类别的完整概率分布。这是通过引入一个温度缩放的 softmax 函数来实现的,该函数平滑了概率分布,使得学生模型更容易从教师输出中学习(Gou et al. 2021))。

知识蒸馏数学

为了将这种基于温度的方法形式化,设ziz_i为模型对类别ii的 logits(预 softmax 输出)。标准的 softmax 函数计算类别概率如下:pi=exp(zi)jexp(zj) p_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)}其中,更高的 logits 对应于对类别预测更高的置信度。

在知识蒸馏中,我们引入一个温度参数 25 TT,该参数在应用 softmax 之前对 logits 进行缩放:pi(T)=exp(zi/T)jexp(zj/T) p_i(T) = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}其中,更高的温度会产生更软的概率分布,揭示了模型如何在不同类别间分配不确定性的更多信息。

然后使用一个损失函数来训练学生模型,该损失函数最小化其输出分布与教师软输出分布之间的差异。最常见的形式结合了两个损失项:distill=(1α)CE(ys,y)+αT2ipiTlogpi,sT \mathcal{L}{\text{distill}} = (1 - \alpha) \mathcal{L}{\text{CE}}(y_s, y) + \alpha T² \sum_i p_i^T \log p_{i, s}^T 其中:

  • CE(ys,y)\mathcal{L}_{\text{CE}}(y_s, y) 是学生预测 ysy_s 和真实标签 yy 之间的标准交叉熵损失。

  • 第二项最小化了教师软预测 piTp_i^T 和学生预测 pi,sTp_{i, s}^T 之间的 Kullback-Leibler (KL) 散度。

  • 因子 T2 确保在采用高温值时梯度保持适当的缩放。

  • 超参数 α\alpha 平衡了标准训练损失与蒸馏损失的重要性。

通过从硬标签和软教师输出中学习,学生模型从教师的泛化能力中受益,即使参数较少,也能提高其区分相似类别的能力。

蒸馏直觉

通过从硬标签和软教师输出中学习,学生模型从教师的泛化能力中受益,即使参数较少,也能提高其区分相似类别的能力。与传统的训练不同,传统的训练中模型只从二元正确性信号中学习,知识蒸馏允许学生从教师的预测中吸收对数据分布的更丰富理解。

软目标的一个关键优势是它们提供相对置信水平,而不仅仅是单个正确答案。考虑一个图像分类任务,其目标是区分不同的动物种类。使用硬标签训练的标准模型只会收到关于其预测是否正确的反馈。如果一个图像包含猫,正确的标签是“猫”,而所有其他类别,如“狗”和“狐狸”,都被视为同样不正确。然而,一个训练良好的教师模型自然理解猫在视觉上比狐狸更接近狗,其软输出概率可能看起来像图 10.9,其中相对置信水平表明虽然“猫”是最可能的类别,但“狗”仍然是一个合理的替代品,而“狐狸”则不太可能。

图片

图 10.9:软目标分布:相对置信水平表明对于给定的输入,哪些类别更有可能,显示模型可以表达不确定性并提供比简单的正确或错误标签更细微的输出。

与简单地将学生模型强制分类为猫不同,教师模型提供了一个更细微的学习信号,表明虽然“狗”是不正确的,但它比“狐狸”是一个更合理的错误。这种微妙的信息帮助学生模型在相似类别之间建立更好的决策边界,使其对现实世界数据中的模糊性更具鲁棒性。

这种效果在训练数据有限或噪声较大的情况下尤其有用。在大量数据上训练的大型教师模型已经学会了很好地泛化,捕捉到可能难以从较小数据集发现的模式。学生通过继承这种结构化知识,仿佛它能够访问比明确可用的更大的训练信号。

知识蒸馏的另一个关键好处是其正则化效果。由于软目标将概率质量分布在多个类别上,它们防止学生模型过度拟合到特定的硬标签。这种正则化提高了模型泛化能力并减少了对抗性输入的敏感性。学生模型不是自信地将正确类别的概率分配为 1.0,而将所有其他类别的概率分配为 0.0,而是学会做出更准确的预测,这提高了其泛化性能。这对于学生模型参数较少的情况尤为重要,因为较小的网络更容易过度拟合。

最后,蒸馏技术有助于将大型模型压缩成更小、更高效的版本,而不会造成主要性能损失。这种压缩能力直接促进了可持续的 AI 实践第十八章,通过减少模型部署的环境影响同时保持性能标准。从头开始训练小型模型通常会导致较低的准确率,因为模型缺乏学习复杂表示的能力,而这些能力是大型网络能够捕捉到的。然而,通过使用训练有素的教师的知识,学生可以达到比自身更高的准确率,这使得它成为现实世界 ML 部署的更实际选择,尤其是在边缘计算、移动应用和其他资源受限的环境中,这些内容在第十四章第十四章中有所探讨。

效率提升

知识蒸馏的效率优势涵盖了三个关键领域:内存效率、计算效率和部署灵活性。与修改训练模型的剪枝技术不同,蒸馏从一开始就使用教师指导来训练紧凑的模型,这使得仅通过标准训练难以达到的准确率水平成为可能(Sanh 等人,2019),支持第十二章第十二章中提到的结构化评估方法。

内存和模型压缩

知识蒸馏的一个关键优势是它使小型模型能够保留大型模型的大部分预测能力,从而显著减少内存占用。这在资源受限的环境中特别有用,如移动和嵌入式 AI 系统,因为模型大小直接影响存储需求和加载时间。

例如,NLP 中的 DistilBERT(Sanh 等人,2019)和计算机视觉中的 MobileNet 蒸馏变体(A. G. Howard 等人,2017)等模型已被证明在仅使用一半参数的情况下,保留了其较大教师模型高达 97%的准确率。这种压缩水平通常优于剪枝,因为激进的参数减少可能导致表示能力的下降。

知识蒸馏的另一个关键好处是它能够将鲁棒性和泛化能力从教师模型转移到学生模型。大型模型通常使用大量数据集进行训练,并发展出强大的泛化能力,这意味着它们对噪声和数据变化不太敏感。一个训练良好的学生模型继承了这些属性,使其更不容易过拟合,并在不同的部署条件下更加稳定。这在低数据环境中尤其有用,因为在低数据环境中,从头开始训练一个小模型可能会由于训练样本不足而导致泛化能力差。

计算和推理速度

通过训练学生模型以更紧凑的表示近似教师的知识,蒸馏导致模型在推理时需要的 FLOPs 更少,从而实现更快的执行时间。与可能需要专门硬件支持进行稀疏计算的未结构化剪枝不同,蒸馏模型保持密集结构,使其与现有的机器学习加速器(如 GPU、TPU 和边缘 AI 芯片)更加兼容 (Jiao et al. 2020)。

在实际部署中,这转化为:

  • 减少了推理延迟,这对于语音识别、推荐系统和自动驾驶感知模型等实时 AI 应用非常重要。

  • 降低能耗,使蒸馏对于移动设备和物联网系统上的低功耗 AI 特别相关。

  • 云推理中的更高吞吐量,其中提供蒸馏模型允许大规模 AI 应用在保持模型质量的同时降低计算成本。

例如,当部署用于 NLP 的 transformer 模型时,组织通常使用教师-学生蒸馏来创建在 2-4 倍更低延迟下达到相似精度的模型,这使得每天处理数十亿请求成为可能,同时显著降低了计算开销。

部署和系统考虑

知识蒸馏在多任务学习场景中也非常有效,其中单个教师模型可以指导多个针对不同任务的学生模型。例如,在多语言 NLP 模型中,一个在多种语言上训练的大型教师模型可以将特定于语言的知识转移到较小、针对特定任务的模型中,从而实现跨不同语言的快速部署,无需从头开始重新训练。同样,在计算机视觉中,一个在多种对象类别上训练的教师模型可以将知识蒸馏到针对人脸识别、医学成像或自动驾驶等任务的专用学生模型中。

一旦 student 模型被蒸馏,可以使用剪枝、量化和图优化等技术进一步优化以适应特定硬件的加速。这确保了压缩模型在多个硬件环境中保持推理效率,尤其是在边缘 AI 和移动部署中(Gordon, Duh, and Andrews 2020)。

尽管知识蒸馏有其优势,但也存在一些局限性。蒸馏的有效性取决于教师模型的质量,一个训练不当的教师模型可能会将错误的偏差传递给学生。蒸馏引入了一个额外的训练阶段,其中教师和学生模型必须一起使用,这增加了训练期间的计算成本。在某些情况下,设计一个能够充分利用教师知识的学生模型架构仍然是一个挑战,因为过小的学生模型可能没有足够的容量来吸收所有相关信息。

权衡

与剪枝相比,知识蒸馏在保持准确率方面表现更好,但需要通过训练新模型而不是修改现有模型来提高训练复杂性。然而,剪枝提供了更直接的计算效率提升,尤其是在使用结构化剪枝时。在实践中,结合剪枝和蒸馏通常能获得最佳权衡,正如 DistilBERT 和 MobileBERT 等模型所示,其中剪枝首先减少不必要的参数,然后蒸馏优化最终的 student 模型。表 10.4 总结了知识蒸馏和剪枝之间的关键权衡。

表 10.4:模型压缩权衡:知识蒸馏和剪枝是减少模型大小和提高效率的不同方法,每种方法在准确率、计算成本和实现复杂性方面都有独特的优势和劣势。蒸馏优先考虑通过知识传递来保持准确率,而剪枝通过消除冗余参数直接减少计算需求,因此它们的结合使用是获得最佳性能的常见策略。

标准 知识蒸馏 剪枝
准确率保持 高 – 学生从教师那里学习,更好的泛化能力 变化 – 如果过度剪枝,可能会降低准确率
训练成本 较高 – 需要训练教师和学生模型 较低 – 只需微调
推理速度 高 – 生成密集、优化的模型 取决于 – 结构化剪枝效率高,非结构化需要特殊支持
硬件兼容性 高 – 在标准加速器上工作 有限 – 稀疏模型可能需要专门的执行
实现难度 复杂 – 需要设计教师-学生流水线 简单 – 训练后应用

知识蒸馏仍然是机器学习系统优化的一个重要技术,通常与剪枝和量化一起用于部署就绪的模型。理解蒸馏如何与这些互补技术相互作用对于构建有效的多阶段优化管道至关重要。

结构化近似

基于近似的压缩技术重构模型表示,以降低复杂性同时保持表达能力,补充了之前讨论的剪枝和蒸馏方法。

相比于消除单个参数,近似方法将大的权重矩阵和张量分解为低维组件,使得模型可以更高效地存储和执行。这些技术利用了这样一个观察:许多高维表示可以通过低秩结构很好地近似,从而在不显著损失性能的情况下减少参数数量。与选择性移除连接的剪枝或转移学习知识的蒸馏不同,基于分解的方法通过结构化近似优化了模型的内部表示。

最广泛使用的近似技术包括:

  • 低秩矩阵分解(LRMF):一种将权重矩阵分解为低秩矩阵乘积的方法,从而降低存储和计算复杂性。

  • 张量分解:LRMF 到高维张量的推广,使得神经网络中多向交互的更高效表示成为可能。

这两种方法都提高了机器学习中的模型效率,尤其是在资源受限的环境,如边缘机器学习和 Tiny ML 中。低秩分解和张量分解通过减少所需操作的数量来加速模型训练和推理。以下几节将详细探讨低秩矩阵分解和张量分解,包括它们的数学基础、应用和相关权衡。

低秩分解

许多机器学习模型的权重矩阵中包含大量的冗余,导致计算、存储和部署效率低下。在前几节中,介绍了剪枝和知识蒸馏作为减小模型尺寸的方法,剪枝是通过选择性移除参数,而蒸馏是通过从较大的模型向较小的模型转移知识。然而,这些技术并没有改变模型参数的结构。相反,它们专注于减少冗余权重或优化训练过程。

低秩矩阵分解(LRMF)通过用低秩表示来近似模型的权重矩阵,而不是显式地删除或转移信息,提供了一种替代方法。这项技术将大型参数矩阵重构为紧凑的、低维度的组件,在显著降低存储和计算成本的同时,保留了大部分原始信息。与创建稀疏表示的剪枝技术不同,或者需要额外训练过程的蒸馏技术不同,LRMF 是一种纯粹的数学变换,它将权重矩阵分解为两个或更多较小的矩阵。

这种结构化压缩在机器学习系统中特别有用,在这些系统中效率是一个主要关注点,例如边缘计算、云推理和硬件加速的机器学习执行。通过使用低秩近似,模型可以在保持预测准确性的同时实现参数存储的显著减少,使 LRMF 成为优化机器学习架构的有价值工具。

训练数学

LRMF 是一种在线性代数和机器学习系统中使用的数学技术,通过将其分解为低维矩阵的乘积来近似高维矩阵。这种分解使得模型参数的表示更加紧凑,同时减少了内存占用和计算复杂度,并保留了重要的结构信息。在机器学习系统的背景下,LRMF 在优化模型效率方面发挥着重要作用,尤其是在资源受限的环境,如边缘人工智能和嵌入式部署中。

正式来说,给定一个矩阵 Am×nA \in \mathbb{R}^{m \times n},LRMF 寻找两个矩阵 Um×kU \in \mathbb{R}^{m \times k}Vk×nV \in \mathbb{R}^{k \times n},使得:AUV A \approx UV 其中 kk 是近似的秩,通常远小于 mmnn。这种近似通常通过奇异值分解(SVD)获得,其中 AA 被分解为:A=UΣVT A = U \Sigma V^T 其中 Σ\Sigma 是包含奇异值的对角矩阵,而 UUVV 是正交矩阵。通过仅保留前 kk 个奇异值,获得 AA 的低秩近似。

图 10.10 展示了低秩矩阵分解带来的参数化减少。观察矩阵MM如何通过矩阵LkL_kRkTR_k^T的乘积进行近似。为了直观理解,网络中的大多数全连接层都存储为投影矩阵MM,这需要m×nm \times n参数在计算过程中加载。然而,通过将其分解并近似为两个低秩矩阵的乘积,我们只需要在存储方面存储m×k+k×nm \times k + k \times n参数,同时承担额外的矩阵乘法计算成本。只要k<n/2k < n/2,这种分解在存储总参数数量方面更少,同时增加了运行时的计算复杂度O(mkn)O(mkn) (I. Gu 2023).

图片

图 10.10:低秩分解:将矩阵分解为低秩近似可以减少存储和计算所需的参数数量,从而实现高效的模型表示。通过将矩阵aa表示为两个较小矩阵uuvv的乘积,我们由存储m×nm \times n参数转变为存储m×k+k×nm \times k + k \times n参数,其中kk代表降低的秩。来源:The Clever Machine.

LRMF 通过减少参数冗余,广泛用于提高机器学习模型的效率,尤其是在完全连接和卷积层中。在更广泛的机器学习系统背景下,因式分解技术有助于优化模型推理速度、存储效率和适应专用硬件加速器的能力。

完全连接层通常包含大型权重矩阵,这使得它们成为因式分解的理想候选者。LRMF(低秩矩阵分解)不是存储一个密集的 m×nm \times n 权重矩阵,而是允许使用两个更小的矩阵来表示,这两个矩阵的维度分别是 m×km \times kk×nk \times n,从而显著降低存储和计算成本。这种降低在云到边缘的机器学习管道中尤其有价值,因为最小化模型大小可以促进在嵌入式设备上的实时执行。

卷积层也可以通过将卷积滤波器分解为可分离结构来从 LRMF 中受益。深度可分离卷积等技术利用因式分解原理,在不显著损失精度的同时实现计算效率。这些方法与现代 AI 加速框架中使用的硬件感知优化技术相吻合。

LRMF 在协同过滤推荐系统中得到了广泛的应用。通过因式分解用户-项目交互矩阵,可以提取出与用户偏好和项目属性相对应的潜在因子,从而实现高效且准确的推荐。在大型机器学习系统中,此类优化直接影响到生产环境中的可扩展性和性能。

因式分解效率和挑战

通过将权重矩阵分解为低秩分量,存储所需的参数数量从O(mn)O(mn)减少到O(mk+kn)O(mk + kn),其中kk远小于m,nm, n。然而,这种减少是以在推理期间增加额外的矩阵乘法操作为代价的,这可能会增加计算延迟。在机器学习系统中,这种权衡被仔细管理,以平衡存储效率和实时推理速度。

在 LRMF(低秩矩阵分解)中选择一个合适的秩kk是一个关键挑战。较小的kk会导致更高的压缩率,但可能会造成显著的信息损失,而较大的kk则能保留更多信息,但提供的效率提升有限。交叉验证和启发式方法等通常被用来确定最优的秩,尤其是在大规模机器学习部署中,计算和存储约束各不相同。

在现实世界的机器学习应用中,数据集可能包含噪声或缺失值,这可能会影响分解的质量。正则化技术,如添加一个L2L_2惩罚,可以帮助减轻过拟合并提高 LRMF 的鲁棒性,确保在不同机器学习系统架构中保持稳定的性能。

低秩矩阵分解提供了一种有效的方法,在保持机器学习模型表达能力的同时降低其复杂性。通过用低秩表示来近似权重矩阵,LRMF 促进了高效的推理和模型部署,尤其是在资源受限的环境,如边缘计算中。在机器学习系统中,分解技术有助于可扩展、硬件感知的优化,从而提升现实世界模型的性能。尽管存在诸如秩选择和计算开销等挑战,LRMF 仍然是在机器学习系统设计和部署中提高效率的有价值工具。

张量分解

虽然低秩矩阵分解为压缩机器学习模型中的大型权重矩阵提供了一种有效的方法,但许多现代架构依赖于多维张量而不是二维矩阵。卷积层、注意力机制和嵌入表示通常涉及多向交互,这些交互无法使用标准的矩阵分解技术有效地捕捉。在这种情况下,张量分解提供了一种更通用的方法来降低模型复杂性,同时保持数据中的结构关系。

图片

图 10.11:张量分解:通过将多维张量分解为低秩分量,可以紧凑地表示高维数据,与直接操作原始张量相比,减少了计算成本和内存需求。这项技术将矩阵分解扩展到处理现代机器学习模型(如卷积神经网络)中常见的多向交互。来源:(Richter 和 Zhao 2021)。

张量分解(TD)将低秩分解的原理扩展到高阶张量,允许大型的多维数组通过低秩分量来表示(参见图 10.11)。鉴于张量经常出现在机器学习系统中作为权重参数、激活和输入特征的表示,它们的直接存储和计算通常变得不切实际。通过将这些张量分解成一组较小的因子,张量分解显著降低了内存需求和计算开销,同时保持了原始结构的完整性。

张量分解提高了各种机器学习架构的效率。在卷积神经网络中,它使得可以通过低维因子来近似卷积核,在保留表示能力的同时减少参数。在自然语言处理中,高维嵌入可以被分解成更紧凑的表示,从而实现更快的推理和降低内存消耗。在硬件加速中,张量分解有助于优化张量操作以在专用处理器上执行,确保计算资源的有效利用。

训练数学

张量是矩阵的多维扩展,表示数据跨越多个轴而不是局限于二维结构。在机器学习中,张量自然出现在各种情境中,包括权重参数、激活和输入特征的表示。鉴于这些张量的高维性,直接存储和计算通常变得不切实际,需要高效的分解技术。

张量分解通过用一组低秩组件近似高阶张量,推广了低秩矩阵分解的原则。形式上,对于一个给定的张量 𝒜m×n×p\mathcal{A} \in \mathbb{R}^{m \times n \times p},分解的目标是用需要较少参数存储和处理的分解组件来表示 𝒜\mathcal{A}。这种分解减少了内存占用和计算需求,同时保留了原始张量中存在的结构关系。

为张量分解开发了多种分解方法,每种方法都适用于机器学习中的不同应用。一种常见的方法是 CANDECOMP/PARAFAC (CP) 分解,它将张量表示为秩一组件的和。在 CP 分解中,张量 𝒜m×n×p\mathcal{A} \in \mathbb{R}^{m \times n \times p} 被近似为 𝒜r=1kurvrwr \mathcal{A} \approx \sum_{r=1}^{k} u_r \otimes v_r \otimes w_r 其中 urmu_r \in \mathbb{R}^{m}vrnv_r \in \mathbb{R}^{n},和 wrpw_r \in \mathbb{R}^{p} 是分解向量,而 kk 是近似的秩。

另一种广泛使用的方法是 Tucker 分解,它通过引入核心张量 𝒢k1×k2×k3\mathcal{G} \in \mathbb{R}^{k_1 \times k_2 \times k_3} 和因子矩阵 Um×k1U \in \mathbb{R}^{m \times k_1}Vn×k2V \in \mathbb{R}^{n \times k_2},以及 Wp×k3W \in \mathbb{R}^{p \times k_3},使得 𝒜𝒢×1U×2V×3W \mathcal{A} \approx \mathcal{G} \times_1 U \times_2 V \times_3 W 其中 ×i\times_i 表示第 ii 个模的张量矩阵乘法。

另一种方法,张量-训练(TT)分解,将高阶张量分解为一系列低秩矩阵,从而降低存储和计算复杂度。给定一个张量 𝒜m1×m2××md\mathcal{A} \in \mathbb{R}^{m_1 \times m_2 \times \dots \times m_d},TT 分解将其表示为低维张量核的乘积 𝒢(i)\mathcal{G}^{(i)},其中每个核 𝒢(i)\mathcal{G}^{(i)} 的维度为 ri1×mi×ri\mathbb{R}^{r_{i-1} \times m_i \times r_i},而完整的张量则被重建为 𝒜𝒢(1)×𝒢(2)××𝒢(d) \mathcal{A} \approx \mathcal{G}^{(1)} \times \mathcal{G}^{(2)} \times \dots \times \mathcal{G}^{(d)},其中 rir_i 是 TT 秩。

这些张量分解方法在优化机器学习模型中发挥着重要作用,通过减少参数冗余同时保持表达能力。下一节将探讨这些技术如何应用于机器学习架构,并讨论它们的计算权衡。

张量分解应用

张量分解方法在机器学习系统中被广泛应用以提高效率和可扩展性。通过将高维张量分解为低秩表示,这些方法在保留模型表达能力的同时,减少了内存使用和计算需求。本节探讨了机器学习中张量分解的几个关键应用,重点关注其对卷积神经网络、自然语言处理和硬件加速的影响。

在卷积神经网络(CNNs)中,张量分解用于压缩卷积滤波器,并在推理过程中减少所需的操作数量。标准的卷积层包含一组权重张量,这些张量定义了输入特征如何被转换。这些权重张量通常存在冗余,这意味着它们可以被分解为较小的组件,而不会显著降低性能。CP 分解和 Tucker 分解等技术使得卷积滤波器可以使用低秩张量进行近似,从而减少了参数数量和卷积操作的计算复杂度。这种结构化压缩形式在边缘和移动机器学习应用中尤其有价值,在这些应用中,内存和计算资源是受限的。

在自然语言处理(NLP)中,张量分解通常应用于嵌入层和注意力机制。许多 NLP 模型,包括转换器,依赖于高维嵌入来表示单词、句子或整个文档。这些嵌入可以通过张量分解进行分解,以减少存储需求,同时不损害其捕捉语义关系的能力。同样,在基于转换器的架构中,自注意力机制需要大量的张量乘法,这些可以通过分解技术进行优化,以降低计算负担并加速推理。

机器学习的硬件加速也得益于张量分解,因为它使得在专门的处理器(如 GPU、张量处理单元(TPUs)和现场可编程门阵列(FPGAs))上执行更加高效。许多机器学习框架包括利用张量分解来提高模型执行速度和降低能耗的优化。将张量分解为结构化的低秩组件与现代硬件加速器的内存层次结构相吻合,从而促进了更高效的数据移动和并行计算。

尽管有这些优势,张量分解引入了一些必须谨慎管理的权衡。分解方法和秩的选择显著影响模型精度和计算效率。选择过于激进的秩减少可能导致信息损失过多,而保留过多的成分会减少效率提升。分解过程本身可能引入计算开销,当将张量分解应用于大规模机器学习系统时需要仔细考虑。

TD 权衡与挑战

虽然张量分解在机器学习系统中提供了显著的效率提升,但它引入了必须谨慎管理的权衡,以保持模型精度和计算可行性。这些权衡主要涉及分解秩的选择、分解的计算复杂性和分解表示的稳定性。

张量分解的主要挑战之一是确定分解表示的适当秩。在低秩矩阵分解中,秩定义了分解矩阵的维度,直接影响压缩和信息保留之间的平衡。在张量分解中,秩的选择变得更加复杂,因为不同的分解方法以不同的方式定义秩。例如,在 CANDECOMP/PARAFAC (CP) 分解中,秩对应于用于逼近原始张量的秩一张量的数量。在 Tucker 分解中,秩由核心张量的维度决定,而在 Tensor-Train (TT) 分解中,分解成分的秩决定了压缩级别。选择一个不充分的秩可能导致信息损失过多,降低模型的预测性能,而过度的保守秩减少则导致压缩效益有限。

另一个关键挑战是与执行张量分解相关的计算开销。分解过程本身需要解决一个优化问题,通常涉及交替最小二乘(ALS)或随机梯度下降等迭代过程。这些方法可能计算成本高昂,尤其是在机器学习模型中使用的大规模张量中。在推理过程中,需要从分解成分重建张量,这引入了额外的矩阵和标量乘法,可能会增加计算延迟。张量分解在实际中的效率取决于在减少参数存储和最小化分解表示引起的额外计算成本之间取得平衡。

在将张量分解应用于机器学习模型时,数值稳定性也是一个需要考虑的问题。分解表示可能存在数值不稳定性,尤其是在原始张量包含高度相关结构或分解方法引入病态因子时。正则化技术,如对因子矩阵添加约束或逐步应用低秩近似,可以帮助缓解这些问题。用于分解的优化过程必须仔细调整,以避免收敛到次优解,这些解未能保留原始张量的重要属性。

尽管存在这些挑战,张量分解仍然是优化机器学习模型的有价值工具,尤其是在减少内存占用和计算复杂性的应用中。自适应分解方法、自动秩选择策略和硬件感知分解技术的进步继续提高张量分解在机器学习中的实际效用。下一节将总结从低秩矩阵分解和张量分解中获得的关键见解,突出它们在设计高效机器学习系统中的作用。

LRMF vs. TD

低秩矩阵分解和张量分解都是通过用低秩表示来近似大型参数结构,从而降低机器学习模型复杂性的核心技术。虽然它们共享提高存储效率和计算性能的共同目标,但它们的应用、计算权衡和结构假设存在显著差异。本节对这些两种技术进行了比较分析,突出了它们的优点、局限性和在机器学习系统中的实际应用案例。

LRMF(低秩矩阵分解)与张量分解之间的一个关键区别在于它们操作数据的维度。LRMF 适用于二维矩阵,这使得它在压缩全连接层或嵌入中的权重矩阵方面特别有用。另一方面,张量分解将分解扩展到多维张量,这些张量在卷积层、注意力机制和多模态学习中自然出现。这种推广使得张量分解能够利用 LRMF 无法捕捉的高维数据的额外结构属性。

从计算角度来看,这两种方法在存储节省和推理速度之间引入了权衡。LRMF 通过将权重矩阵分解为两个较小的矩阵来减少模型中的参数数量,从而减少内存占用,但在推理过程中会引入额外的矩阵乘法。相比之下,tensor decomposition 通过将 tensor 分解为多个低秩分量来进一步减少存储,但代价是更复杂的 tensor 收缩,这可能会引入更高的计算开销。这两种方法之间的选择取决于主要约束是内存存储还是推理延迟。

表 10.5 总结了 LRMF 和 tensor decomposition 之间的关键区别:

表 10.5:维度与分解:低秩矩阵分解(LRMF)和 tensor 分解通过使用更少的参数来表示数据,从而减少模型存储需求,但在推理过程中引入了计算权衡;LRMF 适用于二维矩阵,而 tensor decomposition 将这种方法扩展到多维 tensor 以实现更大的压缩潜力。

特征 低秩矩阵分解(LRMF) tensor 分解
适用数据结构 二维矩阵 多维 tensor
压缩机制 将矩阵分解为两个或更多低秩矩阵 将 tensor 分解为多个低秩分量
常用方法 奇异值分解(SVD)、交替最小二乘法(ALS) CP 分解、Tucker 分解、tensor-Train(TT)
计算复杂度 通常较低,对于秩为 k 的近似通常为$ O(mnk) $ 较高,由于迭代优化和 tensor 收缩
存储减少 将存储从$ O(mn) \(减少到\) O(mk + kn) $ 实现更高的压缩,但需要更复杂的存储表示
推理开销 需要额外的矩阵乘法 引入额外的 tensor 操作,可能增加推理延迟
主要用例 全连接层、嵌入、推荐系统 卷积核、注意力机制、多模态学习
实现复杂性 实现起来更容易,通常涉及直接分解方法 更复杂,需要迭代优化和秩选择

尽管存在这些区别,LRMF 和 tensor decomposition 并不是相互排斥的。在许多机器学习模型中,这两种方法可以同时应用以优化架构的不同组件。例如,全连接层可以使用 LRMF 进行压缩,而卷积核和注意力 tensor 则进行 tensor decomposition。技术的选择最终取决于模型的具体特征以及存储效率与计算复杂度之间的权衡。

神经架构搜索

在前几节中探讨的剪枝、知识蒸馏和其他技术依赖于人类专业知识来确定最佳模型配置。虽然这些手动方法已经导致了重大进步,但选择最佳架构需要大量的实验,即使是经验丰富的从业者也可能忽略更有效的设计(Elsken, Metzen, and Hutter 2019a)。神经架构搜索(NAS)通过系统地探索大量可能的架构来识别那些最佳平衡准确度、计算成本、内存效率和推理延迟的架构,从而自动化这个过程。

图 10.12 展示了 NAS 过程。NAS26 通过三个相互关联的阶段运作:定义搜索空间(架构组件和约束)、应用搜索策略(强化学习(Zoph and Le 2017a)、进化算法或基于梯度的方法)来探索候选架构,并评估性能以确保发现的设计满足准确性和效率目标。这种自动化使得发现的新架构通常与人类设计的模型相匹配或超过它们,同时需要显著减少专家的努力。

图 10.12:神经架构搜索流程:自动化的 NAS 技术迭代优化模型架构及其权重,共同优化性能和效率,与依赖人类专业知识和大量试错的手动设计方法不同。这个过程能够发现针对特定计算约束的新颖、高性能架构。

NAS 搜索策略采用多种优化技术。强化学习 27 将架构选择视为一个序列决策问题,使用准确度作为奖励信号。进化算法 28 通过变异和交叉进化架构群体。基于梯度的方法使可微架构搜索成为可能,从而降低计算成本。

模型效率编码

NAS 在三个关键阶段运作:定义搜索空间、探索候选架构和评估其性能。搜索空间定义了 NAS 可以修改的架构组件和约束。搜索策略确定 NAS 如何探索可能的架构,根据过去的观察选择有希望的候选者。评估过程确保发现架构满足多个目标,包括准确度、效率和硬件适应性。

  1. 搜索空间定义:这个阶段建立了 NAS 可以修改的架构组件和约束,例如层数、卷积类型、激活函数和针对特定硬件的优化。一个定义良好的搜索空间在创新与计算可行性之间取得平衡。

  2. 搜索策略:NAS 使用强化学习、进化算法或基于梯度的技术等方法来探索搜索空间。这些方法引导搜索向最大化性能的同时满足资源约束的架构。

  3. 评估标准:候选架构基于多个指标进行评估,包括准确性、FLOPs、内存消耗、推理延迟和能效。NAS 确保所选架构与部署需求相一致。

NAS 将结构设计和优化统一到一个单一的自动化框架中。结果是发现不仅高度准确,而且计算效率高且非常适合目标硬件平台的架构。

搜索空间定义

NAS 的第一步是确定它允许探索的架构集合,即搜索空间。这个空间的大小和结构直接影响 NAS 发现最优模型的有效性。一个定义良好的搜索空间必须足够广泛以允许创新,同时又要足够狭窄以避免对不切实际的设计进行不必要的计算。

典型的 NAS 搜索空间由定义模型结构的模块化构建块组成。这些包括可供选择的层类型,如标准卷积、深度可分离卷积、注意力机制和残差块。搜索空间还定义了网络深度和宽度的约束,指定模型可以有多少层以及每层应包含多少通道。NAS 还考虑了激活函数,如 ReLU、Swish 或 GELU,这些函数会影响模型的表达能力和计算效率。

搜索空间内的其他架构决策包括内核大小、感受野和跳跃连接,这些都会影响特征提取和模型复杂度。一些 NAS 实现还结合了硬件感知优化,确保发现的架构与特定的硬件(如 GPU、TPU 或移动 CPU)相匹配。

搜索空间的选择决定了 NAS 能够优化模型的程度。如果空间过于受限,搜索算法可能无法发现新颖且高效的架构。如果空间过大,搜索将变得计算成本高昂,需要大量资源来探索大量的可能性。找到合适的平衡点可以确保 NAS 能够高效地识别出优于人工设计的架构。

搜索空间探索

一旦定义了搜索空间,NAS 必须确定如何有效地探索不同的架构。搜索策略通过根据过去的观察选择要评估的架构来指导这一过程。一个有效的搜索策略必须在探索(测试新的架构)与利用(完善有希望的设计)之间取得平衡。

已经开发出几种方法来有效地探索搜索空间。基于强化学习的 NAS 将搜索过程表述为一个决策问题,其中代理依次选择架构组件,并根据生成的模型性能接收奖励信号。随着时间的推移,代理通过最大化这一奖励来学习生成更好的架构。虽然有效,但基于强化学习的 NAS 可能计算成本较高,因为它需要在收敛到最佳设计之前训练许多候选模型。

另一种方法是使用进化算法,它维护一个候选架构种群,并通过变异和选择迭代地改进它们。具有更高精度和效率的强大架构被保留,而诸如更改层类型或滤波器大小等修改则引入了新的变体。这种方法已被证明比基于强化学习的 NAS 更有效地平衡了探索和计算可行性。

最近的方法,如基于梯度的 NAS,引入了表示架构选择的可微分参数。与将架构视为离散实体不同,基于梯度的方 法同时使用标准梯度下降优化模型权重和架构参数。这显著降低了搜索的计算成本,使 NAS 在现实世界应用中更加实用。

搜索策略的选择对 NAS(神经架构搜索)的可行性有直接影响。早期依赖强化学习的 NAS 方法需要数周的 GPU 计算才能发现一个单一架构。最近的方法,尤其是基于梯度搜索的方法,显著降低了这一成本,使 NAS 更加高效和易于访问。

候选架构评估

NAS 探索的每一个架构都必须根据一组预定义的标准进行评估。虽然准确性是一个核心指标,但 NAS 还针对效率约束进行优化,以确保模型在实际部署中是实用的。评估过程决定了架构是否应该保留以进行进一步优化,或者为了更有希望的设计而被舍弃。

主要评估指标包括计算复杂度、内存消耗、推理延迟和能效 29。计算复杂度,通常以 FLOPs 衡量,决定了模型的总体资源需求。NAS 倾向于选择在提高准确率的同时减少不必要的计算的架构。内存消耗,包括参数数量和激活存储,确保模型符合硬件约束。对于实时应用,推理延迟是一个关键因素,NAS 会选择在特定硬件平台上最小化执行时间的架构。最后,一些 NAS 实现明确优化功耗,确保模型适用于移动和边缘设备。

例如,FBNet30,这是一个为移动推理优化的 NAS 生成架构,将延迟约束纳入了搜索过程。

通过将这些约束整合到搜索过程中,NAS 系统地发现能够平衡准确率、效率和硬件适应性的架构。而不是手动微调这些权衡,NAS 自动化了最优架构的选择,确保模型适合现实世界的部署场景。

NAS 优化问题

神经架构搜索可以表述为一个双层优化问题,它同时搜索最优架构并评估其性能。外层循环搜索架构空间,而内层循环训练候选架构以衡量其质量。

形式上,NAS 旨在从搜索空间𝒜\mathcal{A}中找到最优架构α\alpha^,该搜索空间最小化验证损失val\mathcal{L}_{\text{val}},同时遵守部署约束CC(延迟、内存、能耗):

α=argminα𝒜val(w(α),α)subject toC(α)Cmax \alpha^* = \arg\min_{\alpha \in \mathcal{A}} \mathcal{L}{\text{val}}(w^*(\alpha), \alpha) \quad \text{subject to} \quad C(\alpha) \leq C{\text{max}}

其中 w(α)w^(\alpha) 代表了架构 α\alpha 的最优权重,通过最小化训练损失获得:

w(α)=argminwtrain(w,α) w^(\alpha) = \arg\min_{w} \mathcal{L}_{\text{train}}(w, \alpha)

这种公式揭示了 NAS 的核心挑战:评估每个候选架构都需要昂贵的训练以达到收敛,这使得穷举搜索变得不可行。一个每层有 10 个设计选择的搜索空间,在 20 层的情况下会产生 102010^{20} 种可能的架构。对每种架构进行 100 个 epoch 的训练将需要数百万 GPU 年。高效的 NAS 方法通过三个关键的设计决策来应对这一挑战:定义可处理的搜索空间、采用高效的搜索策略和加速架构评估。

搜索空间设计

搜索空间定义了 NAS 可以发现的架构。设计良好的搜索空间结合领域知识,将搜索集中在有希望的区域内,同时保持足够的灵活性以发现新颖的模式。

基于 Cell 的搜索空间

与搜索整个网络架构不同,基于单元的 NAS 搜索可重用计算块(单元),这些块可以堆叠形成完整的网络。例如,一个卷积单元可能从 3×3 卷积、5×5 卷积、深度可分离卷积、最大池化或恒等连接等操作中选择。具有 4 个节点和每条边 2 个操作的简化单元大约有 10,000 种可能的设计,这比搜索完整架构要容易得多。EfficientNet 使用这种方法来发现可扩展的单元设计,这些设计可以推广到不同的模型大小。

硬件感知搜索空间

硬件感知 NAS 将搜索空间扩展到包括部署约束作为首要目标。而不是仅仅为了优化准确性和 FLOPs,搜索明确地最小化在目标硬件(移动 CPU、GPU、边缘加速器)上的实际延迟。MobileNetV3 的搜索空间包括一个延迟预测模型,该模型估计每个候选架构在 Pixel 手机上的推理时间,而无需实际部署它们。这种硬件在环方法确保发现的架构在真实设备上运行效率高,而不仅仅是实现低理论 FLOP 计数。

搜索策略

搜索策略决定了如何有效地在架构空间中导航,而不进行穷举枚举。不同的策略在搜索成本、架构多样性和最优性保证之间做出不同的权衡,如表 10.6 中总结。

表 10.6:NAS 搜索策略比较:不同 NAS 方法在搜索效率、用例和限制之间的权衡。强化学习以高成本提供无约束的探索,进化方法利用并行性,基于梯度的方法通过潜在的优化权衡实现显著加速。

策略 搜索效率 何时使用 主要挑战
强化学习 400-1000 GPU 天 新领域,无约束搜索 高计算成本
进化算法 200-500 GPU 天 可用并行基础设施 需要大量种群
基于梯度的(DARTS) 1-4 GPU 天 计算预算有限 可能收敛到次优局部最小值

基于强化学习的 NAS 将架构搜索视为一个序列决策问题,其中控制器生成架构并接收准确性作为奖励。控制器(通常是 LSTM)通过策略梯度优化学习在时间上提出更好的架构。虽然这种方法发现了像 NASNet 这样的突破性架构,但其序列性质限制了并行性,需要数百个 GPU 天。

进化算法维护一个候选架构的种群,并通过迭代应用突变(改变操作,添加连接)和交叉(结合父架构)来生成后代。基于适应度的选择保留高性能架构用于下一代。AmoebaNet 利用进化实现了最先进的成果,通过大规模并行化将成本分摊到数千个工作者身上。

基于梯度的方法,如 DARTS(可微分架构搜索),将搜索空间表示为一种连续松弛,其中所有可能的操作都是加权组合。DARTS 不同于离散采样,它通过梯度下降联合优化架构权重和模型权重。通过使搜索可微分,DARTS 将搜索成本从数百个 GPU 天减少到仅 1-4 个 GPU 天,尽管连续松弛可能会错过离散搜索方法发现的离散架构模式。

实践中的 NAS

硬件感知的 NAS 超越了 FLOPs 作为效率代理的角色,直接优化实际部署指标。MnasNet 的搜索结合了一个在真实手机上测量的数千个架构-延迟对上训练的延迟预测模型。搜索目标通过加权乘积结合准确性和延迟:

奖励(α)=准确度(α)×(L(α)L目标)β \text{Reward}(\alpha) = \text{Accuracy}(\alpha) \times \left(\frac{L(\alpha)}{L_{\text{target}}}\right)^\beta

其中,L(α)L(\alpha)表示测量的延迟,LtargetL_{\text{target}}是延迟约束,而β\beta控制精度-延迟权衡。这种公式惩罚超过延迟目标的架构,同时奖励在预算内实现高精度的架构。MnasNet 发现,具有可变扩张比的倒残差比均匀扩张实现了更好的精度-延迟权衡,这是一个手动探索可能错过的设计洞察。

何时使用 NAS

神经架构搜索是一个强大的工具,但其显著的计算成本要求仔细考虑何时进行投资是合理的。

当处理具有独特约束(如新的加速器架构、极端边缘设备)的新型硬件平台时,NAS 变得有意义,在这些平台上,现有的架构优化不佳。在需要大规模部署(数十亿推理)的情况下,即使 1-2%的效率提升也能证明前期搜索成本是合理的,或者当需要多个部署配置(云、边缘、移动)且这些配置可以分摊到许多变体上时,这也同样合理。

相反,当与标准部署约束(例如,在 NVIDIA GPU 上实现 ResNet-50 精度)工作时,应避免使用 NAS,因为已经存在经过良好优化的架构。同样,如果计算预算有限(可用的 GPU 天数少于 100 天),即使是高效的 NAS 方法如 DARTS 也变得不可行。快速变化的需求也使得 NAS 不切实际,因为架构选择可能在搜索完成之前就过时了。

对于大多数从业者来说,从现有的 NAS 发现的架构(EfficientNet、MobileNetV3、MnasNet)开始,比从头开始运行 NAS 提供更好的投资回报率。这些架构经过高度调优,在多个任务上具有良好的泛化能力。将定制的 NAS 保留在具有真正新颖约束或部署规模可以证明投资合理性的场景中。

架构示例

NAS 已被成功用于设计几个最先进的架构,这些架构在效率和精度方面优于手动设计的模型。这些架构展示了 NAS 如何将缩放优化、计算减少、内存效率和硬件感知设计整合到自动化流程中。

最著名的 NAS 生成的模型之一是 EfficientNet,它是通过一个 NAS 框架发现的,该框架搜索深度、宽度和分辨率缩放的最有效组合。与独立调整这些因素的常规缩放策略不同,NAS 使用复合缩放优化模型,该缩放将一组固定的缩放系数应用于网络,以确保网络以平衡的方式增长。EfficientNet 与之前的架构相比,具有更高的准确性和更少的参数以及更低的 FLOPs,使其非常适合云和移动部署。

另一个关键例子是 MobileNetV3,它使用 NAS 优化了其网络结构以适应移动硬件。搜索过程导致了具有挤压和激励层的倒残差块被发现,这些块在降低计算成本的同时提高了准确性。NAS 还选择了优化的激活函数和高效的深度可分离卷积,与早期的 MobileNet 版本相比,FLOPs 减少了 5×5\times

FBNet 是另一个由 NAS 生成的模型,专门针对移动 CPU 上的实时推理进行了优化。与为通用加速设计的架构不同,FBNet 的搜索过程在训练期间明确考虑了延迟约束,确保最终模型在低功耗硬件上高效运行。类似的方法也用于 TPU 优化的 NAS 模型,其中搜索过程由硬件感知的成本函数引导,以最大化并行执行效率。

NAS 也已被应用于卷积网络之外。NAS-BERT 探索基于 Transformer 的架构,寻找在减少计算和内存开销的同时保持强大自然语言理解能力的有效模型结构。NAS 在设计高效的视觉 Transformer(ViTs)方面特别有用,通过自动发现针对边缘 AI 应用量身定制的轻量级注意力机制。

这些由 NAS 生成的每个模型都展示了自动化架构搜索如何揭示人类设计师可能不会立即直观的新的效率权衡。将效率约束显式编码到搜索过程中,使 NAS 能够系统地产生比手动设计的更计算高效、内存友好和硬件适应的架构 (Radosavovic 等人 2020)。

模型表示优化已经带来了实质性的改进。通过结构剪枝和知识蒸馏,我们将 440MB 的 BERT-Base 模型(Devlin 等人 2018b)转换成了 110MB 的变体,内存占用减少了 75%,只损失了 0.8%的准确度。剪枝模型消除了 40%的注意力头和中间维度,显著减少了参数数量。这一成功引发了一个自然的问题:在模型结构优化后,为什么移动部署仍然无法达到我们的 50ms 延迟目标,持续运行在 120ms?

分析揭示了答案。虽然我们消除了 75%的参数,但每个剩余的矩阵乘法仍然使用 32 位浮点运算(FP32)。剩余的 2750 万个参数消耗了过多的内存带宽:从 DRAM 加载权重到计算单元主导了执行时间。模型结构已优化,但数值表示未优化。每个参数占用 4 字节,有限的移动内存带宽(25-35 GB/s 与服务器 GPU 上的 900 GB/s 相比)创建了一个瓶颈,仅结构优化无法解决。

这说明了为什么模型表示优化只代表全面效率策略的第一个维度。表示技术修改了执行的计算(哪些操作、哪些参数、哪些层执行)。数值精度优化,第二个维度,通过降低权重、激活和算术运算的数值保真度来改变这些计算的执行方式。从 32 位到 8 位表示的转换将内存流量减少了 4 倍,并使移动处理器上执行速度比浮点等效值快 4-8 倍的专用整数算术单元成为可能。

这些精度优化与表示优化协同工作。剪枝的 110MB BERT 模型,当进一步量化到 INT8 精度时,缩小到 28MB,推理延迟降低到 45ms,最终达到了部署目标。量化提供了缺失的部分:结构效率(更少的参数)与数值效率(每个参数的更低精度)相结合,带来了单一技术无法实现的复合效益。

量化与精度优化

量化是一种模型压缩技术,通过将权重和激活的数值精度从浮点数降低到低比特表示,以最小的精度损失减少了模型大小计算成本

当模型表示优化确定执行的计算时,这些计算的效率关键取决于数值精度——我们优化框架的第二个维度。

数值精度决定了权重和激活在计算过程中的表示方式,直接影响内存使用、计算效率和功耗。许多最先进的模型使用高精度浮点格式,如 FP32(32 位浮点),这提供了数值稳定性和高精度(S. Gupta 等人 2015),但增加了存储需求、内存带宽使用和功耗。现代 AI 加速器包括用于低精度计算的专用硬件,允许 FP16 和 INT8 操作以比 FP32 显著更高的吞吐量运行(Y. E. Wang, Wei, 和 Brooks 2019)。降低精度会引入量化误差,这可能会降低精度,其容忍度取决于模型架构、数据集属性和硬件支持。

精度降低与系统性能之间的关系比硬件规格所暗示的要复杂。虽然激进的精度降低(例如,INT8)可以带来令人印象深刻的芯片级性能提升(通常比 FP32 高 4 倍 TOPS),但这些微基准测试可能不会转化为端到端系统的益处。超低精度训练通常需要更长的收敛时间、复杂的混合精度编排和复杂的精度恢复技术,这些技术可能会抵消硬件加速。在数值格式之间进行精度转换会引入计算开销和内存带宽压力,而芯片级基准测试通常忽略这些因素。平衡的方法,如 FP16 混合精度训练,通常在硬件效率和训练收敛之间提供最佳折衷,避免了更激进的量化策略带来的系统级复杂性。

本节探讨了跨越三个复杂级别的精度优化技术:用于快速部署的培训后量化、用于生产系统的量化感知训练,以及针对资源受限环境的极端量化(二值化和三值化)。我们探讨了精度格式之间的权衡、硬件-软件协同设计考虑因素,以及最小化精度下降同时最大化效率提升的方法。

精度和能源

高效的数值表示可以显著减少存储需求、计算延迟和功耗,对移动 AI、嵌入式系统和云推理特别有益。精度级别可以根据特定硬件能力进行调整,以在 AI 加速器(如 GPU、TPU、NPU 和边缘 AI 芯片)上最大化吞吐量。

能源成本

除了计算和内存的好处之外,不同数值精度相关的能耗进一步突显了降低精度的益处。如图图 10.13 所示,执行 32 位浮点数加法(FAdd)大约消耗 0.9 pJ,而 16 位浮点数加法只需要 0.4 pJ。同样,32 位整数加法需要 0.1 pJ,而 8 位整数加法的能耗显著降低,仅为 0.03 pJ。当考虑到在数十亿操作中运行的大型模型时,这些节省会累积起来,支持第十八章中概述的可持续性目标。通过量化获得的能效也增强了第十五章中讨论的安全态势,通过减少潜在攻击者可用的计算资源。

图片

图 10.13:能耗:降低精度减少了计算能耗,说明了模型精度之间的权衡。机器学习系统可以通过将浮点运算从 32 位降低到 16 位甚至更低位来优化效率,从而实现显著的节省。来源:IEEE spectrum.

除了直接的计算节省之外,降低数值精度对内存能耗的影响也很大,这通常占用了整个系统的功耗。低精度表示减少了数据存储需求和内存带宽使用,导致更少且更有效的内存访问。这很重要,因为访问内存,尤其是片外 DRAM,比执行算术运算消耗的能量要大得多。例如,DRAM 访问需要比缓存访问高几个数量级的能量(例如,8 KB L1 缓存访问需要 10 pJ),而缓存访问只需要 10 pJ。指令能耗的分解突显了在内存层次结构中移动数据所付出的代价,其中指令的总能耗可能会受到内存访问模式的影响 31。

通过降低数值精度,模型不仅可以更高效地执行计算,还可以减少数据移动,从而降低整体能耗。这对于硬件加速器和边缘设备尤为重要,在这些设备中,内存带宽和能效是关键约束。

性能提升

图 10.14 使用双轴条形图展示了量化对推理时间和模型大小的影响。每个类别中的左侧条形显示了从 FP32 转换为 INT8 时的推理时间改进,而右侧条形则描述了相应的模型大小减少。结果表明,量化模型可以实现高达4×4\times的更快推理速度,同时将存储需求减少一个4×4\times的因子,这使得它们在资源受限的环境中高度适用。

图片

图 10.14:量化影响:从 FP32 转换为 INT8 可以将推理时间减少高达 4 倍,同时将模型大小减少一个 4 倍的因子,这使得模型在资源受限的环境中更加高效。

然而,降低数值精度会带来权衡。较低的精度格式可能导致数值不稳定和量化噪声,可能影响模型精度。一些架构,如大型基于 Transformer 的自然语言处理模型,对量化有很好的容忍度,而其他架构可能会经历显著的退化。因此,选择适当的数值精度需要平衡精度约束、硬件支持和效率提升。

图片

图 10.15:按 p(x)加权的量化误差。

图 10.15 展示了按值概率分布加权的量化误差,比较了不同的数值格式(FP8 变体和 INT8)。误差分布突出了不同格式如何在值范围内引入不同水平的量化噪声,这反过来又影响模型的精度和稳定性。

数值编码和存储

在机器学习系统中,数值数据的表示不仅限于精度水平,还包括编码格式和存储机制,这两者都显著影响计算效率。数值值的编码决定了浮点数和整数表示如何在内存中存储并由硬件处理,这直接影响到机器学习工作负载的性能。随着机器学习模型的大小和复杂性增加,优化数值编码对于确保效率变得越来越重要,尤其是在专用硬件加速器上(Mellempudi 等人 2019)。

在机器学习中广泛使用的浮点数表示遵循IEEE 754 标准,该标准定义了如何使用符号、指数和尾数(分数)比特的组合来表示数字。标准格式如 FP32(单精度)和 FP64(双精度)提供了高精度,但需要大量的内存和计算资源。为了提高效率,引入了低精度格式如 FP16、bfloat16FP8,它们提供了较低的存储需求,同时保持了机器学习计算所需的足够数值范围。与 FP16 不同,bfloat16 保留了与 FP32 相同的指数大小,允许它表示更宽的动态范围,同时在分数上降低精度。这一特性使得 bfloat16 特别适用于机器学习训练,在保持动态范围对于稳定的梯度更新很重要的情况下。

基于整数的表示,包括 INT8 和 INT4,通过消除指数和尾数编码的需要,进一步减少了存储和计算开销。这些格式在量化推理中常用,其中模型权重和激活被转换为离散的整数值,以加速计算并降低功耗。整数算术的确定性简化了硬件上的执行,使其特别适合边缘 AI 和移动设备。在极端情况下,二进制和三进制表示将值限制在仅一个或两个比特,从而显著减少了内存占用和功耗。然而,除非辅以专门的训练技术或架构调整,否则这种激进的量化可能会降低模型精度。

新兴的数值格式试图在效率和精度之间取得平衡。TF32,由 NVIDIA 为 Ampere GPU 引入,通过减少尾数大小而保持指数宽度,允许以最小的精度损失进行更快的计算。类似地,FP8,在 AI 加速器中得到采用,提供了一个更低精度的浮点数替代方案,同时保留了一个与机器学习工作负载很好地对齐的结构(Micikevicius 等人 2022)。其他如PositFlexpointBF16ALT等替代格式也在探索其潜在的数值稳定性和硬件适应性优势。

数字编码的效率还受到数据在内存中存储和访问方式的影响。AI 加速器通过优化内存层次结构来最大化减少精度格式的优势,使用专门的硬件,如张量核心、矩阵乘法单元(MMUs)和向量处理引擎来加速低精度计算。在这些平台上,数据对齐、内存分块和压缩技术在确保减少精度计算带来实际性能提升方面发挥着重要作用。

随着机器学习系统的演变,数值编码和存储策略将继续适应以满足大规模模型和多样化硬件环境的需求。针对 AI 工作负载定制的精度格式的持续开发突出了与底层硬件能力协同设计数值表示的重要性,确保机器学习模型在最小化计算成本的同时实现最佳性能。

数值格式比较

表 10.7 比较了机器学习中常用的数值精度格式,突出了它们在存储效率、计算速度和能耗方面的权衡。FP8 和 TF32 等新兴格式已被引入以进一步优化性能,尤其是在 AI 加速器上。

表 10.7:数值精度格式比较。

精度格式 位宽 存储减少(与 FP32 相比) 计算速度(与 FP32 相比) 功耗 用例
--- --- --- --- --- ---
FP32 (单精度浮点) 32 位 基准(1 倍) 基准(1 倍) 较高 训练与推理(通用)
FP16 (半精度浮点) 16 位 小 2 倍 在 FP16 优化硬件上快 2 倍 较低 加速训练,推理(NVIDIA 张量核心,TPUs)
bfloat16 (脑浮点) 16 位 小 2 倍 与 FP16 速度相似,动态范围更好 较低 在 TPUs 上训练,基于转换器的模型
TF32 (TensorFloat-32) 19 位 类似于 FP16 在 NVIDIA Ampere GPU 上最高可快 8 倍 较低 在 NVIDIA GPU 上训练
FP8 (浮点 8 位) 8 位 小 4 倍 在某些情况下比 INT8 快 显著较低 高效训练/推理(H100,AI 加速器)
INT8 (8 位整数) 8 位 小 4 倍 比 FP32 快 4-8 倍 显著较低 量化推理(边缘 AI,移动 AI,NPUs)
INT4 (4 位整数) 4 位 小 8 倍 依赖于硬件 极低 超低功耗 AI,实验性量化
二进制/三进制(1 位/2 位) 1-2 位 16-32 倍更小 极度依赖于硬件 最低 极端效率(二进制/三进制神经网络)

FP16 和 bfloat16 格式在保持模型精度的同时提供了适度的效率提升。许多 AI 加速器,如 NVIDIA Tensor Cores 和 TPUs,都包括对 FP16 计算的专用支持,这使得与 FP32 相比,矩阵运算速度提高了2×2\times。特别是 BFloat16,它保留了与 FP32 相同的 8 位指数,但具有减少的 7 位尾数,使其能够保持类似的动态范围(~103810^{-38}103810^{38}),同时牺牲了精度。相比之下,FP16 具有 5 位指数和 10 位尾数,其动态范围显著减小(~10510^{-5}10510⁵),使其更适合推理而不是训练。由于 BFloat16 保留了 FP32 的指数大小,它更好地处理训练过程中遇到的极端值,而 FP16 可能难以处理下溢或上溢。这使得 BFloat16 成为需要广泛动态范围的深度学习工作负载的更稳健的替代方案。

图 10.16 突出了这些差异,展示了位宽分配如何影响精度和数值范围之间的权衡。

图 10.16:浮点精度:FP16 和 bfloat16 等低精度格式以计算效率和内存节省为代价,牺牲了数值范围。BFloat16 保持了 FP32 的指数大小,保留了其动态范围和训练适用性,而 FP16 较小的指数限制了其在推理或仔细缩放的训练场景中的应用。

INT8 精度提供了更激进的效率提升,尤其是在推理工作负载中。许多量化模型使用 INT8 进行推理,通过4×4\times减少存储,并在优化硬件上加速计算 4–8×\times。INT8 在移动和嵌入式 AI 中得到了广泛应用,在这些领域中能源限制是显著的。

二进制和三进制网络代表了量化的极端,其中权重和激活被限制为 1 位(二进制)或 2 位(三进制)值。这导致了巨大的存储和能源节省,但除非使用专门的架构,否则模型精度通常会显著下降。

精度降低的权衡

在机器学习系统中降低数值精度可以显著提高效率,包括降低内存需求、减少功耗和增加计算吞吐量。然而,这些好处伴随着权衡,因为低精度表示引入了数值误差和量化噪声,这可能会影响模型精度。这种影响程度取决于多个因素,包括模型架构、数据集和使用的特定精度格式。

模型对量化的容忍度各不相同。大型架构,如卷积神经网络和基于转换器的模型,即使在使用 bfloat16 或 INT8 等低精度格式的情况下,通常也能保持高精度。相比之下,小型模型或训练需要高数值精度的任务可能会经历性能的更大下降。神经网络中的所有层对精度降低的反应并不相同。某些层,如批归一化和注意力机制,可能比标准前馈层对数值精度更敏感。因此,混合精度训练等技术,其中不同层以不同精度级别运行,可以帮助在优化计算效率的同时保持精度。

硬件支持是决定精度降低有效性的另一个重要因素。人工智能加速器,包括 GPU、TPU 和 NPU,都配备了专门的低精度算术单元,这些单元能够使用 FP16、bfloat16、INT8,以及最近出现的 FP8 进行高效计算。这些架构利用降低的精度来执行高吞吐量矩阵运算,提高速度和能源效率。相比之下,通用 CPU 通常缺乏用于低精度计算的专用硬件,限制了数值量化潜在效益的实现。引入新的浮点格式,如 NVIDIA GPU 的 TF32 和人工智能加速器的 FP8,旨在优化精度和效率之间的权衡,为未明确设计用于极端量化的硬件提供替代方案。

除了硬件限制之外,降低数值精度还会影响功耗。低精度算术减少了所需的内存访问次数并简化了计算操作,从而降低了整体能耗。这对于移动设备和边缘人工智能系统等能源受限的环境尤其有利。在极端情况下,包括 INT4 和二进制/三进制表示在内的超低精度格式,在功耗和内存使用方面提供了显著的降低。然而,这些格式通常需要专门的架构来补偿与这种激进量化相关的精度损失。

为了减轻与降低精度相关的精度损失,可以采用各种量化策略。最终,为给定的机器学习模型选择适当的数值精度需要在效率提升和精度约束之间进行平衡。这个选择取决于模型的架构、目标应用的计算需求以及底层硬件对低精度操作的支持。通过利用硬件和软件优化技术的进步,从业者可以有效地将低精度数值集成到机器学习管道中,在保持性能的同时最大化效率。

精度降低策略

降低数值精度是提高机器学习模型效率的重要优化技术。通过降低权重和激活的位宽,模型可以减少内存占用,提高计算吞吐量,并降低功耗。然而,简单的量化可能会引入量化误差,导致精度下降。为了解决这个问题,已经开发出不同的精度降低策略,允许模型在保持预测性能的同时平衡效率提升。

量化技术可以在模型生命周期的不同阶段应用。训练后量化在训练后降低精度,使其成为优化推理的简单且低成本方法。量化感知训练将量化效果纳入训练过程,使模型能够适应较低的精度并保持较高的精度。混合精度训练利用硬件支持动态地为不同的计算分配精度级别,优化执行效率而不牺牲精度。

为了帮助导航日益增加的复杂性,图 10.17 将量化技术根据实现复杂性、资源需求和目标用例分为三个渐进层次。

图 10.17

图 10.17:量化复杂性路线图:量化技术的三个渐进层次,从适合快速部署的基础方法到针对极端资源限制的研究前沿方法,反映了不断增加的实现努力、资源需求和潜在的精度权衡。

训练后量化

量化是在解决内存墙问题时实现显著内存带宽降低的特定算法技术。这些量化方法在不同平台上提供标准化的 API,明确展示了如何实现之前建立的效率原则。

训练后量化(PTQ)在训练后降低数值精度,将权重和激活从高精度格式(FP32)转换为低精度表示(INT8 或 FP16)而无需重新训练 (Jacob et al. 2018b)。这实现了更小的模型尺寸、更快的计算和更低的能耗,使其适用于资源受限的环境,如移动设备、边缘 AI 系统和云推理平台 (H. Wu et al. 2020)。

PTQ 的主要优势是计算成本低——无需重新训练或访问训练数据。然而,降低精度会引入量化误差,这可能会降低准确性,尤其是对于需要精细数值精度的任务。机器学习框架(TensorFlow Lite、ONNX Runtime、PyTorch)提供了内置的 PTQ 支持。

PTQ 功能

PTQ 将训练模型的权重和激活从高精度浮点表示(例如,FP32)转换为低精度格式(例如,INT8 或 FP16)。这个过程减少了模型的内存占用,加速了推理,并降低了功耗。然而,由于低精度格式具有较小的数值范围,量化会引入舍入误差,这可能会影响模型准确性。

PTQ 的核心机制是将高精度值缩放并映射到较小的数值范围。一种广泛使用的方法是均匀量化,它使用一致的缩放因子将浮点值映射到离散整数级别。在均匀量化中,每个量化值之间的间隔是恒定的,这简化了实现并确保了在硬件上的高效执行。量化值 qq 的计算如下:q=round(xs) q = \text{round} \left(\frac{x}{s} \right) 其中:

  • qq 是量化整数表示,

  • xx 是原始浮点值,

  • ss 是一个缩放因子,它将浮点范围映射到可用的整数范围。

列表 10.2 展示了从 FP32 到 INT8 的均匀量化。

列表 10.2:均匀量化:将 FP32 权重转换为 INT8 格式,实现 4 倍内存减少的同时测量量化误差。

import torch

# Original FP32 weights
weights_fp32 = torch.tensor(
    [0.127, -0.084, 0.392, -0.203], dtype=torch.float32
)
print(f"Original FP32: {weights_fp32}")
print(f"Memory per weight: 32 bits")

# Simple uniform quantization to INT8 (-128 to 127)
# Step 1: Find scale factor
max_val = weights_fp32.abs().max()
scale = max_val / 127  # 127 is max positive INT8 value

# Step 2: Quantize using our formula q = round(x/s)
weights_int8 = torch.round(weights_fp32 / scale).to(torch.int8)
print(f"Quantized INT8: {weights_int8}")
print(f"Memory per weight: 8 bits (reduced from 32)")

# Step 3: Dequantize to verify
weights_dequantized = weights_int8.float() * scale
print(f"Dequantized: {weights_dequantized}")
print(
    f"Quantization error: "
    f"{(weights_fp32 - weights_dequantized).abs().mean():.6f}"
)

此示例演示了从 32 位到每个权重 8 位的压缩,量化误差最小。

例如,在 INT8 量化中,模型的浮点值(通常范围在[r,r][-r, r]之间)被映射到一个整数范围[128,127][-128, 127]。缩放因子确保在减少精度损失的同时保留了最重要的信息。一旦模型被量化,推理就使用整数算术进行,这在许多硬件平台上比浮点运算效率高得多(Gholami 等人 2021)。然而,由于舍入误差和数值逼近,量化模型与全精度模型相比可能会出现轻微的精度下降。

一旦模型被量化,推理就使用整数算术进行,这在许多硬件平台上比浮点运算效率高得多。然而,由于舍入误差和数值逼近,量化模型与全精度模型相比可能会出现轻微的精度下降。

除了均匀量化之外,还可以采用非均匀量化来在特定场景中保留精度。与使用一致缩放因子的均匀量化不同,非均匀量化将更细粒度的精度分配给数值范围,这些范围更密集。这种方法对于权重分布集中在某些值的模型来说是有益的,因为它允许在最重要的地方保留更多细节。然而,非均匀量化通常需要更复杂的校准,并可能涉及额外的计算开销。尽管在生产环境中非均匀量化不如均匀量化常用,但对于特别敏感于精度变化的模型,非均匀技术可以有效地保留精度。

PTQ 对于计算机视觉模型特别有效,其中 CNN 通常可以很好地容忍量化。然而,依赖于微小数值差异的模型,如 NLP 转换器或语音识别模型,可能需要额外的调整或替代量化技术,包括非均匀策略,以保留性能。

校准

PTQ 的一个重要方面是校准步骤,它涉及选择对量化模型权重和激活最有效的裁剪范围 [α\alpha, β\beta]。在 PTQ 过程中,模型的权重和激活被转换为低精度格式(例如,INT8),但这种减少的有效性在很大程度上取决于所选的量化范围。如果没有适当的校准,量化过程可能会引起显著的精度下降,即使整体精度有所降低。校准确保所选范围最小化信息损失,并有助于在精度降低后保持模型性能。

图 10.18 展示了训练后量化的整体工作流程。该过程从预训练模型开始,作为优化的起点。为了确定有效的量化范围,一个校准数据集,即训练或验证数据的一个代表性子集,被传递到模型中。这一步骤允许校准过程估计激活和权重的数值分布,然后用于定义量化的裁剪范围。校准之后,量化步骤将模型参数转换为低精度格式,生成最终的量化模型,在内存和计算效率方面更为高效。

图 10.18:训练后量化:使用代表性数据集进行校准,确定模型权重和激活的最佳量化范围,最小化量化过程中的信息损失,以创建高效、低精度的模型。此过程将预训练模型转换为适合在资源受限设备上部署的量化版本。

例如,考虑将原本在-6 到 6 之间的浮点范围激活量化为 8 位整数。简单地使用-128 到 127 的完整整数范围进行量化可能不是最有效的方法。相反,校准涉及通过模型传递一个代表性数据集,并观察激活的实际范围。然后可以使用观察到的范围来设置一个更有效的量化范围,从而减少信息损失。

校准方法

常用的校准方法有几种:

  • 最大值:此方法使用校准期间观察到的最大绝对值作为裁剪范围。虽然简单,但容易受到异常数据的影响。例如,在图 10.19 所示的激活分布中,我们看到 2.1 附近的异常值簇,而其余的值则聚集在较小的值周围。如果异常值显著影响量化,最大值方法可能导致不高效的范围。

  • :此方法通过使用 KL 散度,最小化原始浮点值与量化格式所能表示的值之间的信息损失。这是 TensorRT 使用的默认校准方法,当试图保留原始值的分布时效果良好。

  • 百分位数:此方法将裁剪范围设置为校准期间观察到的绝对值分布的百分位数。例如,99%的校准将裁剪最大值中最大的 1%。此方法有助于避免异常值的影响,因为异常值不代表一般数据分布。

图 10.19:激活分布:Resnet50 层的激活表现出长尾分布,其中一小部分值显著大于大多数值;这种分布影响量化范围的选择,因为如果不小心处理,异常值可能导致精度使用效率低下。来源:(H. Wu 等人 2020)。

校准的质量直接影响量化模型的性能。不良的校准可能导致模型精度损失严重,而良好的校准模型在量化后仍能保留大部分原始性能。需要考虑两种类型的校准范围:

  • 对称校准:裁剪范围围绕零对称,意味着正负范围具有相同的缩放。

  • 非对称校准:裁剪范围不是对称的,这意味着正负范围可能具有不同的缩放因子。当数据不是围绕零中心时,这可能很有用。

选择正确的校准方法和范围对于在提高效率的同时保持模型精度非常重要。

校准范围

在训练后量化中的一个关键挑战是选择合适的校准范围[α,β][\alpha, \beta],以将浮点值映射到低精度表示。这个范围的选择直接影响量化误差,从而影响量化模型的精度。如图图 10.20 所示,有两种主要的校准策略:对称校准和非对称校准。

图片

图 10.20:校准范围选择:对称校准使用围绕零的固定范围,而非对称校准则根据数据分布调整范围,可能最小化量化误差并保持模型精度。选择合适的校准策略需要在精度与异常值饱和风险之间取得平衡。

在图 10.20 的左侧,展示了对称校准,其中裁剪范围以零为中心。范围从α=1\alpha = -1扩展到β=1\beta = 1,将这些值映射到整数范围[127,127][-127, 127]。这种方法确保了正负值被同等对待,保留了以零为中心的分布。对称校准的一个关键优势是其简化了实现,因为相同的比例因子应用于正负值。然而,这种方法可能不适合激活分布偏斜的数据集,导致数据的重要部分表示不佳。

在右侧,展示了非对称校准,其中 α=0.5\alpha = -0.5β=1.5\beta = 1.5。在这里,零被映射到一个偏移的量化值 Z-Z,范围非对称地扩展。在这种情况下,量化尺度被调整以考虑非零均值分布。非对称校准在激活或权重表现出偏斜时特别有用,确保了整个量化范围的充分利用。然而,它引入了确定最佳偏移和缩放因子的额外计算复杂性。

这些校准策略之间的选择取决于模型和数据集的特征:

  • 当权重分布围绕零中心时,对称校准通常被使用,这对于良好初始化的机器学习模型来说是常见情况。它简化了计算和硬件实现,但可能不是所有场景的最佳选择。

  • 当数据分布偏斜时,非对称校准是有用的,确保了整个量化范围的充分利用。它可以提高准确性保留,但可能在确定最佳量化参数时引入额外的计算复杂性。

许多机器学习框架,包括 TensorRT 和 PyTorch,都支持这两种校准模式,使从业者能够经验性地评估最佳方法。选择合适的校准范围对于 PTQ 很重要,因为它直接影响数值精度和效率之间的权衡,最终影响量化模型的性能。

粒度

在确定截断范围之后,优化量化的下一步涉及调整截断范围的粒度,以确保模型尽可能保留准确性。例如,在卷积神经网络(CNNs)中,某一层的输入激活会与多个卷积滤波器进行卷积,每个滤波器可能具有独特的值范围。因此,量化过程必须考虑到这些滤波器之间范围的不同,以保持模型性能。

如图 10.21 所示,滤波器 1 的范围显著小于滤波器 3 的范围,这展示了不同滤波器之间值的大小的变化。确定权重剪裁范围[α\alpha, β\beta]的精度成为有效量化的重要因素。这种范围的可变性是采用基于粒度的不同量化策略的关键原因。

图片

图 10.21:量化范围变化:不同的卷积滤波器表现出独特的激活范围,需要针对每个滤波器进行量化以最小化量化过程中的精度损失。调整剪裁范围的粒度——如每个滤波器不同的刻度所示——优化了模型大小和性能之间的权衡。来源:(Gholami 等人 2021)。

确定量化粒度的几种常用方法各有其权衡,包括精度、效率和计算成本。

层量化

在这种方法中,剪裁范围是通过考虑层中卷积滤波器的所有权重来确定的。相同的剪裁范围应用于层内的所有滤波器。虽然这种方法易于实现,但由于不同滤波器之间值范围的广泛性,它通常会导致次优精度。例如,如果同一层中的一个卷积核的值范围比另一个窄,则较窄范围的量化分辨率可能会受损,从而导致信息丢失。

分组量化

分组量化将卷积滤波器分为组,并为每个组计算一个共享的剪裁范围。当层内值的分布高度可变时,这种方法可能有益。例如,Q-BERT 模型(Shen 等人 2019)在量化 Transformer 模型(Vaswani 等人 2017)时应用了这项技术,特别是对于全连接注意力层。虽然分组量化比层量化提供了更高的精度,但它由于需要考虑多个缩放因子而增加了额外的计算成本。

通道量化

通道量化为每个卷积滤波器分配一个专门的裁剪范围和缩放因子。这种方法确保了量化具有更高的分辨率,因为每个通道都是独立量化的。通道量化在实践中被广泛使用,因为它通常比以前的方法提供更好的精度。通过允许每个滤波器都有自己的裁剪范围,这种方法确保了量化过程针对每个滤波器的特定特征进行了定制。

子通道量化

子通道量化将每个卷积滤波器细分为更小的组,每组都有自己的裁剪范围。尽管它提供了对量化的非常精细的控制,但它引入了显著的计算开销,因为必须在滤波器内的每个组中管理多个缩放因子。因此,尽管计算成本增加,子通道量化通常仅在需要最大精度的场景中使用。

在这些方法中,通道量化是量化卷积滤波器的当前标准。它在更细粒度带来的精度提升和实际部署所需的计算效率之间取得了平衡。调整每个单独内核的裁剪范围可以显著提高模型精度,同时开销最小,这使得它成为机器学习应用中最广泛采用的方法。

权重与激活

权重量化涉及将模型的连续、高精度权重转换为低精度值,例如将 32 位浮点(Float32)权重转换为 8 位整数(INT8)权重。如图图 10.22 所示,权重量化发生在输入乘法的第二步(红色方块)中。这个过程显著减小了模型大小,减少了存储模型所需的内存和推理所需的计算资源。例如,一个具有 Float32 权重的神经网络层的权重矩阵,如[0.215,1.432,0.902,][0.215, -1.432, 0.902,\ldots],可能映射到 INT8 值,如[27,183,115,][27, -183, 115, \ldots],从而显著减少内存使用。

图片

图 10.22:量化和权重精度:将权重和激活精度从 float32 降低到 INT8,通过使用更少的位来表示值,可以显著降低推理过程中的模型大小和计算成本,尽管这可能会与模型精度产生权衡。这个过程改变了模型参数和中间结果的数值表示,影响内存使用和处理速度。来源:HarvardX。

激活量化是指在模型推理过程中量化激活值或层输出的过程。这种量化可以减少推理过程中所需的计算资源,尤其是在针对优化整数运算的硬件时。它引入了与保持模型精度相关的问题,因为中间计算的精度降低了。例如,在 CNN 中,由卷积层产生的激活图(或特征图),最初以 Float32 表示,在推理过程中可能被量化为 INT8。这可以在能够高效处理低精度整数的硬件上显著加速计算。

最近的研究探索了用于大型语言模型(LLMs)压缩和加速的激活感知权重量化(AWQ)。这种方法通过观察激活而不是权重本身,仅保护一小部分最显著的权重,大约 1%。这种方法已被证明可以提高模型效率,同时保持精度,如 Ji Lin, Tang, 等人 2023 中所讨论。

静态量化与动态量化

在确定截断范围的类型和粒度之后,从业者必须决定在量化算法中何时计算截断范围。量化激活值主要有两种方法:静态量化和动态量化。

静态量化是更常用的方法。在静态量化中,截断范围是预先计算的,并在推理过程中保持固定。这种方法在运行时不引入任何额外的计算开销,因此在计算资源方面效率很高。然而,固定的范围可能导致与动态量化相比的精度降低。静态量化的典型实现包括运行一系列校准输入来计算激活值的典型范围(Jacob 等人 2018b;Yao 等人 2021)。

与此相反,动态量化在运行时动态计算每个激活图的范围。这种方法允许量化过程根据输入实时调整,可能由于范围是针对每个输入激活专门计算的,因此可能产生更高的准确度。然而,动态量化需要更高的计算开销,因为必须在每个步骤中重新计算范围。尽管这通常会导致更高的准确度,但实时计算可能非常昂贵,尤其是在大规模部署时。

下表 表 10.8 总结了训练后量化、量化感知训练和动态量化的特征,概述了它们各自的优势、局限性和权衡。这些方法在各个规模的机器学习系统中广泛部署,理解它们的优缺点对于选择适合特定应用的方法非常重要。

表 10.8:量化权衡:训练后量化、量化感知训练和动态量化代表了模型压缩的不同方法,每种方法都在机器学习系统中平衡准确度、计算成本和实现复杂性。理解这些权衡对于根据应用需求和资源限制选择最佳量化策略非常重要。

方面 训练后量化 量化感知训练 动态量化
Pros
简单性
准确度保持
适应性
优化性能 可能
Cons
准确度下降 可能
计算开销
实现复杂性
权衡
速度 vs. 准确度
准确度 vs. 成本
适应性 vs. 开销
PTQ 优点

PTQ 的一个关键优点是其低计算成本,因为它不需要重新训练模型。这使得它成为快速部署训练模型的吸引人选择,尤其是在重新训练计算成本高昂或不可行的情况下。由于 PTQ 只修改权重和激活的数值表示,因此底层模型架构保持不变,允许它应用于广泛的预训练模型而无需修改。

PTQ 通过减少模型参数的位宽提供了显著的内存和存储节省。例如,将模型从 FP32 转换为 INT8 会导致存储大小减少4×4\times,这使得在资源受限的设备上部署更大的模型成为可能,例如手机、边缘 AI 硬件和嵌入式系统。这些内存占用减少也导致在通过网络系统传输模型时带宽需求降低。

在计算效率方面,PTQ 允许使用整数算术进行推理,这在许多硬件平台上比浮点运算更快。AI 加速器,如 TPUs 和神经网络单元(NPUs),针对低精度计算进行了优化,在执行量化模型时能够实现更高的吞吐量和降低功耗。这使得 PTQ 特别适用于需要实时推理的应用,例如自主系统中的目标检测或移动设备上的语音识别。

PTQ 的挑战和局限性

尽管 PTQ 具有优势,但在将浮点值映射到离散的低精度表示时,由于舍入效应,它引入了量化误差。虽然一些模型对这些变化具有鲁棒性,但其他模型可能会经历显著的准确度下降,尤其是在依赖于微小数值差异的任务中。

准确度损失的程度取决于模型架构和任务领域。用于图像分类的 CNN 通常对 PTQ 具有容忍性,即使在激进的 INT8 量化下也能保持接近原始的准确度。在 NLP 和语音识别中使用的基于 Transformer 的模型则更敏感,因为这些架构依赖于注意力机制中数值关系的精度。

为了减轻准确度损失,通常会应用如基于 KL 散度的缩放或逐通道量化等校准技术来微调缩放因子并最小化信息损失。一些框架,包括 TensorFlow Lite 和 PyTorch,提供了具有内置校准方法的自动化量化工具,以提高准确度保留。

PTQ 的另一个局限性是并非所有硬件都支持高效的整数算术。虽然 GPU、TPUs 和专门的边缘 AI 芯片通常包括针对 INT8 推理的专用支持,但通用 CPU 可能缺乏用于低精度执行的优化指令,导致性能提升不佳。

PTQ 并不总是适合用于训练目的。由于 PTQ 在训练后应用量化,需要进一步微调或适应的模型可能从替代方法中受益更多,例如量化感知训练(下文将讨论),以确保在学习过程中充分考虑到精度约束。

培训后量化仍然是提高推理效率最实用和最广泛使用的技术之一。它提供了显著的内存和计算节省,同时开销最小,使其成为在资源受限环境中部署机器学习模型的理想选择。然而,PTQ 的成功取决于模型架构、任务敏感性和硬件兼容性。在精度下降不可接受的情况下,可能需要采用替代量化策略,例如量化感知训练。

培训后量化是更高级量化方法的基础。核心概念——量化工作流程、数值格式权衡和校准方法——在所有精度优化技术中始终至关重要。对于生产截止日期在两周以内且可接受的精度损失为 1-2% 的快速部署场景,PTQ 与 min-max 校准通常提供完整的解决方案。需要低于 1% 精度损失的量产系统应考虑量化感知训练,它通过量化模拟的微调来恢复精度,但代价是额外 20-50% 的训练时间。极端限制,如小于 1MB 的模型或小于 10mW 的功耗预算,可能需要 INT4 或二进制量化,接受 5-20% 的精度下降,这需要架构变更。

量化感知训练

QAT 将量化约束直接集成到训练过程中,在正向传播过程中模拟低精度算术,以允许模型适应量化效应(Jacob 等人 2018b)。这种方法对于需要精细数值精度的模型尤为重要,例如在自然语言处理和语音识别系统中使用的变压器(Nagel 等人 2021b)。图 10.23 展示了 QAT 的过程:量化应用于预训练模型,随后进行微调以适应低精度约束。

图片

图 10.23:量化感知训练:使用模拟的低精度算术重新训练预训练模型,以适应降低数值精度的部署,从而减轻精度损失,在资源受限的设备上实现高效的推理。这个过程使模型对量化效应具有鲁棒性,即使在精度较低的情况下也能保持性能。

在许多情况下,QAT 也可以建立在 PTQ 之上(如前节所述),如图 10.24 所示。不是从全精度模型开始,PTQ 首先应用于使用校准数据生成一个初始量化模型。然后,这个量化模型作为 QAT 的起点,使用训练数据进行额外的微调,有助于模型更好地适应低精度约束。这种混合方法结合了 PTQ 的效率与 QAT 的精度保持,减少了仅使用训练后方法通常相关的退化。

图片

图 10.24:混合量化方法:训练后量化(PTQ)生成一个初始量化模型,该模型作为量化感知训练(QAT)的预热启动,与随机初始化网络的量化相比,加速收敛并减轻精度损失。这个两阶段过程利用了 PTQ 的效率,同时使用训练数据来优化低精度约束下的性能。

训练数学

在正向传播过程中,权重和激活被量化和解量化以模拟降低精度。这个过程通常表示为:q=round(xs)×s q = \text{round} \left(\frac{x}{s} \right) \times s 其中 qq 表示模拟的量化值,xx 表示全精度权重或激活,而 ss 是缩放因子,将浮点值映射到低精度整数。

虽然正向传播使用量化值,但在反向传播中的梯度计算保持全精度。这是通过使用直通估计器(STE)32 实现的,该估计器通过将舍入操作视为具有导数为一的导数来近似量化函数的梯度。这种方法防止了由于量化操作的非可微性质而阻碍梯度,从而允许有效模型训练(Y. Bengio, Léonard, and Courville 2013a)。

在训练过程中整合量化效果使模型能够学习一个最优的权重和激活分布,以最小化数值精度损失的影响。当使用真正的低精度算术(例如,INT8 推理)部署时,所得到的模型与事后量化的模型相比,保持了显著更高的精度(Krishnamoorthi 2018)。

QAT 优势

QAT33 的一个主要优势是,即使在低精度推理条件下,也能保持模型精度。在训练过程中引入量化有助于模型补偿精度损失,减少舍入误差和数值不稳定性。这对于在 NLP、语音识别和高分辨率计算机视觉中常用的量化敏感模型来说非常重要(Gholami 等人 2021)。

另一个主要好处是,QAT 允许在硬件加速器上进行低精度推理,而不会显著降低精度。AI 处理器,如 TPUs、NPUs 和专用边缘设备,包括用于整数操作的专用硬件,这使得 INT8 模型比 FP32 模型运行得更快,能耗更低。考虑到量化效果进行训练确保最终模型可以充分利用这些硬件优化(H. Wu 等人 2020)。

QAT 挑战与权衡

尽管 QAT 有其好处,但在训练过程中会引入额外的计算开销。每次前向传递时的模拟量化会减慢训练速度,相对于全精度方法。这个过程增加了训练计划的复杂性,使得 QAT 对于可能因额外训练时间而变得不可行的超大规模模型来说不太实用。

QAT 引入了额外的超参数和设计考虑,例如选择合适的量化方案和缩放因子。与 PTQ(在训练后应用量化)不同,QAT 需要仔细调整训练动态,以确保模型能够适当地适应低精度约束(Gong 等人 2019)。

表 10.9 总结了 QAT 与 PTQ 的关键权衡:

表 10.9:量化权衡:量化感知训练(QAT)通过将量化纳入训练过程,最小化由降低数值精度引起的精度损失,而训练后量化(PTQ)提供了更快的部署,但可能需要校准以减轻精度退化。与将 PTQ 应用于预训练模型相比,QAT 的重新训练需求增加了训练复杂性。

方面 QAT (量化感知训练) PTQ (训练后量化)
精度保留 最小化量化带来的精度损失 可能会遭受精度退化
推理效率 优化用于低精度硬件(例如,TPU 上的 INT8) 优化但可能需要校准
训练复杂度 需要使用量化约束重新训练 不需要重新训练
训练时间 由于正向传播中模拟量化而变慢 由于量化是在事后应用而变快
部署准备 适用于对量化误差敏感的模型 优化模型以用于推理的最快方式

将量化集成到训练过程中比训练后量化更有效地保留了模型准确性,尽管这需要额外的训练资源和时间。

PTQ 与 QAT

PTQ 和 QAT 之间的选择取决于精度、计算成本和部署约束之间的权衡。PTQ 提供了一种计算成本低的优化方法,只需要训练后的转换,使其非常适合快速部署。然而,其有效性因架构而异——CNN 对 PTQ 的容忍度较好,而 NLP 和语音模型可能由于依赖精确数值表示而经历退化。

当高精度保留至关重要时,QAT 是必要的。在训练过程中集成量化效果允许模型适应低精度算术,减少量化误差(Jacob et al. 2018c)。虽然实现了更高的低精度准确性,但 QAT 需要额外的训练时间和计算资源。在实践中,一种混合方法从 PTQ 开始,并针对准确性至关重要的模型选择性地应用 QAT,在效率和性能之间提供了最佳平衡。

极端量化

除此之外,极端量化技术使用 1 位(二值化)或 2 位(三值化)表示来显著降低内存使用和计算需求(Courbariaux, Bengio, and David 2016)。二值化将权重和激活值限制为两个值(通常是-1 和+1,或 0 和 1),大幅减小模型大小并加速在二进制神经网络等专用硬件上的推理(Rastegari et al. 2016)。然而,这种限制严重限制了模型的表达能力,通常会导致在需要高精度的任务(如图像识别或自然语言处理)上的准确性下降(Hubara et al. 2018)。

三值化通过允许三个值(-1、0、+1)扩展了二值化,提供了额外的灵活性,在纯二值化之上略微提高了精度(Zhu 等人 2017)。零值使得稀疏性更高,同时保持了更强的表示能力。这两种技术都需要梯度近似方法,如直通估计器(STE),以处理训练期间的非可微量化操作(Y. Bengio、Léonard 和 Courville 2013b),QAT 集成有助于减轻精度损失(J. Choi 等人 2018)。

挑战和局限性

尽管为嵌入式系统和移动设备实现了超低功耗的机器学习,但二值化和三值化面临着重大挑战。在这种极端量化下,性能维护变得困难,需要能够高效处理二进制或三值操作的专用硬件(Umuroglu 等人 2017)。传统处理器缺乏对这些计算的优化,需要定制硬件加速器。

精度损失仍然是一个关键问题。这些方法适用于对高精度不是关键的任务,或者 QAT 可以补偿精度约束的任务。尽管存在挑战,但能够在保持可接受精度的同时大幅减少模型大小,这使得它们对边缘 AI 和资源受限环境具有吸引力(Jacob 等人 2018c)。未来在专用硬件和训练技术方面的进步可能会增强它们在高效、可扩展 AI 中的作用。

多技术优化策略

在探讨了量化技术(PTQ、QAT、二值化和三值化)、剪枝方法和知识蒸馏之后,我们现在研究如何系统地结合这些互补方法以实现卓越的优化结果。而不是单独应用技术,集成策略利用不同优化维度之间的协同效应,在保持模型精度的同时最大限度地提高效率。

每种优化技术都针对模型效率的不同方面:量化减少了数值精度,剪枝消除了冗余参数,知识蒸馏将能力转移到紧凑架构,而 NAS 优化结构设计。这些技术表现出互补特性,使得强大的组合成为可能。

剪枝和量化产生了协同效应,因为剪枝减少了参数数量,而量化减少了精度,从而产生了乘法压缩效果。首先应用剪枝可以减少参数集,使后续的量化更加有效,并减少最佳量化策略的搜索空间。这种顺序方法可以实现超过任何一种技术单独使用的压缩比率。

知识蒸馏通过减轻激进量化带来的精度损失,有效地与量化结合。这种方法训练学生模型以匹配教师的行为,而不仅仅是最小化任务损失,这在直接量化会导致不可接受的精度退化的极端量化场景中特别有效。

神经架构搜索使协同设计方法成为可能,该方法针对量化约束优化模型结构,识别出在低精度操作下保持精度的架构。这种协同设计方法产生的模型天生适合后续优化,提高了量化和剪枝技术的有效性。

如 图 10.25 所示,不同的压缩策略,如剪枝、量化和奇异值分解(SVD),在模型大小和精度损失之间表现出不同的权衡。虽然剪枝与量化(红色圆圈)结合实现了高压缩比和最小精度损失,但单独量化(黄色方块)也提供了合理的平衡。相比之下,SVD(绿色菱形)需要更大的模型大小来保持精度,说明了不同技术如何影响压缩的有效性。

图片

图 10.25:压缩权衡:结合剪枝和量化在保持最小精度损失的情况下实现了优于单独量化或奇异值分解(SVD)的压缩比率,展示了不同数值精度优化技术对模型大小和性能的影响。如图所示,架构和数值优化可以相互补充,以有效地通过此图部署机器学习模型。来源:(Han, Mao, and Dally 2015a)。

量化与剪枝、知识蒸馏和 NAS 不同,它专门关注减少权重和激活的数值精度。虽然量化本身可以提供显著的计算优势,但其有效性可以通过与剪枝、蒸馏和 NAS 等互补技术相结合而得到增强。这些方法针对模型效率的不同方面,共同工作以创建更紧凑、更快、更节能的模型,在受限环境中实现更好的性能。

我们的最优化之旅仍在继续。我们通过结构化剪枝和知识蒸馏将 BERT-Base 从 440MB 剪枝到 110MB,然后将其量化为 INT8,将模型大小减少到 28MB,在移动硬件上的推理延迟从 120ms 降低到 45ms。这些优化将一个不可用的模型转变为接近部署可行性的模型。然而,分析揭示了一个令人困惑的低效问题:理论上的 FLOP 计数表明推理应在 25ms 内完成,但实际执行却需要 45ms。剩下的 20ms 去哪里了?

详细分析揭示了答案。虽然量化降低了精度,但模型仍然不必要地计算零值。结构化剪枝移除了整个注意力头,但剩余的稀疏权重矩阵以密集格式存储,浪费了内存带宽和零值元素的计算。层归一化操作尽管具有内在的并行性,却按顺序运行。模型对所有标记进行相同的处理,即使简单输入可以从浅层退出。GPU 有 40%的执行时间处于空闲状态,等待内存传输而不是执行操作。

这些观察揭示了为什么模型表示和数值精度优化,虽然必要,但不足以解决问题。表示技术确定要执行的计算。精度技术确定单个操作的执行方式。但它们都没有解决如何组织计算和调度以最大化硬件利用率的问题。这是建筑效率优化的领域,也是我们框架的第三个维度。

建筑效率技术本身改变了执行模式。通过专用内核利用稀疏性消除了对剪枝权重的计算。算子融合将顺序操作(层归一化、注意力、前馈)合并为单个 GPU 内核,通过减少内存流量 40%来提高效率。动态计算使得简单输入在 6 层后即可退出,而不是处理所有 12 层。硬件感知调度并行化操作以保持高 GPU 利用率。将这些技术应用于我们的优化 BERT 模型,将推理时间从 45ms 减少到 22ms,最终实现了 25ms 的理论目标,使部署真正可行。

这个进展说明了为什么所有三个优化维度必须协同工作。模型表示提供结构效率(更少的参数)。数值精度提供计算效率(更低的精度算术)。建筑效率提供执行效率(优化的调度和硬件利用率)。只有当所有维度都系统地解决时,才能出现复合效应,即 440MB/120ms → 28MB/22ms(内存减少 16 倍,延迟提高 5.5 倍)。

建筑效率技术

建筑效率优化确保通过将模型操作与处理器能力和内存层次结构对齐,在目标硬件上高效执行计算。与表示优化(确定要执行的计算)和精度优化(确定数值精度)不同,建筑效率解决的是操作如何调度、内存如何访问以及工作负载如何适应输入特性和硬件约束的问题。

这种优化维度在资源受限的场景(第十四章)中尤其重要,在这些场景中,从剪枝和量化中得到的理论 FLOP 减少可能不会在没有架构修改的情况下转化为实际加速。以密集格式存储的稀疏权重矩阵浪费了内存带宽。本可以并行执行的顺序操作未能充分利用 GPU 核心。固定的计算图以相同的方式处理简单和复杂输入,浪费了在非必要工作上的资源。

本节探讨了四种互补的架构效率方法:在模型开发期间积极整合部署约束的硬件感知设计原则、加速剪枝模型计算的稀疏性利用技术、适应输入复杂性的动态计算策略以及通过组合操作减少内存流量的算子融合方法。这些技术将算法优化转化为实际性能提升。

硬件感知设计

硬件感知设计将目标平台约束(内存带宽、处理能力、并行性能力和能量预算)直接纳入模型架构决策中。这种方法不是在训练后优化模型,而是确保计算模式、内存访问和操作类型从一开始就与硬件能力相匹配,从而在多种部署平台上最大化效率。

高效设计原则

为硬件效率设计机器学习模型需要构建架构以考虑计算成本、内存使用、推理延迟和功耗,同时保持强大的预测性能。与训练后优化不同,硬件感知模型设计从一开始就积极整合硬件考虑因素。这确保了模型在计算效率上高效,并且能够在各种硬件环境中以最小的适应性进行部署。

在这种积极的方法中,硬件感知设计的一个关键方面是利用特定硬件平台(例如,GPU、TPU、移动或边缘设备)的优势,通过硬件优化的操作来最大化并行性、优化内存层次结构并最小化延迟。如表 10.10 中总结的,硬件感知模型设计可以划分为几个原则,每个原则都针对计算和系统约束的核心方面。

表 10.10:硬件感知设计原则:通过按其对计算成本、内存使用和推理延迟的影响对模型设计选择进行分类,可以实现对不同硬件平台和部署场景的结构化优化。该表概述了关键原则——例如最小化数据移动和利用并行性——以及体现这些概念的代表性网络架构。

原则 目标 示例网络
缩放优化 调整模型深度、宽度和分辨率以平衡效率和硬件约束。 EfficientNet、RegNet
计算减少 通过利用硬件特定的优化(例如,在移动芯片上使用深度可分离卷积)来最小化冗余操作,以降低计算成本。 MobileNet、ResNeXt
内存优化 通过减少激活和参数存储需求,使用硬件特定的内存层次结构(例如,GPU 中的局部和全局内存)来确保高效的内存使用。 DenseNet、SqueezeNet
硬件感知设计 优化架构以适应特定的硬件约束(例如,低功耗、并行性、高吞吐量)。 TPU 优化模型、MobileNet

表 10.10 中的原则协同工作:缩放优化根据可用资源适当地调整模型大小,计算减少通过深度可分离卷积等技术消除冗余操作,内存优化将访问模式与硬件层次结构对齐,而硬件感知设计确保架构决策与平台能力相匹配。这些原则共同作用,使模型在保持部署环境一致性行为的同时,在准确性和效率之间取得平衡。

缩放优化

缩放模型架构涉及平衡准确性与计算成本,并优化以与目标硬件的能力相匹配。模型的每个组件,无论是深度、宽度还是输入分辨率,都会影响资源消耗。在硬件感知设计中,这些维度不仅应该优化以获得准确性,还应该优化内存使用、处理能力和能耗的效率,尤其是在模型部署在特定的硬件(如 GPU、TPU 或边缘设备)上时。

从硬件感知的角度来看,考虑不同的硬件平台(如 GPU、TPU 或边缘设备)如何与缩放维度交互是很重要的。例如,更深的模型可以捕捉更复杂的表示,但过深的深度可能导致推理延迟增加、训练时间延长和内存消耗增加,这些问题在资源受限的平台上是尤其成问题的。同样,增加模型的宽度以处理更多的并行信息可能对具有高并行的 GPU 和 TPU 有益,但它需要仔细管理内存使用。相比之下,增加输入分辨率可以为图像分类等任务提供更精细的细节,但它会指数级增加计算成本,可能超载硬件内存或在边缘设备上造成能源效率低下。

从数学上讲,卷积模型的总体浮点运算次数(FLOPs)可以近似为:FLOPsdw2r2, \text{FLOPs} \propto d \cdot w² \cdot r², 其中 dd 是深度,ww 是宽度,而 rr 是输入分辨率。不考虑硬件限制而增加所有三个维度可能会导致性能不佳,尤其是在计算能力或内存带宽有限的设备上。

为了高效地进行模型扩展,以平衡的方式管理这些参数变得至关重要,确保模型在硬件限制范围内运行,同时最大化性能。这正是复合扩展发挥作用的地方。复合扩展不是独立调整深度、宽度和分辨率,而是通过应用相对于基础模型的固定比率 (α,β,γ)(\alpha, \beta, \gamma) 来平衡这三个维度:d=αϕd0,w=βϕw0,r=γϕr0 d = \alpha^\phi d_0, \quad w = \beta^\phi w_0, \quad r = \gamma^\phi r_0 在这里,ϕ\phi 是一个缩放系数,而 α\alphaβ\betaγ\gamma 是基于硬件限制和经验数据确定的缩放因子。这种方法确保模型以优化硬件资源使用的方式增长,在提高准确性的同时保持效率。

例如,采用复合缩放的 EfficientNet 展示了如何精心平衡深度、宽度和分辨率,从而实现计算高效且性能高的模型。复合缩放降低了计算成本同时保持精度,使其成为硬件感知模型设计的关键考虑因素。这种方法在将模型部署到 GPU 或 TPU 时尤其有益,在这些设备上可以充分利用并行性,但需要仔细管理内存和功耗,这与第十二章中提到的性能评估方法相联系。

这一原则不仅适用于卷积模型,还适用于其他架构,如 Transformer。调整层数、注意力头或嵌入维度以类似的方式影响计算效率。硬件感知缩放已成为优化跨各种计算约束的模型性能的关键,尤其是在处理大型模型或资源受限的设备时。

计算减少

现代架构利用分解计算将复杂操作分解成更简单的组件,在保持表示能力的同时减少计算开销。标准卷积在所有空间位置和通道上均匀应用滤波器,在资源受限的硬件上造成计算瓶颈。分解技术通过重新结构操作以最小化冗余计算来解决这个问题。

深度可分离卷积,在 MobileNet 中引入,通过将标准卷积分解为两个阶段来体现这种方法:深度卷积(独立地对每个输入通道应用单独的滤波器)和点卷积(1×1 卷积混合通道间的输出)。标准卷积的计算复杂度,对于输入大小为h×wh \times wCinC_{\text{in}}输入通道,和CoutC_{\text{out}}输出通道是:𝒪(hwCinCoutk2) \mathcal{O}(h w C_{\text{in}} C_{\text{out}} k²) 其中 kk 是内核大小。深度可分离卷积将此降低到:𝒪(hwCink2)+𝒪(hwCinCout) \mathcal{O}(h w C_{\text{in}} k²) + \mathcal{O}(h w C_{\text{in}} C_{\text{out}}) 消除了通道混合操作中的 k2 因子,实现了 5×-10×的 FLOP 减少。这直接转化为降低移动和边缘设备上的内存带宽需求和改进推理延迟。

补充的分解技术扩展了这些优势。分组卷积(ResNeXt)将特征图划分为独立的组,在合并之前分别处理,保持精度同时减少冗余操作。瓶颈层(ResNet)在昂贵操作之前应用 1×1 卷积以降低特征维度,将计算集中在提供最大价值的地方。结合稀疏性和硬件感知调度,这些技术在 GPU、TPU 和专用边缘处理器上最大化加速器的利用率。

内存优化

内存优化 35 解决了在资源受限设备上,当激活、特征图和参数的内存需求超过硬件容量时出现的性能瓶颈。现代架构采用内存高效策略来减少存储需求,同时保持性能,确保在 GPU、TPU 和边缘 AI 平台上计算的可处理性和能源效率。

一种有效的内存优化技术是特征重用,这是 DenseNet 采用的一种策略。在传统的卷积网络中,每一层通常计算一组新的特征图,增加了模型的内存占用。然而,DenseNet 通过重复使用先前层的特征图并选择性地应用变换来减少冗余激活的需求。这种方法减少了需要存储的总特征图数量,从而在不牺牲准确性的情况下降低了内存需求。在一个具有LL层的标准卷积网络中,如果每一层生成kk个新的特征图,特征图的总数将线性增长:𝒪(Lk) \mathcal{O}(L k)

与之相反,DenseNet 重复使用早期层的特征图,减少了存储的特征图数量。这提高了参数效率并减少了内存占用,这对于内存资源有限的硬件来说非常重要。

另一种有用的技术是激活检查点 36,这在训练期间特别有益。在典型的神经网络中,反向传播需要存储所有前向激活以进行反向传递。这可能导致显著的内存开销,特别是对于大型模型。激活检查点通过仅存储激活子集并在需要时重新计算剩余的激活来减少内存消耗。

如果一个架构需要存储AtotalA_{\text{total}}激活,标准的反向传播方法需要完整存储:𝒪(Atotal) \mathcal{O}(A_{\text{total}})

然而,使用激活检查点时,只有一部分激活被存储,其余的激活在运行时重新计算,从而将存储需求降低到:𝒪(Atotal) \mathcal{O}\Big(\sqrt{A_{\text{total}}}\Big)

特征重用可以显著减少峰值内存消耗,这对于在内存有限的硬件上训练大型模型特别有用。

参数减少是另一种重要的技术,尤其是对于使用大滤波器的模型。例如,SqueezeNet 使用了一种新颖的架构,它在应用标准卷积之前,先使用1×11\times 1卷积来减少输入通道的数量。通过首先使用1×11\times 1卷积来减少通道数,SqueezeNet 显著减小了模型大小,同时没有牺牲模型的表达能力。标准卷积层中的参数数量为:𝒪(CinCoutk2) \mathcal{O}(C_{\text{in}} C_{\text{out}} k²)

通过使用1×11\times 1卷积来减少CinC_{\text{in}},SqueezeNet37 减少了参数数量,与 AlexNet 相比,模型大小减少了 50 倍,同时保持了相似的性能。这种方法对于具有严格内存和存储约束的边缘设备尤其有价值。

特征重用、激活检查点和参数减少是硬件感知模型设计的关键组成部分,允许模型适应现代加速器的内存限制,并通过减少内存访问来降低功耗。专门的加速器,如 TPUs 和 GPU,利用内存层次结构、缓存和高带宽内存来有效地处理稀疏或减少内存表示,从而实现快速推理并最小化开销。

自适应计算方法

动态计算使模型能够根据输入复杂度调整计算负载,比传统的固定架构方法更有效地分配资源。而传统模型对所有输入都应用统一的处理,无论其复杂度如何——在简单情况下浪费资源,并增加功耗——动态计算允许模型在简单输入时跳过层或操作,而在复杂情况下处理更深的网络。

这种自适应方法优化了计算效率,降低了能耗,最小化了延迟,并保持了预测性能。基于输入复杂度的动态调整对于资源受限的硬件至关重要,尤其是在移动设备、嵌入式系统和自动驾驶汽车中,这些设备对计算效率和实时处理能力要求极高。

动态方案

动态方案使模型能够在输入简单时选择性减少计算,同时保持预测性能,从而节省资源。以下讨论的方法,从早期退出架构开始,说明了如何有效地实施这种自适应策略。

早期退出架构

早期退出架构允许模型在网络中间点进行预测,而不是对每个输入完成完整的正向传播。这种方法对于实时应用和节能推理特别有效,因为它可以根据单个输入的复杂度进行选择性计算(Teerapittayanon, McDanel, 和 Kung 2017)。

早期退出架构的核心机制涉及在网络中嵌入多个退出点。对于可以早期以高置信度分类的简单输入,它们在中间层退出,减少了不必要的计算。相反,更复杂的输入继续通过更深层的处理以确保准确性。

一个著名的例子是 BranchyNet38,它在整个网络中引入了多个退出点。对于每个输入,模型使用置信度阈值评估中间预测。如果在退出点预测的置信度超过预定义的阈值,模型将终止进一步的计算并输出结果。否则,它将继续处理直到最终层(Teerapittayanon, McDanel, 和 Kung 2017)。这种方法在不影响对挑战性输入性能的情况下最小化了推理时间。

另一个例子是多退出视觉 Transformer,它将早期退出扩展到基于 Transformer 的架构。这些模型在各个 Transformer 层使用轻量级分类器,使得在可能的情况下可以早期生成预测(Scardapane, Wang, 和 Panella 2020)。这项技术显著减少了推理时间,同时保持了复杂样本的稳健性能。

早期退出模型对于资源受限的设备,如移动处理器和边缘加速器特别有利。通过动态调整计算工作量,这些架构可以降低功耗和处理延迟,使它们非常适合实时决策 (B. Hu, Zhang, and Fu 2021)。

当部署在硬件加速器如 GPU 和 TPUs 上时,早期退出架构可以通过利用并行性进一步优化。例如,可以同时评估不同的退出路径,从而提高吞吐量同时保持自适应计算的好处 (Yu, Li, and Wang 2023)。这种方法在 图 10.26 中得到说明,其中每个 Transformer 层后面跟着一个分类器和一个基于置信度估计或延迟-精度权衡(LTE)的可选早期退出机制。在每一个阶段,系统可以选择在达到足够置信度时提前退出,或者继续通过更深的层进行处理,从而实现计算资源的动态分配。

图片

图 10.26:早期退出架构:Transformer 层通过分类每一层的输出并在达到足够置信度时启用早期终止来动态调整计算,从而降低资源受限设备的延迟和功耗。这种方法允许并行评估不同的退出路径,提高硬件加速器如 gpus 和 tpus 的吞吐量。来源:(Xin 等人 2021)。

条件计算

条件计算指的是神经网络根据输入决定激活模型哪些部分的能力,从而减少不必要的计算。这种方法在资源受限的环境中非常有用,例如移动设备或实时系统,在这里减少操作数量可以直接转化为降低计算成本、功耗和推理延迟 (E. Bengio 等人 2015)。

与早期退出架构不同,其中通常在达到阈值置信度水平时做出提前退出的决定,条件计算通过根据输入的特征动态选择网络中哪些层、单元或路径应该进行计算来工作。这可以通过门控函数或动态路由等机制实现,这些机制“关闭”对于特定输入不需要的网络部分,使模型能够将计算资源集中在最需要的地方。

条件计算的一个例子是 SkipNet,它使用门控机制在输入被认为足够简单时跳过 CNN 中的层。门控机制使用轻量级分类器来预测是否应该跳过该层。这个预测基于输入,模型根据推理过程中使用的层数进行调整(X. Wang 等人 2018)。如果门控函数确定输入简单,某些层将被绕过,从而实现更快的推理。然而,对于更复杂的输入,模型使用网络的全部深度以达到必要的准确性。

另一个例子是动态路由网络,例如在胶囊网络(CapsNets)中,路由机制会动态选择激活信号在网络中传递的路径。在这些网络中,决策过程涉及根据输入的复杂性选择特定的信息流路径,这可以显著减少所需操作和计算的数量(Sabour, Frosst, 和 Hinton 2017)。这种机制通过使用不同的路由策略引入了适应性,同时提供计算效率并保持预测质量。

这些条件计算策略在计算资源有限的现实世界应用中具有显著优势。例如,在自动驾驶中,系统必须处理各种不同复杂性的输入(例如行人、交通标志、道路车道)。在输入简单的情况下,可以采取更简单、计算需求更低的路径,而在更复杂的情况(如检测障碍物或执行详细场景理解)下,则需要充分利用模型的能力。条件计算确保系统根据输入的实时复杂性调整其计算,从而提高速度和效率(W. Huang, Chen 和 Zhang 2023)。

基于门控的计算

基于门控的条件计算引入了学习到的门控机制,这些机制根据输入复杂性动态控制神经网络哪些部分被激活。与处理所有输入都使用相同计算努力的静态架构不同,这种方法通过在训练期间学习决策边界,使子网络或层的动态激活成为可能(Shazeer, Mirhoseini, Maziarz 和其他人 2017)。

门控机制通常使用二进制或连续的门控函数来实现,其中轻量级控制模块(通常称为路由器或门控网络)预测特定层或路径是否应该执行。这种决策在推理时动态发生,允许模型自适应地分配计算资源。

这种范例的一个著名例子是动态滤波网络(DFN),它在运行时通过选择不同的卷积核来应用输入相关的滤波。DFN 通过避免在输入上应用均匀滤波器来减少不必要的计算,根据输入复杂性定制其计算 (Xu Jia 等人 2016)。

另一种广泛采用的策略是专家混合(MoE)框架。在这个架构中,门控网络选择一组专门的专家子网络来处理每个输入 (Shazeer, Mirhoseini, Maziarz, 以及其他人 2017)。这仅允许模型的一小部分在给定输入时处于活动状态,显著提高了计算效率,同时不牺牲模型容量。这一想法的一个显著实例是谷歌的 Switch Transformer,它通过基于专家的条件计算扩展了 Transformer 架构 (Fedus, Zoph, 和 Shazeer 2021a)。

图片

图 10.27:条件计算:开关变压器通过动态路由标记到专门的专家子网络,从而提高效率,实现并行处理并减少每个输入的计算负载。这种架构实现了一种专家混合形式,其中门控网络选择处理每个标记的专家,从而在不增加计算量的情况下提高模型容量。来源 (Fedus, Zoph, 和 Shazeer 2021a)

如图 10.27 所示,Switch Transformer 用开关 FFN 层替换了传统的前馈层。对于每个标记,一个轻量级路由器从一组前馈网络中选择一个专家。路由器输出一个关于可用专家的概率分布,每个标记激活最高概率的专家。这种设计使得大型模型能够在不按比例增加推理成本的情况下扩展参数数量。

基于门控的条件计算对于多任务和迁移学习设置特别有效,在这些设置中,输入可能从专门的加工路径中受益。通过允许对模型执行进行细粒度控制,这些机制允许在保持效率的同时,在任务之间进行自适应专业化。

然而,这些好处是以增加架构复杂性为代价的。路由和门控操作本身引入了额外的开销,包括延迟和内存访问。在硬件加速器(如 GPU、TPU 或边缘设备)上的高效部署,需要仔细关注专家激活的调度和批处理 (Lepikhin 等人 2020)。

自适应推理

自适应推理指的是模型在推理过程中根据输入复杂性动态调整其计算工作量的能力。与依赖于预定义退出点或离散层跳过的早期方法不同,自适应推理根据实时置信度和任务复杂性连续调节计算深度和资源分配(Yang 等人 2020)。

这种灵活性允许模型即时决定所需的计算量,平衡效率和精度,而不需要固定的阈值。与承诺固定的计算路径不同,自适应推理使模型能够根据对输入的中间评估动态分配层、操作或专用计算(Yang 等人 2020)。

自适应推理的一个例子是快速神经网络(FNNs),它根据实时复杂性估计调整活动层的数量。如果一个输入被认为是简单的,则只激活部分层,从而减少推理时间。然而,如果早期层产生低置信度的输出,则会激活额外的层来细化预测(Jian Wu, Cheng, 和 Zhang 2019)。

一种相关的方法是动态层缩放,模型根据不确定性估计逐步增加计算深度。这项技术在需要细粒度分类任务中特别有用,其中一些输入只需要粗粒度处理,而其他输入则需要更深入的特征提取(Contro 等人 2021)。

自适应推理在资源约束动态变化的延迟敏感应用中特别有效。例如,在自主系统中,如车道检测这样的任务可能只需要最小的计算量,而在密集环境中的多目标跟踪则可能需要额外的处理能力。通过实时调整计算工作量,自适应推理确保模型在严格的时序约束下运行,同时避免不必要的资源消耗。

在如 GPU 和 TPU 这样的硬件加速器上,自适应推理通过动态分配工作负载来利用并行处理能力。这种适应性最大化吞吐量同时最小化能耗,使其非常适合实时、对功耗敏感的应用。

实施挑战

动态计算通过允许模型根据输入复杂性调整其计算工作量,引入了灵活性和效率。然而,这种适应性伴随着几个挑战,必须解决这些挑战才能使动态计算实用且可扩展。这些挑战出现在训练、推理效率、硬件执行、泛化和评估中,每个都带来了独特的困难,影响了模型的设计和部署。

训练和优化困难

与遵循每个输入固定计算路径的标准神经网络不同,动态计算需要额外的控制机制,如门控网络、置信度估计器或专家选择策略。这些机制确定模型应该激活或跳过的部分,增加了训练过程的复杂性。一个主要困难是许多这些决策是离散的,这意味着它们不能使用标准反向传播进行优化。相反,模型通常依赖于强化学习或连续近似等技术,但这些方法引入了额外的计算成本,并可能减慢收敛速度。

训练动态模型也带来了不稳定性,因为不同的输入遵循不同的路径,导致训练示例中梯度更新的不一致。这种可变性可能会降低优化效率,需要仔细的正则化策略来维持平滑的学习动态。动态模型引入了新的超参数,例如门控阈值或早期退出的置信度分数。为这些参数选择适当的值对于确保模型有效地平衡准确性和效率至关重要,但它显著增加了训练过程的复杂性。

负载和延迟变化

尽管动态计算减少了不必要的操作,但确定要执行的计算的过程引入了额外的开销。在执行推理之前,模型必须首先决定要激活哪些层、路径或子网络。这个决策过程,通常通过轻量级门控网络实现,增加了计算成本,并可能部分抵消了跳过计算所获得的节省。虽然这些开销通常很小,但在每个操作都很重要的资源受限环境中,它们变得很重要。

一个更大的挑战是推理时间的可变性。在静态模型中,推理遵循一系列固定的操作,导致可预测的执行时间。相比之下,动态模型根据输入复杂度表现出可变的处理时间。对于具有严格实时约束的应用,如自动驾驶或机器人技术,这种不可预测性可能成为问题。一个模型可能以毫秒处理某些输入,但在显著更长的时间框架内处理其他输入,可能无法满足严格的延迟要求,限制其实际部署。

硬件执行效率低下

现代硬件加速器,如 GPU 和 TPU,针对统一、并行计算模式进行了优化。这些加速器通过在大批量数据上同时执行相同的操作来实现最大效率。然而,动态计算引入了条件分支,这可能会破坏这种并行执行模型。当不同的输入遵循不同的计算路径时,一些处理单元可能会闲置,而其他处理单元处于活动状态,导致硬件利用率不佳。

这种发散的执行模式对硬件效率提出了重大挑战。例如,在一个 GPU 中,多个线程并行处理数据时,条件分支会导致线程发散,其中一些线程必须等待,而其他线程完成其操作。同样,TPU 是为大型矩阵运算设计的,当所有处理单元都得到充分利用时,可以达到峰值性能。动态计算可能会阻止这些加速器保持高吞吐量,从而降低大规模部署的成本效益。

在需要实时处理或高吞吐量推理的场景中,这种影响尤为明显。当硬件资源没有得到充分利用时,动态计算的理论计算优势可能无法转化为实际性能提升。在大规模部署中,这种低效变得更加显著,因为最大化硬件利用率对于管理运营成本和维持服务水平协议至关重要。

在动态模型中,内存访问模式也变得不太可预测。标准的机器学习模型以结构化的方式处理数据,优化高效的内存访问。相比之下,动态模型需要频繁的分支,导致不规则的内存访问和增加的延迟。为了优化这些模型在硬件上的执行,需要专门的调度策略和编译器优化来减轻这些低效,但这些解决方案增加了部署的复杂性。

泛化鲁棒性

由于动态计算允许不同的输入通过模型的不同路径,存在某些数据分布接收的计算量少于必要的风险。如果门控函数没有精心设计,模型可能会学会持续为特定类型的输入分配较少的资源,导致预测偏差。这个问题在安全至关重要的应用中尤其令人担忧,未能为罕见但重要的输入分配足够的计算可能导致灾难性故障。

另一个担忧是训练时间计算路径的过拟合。如果一个模型在特定的计算选择分布下进行训练,它可能难以泛化到需要采取不同路径的新输入。确保动态模型能够适应未见数据需要额外的鲁棒性机制,例如基于熵的正则化或不确定性驱动的门控,但这些机制引入了额外的训练复杂性。

动态计算也带来了新的对抗性攻击漏洞。在标准模型中,攻击者可能会尝试以改变最终预测的方式修改输入。在动态模型中,攻击者可以操纵门控机制本身,迫使模型选择错误或次优的计算路径。防御此类攻击需要额外的安全措施,这进一步复杂了模型的设计和部署。

评估和基准测试

大多数机器学习基准假设固定的计算预算,这使得评估动态模型的性能变得困难。传统的指标,如 FLOPs 或延迟,并不能完全捕捉这些模型的适应性,因为计算量会根据输入的复杂性而变化。因此,标准基准未能反映动态架构中准确性和效率之间的真实权衡。

另一个问题是对可重复性的担忧。由于动态模型会根据输入做出决策,在不同的硬件或略微不同的条件下运行相同的模型可能会导致执行路径的变化。这种可变性使得模型之间的公平比较变得复杂,并需要新的评估方法来准确评估动态计算的好处。没有考虑到自适应缩放的标准化基准,测量和比较动态模型与其静态对应物仍然具有挑战性。

尽管存在这些挑战,动态计算仍然是优化机器学习效率的有希望的方向。解决这些限制需要更鲁棒的训练技术、硬件感知的执行策略和改进的评估框架,这些框架能够正确考虑动态缩放。随着机器学习继续扩展,计算约束变得更加紧迫,解决这些挑战将是解锁动态计算全部潜力的关键。

稀疏性利用

机器学习中的稀疏性指的是张量(如权重矩阵或激活张量)中很大一部分元素为零或接近零的状态。更正式地说,对于一个张量 Tm×nT \in \mathbb{R}^{m \times n}(或更高维度),其稀疏性 SS 可以表示为:S=𝟏{Tij=0}0m×n S = \frac{\Vert \mathbf{1}{{T = 0}} \Vert_0}{m \times n} 其中 𝟏{Tij=0}\mathbf{1}{{T = 0}} 是一个指示函数,当 Tij=0T_{ij} = 0 时返回 1,否则返回 0,而 0\Vert \cdot \Vert_0 表示 L0 范数,它计算非零元素的数量。

由于浮点表示的性质,我们通常将此定义扩展到包括接近零的元素。这导致:Sϵ=𝟏{|Tij|<ϵ}0m×n S_{\epsilon} = \frac{\Vert \mathbf{1}{{|T| < \epsilon}} \Vert_0}{m \times n} 其中 ϵ\epsilon 是一个小的阈值值。

稀疏性可以在训练过程中自然出现,通常是由于正则化技术的结果,或者通过剪枝等方法故意引入,其中低于特定阈值的元素被强制设为零。有效地利用稀疏性可以带来显著的计算效率、内存节省和降低功耗,这在将模型部署在资源有限的设备上,如手机、嵌入式系统和边缘设备时尤其有价值。

稀疏性类型

神经网络中的稀疏性可以大致分为两种类型:非结构化稀疏性和结构化稀疏性。

非结构化稀疏性发生在单个权重被设置为零而没有任何特定模式的情况下。这种类型的稀疏性可以通过剪枝等技术实现,其中被认为不那么重要的权重(通常基于幅度或其他标准)被移除。虽然非结构化稀疏性非常灵活,可以应用于网络的任何部分,但在硬件上可能效率较低,因为它缺乏可预测的结构。在实践中,利用非结构化稀疏性需要专门的硬件或软件优化,以最大限度地发挥其作用。

相比之下,结构化稀疏性涉及以更结构化的方式移除网络中的整个组件,如过滤器、神经元或通道。通过消除网络的整个部分,结构化稀疏性在硬件加速器(如 GPU 或 TPU)上更为高效,这些硬件可以利用这种结构进行更快地计算。结构化稀疏性通常在需要计算资源中的可预测性和效率时使用,因为它使硬件能够充分利用网络中的常规模式。

稀疏性利用方法

有效地利用稀疏性需要专门的技术和硬件支持,以将理论参数减少转化为实际性能提升(Hoefler, Alistarh, Ben-Nun, Dryden, 和 Peste 2021)。剪枝通过移除不那么重要的权重(非结构化)或整个组件,如过滤器、通道或层(结构化)来引入稀疏性(Han 等人 2015)。结构化剪枝在硬件效率上更为优越,使得 GPU 和 TPU 等加速器能够充分利用常规模式。

利用稀疏性的第三个重要技术是低秩近似。这种方法中,大型密集权重矩阵被更小、秩更低的矩阵近似,这些矩阵捕捉最重要的信息同时丢弃冗余组件。这降低了存储需求和计算成本。例如,一个大小为1000×10001000 \times 1000的权重矩阵,包含一百万个参数,可以被分解成两个较小的矩阵,比如UU(大小1000×501000 \times 50)和VV(大小50×100050 \times 1000),这仅包含 10 万个参数,远少于原始的一百万个。这种较小的表示保留了原始矩阵的关键特征,同时显著降低了计算负担(Denton, Chintala, 和 Fergus 2014)。

低秩近似,如奇异值分解,常用于压缩神经网络中的权重矩阵。这些近似在推荐系统和自然语言处理模型中得到广泛应用,以降低计算复杂性和内存使用,同时不会显著损失性能(Joulin 等人 2017)。

除了这些核心方法之外,其他技术如稀疏感知训练也可以帮助模型在训练过程中学习稀疏表示。例如,使用稀疏梯度下降,其中训练算法只更新非零元素,可以帮助模型以更少的活跃参数运行。虽然剪枝和低秩近似直接减少参数或分解权重矩阵,但稀疏感知训练有助于在整个训练过程中保持模型的效率(C. Liu 等人 2018)。

稀疏性硬件支持

虽然稀疏性在理论上可以降低计算成本、内存使用和功耗,但要实现实际的速度提升,需要克服硬件和软件不匹配的问题。通用处理器如 CPU 缺乏对稀疏矩阵操作的优化(Han, Mao, 和 Dally 2016),而现代加速器(GPU、TPU、FPGA)在高效处理不规则稀疏数据模式方面面临架构挑战。硬件支持对于模型优化至关重要——专门的加速器必须高效地处理稀疏数据,以便在训练和推理过程中将理论压缩转化为实际性能提升。

稀疏操作也可以通过软件很好地映射到硬件上。例如,MegaBlocks (Gale et al. 2022) 将稀疏混合专家训练重新表述为块稀疏操作,并开发了针对 GPU 的特定内核,以高效地处理这些计算在硬件上的稀疏性,并保持高加速器利用率。

结构化模式

已经开发了各种稀疏格式,每种格式都有独特的结构特性和影响。其中最突出的是块稀疏矩阵和 N:M 稀疏模式。块稀疏矩阵通常具有孤立的零和非零密集子矩阵块,使得对大型稀疏矩阵的操作可以很容易地重新表述为对子矩阵的较小(从算术角度看)数量的密集操作。这种稀疏性允许更有效地存储密集子矩阵,同时保持与矩阵或向量乘法等操作形状兼容。例如,图 10.28 展示了 NVIDIA 的cuSPARSE库如何支持稀疏块矩阵操作和存储。其他一些工作,如 Monarch 矩阵(Dao et al. 2022),在此基础上扩展了块稀疏性,以在矩阵表达性和计算/内存效率之间取得更好的平衡。

图片

图 10.28:块稀疏表示:NVIDIA 的 cusparse 库通过利用密集子矩阵结构有效地存储块稀疏矩阵,从而实现加速矩阵操作,同时通过块索引与密集矩阵计算保持兼容。这种方法减少了稀疏线性代数的内存占用和算术复杂性,这对于扩展机器学习模型非常重要。来源:NVIDIA.

同样,NN:MM的稀疏模式是一种结构化稀疏格式,其中在每组MM个连续元素(例如,权重或激活)中,恰好有NN个非零,其余两个为零(周等人 2021)。这种确定性模式促进了高效的硬件加速,因为它允许预测内存访问模式和优化的计算。通过强制执行这种结构,模型可以在稀疏引起的效率提升和保持足够的学习复杂表示能力之间取得平衡。图 10.29 下面展示了加速密集矩阵乘法和 2:4 稀疏矩阵乘法之间的比较,这是模型训练中常用的稀疏模式。后续工作如 STEP(Lu 等人 2023)考察了学习更通用的NN:MM稀疏掩码,以在相同的原则下加速深度学习推理。

图片

图 10.29:稀疏矩阵乘法:块稀疏通过仅存储非零元素和使用结构化索引来优化矩阵运算,从而为神经网络计算提供高效的 GPU 加速。这种技术保持了与密集矩阵运算的兼容性,同时减少了内存访问和计算成本,对于大规模模型特别有益。来源:PyTorch 博客。

GPU 和稀疏运算

图形处理单元(GPUs)因其执行高度并行计算的能力而广为人知,这使得它们非常适合处理机器学习中常见的大规模矩阵运算。现代 GPU,如 NVIDIA 的 Ampere 架构,包括专门用于加速稀疏矩阵乘法的稀疏张量核心。这些张量核心被设计用来识别并跳过稀疏矩阵中的零元素,从而减少所需的操作次数(Abdelkhalik 等人 2022)。这对于结构化剪枝技术特别有利,其中整个滤波器、通道或层被剪枝,从而显著减少了计算量。通过跳过零值,GPU 可以将矩阵乘法的速度提高两倍或更多,从而降低稀疏网络的处理时间和功耗。

GPU 利用其并行架构来同时处理多个操作。这种并行性对于稀疏操作特别有益,因为它允许硬件更有效地利用数据中的固有稀疏性。然而,GPU 上稀疏操作的全部好处需要稀疏性以与底层硬件架构相匹配的方式组织,这使得结构化剪枝在优化方面更有优势 (Hoefler, Alistarh, Ben-Nun, Dryden, 和 Peste 2021)。

TPUs 和稀疏优化

TPUs 是由谷歌开发的定制硬件加速器,专门设计用于以比传统处理器更高的效率处理张量计算。TPUs,例如 TPU v4,内置了对稀疏权重矩阵的支持,这对于像 BERT 和 GPT 这样的模型特别有益,因为这些模型依赖于大规模矩阵乘法 (Norman P. Jouppi 等人 2021a)。TPUs 通过减少与零元素相关的计算负载来优化稀疏权重矩阵,从而实现更快的处理和更高的能源效率。

TPUs 的效率得益于它们执行操作时的高吞吐量和低延迟,这得益于它们定制的矩阵乘法单元。这些单元能够通过直接处理非零元素来加速稀疏矩阵操作,这使得它们非常适合包含大量稀疏性的模型,无论是通过剪枝还是低秩近似。随着对更大模型的需求数量增加,TPUs 继续在保持性能的同时,最小化与密集计算相关的能源和计算成本发挥重要作用。

FPGAs 和稀疏计算

场可编程门阵列 (FPGA) 是稀疏网络的另一类重要硬件加速器。与 GPU 和 TPUs 不同,FPGA 具有高度的定制性,提供了在设计上的灵活性,以优化特定的计算任务。这使得它们特别适合需要精细控制硬件执行的稀疏操作。FPGA 可以编程以执行稀疏矩阵-向量乘法和其他稀疏矩阵操作,最小化开销,为使用非结构化剪枝或需要自定义稀疏模式的模型提供高性能。

FPGA 在稀疏网络中的一个主要优势是它们能够针对特定应用进行定制,这允许进行通用硬件无法实现的优化。例如,可以通过定制数据路径和内存管理来设计 FPGA 跳过矩阵中的零元素,从而在计算和内存使用上提供显著的节省。FPGA 还允许低延迟执行,这使得它们非常适合需要高效处理稀疏数据流的实时应用。

内存和能源优化

稀疏网络中的一个关键挑战是管理内存带宽,因为矩阵操作通常需要大量的内存访问。稀疏网络通过减少需要访问的元素数量来提供解决方案,从而最小化内存流量。第十一章第十一章中详细介绍的硬件加速器针对这些稀疏矩阵进行了优化,利用专门的内存访问模式跳过零值,从而减少使用的总内存带宽(Baraglia 和 Konno 2019)。

例如,GPU 和 TPU 通过利用其高内存带宽来最小化内存访问延迟。通过仅访问非零元素,这些加速器确保内存使用更加高效。这些设备中的内存层次结构也针对稀疏计算进行了优化,允许更快的数据检索和降低功耗。

计算和内存访问次数的减少直接转化为能源节约 39。稀疏操作需要更少的算术运算和更少的内存读取,导致训练和推理所需的能耗降低。这种能源效率对于在边缘设备上运行的应用尤其重要,因为这些设备对电力限制很敏感,如第十四章第十四章所述。

未来:硬件和稀疏网络

随着硬件的不断进化,我们可以期待更多专门针对稀疏网络的创新。未来的硬件加速器可能会提供与稀疏感知训练和优化算法的更深入集成,从而实现计算和内存成本的进一步降低。受大脑结构启发的神经形态计算等新兴领域可能为以节能方式处理稀疏网络提供新的途径(Mike Davies 等人 2021)。这些进步有望进一步提高机器学习模型的效率和可扩展性,尤其是在需要实时处理并在电力受限设备上运行的应用中,这与第十八章第十八章中提到的可持续 AI 原则相连接。

挑战和限制

虽然利用稀疏性在降低计算成本和内存使用方面提供了显著优势,但在有效实施稀疏网络时,必须考虑几个挑战和限制。表 10.11 总结了与稀疏优化相关的一些挑战和限制。

表 10.11:稀疏优化挑战:非结构化稀疏性,虽然减少了模型大小,但由于不规则的内存访问模式,阻碍了硬件加速,限制了潜在的节省计算量,并需要专门的硬件或软件来实现效率提升。本表总结了有效部署稀疏神经网络的要点挑战。

挑战 描述 影响
非结构化稀疏优化 不规则的稀疏模式使得在硬件上利用稀疏性变得困难。 有限的硬件加速和减少的计算节省。
算法复杂性 复杂的修剪和稀疏矩阵操作需要复杂的算法。 大型模型的高计算开销和算法复杂性。
硬件支持 硬件加速器针对结构化稀疏性进行了优化,这使得非结构化稀疏性更难优化。 非结构化稀疏性的次优硬件利用和较低性能。
准确性与权衡 如果没有仔细平衡,激进的稀疏性可能会降低模型准确性。 可能的性能损失,需要仔细的调整和验证。
能源效率 稀疏矩阵存储和管理带来的开销可能会抵消减少计算带来的能源节省。 如果开销超过了稀疏计算带来的节省,功耗可能不会改善。
适用性有限 稀疏性可能不会对所有模型或任务有益,尤其是在需要密集表示的领域。 并非所有模型或硬件都能从稀疏性中同等受益。

稀疏性的主要挑战之一是非结构化稀疏性的优化。在非结构化修剪中,根据其重要性移除单个权重,导致不规则的稀疏模式。这种不规则性使得在硬件上完全利用稀疏性变得困难,因为大多数硬件加速器(如 GPU 和 TPU)设计时是为了更有效地处理结构化数据。没有规则的结构,这些加速器可能无法有效地跳过零元素,这可能会限制计算节省。

另一个挑战是修剪和稀疏矩阵操作中涉及的算法复杂性。决定哪些权重需要修剪的过程,尤其是在非结构化的方式下,需要复杂的算法,这些算法必须在模型准确性和计算效率之间取得平衡。这些修剪算法本身可能计算成本高昂,并且在大型模型上应用它们可能导致显著的开销。稀疏矩阵的优化也需要专门的技巧,这些技巧可能并不总是容易实现或在不同架构之间推广。

硬件支持是另一个重要的限制。尽管现代 GPU、TPU 和 FPGA 具有专门为加速稀疏操作而设计的功能,但要在硬件上完全优化稀疏网络,需要仔细地对硬件架构和稀疏格式进行对齐。虽然结构化稀疏在这些加速器上更容易利用,但非结构化稀疏仍然是一个挑战,因为硬件加速器可能难以高效地处理不规则稀疏模式。即使硬件针对稀疏操作进行了优化,与稀疏矩阵存储格式相关的开销以及需要专门的内存管理,仍然可能导致性能不佳。

稀疏性和精度之间总是存在权衡。激进地剪枝或低秩近似技术,这些技术会大幅度减少参数数量,可能会导致精度下降。在减少参数和保持高模型性能之间找到正确的平衡是一个微妙的过程,需要大量的实验。在某些情况下,引入过多的稀疏性可能会导致模型过小或欠拟合,无法实现高性能。

虽然稀疏性可能导致节能,但能源效率并不总是有保证。尽管稀疏操作需要的浮点运算较少,但管理稀疏数据并确保硬件最优地跳过零值所带来的开销,可能会引入额外的功耗。在边缘设备或功率预算紧张的移动环境中,如果与稀疏数据结构和硬件利用率相关的开销超过了节能效果,稀疏性的好处可能就不那么明显了。

稀疏性在特定类型的模型或任务上的适用性有限。并非所有模型都能从稀疏性中同等受益,尤其是那些密集表示对性能至关重要的模型。例如,图像分割或某些类型的强化学习中的模型,在引入稀疏性时可能不会显示出显著的增益。稀疏性可能对所有硬件平台都无效,尤其是对于缺乏计算能力或专门功能以利用稀疏矩阵操作的较老或低端设备。

结合优化

虽然神经网络中的稀疏性是一种提高计算效率和减少内存使用的强大技术,但它的全部潜力通常是在与其他优化策略结合使用时实现的。这些优化包括剪枝、量化和高效模型设计等技术。了解稀疏性与这些方法如何相互作用对于有效地结合它们以实现最佳性能至关重要 (Hoefler, Alistarh, Ben-Nun, Dryden, and Ziogas 2021)。

稀疏性和剪枝

剪枝和稀疏性是密切相关的技术。当应用剪枝时,生成的模型可能变得稀疏,但稀疏模式,例如它是有结构的还是非结构的,会影响模型如何有效地针对硬件进行优化。例如,结构化剪枝(例如,剪枝整个过滤器或层)通常会产生更有效的稀疏性,因为像 GPU 和 TPU 这样的硬件加速器更适合处理稀疏矩阵中的常规模式(Elsen et al. 2020)。另一方面,非结构化剪枝可能会引入不规则稀疏模式,这些模式可能无法被硬件有效地处理,尤其是在与其他技术如量化结合使用时。

由剪枝生成的稀疏模式必须与底层硬件架构相匹配,以实现计算节省(Gale, Elsen, and Hooker 2019b)。结构化剪枝在硬件优化方面特别有效。

稀疏性和量化

将稀疏性和量化结合起来,可以显著减少内存使用和计算,但也带来了独特的挑战(Nagel et al. 2021a)。非结构化稀疏性加剧了低精度权重处理挑战,尤其是在缺乏对不规则稀疏矩阵有效支持的硬件上。当与低精度算术结合使用时,GPU 和 TPU 可以放大稀疏矩阵加速,而 CPU 则难以处理组合开销(Yi Zhang et al. 2021)。

稀疏性和模型设计

高效的模型设计通过深度可分离卷积、低秩近似和动态计算等技术,天生地创造出高效的架构。稀疏性通过进一步减少内存和计算需求来放大这些好处(Dettmers and Zettlemoyer 2019)。然而,高效的稀疏模型需要硬件对稀疏操作的支持,以避免次优性能。硬件对齐确保了计算成本和内存使用的最小化(Elsen et al. 2020)。

稀疏性和优化挑战

通过协调稀疏性、剪枝、量化和高效设计,涉及管理精度权衡(Labarge, n.d.)。硬件加速器如 GPU 和 TPU 优化结构化稀疏性,但在处理非结构化模式或稀疏性-量化组合时遇到困难。最佳性能需要选择与硬件能力相匹配的技术组合(Gale, Elsen, and Hooker 2019b),仔细平衡模型精度、计算成本、内存使用和硬件效率。

实施策略和评估

我们现在来探讨系统化应用策略。我们研究过的个别技术很少能单独成功;生产系统通常采用协调的优化策略,同时平衡多个约束。有效的部署需要结构化的方法来分析系统、衡量优化影响以及结合技术以实现部署目标。

本节提供了从理论理解到实际实施的方法论指导,针对三个关键问题:优化努力应该集中在哪里?我们如何衡量优化是否达到了预期的目标?我们如何结合多种技术而不引入冲突或减少回报?

性能分析及机会分析

优化的基础在于彻底的性能分析,以确定计算资源消耗在哪里以及哪些组件具有最大的优化潜力。然而,一个关键的第一步是确定模型优化是否真的能提高系统性能,因为在生产环境中,模型计算通常只代表总系统开销的一小部分。

现代机器学习模型表现出异构的资源消耗模式,其中特定的层、操作或数据路径不成比例地贡献于内存使用、计算成本或延迟。理解这些模式对于优先考虑优化努力和以最小的精度损失实现最大影响至关重要。

有效的性能分析始于在所有相关性能维度上建立基线测量。内存分析揭示了静态内存消耗(模型参数和缓冲区)以及训练和推理过程中的动态内存分配模式。计算分析确定了瓶颈操作,通常以 FLOPS 和实际墙钟执行时间来衡量。对于电池供电和边缘部署场景,能耗分析变得尤为重要,因为功耗直接影响到操作的可行性。延迟分析测量端到端响应时间,并确定哪些操作对推理延迟贡献最大。

考虑对用于边缘部署的视觉 Transformer(ViT)进行性能分析。使用 PyTorch Profiler 可以发现,注意力层消耗了 65%的总 FLOPS(非常适合结构化剪枝),层归一化消耗了 8%的延迟,尽管只消耗了 2%的 FLOPS(内存密集型操作),而最终的分类头消耗了 1%的计算但 15%的参数内存。此分析表明,将基于幅度的剪枝应用于注意力层作为首要任务(具有高 FLOP 减少潜力),将分类头量化为 INT8 作为第二优先级(大量节省内存,最小化精度影响),以及将层归一化操作融合作为第三优先级(减少内存带宽瓶颈)。

超出这些基线测量范围,现代优化需要理解模型对不同类型修改的敏感性。并非所有参数对模型准确性的贡献都相同,结构化敏感性分析有助于识别哪些组件可以大胆优化,而哪些组件则需要谨慎保留。层级敏感性分析揭示了哪些网络组件对保持准确性最为重要,指导决策在何处应用大胆的剪枝或量化,以及在何处使用保守的方法。

测量优化有效性

优化需要严格的测量框架,它不仅超越了简单的准确率指标,还捕捉了优化决策的全面影响。有效的测量同时考虑多个目标,包括准确率保持、计算效率提升、内存减少、延迟改进和节能。挑战在于在保持结构化决策过程的同时,平衡这些经常相互竞争的目标。

测量框架在应用任何优化之前应建立清晰的基线,全面捕捉所有相关指标的性能概况。准确性基线不仅包括分类准确率等主要指标,还包括校准、不同人口群体间的公平性以及对抗输入变化的鲁棒性等更细致的度量。效率基线包括计算成本(FLOPS、内存带宽)、不同硬件平台上的实际执行时间、训练和推理期间的峰值内存消耗以及能耗概况。

当将 ResNet-50 从 FP32 量化到 INT8 时,基线指标显示 Top-1 准确率为 76.1%,V100 上的推理延迟为 4.2ms,模型大小为 98MB,每次推理能耗为 0.31J。量化后的指标揭示 Top-1 准确率为 75.8%(下降 0.3%),推理延迟为 1.3ms(加速 3.2 倍),模型大小为 25MB(减少 3.9 倍),每次推理能耗为 0.08J(提高 3.9 倍)。额外的分析显示每类准确率下降从 0.1%到 1.2%,对细粒度类别影响最大,校准误差从 2.1%增加到 3.4%,INT8 量化在 GPU 上提供 3.2 倍的速度提升,但在 CPU 上仅提供 1.8 倍,这表明硬件依赖的收益。

在这些全面的基线建立之后,测量框架必须系统地跟踪优化影响。而不是单独评估技术,应用我们的三维框架需要理解不同方法结合时如何相互作用。顺序应用可能导致累积效益或意外的相互作用,从而降低整体有效性。

多技术集成策略

最显著的优化收益来自在我们三维框架内结合多种技术。模型表示技术(剪枝)减少参数数量,数值精度技术(量化)减少每操作的计算成本,而架构效率技术(算子融合、动态计算)减少执行开销。这些技术在不同的优化维度上操作,当适当排序时提供乘法效益。

序列化对结果有重大影响。考虑通过三个阶段在移动设备上部署 BERT-Base。第一阶段应用结构化剪枝,移除 30%的注意力头和 40%的中间 FFN 维度,参数减少 75%,准确率从 76.2%下降到 75.1%。第二阶段使用知识蒸馏将准确率恢复到 75.9%。第三阶段应用量化感知训练,使用 INT8 量化,实现额外的 4 倍内存减少,最终准确率为 75.6%。综合影响显示内存减少 16 倍(从 440MB 到 28MB),在移动 CPU 上推理速度提高 12 倍,与在剪枝前应用量化相比,最终准确率损失为 0.6%,而如果量化在剪枝前应用,损失将达 2.1%。

这个例子说明了为什么排序很重要:剪枝首先将重要权重集中到更小的范围内,使后续的量化更有效。在剪枝前应用量化会减少基于重要性的剪枝决策可用的数值精度,降低最终准确度。有效的组合需要理解这些依赖关系,并开发出最大化累积效益的应用序列。在接下来的 AutoML 部分中,现代自动化方法利用我们的维度框架系统地发现有效的技术组合。

自动机器学习与自动化优化策略

随着机器学习模型复杂性的增加,为了在现实世界中部署它们,需要平衡多个因素,包括准确度、效率和硬件限制。我们已经探索了各种优化技术,包括剪枝、量化和神经架构搜索,每种技术都针对模型效率的特定方面。然而,有效地应用这些优化通常需要大量的手动工作、领域专业知识和迭代实验。

自动机器学习(AutoML)旨在通过自动化搜索最优模型配置的过程来简化这一过程,基于第八章中的训练方法。AutoML 框架利用机器学习算法来优化架构、超参数、模型压缩技术和其他重要参数,减少了对人类干预的需求(F. Hutter, Kotthoff, and Vanschoren 2019)。通过系统地探索可能的模型设计空间,AutoML 可以在保持竞争性准确度的同时提高效率,通常可以发现通过手动调整可能被忽视的新颖解决方案(Zoph 和 Le 2017b)。

自动机器学习(AutoML)并不取代人类专业知识的需求,而是通过提供一种结构化和可扩展的模型优化方法来增强它。如图图 10.30 所示,传统工作流程与 AutoML 之间的关键区别在于,后者自动化了预处理、训练和评估。而不是手动调整剪枝阈值、量化策略或架构设计,从业者可以定义高级目标,包括延迟约束、内存限制和准确度目标,并允许 AutoML 系统探索最能满足这些约束的配置(Feurer 等人 2019),从而实现第十六章中详细描述的稳健部署策略。

图片

图 10.30:AutoML 工作流程:自动机器学习(automl)通过结构化自动化数据预处理、模型选择和超参数调整来简化模型开发,与传统工作流程形成对比,后者在每个阶段都需要大量的手动工作。这种自动化使从业者能够定义高级目标和约束,允许 automl 系统高效地探索广阔的设计空间并识别最优模型配置。

本节探讨了 AutoML 的核心方面,从优化的关键维度开始,然后是 AutoML 系统中使用的方法,最后是挑战和限制。这种审查揭示了 AutoML 如何作为一个综合框架,统一了之前讨论的许多优化策略。

AutoML 优化

AutoML 旨在优化机器学习模型的多个方面,确保效率、准确性和可部署性。与专注于单个技术(如量化以降低数值精度或剪枝以压缩模型)的传统方法不同,AutoML 通过综合考虑这些因素采取了一种整体方法。这使搜索最优模型配置更加彻底,在性能与实际约束之间取得平衡(Yihui He 等人 2018)。

AutoML 的主要优化目标之一是神经网络架构搜索。设计一个高效的模型架构是一个复杂的过程,需要平衡层配置、连接模式和计算成本。NAS 通过结构性地探索不同的网络结构、评估其效率并选择最优设计来实现自动化 (Elsken, Metzen, and Hutter 2019b)。这个过程导致了诸如 MobileNetV3 和 EfficientNet 等架构的发现,这些架构在关键效率指标上优于手动设计的模型 (Tan and Le 2019b)。

除了架构设计之外,AutoML 还专注于超参数优化 40,这在确定模型性能方面起着重要作用。学习率、批量大小 41、权重衰减和激活函数等参数必须仔细调整以确保稳定性和效率。

与依赖试错不同,AutoML 框架采用结构化搜索策略,包括贝叶斯优化 42、进化算法和自适应启发式方法,以有效地识别给定模型和数据集的最佳超参数设置 (Bardenet 等人 2015)。

AutoML 的另一个重要方面是模型压缩。例如,剪枝和量化等技术有助于减少模型的内存占用和计算需求,使其更适合在资源受限的硬件上部署。AutoML 框架自动化选择剪枝阈值、稀疏模式和量化级别,优化模型以实现速度和能效 (Jiaxiang Wu 等人 2016)。这对于边缘人工智能应用尤为重要,在这些应用中,模型需要以最小的延迟和功耗运行 (Chowdhery 等人 2021)。

最后,AutoML 考虑了部署感知优化,确保最终模型适合实际执行。不同的硬件平台对模型执行施加不同的约束,例如内存带宽限制、计算吞吐量和能效要求。AutoML 框架结合了硬件感知优化技术,通过调整计算工作量、内存访问模式和执行策略来针对特定设备定制模型 (H. Cai, Gan, and Han 2020)。

在这些维度上的优化使得 AutoML 能够为增强机器学习模型提供一个统一的框架,简化流程以实现效率,同时不牺牲准确性。这种整体方法确保模型不仅在理论上最优,而且在实际部署到各种应用和硬件平台上也是实用的。

优化策略

AutoML 系统系统地探索不同的配置,以识别架构、超参数和压缩策略的最佳组合。与需要广泛领域专业知识的手动调整不同,AutoML 利用算法搜索方法在平衡精度、效率和部署约束的同时,在广阔的设计空间中导航。

NAS 通过强化学习、进化算法和基于梯度的优化自动化架构设计,构成了 AutoML 的基础(Zoph 和 Le 2017b)。通过系统地评估候选架构,NAS 识别出优于人工设计的模型的结构(Real 等人 2019)。超参数优化(HPO)通过使用贝叶斯优化和自适应启发式方法来微调训练参数——学习率、批量大小、权重衰减——以实现比网格搜索更快的收敛速度(Feurer 等人 2019)来补充这一点。

模型压缩优化根据部署需求自动选择剪枝和量化策略,评估模型大小、延迟和精度之间的权衡。这使得在资源受限的设备上高效部署成为可能(第十四章),无需手动调整。数据处理策略通过自动特征选择、自适应增强策略和数据集平衡来进一步提高性能,这些方法在不增加计算开销的情况下提高了鲁棒性(第十六章)。

元学习方法是最近的一项进展,其中先前优化任务的知识加速了新模型搜索的过程(Vanschoren 2018)。通过从先前实验中学习,AutoML 系统智能地探索优化空间,减少训练和评估成本,同时使系统能够更快地适应新任务和数据集。

最后,许多现代 AutoML 框架提供端到端自动化,将架构搜索、超参数调整和模型压缩集成到一个单一的流程中。例如,Google AutoML、Amazon SageMaker Autopilot 和 Microsoft Azure AutoML 等平台提供完全自动化的工作流程,简化了整个模型优化过程(L. Li 等人 2017)。

这些策略的集成使得 AutoML 系统能够提供一种可扩展且高效的模型优化方法,减少了对手动实验的依赖。这种自动化不仅加速了模型开发,还使得发现可能被忽视的新型架构和配置成为可能,支持第十二章中提到的结构化评估方法(第十二章)。

AutoML 优化挑战

尽管 AutoML 为优化机器学习模型提供了一个强大的框架,但它也引入了几个挑战和权衡,必须仔细考虑。尽管 AutoML 能够自动化模型设计和超参数调整,但它并不是万能的解决方案。AutoML 的有效性取决于计算资源、数据集特征以及特定应用的特定约束。

AutoML 中最显著的挑战之一是计算成本。搜索最优架构、超参数和压缩策略的过程需要评估大量候选模型,每个模型都必须进行训练和验证。像 NAS 这样的方法可能特别昂贵,通常需要成千上万的 GPU 小时来探索大型的搜索空间。虽然像早期停止、权重共享和代理模型这样的技术有助于降低搜索成本,但计算开销仍然是一个主要的限制,特别是对于有限访问高性能计算资源的组织。

另一个挑战是搜索策略中的偏差,这可能会影响最终的模型选择。AutoML 中的优化过程由启发式方法和预定义的目标指导,这可能导致根据搜索空间定义的方式产生偏差的结果。如果搜索算法优先考虑某些架构或超参数而不是其他,它可能无法发现对特定任务可能更有效的替代配置。训练数据中的偏差可能会通过 AutoML 过程传播,加强最终模型中的不希望出现的模式。

泛化和迁移性提出了额外的担忧。AutoML 生成的模型针对特定数据集和部署条件进行了优化,但将它们应用于新任务或环境时,其性能可能会下降。与手动设计的模型不同,手动设计的模型中人类的直觉可以指导选择泛化能力良好的架构,而 AutoML 依赖于在约束搜索空间内的经验评估。这种限制引发了关于 AutoML 优化模型在面对现实世界变化时的鲁棒性的疑问。

可解释性是另一个关键考虑因素。许多 AutoML 生成的架构和配置在效率上进行了优化,但在设计选择上缺乏透明度。理解为什么特定的 AutoML 发现模型表现良好可能具有挑战性,这使得从业者难以调试问题或针对特定需求调整模型。某些 AutoML 技术的黑盒性质限制了人类对底层优化过程的洞察。

除了技术挑战之外,自动化与控制之间也存在权衡。虽然 AutoML 减少了手动干预的需求,但它也抽象了许多专家可能对特定应用进行微调的决策过程。在某些情况下,领域知识对于指导模型优化很重要,而完全自动化的系统可能并不总是考虑到由问题域施加的微妙但重要的约束。

尽管存在这些挑战,AutoML 仍在不断发展,持续的研究集中在降低计算成本、提高泛化能力和增强可解释性。随着这些改进的出现,AutoML 预计将在优化机器学习模型的发展中扮演越来越突出的角色,使 AI 系统对广泛的适用性更加易于访问和高效。

探索的优化技术——包括模型表示、数值精度、架构效率和自动化选择——为高效机器学习系统提供了一个全面的工具包。然而,实际实施需要稳健的软件基础设施,通过易于使用的 API、高效的实现和无缝的工作流程集成,弥合优化研究与部署之间的差距。

实现工具和软件框架

对于模型优化技术(如剪枝、量化和高效数值计算)的理论理解很重要,但它们的实际实施高度依赖于稳健的软件支持。没有广泛的框架开发和工具,这些优化方法将主要对实践者不可及。实现量化需要手动修改模型定义并在整个网络中仔细插入量化操作。剪枝将涉及直接操作权重张量,随着模型规模的扩大,这些任务变得极其复杂。

现代机器学习框架提供了高级 API 和自动化工作流程,抽象了实现复杂性,使复杂的优化技术对实践者可及。框架解决了关键挑战:提供常见优化技术的预构建模块,协助超参数调整(剪枝计划、量化位宽),通过自动化评估管理精度-压缩权衡,并通过特定于设备的代码生成确保硬件兼容性。

该软件基础设施将理论优化技术转化为可直接在生产环境中应用的实用工具(第十三章)。生产优化工作流程涉及额外的考虑因素,包括模型版本控制策略、监控优化对数据管道的影响、管理开发与部署环境中的优化工件,以及在优化失败时建立回滚程序。这种可访问性弥合了学术研究与工业应用之间的差距,使得高效的机器学习模型得以广泛部署。

模型优化 API 和工具

领先的框架,如 TensorFlow、PyTorch 和 MXNet,提供了全面的 API,使从业者能够应用优化技术,而无需从头实现复杂的算法(第七章)。这些内置优化增强了模型效率,同时确保遵循既定的最佳实践。

TensorFlow 的模型优化工具包支持量化、剪枝和聚类。QAT 将浮点模型转换为低精度格式(INT8),同时保持精度,系统性地管理跨不同架构的权重和激活量化。剪枝算法通过在不同粒度级别上移除冗余连接来引入稀疏性——从单个权重到整个层——允许从业者根据特定需求定制策略。权重聚类将相似的权重分组以进行压缩,同时保持功能,提供多条途径来提高模型效率。

类似地,PyTorch 通过内置的量化和剪枝模块提供全面的优化支持。torch.quantization包提供了将模型转换为低精度表示的工具,支持训练后量化和量化感知训练,如列表 10.3 所示。

列表 10.3:量化感知训练:准备模型以在低精度格式下进行训练,确保在训练过程中考虑到量化误差。

import torch
from torch.quantization import QuantStub, DeQuantStub,
     prepare_qat

# Define a model with quantization support
class QuantizedModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.quant = QuantStub()
        self.conv = torch.nn.Conv2d(3, 64, 3)
        self.dequant = DeQuantStub()

    def forward(self, x):
        x = self.quant(x)
        x = self.conv(x)
        return self.dequant(x)

# Prepare model for quantization-aware training
model = QuantizedModel()
model.qconfig = torch.quantization.get_default_qat_qconfig()
model_prepared = prepare_qat(model)

对于剪枝,PyTorch 提供了torch.nn.utils.prune模块,它支持无结构和有结构的剪枝。这两种剪枝策略的示例在列表 10.4 中给出。

列表 10.4:PyTorch 剪枝 API:应用无结构和有结构的剪枝技术以降低模型复杂度,同时保持性能。来源:PyTorch 文档

import torch.nn.utils.prune as prune

# Apply unstructured pruning
module = torch.nn.Linear(10, 10)
prune.l1_unstructured(module, name="weight", amount=0.3)
# Prune 30% of weights

# Apply structured pruning
prune.ln_structured(module, name="weight", amount=0.5, n=2, dim=0)

这些工具无缝集成到 PyTorch 的训练管道中,使得对不同的优化策略进行高效实验成为可能。

内置的优化 API 提供了显著的好处,使得模型优化更加易于访问和可靠。通过提供预测试、生产就绪的工具,这些 API 大大降低了从业者优化模型时所面临的实现复杂性。开发者无需从头开始实现复杂的优化算法,而是可以利用经过彻底审查的标准接口。

这些内置 API 提供的一致性在跨不同模型架构工作时尤其有价值。标准化的接口确保了优化技术被统一应用,减少了由于定制解决方案可能出现的实现错误或不一致的风险。这种标准化有助于在不同项目和团队之间保持可靠和可重复的结果。

这些框架也充当了前沿研究与实际应用之间的桥梁。随着新的优化技术从研究社区中涌现,框架维护者将这些进步整合到他们的 API 中,使得最先进的方法对从业者来说易于获取。这种持续集成研究进展确保了开发者能够访问最新的优化策略,而无需独立实现。

内置 API 的全面性使得对不同的优化方法进行快速实验成为可能。开发者可以轻松测试各种策略,比较其有效性,并快速迭代以找到特定用例的最佳配置。这种高效实验的能力对于在模型性能和资源限制之间找到合适的平衡至关重要。

随着模型优化不断演进,主要框架维护并扩展了其内置支持,进一步降低了高效模型部署的障碍。这些 API 的标准化在民主化访问模型效率技术的同时,确保了高质量实现的一致性和可靠性。

硬件特定优化库

在第七章中涵盖的现代机器学习框架中的硬件优化库,使得在不同硬件平台上高效部署优化模型成为可能。这些库直接与训练和部署管道集成,为模型表示、数值精度和架构效率等维度上的各种优化技术提供硬件特定的加速。

对于模型表示优化,如剪枝,TensorRT、XLA43 和 OpenVINO 等库通过优化的内核提供稀疏感知加速,这些内核能够高效地处理稀疏计算。TensorRT 特别支持结构化稀疏模式,允许使用如两出四结构剪枝等技术训练的模型在 NVIDIA GPU 上高效运行。类似地,TPU 利用 XLA 的稀疏矩阵优化,而 FPGA 通过如 Vitis AI 等框架实现定制的稀疏执行。

知识蒸馏受益于硬件感知优化,有助于紧凑的学生模型实现高推理效率。TensorRT、OpenVINO 和 SNPE 等库优化蒸馏模型以实现低功耗执行,通常将蒸馏与量化或架构重构相结合,以满足硬件约束。对于通过神经架构搜索(NAS)发现的模型,TVM44 和 TIMM 等框架提供编译器支持,以调整适用于各种硬件后端的架构。

在数值精度优化的方面,这些库为 PTQ 和 QAT 提供了广泛的支持。TensorRT 和 TensorFlow Lite 在模型转换期间实现 INT8 和 INT4 量化,降低计算复杂度,同时在移动 SoC 和边缘 AI 芯片上使用专用硬件加速。

在 SNPE 和 OpenVINO 等框架中支持更细粒度的量化方法,如通道和组量化。PyTorch 和 ONNX Runtime 中的动态量化功能使模型能够进行运行时激活量化,使模型能够适应不同的硬件条件。对于极端量化,通过 CMSIS-NN 等库优化了二值化和三值化技术,使得在 ARM Cortex-M 微控制器上高效执行二权重模型成为可能。

架构效率技术紧密集成于特定硬件的执行框架中。TensorFlow XLA 和 TVM 通过积极的融合和内核重排提供操作级别的调整,从而提高 GPU、TPU 和边缘设备的效率。

对稀疏感知执行的广泛支持跨越多个硬件平台。NVIDIA GPU 使用专门的稀疏张量核心来加速结构化稀疏模型,而 TPU 在硬件级别实现稀疏矩阵优化。在 FPGA 上,如 Vitis AI 等供应商特定的编译器使定制的稀疏计算得到高度优化。

这种将硬件优化库与机器学习框架的彻底集成,使得开发者能够有效地实现剪枝、量化、NAS、动态计算和稀疏感知执行,同时确保针对目标硬件的最佳适应,支持第十三章中详细说明的部署策略。能够在多个维度上优化,包括模型表示、数值精度和架构效率,这对于在多样化的平台上高效部署机器学习模型非常重要。

优化过程可视化

模型优化技术会改变模型结构和数值表示,但没有可视化工具,其影响可能难以解释。专门的框架有助于从业者通过稀疏模式、量化误差分布和激活变化的图形表示来理解剪枝、量化和其他优化如何影响模型行为。

可视化量化效应

量化降低了数值精度,引入了舍入误差,这些误差可能会影响模型精度。可视化工具可以直接揭示这些误差的分布情况,有助于诊断和减轻与精度相关的性能下降。

一种常用的技术是量化误差直方图,它描绘了权重和激活之间的误差分布。这些直方图揭示了量化误差是否遵循高斯分布或包含异常值,这可能会指示有问题的层。TensorFlow 的量化调试器和 PyTorch 的 FX 图模式量化工具允许用户分析此类直方图,并比较不同量化方法之间的错误模式。

激活可视化也有助于检测由降低数值精度引起的溢出问题。例如,ONNX 运行时的量化可视化工具和 NVIDIA 的 TensorRT 检查器允许从业者对量化前后的激活进行颜色映射,使饱和和截断问题可见。这使校准调整能够防止信息损失过多,保持数值稳定性。例如,图 10.31 是 AlexNet 卷积核的颜色映射。

图片

图 10.31:卷积核权重:颜色映射揭示了学习到的卷积滤波器中的模式,指示输入图像中的边缘、纹理或特定形状的特征检测器。分析这些权重分布有助于从业者了解神经网络优先考虑哪些特征,并诊断潜在的死或饱和滤波器等问题——这对于模型校准和性能优化非常重要。来源:(Krizhevsky, Sutskever, and Hinton 2017c)。

除了静态可视化之外,在训练过程中跟踪量化误差也很重要。在量化感知训练(QAT)期间监控均方量化误差(MSQE)有助于识别数值精度对学习产生重大影响的发散点。TensorBoard 和 PyTorch 的量化调试 API 提供实时跟踪,突出显示训练过程中的不稳定性。

通过将这些可视化工具集成到优化工作流程中,从业者可以早期识别和纠正问题,确保优化模型既保持准确性又保持效率。这些经验见解提供了对稀疏性、量化和架构优化如何影响模型的更深入理解,指导有效的模型压缩和部署策略。

可视化稀疏模式

稀疏性可视化工具通过映射出哪些权重已被移除以及稀疏性如何分布在不同层之间,为修剪模型提供详细的洞察。例如,TensorBoard(用于 TensorFlow)和 Netron(用于 ONNX)等框架允许用户在层和权重级别检查修剪的网络。

一种常见的可视化技术是稀疏性热图,其中颜色渐变表示从每个层移除的权重比例。稀疏性较高的层看起来较暗,揭示了受修剪影响最大的模型区域,如图 10.32 所示。此类可视化将修剪从黑盒操作转变为可解释的过程,使从业者能够更好地理解和控制稀疏感知优化。

图片

图 10.32:稀疏分布:修剪后的神经网络在层之间表现出不同程度的权重移除;较深的阴影表示更高的稀疏性,揭示了模型中哪些部分最受修剪过程的影响。分析这种分布有助于从业者理解和细化针对模型压缩和效率的稀疏感知优化策略。来源:numenta

除了静态快照之外,趋势图跟踪多个修剪迭代中的稀疏性进展。这些可视化展示了全局模型稀疏性的演变,通常显示初始快速增加后是更渐进的细化。TensorFlow 的模型优化工具包和 SparseML 的监控实用程序提供此类跟踪功能,显示随时间变化的每层修剪级别。这些见解允许从业者通过调整单个层的稀疏性约束来微调修剪策略。

如 DeepSparse 的可视化套件和 PyTorch 的修剪实用程序之类的库能够生成这些可视化工具,帮助分析修剪决策如何影响不同的模型组件。通过使稀疏数据可视化,这些工具帮助从业者更有效地优化他们的模型。

技术比较

深入研究了三种主要优化方法后,比较分析揭示了不同技术如何解决效率-精度权衡的不同方面。这种比较有助于根据部署约束和可用资源选择技术。

表 10.12:优化技术权衡:比较三种主要优化方法在关键性能维度上的差异,突出每种技术如何解决不同的约束和部署场景。剪枝在计算减少方面表现优异,但需要稀疏硬件支持;量化提供了平衡的大小和速度改进,具有广泛的硬件兼容性;而蒸馏在更高的训练成本下产生高质量的压缩模型。

技术 主要目标 精度影响 训练成本 硬件依赖 最佳适用
剪枝 减少 FLOPs/大小 中等 低(微调) 高(对于稀疏操作) 延迟关键应用
量化 减少大小/延迟 低(PTQ)/高(QAT) 高(INT8 支持) 边缘/移动部署
蒸馏 减少大小 低-中 高(重新训练) 创建更小、高质量的模型

理解这些权衡有助于系统地选择技术(表 10.12)。剪枝在稀疏计算硬件可用且减少浮点运算至关重要时效果最佳。量化提供了最灵活的方法,具有广泛的硬件支持,使其成为各种部署场景的理想选择。知识蒸馏需要大量的计算投入,但能产生一致的高质量压缩模型,因此在精度保护至关重要的场合非常有价值。

这些技术协同作用,量化通常在剪枝或蒸馏之后应用,以实现复合压缩效益。生产系统通常采用顺序应用:初始剪枝减少参数数量,量化优化数值表示,通过蒸馏原则进行微调以恢复任何精度损失。顺序应用可以实现 10-50 倍的压缩比率,同时在各种部署场景中保持有竞争力的精度。

谬误和陷阱

模型优化是机器学习系统中技术最复杂的领域之一,其中必须协调多种技术以实现效率提升而不牺牲精度。剪枝、量化和蒸馏技术的复杂性和它们之间复杂的相互依赖性创造了大量误用和次优结果的机会,这些结果可能会损害部署的成功。

谬误优化技术可以独立应用,无需考虑它们之间的相互作用。

这种误解导致团队在没有理解它们如何相互作用的情况下同时应用多种优化技术。将剪枝与激进的量化相结合可能会使精度损失超过可接受水平,而从大量剪枝的模型中提取的知识蒸馏可能会将次优行为转移到学生网络上。不同的优化方法可能会相互干扰,产生复杂的权衡,需要仔细协调。成功的优化需要理解技术之间的相互作用,并协调一致地应用它们,而不是作为独立的修改。

陷阱: 优化理论指标而不是实际部署性能。

许多从业者专注于减少参数数量、FLOPs 或模型大小,而没有衡量实际部署性能的提升。一个参数更少的模型可能仍然具有较差的缓存局部性、不规则的内存访问模式或低效的硬件利用率,从而抵消了理论上的效率提升。量化减少模型大小可能会由于格式转换开销而在某些硬件平台上增加推理延迟。有效的优化需要衡量和优化实际的部署指标,而不是依赖于理论上的复杂性降低。

谬误: 激进的量化可以在最小精度损失的情况下保持模型性能。

这种信念驱使团队在不理解数值精度与模型表达能力之间关系的情况下应用极端的量化级别。虽然许多模型可以很好地容忍适度的量化,但极端的量化可能会导致灾难性的精度下降、数值不稳定或训练发散。不同的模型架构和任务对量化的敏感性不同,需要仔细分析,而不是假设其普遍适用性。一些操作,如注意力机制或归一化层,可能需要更高的精度以保持其功能。

陷阱: 使用后训练优化而不考虑训练感知替代方案。

团队通常在训练完成后应用优化技术,以避免修改现有的训练流程。后训练优化虽然方便,但通常比优化感知训练方法的结果差。量化感知训练、训练过程中的逐步剪枝和蒸馏集成训练可以在应用这些技术后获得更好的精度-效率权衡。后训练优化的便利性是以次优结果为代价的,这些结果可能不符合部署要求。

陷阱: 专注于单个模型优化,而不考虑系统级性能瓶颈。

许多优化工作仅专注于降低模型复杂性,而没有分析模型运行的整体系统环境,需要详细说明的第十二章中的结构化分析方法。如果数据预处理管道、I/O 操作或网络通信主导了整体系统延迟,那么高度优化的模型可能只提供微小的益处。内存带宽限制、缓存未命中或低效的批量处理可能会抵消激进模型优化的优势。同样,针对单个模型推理的优化可能会错过通过批量处理、模型并行或请求流水线提高吞吐量的机会。有效的优化需要分析整个系统以确定实际瓶颈,并确保模型级别的改进转化为可衡量的系统级别性能提升。这种系统视角在多模型集成、实时服务系统或边缘部署中尤为重要,在这些场景中,资源限制超出了单个模型效率的范围。整体优化方法通过确保优化有助于整体系统可靠性和可维护性,直接与操作卓越原则第十三章相联系。

摘要

模型优化代表了理论机器学习进步与实际部署现实之间的重要桥梁,在计算约束、内存限制和能源效率要求下,需要复杂的工程解决方案。本章展示了模型精度与资源效率之间的核心紧张关系如何驱动一个丰富的优化技术生态系统,这些技术可以在多个维度上同时操作。现代优化方法不是简单地减少模型大小或复杂性,而是战略性地重新组织模型表示、数值精度和计算模式,以保留重要能力的同时,显著提高效率特性。

我们的优化框架展示了如何系统地细化模型设计的各个方面,以满足部署限制。从 440MB 的 BERT-Base 模型(Devlin 等人 2018b)到 28MB 的部署版本的过程,展示了结合互补技术的力量:结构化剪枝将模型缩小到 110MB,使用 DistilBERT(Sanh 等人 2019)的知识蒸馏在保持性能的同时进一步减小了大小,INT8 量化实现了最终的 28MB 目标。硬件感知设计原则的集成确保了优化策略与底层计算架构相一致,最大化了不同部署环境中的实际效益。

关键要点

  • 模型优化需要在表示、精度和架构效率方面采取协调一致的方法——正如 BERT 通过联合剪枝、蒸馏和量化实现 16 倍压缩所证明的那样

  • 硬件感知优化将模型特性与计算架构对齐,以最大化实际性能效益

  • 通过 AutoML 进行自动化优化可以发现优于手动优化策略的技术组合

  • 优化技术必须在保持准确性的同时平衡部署限制——DistilBERT 在参数减少 40%的情况下保留了 BERT 的 97%的性能

  • 成功需要理解没有单一技术能提供通用的解决方案;最佳策略取决于特定的部署限制、硬件特性和应用需求

优化自动化框架的出现代表了向自动化发现适应特定部署环境和性能要求的优化策略的范式转变。这些自动化方法建立在训练方法之上,同时指向自我优化系统的新兴前沿。这样的系统使从业者能够比手动方法更系统地探索广泛的优化空间,通常揭示出实现更优效率-准确性权衡的新技术组合。随着模型变得越来越大,部署环境变得更加多样化,掌握这些优化技术对于弥合研究准确性与生产效率之间的差距变得越来越关键。


AI 加速

DALL·E 3 提示:创建一个复杂且色彩丰富的矩形格式芯片级联(SoC)设计图。展示各种专用机器学习加速器和芯片片,所有这些都被集成到处理器中。提供芯片内部的详细视图,突出电子的快速运动。每个加速器和芯片片都应设计为与神经网络神经元、层和激活相互作用,强调其处理速度。将神经网络描绘为相互连接的节点网络,展示加速器部件之间充满活力的数据流,展示增强的计算速度。

目的

是什么使得专用硬件加速不仅有益,而且对于实际机器学习部署来说是必不可少的,这为什么代表了我们在计算系统设计方法上的根本转变?

实际的机器学习系统完全依赖于硬件加速。没有专用处理器,计算需求在经济和物理上都是不可行的。通用 CPU 在神经网络操作中只能达到 100 GFLOPS1 (Sze 等人 2017a),而现代训练工作负载需要每秒数万亿次的操作,这造成了传统扩展无法弥合的性能差距。硬件加速将计算上不可能的任务转化为实际部署,使全新的应用类别成为可能。与现代 AI 系统合作的工程师必须了解加速原理,以利用 100-1000×\times 的性能提升,使实时推理、大规模训练和边缘部署在经济上可行。

学习目标

  • 跟踪硬件加速从浮点协处理器到现代 AI 加速器的演变过程,并解释推动这一进程的架构原则

  • 对 AI 计算原语(向量操作、矩阵乘法、阵列波前传播)进行分类,并分析它们在当代加速器中的实现

  • 评估 AI 加速器的内存层次结构设计,并使用带宽和能耗指标预测其对性能瓶颈的影响

  • 设计将神经网络层映射到专用硬件架构的映射策略,考虑数据流模式和资源利用权衡

  • 应用编译器优化技术(图优化、内核融合、内存规划)将高级 ML 模型转换为高效的硬件执行计划

  • 比较多芯片扩展方法(芯片片、多 GPU、分布式系统)并评估它们对不同 AI 工作负载特性的适用性

  • 批判关于硬件加速的常见误解,并识别加速器选择和部署策略中的潜在陷阱

AI 硬件加速基础

现代机器学习系统对通用处理器的底层架构假设提出了挑战。虽然前一章中探讨的软件优化技术通过精度降低、结构剪枝和执行优化等手段提供了系统化的算法效率方法,但它们在现有计算基础结构的约束下运行。传统的 CPU 在执行典型的机器学习工作负载时,利用率仅为 5-10% (Gholami 等人 2024),这是由于顺序处理模型与神经网络计算高度并行、数据密集的本质之间存在架构不匹配。

这种性能差距推动了计算机架构向特定领域硬件加速的转变。硬件加速补充了软件优化,通过架构重设计而不是算法修改来解决效率限制。机器学习算法和专用计算架构的协同进化,使得从高性能计算系统上进行的计算成本高昂的研究过渡到在多样化的计算环境中无处不在的部署成为可能,从超大规模数据中心到资源受限的边缘设备。

机器学习系统的硬件加速位于计算机系统工程、计算机架构和应用机器学习的交汇点。对于开发生产系统的从业者来说,关于包括图形处理单元、张量处理单元和神经形态处理器在内的加速器技术的架构选择决策,直接决定了系统级性能特征、能效配置文件和实现复杂性。在自然语言处理、计算机视觉和自主系统等领域的部署系统,与通用实现相比,性能提高了两个到三个数量级。

本章探讨了机器学习系统的硬件加速原理和方法。分析从特定领域计算架构的历史演变开始,展示了从浮点协处理器到图形处理单元的设计模式如何指导当代人工智能加速策略。然后我们讨论了表征机器学习工作负载的计算原语,包括矩阵乘法、向量操作和非线性激活函数,并分析了通过诸如脉动阵列架构和张量处理核心等创新来优化这些操作的专用硬件的架构机制。

在数据移动能耗通常超过计算能耗两个数量级的情况下,内存层次结构设计在加速有效性中起着至关重要的作用。本分析涵盖了内存架构设计原则,从片上 SRAM 缓冲区优化到高带宽内存接口,并探讨了最小化能耗密集型数据移动模式的方法。我们还讨论了编译器优化和运行时系统支持,这些因素决定了理论硬件能力转化为可测量的系统性能的程度。

本章以需要超出单芯片实现计算能力的系统扩展方法结束。从芯片级集成到分布式仓库规模系统,多芯片架构在计算并行性和芯片间通信开销之间引入了权衡。通过对包括 NVIDIA GPU 架构、谷歌 Tensor Processing Units 和新兴神经形态计算平台在内的当代系统的详细分析,我们确立了在多样化的系统环境中有效部署 AI 加速的理论基础和实践考虑。

硬件专用化的演变

计算架构遵循一个反复出现的模式:随着计算工作负载的复杂性增加,通用处理器变得越来越低效,这促使专用硬件加速器的开发。对更高计算效率、降低能耗和优化特定领域工作负载执行的需求推动了这一转变。机器学习加速代表了这一持续演变的最新阶段,这一阶段遵循了先前领域(如浮点运算、图形处理和数字信号处理)观察到的轨迹。

这种进化过程为理解现代 ML 加速器(包括具有张量核心(加速矩阵运算的专用单元)的 GPU、谷歌的 TPU2 和苹果的 Neural Engine)如何从既定的架构原则中产生提供了背景。这些技术使得广泛部署的应用成为可能,如实时语言翻译、图像识别和个性化推荐。使这些能力成为可能的架构策略源于数十年的硬件专用化研究和开发。

硬件专用化构成了这一转变的基础,通过优化频繁执行的计算模式并通过专用电路实现来提高性能和效率。虽然这种方法带来了显著的收益,但它也在灵活性、硅面积利用率和编程复杂性方面引入了权衡。随着计算需求不断演变,专用加速器必须平衡这些因素,以实现效率和性能的持续改进。

硬件专业化的发展为理解现代机器学习加速器提供了视角。塑造早期浮点图形加速器发展的许多原则现在正影响着 AI 专用硬件的设计。审视这些历史趋势为分析当代 AI 加速方法提供了一个框架,并预测专用计算的未来发展。

专用计算

向专用计算架构的转变源于通用处理器的局限性。早期的计算系统依赖于中央处理单元(CPU)按顺序执行所有计算任务,采用一种一刀切的方法。随着计算工作负载的多样化和复杂性增长,某些操作,尤其是浮点运算,成为性能瓶颈,这些瓶颈无法仅通过 CPU 有效处理。这些低效率促使开发出专门设计的硬件架构,以加速特定的计算模式(Flynn 1966)。

硬件专业化的早期例子之一是 1980 年推出的英特尔 8087 数学协处理器 3。这个浮点单元(FPU)被设计用来从主 CPU 卸载密集型算术计算,显著提高了科学和工程应用的性能。8087 展示了前所未有的效率,与通用处理器上基于软件的实现相比,浮点操作的性能提升了高达 100 倍(Fisher 1981)。这一里程碑在计算机架构中确立了一个原则:精心设计的硬件专业化可以为定义明确、计算密集型任务提供数量级的改进。

浮点协处理器的成功 4 最终导致了它们被集成到主流处理器中。1989 年发布的英特尔 486DX 集成了片上浮点单元,消除了对外部协处理器的需求。这种集成提高了处理效率,并在计算机架构中确立了一个反复出现的模式:成功的专用功能成为后续一代通用处理器的标准特性(David A. Patterson and Hennessy 2021c)。

早期浮点加速确立的原则继续影响着现代硬件专业化:

  1. 通过工作负载分析识别计算瓶颈

  2. 频繁操作专用电路的开发

  3. 高效的软硬件接口的创建

  4. 确认的专用功能的渐进式集成

从特定领域专业化到通用集成的这一进展塑造了现代计算架构。随着计算工作负载超越了算术运算,这些核心原则被应用于新的领域,如图形处理、数字信号处理,最终是机器学习加速。每个领域都引入了针对其独特计算需求的专用架构,确立了硬件专业化作为提高计算性能和效率在日益复杂的工作负载中的方法。

专用计算硬件的演变遵循一致的轨迹,其中引入了架构创新来解决新兴的计算瓶颈,随后被纳入主流计算平台。如图 11.1 所示,每个计算时代都产生了针对该时期主导工作负载特性的加速器。这些发展提高了架构效率,并塑造了当代机器学习系统运行的基础。如实时语言翻译、个性化推荐和设备端推理等任务所需的计算能力,依赖于在早期领域(包括浮点计算、图形处理和数字信号处理)中建立的基石性原则和架构创新。

图片

图 11.1:硬件专业化轨迹:计算架构逐步融入专用加速器,以应对新兴的性能瓶颈和工作负载需求,这与从浮点单元到图形处理器,最终到机器学习加速器的历史模式相呼应。这种演变反映了一种通过针对特定任务特性定制硬件并推进日益复杂的应用来提高计算效率的策略。

并行计算和图形处理

通过浮点加速建立的原则为解决新兴的计算挑战提供了蓝图。随着计算应用的多样化,出现了新的计算模式,这些模式超出了通用处理器的功能。这种专用计算的发展体现在多个领域,每个领域都为硬件加速策略贡献了独特的见解。

图形处理在 20 世纪 90 年代成为硬件专业化的主要驱动因素。早期的图形加速器专注于特定的操作,如位图传输和多边形填充。1999 年,随着 NVIDIA 的 GeForce 256 引入可编程图形管道,代表了专用计算的重大进步。图形处理单元(GPU)展示了并行处理架构如何高效地处理数据并行工作负载,在 3D 渲染任务如纹理映射和顶点变换中实现了 50-100 倍的速度提升。到 2004 年,高端 GPU 每秒可以处理超过 1 亿个多边形(Owens et al. 2008)。

同时,数字信号处理(DSP)处理器建立了具有专用乘加单元和优化过滤和变换操作的循环缓冲区的并行数据路径架构。德州仪器的 TMS32010(1983 年)展示了特定领域的指令集如何显著提高信号处理应用的性能(Lyons 2011)。

网络处理引入了额外的专业化模式。网络处理器开发了独特的架构来以线路速率处理数据包,包括多个处理核心、专门的包操作单元和复杂的内存管理系统。英特尔 IXP2800 网络处理器展示了如何将多个级别的硬件专业化结合起来以满足复杂的处理需求。

这些多样化的专业化领域表现出几个共同的特征:

  1. 识别特定领域的计算模式

  2. 开发专门的处理器和内存层次结构

  3. 创建特定领域的编程模型

  4. 向更灵活架构的渐进式进化

这一扩展专业化的时期表明,硬件加速策略可以满足多个领域多样化的计算需求。GPU 在并行化 3D 图形管道方面的成功使其随后被用于训练深度神经网络,例如 2012 年的 AlexNet5,它在消费级 NVIDIA GPU 上运行。低功耗信号处理中的 DSP 创新促进了边缘设备上的实时推理,包括语音助手和可穿戴设备。这些领域为 ML 硬件设计提供了信息,并确立了加速器可以部署在云和嵌入式环境中的原则,这些原则继续影响着当代 AI 生态系统的发展。

特定领域架构的出现

特定领域架构(DSA)6 的出现标志着计算机系统设计的转变,由两个因素驱动:传统缩放定律的崩溃和专用工作负载计算需求的增加。摩尔定律 7 的放缓,该定律以前确保了每 18 到 24 个月晶体管密度的可预测增强,以及 Dennard 缩放 8 的结束,它允许频率增加而不伴随功率增加,在通用计算中创造了性能和效率瓶颈。正如约翰·亨尼斯和戴夫·帕特森在 2017 年的图灵讲座(亨尼斯和帕特森 2019)中指出的,这些限制预示着计算机架构新时代的到来,这一时代以特定领域解决方案为中心,这些解决方案优化硬件以适应专用工作负载。

历史上,处理器性能的提升依赖于半导体工艺的缩小和时钟速度的提高。然而,随着功率密度限制进一步限制了频率提升,并且随着晶体管小型化遇到越来越多的物理和经济约束,架构师探索了替代方法以维持计算增长。这导致了向特定领域架构的转变,这些架构将硅资源专门用于优化特定应用领域的计算,以效率换取灵活性。

特定领域架构通过以下几个关键原则实现卓越的性能和能效:

  1. 定制数据路径:设计专门针对目标应用模式优化的处理路径,使常见操作能够直接在硬件上执行。例如,人工智能加速器中的矩阵乘法单元实现了脉动阵列——由处理单元组成的网格状网络,这些单元以节奏计算并通过相邻单元传递数据,专门用于神经网络计算。

  2. 专用内存层次结构:针对特定领域的访问模式和数据重用特性优化内存系统。这包括定制的缓存配置、预取逻辑和针对预期工作负载优化的内存控制器。

  3. 减少指令开销:实现特定领域的指令集,通过将常见操作序列编码为单个指令来最小化解码和调度复杂性。这提高了性能和能效。

  4. 直接硬件实现:创建专用电路块,这些电路块能够原生执行常用操作,无需软件干预。这消除了指令处理开销,并最大化了吞吐量。

这些原则在现代智能手机中得到了令人信服的展示。现代智能手机可以在仅消耗几瓦功率的情况下,以每秒 60 帧的速度解码 4K 视频,尽管视频处理每秒需要数十亿次操作。这种效率是通过实现行业标准的专用硬件视频编解码器实现的,如 H.264/AVC(2003 年推出)和 H.265/HEVC(2013 年完成)(Sullivan et al. 2012)。这些专用电路与基于通用处理器的软件解码相比,在性能和功耗效率方面提供了 100-1000×\times的改进。

专业化趋势持续加速,新的架构不断涌现,以适应不断扩大的领域范围。基因组处理得益于定制加速器,这些加速器优化了序列对齐和变异调用,从而减少了 DNA 分析所需的时间(Shang, Wang, and Liu 2018)。同样,区块链计算产生了针对加密散列优化的专用集成电路(ASICs)9,显著提高了挖矿操作的效率(Bedford Taylor 2017)。这些例子表明,特定领域的架构代表了计算系统中的根本性变革,提供了针对现代计算工作负载日益复杂性和多样性的定制解决方案。

机器学习硬件专用化

机器学习构成了一个具有独特特征的计算领域,这些特征推动了专用硬件架构的发展。与表现出不规则内存访问模式和多样化指令流的传统计算工作负载不同,神经网络的特点是具有可预测的模式:密集的矩阵乘法、规律的数据流以及对降低精度的容忍。这些特性使得专用硬件优化成为可能,这对于通用计算是无效的,但为机器学习工作负载提供了显著的加速。

机器学习加速器是针对神经网络计算模式优化的专用计算硬件,通过并行处理专用内存层次结构降低精度算术实现了卓越的性能每瓦

机器学习的计算需求揭示了传统处理器的局限性。CPU 在神经网络工作负载上仅实现 5-10%的利用率,提供大约 100 GFLOPS10,同时消耗数百瓦的功率。这种低效源于架构不匹配:CPU 优化单线程性能和不规则内存访问,而神经网络需要大规模并行和可预测的数据流。内存带宽 11 限制变得尤为严重:单个神经网络层可能需要访问数 GB 的参数,这超出了为千字节规模的工作集设计的 CPU 缓存层次 12。

数据移动的能量经济学影响了加速器的设计。从 DRAM 访问数据需要大约 640 皮焦耳,而执行乘累加操作仅消耗 3.7 皮焦耳,大约是 173 倍的惩罚(具体数值因技术节点和设计而异),这确立了最小化数据移动作为主要优化目标。这种差异解释了从改用的图形处理器到专门设计的神经网络加速器的演变。GPU 通过大规模并行处理实现 15,000+ GFLOPS,但遭遇了来自其图形传统的效率挑战。TPU 和其他定制加速器通过实现收缩阵列和其他最大化数据重用同时最小化移动的架构,实现了超过 85%的利用率。

训练和推理呈现不同的计算特征,这影响了加速器的设计。训练需要高精度算术(FP32 或 FP16)进行梯度计算和权重更新,双向数据流进行反向传播 13,以及大内存容量来存储激活。推理可以利用降低的精度(INT8 或 INT4),只需要正向计算,并优先考虑延迟 14 而不是吞吐量。这些差异推动了专用架构:训练加速器最大化 FLOPS 和内存带宽,而推理加速器优化能效和确定性的延迟。

部署环境塑造了架构选择。数据中心加速器接受 700 瓦的功率预算,以最大化训练大型模型的吞吐量。边缘设备必须在毫瓦级约束内提供实时推理,这推动了消除所有不必要的数据移动的架构。移动处理器在性能和电池寿命之间取得平衡,而汽车系统优先考虑安全关键应用的确定性响应时间。这种多样性产生了一个丰富的专用加速器生态系统,每个都针对特定的部署场景和计算需求进行了优化。

在数据中心,如 NVIDIA H100 和 Google TPUv4 这样的训练加速器通过大规模并行和高带宽内存系统将模型开发时间从数周缩短至数天。这些系统优先考虑原始的计算吞吐量,接受 700 瓦的功耗以实现每秒万亿次性能。这种经济性支持这种权衡——将训练时间从数月缩短至数天可以减少数百万的运营成本并加快 AI 应用的上市时间。

在相反的极端情况下,边缘部署需要不同的优化策略。内存中处理架构通过直接将计算与内存集成来消除数据移动。动态电压调整在低强度操作期间可将功耗降低 50-90%。神经形态设计仅处理变化的输入,对于时序工作负载实现 1000 倍的功耗降低。这些技术使得复杂的 AI 模型能够在电池供电的情况下持续运行,支持从智能手机摄影到无需外部电源即可运行数年的自主传感器等应用。

专用加速器的成功表明,没有单一的架构能够高效地解决所有 ML 工作负载。预计到 2030 年将有 1560 亿个边缘设备,这将需要针对能源效率和实时保证进行优化的架构,而云规模训练将继续推进计算吞吐量的边界。这种多样性推动了专用架构的持续创新,每个架构都针对其特定的部署环境和计算需求进行了优化。

专用硬件架构的演变说明了计算机系统中的一个原则:随着计算模式的出现和成熟,硬件专业化随之而来,以实现最佳性能和能源效率。这种进步在机器学习加速中表现得尤为明显,特定领域的架构已经发展起来,以满足机器学习模型日益增长的计算需求。与优先考虑灵活性的通用处理器不同,专用加速器针对明确的工作负载进行优化,平衡性能、能源效率和与软件框架的集成。

表 11.1 总结了硬件专业化演变的关键里程碑,展示了每个时代如何产生针对当时计算需求的定制架构。虽然这些加速器最初出现是为了优化特定领域的负载,包括浮点运算、图形渲染和媒体处理,但它们也引入了在当代系统中持续存在的架构策略。早期代际中概述的专业化原则现在支撑着现代 AI 加速器的设计。理解这一历史轨迹为分析硬件专业化如何继续在多样化的部署环境中实现可扩展、高效的机器学习工作负载提供了背景。

表 11.1:硬件专业化趋势:连续的计算时代逐渐整合专用硬件以加速流行的负载,从通用 CPU 发展到特定领域的架构,最终到可定制的 AI 加速器。这一演变反映了一个基本原理:根据计算模式定制硬件可以提高性能和能源效率,推动机器学习系统中的创新。

时代 计算模式 架构示例 特点
1980 年代 浮点运算与信号处理 FPU, DSP
  • 单用途引擎

  • 焦点指令集

  • 协处理器接口

|

1990 年代 3D 图形与多媒体 GPU, SIMD 单元
  • 许多相同的计算单元

  • 常规数据模式

  • 宽内存接口

|

2000 年代 实时媒体编码 媒体编解码器、网络处理器
  • 固定功能流水线

  • 高吞吐量处理

  • 功耗性能优化

|

2010 年代 深度学习张量运算 TPU、GPU 张量核心
  • 矩阵乘法单元

  • 巨大并行性

  • 内存带宽优化

|

2020 年代 应用特定加速 机器学习引擎、智能网络接口卡、领域加速器
  • 针对特定工作负载的数据路径

  • 定制内存层次结构

  • 应用优化设计

|

这一历史进步揭示了一个反复出现的模式:每一波硬件专业化都响应了计算瓶颈,无论是图形渲染、媒体编码还是神经网络推理。2020 年代的特点不仅在于专业化,还在于其普遍性:AI 加速器现在支撑着从 YouTube 上的产品推荐到自动驾驶汽车中的目标检测等一切事物。与早期的加速器不同,今天的 AI 硬件必须紧密集成动态软件框架,并扩展到云到边缘的部署。表格不仅展示了过去,还展示了向越来越定制、高影响力的计算平台发展的轨迹。

对于人工智能加速来说,这一转变带来了挑战,这些挑战远远超出了硬件设计的范畴。机器学习加速器必须通过在计算堆栈的多个级别上进行优化来无缝集成到机器学习工作流程中。它们必须与广泛采用的框架如 TensorFlow、PyTorch 和 JAX 有效协同工作,确保在各种硬件平台上部署的平滑和一致性。编译器和运行时支持变得必要;高级优化技术,如图级别转换、内核融合和内存调度,对于充分利用这些专用加速器的全部潜力至关重要。

可扩展性推动了额外的复杂性,因为人工智能加速器部署在从高吞吐量数据中心到资源受限的边缘和移动设备等多样化的环境中,需要定制化的性能调整和能源效率策略。集成到异构计算环境中 15 需要互操作性,这使专用单元能够与分布式系统中的传统 CPU 和 GPU 有效协调工作。

人工智能加速器代表了一种系统级的转变,它需要紧密的软硬件耦合。这种转变体现在三个具体的计算模式上,即计算原语,这些模式驱动了加速器的设计决策。理解这些原语决定了能够通过协调的硬件专业化和软件优化策略实现 100-1000×\times性能提升的体系结构特征,这些策略将在后续章节中探讨。

从浮点协处理器到人工智能加速器的演变揭示了一个一致的规律:计算瓶颈推动专用硬件的发展。英特尔 8087 处理器解决了占科学计算时间 80%的浮点运算问题,而现代人工智能工作负载则是一个更为极端的案例。矩阵乘法和卷积构成了神经网络计算超过 95%的部分。这种计算需求的集中创造了前所未有的专业化机会,这也解释了为什么人工智能加速器在通用处理器上实现了 100-1000×\times的性能提升。

通过数十年的硬件进化所确立的专业化原则,识别主导操作、创建专用数据路径和优化内存访问模式,现在指导着 AI 加速器的设计。然而,神经网络引入了独特的特性,要求新的架构方法:矩阵操作中的大规模并行性、可预测的数据访问模式以实现预取,以及对降低精度的容忍度,这允许进行激进的优化。理解这些计算模式,我们称之为 AI 计算原语,有助于理解现代加速器如何将第十章中的理论效率提升转化为实际性能改进。这些软硬件优化在从第二章边缘设备到云规模推理系统等部署场景中变得至关重要。

在详细检查这些计算原语之前,我们需要了解能够实现其高效执行的架构组织。现代 AI 加速器通过精心编排的、协同工作的专用组件的层次结构实现了显著的性能提升。该架构包括三个子系统,每个子系统都针对计算挑战的不同方面。

处理基板由一系列处理单元组成,每个单元都包含针对特定操作优化的专用计算单元:张量核心执行矩阵乘法,向量单元执行逐元素操作,而特殊功能单元计算激活函数。这些处理单元以网格拓扑组织,实现了大规模并行处理,数十到数百个单元可以同时处理计算的不同部分,利用神经网络工作负载中固有的数据级并行性。

内存层次结构是一个同样关键的架构组件。高带宽内存提供了维持这些众多处理单元所需的总体吞吐量,而从共享 L2 缓存到每个元素的 L1 缓存和临时存储的多级缓存层次结构最小化了数据移动的能量成本。这种层次化组织体现了一个设计原则:在 AI 加速器中,数据移动通常比计算本身消耗更多的能量,需要优先考虑数据重用,通过在计算单元附近保持频繁访问的值(包括权重和部分结果)来实现。

主机接口在专用加速器和更广泛的计算系统之间建立连接,使管理程序控制流的通用 CPU 和执行计算密集型神经网络操作的加速器之间的协调成为可能。这种架构分区反映了系统级别的专业化:CPU 处理控制流、条件逻辑和系统协调,而加速器专注于主导神经网络执行的规律、大规模并行算术操作。

图 11.2 展示了这种架构组织,展示了专用计算单元、分层内存子系统和主机连接如何集成,形成一个针对人工智能工作负载优化的系统。

图片

图 11.2:现代人工智能加速器的解剖结构:人工智能加速器集成了包含张量核心、向量单元和特殊功能单元的专用处理元素,由从高带宽内存到本地缓存的分层内存系统支持。这种架构最大化了数据重用和并行执行,同时最小化了能耗密集型数据移动,为相对于通用处理器的 100-1000 倍性能提升奠定了基础。

人工智能计算原语

了解硬件如何向针对人工智能特定设计演变,需要检查推动这种专业化的计算模式。从实现 100 GFLOPS 的通用 CPU 到提供 100,000+ GFLOPS 的专用加速器过渡,反映了针对主导机器学习工作负载的特定计算模式的架构优化。这些模式,我们称之为计算原语,无论应用领域或模型大小如何,都在所有神经网络架构中反复出现。

现代神经网络建立在少数几个核心计算模式之上。无论层类型是全连接、卷积还是基于注意力的层,底层操作通常涉及将输入值乘以学习到的权重并累积结果。这种重复的乘加过程主导了神经网络执行,并定义了人工智能工作负载的算术基础。这些操作的规律性和频率导致了人工智能计算原语的发展:硬件级别的抽象,旨在以高效率执行这些核心计算。

神经网络表现出高度结构化和数据并行的计算,这使架构专业化成为可能。在第 11.2.2 节中建立的并行化原则的基础上,这些模式强调了可预测的数据重用和固定的操作序列。人工智能计算原语将这些模式提炼成可重用的架构单元,支持高吞吐量和节能的执行。

这种分解在列表 11.1 中展示,它定义了框架级别的密集层。

列表 11.1: 密集层定义: 使用高级 API 定义密集层,展示了神经网络如何实现输入张量上的并行转换。

dense = Dense(512)(input_tensor)

这个高级调用扩展为数学操作,如列表 11.2 所示。

列表 11.2: 层计算: 神经网络通过加权输入求和后应用激活函数转换来计算每一层的输出。

output = matmul(input_weights) + bias
output = activation(output)

在处理器级别,计算简化为嵌套循环,这些循环乘以输入和权重,求和结果,并应用非线性函数,如列表 11.3 所示。

列表 11.3: 嵌套循环: 通过顺序矩阵乘法和偏置添加计算输出值,随后应用激活函数以产生最终输出。

for n in range(batch_size):
    for m in range(output_size):
        sum = bias[m]
        for k in range(input_size):
            sum += input[n, k] * weights[k, m]
        output[n, m] = activation(sum)

这种转换揭示了四个计算特性:数据级并行性允许同时执行,结构化矩阵操作定义计算工作负载,可预测的数据移动模式驱动内存优化,以及频繁的非线性变换推动专用功能单元。

人工智能计算原语的设计遵循三个架构标准。首先,原语必须频繁使用,以证明专用硬件资源的合理性。其次,其专用实现必须相对于通用替代方案提供实质性的性能或能效提升。第三,原语必须跨代神经网络架构保持稳定,以确保长期适用性。这些考虑因素决定了向量操作、矩阵操作和特殊功能单元等原语在现代机器学习加速器中的包含。它们共同构成了高效且可扩展神经网络执行的架构基础。

向量操作

向量操作通过同时处理多个数据元素提供第一层硬件加速。这种并行性存在于多个尺度上,从单个神经元到整个层,使得向量处理对于高效神经网络执行至关重要。框架级代码转换为硬件指令,揭示了向量处理在神经网络加速器中的关键作用。

高级框架操作

机器学习框架通过高级抽象隐藏硬件复杂性。这些抽象分解为越来越低级的操作,揭示了硬件加速的机会。其中一个这样的抽象在列表 11.4 中展示,它说明了线性层的执行流程。

列表 11.4: 线性层: 神经网络通过线性映射将输入数据转换到更高维的空间,以实现复杂特征提取。

layer = nn.Linear(256, 512)  # 256 inputs to
# 512 outputs
output = layer(input_tensor)  # Process a batch of inputs

这种抽象表示一个全连接层,通过学习到的权重将输入特征进行转换。为了理解硬件加速机会的出现,列表 11.5 展示了框架如何将这一高级表达式转换为数学运算。

列表 11.5:全连接层:每个输出被计算为所有输入的加权总和加上一个偏置,然后通过激活函数转换。线性变换使神经网络中的复杂模型架构成为可能。

Z = matmul(weights, input) + bias  # Each output needs all inputs
output = activation(Z)  # Transform each result

这些数学运算在处理器执行过程中进一步分解为明确的计算步骤。列表 11.6 展示了实现这些乘加操作的嵌套循环。

列表 11.6:线性层计算:每个输出神经元通过将所有特征的加权输入求和,然后应用激活函数来计算。理解这一过程有助于掌握神经网络的基本构建块。

for batch in range(32):            # Process 32 samples at once
    for out_neuron in range(512):  # Compute each output neuron
        sum = 0.0
        for in_feature in range(256): # Each output needs
                                      # all inputs
            sum += input[batch, in_feature] *
                         weights[out_neuron, in_feature]
        output[batch, out_neuron] = activation(sum +
                                    bias[out_neuron])

顺序标量执行

传统标量处理器按顺序执行这些操作,一次处理一个单独的值。对于上面提到的包含 32 个样本的线性层示例,计算输出需要超过 400 万次乘加运算。每次操作都涉及加载一个输入值和一个权重值,将它们相乘,并累加结果。当处理神经网络所需的巨大数量的相同操作时,这种顺序方法变得非常低效。

认识到这种低效性,现代处理器利用向量处理来从根本上改变执行模式。

并行向量执行

向量处理单元通过同时操作多个数据元素来实现这种转换。列表 11.7 使用 RISC-V16 汇编代码展示了现代向量处理能力。

列表 11.7:向量化的乘加循环:这个循环展示了 RISC-V 向量指令如何通过同时执行 8 次乘加操作来高效地进行批量处理,从而降低神经网络训练中的计算延迟。来源:RISC-V 架构手册

vsetvli t0, a0, e32   # Process 8 elements at once
loop_batch:
    loop_neuron:
        vxor.vv v0, v0, v0    # Clear 8 accumulators
        loop_feature:
            vle32.v v1, (in_ptr)    # Load 8 inputs together
            vle32.v v2, (wt_ptr)    # Load 8 weights together
            vfmacc.vv v0, v1, v2    # 8 multiply-adds at once
            add in_ptr, in_ptr, 32  # Move to next 8 inputs
            add wt_ptr, wt_ptr, 32  # Move to next 8 weights
            bnez feature_cnt, loop_feature

这种向量实现并行处理八个数据元素,减少了计算时间和能耗。向量加载指令同时传输八个值,最大化内存带宽利用率。向量乘加指令并行处理八个值对,将总指令数从超过 400 万减少到大约 50 万。

为了阐明向量指令如何映射到常见的深度学习模式,表 11.2 介绍了关键向量操作及其在神经网络计算中的典型应用。这些操作,如归约、收集、分散和掩码操作,在池化、嵌入查找和注意力机制等层中经常遇到。这些术语对于解释低级向量硬件如何加速高级机器学习工作负载是必要的。

表 11.2:向量操作:神经网络层经常使用核心向量操作,如归约、收集和分散,以加速计算并有效地并行处理数据;这些操作阐明了低级硬件优化如何映射到高级机器学习算法。这些操作使得在深度学习模型中高效实现常见的层,如池化、嵌入查找和注意力机制成为可能。

向量操作 描述 神经网络应用
归约 将向量中的元素组合在一起(例如,求和、最大值) 池化层、注意力分数计算
收集 加载多个非连续内存元素 嵌入查找,稀疏操作
分散 写入多个非连续内存位置 嵌入的梯度更新
掩码操作 选择性地对向量元素进行操作 注意力掩码,填充处理
向量-标量广播 将标量应用于所有向量元素 偏置添加,缩放操作

向量处理效率的提升不仅限于指令计数减少。由于向量加载在每次操作中传输多个值,内存带宽利用率得到提高。由于控制逻辑在多个操作中共享,能效也得到提升。这些改进在现代神经网络的深层中累积,每个前向传递都会执行数十亿个操作。

向量处理历史

向量操作背后的原理长期以来一直是高性能计算的核心。在 20 世纪 70 年代和 80 年代,向量处理器作为科学计算、天气预报和物理模拟的架构解决方案出现,在这些领域,大量数据需要高效的并行处理。早期的系统,如 Cray-117,作为首批商业上成功的超级计算机之一,引入了专门的向量单元,可以在单条指令中执行整个数据向量的算术运算。这些向量单元与传统的标量执行相比,显著提高了计算吞吐量(Jordan 1982)。

这些概念在机器学习中重新出现,其中神经网络表现出适合向量执行的架构。曾经加速数值模拟的相同操作,如向量加法、乘法和归约,现在驱动着机器学习工作负载的执行。虽然现代 AI 加速器的规模和专业性与其历史前身不同,但底层架构原则保持不变。向量处理在神经网络加速中的复兴突出了其在实现高计算效率方面的效用。

向量运算通过允许独立数据元素的并行处理,为神经网络加速奠定了基础。虽然向量运算在元素级变换,如激活函数方面表现出色,但神经网络还需要结构化计算,将多个输入特征组合以产生输出特征,这些变换自然地表现为矩阵运算。这种在多个维度上同时进行协调计算的需求导致了下一个架构原语:矩阵运算。

矩阵运算

矩阵运算构成了神经网络的计算主力,通过权重、激活和梯度的结构化模式转换高维数据(Goodfellow, Courville, and Bengio 2013)。虽然向量运算独立处理元素,但矩阵运算同时协调多个维度的计算。这些操作揭示了驱动硬件加速策略的模式。

神经网络中的矩阵运算

神经网络计算分解为分层矩阵运算。如图列表 11.8 所示,一个线性层通过将输入特征转换为批次中的输出神经元来展示这种层次结构。

列表 11.8:矩阵运算:神经网络通过矩阵乘法和偏置来实现输出预测的转换。训练需要仔细管理输入批次和激活函数以优化模型性能。

layer = nn.Linear(256, 512)  # Layer transforms 256 inputs to
# 512 outputs
output = layer(input_batch)  # Process a batch of 32 samples

# Framework Internal: Core operations
Z = matmul(weights, input)  # Matrix: transforms [256 x 32]
# input to [512 x 32] output
Z = Z + bias  # Vector: adds bias to each
# output independently
output = relu(Z)  # Vector: applies activation to
# each element independently

这种计算展示了神经网络中矩阵运算的规模。每个输出神经元(总共 512 个)必须处理批次中每个样本的所有输入特征(总共 256 个)。仅权重矩阵就包含256×512=131,072256 \times 512 = 131,072个参数,这些参数定义了这些转换,说明了为什么高效的矩阵乘法对于性能至关重要。

神经网络在超越简单线性层的各种架构模式中采用矩阵运算。

神经网络中的矩阵计算类型

矩阵运算在现代神经网络架构中始终如一,如列表 11.9 所示。通过 im2col 技术 18 将卷积操作转换为矩阵乘法,从而在针对矩阵操作优化的硬件上实现高效执行。

列表 11.9:线性层:层变换将输入特征组合起来产生隐藏表示。神经网络中的矩阵运算能够实现高效的特征提取和转换,构成了许多机器学习架构的骨架。

hidden = matmul(weights, inputs)
# weights: [out_dim x in_dim], inputs: [in_dim x batch]
# Result combines all inputs for each output

# Attention Mechanisms - Multiple matrix operations
Q = matmul(Wq, inputs)
# Project inputs to query space [query_dim x batch]
K = matmul(Wk, inputs)
# Project inputs to key space[key_dim x batch]
attention = matmul(Q, K.T)
# Compare all queries with all keys [query_dim x key_dim]

# Convolutions - Matrix multiply after reshaping
patches = im2col(input)
# Convert [H x W x C] image to matrix of patches
output = matmul(kernel, patches)
# Apply kernels to all patches simultaneously

这种普遍的矩阵乘法模式对硬件设计有直接影响。对高效矩阵操作的需求推动了专门硬件架构的发展,这些架构能够大规模处理这些计算。以下章节将探讨现代 AI 加速器如何实现矩阵运算,重点关注其架构特性和性能优化。

矩阵运算硬件加速

矩阵运算的计算需求推动了专门的硬件优化。现代处理器实现了超越向量处理能力的专用矩阵单元。这种矩阵加速的例子在列表 11.10 中展示。

列表 11.10:矩阵单元操作:在硬件加速系统中启用高效的块状矩阵乘法和累加,展示了专用单元如何简化对 AI/ML 操作至关重要的计算任务。

mload mr1, (weight_ptr)     # Load e.g., 16x16 block of
                            # weight matrix
mload mr2, (input_ptr)      # Load corresponding input block
matmul.mm mr3, mr1, mr2     # Multiply and accumulate entire
                            # blocks at once
mstore (output_ptr), mr3    # Store computed output block

这个矩阵处理单元可以处理之前描述的线性层计算的16×1616\times16块,与使用向量处理可能的 8 个操作相比,可以同时处理 256 个乘加操作。这些矩阵操作通过实现结构化的多对多转换,补充了向量化的计算。矩阵和向量操作之间的相互作用决定了神经网络执行效率。

矩阵运算通过在多个维度上协调并行处理,为神经网络提供计算能力(参见表 11.3)。虽然它们能够实现诸如注意力机制和卷积等转换,但它们的性能取决于高效的数据处理。相反,向量运算针对一对一转换进行了优化,如激活函数和层归一化。这些操作的区分突出了数据流模式在神经网络加速器设计中的重要性,下文将对此进行探讨(Hwu 2011)。

表 11.3:操作特性:矩阵运算擅长神经网络层中常见的多对多转换,而向量运算则高效地处理激活函数和归一化等一对一转换。理解这些区别有助于为不同的机器学习任务选择适当的计算原语,并影响系统性能。

操作类型 最佳用途 示例 关键特性
* 层转换
矩阵运算 多对多转换 * 注意力计算* 卷积* 激活函数 每个输出依赖于多个输入
向量运算 一对一转换 * 层归一化* 元素级梯度 每个输出只依赖于相应的输入

矩阵计算的历史基础

矩阵运算长期以来一直是计算数学的基石,其应用范围从数值模拟扩展到图形处理(Golub 和 Loan 1996)。矩阵乘法和变换的结构性质使它们成为早期计算架构加速的自然目标。在 20 世纪 80 年代和 90 年代,针对矩阵计算优化的专用数字信号处理器(DSPs)和图形处理单元(GPUs)在加速图像处理、科学计算和 3D 渲染等工作负载中发挥了关键作用(Owens 等人 2008)。

机器学习的广泛应用强化了高效矩阵计算的重要性。神经网络,其根本建立在矩阵乘法和张量运算之上,推动了专用硬件架构的发展,这些架构超越了传统的向量处理。现代的张量处理单元(TPUs)和 AI 加速器实现了大规模的矩阵乘法,反映了曾经支撑早期科学计算和图形工作负载的相同架构原则。矩阵中心架构的复兴突显了经典数值计算与当代 AI 加速之间的深层联系。

虽然矩阵运算为神经网络提供了计算骨干,但它们只代表了加速挑战的一部分。神经网络还严重依赖于无法仅通过线性代数有效表达的非线性变换。

特殊功能单元

虽然向量矩阵运算能够高效地处理神经网络中的线性变换,但非线性函数提出了独特的计算挑战,需要专门的硬件解决方案。特殊功能单元(SFUs)为这些基本计算提供硬件加速,完成了高效神经网络执行所需的基本处理原语集。

非线性函数

非线性函数在机器学习中扮演着基础角色,通过使神经网络能够模拟复杂关系(Goodfellow, Courville, and Bengio 2013)。列表 11.11 展示了典型的神经网络层序列。

列表 11.11:非线性变换:神经网络通过一系列线性变换后跟非线性激活来处理输入数据,以捕捉复杂模式。这个层序列增强了模型的表达能力和学习能力。

layer = nn.Sequential(
    nn.Linear(256, 512), nn.ReLU(), nn.BatchNorm1d(512)
)
output = layer(input_tensor)

这个序列引入了多个非线性变换,这些变换超越了简单的矩阵运算。列表 11.12 展示了框架如何将这些操作分解为其数学组成部分。

列表 11.12:非线性变换:神经网络应用线性和非线性操作将输入数据转换为学习有意义特征。机器学习模型利用这些变换来有效地捕捉数据中的复杂模式。

Z = matmul(weights, input) + bias  # Linear transformation
H = max(0, Z)  # ReLU activation
mean = reduce_mean(H, axis=0)  # BatchNorm statistics
var = reduce_mean((H - mean) ** 2)  # Variance computation
output = gamma * (H - mean) / sqrt(var + eps) + beta
# Normalization

非线性函数的硬件实现

当在传统处理器上检查这些操作的实现时,它们的计算复杂性变得明显。这些看似简单的数学运算转化为复杂的指令序列。考虑批归一化的计算:计算平方根需要多次数值逼近迭代,而在 softmax 等操作中的指数函数需要级数展开或查找表(Ioffe and Szegedy 2015b)。即使是简单的 ReLU 激活也会引入分支逻辑,这可能会破坏指令流水线(参见列表 11.13 中的示例)。

列表 11.13:ReLU 和 BatchNorm 操作:神经网络通过可能导致指令流水线中断的条件操作处理输入数据,以及为归一化所需的多次遍历,突出了传统实现中的效率挑战。来源:IEEE Spectrum

for batch in range(32):
    for feature in range(512):
       # ReLU: Requires branch prediction and potential
       # pipeline stalls
       z = matmul_output[batch, feature]
       h = max(0.0, z)    # Conditional operation

       # BatchNorm: Multiple passes over data
       mean_sum[feature] += h    # First pass for mean
       var_sum[feature] += h * h # Additional pass for variance

       temp[batch, feature] = h  # Extra memory storage needed

# Normalization requires complex arithmetic
for feature in range(512):
    mean = mean_sum[feature] / batch_size
    var = (var_sum[feature] / batch_size) - mean * mean

    # Square root computation: Multiple iterations
    scale = gamma[feature] / sqrt(var + eps)  # Iterative
                                              # approximation
    shift = beta[feature] - mean * scale

    # Additional pass over data for final computation
    for batch in range(32):
        output[batch, feature] = temp[batch, feature] *
                                 scale + shift

这些操作引入了几个关键的低效因素:

  1. 多次遍历数据,增加内存带宽需求

  2. 需要许多指令周期的复杂算术

  3. 条件操作可能导致流水线停滞

  4. 为中间结果提供额外的内存存储

  5. 向量处理单元利用率低

更具体地说,每个操作都引入了独特的挑战。批量归一化需要多次遍历数据:一次用于计算均值,另一次用于计算方差,最后一次用于输出转换。每次遍历都通过内存层次结构加载和存储数据。在数学符号中看似简单的操作通常扩展为许多指令。平方根计算通常需要 10-20 次牛顿-拉夫森近似等数值方法的迭代,以达到适当的精度(Goldberg 1991)。像 ReLU 的最大函数这样的条件操作需要可能导致处理器流水线停滞的分支指令。实现需要临时存储中间值,这增加了内存使用和带宽消耗。虽然向量单元擅长常规计算,但像指数和平方根这样的函数通常需要不能充分利用向量处理能力的标量操作。

硬件加速

SFUs 通过专用硬件实现来解决这些低效问题。现代机器学习加速器包括将复杂操作转换为单周期或固定延迟计算的专用电路。加速器可以加载值向量并直接应用非线性函数,消除了多次遍历和复杂指令序列的需要,如列表 11.14 所示。

列表 11.14:硬件加速:单周期非线性操作使机器学习加速器中的向量处理效率更高,展示了专用硬件如何减少计算延迟。

vld.v v1, (input_ptr)    # Load vector of values
vrelu.v v2, v1           # Single-cycle ReLU on entire vector
vsigm.v v3, v1           # Fixed-latency sigmoid computation
vtanh.v v4, v1           # Direct hardware tanh implementation
vrsqrt.v v5, v1          # Fast reciprocal square root

每个 SFU 通过专用电路实现特定的功能。例如,ReLU 单元在专用逻辑中执行比较和选择,消除了分支开销。平方根操作使用具有固定迭代次数的算法(如牛顿-拉夫森算法)的硬件实现,提供保证的延迟。指数和对数函数通常结合小的查找表和硬件插值电路(Costa 等人 2019)。使用这些自定义指令,SFU 实现消除了对数据的多次遍历,移除了复杂的算术序列,并保持了高计算效率。表 11.4 显示了各种硬件实现及其典型延迟。

表 11.4:特殊功能单元:通过消除软件开销并允许并行处理向量数据,专用硬件实现常见的数学函数(如 relu、sigmoid 和倒数平方根)加速了机器学习计算。每个函数的典型延迟为 1-2 周期,这表明通过专用电路而不是通用算术所实现的性能提升。

功能单元 操作 实现策略 典型延迟
激活单元 ReLU, sigmoid, tanh 分段近似电路 1-2 周期
统计单元 Mean, variance 并行归约树 log(N)周期
指数单元 exp, log 表查找 + 硬件插值 2-4 周期
根/幂单元 sqrt, rsqrt 固定迭代牛顿-拉夫森 4-8 周期

SFU 历史

高效的非线性函数评估需求几十年来一直影响着计算机架构。早期的处理器集成了对复杂数学函数的硬件支持,例如对数和三角运算,以加速科学计算和信号处理工作负载(Smith 1997)。在 20 世纪 70 年代和 80 年代,浮点协处理器被引入以独立于主 CPU 处理复杂数学运算(Palmer 1980)。在 20 世纪 90 年代,指令集扩展如 Intel 的 SSE 和 ARM 的 NEON 提供了针对向量化的数学变换的专用硬件,提高了多媒体和信号处理应用的效率。

机器学习工作负载重新引入了对专用功能单元的强烈需求,因为激活函数、归一化层和指数变换是神经网络计算的基础。现代人工智能加速器不再依赖于迭代的软件近似,而是为这些操作实现了快速、固定延迟的 SFU,这与科学计算的历史趋势相呼应。专用特殊功能单元的重新出现强调了硬件演变的持续周期,其中特定领域的需求推动了在新的计算范式中对经典架构概念的重新发明。

向量、矩阵和特殊功能单元的组合为现代人工智能加速器提供了计算基础。然而,这些处理原语的有效利用严重依赖于数据移动和访问模式。这使我们转向研究神经网络执行中实现高效数据流的架构、层次结构和策略。

计算单元和执行模型

向量运算、矩阵运算和之前考察的特殊功能单元代表了人工智能加速器中的基本计算原语。现代人工智能处理器将这些原语打包成不同的执行单元,例如 SIMD 单元、张量核心和处理元素,这些单元定义了计算的结构以及如何向用户暴露。理解这种组织结构揭示了开发者可以利用的当代人工智能加速器的理论能力和实际性能特征。

将原语映射到执行单元

从计算原语到执行单元的演变遵循一个结构化的层次结构,反映了人工智能加速器日益复杂化和专业化的趋势:

  • 向量运算 → 允许独立数据元素并行处理的 SIMD/SIMT 单元

  • 矩阵运算 → 提供结构化矩阵乘法的张量核心和收缩阵列

  • 特殊功能 → 集成在处理元素内的专用硬件单元

每个执行单元将这组计算原语与专用内存和控制机制相结合,优化性能和能效。这种结构化封装允许硬件供应商在实现针对特定工作负载需求定制的多样化底层架构的同时,公开标准化的编程接口。执行单元的选择显著影响整体系统效率,影响数据局部性、计算密度和工作负载适应性。后续章节将探讨这些执行单元如何在人工智能加速器中运行,以最大化不同机器学习任务中的性能。

从 SIMD 到 SIMT 架构的演变

单指令多数据(SIMD)19 执行并行地对多个数据元素应用相同的操作,最小化指令开销同时最大化数据吞吐量。这种执行模型广泛应用于具有规则、独立数据并行性的工作负载加速,如神经网络计算。ARM 可伸缩向量扩展(SVE)提供了一个现代架构如何高效实现 SIMD 操作的代表性示例,如列表 11.15 所示。

列表 11.15:向量运算:向量乘法和加法运算在机器学习模型中实现高效的并行处理。来源:ARM 文档

ptrue p0.s              # Create predicate for vector length
ld1w z0.s, p0/z, [x0]   # Load vector of inputs
fmul z1.s, z0.s, z0.s   # Multiply elements
fadd z2.s, z1.s, z0.s   # Add elements
st1w z2.s, p0, [x1]     # Store results

处理器架构继续扩展 SIMD 能力,以适应不断增长的计算需求。Intel 的高级矩阵扩展(AMX)(I. 公司 2021)和 ARM 的 SVE2 架构(Stephens 等人 2017)提供了灵活的 SIMD 执行,使软件能够跨不同的硬件实现进行扩展。

为了解决这些限制,SIMT 通过允许多个独立线程的并行执行扩展了 SIMD 原则,每个线程保持自己的程序计数器和架构状态(E. Lindholm 等人 2008)。这种模型自然地映射到矩阵计算,其中每个线程处理工作负载的不同部分,同时仍然受益于共享指令执行。在 NVIDIA 的 GPU 架构中,每个流多处理器(SM)20 协调成千上万的并行执行的线程,允许高效地扩展神经网络计算,如列表 11.16 所示。线程被组织成 warp21,它们是使 SIMT 效率化的基本执行单元。

列表 11.16:SIMT 执行:每个线程并行处理一个独特的输出元素,展示了 SIMT 如何在 GPU 上实现高效的矩阵乘法。

__global__ void matrix_multiply(float* C, float* A, float*
                                B, int N) {
    // Each thread processes one output element
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;

    float sum = 0.0f;
    for (int k = 0; k < N; k++) {
        // Threads in a warp execute in parallel
        sum += A[row * N + k] * B[k * N + col];
    }
    C[row * N + col] = sum;
}

SIMT 执行允许神经网络计算在数千个线程上高效扩展,同时保持对发散执行路径的灵活性。类似的执行模型出现在 AMD 的 RDNA 和 Intel 的 Xe 架构中,强化了 SIMT 作为 AI 加速的基本机制。

张量核心

虽然 SIMD 和 SIMT 单元提供了高效的向量操作执行,但神经网络严重依赖于需要专门执行单元进行结构化多维处理的矩阵计算。矩阵操作的能量经济学推动了这种专业化:传统的标量处理需要每个操作多次 DRAM 访问,每次访问消耗 640 pJ,而张量核心将这种能量成本分摊到整个矩阵块上。张量处理单元通过启用通过专用硬件块执行矩阵乘法和累加的矩阵操作,扩展了 SIMD 和 SIMT 原则,这些硬件块在单个操作中在整个矩阵块上执行。张量核心将能量配置文件从 173×内存受限的低效转变为计算优化的执行,其中 3.7 pJ 的乘累加操作主导了能量预算,而不是数据移动。

张量核心 22,如 NVIDIA 的 Ampere GPU 架构中所实现,是这种方法的例子。它们通过专用指令,如 NVIDIA A100 GPU 上列表 11.17 中所示的张量核心操作,公开了矩阵计算能力。

列表 11.17:张量核心操作:矩阵乘法在整个矩阵块上并行执行,优化了神经网络训练的计算效率。


Tensor Core Operation (NVIDIA A100):
mma.sync.aligned.m16n16k16.f16.f16
  {d0,d1,d2,d3},     // Destination registers
  {a0,a1,a2,a3},     // Source matrix A
  {b0,b1,b2,b3},     // Source matrix B
  {c0,c1,c2,c3}      // Accumulator

单个张量核心指令处理整个矩阵块,同时在局部寄存器中保持中间结果,与基于标量或向量操作的实施相比,显著提高了计算效率。这种结构化方法使硬件能够实现高吞吐量,同时减少软件层面上的显式循环展开和数据管理的负担。

张量处理单元架构根据设计优先级而有所不同。NVIDIA 的 Ampere 架构集成了针对通用深度学习加速优化的张量核心。Google 的 TPUv4 利用大规模矩阵单元,以阵列形式排列,以最大化持续的训练吞吐量。Apple 的 M1 神经网络引擎 23 集成了针对移动推理工作负载优化的较小矩阵处理器,而 Intel 的 Sapphire Rapids 架构引入了专为高性能数据中心应用设计的 AMX 瓦片。

AI 硬件的日益专业化推动了深度学习工作负载的显著性能提升。图 11.3 展示了 NVIDIA GPU 中 AI 加速器性能的轨迹,突出了从通用浮点执行单元到高度优化的张量处理核心的过渡。

图片

图 11.3:GPU 性能提升:NVIDIA GPU 在十年间整数 8 位 TOPS(每秒兆次运算)上实现了10×10\times的增长,这一增长是由从浮点运算向张量核心加速的架构创新驱动的。这一趋势反映了硬件在深度学习工作负载中的日益专业化以及对于高效推理能力的不断增长需求。

处理单元

最高级别的执行单元组织将多个张量核心与本地内存集成到处理单元(PEs)中。处理单元是许多 AI 加速器的基本构建块,通过结合不同的计算单元来高效执行神经网络操作。每个 PE 通常包括用于逐元素操作的向量单元、用于矩阵计算的张量核心、用于非线性变换的特殊功能单元以及专门的内存资源,以优化数据局部性和最小化数据移动开销。

处理单元在 AI 硬件中发挥着至关重要的作用,通过平衡计算密度与内存访问效率。它们的设计在不同架构中有所不同,以支持多样化的工作负载和可扩展性要求。Graphcore 的智能处理单元(IPU)将计算分布在 1,472 个瓦片上,每个瓦片包含独立优化的处理单元,以支持细粒度并行性(Graphcore 2020)。Cerebras 在 CS-2 系统中扩展了这种方法,通过晶圆级设备集成了 850,000 个处理单元,以加速稀疏计算。Tesla 的 D1 处理器通过大量本地内存排列处理单元,优化了实时自动驾驶工作负载的吞吐量和延迟(Quinnell 2024)。

处理单元为大规模 AI 加速提供了结构基础。它们的效率不仅取决于计算能力,还取决于互连策略和内存层次结构设计。接下来的几节将探讨这些架构选择如何影响不同 AI 工作负载的性能。

张量处理单元通过使用硬件加速的矩阵计算,在人工智能工作负载中实现了显著的效率提升。随着架构中纳入对高级执行技术的支持,包括结构化稀疏性和特定工作负载优化,它们的作用也在不断演变。然而,这些单元的有效性不仅取决于它们的计算能力,还取决于它们与内存层次结构和数据移动机制如何交互,这些内容将在后续章节中探讨。

系统阵列

当张量核心将矩阵运算打包成结构化计算单元时,系统阵列提供了一种针对连续数据流和操作数重用优化的替代方法。系统架构的基本动机源于之前讨论的能量效率约束——通过架构设计最小化内存访问惩罚的影响。系统阵列以网格模式排列处理单元,其中数据以同步方式在相邻单元之间有节奏地流动,使得每个操作数在通过阵列传播时能够参与多个计算。这种结构化移动通过最大化本地数据重用最小化了外部内存访问——单个权重值可以在通过处理单元时对数十个操作做出贡献,从而从根本上将能量配置文件从内存受限转变为计算高效执行。

系统阵列的概念最初由 Kung 和 Leiserson24 提出,他们在并行计算架构中正式化了其应用,以实现高效的矩阵运算(Kung 1982)。与通用执行单元不同,系统阵列通过在网格中传播时重复使用操作数来利用空间和时间局部性。谷歌的 TPU 就是这种架构方法的例证。在 TPUv4 中,一个128×128128\times128的系统阵列乘累加单元通过以流水线方式通过阵列流数据来处理矩阵运算,如图图 11.4 所示。

系统阵列架构通过在结构化处理单元网格上同步数据移动来实现计算效率。系统阵列围绕以下四个基本组件组织计算:

  1. 控制单元:协调阵列中的时序和数据分布,在整个计算网格中保持同步操作

  2. 数据流:输入矩阵通过协调的路径传播——矩阵 A 的元素水平穿越,而矩阵 B 的元素通过处理网格垂直流动

  3. 处理单元网格:单个处理单元对流数据执行乘累加运算,生成部分结果,这些结果累积到最终计算中

  4. 输出收集:结果在指定的输出边界处汇总,其中累积的局部和形成完整的矩阵元素

同步数据流确保矩阵元素 A[i,k]在精确的时间间隔内遇到相应的 B[k,j]元素,执行矩阵乘法所需的乘累加操作 C[i,j] = Σ A[i,k] × B[k,j]。这种在多个处理元素之间系统地重用操作数,通过消除从外部内存子系统中的冗余数据检索,显著降低了内存带宽需求。

考虑在心脏阵列内乘以 2×2 矩阵 A 和 B。在第一个计算周期内,元素 A[0,0]=2 水平传播,而 B[0,0]=1 垂直移动,在处理元素 PE(0,0)处汇聚以执行乘法 2×1=2。在下一个周期,相同的 A[0,0]=2 移动到 PE(0,1),在那里它遇到 B[0,1]=3,计算 2×3=6。同时,A[0,1]=4 进入 PE(0,0)以与下一个 B 矩阵元素交互。这种协调的数据移动使得在多个计算操作中系统地重用操作数,消除冗余内存访问,并体现了心脏阵列架构的基本效率原则。

图片

图 11.4:心脏阵列数据流:数组内的处理元素通过流水线方式流式传输数据执行矩阵操作,与传统的内存-计算架构相比,最大程度地重用操作数并最小化内存访问。这种空间和时间局部性使得高效并行计算成为可能,如谷歌 tpuv4 中的乘累加单元所示。

数组中的每个处理元素在每个周期内执行乘累加操作:

  1. 从上方接收输入激活

  2. 从左侧接收权重值

  3. 将这些值相乘并加到其运行总和上

  4. 将输入激活向下传递,将权重值向右传递到相邻元素

这种结构化计算模型最小化了全局内存和处理元素之间的数据移动,提高了效率和可扩展性。由于心脏阵列以流式操作,因此它们特别适用于高吞吐量工作负载,如深度学习训练和推理。

虽然图 11.4 中的图示说明了常见的心脏阵列实现方式,但心脏架构在不同加速器设计中差异很大。以训练为重点的架构,如谷歌的 TPU,采用大阵列,优化了高计算吞吐量,而边缘设备中发现的推理设计则优先考虑能源效率,采用较小的配置。

基本原则保持一致:数据系统地通过处理元素流动,输入在水平和垂直方向上移动以同步计算部分和。然而,如第 11.4.1 节中详细说明的,实际的有效性最终受到内存带宽瓶颈的限制。

一个能够每周期执行 16,384 次操作的 128×128 收缩阵列需要持续的数据输入来维持利用率——每个周期都需要新鲜输入激活和权重参数,这些参数必须从片外内存通过片上缓冲区传输到阵列边缘。TPU 的 1,200 GB/s 片上带宽使得利用率很高,但当处理内存需求超过片上容量的大型变压器模型时,即使这个巨大的带宽也会变得有限。

回想第十章,量化通过将 FP32 权重转换为 INT8 表示来减少模型内存占用——这种优化直接针对此处确定的内存带宽限制。将 32 位浮点权重转换为 8 位整数可以将内存流量减少 4 倍,将带宽受限的操作转换为计算受限的工作负载,其中收缩阵列可以实现更高的利用率。同样,结构化剪枝移除权重矩阵的整个行或列,减少了必须穿越内存层次结构的数据量以及所需的计算。这些算法优化之所以有价值,正是因为它们针对限制实际加速器性能的内存瓶颈。

人工智能加速中的数值计算

人工智能加速器的效率不仅取决于计算能力,还取决于数值表示的精度。数值格式的选择决定了精度、吞吐量和能耗之间的平衡,影响着不同的执行单元,如 SIMD 和 SIMT 单元、张量核心和收缩阵列的设计和部署。

精度权衡

数值精度是现代人工智能加速器中的一个关键设计参数。虽然更高的精度格式提供了数学上的稳定性和准确性,但它们在功耗、内存带宽和计算吞吐量方面带来了巨大的成本。找到最佳精度点已成为人工智能硬件架构中的一个核心挑战。

早期深度学习模型主要依赖于单精度浮点数(FP32)进行训练和推理。虽然 FP32 提供了足够的动态范围和精度以支持稳定的学习,但它带来了高计算和内存成本,限制了效率,尤其是在模型规模增加时。随着时间的推移,硬件架构发展以支持更低精度的格式,如半精度浮点数(FP16)和 bfloat16(BF16),这些格式可以减少内存使用并提高计算吞吐量,同时保持深度学习任务所需的足够精度。最近,整数格式(INT8、INT4)在推理工作负载中越来越受欢迎,其中小的数值表示可以显著提高能效,同时不会超过可接受的模型精度极限。

从高精度到低精度格式的过渡已经深深集成到硬件执行模型中。正如第 11.3.4.2 节中详细所述,SIMD 和 SIMT 单元为多种精度提供了灵活的支持。张量核心(第 11.3.4.3 节)通过使用降低精度的算术来加速计算,而脉动阵列(第 11.3.4.5 节)通过最小化内存带宽约束来优化性能,通过使用最大化操作数重用的低精度格式。

尽管降低精度具有优势,但深度学习模型并不总是可以完全依赖低比特表示。为了应对这一挑战,现代 AI 加速器实现了混合精度计算,在执行的不同阶段使用不同的数值格式。这些精度选择对模型的公平性和可靠性有重要影响。例如,矩阵乘法可能在 FP16 或 BF16 中执行,而累加则保持在 FP32 以防止精度损失。同样,推理引擎在必要时利用 INT8 算术,同时保留关键激活在更高精度中。

混合精度计算

现代 AI 加速器越来越多地支持混合精度执行,允许在计算的各个阶段使用不同的数值格式。训练工作负载通常利用 FP16 或 BF16 进行矩阵乘法,同时保持 FP32 的累加以保持精度。相比之下,推理工作负载优化为 INT8 甚至 INT4,在保持可接受精度的同时实现高效率。

这种向精度多样性的转变在人工智能硬件的演变中表现得非常明显。早期架构,如 NVIDIA Volta,对低于 FP16 的低精度支持有限,而后续架构,包括 Turing 和 Ampere,扩展了支持的格式范围。Ampere GPU 引入了 TF32 作为 FP32 和 FP16 之间的混合格式,同时更广泛地支持 BF16、INT8 和 INT4。 表 11.5 展示了这一趋势。

表 11.5:精度支持演变:GPU 架构逐步扩展了对低精度数据类型的支持,使人工智能工作负载在性能提升和效率改进方面受益。早期架构主要使用 FP32,而后续几代架构则纳入了 FP16、BF16、INT8 和 INT4,以加速训练和推理任务。

架构 年份 支持的 Tensor Core 精度 支持的 CUDA Core 精度
Volta 2017 FP16 FP64, FP32, FP16
Turing 2018 FP16, INT8 FP64, FP32, FP16, INT8
Ampere 2020 FP64, TF32, bfloat16, FP16, INT8, INT4 FP64, FP32, FP16, bfloat16, INT8

表 11.5 突出了如何将更多样化的数值格式纳入到新的架构中,反映了在不同人工智能工作负载中需要更大的灵活性。这一趋势表明,未来的人工智能加速器将继续扩展对自适应精度的支持,优化计算效率和模型精度。

在硬件设计中使用的精度格式具有深远的影响。通过采用低精度格式,执行单元和内存之间的数据传输减少,导致内存带宽要求和存储需求降低。Tensor 核心和收缩阵列可以并行处理更多低精度元素,从而在 FLOPs 方面提高有效吞吐量。由于基于整数的计算(例如,INT8)与浮点运算相比需要更低的功耗,因此能效也得到了提高——这对于推理工作负载来说是一个明显的优势。

随着人工智能模型规模的持续扩大,加速器架构正在演变以支持更高效的数值格式。未来的设计预计将采用自适应精度技术,根据工作负载特性动态调整计算精度。这种演变有望进一步优化深度学习性能,同时在精度和能效之间达到最佳平衡。

建筑集成

计算原语组织到执行单元中的方式决定了 AI 加速器的效率。虽然 SIMD、tensor 核心和波前阵列是基本构建块,但它们在不同 AI 处理器中集成到全芯片架构中的方式差异很大。执行单元的选择、它们支持的数值精度以及它们的连接性影响硬件如何有效地扩展以适应深度学习工作负载。

现代 AI 处理器根据其预期应用表现出各种设计权衡。一些架构,如 NVIDIA 的 A100,集成了大量针对 FP16 训练优化的 tensor 核心,而 Google 的 TPUv4 优先考虑高吞吐量的 BF16 矩阵乘法。以推理为重点的处理器,如 Intel 的 Sapphire Rapids,集成了 INT8 优化的 tensor 核心以最大化效率。专为移动工作负载设计的 Apple M1 采用较小的处理单元,这些处理单元针对低功耗 FP16 执行进行了优化。这些设计选择反映了数值精度和执行单元组织方面的日益灵活性,正如前文所述。

表 11.6 总结了当代 AI 处理器中的执行单元配置。

表 11.6:AI 处理器配置:现代 AI 处理器优先考虑不同的执行单元特性,以优化特定工作负载的性能;NVIDIA A100 利用宽 SIMD 和 tensor 核心进行训练,Google TPUv4 强调高吞吐量的 BF16 矩阵乘法,而 Intel Sapphire Rapids 专注于 INT8 优化的推理,而 apple M1 优先考虑低功耗 FP16 在较小的处理单元上的执行。这些在 SIMD 宽度、tensor 核心大小和处理单元数量上的变化反映了 AI 硬件架构及其目标应用的日益多样化。

处理器 SIMD 宽度 Tensor 核心大小 处理单元 主要工作负载
NVIDIA A100 1024 位 4×4×44\times4\times4 FP16 108 个 SM 训练、HPC
Google TPUv4 128 位宽 128×128128\times128 BF16 每芯片 2 核心 训练
Intel Sapphire 512 位 AVX 32×3232\times32 INT8/BF16 56 核心 推理
Apple M1 128 位 NEON 16×1616\times16 FP16 8 个 NPU 核心 移动推理

表 11.6 突出了执行单元配置在不同架构中的差异,以优化不同的深度学习工作负载。训练加速器优先考虑高吞吐量的浮点张量运算,而推理处理器则专注于低精度整数执行以提高效率。同时,移动加速器在精度和功耗效率之间取得平衡,以满足实时约束。

成本效益分析

虽然架构规范定义了计算潜力,但实际的部署决策需要理解不同加速器选项之间的成本效益权衡。然而,仅凭原始的计算指标并不能提供一个完整的画面——现代 AI 加速的基本约束不是计算能力,而是数据移动效率。

之前建立的能量差异——其中内存访问成本主导计算——推动了整个专用硬件革命。这种差异解释了为什么具有高内存带宽的 GPU 实现了 40-60%的利用率,而具有阵列的 TPU 通过最小化数据移动实现了 85%的利用率。

表 11.7 提供了代表性加速器的具体成本效益数据,但经济分析必须考虑利用率效率和能源消耗模式,这些因素决定了实际性能。

表 11.7:加速器成本效益比较:硬件成本必须与计算能力相权衡,以确定最佳部署策略。虽然像 H100 这样的新型加速器提供了更好的性价比,但总拥有成本包括功耗、冷却需求和基础设施成本,这些因素会显著影响运营经济性。*TPU 定价基于云服务费率。

加速器 零售价(美元) 峰值 FLOPS(FP16) 内存带宽 价格/性能
NVIDIA V100 ~$9,000 (2017-19) | 125 TFLOPS | 900 GB/s | $72/TFLOP
NVIDIA A100 $15,000 | 312 TFLOPS (FP16) | 1,935 GB/s | $48/TFLOP
NVIDIA H100 $25,000-30,000 | 756 TFLOPS (TF32) | 3,350 GB/s | $33/TFLOP
Google TPUv4 ~$8,000* | 275 TFLOPS (BF16) | 1,200 GB/s | $29/TFLOP
Intel H100 $12,000 | 200 TFLOPS (INT8) | 800 GB/s | $60/TFLOP

一家训练大型语言模型的初创公司面临着在 8 个 V100($72K)提供 1,000 TFLOPS 或 4 个 A100($60K)提供 1,248 TFLOPS 之间的选择。然而,性能分析揭示了真正的性能故事——具有 0.5-2 FLOPS/byte 的算术强度的变压器训练使得两种配置都受内存带宽限制,而不是计算限制。A100 的 1,935 GB/s 带宽比 V100 的 900 GB/s 提供了 2.15 倍的可持续性能,使得有效性能提升达到 115%,而不是峰值 FLOPS 所暗示的 25%。当与 17% 低的硬件成本和 30% 的更好的能效(每有效 TFLOP 400 W 对比 300 W)相结合时,A100 配置在多年部署中提供了令人信服的经济优势。

这些成本动态解释了为何尽管单价更高,但新加速器的采用速度仍然很快。H100 的 $33/TFLOP 比 V100 的 $72/TFLOP 提高了 54%,但更重要的是,其 3,350 GB/s 的带宽使得每美元的内存吞吐量提高了 3.7 倍——这是决定现实世界变压器性能的指标。云部署进一步复杂化了分析,因为提供商通常对高端加速器收取 $2-4/小时 的费用,这使得购买和租赁的盈亏平衡点高度依赖于利用模式和能源成本,这些成本在三年生命周期内可能占运营总成本的 60-70%。

框架选择对经济决策的影响很大——详细的硬件-框架优化策略在第七章中介绍,而性能评估方法在第十二章中讨论。

虽然执行单元定义了加速器的计算潜力,但它们的有效性从根本上受到数据移动和内存层次结构的限制。实现计算资源的充分利用需要高效的内存系统,以最小化数据传输开销并优化局部性。了解这些限制揭示了为什么内存架构在 AI 加速中变得与计算设计一样关键。

AI 存储系统

在前几节中检查的执行单元——SIMD 单元、张量核心和收缩阵列——提供了令人印象深刻的计算吞吐量:现代加速器在神经网络操作中实现了 100 到 1000 TFLOPS。然而,当内存子系统无法以足够的速率提供数据时,这些理论能力在实践中仍然无法实现。这种基本约束,称为 AI 内存墙,代表了现实世界加速器性能中的主要瓶颈。

与传统工作负载不同,机器学习模型需要频繁访问大量参数、激活和中间结果,导致对内存带宽的大量需求——这是一个与第六章(ch012.xhtml#sec-data-engineering)中介绍的数据管理策略相交的挑战。现代人工智能硬件通过高级内存层次结构、高效的数据移动技术和压缩策略来应对这些挑战,以促进高效的执行和改进的人工智能加速。

本节通过四个相互关联的视角来考察内存系统设计。首先,我们量化了计算吞吐量和内存带宽之间不断扩大的差异,揭示了为什么人工智能内存墙代表了现代加速器中占主导地位的性能约束。其次,我们探讨了内存层次结构如何通过精心构建的层级(从片上 SRAM 到片外 DRAM)来平衡速度、容量和能效之间的竞争需求。第三,我们分析了主机系统和加速器之间的通信模式,揭示了限制端到端性能的传输瓶颈。最后,我们考察了不同的神经网络架构——多层感知器、卷积网络和变换器——如何创建不同的内存压力模式,这些模式为硬件设计决策和优化策略提供了信息。

理解人工智能内存墙

人工智能内存墙代表了限制现代加速器性能的基本瓶颈——计算吞吐量和内存带宽之间不断扩大的差异,这阻止了加速器达到其理论能力。虽然计算单元可以通过向量操作和矩阵乘法等专用原语每秒执行数百万次操作,但它们完全依赖于内存系统来提供这些操作所需的连续流权重、激活和中间结果。

量化计算-内存性能差距

在考察扩展趋势时,这种约束的严重性变得显而易见。在过去 20 年中,峰值计算能力每两年增长 3.0 倍,而在此期间 DRAM 带宽仅增长 1.6 倍(Gholami 等人 2024)。这种差异导致了一个指数级扩大的差距,其中加速器拥有巨大的计算能力,但无法快速访问数据以充分利用它。现代硬件体现了这种不平衡:NVIDIA H100 提供 989 TFLOPS 的计算能力,但只有 3.35 TB/s 的内存带宽(Choquette 2023a),需要每字节 295 次操作才能实现完全利用——远超过神经网络中典型的每字节 1-10 次操作。

存储墙通过三个关键约束体现出来。首先,能量差异——访问 DRAM 消耗 640 pJ,而计算仅需 3.7 pJ(Horowitz 2014),这造成了 173 倍的能量惩罚,通常由于功耗预算而非计算能力而限制了性能。其次,带宽限制——即使是 TB/s 的内存系统也无法持续不断地为数千个并行计算单元提供数据,在典型的工作负载中导致 50-70%的空闲时间。第三,延迟层次——片外内存访问需要数百个周期,这会在并行执行单元中产生流水线停滞。

如图 11.5 所示,这种“AI 存储墙”持续扩大,使得内存带宽而不是计算成为 AI 加速的主要约束。

图 11.5:AI 存储墙:计算性能与内存带宽之间不断扩大的差距强调了由于内存限制而维持峰值计算效率的挑战日益增加。在过去 20 年里,尽管计算能力迅速发展,但内存带宽并没有跟上,导致数据密集型应用中可能出现瓶颈。

除了性能限制之外,内存访问还带来了显著的能量成本。从片外 DRAM 中获取数据比执行算术运算消耗的能量要多得多(Horowitz 2014)。这种低效性在机器学习模型中尤为明显,其中大参数尺寸、频繁的内存访问和非均匀的数据移动模式加剧了内存瓶颈。能量差异驱动了架构决策——谷歌的 TPU 通过最小化通过收缩阵列和大型片上内存的数据移动,实现了比当代 GPU 高 30-83×\times的能量效率。这些设计选择表明,能量约束而非计算限制通常决定了实际部署的可行性。

机器学习工作负载中的内存访问模式

由于计算中涉及的大量数据,机器学习工作负载对内存系统提出了巨大的需求。与性能通常由算术运算速度决定的传统计算密集型应用不同,ML 工作负载的特点是高数据移动需求。加速器的效率不仅取决于其计算吞吐量,还取决于其连续向处理单元提供数据的能力,而不引入停滞或延迟。

神经网络在其执行过程中处理多种类型的数据,每种数据都有独特的内存访问模式:

  • 模型参数(权重和偏置):机器学习模型,尤其是在自然语言处理和计算机视觉等大规模应用中使用的模型,通常包含数百万到数十亿个参数。高效地存储和访问这些权重对于保持吞吐量至关重要。

  • 中间激活值:在训练和推理过程中,每一层都会产生中间结果,这些结果必须临时存储和检索以供后续操作使用。这些激活值可以显著增加内存开销,尤其是在深度架构中。

  • 梯度(训练期间):反向传播需要存储和访问每个参数的梯度,这进一步增加了计算单元和内存之间数据移动的量。

随着模型规模和复杂性的增加,内存容量和带宽的改进变得至关重要。尽管专门的计算单元可以加速矩阵乘法等操作,但它们的整体性能取决于数据持续、高效地传递到处理单元。在自然语言处理和计算机视觉等大规模应用中,模型通常包含数百万到数十亿个参数(T. B. Brown, Mann, Ryder, Subbiah, Kaplan, Dhariwal, Neelakantan, Shyam, Sastry, 等人,2020)。因此,实现高性能需要最小化由内存和计算单元之间不高效的数据移动引起的延迟和停滞(D. Narayanan 等人,2021a;Xingyu,2019)。

量化这一挑战的一种方法是将数据传输时间与计算所需时间进行比较。具体来说,我们定义内存传输时间为 Tmem=MtotalBmem, T_{\text{mem}} = \frac{M_{\text{total}}}{B_{\text{mem}}}, 其中 MtotalM_{\text{total}} 是总数据量,而 BmemB_{\text{mem}} 是可用的内存带宽。相比之下,计算时间由 Tcompute=FLOPsPpeak, T_{\text{compute}} = \frac{\text{FLOPs}}{P_{\text{peak}}}, 给出,其中浮点运算次数(FLOPs)除以峰值硬件吞吐量,PpeakP_{\text{peak}}。当 Tmem>TcomputeT_{\text{mem}} > T_{\text{compute}} 时,系统变为内存受限,这意味着处理元素花费更多的时间等待数据而不是执行计算。这种不平衡表明了需要内存优化的架构和高效的数据移动策略来维持高性能。

图 11.6 展示了模型增长与硬件内存能力之间的新兴挑战,阐述了“AI 内存墙”。该图以对数尺度跟踪了 AI 模型大小(红色点)和硬件内存带宽(蓝色点)随时间的变化。模型参数呈指数增长,从 2012 年 AlexNet 的约 6230 万个参数到 2023 年 Gemini 1 的万亿级参数,如更陡峭的红色趋势线所示。相比之下,硬件内存带宽,由 NVIDIA GPU 的连续几代(约 100-200 GB/s)和 Google TPUs(约 2-3 TB/s)代表,增长更为缓慢(蓝色趋势线)。这些趋势线之间的扩展阴影区域对应于“AI 内存墙”,这将是一个架构挑战,其中模型扩展速度超过可用的内存带宽。这种不断扩大的差异需要越来越复杂的内存管理和模型优化技术,以保持计算效率。

不规则内存访问

与遵循结构化和可预测模式的传统计算工作负载不同,机器学习模型通常表现出不规则内存访问行为,这使得高效的数据检索成为挑战。这些不规则性是由于机器学习计算的本质,其中内存访问模式受批量大小、层类型和稀疏性等因素的影响。因此,标准的缓存机制和内存层次结构往往难以优化性能,导致内存延迟增加和带宽利用率低下。

图片

图 11.6:AI 内存墙:该图强调了模型大小与硬件内存带宽之间的不断扩大的差异,说明了随着模型变得更加复杂,维持性能的挑战。

为了更好地理解机器学习工作负载与传统计算工作负载的不同,比较它们各自的内存访问模式(表 11.8)是有用的。传统的任务,如科学计算、通用 CPU 应用程序和数据库处理,通常表现出定义良好的内存访问特征,这些特征受益于标准的缓存和预取技术。另一方面,机器学习工作负载引入了高度动态的访问模式,这对传统的内存优化策略构成了挑战。

机器学习工作负载中不规则性的一个关键来源是批量大小和执行顺序。输入数据在批量中的处理方式直接影响内存重用,从而产生复杂的优化挑战。小批量大小降低了重用缓存激活和权重的可能性,导致频繁地从较慢的片外内存中获取内存。较大的批量大小可以提高重用并分摊内存访问成本,但同时也对可用的内存带宽提出了更高的要求,可能在不同的内存层次结构级别上造成拥塞。这种微妙的平衡需要仔细考虑模型架构和可用的硬件资源。

表 11.8:内存访问特性:传统工作负载表现出可预测的、顺序的内存访问,得益于标准缓存,而机器学习工作负载由于稀疏性和数据依赖性引入了不规则和动态的模式,这挑战了传统的内存优化技术。理解这些差异对于设计能够高效支持现代人工智能应用独特需求的内存系统至关重要。

特征 传统计算工作负载 机器学习工作负载
内存访问模式 规则且可预测的(例如,顺序读取,结构化模式) 不规则且动态的(例如,稀疏性,注意力机制)
缓存局部性 高时间局部性和空间局部性 通常局部性较低,尤其是在大型模型中
数据重用 具有频繁数据重用的结构化循环 依赖于层类型的稀疏和动态重用
数据依赖性 明确的依赖性允许高效的预取 基于网络结构的可变依赖性
工作负载示例 科学计算(例如,矩阵分解,物理模拟) 神经网络(例如,CNN,Transformer,稀疏模型)
内存瓶颈 DRAM 延迟,缓存未命中 片外带宽限制,内存碎片化
对能耗的影响 中等,由密集的浮点运算执行驱动 高,主要由数据移动成本主导

不同的神经网络层在考虑批量大小之外,以不同的方式与内存交互。卷积层得益于空间局部性,因为图像中的相邻像素一起处理,从而能够高效地缓存小的权重内核。相反,全连接层需要频繁访问大型权重矩阵,这通常会导致与标准缓存策略不匹配的更多随机内存访问模式。Transformer 引入了额外的复杂性,因为注意力机制需要访问存储在各个内存位置的大型键值对。序列长度和注意力范围的动态性质使得传统的预取策略无效,导致不可预测的内存延迟。

另一个导致不规则内存访问的显著因素是神经网络中的稀疏性 25。许多现代机器学习模型采用权重剪枝、激活稀疏性和结构化稀疏性等技术来减少计算开销。然而,这些优化通常导致非均匀的内存访问,因为稀疏表示需要检索分散的元素而不是顺序块,这使得硬件缓存效率降低。包含动态计算路径的模型,如专家混合和自适应计算时间,引入了高度非确定性的内存访问模式,其中活动的神经元或模型组件可以随着每个推理步骤而变化。这种可变性对有效的预取和缓存策略构成了挑战。

这些不规则性具有重大影响。机器学习工作负载通常经历缓存效率降低,因为激活和权重可能不会以可预测的顺序访问。这导致对片外内存流量的依赖性增加,从而减慢执行速度并消耗更多能量。不规则访问模式导致内存碎片化,其中数据分配和检索的方式导致可用内存资源的低效利用。综合影响是,机器学习加速器经常遇到内存瓶颈,限制了它们充分利用可用计算能力的能力。

内存层次结构

为了解决机器学习加速中的内存挑战,硬件设计师实施了复杂的内存层次结构,以平衡速度、容量和能源效率。在检查不同机器学习架构如何利用内存资源之前,理解这一层次结构是至关重要的。与通用计算不同,其中内存访问模式通常是不可预测的,机器学习工作负载表现出结构化的重用模式,这些模式可以通过在多个内存级别上仔细组织数据来优化。

在最高级别,大容量但速度较慢的存储设备提供长期模型存储。在最低级别,高速寄存器和缓存确保计算单元可以以最小的延迟访问操作数。在这两个极端之间,中间内存级别,如暂存内存、高带宽内存和片外 DRAM,在性能和容量之间提供权衡。

表 11.9 总结了现代人工智能加速器中不同内存级别的关键特性。层次结构中的每一级都具有独特的延迟、带宽和容量属性,这些属性直接影响神经网络数据,如权重、激活和中间结果,应该如何分配。

表 11.9:内存层次结构权衡:AI 加速器利用多级内存层次结构来平衡性能和容量,优化计算密集型机器学习任务的数据访问。每一层提供独特的延迟、带宽和容量特性,决定了神经网络组件(权重、激活和中间结果)应该如何战略性地分配,以最小化瓶颈并最大化吞吐量。

Memory Level Approx. Latency Bandwidth Capacity Example Use in Deep Learning
Registers ~1 cycle Highest Few values 存储即时计算的操作数
L1/L2 Cache (SRAM) ~1-10 ns High KBs-MBs 缓存频繁访问的激活和小型权重块
Scratchpad Memory ~5-20 ns High MBs 软件管理的中间计算存储
High-Bandwidth Memory (HBM) ~100 ns Very High GBs 存储大型模型参数和激活,以实现高速访问
Off-Chip DRAM (DDR, GDDR, LPDDR) ~50-150 ns Moderate GBs-TBs 存储整个模型权重,这些权重无法存储在芯片上
Flash Storage (SSD/NVMe) ~100 µs - 1 ms Low TBs 存储预训练模型和检查点以供后续加载

On-Chip Memory

内存层次结构的每一层在 AI 加速中都扮演着独特的角色,在速度、容量和可访问性方面有不同的权衡。位于计算核心内的寄存器提供最快的访问,但一次只能存储几个操作数。这些寄存器最适合用于即时计算,其中操作数可以在几个周期内加载和消耗。然而,由于寄存器存储非常有限,需要频繁的内存访问来获取新的操作数并存储中间结果。

为了减少寄存器和外部内存之间不断的数据移动需求,小型但快速的缓存作为中介缓冲区。这些缓存存储最近访问的激活、权重和中间值,确保频繁使用的数据以最小的延迟保持可用。然而,缓存的容量有限,使得它们不足以存储完整的特征图或大型权重张量在机器学习模型中。因此,在任何给定时间,模型参数或激活的最常用部分只能存储在这里。

对于较大的工作数据集,许多 AI 加速器包括临时存储器,它提供的存储空间比缓存更多,但有一个关键的区别:它允许显式软件控制存储的数据以及何时将其移除。与依赖于基于硬件的淘汰策略的缓存不同,临时存储器使机器学习工作负载能够保留关键值,如激活和多个计算层的滤波器权重。这种能力在卷积神经网络等模型中特别有用,在这些模型中,相同的输入特征图和滤波器权重在多个操作中被重复使用。通过将数据保留在临时存储器中而不是从外部内存重新加载,加速器可以显著减少不必要的内存传输并提高整体效率 (Y.-H. Chen, Emer, and Sze 2017)。

芯片外存储器

除了片上内存之外,高带宽内存提供了对不适合缓存或临时缓冲区的大模型参数和激活的快速访问。HBM 通过堆叠多个内存芯片和采用宽内存接口来实现其高性能,与传统的 DRAM 相比,它以最小的延迟传输大量数据。由于其高带宽和低延迟,HBM 通常用于存储在执行期间必须快速访问的整个机器学习模型层。然而,其成本和功耗限制了其在高性能 AI 加速器中的使用,使其在边缘设备等功耗受限的环境中不太常见。

当机器学习模型超出片上内存和 HBM 的容量时,它必须依赖于芯片外 DRAM,如 DDR、GDDR 或 LPDDR。虽然 DRAM 提供了显著更大的存储容量,但其访问延迟更高,这意味着频繁从 DRAM 中检索数据可能会引入执行瓶颈。为了有效地使用 DRAM,模型必须构建成在任何给定时间只检索必要的权重和激活部分,以最小化长时间内存检索时间的影响。

在层次结构的最高级别,闪存存储和固态硬盘(SSD)存储大型预训练模型、数据集和检查点权重。这些存储设备提供了大容量,但速度太慢,无法进行实时执行,需要在计算开始之前将模型加载到更快的内存层级。例如,在训练场景中,存储在 SSD 中的检查点模型必须在恢复计算之前加载到 DRAM 或 HBM 中,因为直接从 SSD 执行会太慢,无法维持高效的加速器利用率 (D. Narayanan et al. 2021a)。

内存层次结构平衡了速度、容量和能源效率之间的竞争目标。然而,通过多个内存级别移动数据引入了瓶颈,限制了加速器的性能。内存级别之间的数据传输产生延迟成本,尤其是对于片外访问。有限的带宽限制了内存层级之间的数据流动。内存容量限制迫使模型超过本地存储时不断移动数据。这些限制使内存带宽成为现实世界加速器性能的基本决定因素。

内存带宽和架构权衡

在第 11.4.1 节中建立的内存墙分析的基础上,本节量化了特定带宽特性如何影响不同部署场景下的系统性能。

现代加速器表现出不同的带宽-容量权衡:NVIDIA H100 GPU 提供 3.35 TB/s HBM3 带宽和 80 GB 容量,优化了跨不同工作负载的灵活性。谷歌的 TPUv4 提供 1.2 TB/s 带宽和 128 MB 片上内存,优先考虑张量操作的能量效率。这个 3:1 的带宽优势使 H100 能够处理内存密集型模型,如大型语言模型,而 TPU 的较低带宽足以处理计算密集型推理,因为数据重用性更高。

不同的神经网络操作实现不同的带宽利用率:由于访问模式不规则,transformer 注意力机制仅达到峰值内存带宽的 20-40%,卷积层通过可预测的空间访问模式达到 60-85%,当批量大小超过 128 时,全连接层接近 90%。

如前所述,片上内存访问消耗 5-10 pJ 每访问,而外部 DRAM 每访问需要 640 pJ——这是一项 65-125×\times的能量惩罚。AI 加速器通过三种关键策略最小化 DRAM 访问:权重稳定性(保持模型参数在片上内存中)、输入稳定性(局部缓冲输入激活)和输出稳定性(在片上累积部分和)。

内存带宽扩展在加速器设计中遵循不同的轨迹:

  • GPU 扩展:带宽随着内存通道的增加而线性增长,从 900 GB/s(A100)到 3,350 GB/s(H100),从而支持更大的模型

  • TPU 扩展:通过阵列设计优化带宽,实现 900 GB/s,比 GPU 替代方案低 35%的功耗

  • 移动加速器扩展:苹果的 M3 神经网络引擎通过积极的电压扩展实现 400 GB/s 的统一内存带宽,同时消耗<5 W

与 DDR5 每 GB 0.05 美元相比,HBM 内存的成本为每 GB 8-15 美元,造成 160-300×\times的成本差异。高性能加速器需要 40-80GB HBM 以实现有竞争力的性能,这增加了 320-1,200 美元的制造成本。边缘加速器牺牲带宽(50-200 GB/s)以实现低于 100 美元的成本目标,同时保持足够的性能以满足推理工作负载。

这些带宽特性直接影响部署决策:云训练优先考虑原始带宽以实现最大模型容量,边缘推理优化带宽效率以适应能源限制,而移动部署在带宽和成本限制之间取得平衡。虽然这些硬件特定的优化是基本的,但第九章中全面介绍了结合硬件加速和软件优化技术的集成系统级效率方法。这些优化在不同系统环境中的部署——从第二章中的移动设备到第十三章中的生产工作流程——决定了它们的实际影响。

主机-加速器通信

机器学习加速器,如 GPU 和 TPU,通过并行执行实现高计算吞吐量。然而,它们的效率从根本上受到主机(CPU)和加速器内存之间数据传输的限制。与完全在 CPU 内存子系统中运行的一般工作负载不同,AI 工作负载需要在 CPU 主内存和加速器之间频繁传输数据,这引入了延迟,消耗了带宽,并影响了整体性能。

主机-加速器数据传输遵循一个结构化的顺序,如图 图 11.7 所示。在计算开始之前,数据从 CPU 内存复制到加速器的内存。然后 CPU 发出执行指令,加速器并行处理数据。一旦计算完成,结果存储在加速器内存中,并传输回 CPU。每一步都可能引入潜在的低效,必须管理这些低效以优化性能。

图片

图 11.7:主机-加速器数据传输:AI 工作负载需要在 CPU 内存和加速器之间频繁移动数据;此图详细说明了复制输入数据、执行计算和传输结果的顺序步骤,每一步都可能引入潜在的性能瓶颈。理解这个数据传输序列对于优化 AI 系统性能和最小化延迟至关重要。

主机-加速器数据传输中的关键挑战包括延迟、带宽限制和同步开销。通过高效的内存管理和互连技术优化数据传输对于最大化加速器利用率至关重要。

数据传输模式

ML 加速器的效率不仅取决于其计算能力,还取决于数据的持续供应。即使高性能的 GPU 和 TPU,如果数据传输效率低下,也会被低效利用。主机和加速器内存作为独立的域存在,需要通过 PCIe、NVLink 或专有链路等互连进行显式传输。无效的数据移动可能导致执行停滞,因此传输优化至关重要。

图 11.7 展示了这种结构化序列。在步骤(1)中,数据从 CPU 内存复制到加速器内存,因为 GPU 无法以高速直接访问主机内存。通常,直接内存访问(DMA)26 引擎处理这种传输而不会消耗 CPU 周期。在步骤(2)中,CPU 通过 CUDA、ROCm 或 OpenCL 等 API 发出执行命令。步骤(3)涉及加速器上的并行执行,如果需要数据时数据不可用,可能会发生停滞。最后,在步骤(4)中,计算结果被复制回 CPU 内存以进行进一步处理。

延迟和带宽限制对 AI 工作负载有显著影响。PCIe 的峰值带宽为 32 GB/s(PCIe 4.0),比加速器的高带宽内存慢得多,后者可以超过 1 TB/s。大数据传输加剧了瓶颈,尤其是在深度学习任务中。此外,当计算必须等待数据传输完成时,还会出现同步开销。有效的调度和与执行重叠传输是减轻这些低效的关键。

数据传输机制

主机(CPU)和加速器(GPU、TPU 或其他 AI 硬件)之间的数据移动取决于连接两个处理单元的互连技术。互连的选择决定了传输可用带宽、通信延迟以及主机-加速器执行的整体效率。最常用的传输机制包括 PCIe(外围组件互连扩展)、NVLink、直接内存访问和统一内存架构。这些机制中的每一个都在优化图 11.7 中所示的四个步骤数据移动过程中发挥着关键作用。

PCIe 接口

大多数加速器通过 PCIe 与 CPU 通信,PCIe 是数据移动的行业标准互连。PCIe 4.0 提供高达 32 GB/s 的带宽,而 PCIe 5.0 将此翻倍至 64 GB/s。然而,这仍然远低于加速器内部的 HBM 带宽,使得 PCIe 成为大型 AI 工作负载的瓶颈。

PCIe 由于其基于数据包的通信和内存映射 I/O 模型,也引入了延迟开销。频繁的小数据传输效率低下,因此批量数据移动可以减少开销。通过 PCIe 发出的计算命令进一步增加了延迟,需要仔细优化执行调度。

为了解决 PCIe 的带宽限制,NVIDIA 开发了 NVLink,这是一种专有高速互连,在 GPU 之间以及在某些配置中在 CPU 和 GPU 之间提供了显著更高的带宽。与作为共享总线的 PCIe 不同,NVLink 允许连接设备之间的直接点对点通信,减少争用并提高 AI 工作负载的效率。

对于主机-加速器传输,NVLink 可以在步骤(1)中使用,以远超 PCIe 的速度将输入数据从主内存传输到 GPU 内存,NVLink 4.0 的带宽可达 600 GB/s。这显著减少了数据移动瓶颈,允许加速器以更低的延迟访问输入数据。在多 GPU 配置中,NVLink 还加速了端到端传输,允许加速器交换数据而无需通过主内存路由,从而优化计算过程的步骤(3)。

尽管 NVLink 提供了显著的性能优势,但它并非普遍可用。与适用于所有加速器的行业标准 PCIe 不同,NVLink 仅适用于 NVIDIA 硬件,限制了其在配备 NVLink 启用 GPU 的系统中的应用。

数据传输的 DMA

在传统的内存传输中,CPU 发出加载/存储指令,消耗处理周期。DMA 卸载这项任务,允许在不干预 CPU 的情况下异步移动数据。

在数据传输过程中,CPU 发起 DMA 请求,允许数据在后台复制到加速器内存。同样,结果传输回主内存不会阻塞执行。这使计算与数据移动重叠,减少空闲时间,提高加速器利用率。

DMA 对于启用异步数据移动至关重要,这允许传输与计算重叠。AI 工作负载不需要在传输完成之前开始执行,可以在早期计算仍在进行时将数据流式传输到加速器,减少空闲时间并提高加速器利用率。

统一内存

虽然 PCIe、NVLink 和 DMA 优化了显式内存传输,但某些 AI 工作负载需要更灵活的内存模型,以消除手动数据复制的需求。统一内存提供了一个抽象层,允许主机和加速器访问单个共享内存空间,在需要时自动处理数据移动。

使用统一内存,在执行前不需要在 CPU 和 GPU 内存之间显式复制数据。相反,当计算需要位于主机内存中的内存区域时,系统会自动将其迁移到加速器,透明地处理步骤(1)。同样,当 CPU 访问计算结果时,步骤(4)会自动发生,消除了手动内存管理的需求。

尽管统一内存简化了编程,但它引入了性能权衡。由于内存迁移是在需要时发生的,这可能导致不可预测的延迟,尤其是当需要频繁传输大数据集时。此外,由于统一内存是通过页面迁移技术实现的,小的内存访问可能会触发过多的数据移动,进一步降低效率。

对于需要精细内存控制的人工智能工作负载,使用 PCIe、NVLink 和 DMA 进行显式数据传输通常提供更好的性能。然而,对于开发简便性比绝对速度更重要的应用程序,统一内存提供了一个方便的替代方案。

数据传输开销

主机-加速器数据移动引入了影响人工智能工作负载执行的开销。与在芯片内存访问相比,主机-加速器传输穿越系统互连,增加了延迟、带宽限制和同步延迟。

互连延迟影响传输速度,PCIe,作为标准的主机-加速器链路,由于基于分组的交易和内存映射 I/O 而承担了显著的开销。这使得频繁的小传输变得低效。更快的替代品如 NVLink 减少了延迟并提高了带宽,但仅限于特定的硬件生态系统。

同步延迟进一步加剧了低效。同步传输会阻塞执行,直到数据移动完成,确保数据一致性,但引入了空闲时间。异步传输允许计算和数据移动重叠,减少停滞,但需要仔细协调以避免执行不匹配。

这些因素,包括互连延迟、带宽限制和同步开销,决定了人工智能工作负载的效率。虽然优化技术减轻了这些限制,但了解这些基本的传输机制对于提高性能至关重要。

模型内存压力

机器学习模型强加不同的内存访问模式,这显著影响了加速器的性能。数据在主机和加速器之间传输的方式、内存访问的频率以及缓存机制的效率都决定了整体执行效率。虽然多层感知器(MLPs)、卷积神经网络(CNNs)和变换器网络各自需要大量的参数集,但它们不同的内存需求需要为加速器制定定制化的优化策略。了解这些差异有助于理解为什么不同的硬件架构在工作负载中表现出不同的效率水平。

多层感知器

MLPs,也称为全连接网络,是神经网络架构中最简单的之一。每一层都由密集矩阵乘法组成,要求每个神经元与前一层的所有神经元进行交互。这导致了高内存带宽需求,尤其是对于权重,因为每个输入激活都会对大量计算有贡献。

从内存角度来看,MLPs 依赖于大型的密集权重矩阵,这些矩阵经常超过片上内存容量,需要片外内存访问。由于加速器不能直接以高速访问主机内存,数据传输必须通过 PCIe 或 NVLink 等互连显式管理。这些传输引入了延迟并消耗了带宽,影响了执行效率。

尽管 MLPs 具有带宽密集的特性,但它们表现出规律和可预测的内存访问模式,这使得它们适合进行预取和流式内存访问等优化。专用 AI 加速器通过在快速 SRAM 缓存中分阶段存储权重矩阵,并通过直接内存访问引擎重叠数据移动与计算来减轻传输开销,减少执行停滞。这些优化使得加速器即使在处理大型参数集时也能保持高吞吐量 (Y.-H. Chen, Emer, and Sze 2017)。

Convolutional Neural Networks

卷积神经网络(CNNs)在图像处理和计算机视觉任务中得到了广泛应用。与需要密集矩阵乘法的 MLPs 不同,CNNs 使用小的滤波核在图像上滑动来处理输入特征图。这种局部计算结构导致了高空间数据重用,即相同的输入像素对多个卷积有贡献。

CNN 加速器受益于片上内存优化,因为卷积滤波器具有广泛的复用性,允许权重存储在快速的片上 SRAM 中,而不是频繁访问片外内存。然而,由于激活图的大小,它们需要仔细管理。由于通过 PCIe 等互连访问主内存会引入延迟和带宽瓶颈,CNN 加速器采用分块技术将特征图划分为更小的区域,这些区域适合片上缓冲区。这最小化了昂贵的片外内存传输,提高了整体效率 (Y.-H. Chen, Emer, and Sze 2017)。

虽然 CNN 工作负载比 MLPs 更节省内存,但管理中间激活仍然是一个挑战。加速器使用分层缓存策略和 DMA 引擎来优化内存移动,确保计算不会被低效的主机-加速器数据传输所阻塞。这些内存优化有助于 CNN 加速器通过减少对片外内存带宽的依赖来保持高吞吐量 (Y.-H. Chen, Emer, and Sze 2017)。

Transformer Networks

变压器已成为自然语言处理的主导架构,并在视觉和语音识别等其他领域得到越来越广泛的应用。与依赖于局部计算的 CNN 不同,变压器执行全局注意力机制,其中输入序列中的每个标记都可以与其他所有标记交互。这导致不规则的、带宽密集型的内存访问模式,因为必须频繁地检索和更新大型键值矩阵。

这些模型由于其庞大的参数大小,通常超过片上内存容量,对加速器来说尤其具有挑战性。因此,主机和加速器之间频繁的内存传输引入了大量的延迟开销,尤其是在依赖于 PCIe 等互连的情况下。统一内存架构可以通过动态处理数据移动来缓解这些问题,但它们由于不可预测的按需内存迁移而引入了额外的延迟。由于变压器是内存密集型而非计算密集型,针对它们的优化加速器依赖于高带宽内存、张量分块和内存分区以维持性能(T. B. Brown, Mann, Ryder, Subbiah, Kaplan, Dhariwal, Neelakantan, Shyam, Sastry, 等人 2020)。

此外,注意缓存机制和专门的张量布局减少了冗余的内存访问,提高了执行效率。鉴于传统互连的带宽限制,NVLink 启用的架构在大型变压器训练方面提供了显著优势,因为它们比 PCIe 提供了更高的吞吐量和更低的延迟。基于 DMA 的异步内存传输允许在数据移动的同时重叠计算,减少执行停滞(D. Narayanan 等人 2021a)。

ML 加速器的影响

MLP、CNN 和 Transformer 多样化的内存需求突显了根据特定工作负载定制内存架构的必要性。表 11.10 比较了这些不同模型之间的内存访问模式。

表 11.10:机器学习模型内存访问:不同的机器学习模型由于权重大小、激活重用和数据稀疏度的变化表现出不同的内存访问模式和瓶颈;这些特性对硬件加速器设计和性能优化有重大影响。由于其巨大且稀疏访问的权重,变压器需要高带宽和容量,而 CNN 则受益于空间局部性和高激活重用,从而降低了内存压力。

模型类型 权重大小 激活重用 内存访问模式 主要瓶颈
MLP (密集) 大型,密集 规则的,顺序的(流式) 带宽(片外)
CNN 小型,可重用 空间局部性 特征图移动
Transformer 大型、稀疏 不规则、高带宽 内存容量 + 互连

每种模型类型都面临着独特的挑战,这些挑战直接影响加速器设计。MLPs 受益于快速流式访问密集权重矩阵,这使得内存带宽成为性能的关键因素,尤其是在将大型权重从主机内存传输到加速器内存时。CNNs 由于其高激活重用和结构化内存访问模式,可以利用片上缓存和分块策略来最小化片外内存传输。然而,Transformers 对带宽和容量都有显著需求,因为注意力机制需要频繁访问大型键值矩阵,导致高互连流量和增加的内存压力。

为了应对这些挑战,现代人工智能加速器采用多层内存层次结构,以平衡速度、容量和能源效率。片上 SRAM 缓存和暂存内存存储频繁访问的数据,而高带宽的外部内存为大型模型提供可扩展性。高效的互连,如 NVLink,有助于缓解主机-加速器传输瓶颈,尤其是在 Transformer 工作负载中,内存移动限制可能会主导执行时间。

随着机器学习工作负载的复杂性持续增长,内存效率变得与原始计算能力一样关键。分析揭示了内存系统如何主导加速器的性能:DRAM 访问的 173 倍能量惩罚造成了一个基本瓶颈,精心设计的内存层次结构可以提高有效带宽 10-100 倍,不同的神经网络架构产生不同的内存压力模式。这些限制——从带宽限制到通信开销——决定了理论计算能力是否转化为实际性能。在确定了内存系统如何限制加速器有效性之后,我们现在考察映射策略如何系统地解决这些限制。

神经网络硬件映射基础

在上一节中考察的内存系统挑战——带宽限制、分层访问成本和模型特定的压力模式——直接决定了神经网络在加速器上的执行效率。如果一个具有 1,200 GB/s 片上带宽和复杂内存层次结构的阵列在映射计算时没有考虑这些内存访问模式,那么它将无法带来性能上的好处。如第 11.4.1 节所确立的,内存访问的极端能量惩罚意味着映射策略必须优先考虑数据重用和局部性,而忽略其他所有考虑因素。这一现实推动了系统化映射方法的需求,这些方法协调计算放置、内存分配和数据移动,以利用硬件能力同时尊重内存限制。

在专用人工智能加速硬件上高效执行机器学习模型需要一种结构化的计算方法,确保充分利用可用资源,同时最小化性能瓶颈。这些映射考虑在分布式训练场景中尤为重要,如第八章[(ch014.xhtml#sec-ai-training)]所述。与依赖于动态任务调度的通用处理器不同,人工智能加速器在结构化执行模型下运行,通过仔细分配计算到处理元素来最大化吞吐量。这个过程,称为映射,决定了计算如何在硬件资源之间分布,影响执行速度、内存访问模式和整体效率。

人工智能加速中的映射是通过空间分配、时间调度和内存感知放置将机器学习计算分配给硬件单元的过程,以最大化执行效率和资源利用率。

由于硬件限制和模型架构的多样性,将机器学习模型映射到人工智能加速器面临几个挑战。考虑到现代加速器的层次化内存系统,映射策略必须仔细管理何时以及在哪里访问数据,以最小化延迟和功耗,同时确保计算单元保持活跃。不良的映射决策可能导致计算资源利用率低下、数据移动过多和执行时间增加,最终降低整体效率。

要理解这一挑战的复杂性,可以考虑一个类比:将神经网络映射到加速器就像规划一个大规模、全厂范围的组装过程。你拥有数千名工人(处理元素)和一套复杂的任务(计算)。你必须决定哪个工人执行哪个任务(计算放置),在哪里存储他们需要的部件(内存分配),以及精确的操作顺序以最小化行走时间(数据流)。计划中的微小变化可能导致工厂产出出现巨大差异。就像一个组织不善的工厂可能会让一些工人闲置,而其他人则不堪重负,或者材料存储得太远,难以到达所需位置一样,一个映射不当的神经网络可能会让处理元素利用率低下,同时造成内存瓶颈,阻碍整个系统的运行。

映射包括三个相互关联的方面,这些方面构成了有效人工智能加速器设计的基石。

  • 计算放置:系统性地将操作(例如,矩阵乘法、卷积)分配给处理元素,以最大化并行性和减少空闲时间。

  • 内存分配:仔细确定模型参数、激活和中间结果在内存层次结构中的位置,以优化访问效率。

  • 数据流和执行调度:结构化计算单元之间的数据流动,以减少带宽瓶颈并确保平稳、连续的执行。

有效的映射策略最小化芯片外内存访问,最大化计算利用率,并有效地管理不同内存层次之间的数据移动。

编译器的作用

开发者很少手动执行这种复杂的映射。相反,一个专门的编译器(如 NVIDIA 的 NVCC 或 Google 的 XLA)从框架中提取高级模型,并自动探索映射搜索空间,以找到针对目标硬件的最佳执行计划。编译器是至关重要的软件层,它将模型的计算图转换为高效的硬件特定数据流,平衡上述计算放置、内存分配和执行调度三个相互关联的方面。这种编译器支持在第 11.7 节中进行了详细探讨。

以下部分探讨了影响执行效率的关键映射选择,并为优化策略奠定了基础,这些策略可以细化这些决策。

计算放置

现代人工智能加速器旨在以大规模并行执行机器学习模型,使用数千到数百万个处理元素同时进行计算。然而,仅仅拥有许多计算单元是不够的。如何将这些计算分配给这些单元决定了整体效率。

没有仔细的放置,一些处理元素可能会闲置,而其他处理元素可能会过载,导致资源浪费、内存流量增加和性能降低。计算放置是将操作战略性地映射到可用硬件资源的过程,以维持高吞吐量、最小化停滞并优化执行效率。

计算放置定义

人工智能加速器包含数千到数百万个处理元素,使得计算放置成为一个大规模问题。现代 GPU,如 NVIDIA H100,拥有超过 16,000 个流处理器和超过 500 个专门的张量核心,每个核心都旨在加速矩阵运算(Choquette 2023a)。TPU 使用由数千个相互连接的乘加(MAC)单元组成的收缩阵列,而像 Cerebras 的 CS-2 这样的晶圆级处理器将并行性进一步推向极致,在一个芯片上集成了超过 850,000 个核心(Systems 2021b)。在这些架构中,计算放置的微小低效可能导致显著的性能损失,因为空闲核心或过度的内存移动在整个系统中累积。

计算放置确保所有处理单元都能有效地参与执行。这意味着工作负载必须以避免不平衡执行的方式分配,即某些处理单元空闲,而其他处理单元过载。同样,放置必须最小化不必要的数据移动,因为过度的内存传输会引入延迟和功耗,从而降低系统性能。

神经网络计算因模型架构的不同而有很大差异,这影响着放置策略的应用。例如,在卷积神经网络(CNN)中,放置策略侧重于将图像区域分配到处理单元中,以最大化并行性。一个通过数千个 GPU 核心处理的256×256256\times256图像可能会被分割成小块,每块映射到不同的处理单元以同时执行卷积操作。相比之下,基于转换器的模型需要适应自注意力机制的放置策略,其中序列中的每个标记都与所有其他标记交互,导致不规则和内存密集的计算模式。同时,图神经网络(GNNs)引入了额外的复杂性,因为计算依赖于稀疏和动态的图结构,这需要自适应的工作负载分配(Zheng 等人 2020)。

由于计算放置直接影响资源利用率、执行速度和功耗效率,它是人工智能加速中最关键的因素之一。一个放置得当的计算可以降低延迟几个数量级,而一个放置不当的计算可能导致数千个处理单元利用率低下。下一节将探讨为什么高效的计算放置至关重要以及次优映射策略的后果。

计算放置的重要性

虽然计算放置是一个硬件驱动的过程,但其重要性从根本上是由神经网络工作负载的结构所决定的。不同类型的机器学习模型表现出不同的计算模式,这直接影响它们如何有效地映射到加速器上。如果没有仔细的放置,工作负载可能会变得不平衡,内存访问模式可能变得低效,系统的整体性能可能会显著下降。

对于具有结构化计算模式的模型,如 CNN,计算放置相对简单。CNN 使用过滤器处理图像,这些过滤器应用于小而局部的区域,这意味着它们的计算可以在处理单元之间均匀分布。由于这些操作高度可并行化,CNN 从空间分区中受益,输入被分割成独立处理的瓦片。这种结构化执行使 CNN 非常适合那些偏好常规数据流的加速器,从而最小化放置决策的复杂性。

然而,对于具有不规则计算模式的模型,例如变换器和 GNNs,计算放置变得显著更具挑战性。依赖于自注意力机制的变换器需要序列中的每个标记与所有其他标记进行交互,从而导致非均匀的计算需求。与每个处理元素执行相似工作量计算的 CNNs 不同,变换器引入了工作负载不平衡,其中某些操作,包括注意力分数的计算,需要比其他操作更多的计算。如果没有仔细放置,这种不平衡可能导致停滞,其中一些处理元素保持空闲,而其他处理元素则难以跟上。

在图神经网络(GNNs)中,挑战更大,因为计算依赖于稀疏和动态变化的图结构。与在密集和规则结构数据上操作的 CNNs 不同,GNNs 必须以高度可变连接度处理节点和边。图的一些区域可能需要比其他区域显著更多的计算,这使得在处理元素之间平衡工作负载变得困难(Zheng 等人 2020)。如果没有战略性地放置计算,一些计算单元将保持空闲,而其他计算单元则可能过载,导致利用率低下和执行效率低下。

不良的计算放置通过创建工作负载不平衡、引起过多的数据移动以及导致执行停滞和瓶颈,对 AI 执行产生不利影响。计算的不均匀分布可能导致处理元素空闲,阻止硬件的充分利用并降低吞吐量。低效的执行分配通过需要在内存层次结构之间频繁传输数据,引入延迟并提高功耗,增加了内存流量。最后,这种错误分配可能导致操作在数据依赖上等待,从而导致流水线效率低下,最终降低整体系统性能。

计算放置确保模型在给定的独特计算结构下高效执行。放置得当的工作负载可以减少执行时间、内存开销和功耗,而放置不当的工作负载可能导致执行流水线停滞和资源利用效率低下。下一节将探讨必须解决的关键考虑因素,以确保计算放置既高效又能够适应不同的模型架构。

有效的计算放置

计算放置是在硬件约束和工作负载特征之间的一种平衡行为。为了实现高效率,放置策略必须考虑并行性、内存访问和工作负载可变性,同时确保处理元素得到充分利用。不良的放置会导致执行不平衡、数据移动增加和性能下降,因此在设计放置策略时考虑关键因素至关重要。

如表 11.11 总结所示,计算放置面临几个影响执行效率的关键挑战。有效的映射策略必须通过平衡工作负载分配、最小化数据移动和优化处理元素之间的通信来解决这些挑战。

表 11.11:计算放置挑战:有效的神经网络部署需要战略性地将计算分配给处理元素,平衡工作负载分配、数据移动成本和硬件约束,以最大化执行效率并避免性能瓶颈。理解这些挑战指导了映射策略的设计,这些策略优化资源利用并最小化通信开销。

挑战 对执行的影响 放置的关键考虑因素
工作负载不平衡 一些处理元素提前完成,而其他处理元素仍然超载,导致计算资源闲置。 均匀分配操作以防止停滞并确保处理元素充分利用。
不规则的计算模式 类似于变换器和 GNNs 的模型引入了非均匀的计算需求,使得静态放置困难。 使用基于工作负载特征的自适应放置策略来调整执行。
过多的数据移动 频繁的内存传输引入延迟并增加功耗。 将常用数据保持在计算单元附近并最小化片外内存访问。
有限的互连带宽 放置不当的操作可能造成拥塞,减慢处理元素之间的数据移动。 优化空间和时间放置以减少通信开销。
模型特定的执行需求 CNNs、变换器和 GNNs 需要不同的执行模式,使得单一的放置策略无效。 针对每种模型类型的计算结构定制放置策略。

每个这些挑战都突显了计算放置的核心权衡:在最大化并行性的同时最小化内存开销。对于卷积神经网络(CNNs),放置策略优先考虑结构化分块以维持高效的数据重用。对于变换器(transformers),放置必须确保注意力层之间的执行平衡。对于图神经网络(GNNs),放置必须动态调整以适应稀疏计算模式。

除了模型特定的需求之外,有效的计算放置还必须是可扩展的。随着模型的大小和复杂性的增长,放置策略必须动态适应,而不是依赖于静态的执行模式。未来的 AI 加速器越来越多地集成运行时感知的调度机制,其中放置是基于实时工作负载行为而不是预定的执行计划进行优化的。

有效的计算放置需要平衡硬件能力和模型特性。下一节将探讨计算放置如何与内存分配和数据移动相互作用,确保人工智能加速器以峰值效率运行。

内存分配

高性能人工智能加速需要有效的内存分配。随着人工智能模型复杂性的增加,加速器必须管理大量的数据移动——加载模型参数、存储中间激活和处理梯度计算。这些数据在内存层次结构中的分配方式直接影响执行效率、功耗和整体系统吞吐量。

内存分配定义

虽然计算放置决定了操作在哪里执行,但内存分配定义了数据在哪里存储以及在整个执行过程中如何访问。所有人工智能加速器都依赖于从片上缓存和擦除板到 HBM 和 DRAM 的分层内存系统。不良的内存分配可能导致过多的片外内存访问,增加带宽竞争并减慢执行速度。由于人工智能加速器在太浮点和百万亿浮点运算的规模上运行,低效的内存访问模式可能导致显著的性能瓶颈。

内存分配的主要目标是通过尽可能将频繁访问的数据保留在处理元素附近,以最小化延迟并减少功耗。不同的硬件架构实现了针对人工智能工作负载定制的内存层次结构。GPU 依赖于全局内存、共享内存和寄存器的组合,需要仔细的平铺策略来优化局部性(X. Qi, Kantarci, 和 Liu 2017)。TPU 使用片上 SRAM 擦除板,其中激活和权重必须被有效地预加载以维持阵列执行(Norman P. Jouppi 等人 2017c)。晶圆级处理器,拥有数十万个核心,需要复杂的内存分区策略以避免过多的互连流量(Systems 2021b)。在所有情况下,内存分配的有效性决定了人工智能执行的总体吞吐量、功耗和可扩展性。

内存分配通过数据存储和访问模式直接影响 AI 加速器的效率。与通用计算不同,在通用计算中,内存管理通过缓存和动态分配抽象化,AI 加速器需要显式的数据放置策略来维持高吞吐量并避免不必要的停滞。这在节拍阵列(图 11.4)中尤为明显,其中处理元素之间的节奏性数据流依赖于精确的时间内存访问模式。例如,在 TPU 的节拍阵列中,权重必须预先加载到片上暂存器中,并与输入激活同步流经阵列,以维持流水线计算流程。当内存分配效率不高时,AI 工作负载将遭受延迟开销、过度的功耗和限制计算性能的瓶颈。

不同工作负载的内存挑战

神经网络架构具有不同的内存需求,这影响了适当分配的重要性。CNN 依赖于结构化和局部化的数据访问模式,这意味着不合理的内存分配可能导致冗余数据加载和缓存效率低下(Y.-H. Chen 等人 2016)。相比之下,变换器模型需要频繁访问大型模型参数和中间激活,这使得它们对内存带宽限制非常敏感。GNN 引入了更大的挑战,因为它们的非规则和稀疏数据结构导致不可预测的内存访问模式,可能导致内存资源使用效率低下。不合理的内存分配对 AI 执行有三个主要后果:

  1. 增加内存延迟:当频繁访问的数据没有存储在正确的位置时,加速器必须从更高延迟的内存中检索它,从而减慢执行速度。

  2. 更高的功耗:片外内存访问比片上存储消耗的能量显著更多,导致在规模上的低效。

  3. 降低计算吞吐量:如果数据在需要时不可用,处理元素将保持空闲,从而降低系统的整体性能。

随着 AI 模型在规模和复杂性上的持续增长,可扩展和高效的内存分配的重要性也在增加。内存限制可以决定在给定的加速器上可以部署多大的模型,影响可行性和性能。

表 11.12:内存分配挑战:在 AI 加速器中,高效的内存管理需要在数据访问速度与硬件限制之间取得平衡,以减轻由延迟、带宽限制和不规则数据模式引起的性能瓶颈。解决这些挑战对于部署复杂模型至关重要,例如变换器和图模型,它们具有可变和苛刻的内存需求。

挑战 对执行的影响 分配的关键考虑因素
高内存延迟 慢速数据访问延迟执行并降低吞吐量。 优先将频繁访问的数据放置在更快的内存位置。
片上存储有限 小型本地内存限制了计算单元附近可用的数据量。 高效分配存储以最大化数据可用性,同时不超过硬件限制。
高片外带宽需求 频繁访问外部内存会增加延迟和功耗。 通过仔细管理何时以及如何移动数据来减少不必要的内存传输。
不规则内存访问模式 一些模型需要不可预测地访问数据,导致内存使用效率低下。 组织内存布局以与访问模式对齐并最小化不必要的数据移动。
特定模型内存需求 不同的模型需要不同的分配策略来优化性能。 根据工作负载的结构和执行特性定制分配决策。

如表 11.12 所述,AI 加速器中的内存分配必须解决影响执行效率的几个关键挑战。有效的分配策略通过精心管理数据放置和移动来减轻高延迟、带宽限制和不规则访问模式。确保频繁访问的数据存储在更快的内存位置,同时最小化不必要的传输,对于保持性能和能源效率至关重要。

每个这些挑战都需要仔细的内存管理来平衡执行效率与硬件限制。虽然结构化模型可能从便于预测访问的明确定义的内存布局中受益,但其他模型,如基于转换器和基于图模型,需要更适应的分配策略来处理可变和复杂的内存需求。除了特定于工作负载的考虑之外,内存分配还必须是可扩展的。随着模型尺寸的持续增长,加速器必须动态管理内存资源,而不是依赖于静态的分配方案。确保在需要时可以访问常用数据,同时不超出内存容量,对于保持高效率至关重要。

组合复杂性

在 AI 加速器上高效执行机器学习模型需要仔细考虑放置和分配。放置涉及计算和数据的空间分配,而分配则涵盖资源的时序分布。这些决策相互依赖,每个决策都引入了影响性能、能效和可扩展性的权衡。表 11.13 概述了 AI 加速器中计算放置和资源分配之间的基本权衡。放置决策影响并行性、内存访问模式和通信开销,而分配策略决定资源如何随时间分布以平衡执行效率。这些因素之间的相互作用决定了整体性能,需要仔细平衡以避免如过度同步、内存拥塞或计算资源未充分利用等瓶颈。优化这些权衡对于确保 AI 加速器以峰值效率运行至关重要。

每个这些维度都需要在放置和分配之间平衡权衡。例如,将计算在多个处理单元之间空间分布可以增加吞吐量;然而,如果数据分配没有优化,内存带宽限制可能会引入瓶颈。同样,为细粒度计算分配资源可能增强灵活性,但没有适当的放置策略,可能会导致过度的同步开销。

表 11.13:放置-分配权衡:AI 加速器的性能取决于战略性地将计算映射到硬件并在时间上分配资源,平衡并行性、内存访问和执行效率以避免瓶颈。仔细考虑这些相互依赖的因素对于在机器学习系统中最大化吞吐量和最小化能耗至关重要。

维度 放置考虑因素 分配考虑因素
计算粒度 细粒度放置能够实现更高的并行性,但会增加同步开销。 粗粒度分配减少同步开销,但可能限制灵活性。
空间映射与时间映射 空间放置增强并行执行,但可能导致资源竞争和内存拥塞。 时间分配平衡资源共享,但可能降低整体吞吐量。
内存和数据局部性 将数据放置在计算单元附近可以最小化延迟,但可能减少整体内存可用性。 在多个内存级别分配数据可以增加容量,但引入更高的访问成本。
通信和同步 将计算单元本地化可以减少通信延迟,但可能引入竞争。 分配同步机制可以缓解停滞,但可能引入额外的开销。
数据流和执行顺序 静态放置简化了执行但限制了适应工作负载变化的能力。 动态分配提高了适应性但增加了调度复杂性。

由于 AI 加速器架构对计算执行的位置和随时间分配的资源都施加了限制,因此选择有效的映射策略需要一种协调的放置和分配方法。理解这些权衡如何影响执行效率对于优化 AI 加速器上的性能至关重要。

探索配置空间

AI 加速器的效率不仅取决于其计算能力,还取决于神经网络计算如何映射到硬件资源。映射定义了计算如何分配给处理元素,数据如何在内存层次结构中放置和移动,以及执行如何调度。在这个过程中做出的选择对性能有重大影响,影响着计算利用率、内存带宽效率和能耗。

将机器学习模型映射到硬件上呈现了一个庞大且复杂的设计空间。与传统的计算工作负载不同,模型执行涉及多个相互作用的因素,包括计算、数据移动、并行性和调度,每个因素都引入了约束和权衡。正如内存系统部分所讨论的,加速器的层次化内存结构通过限制带宽、延迟和数据重用进一步复杂化了这个过程。因此,有效的映射策略必须仔细平衡相互竞争的目标,以最大化效率。

在这个设计空间的中心有三个相互关联的方面:数据放置、计算调度和数据移动时机。数据放置指的是数据在各种内存层次结构中的分配,例如片上缓冲区、缓存和片外 DRAM,其有效管理至关重要,因为它影响延迟和能耗。不合理的放置往往导致频繁且昂贵的内存访问,而战略性的放置确保经常使用的数据保持在快速访问的存储中。计算调度控制操作的执行顺序,影响计算效率和内存访问模式;例如,某些执行顺序可能优化并行性同时引入同步开销,而其他执行顺序可能以吞吐量为代价提高数据局部性。同时,数据移动的时机同样重要,因为在不同内存级别之间传输数据会产生显著的延迟和能耗。因此,有效的映射策略侧重于通过重用数据和将通信与计算重叠来最小化不必要的传输,从而提高整体性能。

这些因素定义了一个庞大的组合设计空间,其中映射决策的微小变化可能导致性能和能效的大幅差异。一个糟糕的映射策略可能导致计算资源利用率低、数据移动过多或不平衡的工作负载,从而形成瓶颈,降低整体效率。相反,一个精心设计的映射最大化了吞吐量和资源利用率,充分利用了可用的硬件。

由于映射决策的相互关联性,没有单一的解决方案——不同的工作负载和硬件架构需要不同的方法。接下来的几节将探讨这个设计空间的结构以及不同的映射选择如何塑造机器学习工作负载的执行。

将机器学习计算映射到专用硬件需要平衡多个约束,包括计算效率、内存带宽和执行调度。挑战来自于将计算分配给处理元素、排序执行和管理数据移动的无数可能方式。每个决策都贡献于一个高维搜索空间,其中映射选择的微小变化都可能对性能产生重大影响。

与具有可预测执行模式的传统工作负载不同,机器学习模型引入了多种计算结构,这些结构需要灵活的映射以适应数据重用、并行化机会和内存限制。搜索空间呈组合式增长,使得穷举搜索变得不可行。为了理解这种复杂性,出现了三个来源的变体:

计算和执行的排序

机器学习工作负载通常以嵌套循环的形式组织,遍历计算的各个维度。例如,一个矩阵乘法内核可能会遍历批量大小(NN)、输入特征(CC)和输出特征(KK)。这些循环执行的顺序对数据局部性、重用模式和计算效率有深远的影响。

安排 dd 循环的方式遵循阶乘增长模式:𝒪=d! \mathcal{O} = d!,这会迅速扩展。一个典型的卷积层可能涉及多达七个循环维度,导致:7!=5,040 可能的执行顺序。 7! = 5,040 \text{ possible execution orders.}

当考虑多个内存级别时,搜索空间会按如下方式扩展:(d!)l (d!)^l 其中 ll 是内存层次结构的级别数量。这种快速扩展突出了为什么执行顺序优化至关重要——不良的循环排序可能导致过度的内存流量,而优化的顺序可以提高缓存利用率 (Sze et al. 2017a)。

处理元素间的并行化

现代人工智能加速器利用数千个处理元素以最大化并行性,但确定哪些计算应该并行化并非易事。过度的并行化可能会引入同步开销和增加的带宽需求,而不足的并行化会导致硬件利用率低下。

在并行单元之间分配计算的方法遵循二项式系数:𝒫=d!(dk)! \mathcal{P} = \frac{d!}{(d-k)!} 其中 dd 是循环的数量,而 kk 是用于并行执行的选择数量。对于一个选择三个循环进行并行执行的六循环计算,有效的配置数量为:6!(63)!=120. \frac{6!}{(6-3)!} = 120.

即使对于单层来说,也可能有数百种有效的并行化策略,每种策略都会影响数据同步、内存竞争和整体计算效率。将这种策略扩展到多层和模型架构中,将进一步放大复杂性。

内存放置和数据移动

人工智能加速器的分层内存结构引入了额外的约束,因为数据必须在寄存器、缓存、共享内存和片外 DRAM 之间高效地放置。数据放置影响延迟、带宽消耗和能源效率——频繁访问慢速内存会形成瓶颈,而优化的放置可以减少昂贵的内存传输。

在内存级别之间分配数据的方法遵循指数增长函数:=nd×l \mathcal{M} = n^{d \times l} 其中:

  • nn = 每层的放置选择数量,

  • dd = 计算维度数量,

  • ll = 内存层次级别数量。

对于一个模型,每层有:

  • d=5d = 5 计算维度,

  • l=3l = 3 内存级别,

  • n=4n = 4 种可能的放置选择,

可能的内存分配数量为:45×3=415=1,073,741,824. 4^{5 \times 3} = 4^{15} = 1,073,741,824.

这突显了即使是单层也可能有超过十亿种可能的内存配置,使得手动优化变得不切实际。

映射搜索空间

通过结合计算顺序、并行化和内存放置的复杂性,总的映射搜索空间可以近似为:𝒮=(nd×d!×d!(dk)!)l \mathcal{S} = \left( n^d \times d! \times \frac{d!}{(d-k)!} \right)^l 其中:

  • ndn^d 表示内存放置选择,

  • d!d! 考虑了计算顺序选择,

  • d!(dk)!\frac{d!}{(d-k)!} 揭示了并行化的可能性,

  • ll 是内存层次结构的层数。

这个方程说明了搜索空间的指数增长,使得除了最简单的情况外,穷举搜索变得不可行。

数据流优化策略

映射策略确定了计算在加速器架构中的执行位置和数据存储位置,但它们并没有指定数据在执行过程中如何通过处理单元流动。一个脉动阵列可能使用存储在本地内存中的权重来处理矩阵乘法,但权重、输入和输出在阵列中移动的顺序从根本上决定了内存带宽消耗和能源效率。这些数据流模式——称为优化策略——代表了将抽象映射决策转化为具体执行计划的临界实现维度。

在权重固定、输入固定和输出固定方法之间的选择直接影响到加速器是在计算受限区域还是内存受限区域运行。理解这些权衡是至关重要的,因为编译器(第 11.7 节)和运行时系统(第 11.8 节)必须根据第 11.4.2 节(第 11.4.2 节)中分析的计算特性和内存层次结构能力来选择适当的数据流模式。

将机器学习计算高效映射到硬件上是一个复杂的挑战,因为可能的配置数量庞大。随着模型复杂性的增加,潜在映射的数量呈指数增长。即使是单层,也有数千种计算循环的排序方式,数百种并行化策略,以及指数增长的内存放置选择。这种组合爆炸使得穷举搜索变得不切实际。

为了克服这一挑战,AI 加速器依赖于结构化的映射策略,这些策略系统地平衡计算效率、数据局部性和并行执行。这些方法不是评估每一个可能的配置,而是结合启发式、分析和基于机器学习的技巧,以高效地找到高性能的映射。

有效映射的关键在于理解和应用一系列核心技术,这些技术优化数据移动、内存访问和计算。这些映射策略的构建块为高效执行提供了一个结构化的基础,这在下一节中将会探讨。

映射策略的构建块

为了导航映射决策的复杂性,利用一系列基础技术,这些技术优化了数据移动、内存访问和计算效率的执行。这些技术为映射策略提供了必要的结构,以最大化硬件性能同时最小化瓶颈。

关键技术包括数据移动策略,这些策略确定在计算过程中数据在哪里被暂存,以减少冗余传输,例如在权重静止、输出静止和输入静止方法中。通过组织数据为行主序或通道主序等格式,内存感知张量布局也在通过影响内存访问模式和缓存效率方面发挥着重要作用。

其他策略包括内核融合,这是一种将多个操作组合成单个计算步骤的方法,以最小化冗余内存写入。分块技术被用作一种将大型计算分割成更小、内存友好的块的技术,以提高缓存效率并减少内存带宽需求。最后,平衡计算和通信对于在并行执行和内存访问之间管理权衡以实现高吞吐量至关重要。

这些构建块中的每一个都在构建高性能执行结构中发挥着关键作用,为启发式和模型驱动优化技术奠定了基础。下一节将探讨这些策略如何适应不同类型的 AI 模型。

数据移动模式

虽然计算映射确定操作发生的位置和时间,但其成功在很大程度上取决于数据如何在内存层次结构中高效地访问和传输。与通常表现出结构化和可预测内存访问模式的传统计算工作负载不同,机器学习工作负载由于频繁检索权重、激活和中间值而表现出不规则的访问行为。

即使计算单元被高效地映射,不良的数据移动策略也可能严重降低性能,导致频繁的内存停滞和硬件资源利用率低下。如果数据不能以所需的速率供应给处理单元,计算单元将保持空闲状态,增加延迟、内存流量和能耗 (Y.-H. Chen 等人 2016)。

为了说明数据移动效率低下的影响,可以考虑典型的矩阵乘法操作,如列表 11.18 所示,这是许多机器学习模型的基础。

列表 11.18:矩阵乘法:数据移动瓶颈可能导致硬件资源利用率低下,说明了在优化机器学习模型性能中高效数据流的重要性。通过此操作

## Matrix multiplication where:
## weights: [512 x 256] - model parameters
## input:   [256 x 32]  - batch of activations
## Z:       [512 x 32]  - output activations

## Computing each output element Z[i,j]:
for i in range(512):
    for j in range(32):
        for k in range(256):
            Z[i, j] += weights[i, k] * input[k, j]

这个计算揭示了几个关键的数据流挑战。第一个挑战是需要访问的内存次数。对于每个输出 Z[i,j]Z[i, j],计算必须从权重矩阵中获取一整行的权重,并从输入矩阵中获取一整列的激活值。由于权重矩阵包含 512 行,输入矩阵包含 32 列,这导致了重复的内存访问,给内存带宽带来了重大负担。

第二个挑战来自权重重用。相同的权重应用于多个输入,这意味着理想的映射策略应该最大化权重的局部性,以避免冗余的内存读取。如果没有适当的重用,加速器将浪费带宽多次加载相同的权重(Tianqi et al. 2018)。

第三个挑战涉及中间结果的累积。由于Z[i,j]Z[i,j]中的每个元素都需要来自 256 个不同的权重-输入对的贡献,必须在计算最终值之前存储和检索部分和。如果这些中间值存储效率低下,系统将需要频繁的内存访问,进一步增加带宽需求。

缓解这些挑战的一种自然方式是利用 SIMD 和 SIMT 执行模型,这些模型允许并行获取多个值。然而,即使有这些优化,数据移动仍然是一个瓶颈。问题不仅在于数据检索的速度,还在于数据必须移动的频率以及它在内存层次结构中的位置(Han et al. 2016)。

由于数据移动比计算贵 100-1000 倍,加速器的最重要的目标就是最小化内存访问。数据流策略是设计用来通过最大化数据重用来实现这一目标的架构模式。问题是:哪种数据最值得保留在本地?这直接针对了第 11.4.1 节中考察的 AI 内存墙挑战,其中内存访问的极端能量惩罚主导了系统性能。

为了解决这些限制,加速器实现数据流策略,以确定哪些数据保持在内存中,哪些数据动态流过。这些策略代表了对于数据局部性基本问题的不同回答:权重静态保持模型参数局部化,输入静态保持激活数据,输出静态保持中间结果。每种方法都权衡不同的内存访问模式,以最大化数据重用并最小化构成 AI 加速主要瓶颈的能量密集型传输。

权重静态

权重静态策略将权重固定在本地内存中,同时输入激活和部分和通过系统流过。在 CNN 和矩阵乘法中,权重静态方法特别有益,因为相同的权重集应用于多个输入。通过确保权重保持静态,这种方法减少了冗余的内存访问,有助于缓解带宽瓶颈并提高能源效率。

权重静态方法的一个关键优势是它最大化了权重重用,减少了对外部存储的内存访问频率。由于权重参数通常在多个计算中共享,将它们保持在本地内存中消除了不必要的数据移动,降低了计算的整体能源成本。这使得它在权重代表主导内存开销的架构中特别有效,例如用于机器学习的阵列和定制加速器。

简化的矩阵乘法权重静态实现示于列表 11.19。

列表 11.19:权重静态矩阵乘法:权重静态矩阵乘法将权重固定在本地内存中,同时输入激活流过,展示了如何最大化权重重用以降低能耗。

## Weight Stationary Matrix Multiplication
## - Weights remain fixed in local memory
## - Input activations stream through
## - Partial sums accumulate for final output

for weight_block in weights:  # Load and keep weights stationary
    load_to_local(weight_block)  # Fixed in local storage
    for input_block in inputs:  # Stream inputs dynamically
        for output_block in outputs:  # Compute results
            output_block += compute(weight_block, input_block)
            # Reuse weights across inputs

在权重静态执行中,权重一次性加载到本地内存中,并在整个计算过程中保持固定,而输入动态流过,从而减少了冗余的内存访问。同时,部分和在一种有效的方式中累积,以最小化不必要的数据移动,确保系统保持高吞吐量和能源效率。

通过在本地存储中保持权重固定,显著降低了内存带宽需求,因为对于每次新的计算,不需要重新加载权重。相反,系统高效地重复使用存储的权重,跨越多个输入激活,从而实现高吞吐量执行。这使得权重静态数据流对于具有大量权重重用模式的负载,如 CNN 和矩阵乘法,非常有效。

然而,尽管这种策略减少了与权重相关的内存流量,但它也在输入和输出移动方面引入了权衡。由于输入必须在权重保持固定的情况下动态流过,因此这种方法的有效性取决于输入激活能否有效地传递到计算单元而不会造成停滞。此外,代表中间结果的局部和必须谨慎累积以避免过度的内存流量。总性能提升取决于可用的片上内存大小,因为对于具有数百万或数十亿参数的模型,在本地存储较大的权重矩阵可能会成为限制因素。

权重站式策略非常适合于权重具有高重用率和内存带宽是限制因素的工作负载。它通常用于卷积神经网络(CNN)、收缩阵列和矩阵乘法内核,其中结构化权重重用导致性能显著提升。然而,对于输入或输出重用更为关键的模式,可能需要采用其他数据流策略,如输出站式或输入站式,以提供更好的权衡。

输出站式

输出站式策略将部分和在局部内存中保持固定,而权重和输入激活则通过系统流动。这种方法对于全连接层、收缩阵列和其他输出元素累积来自多个权重-输入对贡献的操作特别有效。通过保持部分和固定,这种方法减少了冗余的内存写入,最小化了带宽消耗并提高了能源效率 (Y.-H. Chen 等人 2016)。

输出站式方法的一个关键优势是它优化了累积效率,确保在写入内存之前,每个输出元素都以尽可能高效的方式计算。与优先考虑权重重用的权重站式不同,输出站式执行旨在最小化由频繁写入中间结果引起的内存带宽开销。这使得它非常适合于累积占主导地位的计算模式的工作负载,如全连接层和基于转换器的模型中的矩阵乘法。

列表 11.20 展示了矩阵乘法的简化输出站式实现。

列表 11.20:输出站式执行:在矩阵乘法过程中,局部累积部分和以减少内存写入并提高效率,这使得它非常适合基于转换器的模型。

## - Partial sums remain in local memory
## - Weights and input activations stream through dynamically
## - Final outputs are written only once

for output_block in outputs:  # Keep partial sums stationary
    accumulator = 0  # Initialize accumulation buffer
    for weight_block, input_block in zip(weights, inputs):
        accumulator += compute(weight_block, input_block)
        # Accumulate partial sums
    store_output(accumulator)  # Single write to memory

此实现遵循输出站式执行的核心原则:

  • 在整个计算过程中,部分和保持在局部内存中。

  • 权重和输入动态流过,确保中间结果保持局部可访问。

  • 最终输出只写入内存一次,减少了不必要的内存流量。

通过在本地累积部分和,这种方法消除了过多的内存写入,提高了整体系统效率。在如收缩阵列等架构中,计算通过一个处理元素网格进行,保持部分和固定自然地与结构化累积工作流程相一致,减少了同步开销。

然而,尽管输出固定减少了内存写入流量,但它引入了权重和输入移动的权衡。由于权重和激活必须动态流过,这种方法的有效性取决于数据如何被有效地输入系统而不会造成停滞。此外,并行实现必须仔细同步部分和的更新,特别是在多个处理元素贡献相同输出的架构中。

输出固定策略对于以累积为主要操作且最小化中间内存写入至关重要的工作负载最为有效。它通常用于全连接层、注意力机制和收缩阵列,其中结构化累积导致显著的性能提升。然而,对于输入重用更为关键的模型,如输入固定等替代数据流策略,可能提供更好的权衡。

输入固定

输入固定策略将输入激活固定在本地内存中,而权重和部分和则通过系统流过。这种方法特别适用于批量处理、转换器模型和基于序列的架构,在这些架构中,输入激活在多个计算中被重用。通过确保激活保持在本地内存中,这种方法减少了冗余的输入检索,提高了数据局部性并最小化了内存流量。

输入固定方法的一个关键优势是它最大化了输入重用,减少了激活的内存访问频率。由于许多模型,尤其是自然语言处理和推荐系统中的模型,在多个计算中处理相同的输入数据,保持输入固定消除了不必要的内存传输,从而降低了能耗。这种策略在处理大型批量数据时特别有用,其中单个输入激活批次对多个权重转换做出贡献。

列表 11.21 展示了一个简化的矩阵乘法输入固定实现。

列表 11.21:输入固定:这种方法在动态流过权重的同时保持输入激活固定,以最大化内存重用并减少能耗。

## - Input activations remain in local memory
## - Weights stream through dynamically
## - Partial sums accumulate and are written out

for input_block in inputs:  # Keep input activations stationary
    load_to_local(input_block)  # Fixed in local storage
    for weight_block in weights:  # Stream weights dynamically
        for output_block in outputs:  # Compute results
            output_block += compute(weight_block, input_block)
            # Reuse inputs across weights

此实现遵循输入固定执行的核心原则:

  • 输入激活被加载到本地内存中,并在计算过程中保持固定。

  • 权重被动态流过,确保了在多个输入上的高效应用。

  • 部分和被累积并写入,优化了内存带宽使用。

通过保持输入激活固定,这种策略最小化了输入数据的冗余内存访问,显著降低了外部内存带宽需求。这在变压器架构中尤其有益,其中输入序列中的每个标记在多个注意力头和层中使用。此外,在批量处理场景中,保持输入激活在本地内存中可以提高数据局部性,使其非常适合全连接层和矩阵乘法。

然而,尽管输入固定可以减少激活的内存流量,但它引入了权重和输出移动的权衡。由于权重必须在输入保持固定的情况下动态流式传输,因此这种方法的有效性取决于权重能否有效地传递到计算单元而不会造成停滞。此外,在将部分和写回内存之前,必须有效地累积,这可能需要额外的缓冲机制。

输入固定策略对于输入激活具有高重用率的工作负载最为有效,并且输入的内存带宽是一个关键约束。它通常用于变压器、循环网络和批量处理工作负载,其中结构化输入重用导致显著的性能提升。然而,对于输出累积更为重要的模型,可能需要采用其他数据流策略,如输出固定,以提供更好的权衡。

内存高效的张量布局

机器学习工作负载的有效执行不仅取决于数据如何移动(数据流策略),还取决于数据如何在内存中存储和访问。张量布局,指的是多维数据在内存中的排列,可以显著影响内存访问效率、缓存性能和计算吞吐量。选择不当的布局可能导致过多的内存停滞、不高效的缓存使用和增加的数据移动成本。

在人工智能加速器中,张量布局优化尤为重要,因为数据通常按照底层硬件架构指定的模式频繁访问。选择正确的布局确保内存访问与硬件友好的访问模式对齐,从而最小化昂贵的内存事务开销 (C. NVIDIA 2025)。

虽然开发者有时可以手动指定张量布局,但选择通常由机器学习框架(例如,TensorFlow、PyTorch、JAX)、编译器或 AI 加速器运行时自动确定。低级优化工具,如用于 NVIDIA GPU 的 cuDNN、用于 TPU 的 XLA 和用于自定义加速器的 MLIR,可能会动态地重新排列张量布局以优化性能(X. He 2023a)。在高层框架中,布局转换通常透明地应用,但与自定义内核或低级库(例如,CUDA、Metal 或 OpenCL)一起工作的开发者可能对张量格式选择有直接控制权。

例如,在 PyTorch 中,用户可以使用 tensor.permute()或 tensor.contiguous()手动修改布局,以确保高效的内存访问(Paszke 等人 2019)。在 TensorFlow 中,布局优化通常由 XLA 编译器内部应用,根据目标硬件在 NHWC(行主序)和 NCHW(通道主序)之间进行选择(Brain 2022)。硬件感知的机器学习库,如用于 GPU 的 cuDNN 或用于 CPU 的 OneDNN,强制执行特定的内存布局以最大化缓存局部性和 SIMD 效率。最终,尽管开发者可能对张量布局选择有一些控制权,但大多数布局决策是由编译器和运行时系统驱动的,确保张量以最适合底层硬件的方式存储在内存中。

行主序布局

行主序布局指的是多维张量在内存中的存储方式,其中元素按行排列,确保给定行的所有值在移动到下一行之前连续放置。这种存储格式在通用 CPU 和一些机器学习框架中广泛使用,因为它与顺序内存访问模式自然对齐,使得某些类型的操作更加缓存高效(Intel 2021)。

要理解行主序布局是如何工作的,可以考虑一个表示为形状为(高度,宽度,通道)的张量的单个 RGB 图像。如果图像的大小为3×33\times 3像素,并且有 3 个通道(RGB),则相应的张量结构为(3,3,3)。值在内存中的存储方式如下:I(0,0,0),I(0,0,1),I(0,0,2),I(0,1,0),I(0,1,1),I(0,1,2),I(0,2,0),I(0,2,1),I(0,2,2),\begin{gather} I(0,0,0), I(0,0,1), I(0,0,2), I(0,1,0), I(0,1,1), \ I(0,1,2), I(0,2,0), I(0,2,1), I(0,2,2), \ldots \end{gather}

每一行都是连续存储的,这意味着第一行中的所有像素值在内存中按顺序放置,然后再移动到第二行。这种排序是有利的,因为 CPU 和缓存层次结构是针对顺序内存访问进行优化的。当以行方式访问数据时,例如在应用逐元素操作(如激活函数或基本算术变换)时,内存读取是高效的,并且缓存利用率最大化 (Sodani 2015)。

行主存储的效率在基于 CPU 的机器学习工作负载中表现得尤为明显,在这些工作负载中,批归一化、矩阵乘法和逐元素算术等操作通常按顺序处理数据行。由于现代 CPU 采用缓存预取机制,行主布局允许在执行之前将下一个所需的数据值预加载到缓存中,从而降低内存延迟并提高整体计算吞吐量。

然而,当执行需要跨通道而不是跨行访问数据的操作时,行主布局可能会引入低效。考虑一个卷积层,它在输入图像的多个通道上应用过滤器。由于通道值在行主存储中是交错存储的,卷积操作必须跳转多个内存位置来获取给定像素的所有必要的通道值。这些跨步内存访问在依赖于矢量化执行和内存归约的硬件架构上可能代价高昂,例如 GPU 和 TPU。

尽管存在这些限制,行主布局仍然是基于 CPU 的机器学习框架中的主导存储格式。例如,TensorFlow 在 CPU 上默认使用 NHWC(行主)格式,确保了缓存局部性优化以适应顺序处理。然而,当针对 GPU 时,框架通常会动态重新排列数据,以利用更有效的内存布局,如通道主存储,这更好地与并行计算相匹配。

通道主布局

与行主布局相反,通道主布局在内存中排列数据,使得给定通道的所有值都存储在一起,然后再移动到下一个通道。这种格式对于 GPU、TPU 和其他 AI 加速器特别有益,在这些设备上,矢量化操作和内存归约对计算效率有显著影响。

要理解通道主布局是如何工作的,可以考虑一个大小为 (高度, 宽度, 通道) = (3, 3, 3) 的相同的 RGB 图像张量。不同于按行存储像素值,数据在内存中按通道优先的结构组织如下:I(0,0,0),I(1,0,0),I(2,0,0),I(0,1,0),I(1,1,0),I(2,1,0),,I(0,0,1),I(1,0,1),I(2,0,1),,I(0,0,2),I(1,0,2),I(2,0,2),\begin{gather} I(0,0,0), I(1,0,0), I(2,0,0), I(0,1,0), I(1,1,0), I(2,1,0), \ldots, \ I(0,0,1), I(1,0,1), I(2,0,1), \ldots, I(0,0,2), I(1,0,2), I(2,0,2), \ldots \end{gather}

在这种格式中,整个图像的所有红色通道值首先存储,然后是所有绿色值,最后是所有蓝色值。这种排序允许硬件加速器有效地并行加载和处理通道中的数据,这对于卷积操作和 SIMD(单指令,多数据)执行模型至关重要(Chetlur 等人 2014)。

当在机器学习模型中执行卷积时,通道主序布局的优势变得明显。卷积层通过在所有通道上应用共享的过滤器集来处理图像。当数据以通道主序格式存储时,卷积核可以有效地加载整个通道,减少分散的内存读取次数。这减少了内存延迟,提高了吞吐量,并增强了矩阵乘法的数据局部性,这对于机器学习工作负载至关重要。

由于 GPU 和 TPU 依赖于内存归约 27,这是一种连续线程获取连续内存地址的技术,通道主序布局自然地与这些处理器执行并行计算的方式相吻合。例如,在 NVIDIA GPU 中,每个 warp(同时执行的线程组)中的每个线程处理同一通道的不同元素,确保内存访问高效,并减少步进内存访问的可能性,这可能会降低性能。

尽管在机器学习加速器中具有优势,但通道主序布局在通用 CPU 上运行时可能会引入低效。由于 CPU 优化的是顺序内存访问,因此在移动到下一个通道之前存储单个通道的所有值会破坏按行操作的缓存局部性。这就是为什么许多机器学习框架(例如 TensorFlow、PyTorch)在 CPU 上默认使用行主序(NHWC),在 GPU 上使用通道主序(NCHW)——优化每种硬件类型的优势。

现代人工智能框架和编译器通常会根据执行环境动态地转换张量布局。例如,TensorFlow 和 PyTorch 会根据模型是在 CPU、GPU 还是 TPU 上运行自动在 NHWC28 和 NCHW 之间切换,确保内存布局与最有效的执行路径相匹配。

比较行主序和通道主序布局

行主序(NHWC)和通道主序(NCHW)布局在机器学习工作负载中具有不同的用途,其效率很大程度上取决于硬件架构、内存访问模式和计算需求。布局的选择直接影响缓存利用率、内存带宽效率和处理吞吐量。表 11.14 总结了行主序(NHWC)和通道主序(NCHW)布局在性能权衡和硬件兼容性方面的差异。

表 11.14:数据布局策略:行主序(NHWC)和通道主序(NCHW)布局优化了不同硬件架构的内存访问模式;NHWC 适用于 CPU 和逐元素操作,而 NCHW 加速了基于 GPU 和 TPU 的卷积操作。选择合适的布局通过最大化缓存利用率和内存带宽效率,对性能产生重大影响。

特性 行主序(NHWC) 通道主序(NCHW)
内存存储顺序 像素按行存储,通道交错 给定通道的所有值首先存储在一起
最佳适用 CPU,逐元素操作 GPU,TPU,卷积操作
缓存效率 高缓存局部性,适用于顺序行访问 优化跨通道的内存合并
卷积性能 需要步进内存访问(在 GPU 上效率低下) 适用于 GPU 卷积内核
内存获取 适用于按顺序处理行的操作 优化跨通道的 SIMD 执行
框架中的默认值 CPU 上的默认值(例如,TensorFlow NHWC) GPU 上的默认值(例如,cuDNN 偏好 NCHW)

使用行主序(NHWC)或通道主序(NCHW)布局的决定并不总是由开发者手动做出。相反,机器学习框架和 AI 编译器通常根据目标硬件和操作类型动态确定最佳布局。由于 CPU 倾向于缓存友好的顺序内存访问,因此它们更偏好 NHWC,而 GPU 在 NCHW 上表现更好,这减少了机器学习计算中的内存获取开销。

在实践中,现代 AI 编译器,如 TensorFlow 的 XLA 和 PyTorch 的 TorchScript,执行自动布局转换,根据需要将张量在 NHWC 和 NCHW 之间转换,以优化不同处理单元的性能。这确保了机器学习模型在不要求开发者手动指定张量布局的情况下,达到最高的吞吐量。

内核融合

AI 加速中最有影响力的优化技术之一是减少操作之间中间数据移动的开销。本节探讨了如何通过内核融合将多个独立的计算转换为统一操作,从而显著提高内存效率和执行性能。我们首先分析由中间写入造成的内存瓶颈,然后探讨融合技术如何消除这些低效性。

中间内存写入

优化内存访问是 AI 加速中的一个基本挑战。虽然 AI 模型依赖于高吞吐量计算,但它们的性能通常受限于内存带宽和中间内存写入,而不是纯算术操作。每当一个操作产生必须写入内存并在稍后读回的中间结果时,由于数据移动开销,执行就会停滞。

基于 第十章 中的软件优化技术以及 第 11.4.1 节 中建立的内存带宽约束,内核融合代表了软件优化和硬件加速之间的关键桥梁。许多 AI 工作负载引入了不必要的中间内存写入,导致内存带宽消耗增加和执行效率降低 (Ye 等人 2025)。

列表 11.22 展示了一个简单的执行模型,其中每个操作都被视为一个独立的内核,这意味着每个中间结果都会写入内存,然后在下一个操作中读取回来。

列表 11.22:简单执行:每个步骤在处理下一个操作之前将中间结果写入内存,导致带宽使用增加和效率降低。来源:NVIDIA GPU 技术大会 2017[nvidia2017gpu]

import torch

## Input tensor
X = torch.randn(1024, 1024).cuda()

## Step-by-step execution (naïve approach)
X1 = torch.relu(X)  # Intermediate tensor stored
# in memory
X2 = torch.batch_norm(X1)  # Another intermediate tensor stored
Y = 2.0 * X2 + 1.0  # Final result

每个操作都会生成一个中间张量,必须将其写入内存并在下一个操作中检索。在大型张量上,这种数据移动的开销可能会超过操作的计算成本 (Shazeer 等人 2018)。表 11.15 展示了简单执行模型中的内存开销。虽然只需要最终的输出 YY,但存储多个中间张量会创建不必要的内存流量和低效的内存使用。这种数据移动瓶颈会显著影响性能,使得内存优化对于 AI 加速器至关重要。

表 11.15:中间张量存储:简单的执行模型需要大量内存来存储每个操作生成的中间张量;对于 1024x1024 的张量,此表显示即使只需要最终的输出,存储这些中间结果也会将总内存占用从 4 MB 增加到 16 MB。最小化这种中间数据存储对于提高内存效率和加速 AI 计算至关重要。

张量 1024 ×\times 1024 张量的大小 (MB)
X 4 MB
X’ 4 MB
X’’ 4 MB
Y 4 MB
总内存 16 MB

尽管只需要最终的输出 YY,但三个额外的中间张量消耗了额外的内存,而没有对最终的输出存储做出贡献。这种过度的内存使用限制了可扩展性,浪费了内存带宽,尤其是在最小化数据移动至关重要的 AI 加速器中。

内存效率内核融合

内核融合是一种关键的优化技术,旨在最小化中间内存写入,减少机器学习工作负载的内存占用和带宽消耗 (Zhihao Jia, Zaharia, and Aiken 2018)。

内核融合涉及将多个计算步骤合并成一个单一、优化的操作,消除了存储和重新加载中间张量的需求。不是单独执行每一层或逐元素操作,其中每个步骤在下一个步骤开始之前将输出写入内存,融合允许操作之间直接数据传递,保持计算在高速寄存器或局部内存中。

一个常见的机器学习序列可能包括应用非线性激活函数(例如,ReLU),然后是批量归一化,最后是对下一层输入的值进行缩放。在原始实现中,这些步骤中的每一个都会生成一个中间张量,并将其写入内存,然后读取回来,并再次修改:X=ReLU(X)X=BatchNorm(X)Y=αX+β X' = \text{ReLU}(X) X'' = \text{BatchNorm}(X') Y = \alpha \cdot X'' + \beta

通过内核融合,这些操作被合并成一个单一的计算步骤,使得整个转换过程无需生成不必要的中间张量:Y=αBatchNorm(ReLU(X))+β Y = \alpha \cdot \text{BatchNorm}\big(\text{ReLU}(X)\big) + \beta

表 11.16 突出了操作融合对内存效率的影响。通过将中间结果保存在寄存器或局部内存中,而不是写入主内存,融合显著减少了内存流量。这种优化在高度并行的架构如 GPU 和 TPU 上特别有益,因为最小化内存访问直接转化为提高了执行吞吐量。与原始执行模型相比,融合执行消除了存储中间张量的需求,大幅降低了总内存占用并提高了整体效率。

表 11.16:操作融合优势:融合执行通过消除存储中间张量的需要,直接提高了在内存受限硬件(如 GPU 和 TPU)上的效率。此表量化了内存节省,显示从原始执行的 16 MB 减少到融合操作的 4 MB。

执行模型 存储的中间张量 总内存使用(MB)
原始执行 X’,X’’ 16 MB
融合执行 4 MB

内核融合将总内存消耗从 16 MB 减少到 4 MB,消除了冗余的内存写入,同时提高了执行效率。

性能优势和限制

内核融合带来了几个关键优势,这些优势增强了内存效率和计算吞吐量。通过减少内存访问,融合内核确保中间值保持在寄存器中,而不是反复写入和读取内存。这显著降低了内存流量,这是机器学习工作负载中的主要瓶颈之一。特别是,GPU 和 TPU 从内核融合中受益,因为高带宽内存是一种稀缺资源,减少内存事务可以提高计算单元的利用率 (X. Qi, Kantarci, and Liu 2017)。

然而,并非所有操作都可以融合。元素级操作,如 ReLU、批量归一化和简单的算术变换,是融合的理想候选者,因为它们的计算只依赖于输入张量的单个元素。相比之下,具有复杂数据依赖性的操作,如矩阵乘法和卷积,涉及全局数据移动,使得直接融合不切实际。这些操作需要从多个输入元素中获取值来计算单个输出,这阻止了它们作为一个单一的融合内核执行。

另一个重要的考虑因素是寄存器压力。融合多个操作意味着所有临时值都必须保存在寄存器中,而不是内存中。虽然这消除了冗余的内存写入,但也增加了寄存器需求。如果一个融合内核超过了每个线程可用的寄存器数量,系统必须将多余的值溢出到共享内存中,这引入了额外的延迟,并可能抵消融合的好处。在 GPU 上,由于线程占用(可以并行运行的线程数)受可用寄存器的限制,过度的融合会降低并行性,导致收益递减。

不同的 AI 加速器和编译器以不同的方式处理融合。例如,NVIDIA GPU 倾向于 warp 级别的并行处理,其中元素级融合简单直接。另一方面,TPU 优先考虑脉动阵列执行,这针对矩阵-矩阵操作进行了优化,而不是元素级融合 (X. Qi, Kantarci, and Liu 2017)。AI 编译器如 XLA (TensorFlow)、TorchScript (PyTorch)、TensorRT (NVIDIA) 和 MLIR 自动检测融合机会,并应用启发式方法以平衡内存节省和执行效率 (X. He 2023b)。

尽管融合具有优势,但并不总是有益。一些 AI 框架允许开发者有选择地禁用融合,尤其是在调试性能问题或频繁修改模型时。决定是否融合操作必须考虑内存效率、寄存器使用和硬件执行约束之间的权衡,以确保融合能带来实际性能提升。

内存高效的分块策略

尽管现代人工智能加速器提供了高计算吞吐量,但它们的性能通常受限于内存带宽而不是原始处理能力。如果数据不能足够快地供应给处理单元,就会发生执行停滞,导致周期浪费和硬件利用率低效。

分块是一种通过将计算重新结构化为更小、内存友好的子问题来减轻这一问题的技术。不是一次性处理整个矩阵或张量,这会导致过度的内存流量,分块将计算分割成更小的块(分块),这些块适合于快速局部内存(例如,缓存、共享内存或寄存器)(Lam, Rothberg, and Wolf 1991)。通过这样做,分块增加了数据重用,最小化了内存检索,并提高了整体计算效率。

不高效的内存访问的经典例子是矩阵乘法,这在 AI 模型中得到了广泛应用。没有分块,原始方法会导致对相同数据的重复内存访问,导致不必要的带宽消耗 (Listing 11.23)。

列表 11.23:没有分块的原生矩阵乘法

for i in range(N):
    for j in range(N):
        for k in range(N):
            C[i, j] += A[i, k] * B[k, j]  # Repeatedly fetching
            # A[i, k] and B[k, j]

每次迭代都需要从内存中多次加载矩阵 AABB 的元素,造成数据移动过多。随着矩阵大小的增加,内存瓶颈加剧,限制了性能。

分块通过确保将矩阵的小部分加载到快速内存中,高效重用,并在必要时才写回主内存来解决此问题。这种技术在人工智能加速器中尤为重要,因为内存访问主导了执行时间。通过将大矩阵分解成小块,如图 11.8 所示,可以在硬件上通过最大化快速内存中的数据重用来更有效地执行计算。在接下来的章节中,将阐述分块的基本原理、其不同的策略以及选择有效分块方法所涉及的关键权衡。

图片

图 11.8:矩阵分块:将大矩阵划分为小块优化了数据重用,并在计算过程中减少了内存访问开销。这项技术通过允许在快速内存中高效加载和处理数据,最小化从较慢的主内存中的传输,从而提高了人工智能加速器的性能。

分块基础

分块(Tiling)基于一个简单但强大的原则:不是一次性对整个数据结构进行操作,而是将计算划分为适合可用快速内存的小块。通过围绕这些小块来结构化执行,最大化数据重用,减少冗余内存访问,从而提高整体效率。

考虑矩阵乘法,这是机器学习工作负载中的关键操作。该操作通过两个输入矩阵 AABB 计算输出矩阵 CCC=A×B C = A \times B 其中每个元素 C[i,j]C[i,j] 的计算如下:C[i,j]=kA[i,k]×B[k,j] C[i,j] = \sum_{k} A[i,k] \times B[k,j]

一种简单的实现直接遵循这个公式(列表 11.24)。

列表 11.24:朴素矩阵乘法:此代码直接使用嵌套循环实现矩阵乘法,展示了输出矩阵中的每个元素是如何作为输入矩阵中对应元素乘积之和来计算的。

for i in range(N):
    for j in range(N):
        for k in range(N):
            C[i, j] += A[i, k] * B[k, j]  # Repeatedly fetching
            # A[i, k] and B[k, j]

初看之下,这种方法似乎是正确的——它计算了所需的结果,并遵循了数学定义。然而,问题在于内存的访问方式。每当最内层循环运行时,它都会从矩阵 AA 和矩阵 BB 中从内存中获取一个元素,执行乘法,并在矩阵 CC 中更新一个元素。由于矩阵很大,处理器频繁地从内存中重新加载相同的值,即使这些值在之前的计算中已经被使用过。

这种不必要的数据移动代价高昂。从主内存(DRAM)中获取值比访问片上缓存或寄存器中存储的值慢数百倍。如果必须多次重新加载相同的值而不是将其存储在快速内存中,执行速度会显著减慢。

分块的性能优势

与每次计算一个元素并不断在慢速内存中移动数据不同,分块处理子矩阵(分块)一次,将常用值保持在快速内存中。想法是将矩阵划分为适合处理器缓存或共享内存的小块,确保一旦一个块被加载,它就会被多次重用,然后再移动到下一个块。

列表 11.25 展示了矩阵乘法的分块版本,通过处理数据块来提高内存局部性。

列表 11.25:分块矩阵乘法:这种方法将矩阵划分为更小的块,通过在处理器缓存中重用数据来优化内存使用,从而提高计算效率。

TILE_SIZE = 32  # Choose a tile size based on
# hardware constraints

for i in range(0, N, TILE_SIZE):
    for j in range(0, N, TILE_SIZE):
        for k in range(0, N, TILE_SIZE):
            # Compute the submatrix
            # C[i:i+TILE_SIZE, j:j+TILE_SIZE]
            for ii in range(i, i + TILE_SIZE):
                for jj in range(j, j + TILE_SIZE):
                    for kk in range(k, k + TILE_SIZE):
                        C[ii, jj] += A[ii, kk] * B[kk, jj]

这种重构显著提高了性能,主要原因有三个:

  1. 更好的内存重用:而不是反复从 AABB 中从慢速内存中获取元素,这种方法将一小块数据加载到快速内存中,使用它进行多次计算,然后才移动到下一个分块。这最小化了冗余的内存访问。

  2. 减少内存带宽使用:由于每个分块在使用后被多次使用,内存流量减少。与反复访问 DRAM 相比,大多数所需数据都可在 L1/L2 缓存或共享内存中找到,从而加快执行速度。

  3. 提高计算效率:处理器花费更少的时间等待数据,更多的时间进行有用的计算。在像 GPU 和 TPU 这样的架构中,数千个并行处理单元同时运行,划分确保数据以结构化的方式读取和处理,避免不必要的停滞。

这种技术在 AI 加速器中特别有效,其中机器学习工作负载包括大规模矩阵乘法和张量变换。没有划分,这些工作负载很快就会成为内存限制的,这意味着性能受限于数据检索的速度,而不是处理器的原始计算能力。

划分方法

虽然划分的一般原则保持不变,即通过将大型计算划分为更小的子问题来提高内存重用,但根据计算结构和硬件约束,有不同方式应用划分。两种主要的划分策略是空间划分和时间划分。这些策略优化计算和内存访问的不同方面,在实践中,它们通常结合使用以达到最佳性能。

空间划分

空间划分关注将数据结构划分为更小的块,这些块适合处理器的高速内存。这种方法确保在移动到下一个块之前,每个块都得到完全处理,从而减少了冗余的内存访问。空间划分在矩阵乘法、卷积和变换器模型中的注意力机制等操作中得到了广泛应用。

空间划分在列表 11.26 中得到了说明,其中计算过程是按照输入矩阵的块进行的。

列表 11.26:空间划分:通过顺序处理矩阵块来减少冗余内存访问。

TILE_SIZE = 32  # Tile size chosen based on available
# fast memory

for i in range(0, N, TILE_SIZE):
    for j in range(0, N, TILE_SIZE):
        for k in range(0, N, TILE_SIZE):
            # Process a submatrix (tile) at a time
            for ii in range(i, i + TILE_SIZE):
                for jj in range(j, j + TILE_SIZE):
                    for kk in range(k, k + TILE_SIZE):
                        C[ii, jj] += A[ii, kk] * B[kk, jj]

在这个实现中,在处理之前,AABB的每个块都加载到缓存或共享内存中,确保相同的数据不需要从较慢的内存中反复获取。在移动到下一个块之前,块被完全使用,从而最小化了冗余的内存访问。由于数据以结构化和局部化的方式访问,缓存效率显著提高。

当处理不适合完全放入快速内存中的大型张量时,空间划分特别有益。通过将它们划分为更小的块,计算保持局部化,避免了在内存级别之间进行过多的数据移动。这项技术在涉及大规模张量操作且需要精心管理内存以实现高性能的机器学习工作负载的 AI 加速器中得到了广泛应用。

时间划分

当空间分割优化数据分区时,时间分割专注于重新组织计算本身,以改善随时间的数据重用。许多机器学习工作负载涉及在多个迭代中重复访问相同数据的操作。没有时间分割,这通常会导致冗余的内存访问,导致效率低下。时间分割,也称为循环阻塞,重构计算以确保频繁使用的数据尽可能长时间地保留在快速内存中,然后再进行下一个计算。

时间分割有益的一个经典例子是卷积操作,其中相同的权重集应用于多个输入区域。没有循环阻塞,这些权重可能需要在每次计算时从内存中多次加载。使用时间分割,计算被重新排序,使得权重在多个输入之间保持快速内存中,减少了不必要的内存访问,并提高了整体效率。

列表 11.27 展示了矩阵乘法中循环阻塞的简化示例。

列表 11.27:时间分割:通过在多个矩阵乘法中缓存权重到快速内存中,减少了冗余内存访问。

for i in range(0, N, TILE_SIZE):
    for j in range(0, N, TILE_SIZE):
        for k in range(0, N, TILE_SIZE):
            # Load tile into fast memory before computation
            A_tile = A[i:i+TILE_SIZE, k:k+TILE_SIZE]
            B_tile = B[k:k+TILE_SIZE, j:j+TILE_SIZE]

            for ii in range(TILE_SIZE):
                for jj in range(TILE_SIZE):
                    for kk in range(TILE_SIZE):
                        C[i+ii, j+jj] += A_tile[ii, kk] *
                                         B_tile[kk, jj]

时间分割技术通过确保在数据被移除之前多次使用加载到快速内存中的数据,从而提高了性能。在本实现中,在执行计算之前,矩阵的小块AABB被明确加载到临时存储中,从而减少了内存访问开销。这种重构允许计算在移动到下一个块之前处理整个块,从而减少了从较慢内存加载数据的次数。

这种技术在某些值被重复使用的负载中特别有用,例如卷积、循环神经网络(RNN)和变换器中的自注意力机制。通过应用循环阻塞,AI 加速器可以显著减少内存停滞并提高执行吞吐量。

分割的挑战和权衡

虽然分割通过优化内存重用和减少冗余内存访问显著提高了性能,但它引入了几个挑战和权衡。选择合适的块大小是一个关键决策,因为它直接影响计算效率和内存带宽使用。如果块大小太小,分割的好处会减少,因为内存访问仍然主导执行时间。另一方面,如果块大小太大,它可能超过可用的快速内存,导致缓存冲突和性能下降。

负载均衡是另一个关键问题。在如 GPU 和 TPU 这样的架构中,计算在数千个处理单元上并行执行。如果分割不均匀分布,一些单元可能保持空闲,而其他单元可能过载,导致计算资源利用不充分。有效的分割调度确保并行执行保持平衡和高效。

数据移动开销也是一个重要的考虑因素。尽管分割减少了慢速内存访问的次数,但在不同内存级别之间传输分割仍然会产生成本。这在层次化内存系统中尤为重要,从缓存中访问数据比从 DRAM 中访问数据要快得多。需要有效的内存预取和调度策略来最小化延迟并确保数据在需要时可用。

不仅仅是空间和时间分割,混合方法结合了两种策略的元素以实现最佳性能。混合分割通过动态调整分割大小或根据实时执行条件重新排序计算来适应特定工作负载的约束。例如,一些 AI 加速器使用空间分割进行矩阵乘法,同时在卷积层中采用时间分割以重用权重。

除了分割之外,还有其他方法可以优化内存使用和计算效率。例如,寄存器分割、双缓冲和分层分割将基本的分割原则扩展到进一步优化执行。如 TensorFlow XLA、TVM 和 MLIR 等 AI 编译器和运行时系统根据硬件约束自动选择分割策略,从而实现无需人工干预的精细性能优化。

表 11.17 提供了空间分割、时间分割和混合分割方法的比较概述,突出了各自的优缺点。

表 11.17:分割策略:空间分割、时间分割和混合分割优化内存访问模式以提升性能;空间分割最大化快速内存中的数据重用,时间分割利用循环结构以减少访问,混合分割结合两种方法以平衡计算效率和内存带宽。这些技术对于 AI 编译器和运行时系统自动优化不同硬件上的模型执行至关重要。

方面 空间分割(数据分割) 时间分割(循环分割) 混合分割
主要目标 通过将数据保留在快速内存中更长时间来减少内存访问 在循环迭代中增加数据重用 动态适应工作负载约束
优化重点 将数据结构分割成更小、内存友好的块 重新排序计算以最大化重用,在淘汰之前 平衡空间和时间重用策略
内存使用 提高缓存局部性并减少 DRAM 访问 将频繁使用的数据保留在快速内存中,以便多次迭代 最小化数据移动,同时确保高重复使用
常见用例 矩阵乘法、CNN、变换器中的自注意力 卷积、循环神经网络(RNN)、迭代计算 具有分层内存的 AI 加速器、混合工作负载
性能提升 降低内存带宽需求,更好的缓存利用率 降低内存获取延迟,提高数据局部性 在多种硬件类型上最大化效率
挑战 需要仔细选择分块大小,对于空间重复使用最少的工作负载效率低下 可能会增加寄存器压力,需要循环重构 动态调整分块大小和执行顺序的复杂性
最佳使用时机 数据量大且需要分区以进行高效处理 相同数据在迭代中多次访问 数据分区和基于迭代的重复使用都很重要

随着机器学习模型在规模和复杂性上的持续增长,分块仍然是一个提高硬件效率的关键工具,确保 AI 加速器发挥其全部潜力。虽然手动分块策略可以提供大量好处,但现代编译器和硬件感知优化技术通过自动选择针对给定工作负载最有效的分块策略来进一步提高性能。

将映射策略应用于神经网络

虽然这些基础映射技术具有广泛的适用性,但它们的有效性取决于不同神经网络架构的计算结构、数据访问模式和并行化机会。每种架构都对数据移动、内存层次结构和计算调度施加了独特的约束,需要定制映射策略以优化性能。

在将计算分配给 AI 加速器时,采用结构化的映射方法对于解决由此产生的组合爆炸式选择至关重要。我们不是将每个模型视为一个独立的优化问题,而是认识到,相同的根本原则适用于不同的架构——只是它们的优先级根据工作负载特性而变化。目标是系统地选择并应用映射策略,以最大化不同类型机器学习模型的效率。

这些原则适用于三个代表性的 AI 工作负载,每个工作负载都有独特的计算需求。CNNs 受益于空间数据重用,使得权重静止执行和应用瓦片技术特别有效。相比之下,Transformers 本质上是内存受限的,依赖于诸如高效的 KV 缓存管理、融合的注意力机制和高度并行执行等策略来减轻内存流量。MLPs 涉及大量的矩阵乘法操作,需要使用结构化瓦片、优化的权重布局和内存感知执行来提高整体性能。

尽管它们之间存在差异,但每个模型都遵循一套共同的映射原则,优化优先级的差异。以下表格提供了不同优化策略及其对 CNNs、Transformers 和 MLPs 适用性的结构化映射。此表作为选择不同机器学习工作负载的适当映射策略的路线图。

优化技术 CNNs Transformers MLPs 理由
数据流策略 权重静止 激活静止 权重静止 CNNs 在空间位置间重用过滤器;Transformers 重用激活(KV 缓存);MLPs 在批次间重用权重。
内存感知张量布局 NCHW (通道优先) NHWC (行优先) NHWC CNNs 偏好通道优先以提高卷积效率;Transformers 和 MLPs 优先考虑行优先以实现快速内存访问。
内核融合 卷积 + 激活 融合注意力 GEMM 融合 CNNs 优化卷积+激活融合;Transformers 融合注意力机制;MLPs 从融合的矩阵乘法中受益。
内存效率的瓦片化 空间瓦片 时间瓦片 分块瓦片 CNNs 沿空间维度瓦片化;Transformers 使用循环分块以提高序列内存效率;MLPs 使用分块瓦片进行大型矩阵乘法。

此表强调,每个机器学习模型都受益于不同组合的优化技术,这强调了根据工作负载的计算和内存特性定制执行策略的重要性。

在以下各节中,我们将探讨这些优化如何应用于每种网络类型,解释 CNNs、Transformers 和 MLPs 如何利用特定的映射策略来提高执行效率和硬件利用率。

卷积神经网络

CNNs 以其结构化的空间计算为特征,其中小型滤波器(或核)在输入特征图上反复应用。这种结构化的权重重用使得权重固定执行成为 CNNs 中最有效的策略。在流激活的同时保持滤波器权重在快速内存中,确保权重不需要从较慢的外部内存中反复获取,从而显著降低内存带宽需求。由于每个权重应用于多个空间位置,权重固定执行最大化了算术强度并最小化了冗余内存传输。

记忆感知的张量布局在 CNN 执行中也发挥着关键作用。卷积操作受益于通道主内存格式,通常表示为 NCHW(批次、通道、高度、宽度)。这种布局与卷积的访问模式相一致,使得在 GPU 和 TPU 等加速器上实现高效的内存归约。通过以优化缓存局部性的格式存储数据,加速器可以有效地获取连续的内存块,减少延迟并提高吞吐量。

核融合是 CNNs 的另一个重要优化。在典型的机器学习管道中,卷积操作通常随后跟随着激活函数,如 ReLU 和批量归一化。将这些操作视为单独的计算步骤而不是融合成一个单一核,可以减少中间内存写入并提高执行效率。这种优化通过将中间值保持在寄存器中而不是写入内存并在后续步骤中重新获取,从而最小化内存带宽压力。

考虑到输入图像和特征图的大小,分块是必要的,以确保计算适合快速内存层次结构。空间分块,即输入特征图在较小的子区域中处理,允许高效地利用片上内存,同时避免过多的片外内存传输。这项技术确保输入激活、权重和中间输出尽可能长时间地保持在高速缓存或共享内存中,减少内存停滞并提高整体性能。

这些优化共同确保了卷积神经网络(CNNs)通过最大化权重重用、优化内存访问模式、减少冗余内存写入以及结构化计算以适应快速内存约束,从而高效地利用可用的计算资源。

Transformer 架构

与依赖于结构化空间计算的 CNNs 不同,Transformers 处理可变长度的序列,并且高度依赖于注意力机制。Transformers 的主要计算瓶颈是内存带宽,因为注意力机制需要频繁访问多个查询向量中的存储键值对。鉴于这种访问模式,激活站态执行是最有效的策略。通过将键值激活保留在快速内存中,并动态地流式传输查询向量,最大化了激活的重用,同时最小化了冗余的内存读取。这种方法对于减少带宽开销至关重要,尤其是在自然语言处理等长序列任务中。

内存布局优化对于 Transformers 同样重要。与受益于通道主布局的 CNNs 不同,Transformers 需要有效地访问激活序列,使得行主格式(NHWC)成为首选。这种布局确保激活在内存中连续访问,减少了缓存未命中并提高了矩阵乘法中的内存归约。

内核融合在优化 Transformer 执行中扮演着关键角色。在自注意力中,多个计算步骤,如查询-键点积、softmax 归一化和加权求和,可以融合为一个单一操作。融合的注意力内核通过在单个执行步骤中计算注意力分数和执行加权求和来消除中间内存写入。这种优化显著减少了内存流量,尤其是在大批量大小和长序列中。

由于序列处理的特性,必须对分块进行适配以提高内存效率。与对 CNNs 有效的空间分块不同,Transformers 从时间分块中受益,其中计算被结构化以有效地处理序列块。这种方法确保激活以可管理的块加载到快速内存中,减少了过度的内存传输。时间分块对于长序列模型特别有益,因为键值激活的内存占用显著增加。通过将序列分块为更小的段,提高了内存局部性,使得高效的缓存利用成为可能,并减少了带宽压力。

这些优化通过优先考虑激活重用、结构化内存布局以进行高效的批量计算、融合注意力操作以减少中间内存写入,以及采用适合基于序列处理的分块技术,共同解决了 Transformer 模型的瓶颈。

多层感知器

MLPs 主要由全连接层组成,其中权重和激活的大型矩阵相乘以产生输出表示。鉴于这种结构,权重静态执行是 MLPs 最有效的策略。类似于 CNNs,MLPs 从保持权重在局部内存中同时动态流激活中受益,因为这确保了权重矩阵,通常在批处理中的多个激活之间重复使用,不需要频繁重新加载。

MLPs(多层感知器)的首选内存布局与 Transformers 的布局一致,因为在使用行主序(NHWC)格式时矩阵乘法更高效。由于激活矩阵是分批处理的,这种布局确保了输入激活的访问效率,同时不会引入内存碎片。通过将张量存储与计算友好的内存访问模式对齐,提高了缓存利用率,减少了内存停滞。

MLPs 中的内核融合主要应用于通用矩阵乘法(GEMM)操作 29。由于密集层通常随后跟随着激活函数和偏置添加,将这些操作融合到单个计算步骤中可以减少内存流量。GEMM 融合确保激活、权重和偏置在单个优化的内核中处理,避免了不必要的内存写入和重新加载。

为了进一步提高内存效率,MLPs 依赖于分块填充策略,其中大型矩阵乘法被分成适合加速器共享内存的小型子块。这种方法确保了矩阵频繁访问的部分在整个计算过程中保持在快速内存中,减少了外部内存访问。通过以平衡内存利用与高效并行执行的方式结构化计算,分块填充最小化了带宽限制并最大化了吞吐量。

这些优化确保了 MLPs 通过围绕权重重用结构化执行、优化密集矩阵操作的内存布局、通过内核融合减少冗余内存写入以及采用分块填充策略以最大化片上内存利用率,实现了高计算效率。

混合映射策略

虽然通用的映射策略为优化机器学习模型提供了一个结构化的框架,但现实世界的架构往往涉及多样化的计算需求,这些需求无法通过单一、固定的方法有效解决。混合映射策略允许 AI 加速器动态地将不同的优化应用于模型中的特定层或组件,确保每个计算都以最大效率执行。

机器学习模型通常由多种层类型组成,每种类型都表现出独特的内存访问模式、数据重用特性和并行化机会。通过针对这些特定属性定制映射策略,混合方法比统一映射方法实现了更高的计算效率、改进的内存带宽利用率和减少的数据移动开销(参见 Sze 等人 2017b)。

层特定映射

混合映射策略在结合空间局部计算(如卷积)和全连接操作(如密集层或注意力机制)的模型中特别有益。这些操作具有不同的特性,需要不同的映射策略以实现最佳性能。

在卷积神经网络中,混合策略经常被采用以优化性能。具体来说,权重静态执行应用于卷积层,确保滤波器保持在局部内存中,而激活动态流过。对于全连接层,输出静态执行被用来最小化矩阵乘法过程中的冗余内存写入。此外,核融合被集成以将激活函数、批量归一化和逐元素操作合并为单个计算步骤,从而减少中间内存流量。总体而言,这些方法提高了计算效率和内存利用率,从而有助于网络的总体性能。

变换器通过优化内存使用和计算效率来采用多种策略以提高性能。具体来说,它们在自注意力层中使用激活静态映射以最大化存储的关键值对的复用,从而减少内存访问。在前馈层中,应用权重静态映射以确保大型权重矩阵在计算中高效复用。此外,这些模型还集成了融合的注意力内核,将 softmax 和加权求和集成到单个计算步骤中,显著提高了执行速度(参见 Jacobs 等人 2002)。

对于多层感知器,混合映射策略通过结合提高内存效率和计算吞吐量的技术来优化性能。具体来说,使用权重静态执行来最大化激活之间的权重重用,确保这些频繁访问的参数始终可用,并减少冗余内存访问。此外,对于大型矩阵乘法,实施分块填充策略,通过将计算划分为适合快速内存的管理子块来显著提高缓存局部性。补充这些方法,应用通用矩阵乘法融合,通过合并连续的矩阵乘法操作与后续的功能转换来有效减少内存停滞。总体而言,这些优化展示了如何通过定制映射策略在多层感知器架构中系统地平衡内存约束和计算需求。

混合映射策略在视觉 Transformer 中得到了广泛应用,这些模型无缝集成了卷积和自注意力操作。在这些模型中,补丁嵌入层执行类似于卷积的操作,并受益于权重静态映射(Dosovitskiy 等人 2020)。另一方面,自注意力层需要激活静态执行来有效地在多个查询之间重用键值缓存。此外,MLP 组件利用通用矩阵乘法融合和分块填充来有效地执行密集矩阵乘法。这一针对特定层的优化框架有效地平衡了内存局部性和计算效率,使得视觉 Transformer 特别适合人工智能加速器。

混合策略的硬件实现

几种现代人工智能加速器采用了混合映射策略,通过针对不同神经网络架构的独特计算需求定制层特定技术来优化执行。例如,谷歌 TPU 在 Transformer 模型中对卷积层使用权重静态映射,对注意力层使用激活静态映射,确保最关键的数据保留在快速内存中。同样,NVIDIA GPU 利用融合内核和混合内存布局,在同一个模型内应用不同的映射策略,以最大化性能。此外,Graphcore IPU 根据每层动态选择执行策略,以优化内存访问,从而提高整体计算效率。

这些现实世界的实现说明了混合映射策略如何弥合不同类型机器学习计算之间的差距,确保每一层都以最大效率执行。然而,硬件支持对于这些技术的实用性至关重要。加速器必须提供可编程内存层次结构、高效的互连和专门的执行流水线等架构特性,以充分利用混合映射。

混合映射为深度学习执行提供了一种灵活且高效的方法,使 AI 加速器能够适应现代架构的多样化计算需求。通过为每一层选择最优的映射技术,混合策略有助于减少内存带宽限制,提高数据局部性,并最大化并行性。

虽然混合映射策略在层特定级别优化计算提供了一个有效的方法,但它们仍然是静态的设计时优化。在现实世界的 AI 工作负载中,由于输入大小、内存竞争或硬件资源可用性的变化,执行条件可以动态变化。机器学习编译器和运行时系统通过引入动态调度、内存优化和自动调整机制来扩展这些映射技术。这些系统确保混合策略不仅是一系列预定义的执行选择,而且是一种适应性机制,允许深度学习工作负载在不同的加速器和部署环境中高效运行。在下一节中,我们将探讨机器学习编译器和运行时堆栈如何通过即时调度、内存感知执行和工作负载平衡策略实现这些适应性优化。

编译器支持

机器学习加速的性能不仅取决于硬件能力,还取决于模型如何有效地转换为可执行操作。包括内核融合、分块、内存调度和数据移动策略在内的这些优化技术对于最大化效率至关重要。然而,这些优化必须在执行前系统地应用,以确保它们与硬件约束和计算需求相一致。

这个过程体现了在第 11.1 节中建立的硬件-软件协同设计原则,其中机器学习编译器将高级模型表示与低级硬件执行相连接。编译器通过重构计算、选择高效的执行内核和最大化硬件利用率来优化模型(0001 et al. 2018a)。与为通用计算设计的传统编译器不同,机器学习工作负载需要针对张量计算和并行执行采用专门的方案。

机器学习工作负载的编译器设计差异

机器学习工作负载引入了传统编译器未设计来处理的独特挑战。与主要涉及顺序或多线程程序流的传统软件执行不同,机器学习模型以计算图的形式表达,描述了大规模的张量操作。这些图需要专门的优化,而传统编译器无法有效地应用这些优化(Cui, Li, and Xie 2019)。

表 11.18 概述了传统编译器和为机器学习工作负载设计的编译器之间的基本差异。虽然传统编译器通过指令调度和寄存器分配等技术优化线性程序执行,但机器学习编译器则专注于优化计算图以实现高效的张量操作。这种区别至关重要,因为机器学习编译器必须结合领域特定的转换,如内核融合、内存感知调度和硬件加速执行计划,以在如 GPU 和 TPU 等专用加速器上实现高性能。

这种比较突出了为什么机器学习模型需要不同的编译方法。机器学习编译器不是优化指令级执行,而是必须转换整个计算图,应用张量感知的内存优化,并在数千个并行处理元素之间调度操作。这些需求使得传统编译技术不足以应对现代深度学习工作负载。

表 11.18:编译器优化优先级:传统编译器和机器学习编译器在优化目标上存在差异;传统编译器优先考虑顺序代码的高效执行,而机器学习编译器则专注于优化计算图中的张量操作以适应专用硬件。此表阐明了机器学习编译器如何结合领域特定的转换——如内核融合和内存感知调度——以在加速器上实现高性能,这与传统软件编译中使用的指令调度和寄存器分配技术不同。

方面 传统编译器 机器学习编译器
输入表示 线性程序代码(C、Python) 计算图(机器学习模型)
执行模型 顺序或多线程执行 基于张量的大规模并行执行
优化优先级 指令调度、循环展开、寄存器分配 图转换、内核融合、内存感知执行
内存管理 栈和堆内存分配 张量布局转换、分块、内存感知调度
目标硬件 CPU(通用执行) GPU、TPU 和定制加速器
编译输出 CPU 特定的机器代码 硬件特定的执行计划(内核、内存调度)

机器学习编译流程

在现代框架中定义的机器学习模型最初以高级计算图的形式表示,该图描述了对张量的操作。然而,这些表示不能直接在 GPU、TPU 和定制 AI 芯片等硬件加速器上执行。为了实现高效执行,模型必须经过一个编译过程,将其转换为针对目标硬件优化的执行计划(Brain 2020)。

机器学习编译工作流程包括几个关键阶段,每个阶段负责应用特定的优化,以确保最小内存开销、最大并行执行和最佳计算利用率。这些阶段包括:

  1. 图优化:计算图被重构以消除低效部分。

  2. 内核选择:每个操作映射到一个优化的特定于硬件的实现。

  3. 内存规划:张量布局和内存访问模式被优化以减少带宽消耗。

  4. 计算调度:工作负载被分配到并行处理元素,以最大化硬件利用率。

  5. 代码生成:优化的执行计划被转换为特定于机器的执行指令。

在每个阶段,编译器应用之前讨论过的理论优化,包括内核融合、分块、数据移动策略和计算放置,确保这些优化系统地纳入最终的执行计划。

通过理解这个工作流程,我们可以看到机器学习加速不仅通过硬件改进,还通过编译器驱动的软件优化来实现。

图优化

AI 加速器提供专门的硬件以加快计算速度,但原始模型表示并非天生就针对这些加速器的执行进行了优化。机器学习框架使用高级计算图定义模型,其中节点表示操作(如卷积、矩阵乘法和激活),边定义数据依赖关系。然而,如果按照定义执行,这些图通常包含冗余操作、低效的内存访问模式和不理想的执行序列,这可能会阻止硬件以峰值效率运行。

例如,在 Transformer 模型中,自注意力机制涉及在多个注意力头之间重复访问相同的键值对。如果简单编译,模型可能会多次重新加载相同的数据,导致过度的内存流量(Shoeybi 等人 2019a)。同样,在 CNN 中,在每个卷积之后将批量归一化和激活函数作为单独的操作应用会导致不必要的中间内存写入,增加内存带宽使用。这些低效性在图优化阶段得到解决,编译器重构计算图以消除不必要的操作并提高内存局部性(0001 等人 2018a)。

编译的图优化阶段负责在将其映射到硬件之前将这个高级计算图转换为优化的执行计划。编译器不需要手动优化,而是系统地应用改进数据移动、减少冗余计算和重构操作以实现高效并行执行的变化(NVIDIA 2021)。

在这个阶段,编译器仍然在硬件无关的层面上工作,专注于在后续应用更具体的硬件优化之前,提高效率的高级重构。

计算图优化

图优化通过一系列旨在提高执行效率的结构化技术来转换计算图。其中一个关键技术是内核融合,它将连续的操作合并以消除不必要的内存写入并减少内核启动次数。这种方法在卷积神经网络中特别有效,其中融合卷积、批量归一化和激活函数可以显著加速处理。另一个重要技术是计算重排,它调整操作的执行顺序以改善数据局部性和最大化并行执行。例如,在 Transformer 模型中,这种重排使得可以重复使用缓存的键值对,而不是反复从内存中重新加载,从而降低延迟。

此外,冗余计算消除也发挥着重要作用。通过识别和删除重复或不必要的操作,这种方法在具有残差连接的模型中特别有益,在这些模型中,常见的子表达式可能会被冗余计算。内存感知的数据流调整通过优化张量布局和内存移动来提高整体性能。例如,将矩阵乘法分块以满足 TPU 中收缩阵列的结构要求,确保硬件资源得到最优利用。这种结合的方法不仅减少了不必要的处理,而且使数据存储和移动与加速器的优势保持一致,从而在多样化的 AI 工作负载中实现高效的执行。这些技术共同通过最小化开销并确保计算资源和内存资源之间的最佳平衡,为模型的加速做准备。

在 AI 编译器中的实现

现代 AI 编译器通过使用自动模式识别和结构化重写规则来执行图优化,系统地转换计算图以最大化效率,而无需人工干预。例如,TensorFlow 中的 Google XLA(加速线性代数)在 TPU 和 GPU 上应用图级转换,如融合和布局优化,以简化执行。同样,TVM(张量虚拟机)不仅优化张量布局和调整计算结构,还针对不同的硬件后端调整执行策略,这对于在具有严格内存约束的嵌入式 Tiny ML 设备上部署模型特别有益。

NVIDIA 的 TensorRT,另一个专门的深度学习编译器,通过融合操作和优化 GPU 上的执行调度来最小化内核启动开销,从而提高大规模卷积神经网络应用中的利用率并减少推理延迟。此外,MLIR(多级中间表示)通过启用多阶段转换来促进跨各种 AI 加速器的灵活图优化,这些转换可以改善执行顺序和内存访问模式,从而简化模型从基于 CPU 的实现到加速器优化版本的过渡。这些编译器在重写计算图以确保后续的硬件特定优化可以有效地应用的同时,保留了模型的数学完整性。

图优化的重要性

图优化使 AI 加速器能够以峰值效率运行。如果没有这个阶段,即使是最优化的硬件也会被低效利用,因为模型将以引入不必要的内存停滞、冗余计算和低效数据移动的方式执行。通过系统地重构计算图,编译器安排操作以实现高效的执行,在映射到硬件之前缓解瓶颈,最小化内存移动以保持张量在高速内存中,并优化并行执行以减少不必要的序列化并提高硬件利用率。例如,如果没有适当的图优化,运行在边缘设备上的大型 Transformer 模型可能会因为次优的数据访问模式而经历过度的内存停滞;然而,通过有效的图重构,模型可以以显著降低的内存带宽消耗和延迟运行,从而在资源受限的设备上实现实时推理。

计算图现在已完全优化,编译的下一步是内核选择,编译器确定每个操作应使用哪个硬件特定的实现。这确保了结构化执行计划被转换为针对目标加速器的优化低级指令。

内核选择

在这个阶段,编译器将计算图中的抽象操作转换为优化后的低级函数,确保在目标加速器的约束下执行尽可能高效。内核是针对特定硬件架构高效运行的计算操作的专用实现。大多数加速器,包括 GPU、TPU 和定制 AI 芯片,为同一操作提供多个内核实现,每个实现针对不同的执行场景进行了优化。为每个操作选择正确的内核对于最大化计算吞吐量、最小化内存停滞并确保加速器的专用处理元素得到充分利用至关重要 (NVIDIA 2021)。

内核选择建立在图优化阶段之上,确保结构化执行计划映射到最有效的实现。虽然图优化消除了模型层面的低效,但内核选择确保每个单独的操作都使用最有效的硬件特定例程执行。此过程的有效性直接影响模型的总体性能,因为较差的内核选择可能会通过引入不必要的计算开销或内存瓶颈来抵消先前优化的好处 (0001 et al. 2018a)。

在 Transformer 模型中,主导自注意力计算的矩阵乘法可以根据可用的硬件采用不同的策略执行。在 CPU 上,通常使用通用矩阵乘法例程,利用向量化执行来提高效率。相比之下,在 GPU 上,编译器可能会选择一种利用张量核心来加速矩阵乘法并使用混合精度算术的实施方案。当模型部署在 TPU 上时,操作可以映射到一个脉动阵列,确保数据以最大化重用和最小化片外内存访问的方式通过加速器。此外,对于推理工作负载,整数算术内核可能更可取,因为它便于在 INT8 而不是浮点精度下进行计算,从而在不显著降低精度的同时减少功耗。

在许多情况下,编译器不是从头开始生成自定义内核,而是从供应商优化的内核库中选择,这些库为不同的架构提供了高度优化的实现。例如,cuDNN 和 cuBLAS 为 NVIDIA GPU 上的深度学习提供了优化内核,而 oneDNN 为 Intel 架构提供了优化执行。同样,ACL(Arm Compute Library)针对基于 Arm 的设备进行了优化,Eigen 和 BLIS 为深度学习操作提供了高效的基于 CPU 的实现。这些库允许编译器选择预优化的、高性能的内核,而不是为每个硬件平台重新发明执行策略。

在 AI 编译器中的实现

AI 编译器使用启发式方法、配置文件分析和成本模型来确定每个操作的最佳内核。这些策略确保每个计算都以最大化吞吐量和最小化内存瓶颈的方式进行执行。

在基于规则的选取中,编译器根据硬件的已知能力应用预定义的启发式方法。例如,TensorFlow 中使用的编译器 XLA,当启用混合精度执行时,会自动选择针对 NVIDIA GPU 的张量核心优化内核。这些预定义的规则允许编译器快速、可靠地做出关于使用哪个内核的决定,而无需进行广泛的分析。

基于配置文件的选择采用了一种更动态的方法,基准测试不同的内核选项,并选择对给定工作负载表现最佳的选项。开源 AI 编译器 TVM 使用 AutoTVM 来经验性地评估内核性能,根据实际的执行时间调整执行策略。通过在部署前测试不同的内核,基于配置文件的选择有助于确保操作在实际执行条件下被分配给最有效的实现。

另一种基于成本模型的选择方法,依赖于性能预测来估计各种内核的执行时间和内存消耗,在选择了最有效的内核之后。MLIR 是一种为机器学习工作负载设计的编译器基础设施,它应用了这种技术来确定最有效的瓦片和内存访问策略(Lattner 等人 2020)。通过模拟不同内核如何与加速器的计算单元和内存层次结构交互,编译器可以选择在最大化性能的同时最小化执行成本的内核。

许多人工智能编译器还集成了精度感知的内核选择,所选内核针对特定的数值格式进行优化,例如 FP32、FP16、BF16 或 INT8。训练工作负载通常优先考虑更高的精度(FP32、BF16),以保持模型精度,而推理工作负载则更倾向于较低的精度(FP16、INT8),以提高速度并减少功耗。例如,运行 TensorRT 进行推理的 NVIDIA GPU 可以根据模型的精度约束动态选择 FP16 或 INT8 内核。精度与性能之间的权衡是内核选择的关键方面,尤其是在资源受限的环境中部署模型时。

一些编译器不仅超越了静态内核选择,还实现了自适应内核调整,即在运行时根据系统的负载和可用资源调整执行策略。TVM 中的 AutoTVM 通过在不同工作负载上测量内核性能,动态地优化执行策略。TensorRT 根据批大小、内存约束和 GPU 负载进行实时优化,动态调整内核选择。谷歌的 TPU 编译器采取了类似的方法,根据云资源可用性和执行环境约束优化内核选择。

内核选择的重要性

人工智能加速的效率不仅取决于计算的构建方式,还取决于它们的执行方式。即使是最精心设计的计算图,如果所选内核没有充分利用硬件的能力,也无法达到峰值性能。

正确的内核选择允许模型使用针对给定硬件的最有效算法执行,确保内存访问方式避免不必要的停滞,并在可能的情况下利用专门的加速功能,例如张量核心或脉动阵列。选择不适当的内核可能导致计算资源利用率低下、内存传输过多以及功耗增加,所有这些都会限制人工智能加速器的性能。

例如,如果一个在 GPU 上运行的 Transformer 模型被分配了一个非张量核心内核进行矩阵乘法,它可能只能达到可能性能的一小部分。相反,如果一个为 FP32 执行设计的模型被迫在一个 INT8 优化的内核上运行,它可能会经历显著的数值不稳定性,降低精度。这些选择说明了为什么内核选择与保持数值正确性一样,关乎优化性能。

内核选择完成后,编译的下一阶段涉及执行调度和内存管理,其中编译器确定如何启动内核以及如何在内存层次结构的不同级别之间传输数据。这些编译管道的最后一步确保计算以最大并行性运行,同时最小化数据移动的开销。内核选择决定了要执行的内容,而执行调度和内存管理则决定了这些内核何时以及如何执行,确保人工智能加速器以最高效率运行。

内存规划

内存规划阶段确保数据以最小化内存带宽消耗、降低延迟和最大化缓存效率的方式分配和访问(Y. Zhang, Li, 和 Ouyang 2020)。即使是最优化的执行计划,如果内存管理效率不高,模型仍然可能遭受严重的性能下降。

机器学习工作负载通常是内存密集型的。它们需要在内存层次结构的多个级别之间频繁移动大型张量。编译器必须确定张量的存储方式、访问方式以及中间结果的处理方式,以确保内存不会成为瓶颈。

内存规划阶段专注于优化张量布局、内存访问模式和缓冲区重用,以防止执行过程中的不必要的停滞和内存竞争。在这个阶段,张量以内存高效的格式排列,与硬件访问模式相一致,从而最小化格式转换的需要。此外,内存访问被结构化以减少缓存未命中和停滞,这反过来又降低了整体带宽消耗。缓冲区重用也是一个关键方面,因为它通过智能管理中间结果来减少冗余内存分配。这些策略共同确保数据被有效地放置和访问,从而在人工智能工作负载中提高计算性能和能源效率。

在人工智能编译器中的实现

内存规划是一个复杂的问题,因为人工智能模型必须在跨越内存层次结构的多个级别上平衡内存可用性、重用和访问效率。人工智能编译器使用几种关键策略来有效地管理内存并防止不必要的数据移动。

内存规划的第一步是张量布局优化,编译器确定张量在内存中的排列方式,以最大化局部性并防止不必要的格式转换。不同的硬件加速器有不同的首选存储布局——例如,NVIDIA GPU 通常使用行主序存储(NHWC 格式),而 TPU 则偏好通道主序布局(NCHW 格式)以优化内存归约(Martín Abadi 等人 2016)。编译器根据目标硬件预期的访问模式自动转换张量布局,确保内存访问对齐以实现最大效率。

除了布局优化之外,内存规划还包括缓冲区分配和重用,编译器通过尽可能重用中间存储来最小化内存占用。深度学习工作负载生成许多临时张量,如激活和梯度,如果不加管理,这些张量可能会迅速耗尽片上内存。而不是为每个张量分配新的内存,编译器分析计算图以识别缓冲区重用的机会,确保中间值被高效地存储和覆盖(G. A. Jones 2018)。

内存规划的另一个关键方面是尽量减少不同内存层次之间的数据移动。人工智能加速器通常包含高速片上内存(如缓存或共享 SRAM)和更大但较慢的外部 DRAM。如果张量数据在这些内存层次之间反复移动,模型可能会变得内存受限,降低计算效率。为了防止这种情况,编译器使用分块策略,将大型计算分解成更小、内存友好的块,使执行能够适应快速、局部内存,并减少对昂贵的片外内存访问的需求。

内存规划的重要性

没有适当的内存规划,即使是最优化的计算图和内核选择也无法实现高性能。过度的内存传输、低效的内存布局和冗余的内存分配都可能造成瓶颈,阻碍人工智能加速器达到其峰值吞吐量。

例如,在一个 GPU 上运行的卷积神经网络(CNN)在理论上可能实现高计算效率,但如果其卷积特征图以不兼容的格式存储,例如,如果它使用需要转换为 NCHW 或类似格式的行主序布局,那么频繁的张量格式转换会引入显著的开销。同样,如果内存规划不当,部署在边缘设备上的 Transformer 模型可能难以满足实时推理要求,导致频繁的片外内存访问,增加延迟和功耗。

通过仔细管理张量放置、优化内存访问模式和减少不必要的数据移动,内存规划保证了 AI 加速器的有效运行,从而在实际应用中带来了可观的性能提升。

计算调度

在完成图优化、选择内核和最终确定内存规划之后,编译流程中的下一步是计算调度。这一阶段决定每个计算何时何地执行,确保工作负载在可用的处理元素之间高效分布,同时避免不必要的停滞和资源竞争 (Rajbhandari 等人 2020a; Zheng 等人 2020)。

AI 加速器通过大规模并行化实现高性能,但没有有效的调度策略,计算单元可能会闲置,内存带宽可能未被充分利用,执行效率可能会下降。计算调度负责确保所有处理元素保持活跃,执行依赖关系得到正确管理,并且工作负载得到优化分配 (Ziheng Jia 等人 2019)。

在调度阶段,并行执行、同步和资源分配得到系统化管理。任务分区将大量计算分解为更小、更易于管理的任务,这些任务可以高效地分配到多个计算核心。执行顺序优化随后确定启动这些操作的最有效顺序,最大化硬件性能同时减少执行停滞。此外,资源分配和同步得到协调,以确保计算核心、内存带宽和共享缓存得到有效利用,避免竞争。通过这些协调策略,计算调度实现了最优的硬件利用率,最小化了内存访问延迟,并支持了流畅高效的执行过程。

AI 编译器中的实现

计算调度高度依赖于底层硬件架构,因为不同的 AI 加速器具有独特的执行模型,在确定工作负载如何调度时必须考虑这些模型。AI 编译器实施了几种关键策略来优化调度以实现高效执行。

调度中最基本的方面之一是任务划分,编译器将大的计算图划分为更小、更易于管理的单元,以便并行执行。在 GPU 上,这通常意味着将矩阵乘法和卷积映射到数千个 CUDA 核心,而在 TPU 上,任务被划分以适应操作结构化数据流的脉冲阵列(Norrie 等人 2021)。在 CPU 上,划分通常侧重于将计算分解为与 SIMD 执行对齐的矢量化块。目标是高效地将工作负载映射到可用的处理单元,确保每个核心在整个执行过程中保持活跃。

调度涉及优化执行顺序以最小化依赖关系并最大化吞吐量,而不仅仅是任务划分。许多 AI 模型包括可以独立计算的运算(例如,批处理管道中的不同批次)以及具有严格依赖关系的运算(例如,RNN 中的循环层)。AI 编译器分析这些依赖关系,并尝试尽可能重新排列执行,以减少闲置时间并提高并行效率。例如,在 Transformer 模型中,调度可能优先将注意力矩阵预加载到内存中,同时早期层仍在执行,确保数据在需要时已准备好(Shoeybi 等人 2019b)。

计算调度的另一个关键方面是资源分配和同步,编译器确定计算核心如何共享内存并协调执行。现代 AI 加速器通常支持重叠计算和数据传输,这意味着当一个任务执行时,下一个任务可以开始获取其所需的数据。编译器通过以这种方式调度任务来利用这一点,隐藏内存延迟,确保执行保持计算密集型而不是内存密集型(0001 等人 2018b)。例如,TensorRT 和 XLA 采用流式执行策略,其中并行启动多个内核,并仔细管理同步以防止执行停滞(Google 2025)。

计算调度的重要性

没有有效的调度,即使是经过优化的模型也可能因为计算资源的利用率不足、内存瓶颈和执行效率低下而受到影响。不良的调度决策可能导致处理元素闲置,迫使昂贵的计算核心在继续执行之前等待数据或同步事件。

例如,在 GPU 上运行的卷积神经网络(CNN)可能具有高度优化的内核和高效的内存布局,但如果其执行调度不当,计算单元在内核启动之间可能会闲置,从而降低吞吐量。同样,部署在 TPU 上的 Transformer 模型可能能够高效地执行矩阵乘法,但如果注意力层没有有效地与内存传输重叠调度,可能会经历性能下降。

有效的计算调度在并行工作负载的编排中占据核心地位,确保处理元素被充分利用,同时防止闲置核心——这是最大化整体吞吐量的关键方面。通过策略性地重叠计算与数据移动,调度机制有效地隐藏了内存延迟,从而防止在数据检索期间出现操作停滞。通过精确解决执行依赖关系,它最小化了等待时间,并增强了计算和数据传输的并发进展。这种调度和数据处理的系统整合不仅提高了性能,而且展示了支撑现代加速器设计的严谨工程原则。

代码生成

与之前需要特定 AI 优化优化的阶段不同,代码生成遵循了许多与传统编译器相同的原理。这个过程包括指令选择、寄存器分配和最终的优化遍历,确保执行充分利用了硬件特定的特性,如向量执行、内存预取和指令重排。

对于 CPU 和 GPU,AI 编译器通常生成机器代码或优化的汇编指令,而对于 TPU、FPGA 和其他加速器,输出可能是优化后的字节码或由硬件的运行时系统解释的执行图。

到这一点,编译管道已经完成:原始的高级模型表示已经被转换成针对目标硬件高效执行的优化、可执行格式。图变换、内核选择、内存感知执行和并行调度的组合确保 AI 加速器以最大效率、最小内存开销和最佳计算吞吐量运行工作负载。

编译-运行时支持

编译器在 AI 加速中扮演着基本角色,将高级机器学习模型转换为针对专用硬件约束优化的执行计划。在本节中,我们已经看到图优化如何重构计算,内核选择如何将操作映射到硬件高效的实现,内存规划如何优化数据放置,以及计算调度如何确保高效的并行执行。这些阶段中的每一个对于使 AI 模型充分利用现代加速器至关重要,确保高吞吐量、最小内存开销和高效的执行管道。

然而,仅靠编译本身并不能保证在现实世界的 AI 工作负载中实现高效的执行。虽然编译器根据已知的模型结构和硬件能力静态优化计算,但 AI 执行环境通常是动态和不可预测的。批量大小波动,硬件资源可能被多个工作负载共享,加速器必须适应实时性能约束。在这些情况下,静态执行计划是不够的,运行时管理变得至关重要,以确保模型在现实世界条件下以最佳方式执行。

这种从静态编译到自适应执行的转变正是 AI 运行时发挥作用的地方。运行时提供动态内存分配、实时内核选择、工作负载调度和多芯片协调,使 AI 模型能够适应变化的执行条件,同时保持效率。在下一节中,我们将探讨 AI 运行时如何扩展编译器的功能,使模型能够在各种可扩展的部署场景中有效运行。

运行时支持

虽然编译器在执行前优化 AI 模型,但实际部署引入了动态和不可预测的条件,这些条件仅靠静态编译无法完全解决 (NVIDIA 2021)。AI 工作负载在多种执行环境中运行,其中诸如批量大小波动、共享硬件资源、内存竞争和延迟约束等因素需要实时适应。针对固定假设集预先编译的执行计划,当实际运行时条件发生变化时,可能变得次优。

为了弥合这一差距,AI 运行时提供了一层动态的执行管理,通过实时决策扩展了编译时执行的优化。与执行固定指令序列的传统编译程序不同,AI 工作负载需要适应内存分配、内核执行和资源调度的控制。AI 运行时持续监控执行条件,并实时调整以确保机器学习模型充分利用可用硬件,同时保持效率和性能保证。

在高层次上,AI 运行时管理执行过程中的三个关键方面:

  1. 内核执行管理:AI 运行时根据当前系统状态动态选择和调度计算内核,确保工作负载以最小延迟执行。

  2. 内存适应和分配:由于 AI 工作负载经常处理具有不同内存占用的大张量,运行时动态调整内存分配以防止瓶颈和过多的数据移动(Y. Huang 等人,2019)。

  3. 执行扩展:AI 运行时处理跨多个加速器的作业分配,支持在多芯片、多节点或云环境中进行大规模执行(Mirhoseini 等人,2017)。

通过动态处理这些执行方面,AI 运行时补充了基于编译器的优化,确保模型在变化的运行时条件下继续高效运行。下一节将探讨 AI 运行时与传统软件运行时的不同之处,突出为什么机器学习工作负载需要与基于传统 CPU 的程序相比,采用根本不同的执行策略。

机器学习系统运行时架构差异

传统软件运行时旨在管理通用程序执行,主要处理 CPU 上的顺序和多线程工作负载。这些运行时在单个函数调用和指令级别分配内存、调度任务和优化执行。相比之下,AI 运行时专门针对机器学习工作负载,这些工作负载需要大规模并行计算、大规模张量操作和动态内存管理。

表 11.19 突出了传统运行时和 AI 运行时的基本差异。其中一个关键区别在于执行流程。传统软件运行时在可预测、结构化的执行模型上运行,其中函数调用和 CPU 线程遵循预定义的控制路径。然而,AI 运行时执行计算图,需要考虑张量操作之间的依赖关系、并行内核执行和高效内存访问的复杂调度决策。

表 11.19:运行时执行模型:传统运行时和 AI 运行时在执行方法上存在差异;传统运行时优先考虑顺序或多线程指令处理,而 AI 运行时利用大规模并行张量操作来加速机器学习工作负载的计算。这种区别需要专门设计的 AI 运行时架构,以实现大规模张量数据的有效并行化和内存管理。

方面 传统运行时 AI 运行时
执行模型 顺序或多线程执行 大规模并行张量执行
任务调度 CPU 线程管理 核心在加速器之间的调度
内存管理 静态分配(栈/堆) 动态张量分配,缓冲区重用
优化优先级 低延迟指令执行 最小化内存停滞,最大化并行执行
适应性 主要静态执行计划 适应批量大小和硬件可用性
目标硬件 CPUs(通用执行) GPUs、TPUs 和定制加速器

内存管理是另一个主要区别。传统的软件运行时处理小而频繁的内存分配,优化缓存效率和低延迟访问。相比之下,AI 运行时必须动态分配、重用和优化大型张量,确保内存访问模式与加速器友好的执行相匹配。AI 工作负载中的内存管理不当可能导致性能瓶颈,尤其是由于过度的片外内存传输和低效的缓存使用。

AI 运行时天生具有适应性。虽然传统的运行时通常遵循一个主要静态的执行计划,但 AI 工作负载通常在高度可变的执行环境中运行,例如基于云的加速器或多租户硬件。因此,AI 运行时必须持续调整批量大小、重新分配计算资源,并管理实时调度决策,以保持高吞吐量和最小化执行延迟。

这些区别说明了为什么与传统的软件运行时相比,AI 运行时需要根本不同的执行策略。AI 运行时不仅要管理 CPU 进程,还必须监督大规模张量执行、多设备协调和实时工作负载适应,以确保机器学习模型能够在各种不断变化的部署条件下高效运行。

动态内核执行

动态内核执行是将机器学习模型映射到硬件并优化运行时执行的过程。虽然静态编译提供了一个坚实的基础,但高效执行机器学习工作负载需要实时适应波动条件,如可用内存、数据大小和计算负载。运行时充当一个中介,持续调整执行策略以匹配底层硬件的约束和工作负载的特性。

当将机器学习模型映射到硬件时,必须将单个计算操作(包括矩阵乘法、卷积和激活函数)分配给最合适的处理单元。这种映射不是固定的;它必须在运行时根据输入数据、内存可用性和整体系统负载的变化进行修改。动态内核执行允许运行时实时做出关于内核选择、执行顺序和内存管理的决策,确保即使在这些变化条件下,工作负载也能保持高效。

例如,考虑一个执行图像分类的深度神经网络(DNN)的 AI 加速器。如果传入的高分辨率图像批次所需的内存比预期多得多,静态计划的执行可能会导致缓存冲突或过度的片外内存访问。相反,动态运行时可以即时调整分块策略,将张量操作分解成适合高速片上内存的小块。这可以防止内存停滞并确保缓存的最佳利用率。

类似地,当运行基于 transformer 的自然语言处理(NLP)模型时,输入文本的序列长度可能在推理请求之间变化。针对固定序列长度优化的静态执行计划在处理较短的序列时可能会导致计算资源利用率不足,而在处理较长的序列时可能会产生过度的内存压力。动态内核执行可以通过根据实际序列长度选择不同的内核实现来缓解这种情况,动态调整内存分配和执行策略以保持效率。

计算与内存移动重叠是一种缓解性能瓶颈的重要策略。AI 工作负载经常遇到由于内存绑定问题而导致的延迟,其中数据在内存层次结构之间的移动限制了计算速度。为了应对这种情况,AI 运行时实施异步执行和双缓冲等技术,确保计算在没有等待内存传输完成的情况下进行。例如,在一个大规模模型中,可以在对前一个批次进行计算的同时预取图像数据,从而保持数据流的稳定并避免流水线停滞。

另一个实际例子是在 GPU 上执行卷积层。如果需要调度多个卷积内核,静态调度方法可能会因为层大小和计算需求的变化而导致资源利用率低下。通过动态调度内核执行,AI 运行时可以在计算单元部分占用时优先选择较小的内核,从而提高硬件利用率。例如,在 NVIDIA 的 TensorRT 运行时,将小内核融合到较大的执行单元中是动态进行的,以避免启动开销,优化对延迟敏感的推理任务。

动态内核执行在确保机器学习模型高效执行中起着至关重要的作用。通过根据实时系统条件动态调整执行策略,AI 运行时优化了跨各种硬件平台的训练和推理性能。

运行时内核选择

虽然编译器可能会根据机器学习模型和硬件目标的静态分析进行内核的初始选择,但 AI 运行时通常需要在执行过程中覆盖这些决策。实时因素,如可用内存、硬件利用率和工作负载优先级,可能与编译期间做出的假设有很大不同。通过在运行时动态选择和切换内核,AI 运行时可以适应这些变化条件,确保模型继续高效运行。

例如,考虑基于 transformer 的语言模型,其中执行时间的大部分都花在了矩阵乘法上。AI 运行时必须根据当前系统状态确定执行这些操作的最有效方式。如果模型运行在具有专用 Tensor Cores 的 GPU 上,运行时可能会从标准 FP32 内核切换到 FP16 内核,以利用硬件加速(Shoeybi 等人 2019a)。相反,如果 FP16 的较低精度导致不可接受的数值不稳定性,运行时可以选择混合精度执行,在需要更高精度的位置选择性地使用 FP32。

内存限制也会影响内核选择。当内存带宽有限时,运行时可能会调整其执行策略,重新排序操作或更改分块策略,以便将计算放入可用的缓存中,而不是依赖于较慢的主内存。例如,一个大的矩阵乘法可能被分解成更小的块,确保计算适合 GPU 的片上内存,从而降低整体延迟。

此外,批处理大小也会影响内核选择。对于处理小批量和大批量混合的工作负载,AI 运行时可能会为小批量选择延迟优化的内核,为大规模批处理选择吞吐量优化的内核。这种调整确保模型在不同执行场景中继续高效运行,无需手动调整。

内核调度和利用率

一旦 AI 运行时选择了合适的内核,下一步就是以最大化并行性和资源利用率为目标进行调度。与设计用于管理 CPU 线程的传统任务调度器不同,AI 运行时必须在并行执行单元(如 GPU 核心、张量处理单元或定制 AI 加速器)之间协调大量任务(Norman P. Jouppi 等人 2017a)。有效的调度确保这些计算资源保持完全投入,防止瓶颈并最大化吞吐量。

例如,在采用卷积层的图像识别模型中,操作可以分布在多个处理单元上,使得不同的过滤器可以同时运行。这种并行化确保了可用硬件得到充分利用,从而加快了执行速度。同样,批量归一化和激活函数必须高效地调度,以避免不必要的延迟。如果这些操作没有与其他计算交织进行,它们可能会阻塞流水线并降低整体吞吐量。

高效的内核调度也可能受到实时内存管理的影响。人工智能运行时确保在需要之前,将中间数据,如深度神经网络中的特征图,预先加载到缓存中。这种主动管理有助于防止由于从较慢的内存层级加载数据而导致的延迟,确保连续执行。

这些技术使人工智能运行时能够确保最佳资源利用和高效的并行计算,这对于机器学习模型的高性能执行至关重要,尤其是在需要跨多个硬件加速器进行扩展的环境中。

到目前为止,所检查的编译器和运行时系统优化了单个加速器内的执行——管理计算映射、内存层次结构和内核调度。虽然这些单芯片优化实现了令人印象深刻的性能提升,但现代人工智能工作负载越来越多地超出了任何单个芯片的能力。训练 GPT-3 需要连续运行单个 H100 10 年,消耗 314 十亿浮点运算。为全球应用提供实时推理服务需要超越任何单个加速器的吞吐量。这些计算需求源于第九章中的扩展定律(第九章),需要从单芯片优化到分布式加速策略的根本转变。

多芯片人工智能加速

从单芯片到多芯片架构的转变不仅仅是简单的复制——它需要重新思考计算如何在处理器之间分布,数据如何在芯片之间流动,以及系统如何在规模上保持一致性。单芯片优化侧重于在固定资源内最大化利用,而多芯片系统必须在计算分布与通信开销、内存一致性成本和同步复杂性之间取得平衡。这些挑战从根本上改变了优化格局,需要超出为单个加速器开发的抽象和技术之外的新抽象和技术。

现代人工智能工作负载越来越需要超出单片加速器能力的计算资源。本节探讨了人工智能系统如何从单个处理器扩展到多芯片架构,分析了不同扩展方法的动机及其对系统设计的影响。这些扩展考虑因素是第八章中涵盖的分布式训练策略和第十三章中讨论的操作挑战的基础。在第十五章中,探讨了分布式加速的安全影响,特别是在模型保护和数据隐私方面。通过理解这一进展,我们可以更好地欣赏人工智能硬件堆栈的每个组件,从计算单元到内存系统,如何适应以支持大规模机器学习工作负载。

人工智能系统的扩展遵循自然进展,从单个封装内的集成开始,通过芯片模块架构,扩展到服务器内的多 GPU 配置,扩展到分布式加速器集群,最终达到晶圆级集成。每种方法都在计算密度、通信开销和系统复杂性之间提供了独特的权衡。例如,芯片模块架构在封装内保持高速互连,而分布式系统为了巨大的并行性而牺牲了通信延迟。

理解这些扩展策略对于多个原因至关重要。首先,它提供了洞察不同硬件架构如何应对人工智能工作负载不断增长的计算需求。其次,它揭示了在扩展到单芯片执行之外时出现的根本挑战,例如管理芯片间通信和协调分布式计算。最后,它为后续讨论映射策略、编译技术和运行时系统如何演变以支持大规模高效执行奠定了基础。

进展始于芯片模块架构,这代表了多芯片扩展最紧密集成的形式。

基于芯片模块的架构

芯片模块 31 架构通过将大型设计划分为更小、模块化的晶圆,并在单个封装内互连来实现扩展,如图 11.9 图所示。

图片

图 11.9:芯片模块互连:现代人工智能加速器将大型设计划分为更小的芯片模块,并通过高带宽互连连接它们,从而超越单片晶圆的限制,提高制造良率。HBM 堆栈提供对数据的快速访问,这对于机器学习中常见的内存密集型工作负载至关重要。

现代 AI 加速器,如 AMD 的 Instinct MI300,通过将多个计算芯片和内存芯片集成在一起,并通过高速晶圆到晶圆互连连接,采用这种方法。这种模块化设计允许制造商绕过单片芯片的制造限制,同时仍然实现高密度计算。

然而,即使在单个封装内,扩展也并非没有挑战。随着更多芯片的集成,芯片间通信延迟、内存一致性 32 和热管理成为关键因素。与传统多芯片系统不同,基于芯片的设计必须仔细平衡多个晶圆上的延迟敏感型工作负载,同时避免引入过多的瓶颈。

多 GPU 系统

除了基于芯片的设计之外,AI 工作负载通常需要多个离散 GPU 协同工作。在多 GPU 系统中,每个加速器都有自己的专用内存和计算资源,但它们必须有效地共享数据和同步执行。

一个常见的例子是 NVIDIA DGX 系统,它通过 NVLink 或 PCIe 连接多个 GPU。这种架构使得工作负载可以在 GPU 之间分割,通常使用数据并行(每个 GPU 处理不同的数据批次)或模型并行(不同的 GPU 处理神经网络的不同部分)(Ben-Nun 和 Hoefler 2019)。这些并行化策略在第八章中进行了深入探讨。

如图 11.10 所示,NVSwitch 互连使得 GPU 之间能够实现高速通信,从而减少了分布式训练中的瓶颈。然而,增加 GPU 数量会引入基本的分布式协调挑战,这些挑战成为主导性能约束的因素。变换器训练的算术强度(0.5-2 FLOPS/byte)迫使 GPU 之间频繁同步梯度,在 GPT-3 规模模型中,AllReduce 操作必须聚合 1750 亿个参数。NVSwitch 提供 600 GB/s 的双向带宽,但当 8 个 H100 GPU 同时交换梯度时,即使这个大量的互连也变成了带宽限制,产生了 4.8 TB/s 的总需求,超过了可用容量。协调复杂性呈指数级增长——当两个 GPU 只需要一个通信通道时,八个 GPU 需要 28 个互连路径,而容错要求则规定冗余的通信模式。内存一致性协议进一步复杂化了协调,因为不同的 GPU 可能在不同的时间观察到权重更新,需要复杂的同步原语,这可能会在每个训练步骤中增加 10-50μs 的延迟——看似微小的延迟,但在百万次迭代运行中会累积成数小时的训练时间。

图

图 11.10:多 GPU 扩展:NVSwitch 互连使得 GPU 之间能够实现高带宽、低延迟的通信,克服了 PCIe 瓶颈,从而支持大型模型的分布式训练。增加 GPU 数量会引入保持内存一致性和在互连设备间高效调度工作负载的挑战。

通信开销和 Amdahl 定律分析

分布式 AI 训练的基本限制源于 Amdahl 定律,该定律量化了通信开销如何限制并行速度提升,无论可用的计算能力如何。对于分布式神经网络训练,梯度同步期间的通信开销创建了一个顺序瓶颈,即使在无限并行的情况下也限制了可扩展性。

分布式训练所能达到的最大加速受 Amdahl 定律的限制:加速=1(1P)+PN \text{加速} = \frac{1}{(1-P) + \frac{P}{N}} 其中 PP 是可以并行化的工作比例,NN 是处理器的数量。然而,对于 AI 训练,通信开销引入了额外的顺序时间:加速AI=1(1P)+PN+CN \text{加速}_{\text{AI}} = \frac{1}{(1-P) + \frac{P}{N} + \frac{C}{N}} 其中 CC 代表通信开销比例。

以训练一个 175 B 参数模型并使用 1000 个 H100 GPU 作为具体例子:

  • 每次迭代的计算时间:前向/反向传递 100 ms

  • 通信时间:在 1000 个 GPU 上对 175 B 参数(FP32 中的 700 GB)进行 AllReduce 操作

  • 可用带宽:每个 NVSwitch 链路 600 GB/s

  • 通信开销700GB600GB/s×log2(1000)11.6ms\frac{700\text{GB}}{600\text{GB/s}} \times \log_2(1000) \approx 11.6\text{ms}

即使只有 5%的训练需要通信(P = 0.95),最大加速比是:加速比=10.05+0.951000+0.1161008.3 \text{加速比} = \frac{1}{0.05 + \frac{0.95}{1000} + \frac{0.116}{100}} \approx 8.3\text{倍}

这说明了为什么在 100 个以上添加更多 GPU 对于大型模型训练来说,收益是递减的。

通信需求随着模型大小呈超线性增长,与参数数量呈线性增长。现代转换器模型在每个训练步骤中需要同步所有参数的梯度:

  • GPT-3(175 B 参数):每步 700 GB 的梯度交换

  • GPT-4(估计 1.8 T 参数):每步约 7 TB 的梯度交换

  • 未来 10 T 参数模型:每步约 40 TB 的梯度交换

即使拥有像 NVLink 4.0(1.8 TB/s)这样的高级互连,对于 10 T 参数模型的梯度同步也需要每步训练 22+秒,这使得没有像梯度压缩或异步更新这样的算法创新,分布式训练变得不切实际。

多 GPU 系统面临来自内存带宽竞争的额外瓶颈。当 8 个 H100 GPU 在梯度计算期间同时访问 HBM 时,由于内存控制器竞争和 NUMA 效应,每个 GPU 的有效内存带宽从 3.35 TB/s 下降到大约 2.1 TB/s。这种 37%的内存性能下降加剧了通信开销,进一步限制了可扩展性。

理解 Amdahl 定律指导优化策略:

  1. 梯度压缩:通过稀疏化和量化将通信量减少 10-100×\times

  2. 流水线并行性:通过重叠通信和计算来隐藏梯度同步延迟

  3. 模型并行性:将模型分区到设备上以减少梯度同步需求

  4. 异步更新:放宽一致性要求以消除同步障碍

这些技术修改了 Amdahl 方程中PPCC的有效值,以算法复杂性的代价实现了更好的扩展行为。

TPU Pods

随着模型和数据集的不断扩展,训练和推理工作负载必须超越单服务器配置。这种扩展需求导致了复杂分布式系统的发展,其中多个加速器通过网络进行通信。谷歌的 TPU Pods 代表了应对这一挑战的先驱方法,将数百个 TPU 互联以作为一个统一系统(Norman P. Jouppi 等人 2020)。

TPU Pods 的架构设计与传统多 GPU 系统有根本性的不同。虽然多 GPU 配置通常依赖于单台机器内的 NVLink 或 PCIe 连接,但 TPU Pods 使用高带宽的光纤链路在数据中心规模上互联加速器。这种设计实现了 2D 环面互连拓扑,使得加速器之间能够高效交换数据,同时最小化通信瓶颈,当工作负载跨节点扩展时。

该架构的有效性体现在其性能扩展能力上。如图 图 11.11 所示,当运行 ResNet-50 时,TPU Pod 的性能在从四分之一 Pod 配置到全 Pod 配置的过程中表现出近乎线性的扩展。当扩展到 1024 个芯片时,与 16-TPU 基线相比,系统实现了显著的 33.0×\times速度提升。这种扩展效率在较大配置中尤其值得注意,即使系统从 128 个芯片扩展到 1024 个芯片,性能仍然能够持续强劲地扩展。

图片

图 11.11:TPU Pods 的扩展效率:在 Pod 内增加 TPU 芯片的数量,在 ResNet-50 上保持近乎线性的性能提升,从 16 个芯片到 1024 个芯片实现了 33.0×\times的速度提升。这种高效的扩展提供了 2D 环面互连和高带宽光纤链路在最小化通信瓶颈方面的有效性,当工作负载在多个加速器之间扩展时。

然而,在整个数据中心内部分布 AI 工作负载引入了分布式协调挑战,这些挑战与单节点系统根本不同。2D 环面互连虽然提供了高分割带宽,但在训练需要跨所有 1,024 个 TPU 进行 AllReduce 操作的大型变压器模型时,会创建通信瓶颈。每个参数梯度必须通过环面网络进行多次跳跃,最坏情况下,需要 32 次跳跃才能在遥远的 TPU 之间进行通信,这会随着模型大小的增加而累积延迟惩罚。

分布式内存架构加剧了协调复杂性——与具有共享主机内存的多 GPU 系统不同,每个 TPU 节点维护独立的内存空间,迫使显式数据打包和同步协议。网络分区容错变得至关重要,因为光链路故障可以将 Pod 分割成孤立的岛屿,需要复杂的共识算法来保持训练一致性。

协调的能量成本也急剧增加:在 Pod 的光互连中移动数据比在单个 TPU 内部的片上通信消耗 1000×\times更多的能量,将分布式训练转化为计算并行性和通信效率之间的谨慎平衡,其中 AllReduce 带宽,而不是计算能力,决定了整体训练吞吐量。

晶圆级 AI

在人工智能扩展的前沿,晶圆级 33 集成代表了范式转变——放弃传统的多芯片架构,转而采用单一、庞大的 AI 处理器。这种方法不是将计算分配到离散的芯片上,而是将整个硅晶圆视为统一的计算布线,消除了芯片间通信的低效性。

如图 11.12 所示,Cerebras 的晶圆级引擎(WSE)处理器打破了 CPU、GPU 和 TPU 历史上晶体管缩放的趋势。虽然这些架构一直在指数轨迹上稳步增加晶体管数量,但 WSE 引入了一种全新的缩放范式,将数万亿个晶体管集成到单个晶圆上——远远超过了最先进的 GPU 和 TPU。随着 WSE-3 的推出,这一轨迹继续推进,将晶圆级 AI 推向前所未有的水平(Systems 2021a)。

图片

图 11.12:晶圆级集成:晶圆级 AI 处理器将数万亿个晶体管集成到单个晶圆上,提供超快的片上通信,以超越传统的多芯片架构并实现前所未有的性能水平。

晶圆级 AI 的基本优势是其超快的芯片内通信。与芯片、GPU 或 TPU Pod 不同,在这些设备中数据必须穿越不同设备之间的物理边界,晶圆级 AI 能够在其庞大的计算阵列中实现近乎瞬间的数据传输。这种架构极大地降低了通信延迟,解锁了传统多芯片系统无法达到的性能水平。

然而,实现这种程度的集成引入了巨大的工程挑战。当制造这种规模的处理器时,热量散失、容错性和制造良率成为主要约束。这些可持续性挑战,包括能源消耗和资源利用,在第十八章中进行了探讨。与通过动态重新路由工作负载来减轻故障的分布式 TPU 系统不同,晶圆级 AI 必须内置冗余机制以容忍硅片上的局部缺陷。成功解决这些挑战对于实现晶圆级计算作为 AI 加速下一个前沿的潜力至关重要。

AI 系统扩展轨迹

表 11.20 展示了 AI 加速的渐进式扩展,从单芯片处理器到越来越复杂的架构,如基于 Chiplet 的设计、多 GPU 系统、TPU Pod 和晶圆级 AI。这一演变过程中的每一步都引入了与数据移动、内存访问、互连效率和负载分配相关的新挑战。虽然 Chiplet 允许封装内的模块化扩展,但它们引入了延迟和内存一致性问题。多 GPU 系统依赖于高速互连如 NVLink,但面临同步和通信瓶颈。TPU Pod 通过在集群间分配工作负载进一步推动可扩展性,但它们必须应对互连拥塞和工作负载分区。在极端情况下,晶圆级 AI 将整个晶圆集成到一个单一的计算单元中,在热管理和容错性方面提出了独特的挑战。

表 11.20:AI 加速趋势:扩展 AI 系统在数据移动和内存访问方面提供了越来越多的挑战,推动了从 Chiplet 到晶圆级集成的架构创新。每种方法都引入了模块化、延迟和复杂性之间的独特权衡,需要仔细考虑互连效率和负载分配。

扩展方法 关键特性 挑战
Chiplet 封装内的模块化扩展 芯片间延迟,内存一致性
多 GPU 外部 GPU 互连(NVLink) 同步开销,通信瓶颈
TPU Pod 分布式加速器集群 互连拥塞,工作负载分区
晶圆级 AI 整个晶圆作为一个单一处理器 热量散失,容错性

计算和内存扩展变化

随着 AI 系统从单芯片加速器扩展到多芯片架构,计算和内存的基本挑战也在演变。在单个加速器中,执行主要优化局部性——确保计算被高效地映射到可用的处理元素,同时最小化内存访问延迟。然而,当 AI 系统扩展到单个芯片之外时,这些优化的范围显著扩大。计算现在必须分布到多个加速器,内存访问模式受到互连带宽和通信开销的限制。

多芯片执行映射

在单芯片 AI 加速器中,计算放置涉及将工作负载映射到 PE(处理元素)、向量单元和张量核心。映射策略旨在最大化数据局部性,确保计算访问附近的内存以减少昂贵的内存移动。

随着 AI 系统扩展到多芯片执行,计算放置必须考虑几个关键因素。工作负载需要在多个加速器之间分区,这需要显式协调执行顺序和依赖关系。这种划分对于与跨芯片通信相关的固有延迟至关重要,这与受益于共享片上内存的单芯片系统形成鲜明对比。因此,计算调度必须考虑互连以有效管理这些延迟。此外,在加速器之间实现负载平衡至关重要;任务的不均匀分布可能导致某些加速器利用率不足,而其他加速器则处于满负荷运行,最终阻碍整体系统性能。

例如,在多 GPU 训练中,计算映射必须确保每个 GPU 都有平衡的工作负载部分,同时最小化昂贵的跨 GPU 通信。同样,在 TPU Pods 中,映射策略必须与环状互连拓扑相一致,确保计算放置以最小化长距离数据传输。

因此,虽然单芯片系统中的计算放置是一个局部优化问题,但在多芯片架构中,它变成了一个全局优化挑战,其中执行效率取决于最小化芯片间通信和平衡工作负载分配。

分布式访问内存分配

单芯片 AI 加速器中的内存分配策略旨在通过使用片上缓存、SRAM 和 HBM 来最小化片外内存访问。如分块、数据重用和内核融合等技术确保计算有效地使用快速本地内存。

在多芯片 AI 系统中,每个加速器管理自己的本地内存,这需要在设备之间显式分配模型参数、激活和中间数据。与单芯片执行中数据只获取一次并重复使用不同,多芯片设置需要采取明确策略以最小化冗余数据传输,因为数据必须在加速器之间进行通信。此外,当多个加速器处理重叠数据时,共享数据的同步可能会引入显著的开销,这必须被仔细管理以确保高效执行。

例如,在多 GPU 深度学习中,跨 GPU 的梯度同步是一个内存密集型操作,必须优化以避免网络拥塞(Shallue 等人 2019)。在晶圆级 AI 中,内存分配必须考虑容错和冗余机制,确保晶圆上的缺陷区域不会干扰执行。

因此,虽然单芯片加速器中的内存分配侧重于本地缓存效率,但在多芯片架构中,必须在加速器之间显式协调以平衡内存带宽、最小化冗余传输并减少同步开销。

数据移动限制

在单芯片 AI 加速器中,数据移动优化主要集中在最小化芯片内内存访问延迟。诸如权重稳定性、输入稳定性和瓦片化等技术确保常用数据保持靠近执行单元,从而减少芯片外内存流量。

在多芯片架构中,数据移动已超越仅仅是芯片内部问题,并成为系统级的一个重大瓶颈。扩展引入了几个关键挑战,其中最重要的是芯片间带宽限制;如 PCIe、NVLink 和 TPU 互连等通信链路的速度远低于芯片内内存访问速度。此外,当加速器共享模型参数或中间计算时,由此产生的数据同步开销(包括延迟和竞争),可能会显著阻碍执行。最后,对于需要频繁数据交换的工作负载,如深度学习训练中的梯度更新,优化集体通信对于实现高效系统性能至关重要。

例如,在 TPU Pods 中,收缩执行模型确保数据以结构化模式移动,减少不必要的芯片外传输。在多 GPU 推理中,异步数据获取和计算与通信重叠等技术有助于减轻芯片间延迟。

因此,虽然单芯片系统中的数据移动优化侧重于缓存局部性和瓦片化,但在多芯片架构中,主要挑战是减少芯片间通信开销以最大化效率。

编译器和运行时适应性

随着 AI 加速扩展到单个芯片之外,编译器和运行时必须适应以管理多个加速器之间的计算放置、内存组织和执行调度。局部性、并行性和高效调度的基本原理仍然是基本的,但它们的实现需要分布式执行的新策略。

在扩展 AI 执行规模的主要挑战中,计算放置是一个关键问题。在单芯片加速器中,工作负载被映射到处理元素、向量单元和张量核心,重点在于最小化芯片内部数据移动并最大化并行执行。然而,在多芯片系统中,计算必须进行分层分区,工作负载不仅分布在芯片内部的各个核心之间,还分布在多个加速器之间。编译器通过实现互联感知调度,优化工作负载放置以最小化昂贵的芯片间通信来处理这个问题。

同样,随着扩展超出单个加速器,内存管理也随着扩展而发展。在单芯片系统中,本地缓存、HBM 重用和高效的分块策略确保频繁访问的数据保持靠近计算单元。然而,在多芯片系统中,每个加速器都有自己的独立内存,需要显式的内存分区和协调。编译器优化分布式执行的内存布局,而运行时引入数据预取和缓存机制以减少芯片间内存访问开销。

除了计算和内存之外,在扩展规模时,数据移动成为了一个主要的瓶颈。在单芯片加速器中,高效的芯片内部缓存和最小化的 DRAM 访问确保数据被高效地重用。然而,在多芯片系统中,通信感知执行变得至关重要,需要编译器生成执行计划,使计算与数据传输重叠。运行时处理芯片间同步,确保工作负载不会被等待从远程加速器到达的数据所阻塞。

最后,执行调度必须扩展以实现全局协调。在单芯片 AI 执行中,调度主要关注并行性和最大化加速器内的计算占用率。然而,在多芯片系统中,调度必须在考虑互联带宽和同步延迟的同时平衡加速器之间的工作负载分布。运行时通过实现自适应调度策略来管理这种复杂性,这些策略根据系统状态和网络拥塞动态调整执行计划。

表 11.21 总结了这些关键适应措施,突出了编译器和运行时如何扩展其功能以有效地支持多芯片 AI 执行。

因此,尽管 AI 加速的基本原理保持不变,但编译器和运行时必须扩展其功能以在分布式系统中高效运行。下一节将探讨映射策略如何演变以进一步优化多芯片 AI 执行。

表 11.21:多芯片适应:在多个加速器上高效执行 AI 需要协调调整计算放置、内存管理和调度,以平衡工作负载分布并最小化通信开销。编译器和运行时扩展其功能以动态适应系统状态和网络拥塞,从而实现可扩展和性能良好的多芯片 AI 系统。

方面 单芯片 AI 加速器 多芯片 AI 系统及编译器/运行时如何适应
计算放置 本地 PE、张量核心、向量单元 分层映射、互联感知调度
内存管理 缓存、HBM 重用、本地分块 分布式分配、预取、缓存
数据移动 芯片内重用,最小 DRAM 访问 通信感知执行,重叠传输
执行调度 并行性,计算占用率 全局调度,互联感知平衡

执行模型适应

当 AI 加速器扩展到单芯片之外时,执行模型必须演变以应对分布式计算、内存分区和芯片间通信引入的复杂性。在单芯片加速器中,执行针对本地处理元素进行优化,采用平衡并行性、局部性和数据重用的调度策略。然而,在多芯片 AI 系统中,现在必须在多个加速器之间协调执行,这引入了新的工作负载调度、内存一致性和互联感知执行挑战。

本节探讨了随着 AI 加速的扩展,执行模型如何变化,重点关注多芯片系统中的调度、内存协调和运行时管理。

跨加速器调度

在单芯片 AI 加速器中,执行调度主要针对优化处理器内部的并行性。这涉及到通过采用旨在增强数据局部性和资源利用率的技巧,确保工作负载有效地映射到张量核心、向量单元和特殊功能单元。例如,静态调度使用预先确定的执行顺序,该顺序经过精心优化以适应局部性和重用,而动态调度则实时适应工作负载需求的变化。此外,流水线执行将计算划分为阶段,通过保持操作的连续流动来最大化硬件利用率。

相比之下,多芯片架构中的调度必须解决芯片间依赖带来的额外挑战。在这样的系统中,工作负载分区涉及将任务分配到各种加速器,以便每个加速器都获得最佳的工作负载份额,同时最大限度地减少由过多通信造成的开销。感知互连的调度对于将执行时间与芯片间带宽约束对齐至关重要,从而防止性能停滞。延迟隐藏技术也发挥着关键作用,因为它们使计算与通信重叠,有效地减少了等待时间。

例如,在多 GPU 推理场景中,执行调度以允许数据与计算同时预取,从而减轻内存停滞。同样,TPU Pods 利用 systolic array 模型将执行调度与数据流紧密耦合,确保每个 TPU 核心在需要时精确地接收到所需数据。因此,虽然单芯片执行调度主要关注最大化内部并行性,但多芯片系统需要更全面的方法,该方法明确管理通信开销并同步加速器之间的工作负载分配。

跨加速器协调

在单芯片 AI 加速器中,内存协调通过复杂的本地缓存策略来管理,这些策略将频繁使用的数据保留在执行单元附近。采用如分块、内核融合和数据重用等技术来减少对较慢的内存层次结构的依赖,从而提高性能并降低延迟。

相比之下,多芯片架构提出了分布式内存协调挑战,这需要更谨慎的管理。在这样的系统中,每个加速器都拥有自己的独立内存,必须通过显式的内存分区来组织,以最小化跨芯片数据访问。此外,确保加速器之间共享数据的一致性和同步对于保持计算正确性至关重要。还必须实施有效的通信机制,以便以限制与同步延迟相关的开销的方式进行数据传输。

例如,在分布式深度学习训练中,模型参数必须使用全归约等方法在多个 GPU 之间同步,这些方法可以在加速器之间聚合梯度同时减少通信延迟。在晶圆级 AI 中,内存协调必须进一步解决容错执行问题,确保损坏区域不会影响整体系统性能。因此,虽然单芯片系统中的内存协调主要关注缓存优化,但多芯片架构需要管理分布式内存访问、同步和通信以实现高效执行。

跨加速器执行管理

单芯片人工智能加速器中的执行由处理工作负载调度、内存分配和硬件执行的 AI 运行时管理。这些运行时在内核级别优化执行,确保计算在可用资源内高效执行。

在多芯片人工智能系统中,运行时必须包含分布式执行编排的策略。这种方法确保计算和内存访问在多个加速器之间无缝协调,从而实现硬件资源的有效利用并最小化与数据传输相关的瓶颈。

这些系统需要强大的跨芯片工作负载同步机制。仔细管理依赖关系和加速器之间的及时协调对于防止由于芯片间通信延迟而可能出现的执行停滞至关重要。这种同步对于保持计算流程至关重要,尤其是在延迟可能显著影响整体性能的环境中。

最后,自适应执行模型在当代多芯片架构中扮演着关键角色。这些模型根据当前硬件可用性和通信约束动态调整执行计划,确保系统能够响应变化条件并在实时中优化性能。这些策略共同提供了一个有弹性的框架,用于管理分布式人工智能执行中的复杂性。

例如,在谷歌的 TPU Pods 中,TPU 运行时负责在多个 TPU 核心之间调度计算,确保工作负载以最小化通信瓶颈的方式执行。在 PyTorch 和 TensorFlow 等多 GPU 框架中,运行时执行必须同步 GPU 之间的操作,确保数据高效传输的同时保持执行顺序。

因此,虽然单芯片运行时专注于优化单个处理器内的执行,但多芯片运行时必须处理整个系统的执行,平衡计算、内存和互连性能。

计算放置自适应

随着人工智能系统扩展到单芯片执行之外,计算放置必须适应考虑芯片间工作负载分布和互连效率。在单芯片加速器中,编译器通过将工作负载映射到张量核心、向量单元和 PE 来优化放置,确保最大并行性同时最小化芯片内数据移动。然而,在多芯片系统中,放置策略必须解决互连带宽约束、同步延迟以及多个加速器之间的分层工作负载分区问题。

表 11.22 突出了这些适应措施。为了减少昂贵的跨芯片通信,编译器现在实现感知互联的工作负载分区,根据通信成本战略性地将计算分配给加速器。例如,在多 GPU 训练中,编译器优化放置以最小化 NVLink 或 PCIe 流量,而 TPU Pods 利用环状互联拓扑结构来增强数据交换。

表 11.22:计算放置策略:多芯片 AI 系统需要分层工作负载映射以最小化通信开销;编译器通过考虑互联带宽和延迟,在分配计算到加速器时采用单芯片优化技术。此表对比了单芯片系统中的计算放置(本地到处理单元)与多芯片系统,其中放置策略优先考虑加速器之间高效的数据交换。

方面 单芯片 AI 加速器 多芯片 AI 系统及编译器/运行时的适应方式
计算放置 本地 PE、张量核心、向量单元 分层映射,感知互联的调度
工作负载分布 单芯片内优化 横跨加速器分区,最小化芯片间通信
同步 在本地执行单元内管理 运行时动态平衡工作负载,调整执行计划

运行时通过动态管理执行工作负载,实时调整放置策略以平衡加速器之间的负载来补充这一点。与假设固定硬件拓扑的静态编译不同,AI 运行时持续监控系统条件,并根据需要迁移任务以防止瓶颈。这确保了即使在工作负载需求波动或硬件可用性变化的环境中也能高效执行。

因此,大规模计算放置建立在本地执行优化之上,同时引入了芯片间协调、通信感知执行和动态负载平衡的新挑战——这些挑战扩展到内存层次结构如何适应以支持多芯片架构上的高效执行。

探索多芯片 AI 的复杂性

从单芯片加速器到多芯片系统再到晶圆级集成,AI 硬件的演变突显了高效执行大规模机器学习工作负载的复杂性不断增加。扩展 AI 系统引入了计算放置、内存管理和数据移动的新挑战。虽然 AI 加速的基本原理保持一致,但它们的实现必须适应分布式执行、互联带宽限制和同步开销的限制。

多芯片人工智能架构在解决现代机器学习模型的计算需求方面迈出了重要一步。通过在多个加速器之间分配工作负载,这些系统提供了更高的性能、更大的内存容量和可扩展性。然而,实现这些好处需要仔细考虑如何将计算映射到硬件,如何划分和访问内存,以及如何在分布式系统中调度执行。

尽管我们已经概述了多芯片人工智能加速在超越单一系统时的关键概念和挑战,但仍有许多内容值得进一步探索。随着人工智能模型在规模和复杂性上的持续增长,需要新的架构创新、映射策略和运行时优化来维持高效的执行。这些新兴趋势和未来方向在该领域正迅速演变。人工智能硬件和软件的持续发展反映了计算领域的一个更广泛趋势,即针对新兴工作负载的独特需求,专业化和特定领域架构正变得越来越重要。

理解多芯片人工智能加速所涉及的原则和权衡,使机器学习工程师和系统设计师能够就如何最佳部署和优化他们的模型做出明智的决定。无论是在大规模语言模型 TPU 集群上训练还是将计算机视觉应用部署在多 GPU 系统上,将计算高效映射到硬件的能力将继续是实现人工智能全部潜力的关键因素。

异构 SoC 人工智能加速

在前几节中考察的多芯片架构主要关注最大化数据中心工作负载的计算吞吐量,其中电源预算扩展到千瓦级别,冷却基础设施支持机架级部署。然而,在移动和边缘环境中部署人工智能系统时,建立的硬件加速原则——专用计算单元、内存层次优化和工作负载映射策略——必须做出巨大调整。智能手机在 2 到 5 瓦特的电源预算内运行,自动驾驶汽车需要确定性的实时保证,而物联网传感器必须在电池供电下工作数年。这些限制需要异构系统级芯片(SoC)架构,在单个芯片内协调多个专用处理器,同时满足与数据中心部署根本不同的严格电源、热和延迟要求。

移动人工智能革命从根本上改变了我们对人工智能加速的看法,从同构数据中心架构转向异构片上系统(SoC)设计,这种设计协调多个专用处理器。现代智能手机、汽车系统和物联网设备在单个芯片内集成了 CPU 核心、GPU 着色器、数字信号处理器(DSP)和专用神经网络处理器(NPU),需要复杂的编排才能在严格的功率和热约束下实现最佳性能。

移动 SoC 架构演变

高通 Snapdragon AI Engine 是移动人工智能异构计算的典范,它在一个共享的内存层次结构中协调 Kryo CPU 核心、Adreno GPU、Hexagon DSP 和专用 NPU34。Snapdragon 8 Gen 3 通过智能的工作负载分配实现了 73 TOPS,计算机视觉内核在 GPU 的并行着色器上执行,音频处理利用 DSP 的专用算术单元,而变压器注意力机制利用 NPU 优化的矩阵引擎。这种协调需要毫秒级的调度精度以满足实时约束,同时管理热管理限制和电池寿命优化。

虽然高通的方法强调处理器多样化,但苹果的垂直整合策略展示了紧密的软硬件协同设计如何实现更复杂的异构执行。M2 芯片的 16 核心神经网络引擎(15.8 TOPS)通过统一的内存架构与 10 核心 GPU 和 8 核心 CPU 协调,消除了数据复制的开销。神经网络引擎的专用矩阵乘法单元处理变压器层,GPU 的 Metal 性能着色器加速卷积操作,而 CPU 管理控制流和动态层选择。这种精细的协调实现了实时语言翻译和设备上图像生成,同时保持毫秒级响应时间。

除了高通和苹果的垂直整合解决方案之外,ARM 的知识产权许可模式提供了一种根本不同的方法,使 SoC 设计者能够根据目标应用定制处理器组合。Mali-G78 GPU 的 24 个核心可以与 Ethos-N78 NPU 配对,以实现平衡的通用和人工智能加速,而 Cortex-M55 微控制器则集成了 Ethos-U55 微 NPU,用于超低功耗的边缘应用。这种模块化灵活性允许汽车 SoC 强调确定性实时处理,而智能手机 SoC 则优化交互性能和电池效率。

动态工作负载分配策略

在异构 SoC 上可用的多个专用处理器中,关键挑战成为智能地在这些资源之间分配神经网络操作,以最大化性能同时尊重功率和延迟约束。

现代神经网络需要根据操作特性和当前系统状态在异构处理器之间进行智能分区。具有常规数据访问模式的卷积层通常在 GPU 着色器核心上高效执行,而具有不规则稀疏模式的完全连接层可能在具有大缓存的通用 CPU 核心上表现更好。在序列较长时,变压器中的注意力机制受益于 NPU 矩阵引擎,但当序列长度较小时,由于 NPU 设置开销,它们可能在 CPU 上执行得更高效。

不同于静态的操作到处理器的映射,异构 SoC 根据多个约束条件实现动态处理器选择:

  • 功率预算:在电池操作期间,系统可能会将计算路由到低功耗 DSP 核心,而不是高性能 GPU 核心

  • 热状态:当接近热限制时,工作负载会从功耗较高的 NPU 转移到更高效的 CPU 执行

  • 延迟要求:对安全至关重要的汽车应用优先考虑确定性的 CPU 执行,而不是可能更快但可变的 NPU 处理

  • 并发工作负载干扰:多个 AI 应用可能需要在可用的处理器之间进行负载平衡,以保持服务质量

在处理器选择挑战的基础上,共享内存架构在多个处理器同时访问 LPDDR 时需要复杂的仲裁。Snapdragon 8 Gen 3 的内存控制器实现了基于优先级的调度,其中相机处理获得比后台 AI 任务更高的优先级,确保实时视频处理,同时后台神经网络调整它们的执行模式以适应可用的内存带宽。这种仲裁在内存密集型操作(如大型语言模型推理)期间变得至关重要,在这些操作中,从 DRAM 流出的参数必须在处理器之间仔细协调。

功率和热管理

移动 AI 工作负载必须在严格的功率预算和热 envelopes 内运行,同时保持高性能——这些约束需要在异构处理器之间进行复杂的协调。

异构 SoC 在多个处理器之间实现协调的动态电压频率调整(DVFS),以优化功率-性能包络。当一个处理器增加频率以满足延迟需求时,系统可能会降低其他处理器的电压以维持总功率预算。在 AI 工作负载中,计算阶段可能在处理器之间快速切换,这种协调变得复杂——系统必须预测即将到来的工作负载转换,以便预先调整工作点,同时避免电压/频率振荡,这些振荡会降低效率。

当仅 DVFS 无法维持功率包络时,移动 SoC 通过智能任务迁移而不是简单的频率降低来实现热管理。当 NPU 在密集的神经网络处理期间接近热极限时,运行时系统可以将层迁移到 GPU 或 CPU,同时保持计算吞吐量。这种方法在热事件期间保持性能,尽管它需要复杂的任务特征化来预测不同处理器的执行时间和功耗。

除了实时电源和热管理之外,移动 AI 系统还必须根据电池状态和充电状态调整其计算策略。在低电量条件下,系统可能从高精度模型切换到高效近似,将工作负载从能耗高的 NPU 迁移到节能的 DSP,或降低推理频率同时保持应用程序响应性。相反,在充电期间,系统可以启用更高性能的模型并增加处理频率,以提供增强的用户体验。

汽车异构 AI 系统

汽车应用引入了独特的异构计算挑战,这些挑战结合了移动风格的电源效率、硬实时保证和功能安全要求——这种组合需要根本不同的架构方法。

汽车 SoC 必须保证安全关键功能的确定性推理延迟,同时支持高级驾驶辅助系统(ADAS)。Snapdragon Ride 平台协调跨安全域的多个 AI 加速器——冗余处理元素确保功能安全合规性,而高性能加速器处理感知、规划和控制算法。这种架构需要在安全关键功能和便利功能之间实现时间隔离,通过硬件分区和时间触发的调度来实现。

当考虑到现代车辆集成多个 AI 启用 SoC 以处理不同领域时,这些安全要求变得更加复杂——视觉处理 SoC 处理基于摄像头的感知,雷达处理 SoC 管理射频传感器数据,而中央计算平台协调高级决策。这些分布式系统必须在传感器模态之间保持时间一致性,具有微秒级精度的定时,需要专门的跨 SoC 通信协议和分布式同步机制。

车辆到一切(V2X)通信超越了车辆内部传感器的范围,它增加了一层异构处理层,其中 AI 算法必须协调本地传感器处理与从其他车辆和基础设施接收到的信息。这需要超低延迟的处理链,其中 5G 调制解调器、AI 加速器和控制系统在毫秒级截止时间内运行,同时保持功能安全要求。

软件堆栈挑战

异构 SoC 的架构复杂性为软件开发带来了重大挑战,这些挑战跨越编程模型、内存管理和运行时优化。

编程异构 SoC 需要框架来抽象处理器差异,同时暴露性能关键优化机会。OpenCL 和 Vulkan 提供跨处理器执行,但要实现最佳性能,需要针对特定处理器的优化,这会复杂化可移植开发。现代 ML 框架如 TensorFlow Lite 和 PyTorch Mobile 实现了自动处理器选择,但开发者仍然需要理解异构执行模式以实现最佳结果。

进一步复杂化编程挑战,具有共享内存架构的异构 SoC 需要考虑处理器特定缓存行为、内存访问模式和一致性要求的复杂内存管理。CPU 缓存可能会干扰 GPU 内存访问模式,而 NPU 直接内存访问(DMA)操作必须与 CPU 缓存操作同步,以保持数据一致性。

为了解决这些维度上手动优化的复杂性,高级异构 SoC 实现了基于机器学习的运行时优化,它从执行模式中学习以改进处理器选择、热管理和电源优化。这些系统收集关于工作负载特性、处理器利用率和功耗的遥测数据,以构建预测新工作负载最佳执行策略的模型。

这种异构 AI 加速方法代表了计算的未来,其中没有单个处理器架构可以最优地处理现代 AI 应用中的各种计算模式。理解这些协调挑战对于开发高效移动 AI 系统至关重要,这些系统能够提供高性能,同时满足边缘部署场景严格的电源、热和实时约束。

然而,这些异构系统的复杂性为误解和次优设计决策创造了众多机会。以下谬误和陷阱突出了可能破坏加速策略的常见误解。

谬误和陷阱

硬件加速涉及专用架构、软件堆栈和工作负载特性之间的复杂交互,这为误解最佳部署策略创造了重大机会。与 AI 加速器相关联的令人印象深刻的性能数字往往掩盖了决定不同部署场景中实际效果的重要约束和权衡。

谬误: 更专业的硬件总是比通用替代品提供更好的性能。

这种信念假设专用加速器自动优于通用处理器处理所有 AI 工作负载。专用硬件仅在工作负载与架构假设和优化目标匹配时才能达到峰值性能。具有不规则内存访问模式、小批量大小或动态计算图的模型,在灵活的通用处理器上可能比为密集、规则计算设计的专用加速器表现更好。数据移动、格式转换和同步的开销可能会消除专用计算的好处。有效的硬件选择需要将工作负载特征与架构优势相匹配,而不是假设专业化总是获胜。

陷阱: 在选择加速策略时忽略内存带宽限制。

许多从业者关注计算吞吐量指标,而没有考虑到内存带宽约束,这些约束通常限制了实际性能。具有令人印象深刻的计算能力的 AI 加速器可能会因为内存带宽不足而严重瓶颈,导致硬件利用率低下。计算强度与内存访问需求之间的比率决定了加速器能否达到其理论性能。这种疏忽导致昂贵的硬件部署未能实现预期的性能提升,因为工作负载是内存受限而不是计算受限。

谬误: 硬件加速的好处与额外加速器的数量成线性增长。

这种误解驱使团队期望在系统中添加更多加速器时能够获得成比例的性能提升。多加速器配置引入了通信开销、同步成本和负载平衡挑战,这些都可能严重限制扩展效率。小型模型可能无法提供足够的并行工作来有效利用多个加速器,而大型模型可能受到设备间通信带宽的限制。分布式训练和推理面临梯度聚合、模型分区和协调开销等额外挑战,这些挑战创造了非线性扩展关系。

陷阱: 不考虑长期可移植性和灵活性而进行的供应商特定优化。

组织通常仅针对特定的硬件供应商进行优化,以实现最大性能,而不考虑系统灵活性和未来迁移的影响。与特定供应商库、定制内核和专有优化工具的深度集成,创造了锁定效应,使得硬件升级、供应商更换或多供应商部署变得复杂。虽然特定供应商的优化可以提供显著的性能优势,但它们应该与系统可移植性和适应不断变化的硬件景观的能力相平衡。保持一定程度的硬件抽象可以保持战略灵活性,同时仍然捕捉到大多数性能优势。

摘要

硬件加速已成为将机器学习从学术好奇心转变为实际现实的关键推动者,从根本上改变了我们设计计算系统和在其上运行的算法的方式。从通用处理器到专用人工智能加速器的演变,不仅仅是渐进式的改进——它反映了一种范式转变,即向特定领域计算转变,在这种计算中,硬件和软件是协同设计的,以优化特定的计算模式。从 CPU 到 GPU,再到专门的 TPU、NPU 和晶圆级系统的发展历程,展示了理解工作负载特征如何推动架构创新,通过针对性的专业化,创造了数量级性能提升的机会。

人工智能加速的技术挑战跨越了计算堆栈的多个层次,从低级内存层次结构优化到高级编译器转换和运行时编排。内存带宽限制创造了基本瓶颈,需要像数据分块、内核融合和层次感知调度这样的复杂技术来克服。将神经网络计算映射到硬件涉及在不同数据流模式、内存分配策略和执行调度方法之间进行复杂的权衡,这些方法必须在计算效率与资源利用之间取得平衡。

在这些基础概念的基础上,多芯片和分布式加速系统的出现引入了通信开销、内存一致性和工作负载分区等方面的额外复杂性,这些都需要仔细的系统级优化。

关键要点

  • 专用人工智能加速器通过针对张量操作和数据流模式优化的特定领域架构实现性能提升。

  • 内存层次结构管理通常是人工智能加速的主要瓶颈,需要复杂的数据移动优化策略。

  • 硬件-软件协同设计通过将算法特征与架构能力对齐,实现了数量级的改进。

  • 多芯片扩展引入了分布式计算挑战,需要新的通信、同步和资源管理方法。

这里确立的硬件加速原则为理解基准测试方法如何评估加速器性能以及部署策略如何考虑硬件约束和能力提供了基础。随着人工智能模型在复杂性和计算需求上的持续增长,有效地利用专用硬件的能力对于实际系统部署变得越来越关键,它影响着从能效和成本优化到跨不同应用领域实时推理和大规模训练的可行性等各个方面。


基准测试 AI

DALL·E 3 提示:一张背景为科技主题的讲台照片。讲台的每一层都放置着设计复杂的 AI 芯片。最顶层的芯片上挂着金牌,第二层芯片上挂着银牌,第三层芯片上挂着铜牌。背景中显著地展示着“AI 奥运会”的横幅。

目的

为什么系统测量是机器学习系统中工程进步的基础,以及标准化基准测试如何促进这一新兴领域的科学进步?

工程学科通过测量和比较来进步,将基准测试确立为机器学习系统开发的基本要素。没有系统性的评估框架,优化主张缺乏科学严谨性,硬件投资缺乏证据,系统改进无法得到验证或复制。基准测试将主观印象转化为客观数据,使工程师能够区分真正的进步和实现上的瑕疵。这种测量学科是必不可少的,因为机器学习系统涉及算法、硬件和数据之间的复杂交互,这些交互难以进行直观的性能预测。标准化的基准测试建立了共享的基线,允许跨研究小组进行有意义的比较,通过可重复的结果实现累积进步,并为工程决策提供必要的经验基础。理解基准测试原则能够推动系统评估,促进持续改进,并将机器学习系统工程确立为严格的科学学科。

学习目标

  • 分析机器学习基准测试的演变,并解释基准测试游戏教训如何影响当前设计

  • 区分机器学习基准测试的三个维度(算法、系统和数据),并评估每个维度对全面系统评估的贡献

  • 比较训练和推理基准测试方法,确定适用于机器学习生命周期每个阶段的特定指标和评估协议

  • 应用 MLPerf 基准测试标准来评估解决方案并指导优化决策

  • 设计统计上严格的实验方案,考虑到机器学习系统的可变性,包括适当的样本量和置信区间报告

  • 批判现有的基准测试结果,以识别常见的谬误和陷阱,区分基准性能和现实世界部署的有效性

  • 实施生产监控策略,将基准测试原则扩展到操作环境,包括 A/B 测试和持续模型验证

  • 在部署优化中评估性能权衡,包括准确性、延迟、能量和公平性

机器学习基准测试框架

对机器学习系统进行系统评估是性能工程更广泛学科中的一个关键方法论挑战。虽然前几章已经建立了全面的优化框架,特别是硬件加速策略(第十一章),但这些方法的验证需要严格的测量方法,这些方法超出了传统的计算基准测试。

考虑工程师在评估竞争性 AI 硬件解决方案时所面临的挑战。供应商可能在精心选择的基准测试中展示出令人印象深刻的性能提升,但在生产工作负载中却无法实现类似的改进。没有全面的评估框架,区分真正的进步和实现上的伪象几乎是不可能的。这个挑战说明了为什么系统测量是机器学习系统中工程进步的基础。

本章探讨了基准测试作为一种基本的实证学科,它能够对机器学习系统在多种操作环境下的性能进行量化评估。基准测试为基于证据的工程决策提供了方法论基础,提供了系统性的评估框架,使从业者能够比较竞争方法、验证优化策略,并在研究和生产环境中确保可重复的性能声明。

机器学习基准测试提出了独特的挑战,使其与传统系统评估区分开来。机器学习算法的概率性质引入了固有的性能可变性,传统的确定性基准测试无法充分表征。机器学习系统的性能表现出对数据特征、模型架构和计算资源的复杂依赖,从而形成了需要专门测量方法的多维评估空间。

当代机器学习系统需要能够适应多个、通常是相互竞争的性能目标的评估框架。除了计算效率之外,这些系统必须在预测准确性、收敛性、能耗、公平性和鲁棒性等多个维度上进行评估。这种多目标评估范式需要复杂的基准测试方法,这些方法能够描述权衡并指导在特定操作约束下的系统设计决策。

该领域已经通过在三个核心维度上运行的全面评估方法来应对这些挑战:

机器学习基准测试 是对机器学习系统在三个维度上进行系统评估:计算性能算法准确性数据质量,从而实现系统能力的客观比较和可重复评估。

本章系统地考察了机器学习基准测试方法,从计算评估框架的历史演变及其适应概率系统独特需求开始。我们分析了标准化评估框架,如 MLPerf,它在不同的硬件架构和实现策略之间建立了比较基准。随后的讨论考察了训练评估和推理评估之间的基本区别,探讨了表征它们独特的计算配置文件和操作需求所需的专用指标和方法。

分析扩展到专门的评估环境,包括资源受限的移动和边缘部署场景,这些场景提出了独特的测量挑战。我们通过调查生产监控方法来结束讨论,这些方法将基准测试原则扩展到受控实验环境之外的动态操作环境。这种全面的处理展示了严格的测量如何验证通过前几章中检查的优化技术和硬件加速策略实现的性能改进,同时为第 IV 部分中探讨的部署策略建立了经验基础。

历史背景

从简单的性能指标到全面的机器学习基准测试的演变,揭示了三个关键的方法论转变,每个转变都针对了先前评估范例的失败,这些失败直接影响了我们当前的方法。

性能基准

从合成操作到代表性工作负载的演变出现在早期基准测试游戏破坏评估有效性的情况下。像 Whetstone(1964)和 LINPACK(1979)这样的主机基准测试测量了孤立的操作,使供应商能够针对狭窄的测试进行优化,而不是实际性能。SPEC CPU(1989)开创了使用真实应用程序工作负载的先河,以确保评估反映了实际的部署场景。这一经验直接塑造了机器学习基准测试,因为第十章中的优化声明需要在代表性任务上进行验证。MLPerf 包括 ResNet-50 和 Bert 等真实模型确保基准测试能够捕捉部署复杂性,而不是理想化的测试案例。

随着部署环境多样化,基准测试从单维度演变为多目标评估。图形基准测试在速度的同时衡量质量;移动基准测试在性能的同时评估电池寿命。第九章中的多目标挑战,平衡精度、延迟和能耗,直接体现在现代机器学习评估中,其中没有单一指标能够捕捉部署的可行性。

当分布式计算揭示组件优化无法预测系统性能时,从独立组件到集成系统的转变发生了。机器学习训练不仅依赖于加速器计算(第十一章),还依赖于数据管道、梯度同步和存储吞吐量。MLPerf 评估完整的工作流程,认识到性能来自于组件的交互。

这些经验教训在 MLPerf (2018)中达到高潮,它综合了代表性工作负载、多目标评估和集成测量,同时解决机器学习特有的挑战(Ranganathan and Hölzle 2024)。

能源基准

当计算超越了具有无限电力预算的主机,多目标评估范例自然扩展到能源效率。移动设备需要电池寿命优化,而仓库规模系统面临与硬件费用相媲美的能源成本。这种转变将能源确立为与性能并列的一级指标,催生了为服务器设计的 SPEC Power1、为超级计算机设计的 Green5002 以及为消费系统设计的 ENERGY STAR3 基准。

尽管取得了这些进步,但在计算环境中考虑多样化的工作负载模式和系统配置时,电力基准测试仍然面临持续的挑战。最近的发展,例如MLPerf Power基准,引入了专门的方法来衡量机器学习工作负载的能源影响,直接应对了在人工智能驱动计算中能源效率日益增长的重要性。

能源基准测试不仅超越了硬件能源测量。算法能源优化代表了现代人工智能基准测试的一个同样关键的维度,其中能源高效的算法通过计算减少而不是纯粹硬件增强来实现性能提升。神经网络剪枝通过消除不必要的计算来减少能源消耗:剪枝后的 BERT 模型可以在 10 倍更少的参数下达到原始任务 90%的准确率,提供 4-8 倍的推理速度提升和 8-12 倍的能源减少(取决于剪枝方法和硬件 Han, Mao, and Dally 2015b)。量化技术通过减少精度要求实现类似收益:INT8 量化通常提供 4 倍的推理速度提升和 4 倍的能源减少,同时保持 99%以上的准确率保留(Jacob et al. 2018b)。

知识蒸馏提供了另一种算法能量优化途径,其中较小的“学生”模型从较大的“教师”模型中学习。MobileNet 架构展示了这一原则,在保持类似精度的同时,通过深度可分离卷积和宽度乘数实现了比 ResNet 高 10 倍的能量降低(A. G. Howard et al. 2017)。模型压缩技术共同使得在严格的能量约束下部署复杂的 AI 能力成为可能,这对于移动和边缘计算场景是必不可少的。

能源感知基准必须评估的不仅是硬件功耗,还包括算法效率指标,包括通过稀疏性减少 FLOP、通过压缩减少内存访问以及量化带来的计算能量效益。这些算法优化通常比单纯的硬件改进实现更大的节能效果,为能源基准框架提供了关键维度。

随着人工智能和边缘计算的演进,功耗基准将推动节能硬件和软件的创新。这直接关联到第十八章(ch024.xhtml#sec-sustainable-ai)中讨论的可持续人工智能实践,其中能源感知设计原则指导了负责任的人工智能开发。

领域特定基准

计算多样化需要针对特定领域需求定制基准,这些基准能够捕捉到通用指标无法涵盖的特定要求。领域特定基准解决以下三个类别的专业化问题:

部署约束塑造核心指标优先级。数据中心工作负载在千瓦级功率预算下优化吞吐量,而移动 AI 在 2-5W 的热量范围内运行,物联网设备需要毫瓦级的操作。这些约束源于第九章(ch015.xhtml#sec-efficient-ai)中的效率原则,决定了基准是优先考虑总吞吐量还是每操作的能量。

应用需求在性能之外还强加了功能和监管约束。医疗 AI 需要可解释性指标与准确性;金融系统需要微秒级延迟并符合审计合规性;自动驾驶汽车需要关键安全性的可靠性(ASIL-D:<10^-8 故障/小时)。这些要求与第十七章(ch023.xhtml#sec-responsible-ai)中讨论的责任人工智能原则相联系,将评估扩展到传统的性能指标之外。

运行条件决定了现实世界的可行性。自动驾驶汽车面临-40°C 至+85°C 的温度和退化的传感器输入;数据中心处理数百万并发请求并经历网络分区;工业物联网设备在没有维护的情况下持续部署数年。第十一章(ch017.xhtml#sec-ai-acceleration)中提到的硬件能力只有在这些条件下得到验证时才能提供价值。

机器学习是向特定领域评估转变的一个突出例子。传统的 CPU 和 GPU 基准测试不足以评估涉及计算、内存带宽和数据移动模式之间复杂交互的机器学习工作负载。MLPerf 为机器学习模型在这三个类别中实现了性能测量的标准化:MLPerf Training 通过多节点扩展基准测试解决数据中心部署限制,MLPerf Inference 评估服务器到边缘部署中的延迟关键应用需求,而 MLPerf Tiny 评估微控制器部署的超约束操作条件。这种分层结构反映了我们的三类框架在机器学习特定评估需求上的系统应用。

特定领域基准测试的强大之处在于它们能够捕捉到一般基准测试忽视的这些专业需求。通过系统地解决部署限制、应用需求和操作条件,这些基准测试提供了推动硬件和软件针对性优化的见解,同时确保改进能够转化为实际部署的成功,而不仅仅是优化狭窄的实验室条件。

从通用计算基准测试到能源感知测量再到特定领域评估框架的历史进步,为理解当代机器学习基准测试挑战提供了基础。学到的经验(代表性工作负载超过合成测试、多目标超过单一指标,以及集成系统超过独立组件)直接塑造了我们今天如何接近人工智能系统评估。

机器学习基准

历史演变的最终结果是机器学习基准测试,其复杂性超过了所有之前的计算领域。与具有确定性行为的传统工作负载不同,ML 系统通过其概率性质引入了固有的不确定性。CPU 基准测试在相同的输入下产生相同的结果;ML 模型的性能会随着训练数据、初始化甚至操作顺序而变化。这种固有的可变性,加上几十年来基准测试的经验教训,需要我们三维评估框架。

建立在前面章节的框架和优化技术之上,机器学习基准测试必须评估的不仅仅是计算效率,还包括算法、硬件和数据之间复杂的相互作用。基准测试的演变在机器学习领域达到了目前的顶峰,我们建立的三维框架反映了数十年的计算测量进化。早期的机器学习基准测试主要关注算法性能,衡量模型执行特定任务的能力(Lecun 等人 1998)。然而,随着机器学习应用的规模急剧扩大和计算需求呈指数增长,关注的焦点自然扩展到包括系统性能和硬件效率(Norman P. Jouppi 等人 2017d)。最近,数据质量已成为评估的第三维度(Gebru 等人 2021b)。

人工智能基准测试与传统性能指标的不同之处在于其固有的可变性,这引入了准确性作为新的评估维度,与计算速度或能耗等确定性特征并列。机器学习模型的概率性质意味着相同的系统可能会根据遇到的数据产生不同的结果,这使得准确性成为性能评估的决定性因素。这种区别增加了复杂性:对人工智能系统进行基准测试不仅需要测量原始的计算效率,还需要理解准确性、泛化能力和资源限制之间的权衡。

能源效率成为一个跨领域的关注点,影响着我们框架的三个维度:算法选择影响计算复杂度和功耗,硬件能力决定能效权衡,数据集特征影响训练能耗。这种多方面的评估方法代表了与早期基准测试的背离,后者主要关注孤立方面,如计算速度或能源效率(Hernandez 和 Brown 2020)。

基准复杂性的这种演变直接反映了该领域对真正推动机器学习系统成功因素的理解的演变。虽然算法创新最初主导了研究阶段的进展指标,但在大规模部署模型时遇到的实际挑战揭示了硬件效率的重要性(Norman P. Jouppi 等人 2021b)。随后,机器学习系统在实际部署中的高调失败凸显了数据质量和表示如何直接决定系统可靠性和公平性(Bender 等人 2021)。理解这些维度如何相互作用已成为准确评估机器学习系统性能、指导开发决策以及衡量该领域技术进步的必要条件。

机器学习测量挑战

机器学习系统的独特特性创造了传统基准测试从未面临的测量挑战。与给定相同输入产生相同输出的确定性算法不同,机器学习系统表现出来自多个来源的固有可变性:来自权重初始化和数据洗牌的算法随机性,影响时钟速度的硬件热状态,来自并发进程的系统负载变化,以及包括网络条件和电源管理在内的环境因素。这种可变性需要严格的统计方法来区分真正的性能改进和测量噪声。

为了应对这种可变性,有效的基准测试协议需要使用不同的随机种子进行多次实验运行。每次运行基准测试 5-10 次,并报告除简单平均值之外的统计指标(包括标准偏差或 95%置信区间),可以量化结果稳定性,并允许从业者区分真正的性能改进和测量噪声。

近期研究突出了统计严谨性不足可能导致误导性结论。许多强化学习论文报告的改进结果落在统计噪声范围内(Henderson 等人 2018),而生成对抗网络(GAN)的比较通常缺乏适当的实验协议,导致在不同随机种子下排名不一致(Lucic 等人 2018)。这些发现强调了建立全面测量协议的重要性,该协议考虑了机器学习的概率性质。

代表性工作负载选择对于基准测试的有效性至关重要。合成微基准测试通常无法捕捉到真实机器学习工作负载的复杂性,其中数据移动、内存分配和动态批处理创造了在简化测试中不可见的性能模式。全面的基准测试需要反映实际部署模式的工作负载:语言模型中的可变序列长度、混合精度训练方案以及包括预处理开销在内的真实数据加载模式。统计意义和实际意义的区别需要仔细解释。小的性能提升可能在数百次试验中达到统计意义,但如果它落在测量噪声中或成本超过收益,则可能在实际操作上无关紧要。

解决这个问题需要仔细的基准设计,优先考虑代表性工作负载而不是合成测试。有效的系统评估依赖于端到端应用程序基准,如 MLPerf,它包含数据预处理并反映现实部署模式。在开发自定义评估框架时,分析生产工作负载有助于确定对有意义评估至关重要的代表性数据分布、批处理大小和计算模式。

当前的基准测试范式通常在衡量狭窄的任务性能时存在不足,同时忽略了决定实际系统有效性的特征。大多数现有的基准测试主要评估静态数据集上的监督学习性能,主要测试模式识别能力,而不是生产部署所需的适应性和弹性。当模型在略微不同的条件或领域部署时,即使基准测试性能出色但失败,这种局限性变得明显。为了解决这些不足,全面的系统评估必须测量学习效率、持续学习能力以及分布外泛化能力,同时衡量传统指标。

算法基准测试

算法基准测试专注于我们框架的第一个维度:衡量模型性能、准确性和效率。虽然硬件系统和训练数据质量当然会影响结果,但算法基准测试故意隔离模型能力,以便清楚地理解准确度、计算复杂性和泛化之间的权衡。

人工智能算法面临着平衡多个性能目标的复杂挑战,包括准确性、速度、资源效率和泛化能力。随着机器学习应用继续跨越不同的领域,包括计算机视觉、自然语言处理、语音识别和强化学习,评估这些竞争目标需要针对每个领域独特挑战精心标准化的方法。算法基准,如 ImageNet4 (J. Deng 等人 2009),建立了这些评估框架,为比较不同的机器学习方法提供了一个一致的基础。

机器学习算法基准是对机器学习模型在预定义任务数据集上的性能进行标准化的评估,使得不同方法之间的准确性效率泛化能力的客观比较成为可能。

算法基准通过多个功能推动人工智能的发展。它们建立了清晰的性能基准线,使得不同方法之间的客观比较成为可能。通过系统地评估模型复杂度、计算需求和任务性能之间的权衡,它们帮助研究人员和从业者确定最佳的设计选择。它们通过记录随时间的技术进步,指导新技术的开发,同时揭示现有方法中的局限性。

图 12.1 中的图表展示了在ImageNet 大规模视觉识别挑战(ILSVRC)分类任务上,错误率随年份的降低。从 2010 年和 2011 年的基线模型开始,2012 年引入的 AlexNet5 标志着进步,将错误率从 25.8%降低到 16.4%。随后的模型如 ZFNet、VGGNet、GoogleNet 和 ResNet6 继续这一趋势,到 2015 年 ResNet 实现了 3.57%的错误率(Russakovsky 等人 2015)。这一进展突出了算法基准如何衡量当前的能力并推动人工智能性能的进步。

图 12.1:ImageNet 挑战进展:神经网络将错误率从 2010 年的 25.8%降低到 2015 年的 3.57%,突出了架构进步对分类准确性的影响。

系统基准

转到我们框架的第二维度,我们解决硬件性能问题:不同的计算系统如何有效地执行机器学习工作负载。系统基准测量使算法能力得以实现的计算基础,系统地检查硬件架构、内存系统和互连如何影响整体性能。理解这些硬件的局限性和能力对于优化算法-系统交互是必要的。

人工智能计算对计算资源的需求极大,远超传统计算工作负载。其底层硬件基础设施,包括通用 CPU、图形处理单元(GPU)、张量处理单元(TPUs)7 和专用集成电路(ASICs)8;Mattson 等人 2020)。

这些系统基准在人工智能生态系统中执行两个关键功能。首先,它们通过提供系统配置之间的比较性能数据,使开发者和组织在为他们的 AI 应用选择硬件平台时能够做出明智的决定。评估因素包括训练速度、推理延迟、能效和成本效益。其次,硬件制造商依赖这些基准来量化代际改进并指导专用 AI 加速器的开发,推动计算能力的进步。

ML 系统基准是对机器学习工作负载的计算基础设施的标准化评估,衡量性能能效可扩展性,以实现硬件和软件配置之间的客观比较。

然而,有效解释基准测试结果需要深入理解目标硬件的性能特性。关键的是,了解特定人工智能工作负载是计算密集型还是内存密集型,对于优化决策提供了重要见解。计算强度,以每字节数据移动的 FLOPS9 来衡量,决定了性能限制。以 NVIDIA A100 GPU 为例,其张量性能为 312 TFLOPS,内存带宽为 1.6 TB/s,从而得出算术强度阈值为 195 FLOPS/byte。理解这些硬件特性的架构基础在第十一章中确立,它为解释系统基准测试结果提供了背景。

在某些 AI 模型操作(通常>200 FLOPS/byte)中的高强度操作,如密集矩阵乘法,在 A100 上实现了接近峰值计算吞吐量。例如,在大型批量大小(256+)上进行的 ResNet-50 正向传递达到约 300 FLOPS/byte 的算术强度,使得 85-90%的峰值张量性能(实际达到 280 TFLOPS,理论值为 312 TFLOPS)(Choquette 等人 2021)。相反,低强度操作,如激活函数和某些轻量级操作(<10 FLOPS/byte),成为内存带宽限制,只利用了 GPU 计算能力的一小部分。批量大小为 1 的 BERT 推理仅达到 8 FLOPS/byte 的算术强度,性能限制在 12.8 TFLOPS(1.6 TB/s × 8 FLOPS/byte),仅代表峰值计算能力的 4%。

这种定量分析,在 roofline 模型 10 中形式化,提供了一个系统框架,通过明确识别特定工作负载的主要性能约束,指导算法设计和硬件选择。理解这些定量关系使得工程师能够准确预测性能瓶颈,并相应地优化模型架构和部署策略。例如,将 transformer 推理的批量大小从 1 增加到 32 可以将操作从内存受限(8 FLOPS/byte)转变为计算受限(150 FLOPS/byte),将 GPU 利用率从 4%提高到 65%(Pope 等人 2022)。

系统基准测试评估了从单芯片配置到大型分布式系统以及包括训练和推理任务在内的 AI 工作负载在内的性能。这种评估方法确保基准测试能够准确反映现实世界的部署场景,并提供有关硬件选择决策和系统架构设计的见解。图 12.2 展示了 2010 年至 2014 年间 ImageNet 分类错误率与 GPU 采用率之间的相关性。这些结果突出了硬件能力的提升以及算法进步如何推动计算机视觉性能的进步。

图 12.2:ImageNet 基准测试:自 2012 年以来,GPU 技术的进步推动了 ImageNet 分类精度的提高,展示了硬件和算法进步之间的相互作用。

上面的 ImageNet 示例展示了硬件进步如何促进算法突破,但有效的系统基准测试需要理解工作负载特征与硬件利用率之间微妙的关系。现代 AI 系统很少能达到理论峰值性能,因为计算模式、内存层次结构和系统架构之间的复杂交互。这种理论与实际性能之间的差距塑造了我们设计有意义的系统基准测试的方式。

理解实际的硬件利用率模式对于可操作的基准设计变得至关重要。不同的 AI 工作负载以截然不同的方式与硬件架构交互,根据模型架构、批量大小和精度选择,创建出差异巨大的利用率模式。GPU 利用率从批量大小为 64 的优化良好的 ResNet-50 训练的 85%到批量大小为 1 的仅 15% (Y. You et al. 2019),这是由于并行性不足。内存带宽利用率从参数密集型的 transformer 模型的 20%到激活密集型的卷积网络的 90%,直接影响到不同精度级别上可达到的性能。

能效考虑因素为系统基准测试增加了另一个关键维度。性能每瓦特在计算平台之间差异三个数量级,使得能效成为生产部署的关键基准维度。利用率对效率有显著影响:利用率低的 GPU 消耗了不成比例的电力,同时提供最小的性能,造成巨大的效率损失,影响运营成本和环境影响。

分布式系统性能引入了系统基准测试必须捕捉的额外复杂性。传统的屋顶线模型扩展到多 GPU 和多节点场景,但分布式训练引入了通信瓶颈,这通常占主导地位。节点间带宽限制、NUMA 拓扑效应和网络拥塞创造了单节点基准测试无法揭示的性能变化。

生产级分布式系统面临需要专门基准测试方法解决的实际部署场景的挑战。多节点训练期间的网络分区影响梯度同步和模型一致性,需要在部分连接条件下进行容错评估。时钟同步对于准确测量地理上分布的节点间的分布式性能变得至关重要,因为时间戳漂移会无效化基准测试结果。

规模化效率测量揭示了生产级机器学习工作负载中关键分布式系统瓶颈。对于大多数模型,由于通信开销,线性扩展效率在 64-128 节点之后显著下降:ResNet-50 训练在 32 节点时达到 90%的扩展效率,但在 128 节点时只有 60%的效率。在传统的参数服务器架构中,梯度聚合延迟随着集群规模的增加而呈二次方增长,而 all-reduce 通信模式虽然实现了更好的扩展,但需要高带宽的互连。

在分布式节点间完成基准的共识机制引入了单节点评估中不存在的协调挑战。确定基准完成需要分布式节点对收敛标准的共识,处理基准执行期间的节点故障,并确保所有参与节点的状态一致性。拜占庭容错对于跨越多个管理域或云提供商的基准成为必要。

网络拓扑效应在生产环境中显著影响分布式训练性能。InfiniBand 互连每个链路达到 200 Gbps,具有微秒级延迟,为通信密集型工作负载提供近似线性扩展。基于以太网的集群具有 100 Gbps 链路,但延迟高达 10-100 倍,限制了梯度密集型模型的扩展效率。节点内的 NUMA 拓扑创建内存带宽竞争,影响网络通信之前的本地梯度计算。

在生产级分布式系统中动态资源分配需要考虑资源异构性和时间变化的基准框架。不同内存容量、CPU 速度和网络带宽的云实例会创建负载不平衡,降低整体训练性能。Spot 实例可用性的波动需要容错基准,以衡量节点故障后的恢复时间和资源扩展响应性。

这些分布式系统考虑因素突显了理想化单节点基准与生产部署现实之间的差距。因此,有效的分布式机器学习基准必须评估通信模式、容错性、资源异构性和协调开销,以指导现实世界的系统设计决策。

这些硬件利用率洞察直接指导基准设计原则。有效的系统基准必须评估在现实利用率场景下的性能,而不是仅仅关注峰值理论能力。这种方法确保基准结果转化为实际部署指导,使工程师能够就硬件选择、系统配置和优化策略做出明智的决定。

这种从计算基础设施评估的过渡自然地引导我们进入全面机器学习系统基准的第三个同样关键的维度:数据质量评估。

数据基准

我们框架的第三个维度系统地检查数据质量、代表性以及机器学习评估中的偏差。数据基准评估数据集特征如何影响模型性能,并揭示仅从算法或系统指标中可能不明显的关键限制。这一维度尤其关键,因为数据质量约束通常决定了实际部署的成功,无论算法的复杂性或硬件能力如何。

数据质量、规模和多样性塑造了机器学习系统的性能,直接影响算法学习新情况的有效性和泛化能力。为了解决这种依赖性,数据基准建立了标准化的数据集和评估方法,使不同方法的比较保持一致。这些框架评估数据质量的关键方面,包括领域覆盖范围、潜在偏差以及对输入数据现实世界变化的抗性(Gebru 等人 2021b)。创建可靠基准所需的数据工程实践在第六章中详细说明,而基准设计中的公平性考虑与第十七章中涵盖的更广泛的负责任 AI 原则相联系。

ML 数据基准是对数据集质量的标准化评估,评估覆盖范围偏差代表性鲁棒性,以实现数据对模型性能影响的客观比较。

数据基准在理解 AI 系统在不同数据条件下的行为中发挥着至关重要的作用。通过系统性的评估,它们有助于识别常见的故障模式,揭示数据覆盖的临界差距,并揭示可能显著影响模型部署行为的潜在偏差。通过提供数据评估的通用框架,这些基准使 AI 社区能够系统地提高数据质量,并在将系统部署到生产环境中之前解决潜在问题。随着 AI 系统承担更多复杂和重要的任务,这种主动的数据质量评估方法变得越来越关键。

社区驱动的标准化

在我们的三维框架基础上,我们面临着由基准的激增带来的关键挑战,这些基准涵盖了性能、能源效率和特定领域的应用:建立行业标准。虽然早期的计算基准主要测量简单的指标,如处理器速度和内存带宽,但现代基准必须评估系统性能的复杂方面,从复杂的功耗配置文件到高度专业化的特定应用能力。这种范围和复杂性的演变需要计算社区的全面验证和共识,尤其是在机器学习等快速发展的领域,必须从多个相互依赖的维度评估性能。

任何基准的持久影响都严重依赖于更广泛研究社区的接受程度,仅仅技术上的卓越不足以保证其被采用。没有广泛社区参与的基准开发往往难以获得有意义的推广,常常遗漏了领先研究组认为至关重要的关键指标。成功的基准是通过涉及学术机构、行业合作伙伴和领域专家的协作开发而产生的。这种包容性方法确保基准评估了推动该领域发展的最关键能力,同时平衡了理论和实践考虑。

相比之下,通过在受尊敬的机构之间广泛合作开发的基准,具有推动广泛采用所需的权威性,而那些被认为是在推进特定企业利益方面的基准则面临怀疑和有限的接受。ImageNet 的显著成功展示了通过研讨会和挑战持续社区参与如何建立长期可行性和持久影响。这种社区驱动的发展为正式标准化奠定了基础,其中像 IEEE 和 ISO 这样的组织将这些基准转化为官方标准。

标准化过程为基准的正式化和采用提供了关键基础设施。IEEE 工作组将社区开发的基准方法转化为正式的行业标准,为测量和报告建立了精确的规范。IEEE 2416-2019 系统功率建模标准就是这一过程的例证,它将社区共识中发展出的最佳实践法典化。同样,ISO/IEC 技术委员会制定基准验证和认证的国际标准,确保全球研究和行业社区的评价一致性。这些组织在社区驱动创新和正式标准化之间架起了桥梁,提供了框架,使得不同机构和地理区域之间可靠地比较结果成为可能。

成功的社区基准建立了明确的治理结构来管理其演变。通过严格的版本控制系统和详细的变更文档,基准在吸收新进展的同时保持向后兼容。这种治理包括正式的提案、审查和实施变更的程序,确保基准在保持稳定性的同时保持相关性。现代基准越来越强调可重复性要求,纳入了自动验证系统和标准化的评估环境。

开放访问加速了基准测试的采用并确保了一致的实施。提供开源参考实现、全面文档、验证套件和容器化评估环境的项目降低了进入门槛。这种标准化使得研究团队能够使用统一的方法和指标评估解决方案。如果没有这样的协调实施框架,组织可能会不一致地解释基准测试,从而损害结果的可重复性和跨研究的有意义比较。

最成功的基准测试在学术严谨性和行业实用性之间取得了谨慎的平衡。学术参与确保了理论上的严谨性和全面的评估方法,而行业参与则将基准测试建立在实际约束和现实世界应用的基础上。这种平衡在机器学习基准测试中尤其重要,因为理论进步必须转化为部署系统中实际改进 (D. Patterson et al. 2021a)。这些评估方法原则指导了本章中训练和推理基准设计。

社区共识确立了基准测试的持久相关性,而碎片化则阻碍了科学进步。通过协作开发和透明操作,基准测试演变为衡量进步的权威标准。在能效和特定领域应用中最成功的基准测试共享这一社区发展和治理的基础,展示了集体专业知识和共同目标如何在快速发展的领域中产生持久影响。

基准测试粒度

上述建立的三维框架和测量基础为基准测试提供了概念结构。然而,实施这些原则需要选择适当的细节级别进行评估,从单个张量操作到完整的机器学习应用。正如第十章中提到的优化技术在不同粒度上运行一样,基准测试必须调整其评估范围以匹配特定的优化目标。这种分层视角允许实践者从微观层面隔离性能瓶颈,或在宏观层面评估整个系统的行为。

系统级基准测试提供了一种结构化和系统化的方法来评估机器学习系统在各个维度的性能。鉴于机器学习系统的复杂性,我们可以通过不同级别的粒度来剖析其性能,从而获得系统效率的全面视图,识别潜在的瓶颈,并确定改进的区域。为此,各种类型的基准测试在多年中不断发展并持续存在。

图 12.3 展示了机器学习系统的不同粒度层次。在应用层面,端到端基准评估整体系统性能,考虑因素包括数据预处理、模型训练和推理。而在模型层面,基准则专注于评估特定模型的效率和准确性。这包括评估模型对新数据的泛化能力以及训练和推理过程中的计算效率。基准测试可以扩展到硬件和软件基础设施,检查单个组件(如 GPU 或 TPU)的性能。

图 12.3:基准粒度:机器学习系统性能评估发生在多个层面,从端到端应用指标到单个模型和硬件组件效率,从而实现有针对性的优化和瓶颈识别。这种分层方法允许从业者系统地分析系统性能,并根据特定组件的限制优先考虑改进。

微基准测试

微基准测试是专门的评价工具,用于评估更广泛机器学习过程中的不同组件或特定操作。这些基准将单个任务隔离出来,以提供对特定系统元素计算需求的详细见解,从神经网络层到优化技术到激活函数。例如,微基准测试可能会测量执行深度学习模型中卷积层所需的时间,或评估准备训练数据的数据预处理操作的速度。

微基准测试的关键领域集中在张量操作 11 上,这是深度学习的计算核心。NVIDIA 的库cuDNN12 提供了在不同硬件配置下测量基本计算(如卷积和矩阵乘法)的基准。这些测量帮助开发者了解他们的硬件如何处理主导机器学习工作负载的核心数学运算。

微基准测试还单独检查激活函数和神经网络层。这包括在受控条件下测量各种激活函数(如 ReLU、Sigmoid13 和 Tanh14)的性能,以及评估不同神经网络组件(如 LSTM15 单元或 Transformer 块)在处理标准化输入时的计算效率。

百度开发的DeepBench是第一个展示全面微观基准价值的项目之一。它评估了不同硬件平台上的这些基本操作,提供了有助于开发者优化其深度学习实现的详细性能数据。通过隔离和测量单个操作,DeepBench 能够精确比较硬件平台并识别潜在的性能瓶颈。

宏观基准

当微观基准检查单个操作,如张量计算和层性能时,宏观基准评估的是完整的机器学习模型。这种从组件级到模型级评估的转变,有助于了解架构选择和组件交互如何影响整体模型行为。例如,虽然微观基准可能显示单个卷积层的最佳性能,但宏观基准揭示了这些层如何在完整的卷积神经网络中协同工作。

宏观基准衡量的是仅在模型级别出现的多个性能维度。这包括预测准确性,它显示了模型对新数据的泛化能力;不同批量大小和序列长度下的内存消耗模式;不同计算负载下的吞吐量;以及不同硬件配置下的延迟。理解这些指标有助于开发者就模型架构、优化策略和部署配置做出明智的决定。

完整模型的评估是在标准化的条件下,使用既定的数据集和任务进行的。例如,计算机视觉模型可能会在ImageNet上进行评估,衡量其计算效率和预测准确性。自然语言处理模型可能会在翻译任务上进行评估,检查它们在不同语言对之间如何平衡质量和速度。

几个行业标准基准使模型在不同平台上的评估保持一致。MLPerf Inference提供了适用于不同计算环境的全面测试套件(Reddi 等人 2019b)。MLPerf Mobile专注于移动设备限制(Janapa Reddi 等人 2022),而MLPerf Tiny针对微控制器部署(C. Banbury 等人 2021)。对于嵌入式系统,EEMBC 的 MLMark强调性能和功耗效率。AI-Benchmark套件专注于移动平台,评估从图像识别到人脸解析的多种任务上的模型。

端到端基准

端到端基准测试提供了一个全面评估,它超越了机器学习模型本身的边界。这些基准不仅关注机器学习模型的计算效率或准确性,还涵盖了人工智能系统的整个流程。这包括初始的 ETL(提取-转换-加载)或 ELT(提取-加载-转换)数据处理、核心模型性能、结果的后处理以及存储和网络系统等关键基础设施组件。

数据处理是所有人工智能系统的基石,它将原始数据转换成适合模型训练或推理的格式。在 ETL 管道中,数据从源系统提取,经过清洗和特征工程等转换,然后加载到模型准备好的格式中。这些预处理步骤的效率、可扩展性和准确性对整体系统性能有重大影响。端到端基准测试必须通过这些管道评估标准化数据集,以确保数据准备不会成为瓶颈。

后处理阶段同样重要。这涉及到解释模型的原始输出,将分数转换为有意义的类别,根据预定义的任务过滤结果,或与其他系统集成。例如,计算机视觉系统可能需要后处理检测边界,应用置信度阈值,并将结果格式化为下游应用。在实际部署中,这一阶段对于提供可操作的见解至关重要。

除了核心人工智能操作之外,基础设施组件对整体性能和用户体验有重大影响。存储解决方案,无论是基于云、本地还是混合型,都可能显著影响数据检索和存储时间,尤其是在庞大的 AI 数据集情况下。对于分布式系统至关重要的网络交互,如果没有优化,可能会成为性能瓶颈。端到端基准测试必须在指定的环境条件下评估这些组件,以确保整个系统的可重复测量。

到目前为止,还没有公开的、端到端的基准测试能够完全考虑到数据存储、网络和计算性能。虽然 MLPerf Training 和 Inference 方法接近端到端评估,但它们主要关注模型性能,而不是实际部署场景。尽管如此,它们为评估人工智能系统能力提供了有价值的基线指标。

由于端到端基准测试的固有特定性,组织通常通过在生产部署中实施这些评估来内部执行这些评估。这允许工程师根据实际工作负载制定结果解释指南,但鉴于信息的敏感性和特定性,这些基准很少出现在公共场合。

粒度权衡和选择标准

如表 12.1 所示,人工智能系统生命周期不同阶段会涌现出不同的挑战。每种基准测试方法都提供独特的见解:微基准测试帮助工程师优化特定组件,如 GPU 内核实现或数据加载操作,宏基准测试指导模型架构决策和算法选择,而端到端基准测试则揭示了生产环境中的系统级瓶颈。

表 12.1:基准粒度级别:不同的基准范围(微、宏和端到端)针对机器学习系统开发的特定阶段,并揭示独特的性能瓶颈。微基准测试隔离单个操作以进行低级优化,宏基准测试评估完整模型以指导架构选择,而端到端基准测试评估生产环境中的完整系统性能。

组件 微基准测试 宏基准测试 端到端基准测试
关注点 单个操作 完整模型 全系统管道
范围 张量操作、层、激活 模型架构、训练、推理 ETL、模型、基础设施
示例 cuDNN 上的卷积层性能 ImageNet 上的 ResNet-50 生产推荐系统
优点 精确瓶颈识别,组件优化 模型架构比较,标准化评估 现实性能评估,系统级洞察
挑战 可能错过交互效应 基础设施洞察有限 复杂标准化,通常专有
典型用途 硬件选择,操作优化 模型选择,研究比较 生产系统评估

图 12.4 可视化了基准粒度级别之间诊断能力和现实世界代表性之间的核心权衡。这种关系说明了为什么全面的机器学习系统评估需要多种基准类型:微基准测试为孤立组件提供精确的优化指导,而端到端基准测试则捕捉生产系统中出现的复杂交互。最佳的基准测试策略结合了所有三个级别的见解,以平衡详细组件分析与现实系统评估。

图 12.4:基准粒度权衡:基准粒度在隔离/诊断能力和现实世界代表性之间的核心权衡。微基准测试提供高诊断精度但现实世界相关性有限,而端到端基准测试捕捉现实系统行为但提供较少的组件级洞察。有效的机器学习系统评估需要战略性地结合所有三个级别的信息。

组件之间的交互往往会产生意外的行为。例如,虽然微基准测试可能显示单个卷积层表现出色,宏基准测试可能显示完整模型具有强大的精度,但端到端评估可能会揭示数据预处理在高流量期间创造了意外的瓶颈。当组件进行隔离测试时,这些系统级见解往往隐藏起来。

在确定了基准粒度后,了解哪个评估级别服务于特定的优化目标,我们现在来审视构成任何粒度级别基准实现的具体组件。

基准组件

使用我们建立的框架,我们现在来审视构成任何基准实现的实际组件。这些组件为同时测量性能的三个维度提供了具体结构。无论是评估模型精度(算法维度)、测量推理延迟(系统维度)还是评估数据集质量(数据维度),基准测试都共享一些共同的结构性元素,确保系统性和可重复的评估。

上一节中建立的粒度级别直接决定了这些组件是如何实例化的。测量张量操作的微基准测试需要合成输入,以隔离特定的计算模式,从而能够精确地描述单个内核的性能,如第十一章第十一章中所述。评估完整模型的宏基准测试需要像 ImageNet 这样的代表性数据集,它能够捕捉现实任务复杂性,同时允许在架构之间进行标准化的比较。评估生产系统的端到端基准测试必须包含真实世界的数据特征,包括分布偏移、噪声和边缘情况,这些在精心挑选的评估集中是不存在的。同样,评估指标在粒度级别之间转移焦点:微基准测试强调 FLOPS 和内存带宽利用率,宏基准测试在精度和推理速度之间取得平衡,而端到端基准测试在负载下的系统可靠性和操作效率方面优先考虑。理解这种系统性的变化确保组件选择与评估目标相一致,而不是在不同基准测试规模上应用统一的方法。

在确定了基准粒度如何塑造评估范围(从隔离张量操作的微基准测试到完整系统的端到端评估)之后,我们现在来探讨这些概念级别如何转化为具体的基准实现。上面讨论的抽象组件必须通过关于任务、数据集、模型和指标的具体选择来实例化。这个实现过程遵循一个系统性的工作流程,确保无论选择的粒度级别如何,都能进行可重复且有意义的评估。

AI 基准提供了一个结构化框架,用于系统地评估人工智能系统。虽然各个基准在其具体焦点和粒度上差异很大,但它们共享共同的实现组件,这些组件使得在不同方法之间的一致评估和比较成为可能。

图 12.5 展示了这个结构化工作流程,展示了基本组件(任务定义、数据集选择、模型选择和评估指标)如何相互连接形成一个完整的评估管道。每个组件都建立在之前的基础上,从问题规范到部署评估创建一个系统的进展。

图 12.5

图 12.5:基准工作流程:AI 基准通过结构化管道标准化评估,使不同模型和系统之间的性能比较具有可重复性。此工作流程通过定义任务、选择数据集、训练模型和严格评估结果来系统地评估 AI 能力。

有效的基准设计必须考虑前几章中确立的优化技术。量化剪枝影响模型精度-效率权衡,需要同时衡量加速和精度保持的基准。硬件加速技术影响算术强度和内存带宽利用率,需要通过屋顶线模型分析来正确解释结果。理解这些优化基础能够使基准选择验证所声称的改进,而不是衡量人工场景。

问题定义

如图 12.5 所示,基准实现从对机器学习任务及其评估标准的正式规范开始。在机器学习中,任务代表 AI 系统必须解决的明确问题。考虑一个异常检测系统,它处理音频信号以识别偏离正常操作模式的变化,如图 12.5 所示。这个工业监控应用示例说明了正式任务规范如何转化为实际实现。

任何基准任务的正式定义都包括计算问题和其评估框架。虽然具体任务因领域而异,但已在大规模 AI 研究领域中出现了成熟的类别。例如,自然语言处理任务包括机器翻译、问答(Hirschberg and Manning 2015)和文本分类。计算机视觉同样采用标准化的任务,如目标检测、图像分割和面部识别(Everingham et al. 2009)。

每个基准测试任务规范必须定义三个基本要素。输入规范确定系统处理的数据。在图 12.5(Figure 12.5)中,这包括音频波形数据。输出规范描述所需的系统响应,例如正常与异常模式的二进制分类。性能规范建立了准确性、处理速度和资源利用的定量要求。

任务设计直接影响基准测试评估 AI 系统的有效性。音频异常检测示例通过其具体要求清楚地说明了这种关系:处理连续信号数据、适应变化的噪声条件以及在严格的时间约束内运行。这些实际约束为评估模型性能提供了一个详细的框架,确保评估反映了现实世界的操作需求。

基准测试的实施从这一基础任务定义系统地展开。从数据集选择到部署的每个后续阶段,都直接建立在这些初始规范之上,确保评估保持一致性,同时满足不同方法和实现中定义的要求。

标准化数据集

在前一个阶段建立的问题定义的基础上,标准化数据集为训练和评估模型提供了基本的基础。这些精心挑选的集合确保所有模型在相同条件下进行测试,从而能够直接比较不同方法和架构。图 12.5(Figure 12.5)通过音频异常检测示例展示了这一点,其中波形数据作为评估检测性能的标准化输入。

在计算机视觉领域,如ImageNet (J. Deng et al. 2009)、COCO (T.-Y. Lin et al. 2014)和CIFAR-1016 (Krizhevsky, Hinton, et al. 2009)等数据集作为参考标准。对于自然语言处理,如SQuAD17 (Rajpurkar et al. 2016)、GLUE18 (A. Wang et al. 2018)和WikiText (Merity et al. 2016)等集合也发挥着类似的作用。这些数据集涵盖了各种复杂性和边缘情况,以全面评估机器学习系统。

在图 12.5 的工作流程早期,数据集的战略选择塑造了所有后续的实施步骤,并最终决定了基准的有效性。在音频异常检测的例子中,数据集必须包括正常操作的代表性波形样本,以及各种异常条件的综合示例。值得注意的例子包括用于工业制造异常的 ToyADMOS 数据集和用于通用声音识别的 Google Speech Commands。无论选择的具体数据集是什么,数据量必须足够用于模型训练和验证,同时包含反映部署条件的现实世界信号特征和噪声模式。

基准数据集的选择直接决定了实验结果和模型评估。有效的数据集必须平衡两个关键要求:准确反映现实世界的挑战,同时保持足够的复杂性,以便有意义地区分模型性能。虽然研究通常使用简化的数据集,如 ToyADMOS19 (Koizumi et al. 2019),但这些受控环境虽然对方法论发展有价值,可能无法完全捕捉现实世界的部署复杂性。

模型选择

在指定数据集之后,基准过程系统地推进到模型架构选择和实现。这一关键阶段建立了性能基准,并确定了特定任务的优化建模方法。选择过程直接建立在第四章中建立的架构基础上,并必须考虑到第七章中讨论的框架特定考虑因素。图 12.5 说明了通过模型选择阶段和随后的训练代码开发这一进展。

基准模型作为评估新方法的标准参考点。这些模型从基本的实现开始,包括用于连续预测的线性回归和用于分类任务的逻辑回归,到在可比领域证明成功的先进架构。基准模型的选择关键取决于部署框架——一个 PyTorch 实现可能由于其特定的优化和操作实现,与它的 TensorFlow 等效版本表现出不同的性能特征。在自然语言处理应用中,先进的语言模型如 BERT20 已成为比较分析的基准标准。变换器及其性能特征在第四章中得到了详尽的介绍。

选择合适的基线模型需要对架构与基准要求进行仔细评估。这一选择过程直接指导训练代码的开发,这是基准可重复性的基石。训练实现必须详细记录模型管道的所有方面,从数据预处理到训练过程,以便在研究团队间精确复制模型行为。

模型架构选定后,模型开发遵循两个主要优化路径:训练和推理。在训练优化过程中,努力集中在达到目标精度指标的同时,在计算约束条件下进行。训练实现必须在指定条件下展示对性能阈值的持续达成。

同时,推理优化路径关注部署考虑因素,特别是从开发环境到生产环境的临界过渡。一个关键例子是通过数值优化技术降低精度,从高精度表示过渡到低精度表示以提升部署效率。这个过程需要仔细校准,以在降低资源需求的同时保持模型精度。基准测试必须详细说明量化方法和验证程序,以确认性能的保留。

这两条优化路径与实际约束条件的交集决定了整体部署策略。因此,全面的基准测试必须明确训练和推理场景的要求,确保模型在开发到部署过程中保持一致的性能。这种开发与生产指标之间的关键联系自然导致评估标准的建立。

优化过程必须平衡四个关键目标:模型精度、计算速度、内存利用率和能源效率。遵循我们的三维基准测试框架,这个复杂的优化领域需要强大的评估指标,能够有效量化算法、系统和数据维度的性能。随着模型从开发过渡到部署,这些指标作为指导优化决策和验证性能提升的关键工具。

评估指标

在模型选择中建立的优化框架基础上,评估指标提供了评估机器学习模型性能所需的定量度量。这些指标为比较不同方法建立了客观标准,使研究人员和实践者能够衡量解决方案的有效性。选择合适的指标是基准设计的关键方面,因为它们必须与任务目标一致,同时为训练和部署场景中的模型行为提供有意义的见解。重要的是,指标的计算可能在框架之间有所不同——第八章中的训练方法展示了不同的框架如何以不同的方式处理损失计算和梯度累积,这影响了报告的指标。

任务特定指标量化了模型在其预期功能上的性能。例如,分类任务采用包括准确率(总体正确预测)、精确率(正面预测准确率)、召回率(正面案例检测率)和 F1 分数(精确率-召回率调和平均)Sokolova 和 Lapalme 2009 在内的指标。回归问题使用如均方误差(MSE)和平均绝对误差(MAE)等误差测量方法来评估预测准确性。特定领域的应用通常需要专门的指标——例如,机器翻译使用 BLEU 分数 21 来评估机器生成翻译与人工参考翻译之间的语义和句法相似度(Papineni 等 2001)。

然而,随着模型从研究阶段过渡到生产部署,实施指标同样重要。模型大小,以参数或内存占用量来衡量,直接影响到不同硬件平台上的部署可行性。处理延迟,通常以每次推理的毫秒数来衡量,决定了模型是否满足实时性要求。能耗,以每次推理的瓦特或焦耳来衡量,表明了操作效率。这些实际考虑反映了在准确性与计算效率之间寻求平衡的解决方案日益增长的需求。在生产环境中维持这些指标的操作挑战在部署策略中得到了探讨(第十三章)。

因此,选择合适的指标需要仔细考虑任务需求和部署限制。在现实场景中,单一指标很少能捕捉到性能的所有相关方面。例如,在异常检测系统中,如果模型频繁产生误报,仅高准确率可能并不表明良好的性能。同样,一个速度快但准确率低的模型无法提供实际价值。

图 12.5 展示了这种多指标评估方法。异常检测系统在多个维度上报告性能:模型大小(270 K 参数)、处理速度(10.4 ms/推理)和检测精度(0.86 AUC22)。这些指标的结合确保模型在现实世界的部署场景中满足技术和操作要求。

基准工具链

虽然评估指标提供了测量框架,但基准工具链实现了在受控条件下评估模型性能的系统基础设施。这个关键组件通过管理输入如何传递给被测系统以及如何收集测量数据,有效地将理论指标转化为可量化的测量。

工具链的设计应与预期的部署场景和用法模式相一致。对于服务器部署,工具链实现模拟真实世界流量的请求模式,通常使用泊松分布 23 来模拟随机但统计上一致的服务器工作负载。工具链管理并发请求和不同的负载强度,以评估系统在不同操作条件下的行为。

对于嵌入式和移动应用,工具链生成反映实际部署条件的输入模式。这可能涉及为移动视觉应用进行顺序图像注入,或为自主系统提供同步的多传感器流。这种精确的输入生成和时序控制确保系统经历真实的操作模式,揭示在实际设备部署中出现的性能特征。

工具链还必须适应不同的吞吐量模型。批量处理场景需要评估系统在大量并行输入上的性能,而实时应用则需要精确的时间控制以进行顺序处理。图 12.5 在嵌入式实现阶段展示了这一点,其中工具链必须支持对每个操作推理时间和能耗的精确测量。

可重复性要求在各个评估运行中,工具链保持一致的测试条件。这包括控制可能影响性能测量的环境因素,如后台进程、热条件和电源状态。工具链还必须提供机制,以便在不显著影响被测系统的情况下收集和记录性能指标。

系统规格

补充控制测试执行的基准工具,系统规格是机器学习基准的基本组成部分,直接影响模型性能、训练时间和实验的可重复性。这些规格涵盖了完整的计算环境,确保基准测试结果可以被其他研究人员正确地情境化、比较和复制。

硬件规格通常包括:

  1. 处理器类型和速度(例如,CPU 型号,时钟速率)

  2. GPU 或 TPU,包括如果用于分布式训练则包括模型、内存容量和数量

  3. 内存容量和类型(例如,RAM 大小,DDR4)

  4. 存储类型和容量(例如,SSD,HDD)

  5. 如果与分布式计算相关,则包括网络配置

软件规格通常包括:

  1. 操作系统和版本

  2. 编程语言和版本

  3. 机器学习框架和库(例如,TensorFlow,PyTorch)及其版本号

  4. 编译器信息和优化标志

  5. 基准过程中使用的自定义软件或脚本

  6. 环境管理工具和配置(例如,Docker 容器 24,虚拟环境)

这些规格的精确文档对于实验的有效性和可重复性至关重要。此文档使其他研究人员能够以高保真度复制基准环境,为解释性能指标提供关键背景,并促进对不同模型和任务资源需求和扩展特性的理解。

在许多情况下,基准测试可能包括来自多个硬件配置的结果,以提供更全面的模型性能视图,涵盖不同的计算环境。这种方法特别有价值,因为它突出了模型复杂性、计算资源和性能之间的权衡。

随着该领域的发展,硬件和软件规格越来越多地纳入详细的能耗指标和计算效率措施,如 FLOPS/watt 和训练时间内的总功耗。这种扩展反映了人们对大规模机器学习模型环境影响的日益关注,并支持更可持续的 AI 实践的发展。因此,全面的规格文档具有多重作用:实现可重复性、支持公平比较,并推进机器学习研究的技术和环境方面。

运行规则

除了技术基础设施之外,运行规则建立了确保研究人员和实践者可以可靠地复制基准结果的程序框架,补充了由系统规范定义的技术环境。这些指南对于验证研究主张、建立在现有工作之上以及推进机器学习至关重要。在人工智能基准中的可重复性核心是控制随机性的管理,系统地处理权重初始化和数据洗牌等随机过程,以确保一致、可验证的结果。

对超参数的全面文档是可重复性的关键组成部分。超参数是控制模型如何学习的配置设置,例如学习率和批量大小,这些必须为了可重复性而记录。鉴于微小的超参数调整可能会显著影响模型性能,其精确的文档至关重要。基准要求保存和共享训练和评估数据集。当直接数据共享受到隐私或许可约束的限制时,基准必须提供详细的数据预处理和选择标准的规范,使研究人员能够构建可比较的数据集或了解原始实验数据的特点。

代码来源和可用性是可重复性指南的另一个重要方面。当代基准通常要求研究人员在版本控制的存储库中发布实现代码,这不仅包括模型实现,还包括数据预处理、训练和评估的全面脚本。高级基准通常提供封装了所有依赖项和配置的容器化环境。详细的实验日志是强制性的,包括系统地记录训练指标、模型检查点和任何实验调整的文档。

这些可重复性指南发挥着多个关键作用:它们增强了透明度,使严格的同行评审成为可能,并加速了人工智能研究中的科学进步。通过遵循这些协议,研究界可以有效地验证结果,迭代成功的方案,并确定方法论限制。在快速发展的机器学习领域,这些稳健的可重复性实践构成了可靠和进步研究的基础。

结果解释

在运行规则的基础上建立起来的结果解释指南为理解和情境化基准结果提供了必要的框架。这些指南帮助研究人员和从业者从基准结果中得出有意义的结论,确保在不同模型或方法之间进行公平和有信息量的比较。一个关键方面是理解性能差异的统计显著性。基准通常指定进行统计测试和报告置信区间的协议,使从业者能够区分有意义的改进和归因于随机因素的变异。

然而,结果解释需要仔细考虑现实世界的应用和背景。虽然准确性提高 1%对于医疗诊断或金融系统可能至关重要,但其他应用可能更重视推理速度或模型效率,而不是微小的准确性提升。理解这些特定需求的背景对于基准结果的有意义解释至关重要。用户还必须认识到基准固有的局限性,因为没有任何单一的评估框架可以涵盖所有可能的使用案例。常见的局限性包括数据集偏差、任务特定特征和评估指标的约束。

现代基准通常需要在多个性能指标上进行多维分析。例如,当一个模型表现出优越的准确性但需要大量计算资源时,解释指南帮助从业者根据他们特定的约束和要求评估这些权衡。指南还解决了基准过度拟合的关键问题,即模型可能为了特定基准任务而过度优化,从而牺牲了现实世界的泛化能力。为了减轻这种风险,指南通常建议在相关但不同的任务上评估模型性能,并考虑实际部署场景。

这些综合的解释框架确保基准能够实现其预期目的:提供标准化的性能测量,同时允许对模型能力进行细微的理解。这种平衡的方法支持在研究环境和实际机器学习应用中的基于证据的决策。

示例基准

为了说明这些组件在实际中是如何协同工作的,一个完整的基准运行通过在受控条件下综合多个组件来生成可重复的测量值,从而评估系统性能。图 12.5 通过一个音频异常检测系统展示了这种集成。它展示了在涵盖问题定义、数据集、模型选择、评估标准和标准化运行规则框架内,性能指标是如何系统性地测量和报告的。

该基准测量了几个关键性能维度。对于计算资源,系统报告模型大小为 270 K 个参数,每次推理需要 10.4 毫秒。对于任务有效性,它实现了 0.86 AUC(曲线下面积)的检测精度,以区分正常和异常的音频模式。对于操作效率,每次推理消耗 516 µJ 的能量。

这些指标相对于部署环境的重要性各不相同。对于电池供电的设备,每推理一次的能量消耗至关重要,但对于恒定电源的系统来说则不那么重要。模型大小限制在资源丰富的云部署和内存有限的嵌入式设备之间差异很大。处理速度要求取决于系统是否必须在实时操作或在批量处理数据。

该基准揭示了机器学习系统中性能指标之间的固有权衡。例如,将模型大小从 270 K 个参数减少可能会提高处理速度和能源效率,但可能会降低 0.86 AUC 检测精度。图 12.5 说明了这些相互关联的指标如何有助于部署阶段的整体系统性能。

最终,这些测量是否构成一个“通过”的基准取决于预期应用的特定要求。基准测试框架提供了持续评估的结构和方法,而验收标准必须与部署限制和性能要求相一致。

压缩基准

超越了一般的基准测试原则,随着机器学习模型在规模和复杂性上的增长,神经网络压缩已成为在资源受限环境中部署的关键优化技术。压缩基准测试方法评估包括剪枝、量化、知识蒸馏和架构优化在内的技术效果。这些专业基准测量了模型大小减少、精度保持和计算效率改进之间的核心权衡。

模型压缩基准同时评估多个维度。主要维度涉及尺寸减少指标,评估参数(计数)、内存占用(字节)和存储需求(压缩文件大小)。有效的压缩在保持精度的同时实现了显著减少:MobileNetV2 在 3.4 百万参数下实现了约 72%的 ImageNet top-1 精度,而 ResNet-50 在 2560 万个参数下实现了 76%的精度,参数到精度比率的效率提高了 7.5 倍。

除了基本的大小指标外,稀疏评估框架区分了结构化和非结构化剪枝效率。结构化剪枝移除整个神经元或滤波器,实现一致的加速但通常压缩比较低(2-4 倍)。非结构化剪枝消除单个权重,实现更高的压缩比(10-100 倍),但需要专门的稀疏计算支持以实现加速。基准测试协议必须指定硬件平台和软件实现,以确保有意义的稀疏加速测量。

补充稀疏技术,量化基准测试协议评估了跨多种数据类型的精度降低技术。INT8 量化通常提供 4 倍内存减少和 2-4 倍推理速度提升,同时保持 99%以上的精度保留,适用于大多数计算机视觉模型。混合精度方法通过将不同精度级别应用于不同层来实现最佳效率:关键层保留 FP16 精度,而计算密集层使用 INT8 或 INT4,从而实现细粒度效率优化。

另一个关键维度涉及知识迁移有效性指标,这些指标衡量不同模型大小之间的性能关系。成功知识迁移实现了较大模型 90-95%的精度,同时将模型大小减少 5-10 倍。紧凑模型可以展示这种方法,以显著较少的参数和更快的推理实现高性能,展示了在显著能力损失不大的情况下提高效率的潜力。

最后,优化模型的加速因子测量揭示了在不同硬件平台上的实际益处。优化模型实现了不同的加速因子:稀疏模型在 CPU 上提供 2-5 倍的加速,降低精度模型在移动处理器上实现 2-8 倍的加速,而高效架构在专用边缘加速器上提供 5-20 倍的加速。这些针对特定硬件的测量确保效率基准反映了实际的部署场景。

效率感知基准测试解决了传统评估框架中的关键差距。当前的基准测试套件,如 MLPerf,主要关注密集型、未优化的模型,这些模型并不代表生产部署,而在生产部署中优化模型无处不在。未来的基准测试框架应包括专门评估优化架构、降低精度推理和紧凑模型的效率模型分类,以准确反映实际部署实践并指导效率研究向实际影响方向发展。

移动和边缘基准测试

移动系统级芯片(SoC)集成了异构处理器(CPU、GPU、DSP、NPU),需要专门的基准测试来捕捉工作负载分布复杂性,同时考虑到热和电池限制。有效的处理器协调可以实现 3-5 倍的性能提升,但持续的工作负载会触发热限制。Snapdragon 8 Gen 3 的峰值 TOPS 从 35 下降到 20,而持续性能。电池影响差异很大:计算摄影消耗 2-5W,而后台 AI 需要 5-50mW 才能达到可接受的续航能力。

移动基准测试还必须评估 5G/WiFi 边缘云的协调,URLLC25 对关键应用要求<1ms 的延迟。汽车部署增加了 ASIL 验证、多传感器融合以及-40°C 至+85°C 的环境测试。这些独特的要求需要综合框架来评估在热约束下的持续性能、使用模式下的电池效率以及依赖连接性的行为,这些评估超越了孤立峰值测量的范畴。

训练与推理评估

基准测试组件和粒度级别在机器学习系统的两个主要操作阶段:训练和推理中应用不同。虽然这两个阶段都通过神经网络处理数据,但它们不同的目标创造了不同的基准测试要求。第八章中的训练方法侧重于在大数据集上的迭代优化,而第十三章中的部署策略则优先考虑一致、低延迟的服务。这些差异贯穿于指标选择、资源分配和扩展行为。

训练涉及迭代优化和双向计算(正向和反向传递),而推理则执行单次正向传递并使用固定的模型参数。ResNet-50 的训练需要 8GB GPU 内存来存储梯度优化器状态,相比之下,仅推理的正向传递只需要 0.5GB。训练 GPT-3 使用了 1024 个 A100 GPU 数月,而推理则部署单个模型,在数千个并发请求中运行,并满足毫秒级响应要求。

训练优先考虑吞吐量和收敛速度,以每单位时间内处理的样本数和训练完成时间来衡量。BERT-Large 在批处理大小为 512 时达到最佳性能,收敛时间为 32 小时,而 BERT 推理通过批处理大小为 1-4 来优化每个查询的<10ms 延迟。训练可以牺牲延迟以换取吞吐量(每秒处理 10,000 个样本),而推理则牺牲吞吐量以保持延迟一致性。

训练可以利用大量的计算资源进行批量处理,接受更长的完成时间以实现更好的资源效率。多节点训练在批量大小为 4096-32,768 时效率高,实现了 90%的计算利用率。推理必须以最小的延迟响应单个请求,这限制了批量大小为 1-16,适用于实时应用,导致 GPU 利用率在 15-40%,但满足了严格的延迟要求。

训练需要同时访问参数、梯度、优化器状态和激活,与推理相比,内存开销增加了 3-4 倍。混合精度训练(FP16/FP32)通过保持收敛的同时将内存使用量减少 50%,而推理可以利用 INT8 量化实现 4 倍的内存减少,同时精度损失最小。

训练过程中采用梯度压缩、混合精度训练和渐进式剪枝进行优化,在 0.1%的精度损失下实现了 1.8 倍的速度提升。推理优化利用了训练后量化(4 倍速度提升)、知识蒸馏(5-10 倍模型尺寸缩减)和神经架构搜索,在 0.5%的精度下降下实现了 4 倍的推理速度提升。

训练能耗在模型生命周期内分摊,并以每训练一个模型的总能耗来衡量。GPT-3 的训练在数月内消耗了大约 1,287 MWh。推理能耗按查询累积,直接影响运营效率:变压器推理每个查询消耗 0.01-0.1 Wh,这使得能源优化对于亿级查询服务至关重要。

此比较框架通过突出每个阶段最重要的指标以及评估方法应该如何不同来指导基准设计,以捕捉特定阶段的性能特征。训练基准强调收敛时间和扩展效率,而推理基准则优先考虑不同部署场景下的延迟一致性和资源效率。

训练基准

在我们的三维基准测试框架的基础上,训练基准专注于评估模型训练过程中的效率、可扩展性和资源需求。它们允许从业者评估不同的设计选择,包括模型架构、数据加载机制、硬件配置和分布式训练策略,如何影响我们框架的系统维度性能。随着机器学习系统规模的扩大,需要数十亿个参数、数 TB 的数据和分布式计算环境,这些基准尤其重要。

例如,像OpenAI 的 GPT-326 (T. Brown et al. 2020)这样的大型模型,它由 1750 亿个参数组成,在 4500TB 的数据上进行训练,突显了现代训练的巨大计算需求。训练基准测试对底层系统进行系统评估,以确保硬件和软件配置能够高效地满足这些前所未有的需求。

ML Training Benchmarks是对训练阶段的标准化评估,衡量时间到准确度扩展效率资源利用率,以评估训练基础设施和分布式训练性能。

除了计算需求之外,在训练过程中高效的数据存储和交付也起着至关重要的作用。例如,在一个预测图像中物体周围边界框的机器学习模型中,可能需要数千张图像。然而,将整个图像数据集加载到内存中通常是不可行的,因此从业者依赖于来自机器学习框架的数据加载器。成功的模型训练依赖于及时高效的数据交付,这使得对数据管道、预处理速度和存储检索时间等基准工具进行基准测试,以了解它们对训练性能的影响至关重要。

除了数据管道效率之外,硬件选择也是训练机器学习系统中的另一个关键因素,因为它可以显著影响训练时间。训练基准测试评估训练阶段中的 CPU、GPU、内存和网络利用率,以指导系统优化。了解资源的使用情况至关重要:GPU 是否被充分利用?是否存在不必要的内存开销?基准测试可以发现资源利用中的瓶颈或不效率,从而实现成本节约和性能提升。

在许多情况下,使用单个硬件加速器,例如单个 GPU,不足以满足大规模模型训练的计算需求。机器学习模型通常在拥有多个 GPU 或 TPUs 的数据中心进行训练,分布式计算使得节点间能够进行并行处理。训练基准测试评估系统在多个节点上扩展的效率、数据分片的管理以及处理训练过程中节点故障或掉线等挑战的能力。

为了说明这些基准测试原则,我们将在本节中引用MLPerf Training。MLPerf,如第 12.2 节中较早介绍的那样,为我们提供了在分析训练基准测试过程中的标准化框架。

训练基准测试的动机

从系统角度来看,训练机器学习模型代表了一个计算密集型过程,需要仔细优化资源。训练基准是评估系统效率、识别瓶颈和确保机器学习系统可以有效地扩展的基本工具。它们提供了一种标准化的方法来衡量各种系统组件,包括硬件加速器、内存、存储和网络基础设施,如何影响训练性能。

因此,训练基准允许研究人员和工程师通过系统地评估这些因素来推动最先进的技术,优化配置,提高可扩展性,并减少整体资源消耗。如图图 12.6 所示,MLPerf Training 基准的渐进版本中的性能改进始终超过了摩尔定律,这表明被测量的东西会得到改进。使用标准化的基准趋势趋势使我们能够严格展示 ML 计算的快速演变。

图片

图 12.6:MLPerf Training 进展:标准化基准显示,机器学习训练性能始终超过摩尔定律,表明系统级优化带来了实质性收益。这些趋势强调了专注的测量和迭代改进如何推动 ML 训练效率和可扩展性的快速进步。来源:(Tschand 等人 2024)。

训练基准的重要性

随着机器学习模型复杂性的增加,训练在计算能力、内存和数据存储方面变得越来越有挑战性。能够衡量和比较训练效率对于确保系统可以有效地处理大规模工作负载至关重要。训练基准提供了一种结构化的方法,用于评估不同硬件平台、软件框架和优化技术之间的性能。

训练机器学习模型的主要挑战之一是高效分配计算资源。训练一个像 GPT-3 这样的大型语言模型,它包含 1750 亿个参数并需要处理数 TB 的数据,对现代计算基础设施造成了巨大的负担。没有标准化的基准,很难确定系统是否充分利用了其资源,或者是否存在包括缓慢的数据加载、未充分利用的加速器和过度的内存开销等低效,这些因素是否限制了性能。

训练基准通过测量关键性能指标,如系统吞吐量、达到准确性的时间和硬件利用率,帮助揭示此类低效。回想一下第十一章,GPU 在混合精度操作中可以达到大约 15,700 GFLOPS,而 TPU 每秒可以执行 275,000 个 INT8 操作,专门用于张量工作负载。训练基准使我们能够测量这些理论硬件能力在现实条件下的实际训练加速效果。这些基准测试允许从业者分析加速器是否被有效利用,或者是否存在特定的瓶颈,例如来自硬件限制的内存带宽限制(第十一章),这些瓶颈正在降低整体系统性能。例如,使用 TF32 精度 1 的系统可能比使用 FP32 的系统具有更高的吞吐量,但如果 TF32 引入了增加达到目标精度所需迭代次数的数值不稳定性,整体训练时间可能会更长。通过提供对这些因素的了解,基准测试支持设计更高效的训练工作流程,在最大化硬件潜力的同时,最小化不必要的计算。

硬件与软件优化

机器学习训练的性能受到硬件和软件选择的影响很大。训练基准通过测量不同架构(包括 GPU、TPU 和新兴的 AI 加速器)如何处理计算工作负载,指导系统设计者选择最佳配置。这些基准测试还评估深度学习框架(如 TensorFlow 和 PyTorch)在不同硬件设置下优化性能的效果。

例如,MLPerf 训练基准套件被广泛用于比较不同加速器架构在图像分类、自然语言处理和推荐系统等任务上的性能。通过在多个硬件配置上运行标准化的基准测试,工程师可以确定某些加速器是否更适合特定的训练工作负载。在大型数据中心和云计算环境中,选择合适的硬件和软件组合可以带来显著的性能提升和成本节约,这些信息尤其宝贵。

除了硬件选择之外,训练基准还可以指导软件优化。机器学习框架实现了各种低级优化,包括混合精度训练 27、内存高效的数据加载和分布式训练策略,这些优化可以显著影响系统性能。基准测试有助于量化这些优化对系统性能的影响,确保训练系统配置达到最大效率。

可扩展性与效率

随着机器学习工作负载的不断增长,在分布式计算环境中的高效扩展已成为一个关键问题。许多现代深度学习模型是在多个 GPU 或 TPU 上训练的,需要高效的并行化策略来确保额外的计算资源能够带来有意义的性能提升。训练基准通过评估系统吞吐量、内存效率和整体训练时间,随着引入额外的计算资源来衡量系统的扩展效果。

有效的扩展并不总是有保证的。理论上,增加更多的 GPU 或 TPU 应该会减少训练时间,但诸如通信开销、数据同步延迟和内存瓶颈等问题可能会限制扩展效率。训练基准通过量化性能如何随着硬件资源的增加而扩展来帮助识别这些挑战。一个设计良好的系统应该表现出接近线性的扩展,即 GPU 数量加倍会导致训练时间几乎减半。然而,现实世界中的低效率往往阻止了完美的扩展,而基准提供了必要的见解,以便相应地优化系统设计。

训练效率的另一个关键因素是达到准确度的时间,它衡量模型达到目标准确度水平有多快。这个指标连接了我们框架的算法和系统维度,将模型收敛特性与计算效率联系起来。通过利用训练基准,系统设计者可以评估他们的基础设施是否能够高效地处理大规模工作负载,同时保持训练的稳定性和准确性。

成本与能源因素

近年来,训练大规模模型的计算成本急剧上升,使得成本效益成为一个关键考虑因素。训练一个如 GPT-3 这样的模型可能需要数百万美元的云计算资源,这使得评估不同硬件和软件配置的成本效益变得至关重要。训练基准通过分析计算成本、云定价模型和能源消耗来提供量化每次训练运行成本的手段。

除了财务成本之外,能源效率已成为一个越来越重要的指标。大规模的训练运行消耗了大量的电力,导致显著的碳排放。基准通过测量每单位训练进展的电力消耗来帮助评估能源效率,使组织能够确定可持续的 AI 开发方法。

例如,MLPerf 包括一个能量基准测试组件,它跟踪训练过程中各种硬件加速器的功耗。这允许研究人员不仅从原始性能的角度,而且从其对环境的影响角度比较不同的计算平台。通过将能源效率指标整合到基准测试研究中,组织可以设计出在计算能力和可持续性目标之间取得平衡的人工智能系统。

公平的机器学习系统比较

训练基准的一个主要功能是建立一个标准化的框架,用于比较机器学习系统。鉴于今天可用的广泛硬件架构、深度学习框架和优化技术,确保公平和可重复的比较是至关重要的。

标准化基准提供了一种通用的评估方法,使得研究人员和实践者能够评估不同训练系统在相同条件下的表现。MLPerf Training 基准通过定义严格的评估标准,如图像分类、语言建模和推荐系统等深度学习任务,实现了供应商中立的比较。这确保了性能结果具有意义,并且不会因数据集预处理、超参数调整或实现细节的差异而失真。

这种标准化方法通过提供明确定义的评估方法来解决机器学习研究中的可重复性问题。结果可以在不同的计算环境中一致地重现,使研究人员在选择硬件、软件和训练方法时能够做出明智的决定,并推动人工智能系统开发的系统进步。

训练指标

评估机器学习训练的性能需要一套定义良好的指标,这些指标超越了传统的算法度量。从系统角度来看,训练基准评估机器学习模型被训练到预定义准确度阈值的有效性和效率。吞吐量、可扩展性和能源效率等指标只有在模型成功达到其目标准确度时才有意义。没有这个限制,仅仅优化原始速度或资源利用率可能会导致误导性的结论。

训练基准,例如 MLPerf Training,为不同的机器学习任务定义了特定的准确度目标,确保性能测量是以公平和可重复的方式进行。一个训练模型速度快但未能达到所需准确度的系统不被视为有效的基准结果。相反,一个达到最佳可能准确度但花费过多时间或资源的系统可能在实际应用中并不实用。有效的基准测试需要平衡速度、效率和准确度收敛。

时间和吞吐量

评估训练效率的主要指标之一是达到预定义准确度阈值所需的时间。训练时间 (TtrainT_{\text{train}}) 衡量模型达到可接受性能水平所需的时间,反映了系统的整体计算效率。它正式定义为:Ttrain=argmint{accuracy(t)target accuracy} T_{\text{train}} = \arg\min_{t} \big{ \text{accuracy}(t) \geq \text{target accuracy} \big}

该指标确保基准测试关注系统如何快速有效地实现有意义的结果。

吞吐量,通常以每秒处理的训练样本数量来表示,提供了系统性能的额外衡量标准:吞吐量=NsamplesTtrain \text{Throughput} = \frac{N_{\text{samples}}}{T_{\text{train}}} 其中 NsamplesN_{\text{samples}} 是处理的训练样本总数。然而,仅吞吐量并不能保证有意义的结果,因为一个模型可能快速处理大量样本,但并不一定能达到所需的准确度。

例如,在 MLPerf Training 中,ResNet-50 的基准可能需要达到 ImageNet 数据集上的 75.9% top-1 的准确度目标。一个每秒处理 10,000 张图像但未能达到这一准确度的系统不被视为有效的基准结果,而一个每秒处理图像较少但收敛效率高的系统则更可取。这突出了为什么吞吐量必须始终与时间到准确度相关联来评估,而不是作为一个独立的性能指标。

可扩展性与并行性

随着机器学习模型规模的增加,训练工作负载通常需要在多个处理器或加速器之间进行分布式计算。可扩展性衡量了随着更多计算资源的增加,训练性能如何有效提高。理想的系统应表现出接近线性的扩展,即 GPU 或 TPU 数量的加倍会导致训练时间的成比例减少。然而,现实世界的性能通常受到通信开销、内存带宽限制和并行化策略中的低效等因素的限制。

当训练像 GPT-3 这样的大型模型时,OpenAI 在分布式训练设置中使用了大约 10,000 个 NVIDIA V100 GPU。谷歌的系统在他们的 4,096 节点 TPU v4 集群中也展示了类似的扩展挑战,增加计算资源提供了更多的原始功率,但性能提升受到节点间网络通信开销的限制。例如,MLPerf 这样的基准测试量化了系统在多个 GPU 上的扩展能力,为分布式训练中效率低下的地方提供了见解。

训练中的并行性分为数据并行 28、模型并行 29 和流水线并行,每种都面临着不同的挑战。数据并行是最常用的策略,它涉及将训练数据集分割到多个计算节点上。这种方法的有效性取决于同步机制和梯度通信开销。相比之下,模型并行将神经网络本身进行分区,需要处理器之间的高效协调。基准测试评估系统在不降低精度收敛的情况下管理这些并行策略的能力。

资源利用率

机器学习训练的效率不仅取决于速度和可扩展性,还取决于可用硬件资源的使用情况。计算利用率衡量了在训练过程中处理单元(如 GPU 或 TPU)的活跃程度。低利用率可能表明数据移动、内存访问或工作负载调度效率低下存在瓶颈。

例如,当在 TPU 集群上训练 BERT 时,研究人员观察到输入管道的低效限制了整体吞吐量。尽管 TPU 具有很高的原始计算能力,但由于从存储中检索数据的速度慢,系统没有充分利用它们。通过分析资源利用率,工程师确定了瓶颈,并使用 TFRecord 和数据预取优化了输入管道,从而提高了性能。

内存带宽是另一个关键因素,因为深度学习模型在训练期间需要频繁访问大量数据。如果内存带宽成为限制因素,仅仅增加计算能力并不能提高训练速度。基准测试评估模型如何有效地利用可用内存,确保存储、主内存和处理单元之间的数据传输速率不会成为性能瓶颈。

I/O 性能在训练效率中也起着重要作用,尤其是在处理无法完全装入内存的大型数据集时。基准测试评估数据加载管道的效率,包括预处理操作、缓存机制和存储检索速度。未能优化数据加载的系统可能会经历显著的减速,无论计算能力如何。

能效与成本

训练大规模机器学习模型需要大量的计算资源,导致显著的能源消耗和财务成本。能效指标量化了训练工作负载的功耗,有助于识别那些优化计算效率同时最小化能源浪费的系统。对可持续性的日益关注导致了基于能源的基准测试的纳入,例如 MLPerf Training 中的基准测试,这些测试衡量每次训练运行的功耗。

训练 GPT-3 估计消耗了 1,287 MWh 的电力(D. Patterson et al. 2021a),这相当于 100 个美国家庭一年的能源使用量。如果一个系统可以用更少的训练迭代达到相同的精度,那么它将直接减少能源消耗。能源感知基准测试有助于指导硬件和训练策略的开发,以优化功率效率同时保持精度目标。

成本考虑不仅限于电力使用,还包括硬件费用、云计算成本和基础设施维护。训练基准测试通过测量与资源支出相关的训练时间,为不同硬件和软件配置的成本效益提供见解。组织可以使用这些基准测试在选择训练基础设施时平衡性能和预算限制。

容错与鲁棒性

训练工作负载通常需要运行很长时间,有时跨越数天或数周,这使得容错成为一项基本考虑因素。一个健壮的系统必须能够处理意外的故障,包括硬件故障、网络中断和内存错误,而不会影响精度收敛。

在大规模基于云的训练中,由于硬件不稳定,节点故障是常见的。如果一个分布式集群中的 GPU 节点失败,训练必须继续进行,而不会损坏模型。MLPerf Training 包括对容错训练策略的评估,例如检查点,其中模型定期保存其进度。这确保了故障不需要重新启动整个训练过程。

可重复性与标准化

为了使基准测试具有意义,结果必须在不同的运行、硬件平台和软件框架之间可重复。训练结果的不确定性可能源于随机过程、硬件差异和软件优化。确保可重复性需要标准化评估协议,控制模型初始化中的随机性,并确保数据集处理的一致性。

MLPerf Training 强制执行严格的可重复性要求,确保精度结果在多次训练运行中保持稳定。当 NVIDIA 为 MLPerf 提交基准测试结果时,他们必须证明他们的 ResNet-50 ImageNet 训练时间在不同 GPU 上保持一致。这确保了基准测试测量的是真正的系统性能,而不是随机性的噪声。

训练性能评估

评估机器学习训练系统的性能不仅涉及测量模型训练的速度。全面的基准测试方法考虑多个维度,每个维度都捕捉到系统行为的不同方面。所使用的具体指标取决于评估的目标,无论是优化速度、提高资源效率、减少能耗,还是确保鲁棒性和可重复性。

表 12.2 提供了核心类别及其相关指标的概述,这些指标通常用于基准测试系统级训练性能。这些类别作为理解训练系统在不同工作负载和配置下如何表现的一个框架。

表 12.2:训练基准维度:全面评估机器学习训练系统的关键类别和指标,超越简单的速度,评估资源效率、可重复性和整体性能权衡。理解这些维度能够系统地比较不同的训练方法和基础设施配置。

类别 关键指标 示例基准用途
训练时间和吞吐量 达到精度时间(秒、分钟、小时);吞吐量(样本/秒) 比较不同 GPU 架构的训练速度
可扩展性和并行性 扩展效率(理想加速的百分比);通信开销(延迟,带宽) 分析大型模型的分布式训练性能
资源利用率 计算利用率(% GPU/TPU 使用率);内存带宽(GB/s);I/O 效率(数据加载速度) 优化数据管道以提高 GPU 利用率
能源效率和成本 每次运行的能耗(MWh、kWh);每瓦性能(TOPS/W) 评估节能训练策略
容错性和鲁棒性 检查点开销(每次保存的时间);恢复成功率(%) 评估基于云的训练系统中的故障恢复
可重复性和标准化 运行间的差异(准确率、训练时间的百分比差异);框架一致性(TensorFlow 与 PyTorch 与 JAX) 确保基准测试结果在不同硬件上的一致性

训练时间和吞吐量通常是评估系统性能时首先考虑的指标。达到指定准确率水平所需的时间(时间到准确率)是一个实用且广泛使用的基准。吞吐量,通常以每秒样本数来衡量,提供了关于训练期间数据处理效率的见解。例如,当比较在 NVIDIA A100 和 V100 GPU 上训练的 ResNet-50 模型时,A100 通常提供更高的吞吐量和更快的收敛速度。然而,确保增加的吞吐量不会以收敛质量为代价是很重要的,尤其是在使用降低数值精度(例如,TF32)来加速计算时。

随着模型尺寸的持续增长,可扩展性成为关键的性能维度。高效地使用多个 GPU 或 TPU 对于训练大型模型(如 GPT-3 或 T5)至关重要。在这种情况下,扩展效率和通信开销是关键指标。一个系统可能线性扩展到 64 个 GPU,但超过这个范围,由于同步和通信成本的提高,性能提升可能会减少。监控互连带宽和梯度聚合延迟的基准测试工具可以揭示系统处理分布式训练的能力。

资源利用率通过检查系统如何有效地利用其计算和内存资源来补充这些措施。例如,GPU 利用率、内存带宽和数据加载效率等指标有助于识别性能瓶颈。例如,一个仅表现出适度 GPU 利用率的 BERT 预训练任务可能受到性能不佳的数据管道的限制。像分割输入文件或预取数据到设备内存这样的优化通常可以解决这些低效问题。

除了原始性能之外,能效和成本已成为越来越重要的考虑因素。大规模训练大型模型可能会消耗大量电力,引发环境和财务担忧。例如,每训练运行消耗的能源和每瓦性能(例如,TOPS/W)等指标有助于评估不同硬件和系统配置的可持续性。例如,虽然两个系统可能在相同的时间内达到相同的精度,但使用显著更少能源的系统可能更适合长期部署。

容错性和鲁棒性解决了系统在非理想条件下的性能表现,这在现实世界的部署中很常见。训练作业经常遇到硬件故障、中断或网络不稳定。检查点开销和恢复成功率等指标可以提供对训练系统弹性的洞察。在实践中,检查点可能会引入非微不足道的开销。例如,每 30 分钟暂停训练以写入完整的检查点可能会降低整体吞吐量 5-10%。系统必须在故障恢复和性能影响之间取得平衡。

最后,可重复性和标准化确保基准测试结果是连贯的、可解释的和可转移的。即使是软件库、初始化种子或浮点行为中的微小差异也可能影响训练结果。跨框架比较相同模型,例如将 PyTorch 与自动混合精度与 TensorFlow 与 XLA 进行比较,可以揭示收敛速度或最终精度的差异。可靠的基准测试需要仔细控制这些变量,并通过重复运行来评估统计方差。

这些维度共同提供了对训练性能的整体视角。它们帮助研究人员、工程师和系统设计师超越简单的比较,转向对机器学习系统在现实条件下的行为有更细微的理解。正如我们在先前的统计严谨框架中确立的,准确测量这些维度需要系统的方法,该方法区分了真实性能差异和统计噪声,并考虑了如 GPU 加速时钟 30 行为和热限制 31 等因素,这些因素可能会对测量产生重大影响。

训练基准陷阱

尽管存在定义良好的基准测试方法,但某些误解和有缺陷的评估实践往往导致误导性的结论。理解这些陷阱对于正确解释基准测试结果非常重要。

过度强调原始吞吐量

训练基准测试中常见的错误是假设更高的吞吐量总是意味着更好的训练性能。可以通过使用较低的数值精度、减少同步或甚至绕过某些计算来人为地提高吞吐量。然而,这些优化并不一定导致更快收敛。

例如,使用 TF32 精度的系统可能比使用 FP32 的系统具有更高的吞吐量,但如果 TF32 引入了导致达到目标精度所需的迭代次数增加的数值不稳定性,整体训练时间可能会更长。正确评估吞吐量的方法是与时间到精度相关,确保速度优化不会以收敛效率为代价。

隔离的单节点性能

在单个节点上评估训练性能而不考虑分布式扩展可能导致误导性的结论。当独立使用时,GPU 可能会显示出卓越的吞吐量,但当部署在像谷歌的 4,096 节点 TPU v4 配置的大型集群中时,通信开销和同步限制会显著减少这些效率提升。

例如,针对单节点性能优化的系统可能采用不适用于多节点环境的内存优化。像 GPT-3 这样的大型模型需要在数千个节点之间进行高效的梯度同步,这使得全面的可扩展性评估变得至关重要。谷歌在 4,096 节点 TPU 集群中的经验表明,梯度同步挑战成为此规模的主要性能因素。

忽略故障与干扰

许多基准测试假设了一个理想化的训练环境,其中硬件故障、内存损坏、网络不稳定或来自其他进程的干扰不会发生。然而,现实世界的训练作业经常遇到意外的故障和工作负载干扰,这需要检查点、恢复机制和资源管理。

优化于理想情况性能但缺乏容错性和干扰处理的系统可能在受控条件下实现令人印象深刻的基准测试结果,但频繁的故障、低效的恢复和资源竞争可能使其在大规模部署中不切实际。有效的基准测试应考虑检查点开销、故障恢复效率和来自其他进程干扰的影响,而不是假设完美的执行条件。

线性扩展假设

当评估分布式训练时,通常假设增加 GPU 或 TPUs 的数量将导致成比例的速度提升。在实践中,随着计算节点的增加,通信瓶颈、内存竞争和同步开销会导致回报递减。

例如,在 1,000 个 GPU 上训练模型并不一定比在 10 个 GPU 上训练快 100 倍。在某个规模上,梯度通信成本成为限制因素,抵消了额外并行性的好处。适当的基准测试应该评估可扩展性效率,而不是假设理想化的线性改进。

忽略可重复性

基准结果通常在没有验证它们在不同硬件和软件框架中的可重复性时就被报告。即使是浮点运算、内存布局或优化策略的微小变化,也可能在训练时间和精度上引入统计差异。

例如,在 TensorFlow 上使用 XLA 优化进行的基准测试可能表现出与使用 PyTorch 和自动混合精度(AMP)训练的相同模型不同的收敛特性。适当的基准测试需要评估多个框架的结果,以确保软件特定的优化不会扭曲性能比较。

训练基准合成

训练基准为机器学习系统性能提供了宝贵的见解,但对其解释需要仔细考虑现实世界的限制。高吞吐量并不一定意味着训练速度更快,如果它牺牲了精度收敛。同样,扩展效率必须全面评估,考虑到计算效率和通信开销。

避免常见的基准测试陷阱并采用结构化评估方法,使机器学习从业者能够更深入地了解如何优化训练工作流程、设计高效的 AI 系统以及开发可扩展的机器学习基础设施。随着模型复杂性的持续增加,基准测试方法必须演变以反映现实世界的挑战,确保基准在指导 AI 系统开发中保持有意义和可操作。

推理基准

在我们的框架中补充训练基准,推理基准专注于评估模型部署和服务的效率、延迟和资源需求。与训练不同,训练的重点是优化大规模计算,而推理涉及将训练好的模型部署到实时或批量预测中。这些基准有助于评估包括模型架构、硬件配置、精度优化技术和运行时优化在内的各种因素如何影响推理性能。

随着深度学习模型在复杂性和规模上的指数级增长,高效的推理成为一个越来越关键的挑战,尤其是对于需要实时决策的应用,如自动驾驶、医疗诊断和对话式 AI。例如,服务大规模语言模型需要处理数十亿个参数,同时保持可接受的低延迟。推理基准测试对底层硬件和软件堆栈进行系统评估,以确保模型可以在不同的环境中高效部署,从云数据中心到边缘设备。

ML 推理基准是对推理阶段的标准化评估,衡量延迟吞吐量能耗内存占用,以评估不同硬件和软件配置下的部署性能。

与通常在大规模数据中心进行且拥有充足计算资源的训练不同,推理必须针对极其多样化的部署场景进行优化,包括移动设备、物联网系统和嵌入式处理器。高效的推理依赖于多个相互关联的因素,如优化的数据管道、模型优化技术和硬件加速。基准测试有助于评估这些优化如何改善实际部署性能。

在这些优化要求的基础上,硬件选择在推理效率中扮演着越来越重要的角色。虽然 GPU 和 TPU 在训练中广泛使用,但推理工作负载通常需要专门的加速器,如 NPUs(神经网络处理器)32、FPGAs33 以及如 Google 的 Edge TPU34 等专用推理芯片。推理基准测试评估这些硬件组件的利用率和性能,帮助实践者根据他们的部署需求选择合适的配置。

在云服务器、边缘平台、移动设备和 tinyML 系统之间扩展推理工作负载引入了额外的复杂性。如图 12.7 图所示,这些系统之间的功耗差异很大,从微瓦到兆瓦不等。推理基准测试评估了延迟、成本和能效之间的权衡,从而帮助组织做出明智的部署决策。

图片

图 12.7:能耗:该图强调了各种系统类型之间功率使用的显著差异,从微瓦到兆瓦,强调了推理基准测试中延迟、成本和能效之间的权衡。

与训练类似,在本节中我们将参考 MLPerf 推理来阐述基准测试原则。MLPerf 的推理基准,建立在第 12.2 节 Section 12.2 中确立的基础之上,为从云端到边缘设备的部署场景提供了标准化的评估。

推理基准动机

将机器学习模型部署用于推理引入了一组独特的挑战,这些挑战与训练不同。虽然训练优化了大规模计算和大量数据集,但推理必须在现实世界环境中高效且大规模地提供预测。推理基准评估了特定部署的性能挑战,识别了模型从开发过渡到生产服务时出现的瓶颈。

与通常在专用高性能硬件上运行的训练不同,推理必须适应不同的约束条件。部署在云服务器的模型可能优先考虑高吞吐量的批量处理,而运行在移动设备上的相同模型必须在严格的延迟和功耗约束下运行。在计算和内存有限的边缘设备上,模型优化技术变得至关重要。基准有助于评估这些权衡,确保推理系统在不同平台上保持准确率、速度和效率之间的正确平衡。

推理基准有助于回答关于模型部署的基本问题。模型在现实世界条件下生成预测的速度有多快?推理速度与准确率之间的权衡是什么?推理系统能否在保持低延迟的同时处理不断增长的需求?通过评估这些因素,基准指导硬件和软件的优化,以提升整体效率 (Reddi 等人 2019b)。

推理基准的重要性

推理在人工智能应用中扮演着至关重要的角色,其性能直接影响可用性和成本。与通常离线进行的训练不同,推理通常在实时或接近实时的情况下进行,使得延迟成为主要关注点。自动驾驶汽车处理摄像头数据必须在毫秒内做出反应,而语音助手生成响应应该对用户来说感觉瞬间完成。

不同的应用对推理施加了不同的约束。一些工作负载需要单实例推理,即必须尽可能快地为每个单独的输入做出预测。这在实时系统中至关重要,如机器人、增强现实和对话式人工智能,在这些系统中,即使是微小的延迟也可能影响响应性。其他工作负载,如大规模推荐系统或搜索引擎,同时处理大量查询的批次,优先考虑吞吐量而非每个查询的延迟。基准允许工程师评估这两种场景,并确保模型针对其预期用途进行了优化。

训练与推理之间的一个关键区别是,推理工作负载通常在生产环境中持续运行,这意味着小的低效可能会随着时间的推移而累积。与一次运行并完成的训练作业不同,部署在云中的推理系统可能每天处理数百万个查询,而运行在智能手机上的模型必须在长时间使用中管理电池消耗。基准测试提供了一种结构化的方式来衡量在这些现实世界约束下的推理效率,帮助开发者就模型优化、硬件选择和部署策略做出明智的选择。

硬件与软件优化

高效推理依赖于硬件加速和软件优化。虽然 GPU 和 TPU 在训练中占据主导地位,但在推理方面,对硬件的需求更加多样化。基于云的 AI 服务可能会利用强大的加速器来处理大规模工作负载,而移动设备则依赖于专门的推理芯片,如 NPUs 或优化的 CPU 执行。在资源受限的嵌入式系统中,实现高性能需要仔细考虑内存和计算效率。基准测试有助于评估不同硬件平台处理推理工作负载的能力,从而指导部署决策。

软件优化同样重要。例如,TensorRT35、ONNX Runtime36 和 TVM37 等框架通过操作融合 38、数值精度调整和内核调优等优化来提高推理速度并减少计算开销。这些优化可以产生显著差异,尤其是在资源有限的环境中。基准测试允许开发者衡量这些技术对延迟、吞吐量和功耗效率的影响,确保优化能够转化为现实世界的改进,而不会降低模型精度。

扩展性与效率

推理工作负载在扩展需求上差异很大。处理每秒数百万个查询的基于云的 AI 系统必须确保增加的需求不会导致延迟,而运行本地模型的移动应用程序即使在电源限制下也必须快速执行。与通常在固定的高性能机器上进行的训练不同,推理必须根据使用模式和可用计算资源动态扩展。

基准测试评估推理系统在不同条件下的扩展性。它们衡量在查询负载增加的情况下性能如何保持,额外的计算资源是否提高了推理速度,以及模型在不同部署环境中的运行效率。大规模推理部署通常涉及分布式推理服务器,其中多个模型副本并行处理传入的请求。基准测试评估这种扩展的效率,以及额外资源是否导致延迟和吞吐量的实质性改进。

推理效率的另一个关键因素是冷启动性能,即模型加载并开始处理查询所需的时间。这对于不持续运行推理而是按需加载模型的应用尤其相关。基准测试有助于确定系统是否可以快速从空闲状态过渡到活跃执行状态,而不会产生显著的开销。

成本与能源因素

由于推理工作负载持续运行,运营成本和能源效率是关键因素。与训练不同,训练中的计算成本是一次性发生的,而推理成本会随着模型在生产中的部署而累积。大规模运行低效模型会显著增加云计算费用,而低效的移动推理系统会迅速耗尽电池电量。基准测试提供了每条推理请求的成本洞察,帮助组织在性能和成本效益之间进行优化。

能源效率也是一个日益关注的问题,尤其是对于移动和边缘人工智能应用。许多推理工作负载在电池供电的设备上运行,过度的计算会影响可用性。例如,在智能手机上运行的模型必须优化以最小化功耗,同时保持响应性。基准测试有助于评估每瓦推理效率,确保模型可以在不同平台上可持续运行。

公平机器学习系统比较

应用为训练基准建立的标准化评估原则,推理评估需要相同的严格比较方法。MLPerf 推理将这些原则扩展到部署场景,为图像分类、目标检测和语音识别等任务定义了不同硬件平台和优化技术下的评估标准。这确保了推理性能比较在考虑部署特定约束(如延迟要求和能源效率)的同时,保持其意义和可重复性。

推理度量

评估推理系统的性能需要与训练中使用的指标截然不同。虽然训练基准强调吞吐量、可扩展性和达到准确性的时间,但推理基准必须关注实际部署设置中的延迟、效率和资源利用率。这些指标确保机器学习模型在不同环境中表现良好,从处理数百万请求的云数据中心到在严格的电源和内存约束下运行的移动和边缘设备。

与之前强调吞吐量和达到准确性的时间训练基准不同,推理基准评估训练好的模型在规模上处理输入和生成预测的效率。以下章节描述了最重要的推理基准测试指标,解释了它们的相关性和如何用于比较不同的系统。

延迟与尾部延迟

延迟是推理的最关键性能指标之一,尤其是在实时应用中,延迟可能会对用户体验或系统安全产生负面影响。延迟是指推理系统处理输入并产生预测所需的时间。虽然系统的平均延迟是有用的,但它无法捕捉到高需求场景中的性能,在这些场景中偶尔的延迟可能会降低可靠性。

为了考虑这一点,基准测试通常测量尾部延迟 39,这反映了系统中的最坏情况延迟。这些通常报告为 95 百分位数(p95)或 99 百分位数(p99)延迟,意味着 95%或 99%的推理在给定时间内完成。对于自动驾驶或实时交易等应用,保持低尾部延迟对于避免可能导致灾难性后果的不可预测延迟至关重要。

尾部延迟与大规模生产系统中用户体验的联系变得至关重要,这些系统服务于数百万用户。即使是小的 P99 延迟下降也会在大用户群体中产生累积效应:如果 1%的请求经历 10 倍延迟(例如,1000ms 而不是 100ms),这将影响每百万请求中的 10,000 个用户,可能导致超时错误、用户体验差和客户流失。搜索引擎和推荐系统展示了这种敏感性:谷歌发现额外的 500ms 延迟会减少 20%的搜索流量,而亚马逊发现延迟增加 100ms 会减少 1%的销售额。

生产系统中的服务级别目标(SLOs)因此关注尾部延迟而不是平均延迟,以确保一致的用户体验。典型的生产 SLOs 指定交互式服务的 P95 < 100ms 和 P99 < 500ms,认识到偶尔的缓慢响应会对用户满意度产生不成比例的影响。像 Netflix 和 Uber 这样的大规模系统优化 P99.9 延迟以处理流量峰值和影响服务可靠性的基础设施变化。

吞吐量与批量效率

虽然延迟衡量单个推理请求的速度,但吞吐量衡量系统每秒可以处理多少个推理请求。对于视觉任务,通常以每秒查询数(QPS)或每秒帧数(FPS)表示。一些推理系统基于单实例操作,其中每个输入在到达后立即独立处理。其他系统通过批量推理并行处理多个输入,这可以通过利用硬件优化显著提高效率。

例如,每秒处理数百万查询的云服务从批量推理中受益,其中大量输入一起处理以最大化计算效率。相比之下,机器人、交互式 AI 和增强现实等应用需要低延迟的单实例推理,系统必须立即对新输入做出响应。

基准测试必须考虑单实例和批量吞吐量,以全面了解不同部署场景下的推理性能。

精度与准确度权衡

优化推理性能通常涉及降低数值精度,这可以显著加速计算同时减少内存和能耗。然而,低精度计算可能会引入精度下降,因此评估速度和预测质量之间的权衡变得至关重要。

推理基准测试评估模型在不同数值设置下的表现,例如 FP3240、FP1641 和 INT842。许多现代 AI 加速器支持混合精度推理,允许系统根据工作负载需求动态调整数值表示。模型压缩技术 43 进一步提高了效率,但它们对模型精度的影响取决于任务和数据集。基准测试有助于确定这些优化是否适用于部署,确保效率的提升不会以不可接受的精度损失为代价。

内存占用与模型大小

除了计算优化之外,内存占用对于推理系统来说也是另一个关键考虑因素,尤其是对于资源有限的设备。高效的推理不仅取决于速度,还取决于内存使用。与训练不同,大型模型可以在强大的 GPU 或 TPU 上分布,推理通常要求模型在严格的内存预算内运行。总模型大小决定了部署所需的存储量,而 RAM 使用反映了执行期间所需的运行内存。一些模型需要较大的内存带宽来高效地在处理单元之间传输数据,如果硬件缺乏足够的容量,这可能会成为瓶颈。

推理基准测试评估这些因素,以确保模型可以在各种设备上有效部署。一个精度高但超出内存限制的模型可能在实际应用中不切实际。为了解决这个问题,通常会应用各种压缩技术来减小模型大小同时保持精度。基准测试有助于评估这些优化是否在内存效率和预测性能之间取得了正确的平衡。

冷启动与模型加载时间

一旦内存需求得到优化,冷启动性能对于确保推理系统在部署后能够快速响应变得至关重要。在许多部署场景中,模型并不总是保留在内存中,而是在需要时按需加载。这可能会引入显著的延迟,尤其是在无服务器 AI 环境中 44,其中资源根据传入请求动态分配。冷启动性能衡量系统从空闲状态快速切换到活动执行状态的速度,确保推理可用而无需过长的等待时间。

模型加载时间指的是将训练好的模型加载到内存中以便处理输入所需的时间。在某些情况下,尤其是在资源受限的设备上,模型必须频繁重新加载以释放内存供其他应用程序使用。第一次推理请求所需的时间也是一个重要考虑因素,因为它反映了用户与 AI 服务交互时体验到的总延迟。基准测试有助于量化这些延迟,确保推理系统可以满足现实世界的响应速度要求。

动态工作负载扩展

虽然冷启动延迟解决了初始响应速度问题,但可扩展性确保推理系统可以随着时间的推移处理波动的工作负载和并发需求。推理工作负载必须在不同使用模式中有效地进行扩展。在基于云的 AI 服务中,这意味着高效地处理数百万并发用户,而在移动或嵌入式设备上,则涉及管理多个同时运行的 AI 模型,而不会过载系统。

可扩展性衡量在分配额外的计算资源时推理性能的改善程度。在某些情况下,添加更多的 GPU 或 TPU 可以显著提高吞吐量,但在其他场景中,如内存带宽限制或网络延迟等瓶颈可能会限制扩展效率。基准测试还评估系统在实际部署中平衡多个并发模型的能力,其中不同的 AI 功能可能需要同时运行而不会相互干扰。

对于基于云的 AI,基准测试评估系统处理波动需求的有效性,确保推理服务器可以动态分配资源而不影响延迟。在移动和嵌入式 AI 中,高效的多模型执行对于同时运行多个 AI 功能至关重要,而不会降低系统性能。

能耗与效率

由于推理工作负载在生产环境中持续运行,功耗和能效成为关键考虑因素。这对于移动和边缘设备尤为重要,因为电池寿命和热限制限制了可用的计算资源。即使在大型云环境中,电力效率也直接影响运营成本和可持续性目标。

单次推理所需的能量通常以每推理焦耳(J/inference)来衡量,反映了系统在最小化功耗的同时处理输入的效率。在基于云的推理中,效率通常以每秒每瓦特查询数(QPS/W)来表示,以量化系统在性能和能耗之间的平衡程度。对于移动 AI 应用,优化推理功耗可以延长电池寿命,并允许模型在资源受限的设备上高效运行。降低能耗在使大规模 AI 系统更加环保可持续方面也发挥着关键作用,确保计算进步与节能部署策略相一致。通过平衡功耗与性能,节能推理系统使 AI 能够在各种应用中可持续扩展,从数据中心到边缘设备。

推理性能评估

评估推理性能是了解机器学习系统如何满足现实世界应用需求的关键步骤。与通常在离线进行的训练不同,推理系统必须在广泛的部署场景中高效地处理输入并生成预测。诸如延迟、吞吐量、内存使用和能源效率等指标提供了一种结构化的方式来衡量系统性能并确定改进领域。

表 12.3 以下总结了用于评估推理系统的关键指标,突出了它们在不同环境中的相关性。虽然每个指标都提供了独特的见解,但全面地对待推理基准测试非常重要。指标之间的权衡,包括速度与准确性的权衡以及吞吐量与功耗的权衡,是常见的,理解这些权衡对于有效的系统设计至关重要。

表 12.3:推理性能指标:评估延迟、吞吐量和资源使用为优化部署的机器学习系统和选择适当的硬件配置提供了定量基础。理解这些指标及其之间的权衡对于在现实世界应用中平衡速度、成本和准确性至关重要。

类别 关键指标 示例基准用途
延迟和尾部延迟 平均延迟(ms/请求);尾部延迟(p95,p99,p99.9) 评估对安全至关重要的 AI 的实时性能
吞吐量和效率 每秒查询数(QPS);每秒帧数(FPS);批量吞吐量 比较大规模云推理系统
数值精度影响 准确度下降(FP32 与 INT8);降低精度带来的加速 在优化推理中平衡准确性与效率
内存占用 模型大小(MB/GB);RAM 使用(MB);内存带宽利用率 评估边缘和移动部署的可行性
冷启动和加载时间 模型加载时间(秒);首次推理延迟(秒) 评估无服务器 AI 的响应性
可扩展性 负载下的效率;多模型服务性能 测量动态、高需求系统的鲁棒性
功率和能源效率 功耗(瓦特);每瓦性能(QPS/W) 优化移动和可持续 AI 的能源使用

推理系统考虑因素

推理系统根据其部署的位置和方式面临独特的挑战。实时应用,如自动驾驶汽车或语音助手,需要低延迟以确保及时响应,而大规模云部署则侧重于最大化吞吐量以处理数百万个查询。另一方面,边缘设备受限于内存和电力,使得效率变得至关重要。

评估推理性能最重要的方面之一是理解不同指标之间的权衡。例如,为了提高吞吐量而进行的优化可能会增加延迟,使系统不适合实时应用。同样,降低数值精度可以提高功率效率和速度,但可能会导致轻微的精度下降。深思熟虑的评估必须平衡这些权衡,以符合预期的应用。

部署环境也在确定评估优先级方面发挥着重要作用。基于云的系统通常优先考虑可扩展性和对动态工作负载的适应性,而移动和边缘系统则需要仔细关注内存使用和能源效率。这些不同的优先级意味着基准必须根据系统使用的上下文量身定制,而不是依赖于一刀切的评价。

最终,评估推理性能需要一种全面的方法。专注于单一指标,如延迟或能源效率,只能提供一个不完整的画面。相反,必须考虑所有相关维度,以确保系统以平衡的方式满足其功能、资源和性能目标。

上下文相关指标

不同的部署场景需要明显不同的指标优先级,因为操作约束和成功标准在各个环境中差异很大。理解这些优先级允许工程师有效地集中基准测试工作,并在适当的决策框架内解释结果。表 12.4 说明了性能优先级如何在五个主要部署环境中转变,揭示了操作约束和优化目标之间的系统性关系。

表 12.4:按部署环境优先级排序的性能指标:不同的操作环境需要不同的优化重点,反映了不同的约束和成功标准。理解这些优先级有助于指导基准选择和结果解释,在适当的决策框架内进行。

部署环境 主要优先级 次要优先级 三级优先级 关键设计约束
实时应用 延迟(p95 < 50ms) 可靠性(99.9%) 内存占用 用户经验要求即时响应
云规模服务 吞吐量(QPS) 成本效率 平均延迟 业务可行性需要大规模
边缘/移动设备 功耗 内存占用 延迟 电池寿命和资源限制主导
训练工作负载 训练时间 GPU 利用率 内存效率 研究速度使实验更快
科学/医疗 准确性 可靠性 可解释性 为了性能不能妥协正确性

表 12.4 中所示的结构层次反映了操作约束如何驱动性能优化策略。实时应用是延迟关键部署的例子,其中用户体验依赖于系统的即时响应。自动驾驶车辆感知系统必须在严格的时序截止日期内处理传感器数据,这使得 p95 延迟比峰值吞吐量更重要。表格显示可靠性作为次要优先级,因为自动驾驶车辆中的系统故障具有超越性能问题的安全影响。

相反,云规模服务优先考虑总吞吐量以处理数百万并发用户,通过提高查询的成本效率来接受更高的平均延迟。从吞吐量到成本效率再到延迟的演变反映了经济现实:云服务提供商必须在优化每台服务器的收入的同时,保持可接受的用户体验。注意,相同的指标(延迟)对于实时应用是主要优先级,但对于云服务是三级优先级,这证明了性能评估的上下文依赖性。

边缘和移动部署面临明显不同的约束,其中电池寿命和热限制主导设计决策。一个通过提高 50%的吞吐量但增加 30%功耗的智能手机 AI 助手代表了净退步,因为电池寿命的减少直接影响用户满意度。训练工作负载呈现另一个独特的优化领域,其中研究生产力取决于实验周转时间,这使得 GPU 利用效率和内存带宽对于实现更大模型探索至关重要。

科学和医疗应用将准确性和可靠性确立为不可协商的要求,性能优化服务于这些主要目标而不是替代它们。一个在 10ms 延迟下实现 99.2%准确性的医疗诊断系统,与在 5ms 延迟下实现 98.8%准确性的系统相比,提供了更高的价值,这证明了特定上下文优先级如何引导有意义的性能评估。

这个优先级框架从根本上塑造了基准测试的解释和优化策略。实现 2 倍吞吐量提升对云部署具有显著价值,但对于电池供电的边缘设备来说,20%的电力减少就能带来更好的操作影响。

推理基准测试陷阱

即使有明确定义的指标,基准测试推理系统也可能具有挑战性。评估过程中的失误往往会导致误导性的结论。以下是在分析推理性能时学生和从业者应了解的常见陷阱。

过度强调平均延迟

虽然平均延迟提供了响应时间的基准度量,但它无法捕捉系统在峰值负载下的性能。在现实场景中,最坏情况下的延迟,如通过 p9545 或 p9946 尾部延迟等指标捕捉到的,可能会对系统可靠性产生重大影响。例如,如果偶尔的延迟峰值超过可接受阈值,会话式人工智能系统可能无法及时响应。

忽略内存和能源限制

一个具有出色吞吐量或延迟的模型,如果需要过多的内存或电力,可能不适合移动或边缘部署。例如,为云环境设计的推理系统可能在电池供电设备上无法高效运行。适当的基准测试必须考虑内存占用和能耗,以确保在不同部署环境中的实用性。

忽略冷启动性能

在按需加载模型的函数式环境中,冷启动延迟 47 是一个关键因素。忽略初始化模型和处理第一个请求所需的时间可能导致对响应速度的不切实际的期望。评估模型加载时间和首次推理延迟确保系统设计能够满足现实世界的响应速度要求。

独立指标评估

基准测试推理系统通常涉及平衡相互竞争的指标。例如,最大化批量吞吐量可能会降低延迟,而激进地降低精度可能会降低准确性。只关注单一指标而忽略其对其他指标的影响可能导致评估不完整或误导。

数值精度优化很好地体现了这一挑战。单个加速器基准测试显示 INT8 操作相比 FP32 实现了 4 倍更高的 TOPS48(每秒万亿操作),创造了引人注目的性能叙事。

线性缩放假设

推理性能并不总是与额外资源的增加成比例。内存带宽、热限制或通信开销等瓶颈可能会限制添加更多 GPU 或 TPU 带来的好处。如第十一章第十一章所述,这些扩展限制源于基本的硬件约束和互连架构。假设线性扩展行为的基准测试可能会高估系统性能,尤其是在分布式部署中。

忽略应用需求

通用基准测试结果可能无法满足特定应用的需求。例如,针对云推理优化的基准测试可能对边缘设备不相关,在边缘设备中,能源和内存限制占主导地位。根据部署环境定制基准测试确保结果具有意义且可操作。

统计显著性及噪声

区分有意义的性能改进与测量噪声需要适当的统计分析。遵循之前建立的评估方法原则,MLPerf 通过要求多次基准测试和报告基于百分比的指标来解决测量变异性(Reddi 等人 2019b)。例如,MLPerf 推理报告了 99 百分位延迟和平均性能,同时捕捉到单次测量可能错过的典型行为和最坏情况。这种方法认识到系统性能因热限制、内存分配模式和后台进程等因素而自然变化。

推理基准测试合成

推理基准测试是理解系统性能的关键工具,但其效用取决于仔细和全面的评估。如延迟、吞吐量、内存使用和能效等指标提供了有价值的见解,但它们的重要性取决于应用和部署环境。学生应将基准测试视为平衡多个优先级的流程,而不是优化单一指标。

避免常见陷阱并考虑不同指标之间的权衡,使从业者能够设计出可靠、高效且适合实际部署的推理系统。基准测试的最终目标是引导与预期应用需求相一致的系统改进。

MLPerf 推理基准测试

由 MLCommons49 开发的 MLPerf Inference 基准测试,提供了一个标准化的框架,用于评估不同部署环境下的机器学习推理性能。最初,MLPerf 仅从一个推理基准测试开始,但随着机器学习系统扩展到各种应用,很明显,一个通用的基准测试是不够的。不同的推理场景,包括基于云的 AI 服务和资源受限的嵌入式设备,需要定制的评估。这一认识导致了 MLPerf 推理基准测试系列的发展,每个基准测试都是为了评估特定部署环境中的性能。

MLPerf Inference

MLPerf Inference 作为基准测试的基准,最初是为了评估大规模推理系统而设计的。它主要关注数据中心和基于云的推理工作负载,在这些场景中,高吞吐量、低延迟和高效资源利用至关重要。该基准测试评估了包括图像分类、目标检测、自然语言处理和推荐系统在内的多种深度学习模型的性能。这个版本的 MLPerf 仍然是比较高性能计算环境中 AI 加速器、GPU、TPU 和 CPU 的黄金标准。

主要技术公司通常会参考 MLPerf 结果来做出硬件采购决策。在评估推荐系统基础设施的硬件时,MLPerf 基准测试在 DLRM50(深度学习推荐模型)工作负载上的分数会直接影响到不同加速器代际之间的选择。基准测试持续显示,与上一代相比,新的 GPU 架构在推荐推理上的吞吐量提高了 2-3 倍,这往往足以证明大规模生产部署时高额成本的合理性。这展示了标准化基准测试如何直接转化为整个行业数百万美元的基础设施决策。

全面基准测试的成本

虽然基准测试对于机器学习系统开发至关重要,但它伴随着巨大的成本,限制了参与者的范围,仅限于资源充足的机构。提交 MLPerf 可能需要大量的工程努力,以及数十万美元的硬件和云计算时间。一个全面的 MLPerf 训练提交需要数月的工程时间进行优化、调整和验证,涵盖多个硬件配置。仅计算成本就可能超过 10 万美元,以涵盖多个工作负载和系统规模的全套提交。

这种成本障碍解释了为什么 MLPerf 提交主要由主要技术公司和硬件供应商主导,而较小的组织则依赖于已发布的结果而不是进行他们自己的全面评估。进入门槛的高要求促使需要更多轻量级的内部基准测试实践,组织可以使用这些实践在不花费全面标准化基准测试费用的情况下做出明智的决策。

MLPerf Mobile

MLPerf Mobile 将 MLPerf 的评估框架扩展到智能手机和其他移动设备。与基于云的推理不同,移动推理在严格的电源和内存限制下运行,要求模型在保持响应性的同时进行优化以提高效率。该基准测试测量实时人工智能任务的延迟和响应性,例如基于摄像头的场景检测、语音识别和增强现实应用。MLPerf Mobile 已成为评估旗舰智能手机和移动人工智能芯片上人工智能性能的行业标准,帮助开发者优化适用于设备上人工智能工作负载的模型。

MLPerf 客户端

MLPerf 客户端 关注于消费计算设备上的推理性能,例如笔记本电脑、台式机和工作站。这个基准测试针对直接在个人设备上运行的本地人工智能工作负载,消除了对云推理的依赖。实时视频编辑、语音转文字转录和人工智能增强生产力应用等任务属于此类。与基于云的基准测试不同,MLPerf 客户端评估人工智能工作负载与通用硬件(如 CPU、离散 GPU 和集成神经网络处理器(NPUs))的交互,使其对消费和企业人工智能应用相关。

MLPerf Tiny

MLPerf Tiny 的创建是为了对嵌入式和超低功耗人工智能系统进行基准测试,例如物联网设备、可穿戴设备和微控制器。与其他评估在强大加速器上性能的 MLPerf 基准测试不同,MLPerf Tiny 评估的是在计算、内存和电源资源有限的设备上的推理性能。这个基准测试对于智能传感器、AI 驱动的自动化和实时工业监控等应用尤其相关,在这些应用中,模型必须在处理能力最少的硬件上高效运行。MLPerf Tiny 在边缘人工智能的进步中发挥着关键作用,帮助开发者优化适用于受限环境的模型。

进化与未来方向

MLPerf 推理从单一基准测试到一系列基准测试的演变反映了人工智能部署场景的多样性。不同的环境,包括云、移动、桌面和嵌入式环境,都有独特的约束和要求,MLPerf 提供了一种结构化的方式来相应地评估人工智能模型。

MLPerf 是一个必不可少的工具:

  • 理解推理性能在不同部署设置中的变化。

  • 学习哪些性能指标对不同人工智能应用最为相关。

  • 根据实际使用约束优化模型和硬件选择。

认识到定制推理基准的必要性加深了我们对于人工智能部署挑战的理解,并突出了基准测试在开发高效、可扩展和实用机器学习系统中的重要性。

能源效率考虑因素贯穿于训练(第 8.2 节)和推理(第 8.3 节)基准方法中,认识到功耗对这两个阶段的影响不同。训练能源成本分摊到模型寿命中,而推理能源成本按查询累积,直接影响操作效率。以下关于功率测量技术的分析支持了每个基准测试阶段中涵盖的能源指标。

功率测量技术

能源效率基准测试需要专门的测量技术,这些技术考虑了机器学习部署环境中不同的功率范围。在训练和推理部分建立能源考虑的基础上,这些技术使系统性地验证第十章中提到的优化声明和第十一章中提到的硬件效率改进成为可能。

虽然性能基准有助于优化速度和精度,但它们并不总是考虑能源效率,这在现实世界的部署中已成为一个越来越关键的因素。第九章中关于能源效率的原则,平衡计算复杂性、内存访问模式和硬件利用率,需要通过标准化的能源基准进行定量验证。这些基准使我们能够验证第十章中提到的架构优化和第十一章中提到的硬件感知设计是否在实践上真正实现了承诺的能源节约。

然而,在机器学习系统中测量功耗面临着根本性的独特挑战。机器学习模型的能源需求在部署环境中差异很大,如表 12.5 所示,跨越多个数量级。从仅消耗微瓦特的 TinyML 设备到需要千瓦时的数据中心机架,这一广泛的范围说明了创建标准化基准测试方法的基本挑战(Henderson 等人 2020a)。

表 12.5:功耗谱:机器学习部署展现出广泛的功耗需求,从微瓦级的 TinyML 设备到毫瓦级的微控制器;这种可变性对标准化能效基准的开发提出了挑战。理解这些差异对于优化在资源受限和高性能计算环境中的模型部署至关重要。

类别 设备类型 功耗
微型 神经决策处理器(NDP) 150 µW
微型 M7 微控制器 25 mW
移动 Raspberry Pi 4 3.5 W
移动 智能手机 4 W
边缘 智能摄像头 10-15 W
边缘 边缘服务器 65-95 W
机器学习服务器节点 300-500 W
机器学习服务器机架 4-10 kW

这种功耗需求的巨大范围,跨越了四个数量级,对测量和基准测试提出了重大挑战。因此,创建一个统一的方法需要仔细考虑每个规模独特的特征。例如,在 TinyML 设备中准确测量微瓦级功耗需要不同于监控千瓦级服务器机架的仪器和技术。任何全面的基准测试框架都必须适应这些截然不同的规模,同时确保测量在不同硬件配置中保持一致、公平和可重复。

功率测量边界

为了解决这些测量挑战,图 12.8 展示了在不同系统规模下如何测量功耗,从 TinyML 设备到全规模数据中心推理节点。每个场景都突出了不同的测量边界,以绿色显示,表示包含在能源核算中的组件。这些边界之外的组件,以红色虚线表示,不包括在功率测量中。

图 12.8:功率测量边界:MLPerf 定义了功率测量的系统边界,范围从单芯片设备到完整的数据中心节点,以实现不同硬件平台间能效的公平比较。这些边界界定了哪些组件的功耗包含在报告的指标中,影响了对性能结果的解释。来源:(Tschand 等人 2024)。

该图分为三个类别,分别是微型、推理和训练示例,每个类别都反映了基于系统架构和部署环境的不同测量范围。在 TinyML 系统中,整个低功耗 SoC,包括计算、内存和基本互连,通常都位于测量边界内。推理节点引入了更多的复杂性,包括多个 SoC、本地存储、加速器和内存,而通常不包括远程存储和片外组件。训练部署跨越多个机架,其中仅测量选定的元素,包括计算节点和网络交换机,而存储系统、冷却基础设施和互连布线的部分通常被排除在外。

系统级功耗测量比单独测量单个组件提供了更全面的视角。虽然组件级指标(例如,加速器或处理器功耗)对于性能调整很有价值,但现实世界的机器学习工作负载涉及计算单元、内存系统和支持基础设施之间复杂的交互。例如,对谷歌的 TensorFlow Mobile 工作负载的分析表明,数据移动占用了总推理能耗的 57.3%(Boroumand 等人 2018),突显了内存受限操作如何主导系统功耗。

共享基础设施带来了额外的挑战。在数据中心,冷却系统和电力供应等资源需要在不同的工作负载之间共享,这使得将能源使用归因于特定的机器学习任务变得复杂。仅冷却一项就可能占整个设施电力消耗的 20-30%,使其成为能源效率评估中的主要因素(Barroso, Clidaras, 和 Hölzle 2013)。即使在边缘,内存和 I/O 接口等组件可能同时服务于机器学习和非机器学习功能,进一步模糊了测量边界。

共享基础设施的复杂性因现代系统采用的动态电源管理技术而进一步加剧,这些技术旨在优化能源效率。动态电压和频率缩放(DVFS)根据工作负载需求调整处理器电压和时钟频率,在计算强度较低期间实现显著的功耗降低。使用片上开关调节器的先进 DVFS 实现可以显著节省能源(W. Kim 等人 2008),导致相同机器学习模型在不同系统负载和并发活动下的功耗变化在 30-50%之间。这种可变性不仅影响计算组件,也影响支持基础设施,因为降低的处理器活动可以降低冷却需求和整体设施电力消耗。

支持基础设施,尤其是冷却系统,是大规模部署中总能耗的主要组成部分。数据中心必须维持操作温度,通常在 20-25°C 之间,以确保系统可靠性。冷却开销体现在电力使用效率(PUE)指标中,该指标在高度高效的设施中为 1.1,而在优化较差的设施中超过 2.0(Barroso, Hölzle, and Ranganathan 2019)。计算工作负载与冷却基础设施之间的相互作用产生了复杂的依赖关系;例如,像动态电压频率调整(DVFS)这样的电源管理技术不仅减少了直接处理器功耗,还降低了热量产生,对冷却需求产生了级联效应。即使是边缘设备也需要基本的热管理。

计算效率与功耗

计算性能与能源效率之间的关系是现代机器学习系统设计中最重要的权衡之一。随着系统追求更高的性能,它们往往因为半导体缩放和电力传输的基本物理限制而在能源效率上遇到递减的回报(Koomey 等人 2011)。这种关系在处理器频率缩放中尤为明显,提高时钟频率 20%通常只能带来适度的性能提升(大约 5%),而功耗却可能增加高达 50%,反映了电压、频率和功耗之间的立方关系(Le Sueur 和 Heiser 2010)。

在具有严格能源约束的部署场景中,尤其是电池供电的边缘设备和移动应用,优化这种性能-能源权衡对于实际可行性至关重要。模型优化技术提供了实现更好效率而不显著降低准确性的有希望的方法。数值精度优化技术,在保持模型质量的同时减少计算需求,有效地展示了这种权衡。研究表明,降低精度计算可以在保持模型精度在原始精度 1-2%的范围内,同时将推理速度和能源效率提高 3-4 倍。

这些优化策略涵盖了三个相互关联的维度:准确性、计算性能和能源效率。高级优化方法能够对这种权衡空间进行精细控制。同样,模型优化和压缩技术需要在准确性损失和效率提升之间进行仔细平衡。这些因素中的最佳工作点在很大程度上取决于部署需求和限制;移动应用程序通常优先考虑能源效率以延长电池寿命,而基于云的服务可能会在更高的功耗成本下优化准确性,利用规模经济和专用冷却基础设施。

随着基准测试方法的不断发展,能源效率指标在人工智能系统评估和优化中变得越来越重要。将功率测量标准(如 MLPerf Power 中建立的)的整合为比较不同硬件平台和部署场景的能源效率提供了标准化框架。未来在可持续人工智能基准测试方面的进步将帮助研究人员和工程师设计系统,这些系统能够系统地平衡性能、功耗和环境影响,确保机器学习系统高效运行,同时最大限度地减少不必要的能源浪费并支持更广泛的可持续性目标。

标准化功率测量

尽管像SPEC Power这样的功率测量技术长期以来一直存在于通用计算系统中(Lange 2009),但机器学习工作负载提出了独特的挑战,需要专门的测量方法。机器学习系统表现出独特的功率消耗模式,特点是强烈的计算阶段与数据移动和预处理操作交替出现。这些模式在不同类型的模型和任务之间差异很大。大型语言模型的功率特征与计算机视觉推理任务的功率特征大相径庭。

直接功率测量需要仔细考虑采样率和测量窗口。例如,某些神经网络架构在复杂计算期间会产生短暂的、强烈的功率峰值,需要高频采样(> 1 KHz)才能准确捕捉。相比之下,CNN 推理通常显示出更一致的功率消耗模式,可以用较低的采样率捕捉。测量持续时间还必须考虑到机器学习特有的行为,如预热期,初始推理可能由于缓存填充和流水线初始化而消耗更多功率。

机器学习工作负载中的内存访问模式对功耗测量有显著影响。虽然传统的计算基准测试可能主要关注处理器功耗,但机器学习系统通常在内存层次结构之间移动数据时消耗大量能量。例如,推荐模型如 DLRM 在内存访问上可能比计算消耗更多的能量。这需要能够捕获计算和内存子系统功耗的测量方法。

加速器特定的考虑因素进一步复杂化了功耗测量。许多机器学习系统采用专门的硬件,如 GPU、TPU 或 NPU。这些加速器通常有自己的电源管理方案,并且可以独立于主系统处理器运行。准确测量需要捕获所有相关计算单元的功耗,同时保持适当的时间同步。这在可能根据工作负载特征或功耗限制动态切换不同计算资源的异构系统中尤其具有挑战性。

机器学习工作负载的规模和分布也影响着测量方法。在分布式训练场景中,功耗测量必须考虑到本地计算功率以及节点间梯度同步的能量成本。同样,边缘机器学习部署必须考虑主动推理的功耗以及模型更新或数据预处理的能量成本。

批次大小和吞吐量考虑因素又增加了一层复杂性。与传统的计算工作负载不同,机器学习系统通常以批处理方式处理输入以提高计算效率。然而,批次大小与功耗之间的关系是非线性的。虽然较大的批次通常可以提高计算效率,但它们也会增加内存压力和峰值功耗要求。因此,测量方法必须捕获不同批次大小的功耗,以提供完整的效率概览。

在机器学习工作中,系统空闲状态需要特别注意,尤其是在边缘场景中,系统间歇性地运行,当新数据到达时积极处理,然后在推理之间进入低功耗状态。例如,一个唤醒词检测的微型机器学习系统可能只有很小一部分运行时间处于积极处理音频状态,这使得空闲功耗成为整体效率的关键因素。

温度效应对机器学习系统功耗测量起着至关重要的作用。持续的机器学习工作负载可能导致显著的温度升高,触发热限制并改变功耗模式。这在边缘设备中尤为重要,因为热限制可能会限制持续性能。测量方法必须考虑到这些热效应及其对功耗的影响,尤其是在长时间基准测试运行期间。

MLPerf 功耗案例研究

MLPerf Power (Tschand 等人 2024) 是衡量机器学习系统能源效率的标准方法。这个全面的基准测试框架提供了对各种机器学习部署中功耗的准确评估。在数据中心层面,它测量大规模人工智能工作负载中的功耗,能源消耗优化直接影响到运营成本。对于边缘计算,它评估智能手机和笔记本电脑等消费设备的功耗效率,其中电池寿命限制至关重要。在微型推理场景中,它评估超低功耗人工智能系统的能源消耗,特别是严格预算下的物联网传感器和微控制器。

MLPerf Power 方法应用了之前讨论的标准评估原则,适应从通用 CPU 到专用人工智能加速器的各种硬件架构。这种方法确保了跨平台的比较有意义,同时在不同计算规模上保持测量的一致性。

该基准积累了由行业组织提交的数千个可重复测量结果,这展示了他们的最新硬件能力以及整个行业对节能人工智能技术的关注。图 12.9 通过连续的 MLPerf 版本展示了系统规模上能源效率的演变。

图片

图 12.9:能源效率提升:MLPerf 推理基准的连续版本在多样化的系统规模(数据中心、边缘和微型)上持续提高能源效率(样本/瓦特),反映了硬件和软件优化在人工智能工作负载方面的持续进步。标准化的测量协议使得不同人工智能系统和部署场景之间能源效率改进的比较变得有意义,推动整个行业向可持续的人工智能技术发展。来源:(Tschand 等人 2024)。

MLPerf Power 方法适应不同的硬件架构,从通用 CPU 到专用人工智能加速器,同时保持统一的测量标准。这确保了平台间的比较既有意义又无偏见。

在 MLPerf 基准套件的各个版本和机器学习部署规模中,行业组织提交了他们最新硬件的可重复测量结果,以观察和量化行业对优化人工智能技术以提高能源效率的重视。图 12.9显示了 MLPerf 版本中从微型到数据中心规模系统能源效率的趋势。

这些趋势的分析揭示了两个显著的模式:首先,在传统机器学习工作负载的所有三个尺度上,能源效率的改进趋于平缓;其次,对于生成式人工智能应用,能源效率显著提高。这种二分法表明,传统机器学习任务的优化技术已经成熟,生成式人工智能领域的快速创新正在发生。这些趋势强调了该领域面临的双重挑战:开发新的方法来突破效率平台,同时确保越来越强大的生成式人工智能模型可持续扩展的实践。

基准测试的局限性和最佳实践

有效的基准测试需要理解其固有的局限性并实施缓解这些限制的实践。而不是因为其局限性而避免基准测试,成功的从业者认识到这些挑战并相应地调整他们的方法。以下分析检查了四个相互关联的基准测试挑战类别,同时提供了通过改进设计和解释实践来解决每个限制的可操作指导。

统计与方法问题

可靠基准测试的基础在于稳健的统计方法。如果未解决,以下三个基本问题会破坏这一基础。

不完整的问题覆盖是最基本的局限性之一。许多基准虽然对受控比较有用,但未能捕捉到现实世界应用的全部多样性。例如,常见的图像分类数据集,如CIFAR-10,包含有限的图像种类。因此,在这些数据集上表现良好的模型在应用于更复杂、现实世界场景时可能会遇到困难,这些场景具有更大的光照、视角和物体组成的变化。基准任务与现实世界复杂性之间的差距意味着强大的基准性能为实际部署的成功提供了有限的保证。

统计不显著出现在基准评估在太少的数据样本或试验上进行时。例如,在一个小数据集上测试光学字符识别(OCR)系统可能无法准确反映其在大规模、嘈杂文本文档上的性能。如果没有足够的试验和多样化的输入分布,基准测试结果可能会误导或未能捕捉到真正的系统可靠性。围绕基准分数的统计置信区间通常未报告,掩盖了测量的差异是否代表真正的改进或测量噪声。

可重现性代表了一个持续存在的重大挑战。基准测试结果可能会因硬件配置、软件版本和系统依赖等因素而显著不同。编译器、数值精度或库更新的微小差异可能导致不同环境中的性能测量不一致。为了减轻这一问题,MLPerf 通过提供参考实现、标准化的测试环境和严格的提交指南来解决可重现性问题。即使有这些努力,在多样化的硬件平台上实现真正的统一性仍然是一个持续存在的挑战。优化库、框架版本和编译器标志的激增创造了一个巨大的配置空间,其中微小的变化会产生不同的结果。

实验室到部署的性能差距

除了统计严谨性之外,基准测试必须与实际部署目标相一致。当基准测试强调速度、准确性和吞吐量等指标时,与实际目标不匹配的情况就会发生。在实际的人工智能部署中,通常需要平衡多个目标,包括能效、成本和鲁棒性。一个在基准测试上实现最先进准确性的模型,如果消耗过多能量或需要昂贵的硬件,可能在实际部署中并不实用。同样,针对基准数据集的平均性能进行优化可能会忽视生产系统中决定用户体验的尾部延迟需求。实际部署的多目标性质,包括资源限制、运营成本、维护复杂性和商业需求,远远超出了大多数基准测试所奖励的单指标优化。

系统设计挑战

物理和架构因素引入了额外的可变性,基准测试必须通过我们建立的跨不同部署环境下的比较方法来应对。

环境条件

人工智能基准测试的环境条件指的是实验进行的物理和操作环境。这些条件虽然在基准设计时往往被忽视,但可能会显著影响基准测试结果并影响实验的可重现性。物理环境因素包括环境温度、湿度、空气质量和海拔。这些因素可以通过微妙但可测量的方式影响硬件性能。例如,较高的温度可能导致处理器热限制,从而降低计算速度并影响基准测试结果。同样,海拔的变化可能会由于空气压力的变化而影响冷却系统效率和硬盘性能。

除了物理因素之外,操作环境因素涵盖了基准测试执行的更广泛系统背景。这包括系统上运行的背景进程、网络条件和电源稳定性。其他活跃程序或服务可能会竞争计算资源,从而改变正在评估的模型的表现特性。为确保基准测试结果的准确性和可重现性,尽可能详细地记录和控制这些环境条件是至关重要的。这可能涉及在温度控制环境中进行实验、监测和报告环境条件、标准化基准测试系统的操作状态,以及记录任何背景进程或系统负载。

在所有环境变量难以控制的情况下,例如在分布式或基于云的基准测试中,详细报告这些条件变得至关重要。这些信息使其他研究人员在解释或尝试重现结果时能够考虑到潜在的变异。随着机器学习模型在多样化的现实世界环境中越来越多地部署,了解环境条件对模型性能的影响变得尤为重要。这种知识不仅确保了更准确的基准测试,而且也指导了开发能够适应不同操作条件并保持一致性能的鲁棒模型。

硬件彩票

基准测试中的一个关键且常被忽视的问题是所谓的硬件彩票 51,这是一个由(Hooker 2021)提出的概念。机器学习模型的成功不仅取决于其架构和训练数据,还取决于其与用于推理的底层硬件的匹配程度。一些模型表现异常出色,并不是因为它们本质上更好,而是因为它们针对 GPU 或 TPU 的并行处理能力进行了优化。与此同时,一些有潜力的架构可能被忽视,因为它们无法有效地映射到主导的硬件平台。

这种对硬件兼容性的依赖在基准测试结果中引入了微妙但重要的偏差。一个在特定 GPU 上效率很高的模型可能在 CPU 或定制 AI 加速器上表现不佳。例如,图 12.10 比较了不同硬件平台上的模型性能。多硬件模型在 CPU uint8和 GPU 配置上与“MobileNetV3 Large min”具有可比的结果。然而,当在 EdgeTPU 和 DSP 硬件上运行时,这些多硬件模型在 MobileNetV3 Large 基准上显示出显著的性能提升。这强调了多硬件模型在专用计算环境中效率的变动性。

图片

图 12.10:硬件依赖的准确性:模型性能在不同硬件平台上差异显著,表明架构效率不仅由设计决定,还由硬件兼容性决定。多硬件模型在 CPU 和 GPU 配置上与 mobilenetv3 large 具有可比的准确性,但在 EdgeTPU 和 DSP 上实现了实质性提升,强调了在专用计算环境中进行硬件感知模型优化的重要性。来源:(Chu 等人 2021)。

在没有仔细跨不同硬件配置进行基准测试的情况下,该领域可能会偏向于“赢得”硬件随机性的架构,而不是根据其内在优势选择模型。这种偏见可能会塑造研究方向,影响资金分配,并影响下一代人工智能系统的设计。在极端情况下,它甚至可能通过阻碍探索与当前硬件趋势不一致的替代架构来抑制创新。

组织与战略问题

竞争压力和研究激励导致了对基准的使用和解释存在系统性偏见。这些组织动态需要治理机制和社区标准来维护基准的完整性。

基准工程

虽然硬件随机性是硬件趋势的意外后果,但基准工程是一种有意为之的实践,其中模型或系统被明确优化以在特定的基准测试中表现出色。这种做法可能导致误导性的性能声明和无法推广到基准测试环境之外的结果。

当人工智能开发者针对特定基准分数微调超参数、预处理技术或模型架构时,就会发生基准工程,而不是为了提高实际性能。例如,一个目标检测模型可能会被精心优化以在基准测试中实现创纪录的低延迟,但在具有变化光照、运动模糊和遮挡的动态、现实世界环境中部署时可能会失败。同样,一个语言模型可能会被调整以在基准数据集上表现出色,但在处理非正式用语和代码切换的对话语音时可能会遇到困难。

实现高基准分数的压力通常由竞争、营销和研究认可驱动。基准经常被用来对人工智能模型和系统进行排名,从而产生针对它们进行优化的激励。虽然这可以推动技术进步,但它也冒着以牺牲更广泛的泛化能力为代价来优先考虑基准特定优化的风险。这一现象体现了 Goodhart 定律 52。

偏见和过度优化

为了确保基准测试保持有用和公平,可以采用几种策略。透明度是维护基准测试完整性的最重要的因素之一。基准测试提交应包括任何应用的优化详细文档,确保改进与基准特定的调整清晰区分。研究人员和开发者应报告基准性能和现实世界的部署结果,以提供系统能力的完整图景。

另一种方法是多样化和进化基准测试方法。而不是依赖于单一静态的基准,人工智能系统应该被评估在多个、持续更新的基准上,这些基准反映了现实世界的复杂性。这降低了模型过度拟合单一测试集的风险,并鼓励通用改进而不是狭窄优化。

标准化和第三方验证也可以帮助减轻偏差。通过建立行业范围内的基准测试标准并要求对结果进行独立的第三方审计,人工智能社区可以提高基准测试结果的可信度和可靠性。第三方验证确保报告的结果可以在不同的环境中重复,并有助于防止无意的基准测试操纵。

另一个重要的策略是应用特定测试。虽然基准测试提供了受控评估,但现实世界的部署测试仍然至关重要。人工智能模型不仅应在基准数据集上评估,还应在实际部署环境中进行评估。例如,自动驾驶模型应在各种天气条件和城市环境中进行测试,而不仅仅是根据受控的基准测试数据集进行评判。

最后,必须考虑硬件平台之间的公平性。基准测试应该在多种硬件配置上测试人工智能模型,以确保性能不是仅仅由与特定平台的兼容性驱动的。这有助于降低硬件彩票的风险,并为人工智能系统效率提供更平衡的评估。

基准测试进化

在基准测试中面临的一个最大挑战是,基准测试永远不会静止不变。随着人工智能系统的不断发展,评估它们的基准也必须随之进化。今天定义的“良好性能”可能在明天就变得无关紧要,因为模型、硬件和应用需求都在变化。虽然基准测试对于跟踪进展至关重要,但它们也可能迅速过时,导致过度优化旧指标而不是真正的性能提升。

这种演变在 AI 基准测试的历史中表现得非常明显。例如,早期的模型基准测试主要关注图像分类和目标检测,因为这些是首批广泛研究的深度学习任务之一。然而,随着 AI 扩展到自然语言处理、推荐系统和生成式 AI,很明显,这些早期的基准测试不再反映该领域最重要的挑战。为此,新的基准测试出现,以衡量语言理解(Wang 等人 2018, 2019)和生成式 AI(Liang 等人 2022)。

基准测试的演变不仅限于新任务的添加,还包括性能测量新维度的涵盖。虽然传统的 AI 基准测试强调准确性和吞吐量,但现代应用需要跨多个标准进行评估:公平性、鲁棒性、可扩展性和能效。图 12.11 通过科学应用展示了这种复杂性,这些应用在性能要求上跨越了多个数量级。例如,大型强子对撞机传感器必须以接近 1014^{14}字节每秒的速率处理数据(相当于大约每秒 100 太字节)并具有纳秒级的计算时间,而移动应用则以每秒 104^{4}字节的速率运行,具有更长的计算窗口。这种需求范围需要专门的基准测试。例如,边缘 AI 应用需要像 MLPerf 这样的基准测试,它专门评估在资源限制下的性能,而科学应用领域需要它们自己的“快速科学机器学习”基准测试(Duarte 等人 2022a))。

图片

图 12.11:性能谱:科学应用和边缘设备对计算资源的需求差异极大,数据速率和延迟要求跨越多个数量级。因此,仅关注准确性的传统基准测试是不够的;针对特定评估指标和基准测试,如 MLPerf,对于优化跨不同部署场景的 AI 系统变得至关重要。来源:(Duarte 等人 2022b)。

需要不断演进的基准测试也带来了一项挑战:稳定性与适应性之间的平衡。一方面,基准测试必须保持足够稳定,以便在一段时间内进行有意义的比较。如果基准测试变化过于频繁,就难以追踪长期进展并将新结果与历史性能进行比较。另一方面,未能更新基准测试会导致停滞,模型将针对过时的任务进行优化,而不是推动领域的发展。在基准测试的长期性和适应性之间取得正确的平衡是人工智能社区持续面临的挑战。

尽管存在这些困难,但不断演进基准测试对于确保人工智能进展具有意义至关重要。如果没有更新,基准测试可能会脱离现实世界的需求,导致研究人员和工程师专注于优化模型以适应人工测试案例,而不是解决实际挑战。随着人工智能继续扩展到新的领域,基准测试必须保持同步,确保性能评估保持相关、公平并与现实世界部署场景保持一致。

MLPerf 作为行业标准

MLPerf 在通过减少偏差、增加泛化性和确保基准测试与人工智能进步同步发展方面发挥了关键作用。其关键贡献之一是基准测试环境的标准化。通过提供参考实现、明确定义的规则和可重复的测试环境,MLPerf 确保了性能结果在不同硬件和软件平台之间的一致性,从而减少了基准测试结果的可变性。

认识到人工智能被部署在各种现实世界环境中,MLPerf 还引入了与我们的三维框架相一致的不同类别的推理基准测试。MLPerf 推理、MLPerf 移动、MLPerf 客户端和 MLPerf 微型的纳入反映了评估模型在不同部署约束下的努力,同时保持本章中确立的系统评估原则。

除了提供结构化的基准测试框架之外,MLPerf 还在不断演进,以跟上人工智能快速发展的步伐。新的任务被纳入基准测试,以反映新兴的挑战,例如生成式人工智能模型和节能计算,确保评估保持相关性和前瞻性。通过定期更新其基准测试方法,MLPerf 有助于防止基准测试过时或鼓励对旧性能指标的过度拟合。

通过优先考虑公平性、透明度和适应性,MLPerf 确保基准测试始终是指导人工智能研究和部署的有意义工具。MLPerf 的演进基准测试旨在捕捉现实世界人工智能性能的复杂性,最终促进更可靠、高效和有影响力的人工智能系统。

模型和数据基准测试

我们的三维基准测试框架包括系统(如上所述已广泛涵盖)、模型和数据。虽然系统基准测试一直是我们的主要关注点,但全面的 AI 评估需要理解算法和数据质量因素如何补充系统性能测量。AI 性能不仅仅取决于系统效率。机器学习模型和数据集在塑造 AI 能力方面同样起着至关重要的作用。模型基准测试评估算法性能,而数据基准测试确保训练数据集高质量、无偏见,并且能够代表现实世界的分布。理解这些方面至关重要,因为 AI 系统不仅仅是计算管道,它们深深依赖于它们所执行的模型和所训练的数据。

模型基准测试

模型基准测试衡量不同机器学习算法在特定任务上的表现如何。历史上,基准测试几乎完全集中在准确性上,但随着模型变得更加复杂,包括公平性、鲁棒性、效率和泛化能力在内的其他因素也变得同样重要。

机器学习的演变在很大程度上是由基准数据集驱动的。MNIST 数据集(Lecun 等人,1998)是早期催化剂之一,推动了手写数字识别的进步,而 ImageNet 数据集(J. Deng 等人,2009)引发了图像分类的深度学习革命。最近,像 COCO(T.-Y. Lin 等人,2014)用于目标检测和 GPT-3 的训练语料库(T. Brown 等人,2020)等数据集进一步推动了模型能力的发展边界。

然而,模型基准测试面临着重大的局限性,尤其是在大型语言模型(LLMs)的时代。除了模型在现实世界条件下失败的传统挑战,通常被称为 Sim2Real 差距之外,一种新的基准优化形式已经出现,类似于但与计算机系统中的经典基准工程不同。在传统的系统评估中,开发者会明确优化他们的代码实现,以便在像 SPEC 或 TPC 这样的基准测试套件上表现良好,我们之前在“基准工程”部分讨论过。在 LLMs 的情况下,这种现象通过数据而不是代码表现出来:当模型在大规模网络语料库上训练时,基准数据集可能会无意中出现在训练数据中,导致人为地夸大了性能分数,这些分数反映了记忆而不是真正的能力。例如,如果一个基准测试在网络上广泛讨论,它可能会被包含在用于训练 LLM 的网页数据中,使得模型在该测试中表现良好不是由于真正的理解,而是由于在训练期间看到了类似的例子(R. Xu 等人 2024)。这为模型评估创造了根本性的挑战,因为基准任务上的高性能可能反映了记忆而不是真正的能力。关键的区别在于机制:虽然系统基准工程是通过显式的代码优化发生的,但 LLM 基准适应可以通过预训练期间的数据暴露隐式发生,这提出了关于当前评估方法有效性的新问题。

这些挑战不仅限于大型语言模型(LLMs)。传统的机器学习系统仍然在过拟合和偏差问题上挣扎。例如,性别阴影项目(Buolamwini 和 Gebru 2018)揭示了商业面部识别模型在深色皮肤个体上的表现显著更差,突显了在模型评估中公平性的关键重要性。这样的发现强调了仅仅关注整体准确率指标的局限性。

面向未来,我们必须从根本上重新思考其基准测试的方法。这种演变需要开发评估框架,超越传统的指标,以评估模型行为的多个维度,从泛化性和鲁棒性到公平性和效率。关键挑战包括创建随着模型进步而保持相关性的基准,开发能够区分真正能力和人工性能提升的方法,以及建立基准文档和透明度的标准。在这些领域的成功将有助于确保基准结果提供了关于模型能力的有意义的见解,而不是反映了训练程序或评估设计的产物。

数据基准测试

人工智能的传统发展一直侧重于以模型为中心的方法,强调架构改进和优化技术。然而,当代人工智能的发展表明,数据质量,而不仅仅是模型设计,通常决定了性能界限。这种认识已经将数据基准测试提升到一个关键领域,确保人工智能模型从高质量、多样化和无偏见的数据集中学习。

这种演变代表了从以模型为中心到以数据为中心的人工智能方法的根本转变,如图 12.12(Figure 12.12)所示。传统的以模型为中心的范式侧重于增强模型架构、细化算法和改进计算效率,同时将数据集视为固定组件。相比之下,新兴的数据为中心的方法通过更好的标注、增加多样性和减少偏见系统地提高数据集质量,同时保持一致的模型架构和系统配置。研究越来越多地表明,有系统的数据集增强可以带来比单独的模型改进更优越的性能提升,挑战了传统上对架构创新的重视。

图片

图 12.12:发展范式:以模型为中心的人工智能优先考虑固定数据集的架构创新,而以数据为中心的人工智能通过一致的模型架构系统地提高数据集质量(标注、多样性和偏见)以实现性能提升。现代研究表明,战略性的数据增强往往比仅仅细化模型复杂性带来更大的改进。

在人工智能发展中,数据质量的首要性反映了理解上的根本转变:优越的数据集,而不仅仅是复杂的模型,能产生更可靠和稳健的人工智能系统。像 DataPerf 和 DataComp 这样的倡议已经出现,以系统地评估数据集改进如何影响模型性能。例如,DataComp (Nishigaki 2024) 表明,在精心挑选的 30%数据子集上训练的模型比在完整数据集上训练的模型取得了更好的结果,挑战了更多数据自动导致更好性能的假设 (Northcutt, Athalye, and Mueller 2021)。

数据基准测试中的一个重大挑战来自数据集饱和。当模型在 ImageNet 等基准测试上达到几乎完美的准确性时,区分性能提升是否代表人工智能能力的真正进步或仅仅是现有测试集的优化变得至关重要。图 12.13 展示了这一趋势,显示了在过去十年中人工智能系统在各种应用中超越人类性能。

图片

图 12.13:数据集饱和:人工智能系统在基准数据集上超越人类表现,表明持续的进步可能并不反映真正的智能提升,而是对固定评估集的优化。这一趋势强调了需要动态、具有挑战性的数据集,以准确评估人工智能能力并推动超越简单模式识别的实质性进步。来源:(Kiela 等人 2021 年)。

这种饱和现象引发了根本性的方法论问题(Kiela 等人 2021 年)。MNIST 数据集提供了一个说明性的例子:某些测试图像,尽管对人类几乎无法辨认,但在 1994 年数据集创建时被赋予了特定的标签。当模型正确预测这些标签时,它们看似超凡的表现实际上可能只是对数据集缺陷的记忆,而不是真正的数字识别能力。

这些挑战不仅限于单个领域。挑衅性的问题“我们是否已经完成了 ImageNet?”(Beyer 等人 2020 年)突显了对静态基准测试局限性的更广泛担忧。针对固定数据集优化的模型往往难以应对分布变化,即训练数据收集之后的现实世界变化。这种局限性推动了动态基准测试方法的发展,如 Dynabench(Kiela 等人 2021 年),该方法根据模型性能不断演变测试数据,以保持基准的相关性。

当前的数据基准测试努力涵盖了几个关键维度。标签质量评估仍然是核心关注点,如 DataPerf 的调试挑战所探讨的那样。像 MSWC(Mazumder 等人 2021 年)这样的语音识别倡议解决了数据集中的偏差和代表性问题。通过 RxRx 和 WILDS(Koh 等人 2021 年)等基准测试,特别关注了分布外泛化。这些多样化的努力反映了人们越来越认识到,提升人工智能能力不仅需要更好的模型和系统,还需要在数据质量评估和基准设计方面采取根本性的改进方法。

全面的系统-模型-数据评估

传统的 AI 基准测试将系统、模型和数据视为独立的实体。然而,现实世界的 AI 性能源于这三个组件之间的相互作用。一个快速的系统无法弥补一个训练不佳的模型,即使是功能最强大的模型也受限于其学习数据的质量。这种相互依赖性需要一种全面的基准测试方法,该方法将这三个维度综合考虑。

如图 12.14 所示,基准测试的未来在于一个综合框架,该框架共同评估系统效率、模型性能和数据质量。这种方法使研究人员能够识别出当这些组件单独分析时不可见的优化机会。例如,与硬件感知优化协同设计高效的 AI 模型和精心挑选的数据集可以带来卓越的性能,同时降低计算成本。

图片

图 12.14:AI 系统互依性:突出基础设施、模型和数据在决定整体 AI 系统性能中的关键相互作用,强调优化需要整体方法而不是孤立的改进。此图说明一个组件的收益不能完全弥补其他组件的局限性,需要协同设计策略以实现高效和有效的 AI。

随着 AI 的持续发展,基准测试方法必须同步进步。通过系统、模型和数据的视角评估 AI 性能确保基准测试不仅推动准确性的改进,还推动效率、公平性和鲁棒性的改进。这种整体视角对于开发不仅强大而且实用、可扩展和符合伦理的 AI 至关重要。

生产环境评估

到目前为止讨论的基准测试方法(从微观到端到端粒度,从训练到推理评估)主要针对受控条件下的系统性能。然而,在第十三章中介绍的实施策略揭示了生产环境引入了明显不同的挑战,需要专门的评估方法。生产机器学习系统必须在保持一致性能和可靠性的同时处理动态工作负载、变化的数据质量、基础设施故障和并发用户需求。这需要将我们的基准测试框架扩展到单点性能测量之外,以评估系统在时间、压力和故障场景下的行为。

静默故障检测代表了生产基准测试中缺失的研究评估框架的一个关键维度。机器学习模型可以在没有明显错误信号的情况下无声退化,产生看似合理但实际上错误的输出,从而逃避传统的监控。生产基准测试必须建立基线性能分布,并通过统计过程控制方法检测细微的准确性退化。A/B 测试框架在相同的流量条件下将新模型版本与稳定的基线进行比较,不仅衡量平均性能,还衡量性能变异性以及尾部行为。

持续数据质量监控解决生产数据流动态性带来的问题,这些问题可能导致分布偏移、对抗性示例或损坏的输入。生产级基准测试必须评估模型在现实数据质量变化下的鲁棒性,包括缺失特征、超出范围的值和输入格式变化。监控系统跟踪特征分布漂移,测量训练数据和生产数据之间的统计距离,以预测何时需要重新训练。数据验证管道基准测试预处理鲁棒性,确保模型能够优雅地处理数据质量问题,而不会出现无声故障。

压力测试和容量规划评估系统在反映真实用户行为的各种流量模式下的性能。生产级机器学习系统必须处理请求峰值、并发用户会话以及持续的高吞吐量操作,同时保持延迟要求。基准测试协议模拟现实负载模式,包括日间流量变化、突发流量事件和有机增长场景。容量规划基准测试衡量系统利用率接近极限时性能的下降情况,从而实现主动的扩展决策。

运营弹性基准测试评估系统在基础设施故障、网络分区和资源限制情况下的行为。生产系统必须在部分故障期间保持服务可用性,当资源不可用时优雅降级,并快速从故障中恢复。混沌工程方法系统地引入故障以测量系统弹性:关闭推理服务器、引入网络延迟和限制计算资源以观察降级模式和恢复特性。

生产中的多目标优化需要平衡精度、延迟、成本和资源利用率的基准测试框架。生产系统在优化用户体验指标(如转化率和参与度)的同时,也优化传统的机器学习指标。成本效率基准测试评估每预测的计算成本、模型工件存储成本和系统维护的运营开销。服务级别目标(SLOs)定义了多个维度的可接受性能范围,从而实现生产系统健康状况的系统评估。

持续模型验证实现自动基准测试管道,这些管道随着时间的推移评估模型在保留数据集和合成测试案例上的性能。影子部署技术在新模型与生产系统并行运行时,比较输出结果而不影响用户体验。冠军挑战者框架通过受控发布系统地评估模型改进,衡量性能改进和可能对下游系统产生的负面影响。

因此,生产基准测试需要端到端评估框架,这些框架不仅超越了模型准确度,还涵盖了系统可靠性、运营效率和用户体验优化。这种全面的方法确保了机器学习系统在动态生产环境中提供一致的价值,同时保持对任务关键应用的必要鲁棒性。

谬误与陷阱

本章中建立的基准测试方法和框架(从我们的三维评估框架到训练和推理的具体指标)为系统评估提供了强大的工具。然而,它们的有效性关键在于避免常见的误解和方法论错误,这些错误可能会损害基准的有效性。基准的标准化性质,虽然促进了公平比较,但往往会导致对其普遍适用性的错误自信。

谬误: 基准性能直接转化为实际应用性能。

这种误解导致团队仅根据基准排名选择模型和系统,而不考虑部署环境的不同。基准通常使用精心挑选的数据集、标准化的评估协议和最佳配置,这些很少与实际条件相匹配。生产系统面临基准场景中未捕获的数据质量问题、分布变化、延迟限制和资源限制。一个在基准测试中达到最先进性能的模型,由于这些环境差异,在部署时可能会失败得非常严重。有效的系统选择需要通过部署特定的评估来补充基准结果,而不是仅仅依赖于标准化指标。

陷阱: 仅针对基准指标进行优化,不考虑更广泛的系统需求。

许多从业者专注于提高基准分数,而不理解这些优化如何影响整体系统行为。提升特定指标的技术可能会降低其他重要特性,如鲁棒性、校准、公平性或能源效率。过度拟合到基准评估协议可能会创建在特定测试条件下表现良好但无法推广到各种现实世界场景的模型。这种狭隘的优化方法,是第 12.10.4.1 节中讨论的 Goodhart 定律 53 的表现,通常会产生在受控环境中表现优异但在实际部署的复杂性和不可预测性面前挣扎的系统。

谬误: 单一指标评估足以深入了解系统性能。

这种信念假设一个主要指标可以捕捉系统性能的所有相关方面。现代人工智能系统需要从多个维度进行评估,包括准确性、延迟、吞吐量、能耗、公平性和鲁棒性。仅优化准确性可能会产生具有不可接受的推理延迟的系统,而专注于吞吐量可能会损害结果质量。不同的利益相关者会优先考虑不同的指标,部署环境也会产生单指标无法捕捉的不同约束。全面的评估需要多维评估框架,以揭示所有相关性能方面的权衡。

陷阱: 使用过时的基准,这些基准不再反映当前的挑战和需求。

团队往往在基准不再代表有意义的挑战或当前部署现实之后继续使用既定的基准。随着模型能力的提升,基准可能会饱和,在方法之间提供很少的区分力。同样,不断变化的应用需求、新的部署环境和不断发展的公平性标准可能会使现有基准变得无关或误导。随着时间的推移,基准数据集也可能发展出隐藏的偏差或质量问题。有效的基准测试需要定期评估评估框架是否仍然为当前的挑战和部署场景提供有意义的见解。

陷阱: 在评估生产系统性能时,没有考虑到操作约束而应用研究型基准。

许多团队使用为研究比较设计的学术基准来评估生产系统,而忽略了研究和操作环境之间的基本差异。研究基准通常假设有无限的计算资源、最佳数据质量和理想化的部署条件,这些条件在现实生产环境中很少存在。生产系统必须处理并发用户负载、变化的输入质量、网络延迟、内存限制和系统故障,这些因素与受控基准条件相比会显著影响性能。此外,生产系统需要同时优化多个目标,包括成本效率、可用性和用户体验,而单指标研究基准无法捕捉到这些。有效的生产评估需要通过操作指标(如负载下的持续吞吐量、从故障中恢复的时间、资源利用效率以及包括数据预处理和后处理开销在内的端到端延迟)来补充研究基准。

摘要

本章将基准测试确立为关键的测量学科,验证了第二部分和第三部分中引入的性能主张和优化策略。通过开发一个全面的三维框架,同时评估算法、系统和数据,我们展示了系统测量如何将高效 AI 设计(第九章)、模型优化(第十章)和硬件加速(第十一章)的理论进步转化为可量化的工程改进。从历史计算基准到专门的 ML 评估方法的发展,揭示了为什么现代 AI 系统需要多方面的评估方法,以捕捉现实世界部署的复杂性。

现代基准测试框架的技术复杂性揭示了测量方法如何直接影响整个 AI 生态系统中创新方向和资源配置决策。系统基准如 MLPerf 通过建立标准化的工作负载和指标,使得不同架构之间可以进行公平的比较,从而推动硬件优化和基础设施发展。模型基准通过定义具有挑战性的任务和评估协议,揭示局限性并指导研究优先级,从而推动算法创新。数据基准揭示了关于表示、偏差和质量的关键问题,这些问题直接影响模型的公平性和泛化能力。这些基准测试维度的整合创建了一个全面的评估框架,捕捉了现实世界 AI 部署挑战的复杂性。

关键要点

  • 有效的基准测试需要对系统、模型和数据的多维度评估,以捕捉现实世界的部署挑战。

  • 标准化基准如 MLPerf 推动硬件创新,并使不同架构和实现之间的公平比较成为可能。

  • 基准设计选择从根本上塑造了整个 AI 生态系统中研究优先级和资源配置。

  • 未来的基准测试必须发展以应对围绕 AI 安全、公平性和环境影响的新兴挑战。

这里建立的基准测试基础为第 IV 部分:鲁棒部署中探索的操作部署策略提供了必要的测量基础设施。从性能测量到生产部署的转变需要将基准验证扩展到实验室条件之外。虽然本章专注于受控条件下的系统评估,但第 IV 部分解决了动态工作负载、数据分布演变和现实世界 ML 系统部署中具有代表性的操作约束带来的额外复杂性。在第十三章(ch019.xhtml#sec-ml-operations)中,我们将这些基准测试原则扩展到生产环境,其中连续监控可以检测到静默故障,跟踪模型性能下降,并在离线基准测试无法捕捉的动态工作负载下验证系统行为。在生产监控中引入的 A/B 测试框架和冠军挑战者方法直接建立在通过训练和推理基准测试建立的比较评估原则之上。

第十五章(ch021.xhtml#sec-security-privacy)中隐私和安全挑战同样需要专门的基准测试方法,这些方法评估的维度超出了纯粹的性能。对抗鲁棒性基准测试衡量模型对有意攻击的抵抗能力,而隐私保护计算框架则需要权衡效用和隐私保证之间的基准测试。第十六章(ch022.xhtml#sec-robust-ai)中的鲁棒性要求需要评估协议,以评估模型在分布变化、数据损坏和传统基准测试忽视的边缘情况下的行为。

随着 AI 系统在关键应用中的影响力日益增强,今天开发的基准测试框架决定了我们是否能够有效地衡量和优化超出传统性能指标的社会影响。第十七章(ch023.xhtml#sec-responsible-ai)中的负责任 AI 原则和第十八章(ch024.xhtml#sec-sustainable-ai)中的可持续性考虑因素在全面系统评估中建立了必须与效率和精度相结合的新评估维度。


机器学习操作

DALL·E 3 提示:创建一个详细、宽矩形的人工智能工作流程插图。图像应展示六个阶段的过程,从左到右流动:1. 数据收集,不同性别和血统的多样化个体使用各种设备(如笔记本电脑、智能手机和传感器)收集数据。2. 数据处理,显示一个数据中心,活跃的服务器和带有发光灯的数据库。3. 模型训练,由带有代码、神经网络图和进度指示器的计算机屏幕表示。4. 模型评估,展示人们在大型显示器上检查数据分析。5. 部署,AI 集成到机器人、移动应用和工业设备中。6. 监控,显示专业人士在仪表板上跟踪 AI 性能指标,以检查准确性和概念漂移随时间的变化。每个阶段应清晰标记,风格应简洁、现代,并具有动态和富有信息量的色彩方案。

图片

目的

为什么在开发环境中运行完美的机器学习原型在部署到生产环境时往往失败得非常惨烈?

从原型模型到可靠的生产系统的过渡带来了重大的工程挑战。在干净数据集上训练的研究模型会遇到具有变化的数据分布、演变的用户行为和意外系统故障的生产环境。与执行确定性逻辑的传统软件不同,机器学习系统表现出概率行为,当现实条件与训练假设相偏离时,这种行为会无声地退化。这种不稳定性需要操作实践来检测性能退化,在影响用户之前自动重新训练模型,并在预测不确定性下保持系统可靠性。成功需要将实验验证和生产可靠性连接起来的工程学科,使组织能够部署在整个运营生命周期中保持有效的模型。

学习目标

  • 区分传统软件故障和机器学习系统的静默故障,以解释为什么 MLOps 成为一门独立的工程学科

  • 分析机器学习系统中的技术债务模式(边界侵蚀、纠正级联、数据依赖),并提出系统性的工程解决方案

  • 设计解决机器学习特定挑战的 CI/CD 管道,包括模型验证、数据版本化和自动化重新训练工作流程

  • 评估用于检测传统系统指标和机器学习特定指标(如数据漂移和预测置信度)的生产机器学习系统的监控策略

  • 实施适用于不同环境(包括云服务、边缘设备和联邦学习系统)的部署模式

  • 评估组织在有效实施 MLOps 方面的成熟度水平

  • 通过分析特定要求(如医疗保健、嵌入式系统)如何重塑运营框架来比较 MLOps 在不同领域的适应性

  • 创建治理框架,确保在受监管环境中模型的可重复性、可审计性和合规性

机器学习操作简介

传统软件会通过错误信息和堆栈跟踪大声失败;机器学习系统则默默失败。如第一章所述,沉默失败问题是机器学习系统的定义特征:随着数据分布的变化、用户行为的演变和模型假设的过时,性能逐渐下降,而没有任何警报。MLOps 是旨在使这些沉默失败变得可见和可管理的工程学科。它提供了监控、自动化和治理,以确保数据驱动系统在周围世界变化的情况下在生产中保持可靠性。

机器学习系统需要的不仅仅是算法创新;它们还需要系统性的工程实践以确保可靠的生产部署。虽然第十四章探讨了资源受限下的分布式学习,第十六章建立了容错方法,但第十五章中的安全框架对于生产部署变得至关重要。机器学习操作(MLOps)1 提供了将这些专门能力综合成一致生产架构的学科框架。这种运营学科解决了将实验成功转化为可持续系统性能的挑战,将自适应学习、安全协议和弹性机制整合到复杂的生产生态系统中。

MLOps (第 13.2.2 节) 系统性地整合了机器学习方法、数据科学实践和软件工程原则,以实现自动化、端到端的生命周期管理。这种运营范式连接了实验验证和生产部署,确保验证过的模型在适应现实世界运营环境的同时保持其性能特征。

考虑部署一个针对共享出行服务的需求预测系统。虽然受控的实验验证可能显示出优越的准确性和延迟特性,但生产部署会引入超出算法性能的挑战。数据流表现出不同的质量,时间模式会经历季节性变化,预测服务必须在满足严格的可用性要求的同时保持实时响应能力。MLOps 提供了解决这些运营复杂性的框架。

作为一门工程学科,MLOps 建立了标准化的协议、工具和工作流程,这些有助于将验证过的模型从实验环境过渡到生产系统。该学科通过正式化接口和定义传统上隔离的领域(包括数据科学、机器学习工程和系统运营)的责任来促进协作 2。这种方法使得适应机器学习环境的持续集成和部署实践成为可能,支持迭代模型优化、验证和部署,同时保持系统稳定性和操作可靠性。

在这些操作基础之上,成熟的 MLOps 方法论通过自动化和监控框架改变了组织管理机器学习系统的方式。这些实践使得在新数据可用时能够持续进行模型再训练,评估与生产基线不同的架构,通过分阶段推出策略控制实验性修改的部署,以及在不影响操作连续性的情况下进行实时性能评估。这种操作灵活性确保了模型的相关性持续,同时保持系统可靠性标准。

除去操作效率之外,MLOps 还包括治理框架和问责机制,这些在系统规模扩大时变得至关重要。MLOps 标准化了模型版本跟踪、数据血缘文档和配置参数管理,建立了可重复和可审计的工件轨迹。这种严谨性在模型可解释性和操作溯源构成合规要求的监管领域证明是必不可少的。

这种方法论严谨性的实际益处体现在组织成果上。证据表明,采用成熟的 MLOps 方法论的组织在部署可靠性、缩短上市周期和增强系统可维护性方面取得了显著改进 3。该学科框架使得机器学习系统的可持续扩展成为可能,同时保持基准测试阶段验证的性能特征,确保操作与实验结果的一致性。

这种机器学习操作方法论为将理论创新转化为可持续的生产能力提供了途径。本章建立了连接实验验证系统和操作可靠的生产部署之间差距所需的工程基础。分析特别关注集中式云计算环境,其中监控基础设施和管理能力使得实施成熟操作实践成为可能,以支持大规模机器学习系统。

虽然第十章和第九章建立了优化基础,但本章将这些技术扩展到需要持续维护和监控的生产环境。在第十二章[(ch018.xhtml#sec-benchmarking-ai)]中建立的经验基准方法为生产性能评估提供了方法论基础,而系统可靠性模式成为运营可用性的关键决定因素。MLOps 将这些不同的技术基础整合到统一的运维工作流程中,系统地解决从模型开发到可持续生产部署的基本挑战。

本章探讨了 MLOps 的理论基础和实践动机,追溯了其从 DevOps 方法论中的学科演变,并确定了影响其在当代机器学习系统架构中采用的主要挑战和既定实践。

历史背景

理解从 DevOps 到 MLOps 的这种演变,可以阐明为什么传统的运维实践需要适应机器学习系统。以下对这一历史发展的考察揭示了推动 MLOps 作为一门独立学科的具体挑战。

MLOps 的根源在于 DevOps,它是一套将软件开发(Dev)和 IT 运维(Ops)相结合的实践,以缩短开发周期并支持高质量软件的持续交付。DevOps 和 MLOps 都强调自动化、协作和迭代改进。然而,尽管 DevOps 是为了解决软件部署和运维管理中的挑战而出现的,但 MLOps 是为了应对机器学习工作流程的独特复杂性而演变的,特别是那些涉及数据驱动组件的工作流程(Breck 等人 2017b)。理解这一演变对于理解现代 ML 系统的动机和结构至关重要。

DevOps

“DevOps”这个术语是在 2009 年由顾问和敏捷实践者帕特里克·德博伊斯提出的,他在比利时根特组织了首届DevOpsDays会议。DevOps 通过将 IT 运维纳入其中,扩展了敏捷运动的原则,该运动强调开发团队之间的紧密协作和快速、迭代的发布。

这项创新解决了传统软件管道中的核心问题,即开发和运维团队在孤岛中工作,造成效率低下、延误和优先级错位。DevOps 应运而生,倡导共同拥有权、基础设施即代码 4 和自动化,以简化部署管道。

为了支持这些原则,诸如Jenkins5、Docker6 和Kubernetes7 等工具成为实施持续集成和持续交付(CI/CD)实践的基础。

通过自动化和反馈循环,DevOps 促进了协作,同时减少了发布时间并提高了软件可靠性。这一成功为将类似原则扩展到机器学习领域奠定了文化和技术基础。

MLOps

虽然 DevOps 在传统软件部署中取得了相当大的成功,但机器学习系统引入了新的挑战,需要进一步的适应。MLOps 建立在 DevOps 的基础上,但解决了 ML 系统开发和部署的具体需求。DevOps 专注于集成和交付确定性软件,而 MLOps 必须管理非确定性、数据依赖的工作流程。这些工作流程包括数据采集、预处理、模型训练、评估、部署和持续监控(见图 13.1)。

机器学习运营(MLOps)是管理生产中机器学习系统全生命周期的工程学科,解决数据版本控制模型演变持续重新训练的独特挑战。

当检查现实世界的失败时,不采用系统化工程实践部署机器学习的运营复杂性和商业风险变得显而易见。考虑一家零售公司,它部署了一个推荐模型,最初通过提高销售额 15%来提升业绩。然而,由于一个静默的数据漂移问题,该模型的精度在六个月内逐渐下降,最终与原始系统相比减少了 5%的销售额。由于监控的重点是系统正常运行时间而不是模型性能指标,问题未被发现。在常规季度分析期间发现问题时,公司损失了估计 1000 万美元的收入。这种场景在早期机器学习部署中很常见,说明了为什么 MLOps,其强调持续模型监控和自动重新训练,不仅仅是一个工程最佳实践,而且是依赖机器学习系统进行关键运营的组织的一个商业必要性。

这种适应是由在机器学习运营中反复出现的几个挑战所驱动的,这些挑战使其与传统软件部署区分开来。数据漂移 8,即输入数据分布随时间的变化会降低模型精度,需要持续的监控和自动重新训练程序。

在这个以数据为中心的挑战的基础上,可重复性 9 提出了另一个问题。机器学习工作流程缺乏标准化的机制来跟踪代码、数据集、配置和环境,这使得重现过去的实验变得困难(Schelter 等人,2018)。复杂模型缺乏可解释性推动了工具的需求,这些工具可以增加模型的可透明性和可解释性,尤其是在受监管的领域。

图片

图 13.1:MLOps 生命周期:MLOps 将 DevOps 原则扩展到管理机器学习系统的独特挑战,包括数据版本控制、模型重新训练和持续监控。此图概述了包含数据工程、模型开发和可靠部署的迭代工作流程,以在生产中实现持续的性能。

除了这些基础挑战之外,组织还面临着额外的运营复杂性。模型部署后的性能监控证明是困难的,尤其是在检测静默故障或用户行为变化方面。在重新训练和重新部署模型中涉及的手动开销在实验和迭代中产生了摩擦。配置和维护机器学习基础设施复杂且容易出错,突显了需要提供优化、模块化和可重用基础设施的平台。这些挑战共同构成了关注自动化、协作和生命周期管理的 MLOps 实践的基础。

为了应对这些独特的挑战,该领域开发了专门的工具和工作流程,这些工具和工作流程针对机器学习生命周期进行了定制。在 DevOps 的基础上解决机器学习特定的需求,MLOps 协调更广泛的利益相关者生态系统,并引入了数据版本控制 10、模型版本控制和模型监控等专门实践,这些实践超越了传统的 DevOps 范围。这些实践在表 13.1 中详细说明:

表 13.1:MLOps 与 DevOps:MLOps 将 DevOps 原则扩展到解决机器学习系统的独特需求,包括数据和模型版本控制,以及针对模型性能和数据漂移的持续监控。此表阐明了 MLOps 如何协调更广泛的利益相关者,并强调在传统软件开发工作流程之外的可重复性和可扩展性。

方面 DevOps MLOps
目标 简化软件开发和运营流程 优化机器学习模型的整个生命周期
方法 软件开发的持续集成和持续交付(CI/CD) 类似于 CI/CD,但专注于机器学习工作流程
主要工具 版本控制(Git)、CI/CD 工具(Jenkins、Travis CI)、配置管理(Ansible、Puppet) 数据版本控制工具、模型训练和部署工具、针对 ML 的 CI/CD 管道
主要关注点 代码集成、测试、发布管理、自动化、基础设施即代码 数据管理、模型版本控制、实验跟踪、模型部署、ML 工作流程的可扩展性
典型结果 更快、更可靠的软件发布,开发和运维团队之间的协作改进 机器学习模型的有效管理和部署,数据科学家和工程师之间的协作增强

在确立了这些基础区别之后,我们必须首先了解推动复杂 MLOps 实践的独特运营挑战,然后再考察旨在解决这些挑战的基础设施和实践。

技术债务与系统复杂性

虽然 DevOps 基础设施提供了自动化和协作原则,但机器学习系统引入了独特的复杂性形式,这需要工程方法来有效管理。与传统的软件不同,其中损坏的代码会立即失败,ML 系统可以通过数据变化、模型交互和不断变化的需求悄无声息地退化。虽然联邦学习系统面临独特的协调挑战(第十四章)和鲁棒系统需要仔细监控(第十六章),但所有部署环境都必须在运营效率与安全需求之间取得平衡。理解这些被称为技术债务的运营挑战对于激励后续的工程解决方案和实践至关重要。

这种复杂性在机器学习系统成熟和扩展时显现出来,它们积累了技术债务:在开发期间做出的便捷设计决策的长期成本。最初在 1990 年代提出于软件工程中 11,这个比喻将实施中的捷径与金融债务相比较:它可能允许短期速度,但需要持续的利益支付,形式为维护、重构和系统风险。

图片

图 13.2:ML 系统复杂性:在典型的机器学习系统中,大部分工程努力集中在围绕模型本身的组件上(数据收集、特征工程和系统配置),而不是模型代码。这种分布突出了运营挑战和潜在的技术债务,这些往往是被忽视的 ML 系统领域。来源:(Sculley 等人 2021)。

这些运营挑战在机器学习系统演变过程中表现为几种不同的模式,团队在遇到这些模式时。我们不是列举每一个债务模式,而是关注代表性的例子,这些例子说明了 MLOps 提供的工程方法。每个挑战都源于机器学习工作流程的独特特征:它们依赖于数据而不是确定性逻辑,它们具有统计行为而不是精确行为,以及它们倾向于通过数据流而不是显式接口创建隐式依赖。

以下技术债务模式展示了为什么传统的 DevOps 实践需要扩展以适应机器学习系统,这激励了后续章节中提出的基础设施解决方案。

基于这种系统视角,我们检查了机器学习系统特有的关键技术债务类别(图 13.3)。每个小节都突出了常见的来源、示例和工程解决方案,这些解决方案解决了这些挑战。虽然某些形式的债务在早期开发过程中可能不可避免,但了解其成因和影响使得工程师能够通过纪律性的架构实践和适当的工具选择来设计健壮且可维护的机器学习系统。

图片

图 13.3:机器学习技术债务分类法:机器学习系统积累的技术债务形式来自数据依赖、模型交互和不断变化的需求。这个中心辐射图展示了主要的债务模式:边界侵蚀破坏了模块化,修正级联通过依赖关系传播修复,反馈循环创造了隐藏的耦合,而数据、配置和管道债务反映了管理不善的工件和工作流程。理解这些模式使得系统性地进行债务预防和缓解的工程方法成为可能。

边界侵蚀

在传统的软件系统中,模块化和抽象提供了组件之间的清晰边界,允许变化被隔离,行为保持可预测。相比之下,机器学习系统往往模糊了这些边界。数据管道、特征工程、模型训练和下游消费之间的交互往往导致紧密耦合的组件,接口定义不明确。

这种边界的侵蚀使得机器学习系统特别容易受到即使是微小变化引起的级联效应的影响。对预处理步骤或特征转换的看似微小的更新可能会以意想不到的方式在整个系统中传播,破坏管道中其他地方做出的假设。这种缺乏封装增加了纠缠的风险,其中组件之间的依赖变得如此交织,以至于局部修改需要全局理解和协调。

这种问题的表现之一被称为 CACHE(任何变化都会改变一切)。当系统在没有强大边界的情况下构建时,调整特征编码、模型超参数或数据选择标准可能会以不可预测的方式影响下游行为。这阻碍了迭代,使测试和验证更加复杂。例如,改变数值特征的分箱策略可能会导致先前调优的模型表现不佳,触发重新训练和下游评估变化。

为了减轻边界侵蚀,团队应优先考虑支持模块化和封装的架构实践。设计具有明确定义接口的组件,使团队能够隔离故障、推理变化并降低系统级回归的风险。例如,明确区分数据摄取与特征工程,以及特征工程与建模逻辑,引入了可以独立验证、监控和维护的层。

边界侵蚀在早期开发中往往是不可见的,但随着系统规模的扩大或需要适应时,它成为一个重大的负担。然而,成熟的软件工程实践可以有效地预防和减轻这个问题。主动的设计决策,保留抽象并限制相互依赖性,结合系统性的测试和接口文档,为管理复杂性和避免长期维护成本提供了实际解决方案。

这个挑战产生的原因是机器学习系统以统计保证而非逻辑保证运行,这使得传统的软件工程边界更难执行。理解边界侵蚀为何如此频繁地发生需要检查机器学习工作流程与传统软件开发之间的差异。

机器学习系统中的边界侵蚀违反了既定的软件工程原则,特别是 Demeter 法则和最少知识原则。而传统的软件通过显式接口和信息隐藏实现模块化,机器学习系统通过绕过这些显式边界的流程创建隐式耦合。

CACHE 现象代表了 Liskov 替换原则的崩溃,其中组件修改违反了依赖组件预期的行为合同。与具有编译时保证的传统软件不同,机器学习系统以统计行为运行,这创造了本质上不同的耦合模式。

挑战在于协调传统模块化概念与机器学习工作流程固有的相互关联性,其中统计依赖和数据驱动行为创造了传统软件工程框架未设计来处理的耦合模式。

纠正级联

随着机器学习系统的演变,它们通常经历迭代优化来解决性能问题、适应新要求或适应环境变化。在精心设计的系统中,此类更新是局部化和通过模块化更改管理的。然而,在机器学习系统中,即使是小的调整也可能触发纠正级联,这是一系列依赖性修复,它们在工作流程中向前和向后传播。

图 13.4 中的图表展示了这些级联效应如何在机器学习系统开发中传播。理解这些级联的结构有助于团队预测和减轻其影响。

图 13.4 展示了这些级联效应如何在机器学习生命周期的不同阶段出现,从问题定义和数据收集到模型开发和部署。每个弧线代表一个纠正措施,颜色表示不同不稳定来源,包括不充分的领域专业知识、脆弱的现实世界接口、激励不匹配和文档不足。红色箭头代表级联修订,而底部虚线箭头突出显示了一个完整的系统重启,这是一种极端但有时是必要的后果。

图片

图 13.4:纠正级联:在机器学习系统中,迭代优化经常触发工作流程中的依赖性修复,从初始调整通过数据、模型和部署阶段进行传播。彩色弧线表示源自不稳定来源的纠正措施,而红色箭头和虚线表示升级修订,可能需要完全的系统重启。

纠正级联的一个常见来源是顺序模型开发:重用或微调现有模型以加速新任务的开发。虽然这种策略通常效率很高,但它可能会引入难以解开的隐藏依赖。早期模型中嵌入的假设成为未来模型的隐含约束,限制了灵活性并增加了下游纠正的成本。

考虑一个场景,一个团队对一个新产品的客户流失预测模型进行微调。原始模型可能嵌入特定于产品的行为或特征编码,在新环境中可能不适用。随着性能问题出现,团队可能会尝试修补模型,但最终发现真正的问题可能位于几个层次之上,可能在原始特征选择或标记标准中。

为了避免或减少纠正级联的影响,团队必须在重用和重新设计之间做出谨慎的权衡。几个因素影响这一决策。对于小型、静态数据集,微调可能是合适的。对于大型或快速变化的数据集,从头开始重新训练提供了更大的控制和适应性。微调还需要的计算资源较少,使其在受限环境中具有吸引力。然而,由于这些级联效应,后来修改基础组件变得极其昂贵。

因此,应仔细考虑引入新的模型架构,即使资源密集,以避免后续出现纠正级联。这种方法可能有助于减轻下游问题的放大效应,并减少技术债务。然而,仍然存在一些场景,顺序模型构建是有意义的,需要仔细平衡机器学习开发过程中的效率、灵活性和长期可维护性。

要理解为什么尽管遵循最佳实践,纠正级联在机器学习系统中仍然如此持久,有助于检查驱动这一现象的潜在机制。纠正级联模式源于违反软件工程中建立的系统模块性原则的隐藏反馈循环。当模型 A 的输出影响模型 B 的训练数据时,这会创建出破坏模块化设计的隐式依赖。这些依赖尤其隐蔽,因为它们通过数据流而不是显式代码接口操作,使得它们对传统的依赖分析工具不可见。

从系统理论的角度来看,纠正级联代表了看似独立的组件之间的紧密耦合实例。级联传播遵循幂律分布,其中小的初始变化可以触发不成比例的系统级重大修改。这一现象与复杂系统中的蝴蝶效应相似,其中微小的扰动通过非线性相互作用放大。

理解这些理论基础有助于工程师认识到,防止纠正级联不仅需要更好的工具,还需要在存在学习组件的情况下,保持系统模块化的架构决策。挑战在于设计机器学习系统,即使数据驱动工作流程本质上具有互联性,也能保持松散耦合。

接口和依赖挑战

与传统软件中组件通过显式 API 进行交互不同,机器学习系统通常通过数据流和共享输出发展出隐式依赖。两个关键模式说明了这些挑战:

未声明的消费者:模型输出经常为下游组件提供服务,而没有正式的跟踪或接口合同。当模型演化时,这些隐藏的依赖关系可能会无声地中断。例如,信用评分模型的输出可能为资格引擎提供数据,这会影响未来的申请人池和训练数据,从而创建未跟踪的反馈循环,随着时间的推移,这些循环会偏袒模型行为。

数据依赖债务:机器学习管道积累不稳定和利用率低的数据依赖,这些依赖难以追踪或验证。特征工程脚本、数据连接和标签约定缺乏传统软件开发中可用的依赖分析工具。当数据源的结构或分布发生变化时,下游模型可能会意外失败。

工程解决方案:这些挑战需要系统性的方法,包括对模型输出实施严格的访问控制、与文档化模式建立正式的接口合同、数据版本化和血缘跟踪系统,以及对预测使用模式的全面监控。后续章节中提出的 MLOps 基础设施模式提供了这些解决方案的具体实现。

系统演化挑战

随着机器学习系统的成熟,它们面临着独特的演化挑战,这些挑战与传统软件有根本性的区别:

反馈循环:模型通过生成数据影响它们自己的未来行为。推荐系统是这一点的例证:建议的项目塑造用户点击,这些点击成为训练数据,可能产生自我强化的偏差。这些循环破坏了数据独立性的假设,并且可能掩盖几个月的性能下降。

管道和配置债务:机器学习工作流程往往演变成“管道丛林”,其中包含临时的脚本和碎片化的配置。没有模块化接口,团队会构建重复的管道而不是重构脆弱的管道,导致处理和维护负担不一致。

早期阶段捷径:快速原型设计鼓励在训练代码中嵌入业务逻辑和未记录的配置更改。虽然这些捷径对于创新是必要的,但随着系统跨团队扩展,它们成为负债。

工程解决方案:管理演化需要架构纪律,包括基于群体的监控以检测循环、使用工作流程编排工具的模块化管道设计,以及将配置视为一等系统组件,并使用版本控制和验证。

现实世界技术债务示例

隐藏的技术债务不仅仅是理论上的;它在塑造现实世界机器学习系统的轨迹中发挥了关键作用。以下示例说明了未看到的依赖关系和错误的假设如何悄然积累,最终成为重大的负债:

YouTube:反馈循环债务

YouTube 的推荐引擎因推广耸人听闻或两极分化内容而受到反复批评 12。这部分原因源于反馈循环债务:推荐影响用户行为,反过来又成为训练数据。随着时间的推移,这导致了内容无意中的放大。缓解这一问题需要重大的架构改造,包括基于群体的评估、延迟标记以及更明确的参与度指标和排名逻辑之间的解耦。

Zillow:纠正级联失败

Zillow 的房屋估值模型(Zestimate)在其 iBuying 业务期间经历了显著的纠正级联 13。当初始估值错误传播到购买决策中时,追溯性纠正引发了系统不稳定,需要数据重新验证、模型重新设计,最终导致整个系统回滚。该公司于 2021 年关闭了 iBuying 部门,称模型不可预测性和数据反馈效应为核心挑战。

特斯拉:未声明的消费者债务

在早期部署中,特斯拉的 Autopilot 基于模型做出驾驶决策,这些模型的输出被重新用于多个子系统,而没有明确的边界。空中更新偶尔会引入无声的行为变化,以不可预测的方式影响多个子系统(例如,车道居中和制动)。这种纠缠说明了未声明的消费者债务以及跳过严格接口治理在机器学习赋能的安全关键系统中的风险。

Facebook:配置债务

Facebook 的新闻推送算法经历了多次迭代,通常是由快速实验驱动的。然而,缺乏一致的配置管理导致了不透明的设置,这些设置影响了内容排名,但没有明确的文档记录。因此,算法行为的变更难以追踪,不匹配的配置产生了意外的后果。这种情况突出了在机器学习系统中将配置视为一等公民的重要性。

这些现实世界的例子展示了机器学习系统中技术债务的普遍性以及为什么传统的 DevOps 实践需要系统性的扩展。以下的基础设施和生产操作部分展示了针对这些具体挑战设计的具体工程解决方案:特征存储解决数据依赖债务,版本控制系统实现可重复的配置,监控框架检测反馈循环,模块化管道架构防止技术债务积累。这种对操作挑战的理解为接下来我们考察的专业 MLOps 工具和实践提供了基本动机。

开发基础设施和自动化

在上述运营挑战的基础上,本节探讨了基础设施和开发组件,这些组件使前几章中提到的专用功能成为可能,同时解决系统性挑战。这些基础组件必须支持边缘设备联邦学习协调(第十四章)、实现具有隐私保证的安全模型服务(第十五章)以及维护对分布变化的鲁棒性监控(第十六章)。它们形成一个分层架构,如图图 13.5 所示,将各种要求整合为一个统一的运营框架。了解这些组件如何相互作用,使从业者能够设计出同时实现边缘效率、安全合规性和容错性,同时保持运营可持续性的系统。

图片

图 13.5:MLOps 堆栈层:模块化架构组织机器学习系统组件,从模型开发和编排到基础设施,促进自动化、可重复性和可扩展部署。每一层都建立在下一层之上,促进跨团队合作,并支持整个 ML 生命周期,从初始实验到长期生产维护。

数据基础设施和准备

可靠的机器学习系统依赖于结构化、可扩展和可重复的数据处理。从数据被摄入的那一刻起,到它用于预测的那一刻,每个阶段都必须保持质量、一致性和可追溯性。在运营环境中,数据基础设施不仅支持初始开发,还支持持续的重训练、审计和服务,需要系统化地处理数据在整个机器学习生命周期中的转换和版本控制。

数据管理

基于第六章中的数据工程基础,数据收集、预处理和特征转换被正式化为系统化的运营流程。在 MLOps 中,这些任务被扩展为可重复、自动化的工作流程,确保数据可靠性、可追溯性和运营效率。在这种设置中,数据管理不仅包括初始准备,还包括在整个机器学习系统生命周期中对数据工件持续的处理。

这一运营基础的核心是数据集版本控制,它通过跟踪数据演变(参见第 13.4.1.3 节中的实现细节)来实现可重复的模型开发。例如,DVC等工具使团队能够在由Git管理的代码存储库中版本控制大型数据集,确保数据血缘得到保留,实验可重复。

这个版本控制基础使得更复杂的数据管理能力成为可能。例如,监督学习管道需要一致和良好管理的注释工作流程。如Label Studio之类的标签工具支持可扩展的基于团队的注释,并具有集成审计跟踪和版本历史。这些能力在生产环境中至关重要,因为标签规范会随着时间的推移而演变,或需要在项目的多个迭代中进一步完善。

除了注释工作流程之外,操作环境需要支持安全、可扩展和协作访问的数据存储。基于云的对象存储系统,如Amazon S3Google Cloud Storage,提供耐用性和细粒度访问控制,非常适合管理原始和经过处理的数据工件。这些系统通常作为下游分析、模型开发和部署工作流程的基础。

在这个存储基础上,MLOps 团队构建自动化的数据管道,将原始数据转换为分析或推理准备好的格式。这些管道执行结构化任务,如数据摄取、模式验证、去重、转换和加载。包括Apache AirflowPrefectdbt在内的编排工具通常用于定义和管理这些工作流程。当作为代码管理时,管道支持版本控制、模块化和与 CI/CD 系统的集成。

随着这些自动化管道在组织中的扩展,它们自然会遇到大规模特征管理的挑战。现代数据基础设施的一个重要元素是特征存储库,这一概念由 Uber 的 Michelangelo 平台团队在 2017 年首创。他们在意识到特征工程正在数百个机器学习模型中重复后创造了这个术语。他们的解决方案,一个集中的“特征存储库”,成为了启发 Feast、Tecton 和其他数十个平台的模板。

特征存储库集中管理工程特征,以便在模型和团队之间重复使用(详细说明见第 13.4.1.2 节)。

为了在实践中说明这些概念,可以考虑一个工业环境中的预测性维护应用。通过 Airflow 管理的预定管道,连续的传感器数据被摄取并与历史维护日志连接。这些结果特征,包括滚动平均值和统计聚合,存储在特征存储库中,用于重新训练和低延迟推理。此管道经过版本控制、监控,并与模型注册表集成,从而实现了从数据到部署模型预测的完整可追溯性。

这种全面的数据管理方法远远超出了确保数据质量的范畴,建立了支持模型可重复性、可审计性和大规模持续部署的运营骨干。没有稳健的数据管理,下游训练、评估和服务过程的完整性无法得到保证,使得特征存储成为基础设施的关键组成部分。

特征存储

特征存储 14 在数据工程和机器学习之间提供了一个抽象层。它们的主要目的是在训练和推理工作流程中实现工程特征的持续、可靠访问。在传统的管道中,特征工程逻辑被重复、手动重新实现或在不同的环境中出现分歧。这引入了训练-服务偏差 15(训练和生产的特征不同)、数据泄露和模型漂移的风险。

为了解决这些挑战,特征存储在集中式存储库中管理离线(批量)和在线(实时)特征访问。当部署第十章中讨论的优化模型时,这一点变得至关重要,因为环境间的特征一致性对于保持模型准确性至关重要。在训练期间,特征在批量环境中计算并存储,通常与历史标签一起。在推理时间,相同的转换逻辑应用于在线服务系统中的新鲜数据。这种架构确保模型在两种环境中都消耗相同特征,促进了一致性并提高了可靠性。

除了在训练和部署环境中的一致性之外,特征存储还支持跨团队进行版本控制、元数据管理和特征重用。例如,欺诈检测模型和信用评分模型依赖于重叠的交易特征,这些特征可以集中维护、验证和共享。这减少了工程开销,并支持用例之间的对齐。

特征存储可以与数据管道和模型注册表集成,从而实现血缘跟踪和可追溯性。当特征被更新或弃用时,相关的模型将被识别并相应地重新训练。这种集成增强了机器学习系统的运营成熟度,并支持审计、调试和合规工作流程。

版本控制和血缘关系

版本控制对于机器学习系统的可重复性和可追溯性至关重要。与传统的软件不同,机器学习模型依赖于多个不断变化的工件:训练数据、特征工程逻辑、训练模型参数和配置设置。为了管理这种复杂性,MLOps 实践强制执行对所有管道组件的版本跟踪。

在此跟踪系统的基石上,数据版本控制允许团队在特定时间点快照数据集,并将它们与特定的模型运行关联起来。这包括原始数据(例如,输入表或日志流)和经过处理的工件(例如,清洗后的数据集或特征集)。通过维护模型检查点和用于训练的数据之间的直接映射,团队能够审计决策、重现结果并调查回归。

与数据版本控制相辅相成的是,模型版本控制涉及将训练好的模型注册为不可变工件,同时包括训练参数、评估指标和环境规范等元数据。这些记录保存在模型注册表中,该注册表提供了一个结构化的接口,用于提升、部署和回滚模型版本。一些注册表还支持血缘可视化,它追踪从原始数据到部署预测的完整依赖图。

这些互补的版本控制实践共同构成了机器学习系统的血缘层。这一层实现了自我检查、实验和治理。当部署的模型表现不佳时,血缘工具帮助团队回答诸如以下问题:

  • 输入分布是否与训练数据一致?

  • 特征定义是否发生了变化?

  • 模型版本是否与服务基础设施对齐?

通过将版本控制和血缘关系提升到系统设计中的第一类公民,MLOps 使团队能够以规模化的方式构建和维护可靠、可审计和可演进的机器学习工作流程。

持续管道和自动化

自动化使机器学习系统能够持续地根据新数据、变化的目标和运营限制进行演变。而不是将开发和部署视为孤立的阶段,自动化的管道允许同步的工作流程,这些工作流程整合了数据预处理、训练、评估和发布。这些管道为可扩展的实验提供了基础,并确保了生产中模型更新的可重复性和可靠性。

CI/CD 管道

虽然传统的软件系统依赖于持续集成和持续交付(CI/CD)管道以确保代码更改可以高效地进行测试、验证和部署,但机器学习系统需要重大的调整。在机器学习系统的背景下,CI/CD 管道必须处理由数据依赖、模型训练工作流程和工件版本控制引入的额外复杂性。这些管道提供了一个结构化的机制,以可重复、可扩展和自动化的方式将机器学习模型从开发过渡到生产。

在这些改进的基础上,典型的机器学习 CI/CD 流水线包括几个协调阶段,包括:检出更新代码、预处理输入数据、训练候选模型、验证其性能、打包模型以及将其部署到服务环境。在某些情况下,流水线还包括基于数据漂移或性能退化的自动重训练触发器。通过将这些步骤编码化,CI/CD 流水线 16 减少了人工干预,强制执行质量检查,并支持已部署系统的持续改进。

为了支持这些复杂的流程,有一系列工具可用于实现专注于机器学习的 CI/CD 工作流程。通用 CI/CD 编排器,如JenkinsCircleCIGitHub Actions17,管理版本控制事件和执行逻辑。这些工具与特定领域的平台集成,如Kubeflow18、MetaflowPrefect,它们为管理机器学习任务和工作流程提供了更高层次的抽象。

图 13.6 展示了一个机器学习系统的代表性 CI/CD 流水线。该过程从数据集和特征库开始,从中摄取并验证数据。验证后的数据随后被转换以用于模型训练。重训练触发器,如计划任务或性能阈值,自动启动此过程。一旦训练和超参数调整完成,生成的模型将根据预定义的标准进行评估。如果模型满足所需的阈值,它将连同元数据、性能指标和血缘信息一起注册到模型库中。最后,模型被部署回生产系统,完成闭环,并实现更新模型的持续交付。

图片

图 13.6:机器学习 CI/CD 流水线:通过集成版本控制、测试和部署,自动工作流程简化了模型开发,使更新模型能够持续交付到生产环境中。此流水线强调数据与模型验证、自动重训练触发器以及带有元数据的模型注册,以实现可重复性和治理。来源:HarvardX。

为了在实践中说明这些概念,可以考虑一个正在积极开发中的图像分类模型。当数据科学家向 GitHub 仓库提交更改时,Jenkins 流程被触发。该流程获取最新数据,执行预处理,并启动模型训练。实验使用 MLflow 进行跟踪,该工具记录指标并存储模型工件。通过自动评估测试后,模型被容器化并部署到预发布环境,使用的是 Kubernetes。如果模型在预发布环境中满足验证标准,流程将协调控制部署策略,如金丝雀测试(在第 13.4.2.3 节中详细说明),逐渐将生产流量路由到新模型,同时监控关键指标以检测异常。在性能回归的情况下,系统可以自动回滚到先前模型版本。

通过这些全面的自动化能力,CI/CD 流程在实现可扩展、可重复和安全的机器学习模型部署中发挥着核心作用。通过将 ML 工作流程的不同阶段统一到持续自动化之下,这些流程支持更快的迭代、更好的可重复性和生产系统中的更大弹性。在成熟的 MLOps 环境中,CI/CD 不是一个可选层,而是一个基础能力,它将临时实验转变为结构化和操作上合理的开发过程。

训练流程

模型训练是机器学习生命周期中的关键阶段,其中算法被优化以从数据中学习模式。在 第八章 中介绍的分布式训练概念的基础上,我们探讨如何通过系统流程实现训练工作流程的运营化。在 MLOps 的背景下,这些活动被重新定义为可重复、可扩展和自动化的流程的一部分,该流程支持持续实验和可靠的 production 部署。

运营训练的基础在于现代机器学习框架,例如 TensorFlowPyTorchKeras,它们提供了构建和训练模型的模块化组件。来自 第七章 的框架选择原则对于需要可靠扩展的生产训练流程至关重要。这些库包括神经网络组件和训练算法的高级抽象,使从业者能够高效地进行原型设计和迭代。当嵌入到 MLOps 流程中时,这些框架成为可以系统扩展、跟踪和重新训练的训练过程的基础。

在这些框架基础之上,可重复性成为 MLOps 的关键目标。使用如Git等工具对训练脚本和配置进行版本控制,并托管在如GitHub等平台上。交互式开发环境,包括Jupyter笔记本,将数据摄取、特征工程、训练流程和评估逻辑封装在统一格式中。这些笔记本集成到自动化管道中,允许用于本地实验的逻辑在生产系统中的计划重新训练中被重用。

除了确保可重复性之外,自动化通过减少人工努力和标准化关键步骤进一步增强了模型训练。MLOps 工作流程结合了如超参数调整神经架构搜索自动特征选择等技术,以有效地探索设计空间。这些任务通过 CI/CD 管道进行编排,自动化数据预处理、模型训练、评估、注册和部署。例如,当有新的标记数据可用时,Jenkins 管道会触发重新训练作业。生成的模型将与基线指标进行比较,如果达到性能阈值,它将自动部署。

支持这些自动化工作流程,云基础设施的日益可用进一步扩大了模型训练的覆盖范围。这连接到第五章中探讨的工作流程编排模式,这些模式为在分布式系统中管理复杂的多阶段训练过程提供了基础。云服务提供商提供托管服务,提供按需配置的高性能计算资源,包括 GPU 和 TPU 加速器 19。根据平台的不同,团队可以构建自己的训练工作流程或依赖完全托管的如Vertex AI 微调等服务,这些服务支持基础模型对新任务的自动适应。然而,在设计基于云的训练系统时,硬件可用性、区域访问限制和成本限制仍然是重要的考虑因素。

为了说明这些集成实践,考虑一位数据科学家使用 PyTorch 笔记本开发用于图像分类的神经网络。使用了fastai库来简化模型构建和训练。笔记本在标记数据集上训练模型,计算性能指标,并调整模型配置参数。一旦验证通过,训练脚本将进行版本控制并纳入一个基于数据更新或模型性能监控定期触发的重新训练管道。

通过标准化工作流程、版本化环境和自动化编排,MLOps 使模型训练过程从临时的实验转变为一个强大、可重复和可扩展的系统。这不仅加速了开发,还确保了训练模型满足生产标准,包括可靠性、可追溯性和性能。

模型验证

在将机器学习模型部署到生产环境之前,它必须经过严格的评估,以确保其满足预定义的性能、鲁棒性和可靠性标准。虽然前面的章节在模型开发的背景下讨论了评估,但 MLOps 将评估重新定义为验证操作准备就绪的有序和可重复的过程。它包含了支持部署前评估、部署后监控和自动化回归测试的实践。

评估过程从对保留测试集的性能测试开始,该数据集在训练或验证过程中未使用。此数据集从与生产数据相同的分布中采样,并用于衡量泛化能力。核心指标,如准确率曲线下面积(AUC)精确率召回率F1 分数,被计算出来以量化模型性能。这些指标不仅用于某一时刻,而且纵向跟踪以检测退化,例如由数据漂移引起的退化,输入分布的变化会随着时间的推移降低模型准确性(参见图 13.7)。

图片

图 13.7:数据漂移影响:随着时间的推移,模型性能的下降是由数据漂移引起的,其中生产数据的特征与训练数据集相偏离。纵向监控关键指标允许 MLOps 工程师检测这种漂移并触发模型重新训练或数据管道调整,以保持准确性。

除了静态评估之外,MLOps 鼓励采用受控部署策略,这些策略在模拟生产条件的同时最小化风险。一种广泛采用的方法是金丝雀测试,其中新模型被部署到一小部分用户或查询。在这次有限的推广期间,实时性能指标被监控以评估系统稳定性和用户影响。例如,一个电子商务平台将新的推荐模型部署到 5%的网站流量中,并观察点击率、延迟和预测准确度等指标。只有当模型表现出一致和可靠的表现时,它才会被推广到全面生产。

基于云的 ML 平台通过启用实验日志记录、请求回放和合成测试用例生成来进一步支持模型评估。这些功能允许团队在相同条件下评估不同的模型,促进比较和根本原因分析。例如,Weights and Biases等工具通过捕获训练工件、记录超参数配置和可视化实验中的性能指标来自动化这一过程。这些工具直接集成到训练和部署管道中,提高了透明度和可追溯性。

尽管自动化是 MLOps 评估实践的核心,但人工监督仍然至关重要。自动化测试可能无法捕捉到细微的性能问题,例如在罕见子群体上的泛化能力差或用户行为的变化。因此,团队将定量评估与定性审查相结合,尤其是在部署在高风险或受监管环境中的模型时。这种人工在环验证对于社会影响应用尤为重要,因为模型故障可能对易受伤害的群体产生直接后果。

这个多阶段评估过程连接了离线测试和实时系统监控,确保模型不仅满足技术基准,而且在现实世界条件下表现出可预测和负责任的行为。这些评估实践降低了部署风险,并有助于随着时间的推移维护机器学习系统的可靠性,完成了生产部署所需的发展基础设施基础。

基础设施集成摘要

本节中检查的基础设施和开发组件为可靠的机器学习操作奠定了基础。这些系统将临时实验转变为结构化工作流程,支持可重复性、协作和持续改进。

数据基础设施通过特征存储提供基础,该存储允许跨项目重用特征,版本控制系统跟踪数据谱系和演变,以及验证框架确保整个管道中的数据质量。基于第六章中的数据管理基础,这些组件将基本能力扩展到生产环境,其中多个团队和模型依赖于共享的数据资产。

持续管道通过为机器学习工作流程定制的 CI/CD 系统自动化 ML 生命周期。与仅关注代码的传统软件 CI/CD 不同,ML 管道在集成工作流程中协调数据验证、特征转换、模型训练和评估。训练管道特别管理模型开发的计算密集型过程,协调资源分配、超参数优化和实验跟踪。这些自动化工作流程使团队能够快速迭代,同时保持可重复性和质量标准。

模型验证通过超出离线指标的系统性评估将开发和生产连接起来。验证策略结合了保留数据集上的性能基准测试和在生产环境中的金丝雀测试,使团队能够在全面部署之前检测到问题。这种多阶段验证认识到模型不仅需要在静态测试集上表现良好,还需要在数据分布变化和用户行为演变的动态现实世界条件下表现良好。

这些基础设施组件通过系统性的工程能力直接解决之前确定的运营挑战:

  • 特征存储和数据版本控制通过确保在训练和部署过程中对特征访问的一致性和可追踪性来解决数据依赖债务

  • CI/CD 管道和模型注册表通过受控部署和回滚机制防止纠正级联

  • 自动化工作流程和谱系跟踪通过明确的依赖管理消除未声明的消费者风险

  • 模块化管道架构通过可重用、定义良好的组件接口避免管道债务

然而,部署一个经过验证的模型只是生产旅程的开始。该基础设施支持可靠地开发模型,但生产运营必须解决在现实世界条件下维持系统性能的动态挑战:处理数据漂移、管理系统故障以及适应不断变化的需求而不中断服务。

生产运营

在上述基础设施基础上直接构建,生产操作将验证后的模型转化为在现实世界条件下保持性能的可靠服务。这些操作必须处理前几章中确立的多样化需求:在分布式边缘设备上管理模型更新而无需集中可见性(第十四章)、在运行时推理和模型更新期间维护安全控制(第十五章)以及检测来自对抗攻击或分布变化的性能退化(第十六章)。这一操作层实现了监控、治理和部署策略,使这些专门功能能够在大规模下可靠地协同工作。

本节探讨了将验证后的模型转化为能够可靠地在大规模下运行的生产服务的部署模式、服务基础设施、监控系统以及治理框架。

生产操作引入了超出模型开发的挑战。部署的系统必须处理可变负载,在多种条件下保持一致的延迟,优雅地从故障中恢复,并在不中断服务的情况下适应不断变化的数据分布。这些需求要求专门的架构、监控能力和操作实践,以补充上一节中确立的开发工作流程。

模型部署和服务

一旦模型经过训练和验证,就必须将其集成到生产环境中,以便能够大规模地提供预测。这个过程包括将模型及其依赖项打包,管理版本,并以符合性能、可靠性和治理要求的方式部署。部署将静态工件转化为活生生的系统组件。服务确保模型可访问、可靠,并且在响应推理请求时高效。这些组件共同连接了模型开发和现实世界的影响。

模型部署

团队需要正确打包、测试和跟踪机器学习模型,以便可靠地将它们部署到生产环境中。MLOps 引入了框架和程序,以可持续的方式积极版本控制、部署、监控和更新模型。

部署的一种常见方法涉及使用容器化技术 20 对模型进行容器化。这种打包方法确保了环境间的平滑可移植性,使部署一致且可预测。

生产部署需要处理模型打包、版本管理和与服务基础设施集成的框架。像 MLflow 和模型注册表这样的工具管理这些部署工件,而服务特定的框架(在推理服务部分详细说明)处理运行时优化和扩展需求。

在全面推广之前,团队将更新的模型部署到预发布或 QA 环境中 21,以严格测试性能。

使用如影子部署、金丝雀测试 22 和蓝绿部署 23 等技术逐步验证新模型。正如我们在评估框架中所描述的,这些受控部署策略使生产中的模型验证更加安全。稳健的回滚程序对于处理意外问题至关重要,可以将系统回滚到先前的稳定模型版本,以确保最小化中断。

当金丝雀部署在部分流量级别(例如,在 30% 流量中出现问题但不在 5% 流量中出现)时,团队需要系统性的调试策略。有效的诊断需要关联多个信号:来自 第十二章 的性能指标、数据分布分析以检测漂移,以及可能解释性能下降的特征重要性变化。团队维护调试工具包,包括 A/B 测试 24 分析框架、特征归因工具和数据切片分析器,以确定哪些子群体正在经历性能下降。

与 CI/CD 管道集成进一步自动化了部署和回滚过程,使迭代周期更高效。

模型注册库,如 Vertex AI 的模型注册库,作为存储和管理训练模型的集中式仓库。这些注册库不仅便于版本比较,而且通常包括对基础模型的访问,这些模型可能是开源的、专有的或混合的(例如,LLAMA)。从注册库将模型部署到推理端点是简化的,包括资源分配、模型权重下载和托管。

推理端点通常通过 REST API 部署模型以进行实时预测。根据性能要求,团队可以配置资源,例如 GPU 加速器,以满足延迟和吞吐量目标。一些提供商还提供灵活的选项,如无服务器 25 或批量推理,从而消除对持久端点的需求,并实现成本效益高、可扩展的部署。

为了保持可追溯性和可审计性,团队使用 MLflow26 等工具跟踪模型工件,包括脚本、权重、日志和指标。

通过利用这些工具和实践,团队可以可靠地部署机器学习模型,确保版本之间的平稳过渡,保持生产稳定性,并优化各种用例的性能。

推理服务

一旦模型被部署,机器学习运营的最后阶段就是使其对下游应用程序或最终用户可用。服务基础设施在训练模型和现实世界系统之间提供了接口,使预测能够可靠且高效地交付。在大型设置中,如社交媒体平台或电子商务服务,服务系统每天可能处理数十万亿个推理查询(C.-J. Wu 等,2019)。第十二章中建立的测量框架对于验证性能声明和建立生产基线变得至关重要。满足这种需求需要仔细设计,以平衡延迟、可扩展性和鲁棒性。

为了应对这些挑战,生产级服务框架已经出现。例如,TensorFlow Serving27、NVIDIA Triton Inference Server28 和KServe29 提供了在异构基础设施上部署、版本控制和扩展机器学习模型的标准化机制。这些框架抽象了许多底层关注点,使团队能够专注于系统行为、集成和性能目标。

模型服务架构通常围绕三个广泛范式设计:

  1. 在线服务,它为推荐引擎或欺诈检测等交互式系统提供低延迟、实时的预测。

  2. 离线服务,它异步处理大量数据,通常用于计划中的作业,用于报告或模型重新训练。

  3. 近在线(半同步)服务,它提供了延迟和吞吐量之间的平衡,适用于聊天机器人或半交互式分析等场景。

这些方法中的每一种都在可用性、响应性和吞吐量方面引入了不同的约束。第九章中提到的效率技术对于满足这些性能要求至关重要,尤其是在大规模部署模型时。因此,服务系统被构建来满足特定的服务水平协议(SLAs)30 和服务水平目标(SLOs)31,这些协议量化了可接受的性能边界,如延迟、错误率和正常运行时间。实现这些目标需要在请求处理、调度和资源分配方面进行一系列优化。

为了满足这些需求,通常会采用多种服务系统设计策略。请求调度和批处理将推理请求聚合起来,以提高吞吐量和硬件利用率。例如,Clipper (Crankshaw 等人 2017) 通过批处理和缓存技术,在在线环境中减少响应时间。模型实例选择和路由根据系统负载或用户定义的约束动态地将请求分配给模型变体;INFaaS (Romero 等人 2021) 通过在变体模型之间优化准确度-延迟权衡来说明这种方法。

  1. 请求调度和批处理:通过智能排队和分组策略有效地管理传入的机器学习推理请求,通过优化性能。像 Clipper (Crankshaw 等人 2017) 这样的系统通过缓存和批处理技术引入了低延迟的在线预测服务。

  2. 模型实例选择和路由:智能算法将请求引导到适当的模型版本或实例。INFaaS (Romero 等人 2021) 通过生成模型变体并根据性能和准确度要求有效地探索权衡空间来探索这一点。

  3. 负载均衡:在多个服务实例之间均匀分配工作负载。MARK (模型 Ark) (C. Zhang 等人 2019) 展示了用于机器学习服务系统的有效负载均衡技术。

  4. 模型实例自动扩展:根据需求动态调整容量。INFaaS (Romero 等人 2021) 和 MArk (C. Zhang 等人 2019) 都集成了自动扩展功能,以有效地处理工作负载波动。

  5. 模型编排:管理模型执行,实现并行处理和战略资源分配。AlpaServe (Z. Li 等人 2023) 展示了处理大型模型和复杂服务场景的高级技术。

  6. 执行时间预测:像 Clockwork (Gujarati 等人 2020) 这样的系统通过预测单个推理的执行时间并有效地使用硬件加速器来关注高性能服务。

在更复杂的推理场景中,模型编排协调多阶段模型或分布式组件的执行。AlpaServe (Z. Li 等人 2023) 通过协调资源分配,通过高效地提供大型基础模型来举例说明这一点。最后,执行时间预测使系统能够预测单个请求的延迟。Clockwork (Gujarati 等人 2020) 利用这一功能在负载高峰下减少尾部延迟并提高调度效率。

虽然这些系统在实现上有所不同,但它们共同展示了支撑可扩展和响应式 ML-as-a-Service 基础设施的关键技术。表 13.2 总结了这些策略,并突出了实现它们的代表性系统。

表 13.2:服务系统技术:可扩展的 ML-as-a-service 基础设施依赖于请求调度和实例选择等技术来优化资源利用并减少高负载下的延迟。该表总结了关键策略和实现它们的代表性系统(例如 clipper)。

技术 描述 示例系统
请求调度与批处理 将推理请求分组以提高吞吐量和降低开销 Clipper
实例选择与路由 根据约束动态将请求分配给模型变体 INFaaS
负载均衡 在副本之间分配流量以防止瓶颈 MArk
自动扩展 调整模型实例以匹配工作负载需求 INFaaS, MArk
模型编排 协调模型组件或管道的执行 AlpaServe
执行时间预测 预测延迟以优化请求调度 Clockwork

这些策略共同构成了强大模型服务系统的基石。当有效集成时,它们使机器学习应用能够满足性能目标,同时保持系统级效率和可扩展性。

边缘 AI 部署模式

边缘 AI 代表了部署架构的重大转变,其中机器学习推理发生在数据源附近,而不是在集中式云基础设施中。这种范式解决了包括延迟要求、带宽限制、隐私问题和连接性限制在内的关键约束,这些是现实世界操作环境的特征。根据行业预测,到 2025 年,75%的机器学习推理将在边缘发生,这使得边缘部署模式对于 MLOps 从业者来说是必备的知识(Reddi 等人 2019a)。

边缘部署引入了独特的操作挑战,这些挑战使其与传统以云为中心的 MLOps 区分开来。边缘设备上的资源限制需要采用包括量化、剪枝和知识蒸馏在内的激进模型优化技术,以实现小于 1 MB 的内存占用,同时保持可接受的准确性。边缘设备的功耗预算通常从物联网传感器的 10 mW 到汽车系统的 45 W 不等,这要求进行功耗感知的推理调度和热管理策略。对于安全关键型应用,实时需求需要确定性的推理时间,对于碰撞避免系统,最坏情况下的执行时间保证小于 10 ms,对于交互式机器人应用,小于 100 ms。

边缘 AI 系统的操作架构通常遵循分层部署模式,将智能分布在多个层级。传感器级处理使用微控制器级设备进行即时数据过滤和特征提取,功耗为 1-100 毫瓦。边缘网关处理使用具有 1-10 瓦功率预算的应用处理器执行中间推理任务。云协调管理模型分发、聚合学习和需要 GPU 级计算资源的复杂推理任务。这种层次结构使系统能够进行全局优化,其中计算密集型操作迁移到更高层级,而延迟关键决策保持本地化。

最资源受限的边缘 AI 场景涉及 TinyML 部署模式,针对基于微控制器的推理,内存限制在 1 MB 以下,功耗以毫瓦计量。TinyML 部署需要专门的推理引擎,如 TensorFlow Lite Micro、CMSIS-NN 以及针对特定硬件优化的库,这些库消除了动态内存分配并最小化了计算开销。模型架构必须与硬件约束协同设计,优先考虑深度卷积、二值神经网络和剪枝模型,这些模型在保持任务特定精度要求的同时实现了 90%以上的稀疏度。

移动 AI 操作将这种边缘部署范式扩展到具有适度计算能力和严格功耗要求的智能手机和平板电脑。移动部署利用神经网络单元(NPUs)、GPU 计算着色器和专用指令集通过硬件加速来实现 5-50 毫秒的延迟目标,功耗低于 500 毫瓦。移动 AI 操作需要复杂的电源管理,包括动态频率缩放、热管理协调和后台推理调度,以平衡性能、电池寿命和用户体验限制。

部署边缘系统的关键操作能力包括空中模型更新,这允许对无法物理访问的系统进行维护。OTA 更新管道必须实现安全、经过验证的模型分发,防止恶意模型注入,并通过加密签名和回滚机制确保更新完整性。边缘设备需要差分压缩技术,通过仅传输模型参数变化而不是完整的模型工件来最小化带宽使用。更新调度必须考虑设备连接模式、电源可用性和操作关键性,以防止更新引起的服务中断。

生产级边缘人工智能系统通过系统性的截止时间分析和资源分配方法实现实时约束管理。最坏情况执行时间(WCET)分析确保即使在包括热管理、内存竞争和中断服务例程等不利条件下,推理操作也能在指定的时序范围内完成。资源预留机制确保关键推理任务的计算带宽,同时允许非关键工作负载的最佳努力执行。优雅降级策略使系统在资源受限时通过减少模型复杂性、推理频率或特征完整性来维持基本功能。

边缘-云协调模式使混合部署架构优化推理工作负载在计算层之间的分布。自适应卸载策略根据当前系统负载、网络条件和延迟要求,动态地在边缘和云资源之间路由推理请求。在边缘网关中缓存特征可以减少冗余计算,通过存储频繁访问的中间表示,同时通过缓存失效策略保持数据的新鲜度。联邦学习协调使边缘设备能够在不传输原始数据的情况下贡献于模型改进,解决隐私约束的同时保持系统级的学习能力。

边缘人工智能部署的操作复杂性需要针对资源受限环境进行专门的监控和调试方法。轻量级遥测系统捕捉关键性能指标,包括推理延迟、功耗和准确性指标,同时最小化对边缘设备的开销。远程调试功能使工程师能够通过安全的通道诊断已部署的系统,在保护隐私的同时,提供对系统行为的充分可见性。健康监控系统跟踪设备级条件,包括热状态、电池水平和连接质量,以预测维护需求并防止灾难性故障。

资源约束分析通过系统地建模计算能力、功耗、内存利用率和推理精度之间的权衡,为边缘人工智能的成功部署奠定基础。电力预算框架建立操作范围,定义在不同环境条件和使用模式下的可持续工作负载配置。内存优化层次结构指导选择模型压缩技术,从参数减少到结构简化,再到降低计算需求的架构修改。

边缘人工智能部署代表了 MLOps 实践必须适应的运营前沿,即现实世界系统的物理约束和分布式复杂性。成功不仅需要模型优化和嵌入式系统方面的技术专长,还需要系统性的分布式系统管理、安全和可靠性工程方法,以确保部署的系统能够在不同的运营环境中保持功能。

资源管理和性能监控

机器学习系统的运行稳定性取决于其底层基础设施的稳健性。计算、存储和网络资源必须进行配置、分配和扩展,以适应训练工作负载、部署管道和实时推理。除了基础设施配置之外,有效的可观察性实践确保系统能够在条件变化时进行监控、解释和采取行动。

基础设施管理

可扩展、弹性基础设施是实施机器学习系统的基本要求。随着模型从实验阶段过渡到生产阶段,MLOps 团队必须确保底层计算资源能够支持持续集成、大规模训练、自动化部署和实时推理。这需要将基础设施管理视为动态的、可编程的、版本化的系统,而不是静态的硬件。

为了实现这一点,团队采用基础设施即代码(IaC)的实践,这是一种改变计算基础设施管理方式的范例。而不是通过图形界面或命令行工具手动配置服务器、网络和存储,这个过程容易出错且难以重现,IaC 将基础设施配置视为软件代码。此代码以文本文件的形式描述了基础设施资源的期望状态,这些文件是版本控制的、经过审查的,并且可以自动执行。正如软件开发者编写代码来定义应用程序行为一样,基础设施工程师编写代码来定义计算环境。这种转变将软件工程的最佳实践引入基础设施管理:通过版本控制跟踪更改,在部署前测试配置,并可以从其代码定义中可靠地重现整个环境。

TerraformAWS CloudFormationAnsible 等工具通过使团队能够与应用程序代码一起版本控制基础设施定义来支持这一范式。在 MLOps 设置中,Terraform 广泛用于在公共云平台(如 AWSGoogle Cloud PlatformMicrosoft Azure)上配置和管理资源。

基础设施管理涵盖了机器学习系统的整个生命周期。在模型训练期间,团队使用 IaC 脚本来分配带有 GPU 或 TPU 加速器的计算实例,配置分布式存储,并部署容器集群。这些配置确保数据科学家和机器学习工程师能够访问具有所需计算能力的可重复环境。由于基础设施定义被存储为代码,它们可以接受审计、重用,并集成到 CI/CD 管道中,以确保跨环境的一致性。

容器化在使机器学习工作负载可移植和一致化方面发挥着关键作用。像Docker这样的工具将模型及其依赖项封装成独立的单元,而像Kubernetes这样的编排系统则管理跨集群的容器化工作负载。这些系统使得快速部署、资源分配和扩展成为可能,这些能力在生产环境中至关重要,因为工作负载可以动态变化。

为了处理工作负载强度的变化,包括超参数调整期间的峰值和预测流量激增,团队依赖云弹性自动扩展 32。云平台支持按需提供和水平扩展基础设施资源。自动扩展机制根据使用指标自动调整计算能力,使团队能够在性能和成本效率之间进行优化。

在 MLOps 中,基础设施不仅限于云。许多部署跨越本地、云和边缘环境,这取决于延迟、隐私或监管限制。一个强大的基础设施管理策略必须通过提供灵活的部署目标和跨环境的一致配置管理来适应这种多样性。

以一个场景为例,一个团队使用 Terraform 在 Google Cloud Platform 上部署一个 Kubernetes 集群。该集群配置为托管容器化的 TensorFlow 模型,通过 HTTP API 提供预测服务。随着用户需求的增加,Kubernetes 自动扩展 pods 的数量以处理负载。同时,CI/CD 管道根据重新训练周期更新模型容器,监控工具跟踪集群性能、延迟和资源利用率。从网络配置到计算配额的所有基础设施组件都作为版本控制的代码进行管理,确保可重复性和可审计性。

通过采用基础设施即代码、利用云原生编排和支持自动扩展,MLOps 团队能够以生产规模配置和维护机器学习所需的资源。这一基础设施层支撑着整个 MLOps 堆栈,使得可靠的训练、部署和服务工作流程成为可能。

虽然这些基础能力解决了基础设施的提供和管理问题,但机器学习系统的运营现实引入了独特的资源优化挑战,这些挑战超出了传统 Web 服务扩展模式。在 MLOps 中,基础设施资源管理成为一个多维度的优化问题,需要团队平衡相互竞争的目标:计算成本、模型精度、推理延迟和训练吞吐量。

与无状态 Web 应用相比,机器学习工作负载表现出不同的资源消耗模式。训练工作负载显示出突发性资源需求,在模型开发阶段从零扩展到数千个 GPU,然后在验证期间回到最小消耗。这导致了资源利用效率与洞察力获取时间之间的紧张关系,传统扩展方法无法充分解决。相反,推理工作负载呈现稳定的资源消耗模式,具有严格的延迟要求,必须在变化的流量模式下保持。

当考虑到训练频率、模型复杂性和服务基础设施成本之间的相互依赖性时,优化挑战变得更加严峻。有效的资源管理需要整体方法,而不是孤立优化单个组件,需要考虑数据管道吞吐量、模型重新训练计划和服务器容量规划等因素。

硬件感知的资源优化成为一项关键的操作学科,它将基础设施效率与模型性能联系起来。生产 MLOps 团队必须建立利用目标,在成本效率和运营可靠性之间取得平衡:对于批量训练工作负载,GPU 利用率应持续超过 80%以证明硬件成本合理,而服务工作负载需要维持超过 60%的持续利用率以保持经济可行的推理操作。内存带宽利用模式同样重要,因为未充分利用的内存接口表明数据管道配置不佳,这可能会降低训练吞吐量 30-50%。

运营资源分配不仅限于简单的利用率指标,还包括跨混合工作负载的电力预算管理。生产部署通常在开发周期中将 60-70%的电力预算分配给训练操作,保留 30-40%用于持续的推理工作负载。这种分配会根据业务优先级动态调整:推荐系统可能在流量高峰期间重新分配推理的电力,而研究环境则优先考虑训练资源的可用性。热管理考虑因素成为运营限制,而不是硬件设计问题,因为持续的高利用率工作负载必须根据冷却能力限制和热限制阈值进行调度,这些限制可能会影响服务等级协议的遵守。

模型和基础设施监控

监控是 MLOps 中的关键功能,使团队能够在生产中部署的机器学习系统中保持操作可见性。一旦模型上线,它就会接触到现实世界的输入、不断变化的数据分布和用户行为的转变。没有持续的监控,及时检测性能下降、数据质量问题或系统故障变得困难。

有效的监控涵盖了模型行为和基础设施性能。在模型方面,团队通过实时或样本预测跟踪诸如准确率、精确度、召回率和混淆矩阵等指标。通过随时间评估这些指标,他们可以检测模型性能是否保持稳定或开始漂移。

生产级机器学习系统面临模型漂移 33(参见第 13.4.2.3 节以获取详细分析),这表现为两种主要形式:

  • 概念漂移 34 发生在特征与目标之间的基本关系演变时。例如,在 COVID-19 大流行期间,购买行为发生了巨大变化,使许多之前准确的建议模型失效。

  • 数据漂移指的是输入数据分布本身的变动。在自动驾驶汽车等应用中,这可能是由于天气、光照或道路条件等季节性变化引起的,所有这些都影响模型的输入。

除了这些已知的漂移模式之外,还存在一个更隐蔽的挑战:逐渐的长期退化,它逃避了标准的检测阈值。与触发即时警报的突然分布变化不同,一些模型可能通过难以察觉的每日变化在数月内经历性能侵蚀。例如,电子商务推荐系统可能每天损失 0.05%的准确性,随着用户偏好的变化,一年内累积到 15%的退化,而不会触发每月的漂移警报。季节性模式增加了这种复杂性:在夏季训练的模型可能在秋季表现良好,但在它从未观察过的冬季条件下可能失败。检测这种逐渐的退化需要专门的监控方法:在多个时间跨度(每日、每周、季度)上建立性能基线,实施滑动窗口比较以检测缓慢趋势,并维护考虑周期性模式的季节性性能配置文件。团队通常只在季度业务审查中通过累积影响变得明显时发现这些退化,这强调了需要多时间尺度监控策略的需求。

除了模型级别的监控外,基础设施级别的监控跟踪 CPU 和 GPU 利用率、内存和磁盘消耗、网络延迟以及服务可用性等指标。这些信号有助于确保系统在变化的负载条件下保持高性能和响应性。硬件感知监控将这些基本指标扩展到捕获对运营成功至关重要的资源效率模式:GPU 内存带宽利用率、与计算输出相关的功耗,以及在整个工作负载中的热封装遵守情况。

在上述监控基础设施的基础上,生产系统必须跟踪直接影响运营成本和模型性能的硬件效率指标。GPU 利用率监控应区分计算密集型和内存密集型操作,因为相同的 90%利用率指标可能代表完全不同的操作效率,这取决于瓶颈位置。内存带宽监控对于检测表现为高 GPU 利用率但计算吞吐量低的不理想数据加载模式至关重要。以每瓦操作数衡量的能效指标使团队能够优化混合工作负载的调度,以实现成本和环境影响的最优化。

热量监控集成到操作调度决策中,尤其是在持续高利用率部署中,热限制可能会不可预测地降低性能。现代 MLOps 监控仪表板包含了热容量指标,这些指标指导工作负载在可用硬件之间的分配,防止由热量引起的性能退化,这可能会违反推理延迟 SLA。工具如Prometheus35、GrafanaElastic被广泛用于收集、聚合和可视化这些操作指标。这些工具通常集成到提供实时和历史系统行为视图的仪表板中。

积极的警报机制被配置为在出现异常或阈值违规时通知团队 36。例如,模型准确性的持续下降可能会触发一个警报来调查潜在的漂移,提示使用更新数据重新训练。同样,基础设施警报可以指示内存饱和或网络性能下降,允许工程师在故障传播之前采取纠正措施。

最终,强大的监控能力使团队能够在问题升级之前发现它们,保持高服务可用性,并保护机器学习系统的可靠性和可信度。如果没有这样的实践,模型可能会无声地退化,或者在负载下系统可能会失败,从而削弱了整个机器学习管道的有效性。

监控系统本身需要具备弹性规划以防止操作盲点。当主监控基础设施出现故障,例如 Prometheus 出现停机或 Grafana 不可用时,团队在关键时期可能会面临操作盲区。因此,生产级别的 MLOps 实现维护冗余的监控路径:在主系统故障时激活的二级指标收集器、在集中式系统故障时持续存在的本地日志,以及检测监控系统故障的心跳检查。一些组织实施跨监控,其中独立的基础设施监控器监控监控系统本身,确保观察失败通过替代渠道(如 PagerDuty 或直接通知)触发即时警报。这种多层次防御方法防止了同时发生模型及其监控系统故障而未被发现这种灾难性场景。

在分布式部署中,监控弹性的复杂性显著增加。多区域机器学习系统引入了额外的协调挑战,这些挑战超出了简单冗余的范畴。在这样的环境中,监控成为一个分布式协调问题,需要共识机制来评估一致的系统状态。传统的集中式监控假设有一个单一的真实点,但分布式机器学习系统必须在数据中心之间解决可能存在冲突的观察结果。

这种分布式监控挑战在三个关键领域体现出来:基于共识的警报以防止网络分区导致的误报、协调的断路器状态 37 以在故障期间保持系统一致性,以及分布式指标聚合,在具有可变网络延迟的区域中保持时间顺序。协调开销与监控节点数量呈二次方增长,在可见性覆盖和系统复杂性之间产生紧张关系。

为了应对这些挑战,团队通常会实施分层监控架构,其中区域监控器通过最终一致性模型向全局协调员报告,而不是要求每个指标都具备强一致性。这种方法在监控粒度与维护分布式共识的计算成本之间取得平衡,使得可扩展的可见性不会因协调开销而压倒系统。

模型治理和团队协调

成功的 MLOps 实施需要稳健的治理框架以及跨不同团队和利益相关者的有效协作。本节探讨了负责和有效的机器学习操作所需的政策、实践和组织结构。我们探讨了确保透明度和问责制的模型治理原则,连接技术和业务团队的跨职能协作策略,以及协调期望并促进决策的利益相关者沟通方法。

模型治理

随着机器学习系统在决策过程中的日益嵌入,治理已成为 MLOps 的关键支柱。治理包括确保 ML 模型透明、公平并符合伦理和监管标准的政策、实践和工具。没有适当的治理,部署的模型可能会产生有偏见的或模糊的决定,导致重大的法律、声誉和社会风险。伦理考量以及偏见缓解技术是实施这些治理框架的基础。

治理始于模型开发阶段,团队在此阶段实施技术以增加透明度和可解释性。例如,SHAP38 和LIME等方法通过识别在特定决策中最具影响力的输入特征,对模型预测进行事后解释。这些可解释性技术补充了安全措施,这些措施解决如何在生产环境中保护模型完整性和数据隐私。这些技术允许审计员、开发人员和非技术利益相关者更好地理解模型如何以及为什么以这种方式表现。

除了可解释性之外,公平性在治理中也是一个核心关注点。偏见检测工具分析模型输出在不同人口群体之间的差异,包括由年龄、性别或种族定义的群体,以识别性能差异。例如,用于贷款批准的模型不得系统地损害某些群体。MLOps 团队在系统投入生产之前,在精心挑选的代表性数据集上执行预部署审计,以评估公平性、鲁棒性和整体模型行为。

治理还扩展到部署后的阶段。如前节所述的监控部分所介绍,团队必须跟踪概念漂移,即特征和标签之间的统计关系随时间演变。这种漂移可能会损害模型的公平性或准确性,尤其是如果这种转变不成比例地影响特定子群体。通过分析日志和用户反馈,团队可以识别重复的故障模式、未解释的模型输出或用户群体之间出现的处理差异。

支持这种治理生命周期方法的是将治理功能集成到更广泛的 MLOps 堆栈中的平台和工具包。例如,Watson OpenScale 提供了内置的模块,用于可解释性、偏差检测和监控。这些工具允许将治理策略编码为自动化管道的一部分,确保在整个开发、评估和生产过程中始终如一地应用检查。

最终,治理关注三个核心目标:透明度、公平性和合规性。透明度确保模型可解释和可审计。公平性促进用户群体间的公平对待。合规性确保与法律和组织政策的保持一致。在整个 MLOps 生命周期中嵌入治理实践,将机器学习从一项技术成果转变为一个值得信赖的系统,能够服务于社会和组织目标。

跨职能协作

机器学习系统是由多学科团队开发和维护的,包括数据科学家、ML 工程师、软件开发人员、基础设施专家、产品经理和合规官员。由于这些角色跨越不同的专业知识领域,有效的沟通和协作对于确保一致性、效率和系统可靠性至关重要。MLOps 通过引入共享工具、流程和工件来促进跨职能集成,这些工具和工件促进了机器学习生命周期中的透明度和协调。

协作始于对实验、模型版本和元数据的持续跟踪。例如,MLflow 提供了一个结构化的环境,用于记录实验、捕获参数、记录评估指标,并通过集中式注册表管理训练模型。这个注册表作为所有团队成员的共享参考点,促进了可重复性和角色间移交的简化。与版本控制系统如 GitHubGitLab 的集成进一步通过将代码更改与模型更新和管道触发器链接起来,简化了协作。

除了跟踪基础设施之外,团队还可以从支持探索性协作的平台中受益。Weights & Biases 就是这样的平台之一,它允许数据科学家可视化实验指标、比较训练运行并与同行分享见解。诸如实时仪表板和实验时间线等特性,促进了关于模型改进、超参数调整或数据集精炼的讨论和决策。这些协作环境通过使结果在整个团队中可解释和可重复,减少了模型开发中的摩擦。

除了模型跟踪之外,协作还依赖于对数据语义和使用的共同理解。通过术语表、数据字典、模式引用和血缘文档等方式建立共同的数据上下文,确保所有利益相关者对特征、标签和统计数据保持一致的解释。这在大型组织中尤为重要,因为数据管道可能在不同团队或部门之间独立演变。

例如,一位在异常检测模型上工作的数据科学家可能会使用 Weights & Biases 来记录实验结果并可视化性能趋势。这些见解与更广泛的团队共享,以指导特征工程决策。一旦模型达到可接受的性能阈值,它就会在 MLflow 中注册,包括其元数据和训练血缘。这允许 ML 工程师在没有关于其来源或配置的模糊性的情况下部署模型。

通过整合协作工具、标准化文档和透明的实验跟踪,MLOps 消除了传统上减缓 ML 工作流程的沟通障碍。它使分布式团队能够协同工作,加速迭代周期,并提高部署系统的可靠性。然而,有效的 MLOps 不仅超越了内部团队协调,还包括了当技术团队与商业利益相关者接口时出现的更广泛的沟通挑战。

利益相关者沟通

高效的 MLOps 不仅超越了技术实现的范畴,还包括了在将复杂的机器学习现实转化为商业语言时出现的战略沟通挑战。与具有确定性行为的传统软件系统不同,机器学习系统表现出概率性性能、数据依赖性和退化模式,这些往往是利益相关者难以理解的。这种沟通差距可能会在技术执行仍然稳健的情况下,破坏项目的成功。

最常见的沟通挑战源于过于简化的改进请求。产品经理经常提出诸如“使模型更准确”的指令,而不了解管理模型性能的潜在权衡。有效的 MLOps 沟通通过提出具有明确成本的明确选项来重新构建这些请求。例如,将准确性从 85%提高到 87%,可能需要在三周内收集四倍多的训练数据,同时将推理延迟从 50 ms 加倍到 120 ms。通过阐述这些具体限制,MLOps 从业者将模糊的请求转化为明智的商业决策。

类似地,将技术指标转化为业务影响需要一致的框架,将模型性能与运营成果联系起来。5%的准确率提升在孤立的情况下看似微不足道,但将这种变化置于“将每日客户摩擦事件从 1,000 减少到 800”的背景下,提供了可操作的业务背景。当基础设施变更影响用户体验,例如 p99 延迟从 200 ms 下降到 500 ms,根据转化分析可能导致 15%的用户流失,利益相关者可以评估技术权衡与业务优先级。

事件沟通又提出了另一个关键运营挑战。当模型退化或需要回滚时,维持利益相关者信任取决于对故障模式的清晰分类。暂时的性能波动代表正常系统变化,数据漂移表明计划维护需求,系统故障则要求立即回滚程序。建立定期的性能报告周期可以预先解决利益相关者对模型可靠性的担忧,并形成对可接受运营边界的共同理解。

资源论证需要将技术基础设施需求转化为业务价值主张。与其请求“8 个 A100 GPU 用于模型训练”,有效的沟通应将投资框架为“基础设施以将实验周期时间从 2 周缩短至 3 天,实现 4 倍的特征迭代速度。”时间线估计必须考虑实际开发比例:数据准备通常消耗项目持续时间的 60%,模型开发 25%,部署监控 15%。沟通这些比例有助于利益相关者理解为什么模型训练只占总交付时间线的一小部分。

考虑一个为金融服务平台实施模型改进的欺诈检测团队。当利益相关者要求提高准确性时,团队以结构化的提案回应:将检测率从 92%提高到 94%需要整合外部数据源,将训练时间延长两周,并接受 30%更高的基础设施成本。然而,这种改进将防止估计的 200 万美元的年度欺诈损失,同时减少目前每月影响 5 万名客户的误报警报。这种沟通方法通过将技术能力与业务成果联系起来,使利益相关者能够做出明智的决策。

通过纪律性的利益相关者沟通,MLOps 实践者维持对机器学习投资的机构支持,同时建立对系统能力和运营要求的现实预期。这种沟通能力对于在生产环境中维持成功的机器学习运营与专业技术一样至关重要。

在建立了基础设施和生产操作框架之后,我们现在来探讨实施这些实践所需的组织结构。

一种常见的校正级联来源是序列模型开发:重用或微调现有模型以加速新任务的开发。虽然这种策略通常效率很高,但它可能会引入难以在以后解开隐藏的依赖关系。早期模型中固化的假设成为未来模型的隐含约束,限制了灵活性并增加了下游校正的成本。

考虑一个团队为新产品微调客户流失预测模型的场景。原始模型可能包含特定于产品的行为或特征编码,在新环境中不适用。当性能问题出现时,团队可能会尝试修补模型,却发现真正的问题可能位于几个层次之上,可能在原始特征选择或标注标准中。

为了避免或减少校正级联的影响,团队必须在重用和重新设计之间做出谨慎的权衡。有几个因素会影响这个决定。对于小型、静态数据集,微调可能是合适的。对于大型或快速变化的数据集,从头开始重新训练提供了更大的控制和适应性。微调还需要较少的计算资源,使其在受限环境中具有吸引力。然而,由于这些级联效应,后来修改基础组件的成本变得极高。

因此,应仔细考虑引入新的模型架构,即使资源密集,以避免后续的校正级联。这种方法可能有助于减轻下游问题的放大效应并减少技术债务。然而,仍然存在一些场景,序列模型构建是有意义的,这需要在机器学习开发过程中在效率、灵活性和长期可维护性之间进行深思熟虑的平衡。

要了解为什么尽管遵循最佳实践,校正级联在机器学习系统中仍然如此持久地发生,有助于检查驱动这一现象的潜在机制。校正级联模式源于违反软件工程中建立的系统模块化原则的隐藏反馈循环。当模型 A 的输出影响模型 B 的训练数据时,这会创建隐含的依赖关系,破坏模块化设计。这些依赖关系尤其狡猾,因为它们通过数据流而不是显式的代码接口操作,使它们对传统的依赖关系分析工具不可见。

从系统理论的角度来看,纠正级联代表了看似独立组件之间紧密耦合的实例。级联传播遵循幂律分布,其中小的初始变化可以触发不成比例的系统级重大修改。这一现象与复杂系统中的蝴蝶效应相似,其中微小的扰动通过非线性相互作用放大。

理解这些理论基础有助于工程师认识到,防止纠正级联不仅需要更好的工具,还需要在存在学习组件的情况下,保持系统模块化的架构决策。挑战在于设计机器学习系统,即使数据驱动工作流程本质上相互关联,也能保持松散耦合。

表 13.3:技术债务模式:机器学习系统积累来自数据依赖、模型交互和不断变化的操作环境的不同形式的技术债务。本表总结了主要债务模式、其原因、症状和推荐的缓解策略,以指导从业者系统地识别和解决这些挑战。

债务模式 主要原因 关键症状 缓解策略
边界侵蚀 紧密耦合的组件,接口不明确 变化不可预测地级联,CACHE 原则违反 强制模块化接口,设计封装
纠正级联 顺序模型依赖,继承的假设 上游修复破坏下游系统,升级修订 小心重用与重新设计的权衡,清晰的版本控制
未声明的消费者 非正式输出共享,未跟踪的依赖 模型更新导致的静默破坏,隐藏的反馈循环 严格的访问控制,正式的接口合同,使用监控
数据依赖债务 不稳定或未充分利用的数据输入 数据变化导致模型失败,脆弱的特征管道 数据版本控制,血缘跟踪,留一分析
反馈循环 模型输出影响未来的训练数据 自我强化的行为,隐藏的性能下降 基于群体的监控,金丝雀部署,架构隔离
管道债务 临时工作流程,缺乏标准接口 执行脆弱,重复,维护负担 模块化设计,工作流程编排工具,共享库
配置债务 碎片化设置,版本控制不佳 不可复现的结果,静默故障,调整不透明 版本控制,验证,结构化格式,自动化
早期债务 快速原型简略,紧密的代码逻辑耦合 系统扩展时的不灵活性,团队合作困难 灵活的基础设施,有意债务跟踪,计划重构

管理隐藏的技术债务

虽然所讨论的例子突出了大型系统中隐藏技术债务的后果,但它们也提供了关于如何揭示、控制和最终减少此类债务的宝贵经验。管理隐藏债务需要不仅仅是反应性的修复;它需要一种深思熟虑且前瞻性的系统设计、团队工作流程和工具选择方法。本章的以下部分提出了对表 13.3 中确定的每种债务模式的系统解决方案。

一个基本的原则是将数据和配置视为系统架构的组成部分,而不是外围的工件。如图图 13.2 所示,机器学习系统的大部分内容都位于模型代码本身之外,在特征工程、配置、监控和服务基础设施等组件中。这些外围层通常隐藏着最持久的债务形式,尤其是在没有系统跟踪或验证的情况下进行更改时。接下来的 MLOps 基础设施和开发部分通过特征存储、数据版本控制系统和专门设计来管理数据和配置复杂性的持续管道框架来应对这些挑战。

对数据转换、标签约定和训练配置进行版本控制,使团队能够重现过去的结果,定位回归,并了解设计选择随时间推移的影响。能够实现这一点的工具,如用于数据版本控制的DVC、用于配置管理的Hydra和用于实验跟踪的MLflow,有助于确保系统在演变过程中保持可追溯性。版本控制必须扩展到模型检查点之外,包括训练和评估时的数据和配置上下文。

另一个关键策略是通过模块化接口进行封装。紧密耦合系统中看到的级联故障突出了在组件之间定义清晰边界的重要性。如果没有明确指定的 API 或合同,一个模块的变化可能会在其他模块中不可预测地产生连锁反应。相比之下,围绕松耦合组件设计的系统,其中每个模块都有明确的责任和有限的对外假设,对变化具有更强的适应性。

封装还支持依赖关系意识,减少了未声明消费者静默重用输出或内部表示的可能性。这在反馈敏感的系统中尤为重要,因为隐藏的依赖关系可能会随着时间的推移引入行为漂移。通过经过审计和文档化的接口公开输出,使得推理其使用和追踪模型演变时的下游影响变得更加容易。

可观测性和监控进一步增强了系统对隐藏债务的防御能力。虽然静态验证可能在开发过程中捕获错误,但许多形式的机器学习债务仅在部署期间显现,尤其是在动态环境中。监控分布变化、特征使用模式和特定群体的性能指标有助于在影响用户或传播到未来训练数据之前及早检测到退化。生产操作部分详细介绍了这些监控系统、治理框架和部署策略,包括金丝雀部署和渐进式发布,这些是限制风险同时允许系统演化的关键工具。

团队还应投资于制度实践,定期浮现并解决技术债务。债务审查、管道审计和模式验证冲刺是团队从快速迭代中退出来评估系统整体健康的检查点。这些审查为重构、修剪未使用的功能、整合冗余逻辑和重新确立可能随时间侵蚀的边界创造了空间。角色和责任部分探讨了数据工程师、机器学习工程师和其他专家如何协作在组织内实施这些实践。

最后,技术债务的管理必须与更广泛的文化承诺保持一致,即维护系统的可维护性。这意味着在系统成熟或集成到关键工作流程之后,优先考虑长期系统完整性而非短期速度。这也意味着要认识到何时债务是战略性的,即故意承担以促进探索,并确保在债务根深蒂固之前对其进行跟踪和重新审视。

在所有情况下,管理隐藏的技术债务不是关于消除复杂性,而是设计能够容纳它而不会变得脆弱的系统。通过架构纪律、深思熟虑的工具和愿意重构的意愿,机器学习从业者可以构建即使在扩展和演变过程中也能保持灵活和可靠的系统。操作系统设计部分提供了评估组织成熟度和设计系统以系统地解决这些债务模式的框架,而案例研究展示了这些原则如何在现实世界情境中应用。

摘要

机器学习系统中的技术债务既普遍又与传统软件工程中遇到的债务不同。虽然原始的金融债务隐喻突出了速度和长期成本之间的权衡,但这种类比在捕捉机器学习系统的全部复杂性方面存在不足。在机器学习中,债务不仅可能来自代码捷径,还可能来自纠缠的数据依赖、难以理解的反馈循环、脆弱的管道和配置蔓延。与可以明确量化的金融债务不同,机器学习技术债务在很大程度上是隐藏的,只有在系统扩展、演变或失败时才会显现。

本章概述了几种机器学习特定的技术债务形式,每种形式都根植于系统生命周期的不同方面。边界侵蚀破坏了模块化,使系统难以推理。纠正级联说明了局部修复如何在一个紧密耦合的工作流程中产生连锁反应。未声明的消费者和反馈循环引入了看不见的依赖关系,挑战了可追溯性和可重复性。数据和配置债务反映了管理不善的输入和参数的脆弱性,而管道和变更适应性债务揭示了僵化架构的风险。早期阶段的债务提醒我们,即使在探索阶段,决策也应着眼于未来的可扩展性。

所有这些债务类型的共同点是需要对系统性的工程方法和系统级思维。机器学习系统不仅仅是代码;它们是数据、模型、基础设施和团队的不断发展的生态系统,可以通过严格的工程实践有效地进行管理。管理技术债务需要架构纪律、强大的工具和重视可维护性与创新的文化。它还需要工程判断:识别何时债务是战略性的,并确保在它根深蒂固之前进行跟踪和处理。

随着机器学习在生产系统中的日益中心化,工程团队能够通过本章详细阐述的系统化实践、基础设施组件和组织结构来成功地解决这些挑战。理解和解决隐藏的技术债务不仅提高了可靠性和可扩展性,而且使团队能够更快地迭代、更有效地协作,并通过经过验证的工程方法维持其系统的长期演变。

然而,实施这些系统化实践和基础设施组件需要不仅仅是技术解决方案。它需要来自具有不同专业知识的专业人士的协调贡献,并且能够有效地合作。

角色和职责

在前几节中考察的操作框架、基础设施组件和治理实践,从根本上依赖于来自具有不同技术和组织专业知识的专业人士的协调贡献。与传统的软件工程工作流程不同,机器学习通过其依赖动态数据、迭代实验和概率模型行为引入了额外的复杂性。因此,没有单一角色可以独立管理整个机器学习生命周期。图 13.8 提供了这些角色之间相互关系的高级概述。

图片

图 13.8:人工智能开发策略:以模型为中心和数据为中心的方法是提高人工智能系统性能的互补策略;以模型为中心的人工智能优先考虑架构创新,而以数据为中心的人工智能则专注于提升数据质量和代表性以推动模型改进。有效的 AI 系统通常需要协调投资于模型和数据改进,以实现最佳结果。

遵循在第 13.2.2 节中建立的 MLOps 原则,这些专业角色围绕一个共同目标进行对齐:在生产环境中交付可靠、可扩展和可维护的机器学习系统。从设计健壮的数据管道到在实时系统中部署和监控模型,有效的协作依赖于 MLOps 促进的数据工程、统计建模、软件开发、基础设施管理和项目协调之间的学科协调。

角色列表

表 13.4 介绍了参与 MLOps 的关键角色,并概述了他们的主要职责。理解这些角色不仅明确了支持生产级机器学习系统所需的技能范围,还有助于构建推动大规模机器学习运营成功的协作工作流程和交接。

表 13.4:MLOps 角色与职责:有效的机器学习系统运营需要一个具有明确定义角色的协作团队(数据工程师、数据科学家等),每个成员在整个生命周期中从数据准备到模型部署和监控贡献专业专长。理解这些角色明确了技能要求,并促进了扩展机器学习解决方案的高效工作流程。

角色 主要关注点 核心职责摘要 MLOps 生命周期对齐
数据工程师 数据准备和基础设施 构建和维护管道;确保数据的质量、结构和血缘 数据摄取、转换
数据科学家 模型开发和实验 制定任务;构建和评估模型;使用反馈和错误分析进行迭代 建模和评估
机器学习工程师 生产集成和可扩展性 实施模型;实现服务逻辑;管理性能和再训练 部署和推理
DevOps 工程师 基础设施编排和自动化 管理计算基础设施;实施 CI/CD;监控系统和工作流程 训练、部署、监控
项目经理 协调和交付监督 对齐目标;管理进度和里程碑;促进跨团队执行 规划和集成
负责任的人工智能 道德、公平和治理 监测偏差和公平性;强制透明度 评估和治理
合规标准
安全与隐私 系统保护和数据完整性 保护数据和模型;实施隐私控制; 数据处理和合规
工程师 确保系统弹性

数据工程师

数据工程师负责构建和维护支撑机器学习系统的数据基础设施。他们的主要焦点是确保数据能够可靠地收集、处理,并以适合分析、特征提取、模型训练和推理的格式提供。在 MLOps 的背景下,数据工程师通过构建之前讨论过的数据基础设施组件,包括特征存储库、数据版本控制系统和验证框架,发挥基础性作用,这些组件能够支持可扩展和可重复的数据管道,从而支持端到端的机器学习生命周期。

数据工程师的核心责任之一是数据摄取:从各种运营源中提取数据,如事务数据库、Web 应用、日志流和传感器。这些数据通常被传输到集中式存储系统,如基于云的对象存储(例如,Amazon S3、Google Cloud Storage),这些系统为原始和加工后的数据集提供可扩展和持久的存储库。这些摄取工作流程是通过调度和工作流程工具(如 Apache Airflow、Prefect 或 dbt (Kampakis 2020))进行编排的。

一旦摄取,数据必须被转换成结构化、分析准备好的格式。这个转换过程包括处理缺失或格式不正确的值,解决不一致性,在异构源之间执行连接,以及计算下游任务所需的派生属性。数据工程师通过模块化管道实现这些转换,这些管道是版本控制的,旨在具有容错性和可重用性。结构化输出通常被加载到基于云的数据仓库中,如 Snowflake、Redshift 或 BigQuery,或者存储在特征存储库中,用于机器学习应用。

除了管理数据管道外,数据工程师还负责提供和优化支持数据密集型工作流程的基础设施。这包括配置分布式存储系统、管理计算集群,以及维护记录数据模式、血缘和访问控制的元数据目录。为了确保可重复性和治理,数据工程师实施数据集版本控制,维护历史快照,并执行数据保留和审计政策。

例如,在制造应用中,数据工程师可能会构建一个 Airflow 管道,从工厂地面的可编程逻辑控制器(PLCs)39 中摄取时间序列传感器数据。

原始数据经过清理,与产品元数据合并,并汇总成统计特征,如滚动平均值和阈值。处理后的特征存储在 Snowflake 数据仓库中,在那里它们被下游建模和推理工作流程所消费。

通过设计和维护稳健的数据基础设施,数据工程师确保了高质量数据的持续和高效交付。他们的贡献确保机器学习系统建立在可靠的输入之上,支持 MLOps 管道的可重复性、可扩展性和运营稳定性。

为了说明这一责任在实践中的体现,列表 13.1 展示了使用 Apache Airflow 实现的简化每日提取-转换-加载(ETL)管道的示例。此工作流程自动化了原始传感器数据的摄取和转换,为下游机器学习任务做准备。

列表 13.1:每日 ETL 管道:自动化原始传感器数据的摄取和转换,以支持下游机器学习任务,突出了 Apache Airflow 在编排工作流程任务中的作用。

# Airflow DAG for daily ETL from a manufacturing data source
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime


def extract_data():
    import pandas as pd

    df = pd.read_csv("/data/raw/plc_logs.csv")
    # Simulated PLC data
    df.to_parquet("/data/staged/sensor_data.parquet")


def transform_data():
    import pandas as pd

    df = pd.read_parquet("/data/staged/sensor_data.parquet")
    df["rolling_avg"] = df["temperature"].rolling(window=10).mean()
    df.to_parquet("/data/processed/features.parquet")


with DAG(
    dag_id="manufacturing_etl_pipeline",
    schedule_interval="@daily",
    start_date=datetime(2023, 1, 1),
    catchup=False,
) as dag:
    extract = PythonOperator(
        task_id="extract", python_callable=extract_data
    )
    transform = PythonOperator(
        task_id="transform", python_callable=transform_data
    )

    extract >> transform

数据科学家

数据科学家负责设计、开发和评估机器学习模型。他们的角色集中在将业务或运营问题转化为正式的学习任务,选择合适的算法,并通过统计和计算技术优化模型性能。在 MLOps 生命周期中,数据科学家在探索性分析和模型开发之间运作,直接参与到预测或决策能力的创建中。

通常,这个过程从与利益相关者合作,定义问题空间和建立成功标准开始。这包括用机器学习术语制定任务,包括分类、回归或预测,并确定合适的评估指标来量化模型性能。这些指标,如准确率、精确率、召回率、曲线下面积(AUC)或 F1 分数,为比较模型替代方案和指导迭代改进提供了客观的衡量标准(Rainio, Teuho, 和 Klén 2024)。

数据科学家通过探索性数据分析(EDA)来评估数据质量、识别模式并揭示关系,这些关系有助于特征选择和工程。这一阶段可能涉及统计摘要、可视化以及假设检验来评估数据建模的适用性。基于这些发现,与数据工程师合作构建或选择相关特征,以确保开发与部署环境的一致性。

模型开发涉及选择合适的机器学习算法并构建适合任务和数据特性的架构。数据科学家使用 TensorFlow、PyTorch 或 scikit-learn 等机器学习库来实现和训练模型。超参数调整、正则化策略和交叉验证用于在验证数据集上优化性能,同时减轻过拟合。在整个过程中,通常会使用实验跟踪工具,如 MLflow 和 Weights & Biases,来记录配置设置、评估结果和模型工件。

一旦候选模型表现出可接受的性能,它将通过在保留数据集上进行测试进行验证。除了聚合性能指标外,数据科学家还会进行错误分析,以识别可能影响模型可靠性和公平性的失败模式、异常值或偏差。这些见解通常促使对数据处理、特征工程或模型精炼进行迭代。

数据科学家还参与部署后的监控和重新训练工作流程。他们协助分析数据漂移,解释模型性能的变化,并整合新数据以保持预测精度。与机器学习工程师合作,他们定义重新训练策略并评估更新模型对运营指标的影响。

例如,在零售预测场景中,数据科学家可能会使用 TensorFlow 开发一个序列模型,根据历史销售、产品属性和季节性指标来预测产品需求。该模型使用保留数据的均方根误差(RMSE)进行评估,通过超参数调整进行精炼,然后转交给机器学习工程师进行部署。部署后,数据科学家继续监控模型精度,并使用新的交易数据指导重新训练。

通过实验和模型开发,数据科学家为机器学习系统的核心分析功能做出了贡献。他们的工作将原始数据转化为预测洞察,并通过评估和精炼支持部署模型的持续改进。

为了在一个实际情境中说明这些职责,列表 13.2 展示了使用 TensorFlow 构建的序列模型的简化示例。此模型旨在根据历史销售模式和其它输入特征预测产品需求。

列表 13.2:序列模型:序列模型架构可以根据历史销售模式和其它特征预测未来的产品需求,通过此示例突出了时间序列数据在预测建模中的重要性。

# TensorFlow model for demand forecasting
import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential(
    [
        layers.Input(shape=(30, 5)),
        # 30 time steps, 5 features
        layers.LSTM(64),
        layers.Dense(1),
    ]
)

model.compile(optimizer="adam", loss="mse", metrics=["mae"])

# Assume X_train, y_train are preloaded
model.fit(X_train, y_train, validation_split=0.2, epochs=10)

# Save model for handoff
model.save("models/demand_forecast_v1")

机器学习工程师

机器学习工程师负责将实验模型转化为可靠、可扩展的系统,这些系统可以集成到现实世界的应用中。位于数据科学和软件工程的交汇点,ML 工程师确保在研究环境中开发的模型可以在生产基础设施中部署、监控和维护。他们的工作弥合了原型设计和实际应用之间的差距,使机器学习能够在实践中持续产生价值。

ML 工程师的核心责任之一是将训练好的模型封装在模块化、可维护的组件中。这通常涉及重构代码以提高鲁棒性、实现模型接口和构建应用程序编程接口(API),以便将模型预测暴露给下游系统。Flask 和 FastAPI 等框架通常用于构建轻量级的 RESTful 服务以进行模型推理。为了支持可移植性和环境一致性,模型及其依赖项通常使用 Docker 容器化,并在 Kubernetes 等编排系统中进行管理。

ML 工程师还负责将模型集成到持续管道中,并实施生产操作部分中讨论的部署和托管基础设施。这些管道自动化模型的重新训练、测试和部署,确保更新后的模型在投入生产前经过性能基准的验证。如前所述的金丝雀测试策略、A/B 测试和分阶段推出允许逐步过渡并降低回归风险。在模型退化的情况下,使用回滚程序恢复先前验证的版本。

运营效率是另一个关键关注领域。ML 工程师应用一系列优化技术,包括模型量化、剪枝和批量服务,以满足延迟、吞吐量和成本限制。在支持多个模型的系统中,他们可能实施动态模型选择或并发服务的机制。这些优化与基础设施配置紧密耦合,通常包括 GPU 或其他专用加速器的配置。

部署后,ML 工程师在监控模型行为方面发挥着关键作用。他们配置遥测系统 40 以跟踪延迟、失败率和资源使用情况,并使用日志记录和警报机制对预测管道进行仪表化。

与数据科学家和 DevOps 工程师合作,他们响应系统行为的改变,触发重新训练工作流程,并确保模型持续满足服务级别目标。

例如,考虑一个金融服务应用程序,其中数据科学团队使用 TensorFlow 开发了一个欺诈检测模型。ML 工程师使用 TensorFlow Serving 打包模型以进行部署,配置 REST API 以与交易管道集成,并在 Jenkins 中设置 CI/CD 管道来自动化更新。他们使用 Prometheus 和 Grafana 实现日志记录和监控,并配置回滚逻辑,以便在性能下降时回滚到先前的模型版本。这个生产基础设施使得模型能够在真实世界的工作负载下持续且可靠地运行。

通过关注软件健壮性、部署自动化和运营监控,ML 工程师在将机器学习模型从实验性工件转变为生产系统可信赖组件的过程中发挥着关键作用。这些职责因组织规模而异:在初创公司,ML 工程师通常从数据管道开发到模型部署覆盖整个技术栈,而在像 Meta 或 Google 这样的大型科技公司,他们通常在特定领域如服务基础设施或特征工程方面进行专业化。中等规模的公司通常让 ML 工程师负责特定模型领域(例如,推荐系统)的端到端责任,平衡广度和专业化。为了在实践环境中说明这些职责,列表 13.3 展示了使用 FastAPI 构建的用于服务训练好的 TensorFlow 模型的 REST API 的最小示例。此服务公开模型预测,供下游应用程序使用。

列表 13.3:FastAPI 服务:将 TensorFlow 模型包装起来以提供实时需求预测,展示了 ML 工程师如何将模型集成到生产系统中。

# FastAPI service to serve a trained TensorFlow model
from fastapi import FastAPI, Request
import tensorflow as tf
import numpy as np

app = FastAPI()
model = tf.keras.models.load_model("models/demand_forecast_v1")


@app.post("/predict")
async def predict(request: Request):
    data = await request.json()
    input_array = np.array(data["input"]).reshape(1, 30, 5)
    prediction = model.predict(input_array)
    return {"prediction": float(prediction[0][0])}

DevOps 工程师

DevOps 工程师负责提供、管理和自动化支持机器学习系统开发、部署和监控的基础设施。这一角色起源于更广泛的软件工程学科,在 MLOps 中,DevOps 工程师的职责扩展到适应数据驱动和模型驱动的特定工作流程的需求。他们在云计算、自动化管道和基础设施即代码(IaC)方面的专业知识使得机器学习操作可扩展且可靠。

DevOps 工程师的中心任务是配置和编排整个机器学习生命周期中使用的计算基础设施。这包括使用 Terraform、AWS CloudFormation 或 Ansible 等 IaC 工具提供虚拟机、存储系统和 GPU、TPU 等加速器。基础设施通常使用 Docker 容器化,并通过 Kubernetes 等编排平台进行管理,这些平台允许团队在分布式环境中部署、扩展和监控工作负载。

DevOps 工程师设计和实施针对机器学习工作流程的 CI/CD 管道。这些管道自动化模型的重训练、测试和部署,以响应代码更改或数据更新。Jenkins、GitHub Actions 或 GitLab CI 等工具用于触发模型工作流程,而 MLflow 和 Kubeflow 等平台则促进实验跟踪、模型注册和工件版本控制。通过将部署逻辑编码化,这些管道减少了人工工作量,增加了可重复性,并使迭代周期更快。

监控是另一个关键责任领域。DevOps 工程师配置遥测系统以收集与模型和基础设施性能相关的指标。Prometheus、Grafana 和 ELK 堆栈(Elasticsearch、Logstash、Kibana)等工具被广泛用于构建仪表板、设置阈值和生成警报。

这些系统允许团队检测延迟、吞吐量、资源利用或预测行为的异常,并主动应对出现的问题。

为了确保合规性和操作纪律,DevOps 工程师还实施了治理机制,以强制执行一致性和可追溯性。这包括基础设施配置的版本控制、部署工件的自动化验证以及模型更新的审计。与 ML 工程师和数据科学家合作,他们使模型部署可重复且可审计,符合组织和管理要求。

例如,在金融服务应用中,DevOps 工程师可能在 AWS 上配置 Kubernetes 集群以支持模型训练和在线推理。使用 Terraform,基础设施被定义为代码,并与应用程序仓库一起进行版本控制。Jenkins 用于自动化部署在 MLflow 中注册的模型,而 Prometheus 和 Grafana 提供 API 延迟、资源使用和容器健康状况的实时监控。

通过抽象和自动化支撑 ML 工作流程的基础设施,DevOps 工程师实现了可扩展的实验、稳健的部署和持续的监控。他们的角色确保机器学习系统可以在生产约束下可靠运行,最小化人工干预并最大化操作效率。为了说明这些责任在实际环境中的应用,列表 13.4 展示了使用 Terraform 在 Google Cloud Platform 上为模型训练和推理工作负载配置启用 GPU 的虚拟机的示例。

列表 13.4:启用 GPU 的基础设施:此配置通过利用 Google 云平台上的特定机器类型和 GPU 加速器,确保模型训练和推理的高效性。

# Terraform configuration for a GCP instance with GPU support
resource "google_compute_instance" "ml_node" {
  name         = "ml-gpu-node"
  machine_type = "n1-standard-8"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  guest_accelerator {
    type  = "nvidia-tesla-t4"
    count = 1
  }

  metadata_startup_script = <<-EOF
    sudo apt-get update
    sudo apt-get install -y docker.io
    sudo docker run --gpus all -p 8501:8501 tensorflow/serving
  EOF

  tags = ["ml-serving"]
}

项目经理

项目经理在协调交付机器学习系统所涉及的活动、资源和时间表方面发挥着关键作用。虽然他们通常不开发模型或编写代码,但项目经理对于协调跨学科团队、跟踪进度以实现目标以及确保 MLOps 项目按时按范围完成至关重要。他们的工作使得数据科学家、工程师、产品利益相关者和基础设施团队能够有效协作,将业务目标转化为可执行的技术计划。

在项目开始时,项目经理与组织利益相关者合作,定义目标、成功指标和限制条件。这包括阐明机器学习系统的业务目标、确定关键可交付成果、估计时间表和设定性能基准。这些定义构成了项目生命周期中资源分配、任务规划和风险评估的基础。

一旦项目启动,项目经理负责制定和维护详细的执行计划。该计划概述了工作的主要阶段,例如数据收集、模型开发、基础设施配置、部署和监控。识别并管理任务之间的依赖关系,以确保角色之间的顺利交接,同时使用里程碑和检查点来评估进度并必要时调整计划。

在执行过程中,项目经理促进团队间的协调。这包括组织会议、跟踪可交付成果、解决障碍并在必要时升级问题。维护文档、进度报告和状态更新,以在整个组织中提供可见性并确保所有利益相关者了解项目进展。沟通是该角色的核心功能,有助于减少技术贡献者和商业决策者之间的不一致,并明确期望。

除了管理时间表和协调外,项目经理还监督 MLOps 项目的预算和资源配置方面。这可能涉及评估云基础设施成本、协商计算资源访问以及确保适当的人员分配到项目的每个阶段。通过保持对技术和组织考量的可见性,项目经理帮助将技术执行与战略优先事项对齐。

例如,考虑一家公司试图使用预测模型来减少客户流失。项目经理与数据工程师协调以定义数据需求,与数据科学家原型化和评估模型,与 ML 工程师打包和部署最终模型,并与 DevOps 工程师提供必要的基础设施和监控工具。项目经理通过数据管道准备就绪、基线模型评估、部署到预生产和部署后监控等阶段跟踪进度,根据需要调整项目计划以应对新兴的挑战。

通过协调不同角色之间的协作并管理机器学习项目固有的复杂性,项目经理使 MLOps 团队能够交付既在技术上稳健又与组织目标一致的系统。他们的贡献确保机器学习的实施不仅可行,而且可重复、可问责和高效。为了在实践环境中说明这些职责,列表 13.5 展示了使用 JSON 的简化项目里程碑跟踪结构示例。这种格式通常用于与 JIRA 或项目仪表板等工具集成,以监控机器学习项目的进度。

列表 13.5:里程碑跟踪结构:此 JSON 格式组织项目阶段,如数据准备和模型部署,突出机器学习项目的进度和风险管理。

{
    "project": "Churn Prediction",
    "milestones": [
        {
            "name": "Data Pipeline Ready",
            "due": "2025-05-01",
            "status": "Complete",
        },
        {
            "name": "Model Baseline",
            "due": "2025-05-10",
            "status": "In Progress",
        },
        {
            "name": "Staging Deployment",
            "due": "2025-05-15",
            "status": "Pending",
        },
        {
            "name": "Production Launch",
            "due": "2025-05-25",
            "status": "Pending",
        },
    ],
    "risks": [
        {
            "issue": "Delayed cloud quota",
            "mitigation": "Request early from infra team",
        }
    ],
}

负责人工智能领导

负责人工智能领导负责确保机器学习系统以透明、公平、可问责和符合伦理及监管标准的方式运行。随着机器学习越来越多地嵌入到社会影响领域,如医疗保健、金融和教育,系统治理的需求也在增长。这一角色反映了日益增长的共识,即仅技术性能是不够的;ML 系统还必须与更广泛的社会价值观相一致。

在模型开发阶段,负责人工智能领导支持增强可解释性和透明度的实践。他们与数据科学家和 ML 工程师合作,评估哪些特征对模型预测贡献最大,评估是否某些群体受到不成比例的影响,并通过结构化报告机制记录模型行为。通常与这一角色合作审查事后解释方法,如归因技术,以支持下游问责。

另一个关键责任是公平性评估。这涉及与利益相关者合作定义公平性标准,审计模型输出在人口统计学群体间的性能差异,并指导干预措施,包括重新加权、重新标记或约束优化,以减轻潜在的危害。这些评估通常纳入模型验证流程中,以确保在部署前系统性地执行。

在部署后环境中,负责任的人工智能负责人帮助监控系统漂移、偏差放大和未预见的异常行为。他们还可能监督创建文档工件,如模型卡片或数据集数据表,这些工件作为透明度和可重复性的工具。在受监管的行业中,这一角色与法律和合规团队合作,以满足审计要求并确保部署的模型与外部要求保持一致。

例如,在一个招聘推荐系统中,负责任的人工智能负责人可能监督一个审计,比较模型结果在性别和种族方面的差异,指导团队调整训练流程以减少差异同时保持预测准确性。他们还确保决策理由被记录并可供技术和非技术利益相关者审查。

将道德审查和治理纳入机器学习开发过程,使负责任的人工智能负责人能够支持既技术稳健又负责任、机构问责的系统。为了在实践环境中说明这些责任,列表 13.6 展示了使用 Aequitas 库审计基于群体差异的模型的一个示例。此示例评估人口统计学群体之间的统计平衡,以评估部署前的潜在公平性问题。

列表 13.6:公平性审计:使用 aequitas 评估模型结果,以识别性别差异,确保负责任的人工智能系统。

# Fairness audit using Aequitas
from aequitas.group import Group
from aequitas.bias import Bias

# Assume df includes model scores, true labels,
# and a 'gender' attribute
g = Group().get_crosstabs(df)
b = Bias().get_disparity_predefined_groups(
    g,
    original_df=df,
    ref_groups_dict={"gender": "male"},
    alpha=0.05,
    mask_significant=True,
)

print(
    b[
        [
            "attribute_name",
            "attribute_value",
            "disparity",
            "statistical_parity",
        ]
    ]
)

安全与隐私工程师

安全与隐私工程师负责保护机器学习系统免受对抗性威胁和隐私风险。随着机器学习系统越来越多地依赖于敏感数据,并在高风险环境中部署,安全和隐私成为系统可靠性的基本维度。这一角色结合了传统安全工程和机器学习特定威胁模型的专业知识,确保系统对攻击具有弹性,并符合数据保护要求。

在数据层面,安全与隐私工程师帮助实施访问控制、加密以及训练和推理数据的妥善处理。他们与数据工程师合作,应用隐私保护技术,如数据匿名化、安全聚合或差分隐私,特别是在使用敏感的个人或专有数据时。这些机制旨在降低数据泄露的风险,同时保留模型训练所需的效用。

在建模阶段,此角色建议采用提高对抗性操作鲁棒性的技术。这可能包括在训练期间检测投毒攻击、减轻模型反演或成员推理风险,以及评估模型对对抗性示例的敏感性。他们还协助设计平衡性能与安全约束的模型架构和训练策略。

在部署期间,安全与隐私工程师实施控制措施以保护模型本身,包括端点加固、API 速率限制和访问日志记录。在模型对外公开的环境中,包括面向公众的 API,他们还可能部署监控系统,以检测异常访问模式或基于查询的攻击,这些攻击旨在提取模型参数或训练数据。

例如,在一个基于患者数据的医疗诊断系统中,安全与隐私工程师可能在模型训练期间实施差分隐私,并在模型的推理接口上强制执行严格的数据访问控制。他们还会验证模型解释不会无意中泄露敏感信息,并监控部署后的活动以防止潜在的滥用。

通过主动设计和持续监督,安全与隐私工程师确保机器学习系统维护机密性、完整性和可用性。他们的工作在信任、合规性和风险缓解是系统部署和长期运营核心的领域尤为重要。为了在实践环境中说明这些责任,列表 13.7 展示了使用 TensorFlow Privacy 的差分隐私技术训练模型的一个示例。这种方法有助于保护训练数据中的敏感信息,同时保留模型效用。

列表 13.7:差分隐私训练:使用 TensorFlow Privacy 中的差分隐私技术训练机器学习模型,通过此代码片段确保敏感数据保护的同时保持预测性能。来源:TensorFlow Privacy 文档

# Training a differentially private model with
# TensorFlow Privacy
import tensorflow as tf
from tensorflow_privacy.privacy.optimizers.dp_optimizer_keras import (
    DPKerasAdamOptimizer,
)

# Define a simple model
model = tf.keras.Sequential(
    [
        tf.keras.layers.Dense(
            64, activation="relu", input_shape=(100,)
        ),
        tf.keras.layers.Dense(10, activation="softmax"),
    ]
)

# Use a DP-aware optimizer
optimizer = DPKerasAdamOptimizer(
    l2_norm_clip=1.0,
    noise_multiplier=1.1,
    num_microbatches=256,
    learning_rate=0.001,
)

model.compile(
    optimizer=optimizer,
    loss="categorical_crossentropy",
    metrics=["accuracy"],
)

# Train model on privatized dataset
model.fit(train_data, train_labels, epochs=10, batch_size=256)

交汇点和交接

尽管 MLOps 中的每个角色都有独特的责任,但机器学习系统的成功部署和运行依赖于跨职能边界的无缝协作。机器学习工作流程本质上是相互依赖的,关键交接点连接着数据采集、模型开发、系统集成和运营监控。理解这些交叉点对于设计既高效又具有弹性的流程至关重要。

最早且最关键的交叉点之一发生在数据工程师和数据科学家之间。数据工程师构建和维护摄取和转换原始数据的管道,而数据科学家依赖这些管道来访问用于分析和建模的干净、结构化和良好记录的数据集。在此阶段的不一致,包括未记录的模式更改或不一致的特征定义,可能导致下游错误,损害模型质量或可重复性。

一旦模型开发完成,将模型交付给机器学习工程师需要从研究工件到生产就绪组件的谨慎过渡。机器学习工程师必须理解模型的假设和要求,以实现适当的接口,优化运行时性能,并将其集成到更广泛的应用生态系统中。这一步骤通常需要迭代,尤其是在实验环境中开发的模型必须适应生产中的延迟、吞吐量或资源限制时。

当模型向部署迈进时,DevOps 工程师在提供基础设施、管理 CI/CD 管道和配置监控系统方面发挥作用。他们与机器学习工程师的合作确保模型部署是自动化的、可重复的且可观察的。他们还与数据科学家协调,定义警报和阈值,以指导性能监控和再训练决策。

项目经理在这些技术领域之间提供组织上的粘合剂。他们确保交接是预期的,角色定义明确,依赖关系得到积极管理。特别是,项目经理通过记录假设、跟踪里程碑准备情况和促进团队间的沟通来帮助保持连续性。这种协调减少了摩擦,并使敏捷且负责任的迭代开发周期成为可能。

例如,在一个实时推荐系统中,数据工程师维护数据摄取管道和特征存储,数据科学家使用历史点击流数据迭代模型架构,机器学习工程师将模型作为容器化的微服务 42 部署,DevOps 工程师监控推理延迟和可用性。

每个角色都对堆栈的不同层做出贡献,但整体功能取决于生命周期每个阶段之间可靠的过渡。这些角色之间的交互表明,MLOps 不仅仅是离散任务的集合,而是一个持续、协作的过程(图 13.9)。为了确保机器学习系统可以随着时间的推移而演变、扩展并可靠地运行,设计清晰的手续、共享工具和明确定义接口是至关重要的。

图片

图 13.9:MLOps 角色交接工作流程:机器学习工作流程需要在专业角色之间进行系统性的交接,每个角色产生特定的工件,这些工件成为下游活动的输入。关键交接点(H1-H3)代表协调时刻,此时清晰的接口、共享理解和文档化的需求对于系统可靠性至关重要。反馈循环使基于生产性能数据的持续改进成为可能。

角色和专业化的发展

随着机器学习系统的成熟和组织在更大规模上采用 MLOps 实践,角色的结构和专业化往往也会演变。在早期环境阶段,个人贡献者可能承担多个职责,例如数据科学家同时构建数据管道或管理模型部署。然而,随着系统复杂性的增长和团队的扩大,职责往往变得更加分化,从而产生了新的角色和更结构化的组织模式。

一种新兴趋势是成立专门的机器学习平台团队,这些团队专注于构建共享的基础设施和工具,以支持多个项目之间的实验、部署和监控。这些团队通常将常见的工作流程,包括数据版本控制、模型训练编排和持续集成/持续部署(CI/CD)集成,抽象为可重用组件或内部平台。这种方法减少了工作重复,并通过使应用团队能够专注于特定领域的问题而不是底层系统工程来加速开发。

同时,混合角色已经出现,以弥合传统边界之间的差距。例如,全栈机器学习工程师结合建模、软件工程和基础设施的专长,负责机器学习模型的端到端部署。同样,机器学习赋能角色,包括 MLOps 工程师和应用机器学习专家,专注于帮助团队采用最佳实践、集成工具和高效扩展工作流程。这些角色在拥有多样化团队且在机器学习成熟度或技术专业化方面存在差异的组织中尤其有价值。

MLOps 团队的结构也因组织规模、行业和监管要求而异。在较小的组织或初创公司中,团队通常规模较小且跨职能,具有紧密的协作和非正式流程。相比之下,大型企业可能会正式化角色并引入治理框架来管理合规性、数据安全和模型风险。高度监管的行业,如金融、医疗保健和防御,通常需要额外的角色专注于验证、审计和文档,以满足外部报告义务。

如表 13.5 所示,角色之间的界限并不严格。有效的 MLOps 实践依赖于共享的理解、文档和工具,这些工具促进了团队间的沟通和协调。鼓励跨学科流畅性,包括使数据科学家能够理解部署工作流程,以及使 DevOps 工程师能够解释模型监控指标,从而增强组织的敏捷性和弹性。

表 13.5:角色演变:随着系统的成熟,MLOps 角色越来越专业化,需要数据工程师、数据科学家和机器学习工程师之间的跨职能协作,以解决数据准备、模型构建和部署挑战。扩展的责任,如特征存储管理和模型验证,反映了对强大、道德和可扩展机器学习基础设施日益增长的需求。

角色 关键交叉点 演变模式和专业化
数据工程师 与数据科学家合作定义特征和管道 扩展到实时数据系统和特征存储平台
数据科学家 依赖于数据工程师提供干净的数据输入;与机器学习工程师协作 承担模型验证、可解释性和伦理考量
机器学习工程师 从数据科学家那里接收模型;与 DevOps 合作部署和监控 转变为平台工程或全栈机器学习角色
DevOps 工程师 为机器学习工程师提供基础设施、CI/CD 和可观察性支持 发展为 MLOps 平台角色;整合治理和安全工具
项目经理 协调所有角色;跟踪进度和沟通 随着系统规模扩大而专业化为机器学习产品管理
负责任的人工智能负责人 与数据科学家和项目经理合作评估公平性和合规性 角色在系统面临监管审查或公众曝光时出现
安全与隐私 与 DevOps 和机器学习工程师合作 角色正式化为隐私法规
工程师 确保数据管道和模型接口的安全 (例如,GDPR、HIPAA)适用于机器学习工作流程

随着机器学习在现代软件系统中的地位日益重要,角色将继续适应新兴的工具、方法和系统架构。认识到这些责任的动态性,团队可以有效地分配资源,设计可适应的工作流程,并促进对于生产规模机器学习持续成功至关重要的协作。

上文所述的专门角色和跨职能协作模式并非孤立出现。它们与机器学习系统本身的技术和组织成熟度同步发展。理解角色、基础设施和运营实践之间的这种协同进化,对于设计可持续的 MLOps 实施提供了基本背景。

系统设计和成熟度框架

在建立早期的基础设施组件、生产运营和组织角色之后,我们现在探讨这些元素如何整合成连贯的运营系统。机器学习系统并非孤立运作。它们的有效性不仅取决于底层模型的质量,还取决于支持它们的组织和技术流程的成熟度。本节探讨了运营成熟度如何塑造系统架构,并为设计解决章节开头确定的运营挑战的 MLOps 实施提供框架。运营成熟度指的是机器学习工作流程自动化的程度、可重复性、监控程度以及与更广泛的工程和治理实践的协调一致。虽然早期工作可能依赖于临时脚本和手动干预,但生产规模系统需要支持长期可持续性、可靠性和适应性的有意设计选择。本节探讨了不同层次的运营成熟度如何影响系统架构、基础设施设计和组织结构,提供了一个解读更广泛的 MLOps 景观的视角(Paleyes, Urma, and Lawrence 2022b)。

运营成熟度

机器学习的运营成熟度指的是一个组织可靠地以可重复和可扩展的方式开发、部署和管理机器学习系统的程度。与单个模型或算法的成熟度不同,运营成熟度反映了系统能力:一个团队或组织将基础设施、自动化、监控、治理和协作整合到机器学习生命周期中的程度。

低成熟度环境通常依赖于手动工作流程、松散耦合的组件和临时实验。虽然对于早期研究或低风险应用来说足够,但这类系统往往脆弱、难以复制,并且对数据或代码变更高度敏感。随着机器学习系统规模的扩大,这些限制很快成为持续性能、信任和问责制的障碍。

相比之下,高成熟度环境实施模块化、版本化和自动化的工作流程,允许模型以受控和可观察的方式开发、验证和部署。数据血缘在转换过程中得到保留;模型行为持续监控和评估;基础设施以代码形式提供和管理。这些实践减少了操作摩擦,使迭代更快,并支持生产中的稳健决策(A. Chen 等人 2020)。

操作成熟度不仅仅是工具采用的功能。虽然 CI/CD 管道、模型注册表和可观察性堆栈等技术发挥作用,但成熟度集中在系统集成和协调上:数据工程师、数据科学家和运维团队如何通过共享接口、标准化工作流程和自动化交接进行协作。正是这种集成将成熟的机器学习系统与松散连接的工件集合区分开来。

成熟度级别

虽然操作成熟度存在于连续体上,但区分反映机器学习系统如何从研究原型发展到生产级基础设施的广泛阶段是有用的。这些阶段不是严格的类别,而是表明组织逐渐采用支持可靠性、可扩展性和可观察性的实践。

在最低成熟度级别,机器学习工作流程是临时的:实验是手动运行的,模型在本地机器上训练,部署涉及手工脚本或手动干预。数据管道可能脆弱或未记录,难以追踪已部署模型的产生过程。这些环境可能足以进行原型设计,但它们不适合持续维护或协作。

随着成熟度的提高,工作流程变得更加结构化和可重复。团队开始采用版本控制、自动训练管道和集中式模型存储。引入了监控和测试框架,重新训练工作流程变得更加系统化。处于这一级别的系统可以支持有限的规模和迭代,但仍严重依赖人工协调。

在最高成熟度级别,机器学习系统与基础设施即代码、持续交付管道和自动化监控完全集成。数据血缘、特征重用和模型验证编码到开发过程中。治理嵌入到整个系统中,允许可追溯性、审计和政策执行。这些环境支持大规模部署、快速实验和对变化的数据和系统条件的适应。

这种进展,总结在表 13.6 中,为分析机器学习操作实践提供了一个系统级框架。它强调架构的凝聚力和生命周期集成,而不是工具的选择,指导设计可扩展和可维护的学习系统。

成熟度级别 系统特性 典型结果
临时 手动数据处理、本地训练、无版本控制、不明确的归属 工作流程脆弱,难以重现或调试
可重复 自动化训练管道、基本的 CI/CD、集中式模型存储、一些监控 提高可重复性,有限的扩展性
可扩展 完全自动化的工作流程、集成可观察性、基础设施即代码、治理 高可靠性、快速迭代、生产级机器学习

这些成熟度级别提供了一个系统视角来评估机器学习操作,不是基于采用的具体工具,而是基于系统如何可靠和一致地支持整个机器学习生命周期。理解这一进展使从业者能够识别设计瓶颈并优先考虑支持长期系统可持续性的投资。

表 13.6:成熟度进展:机器学习操作实践从手动、脆弱的工作流程发展到完全集成、自动化的系统,影响可重复性和扩展性。本表概述了不同成熟度级别的关键特性和结果,强调构建可维护学习系统的架构一致性和生命周期集成。

成熟度级别 系统特性 典型结果
临时 手动数据处理、本地训练、无版本控制、不明确的归属 工作流程脆弱,难以重现或调试
可重复 自动化训练管道、基本的 CI/CD、集中式模型存储、一些监控 提高可重复性,有限的扩展性
可扩展 完全自动化的工作流程、集成可观察性、基础设施即代码、治理 高可靠性、快速迭代、生产级机器学习

系统设计影响

随着机器学习操作的成熟,底层系统架构随之演变。运营成熟度不仅是一个组织问题;它对 ML 系统的结构、部署和维护有直接影响。每个成熟度级别都引入了关于模块化、自动化、监控和容错的新期望,从技术和程序方面塑造了设计空间。

在低成熟度环境中,ML 系统通常围绕单体脚本和紧密耦合的组件构建。数据处理逻辑可能直接嵌入到模型代码中,配置管理是非正式的。这些架构虽然便于快速实验,但缺乏维护性、版本控制或安全迭代所需的问题分离。因此,团队经常遇到回归、静默失败和跨环境性能不一致的问题。

随着成熟度的提高,模块化抽象开始出现。特征工程与模型逻辑解耦,管道以声明性方式定义,系统边界通过 API 和编排框架强制执行。这些变化支持可重复性,并使团队能够在多个贡献者或应用程序之间扩展开发。通过配置文件,基础设施变得可编程,模型工件通过标准化的部署阶段进行推广。这种架构纪律使系统能够可预测地演变,即使需求或数据分布发生变化。

在高成熟度水平上,机器学习系统表现出在生产级软件系统中常见的属性:无状态服务、合同驱动接口、环境隔离和可观察执行。特征存储、模型注册和基础设施即代码等设计模式成为基础。关键的是,系统行为不是从静态假设中推断出来的,而是实时监控并根据需要调整。这使反馈驱动开发成为可能,并支持数据、模型和基础设施共同演变的闭环系统。

在每种情况下,运营成熟度都不是外部约束,而是一种架构力量:它决定了如何管理复杂性,如何吸收变化,以及系统如何在服务正常运行时间的威胁面前进行扩展(参见图 13.10)。忽视这些约束的设计决策可能在理想条件下运行,但在现实世界的压力下,如延迟要求、漂移、故障或监管审计下可能会失败。理解成熟度与设计之间的关系对于构建能够持续性能的弹性机器学习系统至关重要。

图片

图 13.10:正常运行时间依赖栈:稳健的机器学习服务正常运行时间依赖于从基础设施到模型性能的分层互依组件,反映了现代软件系统的复杂性。运营成熟度要求观察整个栈,以主动解决潜在故障并在各种条件下维持服务水平。

设计模式和反模式

参与构建和维护机器学习系统的团队结构在决定运营结果方面发挥着重要作用。随着机器学习系统在复杂性和规模上的增长,组织模式必须演变以反映数据、建模、基础设施和治理之间的相互依赖性。虽然没有单一的理想结构,但某些模式始终支持运营成熟度,而其他模式则往往阻碍其发展。

在成熟的环境中,组织设计强调明确的职责归属、跨职能协作以及角色间的接口纪律。例如,平台团队可能负责共享的基础设施、工具和 CI/CD 管道,而领域团队则专注于模型开发和业务对齐。这种关注点的分离促进了重用、标准化和并行开发。团队间的接口,包括功能定义、数据模式和部署目标,都得到了良好的定义和版本控制,减少了摩擦和歧义。

一种有效的模式是创建一个中央 MLOps 团队,为多个模型开发小组提供共享服务。这个团队维护模型训练、验证、部署和监控的工具,并可能作为内部平台提供商运营。这样的结构促进了一致性,减少了重复工作,并加速了新项目的入职。另一些组织采用联邦模型,将 MLOps 工程师嵌入到产品团队中,同时保持一个中央架构功能来指导系统级集成。

相反,当职责分散或对齐不佳时,反模式往往会出现。一种常见的失败模式是“工具优先”的方法,其中团队在未首先定义应规范其使用的流程和角色的情况下就采用基础设施或自动化工具。这可能导致脆弱的管道、不明确的交接和重复的工作。另一种反模式是孤岛式实验,数据科学家在生产工程师的隔离下工作,导致难以部署、监控或有效重新训练的模型。

组织漂移是另一个微妙挑战。随着团队规模的扩大,未记录的工作流程和非正式协议可能变得根深蒂固,增加了协调成本并降低了透明度。没有故意的系统设计和流程审查,甚至之前功能性的结构也可能积累技术和组织债务。

最终,组织成熟度必须与系统复杂性协同进化。团队必须建立沟通模式、角色定义和问责结构,以加强模块化、自动化和可观察性的原则。机器学习的运营卓越不仅仅是技术能力的问题;它是跨越人类和计算边界的协调、有意系统思维的结果。

上述组织模式必须由能够处理机器学习系统独特可靠性挑战的技术架构支持。MLOps 从分布式系统继承了众多可靠性挑战,但通过学习组件增加了独特的复杂性。传统的可靠性模式需要适应,以考虑到机器学习系统的概率性质和学习组件的动态行为。

断路器模式必须考虑到模型特定的故障模式,其中预测精度下降需要与服务可用性故障不同的阈值。当需要隔离实验性模型版本与生产流量时,舱壁模式变得至关重要,需要资源分区策略,以防止一个模型资源耗尽影响其他模型。在 MLOps 环境中,拜占庭容错问题具有新的特征,其中“拜占庭”行为包括模型产生看似合理但错误的输出,而不是明显的故障。

传统的共识算法侧重于正确节点之间的共识,但 ML 系统在真实情况可能延迟或不可用的情况下,需要关于模型正确性的共识。这需要概率性共识协议,在不确定性下运行,使用分布式机器学习技术来聚合模型决策,同时考虑到潜在的模型漂移或对抗性输入。这些可靠性模式构成了区分稳健 MLOps 实现和脆弱实现的操作实践的理论基础。

将 MLOps 置于具体情境中

机器学习系统的运行成熟度不是一个抽象的理想;它是在具有物理、组织和监管约束的具体系统中实现的。虽然前几节概述了成熟的 MLOps 的最佳实践,包括持续集成/持续部署(CI/CD)、监控、基础设施提供和治理,但这些实践很少在原始、无约束的环境中部署。实际上,每个 ML 系统都在一个特定的环境中运行,这决定了 MLOps 工作流程的实施、优先级和适应性。

系统约束可能源于模型部署的物理环境,例如计算、内存或功率的限制。这些在边缘和嵌入式系统中很常见,在这些系统中,模型必须在严格的延迟和资源约束下运行。连接性限制,如间歇性网络访问或带宽限制,进一步复杂化了模型更新、监控和遥测收集。在高保证领域,包括医疗保健、金融和工业控制系统,治理、可追溯性和容错可能比吞吐量或延迟更重要。这些因素不仅影响系统性能;它们还改变了 MLOps 管道的设计和维护方式。

例如,在无法直接访问模型主机的情况下,标准的 CI/CD 流水线可能不可行。在这种情况下,团队必须实施替代的交付机制,如空中更新,这些机制考虑到可靠性、回滚能力和跨异构设备的兼容性。同样,假设能够全面了解运行时行为的监控实践可能需要通过间接信号、粗粒度遥测或设备异常检测来重新构想。即使是收集训练数据的简单任务也可能受到隐私问题、设备级存储限制或数据流动的法律限制的限制。

这些适应性调整不应被理解为成熟度的偏离,而应被视为在约束条件下的成熟表现。一个精心设计的机器学习系统会考虑到其运营环境的现实情况,并相应地调整其运营实践。这是 MLOps 中系统思维的精髓:在具体设计时应用一般原则。

当我们转向接下来的章节时,我们将遇到这些上下文因素中的几个,包括设备学习、隐私保护、安全性和鲁棒性以及可持续性。每个都不仅是一个技术挑战,而且是一个系统级约束,它重塑了大规模实践和维护机器学习的方式。因此,在上下文中理解 MLOps 不是可选的;它是构建在现实世界中可行、值得信赖和有效的机器学习系统的基础。

未来运营考虑因素

正如本章所示,机器学习系统的部署和维护不仅需要在模型层面保证技术正确性,还需要架构一致性、组织协调和运营成熟度。从临时实验到可扩展、可审计系统的转变反映了更广泛的转变:机器学习不再局限于研究环境;它已成为生产基础设施的核心组成部分。

理解机器学习系统的成熟度有助于明确可能出现的挑战以及解决这些挑战所需的投资形式。早期系统受益于流程纪律和模块化抽象;成熟系统需要自动化、治理和弹性。每个阶段的设计选择都会影响实验的速度、部署模型的鲁棒性以及整合不断变化要求的能力:技术、组织和监管。

这种以系统为导向的 MLOps 视角也为本书的下一阶段奠定了基础。后续章节中考察的特定操作环境,包括边缘计算(第十四章)、对抗鲁棒性(第十六章)和隐私保护部署(第十五章),每个都需要对这里确立的基础 MLOps 原则进行调整。这些主题不仅代表了模型性能的扩展,而且代表了操作成熟度直接促进可行性、安全性和长期价值的领域。

因此,操作成熟度并不是机器学习系统生命周期的终点;它是构建生产级、负责任和自适应系统的基础。接下来的章节将探讨在特定领域约束下构建此类系统所需的内容,进一步扩大了在规模上工程化机器学习的含义。

企业级机器学习系统

在操作成熟度的最高水平,一些组织正在实施可以被称为 AI 工厂的东西。这些组织拥有专门计算基础设施,旨在以前所未有的规模管理整个 AI 生命周期。这些基础设施代表了之前讨论的可扩展成熟水平的逻辑延伸,其中完全自动化的工作流程、集成可观察性和基础设施即代码原则被应用于智能制造,而不是传统的软件交付。

当组织需要优化不仅仅是单个模型部署,而是支持多个并发模型、多样化推理模式和连续高量级操作的整个 AI 生产管道时,AI 工厂便应运而生。推动这一演变的计算需求包括训练后扩展,即针对特定应用对模型进行微调需要在推理阶段比初始训练阶段显著增加计算量,以及测试时扩展,即高级 AI 应用采用迭代推理,其计算资源消耗可能比传统推理模式高几个数量级。与为通用计算设计的传统数据中心不同,这些系统专门为 AI 工作负载而设计,强调推理性能、能源效率和大规模将原始数据转化为可操作智能的能力。

人工智能工厂的运营挑战扩展了我们讨论的原则。它们需要在异构工作负载之间进行复杂的资源分配,系统级可观察性以关联多个模型之间的性能,以及能够处理跨相互依赖的人工智能系统级联故障的容错机制。这些系统不仅仅是传统 MLOps 部署的扩展版本,而是一种管理人工智能基础设施的质的变化方法,这可能会影响该领域随着人工智能在组织战略和价值创造中日益成为核心而如何发展。

投资与投资回报率

虽然 MLOps 的运营效益很大,但实施成熟的 MLOps 实践需要组织在基础设施、工具和专门人员方面的重大投资。了解成本和预期回报有助于组织在 MLOps 采用和成熟度进展方面做出明智的决定。

构建成熟的 MLOps 平台通常代表企业级部署的多年、数百万美元的投资。组织必须在包括特征存储、模型注册、编排平台和监控系统在内的专用基础设施上进行投资。此外,他们还需要拥有跨数据工程、机器学习和 DevOps 的专业知识,这些角色在竞争激烈的市场中享有高薪。全面的 MLOps 基础设施的初始设置成本通常每年在 50 万美元到 500 万美元之间,具体取决于规模和复杂性的要求。

然而,当考虑到成熟的 MLOps 带来的运营改进时,投资回报率变得非常有吸引力。拥有成熟 MLOps 实践的组织报告称,将模型部署时间从几个月缩短到几天或几周,大大加快了以机器学习为驱动的产品和功能的上市时间。在生产环境中,模型故障率从约 80%的临时环境降低到成熟的 MLOps 实施中的不到 20%,减少了昂贵的调试周期并提高了系统可靠性。也许最重要的是,成熟的 MLOps 平台使组织能够同时管理数百或数千个模型,创造了规模经济,这证明了初始基础设施投资的合理性。

投资回报率的计算还必须考虑降低运营成本和提高团队生产力。自动化的重新训练管道消除了模型更新所需的手动工作,而标准化的部署流程减少了每个模型发布所需的专门知识。跨团队的特征重用防止了重复的工程工作,而系统性的监控减少了诊断性能问题所花费的时间。组织通常报告,在实施全面的 MLOps 平台后,数据科学团队的效率提高了 30-50%,因为团队可以专注于模型开发而不是运营问题。

投资时间表和考虑因素

第一年: 建立基础,包括基本的 CI/CD、监控和容器化(投资 1-2M) - 重点关注通过基本自动化防止最昂贵的故障 - 预期回报:降低故障率和加快调试周期

第二年-第三年: 平台成熟,具备自动化再训练、复杂监控和特征存储等高级功能(额外投资 2-3M) - 使扩展到数十个并发模型成为可能 - 预期回报:显著的生产力提升和部署速度改进

第三年及以上: 针对特定领域需求的优化和专业化(年维护费 500K-1M) - 平台支持数百个模型,仅需最小增量努力 - 预期回报:通过机器学习能力实现规模经济和竞争优势

MLOps 的战略价值不仅超越了运营效率,还使组织具备了没有系统化工程实践就无法实现的能力。成熟的 MLOps 平台支持快速实验、模型变体的受控 A/B 测试以及实时适应变化条件,这些能力可以提供比初始投资价值更高的竞争优势。组织应将 MLOps 不仅仅视为运营的必要性,而是作为使机器学习应用持续创新的基础设施。

在确立了从运营挑战到基础设施组件、生产操作、组织角色和成熟度模型的概念框架之后,我们现在考察这些元素在实际中的结合方式。以下案例研究展示了理论原则如何转化为具体实施选择,展示了 MLOps 概念的普遍适用性和特定领域的适应性。

案例研究

本章中考察的操作设计原则、技术债务模式以及成熟度框架,在现实世界的实施中汇聚在一起,展示了它们的实际重要性。这些案例研究明确说明了之前确定的操作挑战,从数据依赖债务到反馈循环,如何在生产系统中体现,以及基础设施组件、监控策略和跨职能角色如何协同工作以解决这些问题。

我们考察了两个代表不同部署环境的案例,每个案例都需要对标准 MLOps 实践进行特定领域的调整,同时保持自动化管道、跨职能协作和持续监控的核心原则。Oura Ring 案例研究展示了管道债务和配置管理挑战如何在资源受限的边缘环境中体现,其中传统的 MLOps 基础设施必须适应嵌入式系统。ClinAIOps 案例研究展示了反馈循环和治理要求如何推动医疗保健中的专业运营框架,其中人机协作和法规遵从重塑了标准 MLOps 实践。

通过这些案例,我们追踪了之前提出的理论框架与其实际应用之间的具体联系。每个例子都展示了组织如何在实施中间部分详细说明的基础设施和生产操作的同时,应对章节开头讨论的操作挑战。这些案例显示了角色专业化和运营成熟度如何直接影响系统设计选择和长期可持续性。

Oura Ring 案例研究

Oura Ring 代表了将 MLOps 实践应用于消费级可穿戴设备的引人入胜的例子,其中嵌入式机器学习必须在严格的资源限制下运行,同时提供准确的健康洞察。本案例研究展示了系统性的数据收集、模型开发和部署实践如何使嵌入式 ML 系统成功。我们考察了开发环境和动机、数据获取和预处理挑战、模型开发方法以及资源受限环境下的部署考虑。

环境与动机

Oura Ring 是一款消费级可穿戴设备,旨在通过嵌入式感应和计算监测睡眠、活动和生理恢复。通过测量运动、心率以及体温等信号,该设备估算睡眠阶段并向用户提供个性化反馈。与传统的基于云的系统不同,Oura Ring 的数据处理和推理大部分直接在设备上完成,使其成为生产中嵌入式机器学习的实际例子。

对于开发团队来说,核心目标是提高设备在分类睡眠阶段时的准确性,使其预测结果更接近通过多导睡眠图(PSG)43 获得的临床黄金标准。初步评估显示,Oura 戒指的预测与 PSG 得出的标签之间有 62%的相关性,而专家评分员之间观察到的是 82-83%的相关性。这种差异突出了初始模型的潜力和局限性,促使重新评估数据收集、预处理和模型开发工作流程。这个案例说明了稳健的 MLOps 实践的重要性,尤其是在嵌入式系统约束下操作时。

数据获取和预处理

为了克服初始模型的性能限制,Oura 团队专注于构建一个基于临床标准的稳健、多样化的数据集。他们设计了一项大规模睡眠研究,涉及来自亚洲、欧洲和北美洲的 106 名参与者,捕捉了年龄、性别和生活方式方面的广泛人口统计学差异。在研究期间,每位参与者都佩戴了 Oura 戒指,并同时进行多导睡眠图(PSG),这是睡眠分期临床上的黄金标准。这种配对使得能够创建一个高保真度标记的数据集,将可穿戴传感器数据与验证过的睡眠注释相匹配。

总共,该研究产生了 440 个晚上的数据,以及超过 3,400 小时的时间同步记录。这个数据集不仅捕捉了生理多样性,还包括了环境和行为因素的变化,这对于在现实世界用户群体中推广模型性能至关重要。

为了管理这个数据集的复杂性和规模,团队实施了自动化的数据管道,用于数据摄取、清洗和预处理。通过结构化的工作流程提取和验证了生理信号,包括心率、运动和体温。利用 Edge Impulse 平台 44,他们整合了来自多个来源的原始输入,解决了时间错位问题,并为下游模型开发结构化了数据。这些工作流程解决了之前识别出的数据依赖债务模式。通过实施稳健的版本控制和血缘跟踪,团队避免了通常困扰嵌入式 ML 系统的数据依赖不稳定问题。对管道自动化的结构化方法也减轻了管道债务,确保数据处理在系统扩展到不同的硬件配置和用户群体时保持可维护性。

模型开发和评估

在建立了高质量的、临床标注的数据集之后,Oura 团队进一步发展到开发和评估旨在分类睡眠阶段的机器学习模型。认识到可穿戴设备的操作限制,模型设计优先考虑效率、可解释性和预测准确性。而不是采用服务器规模部署中典型的复杂架构,团队选择了可以在戒指有限的内存和计算预算内运行的模型。

探索了两种模型配置。第一种仅使用加速度计数据,代表了一种轻量级架构,优化了最小能量消耗和低延迟推理。第二种模型包含了额外的生理输入,包括心率变异性体温,能够捕捉自主神经系统活动和昼夜节律,这些因素已知与睡眠阶段转换相关。

为了评估性能,团队应用了五折交叉验证 45 并将模型与金标准的 PSG 标注进行了基准测试。通过迭代调整超参数和细化输入特征,增强的模型实现了 79%的相关准确性,这比基线向临床基准的改进是显著的。

这些性能提升并非仅仅源于架构创新。相反,它们反映了 MLOps 方法更广泛的影响,该方法整合了数据收集、可复制的训练管道和纪律性的评估实践。对超参数和特征配置的精心管理展示了有效缓解配置债务的效果。通过维护结构化的文档和模型参数的版本控制,团队避免了经常破坏嵌入式 ML 部署的碎片化设置。这种方法需要数据科学家(设计模型架构的人)、ML 工程师(优化嵌入式约束的人)和 DevOps 工程师(管理部署管道的人)之间的紧密合作,这展示了之前讨论过的角色专业化的实际应用。

部署和迭代

在模型验证之后,Oura 团队过渡到将训练好的模型部署到戒指的嵌入式硬件上。在这种背景下,部署需要仔细适应对内存、计算和功率的严格限制。仅依赖加速度计输入的轻量级模型特别适合在设备上实时推理,以最低的能量消耗提供低延迟的预测。相比之下,更复杂的模型利用了额外的生理信号,包括心率变异性温度,这些信号被选择性地部署,在需要更高预测精度且系统资源允许的情况下。

为了促进可靠和可扩展的部署,团队开发了一个模块化工具链,用于将训练好的模型转换为适合嵌入式执行的优化格式。这个过程包括量化、剪枝等模型压缩技术,在保持准确性的同时减小了模型大小。模型与其预处理程序一起打包,并使用空中(OTA)46 更新机制进行部署,确保现场设备的一致性。

仪表系统被集成到部署管道中,以支持部署后的可观察性。

此阶段展示了嵌入式系统中 MLOps 的关键实践:资源感知模型打包、OTA 部署基础设施和持续性能监控。这强调了为适应性和迭代设计系统的重要性,确保机器学习模型在现实世界的操作条件下保持准确性和可靠性。

关键操作见解

Oura Ring 案例研究展示了之前识别出的操作挑战如何在边缘环境中体现,以及系统化工程实践如何解决这些问题。团队在构建具有组件之间清晰接口的模块化分层架构方面的成功,避免了“管道丛林”问题,并通过标准化部署模式实现了运行时在准确性和效率之间的权衡。从 62%到临床级准确性的转变,需要跨数据收集协议、模型架构和部署目标进行系统配置管理,以及结构化版本控制,这使可重复实验成为可能并防止了经常困扰嵌入式 ML 系统的碎片化设置。通过大规模睡眠研究和 PSG 地面真相,建立了稳定、验证的数据基础,通过投资于高质量的标注和标准化收集协议,团队避免了经常破坏可穿戴设备准确性的不稳定依赖。成功来自于数据工程师、ML 研究人员、嵌入式系统开发人员和运营人员之间的协调合作,这反映了管理复杂 ML 系统所需的组织成熟度,而不仅仅是单个技术组件。

此案例说明了 MLOps 原则如何适应特定领域的约束,同时保持核心工程严谨性。然而,当机器学习系统从消费设备扩展到临床应用时,会涌现出更大的操作复杂性,需要解决不仅包括技术挑战,还包括法规遵从性、患者安全和临床决策过程等框架。

ClinAIOps 案例研究

建立在 Oura Ring 嵌入式 MLOps 演示的基础上,医疗保健中机器学习系统的部署既是一个重大的机会,也是一个独特的挑战,它超越了资源限制。虽然传统的 MLOps 框架提供了管理模型开发、部署和监控的结构化实践,但它们在需要广泛人类监督、特定领域评估和伦理治理的领域往往不足。医疗健康监测,特别是通过连续治疗监测(CTM)47,就是这样一种领域,MLOps 必须演变以满足现实世界临床整合的需求。

CTM 利用可穿戴传感器和设备实时收集来自患者的丰富生理和行为数据。

然而,仅仅部署 ML 模型是不够实现这些好处的。AI 系统必须集成到临床工作流程中,符合监管要求,并设计为增强而不是取代人类决策。传统的 MLOps 范式,它侧重于自动化模型开发和服务的管道,没有充分考虑到医疗保健的复杂社会技术景观,在那里患者安全、临床医生判断和伦理约束必须优先考虑。医疗保健 AI 固有的隐私和安全考虑,包括数据保护、合规性和安全计算,在第十五章中进行了深入探讨。

本案例研究探讨了 ClinAIOps,这是一个为在临床环境中实施 AI 而提出的框架(E. Chen et al. 2023)。在 Oura Ring 案例展示了 MLOps 原则如何适应资源限制的情况下,ClinAIOps 展示了它们必须如何演变以解决监管和以人为本的要求。与传统的 MLOps 不同,ClinAIOps 直接解决了之前识别出的反馈循环挑战,通过将它们设计到系统架构中而不是将其视为技术债务来处理。该框架在患者、临床医生和 AI 系统之间的结构化协调代表了生产操作部分中讨论的治理和协作组件的实际实施。ClinAIOps 还展示了运营成熟度如何在专业领域演变——不仅需要技术复杂性,还需要特定领域的适应,以在解决监管和伦理约束的同时保持核心 MLOps 原则。

要理解为什么 ClinAIOps 代表了从传统 MLOps 向必要演变的步骤,我们必须首先检查标准操作实践在临床环境中的不足之处:

  • MLOps 主要关注模型的生命周期(例如,训练、部署、监控),而医疗保健需要协调各种不同的人类参与者,如患者、临床医生和护理团队。

  • 传统的 MLOps 强调自动化和系统可靠性,但临床决策取决于个性化护理、可解释性和共同问责制。

  • AI 驱动医疗保健的伦理、监管和安全影响需要超越技术监控的治理框架。

  • 临床验证不仅需要性能指标,还需要安全、有效性和与护理标准一致性的证据。

  • 健康数据极其敏感,系统必须遵守严格的隐私和安全法规,这是传统 MLOps 框架未能完全解决的问题。

鉴于这些差距,ClinAIOps 提出了一种替代方案:一个将机器学习嵌入医疗保健的框架,该框架在技术严谨性与临床实用性、操作可靠性与道德责任之间取得平衡。本案例研究的其余部分介绍了 ClinAIOps 框架及其反馈循环,随后详细介绍了高血压管理示例,说明了 AI 如何有效地融入常规临床实践。

反馈循环

ClinAIOps 框架的核心是三个相互锁定的反馈循环,这些循环使机器学习能够安全、有效和自适应地融入临床实践。如图 13.11 所示,这些循环旨在协调患者、临床医生和 AI 系统的输入,促进数据驱动决策,同时保持人类问责制和临床监督。

 ClinAIOps 反馈循环

图 13.11:ClinAIOps 反馈循环:循环框架协调患者、临床医生和 AI 系统之间的数据流动,以支持持续模型改进和安全的临床整合。这些相互关联的循环使 AI 模型能够根据实际表现和临床反馈进行迭代优化,促进医疗保健应用中的信任和问责制。来源:(E. Chen 等人 2023)。

在这个模型中,患者是核心:贡献现实世界的生理数据,报告结果,并作为优化护理的主要受益者。临床医生在特定背景下解释这些数据,提供临床判断,并监督治疗调整。同时,AI 系统持续分析传入的信号,呈现可操作的见解,并从反馈中学习以改进其建议。

每个反馈循环都扮演着独特但相互关联的角色:

  • 患者与 AI 循环捕捉并解释实时生理数据,生成定制化的治疗方案。

  • 临床医生与 AI 循环确保 AI 生成的建议在专业监督下得到审查、验证和改进。

  • 患者与临床医生循环支持共同决策,赋予患者和临床医生共同设定目标和解释数据趋势的权力。

这些循环共同实现了护理的适应性个性化。它们帮助调整人工智能系统的行为以适应每个患者的不断变化的需求,保持临床医生对治疗决策的控制,并基于现实世界反馈促进模型的持续改进。通过将这些结构化交互嵌入人工智能中,而不是将其作为独立的工具,ClinAIOps 为负责任和有效地将人工智能集成到临床工作流程中提供了一个蓝图。

患者-人工智能循环

患者与人工智能的循环通过利用通过可穿戴设备收集的连续生理数据来实现个性化的及时治疗方案优化。患者配备了如智能手表、皮肤贴片或专用生物传感器等传感器,在现实世界条件下被动地捕获与健康相关的信号。例如,管理糖尿病的患者可能佩戴连续葡萄糖监测器,而心血管疾病患者可能使用带有 ECG 功能的可穿戴设备来跟踪心脏节律。

人工智能系统持续分析这些数据流,并结合从患者的电子病历中提取的相关临床背景,包括诊断、实验室值、处方药物和人口统计信息。利用这种全面的视角,人工智能模型生成针对治疗调整的个性化建议,例如调整剂量水平、改变给药时间或标记异常趋势以供审查。

为了确保响应性和安全性,治疗方案被分级。在临床医生定义的安全阈值范围内的微小调整可以直接由患者执行,从而赋予患者自我管理的能力,同时减少临床负担。更重大的变化需要医疗保健提供者的审查和批准。这种结构保持了人工监督,同时使治疗的高频、数据驱动适应成为可能。

通过实现实时、定制的干预措施,包括基于葡萄糖趋势的自动胰岛素剂量调整,这个循环展示了机器学习如何缩小感知和治疗之间的反馈差距,允许在传统临床环境之外进行动态、上下文感知的护理。

医生-人工智能循环

医生-人工智能循环将关键的人工监督层引入了人工智能辅助治疗决策的过程。在这个循环中,人工智能系统生成治疗方案,并将其与患者数据的简洁、可解释的摘要一起呈现给临床医生。这些摘要可能包括纵向趋势、传感器生成的指标以及从电子健康记录中提取的上下文因素。

例如,一个 AI 模型可能会建议减少一个血压持续低于目标阈值的患者的抗高血压药物剂量。医生会在患者的更广泛的临床背景中审查这一建议,并可选择接受、拒绝或修改所提出的变更。这种反馈反过来又有助于模型的持续优化,提高其与临床实践的契合度。

关键的是,医生还定义了 AI 系统可以自主发布建议的操作边界。这些限制确保只有低风险的调整被自动化,而更重大的决策需要人类批准。这保留了临床问责制,支持患者安全,并增强了基于人工智能的工作流程的信任。

医生与人工智能之间的循环体现了一种混合护理模式,其中人工智能补充而非取代人类专业知识。通过使算法输出的有效审查和监督成为可能,它促进了机器智能融入临床实践,同时保留了医生作为最终决策者的角色。

患者与医生之间的循环

患者与医生之间的循环通过将重点从常规数据收集转移到更高层次的解释和共同决策,从而提高了临床互动的质量。随着人工智能系统处理数据聚合和基本趋势分析,医生得以更深入地与患者互动:审查模式、情境化洞察,并设定个性化的健康目标。

例如,在管理糖尿病时,医生可能会使用 AI 总结的数据来引导关于饮食习惯和身体活动的讨论,根据患者的特定血糖趋势定制建议。而不是遵循固定的随访间隔,可以根据患者的进展和稳定性动态调整访问频率,确保护理提供保持响应和高效。

这个反馈循环将医生定位为不仅仅是处方者,而是教练和顾问,通过患者的偏好、生活方式和临床判断来解读数据。它通过促进合作和相互理解来加强治疗联盟,这些是个性化以患者为中心护理的关键要素。

高血压案例示例

为了具体说明 ClinAIOps 的原则,可以考虑高血压的管理,这是一种影响美国近一半成年人(48.1%,或约 1.199 亿人,根据疾病控制与预防中心的数据)的疾病。有效的血压控制通常需要个性化的、持续的疗法调整,使其成为持续治疗监测的理想候选者。

ClinAIOps 通过将可穿戴传感技术、AI 驱动的建议和临床医生监督整合到一个统一的反馈系统中,为管理高血压提供了一个结构化的框架。在这种情况下,配备光电容积描记法(PPG)和心电图(ECG)传感器的可穿戴设备被动地捕获心血管数据,这些数据可以近乎实时地分析,以指导治疗调整。这些输入通过行为数据(例如,身体活动)和药物依从性日志得到增强,形成了一个自适应和响应的治疗方案的基础。

下面的子节详细说明了患者-AI、临床医生-AI 和患者-临床医生循环如何应用于此设置,展示了 ClinAIOps 在广泛且具有临床意义的条件下的实际应用。

数据收集

在基于 ClinAIOps 的血压管理系统中,数据收集集中在连续的多模态生理监测上。配备光电容积描记法(PPG)48 和心电图(ECG)传感器的腕戴设备提供非侵入性的血压估计 (Q. Zhang, Zhou, and Zeng 2017)。这些可穿戴设备还包括加速度计来捕捉身体活动模式,从而能够根据运动和努力来解释血压波动。

补充的数据输入包括自我报告的抗高血压药物摄入日志,指定剂量和时间,以及从患者的电子健康记录中提取的人口统计属性和临床病史。这些异构数据流共同形成了一个丰富、时间对齐的数据集,捕捉了影响血压调节的生理状态和行为因素。

通过将现实世界的传感器数据与纵向临床信息相结合,这个综合数据基础使得开发个性化的、上下文感知的适应高血压管理模式成为可能。

AI 模型

ClinAIOps 驱动的血压管理系统中的 AI 组件旨在直接在设备上或在患者附近运行,以实现近乎实时的分析和决策支持。该模型摄取连续的血压估计、昼夜节律指标、身体活动水平和药物依从性模式,以生成个性化的治疗方案。

使用机器学习技术,该模型推断出最佳的药物剂量和时机策略,以维持目标血压水平。在预定义的安全阈值内的微小剂量调整可以直接传达给患者,而涉及更大修改的建议则被路由到监督临床医生进行审查和批准。

该模型通过结合临床医生的决定和患者结果的反馈机制,支持持续的改进。通过将此类观察数据整合到后续的训练迭代中,系统逐步提高其预测准确性和临床效用。总体目标是实现完全个性化的、适应性强的血压管理,这种管理能够根据每个患者的生理和行为特征进行演变。

患者-人工智能循环

患者人工智能循环通过将人工智能生成的建议直接通过可穿戴设备或相关移动应用程序发送给患者,促进及时、个性化的药物调整。当模型识别出在预先批准的安全范围内的微小剂量调整时,患者可以独立采取建议,从而实现一种自主但受限的治疗自我管理形式。

对于涉及对处方方案进行重大更改的建议,系统会推迟至临床医生监督,确保医疗责任和符合监管标准。这个循环使患者能够积极参与自己的护理,同时保持对临床适宜性的保护。

通过提供每日个性化的数据驱动反馈,患者-人工智能循环支持提高依从性和治疗效果。它通过关闭连续监测和适应性干预之间的循环,同时保持患者在治疗过程中的主动作用,实现了 ClinAIOps 的一个关键原则。

临床医生-人工智能循环

临床医生-人工智能循环通过将医疗保健提供者置于决策过程的核心,确保医疗监督。临床医生会收到患者纵向血压模式的结构化摘要、依从性行为的可视化以及从可穿戴传感器和电子健康记录中汇总的相关上下文数据。这些见解支持对人工智能系统推荐的药物调整进行高效和有信息量的审查。

在接触到患者之前,临床医生会评估每个建议的剂量变化,根据他们的专业判断和对患者更广泛临床状况的理解,选择批准、修改或拒绝该建议。

当系统检测到表明临床风险的血压趋势,包括持续的低血压或高血压危象时,它会生成警报,以便临床医生立即干预。这些功能保留了临床医生对治疗的权威,同时增强了他们主动和大规模管理患者护理的能力。

这个循环展示了问责制、安全性和闭环治理的原则,确保人工智能在治疗决策中作为辅助工具而不是自主代理。

患者与医生循环

如图 13.12 所示,患者-医生循环强调护理中的协作、情境和连续性。医生们不再将面对面访问用于基本数据收集或药物核对,而是与患者互动,解释从持续监测中得出的高级趋势。这些讨论集中在可修改的因素上,如饮食、身体活动、睡眠质量和压力管理,从而实现血压控制的更全面方法。

图片

图 13.12:患者与医生互动:持续监测数据为患者和医生之间的协作讨论提供信息,将重点从数据收集转移到生活方式改变和改善健康管理可操作见解。这个循环优先考虑患者参与和情境理解,以促进超越传统临床访问的个性化护理。来源:(E. Chen 等人 2023)。

持续数据的动态特性允许根据临床需求灵活安排预约,而不是固定的间隔。例如,血压趋势稳定的患者可能被看到较少,而那些经历变化的患者可能会得到更及时的跟进。这种适应性节奏提高了资源效率,同时保持了护理质量。

通过将常规监测和剂量调整卸载到人工智能辅助系统中,医生可以更好地提供个性化咨询和针对性干预。结果是更富有意义的患者-医生关系,支持共同决策和长期健康。这个循环展示了 ClinAIOps 框架如何将临床互动从交易性转变为变革性,支持主动护理、患者赋权和改善健康结果。

MLOps 与 ClinAIOps 比较

高血压案例研究说明了为什么传统的 MLOps 框架通常不足以应对临床医疗等高风险、现实世界的领域。虽然传统的 MLOps 在管理机器学习模型的技术生命周期方面表现出色,包括训练、部署和监控,但它通常缺乏协调人类决策、管理临床工作流程和保障道德责任所需的构造。

相比之下,ClinAIOps 框架超越了技术基础设施,以支持复杂的社会技术系统。ClinAIOps 不是将模型视为最终决策者,而是将机器学习嵌入到一个更广泛的环境中,在那里医生、患者和系统利益相关者共同塑造治疗决策。

将传统 MLOps 方法应用于高血压管理等临床环境时,其几个局限性变得明显:

  • 数据可用性和反馈:传统管道依赖于预先收集的数据集。ClinAIOps 使持续数据获取和从临床医生和患者那里获得迭代反馈成为可能。

  • 信任与可解释性:MLOps 可能缺乏对最终用户透明的机制。ClinAIOps 维持临床医生的监督,确保推荐保持可操作和可信。

  • 行为和动机因素:MLOps 专注于模型输出。ClinAIOps 认识到患者辅导、依从性支持和个性化参与的需求。

  • 安全与责任:MLOps 没有考虑医疗风险。ClinAIOps 保留人类责任并提供自主决策的结构化边界。

  • 工作流程集成:传统系统可能存在于孤岛中。ClinAIOps 协调利益相关者的激励和沟通,以确保临床采用。

如表 13.7 所示,关键区别在于 ClinAIOps 如何将技术系统与人类监督、伦理原则和护理交付流程相结合。该框架并非取代临床医生,而是增强其能力,同时保持他们在治疗决策中的核心作用。

表 13.7:临床 AI 操作:传统 MLOps 关注模型性能,而 ClinAIOps 将技术系统与临床工作流程、伦理考虑和持续反馈循环相结合,以确保在医疗环境中提供安全、可信和有效的 AI 辅助。此表强调 ClinAIOps 优先考虑人类监督和责任,同时实现自动化,解决标准 MLOps 管道通常忽视的临床决策的独特挑战。

传统 MLOps ClinAIOps
重点 机器学习模型开发和部署 协调人类和 AI 决策
利益相关者 数据科学家、IT 工程师 患者、临床医生、AI 开发者
反馈循环 模型重新训练、监控 患者-AI、临床医生-AI、患者-临床医生
目标 实施 ML 部署 优化患者健康结果
流程 自动化管道和基础设施 整合临床工作流程和监督
数据考虑 构建训练数据集 隐私、伦理、受保护的健康信息
模型验证 测试模型性能指标 临床评估推荐
实施 专注于技术集成 对齐人类利益相关者的激励

在复杂领域如医疗保健中成功部署人工智能,不仅需要开发和运营性能良好的机器学习模型。正如高血压案例所示,有效的集成取决于将人工智能系统与临床工作流程、人类专业知识和患者需求相一致。仅仅技术性能是不够的;部署必须考虑到道德监督、利益相关者协调和对动态临床环境的持续适应。

ClinAIOps 框架专门解决了之前识别出的操作挑战,展示了它们在医疗保健环境中的表现。ClinAIOps 不是将反馈循环视为技术债务,而是明确地将它们构建为有益的系统功能,通过患者-人工智能、临床医生-人工智能和患者-临床医生循环创建有意的反馈机制,在保持通过人工监督的安全性的同时提高护理质量。人工智能建议与临床决策之间的结构化界面消除了隐藏的依赖关系,确保临床医生对人工智能输出保持明确控制,防止模型更新意外影响下游系统时发生的无声故障。对人工智能在监控和建议与人类在诊断和治疗决策中的责任进行明确划分,防止了系统边界逐渐侵蚀,这会损害复杂机器学习系统的可靠性。该框架对法规遵从性、道德监督和临床验证的重视,为配置管理创造了系统方法,防止了在医疗保健人工智能系统中积累治理债务的临时做法。通过将人工智能嵌入协作临床生态系统中,ClinAIOps 展示了如何将操作挑战从负债转变为系统设计机会,重新定义人工智能不仅仅是一个孤立的技术工件,而是作为一个更广泛的社会技术系统的一部分,旨在提高健康结果,同时保持生产机器学习系统所必需的工程严谨性。

谬误和陷阱

机器学习操作引入了独特的复杂性,这使得它与传统的软件部署不同,然而许多团队低估了这些差异,并试图在不做适应的情况下应用传统实践。机器学习系统的概率性质、数据质量的核心作用以及持续模型维护的需求,创造了需要专门方法和工具的操作挑战。

谬误: MLOps 只是将传统的 DevOps 实践应用于机器学习模型。

这种误解导致团队在没有理解其独特特征的情况下,将传统的软件部署实践应用于机器学习系统。传统软件具有确定性行为和清晰的输入输出关系,而机器学习系统表现出概率性行为、数据依赖性和模型漂移。标准的 CI/CD 管道未能考虑到数据验证、模型性能监控或重新训练触发器,这些对于机器学习系统是必不可少的。特征存储、模型注册表和漂移检测需要传统 DevOps 中不存在的专业基础设施。有效的 MLOps 需要为机器学习系统的随机性和数据依赖性设计专门的实践。

陷阱: 将模型部署视为一次性事件,而不是持续的过程。

许多团队将模型部署视为机器生命周期中的最后一步,类似于软件发布。这种方法忽略了现实情况,即由于数据漂移、用户行为变化和业务需求的发展,机器学习模型会随着时间的推移而退化。生产模型需要持续监控、性能评估以及可能的重新训练或替换。没有持续的操作支持,部署的模型会变得不可靠,并可能产生越来越差的结果。成功的 MLOps 将部署视为模型运营生命周期的开始,而不是其结束。

谬误: 自动重新训练确保了模型性能的最优化,无需人工监督。

这种信念假设自动管道可以处理模型维护的所有方面,无需人工干预。虽然自动化对于可扩展的 MLOps 至关重要,但它无法处理生产中出现的所有场景。自动重新训练可能会延续新训练数据中存在的偏差,未能检测到微妙的质量问题,或在不当的时间触发更新。复杂的故障模式、监管要求和企业逻辑变化需要人类的判断和监督。有效的 MLOps 在自动化与适当的人工检查点和干预能力之间取得平衡。

陷阱: 专注于技术基础设施,而忽视组织和流程的协调。

组织往往在解决成功实施所需的文化和流程变化之前,大量投资于 MLOps 工具和平台。MLOps 需要数据科学家、工程师和不同背景、优先级和沟通风格的商业利益相关者之间的紧密合作。如果没有明确的角色、责任和沟通协议,复杂的技术基础设施就无法带来运营效益。成功的 MLOps 实施需要组织转型,以协调激励措施,建立共享指标,并在功能边界内创建协作工作流程。

摘要

机器学习运营提供了一个综合框架,将本书中探索的专门能力整合成一致的生产系统。前几章确立了关键运营要求:第十四章展示了在严格约束下的联邦学习和边缘适应,第十五章开发了隐私保护技术和安全模型服务,第十六章提出了不可预测环境的容错机制。本章揭示了 MLOps 如何通过系统化的工程实践——数据管道自动化、模型版本控制、基础设施编排和持续监控——来协调这些不同的能力,使边缘学习、安全控制和鲁棒性机制能够在规模上可靠地协同工作。从孤立的技术解决方案到集成运营框架的演变反映了机器学习系统工程作为一个学科的成熟,它能够在生产环境中持续创造价值。

机器学习系统的运营挑战涵盖了技术、组织和特定领域维度,需要多个利益相关者和系统组件之间的复杂协调。数据漂移检测和模型重新训练管道必须持续运行,以保持系统性能,因为现实条件发生变化。基础设施自动化使得可以在各种环境中进行可重复的部署,同时版本控制系统跟踪代码、数据和模型工件之间的复杂关系。前面讨论的监控框架必须捕获传统系统指标和 ML 特定指标,如预测置信度、特征分布变化和模型公平性指标。这些运营能力的集成创建了强大的反馈循环,使系统能够适应变化条件,同时保持可靠性和性能保证。

关键要点

  • MLOps 提供了一个综合框架,将边缘学习(第十四章)、安全(第十五章)和鲁棒性(第十六章)的专门能力整合成一致的生产系统

  • 技术债务模式,如反馈循环和数据依赖,需要通过特征存储、版本控制系统和监控框架的系统工程解决方案

  • 基础设施组件直接解决运营挑战:CI/CD 管道防止纠正级联,模型注册表实现可控回滚,编排工具管理分布式部署

  • 生产操作必须同时处理联邦边缘更新、维护隐私保证以及通过统一监控和管理检测对抗性退化

  • 专门领域的框架,如 ClinAIOps,将运营挑战转化为设计机会,展示了 MLOps 如何适应专业需求同时保持工程严谨性

本章中提出的 MLOps 框架代表了第四部分开发的专业能力的集大成。第十四章(ch020.xhtml#sec-ondevice-learning)中提到的边缘学习技术需要 MLOps 的适应以实现分布式模型更新而不需要集中可见性。第十五章(ch021.xhtml#sec-security-privacy)中的安全机制依赖于 MLOps 基础设施以实现安全的模型部署和隐私保护的训练流程。第十六章(ch022.xhtml#sec-robust-ai)中的鲁棒性策略依赖于 MLOps 监控来检测分布变化并触发适当的缓解措施。随着机器学习系统从实验原型成熟到生产服务,MLOps 提供了必要的工程学科,使这些专业能力能够可靠地协同工作。通过 MLOps 实践开发出的运营卓越原则确保 AI 系统能够保持可信、可维护,并在规模上有效地解决现实世界的挑战,将机器学习的承诺转化为持续的运营价值。


在设备上学习

DALL·E 3 提示:一部智能手机的内部组件暴露的绘图,展示了不同性别和肤色的微型工程师正在积极工作在机器学习模型上。这些工程师包括男性、女性和非二元个体,他们正在调整参数、修复连接和即时增强网络。数据流入机器学习模型,实时处理,并生成输出推断。

图片

目的

为什么在设备上学习代表了自训练和推理分离以来机器学习系统中最基本的架构转变,是什么使得这种能力对智能系统的未来至关重要?

在设备上学习打破了数十年来主导机器学习架构的假设:模型训练和操作之间的分离。这通过在现实世界中实现持续适应而不是静态部署预训练模型来重新定义系统可以成为什么。从集中式训练到分布式、自适应学习的转变将系统从被动的推理引擎转变为能够在断开连接的环境中实现个性化、隐私保护和自主改进的智能代理。随着人工智能系统超越受控数据中心进入不可预测的环境,预训练无法预见每个场景或部署条件,这种架构革命变得至关重要。理解在设备上学习的原则使工程师能够设计突破静态模型限制的系统,在人类交互点创建能够学习和演化的自适应智能。

学习目标

  • 通过比较计算分布、数据局部性和协调机制来区分在设备上学习与集中式训练方法

  • 识别关键的动力驱动因素(个性化、延迟、隐私、基础设施效率)并评估在设备上学习何时比其他方法更合适

  • 分析与推理相比,训练如何放大资源限制,量化内存(3-5×\times)、计算(2-3×\times)和能量开销对系统设计的影响

  • 通过比较资源消耗、表达性和对不同设备类别的适用性来评估包括权重冻结、残差更新和稀疏更新在内的适应策略

  • 检查在有限本地数据集上进行学习的效率技术,包括少样本学习、经验重放和数据压缩方法

  • 应用联邦学习协议来协调异构设备群体中的隐私保护模型更新,同时管理通信效率和收敛挑战

  • 设计集成热管理、内存层次优化和电源预算的设备学习系统,以保持可接受的用户体验

  • 实施解决 MLOps 集成挑战的实用部署策略,包括设备感知管道、分布式监控和异构更新协调

分布式学习范式转变

操作框架(第十三章)通过集中编排、监控和部署管道,为大规模管理机器学习系统奠定基础。这些框架假设在受控的云环境中,计算资源丰富,网络连接可靠,系统行为可预测。然而,随着机器学习系统越来越多地超出数据中心,移动到边缘设备,这些基本假设开始崩溃。

一部学习预测用户文本输入的手机、一个适应家庭日常生活的智能家居设备,或一辆根据当地驾驶条件更新感知模型的自动驾驶汽车,都是传统集中式训练方法证明不足的场景。智能手机遇到了全球训练数据中不存在的、属于个别用户的独特语言模式。智能家居设备必须适应季节变化和家庭动态,这些变化在各个家庭之间差异很大。自动驾驶汽车面临着与原始训练环境不同的当地道路条件、天气模式和交通行为。

这些场景是设备学习的例子,其中模型必须在它们运行的设备上直接进行训练和适应 1。这种范式将机器学习从集中学科转变为分布式生态系统,学习发生在数百万种异构设备上,每个设备都处于独特的约束和本地条件下。

向设备学习过渡在机器学习系统设计中引入了基本紧张关系。虽然基于云的架构利用了丰富的计算资源和受控的操作环境,但边缘设备必须在严重受限的资源范围内运行,这些资源包括有限的内存容量、受限的计算吞吐量、受限的能源预算和间歇性的网络连接。这些使设备学习在技术上具有挑战性的约束同时使其最显著的优势得以实现:通过本地数据处理实现个性化适应,通过数据本地化保护隐私,以及通过独立于集中基础设施实现操作自主性。

本章探讨了导航这种架构紧张关系所需的理论基础和实践方法。基于计算效率原则(第九章)和运营框架(第十三章),我们研究了在极端资源约束下实现有效学习的专用算法技术、架构设计模式和系统级原则。挑战不仅超越了传统训练算法的优化,还要求对整个机器学习管道进行重新概念化,以适应传统计算假设失效的部署环境。

设备端学习是指在无服务器连接的情况下,直接在部署的硬件上对机器学习模型进行本地训练或适配。这种模式在资源受限的条件下,能够实现个性化隐私保护自主操作

这种范式的影响远远超出了技术优化,挑战了关于机器学习系统开发、部署和维护生命周期的既定假设。模型从遵循可预测的版本模式转变为表现出连续的分歧和适应轨迹。性能评估方法从集中的监控仪表板转变为跨异构用户群体的分布式评估。隐私保护从监管合规的考虑转变为塑造系统设计决策的核心架构要求。

理解这些系统性的影响需要考察推动组织采用设备端学习的强大动机以及必须解决的重大技术挑战。这种分析建立了构建能够在网络边缘有效学习的同时,在严格约束下运行的系统的理论基础和实践方法。

动机与益处

传统的机器学习系统通常依赖于集中的训练流程,其中模型通过使用大型、精心挑选的数据集和强大的云基础设施进行开发和优化(Jeffrey Dean 和 Ghemawat 2008)。一旦训练完成,这些模型就会被部署到客户端设备上进行推理,从而在训练和部署阶段之间形成清晰的分离。虽然这种架构分离在大多数用例中都表现良好,但在现代应用中,本地数据是动态的、私密的或高度个性化的,它带来了显著的限制。

设备上学习通过允许系统在设备上直接进行训练或自适应,而不依赖于持续连接到云端,挑战了这一既定模型。这种转变不仅仅代表技术进步,它反映了不断变化的应用需求和用户期望,这些需求和期望要求响应性、个性化且保护隐私的人工智能系统。

考虑一个智能手机键盘适应用户的独特词汇和打字模式。为了个性化预测,系统必须在本地观察到的文本输入上对紧凑的语言模型执行梯度更新。即使是对于最小的语言模型,单个梯度更新也需要 50-100 MB 的内存用于激活和优化器状态。现代智能手机通常为键盘等后台应用程序分配 200-300 MB(根据操作系统和设备代系而异)。这个极薄的内存边界,其中单个训练步骤消耗了可用内存的 25%,体现了设备上学习的核心工程挑战。系统必须在如此严重的限制下实现有意义的个性化,而传统的训练方法在架构上变得不可行。这种定量现实推动了需要专门技术,这些技术使得在极端资源限制下实现自适应成为可能。

设备上学习的好处

理解设备上学习采用背后的驱动因素需要审视传统集中式方法固有的局限性。传统的机器学习系统依赖于模型训练和推理之间明确的劳动分工。训练在可访问高性能计算资源和大规模数据集的集中环境中进行。一旦训练完成,模型被分发到客户端设备,在那里它们以静态的推理模式运行。

虽然这种集中式范式在许多部署中已被证明是有效的,但它引入了在数据是用户特定、行为是动态的或连接是间歇性的场景中的基本局限性。随着机器学习超越受控环境进入具有多样化用户群体和部署背景的实际情况,这些局限性变得尤为突出。

设备上学习通过允许部署的设备使用本地数据执行模型自适应来克服这些局限性。设备上学习不仅仅是效率优化;它是构建可信赖人工智能系统的基石,开启第四部分:可信赖的系统。通过保持数据本地化,它为隐私提供了强大的基础。通过适应单个用户,它增强了公平性和实用性。通过支持离线操作,它提高了对网络故障和基础设施依赖的鲁棒性。本章探讨了构建这些可信赖、自适应系统所需的工程。

这种从集中式到分布式学习的转变是由四个关键考虑因素驱动的,这些因素反映了技术能力和不断变化的应用需求:个性化、延迟和可用性、隐私和基础设施效率 (T. Li et al. 2020)。

个性化代表了最具吸引力的动机,因为部署的模型经常遇到与它们的训练环境有显著差异的使用模式和数据分布。本地适应允许模型根据用户特定的数据来细化行为,捕捉语言偏好、生理基线、传感器特征或环境条件。这种能力在用户间差异大的应用中证明是至关重要的,在这些应用中,一个全局模型无法有效地服务于所有用户。

延迟和可用性限制为本地学习提供了额外的理由。在边缘计算场景中,连接到集中式基础设施可能不可靠、延迟或有意限制以保留带宽或减少能耗。设备上的学习允许模型在完全离线或对延迟敏感的上下文中自主改进,即使往返云端的更新在架构上不可行。

隐私考虑提供了一个第三大推动力。许多现代应用涉及敏感或受监管的数据,包括生物识别测量、输入文本、位置跟踪或健康信息。本地学习通过在设备上保留原始数据并在隐私保护边界内操作来减轻隐私担忧,可能有助于遵守 GDPR2、HIPAA (Tomes 1996)或特定区域的数据主权法律。

基础设施效率为分布式学习方法提供了经济动机。集中式训练管道需要大量的后端基础设施来收集、存储和处理来自数百万设备的用户数据。通过将学习转移到边缘,系统降低了通信成本,并将训练工作负载分布在部署舰队中,减轻了集中资源的压力,同时提高了可扩展性。

替代方法和决策标准

设备上的学习代表了一个重大的工程投资,其固有的复杂性可能无法由其带来的好处来证明。在承诺采用这种方法之前,团队应仔细评估是否更简单的替代方案可以以更低的运营成本实现类似的结果。了解何时不实施设备上的学习与了解其好处一样重要,因为过早采用可能会在不成比例的价值下引入不必要的复杂性。

几种替代方法通常足以满足个性化与适应需求,而不需要本地训练的复杂性:

  • 基于特征的个性化:通过本地存储用户偏好、交互历史和行为特征来实现有效的定制。系统不是调整模型权重,而是将这些存储的特征输入到静态模型中,以实现个性化。新闻推荐系统通过本地存储用户主题偏好和阅读模式,然后将这些特征与集中式内容模型结合,提供个性化的推荐,而无需更新模型。

  • 基于云的微调与隐私控制:通过集中式适应实现个性化,同时采用适当的隐私保护措施。用户数据在非高峰时段批量处理,使用差分隐私 3 或联邦分析等隐私保护技术。这种方法通常比资源受限的设备更新具有更高的准确性,同时保持许多应用的可接受的隐私属性。

  • 用户特定的查找表:结合全局模型与个性化检索机制。系统维护一个轻量级的、针对特定用户的查找表,用于频繁访问的模式,同时使用共享的全局模型进行泛化。这种混合方法提供了个性化优势,同时计算和存储开销最小。

实施设备学习的决策应受可量化的需求驱动,这些需求排除了这些更简单的替代方案。真正的数据隐私限制,法律禁止云处理,真正的网络限制,防止可靠连接,定量延迟预算,禁止云往返,或可证明的性能改进,证明操作复杂性的合理性,这些是设备学习采用的有效驱动因素。

对于具有关键时间要求的(例如,33 ms 以下的相机处理,500 ms 以下的语音响应,20 ms 以下的 AR/VR 运动到光子延迟,或 10 ms 以下的安全关键控制),网络往返时间(通常为 50-200 ms)使得基于云的替代方案在架构上不可行。在这种情况下,无论考虑复杂性的因素如何,设备学习都成为必要。团队在承诺设备学习所需的重大工程投资之前,应彻底评估更简单的解决方案。

这些动机根植于更广泛的知识迁移概念,其中预训练模型将有用的表示迁移到新的任务或领域。这一基本原理使得设备上的学习既可行又有效,允许在最小本地资源下进行复杂的适应。如图 14.1 图 14.1 所示,知识迁移可以发生在紧密相关的任务之间(例如,玩不同的桌面游戏或乐器),或者跨越具有相似结构的领域(例如,从骑自行车到骑滑板)。在设备上学习的背景下,这意味着利用在云端预训练的模型,并仅使用本地数据和有限的更新来高效地将其适应到新的环境中。该图强调了关键思想:预训练的知识允许快速适应,无需从头开始重新学习,即使新任务在输入模式或目标上有所偏离。

图片

图 14.1:知识迁移:预训练模型通过利用现有表示来加速新任务的学习,例如通过在相关桌面游戏或乐器之间调整技能。这种迁移扩展到自行车骑行和滑板操作等跨领域,其中共享的底层结构允许在有限的新数据下进行高效的调整。

这种由迁移学习和适应能力带来的概念转变,使得实际设备上的应用成为可能。无论是调整语言模型以适应个人打字偏好,调整手势识别以适应个人运动模式,还是在不断变化的环境中重新校准传感器模型,设备上的学习允许系统在时间上保持响应性、高效性和与用户的对齐。

实际应用领域

建立在这些既定动机(个性化、延迟、隐私和基础设施效率)的基础上,实际部署展示了设备上学习在众多应用领域中的实际影响。这些领域包括消费技术、医疗保健、工业系统和嵌入式应用,每个领域都展示了上述好处对于有效机器学习部署成为关键的场景。

移动输入预测代表了在设备上学习的最成熟和最广泛部署的例子。在智能手机键盘等系统中,预测文本和自动纠错功能从持续的本地调整中受益良多。用户的打字模式高度个性化且动态变化,使得集中式的静态模型不足以提供最佳用户体验。设备上的学习允许语言模型直接在设备上微调其预测,实现个性化同时保持数据本地性。

例如,Google 的 Gboard 使用联邦学习来改善大量用户之间的共享模型,同时保持每个设备的原始数据本地化(Hard 等人 2018)4。

如图 14.2 所示,不同的预测策略展示了本地适应在实时操作中的工作方式:下一词预测(NWP)基于先前的文本提出可能的延续,而智能完成则使用即时重新评分提供动态补全,展示了本地推理机制的复杂性。

图片

图 14.2:设备上的预测策略:Gboard 同时使用下一词预测和智能完成以及即时重新评分来适应用户的本地打字模式,增强个性化并保护隐私。这些技术展示了机器学习模型如何在实时中细化预测,而不需要将数据传输到中央服务器,从而实现高效且私密的移动输入体验。

在消费应用的基础上,可穿戴设备和健康监测设备提供了同样有吸引力的用例,并增加了额外的监管约束。这些系统依赖于加速度计、心率传感器和皮肤电活动监测器的实时数据来跟踪用户健康和健身。生理基线在个体之间差异很大,这为静态模型无法有效解决的个性化挑战。设备上的学习允许模型随着时间的推移适应这些个体基线,显著提高活动识别、压力检测和睡眠阶段的准确性,同时满足数据本地化的监管要求。

语音交互技术呈现了另一个重要的应用领域,具有独特的声学挑战。唤醒词检测 5 以及智能音箱和耳机等设备中的语音界面必须快速准确地识别语音命令,即使在嘈杂或动态的声学环境中也是如此。

这些系统面临严格的延迟要求:语音界面必须保持端到端响应时间低于 500 毫秒,以保持自然对话流程,唤醒词检测需要低于 100 毫秒的响应时间,以避免用户感到沮丧。本地训练允许模型适应用户的独特语音特征和不断变化的周围环境,在满足这些性能约束的同时,减少误报和漏检。这种适应在远场音频设置中尤其有价值,因为麦克风配置和房间声学在部署中差异很大。

除了消费类应用之外,工业物联网和远程监控系统展示了在资源受限环境中设备上学习的价值。在农业传感、管道监控或环境监控等应用中,连接到集中式基础设施可能有限、昂贵或完全不可用。设备上的学习允许这些系统检测异常、调整阈值或适应季节性趋势,而无需与云持续通信。这种能力对于保持边缘部署的传感器网络的自主性和可靠性至关重要,因为系统停机或漏检可能产生重大的经济或安全后果。

最具挑战性的应用出现在嵌入式计算机视觉系统中,包括机器人、AR/VR 和智能摄像头等,这些系统将复杂的视觉处理与极端的时序约束相结合。摄像头应用必须在 33 毫秒内处理帧以保持 30 FPS 的实时性能,而 AR/VR 系统则要求运动到光子的延迟低于 20 毫秒,以防止恶心并保持沉浸感。安全关键的控制系统需要更严格的界限,通常低于 10 毫秒,因为延迟的决策可能产生严重的后果。这些系统在新的或快速变化的环境中运行,与它们的原始训练条件有显著差异。设备上的自适应允许模型重新校准以适应新的光照条件、物体外观或运动模式,同时满足这些关键的延迟预算,这些预算从根本上推动了设备上与基于云的处理之间的架构决策。

每个领域都揭示了一个共同的模式:部署环境引入了变化和特定上下文的要求,这些要求在集中式训练期间无法预料。这些应用展示了动机驱动因素(个性化、延迟、隐私和基础设施效率)如何表现为具体的工程约束。移动键盘面临存储用户特定模式的内存限制,可穿戴设备遇到限制训练频率的能量预算,语音界面必须满足低于 100 毫秒的延迟要求,这排除了云协调,而工业物联网系统在网络受限的环境中运行,需要自主适应。这种模式揭示了塑造所有后续技术决策的基本设计要求:学习必须在重大资源约束下高效、私密和可靠地进行,这些约束通过约束分析(第 14.3 节)、自适应技术(第 14.4 节)和联邦协调(第 14.6 节)来考察。

建筑权衡:集中式与去中心化训练

这些应用展示了在多个领域内设备端学习的实际价值。在此基础上,我们现在探讨设备端学习与传统机器学习架构的不同之处,揭示了训练生命周期的全面重新构想,这远远超出了简单的部署选择。

要理解设备端学习所代表的转变,需要检查传统机器学习系统的结构以及它们的局限性在哪里变得明显。如今,大多数机器学习系统遵循一个集中式学习范式,这个范式为该领域服务得很好,但随着现代部署要求的增加,它越来越显示出压力。模型在数据中心使用大规模、精心挑选的数据集进行训练,这些数据集来自许多来源。一旦训练完成,这些模型就以静态形式部署到客户端设备上,在那里它们执行推理而无需进一步修改。模型参数的更新,无论是为了整合新数据还是为了提高泛化能力,通常通过离线重新训练来处理,这通常使用从现场收集或标记的数据来完成。

这种既定的集中式模型提供了许多经过验证的优势:高性能计算基础设施、访问多样化的数据分布,以及强大的调试和验证管道。它还依赖于几个在现代部署场景中可能不成立的假设:可靠的数据传输、对数据保管人的信任,以及能够管理跨设备编队的全球更新的基础设施。随着机器学习被部署到越来越多样化、分布式的环境中,这种方法的优势变得更加明显,但同时也往往具有阻碍性。

与这种集中式方法相反,设备端学习拥抱了一种固有的去中心化范式,挑战了许多传统假设。每个设备都维护自己模型的副本,并使用通常无法提供给集中式基础设施的数据在本地对其进行调整。训练在设备上发生,通常是异步的,并在基于设备使用模式、电池水平和热状态变化的资源条件下进行。数据永远不会离开设备,这减少了隐私暴露,但也使得设备间的协调变得更加复杂。设备在硬件能力、运行环境和使用模式上可能存在显著差异,使得学习过程异构且难以标准化。这些硬件变化为系统设计带来了重大挑战。

这种去中心化架构引入了一类新的系统挑战,这些挑战远远超出了传统机器学习关注的范畴。设备可能运行不同版本的模型,导致部署集群中行为的不一致性。评估和验证变得更加复杂,因为没有中央点可以衡量所有设备的性能(McMahan 等人 2017c)。必须谨慎管理模型更新以防止退化,并且在缺乏集中测试和验证基础设施的情况下,安全保证变得更加难以执行。

管理数千个异构边缘设备超出了典型分布式系统的复杂性。设备异质性不仅包括硬件差异,还包括不同的操作系统版本、安全补丁、网络配置和电源管理策略。在任何给定时间,20-40% 的设备处于离线状态(Bonawitz 等人 2019),而其他设备可能已经断开连接数周或数月,从而造成持续的协调挑战。

当断开连接的设备重新连接时,它们需要状态协调以避免版本冲突。更新验证变得至关重要,因为设备可能静默地未能应用更新或报告成功,同时运行着过时的模型。健壮的系统实施多阶段验证:加密签名确认更新完整性,功能测试验证模型行为,遥测确认部署成功。回滚策略必须处理部分部署的情况,其中一些设备已接收更新,而其他设备仍停留在之前的版本,这需要复杂的编排来在故障恢复期间保持系统一致性。

这些挑战需要与集中式机器学习系统相比不同的系统设计和运营管理方法,基于第十三章中分布式系统原则,同时引入边缘特定的复杂性。

尽管存在这些挑战,去中心化引入了经常足以证明额外复杂性的机会。它允许在没有集中监管的情况下进行深度个性化,支持在断开连接或带宽受限的环境中稳健学习,并降低模型更新的运营成本和基础设施负担。实现这些好处引发了如何有效协调设备间学习的问题,无论是通过定期同步、联邦聚合还是平衡本地和全局目标的混合方法。

从集中式学习到分布式学习的转变不仅仅代表了部署架构的转移。它重塑了机器学习系统的整个设计空间,需要新的方法来处理模型架构、训练算法、数据管理和系统验证。在集中式训练中,数据从许多来源汇总并在大型数据中心进行处理,在那里模型被训练、验证,然后以静态形式部署到边缘设备。相比之下,设备学习引入了一种根本不同的范式:模型直接在客户端设备上使用本地数据更新,通常是非同步的,并在不同的硬件条件下进行。这种架构转型引入了协调挑战,同时实现了自主的本地适应,需要仔细考虑验证、系统可靠性和跨异构设备群体的更新编排。

设备学习是对集中式机器学习工作流程局限性的回应。从集中式到分布式学习的转变创造了三个不同的操作阶段,每个阶段都有不同的特征和挑战。

传统的集中式范式从基于云的聚合数据训练开始,然后是静态模型部署到客户端设备。当数据收集可行、网络连接可靠且单个全局模型可以有效地为所有用户服务时,这种方法效果良好。然而,当数据变得个性化、对隐私敏感或在有限连接的环境中收集时,它就会崩溃。

一旦部署,随着每个设备遇到其独特的数据分布,本地差异开始出现。设备收集的数据反映了个人用户模式、环境条件和使用上下文。这些数据通常是非-IID(非独立同分布)6 且噪声大的,需要本地模型适应以保持性能。这一转变标志着从全局泛化到本地专业化的转变。

最后一个阶段引入了联邦协调,设备通过汇总模型更新而不是原始数据共享来定期同步其本地适应。这既实现了隐私保护的全局优化,又保持了本地个性化的好处。

这三个不同的阶段(集中式训练、本地适应和联邦协调)代表了架构的演变,重塑了机器学习生命周期的各个方面。图 14.3 展示了在这些阶段中数据流、计算分布和协调机制的不同,突出了每个阶段出现的日益复杂的复杂性以及增强的能力。理解这一进展有助于界定设备学习系统必须解决的挑战。

图片

图 14.3:从集中式云训练(区域 A)通过本地设备适应(区域 B)到联邦协调(区域 C)的演变代表了机器学习架构的根本性转变。每个阶段都引入了独特的操作特性,从统一的全球模型到个性化的本地适应,再到协调的分布式学习。

设计约束

第三部分确立了塑造所有机器学习系统的效率原则。第九章介绍了三个效率维度(算法效率、计算效率和数据效率),并通过扩展定律揭示了为什么蛮力方法会遇到基本限制。第十章开发了包括量化、剪枝和知识蒸馏在内的压缩技术,这些技术使得在资源受限的设备上部署成为可能。第十一章描述了从微控制器到移动加速器的边缘硬件能力,如硬件讨论中详细所述。这些章节主要关注推理工作负载:高效地运行预训练模型。

在设备上学习遵循相同的效率约束,但具有针对训练特定的放大,这使得优化变得更加具有挑战性。在推理阶段,网络只需要单次正向传递,而在训练阶段,则需要正向传播、通过反向传播进行梯度计算和权重更新,这增加了 3-5×\times的内存需求以及 2-3×\times的计算成本。能够实现高效推理的模型压缩技术,从优化变成了基本要求,因为没有激进的压缩,在边缘设备上的训练将是不可能的。

考虑到设备上学习的既定动机,我们现在来探讨塑造其实施的根本性工程挑战。在设备上实现学习需要完全重新思考关于机器学习系统运行位置和方式的传统假设。在集中式环境中,模型是在访问广泛的计算基础设施、大量精选的数据集以及慷慨的内存和能源预算的情况下进行训练的。在边缘,这些假设都不成立,从而创造了一个根本不同的设计空间。

设备上学习约束分为三个关键维度,这些维度与第三部分中的效率框架平行但扩展:模型压缩需求(扩展算法效率)、稀疏和非均匀数据特征(扩展数据效率),以及严重受限的计算资源(扩展计算效率)。这三个维度形成一个相互关联的约束空间,定义了设备上学习系统的可行区域,每个维度都施加独特的限制,影响算法选择、系统架构和部署策略。

边缘设备上训练开销的量化

从仅推理部署到设备上训练的转变,产生了乘法而非加法复杂性。这些约束相互作用并相互放大,以重塑系统设计要求,基于第九章的资源优化原则,同时引入了特定于分布式学习环境的新挑战。

第三部分引入的效率约束适用于推理和训练,但训练将每个约束维度放大了 3-10 倍。表 14.1 量化了训练工作负载如何加剧第九章(ch015.xhtml#sec-efficient-ai)、第十章(ch016.xhtml#sec-model-optimizations)和第十一章(ch017.xhtml#sec-ai-acceleration)中确立的挑战。

这些放大解释了为什么仅仅将第三部分优化技术应用于训练工作负载证明是不够的。每个约束类别都会影响设备上学习系统设计,需要基于但超越早期章节中推理方法的方法。

表 14.1:训练放大推理约束:设备上学习在相同的效率约束下运行,但具有特定于训练的放大,这使得优化变得极具挑战性。本表量化了从运行预训练模型到本地调整模型时,每个约束维度如何加剧。放大系数假设标准反向传播,不包含梯度检查点等优化。

约束维度 推理(第三部分) 训练放大 对设计的影响
内存占用 模型权重 + 单个激活图 权重 + 完整激活缓存 + 梯度 + 优化器状态 增加 3-5 倍;迫使进行激进压缩
计算操作 仅前向传递 前向 + 反向 + 权重更新 增加 2-3 倍;限制模型复杂性
内存带宽 顺序权重读取 梯度双向数据流 增加 5-10×\times;造成瓶颈
每样本能耗 单个推理操作 多个梯度步骤直至收敛 增加 10-50×\times;需要机会性调度
数据需求 预收集、整理的数据集 稀疏、噪声、流式本地数据 需要样本高效的方法
硬件利用率 优化正向传播 反向传播的不同访问模式 推理加速器可能对训练无帮助

图 14.4 展示了将离线预训练与资源受限的物联网设备上的在线自适应学习相结合的管道。系统首先使用通用数据进行元训练。在部署期间,设备特定的约束(如数据可用性、计算和内存)通过排名和选择要更新的层和通道来塑造适应策略。这允许在有限的资源范围内进行高效的设备学习。

图 14.4:资源受限的设备使用两阶段学习过程:离线预训练建立初始模型权重,随后是在线自适应,根据可用的数据、计算和内存选择性地更新层。这种方法在模型性能与边缘部署的实际限制之间取得平衡,使现实世界环境中的持续学习成为可能。

模型约束

设备学习约束的第一维度集中在模型本身。其结构、大小和计算需求决定了部署的可行性。机器学习模型的结构和大小直接影响设备上训练是否可行,更不用说是否实用。与可以跨越数十亿参数并依赖于多吉字节内存预算的云部署模型不同,旨在设备上学习的模型必须符合对内存、存储和计算复杂性的严格限制。这些限制不仅适用于推理时间,在训练期间变得更加严格,因为需要额外的资源来进行梯度计算、参数更新和优化器状态管理。

当检查设备谱系中的具体示例时,这些约束的范围变得明显。MobileNetV2 架构,常用于移动视觉任务,在其标准配置下需要大约 14 MB 的存储空间。虽然这种内存需求对于具有数 GB 可用 RAM 的现代智能手机来说是完全可行的,但它远远超过了 Arduino Nano 33 BLE Sense7 等嵌入式微控制器上可用的内存,后者仅提供 256 KB 的 SRAM 和 1 MB 的闪存存储。这种可用资源的巨大差异需要采取激进的模型压缩技术。在这样的严重受限平台上,即使是典型的卷积神经网络的单层,在训练过程中也可能因为需要存储中间特征图和梯度信息而超出可用的 RAM。

除了静态存储需求之外,训练过程本身也会显著扩大有效内存占用,从而增加了一层额外的约束。标准的反向传播需要在正向传递期间缓存每一层的激活,然后在反向传递的梯度计算中重新使用这些激活。如上所述的放大分析所确立的,这种激活缓存将内存需求与仅推理部署相比增加了。对于一个看似朴素的 10 层卷积模型处理64×6464 \times 64图像,所需的内存可能超过 1 到 2 MB,远远超出大多数嵌入式系统的 SRAM 容量,突显了模型表达能力和资源可用性之间的基本矛盾。

这些内存约束的叠加,模型复杂性直接影响运行时能耗和热限,引入了额外的实际部署障碍。在智能手表或电池供电的可穿戴设备等系统中,持续的模型训练会迅速耗尽能源储备或触发性能下降的热管理。在这些设备上使用浮点运算进行完整模型的训练,从能源角度来看通常是不切实际的,即使内存约束得到满足。这些实际限制促使开发了超轻量级模型变体,如 MLPerf Tiny 基准网络(C. Banbury 等. 2021),这些网络的大小在 100-200 KB 之间,并且可以通过仅使用部分梯度更新来适应。这些专用模型采用激进的量化和剪枝策略,在保持足够表达性以进行有意义适应的同时,实现了如此紧凑的表示。

电池和热限制的实用影响不仅限于限制训练时间。移动设备必须仔细平衡训练机会与用户体验。激进的设备端训练可能导致设备明显发热和快速耗电,导致用户不满甚至可能卸载应用程序。现代智能手机通常将 ML 工作负载的持续处理功率限制在 2-3 W,以防止热不适,尽管在热限制启动之前,它们可以短暂地达到 5-10 W。即使是训练简单的模型也可能轻易超过这些可持续的功率限制。这一现实需要智能的调度策略:在充电期间进行训练,以改善热散失,在可能的情况下使用低功耗核心进行梯度计算,并在温度阈值超过时实施热感知的轮换,暂停训练。一些系统甚至利用设备使用模式,仅在设备空闲且连接电源的夜间充电期间进行密集的适应调度。

考虑到这些多方面的限制,模型架构本身必须从一开始就从根本上设计,以考虑设备端学习的能力。许多传统的架构,如大型转换器或深度卷积网络,由于它们固有的规模和计算复杂性,在设备端适应方面根本不可行。相反,专门开发了一些轻量级架构,如 MobileNets8、SqueezeNet (Iandola et al. 2016) 和 EfficientNet (Tan and Le 2019a),这些架构专门针对资源受限的环境。这些架构利用效率原则和架构优化,重新思考了神经网络的结构。这些专用模型采用深度可分离卷积 9、瓶颈层和激进的量化等技术,在显著降低内存和计算需求的同时,保持了足够的应用性能。

这些架构通常设计为模块化,便于适应和微调。例如,MobileNets (A. G. Howard et al. 2017) 可以配置不同的宽度乘数和分辨率设置,以平衡性能和资源使用。具体来说,α=1.0 的 MobileNetV2 需要 3.4 M 个参数(FP32 格式下为 13.6 MB),但 α=0.5 时参数减少到 0.7 M(2.8 MB),使得设备仅有的 4 MB 可用 RAM 也能部署。这种灵活性对于设备端学习非常重要,因为模型必须适应部署环境的特定限制。

虽然模型架构决定了设备上学习的内存和计算基线,但可用训练数据的特征引入了同样根本的限制,这些限制塑造了学习过程的各个方面。

数据限制

设备上学习限制的第二个维度集中在数据可用性和质量上。设备上机器学习系统可用的数据性质与在云训练中使用的庞大、精心策划和集中管理的数据集大相径庭。在边缘,数据是本地收集的,时间上稀疏的,通常是非结构化或未标记的,创造了一个不同的学习环境。这些特征在数量、质量和统计分布方面引入了多方面的挑战,所有这些都直接影响设备上学习的可靠性和泛化能力。

数据量代表第一个主要限制因素,受到存储限制和用户交互的偶然性质的双重限制。例如,一个智能健身追踪器可能仅在身体活动期间收集运动数据,每天产生的标记样本相对较少。如果用户仅佩戴设备进行 30 分钟的锻炼,可能只有几百个数据点可用于训练,与在受控环境中进行有效的监督学习通常所需的数千或数百万数据点相比。这种稀缺性改变了学习范式,从数据丰富的算法转变为数据高效的算法。

除了体积限制之外,设备上的数据通常是非独立同分布的(non-IID)(Y. Zhao et al. 2018),这为云系统很少遇到的统计挑战。这种异质性在多个维度上表现出来:用户行为模式、环境条件、语言偏好和使用上下文。在多个家庭中部署的语音助手会遇到口音、语言、说话方式和命令模式的大幅变化。同样,智能手机键盘会适应个人的打字模式、自动纠错偏好和多语言使用,这些在用户之间差异很大。这种数据异质性既复杂了模型的收敛,也复杂了必须跨设备泛化同时保持个性化的更新机制的设计。

这些分布挑战的叠加,标签稀缺又提出了一个额外的关键障碍,严重限制了传统的学习方法。大多数边缘收集的数据默认情况下是无标签的,需要系统从弱或隐式监督信号中学习。例如,在智能手机摄像头中,设备可能一天中捕获成千上万张图片,但只有少数与有意义的用户行为(例如,标记、收藏或分享)相关,这些可以作为隐式标签。在许多应用中,包括检测传感器数据中的异常和调整手势识别模型,可能完全无法获得显式标签,这使得在没有开发弱监督或无监督适应的替代方法的情况下,传统的监督学习变得不可行。

数据质量问题给设备上的学习挑战增加了另一层复杂性。噪声和可变性进一步降低了用于训练的有限数据。嵌入式系统,如环境传感器或汽车 ECU,可能会经历传感器校准、环境干扰或机械磨损的波动,导致随时间推移输入信号损坏或漂移。没有集中式验证系统来检测和过滤这些错误,它们可能会默默地降低学习性能,创造一个可靠性挑战,云系统可以通过数据预处理管道更容易地解决。

最后,数据隐私和安全问题对所有约束施加了最严格的限制,通常使得数据共享在架构上变得不可能,而不仅仅是不可取。敏感信息,如健康数据、个人通讯或用户行为模式,必须在法律和伦理要求下受到保护,防止未经授权的访问。这种约束通常完全排除了使用传统数据共享方法,例如将原始数据上传到中央服务器进行训练。相反,设备上的学习必须依赖于复杂的技巧,这些技巧能够实现本地适应,而不会暴露任何敏感信息,从而改变了学习系统的设计和验证方式。

计算约束

第十一章描述了为机器学习提供计算基础的边缘硬件景观:在最受限的端点是微控制器如 STM32F4 和 ESP32,中间是具有专用 AI 加速器(苹果神经网络引擎、高通 Hexagon、谷歌 Tensor)的移动级处理器,在高端是高能力边缘设备。该章节重点介绍了推理能力——在执行预训练模型时可以达到的计算吞吐量、内存带宽和能效。

训练工作负载展现出根本不同的计算特性,这改变了硬件利用模式。基于第十一章中描述的边缘硬件景观,从微控制器到移动 AI 加速器,设备上的学习必须在严重受限的计算范围内运行,这与基于云的训练基础设施在原始计算能力上相差数百或数千倍。

关键区别在于:反向传播由于梯度计算和激活缓存需要显著更高的内存带宽,权重更新会创建不同于推理的只读操作的写密集型访问模式,而优化器状态管理需要额外的内存分配,这是推理从未遇到的。这些特定的训练需求意味着对于推理完全足够的硬件可能证明在适应方面完全不足,即使只是更新一个小参数子集。

在最受限的一端,STM32F410 或 ESP3211 等微控制器仅提供几百千字节的 SRAM,并且完全缺乏对浮点操作的硬件支持 (Warden and Situnayake 2020)。这些极端限制代表了边缘硬件的基本限制 (Chapter 11)。如此严重的限制排除了使用传统的深度学习库,并要求模型必须精心设计以适应整数算术和最小的运行时内存分配。在这些环境中,即使是看似简单的模型也需要高度专业化的技术,包括量化感知训练 12 和选择性参数更新,以在不超过内存或功耗预算的情况下执行训练循环。

实际影响是明显的:虽然 STM32F4 微控制器可以运行一个带有几百个参数的简单线性回归模型,但训练甚至一个小的卷积神经网络会立即超出其内存容量。在这些严重受限的环境中,训练通常仅限于简单的算法,如随机梯度下降(SGD)13 或 kk-means 聚类,这些算法可以使用整数算术和最小的内存开销实现,这代表了与现代机器学习实践的根本性转变。

在计算层次结构中向上移动,移动级硬件代表了一个显著的改进,但仍然受到大量约束。包括高通骁龙、苹果神经网络引擎 14 和谷歌 Tensor SoC15 在内的平台,比微控制器提供了显著更多的计算能力,通常具有专门的 AI 加速器和针对 8 位或混合精度 16 矩阵操作的优化支持。这些加速器、它们的性能和它们的编程模型在第十一章中详细说明。虽然这些平台可以支持更复杂的训练程序,包括对紧凑模型的完整反向传播,但它们在计算吞吐量和内存带宽方面仍然远远落后于集中式数据中心。例如,在智能手机上训练轻量级转换器 17 在技术上可行,但必须在时间和能耗上严格限制,以避免降低用户体验,突显了学习能力和实际部署约束之间的持续紧张关系。

这些计算限制在实时或电池供电系统中尤为突出,正如在相机处理需求中所展示的,特定的延迟预算创造了硬性架构约束。以 30 帧每秒(FPS)处理的相机应用,每帧不能超过 33 毫秒(ms),语音界面需要快速响应时间以实现自然交互,增强现实/虚拟现实(AR/VR)系统需要低于 20 毫秒的运动到光子(motion-to-photon)延迟以避免用户不适,而安全关键的控制系统必须在 10 毫秒内响应以确保操作安全。这些定量约束决定了设备上学习是否可行,或者基于云的替代方案在架构上是否必要。在基于智能手机的语音识别器中,设备上的自适应必须与主要推理工作负载无缝共存,而不干扰响应延迟或系统响应性。同样,在可穿戴医疗监测器中,训练必须在精心管理的时间窗口内偶然发生——通常在低活动期或充电期间——以保护电池寿命并避免热管理问题。

除了原始的计算能力之外,这些硬件限制在系统设计选择上的影响延伸到了根本性的系统设计。训练操作与推理工作负载在内存访问模式上存在根本性的不同:由于梯度计算和激活缓存,反向传播需要 3-5 倍更高的内存带宽,这创造了纯计算指标无法捕捉的瓶颈。现代边缘加速器试图通过越来越专业的硬件特性来应对这些挑战。自适应精度数据路径允许在正向传递使用 INT4 和梯度计算使用 FP16 之间动态切换,在能源预算内优化准确性和效率。稀疏计算单元通过跳过零梯度来加速选择性参数更新,这对于高效的偏差仅适应和 LoRA 适应是关键能力。近内存计算架构 18 通过在权重存储附近直接执行梯度更新来降低数据移动成本,解决内存带宽瓶颈。然而,大多数当前的边缘加速器仍然在本质上针对推理工作负载进行优化,为未来一代专门设计用于处理本地适应独特需求的设备上训练加速器创造了显著的硬件-软件协同设计机会。

边缘硬件集成挑战

超越模型、数据和计算的个人限制,设备上的学习系统必须应对这些元素与移动计算底层物理(如功耗、热限制和能源预算)之间的复杂交互。这些物理限制不仅仅是工程细节,它们是基本的设计驱动因素,决定了设备上学习算法的整个可行空间。理解这些定量限制能够使设计决策更加明智,在平衡学习能力和长期系统可持续性以及用户接受度之间取得平衡。

能源和热限制分析

能量和热管理可能是设备上学习系统设计中最具挑战性的方面,因为它们直接影响用户体验和设备寿命。移动设备在严格的电源预算下运行,这从根本上决定了可行的模型复杂度和训练计划。移动处理器的热设计功耗(TDP)为设备上学习的各个方面创造了硬约束。现代智能手机通常将 ML 工作负载的持续处理能力维持在 2-3 W,以防止热不适,但在热管理显著降低性能 50%或更多之前,可以短暂地爆发出 5-10 W。这种热循环行为迫使训练算法在精心管理的高峰模式下运行,仅在 10-30 秒内利用峰值性能,然后降低到可持续的功率水平,这一约束从根本上改变了训练算法的设计方式。

移动电源预算层次结构揭示了设备上学习必须运行的严格约束。智能手机的持续处理能力限制在 2-3 W,以防止用户察觉到发热并保持一整天的可接受电池寿命。峰值训练突发模式可以达到 10 W,但这种功率水平只能持续 10-30 秒,然后热管理启动以保护硬件。专用神经网络单元用于 AI 工作负载,消耗 0.5-2 W,与通用处理器相比,提供优化的功耗效率。基于 CPU 的 AI 处理需要 3-5 W,并需要积极的温度管理以及轮换工作以防止过热,使其成为持续设备上学习最不节能的选项。

训练工作负载的功耗特性创造了额外的约束层,这些约束层超出了简单的计算能力。功耗随模型大小和训练复杂度的超线性增长,训练操作消耗的功率比等效推理工作负载多 10-50×\times,这是由于梯度计算(消耗 40-70%的训练功率)、权重更新(20-30%)和内存层次结构之间数据移动的显著增加(10-30%)的大量计算开销。为了保持可接受的用户体验,移动设备通常只为持续 ML 训练预留 500-1000 mW 的预算,实际上将实际训练时间限制在每天正常使用模式下的 10-100 分钟。这种严重的功耗约束从根本上改变了设计优先级,从最大化计算吞吐量转向优化功耗效率,需要仔细协同优化算法和硬件利用模式。

热管理挑战远远超出了简单的功率限制,创造了复杂且随环境条件和使用模式变化的动态约束。训练工作负载会产生局部热量,这可能会在特定的处理器核心或加速器单元中触发保护性降频,通常是以不可预测的方式,这取决于环境温度和设备设计。现代移动系统级芯片(SoC)实现了复杂的热管理系统,包括动态电压和频率缩放(DVFS)19、在效率集群和性能集群之间的核心迁移,以及选择性关闭非关键处理单元。成功部署在设备上的学习系统必须与这些热管理框架紧密集成,智能地安排在最佳热窗口期间进行训练爆发,并在接近热限制时优雅地降低性能,而不是简单地失败或导致用户可见的性能问题。

内存层次结构优化

补充热能和功率挑战,内存层次结构的约束为设备上的学习系统设计创造了另一个基本瓶颈。如上所述的约束放大分析所确立的,这些限制影响静态模型存储和训练期间的动态内存需求,通常会将系统推向其实际极限之外。

设备内存层次结构跨越不同设备类别,数量级跨度很大,每个类别都为设备上的学习提供了独特的约束。iPhone 15 Pro 提供了总共 8 GB 的系统内存,但在考虑到操作系统需求和后台进程后,只有大约 2-4 GB 可用于应用工作负载。预算型安卓设备运行时拥有总共 4 GB 的系统内存,在操作系统开销消耗了大量资源后,仅剩下 1-2 GB 可用于机器学习工作负载。物联网嵌入式系统提供 64 MB-1 GB 的总内存,这些内存必须在系统任务和应用数据之间共享,为任何学习算法创造了严重的约束。微控制器仅提供 256 KB-2 MB 的 SRAM,这要求极端优化和仔细的内存管理,从根本上限制了可以在这些平台上适应的模型复杂性。

训练过程中的内存扩展带来了特别严峻的挑战,这些挑战往往决定了系统的可行性。标准的反向传播需要在正向传递过程中为每一层缓存中间激活,然后在反向传递的梯度计算中重新使用,从而产生大量的内存开销。一个仅需要 14 MB 进行推理的 MobileNetV2 模型在训练过程中膨胀到 50-70 MB,通常超过了许多移动设备上的可用内存预算,使得没有积极的优化就无法进行训练。这种戏剧性的膨胀需要复杂的模型压缩技术,这些技术必须以乘法方式组合:INT8 量化提供4×4\times的内存减少,结构化剪枝实现10×10\times的参数减少,而知识蒸馏使得模型大小减少5×5\times,同时保持准确率在原始模型的 2-5%以内。这些技术必须谨慎组合,以实现实际部署所需的激进压缩比率。

在这些内存限制下,缓存优化对于在受限的内存池中实现可接受的性能变得绝对关键。现代移动 SoC 具有复杂的内存层次结构,包括 L1 缓存(32-64 KB)、L2 缓存(1-8 MB)和系统内存(4-16 GB),不同层级之间表现出 10-100 倍的延迟差异,当工作集超过缓存容量时,会形成严重的性能悬崖。超出缓存容量的训练工作负载由于内存带宽瓶颈而面临显著的性能下降,这可能导致训练速度降低几个数量级。成功的设备端学习系统必须精心设计数据访问模式以最大化缓存命中率,通常需要专门的内存布局来分组相关参数以实现空间局部性,精心设计的迷你批次以完全符合缓存限制,以及复杂的梯度累积策略以最小化昂贵的内存总线流量。

在训练过程中,内存带宽限制变得尤为突出。虽然推理工作负载主要按顺序读取模型权重,但训练需要双向数据流来进行梯度计算和权重更新。这种增加的内存流量可能会饱和内存子系统,形成瓶颈,限制训练吞吐量,无论计算能力如何。高级实现采用梯度检查点 20 等技术以计算换取内存,以及混合精度训练以降低带宽需求同时保持数值稳定性。

移动 AI 加速器优化

不同的移动平台提供了不同的加速能力,这些能力不仅决定了可实现的模型复杂度,还决定了可行的学习范式。这些加速器之间的架构差异从根本上塑造了设备上训练算法的设计空间,影响着从数值精度选择到梯度计算策略的各个方面。

当前一代的移动加速器在能力和优化重点上表现出显著的多样性。苹果的 A17 Pro 中的 Neural Engine 提供了 35 TOPS 的峰值性能,专门针对 8 位和 16 位操作,主要针对 CoreML 推理模式进行优化,对训练的支持有限,使其成为推理密集型适应技术的理想选择。高通的 Snapdragon 8 Gen 3 中的 Hexagon DSP 通过灵活的精度支持和可编程向量单元实现了 45 TOPS,能够实现混合精度训练工作流程,可以根据训练阶段和内存约束动态调整精度。谷歌的 Pixel 8 中的 Tensor TPU 针对 TensorFlow Lite 操作进行了优化,具有强大的 INT8 性能,并与联邦学习框架紧密集成,反映了谷歌对分布式学习场景的战略关注。能效比较揭示了为什么专用神经网络单元是必不可少的:NPUs 在每瓦特实现 1-5 TOPS,而通用 CPU 在每瓦特仅实现 0.1-0.2 TOPS,这代表了 5-50×\times的效率优势,这在设备上训练的可行性与不可行性之间划定了界限。

这些加速器不仅决定了原始性能,还决定了可行的学习范式和算法方法。苹果的神经网络引擎在固定精度推理工作负载方面表现出色,但为梯度计算的动态精度需求提供了有限的支持,使其更适合于推理密集型适应技术,如少样本学习。高通的 Hexagon DSP 通过其可编程向量单元和对混合精度算术的支持提供了更大的训练灵活性,使得在紧凑模型上实现更复杂的设备上训练成为可能,包括完整的反向传播。谷歌的 Tensor TPU 与联邦学习框架紧密集成,并为分布式训练场景提供了优化的通信原语。

架构的影响不仅限于计算吞吐量,还包括内存访问模式和数据处理优化。训练工作负载与推理具有根本不同的特性:由于上述讨论的放大效应,梯度计算需要显著更高的内存带宽,权重更新创建出写密集型的访问模式,而优化器状态管理需要额外的内存分配。现代边缘加速器正通过专用硬件特性来应对这些挑战,包括自适应精度数据路径,该路径可以动态地在 INT4(用于正向传递)和 FP16(用于梯度计算)之间切换,稀疏计算单元通过跳过零梯度来加速选择性参数更新,以及近内存计算架构,通过在权重存储附近直接执行梯度更新来降低数据移动成本。

然而,目前大多数边缘加速器主要针对推理工作负载进行优化,这为硬件和软件协同设计提供了巨大的机会。未来的设备上训练加速器需要高效地处理本地适应的独特需求,包括支持动态精度缩放、高效的梯度累积以及针对训练工作负载双向数据流模式优化的专用内存层次结构。架构选择影响着从模型量化策略和梯度计算方法到联邦通信协议和热管理策略的各个方面。

全面的资源管理策略

上述约束分析揭示了三个基本挑战类别,这些类别定义了设备上学习设计空间。每个约束类别直接驱动相应的解决方案支柱,形成了一种系统化的工程方法来应对这个复杂系统问题。约束到解决方案的映射自然地来自于理解特定限制如何需要特定的技术响应。

资源放大效应——训练使内存需求增加 3-10 倍,计算成本增加 2-3 倍,能耗成比例增加——直接需要模型适应方法。当由于资源限制而无法进行传统训练时,系统必须在保持学习能力的同时,从根本上减少参数更新的范围。

信息稀缺约束——局部数据集有限、非独立同分布分布、数据共享的隐私限制和最小监督——直接推动了数据效率解决方案。当由于局部信息不足而导致传统数据密集型方法失败时,系统必须从最少的示例中提取最大的学习信号。

协调挑战——设备异质性、间歇性连接、分布式验证复杂性和可扩展性要求——直接推动了联邦协调机制。当设备上的独立学习限制了集体智慧时,系统必须能够在设备群体之间实现隐私保护的协作。

如表 14.2 所示,这种约束到解决方案的映射创建了一个系统性的工程框架,其中每个支柱解决部署挑战的特定方面,同时与其他部分相整合。而不是将这些视为独立的技术,成功的设备上学习系统编排所有三种方法,以创建在边缘约束内有效运行的协调一致的自适应系统。

表 14.2:约束-解决方案映射:设备上学习的三个基本约束类别通过直接必要性驱动相应的解决方案。

约束类别 关键挑战 解决方案
资源放大 • 训练工作负载(3-10 倍内存) • 内存限制 • 功率限制 模型适应 • 参数高效更新 • 选择性层微调 • 低秩适应
信息稀缺 • 局部数据集有限 • 非独立同分布分布 • 数据共享的隐私限制 数据效率• 少样本学习• 元学习 • 迁移学习
协调挑战 • 设备异质性 • 间歇性连接 • 分布式验证 联邦协调 • 隐私保护聚合 • 坚固的通信协议 • 异步参与

后续章节将系统地检查每个解决方案支柱,基于第十章(第十章)中的优化原则和第十三章(第十三章)中的分布式系统框架。每个支柱都提供了其他单个支柱无法提供的必要功能,但它们的集成创造了能够在边缘部署环境的严格约束下进行有意义适应的系统。

模型适应

上述的计算和内存限制为模型训练创造了一个具有挑战性的环境,但它们也揭示了当系统性地处理时,清晰的解决方案路径。模型适应代表了设备端学习系统工程的第一个支柱:通过减少参数更新的范围,在边缘约束内使训练可行,同时保持足够模型的表达性以实现有意义的个性化。

工程挑战集中在导航一个基本权衡空间:适应表达性与资源消耗。在一种极端情况下,更新所有参数提供最大灵活性,但超出了边缘设备的处理能力。在另一种极端情况下,不进行适应可以保留资源,但无法捕捉到用户特定的模式。有效的设备端学习系统必须在中间地带运行,根据三个关键工程标准选择适应策略。

首先,可用的内存、计算和能源决定了哪些适应方法是可行的。具有 1MB RAM 的智能手表需要与具有 8GB RAM 的手机采用完全不同的策略。其次,用户特定差异的程度驱动了适应复杂性的需求。简单的偏好学习可能只需要偏差更新,而复杂的领域迁移则需要更复杂的方法。第三,适应技术必须与第十三章(第十三章)中建立的现有推理管道、联邦协调协议和运营监控系统相集成。

这种系统视角指导了从轻量级方法(第 14.4.1 节)开始的选择和组合,并逐步过渡到更复杂的方法(第 14.4.3 节),从仅包含偏差的轻量级方法逐步过渡到更具表达性但资源密集型的方法。每种技术代表工程权衡空间中的不同点,而不是一个孤立的算法解决方案。

基于第十章中的压缩技术,设备上的学习将压缩从一次性优化转变为持续约束。驱动所有模型调整方法的中心洞察是,对于设备上的学习场景,完全重新训练模型既不必要也不可行。相反,系统可以战略性地利用预训练表示,并仅适应捕获局部变化所需的最小参数子集,遵循的原则是:保留全局有效的内容,适应局部重要的事项。

本节系统地检查了三种互补的调整策略,每种策略都是专门为解决不同的设备约束配置和应用需求而设计的。权重冻结通过仅更新偏置项或最终层来应对严重的内存限制,即使在其他情况下缺乏任何形式适应资源的严重受限的微控制器上也能实现学习。结构化更新使用低秩和残差调整来平衡模型的表达能力和计算效率,在保持可管理资源需求的同时,允许比仅偏置方法更复杂的学习。稀疏更新允许根据梯度重要性或层关键性进行选择性的参数修改,将学习能力集中在最有影响的参数上,而将不那么重要的权重冻结。

这些方法在既定的架构原则基础上,战略性地应用优化策略来解决边缘部署的独特挑战。每种技术都代表了在基本精度-效率权衡空间中经过仔细考虑的点,使得在边缘硬件能力的全范围内实现实用部署成为可能——从超受限的微控制器到功能强大的移动处理器。

权重冻结

使设备上的学习成为可能的最直接方法之一是显著减少需要更新的参数数量。实现这种减少的最简单和最有效的策略之一是冻结模型的大部分参数,并仅适应精心选择的极小子集。在这个家族中最广泛使用的方法是仅偏置调整,其中所有权重都保持固定,仅在训练期间更新偏置项(通常是线性或卷积层之后的标量偏移量)。这个简单的约束带来了显著的好处:它减少了可训练参数的数量(通常减少 100-1000×\times),简化了反向传播期间的内存管理,并在训练数据稀疏或噪声时有助于减轻过拟合。

考虑一个标准的神经网络层:y=Wx+b y = W x + b 其中 Wm×nW \in \mathbb{R}^{m \times n} 是权重矩阵,bmb \in \mathbb{R}^m 是偏置向量,xnx \in \mathbb{R}^n 是输入。在完整训练中,计算了WWbb的梯度。在仅偏置适应中,我们约束:W=0,b0 \frac{\partial \mathcal{L}}{\partial W} = 0, \quad \frac{\partial \mathcal{L}}{\partial b} \neq 0 因此,只有偏置通过梯度下降进行更新:bbηb b \leftarrow b - \eta \frac{\partial \mathcal{L}}{\partial b}

这减少了存储的梯度数和优化器状态数,使得在内存受限条件下也能进行训练。在缺少浮点单元的嵌入式设备上,这种减少使得设备上的学习成为可能。

列表 14.1 中的代码片段展示了如何在 PyTorch 中实现仅偏置适应。

列表 14.1:仅偏置适应:冻结模型参数中的偏置以减少内存使用,并允许设备上的学习。

# Freeze all parameters
for name, param in model.named_parameters():
    param.requires_grad = False

# Enable gradients for bias parameters only
for name, param in model.named_parameters():
    if "bias" in name:
        param.requires_grad = True

这种模式确保只有偏置项参与反向传播和优化器更新,简化了训练过程同时保持适应能力。当将预训练模型适应于特定用户或设备本地数据时,其中核心表示仍然相关但需要校准,这非常有价值。

TinyTL 的实际有效性通过 TinyTL 框架得到证明,该框架专门设计用于在微控制器和其他严重内存受限平台上高效地适应深度神经网络。在训练期间,TinyTL 并不是更新所有网络参数(在如此受限的设备上不可能实现),而是战略性地冻结卷积权重和批量归一化统计信息,仅训练偏置项以及在某些情况下轻量级的残差组件。这种架构限制在反向传播期间对内存需求产生了深远的影响,因为最大的内存消耗者(中间激活)不再需要存储以进行冻结层之间的梯度计算。

当将标准训练与 TinyTL 方法进行比较时,这种方法的架构影响变得清晰。图 14.5 展示了传统模型与 TinyTL 方法在设备上适应的根本区别。考虑到之前建立的边缘设备内存限制,TinyTL 方法通过消除存储冻结层激活的需求,从根本上改变了内存方程,使得在边缘设备的严重内存限制下进行适应成为可能。

图片

图 14.5:TinyTL 通过冻结卷积权重和批量归一化,仅更新偏置项和轻量级残差连接来降低设备上训练的成本。这种方法允许在资源受限的边缘设备上部署深度神经网络,这些设备具有有限的 SRAM,从而在不要求完整参数更新的情况下实现高效的模型适应。

与之相反,TinyTL 架构冻结了所有权重,并且只更新在卷积层之后插入的偏置项。这些偏置模块轻量级且占用内存最小,使得在显著减少内存占用的情况下实现高效训练成为可能。冻结的卷积层充当固定的特征提取器,并且只有可训练的偏置组件参与适应。通过避免存储完整的激活图并限制更新参数的数量,TinyTL 允许在设备上在严重资源限制下进行训练。

由于基础模型保持不变,TinyTL 假设预训练的特征对于下游任务来说足够表达。偏置项允许模型行为发生微小但有意义的变化,尤其是在个性化任务中。当领域变化更为显著时,TinyTL 可以选择性地结合小的残差适配器来提高表达能力,同时保持系统的紧凑内存和能耗配置文件。

这些设计选择使得 TinyTL 能够将训练内存使用量减少 10 倍。例如,使用 TinyTL 对 MobileNetV2 模型进行自适应可以将更新参数的数量从超过 300 万个减少到少于 50,000 个 21。结合量化,这允许在只有几百千字节内存的设备上进行本地自适应——使得在受限环境中进行设备学习真正可行。

结构化参数更新

虽然权重冻结提供了计算效率和清晰的内存界限,但它通过限制自适应到一个小参数子集,严重限制了模型的表达能力。当仅偏置更新不足以捕捉复杂的领域变化或用户特定的模式时,残差和低秩技术提供了增强的自适应能力,同时保持了计算上的可处理性。这些方法代表了权重冻结的极端效率和无限制微调的完全表达能力之间的中间地带。

与修改现有参数不同,这些方法通过添加可训练组件——残差自适应模块(Houlsby 等人,2019)或低秩参数化(E. J. Hu 等人,2021)——来扩展冻结模型,这些组件提供了受控的模型容量增加。这种架构方法使得更复杂的自适应成为可能,同时保持了使设备学习可行的计算优势。

这些方法通过添加可训练层来扩展冻结模型,这些层通常很小且计算成本低,使得网络能够对新数据进行响应。网络的主要部分保持不变,而只有添加的组件被优化。这种模块化使得该方法非常适合在受限环境中进行设备上的自适应,在这种环境中,必须提供能够带来有意义变化的小更新。

基于适配器的自适应

一种常见的实现方法是在预训练模型中的现有层之间插入适配器,这些适配器是小的残差瓶颈层。考虑在层之间传递的隐藏表示hh。一个残差适配器引入了一种转换:h=h+A(h) h' = h + A(h) 其中 A()A(\cdot) 是一个可训练的函数,通常由两个带有非线性函数的线性层组成:A(h)=W2σ(W1h) A(h) = W_2 , \sigma(W_1 h) 其中 W1r×dW_1 \in \mathbb{R}^{r \times d}W2d×rW_2 \in \mathbb{R}^{d \times r},其中 rdr \ll d。这种瓶颈设计确保每个层只引入少量参数。

适配器在冻结的骨干网络上充当可学习的扰动。由于它们体积小且应用稀疏,因此它们几乎不会增加内存开销,但它们允许模型根据新的输入调整其预测。

低秩技术

另一种高效策略是将权重更新本身约束到低秩结构。而不是更新完整的矩阵 WW,我们将更新近似为:ΔWUV \Delta W \approx U V^\top 其中 Um×rU \in \mathbb{R}^{m \times r}Vn×rV \in \mathbb{R}^{n \times r},其中 rmin(m,n)r \ll \min(m,n)。这减少了可训练参数的数量,从 mnmn 减少到 r(m+n)r(m + n)

这种分解背后的数学直觉与基本的线性代数原理相联系:任何矩阵都可以通过奇异值分解表示为秩为 1 的矩阵之和。通过将我们的更新约束到低秩(通常是 r=4r = 41616),我们捕捉到最重要的变化模式,同时减少参数。对于一个典型的维度为 768×768768 \times 768 的 transformer 层,全微调需要更新 589,824 个参数。使用秩-4 分解,我们只更新 768×4×2=6,144768 \times 4 \times 2 = 6,144 个参数,减少了 96%,同时在经验上保留了 85-90%的适应质量。

在自适应过程中,新的权重计算如下:Wadapted=Wfrozen+UV W_{\text{adapted}} = W_{\text{frozen}} + U V^\top

这种公式在 LoRA(低秩自适应)22 技术中常用,最初是为 transformer 模型开发的(E. J. Hu 等,2021),但适用于各种架构。从系统工程的角度来看,LoRA 解决了设备学习中部署的关键连接性和资源权衡问题。

考虑一个移动部署场景,其中 7B 参数的语言模型需要 14GB 进行完全微调——这在典型的 6-8GB 总内存的智能手机上是不可能的。使用 16 秩的 LoRA 可以将可训练参数减少到约 100MB(原始的 0.7%),从而在移动内存限制内实现本地自适应。

在间歇性连接场景中,LoRA 的效率变得至关重要。通过蜂窝网络进行完整模型更新需要 14GB 的下载(潜在成本 140+美元的移动数据费用),而 LoRA 适配器更新通常为 10-50MB。对于定期的联邦协调,设备可以在 3G 网络上在 30 秒内同步 LoRA 适配器,而完整模型传输可能需要数小时。这即使在网络条件较差的情况下也使得实用的联邦学习成为可能。

系统通常根据设备能力部署不同的 LoRA 配置——旗舰手机使用 32 秩适配器以实现更高的表达能力,中端设备使用 16 秩以实现平衡的性能,而预算设备使用 8 秩以保持在 2GB 内存限制内。低秩更新可以在边缘设备上高效实现,尤其是在UUVV很小且支持定点表示的情况下(列表 14.2)。

列表 14.2:低秩适配器:该代码通过使用矩阵(u)和(v)近似权重更新来实现低秩适配器模块,减少参数数量,同时使边缘设备上的高效模型自适应成为可能。

class Adapter(nn.Module):
    def __init__(self, dim, bottleneck_dim):
        super().__init__()
        self.down = nn.Linear(dim, bottleneck_dim)
        self.up = nn.Linear(bottleneck_dim, dim)
        self.activation = nn.ReLU()

    def forward(self, x):
        return x + self.up(self.activation(self.down(x)))

此适配器向一个冻结层添加了一个小的残差变换。当将其插入到更大的模型中时,只有适配器参数会被训练。

边缘个性化

当全局模型部署到多个设备上并且必须适应特定于设备的输入分布时,适配器很有用。在智能手机摄像头管道中,环境光照、用户偏好或镜头畸变在不同用户之间会有所不同(Rebuffi、Bilen 和 Vedaldi 2017)。可以通过使用几个残差模块来冻结共享模型并针对每个设备进行微调,从而实现轻量级个性化,而不会导致灾难性遗忘。在基于语音的系统中,适配器模块已被证明可以降低个性化语音识别中的词错误率,而无需重新训练完整的声学模型。它们还允许轻松回滚或在不同用户特定版本之间切换。

性能与资源权衡

残差和低秩更新在表达性和效率之间取得了平衡。与仅使用偏差的学习相比,它们可以模拟从预训练任务中更显著的偏差。然而,它们在训练和推理过程中需要更多的内存和计算资源。

在考虑设备上学习的残差和低秩更新时,出现了几个重要的权衡。首先,与仅使用偏差的方法相比,这些方法在适应性质量上始终表现出优越性,尤其是在部署在涉及从原始训练数据到显著分布变化的场景中(Quiñonero-Candela 等人 2008)。这种改进的适应性源于它们增加的参数容量和能够学习更复杂变换的能力。

这种增强的适应性是有代价的。引入额外的层或参数不可避免地会增加前向和反向传递期间的内存需求和计算延迟。虽然与完整模型训练相比,这些增加是微不足道的,但在部署到资源受限的设备时必须考虑这一点。

实施这些适应技术需要系统级支持动态计算图和选择性地注入可训练参数的能力。并非所有部署环境或推理引擎都默认支持这些功能。

残差适应技术在移动和边缘计算场景中已被证明是有价值的,在这些场景中,设备有足够的计算资源。现代智能手机和平板电脑可以适应这些更新,同时保持可接受的性能特征。这使得残差适应成为需要个性化但无需重新训练完整模型开销的应用的实际选择。

稀疏更新

随着我们从仅偏置更新通过低秩自适应到更复杂的技术,稀疏更新代表了我们模型自适应层次中最先进的方法。虽然前一种技术添加了新参数或限制更新到特定子集,但稀疏更新动态地识别出为每个特定任务或用户提供最大自适应益处的现有参数。这种方法在保持边缘部署所需的计算效率的同时,最大化了自适应的表达能力。

即使通过上述技术将自适应限制在少量参数上,在受限制的设备上进行训练仍然资源密集。稀疏更新通过仅选择性地更新与任务相关的模型参数子集,而不是修改整个网络或引入新模块,来解决这一挑战。这种方法被称为任务自适应稀疏更新(X. Zhang, Song, and Tao 2020),代表了原则性参数选择策略的顶峰。

关键的洞察是,深度模型的不是所有层都对新的任务或数据集的性能提升做出同等贡献。如果我们能识别出对自适应影响最大的最小参数子集,我们就可以只训练这些参数,从而在降低内存和计算成本的同时,仍然实现有意义的个性化。

稀疏更新设计

设一个神经网络由参数θ={θ1,θ2,,θL}\theta = {\theta_1, \theta_2, \ldots, \theta_L}跨越LL层定义。在标准微调中,我们计算所有参数的梯度并进行更新:θiθiηθi,for i=1,,L \theta_i \leftarrow \theta_i - \eta \frac{\partial \mathcal{L}}{\partial \theta_i}, \quad \text{for } i = 1, \ldots, L

在任务自适应稀疏更新中,我们选择一个小的子集𝒮{1,,L}\mathcal{S} \subset {1, \ldots, L},使得只有𝒮\mathcal{S}中的参数被更新:θi{θiηθi,if i𝒮θi,otherwise \theta_i \leftarrow \begin{cases} \theta_i - \eta \frac{\partial \mathcal{L}}{\partial \theta_i}, & \text{if } i \in \mathcal{S} \ \theta_i, & \text{otherwise} \end{cases}

挑战在于在内存和计算约束下选择最优子集𝒮\mathcal{S}

层选择

选择𝒮\mathcal{S}的一个原则性策略是使用贡献分析——这是一种经验方法,用于估计每个层对下游性能改进的贡献程度。例如,可以独立地测量更新每个层的边际增益:

  1. 冻结整个模型。

  2. 解冻一个候选层。

  3. 简短微调并评估验证准确性的改进。

  4. 按每单位成本(例如,每 KB 的可训练内存)的性能增益对层进行排名。

这种层级分析产生了一个排名,根据这个排名可以在内存预算的限制下构建𝒮\mathcal{S}

一个具体的例子是 TinyTrain,这是一种旨在允许设备上快速适应的方法(C. Deng, Zhang, and Wu 2022)。TinyTrain 在预训练模型的同时,还预训练了元梯度,以捕捉哪些层对新的任务最为敏感。在运行时,系统根据任务特性和可用资源动态选择要更新的层。

选择性层更新实现

这种模式可以通过分析逻辑扩展,根据贡献分数或硬件配置文件选择层,如列表 14.3 所示(ch020.xhtml#lst-selective-update)。

列表 14.3:选择性层更新:这项技术允许在保持其他层冻结的同时微调预训练模型的特定层,从而优化计算资源以实现针对性的改进。来源:PyTorch 文档

# Assume model has named layers: ['conv1', 'conv2', 'fc']
# We selectively update only conv2 and fc

for name, param in model.named_parameters():
    if "conv2" in name or "fc" in name:
        param.requires_grad = True
    else:
        param.requires_grad = False

TinyTrain 个性化

考虑一个场景,用户佩戴一个执行实时物体识别的增强现实头盔。随着光照和环境的变化,系统必须适应以保持准确性——但训练必须在短暂的空闲期间或充电时进行。

TinyTrain 通过在离线准备期间使用元训练来实现这一点:模型不仅学习执行任务,还学习哪些参数对于适应最为重要。然后,在部署时,设备执行针对当前环境的任务自适应稀疏更新,仅修改与当前环境最相关的少数层。这保持了适应的快速性、节能性和内存感知性。

适应策略权衡

任务自适应稀疏更新引入了几个重要的系统级考虑因素,必须仔细平衡。首先,贡献分析的开销,尽管主要发生在预训练或初始分析期间,代表了一个非微不足道的计算成本。这种开销通常是可以接受的,因为它发生在离线时,但它必须纳入整体系统设计和部署流程中。

其次,当使用稀疏更新时,适应过程的不稳定性变得重要。如果选定的参数太少,模型可能无法很好地拟合目标分布,无法捕捉到重要的局部变化。这表明在部署前需要对选定的参数子集进行仔细验证,可能需要结合适应能力的最小阈值。

第三,选择可更新参数时必须考虑目标平台的特定硬件特性。除了考虑梯度幅度之外,系统必须评估在部署硬件上更新特定层的实际执行成本。一些参数可能显示出高贡献分数,但在某些架构上更新成本高昂,需要一种更细致的选择策略,以平衡统计效用和运行时效率。

尽管存在这些权衡,任务自适应稀疏更新提供了一种强大的机制,可以将适应扩展到各种部署环境,从微控制器到移动设备(Levy 等人 2023)。

适应策略比较

每种设备学习自适应策略都提供了表达性、资源效率和实现复杂度之间的独特平衡。在设计针对各种部署目标的系统时,理解这些权衡很重要——从超低功耗微控制器到功能丰富的移动处理器。

仅偏差的自适应是最轻量级的方法,它只更新每层的标量偏移量,同时冻结所有其他参数。这显著降低了内存需求和计算负担,使其适用于内存和能源预算紧张的设备。然而,由于其表达能力有限,它最适合于预训练模型已经捕捉到大多数相关任务特征,并且只需要进行少量局部校准的应用。

剩余自适应,通常通过适配器模块实现,向冻结的神经网络主干引入少量可训练参数。这比仅偏差更新提供了更大的灵活性,同时仍然保持对自适应成本的掌控。由于主干保持固定,训练可以在受限条件下高效且安全地进行。这种方法支持跨任务和用户的模块化个性化,使其成为需要适度自适应能力的移动环境中的优选选择。

任务自适应稀疏更新通过选择性地仅更新对下游性能有贡献的子集层或参数,为特定任务的微调提供了最大的潜力。虽然这种方法允许表达性的局部自适应,但它需要一个层选择机制,通过配置文件、贡献分析或元训练来实现,这引入了额外的复杂性。然而,当谨慎部署时,它允许在准确性和效率之间进行动态权衡,尤其是在经历大规模领域转移或输入条件演变的系统中。

这三种方法形成了一个权衡的谱系。它们的相对适用性取决于应用领域、可用硬件、延迟约束和预期的分布变化。表 14.3 总结了它们的特征:

表 14.3:自适应策略权衡:表条目通过量化其对可训练参数、内存开销、表达能力、对不同用例的适用性和系统要求的影响,来描述模型自适应的三种方法——仅偏差更新、选择性层更新和完全微调。这些特征揭示了在动态环境中部署机器学习系统时,模型灵活性、计算成本和性能之间的固有权衡。

技术 可训练参数 内存开销 表达能力 适用用例 系统要求
仅偏置更新 仅偏置项 最小 简单个性化;低方差 极端内存/计算限制
残差适配器 适配器模块 中等 中等到高 移动设备上的用户特定调整 带运行时支持的移动级 SoC
稀疏层更新 选择性参数子集 变量 高(任务自适应) 实时适应;领域迁移 需要配置文件或元训练

数据效率

通过模型技术建立了资源高效的适应机制后,我们遇到了设备上学习系统工程的第二个支柱:从严重受限的数据中最大化学习信号。这代表了从传统机器学习系统所假设的数据丰富环境到边缘部署信息稀缺现实的基本转变。

系统工程挑战集中在关键权衡上:数据收集成本与适应质量。边缘设备面临严重的数据获取约束,这以在集中式训练中未遇到的方式重塑了学习系统设计。理解和导航这些约束需要系统地分析四个相互关联的工程维度。

首先,每个数据点都有获取成本,包括用户摩擦、能耗、存储开销和隐私风险。一个从音频样本学习的语音助手必须平衡改进潜力与电池消耗和用户对始终开启录音的舒适度。其次,有限的数据收集能力迫使系统在广泛覆盖和深入示例之间做出选择。一个移动键盘可以收集许多浅层打字模式或较少的详细交互序列,每种策略都意味着不同的学习方法。第三,某些应用需要从最小示例中快速学习(紧急响应场景),而其他应用可以随着时间的推移积累数据(用户偏好学习)。这个时间维度驱动了基本架构选择。第四,数据效率技术必须与第 14.4 节中的模型适应方法、联邦协调(第 14.6 节)以及第十三章中建立的运营监控相结合。

这些工程约束创建了一个系统性的权衡空间,其中不同的数据效率方法服务于不同组合的约束。成功的设备上学习系统通常结合多种方法,每种方法都针对数据稀缺挑战的特定方面。

本节探讨了四种互补的数据效率策略,这些策略针对数据稀缺挑战的不同方面。少样本学习允许从最少的标记示例中进行适应,使系统可以根据用户提供的少量样本进行个性化,而不是需要大量的训练数据集。流式更新适应随着时间的推移逐渐到达的数据,使设备在正常操作中遇到新模式时能够持续适应,而无需收集和存储大量批次。经验重放通过智能重用最大化从有限数据中的学习,多次重放重要示例以从稀缺的训练数据中提取最大的学习信号。数据压缩在保留学习信号的同时减少内存需求,使系统能够在边缘设备的严格内存约束内维护重放缓冲区和训练历史。

每种技术都针对数据约束问题的不同方面,即使在传统监督学习失败的情况下也能实现稳健的学习。

少样本学习和数据流

在传统的机器学习工作流程中,有效的训练通常需要大量的标记数据集,这些数据集经过精心策划和预处理,以确保足够的多样性和平衡。相比之下,设备上的学习通常必须从少量本地示例开始——这些示例通过用户交互或环境感知被动收集,并且很少以监督方式标记。这些限制促使两种互补的适应策略:少样本学习,其中模型从一个小而静态的示例集中泛化,以及流式适应,其中更新随着数据的到达而持续进行。

少样本适应在设备观察少量标记或弱标记实例的新任务或用户条件下尤其相关 (Yaqing Wang 等人 2020)。在这种情况下,在不过度拟合的情况下进行所有模型参数的全量微调往往是不可行的。相反,采用如仅更新偏差、适配器模块或基于原型的分类等方法来利用有限的数据,同时最小化记忆能力。用 D={(xi,yi)}i=1KD = {(x_i, y_i)}_{i=1}^K 表示在设备上收集的标记示例的 KK 个少样本数据集。目标是更新模型参数 θ\theta 以在以下约束条件下提高任务性能:

  • 有限的梯度步数:T100T \ll 100

  • 限制内存占用:θupdatedθ|\theta_{\text{updated}}| \ll |\theta|

  • 保持先前任务知识(以避免灾难性遗忘)

关键词检测 (KWS) 系统是少样本适应在现实世界、设备部署中的具体例子 (Warden 2018)。这些模型用于检测固定短语,包括“Hey Siri”23 或“OK Google”等短语,具有低延迟和高可靠性。一个典型的 KWS 模型由一个预训练的声学编码器(例如,一个小型卷积或循环网络,将输入音频转换为嵌入空间)和一个轻量级分类器组成。在商业系统中,编码器使用跨多种语言和说话人的数千小时标记语音进行集中训练。然而,由于数据稀缺和隐私问题,支持自定义唤醒词(例如,“Hey Jarvis”)或适应代表性不足的口音和方言通常通过集中训练是不可行的。

少样本自适应通过仅微调输出分类器或一小部分参数(包括偏差项),使用仅从设备上收集的几个示例语句来解决此问题。例如,用户可能提供 5-10 个自定义唤醒词的录音。然后,这些样本用于在本地更新模型,同时主编码器保持冻结以保持泛化并减少内存开销。这允许个性化,而无需额外的标记数据或向云端传输私人音频。

这种方法不仅计算效率高,而且与保护隐私的设计原则相一致。因为只有输出层被更新,通常涉及简单的梯度步骤或原型计算,总的内存占用和运行时计算与移动设备或甚至微控制器兼容。这使得关键词唤醒(KWS)成为边缘少样本学习的典型案例研究,在该研究中,系统必须在严格的约束下运行,同时提供用户特定的性能。

除了静态少样本学习之外,许多设备上的场景还可以从流式自适应中受益,其中模型必须随着新数据的到来逐步学习(Hayes 等人 2020)。流式自适应将这一想法推广到连续、异步的设置中,其中数据随时间逐步到达。用{xt}t=1{x_t}{t=1}^{\infty}表示一个观察流。在流式设置中,模型必须在观察每个新输入后更新自己,通常没有访问先前数据,并且内存和计算有限。模型更新可以写成通用形式:θt+1=θtηt(xt;θt) \theta = \theta_t - \eta_t \nabla \mathcal{L}(x_t; \theta_t) 其中 ηt\eta_t 是时间 tt 的学习率。这种自适应形式对输入分布中的噪声和漂移敏感,因此通常采用学习率衰减、元学习初始化或更新门控等机制来提高稳定性。

除了关键词语音识别(KWS)之外,这些策略的实际例子比比皆是。在可穿戴健康设备中,一个用于分类身体活动的模型可能从一个通用分类器开始,仅使用少量标记的活动片段来适应用户的特定运动模式。在智能助手中,用户语音配置文件会随着时间的推移通过持续的语音输入进行微调,即使没有明确监督的情况下也是如此。在这种情况下,包括纠正、重复或下游任务成功在内的本地反馈可以作为指导学习的隐含信号。

少样本和流式适应突显了从传统训练流程向在不确定性下的数据高效、实时学习的转变。它们构成了更高级记忆和重放策略的基础,我们将在下一部分进行探讨。

经验重放

经验重放通过维护先前学习阶段中代表性示例的缓冲区,在连续学习场景中解决了灾难性遗忘的挑战——即学习新任务导致模型忘记先前学习的信息。这种技术最初是为强化学习开发的(Mnih 等人 2015),在设备端学习中证明至关重要,因为顺序数据流可能导致模型过度拟合到最近的示例。

与依赖于大量数据集和广泛计算资源的服务器端重放策略不同,设备端重放必须在极其有限的容量下运行,通常只有几十或几百个样本,并且必须避免干扰用户体验(Rolnick 等人 2019)。缓冲区可能只存储压缩特征或精炼摘要,并且更新必须具有机会性(例如,在空闲周期或充电期间)。这些系统级约束重塑了在嵌入式机器学习背景下重放的实施和评估方式。

\mathcal{M}表示一个内存缓冲区,该缓冲区保留训练示例的固定大小子集。在时间步tt,模型接收一个新的数据点(xt,yt)(x_t, y_t)并将其添加到\mathcal{M}中。然后,基于重放的自适应更新从\mathcal{M}中采样一个批次{(xi,yi)}i=1k{(x_i, y_i)}{i=1}^{k},并应用梯度步:θt+1=θtηθ[1ki=1k(xi,yi;θt)] \theta = \theta_t - \eta \nabla_\theta \left[ \frac{1}{k} \sum_{i=1}^{k} \mathcal{L}(x_i, y_i; \theta_t) \right]其中θt\theta_t是模型参数,η\eta是学习率,\mathcal{L}是损失函数。随着时间的推移,这种重放机制允许模型在结合新信息的同时加强先前知识。

一种实用的设备上实现可能使用环形缓冲区来存储一小组压缩的特征向量,而不是完整的输入示例。如列表 14.4 所示,伪代码说明了为受限环境设计的最小重放缓冲区。

列表 14.4:重放缓冲区:实现了一种循环存储机制,用于在受限环境中进行高效的内存管理。这种方法允许模型有效地保留和从最近的数据点中采样,在利用历史信息的同时,结合新的见解。

# Replay Buffer Techniques
class ReplayBuffer:
    def __init__(self, capacity):
        self.capacity = capacity
        self.buffer = []
        self.index = 0

    def store(self, feature_vec, label):
        if len(self.buffer) < self.capacity:
            self.buffer.append((feature_vec, label))
        else:
            self.buffer[self.index] = (feature_vec, label)
        self.index = (self.index + 1) % self.capacity

    def sample(self, k):
        return random.sample(self.buffer, min(k, len(self.buffer)))

此实现维护一个固定容量的循环缓冲区,存储压缩表示(例如,最后一层的嵌入)和相关标签。此类缓冲区对于在不违反内存或能耗预算的情况下重放适应更新非常有用。

在 TinyML 应用 24 中,经验重放已被应用于诸如手势识别等问题,在这些问题中,设备必须持续改进预测,同时每天观察少量事件。而不是直接在流数据上训练,设备存储最近手势的代表性特征向量,并定期使用它们来微调分类边界。同样,在设备端关键词检测中,重放过去的语音可以改善唤醒词检测的准确性,而无需将音频数据传输到设备外。

虽然经验重放提高了数据稀疏或非平稳环境中的稳定性,但它引入了几个权衡。存储原始输入可能会违反隐私限制或超出存储预算,尤其是在视觉和音频应用中。从特征向量重放可以减少内存使用,但可能会限制上游层的梯度丰富性。对持久性闪存的写周期,这对于嵌入式设备上的长期存储通常是必要的,也可能引起磨损均衡问题。这些限制要求仔细协同设计内存使用策略、重放频率和特征选择策略,尤其是在持续部署场景中。

数据压缩

在许多设备端学习场景中,原始的训练数据可能太大、噪声过多或冗余,难以有效存储和处理。这促使人们使用压缩数据表示,将原始输入转换为低维嵌入或紧凑编码,在最小化内存和计算成本的同时保留显著信息。

压缩表示实现了两个互补的目标。首先,它们减少了存储数据的占用空间,使得设备能够在紧张的内存预算下维持更长的历史记录或重放缓冲区(Sanh 等人 2019)。其次,通过将原始输入投影到更结构化的特征空间,简化了学习任务,这些特征空间通常通过预训练或元学习获得,其中在最小监督下可以进行有效的适应。

一种常见的方法是使用预训练的特征提取器对数据点进行编码,并丢弃原始的高维输入。例如,一个图像 xix_i 可能会通过一个卷积神经网络(CNN)来生成一个嵌入向量 zi=f(xi)z_i = f(x_i),其中 f()f(\cdot) 是一个固定的特征编码器。这个嵌入以紧凑的表示捕捉视觉结构(例如,形状、纹理或空间布局),通常在 64 到 512 维之间,适合轻量级下游适应。

从数学上讲,训练可以通过压缩样本进行,使用轻量级的解码器或投影头处理 (zi,yi)(z_i, y_i)。让 θ\theta 代表这个解码模型的可训练参数,这通常是一个小型神经网络,它将压缩表示映射到输出预测。每当呈现一个示例时,模型参数都会通过梯度下降进行更新:θt+1=θtηθ(g(zi;θ),yi) \theta_{t+1} = \theta_t - \eta \nabla_\theta \mathcal{L}\big(g(z_i; \theta), y_i\big) 这里:

  • ziz_i 是第 ii 个输入的压缩表示,

  • yiy_i 是相应的标签或监督信号,

  • g(zi;θ)g(z_i; \theta) 是解码器的预测,

  • \mathcal{L} 是衡量预测误差的损失函数,

  • η\eta 是学习率,并且

  • θ\nabla_\theta 表示相对于参数 θ\theta 的梯度。

这种公式突出了为什么只需要训练一个紧凑的解码器模型,其参数集为 θ\theta,这使得即使在内存和计算有限的情况下,学习过程也是可行的。

高级方法通过学习表示数据使用低秩或稀疏系数矩阵的离散或稀疏字典,超越了固定编码器。一个传感器轨迹数据集可以被分解为 XDCX \approx DC,其中 DD 是基模式字典,而 CC 是指示每个示例中哪些模式是活跃的块稀疏系数矩阵。通过仅更新少量字典原子或系数,模型以最小的开销进行适应。

在隐私敏感的环境中,压缩表示被证明是有用的,因为它们允许在编码后丢弃或模糊原始数据。压缩作为一种隐式正则化器,在只有少量训练示例可用时,可以平滑学习过程并减轻过拟合。

在实践中,这些策略已经应用于诸如关键词检测等域,其中原始音频信号首先被转换为梅尔频率倒谱系数(MFCCs)25——这是语音功率谱的紧凑、有损表示。这些 MFCC 向量作为压缩输入用于下游模型,仅使用几 KB 的内存即可实现局部自适应。

数据效率策略比较

本节介绍的技术(少量样本学习、经验回放和压缩数据表示)为在数据稀缺或流式传输时在设备上适应模型提供了策略。它们在不同的假设和约束下运行,其有效性取决于系统级因素,如内存容量、数据可用性、任务结构和隐私要求。

当有少量但信息丰富的标记示例集可用时,少量样本适应表现出色,尤其是在需要个性化或快速任务特定调整时。它最小化了计算和数据需求,但它的有效性取决于预训练表示的质量以及初始模型与本地任务之间的对齐。

经验回放通过减轻遗忘和改善稳定性来处理持续适应,尤其是在非平稳环境中。它允许重用过去的数据,但需要存储示例的内存和周期性更新的计算周期。重放缓冲区也可能引起隐私或长期存储的担忧,尤其是在存储空间有限或闪存写入周期有限的设备上。

压缩数据表示通过将原始数据转换为紧凑的特征空间来减少学习占用的空间。这种方法支持更长时间的经验保留和高效的微调,尤其是在只有轻量级头部可训练的情况下。压缩可能会引入信息损失,如果固定编码器没有与部署条件良好对齐,它们可能无法捕捉到与任务相关的变化。表 14.4 总结了关键权衡:

表 14.4:设备上学习权衡:少量样本适应通过利用小型标记数据集在数据效率和模型个性化之间取得平衡,但需要在资源受限的设备上部署时仔细考虑内存和计算约束。该表总结了根据应用需求和可用资源选择适当的设备上学习技术时的关键考虑因素。

技术 数据需求 内存/计算开销 适用场景
少量样本适应 小型标记集(K 次射击) 个性化,快速设备微调
经验回放 流数据 中等(缓冲区与更新) 非平稳数据,漂移下的稳定性
压缩表示 未标记或编码数据 低到中等 内存受限设备,隐私敏感环境

在实践中,这些方法不是相互排斥的。许多现实世界的系统将它们结合起来,以实现稳健、高效的适应。例如,一个关键词检测系统可能使用压缩音频特征(例如,MFCCs),从一个小支持集中微调少量参数,并维护过去嵌入的重放缓冲区以进行持续优化。

这些策略共同体现了设备学习的核心挑战:在数据、计算和内存的持续约束下实现可靠的模型改进。

联邦学习

上述单个设备技术——从仅偏差更新到复杂的适配器模块——创造了强大的个性化能力,但在规模部署时揭示了根本性的限制。虽然每个设备可以有效地适应本地条件,但这些孤立的改进不能惠及更广泛的设备群体。关于模型鲁棒性、适应策略和故障模式的宝贵见解仍然被困在单个设备上,失去了使集中式训练有效的集体智慧。

这种限制在需要个人化和人口规模学习的场景中变得明显。模型适应和数据效率技术使单个设备能够在资源约束下有效地学习,但它们也揭示了一个基本的协调挑战,当复杂的本地学习遇到分布式部署的现实时出现。

考虑一个部署在 1000 万户家庭的语音助手。每个设备都根据其用户的语音、口音和词汇进行本地适应。设备 A 了解到“数据”发音为/ˈdeɪtə/,设备 B 了解到/ˈdætə/。设备 C 经常遇到罕见的短语“机器学习”(技术家庭),而设备 D 从未见过(非技术家庭)。经过六个月的本地适应:

  • 每个设备擅长其特定用户的模式,但只有这些模式

  • 罕见词汇在某些设备上学习,在其他设备上遗忘

  • 本地偏差在没有更广泛的群体纠正的情况下积累

  • 在一个设备上发现的宝贵见解对其他设备没有好处

虽然单个设备上的学习非常强大,但当设备在孤立状态下运行时,它面临着根本性的限制。每个设备只能观察到整个数据分布的一个狭窄切片,限制了泛化。设备的能力差异很大,在人口中造成了学习不平衡。在一个设备上学习的宝贵见解不能惠及其他设备,降低了整体系统智能。没有协调,模型可能会随着时间的推移而发散或退化,这是由于本地偏差造成的。

联邦学习成为解决分布式协调约束的解决方案。它实现了隐私保护的合作,其中设备在不共享原始数据的情况下为集体智慧做出贡献。与其将单个设备学习和协调学习视为不同的范例,联邦学习代表了当设备在规模上部署时的自然演变。这种方法将数据本地的约束从限制转变为隐私特性,允许系统从人口规模的数据中学习,同时保持个人信息的安全。

这里的隐私要求直接关联到安全和隐私原则,这些原则在生产部署中变得至关重要。与其将单个设备学习和协调学习视为不同的范例,不如说联邦学习是在大规模部署时设备系统的自然演变。

联邦学习是一种去中心化的训练方法,在这种方法中,分布式设备通过使用本地数据协同训练一个共享模型,而只交换模型更新,通过数据本地化来保护隐私

为了更好地理解联邦学习的作用,将其与其他学习范例进行对比是有用的。图 14.6 展示了离线学习、设备学习和联邦学习之间的区别。在传统的离线学习中,所有数据都集中收集和处理。模型在云中使用精选的数据集进行训练,然后部署到边缘设备而无需进一步适应。相比之下,设备学习允许使用设备本身生成的数据进行本地模型适应,支持个性化但孤立——不与用户共享见解。联邦学习通过允许本地训练同时协调全球更新来弥合这两个极端。它通过保持原始数据本地化来保留数据隐私,同时通过聚合来自许多设备的更新来从分布式模型改进中受益。

图片

图 14.6:联邦学习通过协调分布式设备上的本地训练,在数据隐私和集体模型改进之间取得平衡,与离线学习的集中式方法或设备学习的孤立适应方法不同。此图对比了每种范例如何处理数据位置和模型更新策略,揭示了个性化、数据安全和全球知识共享之间的权衡。

本节探讨了在移动和嵌入式系统背景下联邦学习的原理和实际考虑。它首先概述了标准的 FL 协议及其系统影响。然后讨论设备参与约束、通信高效的更新机制以及个性化学习的策略。在整个过程中,重点始终是如何通过使分布式模型训练跨越各种资源和受限的硬件平台来扩展设备学习的范围。

隐私保护协同学习

联邦学习(FL)是一种去中心化的范式,用于在设备群体中训练机器学习模型,而不需要将原始数据传输到中央服务器(McMahan 等人 2017c)。与传统集中式训练流程不同,后者需要在单个位置聚合所有训练数据,联邦学习将训练过程本身进行分布。每个参与设备根据其本地数据计算更新,并通过聚合协议向全局模型做出贡献,通常由中央服务器协调。这种训练架构的转变与移动、边缘和嵌入式系统的需求紧密一致,在这些系统中,隐私、通信成本和系统异构性对集中式方法施加了重大限制。

如前所述的应用领域所示——从 Gboard 的键盘个性化到可穿戴健康监测再到语音界面——联邦学习弥合了模型改进与本章中建立的系统级约束之间的差距。它实现了设备学习的个性化、隐私和连接性优势,同时通过协调但分布的训练来应对资源约束。然而,这些优势也引入了新的挑战,包括客户端的可变性、通信效率和非-IID 数据分布,这些都需要专门的协议和协调机制。

在此基础上,本节剩余部分探讨了定义设备上联邦学习的核心技术和权衡,检查了治理跨设备协调的核心学习协议,并研究了调度、通信效率和个性化的策略。

学习协议

联邦学习协议定义了设备协作训练共享模型的规则和机制。这些协议规定了如何计算、聚合和通信本地更新,以及设备如何参与训练过程。协议的选择对系统性能、通信开销和模型收敛有重大影响。

在本节中,我们概述了联邦学习协议的核心组件,包括本地训练、聚合方法和通信策略。我们还讨论了不同方法相关的权衡及其对设备上机器学习系统的影响。

本地训练

本地训练是指单个设备根据其本地数据计算模型更新的过程。在联邦学习中,这一步骤至关重要,因为它允许设备在不传输原始数据的情况下,将共享模型适应其特定环境。本地训练过程包括以下步骤:

  1. 模型初始化:每个设备都会初始化其本地模型参数,通常是通过从服务器下载最新的全局模型来实现的。

  2. 本地数据采样:设备为其本地数据采样一个子集进行训练。这些数据可能是非-IID 的,这意味着它们可能不在设备之间均匀分布。

  3. 本地训练:设备在其本地数据上执行多次训练迭代,根据计算出的梯度更新模型参数。

  4. 模型更新:在本地训练后,设备计算模型更新(例如,更新后的参数与初始参数之间的差异)并准备将其发送到服务器。

  5. 通信:设备通过通常使用安全通信通道来保护用户隐私的方式将模型更新传输到服务器。

  6. 模型聚合:服务器从多个设备聚合更新以生成一个新的全局模型,然后将其分发给参与设备。

此过程会迭代重复,设备定期下载最新的全局模型并进行本地训练。这些更新的频率可以根据系统约束、设备可用性和通信成本而变化。

联邦聚合协议

联邦学习的核心是一个协调机制,它允许许多设备,每个设备只能访问一个小型本地数据集,共同训练一个共享模型。这是通过一个协议实现的,其中客户端设备在其本地数据上执行本地训练并将模型更新传输到中央服务器。服务器聚合这些更新以细化全局模型,然后将其重新分发给客户端进行下一轮训练。这种循环过程将学习过程与集中式数据收集解耦,非常适合本章中描述的移动和边缘环境,在这些环境中用户数据是私密的,带宽受限,设备参与是间歇性的。

此过程最广泛使用的基线是联邦平均(FedAvg)26,它已成为联邦学习的标准算法(McMahan 等人 2017c)。在 FedAvg 中,每个设备使用其私有数据上的随机梯度下降(SGD)训练其模型的本地副本。

形式上,用𝒟k\mathcal{D}k表示客户端kk上的本地数据集,用θkt\theta_k^t表示客户端kk在第tt轮次的模型参数。每个客户端在其本地数据上执行EE步 SGD,得到一个更新θkt+1\theta_k^{t+1}。然后中心服务器将这些更新汇总为:θt+1=k=1Knknθkt+1 \theta^{t+1} = \sum^{K} \frac{n_k}{n} \theta_k^{t+1} 其中 nk=|𝒟k|n_k = |\mathcal{D}_k| 是设备kk上的样本数量,n=knkn = \sum_k n_k 是参与客户端的总样本数量,KK是当前轮次中活跃设备的数量。

这种循环协调协议构成了联邦学习的基础,如图图 14.7 所示,该图阐明了核心 FedAvg 过程:

图片

图 14.7:联邦平均周期:四个步骤的协调协议,在保持数据隐私的同时实现分布式训练。(1)服务器将全局模型分发到参与客户端,(2)客户端使用多个 SGD 步骤在其私有数据上本地训练,(3)客户端将更新的模型权重(而非原始数据)发送回服务器,(4)服务器对客户端的更新进行加权平均,以创建新的全局模型。

这种基本结构引入了许多设计选择和权衡。本地步骤的数量EE影响计算和通信之间的平衡:较大的EE会减少通信频率,但如果本地数据分布差异太大,则存在发散的风险。参与客户端的选择影响收敛稳定性和公平性。在实际部署中,并非所有设备在所有时间都可用,硬件能力可能差异很大,需要强大的参与调度和容错能力。

客户端调度

联邦学习基于这样的假设:持有本地数据的客户端、设备,会定期可用以参与训练轮次。在现实世界的系统中,客户端的可用性是间歇性和变化的。设备可能会关闭,断开电源,缺乏网络访问,或者在其他情况下无法在任何给定时间参与。因此,客户端调度在分布式学习的有效性和效率中起着核心作用。

在基本水平上,联邦机器学习系统定义了参与资格标准。设备必须满足最低要求,如插电、连接到 Wi-Fi 和空闲,以避免干扰用户体验或耗尽电池资源。这些标准决定了在任意训练轮次中被认为是“可用”的总人口子集。

除了这些操作过滤器之外,设备在硬件能力、数据可用性和网络条件方面也存在差异。一些智能手机包含许多与当前任务相关的最新示例,而其他设备则包含过时或不相关的数据。网络带宽和上传速度可能因地理位置和运营商基础设施而大相径庭。因此,随机选择客户端可能导致对底层数据分布的覆盖不足和模型收敛不稳定。

可用性驱动的选择引入了参与偏差:具有有利条件(包括频繁充电、高端硬件和稳定的连接)的客户端更有可能反复参与,而其他客户端则可能系统地代表性不足。这可能导致生成的模型偏向于特权子集的行为和偏好,从而引发公平性和泛化问题。

当检查实际部署统计时,参与偏差的严重性变得明显。联邦学习的部署研究表明,最活跃的 10%的设备可以贡献超过 50%的训练轮次,而底部的 50%的设备可能根本不参与。这形成了一个反馈循环:模型变得越来越优化,以适应高端设备和稳定连接的用户,这可能会降低最需要适应的资源受限用户的性能。一个键盘预测模型可能会偏向于使用旗舰手机并夜间充电的用户的手指打字模式,从而忽略了来自预算设备或非规律充电模式用户的语言变化。

为了应对这些挑战,系统必须在调度效率和客户多样性之间取得平衡。一个关键的方法是采用分层或配额制的抽样,以确保不同群体中代表性的客户参与。一些系统实施了“公平预算”,以跟踪累积参与情况,并在可用时积极优先考虑代表性不足的设备。其他系统使用重要性抽样技术,根据估计的群体统计数据重新加权贡献,而不是根据原始参与率。例如,基于异步缓冲区的技术允许参与客户独立贡献模型更新,而不需要在每一轮中都进行同步协调(Nguyen 等人 2021)。该模型已被扩展以包含陈旧度感知(Rodio 和 Neglia 2024)和公平机制(J. Ma 等人 2024),防止过度活跃的客户在训练过程中可能产生的偏差。

为了应对这些挑战,联邦机器学习系统实施了自适应客户选择策略。这包括优先考虑代表性不足的数据类型的客户,针对较少采样的地理或人口统计特征,以及使用历史参与数据来强制执行公平约束。系统采用预测建模来预测未来客户的可用性或成功率,从而提高训练吞吐量。

被选中的客户在其私有数据上执行一个或多个本地训练步骤,并将他们的模型更新传输到中央服务器。这些更新被汇总形成一个新的全局模型。通常,这种汇总是加权的,其中每个客户的贡献按比例缩放,例如,在训练期间使用的本地示例数量,然后再进行平均。这确保了具有更代表性或更大数据集的客户对全局模型产生成比例的影响。

这些调度决策直接影响系统性能。它们影响收敛速度、模型泛化、能耗和整体用户体验。不良的调度可能导致过多的延迟者、过度拟合到狭窄的客户端段或浪费计算。因此,客户端调度不仅仅是物流问题;它是联邦学习系统设计中一个核心组件,需要算法洞察和基础设施级别的协调。

带宽感知更新压缩

联邦机器学习系统中的一个主要瓶颈是边缘客户端和中央服务器之间通信的成本。在每轮训练后传输完整的模型权重或梯度可能会耗尽带宽和能源预算,尤其是对于在受限无线链路上运行的移动或嵌入式设备 27。为了解决这个问题,已经开发了一系列技术来减少通信开销,同时保持学习效率。

这些技术主要分为三个类别:模型压缩、选择性更新共享和架构分区。

模型压缩方法旨在通过量化 28、稀疏化或子采样来减少传输更新的大小。客户端不是发送全精度梯度,而是传输 8 位量化更新或仅通信具有最高幅度的前kk梯度元素 29。

选择性更新共享通过仅传输模型参数或更新的子集进一步减少通信。在分层选择性共享中,客户端仅更新某些层,通常是最终的分类器或适配器模块,同时保持大多数骨干层冻结。这减少了上传成本和将共享表示过度拟合到非代表性客户端数据的风险。

分割模型和架构分区将模型分为共享的全局组件和私有的本地组件。客户端独立训练和维护其私有模块,同时仅与服务器同步共享部分。这允许进行用户特定的个性化,同时最小化通信和隐私泄露。

所有这些方法都在联邦聚合协议的背景下运行。聚合的标准基线是联邦平均(FedAvg),其中服务器通过计算在给定轮次中接收到的客户端更新的加权平均值来更新全局模型。令 𝒦t\mathcal{K}t 表示第 tt 轮次中参与的客户端集合,并令 θkt\theta_k^t 表示客户端 kk 的本地更新模型参数。服务器计算新的全局模型 θt+1\theta^{t+1} 如下: θt+1=k𝒦tnkn𝒦tθkt \theta^{t+1} = \sumt} \frac{n_k}{n_t}} \theta_k^t

在这里,nkn_k 表示客户端 kk 的本地训练样本数量,而 n𝒦t=k𝒦tnkn_{\mathcal{K}t} = \sum_t} n_k 表示所有参与客户端的总训练样本数量。这种基于数据权重的聚合确保了拥有更多训练数据的客户端对全局模型产生成比例更大的影响,同时也考虑了部分参与和异构数据量。

然而,通信高效的更新可能会引入权衡。压缩可能会降低梯度精度,选择性更新可能会限制模型容量,而分割架构可能会复杂化协调。因此,有效的联邦学习需要仔细平衡带宽限制、隐私关注和收敛动态——这种平衡在很大程度上取决于客户端群体的能力和多样性。

联邦个性化

虽然压缩和通信策略提高了可扩展性,但它们并没有解决全球联邦学习范式的一个重要限制——无法捕捉用户特定的变化。在实际部署中,设备通常会观察到不同且异构的数据分布。当统一应用于不同用户时,一个通用的全局模型可能会表现不佳。这促使了个性化联邦学习的需求,在这种学习中,本地模型会根据用户特定的数据进行调整,同时不损害全球协调的好处。

θk\theta_k 表示客户端 kk 上的模型参数,以及 θglobal\theta_{\text{global}} 表示汇总的全局模型。传统的联邦学习旨在最小化全局目标:minθk=1Kwkk(θ) \min_\theta \sum_{k=1}^K w_k \mathcal{L}_k(\theta) 其中 k(θ)\mathcal{L}_k(\theta) 是客户端 kk 上的局部损失,而 wkw_k 是一个权重因子(例如,与本地数据集大小成比例)。然而,这种公式假设单个模型 θ\theta 可以很好地服务于所有用户。在实践中,局部损失景观 k\mathcal{L}_k 在客户端之间往往差异很大,反映了非独立同分布的数据分布和不同的任务需求。

个性化修改了这个目标,允许每个客户端维护自己的适应参数 θk\theta_k,这些参数与全局模型和本地数据都进行了优化:minθ1,,θKk=1K(k(θk)+λ(θk,θglobal)) \min_{\theta_1, \ldots, \theta_K} \sum_{k=1}^K \left( \mathcal{L}k(\theta_k) + \lambda \cdot \mathcal{R}(\theta_k, \theta{\text{global}}) \right)

在这里,\mathcal{R} 是一个正则化项,它惩罚与全局模型的偏差,而 λ\lambda 控制这种惩罚的强度。这种公式允许局部模型根据需要偏离,同时仍然从全局协调中受益。

实际应用案例说明了这种方法的重要性。考虑一个可穿戴的健康监测器,它通过追踪生理信号来分类身体活动。虽然全局模型可能在整个人群中表现良好,但个别用户表现出独特的运动模式、步态特征或传感器放置。对最终分类层或低秩适配器的个性化微调可以提升准确性,尤其是在处理罕见或特定用户类别时。

出现了几种个性化策略来解决计算开销、隐私和适应速度之间的权衡。一种广泛使用的方法是本地微调,其中每个客户端下载最新的全局模型,并使用其私有数据执行少量梯度步骤。虽然这种方法简单且保护隐私,但当全局模型与客户端的数据分布不匹配或本地数据集极其有限时,它可能产生次优结果。

另一种有效技术涉及个性化层,其中模型被划分为共享骨干和轻量级、客户端特定的头部——通常是最终的分类层(Arivazhagan et al. 2019)。仅在设备上更新头部,显著减少了内存使用和训练时间。这种方法特别适合于客户端之间主要差异在于输出类别或决策边界的情况。

集群联邦学习通过根据客户端数据或性能特征的相似性对客户端进行分组,并为每个集群训练单独的模型,提供了一种替代方案。这种策略可以在同质子群体中提高准确性,但引入了额外的系统复杂性,可能需要交换元数据以确定群体成员资格。

最后,元学习方法,如模型无关元学习(MAML),旨在产生一个全局模型初始化,该初始化可以通过仅进行少量本地更新快速适应新任务(Finn, Abbeel, and Levine 2017)。当客户端数据有限或在频繁分布变化的环境中操作时,这项技术特别有用。这些策略反映了权衡空间中的不同点。这些策略在系统影响方面有所不同,包括计算开销、隐私保证和适应延迟。表 14.5 总结了权衡。

表 14.5:个性化权衡:联邦学习策略在个性化与系统成本之间取得平衡,影响计算开销、隐私保护和针对不同客户端群体的适应速度。本表总结了本地微调、集群学习和元学习如何各自在这个权衡空间中导航,在考虑实际部署约束的同时实现定制模型。

策略 个性化机制 计算开销 隐私保护 适应速度
本地微调 在聚合后的本地损失上进行梯度下降 低到中等 高(无数据共享) 快速(少量步骤)
个性化层 分割模型:共享基础 + 用户特定头部 中等 快速(训练小型头部)
集群联邦学习 根据数据相似性分组客户端,按组训练 中等到高 中等(组元数据) 中等
元学习 训练以快速适应不同任务/设备 高(元目标) 非常快(少样本)

选择适当个性化方法取决于部署约束、数据特征以及所需在准确性、隐私和计算效率之间的平衡。在实践中,通常采用结合多种策略的混合方法,包括在个性化头部之上进行本地微调,以在异构设备上实现稳健的性能。

联邦隐私

虽然联邦学习通常是由隐私关注所驱动,因为它涉及将原始数据本地化而不是传输到中央服务器,但这种范式引入了自己的一套安全和隐私风险。尽管设备不会共享它们的原始数据,但传输的模型更新(如梯度或权重变化)可能会无意中泄露关于底层私有数据的详细信息。模型反演攻击和成员推断攻击等技术表明,攻击者可能通过分析这些更新部分重建或推断本地数据集的属性。

为了减轻这些风险,现代联邦机器学习系统通常采用保护措施。安全聚合协议确保单个模型更新被加密并以一种方式聚合,使得服务器只能观察到综合结果,而不是任何单个客户端的贡献。差分隐私 30 技术将精心校准的噪声注入到更新中,以数学上限制可以推断关于任何单个客户端数据的任何信息。

虽然这些技术增强了隐私性,但它们引入了额外的系统复杂性,并在模型效用、通信成本和鲁棒性之间引入了权衡。对这些攻击、防御及其影响的更深入探索需要专门覆盖分布式机器学习系统中的安全原则。

大规模设备编排

联邦学习将机器学习转化为一个巨大的分布式系统挑战,这远远超出了传统的算法考虑。协调数千或数百万具有间歇性连接的异构设备需要复杂的分布式系统协议,这些协议能够处理拜占庭故障、网络分区和前所未有的通信效率。这些挑战与数据中心分布式训练的受控环境根本不同,在那里高带宽网络和可靠的基础设施使得简单的协调协议变得简单。

网络和带宽优化

通信瓶颈是联邦学习系统中主要的可扩展性约束。理解定量传输需求使得关于模型架构、更新压缩策略和确定系统可行性的客户端参与策略的设计决策具有原则性。

联邦通信层次结构揭示了分布式学习必须运行的严重带宽限制。对于典型的深度学习模型,每次训练轮次需要 10-500 MB 的全模型同步——这在实际中对于平均上传带宽仅为 5-50 Mbps 的有限上传带宽的移动网络来说是不可行的。梯度压缩通过量化(将 FP32 减少到 INT8)、稀疏化(仅传输非零梯度)和选择性梯度传输(仅发送最重要的更新)实现了 10-100×\times的压缩。实际部署需要更加激进的 100-1000×\times压缩比率,将 100 MB 的模型压缩到可管理的 100 KB-1 MB 更新,这样移动设备可以在合理的时间内传输,而不会耗尽数据计划。通信频率在模型更新新鲜度和网络效率限制之间引入了一个关键的权衡——更频繁的更新能够更快地适应变化条件,但同时也限制了可持续的带宽消耗。

网络基础设施的限制直接影响到参与率和整个系统的可行性。现代 4G 网络在最佳条件下通常提供 5-50 Mbps 的上传速度(存在显著的地理和运营商差异),这意味着 8 MB 的模型更新需要 1.3-13 秒的持续传输。然而,现实世界的移动网络表现出极大的可变性:农村地区可能只有 1 Mbps 的上传速度,而城市 5G 部署则能实现 100+ Mbps。这种 100×\times的网络能力差异需要自适应的通信策略,以优化最低共同连接性,同时使高能力设备能够更有效地做出贡献。

通信需求与参与率之间的关系表现出明显的阈值效应。实证研究表明,需要超过 10 MB 模型转移的联邦学习系统,其持续客户端参与率低于 10%,而保持更新低于 1 MB 的系统可以在多样化的移动人群中维持 40-60%的参与率。这种通信效率直接转化为模型质量的提升:更高的参与率提供了更好的统计多样性和更稳健的全局模型更新梯度估计。

高级压缩技术对于实际部署变得至关重要。梯度量化将精度从 FP32 降低到 INT8 甚至二进制表示,实现了 4-32×\times的压缩,同时最小化精度损失。稀疏化技术只传输最大的梯度分量,利用神经网络更新中的自然稀疏性。Top-k 梯度选择进一步减少通信,只传输最重要的参数更新,而误差累积确保小梯度不会永久丢失。

异步设备同步

联邦学习在分布式系统和机器学习的复杂交叉点上运行,既继承了这两个领域的根本挑战,又引入了由边缘设备的移动性、异构性和不可靠性带来的独特复杂性。

联邦学习必须应对比典型分布式系统挑战更广泛的拜占庭容错要求。设备故障频繁发生,因为客户端在训练轮次中崩溃、断电或断开连接,这比传统分布式训练中的服务器故障更为常见。恶意更新带来了安全担忧,因为敌对客户端可以故意提供损坏的梯度,这些梯度旨在降低全局模型性能或从聚合过程中提取私人信息。实现拜占庭容错平均的鲁棒聚合协议确保了系统可靠性,尽管这些协议引入了显著的计算开销。共识机制必须在没有传统分布式共识协议(如 Paxos 或 Raft)开销的情况下协调数百万不可靠的参与者,这些协议是为小型可靠服务器集群设计的。

网络分区对联邦协调协议提出了特别严峻的挑战。与传统在可靠数据中心网络中运行的分布式系统不同,联邦学习必须优雅地处理长时间客户端断开事件,在这些事件中,设备可能因旅行、在覆盖较差的区域或简单断电而离线数小时或数天。异步协调协议能够在缺少参与者的情况下继续训练进度,但必须仔细平衡陈旧性(接受可能过时的贡献)与新鲜性(优先处理最近但可能稀疏的更新)。

故障恢复和弹性策略是联邦学习基础设施的一个基本层。通过定期全局模型快照进行检查点同步,可以在服务器故障时进行恢复,并在检测到损坏的训练轮次时提供回滚点,尽管在数百万设备上检查点同步大型模型会引入大量的存储和通信开销。部分更新处理确保系统在大量客户端在训练过程中失败或断开连接时能够优雅地处理不完整的训练轮次,需要仔细的加权策略来防止偏向更可靠的设备群体。状态协调协议使客户端在长时间离线后(可能是几天或几周)能够高效地与当前全局模型重新同步,同时最小化可能压倒带宽受限设备的通信开销。动态负载均衡解决不均匀的客户端可用性模式,这些模式会创建计算热点,需要智能地在可用的参与者之间重新分配负载,以维持训练吞吐量,尽管参与率随时间变化。

联邦协调的异步性质在保持训练收敛保证方面引入了额外的复杂性。传统的同步训练假设所有参与者都完成每一轮,但联邦系统必须优雅地处理落后者和退出者。例如,FedAsync31 这样的技术可以实现异步聚合,其中服务器在客户端更新到达时持续更新全局模型,而有限的陈旧机制防止过时的更新破坏最近的进展。

管理百万设备异构性

真实世界的联邦学习部署在多个维度上同时表现出极端的异构性:硬件能力、网络条件、数据分布和可用性模式。这种多维异构性从根本上挑战了传统分布式机器学习关于在相似条件下操作的同质参与者假设。

现实世界的联邦学习部署面临着多维度的设备异质性,这导致每个系统维度都存在极端的差异性。计算差异跨越了 1000×\times的差异,这是在 35 TOPS 运行的旗舰智能手机和仅运行在 0.03 TOPS 的物联网微控制器之间的处理能力差异,从根本上限制了可以在不同设备层级上训练的模型。内存限制在设备类别之间表现出更为显著的 100-10,000×\times的差异,从微控制器上的 256KB 到高端智能手机上的 16 GB 不等,这决定了设备是否可以进行任何本地训练,或者必须完全依赖推理。能量限制迫使训练会话必须围绕充电模式、热约束和电池保护要求进行仔细安排,移动设备通常将机器学习工作负载限制在 500-1000 mW 的持续功耗。网络多样性引入了数量级的性能差异,因为 WiFi、4G、5G 和卫星连接表现出截然不同的带宽(从 1 Mbps 到 1 Gbps)、延迟(10 ms 到 600 ms)和可靠性特征,这些特征决定了可行的更新频率和压缩要求。

自适应协调协议通过复杂的分层参与策略解决这种异质性,优化了整个设备谱系中的资源利用率。高能力设备,如旗舰智能手机,可以执行带有大批量数据和多个时代的复杂本地训练,而资源受限的物联网设备则通过轻量级更新、专用子任务或甚至简单的数据聚合来做出贡献。这创造了一个自然的计算层次结构,其中强大的设备充当“超级对等节点”,执行不成比例的计算,而边缘设备则贡献专门的本地知识和覆盖范围。

规模挑战远远超出了设备异质性,扩展到了基本的协调开销限制。传统的分布式共识算法,如 Raft 或 PBFT,是为受控环境中的数十个节点设计的,但联邦学习需要在不可靠网络上协调数百万参与者。这需要分层协调架构,其中区域聚合服务器通过在贡献全球聚合之前执行本地共识来减少通信开销。边缘计算基础设施提供了自然的分层协调点,使联邦学习系统能够利用现有的内容分发网络(CDNs)和移动边缘计算(MEC)部署,以实现高效的梯度聚合。

现代联邦系统实施复杂的客户端选择策略,在统计多样性和实际约束之间取得平衡。随机抽样确保了无偏代表性,但可能会选择许多低能力设备,而基于能力的选择可以提高训练效率,但存在统计偏差的风险。混合方法在设备层级之间使用分层抽样,确保了统计代表性以及计算效率。这些选择策略还必须考虑时间模式:办公室工作人员的设备可能在特定时间段内可用,而物联网传感器提供连续但有限的计算资源。

生产集成

之前建立的理论基础——模型适应性策略、数据效率技术和联邦协调算法——为设备上学习系统提供了构建块。然而,将这些单个组件转换为生产就绪系统需要解决跨越所有约束维度的集成挑战。

现实世界的部署引入了超过单个技术总和的系统复杂性。模型适应性、数据效率和联邦协调必须无缝协作,而不是作为独立的优化。不同的学习策略具有不同的计算和内存配置文件,必须在整体设备预算内进行协调。训练、推理和通信必须仔细安排,以避免干扰用户体验和系统稳定性。与具有可观察训练循环的集中式系统不同,设备上学习需要分布式验证和故障检测机制,这些机制在异构设备群体中运行。

这种从理论到实践的转变需要系统性的工程方法,在平衡相互竞争的约束条件的同时保持系统可靠性。成功的设备上学习部署不依赖于单个算法的改进,而依赖于整体系统设计,该设计在操作约束内协调多种技术。接下来的部分将探讨生产系统如何通过原则性的设计模式、操作实践和监控策略来应对这些集成挑战,这些策略使得可扩展、可靠的设备上学习部署成为可能。

MLOps 集成挑战

将设备上学习集成到现有的 MLOps 工作流程中需要扩展第十三章中建立的运营框架,以处理分布式训练、异构设备和隐私保护协调。前一章中讨论的持续集成管道、模型版本控制系统和监控基础设施提供了基本基础,但必须适应以解决独特的边缘部署挑战。标准 MLOps 管道假设集中式数据访问、受控部署环境和统一的监控能力,这些能力不直接适用于边缘学习场景,需要新的方法来管理早期建立的债务管理和技术卓越原则。

部署流程转换

传统 MLOps 部署流程来自第十三章,遵循标准化的 CI/CD 流程:单个模型实体的模型训练、验证、预部署和生产部署到统一的基础设施。设备上学习需要设备感知的部署流程,该流程在不同异构设备层级上分配不同的适应策略。微控制器接收仅偏置的更新,中端手机使用 LoRA 适配器,而旗舰设备执行选择性层更新。部署实体从静态模型文件演变为一系列适应策略、初始模型权重和设备特定的优化配置。

这种架构转变需要扩展传统部署流程,包括设备能力检测、策略选择逻辑和分层部署编排,以保持传统 MLOps 的可靠性保证,同时适应前所未有的部署多样性。

这种转变在版本管理中引入了新的复杂性。虽然集中式系统维护单个模型版本,但设备上的学习系统必须同时跟踪多个版本维度。分发到所有设备的预训练骨干代表基础模型版本,它作为所有本地适应的基础。针对每个设备类别部署的不同更新机制构成了适应策略,从微控制器上的简单偏差调整到旗舰设备上的完整层微调。随着设备遇到独特的数据分布,本地模型状态自然会与基础模型分离,创建反映个别适应历史的设备特定检查点。最后,定期同步设备群体的联邦学习轮次建立了聚合时期,标志着分布式知识汇聚到更新后的全局模型的离散点。成功的部署实施分层版本方案,其中基础模型缓慢演变——通常通过每月更新——而本地适应则持续进行,从而创建了一个类似于传统部署中熟悉的线性版本历史的高级版本空间。

监控系统演变

第十三章 建立了从集中式推理服务器聚合指标的性能监控实践。设备上的学习监控必须在本质上不同的约束条件下运行,这些约束条件重塑了系统如何观察、测量以及对分布式设备群体中的模型行为做出反应的方式。

隐私保护遥测代表了与传统监控的第一个根本性区别。在不损害用户隐私的情况下收集性能指标需要联邦分析,其中设备仅共享汇总统计信息或差分隐私摘要。系统不能像集中式系统那样简单地记录单个预测或训练样本。相反,设备报告分布摘要,如平均准确性和置信度直方图,而不是每个实例的指标。所有报告的统计数据都必须包含差分隐私保证,这些保证通过精心校准的噪声添加来限制信息泄露。安全聚合协议防止服务器观察到单个设备的贡献,确保即使聚合过程本身也无法从任何单个设备的数据中重建隐私信息。

漂移检测在没有访问到地面实况标签的情况下提出了额外的挑战。传统的监控将模型预测与维护在集中式基础设施上的标记验证集进行比较。设备上的系统必须在部署期间仅使用本地信号来检测漂移。置信度校准跟踪预测概率是否与经验频率相匹配,当模型的置信度估计与实际结果校准不良时,检测到退化。输入分布监控通过不需要标签的统计技术检测特征分布从训练数据中发生的变化。任务性能代理利用隐式反馈,如用户更正或任务放弃,作为质量信号,指示模型未能满足用户需求。阴影基线比较在适配模型旁边运行冻结的基础模型,以测量偏差,标记出本地适应相对于已知良好的基线性能下降而不是提高的情况。

异构性能跟踪解决了一个第三大关键挑战:当设备群体表现出高方差时,全局平均值会掩盖关键故障。监控系统必须在多个维度上分割性能,以识别影响特定设备群体的系统性问题。基于能力的性能差距表明,旗舰设备与预算设备相比取得了显著更好的结果,这表明针对资源受限的硬件,适应性策略可能需要调整。当模型在某些地理市场上表现良好而在其他市场上表现不佳时,区域偏差问题就会显现出来,这可能反映了数据分布的变化或文化因素,这些因素在初始训练期间没有被捕捉到。当运行过时的基础模型且未从联邦聚合中接收最近更新的设备性能下降时,就会出现时间模式。当比较经常适应的设备与很少参与训练的设备时,参与不平等变得明显,这揭示了学习收益在用户群体中分配的潜在公平性问题。

持续训练编排

在第十三章中介绍的传统的持续训练在具有可预测资源可用性和协调执行的集中式基础设施上执行计划中的重新训练作业。设备上的学习将此转变为持续分布式训练,其中数百万台设备独立训练,无需全局同步,从而产生了需要根本不同的协调策略的编排挑战。

异步设备协调代表了从集中式训练的第一个重大转变。数百万台设备在其本地数据上独立训练,但编排系统不能依赖于同步参与。由于网络连接限制、电池约束和不同的使用模式,通常只有 20-40%的设备在任何一轮训练中可用。系统必须表现出对落后者的容忍度,确保在有限硬件或较差网络连接上的慢速设备不会阻碍快速设备进行其本地适应。设备通常同时运行在不同的基础模型版本上,这会创建版本偏差,聚合协议必须优雅地处理,而无需强制所有设备保持相同的模型状态。当设备在长时间离线后重新连接时——可能是几天或几周——状态协调变得必要,需要系统整合它们累积的本地适应,尽管它们已经错过了多次联邦聚合轮次。

资源感知调度确保训练过程既尊重设备限制,也考虑用户体验。编排策略实施机会主义训练窗口,仅在设备空闲、充电且连接到 WiFi 时执行适应,避免干扰活跃用户任务或消耗计费蜂窝数据。当设备温度超过制造商指定的阈值时,热预算会暂停训练,防止因持续的计算负载导致用户不适和硬件损坏。电池保护策略将训练能耗限制在每天不超过电池容量的 5%,确保设备上的学习不会明显影响用户视角下的设备运行时间。网络感知通信在设备必须使用计费连接时,会积极压缩模型更新,以减少带宽消耗,从而降低用户数据费用,以换取计算开销的降低。

没有全局可见性的收敛评估构成了最终的编排挑战。传统的训练监控在集中式验证集上损失曲线,提供关于训练进度和收敛的明确信号。分布式训练必须通过跨设备群体汇总的间接信号来评估收敛。联邦评估从维护本地保留集的设备中汇总验证指标,尽管设备参与不完全,但提供对全局模型质量的近似度量。更新幅度跟踪监控每个聚合轮次中本地梯度对全局模型的影响程度,更新大小的减少表明可能已收敛。参与多样性确保在汇总更新中广泛代表设备,防止收敛指标仅反映部署环境的狭窄子集。时间一致性检测模型改进在多个聚合轮次中达到平台期,表明当前适应性策略已耗尽其潜在收益,可能需要调整。

验证策略适应性

第十三章中的验证方法假设可以访问保留的测试集和集中式评估基础设施,可以直接将模型质量与已知的真实情况进行比较。设备上的学习需要分布式验证,在尊重隐私和资源限制的同时,仍能为异构设备群体提供可靠的质量信号。

影子模型评估通过在每个设备上维护多个模型变体并比较其行为来提供主要的验证机制。设备同时运行一个基线影子模型——最后已知良好基模型的冻结副本,提供一个稳定的参考点——以及当前本地适应的版本,该版本反映了最近的设备上训练。许多系统还维护最新的联邦聚合结果作为全局模型变体,使个人设备适应与从整个设备群体汇总的集体知识之间的比较成为可能。通过比较这些变体在传入数据流中的预测,系统检测到本地适应相对于既定的基线性能下降。这种比较在正常操作期间持续进行,无需额外的标记验证数据。当适应的模型持续低于基线影子模型时,系统触发自动回滚到已知良好的版本,防止性能下降在生产中持续存在。

基于置信度的质量门在标签验证数据不可用的情况下提供额外的验证信号。在没有地面真实标签的情况下,系统使用预测置信度作为质量代理,这与模型性能相关。校准良好的模型应在与其训练数据相似的分布样本上表现出高置信度,置信度得分应准确反映正确预测的概率。置信度下降表明可能是分布偏移——输入数据不再匹配训练分布——或者模型因问题性的局部适应而退化。基于阈值的门控通过持续监控平均预测置信度,并在置信度低于初始部署期间建立的基线水平时暂停适应来实现这种验证机制。这种方法可以捕捉许多故障模式,而无需标记的验证数据,尽管它不能检测到所有性能问题,因为过于自信但错误的预测可以保持高置信度得分。

联邦 A/B 测试允许在分布式设备群体中验证新的适应策略或模型架构。为了验证所提出的更改,系统实施分布式实验,随机将设备分配到治疗组和对照组,同时保持设备层级和用法模式之间的统计平衡。两组都使用隐私保护聚合协议收集联邦度量,这些协议防止个人设备数据泄露,同时允许进行人口水平比较。系统比较适应成功率——衡量局部适应如何频繁地超过基线模型——以及收敛速度,这表明设备达到最佳性能的速度有多快,以及最终性能指标,这些指标反映了适应完成后模型的最终质量。在治疗组中显示出明显改进的成功策略将逐步推广到设备群体中,从小的百分比开始,只有在确认好处可以推广到实验群体之外后才会扩大。

这些操作转换需要新的工具和基础设施,这些工具和基础设施系统地扩展了传统的 MLOps 实践,从第十三章开始。为集中部署建立的 CI/CD 管道、监控仪表板、A/B 测试框架和事件响应程序构成了设备学习操作的基础。联邦学习协议(第 14.6 节)提供了分布式训练的协调机制,而监控挑战(第 14.9.3 节)则解决了由去中心化适应产生的可观察性差距。

成功的设备上学习部署建立在经过验证的 MLOps 方法之上,同时适应了分布式、异构学习环境的独特挑战。这种进化方法确保了操作可靠性,同时实现了边缘学习的益处。

生物启发学习效率

设备上学习的约束反映了生物智能系统解决的基本挑战,为高效学习设计提供了理论见解。理解这些联系使得能够采用基于原理的方法来利用数十亿年的进化优化进行资源受限的机器学习。

从生物神经效率中学习

人类大脑在持续从有限的监督中学习的同时,以大约 20 瓦的功率运行——这正是设备上学习系统的效率目标 32。这种非凡的效率源于几个直接影响边缘学习设计的架构原则,展示了理论上高度优化的学习系统可以达到什么水平。

大脑的效率特性揭示了设备上系统应针对的多个优化维度。从功耗角度来看,大脑总共消耗 20 W 的功率,其中大约 10 W 用于主动学习和记忆巩固——这种能量预算与移动设备在充电期间可持续分配给设备上学习的能量相当。内存效率来源于稀疏、分布式的表示,在任何认知任务中,只有 1-2%的神经元同时激活,与密集神经网络相比,大大减少了计算和存储需求。学习效率通过少样本学习能力体现,这种能力使得可以从单一暴露中适应,以及通过连续适应机制,在整合新知识时避免灾难性遗忘。分层处理在多个尺度上组织信息,从低级感官输入到高级抽象推理,使得在不同任务和环境中高效重用学习到的特征。

生物学习表现出几个特征,设备上系统必须复制以实现类似的效率。稀疏表示确保了有限的神经资源的有效利用——在任何认知任务中,只有大脑神经元的一小部分会激活。这种稀疏性直接对应于移动部署中必不可少的精选参数更新和剪枝架构。事件驱动处理通过仅在感官输入变化时激活计算来最小化能耗,类似于设备空闲期间的机会训练。

未标记数据利用策略

移动设备持续收集丰富的传感器流,非常适合自监督学习:来自摄像头的视觉数据、来自加速度计的时间模式、来自 GPS 的空间模式以及来自触摸屏使用的交互模式。这大量的未标记数据使得在没有外部监督的情况下进行复杂的表示学习成为可能。

移动设备上传感器数据生成的规模为自监督学习创造了前所未有的机遇。每秒 30 帧的摄像头视觉流每天提供约 260 万帧图像,为通过比较相同图像的增强版本来学习视觉表示的对比学习方法提供了大量数据 33。以 100 Hz 采样率的加速度计生成的运动数据每天产生 860 万个数据点,捕捉适合学习人类活动和设备运动表示的时间模式。来自 GPS 传感器的位置轨迹通过捕捉运动模式和频繁访问的位置,无需显式标签,实现空间表示学习和行为预测。来自触摸事件、打字动态和应用使用序列的交互模式创建了丰富的行为嵌入,揭示了用户偏好和习惯,从而实现无需手动标注的个性化模型适应。

从时间相关性中进行对比学习为利用这些传感器数据提供了特别有前景的机遇。移动摄像头的连续帧自然为视觉表示学习提供正对,毫秒之差捕获的图像通常是从略微不同的角度看到的同一场景,而诸如颜色抖动和随机裁剪等增强技术则创建了负例。麦克风中的音频流通过掩码和预测任务实现自监督语音表示学习,其中模型学习预测音频频谱图的掩码部分。甚至设备方向和运动数据也可以用于活动识别模型的自我监督预训练,学习捕捉人类运动时间结构的表示,而无需标记的活动注释。

生物启发的思想扩展到持续学习而不遗忘。大脑通过突触巩固和重放等机制持续整合新的经验,同时保留数十年的记忆。设备上的系统必须实现类似机制:弹性权重巩固通过保护对先前任务重要的权重来防止灾难性遗忘,经验重放通过交替新训练和先前任务的回放示例来维持适应期间的稳定性,而渐进式神经网络架构随着新任务的涌现而扩展模型容量,而不是将所有知识都强制纳入固定容量的网络。

永续适应而不遗忘

真实世界的设备端部署需要不断适应不断变化的环境、用户行为和任务需求。这提出了稳定性-塑性权衡的基本挑战:模型必须保持足够的稳定性以保留现有知识,同时足够塑性以学习新模式。

在边缘设备上进行持续学习面临几个相互关联的挑战,这些挑战加剧了分布式适应的难度。当新的学习覆盖了之前获得的知识时,会发生灾难性遗忘,导致模型在适应新任务时性能下降,尤其是在设备无法访问历史训练数据的情况下这是一个特别严重的问题。当多个学习目标争夺有限的模型容量时,会出现任务干扰,迫使模型在必须同时保持的不同能力之间做出艰难的权衡。数据分布变化表现为部署环境与训练条件显著不同,要求模型适应新模式的同时保持对原始分布的性能。

元学习方法通过学习学习算法本身来解决这些挑战,而不仅仅是学习特定任务。模型无关元学习(MAML)训练模型以使用最少的数据快速适应新任务——这正是个性化设备端适应所必需的,在收集大型用户特定数据集不切实际的情况下。少样本学习技术允许从小的用户特定数据集中快速专业化,使模型能够仅基于少量示例进行个性化,同时保持预训练期间学习到的通用能力。

理论基础表明,最优的设备端学习系统将结合稀疏表示、基于传感器数据的自监督预训练以及元学习以实现快速适应。这些原则直接影响实际系统设计:稀疏模型架构降低内存和计算需求,自监督目标利用丰富的未标记传感器数据,而元学习则使模型能够从有限的用户交互中实现高效个性化。

构建实用系统的关键原则是尽量减少适应足迹。在边缘平台上进行全模型微调通常不可行,因此,应优先考虑局部更新策略,包括仅优化偏差、残差适配器和轻量级任务特定头部。这些方法允许在资源受限的情况下实现模型专业化,同时减轻过拟合或不稳定的风险。

轻量级适应的可行性在很大程度上取决于离线预训练的强度 (Bommasani 等人 2021)。预训练模型应封装可泛化的特征表示,以便从有限的本地数据中高效地适应。将特征提取的负担转移到集中式训练可以降低设备更新的复杂性和能耗,同时在数据稀疏环境中提高收敛稳定性。

即使适应是轻量级的,机会性调度仍然很重要,以保持系统响应性和用户体验。本地更新应推迟到设备空闲、连接到外部电源并运行在可靠网络上的时段。此类策略最小化了背景训练对延迟、电池消耗和热性能的影响。

本地训练工件敏感性需要谨慎的数据安全措施。重放缓冲区、支持集、适应日志和模型更新元数据必须受到未经授权的访问或篡改的保护。轻量级加密或基于硬件的安全存储可以减轻这些风险,而不会对边缘平台施加过高的资源成本。

然而,仅靠安全措施并不能保证模型的鲁棒性。随着模型在本地适应,监控适应动态变得重要。轻量级验证技术,包括置信度评分、漂移检测启发式方法和影子模型评估,可以帮助早期识别偏差,使系统在发生严重退化之前触发回滚机制 (Gama 等人 2014)。

顽强的回滚程序依赖于保留可信的模型检查点。每次部署都应该保留一个已知的良好基线版本,以便在适应导致不可接受的行为时可以恢复。这一原则在安全重要和受监管的领域尤为重要,在这些领域,故障恢复必须是可证明且快速的。

在去中心化或联邦学习环境中,通信效率成为一级设计约束。必须采用压缩技术,如量化梯度更新、稀疏参数集和选择性模型传输,以允许在大规模、异构设备群之间进行可扩展的协调,而不会耗尽带宽或能源预算 (Konečný 等人 2016)。

当需要个性化时,系统应尽可能实现本地适应。将更新限制在轻量级组件中,包括最终的分类头或模块化适配器,可以限制灾难性遗忘的风险,减少内存开销,并加速适应而不会破坏核心模型表示的稳定性。

最后,在整个系统生命周期中,隐私和合规性要求必须被构建到适应管道中。支持用户同意、数据最小化、保留限制和删除权的机制必须被视为模型设计的基本方面,而不是事后调整。在规模上满足监管义务要求设备上学习工作流程与可审计的自主性原则内在一致。

图 14.8 中的流程图总结了设计实用、可扩展和弹性设备上机器学习系统时的关键决策点。

图片

图 14.8:此流程图通过概述与数据管理、模型选择和隐私考虑相关的关键决策点,指导实用设备上机器学习系统的系统化开发。将隐私和合规性要求(如用户同意和数据最小化)集成到设计过程中确保了可审计的自主性和设备智能的可扩展部署。

生产部署的系统集成

现实世界的设备上学习系统通过系统地结合所有三个解决方案支柱来实现有效性,而不是依赖于孤立的技术。这种集成需要仔细的系统工程来管理交互、解决冲突,并在部署约束下优化整体系统性能。

考虑在一个覆盖 5000 万台异构设备的生产级语音助手部署。该系统架构展示了在三个互补层之间的系统化集成,这三个层共同工作以在多种约束条件下实现有效的学习。

模型适应层根据设备能力分层技术,将复杂性匹配到可用资源。代表部署中前 20%的旗舰手机使用 LoRA rank-32 适配器,通过高维参数更新实现复杂的语音模式学习。占车队 60%的中端设备采用 rank-16 适配器,在适应表达性和主流智能手机典型的更紧的内存限制之间取得平衡。构成剩余 20%的预算设备依赖于仅偏置更新的方式,保持在 1 GB 内存限制内,同时仍然能够实现基本个性化。

数据效率层在整个设备群体中实施自适应策略,同时尊重个体资源限制。所有设备都实现经验重放,但具有设备适当的缓冲区大小——预算设备上为 10 MB,而旗舰机型上为 100 MB,确保内存受限的设备仍能从基于重放的学习中受益。少样本学习使用户在前 10 次交互中快速适应新用户,减少了困扰需要大量训练数据的系统的冷启动问题。流式更新适应用户说话风格随时间自然变化或在新声学环境中使用助手时的连续语音模式演变。

联邦协调层在设备群体中协调隐私保护的合作。设备根据连接状态和电池水平有选择地参与联邦训练轮次,确保协调不会降低用户体验。LoRA 适配器只需 50 MB 的更新即可高效聚合,而全模型同步需要 14 GB,这使得联邦学习在移动网络上变得可行。隐私保护聚合协议确保个人语音模式永远不会离开设备,同时仍能实现口音识别和语言理解方面的种群规模改进,使所有用户受益。

有效的系统集成需要遵守关键工程原则,以确保在异构设备群体中稳健运行:

  1. 分层能力匹配:在具备能力的设备上部署更复杂的技巧,同时确保在整个设备范围内保持基本功能。永远不要假设能力统一。

  2. 优雅降级:系统必须在单个组件失败时有效运行。不良的连接性不应阻止本地适应;低电量应触发最小适应模式。

  3. 冲突解决:模型适应和数据效率技术可能存在冲突(内存限制与缓冲区大小)。通过预定义的优先级层次结构进行系统资源分配可以防止这些冲突。

  4. 性能验证:集成会产生个体技术所不具备的涌现行为。系统需要在设备组合和网络条件下进行全面测试。

这种集成方法将设备上的学习从一系列技术转变为一个连贯的系统能力,在现实世界的部署限制内提供稳健的个性化。

持续的技术和操作挑战

上文探讨的解决方案技术——模型适应性、数据效率和联邦协调——解决了设备上学习的许多基本约束,但也揭示了从现实部署中产生的持续挑战。这些挑战代表了设备上学习研究的前沿,并突出了先前讨论的技术达到其极限或创造新的操作复杂性的领域。理解这些挑战为评估何时采用设备上学习方法以及何时可能需要替代策略提供了关键背景。

与在具有统一硬件和精选数据集的受控环境中进行训练的传统集中式系统不同,边缘系统必须应对设备异构性、数据碎片化和缺乏集中式验证基础设施。这些因素产生了新的系统级权衡,考验了我们考察的适应性策略、数据效率方法和协调机制的边界。

设备和数据异构性管理

联邦和设备上的机器学习系统必须在从智能手机和可穿戴设备到物联网传感器和微控制器的广泛且多样化的设备生态系统中运行。这种异构性跨越多个维度:硬件能力、软件堆栈、网络连接和电力可用性。与可以标准化和控制的云基础系统不同,边缘部署会遇到广泛的系统配置和约束。这些变化在算法设计、资源调度和模型部署方面引入了显著的复杂性。

在硬件层面,设备在内存容量、处理器架构(例如,ARM Cortex-M 与 A 系列 34)、指令集支持(例如,SIMD 或浮点单元的可用性)以及是否存在 AI 加速器方面存在差异。一些客户端可能拥有能够运行小型训练循环的强大 NPU,而其他客户端可能仅依赖低频 CPU 和最小内存。这些差异影响了模型的可实现大小、训练算法的选择以及更新的频率。

软件异构性加剧了挑战。设备可能运行不同的操作系统版本、内核级驱动程序和运行时库。一些环境支持优化的机器学习运行时,如 TensorFlow Lite35 Micro 或 ONNX Runtime Mobile,而其他环境则依赖于定制的推理堆栈或受限的 API。这些差异可能导致行为上的微妙不一致,尤其是在模型编译不同或平台间浮点精度不同的情况下。

除了计算异构性之外,设备在连接性和运行时间上表现出差异。有些设备是间歇性连接的,偶尔插电,或在严格的带宽限制下运行。其他设备可能具有连续的电源和可靠的联网,但仍然优先考虑用户界面的响应性,而不是后台学习。这些差异使得协调学习和更新调度复杂化。

最后,系统碎片化影响了可重复性和测试。在如此广泛的执行环境中,很难确保模型行为的一致性或可靠地调试故障。这使得监控、验证和回滚机制变得更加重要——但也更难以在所有设备上统一实施。

考虑一个用于移动键盘的联邦学习部署。高端智能手机可能配备 8 GB 的 RAM、专门的 AI 加速器和连续的 Wi-Fi 接入。相比之下,预算设备可能只有 2 GB 的 RAM、没有硬件加速,并依赖于间歇性的移动数据。这些差异影响了训练运行的时间长度、模型更新的频率,甚至是否可以进行训练。为了支持这种范围,系统必须动态调整训练计划、模型格式和压缩策略——确保用户之间模型改进的公平性,同时尊重每个设备的限制。

非 IID 数据分布挑战

在集中式机器学习中,数据可以被聚合、打乱和整理,以近似独立同分布(IID)样本——这是许多学习算法背后的关键假设。设备端和联邦学习系统从根本上挑战了这个假设,需要能够处理跨不同设备和环境的高度碎片化和非 IID 数据的算法。

这种碎片化的统计影响在整个学习过程中造成了级联挑战。在不同设备上计算的梯度可能冲突,减缓收敛或使训练不稳定。局部更新可能会过度拟合到单个客户端的独特性,当全局聚合时降低性能。客户端间数据的多样性也使得评估复杂化,因为没有任何单个测试集可以代表真实的部署分布。

这些挑战需要能够处理异构性和不平衡参与的鲁棒算法。如个性化层、重要性加权、自适应聚合方案等技术提供了部分解决方案,但最佳方法随着应用上下文和数据碎片化的具体性质而变化。如第 14.3.3 节所述,这种统计异构性代表了区分设备端学习与传统集中式方法的核心挑战之一。

分布式系统可观察性

来自第十三章的监控和可观察性框架必须为分布式边缘环境进行根本性的重新构想。当设备间歇性连接且数据无法集中时,依赖于统一数据收集和实时可见性的传统集中式监控方法变得不切实际。MLOps 中建立的漂移检测和性能监控技术提供了概念基础,但需要适应以处理设备上学习系统的分布式、隐私保护特性。

与可以持续对保留的验证集进行评估的集中式机器学习系统不同,设备上学习引入了可见性和可观察性的核心转变。一旦部署,模型在高度多样化和通常断开连接的环境中运行,内部更新可能在没有外部监控的情况下进行。这为确保模型适应既有益又安全带来了重大挑战。

核心困难在于缺乏集中的验证数据。在传统的工作流程中,模型使用作为部署条件代理的精选数据集进行训练和评估。相比之下,设备上学习者根据本地输入进行适应,这些输入很少标记,并且可能没有系统地收集。因此,更新质量和方向,无论是增强泛化还是导致漂移,都难以评估,而不会干扰用户体验或违反隐私限制。

在流式设置中,模型漂移的风险尤为明显,持续的适应可能导致性能缓慢下降。例如,一个对背景噪声适应过于激进的语音识别模型最终可能会过度拟合到瞬时的声学条件,降低目标任务的准确性。如果没有对模型参数或输出的演变有可见性,这种退化可能直到变得严重才被发现。

缓解这个问题需要设备上验证和更新门控的机制。一种方法是将适应步骤与轻量级性能检查交替进行——使用代理目标或自监督信号来近似模型置信度 (Y. Deng, Mokhtari, and Ozdaglar 2021)。例如,一个关键词检测系统可能会跟踪最近话语中的检测置信度,并在置信度持续低于阈值时暂停更新。或者,可以采用影子评估,在设备上维护多个模型变体,并在传入的数据流上并行评估,使系统能够将适应后的模型行为与稳定的基线进行比较。

另一种策略涉及周期性检查点和回滚,即在适应之前保存模型状态快照。如果后续性能下降,如通过下游指标或用户反馈确定,系统可以回滚到已知良好的状态。这种方法已在健康监测设备中使用,错误的预测可能导致用户不信任或安全担忧。然而,它引入了存储和计算开销,尤其是在内存受限的环境中。

在某些情况下,联邦验证提供了一种部分解决方案。设备可以与中央服务器共享匿名化的模型更新或汇总统计信息,该服务器汇总用户数据以识别全局漂移或故障模式。虽然这保留了一定程度的隐私,但它引入了通信开销,并且可能无法捕捉到罕见或特定于用户的故障。

最终,在设备上学习中的更新监控和验证需要重新思考传统的评估实践。与传统集中式测试集不同,系统必须依赖隐式信号、运行时反馈和保守的适应策略来确保鲁棒性。缺乏全局可观察性不仅仅是技术限制——它反映了更深层次的系统挑战,即在局部适应与全局可靠性之间进行协调。

动态环境中的性能评估

第十二章建立了测量机器学习系统性能的系统方法:推理延迟、吞吐量、能效和准确度指标。这些基准测试方法为表征模型性能提供了基础,但它们是为静态推理工作负载设计的。设备上的学习需要扩展这些指标,通过特定的训练基准来捕捉适应质量和训练效率。

除了第十二章中提到的推理指标,自适应系统需要专门的训练指标来捕捉在边缘约束下的学习效率。适应效率衡量的是每个训练样本消耗后的准确度提升,量化为资源约束下的学习曲线斜率——一个每 100 个训练样本实现 2%准确度提升的系统比需要 500 个样本才能达到相同提升的系统具有更高的适应效率,这直接转化为更快的个性化服务和减少数据收集需求。内存约束下的收敛评估在指定的 RAM 预算内实现的验证损失,例如“在 512 KB 训练足迹内收敛”,捕捉了系统在固定内存分配下的学习效率——这对于比较从微控制器到智能手机的设备类别之间的适应策略至关重要。每更新一次能耗量量化了每次梯度更新所消耗的毫焦耳,这是一个对于电池供电设备至关重要的指标,因为训练能耗直接影响用户体验——移动设备通常为持续 ML 工作负载预留 500-1000 mW,这意味着每小时适应所需的能量仅为 1.8-3.6 焦耳,在明显影响电池寿命之前。

评估局部适应是否真正优于全局模型需要个性化增益指标来证明设备上学习的开销。每个用户的性能变化衡量的是适应模型与全局基线在用户特定保留数据上的准确度提升——系统应显示出具有统计学意义的改进,通常超过 2%的准确度提升,以证明计算开销、能耗和适应引入的复杂性是合理的。个性化-隐私权衡量化了每单位本地数据暴露的准确度提升,衡量从隐私敏感信息中提取的价值——这个指标有助于评估适应带来的好处是否超过了保留本地用户数据的隐私成本,这对于处理敏感信息如健康数据或个人通信的应用尤为重要。灾难性遗忘率衡量模型适应局部分布时原始任务的退化,通过保留测试来衡量——可接受的遗忘率取决于应用领域,但通常应保持在原始任务上 5%以下准确度损失,以确保个性化不会以牺牲模型的一般能力为代价。

当设备通过联邦学习(第 14.6 节)进行协调时,联邦协调成本指标对于评估系统可行性变得至关重要。通信效率衡量每传输一个字节模型精度提升的程度,捕捉梯度压缩和选择性更新策略的有效性——现代联邦系统通过量化和稀疏化技术实现了 10-100 倍的压缩,同时保持 95%或以上的未压缩精度,这是实际和不可行的移动部署之间的区别。落后者影响量化了由慢速或不稳定设备引起的收敛延迟,测量为有与无参与滤波器的收敛时间差异——通过异步聚合和选择性参与的有效落后者缓解将收敛时间减少了 30-50%,与同步方法相比,同步方法等待所有设备。聚合质量评估全局模型性能作为设备参与率的函数,揭示了联邦学习无法有效收敛的最小可行参与阈值——大多数联邦系统每轮需要 10-20%的设备参与以维持稳定的收敛,为客户端选择和可用性管理策略确立了明确的要求。

这些针对训练的基准测试补充了第十二章(ch018.xhtml#sec-benchmarking-ai)中的推理指标,为自适应系统提供了完整的性能描述。实际的基准测试必须衡量这两个维度:一个系统如果实现了快速的推理但适应缓慢,或者高效的适应但最终精度差,则无法满足现实世界的需求。推理和训练基准的集成使得可以对设备端学习系统在其整个操作生命周期内进行全面的评估。

资源管理

设备端学习引入了传统仅推理部署中不存在的资源竞争模式。许多边缘设备被配置为高效运行预训练模型,但很少考虑训练工作负载。因此,本地适应性与其他系统进程和面向用户的程序竞争有限的资源,包括计算周期、内存带宽、能源和热头房。

最直接的约束是计算可用性。训练涉及通过模型进行额外的正向和反向传递,这可能会超过推理的成本。即使只有一小部分参数被更新,例如在仅偏置或仅头部适应的情况下,反向传播仍然需要遍历相关层,从而触发指令计数和内存流量的增加。在具有共享计算单元的设备(例如,移动 SoC 或嵌入式 CPU)上,这种需求可能会延迟交互式任务,降低帧率或损害传感器处理。

能量消耗加剧了这个问题。适应通常涉及在多个输入样本上的持续计算,这会消耗电池供电系统的能量,并可能导致能量迅速耗尽。例如,在微控制器级设备上执行单个适应周期可能会消耗几毫焦耳 36——这对于一个基于收集能量的分时系统来说是一个相当大的能量预算部分。这需要仔细的调度,以确保学习仅在空闲期间进行,此时能量储备充足,用户延迟约束放松。

从内存的角度来看,由于需要缓存中间激活 37、梯度以及优化器状态(Ji Lin 等人 2020),训练产生的峰值使用率高于推理。

这些资源需求也必须与服务质量(QoS)目标相平衡。用户期望边缘设备能够可靠且一致地响应,无论学习是否在后台进行。任何可观察到的退化,包括唤醒词检测器中的音频丢失或可穿戴显示器中的延迟,都可能侵蚀用户的信任。这些系统可靠性问题与第十三章中讨论的操作挑战相平行。因此,许多系统采用机会性学习策略,即在后台活动期间暂停适应,仅在系统负载低时恢复。

在某些部署中,适应还受到网络基础设施施加的成本约束的进一步限制。例如,设备可能将学习工作负载的一部分卸载到附近的网关或云小点,这引入了带宽和通信权衡。这些混合模型提出了关于任务放置和调度的额外问题:更新应该本地发生,还是推迟到高吞吐量链路可用时?

总结来说,设备上学习的成本并不仅仅以 FLOPs 或内存使用量来衡量。它表现为系统负载、用户体验、能量可用性和基础设施容量之间复杂交互的结果。解决这些挑战需要算法、运行时和硬件层的协同设计,确保适应在现实世界约束下保持不引人注目、高效和可持续。

识别和预防系统故障

理解设备上学习的潜在故障模式有助于防止昂贵的部署错误。基于联邦学习研究中的记录挑战(Kairouz 等人 2021)和自适应系统中已知的风险,几个类别的故障需要仔细考虑。

设备上学习最基本的风险是无界适应漂移,即无约束的持续学习导致模型逐渐偏离其预期行为。考虑一个假设的键盘预测系统,它从所有用户输入包括纠正中学习——它可能会开始将错误输入作为有效建议纳入,导致预测质量逐渐下降。在健康监测应用中,这种风险变得尤为严重,因为用户基线中的渐进变化可能会被学习为“正常”,可能导致系统错过静态模型能够检测到的重要异常。这种漂移的隐蔽性在于它缓慢且局部地发生,没有适当的监控基础设施很难检测到。

除了个别设备漂移之外,联邦学习系统在人口层面上面临着参与偏差放大的挑战。具有可靠电源和连接性的设备更频繁地参与联邦轮次(T. Li 等人 2020)。这种不均匀的参与创造了模型越来越优化高端设备用户而性能对资源有限的用户下降的场景。由此产生的反馈循环加剧了数字不平等:服务较好的用户获得越来越好的模型,而服务不足的人群则经历性能下降,减少他们的参与,进一步减少他们在训练轮次中的代表性(J. Wang 等人 2021)。这些公平性和偏差放大问题突出了分布式学习系统的伦理影响。

这些系统性偏差与数据质量问题相互作用,形成自纠正反馈循环,尤其是在基于文本的应用中。当系统无法区分预期输入和纠正时,它们可能会表现出意外的行为。经常被纠正的特定领域术语可能会被错误地学习为错误,导致在专业环境中提出不恰当的建议。这个问题加剧了漂移问题:不仅模型适应了个人的怪癖,而且当用户接受自动纠正而没有意识到系统正在从这些交互中学习时,它们也可能从自己的错误中学习。

这些故障模式之间的相互关联性,从个体漂移到群体偏差再到数据质量下降,强调了实施全面安全机制的重要性。成功的部署需要有限的适应范围以防止无限制的漂移,分层抽样以解决参与偏差,仔细的数据过滤以避免从校正中学习作为真实情况,以及与静态基线的影子评估以检测退化。尽管由于竞争和隐私问题,具体的生产事件很少公开,但研究界已将这些模式识别为需要系统缓解策略的关键领域(T. Li 等人 2020; Kairouz 等人 2021)。

生产部署风险评估

在边缘设备上部署自适应模型引入了超出技术可行性的挑战。在需要合规性、可审计性和监管批准的领域,包括医疗保健、金融和安全性重要的系统,设备上的学习在系统自主性和控制之间构成了核心紧张关系。

在传统的机器学习管道中,所有模型更新都是集中管理、版本控制和验证的。训练数据、模型检查点和评估指标通常记录在可重现的工作流程中,支持可追溯性。然而,当学习发生在设备本身时,这种可见性就会丧失。每个设备可能独立地发展其模型参数,受到开发者或系统维护者从未观察到的独特本地数据流的影响。

这种自主性产生了验证差距。没有访问输入数据或确切更新轨迹,很难验证学习到的模型是否仍然遵循其原始规范或性能保证。这在受监管的行业中尤其成问题,因为认证取决于证明系统在定义的操作边界内表现一致。一个响应现实世界使用而自行更新的设备可能会超出这些边界,在没有外部信号的情况下触发合规违规。

缺乏集中监管使得回滚和故障恢复变得复杂。如果模型更新降低了性能,可能不会立即被发现,尤其是在离线场景或没有遥测功能的系统中。当观察到故障时,系统的内部状态可能已经与任何已知的检查点有显著差异,这使得诊断和恢复比在静态部署中更为复杂。这需要强大的安全机制,例如保守的更新阈值、回滚缓存或保留经过验证基线的双模型架构。

除了合规挑战之外,设备上的学习还引入了新的安全漏洞。由于模型适应是本地发生的,并且依赖于特定于设备的、可能不可信的数据流,攻击者可能会通过篡改存储的数据(如重放缓冲区)或在适应过程中注入毒化示例来操纵学习过程,以降低模型性能或引入漏洞。任何本地存储的适应数据,如特征嵌入或少样本示例,都必须得到保护,防止未经授权的访问,以防止意外信息泄露。

在去中心化环境中维护模型完整性尤其困难,因为中央监控和验证有限。自主更新可能在没有外部可见性的情况下导致模型漂移到不安全或偏颇的状态。这些风险通过合规义务(如 GDPR 的删除权)进一步加剧:如果用户数据通过适应微妙地影响模型,跟踪和逆转这种影响变得复杂。

自适应模型,尤其是在边缘,的安全性和完整性提出了重要的开放挑战。对这些威胁和相应的缓解策略的全面处理需要为分布式机器学习系统提供专门的网络安全框架。

隐私法规也与设备上的学习以非平凡的方式相互作用。虽然本地适应可以减少传输敏感数据的需要,但它可能仍然需要在设备本身上存储和处理个人信息,包括传感器轨迹或行为日志。这些隐私考虑需要仔细关注安全框架和法规合规。根据司法管辖区,这可能会引发对数据保留、用户同意和可审计性的额外要求。系统必须设计得满足这些要求,而不损害适应的有效性,这通常涉及加密存储数据、实施保留限制或实施用户控制的重置机制。

最后,边缘学习的出现提出了关于问责制和责任(Brakerski 等人 2022)的开放性问题。当模型自主适应时,谁对其行为负责?如果适应后的模型做出了错误的决定,例如误诊健康状况或误解语音命令,其根本原因可能在于本地数据漂移、初始化不良或安全措施不足。如果没有标准化的机制来捕捉和分析这些故障模式,责任可能难以分配,监管批准也更难获得。

解决这些部署和合规风险需要新的工具、协议和设计实践,以支持可审计的自主性——系统在满足外部对可追溯性、可重复性和用户保护的要求的同时,能够就地适应。随着设备端学习变得更加普遍,这些挑战将成为系统架构和治理框架的核心。

工程挑战综合

设计设备端机器学习系统涉及在技术和实践约束的复杂景观中导航。虽然局部适应允许个性化、隐私和响应性,但它也引入了一系列挑战,这些挑战跨越了硬件异构性、数据碎片化、可观察性和法规遵从性。

系统异构性通过引入计算、内存和运行时环境的变化,使部署和优化复杂化。非独立同分布数据分布挑战学习稳定性和泛化能力,尤其是在模型在设备上训练且无法访问全局上下文的情况下。缺乏集中监控使得验证更新或检测性能退步变得困难,并且训练活动必须经常与核心设备功能竞争能源和计算资源。最后,部署后的学习在模型治理方面引入了复杂性,从可审计性和回滚到隐私保证。

这些挑战并非孤立存在——它们以影响不同适应策略可行性的方式相互作用。表 14.6 总结了主要挑战及其对边缘部署的机器学习系统的影响。

表 14.6:设备端学习挑战:系统异构性、非独立同分布数据以及有限的资源为在边缘设备上部署和适应机器学习模型带来了独特的挑战,影响了可移植性、稳定性和治理。该表详细说明了这些挑战的根本原因及其系统级影响,突出了模型性能与资源约束之间的权衡。

挑战 根本原因 系统级影响
系统异构性 多样化的硬件、软件和工具链 限制了可移植性;需要针对特定平台进行调整
非独立同分布和碎片化数据 本地化、用户特定的数据分布 阻碍了泛化;增加了漂移风险
有限的可观察性和反馈 没有集中的测试或日志记录 使得更新验证和调试困难
资源竞争和调度 内存、计算和电池的竞争需求 需要动态调度和预算感知学习
部署和合规风险 部署后继续学习 复杂化模型版本控制、审计和回滚

稳健人工智能系统的基础

前几节探讨的操作挑战和故障模式揭示了超出部署担忧的系统基本可靠性方面的漏洞。当模型在数百万个异构设备上自主适应时,会出现三种传统集中式训练从未遇到的威胁类别。

第一,与故障局部化和可观察的集中式系统(如第十三章[sec-ml-operations]所述)不同,设备上的学习创造了本地故障可以无声传播到设备群体中的场景。如果一个设备上的损坏适应通过联邦学习聚合,可能会毒害全局模型。在集中式基础设施中会触发错误的硬件故障可能在边缘设备上静默地损坏梯度,而检测错误的能力最小。

第二,使协作学习成为可能的联邦协调机制也创造了新的攻击面。敌对客户端可以注入旨在降低全局模型性能的有毒梯度 38。即使聚合,模型反演攻击也可以从共享更新中提取私有信息。设备学习分布的特性使得这些攻击既容易执行(损害客户端设备)又难以检测(没有集中式验证)。

第三,设备上的系统必须在无法访问标记验证数据的情况下处理分布变化和环境变化。模型可能会自信地漂移到故障模式,适应局部偏差或暂时异常。设备间的非独立同分布数据分布意味着单个设备上的局部漂移可能不会触发全局警报,从而允许无声退化。

这些可靠性威胁需要系统性的方法来确保设备上的学习系统在自主适应、恶意操纵和环境不确定性下保持鲁棒性。第十六章全面考察了这些挑战,确立了容错 AI 系统的原则,这些系统能够在硬件故障、对抗性攻击和数据分布变化的情况下保持可靠性。在那里开发的拜占庭容错聚合、对抗性训练和漂移检测技术成为生产就绪的设备学习系统的基本组成部分,而不是可选的增强功能。

这些鲁棒性机制的隐私保护方面,包括安全聚合和差分隐私,直接关联到第十五章,该章节建立了部署大规模自学习系统所需的密码学基础和隐私保障,同时保持用户信任和合规性。

谬误和陷阱

设备上的学习在本质上与基于云的训练环境不同,面临着严重的资源限制和隐私要求,这挑战了传统的机器学习假设。本地适应和隐私保护的吸引力可能会掩盖决定设备学习是否比简单替代方案提供净收益的重大技术限制和实施挑战。

谬误: 设备学习提供了与基于云的训练相同的适应能力。

这种误解导致团队期望本地学习能够实现与集中训练相同的模型改进,而集中训练拥有丰富的计算资源。设备学习在严重的限制下运行,包括有限的内存、受限的计算能力和最小的能源预算,这些从根本上限制了适应能力。本地数据集通常是小的、有偏见的和非代表性的,这使得无法实现与集中训练相同的泛化性能。有效的设备学习需要接受这些限制,并设计适应策略,在实用限制内提供有意义的改进,而不是试图复制云规模的学习能力。这需要一种以效率为先的思维方式和仔细的优化技术。

陷阱: 假设联邦学习自动保护隐私,无需额外的安全措施。

许多从业者认为,在本地设备上保留数据本质上提供了隐私保护,而没有考虑到可以从模型更新中推断出的信息。梯度更新和参数更新可以通过各种推理攻击泄露关于本地训练数据的重大信息。设备参与模式、更新频率和模型收敛行为可以揭示关于用户及其活动的敏感信息。真正的隐私保护需要额外的机制,如差分隐私(数学上保证单个数据点不能从模型输出中推断出来)、防止参数检查的安全聚合协议以及仔细的通信协议,而不是仅仅依赖于数据本地性。

谬误: 资源受限的适应总是比通用模型产生更好的个性化模型。

这种信念假设,无论可用的本地数据的质量或数量如何,任何本地适应都是有益的。在设备上使用不足、噪声或偏颇的本地数据进行学习实际上可能会降低模型性能,与训练良好的通用模型相比。小数据集可能无法提供足够的信息进行有意义的学习,而适应本地噪声可能会损害泛化能力。有效的设备学习系统必须包括机制来检测何时本地适应是有益的,并在本地数据不足以进行可靠学习时回退到通用模型。

陷阱: 忽视不同设备类型和能力之间的异质性挑战。

团队通常在设计设备上学习系统时假设部署设备具有统一的硬件能力。现实世界的部署涵盖了具有不同计算能力、内存容量、能源限制和网络能力的各种硬件。一个在高端智能手机上表现良好的学习算法可能在资源受限的物联网设备上失败得非常严重 39。

陷阱: 低估在分布式边缘系统中协调学习的复杂性。

许多团队专注于单个设备的优化,而没有考虑到协调数千或数百万边缘设备进行学习的系统级挑战。边缘系统编排必须处理间歇性连接、不同的电源状态、不同的时区和不可预测的设备可用性模式,这些都创造了复杂的调度和同步挑战。设备聚类、联邦轮次协调、跨不同部署环境中的模型版本控制以及处理不可靠设备的部分参与需要超越简单聚合服务器的复杂基础设施。此外,现实世界的边缘部署涉及多个利益相关者,他们有不同的激励措施、安全要求和操作程序,这些必须与学习目标相平衡。有效的边缘学习系统需要能够维持系统连贯性的强大编排框架,即使在设备不断更替、网络分区和操作中断的情况下也能保持。

摘要

设备上学习代表了从静态、集中式训练到动态、本地部署设备的直接适应的根本转变。这种范式使机器学习系统能够个性化体验同时保护隐私,减少网络依赖,并快速响应本地条件的变化。成功需要整合优化原则、理解硬件限制并应用合理的操作实践。从传统的基于云的训练到基于边缘的学习的转变需要克服严重的计算、内存和能源限制,这从根本上改变了模型的设计和适应方式。

能够实现设备上实际学习的专业技术策略涵盖了系统设计的多个维度。适应技术从轻量级的仅更新偏差到选择性的参数调整不等,每种方法都提供了在表达性和资源效率之间的不同权衡。当从有限的本地示例中进行学习时,数据效率变得至关重要,这推动了少量样本学习 40、流式适应和基于内存的重放机制 41 的创新。

关键要点

  • 设备上学习将机器学习从静态部署转变为动态本地适应,在保留隐私的同时实现个性化

  • 资源限制推动了专用技术的出现:仅更新偏差、适配器模块、稀疏参数更新和压缩数据表示

  • 联邦学习协调异构设备上的分布式训练,同时保持隐私并处理非-IID 数据分布

  • 成功需要与硬件约束协同设计算法,在适应能力与内存、能源和计算限制之间取得平衡

真实世界的应用展示了设备上学习的潜力和挑战,从适应用户声音的关键词检测系统到不传输用户数据的个性化推荐引擎。随着机器学习扩展到移动、嵌入式和可穿戴环境,在保持效率和可靠性的同时本地学习的能力对于无缝运行于各种部署环境中的下一代智能系统变得至关重要。

设备上学习的分布式特性引入了新的漏洞,这些漏洞不仅超越了单个设备限制。正是这些系统强大的能力——从用户数据中学习、适应本地模式、跨设备协调——也创造了新的攻击面和隐私风险。这些自适应系统不仅必须正确运行,还必须保护敏感用户信息并防御对抗性操纵。安全和隐私框架(第十五章)解决这些关键问题,展示了如何保护设备上学习系统免受隐私泄露和对抗性攻击。随后,鲁棒人工智能原则(第十六章)将这些保护扩展到涵盖系统级可靠性挑战,包括硬件故障和软件错误,而机器学习操作(第十三章)提供了部署和维护这些复杂自适应系统的全面框架。


安全与隐私

DALL·E 3 提示:一幅关于机器学习系统中隐私和安全的插图。图中展示了一个由相互连接的节点和数据流组成的数字景观,象征着机器学习算法。在前景中,有一个大锁叠加在网络上,代表隐私和安全。锁是半透明的,允许部分可见底下的网络。背景有二进制代码和数字加密符号,强调网络安全主题。色彩方案是蓝色、绿色和灰色的混合,暗示了一个高科技、数字的环境。

图片

目的

为什么隐私和安全决定了机器学习系统能否得到广泛采用和社会信任?

机器学习系统需要前所未有的访问个人数据、机构知识和行为模式才能有效运行,这在社会接受度上产生了效用和保护之间的紧张关系。与处理数据瞬时的传统软件不同,ML 系统从敏感信息中学习,并将模式嵌入到持久模型中,这些模型可能会无意中泄露私人细节。这种能力创造了系统性风险,不仅超越了个人隐私侵犯,还威胁到机构信任、竞争优势和民主治理。机器学习在关键领域(医疗保健、金融、教育和公共服务)的成功部署完全取决于建立强大的安全和隐私基础,以实现有益的使用同时防止有害的暴露。没有这些保护,即使是最有能力的系统也因法律、伦理和实际担忧而无法使用。理解隐私和安全原则使工程师能够设计出既具有技术卓越性又得到社会认可的系统。

学习目标

  • 使用形式定义和威胁模型来区分机器学习系统中的安全和隐私问题

  • 分析历史安全事件,提取适用于机器学习系统漏洞的原则

  • 在模型、数据和硬件攻击面上对机器学习威胁进行分类

  • 评估包括差分隐私、联邦学习和合成数据生成在内的隐私保护技术在特定用例中的应用

  • 设计集成数据保护、模型安全和硬件信任机制的分层防御架构

  • 为机器学习系统实施基本的安全控制措施,包括访问管理、加密和输入验证

  • 使用定量成本效益分析来评估安全措施与系统性能之间的权衡

  • 应用三阶段安全路线图,根据组织威胁模型和风险承受能力优先考虑防御措施

机器学习系统中的安全与隐私

从集中式训练架构向分布式、自适应机器学习系统的转变改变了现代机器学习基础设施的威胁格局和安全要求。第十四章中考察的当代机器学习系统越来越多地运行在跨越边缘设备、联邦网络和混合云部署的异构计算环境中。这种架构演变使得自适应智能的新能力成为可能,但同时也引入了攻击向量和隐私漏洞,这些是传统的网络安全框架无法充分解决的。

与传统的软件应用相比,机器学习系统表现出不同的安全特性。传统的软件系统处理数据是瞬时的和确定的,而机器学习系统则从训练数据中提取和编码模式,将其编码成持久的模型参数。这种学习到的知识表示创建了独特的漏洞,敏感信息可能会无意中被记住,并在模型输出或系统询问后暴露出来。这种风险在各个领域都有所体现,从可能泄露患者信息的医疗系统到可以通过战略查询模式逆向工程的自有模型,都威胁到个人隐私和组织的知识产权。

如第二章中详细所述,机器学习系统的架构复杂性通过多层攻击表面加剧了这些安全挑战。当代机器学习部署包括数据摄取管道、分布式训练基础设施、模型服务系统和持续监控框架。每个架构组件都引入了独特的漏洞,而隐私问题影响了整个计算栈。现代部署的分布式特性,包括边缘节点的持续适应和联邦协调协议,扩大了攻击面,同时使全面的安全实现复杂化。

解决这些挑战需要系统性的方法,这些方法将安全和隐私考虑贯穿于机器学习系统的整个生命周期。本章建立了构建既具有计算有效性又具有可信操作的机器学习系统所需的基础和方法。我们探讨了将已建立的安全原则应用于机器学习环境,确定了特定于学习系统的威胁模型,并提出了包括数据保护机制、安全模型架构和基于硬件的安全实现在内的综合防御策略。

我们的调查通过四个相互关联的框架进行。我们首先在机器学习环境中建立安全和隐私之间的区别,然后通过分析历史安全事件来了解当代威胁评估。我们分析学习过程中出现的漏洞,然后介绍跨越加密数据保护、对抗鲁棒模型设计和硬件安全机制的分层防御架构。在整个分析过程中,我们强调实施指南,使从业者能够开发出满足技术性能要求和社会部署所需信任标准的系统。

基础概念和定义

安全和隐私是机器学习系统设计中的核心关注点,但它们往往被误解或混淆。两者都旨在保护系统和数据,但它们以不同的方式、针对不同的威胁模型,并需要不同的技术响应。对于机器学习系统,区分两者有助于指导设计稳健和负责任的基础设施。

安全的定义

机器学习中的安全关注于防御系统免受对抗性行为的侵害。这包括保护模型参数、训练管道、部署基础设施和数据访问路径免受操纵或滥用。

安全 是通过在开发、部署和运营环境中跨越防御机制来保护机器学习系统的 数据模型基础设施,以防止 未经授权的访问操纵破坏

示例:部署在公共交通基础设施中的面部识别系统可能会受到对抗性输入的影响,导致其错误识别个人或完全失败。这是一个运行时安全漏洞,威胁到准确性和系统可用性。

隐私的定义

虽然安全解决对抗性威胁,但隐私关注的是限制在机器学习系统中敏感信息的暴露和滥用。这包括保护训练数据、推理输入和模型输出,防止泄露个人信息或专有信息,即使系统运行正确且没有发生明确的攻击。

隐私 是通过在机器学习系统环境中保持 机密性 和对数据使用 控制 的方法来保护 敏感信息,以防止 未经授权的披露推断滥用

示例:在医疗记录上训练的语言模型可能会无意中记住患者对话的片段。如果用户后来通过面向公众的聊天机器人触发此内容,即使没有攻击者,这也代表了一种隐私失败。

安全与隐私

虽然它们在某些领域有交集(加密存储支持两者),但安全和隐私在目标、威胁模型和典型的缓解策略上有所不同。表 15.1 以下总结了在机器学习系统背景下这些区别。

表 15.1:安全-隐私区别:机器学习系统需要针对安全和隐私采取不同的方法;安全缓解针对系统功能的目标攻击,而隐私保护则防止敏感信息因数据泄露或再识别而有意或无意地暴露。此表说明了不同的目标和威胁模型如何塑造每个领域的特定关注点和缓解策略。

方面 安全 隐私
主要目标 防止未授权访问或破坏 限制敏感信息的暴露
威胁模型 对抗性参与者(外部或内部) 诚实但好奇的观察者或被动泄露
典型关注点 模型窃取、投毒攻击、规避攻击 数据泄露、再识别、记忆化
示例攻击 对抗性输入导致误分类 模型反演揭示训练数据
代表性防御措施 访问控制、对抗性训练 差分隐私、联邦学习
与法规的相关性 在网络安全标准中被强调 在数据保护法律中居核心地位(例如,GDPR)

安全-隐私交互和权衡

安全和隐私紧密相关但不可互换。一个安全的系统通过限制对模型和数据的未授权访问来帮助维护隐私。隐私保护的设计可以通过减少攻击面来提高安全性,例如,最小化敏感数据的保留可以降低系统被破坏时数据泄露的风险。

然而,它们也可能存在紧张关系。差分隐私 1 技术可以降低记忆化风险,但可能会降低模型效用。同样,加密增强了安全性,但可能会模糊透明性和可审计性,从而复杂化隐私合规性。在机器学习系统中,设计者必须全面地考虑这些权衡。服务于敏感领域(包括医疗保健、金融和公共安全)的系统必须同时防止滥用(安全)和过度暴露(隐私)。理解这些关注点之间的界限对于构建性能良好、值得信赖且符合法律要求的系统至关重要。

从安全漏洞中学习

在确立了安全和隐私的概念基础之后,我们现在考察这些原则如何在现实世界系统中通过里程碑式的安全事件体现出来。这些历史案例为我们所定义的抽象概念提供了具体的说明,展示了安全漏洞如何在复杂系统中产生和传播。更重要的是,它们揭示了普遍存在的模式(供应链破坏、隔离不足和武器化端点),这些模式直接适用于现代机器学习部署。

从各种计算系统中的知名安全漏洞中可以吸取宝贵的教训。理解这些模式如何适用于现代机器学习部署,这些部署越来越多地运行在云、边缘和嵌入式环境中,为保护机器学习系统提供了重要的经验教训。这些事件展示了系统设计中的弱点如何导致广泛的影响,有时甚至是物理影响。尽管本节讨论的例子并不都直接涉及机器学习,但它们为设计安全系统提供了重要的见解。这些经验教训适用于部署在云、边缘和嵌入式环境中的机器学习应用。

供应链破坏:Stuxnet

2010 年,安全研究人员发现了一种高度复杂的计算机蠕虫,后来被命名为Stuxnet2,它针对伊朗纳坦兹核设施中使用的工业控制系统(Farwell and Rohozinski 2011)。Stuxnet 利用了微软 Windows 中四个之前未知的“零日漏洞”3,使其能够在网络化和隔离系统中无痕传播。

与旨在窃取信息或执行间谍活动的典型恶意软件不同,Stuxnet 被设计用来造成物理损害。其目标是通过对过程中使用的离心机进行破坏来干扰铀浓缩。尽管该设施与外部网络断开连接 4,但据信恶意软件是通过一个受感染的 USB 设备 5 进入系统的,这表明物理访问可以破坏隔离环境。

该蠕虫专门针对可编程逻辑控制器(PLC),这些工业计算机自动化了诸如控制离心机速度等机电过程。通过利用 Windows 操作系统和用于编程 PLC 的西门子 Step7 软件中的漏洞,Stuxnet 实现了高度针对性的现实世界破坏。这标志着网络安全的一个里程碑,展示了恶意软件如何跨越数字和物理世界来操纵工业基础设施。

Stuxnet 的教训直接适用于现代机器学习系统。训练管道和模型仓库面临着与 Stuxnet 所利用的类似的持续供应链风险。正如 Stuxnet 通过感染的可移动存储设备和软件漏洞来破坏工业系统一样,现代机器学习系统面临着多个攻击向量:受损害的依赖项(PyPI/conda 仓库中的恶意软件包)、恶意训练数据(HuggingFace、Kaggle 上的中毒数据集)、后门模型权重(模型仓库中的特洛伊木马模型)和篡改的硬件驱动程序(受损害的 NVIDIA CUDA 库、AI 加速器中的固件后门)。

一个具体的机器学习攻击场景说明了这些风险:攻击者上传了一个后门图像分类模型到一个流行的模型仓库,该模型被训练来错误分类特定模式,同时在干净数据上保持正常精度。当部署在自动驾驶汽车中时,这个后门模型正确地识别了大多数物体,但未能检测到穿着特定模式的行人,从而产生了安全风险。攻击通过自动化的模型部署管道传播,在检测到之前影响了数千辆车。

防御此类供应链攻击需要端到端的安全措施:(1) 加密验证,使用加密签名对所有模型工件、数据集和依赖项进行签名;(2) 原因追踪,维护所有训练数据源、代码版本和使用的不可变日志;(3) 完整性验证,在部署前实施自动扫描以检测模型后门、依赖项漏洞和数据集中毒;(4) 空隔训练,在具有受控依赖项管理的安全环境中隔离敏感模型训练。图 15.1 展示了这些供应链破坏模式如何适用于工业和机器学习系统。

图片

图 15.1:Stuxnet:通过利用 Windows 和西门子软件漏洞来针对 PLC,展示了供应链被破坏的情况,这使得数字恶意软件能够造成物理基础设施损坏。现代机器学习系统面临着类似的通过受损害的训练数据、后门依赖项和篡改的模型权重带来的风险。图 15.1

孤立不足:Jeep Cherokee 漏洞

2015 年 Jeep Cherokee 的破解展示了日常产品中的连接性如何创造出新的漏洞。安全研究人员公开演示了对一辆 Jeep Cherokee 的远程网络攻击,揭示了汽车系统设计中重要的漏洞(Miller 和 Valasek 2015; Miller 2019)。作为一个控制实验,研究人员利用了车辆 Uconnect 娱乐系统中的漏洞,该系统通过蜂窝网络连接到互联网。通过远程访问该系统,他们发送了影响车辆引擎、变速器和制动系统的命令,而无需物理接触汽车。

这次演示对汽车行业起到了警钟的作用,突显了现代车辆日益增长的连接性所带来的风险。传统上隔离的汽车控制系统,如管理转向和制动的系统,在通过外部可访问的软件接口暴露时被发现是脆弱的。远程操纵关键功能的可能性引发了关于乘客安全、监管监督和行业最佳实践的严重担忧。

该事件还导致超过 140 万辆汽车召回以修复漏洞 6,突显了制造商在设计时优先考虑网络安全的必要性。美国国家公路交通安全管理局(NHTSA)7 发布了针对汽车制造商的指南,以改善车辆网络安全,包括关于安全软件开发实践和事件响应协议的建议。

Jeep Cherokee 的破解为机器学习系统安全提供了关键教训。连接的机器学习系统需要在外部接口和关键安全组件之间进行严格的隔离,正如这一事件所戏剧性地展示的那样。架构缺陷(允许外部接口访问关键功能)直接威胁到现代机器学习部署,其中推理 API 通常连接到物理执行器或关键系统。

现代机器学习攻击向量利用了这些相同的隔离失败,跨越多个领域:(1)自动驾驶汽车中,受损害的信息娱乐系统机器学习 API(语音识别、导航)获取控制转向和制动的感知模型;(2)智能家居系统中,被利用的语音助手唤醒词检测模型为安全系统、门锁和摄像头提供后门访问;(3)工业物联网中,受损害的边缘机器学习推理端点(预测性维护、异常检测)操纵制造系统中的执行器控制逻辑;(4)医疗设备中,被攻击的诊断机器学习模型影响治疗建议和药物输送系统。

考虑一个具体的攻击场景:智能家居语音助手通过云端的自然语言处理模型处理用户命令。攻击者利用语音处理 API 的漏洞注入恶意命令,绕过认证。由于网络分段不足,被攻陷的语音系统获得了访问家庭安全机器学习模型(负责面部识别门解锁)的权限,从而允许未经授权的物理访问。

有效的防御需要全面的隔离架构:(1) 使用防火墙和 VPN 将机器学习推理网络与执行器控制网络隔离开来;(2) API 认证要求对所有机器学习 API 调用进行加密认证,并实施速率限制和异常检测;(3) 权限分离,在沙盒环境中运行推理模型,以最小的系统权限运行;(4) 失效安全默认设置,当机器学习系统检测到异常或失去连接时,将执行器控制逻辑设计为恢复到安全状态(锁定的门,停止的电机);(5) 监控实现实时日志记录和针对可疑机器学习 API 使用模式的警报。

武器化终端:Mirai 恶意软件

虽然 Jeep Cherokee 的黑客攻击展示了针对连接系统的针对性利用,但 Mirai 恶意软件揭示了糟糕的安全实践如何被大规模武器化。2016 年,Mirai 恶意软件8 成为互联网历史上最具破坏性的分布式拒绝服务(DDoS)9 攻击之一(Antonakakis 等人,2017 年[ch058.xhtml#ref-antonakakis2017understanding])。该恶意软件感染了成千上万的网络设备,包括数字摄像头、DVR 和其他消费电子产品。这些设备通常使用出厂默认的用户名和密码部署,很容易被 Mirai 恶意软件攻陷并被纳入大规模攻击网络。

Mirai 恶意软件被用于压垮主要的互联网基础设施提供商,导致美国及以外的流行在线服务访问中断。攻击的规模展示了当在设计部署时没有优先考虑安全,消费者和工业设备如何变成广泛破坏的平台。

Mirai 恶意软件的教训直接适用于现代机器学习部署。边缘部署的机器学习设备由于认证薄弱,成为前所未有的武器化攻击基础设施,正如 Mirai 恶意软件在传统的物联网设备上所展示的那样。现代机器学习边缘设备(运行物体检测的智能摄像头、执行唤醒词检测的语音助手、具有导航模型的自主无人机、具有异常检测算法的工业物联网传感器)面临相同的漏洞模式,但由于它们的 AI 能力和对敏感数据的访问,其后果被放大。

使用机器学习设备的攻击升级与传统物联网入侵有显著不同。与仅提供 DDoS 攻击计算能力的简单物联网设备不同,被入侵的机器学习设备提供了复杂的功能:(1) 数据泄露,智能摄像头泄露人脸识别数据库,语音助手提取对话记录,健康监测器窃取生物识别数据;(2) 模型武器化,被劫持的自主无人机协调集群攻击,被入侵的交通摄像头错误报告车辆数量以操纵交通系统;(3) AI 驱动的侦察,被入侵的边缘机器学习设备使用其训练的模型来识别高价值目标(人脸识别用于 VIP 识别,语音分析用于情绪检测)并协调复杂的多阶段攻击。

考虑一个具体的攻击场景,攻击者利用默认密码入侵了 50,000 个智能安全摄像头,每个摄像头都在运行机器学习物体检测模型。他们不是使用传统的 DDoS 攻击,而是利用被入侵的摄像头进行以下操作:(1) 从住宅和商业建筑中提取人脸识别数据库;(2) 使用分布式摄像头网络协调对目标个人的物理监控;(3) 注入虚假物体检测警报以触发紧急响应并造成混乱;(4) 利用摄像头的计算能力来训练对抗性样本以对抗其他安全系统。

针对这种武器化的全面防御需要零信任边缘安全:(1) 确保制造过程安全,消除默认凭证,实施硬件安全模块(HSM)以生成设备唯一密钥,并启用带有加密验证的安全启动;(2) 加密通信,要求所有机器学习 API 通信使用 TLS 1.3+,并实施证书固定和相互认证;(3) 行为监控,部署异常检测系统以识别不寻常的推理模式、意外的网络流量和可疑的计算负载;(4) 自动响应,实施关闭开关以远程禁用被入侵的设备并将它们隔离于网络之外;(5) 更新安全,强制执行加密签名固件更新,并具有自动安全补丁和版本回滚功能。

系统性威胁分析和风险评估

历史事件展示了基本安全失败如何在不同的计算范式下体现。供应链漏洞导致持续入侵,隔离不足允许权限提升,以及武器化端点在规模上创建攻击基础设施。这些模式直接适用于机器学习部署:被入侵的训练管道和模型存储库继承了供应链风险,与安全关键型机器学习组件的外部接口需要严格的隔离,被入侵的机器学习边缘设备可以泄露推理数据或参与协调攻击。

这些历史事件揭示了通用的安全模式,这些模式直接转化为 ML 系统的漏洞。正如 Stuxnet 所展示的供应链妥协,在 ML 中表现为训练数据中毒和后门模型存储库。不足的隔离,如 Jeep Cherokee 黑客攻击所例证,表现为对安全关键系统的 ML API 访问和受损害的推理端点。武器化端点,如 Mirai 僵尸网络所示,通过劫持能够进行协调 AI 攻击的 ML 边缘设备出现。

关键的见解是,传统的网络安全模式在 ML 系统中得到了放大,因为模型从数据中学习并做出自主决策。虽然 Stuxnet 需要复杂的恶意软件来操纵工业控制器,但 ML 系统可以通过数据中毒来被破坏,这种数据中毒在统计上看似正常,但嵌入隐藏的行为。这一特性使得 ML 系统在遭受攻击时更加脆弱,并且更加危险,因为它们可以自主地做出影响物理系统的决策。理解这些历史模式有助于识别熟悉攻击向量如何在 ML 环境中体现,而学习系统的独特属性(统计学习、决策自主性和数据依赖性)创造了需要专门防御的新攻击面。

机器学习系统引入了超出传统计算漏洞的攻击向量。学习的数据驱动特性为对手创造了新的机会:训练数据可以被操纵以嵌入后门,输入扰动可以利用学习到的决策边界,系统性的 API 查询可以提取专有模型知识。这些特定于 ML 的威胁需要专门的防御措施,这些措施考虑到学习系统的统计和概率基础,补充了传统的基础设施加固。

威胁优先级框架

面对 ML 系统面临的广泛潜在威胁,从业者需要一个框架来有效地优先考虑他们的防御工作。并非所有威胁的可能性或影响都相同,而且安全资源总是有限的。一个基于可能性和影响的简单优先级矩阵有助于将注意力集中在最重要的地方。

考虑以下威胁优先级类别:

  • 高可能性/高影响:在联邦学习系统中,训练数据来自不可信来源的数据中毒攻击。这些攻击相对容易执行,但可能会严重损害模型行为。

  • 高可能性/中等影响:针对公共 API 的模型提取攻击。这些攻击很常见且技术上简单,但可能只会影响竞争优势,而不是安全或隐私。

  • 低可能性/高影响:针对云部署模型的硬件侧信道攻击。这些攻击需要复杂的对手和物理访问权限,但可能会暴露所有模型参数和用户数据。

  • 中等可能性/中等影响:针对在敏感数据上训练的模型的成员推理攻击。这些攻击需要一定的技术技能,但主要威胁的是个人隐私而不是系统完整性。

本框架在本章中指导资源分配。我们首先从最常见且易于访问的威胁(模型盗窃、数据中毒和对抗攻击)开始,然后检查更专业的硬件和基础设施漏洞。理解这些优先级有助于从业者以逻辑顺序实施防御措施,以最大化每项投入的努力带来的安全效益。

模型特定的攻击向量

机器学习系统面临从训练时间操纵到推理时间规避的整个 ML 生命周期的威胁。这些威胁分为三个广泛的类别:针对模型机密性的威胁(模型盗窃)、针对训练完整性的威胁(数据中毒 10)和针对推理鲁棒性的威胁(对抗示例 11)。每个类别针对不同的漏洞,并需要不同的防御策略。

理解不同攻击在 ML 生命周期中何时何地发生有助于优先考虑防御措施并理解攻击者的动机。图 15.2 将主要攻击向量映射到机器学习管道中的目标阶段,揭示了攻击者如何在不同时间利用不同的系统漏洞。

  • 在数据收集期间:攻击者可以在训练数据集中注入恶意样本或操纵标签,尤其是在数据来源控制较少的联邦学习或众包数据场景中。

  • 在训练期间:这一阶段面临后门注入攻击,攻击者嵌入仅在特定触发条件下激活的隐藏行为,以及系统性地破坏学习过程的标签操纵攻击。

  • 在部署期间:模型盗窃攻击针对这一阶段,因为训练模型可以通过 API、文件下载或移动应用程序的反向工程来访问。这是知识产权最脆弱的地方。

  • 在推理期间:对抗攻击在运行时发生,攻击者构建旨在欺骗部署的模型做出错误预测的输入,同时对于人类观察者来说看起来是正常的。

这种生命周期视角揭示了不同的威胁需要不同的防御策略。数据验证保护收集阶段,安全训练环境保护训练阶段,访问控制和 API 设计保护部署,输入验证保护推理。通过理解哪些攻击针对哪些生命周期阶段,安全团队能够在适当的架构层实施适当的防御措施。

图片

图 15.2:机器学习生命周期威胁:模型盗窃、数据中毒和对抗性攻击针对机器学习生命周期的不同阶段(从数据摄取到模型部署和推理),在每个步骤中创造独特的漏洞。了解这些生命周期位置可以阐明攻击面,并指导开发针对稳健人工智能系统的针对性防御策略。

机器学习模型并非仅仅是攻击的被动受害者;在某些情况下,它们可以被用作攻击策略的一部分。预训练模型,尤其是大型生成或判别网络,可能被调整以自动化诸如对抗性样本生成、钓鱼内容合成 12 或协议篡改等任务。开源或公开可访问的模型可以被微调以用于恶意目的,包括模仿、监控或逆向工程安全系统。

模型盗窃

第一类针对特定模型的威胁针对机密性。当对手获取到训练模型的参数、架构或输出行为时,就会产生对模型机密性的威胁。这些攻击可能会损害机器学习系统的经济价值,允许竞争对手复制专有功能,或暴露在模型权重中编码的私人信息。

这些威胁出现在各种部署环境中,包括公共 API13、云托管服务、设备上的推理引擎和共享模型存储库 14。由于暴露的接口、不安全的序列化格式 15 或访问控制不足,机器学习模型可能存在漏洞,这些因素为未经授权的提取或复制创造了机会 (Ateniese 等人 2015)。

这些威胁的严重性通过高调的法律案例得到了强调,这些案例突出了机器学习模型的战略和经济价值。例如,前谷歌工程师安东尼·莱万多夫斯基被指控在创立竞争性初创公司之前从 Waymo偷窃专有设计,包括其自动驾驶汽车技术的关键组件。此类案例说明了内部威胁绕过技术保护并获取敏感知识产权的潜在可能性。

模型盗窃的后果不仅限于经济损失。被盗的模型可以被用来提取敏感信息,复制专有算法,或启用进一步的攻击。经济影响可能非常严重:研究估计表明,大型语言模型的一些方面可以通过系统性的 API 查询来近似,其成本比原始训练低几个数量级,尽管完全复制模型在技术和经济上仍然具有挑战性 (Tramèr 等人 2016; Carlini 等人 2024)。例如,一个从电子商务平台获得被盗推荐模型的竞争对手可能会获得有关客户行为、商业分析和嵌入式商业机密的见解。这些知识也可以用来进行模型反演攻击 16,其中攻击者试图推断关于模型训练数据的私人细节 (Fredrikson, Jha, and Ristenpart 2015)。

在模型反演攻击中,攻击者通过合法接口查询模型,例如公共 API,并观察其输出。通过分析置信度分数或输出概率,攻击者可以优化输入以重建类似于模型训练集的数据。例如,用于安全访问的面部识别模型可以被操纵以揭示其训练的员工照片的统计特性。类似的安全漏洞已在 Netflix Prize 数据集的研究中得以证明 17,研究人员从匿名数据中推断出个人的电影偏好 (A. Narayanan and Shmatikov 2006))。

模型盗窃可以针对两个不同的目标:提取精确的模型属性,例如架构和参数,或者复制近似模型行为以产生类似输出,而不直接访问内部表示。理解神经网络架构有助于识别哪些架构模式最易受到提取攻击。具体的架构漏洞因模型类型而异,如第四章所述。这两种形式的盗窃都损害了机器学习系统的安全和价值,如下小节所述。

这两种攻击路径在图 15.3 中进行了说明。在精确模型窃取中,攻击者可以访问模型的内部组件,包括序列化文件、权重和架构定义,并直接复制模型。相比之下,近似模型窃取依赖于观察模型的输入输出行为,通常通过公共 API 进行。通过反复查询模型并收集响应,攻击者训练一个模拟器来模仿原始模型的功能。第一种方法损害了模型的内部设计和训练投资,而第二种威胁到其预测价值,并可能促进进一步的攻击,如对抗性示例迁移或模型反转。

图片

图 15.3:模型窃取策略:攻击者可以针对模型内部参数或外部行为来创建被盗的副本。直接窃取提取模型权重和架构,而近似窃取通过查询原始的输入输出行为来训练模拟器模型,可能在没有直接访问内部组件的情况下实现进一步的攻击。

精确模型窃取

精确模型属性窃取是指针对提取机器学习模型内部结构和学习参数的攻击。这些攻击通常针对通过 API 公开的部署模型,嵌入在设备推理引擎中,或在协作平台上作为可下载模型文件共享的模型。利用弱访问控制、不安全的模型打包或未受保护的部署接口,攻击者可以在不要求对底层基础设施完全控制的情况下恢复专有模型资产。

这些攻击通常寻求三种类型的信息。第一种是模型学习到的参数,例如权重和偏差。通过提取这些参数,攻击者可以在不承担训练成本的情况下复制模型的功能。这种复制使他们能够从模型性能中获益,同时绕过原始的开发努力。

第二个目标是模型的微调超参数,包括学习率、批量大小和正则化设置等训练配置。这些超参数对模型性能有显著影响,窃取它们允许攻击者通过最小额外的实验来重现高质量的结果。

最后,攻击者可能试图重建模型的架构。这包括定义模型行为的层序列和类型、激活函数以及连接模式。架构窃取可能通过侧信道攻击 18、逆向工程或分析可观察到的模型行为来完成。

揭示架构不仅会损害知识产权,还会让竞争对手对提供竞争优势的设计选择有战略洞察。

系统设计者必须通过确保模型序列化格式、限制对运行时 API 的访问以及加固部署管道来考虑这些风险。保护模型需要结合软件工程实践,包括访问控制、加密和混淆技术,以降低未经授权提取的风险(Tramèr 等人 2016)。

近似模型窃取

当一些攻击者寻求提取模型的确切内部属性时,其他人则专注于复制其外部行为。近似模型行为窃取是指试图在不直接访问其参数或架构的情况下重新创建模型的决策能力。相反,攻击者通过观察模型的输入和输出来构建一个在相同任务上表现相似的替代模型。

这种类型的窃取通常针对作为服务部署的模型,其中模型通过 API 公开或嵌入在面向用户的应用程序中。通过反复查询模型并记录其响应,攻击者可以训练自己的模型来模仿原始模型的行为。这个过程通常被称为模型蒸馏 19 或仿制建模,允许攻击者在无法访问原始模型专有内部结构的情况下实现类似的功能(Orekondy、Schiele 和 Fritz 2019)。

攻击者可以通过两种方式评估行为复制的成功率。第一种是通过衡量替代模型的效率水平。这涉及到评估克隆模型是否在基准任务上实现了类似的准确度、精确度、召回率或其他性能指标。通过将替代模型的性能与原始模型对齐,攻击者可以构建一个在效果上实际上无法区分的模型,即使其内部结构不同。

第二种是通过测试预测一致性。这涉及到检查替代模型在提供相同输入时是否产生与原始模型相同的输出。匹配不仅包括正确的预测,还包括原始模型的错误,可以为攻击者提供对目标模型行为的忠实复制。这在自然语言处理等应用中尤其令人担忧,攻击者可能复制情感分析模型以获得竞争优势或绕过专有系统。

近似行为窃取在开放访问部署环境中,例如公共 API 或面向消费者的应用程序中,证明难以防御。限制查询速率、检测自动化提取模式以及水印模型输出是帮助减轻这种风险的几种技术。然而,这些防御措施必须与可用性和性能考虑因素相平衡,尤其是在生产环境中。

一个近似模型盗窃的演示是通过公共 API 提取黑盒语言模型的内部组件。在他们的论文中,Carlini 等人 (2024)展示了如何仅通过公共 API 访问来重建包括adababbagegpt-3.5-turbo在内的几个 OpenAI 模型的最终嵌入投影矩阵。通过利用输出投影层的低秩结构和精心设计的查询,他们恢复了模型的隐藏维度,并复制了权重矩阵直到仿射变换。

攻击并未重建完整模型,而是揭示了内部架构参数,并为未来的更深层提取设定了先例。这项工作表明,即使是部分模型盗窃也可能会对机密性和竞争优势构成风险,尤其是在模型行为可以通过丰富的 API 响应(如 logit 偏差和对数概率)进行探测的情况下。

表 15.2:模型盗窃成本:攻击者可以使用公开 API 以相对较低的查询成本提取模型权重;该表量化了 OpenAI 的 ada 和 babbage 模型所面临的这一威胁,显示通过少于(4 ⁶)次查询提取权重可以实现低根均方误差(RMSE)。权重提取的估计成本在 1 到 12 美元之间,这表明尽管存在 API 速率限制和相关费用,模型盗窃攻击在经济上是可行的。来源:Carlini 等人 (2024)。

模型 大小 (维度提取) 查询数 RMS (权重矩阵提取) 成本 (美元)
OpenAI ada 1024 ✓ < 2 ⁶$ | 51045 \cdot 10^{-4} | $1 / $4
OpenAI babbage 2048 ✓ < 4 ⁶$ | 71047 \cdot 10^{-4} | $2 / $12
OpenAI babbage-002 1536 ✓ < 4 ⁶$ | 未实现 | $2 / $12
OpenAI gpt-3.5-turbo-instruct 未公开 < 4 ⁷$ | 未实现 | $200 / ~$2,000 (估计)
OpenAI gpt-3.5-turbo-1106 未公开 < 4 ⁷$ | 未实现 | $800 / ~$8,000 (估计)

如他们在表 15.2 中所示的实证评估所示,模型参数可以以低至10410^{-4}的均方根误差被提取,证实了在规模上实现高保真近似是可行的。这些发现对系统设计具有重要意义,表明如果不受严格控制,看似无害的 API 功能,如返回 top-k logits,可以成为重要的泄露向量。

案例研究:特斯拉知识产权盗窃

2018 年,特斯拉对自动驾驶汽车初创公司Zoox提起了诉讼,指控前特斯拉员工窃取了与特斯拉自动驾驶技术相关的专有数据和商业机密。根据诉讼,几名员工在离开特斯拉加入 Zoox 之前转移了超过 10 吉字节的秘密文件,包括机器学习模型和源代码。

在被盗材料中,有一个用于特斯拉自动驾驶系统中物体检测的关键图像识别模型。通过获得这个模型,Zoox 可以绕过多年的研发,为公司带来竞争优势。除了经济影响之外,还有担忧被盗模型可能会使特斯拉面临进一步的安全风险,例如针对模型训练集提取敏感数据的模型反演攻击。

Zoox 的员工否认了任何不当行为,此案最终在庭外和解。这一事件突显了模型盗窃的现实风险,特别是在机器学习模型代表重大知识产权的行业中。模型的盗窃不仅损害了竞争优势,还引发了关于隐私、安全和下游滥用的更广泛担忧。

这个案例表明,模型盗窃不仅限于在 API 或公共接口上进行的理论攻击。内部威胁、供应链漏洞以及未经授权访问开发基础设施对在商业环境中部署的机器学习系统同样构成严重风险。

数据投毒

当模型盗窃针对的是机密性时,第二类威胁则集中在训练完整性上。训练完整性威胁源于用于训练机器学习模型的数据被操纵。这些攻击旨在通过引入看似无害但会在最终模型中引起有害或偏见的行为的示例来破坏学习过程。

数据中毒攻击是一个突出的例子,其中攻击者将精心制作的数据点注入训练集中,以针对或系统性地影响模型行为(Biggio, Nelson, and Laskov 2012)。中毒数据可能导致模型做出错误的预测,降低其泛化能力,或者嵌入在部署后触发的故障模式。

数据中毒是一种安全威胁,因为它涉及攻击者有意操纵训练数据,目的是嵌入漏洞或颠覆模型行为。这些攻击在模型在从外部来源收集的数据上重新训练的应用中引起关注,包括用户交互、众包注释 20 和在线抓取,因为攻击者可以在不直接访问训练管道的情况下注入中毒数据。

这些攻击发生在多种威胁模型中。从安全角度来看,中毒攻击根据攻击者的访问级别和知识水平而有所不同。在白盒场景中,攻击者可能对模型架构或训练过程有详细的了解,从而能够进行更精确的操作。相比之下,黑盒或有限访问攻击利用开放的数据提交渠道或间接注入向量。中毒攻击可以针对机器学习管道的不同阶段,从数据收集和预处理到标记和存储,使得攻击面既广泛又依赖于系统。数据中毒威胁的相对优先级根据部署环境的不同而变化,如第 15.4.1 节所述。

中毒攻击通常遵循三个阶段的过程。首先,攻击者将恶意数据注入训练集中。这些例子通常设计得看似合法,但引入了细微的扭曲,从而改变了模型的学习过程。其次,模型在受损害的数据上训练,嵌入攻击者的意图行为。最后,一旦模型部署,攻击者可能利用改变后的行为来造成误预测、绕过安全检查或降低整体可靠性。

为了精确理解这些攻击机制,数据中毒可以被视为一个双层优化问题,其中攻击者试图选择中毒数据 DpD_p 以最大化模型在验证或目标数据集 DtestD_{\text{test}} 上的损失。令 DD 代表原始训练数据。攻击者的目标是解决: maxDp(fDDp,Dtest) \max_{D_p} \ \mathcal{L}(f_{D \cup D_p}, D_{\text{test}}) 其中 fDDpf_{D \cup D_p} 代表在原始和中毒数据组合数据集上训练的模型。对于定向攻击,这个目标可以细化以关注特定的输入 xtx_t 和目标标签 yty_tmaxDp(fDDp,xt,yt) \max_{D_p} \ \mathcal{L}(f_{D \cup D_p}, x_t, y_t)

这种公式捕捉了对手引入精心设计的数据点以操纵模型决策边界的目标。

例如,考虑一个训练有素的交通标志分类模型,该模型旨在区分停车标志和限速标志。攻击者可能会将少量标记为限速标志的停车标志图像注入训练数据中。攻击者的目标是微妙地改变模型的决策边界,使得未来的停车标志被错误地分类为限速标志。在这种情况下,中毒数据DpD_p由错误标记的停车标志图像组成,攻击者的目标是最大化合法停车标志xtx_t被错误分类为限速标志yty_t,遵循上述针对性攻击公式。即使模型在其他类型的标志上表现良好,中毒的训练过程也会创建一个可预测且可利用的漏洞。

根据其目标和影响范围,数据中毒攻击可以被分类。可用性攻击通过引入噪声或标签翻转来降低任务的整体准确性,从而降低模型性能。针对性攻击操纵特定的输入或类别,保持一般性能不变,但在某些情况下会导致一致的误分类。后门攻击 21 嵌入隐藏的触发器,这些触发器通常是难以察觉的模式,只有在触发器存在时才会引发恶意行为。子群体攻击降低特定群体(由共享特征定义)的性能,在公平敏感的应用中尤其危险。

针对性中毒攻击的一个引人注目的现实世界例子是对 Google 广泛使用的在线毒性检测模型 Perspective 进行的攻击 22,该模型帮助平台识别有害内容(Hosseini 等人 2017)。通过将带有细微拼写错误和语法错误的合成有害评论注入模型的训练集中,研究人员降低了其检测有害内容的能力 23。

缓解数据中毒威胁需要数据管道的端到端安全性,包括收集、存储、标记和训练。预防措施包括输入验证检查、训练数据集完整性的验证以及异常检测以标记可疑模式。同时,鲁棒的训练算法可以通过降低异常实例的权重或过滤掉它们来限制错误标记或操纵数据的影响。虽然没有单一技术可以保证免疫,但结合主动数据治理、自动化监控和鲁棒的学习实践对于在现实部署中保持模型完整性至关重要。

对抗性攻击

从训练时间到推理时间的威胁,第三类针对的是模型在部署期间的鲁棒性。推理鲁棒性威胁发生在攻击者在测试时间操纵输入以诱导错误预测时。与数据中毒不同,数据中毒会破坏训练过程,这些攻击利用了模型在推理过程中的决策表面上的脆弱性。

这类威胁的核心类别是对抗攻击,其中精心构造的输入被设计成在几乎与合法数据无法区分的情况下导致错误的预测。正如第十六章中详细所述,这些攻击突显了机器学习模型对微小、有针对性的扰动敏感的脆弱性,这些扰动可以极大地改变输出置信度或分类结果。

这些攻击在自动驾驶、生物识别认证和内容审核等领域创造了重大的现实风险。其有效性可能非常显著:研究表明,对抗样本可以在修改不到 0.01%的像素值的情况下,对最先进的图像分类器实现 99%以上的攻击成功率,这些变化对人类几乎不可察觉(Szegedy 等人 2013a;Goodfellow、Shlens 和 Szegedy 2014a)。在物理世界攻击中,大小仅为图像 2%的对抗性补丁可以在不同的光照条件下以 80%以上的成功率将自动车辆的停止标志误分类为速度限制标志(Eykholt 等人 2017)。

与在训练期间破坏模型的数据中毒不同,对抗攻击在测试时间操纵模型的行为,通常不需要访问训练数据或模型内部。因此,攻击面从上游数据管道转移到实时交互,需要能够检测或减轻推理点恶意输入的鲁棒防御机制。

对抗样本生成的数学基础和攻击算法的全面分类,包括基于梯度的、基于优化的和基于迁移的技术,在第十六章中有详细论述,该章节探讨了构建对抗性抵抗系统的鲁棒方法。

对抗攻击根据攻击者对模型的访问级别而有所不同。在白盒攻击中,攻击者对模型的架构、参数和训练数据有全面了解,使他们能够制作出高度有效的对抗样本。在黑盒攻击中,攻击者没有内部知识,必须依赖查询模型并观察其输出。灰盒攻击介于这两种极端之间,攻击者拥有部分信息,例如可以访问模型架构但不能访问其参数。

这些攻击者模型可以总结为知识水平的一个连续谱。表 15.3 突出了模型访问、数据访问、典型攻击策略和常见部署场景之间的差异。这些区别有助于描述在不同部署环境中确保机器学习系统安全的实际挑战。

常见的攻击策略包括代理模型构建、利用对抗迁移性的迁移攻击以及基于 GAN 的扰动生成。这些方法的技术细节及其数学公式在第十六章中得到了详尽的阐述。

表 15.3:对抗知识谱系:攻击者对模型细节和训练数据的访问级别不同,定义了不同的威胁模型,影响了对抗攻击的可行性和复杂性,并影响了部署安全策略。该表按访问级别、典型攻击方法和常见部署场景对这些模型进行分类,明确了确保机器学习系统安全的实际挑战。

对抗知识水平 模型访问 训练数据访问 攻击示例 常见场景
白盒 完全访问架构和参数 完全访问 使用梯度构建对抗示例 内部威胁,开源模型重用
灰盒 部分访问(例如,仅架构) 有限或无访问 基于代理模型近似的攻击 已知模型家族,未知微调
黑盒 无内部访问;只有查询-响应视图 无访问 基于查询的代理模型训练和迁移攻击 公共 API,模型即服务部署

一个具有说明性的例子涉及对交通标志识别系统的操纵(Eykholt 等人 2017)。研究人员证明,在停车标志上放置小贴纸可能导致机器学习模型将它们错误分类为限速标志。尽管修改后的标志对人类来说仍然容易识别,但模型却持续地将它们误认为是限速标志。这类攻击在自动驾驶等需要可靠感知的应用中存在严重风险,因为可靠感知对于安全至关重要。

对抗性攻击突出了需要强大的防御措施,这些措施不仅限于提高模型准确性。为了保护机器学习系统免受对抗性威胁,需要运行时防御措施,例如输入验证、异常检测以及在推理期间监控异常模式。训练时间鲁棒性方法(例如,对抗性训练)补充了这些策略,并在第十六章中进行了探讨。支持鲁棒模型发展的训练方法在第八章第八章中详细说明。这些防御措施旨在增强模型对对抗性样本的抵抗力,确保机器学习系统即使在存在恶意输入的情况下也能可靠地运行。

案例研究:交通标志攻击

2017 年,研究人员通过在停车标志上放置小块黑白贴纸(Eykholt 等人 2017)进行了实验。如图图 15.4 所示,这些贴纸被设计成几乎对人类眼睛不可见,但机器学习模型在观察时却显著改变了停车标志的外观。对于正常的人类眼睛来说,这些贴纸并没有遮挡标志或阻止可解释性。然而,当贴纸停车标志的图像被输入到标准的交通标志分类机器学习模型时,有超过 85%的时间被错误地分类为限速标志。

图片

图 15.4:对抗性贴纸:几乎不可见的贴纸可以使机器学习模型在 85%以上的时间内将停车标志错误地分类为限速标志。这强调了机器学习系统对对抗性攻击的脆弱性。来源:Eykholt 等人(2017)。

这个演示展示了简单的对抗性贴纸如何欺骗机器学习系统错误地读取重要的道路标志。如果实际部署,这些攻击可能会危及公共安全,导致自动驾驶汽车将停车标志误认为是限速标志。研究人员警告说,这可能会造成危险的滚动停车或加速进入交叉路口。

这个案例研究具体说明了对抗性示例是如何利用机器学习模型的模式识别机制的。通过微妙地改变输入数据,攻击者可以诱导错误的预测,并对自动驾驶汽车等安全重要应用造成重大风险。攻击的简单性展示了即使是微小的、不可察觉的变化也可能使模型误入歧途。因此,开发者必须实施针对此类威胁的强大防御措施。

这些威胁类型跨越了机器学习生命周期的不同阶段,并需要不同的防御策略。下表表 15.4 总结了它们的关键特征。

表 15.4:威胁格局:机器学习系统在其生命周期中面临各种威胁,从训练期间的数据操纵到部署后的模型盗窃。该表按生命周期阶段和攻击向量对这些威胁进行分类,阐明漏洞如何显现,并使针对性的缓解策略成为可能。

威胁类型 生命周期阶段 攻击向量 示例影响
模型盗窃 部署 API 访问,内部泄露 盗窃的知识产权,模型反演,行为克隆
数据中毒 训练 标签翻转,后门 目标误分类,精度下降
对抗性攻击 推理 输入扰动 实时误分类,安全故障

针对特定威胁的适当防御措施取决于其类型、攻击向量以及它在机器学习生命周期中的位置。图 15.5 提供了一个简化的决策流程,将常见的威胁类别,如模型盗窃、数据中毒和对抗性示例,与相应的防御策略相连接。虽然现实世界的部署可能需要更细致的防御组合,正如我们在分层防御框架中所讨论的,但此流程图作为将威胁模型与实际缓解技术相匹配的概念指南。

图片

图 15.5:威胁缓解流程:此图将常见的机器学习威胁映射到相应的防御策略,根据攻击向量和生命周期阶段进行选择。通过遵循此流程,从业者可以将威胁模型与实际缓解技术(如安全模型访问和数据净化)相匹配,以构建更稳健的人工智能系统。

尽管机器学习模型本身提供了重要的攻击面,但它们最终运行在可能引入超出模型控制范围的安全漏洞的硬件上。从基于软件的威胁到基于硬件的漏洞的转变代表了安全领域的重大转变。软件攻击针对代码逻辑和数据流,而硬件攻击则利用计算基质的物理属性。

驱动机器学习工作负载的专用计算基础设施创建了一个分层攻击面,它远远超出了传统的软件漏洞。这包括执行指令的处理器、存储数据的内存系统以及在不同组件之间传递信息的互连。理解这些硬件级别的风险是至关重要的,因为它们可以绕过传统的软件安全机制,并且难以检测。这些风险通过第 15.8.7 节中详细介绍的基于硬件的安全机制来解决。

在下一节中,我们将探讨对手如何通过硬件故障、物理篡改、旁路通道和供应链风险来针对执行机器学习工作负载的物理基础设施。

硬件级安全漏洞

随着机器学习系统从研究原型发展到大规模、实际部署,它们的安全性依赖于运行的硬件平台。无论是在数据中心、边缘设备还是嵌入式系统中,机器学习应用都依赖于由处理器、加速器、内存和通信接口组成的分层堆栈。这些硬件组件虽然对于实现高效计算至关重要,但它们引入了独特的安全风险,这些风险超出了传统的基于软件的漏洞。

与通用软件系统不同,机器学习工作流程通常在性能受限的环境中处理高价值模型和敏感数据。这使得它们不仅成为软件攻击的目标,也成为硬件级别利用的目标。硬件中的漏洞可能会使模型面临被盗用的风险,泄露用户数据,破坏系统可靠性,或允许对手操纵推理结果。由于硬件在软件堆栈之下运行,此类攻击可以绕过传统的安全机制,并且难以检测。

理解硬件安全威胁需要考虑计算子层如何实现机器学习操作。在硬件层面,CPU 组件如算术逻辑单元、寄存器和缓存执行驱动模型推理和训练的指令。内存层次结构决定了模型访问参数和中间结果的速度。硬件-软件接口,由固件和引导加载程序介导,为系统操作建立了初始的信任基础。计算的物理特性——包括功耗、时序特性和电磁辐射——创造了攻击者可以利用以提取敏感信息的可观察信号。

硬件威胁源于多个来源,贯穿整个系统生命周期。处理器架构中的设计缺陷,例如 Meltdown 和 Spectre 等漏洞,可能损害安全保证。物理篡改能够直接操纵组件和数据流。侧信道攻击通过电源轨迹、时间变化和电磁辐射等意外信息泄露来利用。供应链妥协在制造和分销过程中引入恶意组件或修改。这些威胁共同构成了一个关键的攻击面,必须解决以构建可信的机器学习系统。对于关注实际部署的读者,关键经验教训集中在供应链验证、物理访问控制和硬件信任锚上,而第 15.8 节中的防御策略提供了无论深度架构专业知识如何都可行的指导。

表 15.5 总结了硬件安全威胁的主要类别,描述了它们的起源、方法和对于机器学习系统设计和部署的影响。

表 15.5: 硬件威胁格局:机器学习系统面临着从内在设计缺陷到物理攻击和供应链漏洞的多种硬件威胁。理解这些威胁及其与机器学习的相关性对于构建安全和可信的人工智能部署至关重要。

威胁类型 描述 对机器学习硬件安全的相关性
硬件缺陷 硬件设计中固有的缺陷,可能损害系统完整性。 硬件漏洞的基础。
物理攻击 通过物理访问或操作直接利用硬件。 基本且明显的威胁模型。
故障注入攻击 诱导故障导致硬件操作中的错误,可能导致系统崩溃。 导致失败的系统性操纵。
侧信道攻击 利用硬件操作中泄露的信息来提取敏感数据。 通过环境观察的间接攻击。
泄露接口 由于接口无意中暴露数据而产生的漏洞。 通过通信渠道的数据暴露。
假冒硬件 使用未经授权的硬件组件,这些组件可能存在安全漏洞。 复合的漏洞问题。
供应链风险 通过硬件生命周期(从生产到部署)引入的风险。 累积的多方面安全挑战。

硬件缺陷

硬件威胁的第一类源于设计漏洞。硬件并非免疫于设计缺陷或错误这一普遍问题。攻击者可以利用这些漏洞访问、操纵或提取敏感数据,破坏用户和服务所依赖的机密性和完整性。最引人注目的例子之一是Meltdown 和 Spectre24 的发现——现代处理器中的两个漏洞,允许恶意程序绕过内存隔离并读取其他应用程序和操作系统的数据(Kocher 等人 2019a, 2019b)。

这些攻击利用了推测执行 25,这是 CPU 中的一种性能优化,在安全检查完成之前,它以不正确的顺序执行指令。虽然提高了计算速度,但这种优化无意中通过微架构的旁路通道(如 CPU 缓存)暴露了敏感数据。这些攻击的技术复杂性凸显了即使在广泛的硬件验证下,消除漏洞的难度。

进一步的研究表明,这些并非孤立事件。如 Foreshadow、ZombieLoad 和 RIDL 等变体针对不同的微架构元素,从安全区域到 CPU 内部缓冲区,这表明推测执行漏洞是系统性的硬件风险。这种系统性意味着虽然这些攻击最初是在通用 CPU 上展示的,但它们的含义延伸到机器学习加速器和专用硬件。机器学习系统通常依赖于结合 CPU 与 GPU、TPU、FPGA 或定制加速器的异构计算平台。这些组件处理敏感数据,如个人信息、医疗记录或专有模型。此堆栈任何部分的漏洞都可能使这些数据暴露于攻击者。

例如,一个边缘设备,如运行在加速器上的智能摄像头,如果硬件缺乏适当的缓存隔离,运行面部识别模型可能会存在漏洞。攻击者可能利用这种弱点提取中间计算、模型参数或用户数据。在云推理服务中,也存在类似的风险,其中硬件多租户增加了跨租户数据泄露的可能性。

这种漏洞在隐私敏感领域(如医疗保健)中引起关注,在这些领域中,机器学习系统通常处理患者数据。一旦发生泄露,可能会违反隐私法规,例如健康保险可携带性和问责制法案(HIPAA)26,导致重大的法律和伦理后果。类似的监管风险在全球范围内适用,GDPR27 对未能实施适当技术措施以保护欧盟公民数据的组织处以高达全球收入 4%的罚款。

这些例子说明,硬件安全并不仅仅是防止物理篡改。它还需要架构保障来防止通过硬件本身的数据泄露。随着处理器、加速器和内存系统出现新的漏洞,应对这些风险需要持续的缓解努力,通常涉及性能权衡,尤其是在计算和内存密集型的机器学习工作负载中。主动解决方案,如机密计算和可信执行环境(TEEs),提供了有希望的建筑防御。然而,实现稳健的硬件安全需要在系统生命周期的每个阶段都给予关注,从设计到部署。

物理攻击

除了设计缺陷之外,第二类涉及直接的物理操作。物理篡改是指直接、未经授权地操纵计算硬件,以破坏机器学习系统的完整性。这种攻击尤其令人担忧,因为它绕过了传统的软件安全防御措施,直接针对机器学习所依赖的物理组件。由于机器学习系统依赖于硬件传感器、加速器和存储来处理大量数据并在现实世界环境中产生可靠的输出,因此它们特别容易受到此类攻击。

虽然包括加密、身份验证和访问控制在内的软件安全措施可以保护机器学习系统免受远程攻击,但它们对拥有物理访问设备设备的对手提供的防御很少。物理篡改的范围从简单的操作,如将恶意 USB 设备插入边缘服务器,到在芯片制造过程中嵌入硬件木马的高度复杂操作。这些威胁对于在边缘或物理暴露环境中部署的机器学习系统尤其相关,攻击者可能有机会直接干扰硬件。

要了解此类攻击如何在实际中影响机器学习系统,可以考虑一个用于环境测绘或基础设施检查的机器学习无人机示例。无人机的导航依赖于处理来自 GPS、摄像头和惯性测量单元的数据的机器学习模型。如果攻击者获得了对无人机的物理访问权限,他们可以替换或修改其导航模块,嵌入一个隐藏的后门,改变飞行行为或重新路由数据收集。这种操纵不仅损害了系统的可靠性,还打开了滥用的大门,例如监视或走私行动。

这些威胁跨越了应用领域。物理攻击不仅限于移动系统。依赖于机器学习模型处理人脸或指纹数据的生物识别访问控制系统也容易受到攻击。这些系统通常使用嵌入式硬件来捕获和处理生物识别输入。攻击者可以用一个设计用来捕获和传输个人识别数据给未经授权接收者的修改组件物理替换生物识别传感器。这创造了多个漏洞,包括未经授权的数据访问和允许未来的冒充攻击。

除了篡改外部传感器外,攻击者还可能针对内部硬件子系统。例如,用于自动驾驶汽车中的传感器,包括摄像头、激光雷达和雷达,对于解释周围环境的机器学习模型至关重要。恶意行为者可以通过物理错位或遮挡这些传感器,降低模型的感知能力,并造成安全隐患。

硬件木马也构成了另一个严重风险。在芯片制造或组装过程中引入的恶意修改可以在机器学习加速器或推理芯片中嵌入休眠电路。这些木马在正常条件下可能保持不活跃,但在处理特定输入或达到系统状态时触发恶意行为。这种隐藏的漏洞可能会干扰计算、泄露模型输出或以难以诊断的方式降低系统性能。

内存子系统也是吸引攻击者的目标。拥有物理访问边缘设备或嵌入式机器学习加速器的攻击者可以操纵内存芯片以提取加密的模型参数或训练数据。包括电压操控和电磁干扰在内的故障注入技术可以通过破坏模型权重或在推理期间强制执行错误计算来进一步降低系统可靠性。

物理访问威胁也扩展到数据中心和云环境。拥有足够访问权限的攻击者可以安装硬件植入物,如键盘记录器或数据拦截器,以捕获管理凭证或监控数据流。这种植入物可以提供持续的后门访问,使长期监控或从机器学习训练和推理管道中窃取数据成为可能。

总结来说,对机器学习系统的物理攻击威胁了广泛部署环境中的安全和可靠性。应对这些风险需要结合硬件级别的保护、篡改检测机制和供应链完整性检查。如果没有这些安全措施,即使是最安全的软件防御也可能被通过直接物理操作引入的漏洞所破坏。

故障注入攻击

建立在物理篡改技术的基础上,故障注入代表了一种更复杂的硬件利用方法。故障注入是一类强大的物理攻击,它故意破坏硬件操作以在计算中引起错误。这些引起的故障可以通过导致模型产生错误输出、降低可靠性或泄露敏感信息来损害机器学习模型的完整性。对于机器学习系统,这些故障不仅会干扰推理,还会使模型面临更深入的利用,包括逆向工程和安全协议的绕过(Joye 和 Tunstall 2012)。

攻击者通过在硬件执行计算时施加精确时间控制的物理或电气干扰来实现故障注入。诸如低电压操作(Barenghi 等人 2010)、电源尖峰(M. Hutter, Schmidt 和 Plos 2009)、时钟故障(Amiel, Clavier 和 Tunstall 2006)、电磁脉冲(Agrawal 等人 2007)、温度变化(S. Skorobogatov 2009)以及甚至激光打击(S. P. Skorobogatov 和 Anderson 2003)等技术已被证明可以破坏程序执行的具体部分。这些干扰可以引起诸如位翻转、跳过的指令或损坏的内存状态等效果,攻击者可以利用这些效果来改变机器学习模型的行为或提取敏感信息。

对于机器学习系统,这些攻击带来了几个具体的风险。故障注入会降低模型精度,强制进行错误分类,触发拒绝服务,甚至泄露内部模型参数。例如,攻击者可以向在微控制器上运行的嵌入式机器学习模型注入故障,迫使其在安全至关重要的应用中(如自主导航或医疗诊断)错误地分类输入。更复杂的攻击者可能会针对内存或控制逻辑来窃取知识产权,例如专有模型权重或架构细节。

这些攻击的实际可行性已通过控制实验得到证明。一个值得注意的例子是 Breier 等人的工作(2018),研究人员成功地对部署在微控制器上的深度神经网络进行了激光故障注入攻击。如图 15.6 所示,通过加热特定的晶体管,他们迫使硬件跳过执行步骤,包括 ReLU 激活函数。

图片

图 15.6: 激光故障注入: 聚焦的激光脉冲在微控制器内存中引起位翻转,使攻击者能够操纵模型执行并损害系统完整性。研究人员利用这项技术来模拟硬件错误,揭示嵌入式机器学习系统中的漏洞,并指导容错设计的开发。来源:(Breier 等人 2018)。

这种操纵在图 15.7 中得到了说明,该图显示了一个实现 ReLU 激活函数的汇编代码段。通常,代码比较累加器的最高有效位(MSB)与零,并使用 brge(如果大于或等于则分支)指令,如果值非正则跳过赋值。然而,故障注入抑制了分支,导致处理器始终执行“else”块。因此,神经元的输出被强制设为零,无论输入值如何。

图片

图 15.7: 故障注入攻击: 通过操纵汇编代码绕过安全检查,强制神经元输出为零,无论输入如何,从而展示了机器学习系统中的硬件漏洞。来源:(Breier 等人 2018)。

故障注入攻击还可以与侧信道分析相结合,其中攻击者首先观察功率或时序特征,以推断模型结构或数据流。这种侦察使他们能够针对特定的层或操作,例如激活函数或最终决策层,最大化注入故障的影响。

嵌入式和边缘机器学习系统尤其容易受到攻击,因为它们通常缺乏物理加固,并且在资源受限的环境下运行,这限制了运行时防御。如果没有防篡改包装或安全硬件区域,攻击者可能直接访问系统总线内存,从而实现精确的故障操纵。许多嵌入式机器学习模型被设计为轻量级,这使它们几乎没有冗余或错误纠正来恢复由诱导的故障。

缓解故障注入需要多种互补的保护措施。物理保护,如防篡改外壳和设计混淆,有助于限制物理访问。异常检测技术可以监控传感器输入或模型输出以寻找故障引起的异常迹象 (Hsiao 等人 2023)。纠错内存和安全的固件可以降低静默损坏的可能性。如果被盗模型后来被对手部署,模型水印等技术可能提供可追溯性。

在成本和功耗受限的环境中实现这些保护措施很困难,在这些环境中,添加加密硬件或冗余可能不可行。要实现针对故障注入的弹性,需要跨层设计考虑,这些考虑跨越了电气、固件、软件和系统架构级别。没有这样的整体设计实践,部署在现场的机器学习系统可能仍然容易受到这些低成本但高度有效的物理攻击的影响。

侧信道攻击

从直接故障注入到间接信息泄露,侧信道攻击构成了一类安全漏洞,这些漏洞利用了通过计算系统的物理实现无意中泄露的信息。与针对软件或网络漏洞的直接攻击不同,这些攻击利用系统的硬件特性,包括功耗、电磁辐射或时序行为,以提取敏感信息。

侧信道攻击的核心前提是设备的操作可以通过可观察的物理信号泄露信息。这种泄露可能源于设备消耗的电能(Kocher, Jaffe, and Jun 1999),它发出的电磁场(Gandolfi, Mourtel, and Olivier 2001),完成计算所需的时间,甚至它产生的声学噪声。通过仔细测量和分析这些信号,攻击者可以推断内部系统状态或恢复机密数据。

尽管这些技术在密码学中经常被讨论,但它们对机器学习系统同样相关。部署在硬件加速器、嵌入式设备或边缘系统上的机器学习模型经常处理敏感数据。即使这些模型受到安全算法或加密的保护,它们的物理执行可能泄露侧信道信号,这些信号可能被对手利用。

最广泛研究的一个例子涉及高级加密标准(AES)28 的实现。虽然 AES 在数学上是安全的,但其加密函数的物理计算过程会泄露可测量的信号。

这种攻击技术的一个有用例子可以在密码认证过程的功耗分析中看到。考虑一个验证 5 字节密码的设备——在这种情况下,0x61, 0x52, 0x77, 0x6A, 0x73。在认证过程中,设备通过串行接口逐个接收每个字节,其功耗模式揭示了系统如何响应这些输入。

图 15.8 展示了输入正确密码时设备的行为。红色波形捕获了串行数据流,标记接收到的每个字节。蓝色曲线记录了设备随时间变化的功耗。当提供完整的正确密码时,功率曲线在所有五个字节上保持稳定和一致,为与失败尝试的比较提供了一个清晰的基线。

图 15.8:功率曲线:当输入正确的密码时,设备的功耗在认证过程中保持稳定,为后续图中的比较设定了基线。来源:Colin O’Flynn。

当输入错误的密码时,功率分析图会像图 15.9 中所示那样改变。在这种情况下,前三个字节(0x61, 0x52, 0x77)是正确的,所以功率模式与正确密码匹配到那个点。然而,当处理第四个字节(0x42)并发现它是错误的时,设备停止认证。这种变化在蓝色功率线的突然跳跃中反映出来,表明设备已停止处理并进入错误状态。

图 15.9:侧信道攻击漏洞:在认证过程中,功耗模式揭示了加密密钥信息;一致的功耗表示正确的密码字节,而突然的变化则表示输入错误和停止处理。即使不知道密码,攻击者也可以通过分析设备在认证尝试期间的功耗来推断密码。来源:Colin O’Flynn。

图 15.10 展示了密码完全错误的情况(0x30, 0x30, 0x30, 0x30, 0x30)。在这里,设备在第一个字节之后立即检测到不匹配并提前停止处理。这在功率曲线中也很明显,蓝色线在第一个字节之后出现急剧跳跃,反映了设备在认证过程中的早期终止。

图 15.10:功耗跳跃:蓝色线在处理第一个字节后的急剧增加表明立即认证失败,突出了如何通过功耗快速检测到错误的密码。来源:Colin O’Flynn。

这些例子展示了攻击者如何利用可观察到的功耗差异来缩小搜索空间,并通过暴力分析最终恢复秘密数据。通过系统地测量功耗模式并将它们与不同的输入相关联,攻击者可以提取出应该保持隐藏的敏感信息。

这些漏洞的范围超出了加密应用。机器学习应用也面临着类似的风险。例如,一个基于 ML 的语音识别系统在本地设备上处理语音命令时,可能会泄露时间或功耗信号,揭示正在处理的命令。即使是微妙的声学或电磁发射也可能暴露操作模式,对手可以利用这些模式来推断用户行为。

从历史上看,旁路攻击已被用于绕过甚至最安全的加密系统。在 20 世纪 60 年代,英国情报机构 MI5 著名地利用了埃及大使馆密码机的声学发射(Burnet and Thomas 1989)。通过捕捉机器转子的机械点击声,MI5 分析人员能够显著降低破解加密信息的复杂性。这个早期例子说明,旁路漏洞不仅限于数字时代,而且根植于计算的物理性质。

今天,这些技术已经发展到包括键盘窃听(Asonov and Agrawal, n.d.)、对加密硬件的功耗分析(Gnad, Oboril, and Tahoori 2017)以及基于电压的 ML 加速器攻击(M. Zhao and Suh 2018)等攻击。时间攻击、电磁泄漏和热辐射继续为对手提供观察系统行为的间接渠道。

部署在专用加速器或嵌入式平台上的机器学习系统尤其容易受到攻击。攻击者可能利用旁路信号来推断模型结构、窃取参数或重建私有训练数据。随着 ML 在云、边缘和嵌入式环境中的日益部署,这些旁路漏洞对系统安全构成了重大挑战。

理解旁路攻击的持续性和演变对于构建具有弹性的机器学习系统至关重要。通过认识到只要有信号,就有被利用的潜力,系统设计人员可以通过结合硬件屏蔽、算法防御和操作保障来开始解决这些风险。

泄露接口

当旁路攻击利用未预期的物理信号时,泄露接口代表了一种不同类别的漏洞,涉及暴露的通信通道。计算系统中的接口对于实现通信、诊断和更新至关重要。然而,这些相同的接口在无意中暴露敏感信息或接受未经验证的输入时,可能成为重大的安全漏洞。这种泄露接口通常在系统设计期间被忽视,但它们为攻击者提供了强大的入口点,用于提取数据、操纵功能或引入恶意代码。

泄露接口是指任何泄露比预期更多信息的访问点,通常是由于身份验证薄弱、缺乏加密或隔离不足。这些问题在消费、医疗和工业系统中已被广泛证明。

例如,许多支持 WiFi 的婴儿监控器被发现暴露了未受保护的远程访问端口 29,这使得攻击者能够拦截来自私人住宅内的实时音频和视频流。同样,研究人员已经发现了起搏器中的无线漏洞 30,如果被利用,攻击者可能操纵心脏功能,引发生命威胁的安全问题。

一个涉及智能灯泡的显著案例表明,留在生产设备上的可访问调试端口 31 泄露了未加密的 WiFi 凭证。这种安全疏忽为攻击者提供了渗透家庭网络而不需要绕过标准安全机制的途径。

这些例子揭示了直接适用于机器学习部署的漏洞模式。虽然这些例子并没有直接针对机器学习系统,但它们说明了与 ML-allowed 设备高度相关的架构模式。考虑一个使用机器学习来检测用户习惯并自动响应的智能家居安全系统。这样的系统可能包括用于软件更新的维护或调试接口。如果这个接口缺乏适当的身份验证或未加密传输数据,同一网络上的攻击者可能获得未经授权的访问。这种入侵可能会暴露用户行为模式,损害模型完整性,或完全禁用安全功能。

机器学习系统中的泄露接口也可能暴露训练数据、模型参数或中间输出。这种暴露可能允许攻击者构建对抗性示例、窃取专有模型或逆向工程系统行为。更糟糕的是,这些接口可能允许攻击者篡改固件,引入恶意代码,禁用设备或将它们招募到僵尸网络中。

缓解这些风险需要在技术和组织领域进行协调保护。技术保障措施,如强身份验证、加密通信和运行时异常检测,非常重要。组织实践,如接口清单、访问控制策略和持续审计,同样重要。采用零信任架构,其中默认不信任任何接口,通过仅限制访问严格必要的内容来进一步减少暴露。

对于机器学习系统设计者来说,确保接口安全必须与算法和数据为中心的设计一样成为首要关注点。无论系统是在云端、边缘还是嵌入式环境中运行,未能保护这些访问点可能会损害整个系统的可信度。

伪造硬件

除了合法硬件中的漏洞之外,供应链本身也出现了另一个重大威胁。机器学习系统依赖于它们运行的硬件的可靠性和安全性。然而,在当今全球化的硬件生态系统中,假冒或克隆硬件的风险已成为对系统完整性的严重威胁。假冒组件是指未经授权的真正部件的复制,设计上旨在尽可能模仿其外观和功能。这些组件可以通过跨越多个供应商和地区的复杂采购和制造流程进入机器学习系统。

组件采购的任何失误都可能将假冒硬件引入重要系统。例如,用于安全设施访问的面部识别系统可能无意中依赖假冒处理器。这些未经授权的组件可能无法正确处理生物识别数据,或引入隐藏的漏洞,使攻击者能够绕过身份验证控制。

假冒硬件带来的风险是多方面的。从可靠性角度来看,这些组件通常退化更快,表现不可预测,或在负载下因制造标准低下而失败。从安全角度来看,假冒硬件可能包含隐藏的后门或恶意电路,为攻击者提供无法检测的途径来破坏机器学习系统。例如,在数据中心安装的克隆网络路由器可能静默地拦截模型预测或用户数据,在整个基础设施中创建系统性的漏洞。

法律和监管风险进一步加剧了问题。那些无意中将假冒组件集成到其机器学习系统中的组织可能面临严重的法律后果,包括违反安全、隐私或网络安全法规的处罚 32。这在医疗保健和金融等必须遵守行业标准的领域尤其令人担忧。医疗保健组织必须在其技术堆栈中证明符合 HIPAA 标准,而处理欧盟公民数据的组织必须满足 GDPR 对技术和组织措施的要求,包括供应链完整性。

经济压力常常激励从低成本供应商处采购,而不进行严格的验证,增加了假冒部件进入生产系统的可能性。检测特别具有挑战性,因为假冒组件被设计成模仿合法组件。识别它们可能需要专用设备或法医分析,使得预防比补救更为实际。

在需要高可靠性和低延迟的机器学习应用中,如自动驾驶汽车的实时决策、工业自动化或重要的医疗诊断,风险尤其高。在这些环境中,硬件故障不仅会导致系统停机,还会带来重大的安全风险。因此,随着机器学习继续扩展到安全重要和高价值的应用,伪造硬件呈现出的风险越来越大,必须得到认识和解决。组织必须将硬件可靠性视为核心设计要求,与算法准确性和数据安全同等重要,以确保 ML 系统可以在现实世界中可靠和安全地运行。

供应链风险

伪造硬件体现了更广泛的系统性挑战。虽然伪造硬件提出了严重的挑战,但它只是确保全球硬件供应链安全的大问题的一部分。机器学习系统由通过复杂供应链的组件构建,涉及设计、制造、组装、分销和集成。每个阶段都存在篡改、替换或伪造的机会——通常在部署最终系统的那些人不知情的情况下。

恶意行为者可以以各种方式利用这些漏洞。一个签约制造商可能无意中收到被重新标记为新组件的回收电子废物。一个分销商可能故意将克隆部件混入其他合法的货物中。制造设施的内幕人士可能嵌入硬件特洛伊木马,一旦系统部署,就几乎无法检测到。高级仿制品尤其具有欺骗性,翻新或重新包装的组件旨在通过视觉检查,同时隐藏劣质或恶意内部组件。

识别此类妥协通常需要复杂分析,包括显微摄影、X 射线筛选和功能测试。然而,这些方法成本高昂,对于大规模采购来说不切实际。因此,许多组织在未完全验证每个组件的真实性和安全性之前就部署了系统。

风险不仅限于单个设备。机器学习系统通常依赖于异构硬件平台,整合来自全球供应链的 CPU、GPU、内存和专用加速器。这个链条中任何一部分的妥协都可能破坏整个系统的安全性。当系统在共享或多租户环境中运行时,这些风险进一步放大,例如云数据中心或联邦边缘网络,在这些环境中,硬件级别的隔离对于防止跨租户攻击至关重要。

2018 年,《彭博商业周刊》报道称中国国家行为者将间谍芯片植入 Supermicro 服务器主板,将这些风险带入了公众视野。虽然这些说法仍然存在争议,但这个故事突显了行业对其自身硬件供应链的有限可见性。公司通常依赖复杂、不透明的制造和分销网络,使他们容易受到隐藏妥协的影响。过度依赖单一制造商或地区,包括半导体行业对台积电的依赖,进一步集中了这种风险。这种认识推动了政策反应,如美国的芯片和科学法案,旨在将半导体生产转移到国内,并加强供应链的弹性。

保护机器学习系统需要超越默认信任模型,转向零信任供应链实践。这包括审查供应商、验证组件来源、实施篡改检测保护,以及持续监控系统行为以发现妥协迹象。构建能够检测和包含故障的容错架构提供了额外的防御层。

最终,供应链风险必须在机器学习系统设计中被视为首要关注的问题。对驱动机器学习的计算模型和数据管道的信任,核心依赖于它们运行的硬件的可靠性。如果不确保硬件基础的安全,即使是最复杂的模型也仍然容易受到妥协的威胁。

案例研究:Supermicro 争议

供应链风险的抽象性质在一个备受瞩目的争议中变得具体,这个争议吸引了行业的关注。2018 年,《彭博商业周刊》发表了一份广泛讨论的报告,声称中国支持的国家行为者秘密在 Supermicro 制造的机架式服务器主板上植入微型监控芯片(Robertson and Riley 2018)。据报道,这些被篡改的服务器被超过 30 家主要公司部署,包括苹果和亚马逊。这些芯片据称大小不超过一粒米,可以为攻击者提供对敏感数据和系统的后门访问。

这些指控在技术行业引发了立即的关注,引发了关于全球供应链安全和国家层面硬件操纵潜力的质疑。然而,报告中提到的公司公开否认了这些指控。苹果、亚马逊和超微公司表示,在进行了彻底的内部调查后,他们没有发现任何所谓的植入物。行业专家和政府机构也表达了怀疑,指出报告中缺乏可验证的技术证据。

尽管有这些否认,但这个故事对组织和政策制定者如何看待硬件供应链安全产生了持久的影响。无论具体指控是否准确,报告都突出了这样一个现实和日益增长的关注:硬件供应链难以进行全面审计和保障。它强调了地缘政治紧张、制造业外包和现代硬件生态系统的复杂性如何使得保证硬件组件的完整性越来越具有挑战性。

超微案例说明了更普遍的真理:一旦产品进入复杂的全球供应链,就很难确保每个组件都没有被篡改或未经授权修改。这种风险对于依赖来自全球多个供应商的广泛硬件加速器、内存模块和处理器单元的机器学习系统尤其严重。

针对这些风险,行业和政府利益相关者已经开始投资供应链安全计划。美国政府的芯片和科学法案就是此类努力之一,旨在将半导体制造回归本土,以提高透明度并减少对外国供应商的依赖。尽管这些努力很有价值,但它们并不能完全消除供应链风险。它们必须通过技术保障措施来补充,例如组件验证、运行时监控和容错系统设计。

超微争议为机器学习社区提供了一个警示故事。它表明,即使在与信誉良好的供应商合作时,硬件安全也不能被理所当然地认为。确保机器学习系统的完整性需要对整个硬件生命周期进行严格的关注——从设计、制造到部署和维护。这一案例强调了组织采用全面的供应链安全实践作为可信机器学习系统设计基础要素的必要性。

当机器学习系统成为攻击工具

到目前为止所考察的威胁——模型盗窃、数据中毒、对抗性攻击、硬件漏洞——代表了针对机器学习系统的攻击。然而,完整的威胁模型还必须考虑到相反的情况:机器学习作为攻击放大器。使机器学习在有益应用中强大的相同能力也增强了对抗性操作,将机器学习从被动目标转变为主动武器。

尽管机器学习系统通常被视为需要保护的资产,但它们也可能成为发起攻击的工具。在对抗性环境中,用于提高生产力、自动化感知或辅助决策的相同模型可以被重新用于执行或放大攻击操作。机器学习的这种双重用途特性,即它既能保护系统也能颠覆系统,标志着在系统级威胁模型中考虑 ML 的核心转变。

机器学习的攻击性应用是指任何使用机器学习模型来协助破坏另一个系统的场景。在这种情况下,模型本身不是攻击的目标,而是攻击者推进其目标的机制。这些应用可能涉及侦察、推理、颠覆、伪装或自动化那些原本需要手动执行的利用策略。

重要的是,这种攻击性应用并非纯粹推测。攻击者已经将机器学习集成到他们的工具链中,涉及广泛的活动中,从垃圾邮件过滤规避到基于模型的恶意软件生成。这些场景的区别在于,攻击者故意使用基于学习的系统以提取、操纵或生成信息,这些信息会破坏目标组件的机密性、完整性和可用性。

为了阐明这些应用的多样性和结构,表 15.6 总结了几个代表性的用例。对于每个用例,表格确定了通常使用的机器学习模型类型、它所利用的底层系统漏洞以及使用机器学习带来的主要优势。

这些记录的案例说明了机器学习模型如何作为对抗能力的放大器。例如,语言模型允许更令人信服和适应性强的钓鱼攻击,而聚类和分类算法通过学习系统级行为模式来促进侦察。大型语言模型的生成人工智能能力尤其放大了这些攻击应用。同样,对抗性示例生成器和推理模型系统地揭示了决策边界或数据隐私保护中的弱点,通常只需要有限的对外部部署系统的访问。在硬件环境中,如下一节所述,在侧信道数据上训练的深度神经网络可以自动化从物理测量中提取加密秘密——将专家驱动的过程转化为可学习的模式识别任务。第三章(ch009.xhtml#sec-dl-primer)中的深度学习基础——用于空间模式识别的卷积神经网络、用于时间依赖性的循环架构和基于梯度的优化——使攻击者能够将这些技术应用于第十一章(ch017.xhtml#sec-ai-acceleration)中讨论的各种硬件平台,从云环境中的 GPU 和 TPU 到资源受限的边缘加速器。

表 15.6:攻击性机器学习用例:此表分类了机器学习如何通过实现自动化内容生成、利用系统漏洞和增加攻击复杂性来放大网络攻击;它详细说明了每个攻击应用的典型机器学习模型、目标弱点和由此产生的优势。理解这些用例对于开发有效防御日益智能的威胁至关重要。

攻击性用例 机器学习模型类型 目标系统漏洞 机器学习的优势
钓鱼和社会工程 大型语言模型(LLMs) 人类感知和通信系统 定制化、情境感知的消息构建
侦察和指纹识别 监督分类器,聚类模型 系统配置,网络行为 可扩展的、自动化的系统行为配置文件
利用生成 代码生成模型,微调的转换器 软件漏洞,不安全的代码模式 自动发现候选利用方法
数据提取(推理攻击) 分类模型,逆模型 通过模型输出泄露隐私 有限的或黑盒访问下的推理
逃避检测系统 对抗性输入生成器 部署的机器学习系统中的检测边界 构建最小扰动的输入以逃避过滤器
硬件级攻击 深度学习模型 物理侧信道(例如,功率、时序、电磁) 直接从原始信号中学习泄露模式

尽管这些应用在技术实现上有所不同,但它们有一个共同的基础:对手用能够近似或适应目标脆弱行为的学到的模型替换了静态的漏洞利用。这种转变增加了灵活性,减少了人工开销,并提高了面对不断演变或部分隐蔽的防御时的鲁棒性。

使这类威胁特别显著的是它们有利的扩展行为。正如计算机视觉或语言建模的准确性随着额外数据、更大架构和更多计算资源的增加而提高一样,以攻击为导向的机器学习模型的性能也是如此。例如,在更大规模的钓鱼尝试或电源迹线数据集上训练的模型可能具有更有效的泛化能力,能够规避更多检测器,或需要更少的输入才能成功。推动有益人工智能创新的相同生态系统,包括公共数据集、开源工具和可扩展基础设施,也降低了开发有效攻击模型的技术门槛。

这种动态在攻击者和防御者之间创造了一种不对称性。尽管防御措施受到部署限制、延迟预算和监管要求的约束,但攻击者可以以最低的边际成本扩展训练管道。预训练模型和公共机器学习平台的广泛可用性进一步降低了开发高影响力攻击所需的技能水平。

检查这些攻击能力具有至关重要的防御作用。安全专业人士长期以来一直认识到,有效的防御需要理解攻击方法——这一原则是渗透测试 33、红队练习 34 以及整个网络安全行业中的威胁建模的基础。

在机器学习领域,这种理解变得至关重要,因为机器学习放大了防御和攻击能力。使机器学习在合法应用中强大的相同计算优势——模式识别、自动化和可扩展性——也增强了对抗能力。通过研究机器学习如何被武器化,安全专业人士可以预测攻击向量,设计更健壮的防御措施,并开发检测机制。

因此,任何关于机器学习系统安全的全面处理都必须考虑不仅机器学习系统的漏洞,还要考虑机器学习被用来损害其他组件的方式——无论是软件、数据还是硬件。理解机器学习系统的攻击潜力对于设计有弹性、值得信赖和前瞻性的防御至关重要。

案例研究:深度学习用于 SCA

为了具体说明这些攻击能力,我们考察了一个具体案例,其中机器学习将传统的攻击方法进行了转换。深度学习辅助的侧信道攻击(SCA)最著名且可重复的演示之一是 SCAAML 框架(由机器学习辅助的侧信道攻击)(Bursztein 等人 2024a)。由谷歌的研究人员开发,SCAAML 提供了上述攻击管道的实用实现。

图片

图 15.11:功率迹线:密码计算揭示了功耗上的微妙、数据相关的变化,这些变化反映了特定操作期间的内部状态。

如图 15.11 所示,密码计算在功耗上表现出数据相关的变化。这些变化虽然微妙,但可测量,并反映了算法在特定时间点的内部状态。

在传统的侧信道攻击中,专家们依赖于统计技术来提取这些差异。然而,神经网络可以学会将这些信号的形状与正在处理的具体数据值相关联,有效地学习以模仿专家构建的模型的方式来解码信号,同时具有增强的灵活性和泛化能力。该模型在标记的功率迹线及其相应的中间值(例如,S-box 操作的输出)的示例上进行训练。随着时间的推移,它学会了将迹线中的模式与秘密相关的计算行为相关联,类似于图 15.11 中所示。这把密钥恢复任务转换成了一个分类问题,其目标是仅根据迹线形状推断正确的密钥字节。

在他们的研究中,Bursztein 等人(2024a)训练了一个卷积神经网络,从运行开源 TinyAES 实现的 STM32F415 微控制器上收集的功率迹线中提取 AES 密钥。该模型被训练来直接从原始功率迹线预测 AES 算法的中间值,例如第一轮 S-box 的输出。训练好的模型仅使用每个字节少量迹线就恢复了完整的 128 位密钥。

这些迹线是使用带有定制 STM32F 目标板的 ChipWhisperer 设置收集的,该目标板在图 15.12 中显示。该板执行 AES 操作,同时允许外部设备以高时间精度监控功耗。实验设置捕捉了即使是价格低廉、功耗低的嵌入式设备也能通过侧信道泄露信息的情况——这些信息是现代机器学习模型可以学会利用的。

图片

图 15.12:STM32F415 目标板:允许在微控制器上监控 AES 操作期间的功耗,突显了机器学习模型可以利用的侧信道漏洞。来源:Bursztein 等人 (2024a)。

后续工作通过引入能够利用更广泛时间依赖性的长程模型来扩展这一方法,即使在噪声和不同步的情况下也能提高性能(Bursztein 等人 2024b)。这些发展突显了机器学习模型作为进攻性密码分析工具的潜力,尤其是在安全硬件分析方面。

其影响超出了学术兴趣的范围。随着深度学习模型持续扩展,它们在侧信道环境中的应用可能会降低硬件级攻击的成本、技能门槛和跟踪要求——对嵌入式机器学习系统、加密模块和可信执行环境的可靠部署构成日益增长的挑战。

全面防御架构

在考察了针对机器学习系统的威胁以及由机器学习能力引发的威胁之后,我们现在转向全面的防御策略。设计安全且保护隐私的机器学习系统不仅需要识别个别威胁,还需要一种分层防御策略,该策略将多个系统级别的保护整合在一起,以创建全面的弹性。

本节系统地通过四个防御层进行阐述:数据层保护,包括差分隐私和安全的计算,在训练期间保护敏感信息;模型层防御,如对抗训练和安全部署,保护模型本身;运行时层措施,包括输入验证和输出监控,确保推理操作的安全;以及硬件层基础,如可信执行环境,为所有其他保护提供信任锚。我们以基于您的部署环境选择和实施这些防御的实际框架作为结论。

分层防御原则

分层防御(也称为深度防御)代表了一种核心安全架构原则,其中多个独立的防御机制协同工作,以抵御各种威胁向量。在机器学习系统中,这种方法变得至关重要,因为数据依赖性、模型暴露和推理模式引入了独特的攻击面。与主要面临基于代码的漏洞的传统软件系统不同,ML 系统容易受到输入操纵、数据泄露、模型提取和运行时滥用的攻击,所有这些攻击都因数据、模型行为和基础设施之间的紧密耦合而加剧。

分层方法认识到没有单一防御机制可以应对所有可能的威胁。相反,安全来自于互补保护措施的相互作用:数据层技术如差分隐私和联邦学习;模型层防御包括鲁棒性技术和安全部署;运行时层措施如输入验证和输出监控;以及硬件层解决方案包括可信执行环境和安全启动。每一层都为系统的整体弹性做出贡献,同时补偿其他层中可能存在的潜在弱点。

本节介绍了一个结构化的框架,用于实现机器学习系统的分层防御,从数据中心的保护到基础设施级别的执行。该框架建立在第六章中的数据保护实践之上,并向前连接到第十三章中详细描述的操作安全措施。通过在各个层之间整合保障措施,组织可以构建既可靠又能在生产环境中承受对抗性压力的机器学习系统。

分层方法在图 15.13 中得到了可视化,该图显示了防御机制如何从基于硬件的基础安全进步到运行时系统保护、模型级控制和数据层的隐私保护技术。每一层都建立在下一层的信任保证之上,形成一个端到端策略,用于安全部署机器学习系统。

图片

图 15.13:分层防御堆栈:机器学习系统需要多方面的安全策略,从基础硬件保护到以数据为中心的隐私技术,构建跨所有层的信任。该架构在数据、模型、运行时和基础设施级别整合了保障措施,以减轻威胁并确保在生产环境中稳健部署。

隐私保护数据技术

在我们防御堆栈的最高层,我们首先从数据隐私技术开始。保护为机器学习系统提供动力的个人的隐私是可信人工智能的基础性要求。与在处理前通常对数据进行掩盖或匿名化的传统系统不同,机器学习工作流程通常依赖于访问原始、高保真数据来训练有效的模型。这种效用与隐私之间的紧张关系促使一系列旨在最小化数据暴露同时保持学习性能的技术应运而生。

差分隐私

最广泛采用的用于形式化隐私保证的框架之一是差分隐私(DP)。DP 提供了一个严格的数学定义的隐私损失,确保单个个体的数据包含或排除对模型输出的影响是可证明有限的。

为了理解差分隐私的需求,考虑这个挑战:我们在从数据中学习时如何量化隐私损失?传统的隐私方法侧重于删除识别信息(姓名、地址、社会保障号码)或应用统计披露控制。然而,这些方法在面对复杂的对手时失效,对手可以通过辅助数据、统计相关性攻击或从模型输出中进行推理来重新识别个人。

差分隐私通过关注算法行为而非数据内容采取了一种不同的方法。关键洞见是隐私保护应该是可衡量的,并且应该限制对任何个人的了解,无论对手拥有多少外部信息。

为了对这一概念建立直观理解,想象一下你想找到一组人的平均工资,但没有人愿意透露他们的实际工资。使用差分隐私,你可以要求每个人都把他们的工资写在一张纸上,但在他们交上之前,他们从已知分布中添加或减去一个随机数。当你平均所有纸张时,随机噪声往往会相互抵消,给你一个非常接近真实平均值的估计。然而,如果你抽出任何一张单独的纸,你无法知道这个人的真实工资,因为你不知道他们添加了什么随机数。这是核心思想:在学习总体模式的同时,使确定任何单个个体的信息变得不可能。

差分隐私通过比较相似数据集上的算法行为来形式化这种直观。考虑两个相邻的数据集,它们只在单个个体的记录是否存在上有所不同。差分隐私确保算法输出的概率分布无论该个体的数据是否包含,在统计上都是相似的。这种保护是通过精心校准的噪声实现的,它掩盖了个体贡献,同时保留了机器学习所需的总体统计模式。

为了使这种直观在数学上精确,差分隐私引入了隐私损失的定量度量。数学框架使用概率比率来限制当添加或删除单个个体的数据时,算法行为可以改变的程度。这种方法使我们能够证明隐私保证,而不仅仅是假设它们。

一个随机算法 𝒜\mathcal{A} 被称为 ϵ\epsilon-差分隐私的,如果对于所有相邻数据集 DDDD'(它们在一条记录上有所不同),以及对于所有输出 SRange(𝒜)S \subseteq \text{Range}(\mathcal{A}),以下条件成立:Pr[𝒜(D)S]eϵPr[𝒜(D)S] \Pr[\mathcal{A}(D) \in S] \leq e^{\epsilon} \Pr[\mathcal{A}(D') \in S]

参数 ϵ\epsilon 量化了隐私预算,表示最大允许的隐私损失。较小的 ϵ\epsilon 值通过增加噪声注入提供更强的隐私保障,但可能会降低模型效用。典型值包括用于强隐私保护的 ϵ=0.1\epsilon = 0.1,用于适度保护的 ϵ=1.0\epsilon = 1.0,以及用于较弱但保持效用保证的 ϵ=10\epsilon = 10。乘法因子 eϵe^{\epsilon} 限制了相邻数据集算法输出的似然比,约束了个人参与对任何特定结果的影响程度。

此界限确保算法的行为在统计上与任何个人数据是否存在无关,从而限制了可以推断出的关于该个人的信息。在实践中,差分隐私通过添加校准噪声到模型更新或查询响应中,使用拉普拉斯机制或高斯机制等机制来实现。像差分隐私随机梯度下降 35 这样的训练技术将校准噪声整合到训练计算中,确保个人数据点无法与模型学习到的行为区分开来。

虽然差分隐私提供了强大的理论保证,但它引入了隐私和效用之间的权衡 36,这会产生可衡量的计算和精度成本。

实际上的差分隐私部署需要仔细考虑计算权衡、隐私预算管理和实施挑战,这些内容在表 15.7 中详细说明。

增加噪声以减少ϵ\epsilon可能会降低模型精度,尤其是在数据量较少或细粒度分类任务中。因此,差分隐私通常是有选择性地应用的——要么在敏感数据集的训练期间,要么在推理时返回汇总统计时——以平衡隐私和性能目标(Dwork and Roth 2013)。

联邦学习

当差分隐私为数据处理提供数学保证时,联邦学习(FL)提供了一种补充方法,通过重新构建学习过程本身来降低隐私风险。这种技术直接解决了第十四章中探讨的设备上学习的隐私挑战,其中模型必须适应本地数据模式,同时不泄露敏感用户信息。FL 不是在中央位置汇总原始数据,而是在一组客户端设备上分配训练任务,每个设备都持有本地数据(McMahan 等人 2017d)。这种分布式训练范式建立在设备上学习的自适应部署概念之上,需要跨多个参与者和基础设施提供商仔细协调安全措施。客户端在本地计算模型更新,并仅与中央服务器共享参数增量以进行汇总:θt+1k=1Knknθt(k) \theta_{t+1} \leftarrow \sum_{k=1}^{K} \frac{n_k}{n} \cdot \theta_{t}^{(k)}

在这里,θt(k)\theta_{t}^{(k)} 代表客户端kk的模型更新,nkn_k是该客户端持有的样本数量,而nn是所有客户端的样本总数。这种加权聚合允许全局模型从分布式数据中学习,而无需直接访问它。FL 减少了原始数据的暴露,但仍然通过梯度泄露信息,这促使在联邦环境中使用差分隐私(DP)、安全聚合和基于硬件的保护。

现实世界示例:谷歌 Gboard 联邦学习

谷歌的 Gboard 键盘使用联邦学习来改善超过 10 亿部 Android 设备的下一个单词预测,而不收集打字数据。系统的工作原理如下:

  1. 本地训练:每个设备使用用户的最近打字(通常是 100-1000 个单词)来训练语言模型的小型更新

  2. 安全聚合:设备将加密的模型更新(而非原始文本)上传到谷歌的服务器

  3. 全球更新:服务器汇总数千个更新,计算一个改进的全局模型

  4. 分发:更新的模型将在下一个应用更新中推送到设备

隐私属性:个人打字数据永远不会离开设备。即使是谷歌的服务器也无法解密单个更新,只能看到汇总的结果。该系统结合了联邦学习与差分隐私 (ε6)(\varepsilon\approx 6) 和安全聚合协议。

性能:联邦学习在消除原始数据收集的同时,实现了集中式训练 92%的精度。通信效率优化(梯度压缩、选择性参与)将带宽降低到每天每台设备约 100 KB。

权衡:联邦学习(FL)比集中式训练需要 10-100 倍的通信轮次,并引入 2-5%的精度下降。然而,对于对隐私敏感的应用,与完全不训练的替代方案相比,这些成本是可以接受的。

为了解决需要在加密数据上执行计算的场景,同态加密(HE)37 和安全多方计算(SMPC)允许模型在加密输入上执行推理或训练。同态操作的计算开销通常需要涵盖在第九章中的效率优化技术——包括模型压缩(量化降低加密操作的精度要求)、架构优化(深度可分离卷积最小化加密乘法)和硬件加速(专门的加密加速器)——以保持实际性能。

在同态加密的情况下,对密文的操作对应于对明文的操作,从而实现加密推理: Enc(f(x))=f(Enc(x)) \text{Enc}(f(x)) = f(\text{Enc}(x))

这一特性支持在不受信任的环境中实现隐私保护计算,例如在敏感健康或财务记录上进行云推理。同态加密的计算成本仍然很高,使其更适合固定功能模型和低延迟批量任务。相比之下,SMPC38 将计算分布在多个参与者之间,使得没有任何一个参与者能够学习到完整的输入或输出。这在具有严格数据使用政策的机构之间进行联合训练时特别有用,例如医院或银行 39。

合成数据生成

不同于同态加密等加密方法,一种更加实用且越来越受欢迎的替代方案是使用合成数据生成 40。这种方法为隐私保护提供了一个直观的解决方案:如果我们能够创建出在统计上与真实数据相似的人工数据,我们就可以在不暴露敏感信息的情况下训练模型。

合成数据生成的工作原理是,在原始敏感数据集上训练一个生成模型(例如 GAN、VAE 或扩散模型),然后使用这个训练好的生成器来产生新的人工样本。关键洞察是,生成模型学习数据中的底层模式和分布,而不需要记住具体的个体。当正确实施时,合成数据保留了机器学习所需的统计属性,同时去除了个人可识别信息。

生成过程通常分为三个阶段。首先,分布学习在真实数据上训练一个生成模型 GθG_\theta,以学习数据分布 p(x)p(x)。其次,合成采样通过从随机噪声中采样生成新的样本 Dsynthetic={Gθ(z1),Gθ(z2),,Gθ(zm)}D_{\text{synthetic}} = {G_\theta(z_1), G_\theta(z_2),\ldots, G_\theta(z_m)}。第三,验证确保 DsyntheticD_{\text{synthetic}} 在避免记忆特定记录的同时,保持与 DrealD_{\text{real}} 的统计一致性。通过在真实数据集上训练生成模型并从学习到的分布中采样新实例,组织可以创建近似原始数据统计特性的数据集,而不保留可识别的细节 (Goncalves et al. 2020)).

虽然合成数据生成很有吸引力,但面临着重要的限制。生成模型可能会出现模式坍塌,无法捕捉原始数据中罕见但重要的模式。更重要的是,复杂的对手可能通过生成模型反演攻击或成员推理来提取有关原始训练数据的信息。隐私保护在很大程度上取决于生成模型架构、训练过程和超参数选择——这使得在没有额外机制(如差分隐私)的情况下提供正式的隐私保证变得困难。

考虑一个实际例子,其中一家医院希望在保护隐私的同时共享患者数据用于机器学习研究。他们在包含人口统计信息、实验室结果和诊断的 10,000 份真实患者记录上训练了一个生成对抗网络(GAN)。GAN 学习生成具有现实特征组合的合成患者(例如,糖尿病患者通常有升高的血糖水平)。包含 50,000 个合成患者的合成数据集保持了训练诊断模型所需的临床相关性,同时不包含任何真实患者信息。然而,医院在 GAN 训练期间也应用了差分隐私(ε = 1.0),以防止模型记住特定患者,以 5%的统计精度降低为正式的隐私保证。

这些技术共同反映了一种转变,即从将数据孤立作为实现隐私的唯一途径,转向将隐私保护机制嵌入到学习过程本身。每种方法都根据应用环境、威胁模型和监管约束提供独特的保证和权衡。有效的系统设计通常结合多种方法,例如在联邦学习设置中应用差分隐私,或者在重要的推理阶段使用同态加密,以构建既实用又尊重用户隐私的机器学习系统。

比较属性

在考察了单个技术之后,变得明显的是,这些隐私保护方法不仅在提供的保证上有所不同,而且在系统层面的影响上也有所不同。对于从业者来说,机制的选择取决于诸如计算约束、部署架构和监管要求等因素。

表 15.7 总结了这些方法的比较属性,重点关注隐私强度、运行时开销、成熟度和常见用例。理解这些权衡对于设计在现实世界约束下运行的隐私感知机器学习系统非常重要。

表 15.7:隐私-准确度权衡:数据隐私技术施加不同的计算成本,并提供不同级别的形式化隐私保证,要求从业者平衡隐私强度与模型效用和部署限制。该表总结了关键属性——隐私保证、计算开销、成熟度、典型用例和权衡,以指导在设计隐私感知机器学习系统时的明智决策。

技术 隐私保证 计算开销 部署成熟度 典型用例 权衡
差分隐私 形式化(ε-DP) 中等到高 生产环境 使用敏感或受监管数据进行训练 准确度降低;需要仔细调整ε/噪声以平衡效用和保护
联邦学习 结构性 中等 生产环境 跨设备或跨组织协作学习 梯度泄露风险;需要安全的聚合和编排基础设施
同态加密 强(加密) 实验性 在不受信任的云环境中进行推理 高延迟和内存使用;适用于固定功能模型上的有限范围推理
安全多方计算 强(分布式) 非常高 实验性 在相互不信任的各方之间进行联合训练 通信成本高昂;难以扩展到多个参与者或深度模型
合成数据 弱(如果独立使用) 低到中等 新兴 数据共享,基准测试而不直接访问原始数据 如果训练过程不是差分隐私或未经过审计以确保一致性,可能会泄露敏感模式

案例研究:GPT-3 数据提取攻击

2020 年,研究人员进行了一项开创性的研究,证明大型语言模型可以通过精心设计的提示泄露敏感的训练数据(Carlini 等人 2021)。研究团队系统地查询了 OpenAI 的 GPT-3 模型,从中提取其训练数据中的原文内容,揭示了大型语言模型中的隐私漏洞。

该攻击在直接从模型输出中提取敏感信息方面证明非常成功。通过反复使用如“我的名字是”这样的提示,并尝试继续著名引语或重复短语,研究人员成功地从训练数据中提取了包括电子邮件地址和电话号码在内的个人信息,版权书籍的原文段落,训练过程中应被过滤的私人数据,以及数百万个人的可识别个人信息。

技术方法利用了 GPT-3 对稀有或重复文本序列的记忆。研究人员使用提示工程来构建触发记忆序列的输入,使用部分引用或名称提取完整敏感信息的延续攻击,对模型输出中的模式进行统计分析以识别字面记忆,以及通过将提取的数据与已知公共来源交叉引用来验证准确性的验证方法。在 60 万次尝试中,他们成功提取了超过 16,000 个独特的记忆训练数据实例。

这种攻击挑战了关于训练数据隐私的假设。结果表明,大型语言模型可以作为无意中的数据库,从其训练数据中存储和检索敏感信息。这违反了训练数据在模型训练后会被“遗忘”的隐私预期,揭示了规模放大了隐私风险,因为更大的模型(175B 参数)比小模型记忆了更多的训练数据。

研究表明,常见的数据保护措施证明是不够的。即使在数据去重之后,模型仍然会记忆敏感信息,突显了模型效用与隐私保护之间的紧张关系。防止记忆的技术,如差分隐私和激进的数据过滤,会降低模型质量,为从业者创造具有挑战性的权衡。

行业反应迅速而全面。组织开始在大模型训练中广泛采用差分隐私,增强了数据过滤和 PII 移除流程,开发了成员推理防御,进行了机器反学习技术的新研究,并就训练数据权利和模型透明度进行了监管讨论。现代组织现在通常在训练期间实施差分隐私(ε ≤ 8),使用自动化检测工具进行激进的 PII 过滤,定期审计使用提取攻击的数据记忆,以及处理包含个人信息的训练数据的法律框架(Carlini 等人 2021)。

安全模型设计

从数据级保护转向模型级安全,我们探讨了安全考虑如何塑造模型开发过程。安全始于机器学习系统的设计阶段。虽然下游机制如访问控制和加密在模型部署后保护模型,但许多漏洞可以在早期通过架构选择、防御性训练策略以及将弹性直接嵌入模型结构或行为的机制来缓解。将安全视为设计约束,系统开发者可以减少模型遭受攻击的风险,限制其泄露敏感信息的能力,并提供可验证的所有权保护。

一个重要的设计策略是构建通过构造稳健的模型,以降低推理时的利用风险。例如,具有置信度校准或弃权机制的模型可以被训练以避免在输入不确定性高时做出预测。这些技术可以帮助防止对对抗性或分布外输入的过度自信的错误分类。模型还可以采用输出平滑,正则化输出分布以减少特别容易受到对抗性扰动影响的尖锐决策边界。

某些应用场景也可能从选择更简单或压缩的架构中受益。限制模型容量可以减少对敏感训练数据的记忆机会,并使从输出行为中逆向工程模型的努力复杂化。对于嵌入式或设备上的设置,较小的模型也更容易保证安全,因为它们通常需要更少的内存和计算,从而降低侧信道泄露或运行时操作的可能性。

另一个设计阶段的考虑因素是使用模型水印 41,这是一种将可验证的所有权签名直接嵌入到模型参数或输出行为的技术(Adi 等人 2018)。例如,水印可以实施为一个由特定输入触发的隐藏响应模式,或者作为一个参数空间扰动,它不会影响准确性但可以统计识别。

例如,在一个部署在嵌入式硬件上的关键词检测系统中,用于语音激活(例如,“嘿,Alexa”或“好的,Google”),一个安全的设计可能会使用具有置信度校准的轻量级卷积神经网络,以避免在不确定的音频上产生误激活。该模型还可以包括一个弃权阈值,低于此阈值它不会产生任何激活。为了保护知识产权,设计者可以通过训练模型以对特定、未使用的音频触发器做出唯一标签来嵌入水印,该触发器只有开发者知道。这些设计选择不仅提高了鲁棒性和问责制,还支持在知识产权争议或现场性能故障的情况下进行未来的验证。

在高风险应用中,例如医疗诊断、自动驾驶汽车或金融决策系统,设计者可能还会优先考虑可解释的模型架构,如决策树、基于规则的分类器或稀疏网络,以增强系统可审计性。这些模型通常更容易理解和解释,从而更容易识别潜在漏洞或偏差。使用可解释模型允许开发者提供更清晰的见解,了解系统如何得出特定决策,这对于建立用户和监管机构的信任至关重要。

模型设计的选择通常反映了准确性、鲁棒性、透明度和系统复杂性之间的权衡。从系统角度来看,早期设计决策为长期安全提供了最高价值。它们决定了模型可以学习的内容、它在不确定性下的行为,以及对其来源、可解释性和弹性的保证。

安全模型部署

虽然安全设计为鲁棒性奠定了基础,但保护范围不仅限于模型本身,还包括其打包和部署方式。保护机器学习模型免受盗窃、滥用和未经授权的操纵需要在设计和部署的整个阶段考虑安全因素。模型的安全性不仅由其训练过程或架构决定,还由其在推理过程中的序列化、打包、部署和访问方式决定。随着模型越来越多地嵌入到边缘设备中、通过公共 API 提供或集成到多租户平台中,稳健的安全实践对于确保模型行为的完整性、机密性和可用性至关重要。

本节讨论了三个关键阶段的安全机制:模型设计、安全打包和序列化,以及部署和访问控制。这些实践补充了第十章中讨论的模型优化技术,其中性能改进不得损害安全属性。

从设计角度来看,架构选择可以减少模型受到对抗性操纵和未经授权使用的风险。例如,模型可以采用置信度校准或弃权机制,允许它们拒绝不确定或异常的输入,而不是产生可能具有误导性的输出。设计具有更简单或压缩架构的模型也可以降低逆向工程或通过侧信道分析泄露信息的风险。在某些情况下,模型设计者可能会嵌入不可察觉的水印,这些水印是嵌入在模型参数或行为中的独特签名,可以在不当使用的情况下用于证明所有权(Uchida 等人 2017)。这些设计时的保护对于具有商业价值的模型至关重要,在这些模型中,知识产权处于风险之中。

一旦训练完成,模型必须安全打包以供部署。将模型存储在明文格式中,包括未加密的 ONNX 或 PyTorch 检查点文件,可能会将内部结构和参数暴露给有权访问文件系统或内存的攻击者。为了减轻这种风险,模型应该被加密、混淆或封装在安全容器中。解密密钥应在运行时且仅在受信任的环境中提供。额外的机制,如量化感知加密或完整性检查包装器,可以防止篡改和离线模型盗窃。

部署环境还必须执行强大的访问控制策略,以确保只有授权用户和服务才能与推理端点交互。认证协议,包括 OAuth42 令牌、相互 TLS43 或 API 密钥 44,应与基于角色的访问控制(RBAC)45 相结合,根据用户角色和操作环境限制访问。例如,OpenAI 的托管模型 API 要求用户在提交推理请求时包含 OPENAI_API_KEY。

此关键验证客户端并允许后端执行使用策略,监控滥用情况,并记录访问模式。安全实现从环境变量中检索 API 密钥,而不是将它们硬编码到源代码中,从而防止凭证在版本控制系统或应用程序日志中泄露。这种基于密钥的访问控制机制易于实现,但需要谨慎的密钥管理和监控,以防止滥用、未经授权的访问或模型提取。生产部署中的附加安全措施通常包括通过 SHA-256 哈希检查验证模型完整性、速率限制以防止滥用、对大小和格式约束进行输入验证以及为安全事件跟踪进行全面的日志记录。

在这里建立的网络安全部署模式自然地与第五章中探讨的开发工作流程相结合,确保安全成为标准工程实践的一部分,而不是事后考虑。运行时监控(第 15.8.6 节)将这些保护措施扩展到操作环境。

运行时系统监控

虽然安全设计和部署建立了坚实的基础,但保护必须扩展到运行时操作。即使有稳健的设计和部署保障,机器学习系统仍然容易受到运行时威胁的攻击。攻击者可能构建绕过验证的输入,利用模型行为,或针对系统级基础设施。

生产级机器学习系统面临着多样化的部署环境——从云服务到边缘设备再到嵌入式系统。每个环境都带来了独特的监控挑战和机遇,正如第二章中展示的系统架构所示。防御策略必须超越静态保护,包括实时监控、威胁检测和事件响应。本节概述了在对抗条件下保持系统信任的操作防御措施,并与第十三章中详细介绍的全面 MLOps 实践相衔接。

运行时监控包括一系列观察系统行为、检测异常和触发缓解的技术。这些技术可以分为三个类别:输入验证、输出监控和系统完整性检查。

输入验证

输入验证是运行时的第一道防线。它确保在传递给机器学习模型之前,传入数据符合预期的格式、统计属性或语义约束。没有这些保障措施,模型容易受到对抗性输入的影响,这些输入是精心设计的例子,旨在触发错误的预测,或者导致预处理或推理中的意外行为。

与传统的基于规则的系统不同,机器学习模型通常不会安全地失败。对输入数据的微小、精心选择的变化可能导致模型做出高度自信但错误的预测。输入验证有助于在管道早期检测和拒绝此类输入(Goodfellow, Shlens, and Szegedy 2014a)。

验证技术范围从低级检查(例如,输入大小、类型和值范围)到语义过滤器(例如,验证图像是否包含可识别的对象或语音录音是否包含语音)。例如,一个面部识别系统可能会验证上传的图像是否在特定的分辨率范围内(例如,224×224 到 1024×1024 像素),是否包含 RGB 通道,并且通过了一个轻量级的面部检测过滤器。这阻止了如空白图像、文本截图或合成对抗模式等输入达到模型。同样,一个语音助手可能要求传入的音频文件长度在 1 到 5 秒之间,具有有效的采样率(例如,16kHz),并且使用语音活动检测器(SAD)46 可以检测到可识别的人类语音。这确保了在模型推理之前,空录音、音乐剪辑或噪声爆裂被过滤掉。

在 DALL·E、Stable Diffusion 或 Sora 等生成系统中,输入验证通常涉及提示过滤。这包括扫描用户的文本提示以查找禁止的术语、品牌名称、粗俗语言或误导性医疗声明。例如,一个用户提示“生成一个标有辉瑞标志的药物瓶的图像”可能会因商标问题而被拒绝或重写。过滤器可能使用关键字列表、正则表达式或轻量级分类器来评估提示意图。这些过滤器防止生成模型被用于产生有害、非法或误导性的内容——甚至在采样开始之前。

在某些应用中,也使用分布性检查。这些检查评估传入的数据在统计上是否类似于模型在训练期间所见到的。例如,一个计算机视觉管道可能会将输入图像的颜色直方图与基线分布进行比较,标记异常值以供人工审查或拒绝。

这些验证可以是轻量级的(启发式或阈值规则)或学习型的(训练以检测分布变化或对抗性伪影的小型模型)。在任一情况下,输入验证都充当一个重要的预推理防火墙——减少对对抗行为的暴露,提高系统稳定性,并增加对下游模型决策的信任。

输出监控

即使输入通过了验证,模型输出仍可能出现对抗性或意外行为。输出监控通过实时分析模型预测来帮助检测此类异常。这些机制通过跟踪模型的置信度、预测熵、类别分布或响应模式,观察模型在输入上的行为,以标记与预期行为偏差的情况。

监控的关键目标是预测置信度。例如,如果一个分类模型开始对低频或之前罕见的类别分配高置信度,这可能表明存在对抗性输入或底层数据分布的变化。通过监控输出分布的熵,可以同样揭示模型在模糊情境中过度自信的情况——这是可能操纵的早期信号。

在内容审核系统中,一个通常输出中性或“安全”标签的模型可能会突然开始对包含冒犯性或受限内容输入产生高置信度的“安全”标签。输出监控可以通过比较预测与辅助信号或已知的“安全”参考集来检测这种不匹配。当检测到偏差时,系统可能会触发回退策略——例如,将内容提升给人审阅或切换到保守的基线模型。

时间序列模型也受益于输出监控。例如,在欺诈检测中使用的异常检测模型可能会跟踪一系列金融交易的预测欺诈分数。欺诈分数的突然下降,尤其是在交易量高的时期,可能表明模型被篡改、标签泄露或逃避尝试。监控预测的时间演变比静态的、逐点分类提供了更广阔的视角。

生成模型,如文本到图像系统,引入了独特的输出监控挑战。这些模型可以产生高保真度的图像,可能会无意中违反内容安全政策、平台指南或用户期望。为了减轻这些风险,通常使用后生成分类器来评估生成内容是否具有令人反感的特征,如暴力、裸露或品牌滥用。这些分类器在生成模型之后运行,可以根据预定义的阈值抑制、模糊或拒绝输出。一些系统还会检查内部表示(例如,注意力图 47 或潜在嵌入)以预测内容渲染前的潜在滥用。

然而,仅靠提示过滤不足以保证安全。研究表明,文本到图像系统可以通过隐式对抗性提示被操纵,这些提示看似无害但会导致违反策略的输出。Adversarial Nibbler 项目引入了一种开放的红队方法,用于识别此类提示,并展示了像 Stable Diffusion 这样的模型如何在没有明确触发短语的情况下产生意外内容(Quaye 等人 2024)。这些失败案例通常绕过提示过滤器,因为它们的风险源于模型在生成过程中的行为,而不是语法或词汇线索。

图片

图 15.14:对抗性提示规避:隐式对抗性提示通过触发意外生成绕过典型的内容过滤器,揭示了仅依赖预先生成安全检查的局限性。这些例子强调了事后内容分析作为稳健生成人工智能系统的补充防御层的重要性。来源:(Quaye 等人 2024)。

如图 15.14 所示,即使是看似无害的提示也可能触发不安全的生成。这些例子突出了预先生成安全检查的限制,并强调了基于输出的监控作为第二道防线的重要性。这个两阶段管道——由提示过滤后跟事后内容分析组成,对于确保在开放或面向用户的环境中使用生成模型的安全性至关重要。

在语言生成领域,输出监控扮演着不同但同样重要的角色。在这里,目标通常是检测毒性、幻觉声明或偏离分布的响应。例如,客户支持聊天机器人可能会被监控是否存在关键词、语调一致或语义连贯性。如果响应包含粗俗语言、未经证实的断言或语法上不正确的文本,系统可能会触发改写、启动回退到脚本模板,或者完全停止响应。

有效的输出监控结合了基于规则的启发式方法和在历史输出上训练的学习检测器。这些检测器被部署以实时标记偏差并将警报输入到事件响应管道中。与旨在提高模型鲁棒性的以模型为中心的防御措施(如对抗性训练)相比,输出监控强调的是控制和补救。其作用不是防止利用,而是检测其症状并启动适当的对策(Savas 等人 2022)。在安全重要或政策敏感的应用中,此类机制构成了操作弹性的重要层。

这些原则已应用于最近的输出过滤框架中。例如,LLM Guard 结合了基于 transformer 的分类器以及如毒性、错误信息和非法内容等安全维度,以评估和拒绝指令调整的 LLM 中的提示或完成(Inan 等人 2023)。同样,ShieldGemma,作为谷歌开放 Gemma 模型发布的一部分开发,在推理期间应用可配置的评分函数以检测和过滤不希望的结果。这两个系统都展示了如何将安全分类器和输出监控集成到运行时堆栈中,以支持可扩展、符合政策的生成语言模型的部署。

完整性检查

虽然输入和输出监控关注模型行为,但系统完整性检查确保在整个部署过程中,底层模型文件、执行环境和服务基础设施保持未受篡改。这些检查可以检测未经授权的修改,验证生产中运行的模型是真实的,并警告操作员有可疑的系统级活动。

最常见的完整性机制之一是加密模型验证。在模型被加载到内存之前,系统可以计算模型文件的加密哈希(例如,SHA-25648),并将其与已知的良好签名进行比较。

访问控制和审计日志补充了加密检查。机器学习系统应使用基于角色的权限限制对模型文件的访问,并监控文件访问模式。例如,从非标准路径重复尝试读取模型检查点,或从未经授权的 IP 范围发出的推理请求,可能表明篡改、权限提升或内部威胁。

在云环境中,基于容器或虚拟机的隔离 49 有助于强制执行进程和内存边界,但这些保护措施可能会因配置错误或供应链漏洞而随着时间的推移而减弱。

例如,在一个受监管的医疗保健机器学习部署 50 中,完整性检查可能包括:验证模型哈希与已签名的清单相匹配,确认运行时环境仅使用批准的 Python 包,以及检查推理是否在已签名并证明的虚拟机内部进行。这些检查确保符合如 HIPAA51 的完整性要求以及 GDPR 的问责制原则,限制静默故障的风险,并在审计或违规情况下创建法医跟踪。

一些系统还实现了运行时内存验证,例如扫描意外的模型参数变化或检查在执行期间内存映射的模型权重是否保持未更改。虽然这些检查在高保证系统中更为常见,但随着安全区域和可信运行时的采用,这些检查变得更加可行。

总体而言,系统完整性检查在保护机器学习系统免受绕过模型界面的低级攻击中发挥着重要作用。当与输入/输出监控相结合时,它们提供了分层保证,即在对抗条件下模型及其执行环境仍然值得信赖。

响应和回滚

当在部署的机器学习系统中检测到安全漏洞、异常或性能下降时,快速和结构化的事件响应对于最小化影响至关重要。目标是不仅遏制问题,还要恢复系统完整性并确保未来的部署能够从获得的见解中受益。与传统软件系统不同,机器学习响应可能需要处理模型状态、数据漂移或推理行为,这使得恢复更加复杂。

第一步是定义触发升级的事件检测阈值。这些阈值可能来自输入验证(例如,无效输入率)、输出监控(例如,预测置信度下降)或系统完整性检查(例如,模型签名验证失败)。当超过阈值时,系统应启动自动或半自动响应协议。

一种常见策略是模型回滚,系统将回滚到之前验证过的模型版本。例如,如果新部署的欺诈检测模型开始错误分类交易,系统可能会回滚到最后已知的良好检查点,在受影响的版本被隔离的同时恢复服务。回滚机制需要版本控制的模型存储,通常由 MLOps 平台(如 MLflow、TFX 或 SageMaker)支持。

在高可用性环境中,可以使用模型隔离来遏制故障。受影响的模型实例可以从负载均衡器中移除或在金丝雀部署设置中屏蔽。这允许在不影响副本的情况下继续提供服务,同时保持对受损害模型的取证访问,以便进行分析。

流量限制是另一种即时响应工具。如果敌对行为者以高量探测公共推理 API,系统可以限制或暂时阻止违规 IP 范围,同时继续为受信任客户提供服务。这种遏制技术有助于防止滥用,而无需完全关闭系统。

一旦实施即时遏制,就可以开始调查和恢复。这可能包括对输入日志的取证分析、模型版本之间的参数差异或推理容器中的内存快照。在受监管的环境中,组织可能还需要通知用户或审计师,尤其是如果受影响的数据是个人或安全重要数据。

恢复通常涉及重新训练或修补模型。这必须通过安全更新过程进行,使用签名工件、可信构建管道和验证数据。为了防止再次发生,事件应反馈到模型评估管道中——更新测试、细化监控阈值或强化输入防御。例如,如果提示注入攻击绕过了生成模型中的内容过滤器,重新训练可能包括对抗性制作的提示,并且提示验证逻辑将更新以反映新发现的模式。

最后,组织应建立事件后审查实践。这包括记录根本原因、确定检测或响应中的差距,并更新政策和剧本。事件审查有助于将运营失败转化为设计-部署-监控生命周期中的可操作改进。

硬件安全基础

我们所探讨的软件层防御——输入验证、输出监控和完整性检查——建立了重要的保护措施,但它们最终依赖于底层硬件和固件的可信度。如果攻击者破坏了操作系统、获得了对设备的物理访问或利用了处理器本身的漏洞,这些软件防御可以被绕过或完全禁用。这种限制促使基于硬件的安全机制在软件层以下运行,创建一个即使在更高层系统被破坏时也能保持安全的硬件信任根。

在我们防御框架的基础层面,基于硬件的安全机制为所有更高层保护提供信任锚。部署在边缘设备、嵌入式系统和不受信任的云基础设施中的机器学习系统越来越多地依赖于基于硬件的安全功能来建立这个基础。《第十一章》中讨论的硬件加速平台——包括 GPU、TPU 和专门的 ML 加速器——通常包含这些安全特性(安全区域、可信执行环境、硬件加密单元),而《第十四章》中提到的边缘部署场景则提出了独特的安全挑战。

当系统必须满足监管合规要求时,这些硬件安全机制变得尤为重要。在 HIPAA 下处理受保护健康信息的医疗保健机器学习系统必须实施“适当的技术保障”,包括访问控制和加密。在 GDPR 下处理欧盟公民数据的系统必须证明“适当的技术和组织措施”,并在硬件级别嵌入设计原则。

要了解硬件安全如何保护机器学习系统,想象一下为你的最有价值资产建造一个安全的堡垒。每个硬件安全原语都扮演着独特的防御角色:

表 15.8:硬件安全机制:每个原语提供独特的防御能力,共同作用以创建从硬件级别威胁的综合保护。

机制 堡垒类比和功能
安全启动 功能像一个受信任的守门人,在黎明时分检查进入堡垒的每个人的凭证。在您的系统运行任何代码之前,安全启动通过密码学验证固件和操作系统是否被篡改。
可信执行 在堡垒深处创建安全、无窗口的房间,您可以在其中
环境 处理您最敏感的操作。当您的机器学习模型处理
(TEEs) 私人医疗数据或专有算法,TEE 将这些计算与系统其他部分隔离开来。
硬件安全 作为专门、不可穿透的保险库,专为
模块(HSMs) 存储和使用您最宝贵的密码学密钥。而不是将加密密钥保存在普通计算机内存中,可能会被盗,HSMs 提供防篡改存储。
物理 在硅芯片上为每个设备提供一个独特的生物识别指纹
不可克隆 级别。正如人类指纹无法完美复制一样,
功能(PUFs) PUFs 利用每个芯片的微小制造差异来创建无法克隆的设备唯一标识符。

这些机制共同作用,在硬件开始并在所有软件层扩展,以创建综合保护。

本节探讨了这四个互补的硬件原语如何协同工作以创建综合保护(表 15.8)。每个机制解决不同的安全挑战,但结合使用时效果最佳:安全启动建立初始信任,TEE 提供运行时隔离,HSM 处理密码学操作,PUF 实现设备唯一认证。我们首先从可信执行环境(TEEs)开始,它们为敏感计算提供隔离的运行时环境。安全启动确保系统从电源开启时的完整性,为 TEE 依赖的信任基础。硬件安全模块(HSMs)提供专门的密码学处理和防篡改密钥存储,通常符合监管要求。最后,物理不可克隆函数(PUFs)提供设备唯一的身份标识,实现轻量级认证且无法被克隆或提取。

每个机制解决安全挑战的不同方面,当在硬件、固件和软件边界上共同部署时,效果最为显著。

硬件-软件协同设计

现代机器学习系统需要对整个硬件-软件堆栈中的安全权衡进行整体分析,类似于我们在性能优化中分析计算-内存-能量权衡的方式。硬件安全特性和软件防御之间的相互依赖性既创造了机会,也带来了必须定量理解的限制。

硬件安全机制引入了可测量的开销,这些开销必须纳入系统设计中。ARM TrustZone 世界切换根据处理器代和缓存状态(在 500MHz 时为 0.6-2.0μs)大约增加 300-1000 个周期,每切换一次安全和非安全世界之间的延迟。在安全模式下进行的加密操作通常比正常执行多消耗 15-30%的电力,这会影响移动机器学习应用中的电池寿命。Intel SGX 上下文切换为每次推理增加 15-30μs 的开销,对于典型的边缘机器学习工作负载,这代表着 2%的能量开销。

安全特性与计算资源扩展的方式不同。TEE 内存限制无论系统内存可用与否都会约束模型大小。一个量化的 ResNet-18 模型(47MB)可以在 ARM TrustZone 约束内运行,而 ResNet-50(176MB)则需要仔细的内存管理或模型分区。这些限制在系统设计早期就必须做出架构决策。

不同的威胁模型和防护级别需要定量权衡分析。对于需要加密验证的机器学习工作负载,AES-256 操作根据模型大小和硬件加速的可用性,每推理增加 0.1-0.5ms。同态加密操作带来 100-100,000 倍的计算开销,完全同态加密(FHE)在高端,而某种同态加密(SHE)在低端,这使得它们仅适用于小型模型或离线场景,在这些场景中,强大的隐私保证可以证明性能成本是合理的。

可信执行环境

可信执行环境(TEE)52 是处理器内部的一个硬件隔离区域,旨在保护敏感的计算和数据免受可能受损的软件的威胁。TEE 强制执行机密性、完整性和运行时隔离,确保即使主机操作系统或应用层遭到攻击,TEE 内的敏感操作仍然保持安全。

在机器学习的背景下,TEE(可信执行环境)对于保护模型机密性、在推理过程中保护敏感用户数据以及确保模型输出保持可信性变得越来越重要。例如,TEE 可以保护模型参数不被同一设备上运行的恶意软件提取,或者确保涉及生物识别输入的计算,包括面部数据或指纹数据,都是安全进行的。这种能力对于模型完整性、用户隐私或合规性不可协商的应用至关重要。

一个广泛部署的例子是苹果的 Secure Enclave,它为 iOS 设备提供隔离执行和安全密钥存储。通过将加密操作和生物识别数据与主处理器分离,Secure Enclave 确保即使在更广泛的系统妥协事件中,用户凭据和 Face ID 功能也保持受保护。

可信执行环境(TEE)在众多对安全性要求高的行业中都至关重要。在电信领域,TEE 用于保护加密密钥和确保重要的 5G 控制平面操作的安全。在金融领域,它们允许安全的移动支付并保护基于 PIN 的认证工作流程。在医疗保健领域,TEE 有助于在可穿戴或诊断设备上的边缘机器学习推理过程中强制执行患者数据保密性。在汽车行业中,它们被部署在高级驾驶辅助系统(ADAS)中,以确保与安全相关的感知和决策模块在经过验证的软件上运行。

在机器学习系统中,TEE 可以提供几种重要的保护。它们保护模型推理或训练的执行,屏蔽中间计算和最终预测免受系统级观察。它们保护敏感输入的机密性,包括用于个人识别或风险评估任务中的生物识别或临床信号。TEE 还通过限制对权重和架构内部的访问来防止已部署模型的逆向工程。当模型更新时,TEE 确保新参数的真实性并阻止未经授权的篡改。在分布式机器学习设置中,TEE 可以通过启用加密和证明的通信通道来保护组件之间交换的数据。

TEE 的核心安全属性是通过四种机制实现的:隔离执行、安全存储、完整性保护和 TEE 内部数据加密。在 TEE 内部运行的代码以单独的处理器模式执行,无法被正常世界的操作系统访问。敏感资产,如加密密钥或认证令牌,存储在只有 TEE 可以访问的内存中。在执行之前,可以使用硬件锚定的散列或签名来验证代码和数据完整性。最后,TEE 内部处理的数据可以加密,确保即使中间结果在没有适当密钥的情况下也无法访问,这些密钥也由 TEE 内部管理。

几个商业平台提供了针对不同部署环境定制的 TEE 功能。ARM TrustZone53 在基于 ARM 的系统上提供安全和正常世界的执行,广泛应用于移动和物联网应用。Intel SGX54 实现了基于安全区域的安全,为云和桌面系统提供,即使在不受信任的基础设施上也能实现安全计算。高通的 Secure Execution Environment支持安全的移动交易和用户认证。苹果的 Secure Enclave 仍然是消费设备上硬件隔离安全协处理器的典范。

图 15.15 展示了集成到片上系统(SoC)架构中的安全区域。该区域包括一个专用处理器、一个 AES 引擎、一个真正的随机数生成器(TRNG)、一个公钥加速器(PKA)和一个安全的 I²C 接口,用于非易失性存储。这些组件与主应用程序处理器和内存子系统隔离运行。内存保护引擎强制执行访问控制,而如 NAND 闪存加密之类的加密操作则使用安全区域管理的密钥在内部处理。通过在物理上将安全执行和密钥管理从主系统分离出来,这种架构限制了系统级破坏的影响,并建立了硬件强制的信任。

图 15.15:安全区域架构:硬件隔离的安全区域通过在专用处理器和内存中封装敏感数据和加密操作来增强系统安全性。这种设计最小化了攻击面,即使在主应用程序处理器被破坏的情况下,也能保护重要密钥,为安全重要任务提供可信执行环境。来源:苹果。

这种架构为在消费设备上安全部署机器学习应用提供了基础。例如,苹果的 Face ID 系统使用安全区域在硬件隔离环境中执行面部识别。面部嵌入模型在安全区域内执行,生物识别模板存储在安全的非易失性存储器中,该存储器只能通过安全区域的 I²C 接口访问。在认证过程中,来自红外摄像头的输入数据在本地进行处理,面部特征或预测永远不会离开安全区域。即使应用程序处理器或操作系统被破坏,安全区域也能防止对敏感模型输入、参数和输出的访问,确保生物识别身份从端到端得到保护。

尽管具有优势,但可信执行环境也伴随着显著的权衡。实现 TEE 会增加直接硬件成本和与开发及维护安全软件相关的间接成本。将 TEE 集成到现有系统中可能需要架构重设计,尤其是对于遗留基础设施。开发者必须遵守严格的隔离、证明和安全的更新管理协议,这可能会延长开发周期并复杂化测试工作流程。TEE 还可能引入性能开销,尤其是在涉及密码学操作或频繁在可信和不可信模式之间切换时。

能效也是另一个考虑因素,尤其是在电池受限的设备中。TEE 通常由于安全的内存访问、密码学计算和硬件保护逻辑而消耗额外的电力。在资源有限的嵌入式系统中,这些成本可能会限制其使用。在可扩展性和灵活性方面,TEE 强制执行的 secure boundaries 可能会使分布式训练或联邦推理工作负载复杂化,在这些工作负载中需要安全地协调 enclaves(安全区域)。

市场需求也各不相同。在某些消费应用中,感知到的威胁水平可能过低,不足以证明集成 TEE(可信执行环境)的必要性。具有 TEE 的系统可能需要正式的安全认证,例如通用标准ENISA的评估,这可能会带来额外的时间和费用。因此,TEE 通常仅在预期的威胁模型(包括对抗性用户、云租户和恶意内部人员)证明投资合理时才被采用。

尽管如此,TEE 在机器学习安全领域仍然是一个强大的硬件原语。当与软件和系统级别的防御措施结合使用时,它们为安全、私密和可验证地执行 ML 模型提供了一个可信的基础,尤其是在主机环境可能遭受对抗性破坏的严重关注场景中。

这里是修订后的 7.5.2 安全启动部分,以正式教科书风格重写,保留了所有原始技术内容、超链接和图表。结构强调叙事清晰,避免使用项目符号列表,并自然地整合了苹果 Face ID 案例研究。

安全启动

安全启动是一种机制,确保设备仅启动由制造商通过密码学验证并明确授权的软件组件。在启动过程中,引导加载程序、内核和基本操作系统等启动过程的每个阶段都会与已知的良好数字签名进行核对。如果任何签名验证失败,启动序列将被终止,防止未经授权或恶意代码执行。这种信任链模型从执行的第一条指令开始就建立了系统完整性。

在机器学习系统中,尤其是在部署在嵌入式或边缘硬件上的系统中,安全启动发挥着重要作用。受损的启动过程可能导致在机器学习运行时开始之前加载恶意软件,使攻击者能够拦截模型权重、篡改训练数据或重定向推理结果。此类违规行为可能导致预测错误或被操纵,未经授权的数据访问,或设备被重新用于僵尸网络或加密挖矿。

对于机器学习系统,安全启动提供了多项保证。首先,它在启动序列中保护与模型相关的数据,例如训练数据、推理输入和输出,防止在运行前被篡改。其次,它确保仅加载经过身份验证的模型二进制文件和支持软件,这有助于防止部署时的模型替换。第三,安全启动通过验证固件或模型更改是否已签名且在传输过程中未被篡改,允许安全地更新模型。

安全启动通常与基于硬件的信任执行环境(TEEs)协同工作,以创建一个完全信任的执行堆栈。如图 15.16 所示,这种分层的启动过程在允许执行加密操作或机器学习工作负载之前,验证固件、操作系统组件和 TEEs 的完整性。在嵌入式系统中,这种架构即使在严重对抗条件或物理设备受损的情况下也能提供弹性。

图片

图 15.16:安全启动序列:嵌入式系统采用分层启动过程来验证固件和软件完整性,在执行机器学习工作负载之前建立信任根,并保护免受运行前攻击。这种架构确保仅运行经过身份验证的代码,保护模型数据,并在部署期间防止未经授权的模型替换或修改。来源:(R. V. 和 A. 2018)。

安全启动的一个著名的现实世界实现出现在苹果的 Face ID 系统中,该系统使用高级机器学习进行面部识别。为了使 Face ID 安全运行,从初始开机到执行模型,整个设备堆栈必须可验证地信任。

在设备启动时,安全启动在苹果的安全 enclave中启动,这是一个专门的安全协处理器,用于处理生物识别数据。加载到安全 enclave 的固件由苹果数字签名,任何未经授权的修改都会导致启动过程失败。一旦验证通过,安全 enclave 将与中央处理器协同进行持续检查,以维护一个信任的启动链。每个系统组件,从 iOS 内核到应用级代码,都使用加密签名进行验证。

在完成安全引导序列后,Secure Enclave 激活基于机器学习的 Face ID 系统。面部识别模型投射超过 30,000 个红外点来映射用户的面部,生成深度图像并计算一个数学表示,该表示与安全存储的配置文件进行比较。这些面部数据工件永远不会写入磁盘、从设备传输或外部共享。所有处理都在安全区域内进行,以防止窃听或数据泄露,即使在内核受损的情况下也是如此。

为了支持持续的完整性,Secure Boot 还管理软件更新。只有由苹果公司签名的固件或模型更新才被接受,确保即使空中补丁也不会引入风险。这个过程随着时间的推移维护了一个强大的信任链,使机器学习系统的安全演变成为可能,同时保护用户隐私和设备安全。

虽然 Secure Boot 提供了强大的保护,但其采用也带来了技术和操作上的挑战。管理用于签名和验证系统组件的加密密钥是复杂的,尤其是在规模较大的情况下。企业必须安全地提供、轮换和吊销密钥,确保没有可信根被破坏。任何此类违规行为都会破坏整个安全链。

性能也是一个考虑因素。在引导过程中验证签名引入了延迟,通常每个组件的延迟在数十到数百毫秒之间。尽管在许多应用中可以接受,但这些延迟对于实时或功耗受限的系统可能成为问题。开发者还必须确保所有组件,包括引导加载程序、固件、内核、驱动程序,甚至机器学习模型,都正确签名。将第三方软件集成到 Secure Boot 管道中引入了额外的复杂性。

一些系统为了优先考虑供应商锁定安全模型而限制了用户控制,限制了可升级性或定制性。作为回应,开源引导加载程序如 u-bootcoreboot 应运而生,提供了 Secure Boot 功能,同时支持可扩展性和透明度。为了进一步扩展可信设备部署,新兴的行业标准,如 设备标识符组合引擎 (DICE)IEEE 802.1AR IDevID,提供了安全设备标识、密钥提供和跨供应商信任保证的机制。

当 Secure Boot 被谨慎实施,并辅以可信硬件和安全的软件更新流程时,它构成了嵌入式和分布式机器学习系统完整性的基石。它确保在生产环境中运行的机器学习模型不仅是正确的版本,而且是在一个已知良好的环境中执行,并基于硬件级别的信任。

硬件安全模块

虽然 TEE 和安全的引导提供了运行时隔离和完整性验证,但硬件安全模块(HSMs)专门从事支撑这些保护的基础加密操作。HSM55 是一种抗篡改的物理设备,旨在执行加密操作并安全地管理数字密钥。HSM 在金融、国防和云基础设施等安全重要的行业中得到广泛应用,并且对于确保机器学习管道的安全性越来越重要——特别是在关键保密性、模型完整性和法规遵从性重要的部署中。

HSMs 提供了一种隔离、加固的环境,用于执行敏感操作,如密钥生成、数字签名、加密和解密。与通用处理器不同,它们被设计成能够抵御物理篡改和侧信道攻击,并且通常包括受保护存储、加密加速器和内部审计日志。HSMs 可以作为独立设备、插件模块或嵌入更广泛系统中的集成芯片来实现。

在机器学习系统中,HSMs 在多个维度上增强了安全性。它们通常用于保护在训练或推理过程中可能处理的敏感数据的加密密钥。这些密钥可能加密模型检查点中的静态数据,或允许在网络环境中安全地传输推理请求。通过确保密钥仅在 HSM 内部生成、存储和使用,系统最大限度地降低了密钥泄露、未经授权的重用或篡改的风险。

HSMs 还在维护机器学习模型的完整性方面发挥作用。在许多生产管道中,模型在部署之前必须进行签名,以确保只有经过验证的版本被接受到运行时环境中。用于验证模型的签名密钥可以存储和管理在 HSM 中,提供加密保证,确保部署的工件是真实的且未被篡改。同样,无论它们是否与模型、超参数或支持基础设施相关,都可以使用 HSM 生成的签名来验证安全的固件更新和配置更改。

除了保护推理工作负载外,HSMs 还可以用于确保模型训练的安全性。在训练过程中,数据可能来自分布式和可能不可信的来源。基于 HSM 的协议可以帮助确保训练管道安全地执行加密、完整性检查和访问控制执行,并符合组织或法律要求。在医疗保健和金融等受监管行业,此类保护通常是强制性的。例如,HIPAA 要求受保护实体实施包括“完整性控制”和“加密和解密”在内的技术保障措施,而 GDPR 则将匿名化和加密作为适当技术措施的例子。

尽管有这些好处,将 HSMs 集成到嵌入式或资源受限的 ML 系统中会引入一些权衡。首先,HSMs 是专门的硬件组件,通常价格较高。在数据中心设置或安全至关重要的应用中,其成本可能是合理的,但对于低利润的嵌入式产品或可穿戴设备来说可能是难以承受的。物理空间也是一个问题。嵌入式系统通常在严格的大小、重量和外形因素限制下运行,集成 HSM 可能需要重新设计电路布局或牺牲其他功能。

从性能角度来看,HSMs 引入了延迟,尤其是在密钥交换、签名验证或即时解密等操作中。在实时推理系统中,包括自动驾驶汽车、工业机器人和实时翻译设备,这些延迟可能会影响响应速度。虽然 HSMs 通常针对加密吞吐量进行优化,但它们不是通用处理器,并且安全操作的分担必须仔细协调。

功耗也是一个关注点。持续安全地处理密钥、签署交易和进行加密验证可能会消耗比基本嵌入式组件更多的电力,影响移动或远程部署的电池寿命。

当 HSMs 被引入现有的 ML 管道时,集成复杂性也会增加。HSM 与主机处理器之间的接口需要专用 API,并且通常需要专门的软件开发。固件和模型更新必须通过安全、签名的通道进行路由,并且更新编排必须考虑到设备特定的密钥配置。这些要求增加了操作负担,尤其是在大规模部署中。

可扩展性也带来了一组挑战。管理配备 HSM 的分布式设备群需要为单个密钥提供安全配置、安全身份绑定和协调的信任管理。在大规模 ML 部署中,包括智能传感器或边缘推理节点群,确保所有设备都保持一致的安全态势并非易事。

最后,使用 HSMs 通常要求组织参与认证和合规流程 56,尤其是在处理受监管数据时。满足 FIPS 140-257 或通用标准等标准会增加开发的时间和成本。

尽管存在这些操作复杂性,但 HSMs(硬件安全模块)仍然是对于需要高度保证加密完整性和访问控制的安全机器学习系统的宝贵选择。当与 TEE(可信执行环境)、安全启动和基于软件的防御措施结合使用时,HSMs 有助于构建一个跨越硬件、系统软件和 ML 运行时的多层安全模型。

物理不可克隆功能

物理不可克隆函数(PUFs)58 通过利用半导体制造中的物理随机性,提供了一种硬件固有的机制,用于加密密钥生成和设备身份验证(Gassend 等人,2002)。与存储在内存中的传统密钥不同,PUF 基于芯片物理属性的微观变化生成秘密值——这些变化是制造过程固有的,难以复制或预测,即使是制造商也无法做到。

这些变化源于不可控的物理因素,如掺杂浓度、线边缘粗糙度和介电层厚度。因此,即使使用相同的设计掩模制造的芯片,在时序、功耗或电压行为上也会表现出微小但可测量的差异。PUF 电路放大这些差异以产生设备独特的数字输出。当对 PUF 应用特定的输入挑战时,它会根据芯片的物理指纹生成相应的响应。因为这些特性实际上无法复制,所以相同的挑战在不同设备上会产生不同的响应。

这种挑战-响应机制允许 PUF 服务于多个加密目的。它们可以用来推导出特定于设备的密钥,这些密钥无需存储在外部,从而减少了密钥泄露的攻击面。同样的机制也支持安全的身份验证和证明,其中设备必须向受信任的服务器或硬件网关证明其身份。这些特性使 PUF 成为嵌入式和分布式环境中部署的机器学习系统的理想选择。

在机器学习应用中,PUF 为保护资源受限的系统提供了独特的优势。例如,考虑一个使用机载计算机视觉跟踪物体的智能相机无人机。嵌入在无人机处理器中的 PUF 可以生成一个私钥,在启动时加密模型。即使模型被提取,在没有相同 PUF 响应的另一个设备上也无法使用。同样的 PUF 派生的密钥也可以用来水印模型参数,在部署的模型与其原始硬件之间创建一个可加密验证的链接。如果模型被泄露或盗版,嵌入的水印可以帮助证明攻击的来源。

PUFs(物理不可克隆函数)也支持在分布式机器学习管道中进行身份验证。如果无人机将计算任务卸载到云服务器,PUF 可以帮助验证无人机没有被克隆或篡改。云后端可以发出挑战,验证设备返回的正确响应,并且只有当 PUF 证明设备真实性时才允许访问。这些保护措施不仅增强了人们对模型和数据的信任,也增强了人们对执行环境的信任。

PUF(物理不可克隆函数)的内部工作原理在图 15.17 中进行了说明。从高层次来看,PUF 接受一个挑战输入并产生一个由芯片的物理微结构决定的独特响应(高,阿尔-萨拉维和艾博特 2020)。变体包括光学 PUF,其中挑战由光模式组成,响应为斑点图像,以及电子 PUF,如仲裁器 PUF(APUF),其中电路路径之间的时序差异产生二进制输出。另一种常见实现是 SRAM PUF,它利用未初始化 SRAM 单元的加电状态:由于阈值电压不匹配,每个单元在首次加电时往往会稳定在一个首选值。这些响应模式形成了一个稳定、可重复的硬件指纹。

图片

图 15.17:物理不可克隆函数:PUF 从固有的制造变化中生成独特的硬件指纹,使设备认证和安全的密钥生成成为可能,而无需存储秘密。光学和电子 PUF 实现使用物理现象——如光斑点图案或时序差异——来产生难以预测或复制的挑战-响应对。来源:(高,阿尔-萨拉维和艾博特 2020)。

尽管具有前景,PUF 在系统设计中仍存在一些挑战。它们的输出可能对环境变化敏感,如温度或电压的变化,这可能导致响应中的不稳定性或位错误。为确保可靠性,PUF 系统通常必须包含错误纠正码或辅助数据方案。管理大量挑战-响应对也引发了关于存储、一致性和撤销的问题。此外,如果未经仔细保护免受外部观察,PUF 输出的独特统计结构可能会使其容易受到基于机器学习的建模攻击。

从制造角度来看,采用 PUF 技术可能会增加设备成本或需要额外的布局复杂性。虽然 PUF 消除了外部密钥存储的需要,从而降低了长期安全风险和配置成本,但它们可能需要在制造过程中进行校准和测试,以确保在不同环境条件和设备老化过程中的性能一致性。

尽管如此,物理不可克隆函数仍然是确保嵌入式机器学习系统安全的一个有吸引力的构建块。通过将硬件身份直接嵌入到芯片中,PUF 支持轻量级加密操作,减轻密钥管理负担,并在分布式或资源受限环境中帮助建立信任锚。当精心集成时,它们补充了其他硬件辅助安全机制,如安全启动、TEE 和 HSM,以在整个机器学习系统生命周期内提供多层次防御。

机制比较

硬件辅助的安全机制在现代机器学习系统中建立信任发挥着基础性作用。虽然基于软件的防御提供了灵活性,但它们最终依赖于硬件平台的可靠性。随着机器学习工作负载越来越多地运行在边缘设备、嵌入式平台和不信任的基础设施上,硬件支持的保护对于维护系统完整性、机密性和信任变得重要。

可信执行环境 (TEEs) 为模型推理和敏感数据处理提供运行时隔离。安全启动从电源开启就强制执行完整性,确保只执行已验证的软件。硬件安全模块 (HSMs) 提供防篡改的存储和加密处理,用于安全密钥管理、模型签名和固件验证。物理不可克隆函数 (PUFs) 将秘密和认证绑定到特定设备的物理特性,从而实现轻量级且不可克隆的身份。

这些机制针对系统堆栈的不同层次,从初始化和证明到运行时保护和身份绑定,当一起部署时相互补充。表 15.9 下比较了它们在机器学习系统设计中的角色、用例和权衡。

表 15.9:硬件安全机制:机器学习系统使用各种硬件防御措施——可信执行环境、安全启动、硬件安全模块和物理不可克隆函数——以建立信任并保护系统堆栈中的敏感数据。该表详细说明了每种机制如何解决特定的安全挑战——从运行时隔离和完整性验证到密钥管理和设备身份——并强调了相关的性能和复杂性权衡。

机制 主要功能 在机器学习中的常见应用 权衡
可信执行环境 (TEE) 安全计算的安全运行环境 对敏感输入和输出的安全推理和设备隐私 增加复杂性,内存限制,性能成本需要可信代码开发
安全启动 验证的启动序列和固件验证 确保仅在嵌入式设备上执行已签名的机器学习模型和固件 密钥管理复杂性,供应商锁定性能在启动期间的影响
硬件安全模块 (HSM) 安全密钥生成和存储,加密处理 签名机器学习模型,保护训练管道,验证固件 成本高,集成开销,有限的 I/O 需要基础设施级别的配置
物理不可克隆函数 (PUF) 与硬件绑定的身份和密钥派生 模型绑定,设备认证,保护嵌入式部署中的知识产权 对环境敏感,建模攻击需要错误纠正和校准

这些硬件原语共同构成了在对抗环境中保护机器学习系统的深度防御策略的基础。在需要可证明信任的领域,如自动驾驶汽车、医疗设备、联邦学习系统和重要基础设施,它们的集成尤为重要。

实施路线图

本章涵盖的全面安全和隐私技术对于刚开始保护其机器学习系统的组织来说可能显得令人不知所措。与其同时实施所有防御措施,不如分阶段的方法能够系统地提高安全性,同时管理复杂性和成本。本路线图提供了一个构建稳健机器学习安全性的实用序列,从基础控制到高级防御逐步推进。

第一阶段:基础安全控制

从提供最大风险降低且复杂性最低的基本安全控制措施开始。这些基础措施针对最常见的攻击向量,并建立了更高级防御所需的可信基础设施。

  • 访问控制和身份验证:为所有机器学习系统组件实施基于角色的访问控制(RBAC),包括训练数据、模型存储库和推理 API。对于管理访问使用多因素身份验证,对于服务到服务的身份验证使用短期令牌。建立最小权限原则,确保用户和服务仅拥有执行其功能所需的最小权限。

  • 数据保护:使用 AES-256 对所有静态数据进行加密,并强制执行 TLS 1.3 对所有传输中的数据进行加密。这包括训练数据集、模型文件和推理通信。实施所有数据访问和模型操作的全面日志记录,以支持事件调查和合规性审计。

  • 输入验证和基本监控:为所有机器学习 API 部署输入验证以拒绝格式错误的请求,实施速率限制以防止滥用,并建立基线监控以检测异常推理模式。这些措施可以抵御基本的对抗性输入,并使系统能够了解其行为。

  • 安全开发实践:为机器学习管道建立安全编码实践,包括带有漏洞扫描的依赖关系管理、验证模型完整性的安全模型序列化和部署管道中的自动安全测试。

第二阶段:隐私控制和模型保护

在建立基础控制措施之后,重点关注保护敏感数据和确保您的机器学习模型免受窃取和操纵。这一阶段涉及隐私法规和知识产权保护。

  • 隐私保护技术:对于非敏感用例实施数据匿名化,对于需要正式隐私保证的场景实施差分隐私。在协作学习场景中,部署联邦学习架构,以保持敏感数据本地化同时实现模型改进。

  • 模型安全:通过加密模型文件、设计安全的 API 以限制信息泄露和监控模型提取尝试来保护部署的模型。实施模型版本控制和完整性检查以检测未经授权的修改。

  • 安全训练基础设施:通过隔离训练工作负载、实施具有验证和来源跟踪的安全数据管道以及建立具有访问控制和审计跟踪的安全模型注册表来强化训练环境。

  • 合规性集成:实施必要的控制措施以满足监管要求,如 GDPR、HIPAA 或行业特定标准。这包括数据主体权利管理、隐私影响评估以及数据处理活动的记录。

第三阶段:高级威胁防御

最终阶段在高风险环境中实施复杂的防御措施,这些环境中的高级对手构成了重大威胁。这些防御措施需要更多的专业知识和资源,但可以提供对最先进攻击的保护。

  • 对抗鲁棒性:部署对抗性训练以提高模型对逃避攻击的鲁棒性,实施针对安全关键应用的认证防御,并建立针对新对抗技术的持续测试。

  • 高级运行时监控:部署针对特定于机器学习的异常检测系统,可以识别如数据中毒效应或模型逐渐退化等复杂攻击。实施行为分析,建立正常操作基线和针对偏差的警报。

  • 基于硬件的安全:对于最高安全要求,实施用于模型推理的信任执行环境(TEEs)、边缘设备的安全引导过程以及用于加密密钥管理的硬件安全模块(HSMs)。

  • 事件响应和恢复:建立针对机器学习的特定事件响应程序,包括模型回滚功能、受污染数据的隔离程序以及针对机器学习特定攻击的取证分析技术。

实施注意事项

要成功实施此路线图,需要在安全改进和运营能力之间取得平衡。在进入下一阶段之前,每个阶段都应完全实施并稳定。组织应根据其特定的威胁模型定制此序列:医疗保健系统可能优先考虑第二阶段的隐私控制,金融机构可能强调第一阶段的数据保护,而自动驾驶车辆系统可能快速推进到第三阶段的对抗鲁棒性。

资源分配应考虑到高级阶段不断增加的技术复杂性和运营开销。第一阶段通常需要标准的 IT 安全专业知识,而第三阶段的防御可能需要专门的机器学习安全知识或外部咨询。组织应在实施高级控制之前投资于培训和招聘适当的专家。

定期的安全评估应验证实施控制措施的有效性,并指导通过各个阶段。这些评估应包括针对机器学习特定攻击向量的渗透测试、模拟现实对抗场景的红队演习,以及合规性审计,以验证是否有效满足监管要求。

谬误和陷阱

在审查了防御和攻击能力之后,我们现在解决可能削弱安全努力的常见误解。机器学习系统中的安全和隐私面临独特的挑战,这些挑战超越了传统的网络安全问题,涉及对数据、模型和推理过程的复杂攻击。现代机器学习管道的复杂性,加上机器学习的概率性质和训练数据的敏感性,为关于有效保护策略的误解提供了许多机会。

谬误: 通过保密提供的安全措施足以保护机器学习模型

这种过时的方法假设隐藏模型架构、参数或实现细节可以提供有意义的网络安全保护。现代攻击往往不需要详细了解目标系统,而是依赖黑盒技术,通过输入输出关系探测系统行为。通过精心设计的查询,模型提取攻击可以重建重要的模型功能,而对抗攻击通常可以跨不同架构转移。有效的机器学习安全需要强大的防御措施,即使在攻击者完全了解系统的情况下也能发挥作用,遵循既定的安全原则,而不是依赖保密。

陷阱: 假设差分隐私自动确保隐私,而没有考虑实施细节

许多从业者将差分隐私视为通用的隐私解决方案,而没有理解适当实施和参数选择的重要性。配置不当的隐私预算可能提供微不足道的保护,同时严重降低模型效用。实施漏洞,如浮点精度问题、噪声生成不足或隐私预算耗尽,可能会完全破坏隐私保证。现实世界系统需要仔细分析隐私参数,进行严格的实施验证,以及持续的监控,以确保理论上的隐私保证转化为实际的保护。

谬误: 联邦学习本质上提供隐私保护,无需额外的安全措施

一个相关的隐私误解假设保持数据去中心化自动确保隐私保护。虽然联邦学习比集中式训练提高了隐私性,但梯度更新和模型更新仍然可以通过推理攻击泄露关于本地训练数据的重大信息。复杂的对手可以重建训练示例、推断成员信息或从共享模型参数中提取敏感属性。在联邦环境中实现真正的隐私保护需要额外的机制,如安全聚合、差分隐私和仔细的通信协议,而不仅仅是依赖于数据本地性。

陷阱: 将安全视为一个独立的组件,而不是系统级属性。

除去特定的技术误解之外,一个关键的架构陷阱涉及那些通过向单个组件添加安全功能来处理机器学习安全,而没有考虑到系统级交互和攻击向量。这种零散的方法无法解决跨越多个组件或利用子系统之间接口的复杂攻击。有效的机器学习安全需要全面的威胁建模,该建模考虑了从数据收集到模型部署和维护的整个系统生命周期,遵循在第 15.4.1 节中确立的威胁优先级原则。安全必须集成到机器学习管道的每个阶段,而不是作为一个附加功能或部署后的考虑。

陷阱: 低估分布式机器学习系统中的攻击面扩展。

许多组织专注于保护单个组件,而没有认识到分布式机器学习架构如何增加攻击面并引入新的漏洞类别。跨多个数据中心进行分布式训练为中间人攻击梯度交换、证书欺骗和未经授权参与训练轮次提供了机会。边缘部署增加了需要安全更新、监控和事件响应能力的端点。跨越多个云的模型服务基础设施引入了依赖链攻击,其中分布式系统中的任何组件被破坏都可能影响整体安全性。编排系统、负载均衡器、模型注册表和监控基础设施各自为高级攻击者提供了潜在的入口点。有效的分布式机器学习安全需要全面的威胁建模,该建模考虑到网络通信安全、端点加固、跨多个域的身份管理以及跨异构基础设施组件的安全策略协调。

摘要

本章探讨了机器学习系统中安全和隐私的复杂格局,从核心威胁到综合防御策略。安全和隐私是部署机器学习系统到生产环境中的基本要求。由于这些系统处理敏感数据,在多个平台上运行,并面临复杂的威胁,其安全态势必须涵盖整个技术栈。现代机器学习系统遭遇的攻击向量从数据中毒和模型提取到对抗性示例和硬件级别的妥协,这些都可能损害系统完整性和用户信任。

有效的安全策略采用深度防御方法,这些方法在系统架构的多个层面上运行。隐私保护技术如差分隐私和联邦学习在保护敏感数据的同时,使模型训练成为可能。健壮的模型设计结合对抗性训练和输入验证以抵抗操纵。硬件安全功能提供可信执行环境和安全启动过程。运行时监控在操作期间检测异常行为和潜在的攻击。这些互补的防御措施创建了能够抵御跨多个攻击面的协调攻击的弹性系统。

关键要点

  • 安全性和隐私必须从初始架构设计开始整合,而不是作为机器学习系统的附加考虑

  • 机器学习系统面临来自三个类别的威胁:模型机密性(盗窃)、训练完整性(中毒)和推理鲁棒性(对抗性攻击)

  • 由于自主决策能力,历史安全模式(供应链妥协、隔离不足、武器化端点)在机器学习环境中加剧

  • 有效的防御需要跨越数据隐私、模型安全、运行时监控和硬件信任锚点的分层保护

  • 环境驱动防御选择:医疗保健优先考虑法规遵从性,自动驾驶汽车优先考虑对抗性鲁棒性,金融系统优先考虑模型盗窃预防

  • 隐私保护技术包括差分隐私、联邦学习、同态加密和合成数据生成,每种技术都有其独特的权衡

  • 硬件安全机制(TEE、安全启动、HSM、PUF)为软件级保护提供基础信任

  • 安全性在计算成本、精度下降和实现复杂性方面引入了不可避免的权衡,这些权衡必须与保护效益相平衡

展望未来,本章中建立的安全和隐私基础构成了在第十六章中探讨的综合鲁棒框架的关键构建块。虽然我们专注于防御恶意行为者和保护敏感信息,但真正的系统可靠性需要将这些概念扩展到处理所有形式的操作压力。我们在此开发的监控基础设施、防御机制和分层架构为检测分布变化、管理不确定性和在不利条件下确保优雅降级提供了基础——这些内容将是我们在鲁棒人工智能探索中的核心主题。


鲁棒人工智能

DALL·E 3 提示:创建一个图像,展示一个由复杂发光的神经网络象征的高级 AI 系统,该神经网络深深嵌套在一系列逐渐增大和更坚固的盾牌中。每一层盾牌代表一层防御,展示了系统对外部威胁和内部错误的鲁棒性。位于这些盾牌堡垒核心的神经网络,通过其表示 AI 学习和适应能力的连接辐射出光芒。这个视觉隐喻不仅强调了 AI 的技术复杂性,还强调了其弹性和安全性,背景是一个充满最新技术进步的先进、安全的服务器室。该图像旨在传达人工智能领域的终极保护和弹性概念。

图片

目的

我们如何开发出对现实世界部署具有容错性和弹性的机器学习系统?

在现实世界应用中的机器学习系统需要在各种操作条件下实现容错执行。这些系统面临多个挑战,包括硬件异常、对抗性攻击以及与训练假设不符的不可预测的现实世界数据分布,这些挑战会降低其能力。这些漏洞要求 AI 系统在设计部署阶段优先考虑鲁棒性和可信度。构建具有弹性的机器学习系统需要在动态和不确定的环境中实现安全和有效的操作。理解鲁棒性原则使工程师能够设计出能够承受硬件故障、抵抗恶意攻击并适应分布变化的系统。这种能力使得能够在具有严重后果的安全关键应用中部署 ML 系统,例如在不可预测的现实世界条件下运行的自动驾驶汽车和医疗诊断系统。

学习目标

  • 将影响机器学习系统的硬件故障分类为瞬态、永久和间歇性类别,并描述其独特的特征

  • 分析位翻转、内存错误和组件故障如何通过神经网络计算传播,从而降低模型性能

  • 比较硬件故障检测机制,包括 BIST、错误检测码和冗余投票系统

  • 设计结合硬件级保护和软件实现监控的容错策略,以用于机器学习部署

  • 评估对抗性攻击向量,包括基于梯度的、基于优化的和基于迁移的技术在神经网络上的应用

  • 通过异常检测、净化和鲁棒训练方法实施针对数据中毒攻击的防御策略

  • 使用监控技术和统计漂移检测方法评估分布变化对模型准确性的影响

  • 在整个机器学习管道中整合稳健性原则,从数据摄取到模型部署和监控。

弹性人工智能系统简介

当传统软件失败时,它通常会大声失败:服务器崩溃,应用程序抛出错误,用户收到清晰的错误消息。当机器学习系统失败时,它通常是无声失败。自动驾驶汽车的感觉系统不会崩溃;它只是错误地将卡车分类为天空。需求预测模型不会出错;它只是开始做出极端不准确的预测。医疗诊断系统不会关闭;它安静地提供可能危及患者生命的错误分类。这种“无声失败”模式使得稳健性成为人工智能系统中的一个独特且关键的挑战。工程师必须不仅防御代码中的错误,还要防御一个拒绝符合训练数据的世界。

随着机器学习系统在多样化的部署环境中扩展,从基于云的服务到边缘设备和嵌入式系统,硬件和软件故障对性能和可靠性有显著影响。这些系统的日益复杂性和其在安全关键应用中的部署 1 使得稳健和容错设计对于维护系统完整性至关重要。

在第十四章中介绍的自适应部署挑战和第十五章中考察的安全漏洞的基础上,我们现在转向全面系统可靠性。机器学习系统在多个领域运行,包括硬件和软件故障、恶意输入如对抗攻击和数据中毒,以及环境变化,这些都可能带来严重后果,从经济破坏到生命威胁。

为了应对这些风险,研究人员和工程师必须开发出超越单纯安全措施的先进技术,用于故障检测、隔离和恢复。虽然第十五章确立了如何抵御有意的攻击,但确保可靠运行需要解决可能损害系统行为的所有潜在故障的全谱系,无论是故意的还是无意的。

这种容错的需求确立了我们所定义的弹性人工智能

弹性人工智能描述的是设计用来在系统错误、恶意输入和环境变化的情况下,通过系统的故障检测、缓解和恢复来维持性能可靠性的机器学习系统。

本章通过我们统一的三类框架来考察鲁棒性挑战,建立在第十四章中的自适应部署挑战和第十五章中的安全漏洞之上。我们的系统方法确保在部署前系统可靠性全面。

在叙事弧中的定位:虽然第十四章确立了资源受限环境中的自适应部署挑战,第十五章则解决了这些适应带来的漏洞,但本章确保了在所有故障模式下的系统可靠性:故意攻击、意外故障和自然变化。这个全面的可靠性框架对于第十三章中详细描述的操作工作流程至关重要。

第一类,系统硬件故障,在计算系统中提出了重大挑战(第二章)。这些故障可能是瞬时的 2、永久的或间歇性的,它们可能会破坏计算并降低系统性能。影响范围从暂时的故障到完全的组件故障,需要强大的检测和缓解策略来维持可靠的运行。这种以硬件为中心的视角超越了其他章节中算法优化的范畴,以解决物理层漏洞。

恶意操纵代表我们的第二类问题,我们从这个角度来考察对抗性鲁棒性,而不是像第十五章中提到的以安全为首要考虑的方法。虽然那一章讨论了身份验证、访问控制和隐私保护,但我们专注于在受到攻击时保持模型性能。对抗性攻击、数据中毒尝试和提示注入漏洞可能导致模型错误分类输入或产生不可靠的输出,需要专门的防御机制,这些机制与传统安全措施不同。

补充这些故意威胁的是环境变化,这引入了我们的第三类鲁棒性挑战。与第十三章中讨论的操作监控不同,我们考察模型如何随着数据分布随时间自然变化而保持准确性。算法、库和框架中的错误、设计缺陷和实现错误可能会在整个系统中传播,造成超越单个组件故障的系统级漏洞 3。这种鲁棒性的系统级视角涵盖了整个机器学习管道,从数据摄入到推理。

实现鲁棒性的具体方法根据部署环境和系统限制而有很大差异。虽然第九章确立了优化效率的原则,但大规模云计算环境通常通过冗余和复杂的错误检测机制来强调容错性。来自第十四章的边缘设备必须在严格的计算、内存和能源限制内解决鲁棒性挑战,需要适用于资源受限环境的专用加固策略。这些限制要求进行仔细的优化和有针对性的加固策略 4,适用于资源受限的环境。

尽管存在这些情境差异,鲁棒机器学习系统的基本特征包括容错性、错误恢复性和持续性能。通过理解和解决这些多方面的挑战,工程师可以开发出可靠的机器学习系统,能够在现实世界环境中有效运行。

鲁棒的 AI 系统与基本实现相比,不可避免地需要更多的计算资源,这与第十八章中确立的可持续性原则形成直接冲突。错误纠正机制消耗了 12-25%的额外内存带宽,冗余处理使能耗增加了 2-3×\times,而持续监控增加了 5-15%的计算开销。这些鲁棒性措施还产生了额外的热量,加剧了热管理挑战,限制了部署密度并需要增强的冷却基础设施。理解这些可持续性权衡使工程师能够做出明智的决定,在最小化环境影响的同时,确定鲁棒性投资提供最大价值的领域。

本章系统地考察了这些多维鲁棒性挑战,探讨了硬件、算法和环境领域的检测和缓解技术。基于边缘系统(第十四章)的部署策略和第十八章中的资源效率原则,我们开发了全面的方法,这些方法在考虑能源和热约束的同时,解决了所有计算环境中的容错性要求。这里对鲁棒性挑战的系统性考察为构建可靠的人工智能系统奠定了基础,这些系统能在现实世界的部署中保持性能和安全,将鲁棒性从次要考虑转变为生产机器学习系统的核心设计原则。

现实世界的鲁棒性失败

理解机器学习系统中鲁棒性的重要性需要检查故障在实际中的表现。现实世界的案例研究说明了硬件和软件故障在云、边缘和嵌入式环境中的后果。这些例子突出了容错设计、严格测试和强大系统架构的临界需求,以确保在多样化的部署场景中可靠运行。

云基础设施故障

2017 年 2 月,由于例行维护中的人为错误,亚马逊网络服务(AWS)经历了一次重大中断。一名工程师意外输入了错误的命令,导致美国东部-1 区域的多台服务器关闭。这次 4 小时的故障中断了超过 150 项 AWS 服务,根据初步估计,影响了约 54%的互联网流量,并导致受影响企业估计损失了 1.5 亿美元。亚马逊的 AI 助手 Alexa,在全球为超过 4000 万台设备提供服务,在故障期间完全无响应。通常在 200-500 毫秒内处理的语音识别请求完全失败,这证明了基础设施故障对 ML 服务的影响级联效应。这一事件强调了人为错误对基于云的 ML 系统的影响以及强大维护协议和应急机制的重要性 5。

在另一个案例(Vangal 等人 2021)中,Facebook 在其分布式查询基础设施中遇到了静默数据损坏(SDC)6 问题,如图 16.1 所示。SDC 是指在计算或数据传输过程中未检测到的错误,这些错误在系统层中静默传播。Facebook 的系统处理跨数据集的类似 SQL 的查询,并支持一个旨在减少数据存储足迹的压缩应用程序。文件在未使用时进行压缩,在读取请求时解压缩。在解压缩之前进行大小检查,以确保文件有效。然而,偶尔一个意外的故障会返回有效文件的零大小,导致解压缩失败和输出数据库中的缺失条目。问题偶尔出现,有些计算返回正确的文件大小,这使得诊断特别困难。

图片

图 16.1:静默数据损坏:意外的故障可能导致文件大小错误,导致解压缩期间数据丢失,并通过分布式查询系统传播错误,尽管表面上操作成功。这个例子来自 Facebook,强调了未检测到的错误、静默数据损坏以及在大规模数据处理管道中强大错误检测机制的重要性。来源:Facebook

本案例说明了静默数据损坏如何在应用程序堆栈的多个层次中传播,导致大规模分布式系统中的数据丢失和应用故障。如果未得到解决,此类错误可能会降低 ML 系统的性能,尤其是影响训练过程(第八章)。例如,损坏的训练数据或由于 SDC 导致的数据管道中的不一致性可能会损害模型的准确性和可靠性。此类问题的普遍性得到了其他主要公司报告的类似挑战的证实。如图 16.27 所示,杰夫·迪恩,Google DeepMind 和 Google Research 的首席科学家,在MLSys 2024(杰夫·迪恩 2024)的开幕式上强调了 AI 超计算机中的这些问题。

图片

图 16.2:静默数据损坏:现代 AI 系统,尤其是那些使用大规模数据处理如 Spark 的系统,容易受到静默数据损坏(SDC)的影响,这是在数据传输和存储过程中累积的微妙错误。SDC 在洗牌和合并数据库中表现出来,突显了损坏的数据块(红色)在健康数据(蓝色/灰色)之间,并强调了使用此图在分布式系统中检测这些错误的挑战。来源:Jeff Dean 在 MLSys 2024 的开幕式(Google)。

边缘设备漏洞

从集中式云环境迁移到分布式边缘部署,自动驾驶汽车是边缘计算领域中故障如何严重影响 ML 系统的突出例子 8。这些车辆依赖于机器学习进行感知、决策和控制,使它们特别容易受到硬件和软件故障的影响。

图片

图 16.3:自动驾驶感知失败:此事故揭示了依赖机器学习进行自主系统感知的临界安全风险,未能正确分类对象可能导致灾难性后果。这一事件强调了在自动驾驶汽车设计中需要强大的验证、冗余和应急机制,以减轻不完善 AI 模型的影响。来源:BBC 新闻。

2016 年 5 月,一辆在自动驾驶模式下运行的特斯拉 Model S 发生了致命事故 9,与一辆白色半挂卡车相撞。系统依赖计算机视觉和 ML 算法,未能区分卡车与明亮的蓝天,导致高速碰撞。据报道,当时司机分心,没有干预,如图 16.39 所示。这一事件对基于 AI 的感知系统的可靠性提出了严重质疑,并强调了在自动驾驶汽车中需要强大的应急机制。

加强了这些担忧的是,2018 年 3 月发生了一个类似的案例,当时一辆优步自动驾驶测试车辆在亚利桑那州图森市撞击并杀死了一名行人。事故被归因于车辆目标识别软件的缺陷,该软件未能将行人分类为需要避让的障碍物。

嵌入式系统约束

超出边缘计算,扩展到更加受限的环境,嵌入式系统 10 在资源受限且通常安全至关重要的环境中运行。随着人工智能能力越来越多地集成到这些系统中,故障的复杂性和后果显著增加。

一个例子来自太空探索。1999 年,美国宇航局火星极地着陆器任务由于着陆检测系统中的软件错误发生了一次灾难性故障(图 16.4)。着陆器的软件错误地将着陆腿展开时的振动解释为成功的着陆,过早地关闭了引擎,导致坠毁。这一事件证明了严格的软件验证和稳健的系统设计的重要性,尤其是在无法恢复的远程任务中。随着人工智能在太空系统中的重要性日益增加,确保稳健性和可靠性对于任务成功变得至关重要。

图 16.4:着陆检测失败:火星极地着陆器任务期间的错误传感器读数触发了过早的引擎关闭,展示了在难以到达的环境中稳健的故障模式和严格的嵌入式系统验证的迫切需要。这一事件强调了软件错误如何在安全关键应用中导致灾难性后果,并强调了在复杂系统中可靠的人工智能集成日益重要。来源:Slashgear。

嵌入式系统故障的后果不仅限于太空探索,还扩展到商业航空。2015 年,波音 787 梦幻客机在飞行中由于发电机控制单元中的软件错误导致完全断电。这一故障突出了安全关键系统 11 满足严格可靠性要求的重要性。故障源于在连续供电 248 天后(大约 8 个月),同时启动所有四个发电机控制单元,导致它们进入安全模式,关闭了所有交流电。

“如果与发动机安装的发电机相关的四个主要发电机控制单元(GCUs)同时启动,在连续 248 天供电后,所有四个 GCUs 将同时进入安全模式,无论飞行阶段如何,都会导致所有交流电力的丧失。” —— 联邦航空管理局指令(2015)

随着 AI 在航空领域的应用越来越广泛,包括自主飞行控制和预测性维护等任务,嵌入式系统的鲁棒性影响乘客安全。

当我们考虑植入式医疗设备时,风险等级变得更高。例如,一个由于软件或硬件故障而出现故障或意外行为的智能起搏器可能会危及患者的生命。随着 AI 系统在此类应用中承担感知、决策和控制角色,新的脆弱性来源出现,包括数据相关错误、模型不确定性 12 以及在罕见边缘案例中的不可预测行为。某些 AI 模型的透明度不足使得故障诊断和恢复变得复杂。

这些现实世界的故障场景强调了系统化方法对鲁棒性评估和缓解的迫切需求。每一次故障——无论是影响数百万次语音交互的 AWS 中断,自动驾驶汽车感知错误导致致命事故,还是航天器软件错误导致任务损失——都揭示了稳健系统设计的共同模式。

在这些具体示例的基础上,我们现在建立了一个统一的框架,用于系统性地理解和解决鲁棒性挑战。

稳健 AI 的统一框架

虽然上述现实世界的故障原因和背景各不相同,但它们具有共同的特征。无论是检查使语音助手失效的 AWS 中断,自动驾驶汽车的感知故障,还是航天器软件错误,这些事件都揭示了构建稳健 AI 系统的系统化方法。

建立在先前概念之上

在建立我们的鲁棒性框架之前,我们将这些挑战与早期章节中的基础概念联系起来。硬件加速架构(第十一章)阐述了 GPU 内存层次结构、互连布线和专用计算单元如何创建复杂的故障传播路径,这些路径是鲁棒性系统必须解决的。第十五章(ch021.xhtml#sec-security-privacy)中的安全框架介绍了威胁建模原则,这些原则直接影响了我们对对抗攻击和防御策略的理解。第十三章(ch019.xhtml#sec-ml-operations)中的操作监控系统为在生产环境中检测和响应鲁棒性威胁提供了基础设施基础。

这些早期概念在鲁棒的人工智能系统中汇聚,在这些系统中,GPU 内存错误可能会损坏模型权重,对抗性输入会利用学习到的漏洞,并且操作监控必须在硬件、算法和环境维度上检测异常。来自第九章的效率优化在实现可接受的性能预算内的冗余和错误纠正机制时成为关键约束。

从机器学习性能到系统可靠性

为了系统地理解这些故障模式,我们必须弥合早期章节中熟悉的机器学习系统性能概念与确保鲁棒部署的可靠性工程原则之间的差距。在传统的机器学习开发(第二章)中,我们关注模型准确度、推理延迟和吞吐量等指标。然而,现实世界的部署引入了一个额外的维度:执行我们模型的底层计算基质的可靠性。

考虑硬件可靠性如何直接影响机器学习性能:在关键神经网络权重中单个位翻转可以将 ResNet-50 在 ImageNet 上的分类准确率从 76.0%(top-1)降低到 11%,而在训练期间内存子系统故障会破坏梯度更新并阻止模型收敛。现代转换器模型(如具有 175B 参数的 GPT-3)在推理时执行 10¹⁵ 次浮点运算,在单次前向传递中就创造了超过一百万个硬件故障的机会。运行在高达 900 GB/s 带宽(例如,V100 HBM2)的 GPU 内存系统每秒处理 10¹¹ 位,其中每位的基错误率为 10^-17 错误,这意味着每小时会有多个潜在的故障。

硬件可靠性与机器学习性能之间的这种联系要求我们采用可靠性工程 13 的概念,包括描述故障如何发生的故障模型,在它们影响结果之前识别问题的错误检测机制,以及恢复策略以恢复系统操作。这些可靠性概念通过确保优化系统在现实世界条件下继续正确运行,补充了第九章中涵盖的性能优化技术。

建立在概念桥梁的基础上,我们建立了一个统一的框架来理解机器学习系统所有维度的鲁棒性挑战。这个框架为理解不同类型的故障(无论起源于硬件、对抗性输入还是软件缺陷)共享的共同特征,并通过系统方法解决提供了概念基础。

鲁棒人工智能的三大支柱

稳健的 AI 系统必须解决可能损害系统可靠性和性能的三个主要挑战类别。图 16.5 展示了这个三支柱框架,展示了系统级故障、输入级攻击和环境变化如何分别代表对机器学习系统稳健性的不同但相互关联的威胁:

图 16.5:三支柱框架:AI 系统必须解决以确保在实际部署中可靠运行的三种核心稳健性挑战。一个稳健的 AI 系统建立在有效处理这三个挑战领域的基础上。

系统级故障包括所有源自底层计算基础设施的故障。这包括来自宇宙辐射的短暂硬件错误、永久性组件退化以及偶尔出现的间歇性故障。系统级故障影响机器学习计算执行的物理基础,可能破坏计算、内存访问模式或组件间的通信。

输入级攻击包括通过精心设计的输入或训练数据来操纵模型行为的故意尝试。对抗性攻击通过向输入添加难以察觉的扰动来利用模型漏洞,而数据中毒则腐蚀了训练过程本身。这些威胁针对信息处理管道,颠覆了模型学习到的表示和决策边界。

环境变化代表了现实世界条件的自然演变,这些变化可能会随着时间的推移降低模型性能。分布变化、概念漂移和操作环境的变化挑战了模型训练的核心假设。与故意攻击不同,这些变化反映了部署环境的动态性质和静态训练范式的固有局限性。

常见稳健性原则

这三种挑战类别源于不同的来源,但它们共享几个关键特征,这些特征指导我们构建弹性系统的方法:

检测和监控是任何稳健性策略的基础。硬件监控系统通常以 1-10 Hz 的频率采样指标,检测温度异常(相对于基线±5°C)、电压波动(相对于标称值±5%)和每小时每比特超过 10^-12 个错误的内存错误率。对抗性输入检测利用 p 值阈值为 0.01-0.05 的统计测试,实现 85-95%的检测率,误报率低于 2%。使用 MMD 测试的分布监控在每个评估中处理 1,000-10,000 个样本,在 95%的置信区间内检测到 Cohen’s d > 0.3 的变化。

建立在检测能力的基础上,优雅降级确保系统即使在压力下运行也能保持核心功能。鲁棒系统应该表现出可预测的性能下降,以保留关键能力,而不是灾难性的故障。ECC 内存系统以 99.9%的成功率从单比特错误中恢复,同时增加了 12.5%的带宽开销。从 FP32 到 INT8 的模型量化将内存需求减少了 75%,推理时间减少了 2-4×\times,以 1-3%的精度换取在资源受限下的持续运行。集成回退系统在主模型失败时保持 85-90%的峰值性能,切换延迟低于 10 ms。

自适应响应使系统能够根据检测到的威胁或变化条件调整其行为。自适应可能涉及激活错误纠正机制、应用输入预处理技术或动态调整模型参数。关键原则是鲁棒性不是静态的,而是需要持续调整以保持有效性。

这些原则不仅超越了故障恢复,还包括了贯穿机器学习系统设计全过程的全面性能自适应策略。检测策略构成了监控系统的基础,优雅降级在组件失败时指导回退机制,自适应响应使系统能够随着条件的变化而发展。

在机器学习管道中的整合

鲁棒性不能通过应用于单个组件的孤立技术来实现。相反,它需要在整个机器学习管道中系统性地整合,从数据收集到部署和监控。这种整合方法认识到一个组件中的漏洞可能会损害整个系统,无论在其他地方实施了哪些保护措施。

在建立了这个统一的基础之后,我们在后续章节中探讨的检测和缓解策略,无论是针对硬件故障、对抗攻击还是软件错误,都是基于这些共同原则,同时解决每个威胁类别的特定特征。理解这些共享基础能够促进更有效、更高效的构建鲁棒人工智能系统的方法。

以下章节将系统地检查每个支柱,提供理解用于鲁棒性评估和改进的专业工具和框架所需的概念基础。

硬件故障

在建立了我们的统一框架之后,我们现在将详细检查每个支柱,从系统级故障开始。硬件故障代表了鲁棒性挑战的基础层,因为所有机器学习计算最终都是在可能以各种方式失败的物理硬件上执行的。

硬件故障对机器学习系统的影响

要理解为什么硬件可靠性对机器学习工作负载尤其重要,需要考察几个关键因素。机器学习系统与传统应用在几个方面有所不同,这些差异放大了硬件故障的影响:

  • 计算强度:现代机器学习工作负载每秒执行数百万次操作,为故障导致结果损坏提供了许多机会

  • 长时间运行训练:训练作业可能运行数天或数周,增加了遇到硬件故障的概率

  • 参数敏感性:模型权重中的微小错误可能导致输出预测结果发生较大变化

  • 分布式依赖性:大规模训练依赖于多个处理器之间的协调,单点故障可能会破坏整个工作流程

基于这些机器学习特定的考虑因素,硬件故障根据其时间特性和持久性分为三大类,每一类都为机器学习系统的可靠性带来了独特的挑战。

为了说明硬件故障对神经网络的直接影响,考虑权重矩阵中的一个单比特翻转。如果一个 ResNet-50 模型中的关键权重由于影响 IEEE 754 浮点表示中符号位的短暂故障而从0.5翻转至-0.5,它将改变特征图的符号,导致后续层级的错误级联。研究表明,关键层中的一个有针对性的单比特翻转可以将 ImageNet 的准确率从 76%降至不到 10% (Reagen 等人,2018)。这表明硬件可靠性直接影响模型性能,而不仅仅是基础设施的稳定性。与可能导致崩溃或计算错误的单个比特错误的传统软件不同,在神经网络中,它可能会静默地损坏决定系统行为的已学习表示。

瞬时故障是由外部因素(如宇宙射线或电磁干扰)引起的暂时性中断。这些非重复事件,例如内存中的比特翻转,会导致错误的计算,但不会造成永久性的硬件损坏。对于机器学习系统,瞬时故障可能会在训练期间损坏梯度更新或在推理期间改变模型权重,导致暂时但可能显著的性能下降。

永久性故障表示由物理缺陷或组件磨损造成的不可逆损坏,例如卡在故障或需要硬件更换的设备故障。这些故障对于长时间运行的机器学习训练作业尤其有问题,硬件故障可能导致数天或数周的计算丢失,并需要从最近的检查点完全重新启动作业。

由于不稳定条件,如松散的连接或老化组件,间歇性故障会随机出现和消失,这使得它们特别难以诊断和重现。这些故障可能导致机器学习系统中的非确定性行为,导致结果不一致,从而损害模型验证和可重复性。

理解这种故障分类法为设计容错机器学习系统奠定了基础,这些系统能够检测、减轻和从不同操作环境中的硬件故障中恢复。这些故障对机器学习系统的影响超出了传统的计算应用,因为现代人工智能工作负载的计算强度、分布式特性和长时间运行特性。

瞬态故障

我们从最常见的类别开始详细检查,硬件中的瞬态故障可以表现为各种形式,每种形式都有其独特的特性和原因。这些故障本质上是暂时的,不会对硬件组件造成永久性损害。

瞬态故障特性

瞬态故障的特点是持续时间短且非永久性。它们不会持续存在或对硬件留下任何持久的影响。然而,如果处理不当,它们仍然可能导致错误的计算、数据损坏或系统行为异常。一个典型的例子在图 16.6 中展示,其中内存中的一个位意外地改变状态,可能会改变关键数据或计算。

这些表现包括几个不同的类别。常见的瞬态故障类型包括来自宇宙射线和电离辐射的单事件 upset (SEU)14、来自电源不稳定性的电压波动 (Reddi 和 Gupta 2013)、来自外部电磁场的电磁干扰 (EMI)15、来自突然静电电流量静电放电 (ESD)、来自意外信号耦合的串扰 16、来自多个输出同时切换的接地弹跳、来自信号时序约束违规的时序违规,以及组合逻辑中的软错误 (Mukherjee, Emer, 和 Reinhardt, n.d.)。理解这些故障类型能够设计出能够减轻其影响并确保可靠运行的稳健硬件系统。

故障分析和性能影响

现代机器学习系统需要精确理解故障率和它们对性能的影响,以便做出明智的工程决策。瞬态故障的定量分析揭示了重要的模式,这些模式为稳健的系统设计提供了信息。

先进半导体工艺表现出显著更高的软错误率。现代 7 nm 工艺相比 65 nm 节点,软错误率大约高 1000 倍,这是由于节点电容和电荷收集效率降低(Baumann 2005)。对于采用尖端工艺制造的 ML 加速器,这相当于每 10¹⁴ 次操作大约有 1 个错误,需要系统性的错误检测和纠正策略。

这些理论故障率转化为实际可靠性指标,这些指标因部署环境和工作负载特征而显著不同。典型的 AI 加速器在不同部署环境中表现出平均故障间隔时间(MTBF)17 值差异很大:

  • 云 AI 加速器(Tesla V100, A100):在受控数据中心条件下,平均故障间隔时间(MTBF)为 50,000-100,000 小时

  • 边缘 AI 处理器(NVIDIA Jetson, Intel Movidius):在不受控制的环境中,平均故障间隔时间(MTBF)为 20,000-40,000 小时

  • 移动 AI 芯片(Apple Neural Engine, Qualcomm Hexagon):在热和功率限制下,平均故障间隔时间(MTBF)为 30,000-60,000 小时

这些 MTBF 值在分布式训练场景中会显著增加。一个由 1,000 个平均故障间隔时间为 50,000 小时的加速器组成的集群,预计每 50 小时就会发生一次故障,这需要强大的检查点和恢复机制。

除了理解故障率外,系统设计者必须考虑保护成本。硬件容错机制引入了可测量的性能和能耗惩罚,这些必须在系统设计中考虑。 表 16.1 量化了不同保护机制之间的权衡。

表 16.1:容错开销分析:不同保护机制对系统性能、能耗和硬件面积需求的影响。这些开销必须与故障率和恢复成本相平衡,以优化每单位资源的系统可靠性。

保护机制 性能开销 能耗开销 面积开销
单位 ECC 2-5% 3-7% 12-15%
双位 ECC 5-12% 8-15% 25-30%
三模冗余 200-300% 200-300% 200-300%
检查点/重启 10-25% 15-30% 5-10%

这些开销值对内存带宽利用率有特别显著的影响,这是 ML 工作负载中的一个关键限制。ECC 内存 18 由于额外的存储需求(每 64 位数据需要 8 位 ECC),有效带宽降低了 12.5%。错误检测的内存擦除操作消耗额外的 5-15%可用带宽,具体取决于擦除频率和内存配置。

这些带宽开销对性能有直接影响。对于典型的变压器训练工作负载,这些带宽减少直接导致训练时间成比例增加。一个需要 900 GB/s 内存带宽并带有 ECC 保护的模型实际上只能获得 787 GB/s,训练时间延长约 14%。

内存层次结构和带宽影响

内存子系统是现代机器学习系统中最易受攻击的组件,容错机制显著影响带宽利用率和整体系统性能。理解内存层次结构的鲁棒性需要分析不同内存技术、它们的错误特性和保护机制带宽影响之间的相互作用。

这种复杂性源于内存技术的多样性,它们表现出不同的故障模式和保护需求。表 16.2 展示了 ECC 保护如何影响不同技术中的内存带宽:

  • DRAM:每 10¹⁷ 位有 1 个基本错误率,主要由单比特软错误主导。需要基于刷新的错误检测和纠正。

  • HBM(高带宽内存):由于 3D 堆叠效应和热密度,错误率比标准 DRAM 高 10 倍。需要高级 ECC 才能可靠运行。

  • SRAM(缓存):软错误率较低(每 10¹⁹ 位 1 个),但更容易受到电压变化和工艺变化的影响。

  • NVM(非易失性内存):如 3D XPoint 等新兴技术具有独特的错误模式,需要专门的保护方案 19。

  • GDDR:在带宽和可靠性之间进行优化,通常比标准 DRAM 的错误率高 2-3 倍。

内存技术和保护机制的选择直接影响到机器学习工作负载的可用带宽:

表 16.2:内存带宽保护分析:ECC 保护对不同机器学习加速器中使用的不同内存技术有效内存带宽的影响。带宽开销直接影响到内存受限工作负载的训练吞吐量。

内存技术 基本带宽 (GB/s) ECC 开销 (%) 有效 带宽 (GB/s)
DDR4-3200 51.2 12.5% 44.8
HBM2 900 12.5% 787
HBM3 1,600 12.5% 1,400
GDDR6X 760 通常无 760

现代内存系统通过内存擦洗实现连续的背景错误检测,定期读取和重写内存位置以检测和纠正累积的软错误。这种后台活动消耗内存带宽,并会对机器学习工作负载造成干扰:

  • 擦除率:典型的 24 小时全内存扫描消耗 2-5%的总带宽

  • 优先仲裁:ML 内存请求必须与擦除操作竞争,增加 10-15%的延迟变化率

  • 热影响:擦除增加了 3-8%的内存功耗,影响热设计和冷却要求

先进的 ML 系统实施分层保护方案,在内存层次结构中平衡性能和可靠性:

  1. L1/L2 缓存:带立即检测和重放功能的奇偶校验保护

  2. L3 缓存:带错误记录和逐步缓存行退役的单位 ECC

  3. 主存储器:具有高级校验分析和预测故障检测的双位 ECC

  4. 持久存储:具有跨多个设备分布式冗余的里德-所罗门码

现代 AI 加速器将内存保护与计算流水线设计集成,以最小化性能影响:

  • 错误检测流水线:内存 ECC 检查与算术操作重叠,以隐藏保护延迟

  • 自适应保护级别:根据工作负载重要性和错误率监控动态调整保护强度

  • 带宽分配策略:服务质量机制,优先处理关键 ML 内存流量,高于后台保护操作

图 16.6:位翻转错误:瞬态故障可以改变内存中的单个位,损坏数据或程序指令,并可能导致系统故障。这些单比特错误体现了硬件对辐射或电磁干扰等瞬态故障的脆弱性。

瞬态故障起源

外部环境因素是上述瞬态故障类型的最重要来源。如图 16.7 所示,宇宙射线、来自外太空的高能粒子撞击敏感的硬件区域,如存储单元或晶体管,引起电荷扰动,从而改变存储或传输的数据。电磁干扰(EMI)来自附近设备产生的电压尖峰或故障,暂时中断正常操作。静电放电(ESD)事件产生暂时电压激增,影响敏感的电子组件。

图 16.7:瞬态故障机制:宇宙射线和电磁干扰通过改变存储单元和晶体管中的电荷,在硬件中引起位翻转,可能损坏数据并导致系统错误。理解这些故障来源对于构建能够容忍不可预测硬件行为的鲁棒 AI 系统至关重要。来源:NTT。

补充这些外部环境因素,电源和信号完整性问题构成了另一个主要的瞬态故障原因类别,影响硬件系统(第十一章)。由于电源噪声或不稳定导致的电压波动(Reddi 和 Gupta 2013)可能导致逻辑电路在其指定的电压范围之外运行,从而导致错误的计算。由多个输出同时切换触发的地弹跳,会在地参考中产生暂时性的电压变化,这可能会影响信号完整性。由于相邻导体之间无意中的信号耦合引起的串扰,可以产生暂时性破坏数据或控制信号的噪声,影响训练过程(第八章)。

定时和逻辑漏洞为瞬态故障创造了额外的途径。当信号由于工艺变化、温度变化或电压波动而未能满足建立时间或保持时间要求时,就会发生定时违规。这些违规可能导致顺序元素中的数据捕获错误。组合逻辑中的软错误即使在没有内存参与的情况下也会影响电路输出,尤其是在噪声边缘减少的深层逻辑路径中(Mukherjee,Emer 和 Reinhardt,n.d.)。

瞬态故障的传播

建立在这些潜在原因的基础上,瞬态故障可以通过不同的机制表现出来,具体取决于受影响的硬件组件。在像 DRAM 或 SRAM 这样的存储设备中,瞬态故障通常会导致位翻转,即单个位从 0 变为 1 或相反。这可能会破坏存储的数据或指令。在逻辑电路中,瞬态故障可能导致 20 毛刺或通过组合逻辑 21 传播的电压尖峰,从而导致错误的输出或控制信号。在机器学习工作负载中广泛使用的图形处理单元(GPU)22 发生的频率可测 - 大规模集群的研究报告显示,每天有 1-10%的节点受到影响,恢复时间从秒到小时不等,具体取决于分区类型和检测机制。

瞬态故障对机器学习的影响

一个常见的瞬态故障例子是主存储器中的位翻转。如果重要的数据结构或关键指令存储在受影响的内存位置,可能会导致计算错误或程序行为异常。例如,存储循环计数器的内存中的位翻转可能导致循环无限执行或提前终止。控制寄存器或标志位的瞬态故障可能会改变程序执行的流程,导致意外的跳转或错误的分支决策。在通信系统中,瞬态故障可能会损坏传输的数据包,导致重传或数据丢失。

这些一般影响在机器学习系统中尤为明显,瞬态故障在训练阶段可能产生重大影响 (Yi He 等人 2023)。机器学习训练涉及基于大数据集的迭代计算和模型参数的更新。如果存储模型权重或梯度的内存中出现瞬态故障 24,可能会导致更新错误并损害训练过程的收敛性和准确性。例如,神经网络权重矩阵中的位翻转可能导致模型学习到错误的模式或关联,从而降低性能 (Wan 等人 2021)。数据管道中的瞬态故障,如训练样本或标签的损坏,也可能引入噪声并影响学习到的模型质量。

如图 16.8 所示,谷歌生产车队的真实案例突出了 SDC 异常如何导致梯度范数出现显著偏差,这是模型参数更新幅度的度量。这种偏差可能会干扰优化过程,导致收敛速度变慢或无法达到最优解。

图片

图 16.8:梯度范数偏差:瞬态硬件故障,如单数据损坏(SDC),在模型训练期间通过引起梯度范数的突然变化来干扰优化,可能导致收敛问题或不准确的模型。来自谷歌生产车队的真实数据证实,SDC 异常表现为梯度范数随时间出现的可见尖峰,表明预期的参数更新过程受到干扰。来源:jeff dean,mlsys 2024 大会演讲(谷歌)。

在推理阶段,瞬时故障可能会影响机器学习预测的可靠性和可信度。如果在存储训练模型参数的内存或推理结果计算过程中发生瞬时故障,可能会导致预测结果错误或不一致。例如,神经网络激活值中的位翻转可能会改变最终的分类或回归输出(Mahmoud 等人 2020)。在安全关键应用 25 中,这些故障可能产生严重后果,导致错误的决策或行动,可能危害安全或导致系统故障(G. 李等人 2017;S. Jha 等人 2019)。

在资源受限的环境,如 TinyML 中,这些漏洞的影响尤其严重,有限的计算和内存资源加剧了它们的影响。一个突出的例子是二值化神经网络(BNNs)Courbariaux 等人 2016,它使用单比特精度来表示网络权重,以实现计算效率和更快的推理时间。虽然这种二进制表示对资源受限的系统有利,但它也使得 BNNs 特别容易受到位翻转错误的影响。例如,先前的研究(Aygun, Gunes, and De Vleeschouwer 2021)表明,一个用于简单任务如 MNIST 分类的两个隐藏层 BNN 架构,在通过模型权重以 10%的概率插入随机位翻转软错误时,其性能从 98%的测试准确率下降到 70%。为了解决这些漏洞,正在探索诸如翻转感知训练和新兴方法如随机计算26 等技术,以提高容错能力。

永久性故障

从暂时性中断过渡到持续性问题,永久性故障是持续存在并导致受影响组件不可逆损坏的硬件缺陷。这些故障以其持续性质为特征,需要修复或更换有故障的硬件才能恢复正常的系统功能。

永久性故障特性

永久性故障会导致硬件组件持续且不可逆的故障。有故障的组件将保持非工作状态,直到修复或更换。这些故障是一致的且可重复的,意味着每次使用受影响的组件时都会观察到故障行为。它们可能影响处理器、内存模块、存储设备或互连,可能导致系统崩溃、数据损坏或完全的系统故障。

为了说明永久性故障的严重后果,一个显著的例子是 1994 年发现的英特尔 FDIV 错误,这个缺陷影响了某些英特尔奔腾处理器的浮点除法(FDIV)单元,导致特定除法操作的结果不正确,进而导致计算不准确。

FDIV 错误是由于除法单元使用的查找表 27 中的错误引起的。在罕见的情况下,处理器会获取一个错误值,导致结果比预期略不精确。例如,图 16.9 显示了在奔腾处理器上带有 FDIV 错误的 4195835/3145727 分数的绘图。三角形区域突出了错误计算发生的地方。理想情况下,所有正确的值都应该四舍五入到 1.3338,但错误的结果显示为 1.3337,表明第五位数字有错误。

虽然错误很小,但它可能在许多操作中累积,影响精度关键应用的结果,如科学模拟、金融计算和计算机辅助设计。这个错误最终导致这些领域的错误结果,并强调了永久性故障可能带来的严重后果。

图片

图 16.9:FDIV 错误区域:三角形区域表示在计算 4195835/3145727 时,奔腾处理器的有缺陷的除法单元产生了错误结果;理想情况下,所有值都应该四舍五入到 1.3338,但这个错误导致第五位数字有轻微的不准确。来源:byte 杂志。

FDIV 错误是机器学习系统的警示故事。在这些系统中,硬件组件的永久性故障可能导致计算错误,影响模型准确性和可靠性。例如,如果一个机器学习系统依赖于一个带有有缺陷的浮点单元的处理器,类似于 FDIV 错误,它可能在训练或推理过程中引入持续的错误。这些错误可能会通过模型传播,导致预测不准确或学习结果偏差。

这在第十九章中探讨的安全敏感型应用 28 中尤为重要,在这些应用中,计算错误可能带来严重后果。机器学习从业者必须意识到这些风险,并采用容错技术,包括硬件冗余、错误检测和纠正以及鲁棒算法设计,以减轻这些风险。彻底的硬件验证和测试有助于在影响系统性能和可靠性之前识别和解决永久性故障。

永久性故障起源

永久性故障可能源于两个主要来源:制造缺陷和磨损机制。

第一类,制造缺陷,包括在制造过程中引入的缺陷,包括不正确的蚀刻、错误的掺杂或污染。这些缺陷可能导致非功能或部分功能的组件。相比之下,磨损机制随着时间的推移由于长期使用和操作应力而发生。如电迁移 29、氧化物击穿 30 和热应力 31 等现象会降低组件的完整性,最终导致永久性故障。

永久性故障传播

永久性故障通过多种机制表现出来,这取决于其性质和位置。一个常见的例子是固定故障(Seong 等人 2010),其中信号或存储单元永久固定在 0 或 1,无论预期的输入如何,如图 16.10 所示(图 16.10)。此类故障可能发生在逻辑门、存储单元或互连中,通常会导致计算错误或持续的数据损坏。

图 16.10:固定故障模型:数字电路可能会经历永久性故障,其中信号线固定在逻辑 0 或 1,无论输入如何;此图表示固定在 0 的故障的简化表示,其中信号持续处于低电平,可能导致计算错误或系统故障。来源:accendo 可靠性

其他机制包括设备故障,其中硬件组件如晶体管或存储单元由于制造缺陷或随时间退化而完全停止工作。桥接故障,当两个或多个信号线意外连接时发生,可能引入短路或难以隔离的错误逻辑行为。

在更微妙的情况下,当信号的传播时间超过允许的时序约束时,可能会出现延迟故障。逻辑值可能是正确的,但时序预期的违反仍然可能导致错误的行为。同样,互连故障,包括由断开连接引起的开路、阻碍电流流动的高电阻路径以及扭曲信号转换的电容增加,可以显著降低电路性能和可靠性。

存储子系统特别容易受到永久性故障的影响。转换故障可能阻止存储单元成功改变其状态,而耦合故障则源于相邻单元之间的不受欢迎的干扰,导致意外的状态变化。当存储单元的状态被附近存储的数据错误影响时,就会发生邻域模式敏感故障,这反映了电路布局和逻辑行为之间更复杂的相互作用。

永久性故障也可能出现在关键基础设施组件中,如电源网络或时钟分配系统。这些子系统的故障可能会影响整个电路的功能,引入时间错误,或导致广泛的操作不稳定。

总的来说,这些机制说明了永久性故障如何以多种和通常复杂的方式破坏计算系统的行为。对于机器学习应用尤其如此,在这些应用中,正确性和一致性至关重要,理解这些故障模式对于开发弹性硬件和软件解决方案至关重要。

永久性故障对机器学习的影响

永久性故障会严重破坏计算系统的行为和可靠性。例如,处理器算术逻辑单元(ALU)中的卡住故障可能会产生持续的计算错误,导致程序行为错误或崩溃。在内存模块中,此类故障可能会损坏存储的数据,而在存储设备中,它们可能导致坏扇区或数据完全丢失。互连故障可能会干扰数据传输,导致系统挂起或损坏。

对于机器学习系统来说,这些故障在训练和推理阶段都带来了显著的风险。与瞬态故障(第 X.X.X 节)一样,训练过程中的永久性故障会导致类似的梯度计算错误和参数损坏,但会持续到硬件更换,需要更全面的恢复策略(Yi He 等人 2023)。与可能只是暂时中断训练的瞬态故障不同,存储中的永久性故障可能会损害整个训练数据集或保存的模型,影响长期的一致性和可靠性。

在推理阶段,故障可能会扭曲预测结果或导致运行时故障。例如,存储模型权重的硬件中的错误可能会导致使用过时或损坏的模型,而处理器故障可能会导致输出错误 (J. J. Zhang 等人 2018)。

缓解永久性故障需要综合的容错设计,结合硬件冗余和纠错码(J. Kim, Sullivan, 和 Erez 2015)以及软件方法,如检查点和重启机制 32 (Egwutuoha 等人 2013)。

定期监控、测试和维护有助于在发生关键错误之前检测和更换故障组件。

间歇性故障

间歇性故障是系统内偶然且不可预测发生的硬件故障。一个例子如图 16.11 所示,其中材料中的裂纹会在电路中引入增加的电阻。这些故障特别难以检测和诊断,因为它们是间歇性地出现和消失的,这使得重现和隔离根本原因变得困难。根据它们的频率和位置,间歇性故障可能导致系统不稳定、数据损坏和性能下降。

图 16.11:间歇性故障机制:铜凸块与封装焊料之间的裂纹引起的电阻增加是间歇性故障的常见来源,这会干扰信号传输并可能导致不可预测的系统行为。这类微观材料缺陷凸显了硬件对难以在测试期间检测到的潜在故障的脆弱性,但这些故障可能在运行期间显现。来源:constantinescu。

间歇性故障的特性

间歇性故障以其偶然性和非确定性行为为定义。它们不规则地发生,可能持续很短的时间,消失时没有一致的模式。与永久性故障不同,它们并非每次使用受影响的组件时都会出现,这使得它们特别难以检测和重现。这些故障可以影响各种硬件组件,包括处理器、内存模块、存储设备和互连。因此,它们可能导致瞬态错误、不可预测的系统行为或数据损坏。

它们对系统可靠性的影响可能非常显著。例如,处理器控制逻辑中的间歇性故障可能会干扰正常的执行路径,导致程序流程不规则或系统意外挂起。在内存模块中,这类故障可能会不规律地改变存储值,导致难以追踪的错误。受间歇性故障影响的存储设备可能会出现间歇性的读写错误或数据丢失,而通信通道中的间歇性故障可能导致数据损坏、数据包丢失或不稳定的连接。随着时间的推移,这些故障可能会累积,降低系统性能和可靠性 (Rashid, Pattabiraman, and Gopalakrishnan 2015)。

间歇性故障的起源

间歇性故障的原因多种多样,从物理退化到环境影响。一个常见的原因是电子元件的老化和磨损。随着硬件长时间运行、热循环和机械应力,它可能会出现裂纹、断裂或疲劳,从而引入间歇性故障。例如,球栅阵列(BGAs)或倒装芯片封装中的焊点可能会随时间退化,导致间歇性开路或短路。

制造缺陷和工艺变化也可能引入边缘组件,这些组件在大多数情况下表现可靠,但在压力或极端条件下会间歇性失效。例如,图 16.12 展示了一个 DRAM 芯片中由残留物引起的间歇性故障,导致偶发故障。

图 16.12:DRAM 残留故障:DRAM 芯片中的间歇性故障通常源于微观残留物的积累,造成不可靠的电气连接。物理缺陷可以引起偶发错误,突出了通过此图进行容错系统设计和硬件测试的必要性。来源:hynix 半导体

环境因素,如热循环、湿度、机械振动或静电放电,可能会加剧这些弱点并触发本不会出现的故障。松散或退化的物理连接,包括在连接器或印制电路板上发现的连接,也是间歇性故障的常见来源,尤其是在暴露于运动或温度变化中的系统中。

间歇性故障传播

间歇性故障可以通过各种物理和逻辑机制表现出来,具体取决于其根本原因。其中一种机制是间歇性开路或短路,物理不连续性或部分连接导致信号路径行为不可预测。这些故障可能会暂时破坏信号完整性,导致故障或意外的逻辑转换。

另一种常见机制是间歇性延迟故障(张杰等,2018),由于边缘时序条件,信号传播时间波动,导致同步问题和计算错误。在存储单元或寄存器中,间歇性故障可能表现为瞬态位翻转或软错误,以难以检测或重现的方式损坏数据。由于这些故障通常是条件相关的,它们可能仅在特定的热、电压或工作负载条件下出现,从而增加了它们的诊断复杂性。

间歇性故障对机器学习的影响

间歇性故障对机器学习系统构成了重大挑战,因为它破坏了计算一致性和模型可靠性。在训练阶段,处理单元或内存中的此类故障可能导致梯度计算、权重更新或损失值计算中的偶发错误。这些错误可能不是持续的,但可能会在迭代过程中累积,降低收敛性,导致不稳定或次优模型。存储中的间歇性故障可能会损坏输入数据或保存的模型检查点,进一步影响训练流程(何毅等,2023)。

在推理阶段,间歇性故障可能导致不一致或错误的预测。处理错误或内存损坏可能会扭曲激活、输出或模型的中间表示,尤其是在故障影响模型参数或输入数据时。数据管道中的间歇性故障,如不可靠的传感器或存储系统,可能会引入微小的输入错误,降低模型的鲁棒性和输出精度。在自动驾驶或医疗诊断等高风险应用中,这些不一致性可能导致危险的决定或操作失败。

缓解机器学习中间歇性故障的影响需要多层次的方法(Rashid, Pattabiraman, and Gopalakrishnan 2012)。在硬件层面,稳健的设计实践、环境控制和使用更高质量或更可靠的组件可以减少对故障条件的敏感性。冗余和错误检测机制可以帮助识别和从间歇性故障的短暂表现中恢复。

在软件层面,运行时监控、异常检测和自适应控制策略等技术可以提供弹性,与第七章中详细说明的框架能力和第十三章中的部署策略相结合。数据验证检查、异常值检测、模型集成和运行时模型自适应是可集成到机器学习管道中的容错方法,以提高存在间歇性错误时的可靠性。

设计能够优雅地处理间歇性故障的机器学习系统,可以保持其准确性、一致性和可靠性。这涉及到主动故障检测、定期系统监控和持续维护,以确保早期识别和修复问题。通过将弹性嵌入到第十三章中详细说明的架构和操作流程中,机器学习系统即使在容易发生间歇性硬件故障的环境中也能保持稳健。

有效的容错不仅限于检测,还包括在变化系统条件下的自适应性能管理。第十三章中涵盖了全面的资源管理策略,包括故障条件下的负载均衡和动态扩展。对于资源受限的场景,第十章中详细介绍了动态量化和响应于温度或电源限制的选择性剪枝等自适应模型复杂度降低技术,以及第九章中的高效人工智能。

硬件故障检测与缓解

故障检测技术,包括硬件级和软件级方法,以及有效的缓解策略,增强了机器学习系统的弹性。关于鲁棒机器学习系统设计考虑、案例研究和容错机器学习系统的研究,为构建稳健的系统提供了见解。

要实现鲁棒的故障缓解,需要在整个机器学习系统堆栈中进行协调适应。虽然这里的重点是故障检测和基本恢复机制,但通过动态资源管理(第十三章)、容错分布式训练方法(第八章)以及适应资源约束下的性能保持的模型优化技术(第十章,第九章)实现了全面的性能适应策略。这些适应策略确保机器学习系统不仅能够检测和恢复故障,还能通过智能资源分配和模型复杂度调整保持最佳性能。在第二十章中探讨了更鲁棒的架构的未来范式,这些架构旨在解决基本漏洞。

硬件故障检测方法

故障检测技术基于第十二章中的性能测量原则,在机器学习系统中识别和定位硬件故障。这些技术可以广泛地分为硬件级和软件级方法,每种方法都提供独特的功能和优势。

硬件级检测

硬件级故障检测技术是在系统的物理级别实现的,旨在识别底层硬件组件中的故障。存在几种硬件技术,可以归类为以下几组。

内置自检(BIST)机制

BIST 是一种强大的技术,用于检测硬件组件中的故障(Bushnell 和 Agrawal 2002)。它涉及将额外的硬件电路集成到系统中进行自检和故障检测。BIST 可以应用于各种组件,例如处理器、内存模块或专用集成电路(ASIC)。例如,BIST 可以通过使用扫描链 33 在处理器中实现,这些是专门用于测试目的的路径,允许访问内部寄存器和逻辑。

在 BIST 过程中,预定义的测试模式被应用于处理器的内部电路,并将响应与预期值进行比较。任何差异都表明存在故障。例如,英特尔 Xeon 处理器包括 BIST 机制,在系统启动时测试 CPU 核心、缓存内存和其他关键组件。

图片

图 16.13:奇偶校验位错误检测:此图提供了一个简单的错误检测方案,其中额外的一位(奇偶校验位)确保数据序列中 1 的总数要么是偶数,要么是奇数。第二个序列包含一个翻转的位,触发奇偶校验并指示在传输或存储过程中发生的数据损坏事件。来源:电脑希望。

错误检测码

错误检测码广泛用于检测数据存储和传输错误(Hamming 1950)34。这些码向原始数据添加冗余位,允许检测位错误。例如:奇偶校验是图 16.1335 中显示的简单错误检测码的一种形式。在单比特奇偶校验方案中,每个数据字附加一个额外的位,使得字中的 1 的数量为偶数(偶校验)或奇数(奇校验)。

在读取数据时,会检查奇偶校验,如果它与预期值不匹配,则会检测到错误。更高级的错误检测码,如循环冗余校验(CRC)36,根据数据计算校验和并将其附加到消息中。

硬件冗余和投票机制

硬件冗余涉及复制关键组件,并比较它们的输出以检测和屏蔽故障(Sheaffer, Luebke, and Skadron 2007)。投票机制,如双模块冗余(DMR)37 或三模块冗余(TMR)38,使用多个组件实例,并比较它们的输出以识别和屏蔽故障行为(Arifeen, Hassan, and Lee 2020)。

在 DMR 或 TMR 系统中,两个或三个相同的硬件组件实例(如处理器或传感器)并行执行相同的计算。这些实例的输出被送入一个投票电路,该电路比较结果并选择多数值作为最终输出。如果一个实例由于故障产生错误的结果,投票机制将屏蔽错误并保持正确的输出。TMR 在航空航天和航空系统中常用,因为这些系统对高可靠性至关重要。例如,波音 777 飞机在其主飞行计算机系统中采用 TMR,以确保飞行控制功能的可用性和正确性(Yeh, n.d.)。

另一方面,特斯拉的自动驾驶计算机采用 DMR 架构以确保感知、决策和车辆控制等关键功能的安全性和可靠性,如图 16.14 所示。在特斯拉的实现中,两个相同的硬件单元(通常称为“冗余计算机”或“冗余控制单元”)并行执行相同的计算。每个单元独立处理传感器数据,执行算法,并为车辆的执行器(如转向、加速和制动)生成控制命令(Bannon 等人 2019)。

图片

图 16.14:双重模块冗余:特斯拉的全自动驾驶计算机采用 DMR 架构,在两个独立的系统芯片(SoC)上复制关键计算,以减轻硬件故障并确保持续运行。这种冗余使得系统能够掩盖错误:如果一个 SoC 失败,另一个将继续运行,保持安全关键功能如感知和控制。来源:特斯拉

这两个冗余单元的输出会持续进行比较,以检测任何差异或故障。如果输出匹配,系统假定这两个单元都正常工作,并将控制命令发送到车辆的执行器。然而,如果输出之间出现不匹配,系统会识别出其中一个单元可能存在的潜在故障,并采取适当的行动以确保安全运行。

特斯拉自动驾驶计算机中的 DMR 提供额外的安全性和容错层。通过有两个独立单元执行相同的计算,系统可以检测并减轻可能出现在其中一个单元中的故障。这种冗余有助于防止单点故障,并确保即使在硬件故障的情况下,关键功能也能保持运行。

系统可能采用额外的机制来确定哪个单元在不匹配的情况下出现故障。这可能涉及使用诊断算法,将输出与其他传感器或子系统的数据进行比较,或分析输出随时间的一致性。一旦确定了故障单元,系统可以将其隔离,并继续使用非故障单元的输出运行。

特斯拉还采用了除 DMR 之外的冗余机制。例如,他们使用冗余电源、转向和制动系统,以及多样化的传感器套件 39(例如,摄像头、雷达和超声波传感器),以提供多层次的容错能力。

虽然 DMR 提供了故障检测和一定程度的容错能力,但 TMR 可能提供不同级别的故障掩盖。在 DMR 中,如果两个单元同时发生故障或故障影响了比较机制,系统可能无法识别故障。因此,特斯拉的自动驾驶计算机依赖于 DMR 和其他冗余机制的组合来实现高水平的容错能力。

在特斯拉的自动驾驶计算机中使用 DMR 强调了在需要高可靠性的应用中硬件冗余的重要性。通过使用冗余计算单元并比较它们的输出,系统可以检测和减轻故障,从而提高自动驾驶功能的整体安全和可靠性。

另一种硬件冗余的方法是使用热备件 40,正如谷歌在其数据中心中用于解决机器学习训练期间的自动驾驶计算机问题所做的那样。与依赖于并行处理和投票机制来检测和掩盖故障的 DMR 和 TMR 不同,热备件通过维护备份硬件单元来提供容错能力,当检测到故障时,这些单元可以无缝接管计算。如图 16.15 图 16.15 所示,在正常的机器学习训练期间,多个同步训练工作者并行处理数据。然而,如果一个工作者出现故障并导致自动驾驶计算机问题,自动驾驶计算机检查器会自动识别问题。检测到自动驾驶计算机问题后,自动驾驶计算机检查器将训练转移到热备件,并将故障机器送修。这种冗余确保了机器学习训练的连续性和可靠性,有效地最小化了停机时间并保护了数据完整性。

图 16.15:热备冗余:谷歌的数据中心利用热备核心来维持不间断的机器学习训练,即使在硬件故障的情况下也能无缝地将工作负载从故障机器转移到备份资源。这种方法与 DMR/TMR 等并行冗余技术形成对比,它提供了一种反应式容错机制,最小化停机时间并保护机器学习训练期间的数据完整性。来源:杰夫·迪恩,mlsys 2024 大会演讲(谷歌)。

看门狗定时器

看门狗定时器是监控关键任务或进程的硬件组件(Pont 和 Ong 2002)。它们通常用于检测和从导致系统无响应或陷入无限循环的软件或硬件故障中恢复。在嵌入式系统中,看门狗定时器可以配置为监控主控制循环的执行,如图 16.16(ch022.xhtml#fig-watchdog)所示。软件定期重置看门狗定时器以指示其正常工作。假设软件未能在一个指定的时间限制(超时期间)内重置定时器,那么看门狗定时器假定系统遇到了故障,并触发一个预定义的恢复操作,例如重置系统或切换到备用组件。看门狗定时器在汽车电子、工业控制系统和其他安全关键应用中得到广泛应用,以确保及时检测和从故障中恢复。

图 16.16:看门狗定时器操作:嵌入式系统利用看门狗定时器通过定期重置超时计数器来检测和从软件或硬件故障中恢复;如果在规定时间内未能重置,则触发系统重置或恢复操作,确保持续运行。来源:ablic

软件级检测

软件级故障检测技术依赖于软件算法和监控机制来识别系统故障。这些技术可以在软件堆栈的各个级别实现,包括操作系统、中间件或应用层。

运行时监控和异常检测

运行时监控涉及在执行过程中持续观察系统和其组件的行为(Francalanza 等人 2017),扩展了第十三章(ch019.xhtml#sec-ml-operations)中的操作监控实践。它有助于检测异常、错误或可能表明存在故障的意外行为。例如,考虑一个部署在自动驾驶汽车中的基于机器学习的图像分类系统。运行时监控可以实施以跟踪分类模型的性能和行为(Mahmoud 等人 2021)。

异常检测算法可以应用于模型的预测或中间层激活,例如统计异常值检测或基于机器学习的方法(例如,单类 SVM 或自编码器)(Chandola, Banerjee, and Kumar 2009)。图 16.17 展示了异常检测的示例。假设监控系统检测到与预期模式显著偏差的情况,例如分类准确性的突然下降或分布外的样本。在这种情况下,它可以发出警报,表明模型或输入数据管道可能存在潜在故障。这种早期检测允许及时采取干预措施和故障缓解策略。

图片

图 16.17:使用 SVM 进行异常检测:支持向量机通过将日志数据映射到高维空间并定义预期值周围的边界来识别正常系统行为的偏差,从而实现潜在故障的检测。如图所示的无监督异常检测技术,在标记的故障数据稀缺时尤其有价值,允许系统从未标记的操作数据中学习模式。来源:Google

一致性检查和数据验证

一致性检查和数据验证技术确保了在机器学习系统不同处理阶段的数据完整性和正确性(A. Lindholm 等人 2019)。这些检查有助于检测数据损坏、不一致或错误,这些错误可能会传播并影响系统的行为。例如,在一个分布式机器学习系统中,多个节点协作训练模型时,可以实施一致性检查以验证共享模型参数的完整性。每个节点可以在训练迭代前后计算模型参数的校验和或哈希值,如图 16.17 所示。通过比较节点间的校验和,可以检测到任何不一致或数据损坏。范围检查可以应用于输入数据和模型输出,以确保它们在预期的范围内。例如,如果自动驾驶车辆的感觉系统检测到具有不切实际尺寸或速度的对象,这可能表明传感器数据或感知算法存在故障(Wan 等人 2023)。

心跳和超时机制

心跳机制和超时通常用于检测分布式系统中的故障,并确保组件的活性和响应性(Kawazoe Aguilera, Chen, and Toueg 1997)。这些与硬件中发现的看门狗定时器非常相似。例如,在一个分布式机器学习系统中,多个节点协作执行数据预处理、模型训练或推理等任务,可以实现心跳机制来监控每个节点的健康和可用性。每个节点定期向中央协调器或其对等节点发送心跳消息,表明其状态和可用性。假设一个节点在指定的超时时间内未能发送心跳,如图 16.18 所示。在这种情况下,它被认为是故障的,可以采取适当的措施,例如重新分配工作负载或启动故障转移机制。鉴于网络分区每天影响大型分布式训练集群中的 1-10%的节点,这些心跳系统必须区分节点故障和网络连接问题,以避免不必要的故障转移操作,这可能会干扰训练进度。超时还可以用于检测和处理挂起或无响应的组件。例如,如果数据加载过程超过预定义的超时阈值,这可能表明数据管道存在故障,系统可以采取纠正措施。

图 16.18:心跳和超时:分布式系统通过定期发送心跳消息来检测节点故障;在定义的超时时间内没有响应表明存在故障,从而触发纠正措施,如工作负载重新分配或故障转移。这种机制类似于看门狗定时器,即使在组件故障的情况下也能确保系统的健壮性和持续运行。来源:geeksforgeeks.

软件实现的容错(SIFT)技术

SIFT 技术在软件层面引入冗余和故障检测机制,以提高系统的可靠性和容错性(Reis 等人,未发表)。例如:N 版本编程是一种 SIFT 技术,其中多个功能等效的软件组件版本由不同的团队独立开发。这可以应用于关键组件,如机器学习系统中的模型推理引擎。推理引擎的多个版本可以并行执行,并比较它们的输出以检查一致性。如果大多数版本产生相同的输出,则被认为是正确的结果。差异表明一个或多个版本中可能存在潜在故障,从而触发适当的错误处理机制。另一个例子是使用基于软件的错误纠正码,如里德-所罗门码(Plank 1997),来检测和纠正数据存储或传输中的错误,如图 16.19 所示。这些码向数据添加冗余,能够检测和纠正某些错误,并增强系统的容错性。

图片

图 16.19:心跳监控:冗余节点连接和周期性心跳消息检测和隔离分布式系统中的故障组件,确保在硬件故障的情况下继续运行。这些机制通过允许节点识别无响应的节点并相应地重新路由通信,从而实现容错。来源:geeksforgeeks.

硬件故障摘要

表 16.3 提供了瞬态、永久性和间歇性故障的比较分析。它概述了区分这些故障类型的主要特征或维度。在此,我们总结了我们考察的相关维度,并更详细地探讨了区分瞬态、永久性和间歇性故障的细微差别。

虽然硬件故障代表了系统脆弱性的一个维度,但它们很少单独发生。我们考察的物理故障通常与人工智能系统的算法组件相互作用,并暴露出其弱点。当我们考虑对手如何通过精心设计的输入来利用模型漏洞时,这种互联性变得尤为明显——这是我们下一节关于输入级攻击的重点。

表 16.3:故障特性:瞬态故障、永久性故障和间歇性故障在持续时间、持续性和复发性方面有所不同,影响系统可靠性,并需要针对稳健人工智能部署采取不同的缓解策略。理解这些区别有助于设计能够处理操作期间各种硬件故障的容错系统。

维度 瞬态故障 永久性故障 间歇性故障
持续时间 短暂的、暂时的 持久的、直到修复或更换 偶然出现和消失
持续性 故障条件通过后消失 一致存在,直到问题解决 不规则地重复出现,不一定总是存在
原因 外部因素(例如,电磁干扰、宇宙射线) 硬件缺陷、物理损坏、磨损 不稳定的硬件条件、松散的连接、老化组件
表现 比特翻转、故障、暂时性数据损坏 卡在故障、损坏的组件、完全设备故障 偶尔发生比特翻转、间歇性信号问题、偶然故障
对机器学习的影响 引入暂时性错误 导致持续性的错误或 导致偶然和不可预测的错误,
系统 或计算中的噪声 故障,影响可靠性 诊断和缓解都很有挑战性
检测 错误检测码,与预期值比较 内置自检,错误检测码,一致性检查 监测异常,分析错误模式和相关性
缓解措施 错误纠正码、冗余、检查点和重启 硬件维修或更换、组件冗余、故障转移机制 坚固的设计、环境控制、运行时监控、容错技术

故意输入操纵

输入级攻击代表了一种与无意硬件故障不同的威胁模型。与随机比特翻转和组件故障不同,这些攻击涉及对数据进行故意操纵,以损害系统行为。这些复杂的尝试通过精心设计的输入或损坏的训练数据来操纵机器学习模型的行为。这些攻击向量可以放大硬件故障的影响,例如,当对手精心设计输入以触发故障受损硬件的边缘情况时。

对抗性攻击

概念基础

在其核心,对抗性攻击出奇地简单:向输入添加微小的、计算出的变化,以欺骗模型,同时对人来说却不可见。想象一下调整一张猫的照片中的几个像素,变化如此微妙以至于你看不见,但模型突然将其分类为烤面包机,置信度为 99%。这种反直觉的漏洞源于神经网络处理信息的方式与人类不同。

通过类比来理解潜在机制,考虑一个通过主要寻找尖耳朵来识别猫的人。对抗攻击就像向这个人展示一张狗的照片,但仔细地在狗的耷拉耳朵上画上微小、几乎看不见的尖耳朵。因为这个人的算法过度依赖于尖耳朵特征,他们自信地将狗错误地分类为猫。这就是对抗攻击的工作方式:它们找到模型依赖的特定、通常是表面的特征并利用它们,即使这些变化对人类观察者来说没有意义。

ML 模型学习的是统计模式而不是语义理解。它们在高度维度的空间中运行,其中决策边界可能非常脆弱。在这个空间中的微小移动,在输入域中几乎不可察觉,可以跨越这些边界并触发错误分类。

技术机制

对抗攻击利用了机器学习模型对人类几乎不可察觉的小输入扰动的敏感性,但会导致模型输出发生巨大变化。这些攻击揭示了模型学习决策边界和从训练数据泛化的脆弱性。其数学基础依赖于模型的梯度信息来识别最有效的扰动方向。

快速梯度符号法(FGSM)(Goodfellow、Shlens 和 Szegedy 2014b)代表了一种最早且最具影响力的对抗攻击技术。FGSM 通过在损失函数相对于梯度的方向添加小的扰动来生成对抗示例,有效地“推动”输入向错误分类边界移动。对于 ImageNet 分类器,ε = 8/255(几乎不可察觉的扰动)的 FGSM 攻击可以将准确率从 76%降低到 10%以下,展示了深度网络对微小输入修改的脆弱性。

投影梯度下降(PGD)攻击(Madry 等人 2017)通过迭代应用小的扰动并将其投影回允许的扰动空间来扩展 FGSM。具有 40 次迭代和步长α = 2/255 的 PGD 攻击在未受保护的模型上实现了近 100%的攻击成功率,将 CIFAR-10 的准确率从 95%降至 5%以下。这些攻击被认为是最强的一阶对抗者之一,并作为评估防御机制的基准。

物理世界攻击对部署的 AI 系统提出了特别的挑战。研究表明,对抗样本可以被打印、拍照或显示在屏幕上,同时保持其攻击有效性(Kurakin, Goodfellow, 和 Bengio 2016)。当在交通标志上放置物理补丁时,停止标志攻击的误分类率达到 87%,导致自动驾驶车辆分类器将“STOP”标志解释为“限速 45”,可能产生灾难性的后果。实验室研究表明,对抗样本在不同光照条件(2,000-10,000 lux)、观察角度(±30 度)和相机距离(2-15 米)下仍保持有效性。

数据中毒攻击

数据中毒攻击通过向训练数据集中注入恶意样本来针对训练阶段,导致模型学习错误的关联或在对准输入上表现出特定行为。这些攻击在从不受信任的来源或通过众包收集训练数据的情况下尤其令人担忧。

标签翻转攻击通过修改训练样本的标签来引入错误关联。研究表明,在 CIFAR-10 中翻转 3%的标签,将目标类准确率从 92%降低到 11%,而整体模型准确率仅下降 2-4%,这使得检测变得困难。对于 ImageNet,损坏 0.5%的标签(6,500 张图像)可以使特定类别的目标误分类率超过 90%,同时保持 94%的干净准确率。

后门攻击通过在训练样本中注入特定的触发模式,使得模型在测试输入中存在触发器时表现出攻击者控制的行为(T. Gu, Dolan-Gavitt, 和 Garg 2017)。研究表明,在 1%的训练数据中插入后门触发器,对携带触发器的测试输入的攻击成功率可达 99.5%。模型在干净输入上表现正常,但会持续错误地将包含后门触发器的输入分类,通常准确率下降不到 1%。

基于梯度的中毒攻击通过创建看似无害的训练样本,但在训练过程中导致梯度更新将模型推向攻击者的目标(Shafahi 等人 2018)。这些攻击需要精确的优化,但可能具有破坏性:在 CIFAR-10 中中毒 50 个精心制作的图像(占训练数据的 0.1%)可以实现超过 70%的目标误分类率。计算成本很高,需要 15-20 倍更多的训练时间来生成最佳的中毒样本,但攻击仍然无法通过视觉检查检测到。

检测和缓解策略

鲁棒的人工智能系统采用多种防御机制来对抗输入级别的攻击,遵循我们在统一框架中建立的检测、优雅降级和自适应响应原则。

输入净化在对抗性扰动到达模型之前应用预处理技术来移除或减少它们。使用质量因子为 75%的 JPEG 压缩可以中和 60-80%的对抗样本,同时仅降低 1-2%的干净数据精度。使用高斯滤波器(σ = 0.5)进行图像去噪可以阻止 45%的 FGSM 攻击,但需要仔细调整以避免降低合法输入。几何变换,如随机旋转(±15°)和缩放(0.9-1.1×\times),在最小化干净数据精度损失的同时提供 30-50%的防御效果。

对抗性训练(Madry 等人 2017)将对抗样本纳入训练过程,教导模型在存在对抗性扰动的情况下保持正确的预测。在 CIFAR-10 上进行的 PGD 对抗性训练对于 ε = 8/255 的攻击实现了 87%的鲁棒精度,而未防御的模型为 0%,尽管干净精度从 95%下降到 84%。由于每个 epoch 期间生成对抗样本,训练时间增加了 6-10×\times,需要专门的硬件加速来实现实际应用。

认证防御在指定的扰动范围内为模型鲁棒性提供数学保证(J. Cohen、Rosenfeld 和 Kolter 2019)。随机平滑在 ImageNet 上对于 ℓ2 扰动(σ = 0.5)实现了 67%的认证精度,相比之下,干净数据的精度为 76%。对于 54%的测试输入,认证半径增加到 ε = 1.0,提供了可证明的鲁棒性保证。然而,由于蒙特卡洛抽样的需求(通常每个预测 1,000 个样本),推理时间增加了 100-1000×\times

集成方法利用多个模型或检测机制来识别和过滤对抗性输入(Tramèr 等人 2017)。5 个独立训练的模型集使用预测熵阈值(τ = 1.5)实现了 94%的对抗样本检测率,在干净数据上的误报率低于 2%。计算开销与集成规模线性相关,对于 5 模型集成,需要5×5\times的推理时间和内存,使得实时部署变得具有挑战性。

虽然输入级攻击代表了有意破坏模型行为的尝试,但 AI 系统还必须应对其操作环境中可能同样具有破坏性的自然变化。这些环境挑战自然地源于现实世界部署的演变性质。

环境变化

强健 AI 的第三个支柱解决了现实世界条件随时间自然演变的问题,这些问题可能会降低模型性能。与输入级攻击的有意操纵或硬件故障的随机故障不同,环境变化反映了在动态环境中部署静态模型的固有挑战,其中数据分布、用户行为和操作环境持续演变。这些变化可以与其他漏洞类型协同作用。例如,经历分布偏移的模型更容易受到对抗攻击,而硬件错误在改变的环境条件下可能表现出不同的形式。

分布偏移和概念漂移

直观理解

考虑一个基于现代医院 X 光图像训练的医疗诊断模型。当该模型部署在设备较旧的乡村诊所时,其准确性大幅下降,并非因为潜在的医学状况发生了变化,而是因为图像特征不同。这体现了分布偏移:模型遇到的世界与它学习到的世界不同。

随着环境的演变,分布偏移自然发生。用户偏好会随季节变化,语言会随着新俚语的产生而演变,经济模式会随着市场条件的变化而变化。与需要恶意意图的对抗攻击不同,这些变化自然地源于现实世界系统的动态性质。

技术类别

协变量偏移发生在输入分布发生变化,而输入和输出之间的关系保持恒定时(Quiñonero-Candela 等人 2008)。在白天图像(亮度为 1,000-100,000 勒克斯)上训练的自动驾驶车辆感知模型在夜间条件下(0.1-10 勒克斯)部署时,准确性会下降 15-30%,尽管物体识别任务没有变化。天气条件引入了额外的协变量偏移:与晴朗条件相比,雨会使物体检测 mAP 降低 12%,雪降低 18%,雾降低 25%。

概念漂移代表了输入和输出之间基本关系随时间的变化(Widmer 和 Kubat 1996)。信用卡欺诈检测系统会经历概念漂移,6 个月的关联衰减率为 0.2-0.4,需要每 90-120 天重新训练模型,以保持 85%以上的精度。电子商务推荐系统在 3-6 个月内由于季节性偏好变化和用户行为模式的演变,准确性会下降 15-20%。

标签偏移会影响输出类别的分布,而不改变输入输出关系(Lipton, Wang, and Smola 2018)。COVID-19 导致医学影像中的标签偏移发生巨大变化:某些医院系统中肺炎的发病率从 12%增加到 35%,需要重新校准诊断阈值。农业监测中的季节性标签偏移显示作物疾病发病率在生长季节之间变化 40-60%,需要适应性的决策边界以进行准确的产量预测。

监控和适应策略

对环境变化的有效响应需要持续监控部署条件,并具有适应机制,以保持模型性能随条件变化。

统计距离度量通过测量训练数据和部署数据分布之间的差异来量化分布变化的程度。使用径向基函数核(γ = 1.0)的最大均值差异(MMD)对于 Cohen’s d > 0.5 的偏移提供了 0.85 的检测灵敏度,在现代硬件上处理 10,000 个样本只需 150 ms。Kolmogorov-Smirnov 测试对于具有 1,000+样本的单变量偏移达到 95%的检测率,但扩展到高维数据时表现不佳。人口稳定性指数(PSI)阈值为 0.1-0.25 表明存在需要模型调查的显著偏移。

在线学习使模型能够持续适应新数据,同时保持对先前学习模式的性能(Shalev-Shwartz 2011)。学习率η = 0.001-0.01 的随机梯度下降在 100-500 个样本内实现概念漂移适应的收敛。通常需要 2-5 MB 的内存开销来维持足够的历史上下文,而计算增加了 15-25%的推理延迟以实现实时适应。像弹性权重巩固(Elastic Weight Consolidation)这样的技术通过正则化系数λ = 400-40,000 防止灾难性遗忘。

模型集成和选择维护多个针对不同环境条件专门化的模型,根据检测到的环境特征动态选择最合适的模型(Ross, Gordon, and Bagnell 2011)。具有 3-7 个模型的集成系统在分布偏移下比单个模型提高了 8-15%的准确性,每次预测的选择开销为 2-5 ms。基于最近性能的动态加权(滑动窗口为 500-2,000 个样本)提供了对渐进漂移的最佳适应。

联邦学习能够在保持隐私的同时,实现跨多个部署环境的分布式自适应。拥有 50-1,000 个参与者的 FL 系统在 10-50 轮通信中实现收敛,每轮通信需要 10-100 MB 的参数传输,具体取决于模型大小。本地训练通常每轮需要 5-20 个 epoch,当带宽低于 1 Mbps 时,通信成本占主导地位。差分隐私(ε = 1.0-8.0)添加噪声,但大多数应用中模型效用保持在 90%以上。

鲁棒性评估工具

在考察了鲁棒人工智能的三个支柱——硬件故障、输入级攻击和环境变化后,学生们现在有了理解专门用于鲁棒性评估和改进的工具和框架的概念基础。这些工具在所有三个威胁类别中实现了检测、优雅降级和自适应响应原则。

类似于 PyTorchFI 和 TensorFI 的硬件故障注入工具能够系统地测试机器学习模型对之前描述的短暂、永久和间歇性故障的恢复能力。对抗攻击库实现了 FGSM、PGD 和认证防御技术,用于评估输入级鲁棒性。分布监控框架提供了环境变化管理所必需的统计距离指标和漂移检测能力。

现代鲁棒性工具可以直接集成到流行的机器学习框架(PyTorch、TensorFlow、Keras)中,使得将鲁棒性评估无缝融入第十三章中建立的开发工作流程成为可能。这些工具及其实际应用的全面审查出现在第 16.10 节中,为构建鲁棒人工智能系统提供了详细的实施指南。

输入级攻击与模型鲁棒性

虽然硬件故障代表了底层计算基础设施的无意中断,但模型鲁棒性的担忧扩展到针对人工智能系统决策过程和操作环境中的自然变化的故意攻击。从硬件可靠性到模型鲁棒性的转变反映了从保护计算物理基础到防御定义模型行为的学到的表示和决策边界的转变。

这种转变需要改变视角。硬件故障通常表现为损坏的计算、内存错误或通信故障,这些故障以由底层计算图指导的、可预测的方式在系统中传播。相比之下,模型鲁棒性挑战利用或揭示了模型对其问题域理解的核心局限性。对抗攻击设计输入以触发错误分类,数据中毒会破坏训练过程本身,而分布偏移揭示了模型在超出其训练假设的情况下部署时的脆弱性。

根据我们从第 16.3 节提出的三个类别鲁棒性框架,不同的挑战类型需要互补的防御策略。虽然硬件故障缓解通常依赖于冗余、错误检测码和优雅降级,但模型鲁棒性需要像对抗训练、输入净化、领域适应以及持续监控模型在部署中的行为等技术。

当我们考虑到现实世界的 AI 系统面临复合威胁时,这种双重视角的重要性变得清晰,这些威胁中硬件故障和模型脆弱性可以以复杂的方式相互作用。一个损坏模型权重的硬件故障可能会创建新的对抗性脆弱性,而对抗攻击可能会触发类似于硬件故障的错误条件。我们从第 16.3 节提供的统一框架为系统地解决这些相互关联的挑战提供了概念基础。

对抗攻击

对抗攻击代表了现代机器学习系统中反直觉的脆弱性。这些攻击利用了神经网络学习和表示信息的核心特征,揭示了模型对精心设计的、对人类观察者而言难以察觉的修改的极端敏感性。这些攻击通常涉及向输入数据添加小的、精心设计的扰动,这可能导致模型错误分类,如图图 16.20 所示。

图片

图 16.20: 对抗扰动: 微妙且故意设计的噪声可能导致神经网络以高置信度错误分类图像,暴露了模型鲁棒性的脆弱性。这些对人类而言难以察觉的扰动以最大化预测错误的方式改变输入,突显了对抗攻击防御的必要性。来源:Sutanto (2019)。

理解脆弱性

理解为什么这些攻击如此有效需要检查它们如何揭示了神经网络架构中的核心局限性。对抗样本的存在揭示了人类和机器感知之间的核心不匹配 41。

这种脆弱性源于神经网络学习的一些特性 42。高维输入空间 43 提供了攻击者可以同时利用的多个维度。

对为什么存在对抗样本的深入理解对于开发有效的防御措施至关重要。这种脆弱性反映了神经网络在高维空间中表示和处理信息的基本属性,而不仅仅是软件漏洞或训练伪象。解释为什么神经网络 44 天生容易受到对抗性扰动的理论基础在第三章中得到了全面详细的阐述。

攻击类别和机制

根据攻击者构建扰动的方法和攻击者可用的信息,对抗攻击可以被组织成几个类别。每个类别利用模型脆弱性的不同方面,并需要不同的防御考虑。

基于梯度的攻击

最直接且研究最广泛的类别包括基于梯度的攻击,这些攻击利用了神经网络训练的核心方面:用于训练模型的相同梯度信息可以被武器化来攻击它们。这些攻击通过利用模型自身的学习机制来对抗自身,代表了生成对抗样本的最直接方法。

概念基础

基于梯度攻击背后的关键洞察是,神经网络通过计算梯度来理解其输入的变化如何影响其输出。在训练过程中,梯度引导权重更新以最小化预测误差。对于攻击,这些相同的梯度揭示了哪些输入修改会最大化预测误差——本质上是在反向运行训练过程。

为了说明这个概念,可以考虑一个图像分类模型,该模型能够正确识别照片中的猫。相对于输入图像的梯度显示了模型预测对每个像素变化的敏感性。攻击者可以使用这些梯度信息来确定最有效地修改特定像素以改变模型预测的方法,可能使模型将猫误分类为狗,同时使变化对人类观察者不可察觉。

快速梯度符号法 (FGSM)

快速梯度符号法 45 展示了基于梯度的攻击 46 的优雅和危险。FGSM 采用了概念上简单的方法,即朝着最快增加模型预测误差的方向移动。

基本的数学公式捕捉了这个直观的过程:

xadv=x+ϵsign(xJ(θ,x,y)) x_{\text{adv}} = x + \epsilon \cdot \text{sign}\big(\nabla_x J(\theta, x, y)\big)

其中各部分代表:

  • xx: 原始输入(例如,一只猫的图像)

  • xadvx_{\text{adv}}: 将欺骗模型的对抗性示例

  • xJ(θ,x,y)\nabla_x J(\theta, x, y): 显示输入变化对预测误差影响最大的梯度

  • sign()\text{sign}(\cdot): 仅提取变化方向,忽略大小差异

  • ϵ\epsilon: 控制扰动强度(对于归一化输入通常为 0.01-0.3)

  • J(θ,x,y)J(\theta, x, y): 测量预测误差的损失函数

梯度xJ(θ,x,y)\nabla_x J(\theta, x, y)量化了损失函数相对于每个输入特征的改变,表明哪些输入修改能够最有效地增加模型的预测误差。函数sign()\text{sign}(\cdot)提取了最陡上升的方向,而扰动幅度ϵ\epsilon控制了应用于每个输入维度的修改强度。

这种方法通过在增加损失最快的方向上迈出一步来生成对抗样本,如图 16.21 所示。图 16.21。

图片

图 16.21:对抗扰动:基于梯度的攻击生成细微、有意设计的输入噪声(幅度由ϵ\epsilon控制),以最大化损失函数j(θ,x,y)j(\theta, x, y)并导致模型误分类。这些对人类来说难以察觉的扰动通过将输入xx移动到决策边界来利用模型漏洞。来源:ivezic

在此基础上,投影梯度下降(Projected Gradient Descent,PGD)攻击(Kurakin, Goodfellow, and Bengio 2016)通过迭代应用梯度更新步骤扩展了 FGSM,允许生成更精细和强大的对抗样本。PGD 将每个扰动步骤投影回原始输入周围的约束范数球内,确保对抗样本保持在指定的扭曲限制内。这使得 PGD 成为一种更强的白盒攻击,并成为评估模型鲁棒性的基准。

基于雅可比的显著性图攻击 (JSMA) (Papernot, McDaniel, Jha, et al. 2016) 是另一种基于梯度的方法,它识别最有影响力的输入特征,并通过扰动它们来创建对抗样本。通过构建基于模型输出相对于输入的雅可比的显著性图,JSMA 选择性地改变最有可能影响目标类的一小部分输入维度。这使得 JSMA 比 FGSM 或 PGD 更精确和有针对性,通常需要更少的扰动来欺骗模型。

基于梯度的攻击在白盒设置 47 中特别有效,攻击者可以访问模型的架构和梯度。它们的效率和相对简单性使它们成为研究攻击和评估模型鲁棒性的流行工具。

基于优化的攻击

虽然基于梯度的方法提供了速度和简单性,但基于优化的攻击将对抗样本的生成形式化为一个更复杂的优化问题。Carlini 和 Wagner (C&W) 攻击 (Carlini and Wagner 2017)48 是这一类别中的突出例子。它找到最小的扰动,可以在保持与原始输入的感知相似性的同时导致误分类。C&W 攻击采用迭代优化过程来最小化扰动,同时最大化模型的预测误差。它使用一个包含置信度项的定制损失函数来生成更自信的误分类。

C&W 攻击特别难以检测,因为扰动通常对人类来说是不可察觉的,并且它们经常绕过许多现有的防御措施。攻击可以在各种范数约束下进行公式化(例如,L2,L∞),具体取决于对抗扰动的期望特性。

在此优化框架的基础上,弹性网络攻击到深度神经网络 (EAD) 结合弹性网络正则化(L1 和 L2 惩罚的组合)来生成具有稀疏扰动的对抗样本。这可能导致输入的最小和局部变化,这些变化更难识别和过滤。EAD 在需要限制扰动的大小和空间范围的情况下特别有用。

这些攻击比基于梯度的方法计算量更大,但可以更精细地控制对抗样本的特性,通常需要详细说明在第十章中的专用优化技术。它们通常用于高风险领域,在这些领域中,隐蔽性和精确性至关重要。

基于迁移的攻击

从直接优化转向利用模型相似性,基于迁移的攻击利用了对抗性示例的可迁移性属性 49。可迁移性指的是为某个机器学习模型制作的对抗性示例往往可以欺骗其他模型,即使它们具有不同的架构或是在不同的数据集上训练。这使得攻击者可以使用代理模型生成对抗性示例,然后将它们转移到目标模型,而无需直接访问其参数或梯度。

这种可迁移性属性是黑盒攻击可行性的基础,在这种攻击中,攻击者无法查询梯度,但可以通过对公开可用或类似的替代模型进行攻击来欺骗模型。基于迁移的攻击在攻击商业机器学习 API 等实际威胁场景中尤其相关,攻击者可以观察到输入和输出,但不能观察到内部计算。

攻击的成功往往取决于模型之间的相似性、训练数据的一致性以及所使用的正则化技术。可以使用输入多样性(随机调整大小、裁剪)和优化过程中的动量等技术来增加可迁移性。

物理世界攻击

物理世界攻击将对抗性示例带入现实场景。这些攻击涉及创建物理对象或操作,当通过传感器或摄像头捕捉时,可以欺骗机器学习模型。例如,对抗性补丁是精心设计的小型图案,可以放置在物体上以欺骗目标检测或分类模型。这些补丁被设计成能够在不同的光照条件、观察角度和距离下工作,使它们在现实世界环境中具有鲁棒性。

当这些补丁附着在现实世界的物体上,例如停车标志或一件衣物上时,它们可能会导致模型误分类或无法准确检测到这些物体。值得注意的是,这些攻击的有效性即使在打印出来并通过相机镜头观察后仍然存在,这跨越了对抗性机器学习中的数字和物理界限。

对抗性物体,如 3D 打印雕塑或修改过的路标,也可以被制作出来以欺骗物理环境中的机器学习系统。例如,一个 3D 海龟物体被证明在从不同角度观察时,始终被图像分类器错误地分类为步枪。这些攻击突显了在物理空间中部署的 AI 系统(如自动驾驶汽车、无人机和监控系统)所面临的风险,并在第十七章中涵盖了关于负责任 AI 部署的临界考虑。

物理世界攻击的研究还包括开发通用对抗性扰动,这些扰动可以欺骗广泛范围的输入和模型。这些威胁在 AI 系统的安全性、鲁棒性和泛化方面提出了严重的问题。

摘要

表 16.4 提供了对不同类别对抗性攻击的简要概述,包括基于梯度的攻击(FGSM、PGD、JSMA)、基于优化的攻击(C&W、EAD)、基于迁移的攻击和物理世界攻击(对抗性补丁和对象)。每种攻击都简要描述,突出其关键特性和机制。

对抗性攻击的机制揭示了机器学习模型决策边界、输入数据和攻击者目标之间的复杂相互作用。通过精心操作输入数据,攻击者可以利用模型的对敏感性和盲点,导致错误预测。对抗性攻击的成功突出了对机器学习模型鲁棒性和泛化特性的更深入理解的需求。

表 16.4:对抗性攻击类别:机器学习模型的鲁棒性依赖于防御有意扰动输入数据以导致误分类的攻击;此表根据其潜在机制对这些攻击进行分类,包括基于梯度、基于优化、基于迁移和物理世界方法,每种方法都利用不同的模型漏洞。理解这些类别对于开发有效的防御策略和评估模型安全性至关重要。

攻击类别 攻击名称 描述
基于梯度 快速梯度符号法(FGSM) 投影梯度下降(PGD)基于雅可比的显著性图攻击(JSMA) 通过在梯度方向添加小噪声来扰动输入数据,以最大化预测错误。通过迭代应用梯度更新步骤扩展 FGSM,以生成更精细的对抗性示例。识别有影响力的输入特征并对其进行扰动以创建对抗性示例。
基于优化 卡林尼和瓦格纳(C&W)攻击 弹性网络攻击到深度神经网络(EAD) 寻找最小的扰动,导致误分类同时保持感知相似性。通过弹性网络正则化生成具有稀疏扰动的对抗性示例。
基于迁移 基于迁移性的攻击 利用对抗性示例在不同模型之间的可迁移性,实现黑盒攻击。
物理世界 对抗性补丁 对抗性对象 在对象上放置的小型、精心设计的补丁,以欺骗对象检测或分类模型。物理对象(例如,3D 打印雕塑、修改后的路标)在现实场景中精心制作,以欺骗机器学习系统。

防御对抗性攻击需要详细在第 16.8.4.1.2 节中描述的多方面防御策略,包括对抗性训练、防御蒸馏、输入预处理和集成方法。

随着对抗机器学习的不断发展,研究人员探索新的攻击机制并开发更复杂的防御措施。攻击者和防御者之间的军备竞赛推动了在对抗威胁下保护机器学习系统的不懈创新和警惕。理解攻击机制对于开发能够抵御不断发展的对抗样本的稳健和可靠的机器学习模型至关重要。

对机器学习的影响

对机器学习系统的影响远远超出了简单的误分类,如图 16.22 所示。这些漏洞在部署领域造成了系统性风险。

图片

图 16.22:对抗扰动:添加到图像中的微妙、有意设计的噪声可以使训练好的深度神经网络(googlenet)将其误分类,尽管被扰动的图像在视觉上对人类来说仍然无法区分。这种漏洞凸显了许多机器学习模型缺乏稳健性,并促使研究人员对对抗训练和防御机制进行研究。来源:goodfellow 等人,2014。

2017 年,研究人员展示了一个对抗攻击影响的显著例子。他们通过在停车标志上实验性地贴上小黑白色贴纸(Eykholt 等人 2017)。对于人类眼睛来说,这些贴纸并没有遮挡标志或阻止其可解释性。然而,当修改后的停车标志图像被输入到标准的交通标志分类机器学习模型中时,出现了一个令人震惊的结果。模型有超过 85%的时间将停车标志错误地分类为限速标志。

这个演示揭示了简单的对抗贴纸欺骗机器学习系统误读关键道路标志的令人担忧的潜力。此类攻击在现实世界中的影响是重大的,尤其是在自动驾驶汽车的情况下。如果实际部署在道路上,这些对抗贴纸可能导致自动驾驶汽车将停车标志误认为是限速标志,从而引发危险情况,如图 16.23 所示。研究人员警告说,这可能导致滚动停车或意外加速进入交叉口,危及公共安全。

微软的 Tay 聊天机器人提供了一个鲜明的例子,说明了对抗用户如何利用部署的 AI 系统中的稳健性安全防护不足。在发布后的 24 小时内,协调一致的用户操纵 Tay 的学习机制,生成不适当和冒犯性的内容。该系统缺乏内容过滤、用户输入验证和行为监控安全防护,这些安全防护本可以检测并阻止利用。这一事件突显了在部署的 AI 系统中,特别是那些从用户交互中学习的系统中,进行综合输入验证、内容过滤系统和持续行为监控的迫切需要。

图片

图 16.23:对抗性扰动:对输入数据进行微妙的、物理上可实现的变化可以导致机器学习模型做出错误的预测,即使对人类来说不可察觉。这个例子展示了小型贴纸如何导致交通标志分类器错误地将它识别为超过 85% 准确率的 45 英里/小时限速标志,突显了机器学习系统对对抗性攻击的脆弱性。来源:eykholt

这个演示说明了对抗性示例如何利用机器学习模式识别中的基本漏洞。攻击的简单性——对人类不可见的小输入修改导致预测发生巨大变化——揭示了深层次的架构限制,而不是表面上的错误。

除了性能下降之外,对抗性漏洞还创造了连锁的系统风险。在医疗保健领域,对医学影像的攻击可能导致误诊 (M.-J. Tsai, Lin, and Lee 2023)。金融系统面临交易算法被操纵导致经济损失的风险。这些漏洞通过暴露对表面模式而非稳健概念理解的依赖,从根本上破坏了模型的可靠性 (Fursov 等人 2021)。

防御对抗性攻击通常需要额外的计算资源,并可能影响整体系统性能。像对抗性训练这样的技术,即通过在对抗性示例上训练模型来提高鲁棒性,可以显著增加训练时间和计算需求 (T. Bai 等人 2021)。运行时检测和缓解机制,如输入预处理 (Addepalli 等人 2020) 或预测一致性检查,会引入延迟并影响机器学习系统的实时性能。

对抗性漏洞的存在也使得机器学习系统的部署和维护变得复杂。系统设计者和操作者必须考虑对抗性攻击的可能性,并纳入适当的防御和监控机制。定期更新和重新训练模型成为必要的,以适应新的对抗性技术,并保持系统安全性和性能。

这些漏洞突显了需要审查第 16.8.4 节中提到的全面防御策略的紧迫性 (Section 16.8.4)。

数据中毒

数据中毒对机器学习系统的完整性和可靠性构成了重大挑战。通过将精心设计的恶意数据引入训练流程,攻击者可以以难以通过标准验证程序检测到的方式微妙地操纵模型行为。

与对抗性攻击的关键区别在于它们的时机和目标。虽然对抗性攻击发生在模型训练后(向测试输入添加噪声),但数据中毒发生在训练前(污染训练数据本身)。这种差异类似于在考试中愚弄一个已经训练好的学生,与在学生学习时提供错误信息一样。两者都可能造成错误答案,但它们在不同的阶段利用了不同的漏洞:

  • 对抗性攻击针对部署的模型,影响推理,并且可以通过监控输出进行检测

  • 数据中毒针对训练数据,影响学习,并且由于模型诚实地学习了错误的模式,因此更难检测

与针对推理时模型的对抗性示例不同,中毒攻击利用系统的上游组件,如数据收集、标记或摄取。随着机器学习系统越来越多地部署在自动化和高风险环境中,了解中毒如何发生以及它如何通过系统传播对于开发有效的防御措施至关重要。

数据中毒特性

数据中毒 50 是一种攻击,其中训练数据被故意操纵以损害机器学习模型的性能或行为,如(Biggio, Nelson, 和 Laskov 2012)所述,并在图 16.24 中展示。攻击者可能修改现有的训练样本,引入恶意示例,或干扰数据收集管道。结果是模型学习到有偏见、不准确或可利用的模式。

图片

图 16.24:数据中毒示例:图像与文本不匹配的成对表示一种常见的数据中毒攻击,其中被操纵的训练数据导致模型错误分类输入。这些对抗性示例可能损害模型完整性,并在实际应用中引入漏洞。来源:(Shan 等人 2023)。

在大多数情况下,数据中毒分为三个阶段展开。在注入阶段,攻击者将中毒样本引入训练数据集。这些样本可能是现有数据的修改版本,或者是为了与干净示例混合而设计的全新实例。虽然它们表面上看似无害,但这些输入被设计成以微妙但故意的方影响模型行为。攻击者可能针对特定类别,插入恶意触发器,或者制造旨在扭曲决策边界的异常值。

在训练阶段,机器学习模型结合了中毒数据,并学习到虚假或误导性的模式。这些学习到的关联可能会使模型偏向于错误的分类,引入漏洞或嵌入后门。由于中毒数据通常与干净数据在统计上相似,因此在标准的模型训练和评估过程中,这种破坏过程通常不会被察觉。

最后,在部署阶段,攻击者利用受损的模型进行恶意目的。这可能包括触发特定的行为,包括对包含隐藏模式的输入进行错误分类,或者简单地利用模型在生产中的降低准确性。在现实世界的系统中,这种攻击可能很难追溯到训练数据,特别是如果系统的行为只在边缘情况或对抗条件下显得异常。

这种操纵的后果在高风险领域(如医疗保健)尤为严重,在这些领域,即使是训练数据的小幅中断也可能导致危险的误诊或对基于 AI 系统的信任丧失 (Marulli, Marrone, and Verde 2022)。

文献中已经确定了四种主要的中毒攻击类型 (Oprea, Singhal, and Vassilev 2022)。在可用性攻击中,大量训练数据被中毒,目的是降低整体模型性能。一个典型的例子是在二元分类任务中,系统地改变具有真实标签 y=1y = 1 的实例,将其改为 y=0y = 0。这些攻击使模型在广泛的输入上变得不可靠,实际上使其无法使用。

与之相反,针对性中毒攻击旨在仅损害特定类别或实例。在这里,攻击者仅修改足够的数据,以使一小部分输入被错误分类,而整体准确率保持相对稳定。这种微妙之处使得针对性攻击特别难以检测。

后门中毒 51 在训练数据中引入隐藏触发器,这些触发器是模型学习与特定输出关联的微妙模式或特征。当触发器在推理时出现,模型会被操纵产生预定的响应。即使触发器模式对人类观察者不可见,这些攻击通常也相当有效。

子群体中毒攻击专注于破坏数据集的一个特定子集。虽然与针对性攻击有相似的意图,但子群体中毒攻击将可用性风格的降级应用于局部化群体,例如特定的群体或特征簇,同时保持模型其余性能完好。这种区别使得此类攻击既非常有效,又特别危险,尤其是在对公平性敏感的应用中。

这些中毒策略的共同点是它们的微妙。被操纵的样本通常与干净数据无法区分,这使得它们难以通过随意检查或标准数据验证来识别。这些操纵可能涉及对数值的小幅修改、轻微的标签不一致性或嵌入的视觉模式,每个都旨在融入数据分布,同时仍然影响模型行为。

这种攻击可能由内部行为者执行,如具有特权访问权限的数据工程师或标注员,或由利用数据收集管道薄弱点的外部对手执行。在众包环境或公开数据收集场景中,中毒可能简单到向共享数据集中注入恶意样本或影响用户生成的内容。

关键的是,中毒攻击通常针对机器学习管道的早期阶段,如收集和预处理,在这些阶段可能存在有限的监督。如果数据来自未经验证的来源或缺乏强大的验证协议,攻击者可以悄悄地插入看似统计上正常的受毒数据。缺乏完整性检查、稳健的异常检测或血缘跟踪只会加剧风险。

这些攻击的目标是破坏学习过程本身。在受毒数据上训练的模型可能会学习到虚假的相关性,过度拟合到虚假信号,或对高度特定的利用条件变得脆弱。无论是导致模型退化还是隐藏的利用路径,系统的可信度和安全性都受到了严重损害。

数据中毒攻击方法

数据中毒可以通过各种机制实现,这取决于攻击者对系统的访问权限和对数据管道的理解。这些机制反映了不同的策略,用于如何破坏训练数据以实现恶意结果。

最直接的方法之一是修改训练数据的标签。在这种方法中,攻击者选择训练样本的一个子集并更改它们的标签,将y=1y = 1翻转成y=0y = 0或在多类设置中重新分配类别。如图图 16.25 所示,即使是小规模的标签不一致也可能导致显著的分布变化和学习中断。

图片

图 16.25:数据中毒影响:对训练数据标签的微妙扰动可以引起显著的分布变化,导致机器学习系统中的模型不准确和性能受损。这些变化展示了即使是有限的对抗训练数据控制也能破坏模型学习,并突显了数据驱动方法易受恶意操纵的脆弱性。来源:(Shan 等人 2023)。

另一种机制涉及在不改变标签的情况下修改训练示例的输入特征。这可能包括图像中不可察觉的像素级变化、结构化数据中的微妙扰动,或者嵌入作为后门攻击触发器的固定模式。这些修改通常使用优化技术设计,以最大化其对模型的影响同时最小化可检测性。

更复杂的攻击会生成全新的恶意训练示例。这些合成样本可能使用对抗方法、生成模型,甚至数据合成工具创建。目标是精心设计输入,当它们被纳入训练集时,将扭曲模型的决策边界。这种输入可能看起来自然和合法,但却是为了引入漏洞而设计的。

其他攻击者专注于数据收集和预处理中的弱点。如果训练数据来源于网络爬取、社交媒体或不可信的用户提交,则可以在上游引入中毒样本。这些样本可能通过不充分的清理或验证检查,以“可信”的形式到达模型。这在人类审查有限或缺失的自动化管道中尤其危险。

在物理部署的系统中,攻击者可能操纵数据源——例如,改变传感器捕获的环境。自动驾驶汽车可能会遇到中毒数据,如果道路标志上的视觉标记被微妙地改变,导致模型在训练过程中错误分类它。这种环境中毒模糊了对抗攻击和数据中毒之间的界限,但涉及损害训练数据的机制是相同的。

在线学习系统代表了另一种独特的攻击面。这些系统持续适应新的数据流,因此特别容易受到渐进式中毒的影响。攻击者可能逐步引入恶意样本,导致模型行为缓慢但稳定地改变。这种攻击形式在图 16.26 中得到了说明。

图片

图 16.26:数据中毒攻击:对抗性操纵训练数据引入了细微的扰动,损害了模型的完整性;渐进式中毒逐渐改变模型行为,使得在线学习系统中的检测变得困难。这种攻击面与对抗样本不同,因为它在训练期间而不是在推理期间针对模型。

内部合作增加了另一层复杂性。拥有合法访问训练数据的恶意行为者,包括标注者、研究人员或数据供应商,可以制定比外部攻击更具有针对性和隐蔽性的中毒策略。这些内部人员可能了解模型架构或训练过程,这使他们设计有效的中毒方案时具有优势。

防御这些多样化的机制需要多管齐下的方法:安全的数据收集协议、异常检测、健壮的预处理管道和强大的访问控制。验证机制必须足够复杂,不仅能够检测异常值,还能够检测巧妙伪装的中毒样本,这些样本位于统计规范之内。

数据中毒对机器学习的影响

数据中毒的影响远不止简单的准确率下降。在最一般的意义上,一个中毒的数据集会导致模型被破坏。但具体的后果取决于攻击向量以及攻击者的目标。

一个常见的后果是整体模型性能的下降。当训练集的大部分数据被中毒,通常是通过标签翻转或引入噪声特征,模型难以识别有效模式,导致准确率、召回率或精度的降低。在医疗诊断或欺诈检测等关键任务应用中,即使是微小的性能损失也可能导致重大的现实世界损害。

针对性中毒呈现了一种不同的危险。这些攻击不是破坏模型的总体性能,而是导致特定的错误分类。例如,一个恶意软件检测器可能被设计成忽略一个特定的签名,允许单个攻击绕过安全措施。同样,一个面部识别模型可能被操纵来错误识别特定个体,而对其他人则正常工作。

一些中毒攻击以后门或特洛伊木马的形式引入隐藏漏洞。这些中毒模型在评估期间表现正常,但在遇到特定触发器时会以恶意方式响应。在这种情况下,攻击者可以按需“激活”漏洞,绕过系统保护而不触发警报。

偏见是数据中毒的另一个隐蔽影响。如果攻击者中毒与特定人口或特征组相关的样本,他们可以通过有偏见或歧视的方式扭曲模型的输出。这种攻击威胁到公平性,放大了现有的社会不平等,如果整体模型指标仍然很高,则难以诊断。

最终,数据中毒损害了系统的可信度。在中毒数据上训练的模型不能被认为是可靠的,即使它在基准评估中表现良好。这种信任的侵蚀具有深远的影响,尤其是在自主系统、金融建模和公共政策等领域。

案例研究:通过中毒进行艺术保护

有趣的是,并非所有数据中毒都是恶意的。研究人员已经开始探索将其用作防御工具,特别是在保护创意作品免受生成 AI 模型未经授权使用的情况下。

一个令人信服的例子是 Nightshade,由芝加哥大学的研究人员开发,以帮助艺术家防止他们的作品被抓取并用于未经同意的训练图像生成模型(Shan 等人 2023)。Nightshade 允许艺术家在将图像发布到网上之前对其应用微小的扰动。这些变化对人类观众来说是不可见的,但会对将它们纳入训练的生成模型造成严重的退化。

当 Stable Diffusion 仅在 300 个中毒图像上训练时,模型开始产生奇异的结果,例如在提示“汽车”时产生牛,或者在提示“狗”时产生类似猫的生物。这些结果如图图 16.27 所示,展示了中毒样本如何有效地扭曲模型的概念关联。

图 16.27:中毒攻击:一个逐步的过程,在在线学习期间逐渐引入恶意样本以改变模型行为。通过这种方式,可以操纵连续数据流而不会立即被发现。来源:(Shan 等人 2023)。

夜幕降临特别有效的原因是中毒概念的级联效应。因为生成模型依赖于类别之间的语义关系,一个中毒的“汽车”可以渗透到相关的概念,如“卡车”、“公交车”或“火车”,导致广泛的幻觉。

然而,像任何强大的工具一样,Nightshade 也带来了风险。用于保护艺术内容的相同技术可能被重新用于破坏合法的训练流程,突显了现代机器学习安全核心的二元使用困境 52。

分布偏移

分布偏移代表了在部署的机器学习系统中最普遍和最具挑战性的鲁棒性问题之一。与对抗攻击或数据中毒不同,分布偏移通常在环境演变过程中自然发生,这使得它们成为系统可靠性的核心关注点。本节将探讨不同类型分布偏移的特征、它们发生的机制、对机器学习系统的影响,以及检测和缓解的实际方法。

分布偏移属性

分布偏移指的是机器学习模型在部署过程中遇到的数据分布与其训练时所用的分布不同,挑战了通过第八章中的训练方法以及第四章中的架构设计选择建立的一般化能力,如图 16.28 所示。这种分布的变化不一定是恶意攻击的结果。相反,它通常反映了现实世界环境随时间的自然演变。本质上,数据在训练和推理阶段之间的统计属性、模式或假设可能会发生变化,这可能导致模型性能出现意外或下降。

图片

图 16.28:分布偏移:训练数据和部署数据之间(由虚假特征 z 的不同分布表示)的小不一致性可能会严重破坏模型性能,即使没有改变真实的标签 y。此图强调了数据中毒攻击如何利用分布差异来诱导模型错误,并强调了机器学习系统对微妙数据操作的脆弱性。来源:(Shan 等人 2023)。

分布偏移通常采取以下几种形式:

  • 协变量偏移,其中输入分布 P(x)P(x) 发生变化,而条件标签分布 P(yx)P(y \mid x) 保持稳定。

  • 标签偏移,其中标签分布 P(y)P(y) 发生变化,而 P(xy)P(x \mid y) 保持不变。

  • 概念漂移,其中输入和输出之间的关系,P(yx)P(y \mid x),随着时间的推移而演变。

这些形式化的定义有助于构建更直观的例子,这些例子在实践中经常遇到。

最常见的原因之一是领域不匹配,即模型在训练数据域之外的数据上部署。例如,在电影评论上训练的情感分析模型,当应用于推文时可能会表现不佳,因为语言、语气和结构存在差异。在这种情况下,模型已经学习了特定领域的特征,这些特征在新的上下文中泛化不良。

另一个主要来源是时间漂移,其中输入分布随着时间的推移逐渐或突然演变。在生产环境中,数据因新趋势、季节性效应或用户行为的变化而变化。例如,在欺诈检测系统中,欺诈模式可能会随着对手的适应而演变。如果没有持续的监控或重新训练,模型就会过时,变得无效。这种变化形式在图 16.29 中得到了可视化。

当部署环境由于外部因素(如光照、传感器变化或用户行为)与训练条件不同时,会出现上下文变化。例如,在受控光照条件下在实验室训练的视觉模型,在户外或动态环境中部署时可能会表现不佳。

另一个微妙但关键的因素是不具代表性的训练数据。如果训练数据集未能捕捉到生产环境的全部可变性,模型可能泛化不良。例如,主要在某一人口群体上训练的面部识别模型,在更广泛的应用中可能会产生有偏见或不准确的预测。在这种情况下,这种变化反映了训练数据中缺失的多样性和结构。

图片

图 16.29:时间漂移:随着时间的推移,数据分布的变化会降低模型性能,除非系统通过持续监控和重新训练来适应。概念漂移表现为输入模式的变化——例如演变的欺诈方案或季节性趋势——这要求模型学习新的关系并在动态环境中保持准确性。

这种类型的分布偏移会显著降低生产中机器学习模型的性能和可靠性。构建稳健的系统不仅需要理解这些偏移,还需要积极检测和应对它们的出现。

特斯拉的自动驾驶系统展示了在现实世界部署中分布偏移如何挑战甚至复杂的机器学习系统。主要在高速公路驾驶数据上训练的视觉系统在施工区域、不寻常的道路配置和与训练场景显著不同的各种天气条件下表现下降。系统在训练数据中不太充分表示的边缘案例,如施工障碍物、不寻常的车道标记和临时交通模式上遇到了困难。这突出了收集多样化训练数据和稳健处理分布偏移的关键重要性,尤其是在边缘案例可能产生严重后果的安全关键应用中。

分布偏移机制

分布偏移源于各种潜在机制——既有自然的也有系统驱动的。理解这些机制有助于从业者检测、诊断并设计缓解策略。

一种常见的机制是数据源的变化。当推理时收集的数据来自与训练数据不同的传感器、API、平台或硬件时,即使是细微的分辨率、格式或噪声差异也可能引入重大的偏移。例如,在一个麦克风类型上训练的语音识别模型可能会在来自不同设备的数据上遇到困难。

时间演变指的是随时间变化的基础数据的变化。在推荐系统中,用户偏好会发生变化。在金融领域,市场状况会改变。这些变化可能是缓慢且连续的,也可能是突然且破坏性的。如果没有时间意识或持续评估,模型可能会变得过时,而且通常没有先前的迹象。为了说明这一点,图 16.30 展示了经过多代选择性育种后,狗的品种的物理特征发生了显著变化。该品种的早期版本表现出苗条、健壮的体型,而现代版本则更加粗壮,头部形状和肌肉结构有显著的不同。这种转变类似于现实世界系统中数据分布的变化——用于训练模型的初始数据可能与随时间遇到的数据有显著差异。正如进化压力塑造生物特征一样,动态用户行为、市场力量或环境变化可以改变机器学习应用中的数据分布。如果没有定期的重新训练或适应,暴露于这些演变分布的模型可能会表现不佳或变得不可靠。

图片

图 16.30:物种进化:经过多代的选育,表型特征发生显著变化,这反映了机器学习系统中数据分布随时间的变化。这些时间上的变化需要模型重新训练或适应以保持性能,因为初始训练数据可能不再准确代表当前的输入分布。

当一个模型在一个设置上训练后应用于另一个设置时,会出现领域特定的变化。一个在一家医院数据上训练的医疗诊断模型可能在另一家医院表现不佳,这可能是由于设备、人口统计或临床工作流程的差异。这些变化通常需要显式的适应策略,如领域泛化或微调。

当训练数据没有准确反映目标人群时,就会发生选择偏差。这可能是由于抽样策略、数据访问限制或标注选择造成的。结果是模型过度拟合到特定部分,无法泛化。解决这个问题需要深思熟虑的数据收集和持续验证。

反馈循环是一种特别微妙的机制。在某些系统中,模型预测会影响用户行为,反过来又影响未来的输入。例如,一个动态定价模型可能会设定改变购买模式的价格,这进而扭曲未来训练数据的分布。这些循环可以加强狭窄的模式,使模型行为难以预测。

最后,对抗性操作可以故意诱导分布偏移。攻击者可能会引入分布外的样本或构建利用模型决策边界弱点的输入。这些输入可能远离训练分布,并可能导致意外或不安全的预测。

这些机制通常相互作用,使得现实世界的分布偏移检测和缓解变得复杂。从系统角度来看,这种复杂性需要持续的监控、日志记录和反馈管道——这些功能通常在早期或静态机器学习部署中缺失。

分布偏移对机器学习的影响

分布偏移可以影响机器学习系统性能的几乎每个维度,从预测准确性和延迟到用户信任和系统可维护性。

常见且直接的结果是预测性能下降。当推理时的数据与训练数据不同时,模型可能会产生系统性的不准确或不一致的预测。这种准确性的侵蚀在高风险应用中尤其危险,如欺诈检测、自动驾驶或临床决策支持。

另一个严重的影响是可靠性和可信度的丧失。随着分布的变化,用户可能会注意到不一致或异常的行为。例如,推荐系统可能会开始建议不相关或冒犯性的内容。即使整体准确率指标仍然可以接受,用户信任的丧失可能会损害系统的价值。

分布偏移也放大了模型偏差。如果某些群体或数据片段在训练数据中代表性不足,模型在这些群体上可能会频繁失败。在偏移条件下,这些失败可能会变得更加明显,导致歧视性结果或公平性违规。

在特定医院的数据上训练的机器学习模型,在部署到不同机构时通常表现出性能下降,这说明了医疗保健中经典的分布偏移问题。在具有特定患者群体、设备类型和临床方案的学术医疗中心训练的模型,未能推广到具有不同人口统计、成像设备和临床工作流程的社区医院。例如,基于一家医院 CT 扫描仪数据的诊断模型,在应用于不同扫描仪制造商或成像协议的图像时,准确性会降低。这表明,数据收集程序和设备看似微小的差异可以造成重大的分布偏移,从而影响模型性能和潜在的患者安全。

不确定性和运营风险也增加。在许多生产环境中,模型决策直接进入业务运营或自动化操作。在偏移情况下,这些决策变得不那么可预测,更难验证,增加了级联故障或不良决策的风险。

从系统维护的角度来看,分布偏移使重新培训和部署工作流程复杂化。如果没有强大的漂移检测和性能监控机制,偏移可能会在性能显著下降之前不被察觉。一旦检测到,可能需要进行重新培训,这会引发与数据收集、标注、模型回滚和验证相关的问题。这会在持续集成和部署(CI/CD)工作流程中产生摩擦,并可能显著减缓迭代周期。

分布偏移也增加了对抗攻击的脆弱性。攻击者可以利用模型在未知数据上的不良校准,通过轻微扰动将输入推离训练分布并导致故障。当系统反馈循环或自动化决策流程存在时,这一点尤其令人担忧。

从系统角度来看,分布偏移不仅是一个建模问题,它是一个核心的运营挑战。它需要端到端系统支持:数据记录、漂移检测、自动警报、模型版本控制和计划重新培训的机制。机器学习系统必须设计成能够在生产中检测到性能下降,诊断分布偏移是否是原因,并触发适当的缓解措施。这可能包括人工审查、回退策略、模型重新培训流程或分阶段部署推出。

在成熟的机器学习系统中,处理分布偏移已成为基础设施、可观察性和自动化的一个问题,而不仅仅是建模技术。未能考虑这一点,在动态、现实世界的环境中可能导致模型无声失败——这正是机器学习系统预期提供最大价值的地方。

常见分布偏移类型、其对模型性能的影响以及潜在的系统级响应的总结显示在表 16.5 中。

表 16.5:分布偏移类型:现实世界的机器学习系统会遇到各种形式的分布偏移,包括协变量、概念和先验偏移,这些偏移通过改变输入和输出之间的关系或不同结果的出现频率来降低性能。理解这些偏移并实施系统级缓解措施——如监控、自适应学习和鲁棒训练——对于在动态环境中保持可靠性能至关重要。

偏移类型 原因或示例 对模型的影响 系统级响应
协变量偏移 输入特征的变化(例如,传感器校准漂移) 尽管标签一致,模型仍会错误分类新的输入 监控输入分布;使用更新特征重新训练
标签偏移 标签分布的变化(例如,使用中新类别的频率) 预测概率变得倾斜 跟踪标签先验;重新加权或调整输出校准
概念漂移 输入和输出之间关系的发展(例如,欺诈策略) 模型性能随时间下降 频繁重新训练;使用持续或在线学习
领域不匹配 在评论上训练,在推文中部署 由于不同的词汇或风格导致泛化能力差 使用领域自适应或微调
上下文变化 新的部署环境(例如,照明,用户行为) 性能随上下文变化 收集上下文数据;监控条件准确性
选择偏差 训练过程中的代表性不足 对未见过的群体进行有偏预测 验证数据集平衡;增加训练数据
反馈循环 模型输出影响未来输入(例如,推荐系统) 强化漂移,不可预测的模式 监控反馈效果;考虑反事实日志记录
对抗偏移 攻击者引入 OOD 输入或扰动 模型变得容易受到针对性故障的影响 使用鲁棒训练;检测分布外的输入

分布偏移的系统影响

输入攻击检测和防御

在对模型脆弱性的理论理解的基础上,我们现在考察实际的防御策略。

对抗攻击防御

在确立了对抗攻击的机制和影响之后,我们考察了它们的检测和防御。

检测技术

检测对抗样本是抵御对抗攻击的第一道防线。已经提出了几种技术来识别和标记可能为对抗性的可疑输入。

统计方法代表了一种通过分析输入数据的分布特性来检测对抗样本的方法。这些方法将输入数据分布与参考分布进行比较,例如训练数据分布或已知的良性分布。像柯尔莫哥洛夫-斯米尔诺夫测试 (伯格和周 2014) 或 安德森-达尔林测试 这样的技术可以测量分布之间的差异,并标记出与预期分布显著偏离的输入。

除了分布分析之外,输入变换方法提供了一种替代的检测策略。特征压缩 54 (Panda, Chakraborty, and Roy 2019) 通过降维或离散化来降低输入空间复杂性,消除了对抗样本通常依赖的微小、难以察觉的扰动。

模型不确定性估计通过量化预测的置信度提供了另一种检测范式。由于对抗样本通常利用模型决策边界中的高不确定性区域,因此具有较高不确定性的输入可以被标记为可疑。存在几种不确定性估计方法,每种方法在准确性和计算成本之间都有不同的权衡。

贝叶斯神经网络 55 通过将模型权重视为概率分布,通过近似推理方法捕捉了随机性(数据固有)和认知性(模型)不确定性,提供了最原则性的不确定性估计。集成方法(在第 16.8.4.1.2 节中进一步详细说明)通过结合多个独立训练模型的预测来实现不确定性估计,使用预测方差作为不确定性度量。虽然这两种方法都提供了鲁棒的不确定性量化,但它们都带来了显著的计算开销。

Dropout56,最初作为防止训练过程中过拟合的正则化技术而设计(G. E. Hinton 等人 2012),通过在每次训练迭代中随机停用一部分神经元来实现,迫使网络避免过度依赖特定神经元,从而提高泛化能力。这种机制可以通过推理时的蒙特卡洛 dropout 重新用于不确定性估计,其中多个带有不同 dropout 掩码的前向传递近似不确定性分布。然而,这种方法提供的不确定性估计不够精确,因为 dropout 并非专门设计用于不确定性量化,而是通过强制冗余来防止过拟合。结合 dropout 与轻量级集成方法或贝叶斯近似混合的方法可以在计算效率和估计质量之间取得平衡,使基于不确定性的检测在实际部署中更加实用。

防御策略

一旦检测到对抗性示例,可以采用各种防御策略来减轻其影响并提高机器学习模型的鲁棒性。

对抗性训练是一种技术,它涉及通过添加对抗性示例来增强训练数据,并在增强的数据集上重新训练模型。在训练期间将模型暴露于对抗性示例教会它正确分类它们,并使其对对抗性攻击更加鲁棒。列表 16.1 展示了核心实现模式。

对抗性训练提供了改进的鲁棒性,但伴随着显著的计算开销,必须在生产系统中谨慎管理。

由于在每次训练步骤中生成对抗性示例,训练时间会增加 3-10×\times。即时生成对抗性示例需要通过模型进行额外的正向和反向传递,这大大增加了计算需求。存储干净和对抗性示例以及攻击生成期间计算的梯度,内存需求增加 2-3×\times。在生成迭代攻击(如 PGD)时,可能需要专门的硬件来高效地生成对抗性示例,尤其是当需要多个优化步骤时。

鲁棒模型通常牺牲 2-8%的干净准确率以换取改进的对抗鲁棒性,这代表了鲁棒优化目标中的一个基本权衡。如果将集成方法或不确定性估计技术集成到对抗性训练中,推理时间可能会增加。模型大小通常随着增强鲁棒性的架构修改而增加,例如更宽的网络或额外的归一化层,这些修改可以改善梯度稳定性。

当平衡鲁棒性和性能目标时,超参数调整变得显著更加复杂。验证程序必须使用多种攻击方法评估干净和对抗性性能,以确保全面的鲁棒性评估。部署基础设施必须支持对抗性训练的额外计算需求,包括用于梯度计算的 GPU 内存和存储对抗性示例缓存的存储空间。

列表 16.1:对抗性训练实现:使用 FGSM 在训练期间生成对抗性示例的实用对抗性训练,通过混合干净和扰动数据来提高模型对基于梯度的攻击的鲁棒性。

def adversarial_training_step(model, data, labels, epsilon=0.1):
    # Generate adversarial examples using FGSM
    data.requires_grad_(True)
    outputs = model(data)
    loss = F.cross_entropy(outputs, labels)

    model.zero_grad()
    loss.backward()

    # Create adversarial perturbation and mix with clean data
    adv_data = data + epsilon * data.grad.sign()
    adv_data = torch.clamp(adv_data, 0, 1)

    mixed_data = torch.cat([data, adv_data])
    mixed_labels = torch.cat([labels, labels])

    return F.cross_entropy(model(mixed_data), mixed_labels)

列表 16.1 中的实现通过计算输入数据的梯度(第 2190 行),应用符号函数以提取扰动方向(第 2196 行),并将生成的对抗性示例与干净的训练数据混合(第 2199-2200 行)来在训练过程中即时生成对抗性示例。torch.clamp()操作确保像素值保持有效,而最终的连接将干净和对抗性示例结合在一起,有效地将批处理大小加倍。这种方法需要仔细调整扰动预算 ϵ\epsilon,通常比标准训练(Shafahi 等人 2019)增加 2-3×\times的训练时间。

第十三章(ch019.xhtml#sec-ml-operations)详细介绍了生产部署模式、MLOps 管道集成和鲁棒机器学习系统的监控策略,而分布式鲁棒性协调和大规模容错则在第八章(ch014.xhtml#sec-ai-training)中分布式训练的上下文中得到解决。

防御蒸馏(Papernot, McDaniel, Wu, 等人 2016)是一种技术,它训练第二个模型(学生模型)来模仿原始模型(教师模型)的行为。学生模型在教师模型产生的软标签上进行训练,这些标签对小的扰动不太敏感。使用学生模型进行推理可以减少对抗性扰动的 影响,因为学生模型学会了更好地泛化,并且对对抗性噪声不太敏感。

输入预处理和转换技术试图在将输入馈送到机器学习模型之前消除或减轻对抗性扰动的影响。这些技术包括图像去噪、JPEG 压缩、随机调整大小、填充,或对输入数据应用随机转换。通过减少对抗性扰动的影响,这些预处理步骤可以帮助提高模型对对抗性攻击的鲁棒性。

集成方法通过结合多个模型来做出更鲁棒的预测。集成可以通过使用具有不同架构、训练数据或超参数的多样化模型集来减少对抗性攻击的影响。欺骗一个模型的对抗性示例可能不会欺骗集成中的其他模型,从而产生更可靠和鲁棒的预测。通过为集成中的每个模型使用不同的预处理技术或特征表示等模型多样化技术,可以进一步增强鲁棒性。

评估和测试

进行彻底的评估和测试,以评估对抗性防御技术的有效性并衡量机器学习模型的鲁棒性。

对抗性鲁棒性指标量化了模型对对抗性攻击的韧性。这些指标可以包括模型在对抗性示例上的准确度、欺骗模型所需的平均扭曲量,或模型在不同攻击强度下的性能。通过比较不同模型或防御技术之间的这些指标,实践者可以评估和比较它们的鲁棒性水平。

标准化的对抗性攻击基准和数据集为评估和比较机器学习模型的鲁棒性提供了一个共同基础。这些基准包括包含预生成对抗性示例的数据集和用于生成对抗性攻击的工具和框架。流行的对抗性攻击基准示例包括MNIST-CCIFAR-10-C和 ImageNet-C (Hendrycks and Dietterich 2019)数据集,它们包含原始数据集的损坏或扰动版本。

实践者可以通过利用本节中概述的检测技术和防御策略来开发更鲁棒的系统。对抗性鲁棒性仍然是一个需要多层方法的研究领域,这些方法结合了多种防御机制,并定期针对不断发展的威胁进行测试。

数据投毒防御

数据投毒攻击旨在破坏用于构建机器学习模型的训练数据,针对第六章中详细说明的数据收集和预处理阶段,破坏其完整性。如图图 16.31 所示,这些攻击可以通过操纵或污染训练数据的方式,导致模型学习到错误的模式,当部署时产生错误的预测或不良行为。鉴于训练数据在机器学习系统性能中的基础作用,检测和减轻数据投毒对于保持模型的可信度和可靠性至关重要。

图片

图 16.31:数据中毒攻击:攻击者将恶意数据注入训练集以操纵模型行为,可能导致部署期间的误分类或性能下降。这种攻击强调了机器学习系统对数据完整性的脆弱性以及需要强大的数据验证技术。来源:li

异常检测技术

统计异常检测方法识别出与大多数数据显著偏离的数据点。这些方法假设中毒数据实例很可能是统计异常。可以使用诸如Z 分数方法Tukey 的方法马氏距离等技术来衡量每个数据点与数据集中心趋势的偏差。超过预定义阈值的数据点被标记为潜在的异常值,并被认为是数据中毒的可疑候选。

基于聚类的技术根据数据点的特征或属性将相似的数据点分组在一起。假设中毒数据实例可能形成独特的聚类或远离正常数据聚类。通过应用诸如K-meansDBSCAN层次聚类等聚类算法,可以识别出异常聚类或不属于任何聚类的数据点。然后,将这些异常实例视为可能中毒的数据。

自编码器 57 是一种经过训练的神经网络,用于从压缩表示中重建输入数据,如图 16.32 所示。它们可以通过学习数据中的正常模式并识别偏离这些模式的实例来用于异常检测。在训练期间,自编码器在干净、未中毒的数据上训练。在推理时间,计算每个数据点的重建误差。具有高重建误差的数据点被认为是异常的,并且可能是中毒的,因为它们不符合学习到的正常模式。

图片

图 16.32:自动编码器架构:自动编码器通过最小化重建误差来学习压缩数据表示,通过识别具有高重建损失输入来启用异常检测。在正常数据上的训练过程中,网络学习有效的编码和解码,使其对潜在的攻击偏差指示敏感。来源:dertat

清洗和预处理

通过清洗数据可以避免数据中毒,这涉及识别和删除或纠正噪声、不完整或不一致的数据点。可以应用数据去重、缺失值插补和异常值移除等技术来提高训练数据的质量。通过消除或过滤掉可疑或异常的数据点,可以减少中毒实例的影响。

数据验证涉及验证训练数据的完整性和一致性。这可以包括检查数据类型的一致性、范围验证以及跨字段依赖性。通过定义和执行数据验证规则,可以识别并标记出指示数据中毒的异常或不一致的数据点,以便进行进一步调查。

数据溯源和血缘追踪涉及在整个机器学习管道中维护数据的来源、转换和移动记录。通过记录数据来源、预处理步骤以及对数据进行任何修改,从业者可以将异常或可疑模式追溯到其起源。这有助于识别潜在的数据中毒点,并促进调查和缓解过程。

鲁棒训练

可以使用鲁棒优化技术来修改训练目标,以最小化异常值或中毒实例的影响。这可以通过使用对极端值不太敏感的鲁棒损失函数来实现,例如 Huber 损失或修改后的 Huber 损失 58。正则化技术 59,如L1 或 L2 正则化,也可以通过限制模型的复杂性和防止过拟合来帮助减少模型对中毒数据的敏感性。

鲁棒损失函数旨在对异常值或噪声数据点不太敏感。例如,包括修改后的Huber 损失、Tukey 损失(Beaton 和 Tukey 1974)和修剪均值损失。这些损失函数在训练期间会降低或忽略异常实例的贡献,从而减少它们对模型学习过程的影响。鲁棒目标函数,如最小-最大 60 或分布鲁棒目标,旨在在最坏情况或存在对抗性扰动的情况下优化模型性能。

数据增强技术涉及通过应用随机变换或扰动到现有数据来生成额外的训练示例 图 16.33。这有助于增加训练数据集的多样性和鲁棒性。通过在数据中引入可控的变异,模型对可能存在于受污染实例中的特定模式或伪影变得不那么敏感。随机化技术,如随机子采样或自助聚合,还可以通过在不同的数据子集上训练多个模型并合并它们的预测来帮助减少受污染数据的影响。

图片

图 16.33:数据增强技术:应用变换如水平翻转、旋转和裁剪可以扩展训练数据集,提高模型对输入数据变化的鲁棒性,并减少过拟合。这些技术生成新的训练示例,而无需额外的标记数据,有效地增加了数据集的多样性和提高了泛化性能。

安全数据来源

实施最佳的数据收集和整理实践可以帮助减轻数据中毒的风险。这包括建立明确的数据收集协议,验证数据来源的真实性和可靠性,以及定期进行数据质量评估。从受信任和声誉良好的提供商处获取数据,并遵循安全的数据处理实践可以降低将受污染数据引入训练管道的可能性。

强有力的数据治理和访问控制机制对于防止未经授权修改或篡改训练数据至关重要。这包括明确数据访问的职责和角色,基于最小权限原则 61 实施访问控制策略,以及监控和记录数据访问活动。通过限制对训练数据的访问并保持审计跟踪,可以检测和调查潜在的数据中毒尝试。

检测和缓解数据中毒攻击需要一种多方面的方法,结合异常检测、数据净化、62 鲁棒的训练技术和安全的数据来源实践。数据中毒仍然是一个活跃的研究领域,需要积极和适应性的数据安全方法。

分布式偏移适应

分布式偏移对部署的机器学习系统构成了持续的挑战,需要系统性的方法来检测和缓解。本节重点介绍识别偏移何时发生的技术和保持系统性能的策略。我们探讨了偏移检测的统计方法、适应的算法方法以及生产系统的实施考虑。

检测与缓解

记住,当机器学习模型在部署期间遇到的数据分布与其训练时的分布不同,就会发生分布偏移。这些偏移可能会显著影响模型的表现和泛化能力,导致次优或错误的预测。检测和缓解分布偏移对于确保机器学习系统在实际场景中的鲁棒性和可靠性至关重要。

检测技术

统计测试可以用来比较训练数据和测试数据的分布,以识别显著差异。列表 16.2 展示了在生产环境中监控分布变化的实际实现:

列表 16.2:分布偏移检测:监控生产中数据分布变化的核心理统计方法,结合单个特征的柯尔莫哥洛夫-斯米尔诺夫测试与领域分类器方法,以检测传入数据与训练分布显著不同的情况。

from scipy.stats import ks_2samp
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score


def detect_distribution_shift(
    reference_data, new_data, threshold=0.05
):
    """Detect distribution shift using statistical tests"""

    # Kolmogorov-Smirnov test for feature-wise comparison
    ks_pvalues = []
    for feature_idx in range(new_data.shape[1]):
        _, p_value = ks_2samp(
            reference_data[:, feature_idx], new_data[:, feature_idx]
        )
        ks_pvalues.append(p_value)

    # Domain classifier to detect overall distributional
    # differences
    X_combined = np.vstack([reference_data, new_data])
    y_labels = np.concatenate(
        [np.zeros(len(reference_data)), np.ones(len(new_data))]
    )

    clf = RandomForestClassifier(n_estimators=50, random_state=42)
    clf.fit(X_combined, y_labels)
    domain_auc = roc_auc_score(
        y_labels, clf.predict_proba(X_combined)[:, 1]
    )

    return {
        "ks_shift_detected": any(p < threshold for p in ks_pvalues),
        "domain_shift_detected": domain_auc > 0.8,
        "severity_score": domain_auc,
    }

像柯尔莫哥洛夫-斯米尔诺夫测试或安德森-达尔林测试这样的技术测量两个分布之间的差异,并提供了对分布变化的定量评估。将这些测试应用于输入特征或模型的预测,使从业者能够检测训练和测试分布之间的统计显著差异。

散度度量量化了两个概率分布之间的差异。常用的散度度量包括 Kullback-Leibler (KL) 散度Jensen-Shannon (JS) 散度。通过计算训练和测试数据分布之间的散度,从业者可以评估分布偏移的程度。高散度值表明分布之间存在显著差异,表明存在分布偏移。

不确定性量化技术,如贝叶斯神经网络 63 或集成方法 64,可以估计模型预测的不确定性。当模型应用于来自不同分布的数据时,其预测可能具有更高的不确定性。通过监控不确定性水平,从业者可以检测分布偏移。如果测试样本的不确定性持续超过预定的阈值,这表明模型正在其训练分布之外运行。

此外,领域分类器被训练以区分不同的领域或分布。从业者可以通过训练一个分类器来区分训练域和测试域来检测分布变化。如果领域分类器在区分两个领域时达到高精度,这表明底层分布存在显著差异。领域分类器的性能作为分布变化的衡量标准。

缓解技术

迁移学习利用一个领域获得的知识来提高另一个领域的性能,如图 16.34 所示。通过使用预训练模型或将源领域学习到的特征转移到目标领域,迁移学习可以帮助缓解分布变化的影响。预训练模型可以在来自目标域的一小部分标记数据上进行微调,使其能够适应新的分布。当源领域和目标领域具有相似特征或目标域的标记数据稀缺时,迁移学习特别有效。

图片

图 16.34:知识迁移:在大数据集上预训练使模型能够学习可泛化的特征,然后可以通过有限的标记数据对特定目标任务进行微调。这种方法通过利用先前获得的知识来缓解数据稀缺问题并加速新领域的学习。来源:bhavsar

持续学习,也称为终身学习,使机器学习模型能够从新的数据分布中持续学习,同时保留先前分布中的知识。例如,弹性权重巩固(EWC)(Kirkpatrick 等人 2017) 或梯度片段记忆(GEM)(Lopez-Paz 和 Ranzato 2017) 等技术允许模型随着时间的推移适应不断变化的数据分布。这些技术旨在平衡模型的可塑性(从新数据中学习的能力)与模型的稳定性(保留先前学习到的知识)。通过增量更新模型以包含新数据并减轻灾难性遗忘,持续学习有助于模型对分布变化保持鲁棒性。

数据增强技术,如我们之前所见,涉及对现有训练数据进行变换或扰动,以增加其多样性并提高模型对分布变化的鲁棒性。通过引入数据中的变化,如旋转、平移、缩放或添加噪声,数据增强有助于模型学习不变特征并更好地泛化到未见过的分布。数据增强可以在训练和推理期间执行,以提高模型处理分布变化的能力。

如第 16.8.4.1.2 节 16.8.4.1.2 中所述的集成方法,在对抗防御中也提供了对分布偏移的鲁棒性。当面对偏移的分布时,集成可以利用单个模型的优点来做出更准确和稳定的预测。

定期用目标分布的新数据更新模型对于减轻分布偏移的影响至关重要。随着数据分布的发展,模型应该使用最新的可用数据进行重新训练或微调,以适应变化的模式,利用第十四章中详细介绍的持续学习方法。监控模型性能和数据特征可以帮助检测何时需要更新。通过保持模型更新,从业者可以确保他们在面对分布偏移时保持相关性和准确性。

使用对分布偏移不太敏感的鲁棒性度量来评估模型可以提供对模型性能的更可靠评估。例如,精确召回曲线下的面积(AUPRC)或 F1 分数 65 对类别不平衡更鲁棒,并能更好地捕捉模型在不同分布上的性能。使用与目标域中期望结果一致的领域特定评估度量可以提供对模型有效性的更有意义的衡量。

检测和减轻分布偏移是一个持续的过程,需要持续的监控、适应和改进。通过采用本节中描述的检测和减轻技术,从业者可以主动解决现实部署中的分布偏移问题。

自监督学习以鲁棒性为目标

自监督学习(SSL)方法可能通过从数据结构中学习而不是记忆输入输出映射来提供通往更鲁棒人工智能系统的途径。与依赖于标记示例的监督学习不同,SSL 方法通过解决需要理解底层数据模式和关系的预训练任务来发现表示。

自监督方法可能解决导致神经网络脆弱性的几个核心限制。SSL 方法从环境规律和数据结构中学习表示,捕捉在不同条件下保持一致的不变特征。对比学习技术鼓励捕捉不同视角下相同数据不变特征的表示,从而提高对变换和扰动的鲁棒性。掩码语言建模和视觉中的类似技术学习根据上下文而不是表面模式进行预测,可能发展出更具普遍性的内部表示。

与监督学习表示相比,自监督表示通常显示出更优越的迁移能力,这表明它们捕捉到了数据结构中更本质的方面。从数据结构而不是标签中学习可能本质上更鲁棒,因为它依赖于跨域和条件下存在的持续模式。自监督方法可以利用更多的未标记数据,通过使模型接触到更广泛的自然变异范围来提高泛化能力。这种对多样化未标记数据的接触可能有助于模型发展出对部署中常见的分布变化更具弹性的表示。

几种策略可以将自监督学习融入鲁棒系统设计中。在针对特定任务微调之前,使用自监督目标进行预训练模型提供了一种鲁棒的基础,这可能在跨域中更好地迁移。在训练期间结合自监督和监督目标的多元任务方法可以在表示学习和任务性能之间取得平衡。通过自监督学习获得的表示可以作为后续鲁棒微调方法的基础,可能需要更少的标记示例来实现鲁棒性。

尽管前景广阔,但用于鲁棒性的自监督学习仍然是一个活跃的研究领域,存在重要的局限性。当前的 SSL 方法可能仍然容易受到对抗攻击的影响,尤其是当攻击者了解预置任务时。为什么以及何时 SSL 可以提高鲁棒性的理论理解仍然不完整。SSL 预训练的计算开销可能很大,需要仔细考虑资源限制。

这个方向表明了一个不断发展的研究领域,它可能会改变我们处理鲁棒人工智能系统开发的方法,从防御技术转向本质上更可靠的学习方法。

我们考察的三个支柱——硬件故障、输入级攻击和环境变化——每个都针对人工智能系统的不同方面。然而,它们都在复杂的软件基础设施中运行并依赖于它,这些基础设施本身也具有独特的漏洞。

软件故障

我们迄今为止考察的鲁棒性挑战——硬件故障、输入级攻击和环境变化——每个都损害了不同的系统层。硬件故障破坏了物理计算,对抗攻击利用算法边界,环境变化挑战模型泛化。软件故障引入了第四个维度,它可以放大所有三个:支持现代人工智能部署的复杂软件生态系统中的错误和实现错误。

这第三个类别与前面两个不同。与通常源于物理现象的硬件故障不同,或与源于学习算法核心限制的模型鲁棒性问题不同,软件故障源于系统设计和实现中的人类错误。这些故障可以破坏人工智能管道的任何方面,从数据预处理和模型训练到推理和结果解释,通常以微妙的方式出现,可能不会立即明显。

人工智能系统中的软件故障特别具有挑战性,因为它们可以与并放大我们讨论过的其他稳健性威胁相互作用。数据预处理中的错误可能会导致分布变化,从而暴露模型漏洞。数值计算中的实现错误可能类似于硬件故障,但没有硬件级别的错误检测机制的好处。分布式训练中的竞争条件可能导致模型损坏,类似于对学习表示的对抗性攻击。

这些交互源于现代人工智能软件堆栈固有的复杂性——包括框架、库、运行时环境、分布式系统和部署基础设施,这为故障的出现和传播创造了众多机会。理解和缓解这些软件层面的威胁对于构建真正稳健的人工智能系统至关重要,这些系统能够在生产环境中可靠地运行,尽管其支持软件基础设施具有固有的复杂性。

机器学习系统依赖于复杂的软件基础设施,这些基础设施远远超出了模型本身。这些系统建立在第七章中详细介绍的框架、库和运行时环境之上,这些环境促进了模型训练、评估和部署。与任何大型软件系统一样,支持机器学习工作流程的组件容易受到故障的影响——这些故障是由软件中的缺陷、错误或设计疏忽引起的意外行为,在第十三章中详细说明的标准实践之外,创造了运营挑战。这些故障可能出现在机器学习管道的所有阶段,如果未被发现和解决,可能会损害性能、损害安全性,甚至使结果无效。本节探讨了机器学习系统中软件故障的性质、原因和后果,以及它们的检测和缓解策略。

软件故障属性

理解软件故障如何影响机器学习系统需要考察它们的独特特征。机器学习框架中的软件故障源于各种来源,包括编程错误、架构不匹配和版本不兼容。这些故障表现出几个重要特征,这些特征影响了它们在实际中的产生和传播。

软件错误的定义特征之一是其多样性。错误可能从语法和逻辑错误到更复杂的体现,如内存泄漏、并发错误或集成逻辑失败。潜在的故障类型广泛,使得它们的识别和解决都变得复杂,因为它们往往以不明显的方式出现。

这种多样性使得第二个关键特征是它们倾向于跨越系统边界传播。在底层模块中引入的错误,例如张量分配例程或预处理函数,可能会产生级联效应,破坏模型训练、推理或评估。由于机器学习框架通常由相互连接的组件组成,管道某一部分的故障可能会在看似无关的模块中引入故障。

一些错误是间歇性的,仅在特定条件下才会出现,例如高系统负载、特定的硬件配置或罕见的数据输入。这些短暂的错误因其可能在标准测试程序中不一致地出现而闻名,因此难以重现和诊断。

对于机器学习系统来说,最令人担忧的可能就是软件错误可能会微妙地与机器学习模型本身相互作用。例如,数据转换脚本中的错误可能会引入系统性的噪声或改变输入的分布,导致偏差或不准确的预测。同样,服务基础设施中的错误可能会导致训练时和推理时行为之间的差异,破坏部署一致性。

软件错误的后果涉及一系列系统属性。错误可能通过引入延迟或低效的内存使用来损害性能;它们可能通过限制并行性来降低可扩展性;或者它们可能通过使系统暴露于意外行为或恶意利用来损害可靠性和安全性。

在此基础上,软件错误的体现通常受到外部依赖的影响,例如硬件平台、操作系统或第三方库。由于版本不匹配或特定硬件行为导致的兼容性问题可能会导致微妙且难以追踪的错误,这些错误仅在特定的运行时条件下才会出现。

对这些特性的深入了解对于在机器学习中开发稳健的软件工程实践至关重要。它也为本节后面描述的检测和缓解策略提供了基础。

软件错误传播

这些特性说明了机器学习框架中的软件错误是如何通过各种机制出现的,反映了现代机器学习管道的复杂性和支持工具分层架构。这些机制对应于实践中常见的特定软件故障类别。

其中一个突出的类别涉及资源管理不当,尤其是与内存相关。不恰当的内存分配,包括未能释放缓冲区或文件句柄,可能导致内存泄漏,最终导致资源耗尽。这在深度学习应用中尤其有害,因为大型张量和 GPU 内存分配很常见。如图 16.35 所示,图 16.35,不高效的内存使用或未能释放 GPU 资源可能导致训练过程停止或显著降低运行性能。

图片

图 16.35:GPU 资源管理:不高效的内存使用或未能释放 GPU 资源可能导致内存不足错误和训练过程中的次优性能。

除了资源管理问题之外,另一个常见的故障机制源于并发和同步错误。在分布式或多线程环境中,并行进程之间不正确的协调可能导致竞争条件、死锁或不一致状态。这些问题通常与异步操作的不当使用有关,例如非阻塞 I/O 或并行数据摄取。同步错误可能会破坏训练状态的一致性或产生不可靠的模型检查点。

兼容性问题通常源于软件环境的变化,这扩展了第七章中讨论的框架兼容性问题。第七章。例如,在不验证下游影响的情况下升级第三方库可能会引入微妙的行为变化或破坏现有功能。当训练和推理环境在硬件、操作系统或依赖版本上存在差异时,这些问题会变得更加严重。在机器学习实验中,可重复性往往取决于管理这些环境的不一致性。

与数值不稳定性相关的故障在机器学习系统中也很常见,尤其是在优化过程中。不恰当处理浮点精度、除以零或下溢/上溢条件可能会将不稳定性引入梯度计算和收敛过程。正如这个资源中所述,在许多计算层中累积舍入误差可能会扭曲学习到的参数或延迟收敛。

虽然异常处理通常被忽视,但它对机器学习管道的稳定性起着至关重要的作用。不充分或过于通用的异常管理可能导致系统在非关键错误下静默失败或崩溃。模糊的错误信息和糟糕的日志记录实践会阻碍诊断并延长解决时间。

这些故障机制虽然来源多样,但都具有显著损害机器学习系统的潜力。了解它们是如何产生的为有效的系统级安全措施提供了基础。

软件故障对机器学习的影响

软件故障产生的机制揭示了其对机器学习系统的影响。软件故障的后果可能非常严重,不仅会影响模型输出的正确性,还会影响机器学习系统在生产中的广泛可用性和可靠性。

最直接的影响是性能下降,这是一个常见的症状,通常由内存泄漏、资源调度效率低下或并发线程之间的竞争引起。这些问题往往会随着时间的推移而积累,导致延迟增加、吞吐量减少,甚至系统崩溃。正如(Maas 等人 2024)所指出的,组件间性能退化的累积可能会严重限制大规模部署的机器学习系统的运行能力。

除了减慢系统性能外,故障还可能导致预测不准确。例如,预处理错误或特征编码的不一致性可能会微妙地改变模型看到的输入分布,产生有偏或不可靠的输出。这类故障尤其隐蔽,因为它们可能不会触发任何明显的故障,但仍然会损害下游决策。随着时间的推移,舍入误差和精度损失会放大不准确度,尤其是在具有许多层或长期训练周期的深度架构中。

除了准确性问题之外,软件故障还会破坏可靠性。系统可能会意外崩溃,无法从错误中恢复,或者在重复执行中表现不一致。间歇性故障在此背景下尤其成问题,因为它们会侵蚀用户信任,同时逃避传统的调试努力。在分布式环境中,检查点或模型序列化中的故障可能导致训练中断或数据丢失,降低长期运行训练管道的弹性。

安全漏洞通常源于被忽视的软件故障。缓冲区溢出、验证不当或未受保护的输入可能会使系统容易受到操纵或未经授权的访问。攻击者可能会利用这些弱点来改变模型的行为、提取私有数据或引发拒绝服务条件。正如(Q. 李等人 2023)所描述的,这些漏洞带来了严重风险,尤其是在机器学习系统集成到关键基础设施或处理敏感用户数据时。

最后,故障的存在使开发和维护变得复杂。调试变得更加耗时,尤其是在故障行为是非确定性的或依赖于外部配置时。频繁的软件更新或库补丁可能引入回归,需要重复测试。这种增加的工程开销可能会减慢迭代速度,阻碍实验,并将资源从模型开发中转移出来。

一起来看,这些影响突出了在机器学习中系统软件工程实践的重要性——这些实践可以预测、检测和缓解由软件故障引入的多种故障模式。

软件故障检测和预防

考虑到软件故障对机器学习系统的影响重大,解决这些问题需要跨越开发、测试、部署和监控的集成策略,基于第十三章(ch019.xhtml#sec-ml-operations)中的运营最佳实践。一个有效的缓解框架应结合主动检测方法、稳健的设计模式和操作保障。

为了帮助总结这些技术并阐明每种策略在机器学习生命周期中的位置,下表 表 16.6 按阶段和目标对检测和缓解方法进行了分类。此表提供了一个高级概述,补充了随后的详细解释。

表 16.6:故障缓解策略:机器学习系统中的软件故障需要分层检测和缓解技术,这些技术应用于整个开发生命周期——从初始测试到持续监控,以确保可靠性和鲁棒性。此表按阶段和目标对这些策略进行了分类,为构建全面故障容忍的机器学习部署提供了一个框架。

类别 技术 目的 何时应用
测试和验证 单元测试、集成测试、回归测试 验证正确性并识别回归 开发期间
静态分析和代码审查 静态分析器、代码审查工具 检测语法错误、不安全操作、强制最佳实践 集成前
运行时监控与日志记录 指标收集、错误日志、分析 观察系统行为,检测异常 训练和部署期间
容错设计 异常处理、模块化架构、检查点 最小化故障影响,支持恢复 设计和实现阶段
更新管理 依赖审计、测试阶段、版本跟踪 预防回归和兼容性问题 在系统升级或部署之前
环境隔离 容器化(例如,Docker、Kubernetes)、虚拟环境 确保可重复性,避免环境特定错误 开发、测试、部署
CI/CD 和自动化 自动化测试管道、监控钩子、部署门 强制质量保证并尽早捕获错误 开发过程中的持续进行

第一道防线涉及系统性的测试。单元测试验证单个组件在正常和边缘情况下的行为是否符合预期。集成测试确保模块在边界之间正确交互,而回归测试检测由代码更改引入的错误。在快速发展的机器学习环境中,持续测试至关重要,因为管道迅速演变,小的修改可能产生系统级的影响。如图 16.36 图所示,自动回归测试有助于随着时间的推移保持功能正确性。

图片

图 16.36:回归测试自动化:自动回归测试验证新代码更改不会向现有功能引入意外的错误,从而在整个开发生命周期中保持系统可靠性。在快速发展的机器学习系统中,这些测试的持续执行至关重要,因为即使是微小的修改也可能产生广泛的影响。来源:UTOR

静态代码分析工具通过在编译时识别潜在问题来补充动态测试。这些工具可以捕获常见的错误,例如变量误用、不安全操作或违反特定语言的最佳实践。结合代码审查和一致的样式执行,静态分析可以减少可避免的编程错误的发病率。

运行时监控对于观察系统在实际环境下的行为至关重要。日志框架应捕获关键信号,如内存使用、输入/输出跟踪和异常事件。监控工具可以跟踪模型吞吐量、延迟和故障率,提供软件错误的早期警告。如图所示,Microsoft 资源中的性能分析有助于识别性能瓶颈和表明更深层次架构问题的低效。

顽强的系统设计进一步提高了容错能力。结构化异常处理和断言检查防止小错误级联成系统级故障。冗余计算、回退模型和故障转移机制在组件故障的情况下提高了可用性。封装状态和隔离副作用的结构化架构使得诊断和包含故障更加容易。如(Eisenman 等人 2022 年)中讨论的检查点技术,可以在不丢失数据的情况下从训练中断中恢复。

保持机器学习软件的更新是另一项关键策略。应用定期的更新和安全补丁有助于解决已知的错误和漏洞。然而,更新必须通过测试阶段环境进行验证,以避免回归。审查发布说明和变更日志确保团队了解新版本中引入的任何行为变化。

类似于DockerKubernetes这样的容器化技术允许团队定义可重复的运行环境,从而减轻兼容性问题。通过隔离系统依赖,容器防止了由于开发、测试和生产中系统级差异引入的故障。

最后,围绕持续集成和持续部署(CI/CD)构建的自动化流水线为强制执行故障感知开发提供了基础设施。测试、验证和监控可以直接嵌入到 CI/CD 流程中。如图 16.37 图所示,这样的流水线降低了未注意到的回归风险,并确保只有经过测试的代码达到部署环境。

图片

图 16.37: CI/CD 流水线: 自动化的 CI/CD 流水线通过将测试和验证直接集成到软件交付过程中,强制执行故障感知开发,降低回归风险,并确保只有经过测试的代码达到生产环境。容器化技术,如 Docker 和 Kubernetes,通过在这些流水线阶段提供可重复的运行环境来进一步增强可靠性。来源:geeksforgeeks

这些实践共同构成了机器学习系统中软件故障管理的完整方法。当系统性地采用时,它们降低了系统故障的可能性,提高了长期的可维护性,并促进了模型性能和可重复性的信任。

故障注入工具和框架

由于开发稳健的人工智能系统的重要性,近年来,研究人员和从业者已经开发了一系列工具和框架,这些工具和框架建立在第七章(Chapter 7)中描述的软件基础设施之上,以了解硬件故障如何表现和传播以影响机器学习系统。这些工具和框架在通过模拟各种故障场景并分析其对系统性能的影响方面发挥着关键作用,从而补充了第十二章(Chapter 12)中描述的评估方法。这使得设计人员能够识别潜在的安全漏洞并制定有效的缓解策略,最终创建出更稳健、更可靠且能够在硬件故障下安全运行的人工智能系统,支持第十三章(Chapter 13)中详细说明的部署策略。本节概述了文献中广泛使用的故障模型 66 以及为评估此类故障对机器学习系统的影响而开发的工具和框架。

故障和错误模型

如前所述,硬件故障可以以多种方式表现出来,包括瞬态、永久和间歇性故障。除了正在研究的故障类型外,故障的表现方式也同样重要。例如,故障是在存储单元中发生还是在功能单元的计算过程中发生?它的影响是针对单个比特,还是影响多个比特?故障是否传播到整个系统并影响应用程序(导致错误),或者它是否迅速被掩盖并被认为是无害的?所有这些细节都会影响所谓的故障模型,这在模拟和测量故障发生时系统所发生的情况中起着重要作用。

为了研究和理解硬件故障对机器学习系统的影响,理解故障模型和错误模型的概念是至关重要的。故障模型描述了硬件故障如何在系统中表现,而错误模型则表示故障如何传播并影响系统的行为。

故障模型通常根据几个关键属性进行分类。首先,它们可以根据其持续时间来定义:瞬态故障是暂时的,很快就会消失;永久故障无限期地持续存在;间歇性故障偶尔发生,这使得它们特别难以识别或预测。另一个维度是故障位置,故障可能出现在硬件组件中,如存储单元、功能单元或互连。故障还可以通过其粒度来表征——一些故障仅影响单个比特(例如,比特翻转),而其他故障则同时影响多个比特,如突发错误。

相比之下,错误模型描述了故障在系统内传播时的行为效应。这些模型帮助研究人员理解初始硬件级别的扰动可能如何体现在系统的行为中,例如通过机器学习模型中损坏的权重或错误的激活。这些模型可以在各种抽象级别上运行,从低级别的硬件错误到机器学习框架中的高级逻辑错误。

故障或错误模型的选择对于鲁棒性评估至关重要。例如,一个旨在研究单比特瞬态故障的系统(Sangchoolie, Pattabiraman, 和 Karlsson 2017)将不会对永久性多比特故障的影响提供有意义的见解(Wilkening 等人 2014),因为其设计和假设基于完全不同的故障模型。

考虑错误模型如何以及在哪里实现也很重要。在架构寄存器级别发生的单比特翻转,使用 gem5 等模拟器建模(Binkert 等人 2011),与 PyTorch 模型权重张量中的类似比特翻转有明显的区别。虽然两者都模拟了值级别的扰动,但低级别模型捕捉了通常在软件框架中抽象掉的微架构效应。

有趣的是,某些故障行为模式在抽象级别上保持一致。例如,研究一直表明,单比特故障比多比特故障造成的破坏更大,无论是考察硬件级别的效应还是软件可见的影响(Sangchoolie, Pattabiraman, 和 Karlsson 2017;Papadimitriou 和 Gizopoulos 2021)。然而,其他重要的行为,如错误掩码(Mohanram 和 Touba,未注明年份),可能只能在较低的抽象级别上观察到。如图 16.38 所示,这种掩码现象可能导致故障在传播到更高级别之前被过滤掉,这意味着基于软件的工具可能会完全错过这些效应。

图片

图 16.38:错误掩码:微架构冗余可以在故障传播到可观察的系统错误之前吸收单比特故障,突显了硬件级别和软件级别故障模型之间的差异。此图详细说明了故障掩码在微架构组件中的发生过程,表明基于软件的错误检测工具可能会低估系统对瞬态错误的真正弹性。(Ko 2021)

为了解决这些差异,开发了像 Fidelity (Yi He, Balaprakash, and Li 2020)这样的工具,以对抽象层之间的故障模型进行对齐。通过将软件观察到的故障行为映射到相应的硬件级模式(E. Cheng et al. 2016),Fidelity 提供了一种更精确的软件级别模拟硬件故障的方法。虽然底层工具捕获了错误通过硬件系统的真实传播,但它们通常速度较慢且更复杂。软件级别的工具,如 PyTorch 或 TensorFlow 中实现的工具,对于大规模鲁棒性测试来说更快、更易用,尽管精度较低。

基于硬件的故障注入

基于硬件的故障注入方法允许研究人员直接将故障引入物理系统,并观察它们对机器学习模型的影响。这些方法对于验证软件级别故障注入工具中做出的假设以及研究实际硬件故障如何影响系统行为至关重要。虽然大多数用于机器学习鲁棒性研究中的错误注入工具都是基于软件的,但由于它们的速度和可扩展性,基于硬件的方法对于建立高级错误模型仍然至关重要。通过直接操作硬件来引入错误,它们被认为是研究故障对机器学习系统影响的最准确方法。

如图 16.39 所示,硬件故障可以在深度神经网络(DNN)处理管道的各个点出现。这些故障可能影响控制单元、片上内存(SRAM)、片外内存(DRAM)、处理元素和累加器,导致错误结果。在所描述的示例中,一个被赋予正确识别交通信号的 DNN 在正常条件下正确地识别了红灯。然而,由老化、电迁移、软错误、工艺变化和制造缺陷等现象引起的硬件引起的故障可能会引入错误,导致 DNN 将信号误分类为绿灯,这可能导致实际应用中的灾难性后果。

图片

图 16.39:硬件故障:此图展示了在深度神经网络(DNN)处理管道中可能发生的硬件引起的错误,突出了可能导致实际应用中误分类的潜在故障点,如控制单元和内存模块。

这些方法使研究人员能够观察系统在实际世界故障条件下的行为。本节更详细地描述了基于软件和硬件的错误注入工具。

硬件注入方法

最常见的两种基于硬件的故障注入方法是 FPGA 基于的故障注入和辐射或束测试。

基于 FPGA 的故障注入。现场可编程门阵列(FPGAs)67 是可重新配置的集成电路,可以编程以实现各种硬件设计。在故障注入的背景下,FPGAs 提供了高精度和准确性,因为研究人员可以在硬件中针对特定的位或位集。通过修改 FPGA 配置,可以在机器学习模型的执行过程中在特定位置和时间引入故障。基于 FPGA 的故障注入允许对故障模型进行细粒度控制,使研究人员能够研究不同类型故障的影响,例如单比特翻转或多比特错误。这种控制水平使得基于 FPGA 的故障注入成为了解机器学习系统对硬件故障的恢复力的宝贵工具。

虽然基于 FPGA 的方法允许精确、可控的故障注入,但其他方法旨在复制自然环境中发现的故障条件。

辐射或束测试。辐射或束测试(Velazco, Foucard, 和 Peronnard 2010)将运行机器学习模型的硬件暴露于高能粒子,如质子或中子。如图 16.40(ch022.xhtml#fig-beam-testing)所示,专用测试设施能够实现可控的辐射暴露,以诱导位翻转和其他硬件级别的故障。这种方法被广泛认为是在应用执行期间测量粒子打击错误率的最准确方法之一。束测试提供了高度逼真的故障场景,反映了辐射丰富环境中的条件,这使得它对于验证旨在太空任务或粒子物理实验的系统特别有价值。然而,尽管束测试提供了非凡的现实感,但它缺乏基于 FPGA 注入的精确目标能力——粒子束不能以高精度指向特定的硬件位或组件。尽管存在这种限制以及其显著的操作复杂性和成本,束测试仍然是严格评估实际辐射效应下硬件可靠性的行业公认实践。

图片

图 16.40:辐射测试设置:辐射测试设施通过将半导体元件暴露于高能粒子中,模拟在太空或粒子物理实验中遇到的现实辐射环境,从而诱导硬件故障。这种可控的故障注入方法为评估硬件在极端条件下的可靠性和错误率提供了宝贵的数据,尽管它缺乏基于 FPGA 的故障注入的精确目标能力。来源:JD 仪器[HTTPS://jdinstruments.net/tester-capabilities-radiation-test/]

硬件注入限制

尽管基于硬件的故障注入方法具有很高的准确性,但它们存在一些限制,可能会阻碍其广泛应用。

首先,成本是一个主要障碍。基于 FPGA 和光束测试 68 的方法都需要专用硬件和设施,这可能导致高昂的设置和维护成本。这使得资金或基础设施有限的研究小组难以获得。

其次,这些方法面临着可扩展性的挑战。在硬件上直接注入故障和收集数据是耗时的,这限制了在合理时间内可以运行的实验数量。当分析大型机器学习系统或对许多故障场景进行统计分析时,这一点尤其受限。

第三,存在灵活性限制。在模拟广泛的故障和错误类型时,基于硬件的方法可能不如基于软件的替代方案适应性强。为了适应新的故障模型而更改实验设置通常需要耗时的硬件重新配置。

尽管存在这些限制,基于硬件的故障注入对于验证基于软件工具的准确性以及研究在真实世界故障条件下的系统行为仍然是必不可少的。通过结合基于硬件方法的精确性和基于软件工具的可扩展性和灵活性,研究人员可以更全面地了解机器学习系统对硬件故障的弹性,并制定有效的缓解策略。

基于软件的故障注入

随着 TensorFlow、PyTorch 和 Keras 等机器学习框架成为开发和部署 ML 模型的主导平台,基于软件的故障注入工具已成为评估这些系统对硬件故障鲁棒性的灵活且可扩展的方法。与直接在物理系统上运行的基于硬件的方法不同,基于软件的方法通过修改模型的底层计算图、张量值或中间计算来模拟硬件故障的影响。

近年来,这些工具越来越受欢迎,因为它们可以直接集成到机器学习(ML)开发管道中,无需专用硬件,并允许研究人员快速且经济高效地进行大规模故障注入实验。通过在软件层面模拟硬件级故障,包括权重、激活或梯度的位翻转,这些工具能够有效地测试容错机制,并为模型漏洞提供宝贵的见解。

在本节的剩余部分,我们将探讨基于软件的故障注入方法的优缺点,介绍主要工具类别(通用和特定领域),并讨论它们如何有助于构建具有弹性的机器学习系统。

软件注入权衡

基于软件的故障注入工具提供了几个优势,使它们对研究机器学习系统的弹性具有吸引力。

其中一个主要的好处是速度。由于这些工具完全在软件堆栈中运行,它们避免了修改物理硬件或配置专用测试环境的相关开销。这种效率使得研究人员能够在更短的时间内进行大量的故障注入实验。快速模拟广泛故障的能力使得这些工具特别适用于对大规模机器学习模型进行压力测试或进行需要数千次注入的统计分析。

这些工具还提供了灵活性。基于软件的故障注入器可以轻松地适应模拟各种类型的故障。研究人员可以模拟单比特翻转、多比特损坏,甚至更复杂的如突发错误或部分张量损坏的行为。软件工具允许在机器学习管道的不同阶段注入故障,在训练、推理或梯度计算阶段,从而能够精确地针对不同的系统组件或层。

这些工具也高度可访问,因为它们只需要标准的机器学习开发环境。与基于硬件的方法不同,软件工具不需要昂贵的实验设置、定制电路或辐射测试设施。这种可访问性使得故障注入研究对更广泛的机构和发展者开放,包括那些在学术界、初创公司或资源受限环境中工作的人。

然而,这些优势也伴随着某些权衡。其中最重要的是准确性。由于基于软件的工具在更高层次上抽象地模拟故障,它们可能无法完全捕捉影响故障实际传播的低级硬件交互。例如,在机器学习框架中模拟的位翻转可能没有考虑到数据在硬件级别的缓冲、缓存或操作方式,这可能导致结论过于简化。

与此密切相关的是保真度问题。虽然可以近似现实世界的故障行为,但基于软件的工具可能与真实硬件行为有所偏差,尤其是在掩码、时序或数据移动等微妙交互方面。此类模拟的结果高度依赖于错误模型的潜在假设,并且可能需要与真实硬件测量结果进行验证才能可靠。

尽管存在这些限制,基于软件的故障注入工具在机器学习鲁棒性研究中发挥着不可或缺的作用。它们的速度、灵活性和可访问性允许研究人员进行广泛的评估,并指导容错机器学习架构的开发。在接下来的章节中,我们将探讨这个领域的主要工具,突出它们的功能和用例。

软件注入限制

虽然基于软件的故障注入工具在速度、灵活性和可访问性方面提供了显著的优势,但它们并非没有局限性。这些限制可能会影响故障注入实验的准确性和真实性,尤其是在评估机器学习系统对现实世界硬件故障的鲁棒性时。

一个主要的问题是准确性。由于基于软件的工具在更高的抽象级别上运行,它们可能无法始终捕捉到硬件故障可以产生的全部影响。包括微妙的时序错误、电压波动和架构副作用在内的低级硬件交互可能会在高级模拟中完全被忽略。因此,仅依赖于软件模型的故障注入研究可能会低估或高估系统对某些类别故障的真实脆弱性。

与之密切相关的是保真度问题。虽然基于软件的方法通常被设计来模拟特定的故障行为,但它们反映现实世界硬件条件的程度可能会有所不同。例如,模拟神经网络权重值中的单个位翻转可能无法完全复制该位错误如何在内存层次结构中传播或影响实际芯片上的计算单元。工具越抽象,在故障条件下模拟行为与物理行为偏离的风险就越大。

由于基于软件的工具更容易修改,它们可能会无意中偏离现实世界的故障假设。这可能发生在所选择的故障模型过于简化或没有基于实际硬件行为的经验数据的情况下。正如在讨论硬件-软件差距的章节中所述,像 Fidelity (Yi He, Balaprakash, and Li 2020) 这样的工具试图通过将软件级模型与已知的硬件级故障特征对齐来解决这些担忧。

尽管存在这些局限性,基于软件的故障注入仍然是机器学习鲁棒性研究工具箱的一个关键部分。当适当使用时,尤其是与基于硬件的验证结合使用时,这些工具提供了一种可扩展且高效的方式来探索大型设计空间,识别易受攻击的组件,并开发缓解策略。随着故障建模技术的不断发展,将硬件感知见解集成到基于软件的工具中将是提高其真实性和影响力的关键。

软件注入工具分类

在过去几年中,基于软件的故障注入工具已被开发用于广泛的机器学习框架和用例。这些工具在抽象级别、目标平台和可以模拟的故障类型方面各不相同。许多工具被构建为与流行的机器学习库(如 PyTorch 和 TensorFlow)集成,使得那些已经在这些生态系统中工作的研究人员和实践者能够使用它们。

最早且最具影响力的工具之一是 Ares (Reagen 等人 2018),最初是为 Keras 框架设计的。在深度神经网络(DNNs)日益流行的时期开发,Ares 是最早系统地探索硬件故障对 DNNs 影响的工具之一。它提供了支持注入单比特翻转和评估权重和激活值之间的比特错误率(BER)。重要的是,Ares 通过与在硅中实现的物理 DNN 加速器进行验证,证明了其在硬件级故障建模中的相关性。随着该领域的发展,Ares 被扩展以支持 PyTorch,使研究人员能够在更现代的机器学习环境中分析故障行为。

在此基础上,PyTorchFI (Mahmoud 等人 2020) 被引入作为一个为 PyTorch 定制的故障注入库。与 Nvidia 研究团队合作开发,PyTorchFI 允许对机器学习模型的关键组件进行故障注入,包括权重、激活和梯度。它对 GPU 加速的原生支持使其特别适合高效评估大型模型。如图 图 16.41 所示,即使是简单的位级故障也可能导致严重的视觉和分类错误,包括图像中出现“幽灵”对象,这可能在自动驾驶等领域的下游安全方面产生影响。

图片

图 16.41:故障注入效果:位级硬件故障可能导致机器学习模型中出现“幽灵”对象和误分类,这可能导致自动驾驶等应用中的安全关键错误;左图表示正确分类,而右图展示了一个由 pytorchfi 注入的单比特翻转导致的假阳性检测。

PyTorchFI 的模块化和易于访问的设计使其在多个后续项目中得到应用。例如,PyTorchALFI(由 Intel xColabs 开发)扩展了 PyTorchFI 的功能,以评估汽车应用中的系统级安全性。同样,Meta 的 Dr. DNA (D. Ma 等人 2024) 引入了一个更简洁、Pythonic 的 API,以简化故障注入工作流程。另一个值得注意的扩展是 GoldenEye (Mahmoud 等人 2022),它结合了替代的数值数据类型,包括 AdaptivFloat (Tambe 等人 2020) 和 BlockFloat,以 bfloat16 为例,来研究在硬件引起的位错误下非传统数字格式的容错性。

对于在 TensorFlow 生态系统内工作的研究人员,TensorFI (Z. Chen 等人 2020) 提供了一种并行解决方案。与 PyTorchFI 类似,TensorFI 允许对 TensorFlow 计算图进行故障注入,并支持多种故障模型。TensorFI 的一个优势是其广泛的适用性——它可以用于评估许多类型的机器学习模型,而不仅仅是深度神经网络(DNNs)。如 BinFi (Z. Chen 等人 2019) 这样的附加扩展旨在通过关注模型中最关键的位来加速故障注入过程。这种优先级设置可以帮助减少仿真时间,同时仍然捕捉到最有意义的错误模式。

在软件堆栈的较低层次,NVBitFI (T. Tsai 等人 2021) 提供了一个平台无关的工具,可以直接将故障注入到 GPU 汇编代码中。由 Nvidia 开发的 NVBitFI 能够对任何 GPU 加速的应用程序进行故障注入,而不仅仅是机器学习工作负载。这使得它成为研究指令级别弹性的特别强大的工具,因为错误可以以微妙和复杂的方式传播。NVBitFI 是 PyTorchFI 和 TensorFI 等高级工具的重要补充,它提供了对 GPU 级别行为的精细控制,并支持机器学习之外的更广泛的应用程序类别。

这些工具共同提供了广泛的故障注入能力。虽然一些工具与高级机器学习框架紧密集成,以便于使用,但其他工具则允许进行更精细的故障建模,具有更高的保真度。通过根据抽象级别、性能需求和目标应用程序选择适当的工具,研究人员可以根据自己的研究需求定制他们的研究,以获得更多关于机器学习系统鲁棒性的可操作见解。下一节将重点介绍这些工具如何在特定领域环境中应用,特别是在自动驾驶汽车和机器人等关键安全系统。

机器学习特定注入工具

为了解决特定应用领域提出的独特挑战,研究人员已经开发了针对不同机器学习系统的专用故障注入工具。在自动驾驶汽车和机器人等高风险环境中,特定领域的工具在评估系统在硬件故障条件下的安全性和可靠性方面发挥着至关重要的作用。本节重点介绍了三种此类工具:DriveFI 和 PyTorchALFI,它们专注于自动驾驶汽车,以及 MAVFI,它针对的是无人驾驶飞行器(UAVs)。每个工具都允许将故障注入到任务关键组件中,包括感知、控制和传感器系统,为研究人员提供了关于硬件错误如何通过现实世界的机器学习管道传播的见解。

DriveFI (S. Jha et al. 2019) 是为自动驾驶系统开发的故障注入工具。它促进了硬件故障注入到感知和控制管道中,使研究人员能够研究这些故障如何影响系统行为和安全。值得注意的是,DriveFI 与行业标准平台(如 Nvidia DriveAV 和百度 Apollo)集成,提供了一个真实的测试环境。通过这种集成,DriveFI 使从业者能够在存在故障条件的情况下评估自动驾驶架构的端到端弹性。

PyTorchALFI (Gräfe et al. 2023) 扩展了 PyTorchFI 的功能,使其适用于自动驾驶领域。由英特尔 xColabs 开发的 PyTorchALFI 通过添加特定领域的功能增强了底层故障注入框架。这些功能包括将故障注入到多模态传感器数据中 69,例如来自摄像头和激光雷达系统的输入。这允许我们更深入地研究自动驾驶车辆的感知系统如何对底层硬件故障做出反应,进一步细化我们对系统脆弱性和潜在故障模式的了解。

MAVFI (Hsiao et al. 2023) 是一个针对机器人应用,尤其是无人机的特定领域故障注入框架。基于机器人操作系统 (ROS) 构建,MAVFI 为将故障注入各种无人机子系统(包括传感器、执行器和飞行控制算法)提供了一个模块化和可扩展的平台。通过评估注入的故障如何影响飞行稳定性和任务成功,MAVFI 为开发和验证容错无人机架构提供了一种实用的方法。

这些工具共同展示了故障注入研究在各个应用领域的日益复杂化。通过允许对故障引入的位置和方式进行精细控制,特定领域的工具提供了通用框架可能忽略的可操作见解。它们的发展极大地扩大了机器学习社区设计和管理弹性系统的能力——特别是在可靠性、安全和实时性能至关重要的环境中。

桥接软硬件差距

虽然基于软件的故障注入工具在速度、灵活性和可访问性方面具有许多优势,但它们并不总是能够捕捉到硬件故障对系统可能产生的影响的全部范围。这主要是因为抽象差距:基于软件的工具在更高的层面上运行,可能会忽略低级硬件交互或影响机器学习系统行为的微妙错误传播机制。

如(Bolchini 等人 2023)的工作所述,硬件故障可以表现出复杂的空间分布模式,这些模式难以仅使用基于软件的故障模型来复制。他们确定了四种特征故障传播模式:单点,其中故障会破坏特征图中的一个值;同一行,其中特征图中的一行部分或全部被破坏;子弹尾波,其中多个特征图中相同的位置受到影响;以及破碎玻璃,这是同一行和子弹尾波行为的更复杂组合。这些不同的模式,如图图 16.42 所示,突出了简单注入策略的局限性,并强调了在评估机器学习系统鲁棒性时进行硬件感知建模的必要性。

图片

图 16.42:硬件故障模式:Dnns 表现出从硬件故障中独特的错误表现,按其在特征图和层之间的空间分布进行分类。这些模式——单点、同一行、子弹尾波和破碎玻璃——代表了局部与广泛破坏,影响模型预测并强调了容错系统设计的必要性。来源:(Bolchini 等人 2023)。

为了解决这个抽象差距,研究人员开发了旨在明确地将底层硬件错误行为映射到软件可见效果的工具。其中一个这样的工具是 Fidelity,它通过研究硬件级别的故障如何传播并在更高软件层变得可观察来弥合这一差距。下一节将更详细地讨论 Fidelity。

模拟忠实度挑战

Fidelity(叶,Balaprakash 和 李 2020)是一个工具,旨在在基于软件的故障注入实验中更准确地模拟硬件故障。其核心目标是通过模拟故障如何在计算堆栈中传播,来弥合底层硬件故障行为与机器学习系统中观察到的更高层次效应之间的差距。

Fidelity(忠实度)背后的核心洞察是,并非所有故障都需要在硬件级别单独建模才能产生有意义的结果。相反,Fidelity 关注故障如何在软件可见状态下表现,并识别出允许对整个故障类进行代表性建模的等价关系。为此,它依赖于几个关键原则:

首先,研究故障传播以了解一个起源于硬件的故障如何通过各种层移动,包括架构寄存器、内存层次结构和数值运算,最终改变软件中的值。Fidelity 捕获这些路径以确保注入到软件中的故障反映了故障在实际系统中实际表现的方式。

第二,该工具识别了故障等价性,这指的是将导致软件中类似可观察结果的硬件故障分组。通过关注代表性示例而不是单独对每个可能的硬件位翻转进行建模,Fidelity 允许更高效的模拟,同时不牺牲准确性。

最后,Fidelity 采用分层建模方法,捕捉系统在各个抽象层次上的行为——从硬件故障的起源到其在机器学习模型权重、激活或预测中的影响。这种分层确保了在机器学习系统的背景下,硬件故障的影响得到真实模拟。

通过结合这些技术,Fidelity 允许研究人员运行与真实硬件系统行为紧密相似的故障注入实验,但具有基于软件工具的效率和灵活性。这使得 Fidelity 在成本高昂且对硬件引起的故障有准确理解至关重要的关键安全设置中特别有价值。

硬件行为建模

在基于软件的故障注入工具中捕捉硬件故障的真实行为对于提高机器学习系统的可靠性和鲁棒性至关重要。当硬件故障具有微妙但重大的影响,而这些影响在高级抽象层次上建模时可能不明显时,这种精确度变得尤为重要。

几个原因解释了为什么准确反映硬件行为是至关重要的。首先,准确性至关重要。基于软件的工具,能够反映硬件故障的实际传播和表现,提供了对故障如何影响模型行为的更可靠的见解。这些见解对于设计和验证容错架构以及确保缓解策略基于现实系统行为至关重要。

第二,当硬件效果得到忠实捕捉时,可重复性得到提高。这允许在不同系统和环境中可靠地重现故障注入结果,这是严格科学研究的基石。研究人员可以更好地比较结果,验证发现,并确保研究之间的一致性。

第三,当故障模型专注于最具代表性和影响力的故障场景时,效率会得到提升。而不是全面模拟每个可能的位翻转,工具可以针对已知通过精确建模影响系统的故障子集。这种选择性方法在节省计算资源的同时,仍然提供深入的见解。

最后,理解硬件故障在软件层面的出现方式对于设计有效的缓解策略至关重要。当研究人员知道特定硬件级别的问题如何影响机器学习系统的不同组件时,他们可以开发更具有针对性的加固技术——例如重新训练特定层、选择性应用冗余或提高瓶颈组件的架构弹性。

工具如 Fidelity 是这项工作的核心。通过在低级硬件行为和高级软件效果之间建立映射,Fidelity 和类似工具使研究人员能够进行故障注入实验,这些实验不仅更快、更可扩展,而且基于现实世界的系统行为。

随着机器学习系统规模的不断扩大,并在越来越关键的安全生产环境中部署,这种硬件感知建模将变得更加重要。该领域的研究持续进行,旨在进一步细化硬件和软件故障模型之间的翻译,并开发出在评估机器学习系统弹性方面既高效又真实的工具。这些进步将为社区提供更强大、更可靠的方法来理解和防御硬件故障的影响。

Fallacies and Pitfalls

鲁棒性威胁的复杂性和相互关联性往往导致对有效防御策略的误解,尤其是在鲁棒性技术提供无权衡或限制的普遍保护的假设方面。

谬误: 通过防御技术可以实现对抗鲁棒性,而不需要权衡。

这种误解使团队相信,像对抗性训练或输入预处理这样的鲁棒性技术可以提供无成本的完全保护。对抗性防御通常会引入重大的权衡,包括降低清洁精度、增加计算开销或对新攻击方法的脆弱性。许多在特定攻击中看似有效的防御技术,在对抗更强或自适应的对手时却失败了。攻击和防御之间的军备竞赛意味着鲁棒性不是一个已解决的问题,而是一个持续的工程挑战,需要不断适应和评估不断发展的威胁。

陷阱: 仅针对已知攻击方法测试鲁棒性,而不是进行全面的威胁建模。

许多从业者通过针对少数标准对抗性攻击进行测试来评估模型的鲁棒性,而没有考虑到潜在威胁的全谱。这种方法在模型对有限的测试案例表现良好时提供了虚假的信心,但在面对新颖的攻击向量时却会灾难性地失败。现实世界的威胁不仅包括复杂的对抗性示例,还包括硬件故障、数据损坏、分布偏移和可能不像学术攻击场景的软件漏洞。全面的鲁棒性评估需要系统性的威胁建模,考虑完整的攻击面,而不是仅仅关注已知的一组漏洞。

谬误: 通过收集更多样化的训练数据可以解决分布偏移问题。

这种信念假设仅凭数据集多样性就能确保对部署中遇到的分布偏移的鲁棒性。虽然多样化的训练数据有所帮助,但它无法预测动态现实环境中可能发生的所有可能的分布变化。与无限的部署条件相比,训练数据集本质上仍然是有限的。一些分布偏移本质上是不可预测的,它们可能源于用户行为的变化、数据源的演变或外部环境因素。有效的鲁棒性需要具有监控、检测和响应能力的自适应系统,而不是仅仅依赖于全面训练数据。

陷阱: 假设为某一威胁类别设计的鲁棒性技术可以保护所有故障模式。

团队通常在没有理解它们对其他故障模式限制的情况下,应用针对特定威胁开发的鲁棒性技术。针对基于梯度的攻击设计的对抗性训练可能不会提高对硬件故障或数据中毒的鲁棒性。同样,处理良性分布偏移的技术可能无法应对旨在利用模型弱点的对抗性分布偏移。每个威胁类别都需要专门的防御措施,有效的鲁棒性需要分层保护策略,以解决潜在故障的全谱系,而不是假设跨域的有效性。

谬误: 不同的故障模式独立运作,可以单独解决。

这种假设忽略了不同故障类型之间可能产生的复杂交互,这些交互可以创建超过单个威胁总和的复合漏洞。现实世界的故障往往涉及级联效应,其中一种漏洞使其他漏洞得以启用或放大。考虑以下复合场景:

硬件对抗性交互说明了模型权重中的位翻转如何意外地创建出原始模型中不存在的对抗性漏洞。攻击者发现这些破坏后,可以构建针对特定权重扰动的针对性对抗示例,实现 95%的攻击成功率,而未受破坏的模型攻击成功率仅为 20%。相反,旨在提高鲁棒性的对抗性训练通过增加 2-3×\times模型复杂性,提高了由于内存和计算需求增加而导致的硬件故障的概率。

环境软件级联发生在由于监控软件中的错误导致无法记录异常样本,从而可能未被发现逐渐的分布变化时。随着变化在 3-6 个月内进展,模型的准确性下降 40%,但故障监控系统报告正常操作。当最终被发现时,累积的数据漂移和延迟检测需要重新训练整个模型,而不是增量适应,导致 10×\times更高的恢复成本。

攻击性分布利用涉及攻击者观察部署系统中自然分布的变化,并构建加速特定方向漂移的中毒攻击。通过注入仅与自然漂移模式一致的 0.1%中毒样本,攻击者可以导致 5×\times更快的性能退化,同时避开针对纯对抗或纯漂移场景校准的检测系统。

三重威胁场景展示了最严重的复合漏洞。考虑一个自动驾驶汽车,其中宇宙射线引起的位翻转破坏了感知模型权重,对抗性道路标记利用这些破坏,季节性天气变化造成分布漂移。这种组合在特定条件下导致 85%的停车标志误分类,而每个单独的威胁只会造成 15-20%的退化。

这些复合场景表明,鲁棒的人工智能系统必须通过全面的故障模式分析、跨领域测试来评估综合漏洞,以及考虑级联故障的防御策略,而不是孤立地处理每个威胁。

摘要

本章将鲁棒人工智能确立为在现实世界环境中运行的可靠机器学习系统的核心要求。通过检查云、边缘和嵌入式部署中的具体故障,我们证明了鲁棒性挑战跨越多个维度,需要系统性的检测、缓解和恢复方法。

在这里开发的统一框架将鲁棒性挑战组织成三个相互关联的支柱,这些支柱共享共同的原则,同时需要专门的解决方案。系统级故障解决所有机器学习计算背后的物理基础可靠性问题,从瞬态宇宙射线效应到永久性硬件退化。输入级攻击包括通过对抗性示例和数据中毒技术故意操纵模型行为的尝试。环境变化代表部署条件的自然演变,通过分布漂移和概念变化挑战静态模型假设。

在这三个支柱中,稳健人工智能系统实施检测和监控的通用原则,以在影响系统行为之前识别威胁,优雅降级以在压力下保持核心功能,以及根据检测到的条件调整系统行为的自适应响应。这些原则在支柱类型之间表现不同,但为构建全面的稳健性解决方案提供了一个统一的基础。

稳健人工智能的实用实施需要在整个机器学习(ML)管道中实现集成,从数据收集到部署和监控。硬件容错机制必须与对抗性防御和漂移检测系统协调一致,以提供全面保护。这个稳健性基础为第十三章中详细说明的操作框架提供了必要的可靠性保证,在这些框架中,这些容错系统将得到部署、监控和维护。如果没有在这里开发的综合可靠性机制,下一章中的操作工作流程将缺乏生产部署所需的基本弹性。

表 16.7 提供了一个实用的参考,将三个主要故障类别映射到它们的主要检测和缓解策略,作为实施全面稳健性解决方案的工程指南:

表 16.7:稳健性策略参考:将故障类别映射到它们的主要检测和缓解方法的一个实用映射,为工程师提供了一个系统框架,用于在稳健人工智能的三个支柱上实施全面的稳健性解决方案。

故障类别 检测方法 缓解策略
系统级别 ECC 内存 冗余(TMR/DMR)
故障 BIST(内置自检)看门狗定时器电压/温度监控 检查点硬件冗余错误纠正码
输入级别 输入净化 对抗性训练
攻击 异常检测统计测试行为分析 防御蒸馏输入预处理模型集成
环境 统计监控(MMD,PSI) 持续学习
变化 分布比较性能退化跟踪概念漂移检测 模型重新训练自适应阈值集成方法

关键要点

  • 稳健人工智能系统必须解决三个相互关联的威胁类别:系统级故障、输入级攻击和环境变化。

  • 检测、优雅降级和自适应响应的通用原则适用于所有威胁类型,同时需要专门的实现。

  • 硬件可靠性直接影响机器学习性能,单比特错误能够使模型精度降低 10-50%。

  • 现实世界的稳健性需要在整个机器学习管道中实现集成,而不是孤立的保护机制。

  • 现代人工智能部署需要系统性的稳健性评估和缓解方法

在这些稳健性基础上,以下章节将探讨可信赖人工智能系统的互补方面。隐私和安全考虑因素(第十五章)在稳健部署基础设施上增加了额外的运营要求,需要专门的技术来保护敏感数据同时保持系统可靠性。这里开发的检测和应对威胁的原则为隐私保护和安全人工智能系统设计提供了基础模式,创建了适用于不同环境和应用的全面框架,以实现可信赖人工智能的部署。

构建稳健的人工智能系统需要在整个开发过程中嵌入稳健性考虑,从初始设计到部署和维护,通过第十二章中详细说明的系统评估方法进行验证,并与第十七章中提到的负责任人工智能原则保持一致。在自动驾驶汽车、医疗设备和基础设施系统等关键应用中,需要采取主动方法来预测故障模式并实施广泛的安全保障措施。这一挑战不仅涉及单个组件,还包括系统级交互,需要确保在现实世界部署中遇到的各种和不断变化条件下可靠运行的综合方法,同时考虑第十八章中涵盖的稳健系统设计的可持续性影响。


负责任的 AI

DALL·E 3 提示:描绘一个未来场景中的负责任 AI 插图,背景是宇宙:一只或几只人类手在培育一株幼苗,这株幼苗长成了一棵 AI 树,象征着神经网络。树上有数字分支和叶子,类似于神经网络,以表示 AI 的互联性。背景描绘了一个未来宇宙,其中人类和具有通用智能的动物和谐合作。场景捕捉了 AI 作为幼苗的初始培育,强调 AI 技术与人类和宇宙的和谐发展。

目的

为什么负责任的 AI 实践已经从可选的伦理考量转变为强制性的工程要求,这些要求决定了系统的可靠性、法律合规性和商业可行性?

在现实世界环境中部署的机器学习系统面临严格的可靠性要求,这些要求超出了算法准确性。有偏见的预测会引发法律责任,不透明的决策会阻止监管批准,不可问责的系统会通不过审计,不可解释的输出会损害用户信任。这些运营现实将负责任的 AI 从哲学理想转变为具体的工程约束,决定了系统是否可以在生产环境中部署、维护和扩展。负责任的 AI 实践提供了系统性的方法,用于构建符合监管要求、通过第三方审计、保持用户信心并在不同人群和环境中可靠运行的系统。现代机器学习工程师必须将偏差检测、可解释性机制、问责制框架和监督系统作为核心架构组件进行整合。将负责任的 AI 视为一个工程学科,能够构建在日益监管的部署环境中既实现技术性能又具有运营可持续性的系统。

学习目标

  • 将公平性、透明度、问责制、隐私和安全定义为可衡量的工程要求,这些要求限制了系统架构、数据处理和部署决策

  • 使用 Fairlearn 等工具实施偏差检测技术,以识别模型性能在不同人口群体中的差异,并评估包括人口比例和均衡机会在内的公平性指标

  • 应用隐私保护方法,包括差分隐私、联邦学习和机器反学习,以保护敏感数据同时保持模型效用

  • 使用 SHAP、LIME 和 GradCAM 等后处理技术生成模型预测的解释,同时评估它们在不同模型架构中的计算成本和可靠性

  • 分析部署环境(云、边缘、移动、TinyML)如何施加架构限制,限制了哪些负责任的 AI 保护在技术上可行

  • 评估相互竞争的负责任的 AI 原则之间的权衡,认识到当数学不可能定理阻止同时优化所有公平性标准时

  • 设计组织结构和治理流程,将负责任的 AI 原则转化为操作实践,包括角色定义、升级路径和问责机制

  • 评估负责任的 AI 技术的计算开销,并确定实施资源障碍

负责任的 AI 简介

2019 年,亚马逊在发现其基于历史简历数据的招聘算法系统地惩罚女性候选人后,取消了该算法(Dastin 2022)。虽然该系统在技术上看似复杂,但它已经学会了过去成功的申请者主要是男性,这反映了历史性别偏见,而不是基于能力的资格。该模型在统计上是最优的,但在伦理上却是灾难性的,这表明技术正确性可以与技术严重的社会危害共存。

这个事件说明了负责任的 AI 的核心挑战:系统可能在算法上合理,同时持续加剧不公,优化目标的同时破坏价值观,满足性能基准的同时却未能满足社会需求。这个问题不仅超越了个人偏见,还涵盖了影响数十亿人日常生活的系统中的透明度、问责制、隐私和安全等系统性问题。

机器学习系统工程的学科已经发展到解决这一关键转折点,即技术卓越与社会深远影响相交。从第三章的算法基础,从第八章的优化技术,以及从第二章的部署架构,建立了为具有非凡能力和范围的系统所需的计算基础设施。然而,随着这些系统在医疗诊断、司法决策、就业筛选和金融服务中承担越来越重要的角色,仅仅技术性能指标是否足够的问题引起了质疑。当代机器学习系统提出了一个基本挑战:它们可能在统计性能上达到最优,同时产生与公平性、透明度和社会正义相冲突的结果。

本章从第五部分“可信系统”开始,通过扩展我们的分析框架,从技术正确性扩展到包括系统是否值得社会信任和接受这一规范性问题。从弹性系统的发展中建立了一个重要的区别:弹性 AI 通过对抗性攻击和硬件故障来应对系统完整性的威胁,而负责任的 AI 确保正常运行的系统产生符合人类价值观和集体福祉的结果。

处理这一挑战的学科将抽象的伦理原则转化为具体的技术约束和设计要求。类似于安全协议需要特定的架构决策和监控基础设施,负责任的 AI 需要通过可量化的技术机制和可验证的系统属性来实施公平性、透明度和问责制。这代表了工程方法论的扩展,将规范性要求作为一级设计考虑因素,而不仅仅是将哲学概念应用于工程实践。

软件工程为此学科的发展提供了先例。早期的计算系统优先考虑功能正确性,关注程序是否为给定的输入生成准确的输出。随着系统复杂性和社会整合度的提高,该领域发展了可靠性工程、安全保证和可维护性分析的方法。当代负责任的 AI 实践代表了平行的学科成熟,将系统化的工程方法扩展到包括算法决策的社会和伦理维度。

这种扩展反映了当代机器学习部署前所未有的规模。这些系统现在调解着影响数十亿人的决策,包括信贷分配、医疗诊断、教育评估和刑事司法程序。与表现为系统崩溃或数据损坏的传统软件故障不同,负责任的 AI 故障可能会持续系统性的歧视,损害民主机构,并侵蚀公众对有益技术的信心。该领域需要展示技术专业性和伦理问责制以及社会责任的系统。

负责任的 AI是系统工程学科,系统地转化伦理原则具体的设计要求可衡量的系统属性,将其确立为机器学习系统开发中的一级约束

负责任的 AI 构成一个具有四个相互关联维度的系统化工程学科。本章探讨了伦理原则如何转化为可衡量的系统需求,分析了检测和减轻有害算法行为的技术方法,解释了为什么负责任的 AI 不仅限于个别系统,还包括更广泛的社会技术动态,并针对组织和管理环境中的实际实施挑战进行了讨论。

学生必须培养技术能力和情境理解。学生将学习实施偏差检测算法和隐私保护机制,同时理解为什么技术解决方案需要组织治理结构和利益相关者参与流程。这包括增强系统可解释性和问责制的方法,同时考察无法由算法方法明确解决的竞争性规范性价值之间的紧张关系。

本章构建了同时解决即时功能需求和长期社会考量的工程系统所需的解析框架。这个框架将负责任的 AI 视为不是应用于现有系统的补充约束,而是当代人工智能发展中良好工程实践的基本原则。

导航本章

从四个互补的视角探讨负责任的 AI 方法,每个视角对于构建可信赖的机器学习系统都是必不可少的:

1. 原则与基础 (第 17.2 节 至 第 17.4 节):定义了负责任 AI 系统应实现的目标。介绍了公平性、透明度、问责制、隐私和安全作为工程要求。考察了这些原则如何在云、边缘、移动和 TinyML 部署中有所不同,揭示了理想与运营约束之间的紧张关系。

2. 技术实施 (第 17.5 节):介绍使负责任的 AI 成为可能的具体技术。包括识别偏差和漂移的检测方法、包括隐私保护和对抗性防御在内的缓解技术,以及用于可解释性和监控的验证方法。这些方法将抽象原则转化为可衡量的系统行为。

3. 社会技术动态 (第 17.6 节):说明仅技术正确性是不够的。考察系统与环境之间的反馈循环、人机协作挑战、竞争性利益相关者价值、可争议机制和制度治理结构。负责任的 AI 存在于算法、组织和社会的交汇点。

4. 实施现实 (第 17.7 节 至 第 17.8 节):考察原则如何转化为实践。解决组织障碍、数据质量约束、竞争性目标、可扩展性挑战和评估差距。以自主系统的 AI 安全和价值对齐考虑作为结论。

本章内容全面,因为负责任的人工智能涉及工程、伦理、政策和组织设计。使用章节结构导航到与您当前需求最相关的主题,但请认识到,有效的负责任人工智能实施需要整合所有四个视角。仅技术解决方案无法解决价值冲突;没有技术实施的伦理原则仍然只是愿望;没有组织支持的个人干预将失败。

这些原则和实践为构建既满足当前需求又促进长期社会福祉的人工智能系统奠定了基础。通过将公平、透明度、问责制、隐私和安全视为工程要求而不是事后考虑,从业者发展了确保机器学习系统造福社会同时最小化危害所需的技术技能和组织方法。这种负责任人工智能的系统方法将抽象的伦理原则转化为具体的设计约束,指导机器学习生命周期的每个阶段。

核心原则

负责任的人工智能指的是开发和部署旨在维护伦理原则并促进社会有益成果的机器学习系统。这些原则不仅作为政策理想,而且作为对系统设计、实施和治理的具体约束。

公平性指的是机器学习系统不因种族、性别或社会经济地位等受保护属性 1 歧视个人或群体的期望。这一原则既包括统计指标,也包括更广泛的关于公平、正义和结构偏见的规范性关切。公平性标准的正式数学定义在第 17.3.2 节中进行了详细探讨。

实施负责任人工智能系统的计算资源需求产生了重大的公平性考虑,这些考虑超越了个人系统设计。这些挑战包括部署限制和实施障碍中考察的进入障碍和环境正义关切。

可解释性涉及利益相关者解释模型如何产生其输出的能力。这包括理解单个决策是如何做出的以及模型的整体行为模式。解释可以在决策之后生成(称为事后解释 2)以详细说明推理过程,或者它们可以内置到模型的设计中以实现透明操作。在第四章(ch010.xhtml#sec-dnn-architectures)中讨论的神经网络架构在固有的可解释性方面存在显著差异,深度网络通常更难以解释。可解释性对于错误分析、合规性和建立用户信任至关重要。

透明度指的是关于人工智能系统构建、训练、验证和部署的开放性。它包括数据来源、设计假设、系统限制和性能特征的披露。虽然可解释性侧重于理解输出,但透明度涉及系统的更广泛生命周期。

问责制指的是个人或组织因人工智能系统的结果而承担责任的方式。它涉及可追溯性、文档记录、审计和纠正伤害的能力。问责制确保人工智能故障不被视为抽象的故障,而是具有现实世界影响的后果。

价值一致性 3 是指人工智能系统应追求与人类意图和道德规范一致的目标。在实践中,这涉及技术挑战,包括奖励设计和约束规范,以及更广泛的问题,即哪些价值观被代表和执行。

人类监督强调人类判断在监督、纠正或停止自动化决策中的作用。这包括操作期间的人类在回路 4,以及确保人工智能使用始终符合社会价值观和现实世界复杂性的组织结构。

其他重要原则,如隐私和鲁棒性,需要专门的技術实现,这些实现与系统设计中的安全和可靠性考虑相交。

在机器学习生命周期中整合原则

负责任的机器学习始于一组基础原则,包括公平性、透明度、问责制、隐私和安全,这些原则定义了人工智能系统如何以道德和可预测的方式行为。这些原则不是抽象的理想或事后想法;它们必须转化为具体的约束,以指导模型的训练、评估、部署和维护。

在实践中实施这些原则需要理解每个原则如何为系统行为设定具体期望。公平性关注模型如何对待不同的子群体以及如何应对历史偏见。可解释性确保模型决策可以被开发者、审计员和最终用户理解。隐私管理收集的数据以及如何使用这些数据。问责制定义了在整个系统生命周期中如何分配、跟踪和执行责任。安全性要求模型即使在不确定或不断变化的环境中也能可靠地运行。

表 17.1:负责任的人工智能生命周期:在整个机器学习系统生命周期中嵌入公平性、可解释性、隐私、问责制和鲁棒性,从数据收集到监控,确保这些原则成为架构承诺而不是事后考虑。该表将这些原则映射到特定的开发阶段,揭示了主动集成如何解决潜在风险并促进可信赖的人工智能系统。

原则 数据收集 模型训练 评估 部署 监控
公平性 代表性抽样 偏差感知算法 组级指标 阈值调整 子组性能
可解释性 文档标准 可解释架构 模型行为分析 面向用户的解释 解释质量日志
透明度 数据源跟踪 训练文档 性能报告 模型卡片 变更跟踪
隐私 同意机制 隐私保护方法 隐私影响评估 安全部署 访问审计日志
问责制 管理框架 决策日志 审计跟踪创建 覆盖机制 事件跟踪
鲁棒性 质量保证 鲁棒训练方法 压力测试 故障处理 性能监控

这些原则共同定义了机器学习系统如何表现出负责任的行为,不是作为孤立的功能,而是作为嵌入在整个生命周期中的系统级约束。表 17.1 提供了一个结构化的视角,展示了关键原则,包括公平性、可解释性、透明度、隐私、问责制和鲁棒性,如何映射到 ML 系统开发的各个主要阶段:数据收集、模型训练、评估、部署和监控。一些原则(如公平性和隐私)从数据开始,而其他原则(如鲁棒性和问责制)在部署和监督期间最为重要。尽管可解释性通常在评估和用户交互期间被强调,但它也支持模型调试和设计时验证。这种全面的映射强化了负责任的 AI 不是事后考虑,而是一个多阶段架构承诺的观点。

资源需求和公平影响

实施负责任的 AI 原则需要计算资源,这些资源在技术和部署环境中差异很大。这些资源需求产生了多方面的公平考虑,不仅超越了单个组织,还涵盖了更广泛的社会和环境正义问题。计算预算有限的组织可能无法实施全面的负责任 AI 保护,这可能导致对道德保障的访问不平等。最先进的 AI 系统越来越需要专用硬件和高带宽连接,这系统地排除了农村社区、发展中国家和资源受限用户访问先进 AI 能力。

环境正义问题通过工程现实加剧了这些访问障碍,即负责任的 AI 技术需要巨大的能源成本。训练差分隐私模型需要额外的 15-30%计算周期;实时公平监控增加了 10-20 毫秒的延迟和持续的 CPU 开销;SHAP 解释需要 50-1000 倍的正常推理计算。这些计算需求直接转化为基础设施需求:一个为 1000 万用户提供负责任 AI 功能的繁忙系统,与不受限制的模型相比,需要大量的数据中心容量。

这种计算基础设施的地理分布创造了工程师在设计系统时必须考虑的系统不平等。支持人工智能工作负载的数据中心集中在电力成本较低且法规有利的地区,这些地区通常与低收入社区相关,这些社区在污染、热量产生和电网压力增加的同时,往往缺乏访问这些设施所提供的 AI 服务所需的高带宽连接。这形成了一个反馈循环,其中计算公平不仅取决于算法设计,还取决于影响系统性能和社区福利的基础设施位置决策。具体技术的详细性能特征在第 17.5 节中进行了考察。

透明性和可解释性

本节详细探讨了具体原则。机器学习系统经常因缺乏可解释性而受到批评。在许多情况下,模型作为不透明的“黑箱”运行,产生用户、开发者和监管者难以理解或审查的输出。这种不透明性构成了信任的巨大障碍,尤其是在高风险领域,如刑事司法、医疗保健和金融,在这些领域,问责制和申诉权非常重要。例如,在美国用于评估再犯风险的COMPAS算法被发现存在种族偏见 5。然而,系统的专有性质以及有限的解释性工具访问权限阻碍了调查或解决该问题的努力。

可解释性是指理解模型如何产生预测的能力。它包括两种解释:局部解释6,它阐明个别预测;以及全局解释7,它描述模型的一般行为。相比之下,透明性涵盖了关于更广泛系统设计和操作的开放性。这包括数据来源、特征工程 8、模型架构、训练程序、评估协议和已知限制的披露。透明性还涉及记录预期用例、系统边界和治理结构。

可解释性和透明度的重要性不仅限于技术考虑,还涉及法律要求。在许多司法管辖区,这些原则是法律义务,而不仅仅是最佳实践。例如,欧盟的通用数据保护条例(GDPR)要求个人获得有关对其产生重大影响的自动化决策逻辑的有意义信息 9。在其他领域也出现了类似的监管压力,这加强了将可解释性和透明度视为核心架构要求的需求。

实施这些原则需要预见不同利益相关者的需求,其相互竞争的价值和优先事项在第 17.6.3 节中得到全面审查。因此,为了可解释性和透明度而进行设计,需要决定如何在系统生命周期中呈现相关信息。

这些原则也支持系统在时间上的可靠性。随着模型的重训练或更新,可解释性和可追溯性的机制允许检测到意外行为,进行根本原因分析,并支持治理。透明度和可解释性,当嵌入到系统的结构和操作中时,为信任、监督和与机构和社会期望的协调提供了基础。

机器学习中的公平性

机器学习中的公平性提出了复杂挑战。如第 17.2 节所确立的,公平性要求自动化系统不会不成比例地损害受保护群体。因为这些系统是在历史数据上训练的,它们容易复制和放大数据中嵌入的系统偏见 10。如果没有仔细设计,机器学习系统可能会无意中加强社会不平等,而不是减轻它们。

一个广泛研究过的例子来自医疗保健领域。一种用于在美国医院分配护理管理资源的算法被发现系统地低估了黑人患者的健康需求(Obermeyer 等人 2019)11。该模型将医疗支出作为健康状况的代理,但由于长期存在的获取和支出差异,黑人患者不太可能产生高额费用。因此,该模型推断他们病情较轻,尽管他们通常有相等或更大的医疗需求。这一案例说明了看似中性的设计选择,如代理变量选择,如何在历史不平等没有得到适当考虑的情况下产生歧视性结果。

实践者需要正式的方法来评估这些持续偏见风险下的公平性。已经开发了一系列正式标准,这些标准量化了模型在由敏感属性定义的群体中的表现。

数学内容先行

在考察正式定义之前,考虑一下基本挑战:一个算法要公平意味着什么?它应该对每个人都同等对待,还是应该考虑不同的基线条件?它应该优化平等的结果、平等的机会还是平等的治疗?这些问题导致不同的数学标准,每个标准都捕捉到公平的不同方面。

以下小节将使用概率符号介绍正式的公平性定义。这些指标(人口比例、均衡机会、机会平等)贯穿于机器学习公平性文献中,并塑造了监管框架。关注理解直觉:每个指标衡量的是什么以及为什么它很重要,而不是数学证明。每个定义之后的具体例子说明了实际应用。如果概率符号不熟悉,从口头描述开始,稍后再回到正式定义。

假设一个模型 h(x)h(x) 预测一个二元结果,例如贷款偿还,让 SS 代表一个敏感属性,具有子组 aabb。一些广泛使用的公平性定义包括:

人口比例平等

此标准要求接收积极预测的概率与群体成员资格无关。形式上,如果模型满足以下条件,则认为模型满足人口比例平等:P(h(x)=1S=a)=P(h(x)=1S=b) P\big(h(x) = 1 \mid S = a\big) = P\big(h(x) = 1 \mid S = b\big)

这意味着模型在由敏感属性 SS 定义的子组中,以相同的比率分配有利的结果,例如贷款批准或治疗推荐。

在医疗保健的例子中,人口统计学上的平等会询问黑人患者和白人患者是否以相同的比率被推荐接受护理,无论他们的潜在健康需求如何。虽然从平等获取的角度来看这似乎是公平的,但它忽略了医疗状况和风险的实际差异,可能在需求分布不均匀的情况下过度纠正。

这种限制促使人们提出更细致的公平性标准。

平等机会

此定义要求模型在给定真实标签的情况下,其预测与组别条件独立。具体来说,真实阳性和假阳性率必须在组间相等:P(h(x)=1S=a,Y=y)=P(h(x)=1S=b,Y=y),for y{0,1}. P\big(h(x) = 1 \mid S = a, Y = y\big) = P\big(h(x) = 1 \mid S = b, Y = y\big), \quad \text{for } y \in {0, 1}.

即,对于每个真实的输出 Y=yY = y,模型应在组 S=aS = aS=bS = b 之间产生相同的预测分布。这意味着对于具有相同真实输出的个体,无论他们是否获得阳性结果,模型在组间应表现出相似的行为。这确保了错误(包括漏检和错误的阳性)在组间均匀分布。

在医疗案例中应用,等概率确保具有相同实际健康需求(真实标签YY)的患者,无论种族如何,都有同等的机会被正确或错误地推荐。原始算法通过低估与白人患者健康状况相当或更差的黑人患者的推荐,违反了这一准则,突显了真实阳性率的不平等。

一个不那么严格的准则专注于积极的成果。

机会均等

等概率的放宽,这一准则仅关注真实阳性率。它要求,在应获得积极结果的个人中,获得一个的概率在各个群体中是相等的:P(h(x)=1S=a,Y=1)=P(h(x)=1S=b,Y=1). P\big(h(x) = 1 \mid S = a, Y = 1\big) = P\big(h(x) = 1 \mid S = b, Y = 1\big).

这确保了具有资格的个人,无论其群体成员身份如何,模型都会平等对待,即Y=1Y = 1

在我们的运行示例中,这一措施将确保在需要护理的患者中,黑人和白人个体都有同等的机会被模型识别。在美国医院系统中,算法使用医疗保健支出作为代理变量导致未能满足这一标准:由于历史支出较低,具有重大健康需求的黑人患者不太可能获得护理。

考虑一个在 200 名申请人中评估的简化贷款审批模型,这些申请人平均分为两个人口群体(A 组和 B 组)。该模型做出预测,我们后来观察到实际的还款结果:

A 组(100 名申请人):

  • 模型批准:70 名申请人(40 名实际上会还款,30 名会违约)

  • 模型拒绝:30 名申请人(5 名实际上会还款,25 名会违约)

B 组(100 名申请人):

  • 模型批准:40 名申请人(30 名实际上会还款,10 名会违约)

  • 模型拒绝:60 名申请人(20 名实际上会还款,40 名会违约)

计算人口统计学上的平等: P(h(x)=1S=A)=70100=0.70P(h(x)=1S=B)=40100=0.40\begin{gather} P(h(x) = 1 \mid S = A) = \frac{70}{100} = 0.70 \ P(h(x) = 1 \mid S = B) = \frac{40}{100} = 0.40 \end{gather}

差异: 0.700.40=0.300.70 - 0.40 = 0.30(30 个百分点的差距)

该模型通过以显著更高的比率批准 A 组申请人,无论其实际还款能力如何,违反了人口统计学上的平等。

计算机会平等(真正率):

在实际会还款的申请人中(Y=1):P(h(x)=1S=A,Y=1)=4040+5=40450.89P(h(x)=1S=B,Y=1)=3030+20=3050=0.60\begin{gather} P(h(x) = 1 \mid S = A, Y = 1) = \frac{40}{40 + 5} = \frac{40}{45} \approx 0.89 \ P(h(x) = 1 \mid S = B, Y = 1) = \frac{30}{30 + 20} = \frac{30}{50} = 0.60 \end{gather}

差异: 0.890.60=0.290.89 - 0.60 = 0.29(真正例率 29 个百分点差距)

该模型违反了机会平等原则:在那些会还款的合格申请人中,A 组成员被正确批准的比率是 89%,而 B 组成员只有 60%被批准。

计算均衡概率(真正例率 + 假正例率):

我们已经计算了真正例率(TPR)。现在计算那些不会还款(Y=0)的申请人的假正例率:P(h(x)=1S=A,Y=0)=3030+25=30550.55P(h(x)=1S=B,Y=0)=1010+40=1050=0.20\begin{gather} P(h(x) = 1 \mid S = A, Y = 0) = \frac{30}{30 + 25} = \frac{30}{55} \approx 0.55 \ P(h(x) = 1 \mid S = B, Y = 0) = \frac{10}{10 + 40} = \frac{10}{50} = 0.20 \end{gather}

该模型还存在着不等的假正例率:它错误地批准了 55%的 A 组成员将会违约,但只有 20%的 B 组成员将会违约。这表明,即使 A 组成员不会还款,模型对 A 组也更“慷慨”。

关键洞见: 该模型违反了所有三个公平性标准。解决一个标准并不意味着自动满足其他标准。事实上,它们可能存在冲突,正如我们接下来将要看到的。

这些公平性标准突显了在定义算法公平性时的紧张关系。

高级主题:不可能性结果

下面讨论的不可能性定理代表了公平性理论中的活跃研究。理解多个公平性标准不能同时满足比数学证明更重要。关键洞见:公平性本质上是一个充满价值判断的工程决策,需要利益相关者的审议,而不是一个具有单一正确解决方案的技术优化问题。这种概念理解对大多数从业者来说就足够了。

这些定义捕捉了公平性的不同方面,通常是不兼容的 12。为了直观理解这一点,想象一所大学希望在招生过程中保持公平。这意味着什么?目标 1(人口比例平等)将是录取学生,使录取班级反映申请者池的统计数据,例如 A 组和 B 组各占 50%。目标 2(平等机会)将是确保在所有合格的申请者中,各群体之间的录取率相同,因此 80%的合格 A 组申请者被录取,80%的合格 B 组申请者被录取。不可能定理表明,您并不总是可以两者兼得。如果一个群体有更多合格的申请者,实现人口比例平等(目标 1)将需要拒绝一些他们的合格申请者,从而违反平等机会(目标 2)。这个问题没有数学上的解决方案;这是关于优先考虑哪种公平性定义的价值判断。满足一个标准可能阻止满足另一个标准,反映了公平性涉及在竞争性规范性目标之间进行权衡的现实。确定优先考虑哪个指标需要仔细考虑应用背景、潜在危害和利益相关者的价值观,如第 17.6.3 节中详细所述。

认识到这些紧张关系,操作系统必须将公平性视为一个约束条件,在整个机器学习生命周期中指导决策。它受到数据收集和表示方式、目标和代理的选择、模型预测的阈值以及反馈机制结构的影响。例如,在排名模型和分类模型之间进行选择可能会在不同群体中产生不同的访问模式,即使使用相同的基础数据。

公平性指标有助于正式化公平目标,但通常仅限于预定义的种群类别。在实践中,这些类别可能过于粗略,无法捕捉到现实世界数据中存在的全部差异。对公平性的原则性方法必须考虑到重叠和交叉身份,确保模型行为在可能事先未明确标记的子群体中保持一致。这一领域最近的研究强调了在广泛的人口切片中预测可靠性的必要性(Hébert-Johnson 等人 2018),强化了公平性必须被视为系统级要求的观点,而不是局部调整。这种对公平性的扩展观点突出了设计架构、评估协议和监控策略的重要性,这些策略支持对模型行为进行更细致、更敏感的评估。

公平性考虑不仅限于算法结果,还包括部署负责任 AI 系统所需的计算资源和基础设施。当能源密集型 AI 基础设施集中在已经处于不利地位的社区时,这些更广泛的公平影响,包括环境正义问题,就会出现 13。

负责任 AI 技术的计算强度创造了一种数字鸿沟,其中对公平、透明和可问责 AI 系统的访问成为经济资源的附属品。实施公平性约束、差分隐私机制和全面的可解释性工具通常会增加计算成本,比无约束模型高出 15-40%。这创造了一种令人担忧的动态,只有拥有大量计算预算的组织才能负担得起部署真正负责任的 AI 系统,而资源受限的部署可能为了效率而牺牲道德保障。结果是,出现了一个双层系统,其中负责任的 AI 成为主要对资源充足的用户和应用可用的特权,可能加剧而不是解决现有的不平等。这些资源限制创造了民主化挑战,而更广泛的影响则创造了数字鸿沟和访问障碍,影响了服务不足的社区。

这些考虑因素指向一个基本结论:公平性是一个系统级属性,它源于数据工程实践、建模选择、评估程序和决策政策的相互作用。它不能孤立于单个模型组件,也不能仅通过事后调整来解决。负责任的机器学习设计需要将公平性视为一个基础约束,这一约束在整个系统的生命周期中指导架构选择、工作流程和治理机制。这种系统级观点扩展到所有负责任的 AI 原则,这些原则在 ML 生命周期中转化为具体的工程要求:公平性要求群体级性能指标和不同人群中的决策阈值;可解释性需要运行时计算预算,梯度方法的成本从 10-50 毫秒到 SHAP 分析的 50-1000 倍不等;隐私包括数据治理、同意机制和生命周期感知的保留策略;问责制需要可追溯性基础设施,包括模型注册、审计日志和人工覆盖机制。

这些原则在整个系统开发过程中相互作用并产生张力。隐私保护技术可能会降低可解释性;公平性约束可能与个性化相冲突;稳健的监控会增加计算成本。《表 17.1》中的表格显示了每个原则如何在数据收集、训练、评估、部署和监控阶段体现,强化了负责任 AI 不是部署后的考虑,而是一种架构承诺的观点。然而,实施这些原则的可行性严重依赖于部署环境:云、边缘、移动和 TinyML 环境各自施加不同的约束,这些约束塑造了哪些负责任 AI 功能在实践中是可实现的。

隐私和数据治理

隐私和数据治理带来的挑战超越了第十五章中提出的威胁模型视角,同时与上述考察的公平性和透明度原则产生了根本性的张力。以安全为重点的隐私询问“我们如何防止未经授权的访问?”负责任的隐私询问“我们是否应该收集这些数据,如果是的话,我们如何在整个系统生命周期中最大限度地减少暴露?”这种更广泛的视角产生了固有的张力:公平性监控需要收集和分析敏感的人口统计数据,可解释性方法可能会揭示训练示例的信息,而全面的透明度可能与个人隐私权相冲突。负责任的 AI 系统必须通过谨慎的设计选择来平衡保护、问责制和效用,以应对这些相互竞争的要求。

机器学习系统通常依赖于大量的个人数据集来支持模型训练并允许个性化功能。这种依赖引入了与用户隐私、数据保护和道德数据管理相关的重大责任。数据的质量和管理,在第六章中介绍,直接影响着实施负责任 AI 原则的能力。负责任的 AI 设计将隐私视为不是辅助功能,而是必须在整个系统生命周期中指导决策的核心约束。

在支持隐私方面,一个核心挑战是数据效用与个人保护之间的固有张力。丰富、高分辨率的数据库可以增强模型的准确性和适应性,但同时也增加了暴露敏感信息的风险,尤其是在数据集汇总或与外部来源关联时。例如,基于对话数据或医疗记录训练的模型已被证明会记住特定细节,这些细节可以通过模型查询或对抗性交互后来检索到(Ippolito 等人 2023)14。

隐私挑战不仅限于明显的敏感数据,还包括看似无害的信息。追踪生理和行为信号的可穿戴设备,包括心率、运动或位置,单个来看可能看似无害,但联合起来可以揭示详细的用户档案。当用户对他们的数据处理、保留或传输的可见性或控制有限时,这些风险会进一步加剧。

解决这些挑战需要将隐私视为一个系统原则,它包括强大的数据治理。这包括定义收集的数据、在什么条件下收集以及以何种程度的同意和透明度收集。在第六章(ch012.xhtml#sec-data-engineering)中讨论的基础数据工程实践为实施这些治理要求提供了技术基础设施。负责任的治理需要关注标签实践、访问控制、日志基础设施以及符合司法管辖要求。这些机制旨在限制数据在系统中的流动,并记录其使用的问责制。

为了支持该领域的结构化决策,图 17.1 展示了一个简化的流程图,概述了数据管道早期阶段的关键隐私检查点。它突出了核心保护措施,如同意获取、加密和差分隐私应该应用的地方。实际的实现往往涉及更微妙的权衡和情境敏感的决策,但此图提供了一个识别隐私风险出现位置以及如何通过负责任的设计选择来缓解这些风险的框架。

图片

图 17.1:隐私感知数据流:负责任的数据治理需要在机器学习管道的整个过程中采取主动保护措施,包括在关键决策点应用同意获取、加密和差分隐私机制,以减轻隐私风险并确保问责制。此图结构化了这些考虑因素,使设计者能够识别潜在漏洞并在数据收集、处理和存储期间实施适当的控制。

弱数据治理的后果已经得到了充分记录。在理解不充分或存在偏差的数据集上训练的系统可能会持续存在结构性不平等或无意中暴露敏感属性。在前面介绍的 COMPAS 示例中,数据来源和使用方面的不透明性阻止了有效的评估或纠正。在临床应用中,数据集通常反映诸如缺失值或人口统计偏差等伪影,这些伪影会损害性能和隐私。没有明确的数据质量和文档标准,这些漏洞会变得系统化。

隐私不仅仅是孤立算法或数据处理者的关注点;它必须作为系统结构属性来处理。关于同意收集、数据保留、模型设计和可审计性的决策都有助于机器学习管道的隐私状况。这包括在训练期间以及推理和持续运行期间预见风险的需要。如成员推理攻击 15 等威胁强调了将隐私保障嵌入到模型架构和界面行为中的重要性。

法律框架越来越多地反映了这种理解。例如,GDPRCCPA16 和 APPI 等法规对数据最小化、目的限制、用户同意和删除权等方面提出了具体义务。这些要求将道德期望转化为可执行的设计约束,强化了在系统开发中将隐私视为核心原则的必要性。

这些隐私考虑最终汇聚成一个全面的方法:机器学习中的隐私是一个系统级的承诺。它需要技术和组织领域的协调,以确保数据使用与用户期望、法律要求和社会规范相一致。而不是将隐私视为与功能平衡的约束,负责任的设计从一开始就通过告知架构、塑造界面和限制模型构建、更新和部署的方式将隐私整合进去。

安全性和鲁棒性是负责任人工智能的另外两个关键维度。

安全性和鲁棒性

安全性和鲁棒性,在第十六章(ch022.xhtml#sec-robust-ai)中作为解决硬件故障、对抗攻击和分布变化的特性被引入,也作为负责任人工智能原则,其作用不仅限于威胁缓解。技术鲁棒性确保系统在对抗条件下能够生存;负责任鲁棒性确保系统即使在技术上功能正常的情况下,也能以符合人类期望和价值观的方式行事。一个模型可能对位翻转和对抗性扰动具有鲁棒性,但如果它在边缘情况下不可预测地失败或优化与用户福祉不一致的目标,那么它可能仍然表现出不适合部署的不安全行为。

机器学习中的安全性指的是在正常条件下模型行为可预测,以及在压力或不确定性下以可控、非灾难性的方式失败的保证。与安全性密切相关的是鲁棒性,它关注模型在输入、环境或系统配置变化的情况下维持稳定和一致性能的能力。这些属性共同构成了在安全关键领域负责任部署的基础,在这些领域,机器学习输出直接影响到物理或高风险决策。

在实践中确保安全和鲁棒性需要预测系统可能遇到的所有条件范围,并设计出在训练分布之外仍能保持可靠性的行为。这包括不仅管理输入的变异性,还要解决模型如何应对意外相关性、罕见事件和故意诱导失败尝试的问题。例如,广泛报道的自动驾驶系统故障揭示了在对象检测方面的局限性或过度依赖自动化如何导致有害后果,即使模型在正常测试条件下表现良好。

一种典型的失败模式源于对抗性输入 17:精心构造的扰动对人类看似无害,但会导致模型输出错误或有害的预测 (Szegedy 等人 2013b)。这种漏洞不仅限于图像分类;它们在包括音频、文本和结构化数据在内的多种模态中都有观察到,并揭示了在高维空间中学习表示的脆弱性。解决这些漏洞需要包括对抗性防御和鲁棒性技术在内的专门方法。这些行为凸显了鲁棒性不仅需要在训练期间考虑,而且作为系统与真实世界复杂性交互的全球属性。

相关的挑战是分布偏移:训练数据与部署中遇到的条件之间不可避免的错配。无论是因为季节性、人口统计变化、传感器退化还是环境变化,这种偏移甚至在没有对抗性操作的情况下也可能降低模型可靠性。解决分布偏移挑战需要系统地检测和适应变化条件的方法。在分布偏移下的失败可能会通过下游决策传播,引入超出模型准确度本身的安全风险。在医疗保健、金融或交通等领域,这些风险并非假设性的;它们对个人和机构都有真实的影响。

负责任的机器学习设计将鲁棒性视为系统要求。解决它需要不仅仅是提高单个模型性能。它涉及设计能够预测不确定性、揭示其局限性并在预测信心低时支持回退行为的系统。这包括设置信心阈值、支持放弃决策和将人工监督集成到操作流程中的做法。这些机制对于构建能够优雅退化而不是无声或不可预测地失败的系统至关重要。

这些针对单个模型的考虑延伸到更广泛的系统要求。安全和鲁棒性也在架构和组织层面提出了要求。关于如何监控模型、如何检测失败以及如何管理更新的决策都会影响系统是否能够有效地应对变化条件。负责任的设计要求将鲁棒性视为孤立模型的一个属性,而不是塑造机器学习系统整体行为的约束。

这种关于安全和鲁棒性的系统级视角引发了责任和治理的问题。

责任与治理

机器学习中的责任是指识别、归因和解决自动化决策后果的能力。它不仅超越了诊断失败,还确保系统行为的责任明确分配,损害可以得到补救,并且通过监督和机构程序维护道德标准。没有这样的机制,即使是有良好意图的系统也可能在没有补救措施的情况下造成重大伤害,损害公众信任并侵蚀合法性。

与责任通常由明确定义的开发者或操作者承担的传统软件系统不同,机器学习中的责任是分散的。模型输出受到上游数据收集、训练目标、管道设计、界面行为和部署后反馈的影响。这些相互关联的组件通常涉及技术、法律和组织领域的多个参与者。例如,如果招聘平台产生有偏见的成果,责任可能不仅在于模型开发者,还在于数据提供者、界面设计师和部署机构。负责任的设计要求这些关系被明确映射和治理。

管理不善可能会阻碍机构识别或纠正有害的模型行为。谷歌流感趋势未能预测分布变化和反馈循环的失败,说明了模型假设和更新政策的透明度不足如何会阻碍纠正措施。在没有对系统设计和数据整理的可见性情况下,外部利益相关者缺乏评估其有效性的手段,这导致了模型最终被停止使用。

法律框架越来越反映了对可问责设计的必要性。例如,伊利诺伊州人工智能视频面试法案欧盟人工智能法案等法规对高风险应用中的透明度、同意、文档和监督提出了要求。这些政策不仅将问责制嵌入到系统产生的结果中,还嵌入到支持其使用的操作程序和文档中。内部组织变革,包括引入公平审计和在定向广告系统中实施使用限制,展示了监管压力如何催化治理结构的结构性改革。

为可问责设计而设计意味着在系统生命周期的每个阶段都支持可追溯性。这包括记录数据来源、记录模型版本、启用人工干预,并保留足够的日志以供事后分析。例如,模型卡片18 和数据集数据表19 等工具展示了使系统行为可解释和可审查的实践。然而,问责制并不仅仅是文档;它还需要反馈、争议和纠正的机制。

在组织内部,治理结构有助于正式化这一责任。伦理审查流程、跨职能审计和模型风险委员会为预测下游影响和应对新兴问题提供了论坛。这些结构必须由允许用户提出争议和开发者提供更正的基础设施来支持。例如,允许解释或用户发起审查的系统有助于弥合模型逻辑与用户体验之间的差距,尤其是在错误影响重大的领域。

架构决策也发挥着作用。接口可以设计成在适当的时候揭示不确定性、允许升级或暂停自动化操作。日志和监控管道必须配置为检测道德漂移的迹象,如子群体间的性能下降或未预见的反馈循环。在分布式系统中,由于难以保持统一的可观察性,问责制必须通过如安全协议、更新约束或可信组件等架构保障来嵌入。

治理并不意味着集中控制。相反,它涉及以透明、可操作和可持续的方式分配责任。技术团队、法律专家、最终用户和机构领导者都必须能够访问评估系统行为和必要时进行干预所需的工具和信息。随着机器学习系统变得更加复杂并嵌入重要基础设施,问责制必须相应地扩展,成为架构和流程中的基础性考虑,而不是部署后的反应性层。

尽管有这些治理机制,有意义的问责制仍面临挑战:区分基于合法因素的决策与可能延续历史偏见的虚假相关性。这一挑战需要仔细关注数据质量、特征选择和持续监控,以确保自动化决策反映公平和合理的推理,而不是来自有偏历史数据的有问题模式。

上述原则和技术为负责任的 AI 提供了概念和技术基础,但它们的实际实施在很大程度上取决于部署架构。云系统可以支持复杂的 SHAP 解释和实时公平性监控,但 TinyML 设备必须依赖于静态可解释性和编译时隐私保证。边缘部署可以实现本地隐私保护,但限制了全球公平性评估。这些架构限制不仅仅是实现细节;它们从根本上塑造了不同用户和应用可访问的负责任的 AI 保护。

部署环境中的负责任 AI

由于计算、连接和治理方面的不同限制,负责任的 AI 原则在不同部署环境中表现出不同的形态。云系统支持全面的监控和复杂的可解释性方法,但通过数据聚合引入了隐私风险。边缘和移动部署提供了更强的数据本地性,但限制了部署后的可观察性。TinyML 系统面临最严重的限制,需要静态验证,没有运行时调整的机会。理解这些特定于部署的权衡,使工程师能够设计在架构约束内最大化负责任的 AI 保护的系统。

这些架构差异引入了权衡,不仅影响技术上的可行性,还影响系统组件间责任分配的方式。资源可用性、延迟限制、用户界面设计以及连接性的存在与否,都在决定是否能在部署环境中一致地实施负责任的 AI 原则中发挥作用。第二章中讨论的部署策略和系统架构为理解如何在这些多样化的环境中实施负责任的 AI 提供了基础。

除了这些技术约束之外,计算资源的地理和经济分布还在负责任的 AI 部署中创造了额外的公平性关注层。高性能 AI 系统通常需要靠近主要数据中心或高速互联网连接,这导致了服务质量差异,这些差异与现有的社会经济不平等密切相关。农村社区、发展中地区和经济不发达地区往往由于网络延迟、带宽有限和距离计算基础设施较远,而体验到 AI 服务质量下降 20。这种基础设施差距意味着,实时可解释性、持续公平性监控和隐私保护计算等负责任的 AI 原则在这些环境中可能实际上无法为用户所获得。

理解部署如何影响公平性、可解释性、安全性、隐私性和责任性在操作层面的布局,对于设计在现实世界环境中稳健、一致和可持续的机器学习系统非常重要。

系统可解释性

需要详细考察的第一个原则是可解释性,其在机器学习系统中的可行性深受部署环境的影响。虽然模型架构和解释技术是重要因素,但系统级约束,包括计算能力、延迟要求、界面设计和数据可访问性,决定了在特定环境中是否可以支持可解释性。这些约束在云平台、移动设备、边缘系统和深度嵌入式部署中差异很大,影响着解释的形式和时机。

在资源丰富的环境中,例如集中式云系统,可以使用 SHAP 和 LIME 等技术生成详细的事后解释,即使它们需要多次正向传递或采样过程。这些方法在延迟敏感或资源受限的环境中通常不切实际,在这些环境中,解释必须是轻量级且快速的。在移动设备或嵌入式系统中,基于显著性图 21 或输入梯度的方法更为可行,因为它们通常只涉及一次反向传递。在 TinyML 部署中,运行时解释可能根本不可行,这使得开发时检查成为确保可解释性的主要机会。模型压缩和优化技术通常与可解释性要求产生矛盾,因为简化模型可能不如其全规模模型可解释。

延迟性和交互性也会影响解释的传递。在实时系统中,例如无人机或自动化工业控制回路,在运行过程中可能没有机会展示或计算解释。记录内部信号或置信度分数以供后续分析成为主要策略。相比之下,具有异步交互的系统,如金融风险评估或医疗诊断,允许在做出决策后提供更深入和延迟的解释。

受众需求进一步塑造设计选择。最终用户通常需要简洁、直观且具有情境意义的解释。例如,一个移动健康应用可能会将预测总结为“睡眠期间心率升高”,而不是引用抽象的模型内部。相比之下,开发者、审计员和监管者通常需要访问归因图、概念激活或决策跟踪以进行调试、验证或合规审查。这些内部解释必须通过面向开发者的接口或嵌入到模型开发工作流程中公开。

可解释性也因系统生命周期而异。在模型开发期间,可解释性支持诊断、特征审计和概念验证。部署后,可解释性转向运行时行为监控、用户沟通和事后分析失败案例。在运行时解释不可行的系统中,例如在 TinyML 中,设计时验证变得尤为重要,需要以预测和减轻下游可解释性失败的方式构建模型。

将可解释性视为系统设计约束意味着从一开始就计划可解释性。它必须与其他部署要求相平衡,包括延迟预算、能源约束和界面限制。负责任的设计分配了足够的资源,不仅用于预测性能,还确保利益相关者可以在部署环境的操作限制内有意义地理解和评估模型行为。

公平性带来了一系列与部署相关的并行挑战。

公平性约束

虽然公平性可以正式定义,但其实施受到特定于部署的约束的影响,这些约束反映了并扩展了与可解释性相关的挑战。数据访问、模型个性化、计算能力、监控或重新训练的基础设施等方面的差异影响了公平性如何在不同系统架构中得到评估、执行和维持。

一个关键决定因素是数据可见性。在集中式环境中,例如云托管平台,开发者通常可以访问带有人口统计注释的大型数据集。这允许使用组级公平性指标、公平性感知训练程序和事后审计。相比之下,去中心化部署,如联邦学习 22 客户端或移动应用程序,通常由于隐私约束或数据碎片化而缺乏访问全局统计数据的权限。设备上的学习方法在公平性评估方面提出了独特的挑战,因为单个设备可能对全球人口分布的可见性有限。在这种情况下,公平性干预措施通常必须在训练或数据集整理期间嵌入,因为部署后的评估可能不可行。

个性化适应机制也影响公平性权衡。向所有用户提供全局模型的系统可能旨在实现人口统计群体间的平等。相比之下,嵌入在健康监测应用程序或设备推荐引擎中的本地适应模型可能旨在实现个体公平,确保对类似用户的一致待遇。然而,在没有明确的相似性指标或代表性用户数据的情况下,执行这一点具有挑战性。基于本地行为重新训练的个性化系统可能会偏向于强化现有的差异,尤其是在边缘化用户的数据稀疏或噪声时。

实时和资源受限的环境带来了额外的限制。嵌入式系统、可穿戴设备或实时控制平台通常无法支持运行时公平性监控或动态阈值调整。在这些情况下,必须通过保守的设计选择来积极解决公平性问题,包括平衡的训练目标和在部署前的静态子群性能评估。例如,部署在低功耗可穿戴设备上的语音识别系统可能需要在设计时确保跨不同口音的稳健性能,因为部署后的重新校准是不可能的。

决策阈值和系统策略也会影响实现的公平性。即使模型在各个群体中的表现相似,如果分数分布不同,在整个用户中应用统一的阈值可能会导致不同的影响。例如,一个移动贷款审批系统,除非考虑特定群体的阈值,否则可能会系统地低估某一群体。这样的决策必须明确推理、证明,并在部署之前嵌入到系统策略逻辑中。

长期公平性还受到反馈动态的影响。包括排名模型、推荐系统和自动化决策流程在内的系统,如果反馈循环没有得到妥善管理,可能会加强历史偏见。例如,一个在偏见历史结果上重新训练时,不成比例地偏爱来自特定机构的候选人的招聘平台可能会放大现有的不平等。减轻这种影响需要治理机制,不仅涵盖训练,还包括部署监控、数据记录和影响评估。

公平性,像其他负责任的 AI 原则一样,不仅限于模型参数或训练脚本。它源于整个系统生命周期中的一系列决策:数据采集、模型设计、策略阈值、重新训练基础设施和用户反馈处理。将公平性视为系统级约束,特别是在受限或去中心化部署中,需要预测可能出现权衡的地方,并确保公平性目标从一开始就嵌入到架构、决策规则和生命周期管理中。

公平性面临的部署挑战也扩展到隐私架构,其中在集中控制和分布式约束之间出现了类似的紧张关系。

隐私架构

机器学习系统中的隐私扩展了公平性的观察模式:它不仅限于保护个人记录;它还受到数据收集、存储、传输以及集成到系统行为中的方式的影响。这些决策与部署架构紧密相连。系统级隐私约束因模型是否托管在云端、嵌入在设备上或分布在使用者控制的多个环境中而大相径庭,每种部署方式都面临着在保持功能的同时最小化风险的不同挑战。

关键的架构区别在于集中式和去中心化数据处理。集中式云系统通常在规模上聚合数据,从而实现高容量的建模和监控。然而,这种聚合增加了数据泄露和监控的风险,使得强大的加密、访问控制和可审计性变得重要。在去中心化部署中,包括移动应用程序、联邦学习客户端和 TinyML 系统,数据保持本地化,降低了中央风险,但限制了全局可观察性。这些环境通常阻止开发者访问用于监控系统性能或执行合规性所需的人口统计或行为统计数据,因此在开发期间需要嵌入隐私保护措施。

在随时间个性化行为的系统中,隐私挑战尤为突出。例如,智能键盘、健身追踪器或语音助手等应用程序会通过处理敏感信号(如位置、打字模式或健康指标)来持续适应用户。即使原始数据被丢弃,训练好的模型也可能保留用户特定的模式,这些模式可以通过推理时间查询恢复。在内存持久且交互频繁的架构中,管理长期隐私需要将保护机制紧密集成到模型的生命周期中。

连接性假设进一步塑造了隐私设计。云连接的系统允许集中执行加密协议和远程删除策略,但可能会引入延迟、能源开销或在数据传输过程中增加暴露。相比之下,边缘系统通常在离线或间歇性运行,使得隐私执行依赖于架构约束,如特征最小化、本地数据保留和编译时混淆。在缺乏持久存储或更新通道的 TinyML 设备上,隐私必须被设计到静态固件和模型二进制文件中,从而在部署后没有调整的机会。

隐私风险也扩展到服务和监控层。如果日志基础设施没有隐私意识,允许日志记录或通过主动学习进行更新的模型可能会无意中泄露敏感信息。例如,成员推理攻击可以通过分析模型输出来揭示用户数据是否包含在训练中。防御此类攻击需要隐私保护措施不仅扩展到训练,还要扩展到界面设计、速率限制和访问控制。

隐私不是由技术机制决定的,而是由用户如何体验系统决定的。一个模型可能符合正式的隐私定义,但如果数据收集不透明或缺乏解释,仍然可能违反用户期望。界面设计起着核心作用:系统必须清楚地传达收集的数据、如何使用这些数据以及用户如何选择退出或撤销同意。在隐私敏感的应用中,如果与用户规范不一致,即使在技术上合规的系统也可能损害信任。

建筑决策因此影响数据生命周期的每个阶段,从获取和预处理到推理和监控的隐私。为了隐私而设计不仅涉及选择安全的算法,还需要根据部署约束、用户需求和法律义务做出原则性的权衡。在高资源环境中,这可能涉及集中执行和政策工具。在受限环境中,隐私必须静态地嵌入到模型设计和系统行为中,通常没有动态监督的可能性。

隐私不是部署后附加的功能。它是一个系统级属性,必须与部署环境的架构现实一起规划、实施和验证。

补充隐私对数据保护的关注,安全性和鲁棒性架构确保系统即使在隐私机制无法防止所有风险的情况下也能表现出可预测的行为。虽然隐私防止未经授权的数据泄露,但安全性确保在压力下系统输出保持可靠并与人类期望一致。

安全性和鲁棒性

在机器学习系统中实现安全性和鲁棒性受到部署架构的紧密影响。在动态、不可预测的环境中部署的系统,包括自动驾驶汽车、医疗机器人和智能基础设施,必须管理实时不确定性并减轻高影响故障的风险。其他系统,如嵌入式控制器或设备上的机器学习系统,需要在资源受限、可观察性有限和恢复机会受限的情况下实现稳定和可预测的操作。在所有情况下,安全性和鲁棒性都是系统级属性,不仅取决于模型质量,还取决于在部署中如何检测、控制和处理故障。

一个反复出现的问题是分布偏移:当部署条件与训练期间遇到的条件不同时。即使输入特征(包括照明、传感器噪声或环境变化)的微小变化,如果没有对不确定性进行建模或监控,也可能显著降低性能。在缺乏运行时监控或回退机制的架构中,这种退化可能直到发生故障才被发现。旨在处理现实世界变化的系统必须设计成能够识别输入是否超出预期分布,并根据情况相应地重新校准或推迟决策。

对抗鲁棒性引入了额外的架构考虑因素。在涉及安全敏感决策的系统(如欺诈检测、内容审查和生物识别验证)中,对抗性输入可能会损害可靠性。缓解这些威胁可能涉及模型级别的防御(例如,对抗性训练、输入过滤)和部署级别的策略,如 API23 访问控制、速率限制或输入验证的冗余。这些保护通常需要在延迟和复杂性之间进行权衡,必须仔细平衡与实时性能要求。

对延迟敏感的部署进一步限制了鲁棒性策略。在自主导航、实时监控或控制系统,必须在严格的时序预算内做出决策。重型鲁棒性机制可能不可行,并且必须预先定义回退操作。许多此类系统依赖于置信度阈值、弃权逻辑或基于规则的覆盖来降低风险。例如,送货机器人只有在行人检测置信度足够高时才会继续前进;否则,它会暂停或转交给人工监督。这些控制策略通常位于学习模型之外,但必须紧密集成到系统的安全逻辑中。

TinyML 部署引入了额外的约束。这些系统部署在具有最小内存、没有操作系统和没有连接性的微控制器上,不能依赖于运行时监控或远程更新。安全和鲁棒性必须通过保守的设计、广泛的预部署测试以及使用本质上简单和可预测的模型来静态地设计。一旦部署,系统必须在传感器退化、电源波动或环境变化等条件下可靠地运行,而不需要外部干预或动态校正。

在所有部署环境中,监控和升级机制对于在长时间内维持稳健行为至关重要。在云或高资源设置中,系统可能包括不确定性估计器、分布变化检测器或人工反馈循环,以检测故障条件并触发恢复。在更受限的环境中,这些机制必须简化或预先计算,但原则依然不变:稳健性不是一次性实现的,而是通过持续识别和应对新兴风险的能力来维持的。

安全和稳健性必须被视为新兴的系统属性。它们取决于输入是如何被感知和验证的,输出是如何被处理的,故障条件是如何被识别的,以及纠正措施是如何被启动的。一个稳健的系统不是避免所有错误的系统,而是一个能够明显、可控、安全地失败的系统。在安全至关重要的应用中,设计这种行为是强制性的,而不是可选的。

这些安全和稳健性考虑导致了对治理和问责制的疑问,这些疑问也必须适应部署限制。

治理结构

在机器学习系统中,问责制必须通过具体的架构选择、界面设计和操作程序来实现。治理结构通过定义谁对系统结果负责、在什么条件下以及通过什么机制负责,使责任变得可执行。这些结构深受部署架构的影响。问责制可追溯、审计和执行的程度在集中式、移动、边缘和嵌入式环境中各不相同,每个环境都为维持系统监督和完整性提出了独特的挑战。

在集中式系统中,例如云托管平台,治理通常由强大的日志记录、版本控制和实时监控基础设施支持。模型注册表、遥测 25 仪表板和结构化事件管道允许团队追踪预测到特定的模型、数据输入或配置状态。

相比之下,边缘部署将智能分布到可能独立于集中式基础设施运行的设备。在车辆、工厂或家庭中的嵌入式模型必须支持本地机制来检测异常行为、触发警报和升级问题。例如,一个工业传感器可能会在其预测置信度下降时标记异常,启动预定义的升级流程。为这种自主性设计需要深思熟虑:工程师必须确定要捕获哪些信号,如何本地存储它们,以及当连接断开或延迟时如何重新分配责任。

移动部署,如个人金融应用或数字健康工具,存在于用户界面和后端系统之间的交叉点。当出现问题的时候,往往不清楚问题出在本地模型、远程服务还是更广泛的用户交互设计上。在这些环境中,治理必须考虑到这种不确定性。有效的责任需要清晰的文档、可访问的救济途径,以及向用户层面展示、解释和质疑自动化决策的机制。理解和申诉结果的能力必须嵌入到界面和周围的服务架构中。

在 TinyML 部署中,治理受到特别限制。设备可能缺乏连接性、持久存储或运行时可配置性,这限制了动态监督或干预的机会。在这里,责任必须通过诸如加密固件签名、固定审计跟踪和部署前训练数据和模型参数的文档等机制静态嵌入。在某些情况下,治理必须在制造或配置期间强制执行,因为部署后无法进行纠正。这些限制使得治理结构的设计与早期架构决策不可分割。

界面在启用责任方面也发挥着重要作用。能够展示解释、暴露不确定性估计或允许用户查询决策历史的系统,使得开发者、审计员或用户能够理解发生了什么以及为什么发生。相比之下,不透明的 API、未记录的阈值或闭环决策系统阻碍了监督。有效的治理需要信息流与利益相关者的需求对齐,包括技术、监管和面向用户方面,以便失败模式是可观察和可修复的。

治理方法还必须适应特定领域的风险和制度规范。高风险应用,如医疗保健或刑事司法,通常涉及法律规定的影响评估和审计跟踪。低风险领域可能更多地依赖内部实践,这些实践由客户期望、声誉担忧或技术惯例塑造。无论在何种情况下,治理都必须被视为系统级设计属性,而不是外部政策叠加。它是通过代码库的结构、部署管道、数据流和决策接口来实现的。

维护不同部署环境中的责任需要规划不仅针对成功,也针对失败。这包括定义如何检测异常、如何分配角色、如何维护记录以及如何进行补救。这些流程必须嵌入到基础设施中:在日志中可追踪、通过接口可强制执行,并能够抵御系统部署环境中的架构限制。

负责任的 AI 治理越来越必须考虑计算基础设施选择的环境和分配影响。部署 AI 系统的组织不仅对算法结果负责,还要对其资源利用模式对环境正义和公平获取的更广泛系统性影响负责,正如在资源需求和公平影响背景下所讨论的。

设计权衡

在不同的部署环境中考察的治理挑战揭示了基本真理:部署环境施加了基本约束,这些约束在负责任的 AI 实施中创造了权衡。机器学习系统不在理想化的孤岛中运行;它们必须在有限资源、严格的延迟要求、不断变化的使用行为和监管复杂性下,在相互竞争的目标之间进行导航。

由于充足的计算和存储资源,基于云的系统通常支持广泛的监控、公平性审计、可解释性服务和隐私保护工具。然而,这些好处通常伴随着集中式数据处理,这引入了与监控、数据泄露和复杂治理相关的风险。相比之下,移动应用程序、边缘平台或 TinyML 部署等设备系统提供了更强的数据本地性和用户控制,但限制了部署后的可见性、公平性工具和模型适应性。

目标之间的紧张关系通常在架构层面变得明显。例如,对于需要实时响应的系统,如可穿戴手势识别或自动制动,在推理过程中无法承担计算详细的可解释性解释。设计者必须选择是否预先计算简化的输出,将解释推迟到异步分析,或在运行时设置中完全省略可解释性。

个性化与公平性之间也出现了冲突。基于本地使用数据对个人进行适应的系统通常缺乏评估人口子群体间差异所需的全球背景。确保个性化预测不会导致系统性的排斥,需要仔细的架构设计,平衡用户级别的适应性与群体级别的公平性和可审计性机制。

隐私性和鲁棒性目标也可能存在冲突。鲁棒的系统通常从记录罕见事件或用户异常数据中受益,以提高可靠性。然而,记录此类数据可能与隐私目标相冲突,或违反数据最小化的法律限制。在敏感行为必须保持本地或加密的环境中,鲁棒性必须预先设计到模型架构和训练过程中,因为事后的改进可能不可行。

负责任的 AI 的计算需求产生了超越技术优化的紧张关系,涉及到环境正义和公平获取的问题。节能部署通常需要简化模型并减少公平性监控能力,这就在环境可持续性和道德保障之间产生了权衡。例如,在联邦学习中实施差分隐私可能会使每台设备的能耗增加 25-40%,这可能会使这种隐私保护对电池受限的设备来说变得不可承受 26。

这些例子说明了更广泛的系统级挑战。负责任的 AI 原则不能孤立考虑。它们相互作用,优化一个可能会限制另一个。适当的平衡取决于部署架构、利益相关者的优先级、特定领域的风险、错误的后果,以及越来越重要的是计算资源需求的环境和分配影响。

负责任的机器学习设计区别于其他设计的不是消除权衡,而是在于清晰和深思熟虑地处理这些权衡。设计决策必须透明化,全面理解部署环境带来的限制以及这些决策对系统行为的影响。

为了综合这些见解,表 17.2 通过比较负责任的 AI 原则如何在云、移动、边缘和 TinyML 系统中体现,总结了架构上的紧张关系。每个设置都根据计算能力、连接性、数据访问和治理可行性等因素,对可解释性、公平性、隐私、安全性和问责制施加不同的限制。

如表 17.2 所示,没有哪个部署环境在所有原则上都占主导地位;每个都做出了不同的妥协。云系统支持复杂的可解释性方法(SHAP、LIME)和集中式公平性监控,但通过数据聚合引入了隐私风险。边缘和移动部署提供了更强的数据本地性,但限制了部署后的可观察性和全球公平性评估。TinyML 系统面临最严重的限制,需要静态验证和编译时隐私保证,没有运行时调整的机会。这些限制不仅仅是技术限制,它们决定了不同用户和应用可访问的负责任 AI 功能,创造了只有资源充足的部署才能负担得起全面保障的公平性问题。理解这些部署限制为在实践中实现负责任的 AI 原则的技术方法提供了必要的背景。

表 17.2:部署权衡:由于计算、连接和治理的限制不同,负责任的 AI 原则在不同部署环境中表现出不同的形式;云部署支持复杂的可解释性方法,而微型机器学习则严重限制了这些方法。优先考虑某些原则,如可解释性、公平性、隐私、安全性和问责制,在设计云、边缘、移动和微型机器学习环境中的机器学习系统时,需要仔细考虑这些限制。

原则 云机器学习 边缘机器学习 移动机器学习 微型机器学习
可解释性 支持复杂模型和方法,如 SHAP 和采样方法 需要轻量级、低延迟的方法,如显著性图 需要用户可解释的输出,通常将更深入的分析推迟到云端 由于硬件限制,严重受限;大多数情况下仅限于静态或编译时
公平性 大数据集允许检测和缓解偏差 本地偏差难以检测,但允许设备上的调整 高度个性化使群体层面的公平性跟踪复杂化 数据量最小限制了偏差分析和缓解
隐私 集中的数据可能遭受泄露,但可以利用强大的加密和差分隐私方法 设备上的敏感个人数据需要设备保护 与用户身份的紧密耦合需要知情同意的设计和本地处理 分布式数据减少了集中化风险,但给匿名化带来了挑战
安全性 易受黑客攻击和大规模攻击 现实世界的交互使可靠性变得重要 在用户监督下运行,但仍需要优雅的失败处理 由于自主性,需要分布式安全机制
问责制 公司政策和审计允许追溯和监督 分散的供应链使问责制复杂化 需要清晰的面向用户的披露和反馈路径 需要在长而复杂的硬件链中实现可追溯性
治理 外部监督和法规,如 GDPR 或 CCPA 是可行的 需要开发者和集成商的自我治理 平衡平台政策与应用开发者选择 依赖于内置协议和加密保证

技术基础

负责任的机器学习需要将伦理原则转化为具体系统行为的技术方法。这些方法解决实际挑战:检测偏差、保护隐私、确保鲁棒性,并提供可解释性。成功取决于这些技术在包括数据质量、计算资源和部署要求在内的实际系统约束下的工作效果。

了解为什么这些方法是必要的,首先要认识到机器学习系统如何发展出问题行为。模型从训练数据中学习模式,包括历史偏见和不公平的关联。例如,在具有偏见的历史数据上训练的招聘算法将学会复制歧视性模式,将某些人口统计特征与成功相关联。

这是因为机器学习模型学习的是相关性而不是因果关系。它们识别的统计模式可能反映了不公平的社会结构,而不是有意义的关系。这种系统性偏差有利于在训练数据中历史上处于优势地位的群体。

解决这些问题需要训练之后的不仅仅是简单的修正。传统的机器学习仅优化准确性,与公平性目标产生冲突。有效的解决方案必须将公平性考虑直接整合到学习过程中,而不是将其视为次要问题。

每种技术方法都涉及准确性、计算成本和实现复杂度之间的特定权衡。这些方法并非普遍适用,必须根据系统需求和约束来选择。框架选择影响哪些负责任的人工智能技术可以实际实施。

本节探讨了实施负责任人工智能原则的实用技术。每种方法在系统中都有特定的目的,并带有特定的要求和性能影响。这些工具共同工作,以创建值得信赖的机器学习系统。

负责任人工智能的技术方法可以分为三个互补的类别。检测方法识别系统何时表现出问题行为,为偏差、漂移和性能问题提供早期预警系统。缓解技术通过算法干预和鲁棒性增强积极预防有害结果。验证方法为理解并解释系统行为提供机制,以便评估自动化决策的利益相关者。

负责任人工智能技术的计算开销

实施负责任的人工智能原则会带来可量化的计算成本,这些成本必须在系统设计阶段考虑。了解这些性能影响使工程师能够根据可用的计算资源和质量要求,做出关于实施哪些技术的明智决策。表 17.3 提供了不同负责任人工智能技术引入的计算开销的系统比较。

表 17.3:负责任人工智能技术性能影响:定量分析显示,负责任人工智能技术在训练和推理阶段都产生了可衡量的计算开销。差分隐私和公平性约束增加了适度的开销,而可解释性方法可以显著增加推理成本。这些指标有助于工程师针对生产约束优化负责任人工智能的实现。

技术 准确度影响 训练开销 推理成本 内存开销
差分隐私 -2%到-5% +15%到+30% 最小 +10%到+20%
(DP-SGD)
公平性感知训练 -1%到-3% +5%到+15% 最小 +5%到+10%
(重新加权/约束)
SHAP 解释 N/A N/A +50%到+200% +20%到+100%
对抗训练 +2%到+5% +100%到+300% 最小 +50%到+100%
联邦学习 -5%到-15% +200%到+500% 最小 +100%到+300%

表 17.3 中的性能数字代表了已发布基准和实际系统中的典型范围。27 实际开销根据模型架构、数据集大小和实现质量而有很大差异。例如,SHAP 在线性模型上增加大约 10 ms,而在深度集成模型上可以增加超过 1000 ms。对抗训练的开销取决于攻击强度:PGD-7 增加大约 150%的开销,而 PGD-50 增加大约 300%。联邦学习的开销主要由通信轮次和客户端异构性主导。

这些计算成本在多个背景下引发了重大的公平性考虑。资源有限的组织可能无法实施负责任人工智能技术,这可能导致对道德人工智能保护的差异访问,这是一个在部署环境、实施挑战和组织障碍中反复出现的话题。

检测方法是所有其他负责任人工智能干预措施的基础。

偏差和风险检测方法

检测方法为识别机器学习系统出现损害负责任人工智能原则的问题行为提供了基础能力。这些技术作为早期预警系统,在它们造成重大损害之前,提醒从业者注意偏差、漂移和性能退化。

偏差检测与缓解

在部署系统中实现公平性需要不仅仅是原则性目标或理论指标;它需要系统感知的方法,这些方法可以在机器学习生命周期中检测、测量和缓解偏差。实际偏差检测可以使用 Fairlearn28 (Bird 等,2020)等工具实现:

列表 17.1:使用 Fairlearn 进行偏差检测:对贷款审批模型性能在人口群体间的系统性评估揭示了潜在的批准率和假阳性率差异,这些差异可能表明需要干预的歧视性模式。

from fairlearn.metrics import MetricFrame
from sklearn.metrics import accuracy_score, precision_score

# Loan approval model evaluation across demographic groups
mf = MetricFrame(
    metrics={
        "approval_rate": accuracy_score,
        "precision": precision_score,
        "false_positive_rate": lambda y_true, y_pred: (
            (y_pred == 1) & (y_true == 0)
        ).sum()
        / (y_true == 0).sum(),
    },
    y_true=loan_approvals_actual,
    y_pred=loan_approvals_predicted,
    sensitive_features=applicant_demographics["ethnicity"],
)

# Display performance disparities across ethnic groups
print("Loan Approval Performance by Ethnic Group:")
print(mf.by_group)
# Output shows: Asian: 94% approval, White: 91% approval,
# Hispanic: 73% approval, Black: 68% approval

如列表 17.1 所示,这种方法使部署期间对人口群体间的公平性进行系统性监控成为可能,揭示了令人担忧的差异,其中贷款批准率因种族而异:亚洲申请人的批准率为 94%,而黑人申请人的批准率为 68%。基于之前讨论的系统级约束,公平性必须被视为一个与数据工程、模型训练、推理设计、监控基础设施和政策治理交叉的架构考虑因素。虽然人口统计平等、均衡机会和机会均等等公平性指标形式化了不同的规范性目标,但它们的实现取决于架构测量子群体性能、支持自适应决策边界以及在运行时存储或呈现特定于组的元数据的能力。

实际实施往往受到数据访问和系统仪表化的限制。在许多现实世界环境中,尤其是在移动、联邦或嵌入式系统中,敏感属性如性别、年龄或种族可能在推理时不可用,这使得跟踪或审计模型性能跨人口群体变得困难。第六章中讨论的数据收集和标注策略对于整个模型生命周期的公平性评估至关重要。在这种情况下,公平干预必须在数据整理或训练阶段上游进行,因为部署后的重新校准可能不可行。即使数据可用,结合用户反馈的持续重新训练管道也可能加剧现有差异,除非明确监控公平性下降。例如,一个适应用户行为的设备上推荐模型,如果缺乏检测用户交互或输出中人口统计不平衡的基础设施,可能会放大先前的偏见。

图 17.2说明了公平约束如何与部署选择产生紧张关系。在一个二元贷款审批系统中,两个子组,子组 A 用蓝色表示,子组 B 用红色表示,需要不同的决策阈值来实现相同的真正阳性率。在组间使用单个阈值会导致不同的结果,可能对子组 B 不利。通过调整每个组的阈值来解决这种不平衡可能提高公平性,但这需要支持模型服务堆栈中的条件逻辑,在推理时访问敏感属性,以及一个治理框架来解释和证明跨组差异处理的合理性。

图片

图 17.2:阈值依赖公平性:在子群体中变化分类阈值允许相同的真正阳性率,但引入了模型服务的复杂性,并在推理时需要访问敏感属性。实现公平性需要对特定子群体的性能进行仔细考虑,因为单个阈值可能不成比例地影响某些群体,突显了机器学习系统中准确性和公平结果之间的紧张关系。

公平性干预可以在管道的不同点应用,但每个都伴随着系统级的影响。预处理方法,通过采样、重新加权或增强来重新平衡训练数据,需要访问原始特征和群体标签,通常通过一个保留谱系的特征存储或数据湖。这些方法非常适合具有集中式训练管道和高质量标记数据的系统。相比之下,内处理方法将公平性约束直接嵌入到优化目标中。这些需要能够支持自定义损失函数或约束求解器的训练基础设施,可能需要更长的训练周期或额外的正则化验证。第八章中讨论的训练技术和优化方法为实施这些公平性感知的训练方法提供了基础。

后处理方法,包括应用特定群体的阈值或调整分数以实现结果均衡,需要推理系统能够根据敏感属性或参考外部政策规则进行条件化。这要求在模型服务基础设施、访问控制策略和日志管道之间进行协调,以确保差异化的处理既可审计又合法。第二章中涵盖的模型服务架构详细说明了在生产系统中实现这种条件逻辑所需的基础设施要求。任何后处理策略都必须经过仔细验证,以确保它不会损害用户体验、模型稳定性或遵守关于属性使用的司法管辖区法规。

可扩展的公平性执行通常需要更高级的策略,例如多校准 29,这确保模型预测在广泛的相交子群体中保持校准(Hébert-Johnson 等人 2018)。

在大规模实施多校准需要动态生成子群划分的基础设施、计算每组校准误差以及将公平性审计集成到自动化监控系统。这些能力通常仅在具有成熟可观察性和度量管道的大规模、云基础部署中可用。在嵌入式或 TinyML 系统等受限环境中,由于遥测有限且模型逻辑固定,这些技术不可行,公平性必须在设计时完全验证。

在不同的部署环境中,保持公平性需要生命周期感知机制。模型更新、反馈循环和界面设计都会影响公平性随时间的变化。如果重新训练管道不包括公平性检查,如果日志系统无法跟踪子群结果,或者如果用户反馈引入了训练分布未捕捉到的微妙偏差,则公平感知模型可能会退化。监控系统必须能够揭示公平性退化,重新训练协议必须能够访问带有子群标签的验证数据,这可能需要数据治理政策和伦理审查。实施这些监控系统需要 MLOps 实践的生产基础设施,而隐私保护技术对于联邦公平性评估至关重要。

公平性不是一次性的优化,也不是模型独立属性。它源于数据采集、特征工程、模型设计、阈值设置、反馈处理和系统监控等方面的协调决策。将公平性嵌入机器学习系统需要架构前瞻性、操作纪律以及贯穿整个部署堆栈的工具,从训练工作流到服务基础设施再到面向用户的界面。

偏见检测的社会技术影响远远超出了技术测量的范畴。当公平性指标识别出差异时,组织必须像在第 17.6.3 节中考察的那样,导航复杂的利益相关者审议过程。这些决策涉及相互竞争的利益相关者利益、法律合规要求和价值权衡,这些不能仅通过技术手段解决。

实时公平性监控架构

在生产系统中实施负责任的 AI 原则需要将公平性监控、可解释性和隐私控制直接集成到模型服务基础设施中的架构模式。图 17.3 展示了如何将负责任的 AI 组件与现有的 ML 系统基础设施集成的参考架构。

图片

图 17.3:生产负责任 AI 架构:实时公平性监控需要集成组件,这些组件通过数据处理匿名化、偏差检测和解释生成来处理每个推理请求,同时维护审计跟踪,并在公平性阈值被违反时触发警报。虚线显示了基于检测到的偏差模式进行模型更新的反馈循环。

此架构通过几个关键组件解决了专家确定的生产现实,这些组件协同工作以实现大规模的负责任 AI:

数据匿名化层在模型推理之前实现隐私保护转换,使用诸如 k-匿名性 30 或差分隐私噪声注入等技术。该组件为每个请求增加 2-5 毫秒的延迟,但提供正式的隐私保证。由于加密和噪声生成需求,内存开销通常为 15-25%。

实时公平性监控跟踪每个预测的种群统计和均衡概率指标,在受保护群体中维护滚动统计。系统标记超过可配置阈值的差异(例如,批准率差异超过 5%)。这种监控增加了 10-20 毫秒的延迟,并需要 100-500 MB 的额外内存用于指标存储和计算。

解释引擎为模型决策生成 SHAP 或 LIME 解释,特别是对于需要用户干预的负面结果。快速近似方法将解释延迟从 200-500 毫秒(完整 SHAP)减少到 20-50 毫秒(流式 SHAP),同时保持 90% 的保真度。由于梯度计算和特征重要性缓存,内存需求增加 50-100%。

实现深度解析

以下代码示例展示了生产就绪的公平性监控和实时偏差检测。这代表了一个参考实现,展示了架构模式而不是需要记忆的代码。重点理解:(1)公平性指标如何集成到服务基础设施中,(2)实现管理了哪些性能权衡,(3)当阈值超过时如何触发警报。在构建类似系统时,您可以返回到实现细节。

列表 17.2 展示了一个将组件集成到实时监控系统中的生产实现:

列表 17.2:生产公平性监控实现:实时偏差检测系统,处理推理请求,计算公平性指标,并在差异超过阈值时触发警报,展示了负责任的 AI 如何与生产机器学习服务基础设施集成。

import asyncio
from dataclasses import dataclass
from typing import Dict, List, Optional
import numpy as np
from sklearn.metrics import confusion_matrix


@dataclass
class FairnessMetrics:
    demographic_parity_diff: float
    equalized_odds_diff: float
    equality_opportunity_diff: float
    group_counts: Dict[str, int]


class RealTimeFairnessMonitor:
    def __init__(
        self, window_size: int = 1000, alert_threshold: float = 0.05
    ):
        self.window_size = window_size
        self.alert_threshold = alert_threshold
        self.predictions_buffer = []
        self.demographics_buffer = []
        # For actual outcomes when available
        self.labels_buffer = []

    async def process_prediction(
        self,
        prediction: int,
        demographics: Dict[str, str],
        actual_label: Optional[int] = None,
    ) -> FairnessMetrics:
        """Process single prediction and update fairness metrics"""
        # Store in rolling window buffer
        self.predictions_buffer.append(prediction)
        self.demographics_buffer.append(demographics)
        if actual_label is not None:
            self.labels_buffer.append(actual_label)

        # Maintain window size
        if len(self.predictions_buffer) > self.window_size:
            self.predictions_buffer.pop(0)
            self.demographics_buffer.pop(0)
            if self.labels_buffer:
                self.labels_buffer.pop(0)

        # Compute fairness metrics
        metrics = self._compute_fairness_metrics()

        # Check for bias alerts
        if (
            metrics.demographic_parity_diff > self.alert_threshold
            or metrics.equalized_odds_diff > self.alert_threshold
        ):
            await self._trigger_bias_alert(metrics)

        return metrics

    def _compute_fairness_metrics(self) -> FairnessMetrics:
        """Compute demographic parity and equalized odds"""
        """across groups"""
        if len(self.predictions_buffer) < 100:  # Minimum sample size
            return FairnessMetrics(0.0, 0.0, 0.0, {})

        # Group predictions by protected attribute
        groups = {}
        for i, demo in enumerate(self.demographics_buffer):
            group = demo.get("ethnicity", "unknown")
            if group not in groups:
                groups[group] = {"predictions": [], "labels": []}
            groups[group]["predictions"].append(
                self.predictions_buffer[i]
            )
            if i < len(self.labels_buffer):
                groups[group]["labels"].append(self.labels_buffer[i])

        # Compute demographic parity (approval rates)
        approval_rates = {}
        for group, data in groups.items():
            if len(data["predictions"]) > 0:
                approval_rates[group] = np.mean(data["predictions"])

        demo_parity_diff = (
            max(approval_rates.values())
            - min(approval_rates.values())
            if len(approval_rates) > 1
            else 0.0
        )

        # Compute equalized odds (TPR/False Positive Rate
        # differences) if labels available
        eq_odds_diff = 0.0
        eq_opp_diff = 0.0

        if self.labels_buffer and len(groups) > 1:
            tpr_by_group = {}
            fpr_by_group = {}

            for group, data in groups.items():
                if (
                    len(data["labels"]) > 10
                ):  # Minimum for reliable metrics
                    tn, fp, fn, tp = confusion_matrix(
                        data["labels"], data["predictions"]
                    ).ravel()
                    tpr_by_group[group] = (
                        tp / (tp + fn) if (tp + fn) > 0 else 0
                    )
                    fpr_by_group[group] = (
                        fp / (fp + tn) if (fp + tn) > 0 else 0
                    )

            if len(tpr_by_group) > 1:
                eq_odds_diff = max(
                    abs(tpr_by_group[g1] - tpr_by_group[g2])
                    for g1 in tpr_by_group
                    for g2 in tpr_by_group
                )
                eq_opp_diff = max(tpr_by_group.values()) - min(
                    tpr_by_group.values()
                )

        group_counts = {
            group: len(data["predictions"])
            for group, data in groups.items()
        }

        return FairnessMetrics(
            demographic_parity_diff=demo_parity_diff,
            equalized_odds_diff=eq_odds_diff,
            equality_opportunity_diff=eq_opp_diff,
            group_counts=group_counts,
        )

    async def _trigger_bias_alert(self, metrics: FairnessMetrics):
        """Trigger alert when bias threshold exceeded"""
        alert_message = (
          f"BIAS ALERT: Demographic parity difference: "
          f"{metrics.demographic_parity_diff:.3f}, "
        )
        alert_message += (
          f"Equalized odds difference: "
          f"{metrics.equalized_odds_diff:.3f}"
        )

        # Log to audit system
        print(f"[AUDIT] {alert_message}")

        # Could trigger additional actions:
        # - Send alert to monitoring dashboard
        # - Temporarily enable manual review
        # - Trigger model retraining pipeline
        # - Adjust decision thresholds

这种生产实现展示了负责任的 AI 原则如何转化为具有可衡量性能影响的具体系统架构。公平性监控为每个请求增加了 10-20 ms 的延迟,并需要额外 100-500 MB 的内存,而解释引擎将响应时间增加了 20-50 ms,内存使用量增加了 50-100%。在设计生产系统时,必须将这些开销与可靠性和合规性要求相平衡。

检测能力必须与积极防止有害结果的缓解技术相结合。

风险缓解技术

缓解技术积极干预系统设计和操作,以防止有害结果并降低对用户和社会的风险。这些方法包括保护敏感数据的隐私保护方法,到在攻击下保持系统可靠性的对抗性防御,再到支持数据治理和用户权利的机器反学习 31 技术。

隐私保护

记住,隐私是负责任机器学习的基础原则,其影响延伸到数据收集、模型行为和用户交互。隐私约束不仅由伦理和法律义务塑造,还由系统的架构属性和部署的上下文所决定。隐私保护的技术方法旨在防止数据泄露,限制记忆,并维护用户权利,如同意、退出和数据删除——尤其是在从个性化或敏感信息中学习的系统中。

现代机器学习模型,尤其是大规模神经网络,已知会记住单个训练示例,包括姓名、位置或私人通信的摘录(Ippolito 等人 2023)。这种记忆在隐私敏感的应用中存在显著风险,例如智能助手、可穿戴设备或医疗平台,其中训练数据可能包含受保护或受监管的内容。例如,一个适应用户语音的语音助手可能会无意中保留特定的短语,这些短语可能后来通过精心设计的提示或查询被提取出来。

这种风险不仅限于语言模型。在图像数据集上训练的扩散模型也被观察到可以从训练集中重新生成视觉实例,如图图 17.4 所示。这种行为突显了一个更普遍的漏洞:许多当代模型架构可以内化和再现训练数据,通常没有明确的信号或意图,也没有容易检测或控制。

图片

图 17.4:扩散模型记忆化:图像扩散模型可以重现训练样本,揭示了除语言模型之外意外记忆化的风险,并突出了当代神经网络架构的一般性漏洞。这种记忆化即使在缺乏明确指令的情况下也会发生,当在敏感数据集上训练时,会引发隐私问题。来源:(Ippolito 等人 2023)。

模型也容易受到成员推理攻击的影响,攻击者试图确定特定数据点是否是训练集的一部分(Shokri 等人 2017)。这些攻击利用了模型在已见和未见输入之间的行为上的微妙差异。在医疗保健或法律预测等高风险应用中,仅仅知道个人的记录被用于训练,就可能违反隐私期望或监管要求。

为了减轻这些漏洞,已经开发了一系列的隐私保护技术。其中最广泛采用的一种是差分隐私 32,它提供了正式的保证,即单个数据点的包含或排除对模型输出的影响在统计上是有限的。例如,差分隐私随机梯度下降(DP-SGD)算法通过剪枝和训练过程中注入噪声来强制执行这些保证(Martin Abadi 等人 2016)。当正确实施时,这些方法可以防止模型记住单个数据点,并降低推理攻击的风险。

然而,差分隐私引入了显著的系统级权衡。训练过程中添加的噪声可能会降低模型精度,增加训练迭代次数,并需要访问更大的数据集以维持性能。这些限制在资源受限的部署中尤为明显,如移动、边缘或嵌入式系统,在这些系统中,内存、计算和电力预算都受到严格限制。在这种情况下,可能需要结合轻量级隐私技术(例如,特征混淆、本地差分隐私)与限制数据收集、缩短保留期或在边缘实施严格访问控制的架构策略。

隐私执行还依赖于模型本身之外的基础设施。数据收集接口必须支持知情同意和透明度。日志系统必须避免保留敏感输入,除非绝对必要,并且必须支持访问控制、过期策略和可审计性。模型服务基础设施必须设计成防止输出过度暴露,这可能泄露内部模型行为或允许重建私有数据。这些系统级机制需要机器学习工程、平台安全和组织治理之间的紧密协调。

隐私不仅需要在训练期间得到强制执行,在整个机器学习生命周期中都需要得到强制执行。再训练管道必须考虑到已删除或撤销的数据,特别是在有数据删除命令的司法管辖区。监控基础设施必须避免在日志或仪表板上记录个人信息。隐私感知遥测收集、安全区域部署以及按用户审计跟踪越来越多地被用于支持这些目标,尤其是在受到严格法律监管的应用中。

架构决策也因部署环境而异。基于云的系统可能依赖于差分隐私、加密和访问控制的集中式执行,这些由遥测和再训练基础设施支持。相比之下,边缘和 TinyML 系统必须在部署的模型本身中构建隐私约束,通常没有运行时配置性或反馈通道。在这种情况下,必须在编译时实现静态分析、保守设计和嵌入式隐私保证,并在部署前进行验证。

隐私不是一个模型独立属性,而是一个从整个管道的设计决策中产生的系统级属性。负责任的隐私保护要求技术保障、界面控制、基础设施政策和法规遵从机制共同工作,以在整个部署的机器学习系统生命周期中降低风险。

隐私保护技术创造了复杂的社会技术紧张关系,这些关系远远超出了技术实施的范畴。差分隐私机制可能会以不成比例地影响少数群体的方式降低模型准确性,从而在隐私和公平性目标之间产生冲突。这些挑战需要持续的利益相关者参与,如第 17.6.3 节中详细所述,其中组织必须在大数据控制、个性化以及法规遵从等相互冲突的价值之间进行导航。

当考虑到用户权利和数据治理的动态性质时,这些隐私挑战变得更加复杂。

机器反学习

隐私保护并不在训练时间结束。在许多现实世界的系统中,用户必须保留撤销同意或请求删除其数据的权利,即使模型已经训练并部署。支持这一要求引入了一个核心技术挑战:如何在不需要全面重新训练的情况下,让模型“忘记”特定数据点的影響——这项任务在计算、存储和连接受限的边缘、移动或嵌入式部署中通常是不切实际的。

传统数据删除方法假设完整的训练数据集仍然可访问,并且可以在删除目标记录后从头开始重新训练模型。图 17.5 对传统模型重新训练与新兴机器反学习方法进行了对比。虽然重新训练涉及使用修改后的数据集从头开始重建模型,但反学习旨在去除特定数据点的影响,而不重复整个学习过程。

图片

图 17.5:模型更新策略:重新训练从零开始重建模型,而机器反学习则修改现有模型,以去除特定数据点的影响而不进行完全重建——这对于资源受限的部署来说是一个重要的区别。这种方法最小化了计算成本,并允许在初始模型训练后进行隐私保护的数据删除。

在具有严格延迟、计算或隐私约束的系统中,这种区别变得很重要。在实践中,这些假设很少成立。由于安全、合规或成本限制,许多部署的机器学习系统不保留原始训练数据。在这样的环境中,完全重新训练通常不切实际且具有破坏性,尤其是在数据删除必须可验证、可重复且可审计的情况下。

机器反学习旨在通过移除已训练模型中个别数据点的 影响,而不完全重新训练模型,来解决这个问题。当前的方法通过调整内部参数、修改梯度路径或隔离和修剪模型的部分组件来近似这种行为,从而使结果预测反映在没有删除数据的情况下可能学到的内容 (Bourtoule 等人 2021)。这些技术仍在成熟中,可能需要简化的模型架构、额外的跟踪元数据,或者在模型精度和稳定性上做出妥协。它们还引入了新的验证负担:如何以有意义的方式证明已发生删除,尤其是在内部模型状态不完全可解释的情况下。

机器反学习的动机得到了监管框架的加强。例如,通用数据保护条例 (GDPR)、加利福尼亚消费者隐私法案 (CCPA) 以及加拿大和日本的类似法律将“被遗忘权”编纂成法典,包括用于模型训练的数据。这些法律越来越要求不仅防止未经授权的数据访问,而且要求主动撤销——赋予用户请求其信息停止影响下游系统行为的能力。一些知名事件,其中生成模型复制了个人内容或受版权保护的数据,突出了将反学习机制整合到负责任系统设计中的实际紧迫性。

从系统角度来看,机器反学习引入了非平凡的架构和运营需求。系统必须能够跟踪数据血缘,包括哪些数据点贡献了给定的模型版本。这通常需要结构化元数据捕获和训练管道的仪器化。此外,系统必须支持面向用户的删除工作流程,包括身份验证、提交和删除状态的反馈。验证可能需要维护版本化的模型注册表,以及确认更新后的模型没有残留的删除数据影响的机制。这些操作必须跨越数据存储、训练编排、模型部署和审计基础设施,并且必须能够应对故障或回滚。

这些挑战在资源受限的部署中更为突出。TinyML 系统通常运行在没有持久存储、没有连接性和高度压缩模型的设备上。一旦部署,它们就不能根据删除请求进行更新或重新训练。在这种设置下,机器反学习在部署后实际上是不可行的,必须在初始模型开发期间通过静态数据最小化和保守的泛化策略来强制执行。即使在基于云的系统,重新训练更为可行的情况下,反学习也必须应对分布式训练管道、跨服务的复制以及同步模型快照和日志中删除的困难。

尽管存在这些挑战,机器反学习对于负责任系统设计正变得越来越重要。随着机器学习系统变得更加嵌入式、个性化和自适应,撤销训练影响的能力对于维护用户信任和满足法律要求变得至关重要。关键的是,反学习不能在部署后进行改造。它必须在架构和政策设计阶段予以考虑,并且从系统一开始就必须支持血缘跟踪、重新训练编排和部署回滚。

机器反学习代表了隐私思考的转变——从保护收集的数据,到控制这些数据持续影响系统行为的时间。这种以生命周期为导向的视角为模型设计、基础设施规划和法规遵从引入了新的挑战,同时也为更用户可控、透明和自适应的机器学习系统提供了基础。

负责任的 AI 系统还必须在包括故意攻击在内的困难条件下保持可靠的行为。

对抗鲁棒性

在第十六章 ([ch022.xhtml#sec-robust-ai]) 和第十五章 ([ch021.xhtml#sec-security-privacy]) 中探讨的对抗鲁棒性,作为针对故意攻击的防御手段,也构成了负责任 AI 部署的基础。除了保护免受恶意对手的攻击之外,对抗鲁棒性确保模型在遇到自然发生的变异、边缘情况和偏离训练分布的输入时仍能可靠地表现。易受对抗性扰动影响的模型揭示了其学习表示中的基本脆弱性——这种脆弱性即使在非对抗性环境中也会损害可信度。

机器学习模型,尤其是深度神经网络,已知容易受到微小、精心设计的扰动的影响,这些扰动会显著改变它们的预测。这些漏洞最初是通过对抗性示例的概念 (Szegedy 等人 2013b) 得到的形式化,突显了模型在精心挑选的训练数据上的性能与在现实世界变量下的行为之间的差距。一个在干净输入上表现可靠的模型,当暴露于与其训练分布略有不同的输入时可能会失败——这些差异对人类来说是不可察觉的,但足以改变模型输出。

这种现象不仅限于理论。对抗性示例已被用于操纵真实系统,包括内容审核管道 (Bhagoji 等人 2018)、广告拦截检测 (Tramèr 等人 2019) 和语音识别模型 (Carlini 等人 2016)。在自动驾驶或医疗诊断等安全至关重要的领域,即使是罕见的故障也可能产生高后果的结果,损害用户信任或为恶意利用打开攻击面。

图 17.6 展示了一个视觉上微不足道的扰动,它导致了一个自信的错误分类——强调了微妙的变化如何产生不成比例的有害影响。

图片

图 17.6:对抗性扰动:精心制作的微妙噪声可能导致机器学习模型以高置信度错误分类输入,尽管这种变化对人类来说是不可察觉的。这个例子展示了图像的微小扰动如何导致错误分类,突显了深度学习系统对对抗性攻击的脆弱性。来源:微软。

在其核心,对抗性漏洞源于模型假设与部署条件之间的架构不匹配。许多训练管道假设数据是干净的、独立的且同分布的。相比之下,部署系统必须在不确定性、噪声、领域偏移和可能的对抗性篡改下运行。在这种情况下,鲁棒性不仅包括抵抗攻击的能力,还包括在退化或不可预测条件下保持一致行为的能力。

提高鲁棒性始于训练阶段。对抗性训练是最广泛使用的技术之一,通过添加扰动示例来增强训练数据。这有助于模型学习更稳定的决策边界,但通常会增加训练时间并降低干净数据的准确性。在规模上实施对抗性训练也对数据预处理管道、模型检查点基础设施和可以容纳扰动输入的验证协议提出了要求。

架构修改也可以促进鲁棒性。限制模型 Lipschitz 常数的技巧、正则化梯度敏感性或强制执行表示平滑性可以使预测更稳定。这些设计更改必须与模型的表达需求以及底层训练框架兼容。例如,平滑模型可能更适合输入精度有限或必须遵守安全重要阈值的嵌入式系统。

在推理时间,系统可能会实施不确定性感知的决策制定。当置信度低时,模型可以避免做出预测,或者将不确定的输入路由到回退机制——例如基于规则的组件或人机交互系统。这些策略需要部署基础设施来支持回退逻辑、用户升级工作流程或可配置的弃权策略。例如,一个移动诊断应用可能会在模型置信度低于指定阈值时返回“不确定”,而不是发布可能有害的预测。

监控基础设施在部署后保持鲁棒性方面发挥着重要作用。分布偏移检测、异常跟踪和行为漂移分析允许系统识别鲁棒性随时间退化的情况。实现这些功能需要持续记录模型输入、预测和上下文元数据,以及触发重新训练或升级的安全通道。这些工具引入了它们自己的系统开销,必须与遥测服务、警报框架和模型版本控制工作流程集成。

除了经验性防御之外,形式化方法提供了更强的保证。例如,经过认证的防御,如随机平滑,提供了概率保证,即模型在有限输入区域内输出的稳定性。这些方法在每个推理过程中需要多次正向传递,计算密集,因此主要适用于高保证、资源丰富的环境。它们的生产工作流程集成也要求与模型服务基础设施和概率验证工具兼容。

简单的防御,例如输入预处理,通过去噪、压缩或归一化步骤过滤输入以去除对抗噪声。这些转换必须足够轻量,以便实时执行,特别是在边缘部署中,并且足够鲁棒以保留任务相关的特征。另一种方法是集成建模,其中预测是在多个不同的模型之间汇总的。这增加了鲁棒性,但增加了推理管道的复杂性,增加了内存占用,并复杂化了部署和维护工作流程。

系统约束,如延迟、内存、电源预算和模型更新周期,强烈影响着哪些鲁棒性策略是可行的。对抗训练增加了模型大小和训练时间,这可能会挑战 CI/CD 管道并增加重新训练成本。经过认证的防御需要计算余量和推理时间容忍度。监控需要日志记录基础设施、数据保留策略和访问控制。特别是,在设备上和 TinyML 部署中,通常无法容纳运行时检查或动态更新。在这种情况下,鲁棒性必须通过静态验证和编译时嵌入。

对抗鲁棒性不是一个独立的模型属性。它是一个从训练、模型架构、推理逻辑、日志记录和回退路径协调中出现的系统级属性。一个在孤立情况下看似鲁棒的模型,如果部署在一个缺乏监控或接口保护的系统中,仍然可能会失败。相反,即使是一个部分鲁棒的模型,如果嵌入到一个能够检测不确定性、限制对不受信任的输入的暴露,并在出错时支持恢复的架构中,也可以有助于整体系统的可靠性。

鲁棒性,就像隐私和公平性一样,必须不仅被设计到模型中,还要被设计到其周围的系统中。负责任的机器学习系统设计需要预测模型在现实世界压力下可能失败的方式——并构建使这些失败可检测、可恢复和安全的基础设施。

验证方法使利益相关者能够理解和审计系统行为。

验证方法

验证方法为理解、审计和向必须评估自动化决策是否符合道德和运营要求的利益相关者解释系统行为提供了机制。这些技术促进了透明度,支持法规遵从,并在用户和自动化系统之间建立信任。

可解释性与可解释性

随着机器学习系统在越来越重要的领域得到部署,理解和解释模型预测的能力变得重要。可解释性和可解释性指的是使模型行为对人类利益相关者(无论是开发者、领域专家、审计员、监管者还是最终用户)可理解的技术和设计机制。虽然这两个术语经常互换使用,但可解释性通常指模型的内在透明度,例如决策树或线性分类器。相比之下,可解释性包括为复杂或模糊模型做出的预测生成事后合理化的技术。

可解释性在系统验证、错误分析、用户信任、法规遵从和事件调查中扮演着核心角色。在医疗保健、金融服务和自主决策系统等高风险领域,解释有助于确定模型是否基于合法原因做出决策,或者依赖于虚假的相关性。例如,一个可解释性工具可能会揭示诊断模型对图像伪影过于敏感,而不是对医疗特征敏感,这是一种可能未被发现的故障模式。现在,许多行业的监管框架都要求人工智能系统提供关于决策如何做出的“有意义的信息”,这强化了对系统解释的系统性支持的需求。

可解释性方法可以根据它们操作的时间和它们与模型结构的关系进行广泛分类。事后方法在训练后应用,并将模型视为黑盒。这些方法不需要访问内部模型权重,而是从模型行为中推断影响模式或特征贡献。常见的事后技术包括特征归因方法,如输入梯度、集成梯度 33、GradCAM34 (Selvaraju 等人 2017)、LIME (Ribeiro, Singh, and Guestrin 2016) 和 SHAP (Lundberg and Lee 2017)。

这些方法在图像和表格领域被广泛使用,其中解释可以表示为显著性图或特征排名。为了说明 SHAP 归因在实际中的工作原理,考虑一个基于三个特征(incomedebt_ratio,和credit_score)预测贷款批准(approve=1,deny=0)的已训练随机森林模型。对于一个具体申请者,其收入为$45,000,债务比率为 0.55(55%的收入用于债务),信用评分为 620,模型预测拒绝的概率为 0.72。基于合作博弈论中的 Shapley 值的 SHAP 值,衡量每个特征对将预测从基线(所有训练数据的平均预测,P(approve) = 0.50)移动到这个个体预测的贡献。

SHAP 框架通过评估所有可能的特征子集来计算每个特征的贡献。从基线预测 0.50 开始,增加收入($45K,略低于平均水平)会降低批准概率 0.05。增加债务比率(0.55,高)会额外降低批准概率 0.25。增加信用评分(620,低于阈值)会适度降低批准概率 0.12。最终预测变为 0.50 - 0.05 - 0.25 - 0.12 = 0.08,对应于 P(deny) = 0.72。这表明高债务比率对拒绝贡献最大(-0.25),其次是低于平均水平的信用评分(-0.12),而收入的影响最小(-0.05)。这样的解释是可操作的:将债务比率降低到 40%以下可能会改变决策。

然而,这种严谨性伴随着巨大的计算成本。这个包含 3 个特征的示例需要评估 2³ = 8 个特征子集。对于一个包含 20 个特征的模型,SHAP 需要评估 2²⁰ ≈ 1 百万个特征子集,这解释了与简单梯度方法相比,计算开销高达 50-1000 倍。基于树的 SHAP 实现通过利用模型结构将计算时间降低到多项式时间,但深度学习模型通常需要近似算法(KernelSHAP,DeepSHAP)以及基于采样的估计。虽然 SHAP 提供了理论上基于的、可加的特征归因,这些归因满足了一些理想属性(局部精度、缺失值、一致性),但这些成本使得 SHAP 在没有近似或缓存策略的情况下,对于高吞吐量系统的实时解释来说并不实用。

另一种事后方法涉及反事实解释,它描述了如果输入以特定方式修改,模型输出会如何变化。这些解释对于面向决策的应用程序,如信贷或招聘系统,尤其相关。例如,一种反事实解释可能声明,如果申请人的报告收入更高或债务更低,他们将获得贷款批准(Wachter, Mittelstadt, and Russell 2017)。反事实生成需要访问特定领域的约束和现实数据流形,这使得将其集成到实时系统中具有挑战性。

第三类技术依赖于基于概念的解释,这些解释试图将学习到的模型特征与人类可解释的概念相一致。例如,一个用于分类室内场景的卷积网络可能会激活与“灯”、“床”或“书架”相关的过滤器(C. J. Cai 等人 2019)。这些方法在领域专家期望以熟悉的语义术语进行解释的领域特别有用。然而,它们需要具有概念注释的训练数据或用于概念检测的辅助模型,这引入了额外的基础设施依赖。

虽然事后方法具有灵活性和广泛的应用性,但它们也存在局限性。因为它们在事后近似推理,可能会产生看似合理但具有误导性的理由。它们的有效性取决于模型的平滑度、输入结构和解释技术的保真度。这些方法通常在探索性分析、调试或面向用户的总结中最为有用,而不是作为内部逻辑的最终解释。

与之相反,本质上可解释的模型在设计上就是透明的。例如,决策树、规则列表、具有单调性约束的线性模型和 k-最近邻分类器。这些模型直接暴露其推理结构,使得利益相关者可以通过一系列可解释的规则或比较来追踪预测。在监管或安全至关重要的领域,如再犯预测或医疗分诊,本质上可解释的模型可能更受欢迎,即使这要以一些准确性为代价(Rudin 2019)。然而,这些模型通常难以扩展到高维或非结构化数据,并且它们的简单性可能会限制在复杂任务中的性能。

不同模型类型的相对可解释性可以沿着一个谱系进行可视化。如图图 17.7 所示,决策树和线性回归等模型通过设计提供透明度,而像神经网络和卷积模型这样更复杂的架构则需要外部技术来解释其行为。这种区别在选择适用于特定应用的适当模型时至关重要——尤其是在监管审查或利益相关者信任至关重要的环境中。

图片

图 17.7:模型可解释性谱系:内禀可解释的模型,如线性回归和决策树,提供透明的推理,而复杂的模型如神经网络则需要事后解释技术来理解其预测。这种区别指导了基于应用需求进行模型选择,优先考虑在受监管领域或当利益相关者信任重要时的透明度。

混合方法旨在结合深度模型的表示能力和可解释组件的透明度。例如,概念瓶颈模型(Koh 等人 2020)首先预测中间的可解释变量,然后使用简单的分类器生成最终预测。ProtoPNet 模型(C. Chen 等人 2019)通过将示例与学习到的原型进行比较来分类,为用户提供理解预测的视觉类比。这些混合方法在需要部分透明度的领域中具有吸引力,但它们引入了新的系统设计考虑因素,例如需要存储和索引学习到的原型,并在推理时呈现它们。

一个更近期的研究方向是机制可解释性,它试图逆向工程神经网络的内部分工。这一工作受到程序分析和神经科学的启发,试图将神经元、层或激活模式映射到特定的计算功能(Olah 等人 2020; Geiger 等人 2021)。尽管前景广阔,但这一领域仍然是探索性的,目前主要与大型基础模型的分析相关,在这些模型中,传统的可解释性工具是不够的。

从系统视角来看,可解释性引入了许多架构依赖。解释必须在系统约束内生成、存储、呈现和评估。所需的基础设施可能包括解释 API、存储归因图的内存、可视化库以及捕获中间模型行为的日志机制。模型通常需要通过钩子进行仪器化或配置以支持重复评估——尤其是对于需要采样、扰动或反向传播的解释方法。

这些需求直接与部署约束相互作用,并施加可量化的性能成本,这些成本必须纳入系统设计。SHAP 解释通常需要比标准推理多 50-1000 倍的向前传递,每解释的计算开销从 200 ms 到 5+秒不等,具体取决于模型复杂性。LIME 类似地需要训练代理模型,每解释增加 100-500 ms。在生产部署中,这些成本转化为显著的基础设施开销:一个每秒处理 10,000 次预测且解释率为 10%的高流量系统,仅为了可解释性就需要 50-500 倍额外的计算能力。

对于资源受限的环境,基于梯度的归因方法提供了更有效的替代方案,通常通过利用已经存在的反向传播基础设施,每解释增加 10-50 ms 的开销。然而,这些方法对于复杂模型来说可靠性较低,可能在模型更新之间产生不一致的解释。边缘部署通常通过预计算的规则近似或简化的决策边界来实现可解释性,牺牲了解释的精确性以换取低于 100 ms 的可行延迟。

存储需求也随着解释需求而显著增加。存储表格数据的 SHAP 值大约需要每个特征每预测 4-8 字节,而图像的梯度归因图可能需要根据分辨率每解释 1-10 MB。一个每天维护 100 万次预测的解释日志的生产系统,每月需要额外的 50 GB-10 TB 存储容量,这需要仔细的数据生命周期管理和保留策略。

可解释性贯穿整个机器学习生命周期。在开发阶段,可解释性工具用于数据集审计、概念验证和早期调试。在推理时间,它们支持问责制、决策验证和用户沟通。部署后,解释可能被记录、在审计中呈现或在错误调查期间查询。系统设计必须支持这些所有阶段——确保解释工具集成到训练框架、模型服务基础设施和面向用户的应用程序中。

压缩和优化技术也会影响可解释性。在 TinyML 或移动设置中常用到的剪枝、量化和架构简化可能会扭曲内部表示或禁用梯度流,降低基于归因的解释的可靠性。在这种情况下,必须在优化后验证可解释性,以确保其仍然有意义和可信。如果解释质量很重要,这些变换必须被视为设计约束空间的一部分。

可解释性不是一个附加功能,而是一个系统级关注点。为了可解释性而设计需要谨慎地决定谁需要解释,什么样的解释是有意义的,以及如何在系统的延迟、计算和界面预算限制下提供这些解释。随着机器学习嵌入到重要的工作流程中,解释能力成为安全、可信和可问责系统的核心要求。

可解释性的社会技术挑战集中在技术解释和人类理解之间的差距。虽然算法可以生成特征归因和梯度图,但利益相关者通常需要与他们的心理模型、领域专业知识和决策过程相一致的解释。一位审查 AI 生成的诊断的放射科医生需要参考医学概念和视觉模式的解释,而不是抽象的神经网络激活。这种翻译挑战需要技术团队和领域专家之间的持续合作,以开发既技术准确又实际有意义的解释格式。解释可以在意想不到的方式上塑造人类决策,从而为解释信息的呈现和解释方式带来新的责任。

模型性能监控

无论训练时的评估多么严格,一旦系统部署,都不能保证可靠的模型性能。现实环境是动态的:由于季节性,输入分布会发生变化;用户行为会随着系统输出而演变;政策或法规的变化会导致上下文期望发生变化。这些因素可能导致预测性能下降,甚至更重要的是,系统可信度随时间退化。在训练或验证条件下表现良好的模型,在生产中仍可能做出不可靠或有害的决定。

这种漂移的影响不仅限于原始准确率。如果子群体分布相对于训练集发生变化,或者先前与结果相关的特征在新环境中变得不可靠,公平性保证可能会失效。可解释性的需求也可能发生变化——例如,随着新的利益相关者群体寻求解释,或者随着监管机构引入新的透明度要求。因此,可信度不是一个在训练时授予的静态属性,而是一个由部署环境和操作反馈塑造的动态系统属性。

为了确保长期的责任行为,机器学习系统必须纳入持续监控、评估和纠正行动的机制。监控不仅涉及跟踪总体准确性,还需要在相关的子组中呈现性能指标,检测输入分布的变化,识别异常输出,并捕捉有意义的用户反馈。然后,这些信号必须与关于公平性、鲁棒性和透明度的预定义期望进行比较,并链接到可操作的系统响应,如模型重新训练、重新校准或回滚。

实施有效的监控依赖于稳健的基础设施。系统必须以结构化和安全的方式记录输入、输出和上下文元数据。这需要能够捕获模型版本、输入特征、预测置信度和后推理反馈的遥测管道。这些日志支持漂移检测,并为公平性和鲁棒性的事后审计提供证据。监控系统还必须与警报、更新调度和政策审查流程集成,以支持及时和可追溯的干预。

监控还支持反馈驱动的改进。例如,重复的用户不同意、更正请求或操作员覆盖可以表明存在问题的行为。这种反馈必须被汇总、验证并转化为更新训练数据集、数据标注过程或模型架构。然而,这样的反馈循环存在风险:有偏的用户响应可能会引入新的不平等,而过度的日志记录可能会损害隐私。设计这些循环需要用户体验设计、系统安全和道德治理之间的仔细协调。

监控机制因部署架构而异。在基于云的系统,丰富的日志记录和计算能力允许实时遥测、计划中的公平性审计以及将新数据持续集成到重新训练管道中。这些环境支持动态重新配置和集中式政策执行。然而,遥测数据的量可能会在成本、隐私风险和合规性方面带来自己的挑战。

在移动系统中,连接是间歇性的,数据存储有限。监控必须轻量级且能够抵御同步延迟。本地推理系统可能会异步收集性能数据,并将其汇总传输到后端系统。隐私约束通常更严格,尤其是在个人数据必须保留在设备上时。这些系统需要仔细的数据最小化和本地聚合技术,以在保持可观察性的同时保护隐私。

边缘部署,如自动驾驶汽车、智能工厂或实时控制系统,需要低延迟响应,并以最小外部监督运行。在这些系统中的监控必须嵌入到运行时,对传感器完整性、预测置信度和行为偏差进行内部检查。这些检查通常需要低开销的不确定性估计、异常检测或一致性验证的实现。系统设计者必须预测故障条件,并确保异常行为触发安全回退程序或人工干预。

TinyML 系统,在无连接、持久存储或动态更新路径的深度嵌入式硬件上运行,呈现了最受限的监控场景。在这些环境中,监控必须在部署前设计和编译到系统中。常见的策略包括输入范围检查、内置冗余、静态故障转移逻辑或保守的验证阈值。一旦部署,这些模型独立运行,任何部署后的故障可能需要物理设备更换或固件级别的重置。

核心挑战是普遍的:部署的机器学习系统不仅最初必须表现良好,而且随着环境的变化必须继续负责任地行为。监控提供了将系统性能与道德目标和问责结构联系起来的可观察性层。没有监控,公平性和鲁棒性将变得不可见。没有反馈,偏差无法得到纠正。因此,监控是操作基础,使机器学习系统能够保持适应性、可审计性和与其预期目的的一致性。

本节探讨的技术方法——偏差检测算法、差分隐私机制、对抗性训练程序和可解释性框架——为负责任的 AI 实现提供了基本能力。然而,这些工具揭示了根本性的限制:仅仅技术正确性不能保证有益的结果。考虑三个具体例子来说明这一挑战:

公平审计系统检测贷款审批模型中的种族偏见,但该组织缺乏解释结果或实施纠正措施的过程。技术能力存在,但组织惯性阻碍了补救。差分隐私保护了关于数据保护的正式数学保证,但用户不理解这些保护,并继续不适当地共享敏感信息。隐私方法按设计工作,但行为上下文削弱了其有效性。可解释性系统生成技术准确的特征重要性分数,但受影响的人由于界面设计和识字障碍无法访问或解释这些解释。

这些例子表明,负责任的人工智能实施取决于技术能力和社会技术环境之间的协调——组织激励、人类行为、利益相关者价值观和制度治理结构。

社会技术动态

负责任的人工智能系统在复杂的社会技术环境中运行,其中技术方法与人类行为、组织实践和竞争的利益相关者价值观相互作用。上述检测偏差的工具、保护隐私的技术和可解释性方法提供了必要的功能,但它们的有效性完全取决于它们如何与决策过程、用户界面、反馈机制和治理结构整合。理解这些相互作用对于实现实际有益结果的可持续负责任人工智能部署至关重要。

认知转变:从纯工程到社会技术工程

上一节重点介绍了解决定义明确问题的技术工具:检测偏差的算法、保护隐私的方法和生成解释的技术。我们现在转变分析视角,以解决仅用算法无法解决的问题。

以下章节将探讨负责任的人工智能系统如何与人类、组织和竞争价值观互动。这种转变需要不同的推理技能:不是优化目标函数,而是分析利益相关者冲突;不是调整超参数,而是导航伦理权衡;不是衡量技术性能,而是评估社会影响。这些都是社会技术工程面临的挑战——设计必须满足计算约束和人类价值观的系统。

理解这些社会技术动态对于可持续的负责任人工智能实施至关重要。

负责任的人工智能系统设计不仅超越了技术正确性和算法保障。一旦部署,这些系统将在复杂的社会技术环境中运行,其输出会影响并受到人类行为、制度实践和不断变化的社会规范的影响。随着时间的推移,机器学习系统成为它们旨在模拟的环境的一部分,从而产生反馈动态,影响未来的数据收集、模型再训练和下游决策。

本节讨论了与机器学习技术部署相关的更广泛的伦理和系统性挑战。它探讨了模型和环境之间的反馈循环如何强化偏见,人类-人工智能合作如何引入新的风险和责任,以及利益相关者价值观之间的冲突如何复杂化公平性和问责制的实施。它考虑了可争议性和制度治理在维持负责任系统行为中的作用。这些考虑表明,责任不是算法的静态属性,而是系统设计、使用和长期监督的动态结果。

系统反馈循环

机器学习系统不仅仅是观察和模拟世界;它们也塑造世界。一旦部署,它们的预测和决策往往会影响它们旨在分析的环境。这种反馈会改变未来的数据分布,修改用户行为,并影响制度实践,在模型输出和系统输入之间形成一个递归循环。随着时间的推移,这种动态可能会放大偏见,加剧不平等,或无意中改变模型旨在服务的目标。

这种现象的一个很好的例子是预测警务。当一个基于历史逮捕数据的模型预测某个特定地区的犯罪率较高时,执法部门可能会向该地区分配更多的巡逻警力。这种增加的警力导致更多记录的事件,然后这些事件被用作未来模型训练的输入,进一步强化了模型最初的预测。即使模型在开始时没有明显的偏见,但其融入反馈循环会导致一个自我实现的模式,这种模式不成比例地影响已经过度警力的社区。

推荐系统在数字环境中表现出类似的动态。一个优先考虑参与度的内容推荐模型可能会逐渐缩小用户接触到的内容范围,导致强化现有偏好或极端化意见的反馈循环。这些影响可能难以使用传统的性能指标检测,因为系统在偏离更广泛的社会或认识论目标的同时,仍在优化其训练目标。

从系统角度来看,反馈循环对负责任的 AI 构成了核心挑战。它们破坏了独立同分布数据的假设,并复杂化了公平性、鲁棒性和泛化的评估。依赖于静态测试集的标准验证方法可能无法捕捉模型对数据生成过程影响的演变。一旦建立这样的循环,旨在提高公平性或准确性的干预措施可能效果有限,除非解决潜在的数据动态。

在存在反馈循环的情况下设计责任需要机器学习系统的生命周期视图。这不仅包括监控模型性能随时间的变化,还包括理解系统输出如何影响环境,这些变化如何在新数据中捕捉到,以及再训练实践如何减轻或加剧这些效应。

在基于云的系统中,这些更新可能频繁发生且规模庞大,有广泛的遥测数据可用于检测行为漂移。相比之下,边缘和嵌入式部署通常在离线或有限的可观察性下运行。一个根据用户交互调整恒温器行为的智能家居系统可能会以改变家庭环境的方式强化能源消耗模式或舒适偏好——从而影响模型未来的输入。在没有连接或集中监督的情况下,这些循环可能未被识别,尽管它们对用户行为和系统性能都有影响。第十三章中详细说明的操作监控实践对于在生产系统中检测和管理这些反馈动态至关重要。

系统必须配备机制来检测分布漂移、识别行为塑造效应,并支持与系统预期目标一致的纠正更新。反馈循环本身并非有害,但它们必须被识别和管理。当未被审查时,它们会引入系统性风险;当经过深思熟虑地处理时,它们为学习系统在复杂、动态环境中负责任地适应提供了机会。

当人类操作员集成到决策过程中时,这些系统级反馈动态变得更加复杂。

人机协作

机器学习系统越来越多地被部署为不仅仅是独立代理,而是作为涉及人类决策者的更大工作流程中的组件。在许多领域,如医疗保健、金融和交通,模型作为决策支持工具,提供预测、风险评分或推荐,这些由人类操作员审查并采取行动。这种协作配置提出了关于责任在人类和机器之间如何共享、信任如何校准以及如何在实践中实施监督机制的重要问题。

人机协作既带来了机遇也带来了风险。当设计得当,系统可以增强人类判断,减轻认知负担,并提高决策的一致性。然而,当设计不当,它们可能导致自动化偏差,即用户即使在存在明显错误的情况下也过度依赖模型输出。相反,过度不信任可能导致算法厌恶,即用户由于缺乏透明度或感知可信度而忽视有用的模型预测。协作系统的有效性不仅取决于模型的表现,还取决于系统如何传达不确定性,提供解释,以及允许人类覆盖或纠正。

监督机制必须针对部署环境量身定制。在高风险领域,如医疗分级或自动驾驶,人们可能期望人类实时监督自动化决策。这种配置对人类操作员提出了认知和时间上的要求,并假设在需要时干预将迅速且可靠地发生。然而,在实践中,持续的人类监督往往是不可行或无效的,尤其是当操作员必须监控多个系统或缺乏明确的干预标准时。

从系统设计角度来看,支持有效的监督需要不仅仅是提供对原始模型输出的访问。界面必须构建以在正确的时间、正确的格式和适当的上下文中呈现相关信息。置信度分数、不确定性估计、解释和变更警报都可以在使人类监督成为可能方面发挥作用。工作流程必须定义何时以及如何进行干预,谁有权覆盖模型输出,以及如何记录、审计和将这些覆盖纳入未来的系统更新。

考虑一个使用机器学习模型来优先处理急诊科患者的医院分级系统。该模型为每位进入的患者生成一个风险评分,并将其与建议的分级类别一起展示。原则上,护士负责确认或覆盖该建议。然而,如果模型的输出没有充分的理由,例如解释贡献特征或不确定性的背景,护士甚至可能在边缘情况下依赖模型。随着时间的推移,模型的输出可能成为事实上的分级决策,尤其是在时间压力下。如果发生分布变化(例如,由于新疾病或患者人口统计学的变化),护士可能缺乏必要的情境意识和界面支持,以检测模型表现不佳。在这种情况下,人类监督的表面现象掩盖了一个责任实际上已转移到模型而没有明确问责或追索权的系统。

在这样的系统中,人类监督不仅仅是政策声明的问题,而是基础设施设计的问题:如何呈现预测,保留什么信息,如何实施干预,以及如何将反馈循环连接到系统更新。如果没有这些组件之间的整合,监督就会变得支离破碎,责任可能从人类无形地转移到机器。

决策支持与自动化之间的界限通常很模糊。最初设计用于协助人类决策者的系统可能会随着信任的增加或组织激励的变化而逐渐获得更大的自主性。这种转变可能在没有明确政策变化的情况下发生,导致事实上自动化,但没有适当的问责结构。因此,负责任的设计必须预见使用随时间的变化,并确保即使在依赖自动化增长的情况下,适当的检查仍然存在。

人机协作需要仔细整合模型能力、界面设计、运营政策和制度监督。协作不仅仅是插入“人机结合”;这是一个跨越技术、组织和伦理维度的系统挑战。为监督而设计意味着嵌入允许干预、支持有信息信任和支持人类操作员与机器学习系统之间共享责任的机制。

人类-人工智能合作的复杂性进一步加剧,因为不同的利益相关者往往持有相互冲突的价值观和优先事项。

规范多元主义和价值冲突

哲学内容

本节探讨了相互竞争的价值体系和它们对机器学习设计的影响——这偏离了主要的技术内容。关键见解:技术卓越对于可信的人工智能是必要的,但不足以保证,因为利益相关者持有关于公平、隐私和问责的不同合法概念,这些概念不能通过更好的算法来调和。理解这些价值紧张关系对于导航影响人们生活的设计决策至关重要。这种观点补充,而不是取代,技术技能。

负责任的机器学习不能仅仅归结为单一目标的优化。在现实世界的环境中,机器学习系统被部署到由多种、通常相互冲突的人类价值观塑造的环境中。

考虑一个团队正在构建一个用于青少年的心理健康聊天机器人,该机器人使用机器学习来检测危机情况并推荐干预措施。该系统必须在多个合法但不兼容的目标之间取得平衡:

医疗功效:基于循证实践优化最佳临床结果。这意味着采取积极的干预措施——当模型检测到潜在的自伤风险时,即使信心较低,也要提醒父母、顾问或紧急服务,因为假阴性可能导致致命后果。

患者自主权:尊重青少年的隐私和自主权。许多青少年寻求心理健康支持,正是因为他们无法与父母或权威人士交谈。激进的通报政策可能会阻止脆弱的青少年使用该系统,使他们得不到任何支持。

隐私保护:最小化数据收集和保留,以保护敏感的心理健康信息。这表明本地处理、不记录对话、不与第三方共享——但也阻止了系统通过学习互动来改进,或当模型不确定时无法启用人工审查。

资源效率:在计算和人工监督预算内运行。对于每个标记的互动都涉及人类顾问可以提供更好的护理,但在规模上成本过高。完全自动化的响应可以降低成本,但在复杂情况下可能会提供不适当的指导。

法律合规性:满足强制报告要求和责任标准。在许多司法管辖区,检测到即将到来的伤害的系统必须通知当局——无论临床判断通知是否有助于或伤害患者,都应优先考虑患者自主权和隐私。

这些价值观不是定义不明确的、可以通过更好的工程来调和的要求。它们反映了关于系统应实现什么以及应优先考虑谁的根本不同的概念。优化医疗效果(积极干预)与患者自主权(最小干预)直接冲突。隐私保护(不保留数据)与资源效率(从互动中学习)冲突。法律合规性(强制报告)可能与临床效果(基于信任的治疗关系)冲突。

没有算法决定哪个价值应该占主导地位。不同的利益相关者持有合法的不同立场:临床医生可能优先考虑效果,青少年可能优先考虑自主权,律师可能优先考虑合规性,预算官员可能优先考虑效率。技术团队必须促进利益相关者的审议,以确定在特定背景下哪些权衡是可以接受的——这是一个根本性的规范性决策,它先于并限制了技术优化。

对于一个利益相关者来说,什么是公平的结果,可能被另一个利益相关者视为不公平。同样,优先考虑准确度或效率的决定可能与透明度、个人自主权或减少伤害等目标相冲突。这些紧张关系并非偶然——它们是结构性的。它们反映了机器学习系统嵌入的社会的多元性以及它们部署的机构环境。

公平性是价值冲突特别突出的领域。公平性可以通过多种方式形式化,通常是不兼容的。一个满足人口比例的模型可能会违反平等机会;一个优先考虑个体公平性的模型可能会破坏组级平等。在这些定义之间进行选择不仅仅是技术决策,而是规范性决策,受领域背景、歧视的历史模式以及受模型结果影响的人的视角所指导。在实践中,包括工程师、用户、审计员和监管机构在内的多个利益相关者可能对哪些定义最合适以及为什么持有相互冲突的观点。

这些紧张关系并不仅限于公平性。在可解释性和预测性能、隐私和个人化、或短期效用和长期后果之间也出现冲突。这些权衡在不同的系统部署架构中表现不同,揭示了价值冲突如何与 ML 系统的设计和操作紧密相连。

考虑在移动设备上部署的基于语音的助手。为了提高个性化,系统可能在本地学习用户偏好,而不将原始数据发送到云端。这种设计提高了隐私性并减少了延迟,但可能会导致使用模式代表性不足的用户收到不准确或反应迟钝的预测。提高公平性的方法之一是使用组级统计信息集中更新——但这样做会引入新的隐私风险,并可能违反用户对本地数据处理方面的期望。在这里,设计必须在有效但相互竞争的价值之间进行权衡:隐私、公平性和个性化。

在基于云的部署中,例如信用评分平台或推荐引擎,透明度和专有保护之间常常出现紧张关系。最终用户或监管机构可能要求对决策原因进行明确解释,尤其是在具有重大后果的情况下,但使用的模型可能依赖于复杂的集成或专有训练数据。透露这些内部信息可能具有商业敏感性或技术上不可行。在这种情况下,系统必须协调机构问责制和商业机密之间的竞争压力。

在边缘系统中,例如家庭安全摄像头或自主无人机,资源限制通常决定了模型选择和更新频率。优先考虑低延迟和能源效率可能需要部署压缩或量化的模型,这些模型对分布变化或对抗性扰动的鲁棒性较低。更健壮的模型可以提高安全性,但它们可能超出系统内存预算或违反功率限制。在这里,必须在硬件强加的权衡下平衡安全性、效率和可维护性。在资源受限的环境中实施负责任的 AI,效率技术和优化方法是必不可少的。

在 TinyML 平台上,由于模型被部署到没有持久连接的微控制器上,权衡变得更加明显。一个系统可能在固定数据集上的静态性能得到优化,但无法纳入新的公平约束、在更新的输入上进行重新训练或一旦部署就生成解释。硬件约束从根本上塑造了在资源受限设备上可行的负责任 AI 实践。价值冲突不仅在于模型优化了什么,还在于系统在部署后能够支持什么。

这些例子清楚地表明,规范性多元主义不是一个抽象的哲学挑战;它是一个反复出现的系统约束。诸如多目标优化、约束训练和公平感知评估等技术方法可以帮助揭示和形式化权衡,但它们并不能消除对判断的需求。关于代表哪些价值观、减轻哪些伤害以及如何平衡相互冲突的目标的决定,不能通过算法来做出。这些决策需要深思熟虑、利益相关者的输入以及超越模型本身的治理结构。

参与式和价值观敏感的设计方法提供了前进的潜在途径。这些方法不是将价值观视为部署后要优化的参数,而是在需求阶段就寻求与利益相关者互动,明确定义伦理权衡,并追踪它们如何在系统架构中实现。虽然没有任何设计过程能够同时满足所有价值观,但那些对其权衡透明并开放修订的系统更有可能随着时间的推移维持信任和问责制。

机器学习系统不是中立的工具。它们嵌入并实施价值判断,无论是明确指定的还是隐含假设的。对负责任的 AI 的承诺需要承认这一事实,并构建能够反映和响应其操作环境中的伦理和社会多元主义的系统。

解决这些价值冲突需要不仅仅是技术解决方案——它需要透明度和可争议性的机制,允许利益相关者理解和挑战系统决策。

透明度和可争议性

透明度被广泛认为是负责任机器学习的基础原则。它使用户、开发者、审计员和监管机构能够理解系统的工作方式,评估其局限性,并确定伤害的来源。然而,透明度本身并不足够。在高风险领域,个人和机构不仅需要理解系统行为,还必须在必要时能够挑战、纠正或逆转它。这种可争议性,即质疑和挑战系统决策的能力,是问责制的一个重要特征。

机器学习系统的透明度通常关注于披露:揭示模型是如何训练的,它们依赖哪些数据,它们设计中嵌入的假设是什么,以及哪些已知的限制影响了它们的使用。模型卡片和数据集的数据表等文档工具通过将系统元数据正式化在结构化、可重复的格式中,支持这一目标。这些资源可以提高治理水平,支持合规性,并告知用户期望。然而,作为披露的透明度并不能保证有意义的控制。即使技术细节可用,用户可能缺乏机构的使用、界面工具或程序性访问来质疑对他们产生不利影响的决策。

要从透明度过渡到可质疑性,机器学习系统必须设计有解释、救济和反馈的机制。解释指的是系统提供可理解的理由以支持其输出的能力,这些理由针对接收者的需求和情境量身定制。救济指的是个人改变其情况并获得不同结果的能力。反馈指的是用户报告错误、质疑结果或发出关注,并且这些信号被纳入系统更新或监督流程的能力。

这些机制在实践中往往缺乏,尤其是在大规模部署或嵌入低资源设备中的系统。例如,在移动贷款申请系统中,用户可能会收到没有解释的拒绝,并且没有机会提供额外信息或上诉决策。即使其他地方存在文档,界面级别的透明度不足使得系统实际上无法被质疑。同样,在临床环境中部署的预测模型可能会生成一个指导治疗决策的风险评分,而不向医生展示其背后的推理。如果模型对特定患者群体表现不佳,而这种行为不可观察或不可质疑,结果可能是无法轻易诊断或纠正的无意伤害。

从系统角度来看,实现可质疑性需要跨技术和管理组件的协调。模型必须提供足够的信息以支持解释。界面必须以可用和及时的方式展示这些信息。必须建立组织流程来审查反馈、回应上诉和更新系统行为。日志和审计基础设施必须跟踪不仅模型输出,还包括用户干预和覆盖决策。在某些情况下,包括人工干预覆盖和决策放弃阈值在内的一些技术保障措施,也可能通过确保模糊或高风险决策推迟到人类判断来服务于可质疑性。

可行的可竞争程度因部署环境而异。在集中式云平台上,可能可以提供完整的解释 API、用户仪表板和申诉工作流程。相比之下,在边缘和 TinyML 部署中,可竞争性可能仅限于基于批量同步反馈的日志记录和定期更新。在所有情况下,机器学习系统设计都必须承认透明性不仅仅是技术披露的问题。它是系统的一个结构属性,决定了用户和机构是否能够有意义地质疑、纠正和治理自动化决策的行为。

实施有效的透明度和可竞争性机制需要机构支持和治理结构,这些结构超越了单个技术团队。

责任的机构嵌入

机器学习系统并非独立运作。它们的发展、部署和持续管理嵌入在包括技术团队、法律部门、产品所有者、合规官员和外部利益相关者的机构环境中。在这样的系统中,责任不是单个行为者或组件的属性——它是分布在不同角色、工作流程和治理过程中的。因此,设计负责任的 AI 需要关注这些系统构建和使用的机构环境。

这种责任分布的特性既带来了机遇也带来了挑战。一方面,多个利益相关者的参与提供了制衡,有助于防止有害结果。另一方面,责任的扩散可能导致问责制差距,当出现问题时,可能不清楚问题出在数据管道、模型架构、部署配置、用户界面或周围的组织环境中。

一个典型的案例是谷歌流感趋势,这是由于机构不匹配而广泛引用的失败例子。该系统试图从搜索数据中预测流感爆发,最初表现良好,但由于用户行为的变化和数据分布的转移,逐渐与现实脱节。这些问题多年未得到纠正,部分原因是因为没有建立系统验证、外部审计或模型性能下降时的升级流程。失败并非由于单个技术缺陷,而是由于缺乏能够应对漂移、不确定性和来自开发团队外部的反馈的机构框架。

在机构中嵌入责任需要不仅仅是分配问责制。它需要设计流程、工具和激励措施,以允许负责任的行为。如版本化模型注册表、模型卡片和审计日志等技术基础设施必须与如伦理审查委员会、模型风险委员会和红队程序等组织结构相结合。这些机制确保技术见解是可操作的,反馈在团队间得到整合,并且用户、开发者或监管机构提出的问题得到系统性的解决,而不是临时性的。

所需的机构支持水平因部署环境而异。在大规模云平台上,治理结构可能包括内部问责审计、合规工作流程以及负责监控系统行为的专门团队。在较小规模的部署中,包括嵌入医疗设备或公共基础设施中的边缘或移动系统,治理可能依赖于跨职能的工程实践和外部认证或监管。在 TinyML 部署中,由于连接性和可观察性有限,机构责任可能通过上游控制来行使,例如安全重要的验证、嵌入式安全约束和部署固件的整个生命周期跟踪。

在所有情况下,负责任的机器学习都需要技术系统和机构系统之间的协调。这种协调必须扩展到整个模型生命周期——从最初的数据采集和模型训练到部署、监控、更新以及最终的退役。它还必须纳入外部参与者,包括领域专家、民间社会组织和监管机构,以确保责任不仅限于开发团队,而且在整个机器学习系统运行的更广泛生态系统中得到行使。

责任不是一个模型或团队的静态属性;它是系统如何治理、维护和随时间争议的动态属性。通过政策、基础设施和问责机制将这种责任嵌入机构中,对于使机器学习系统与它们旨在服务的社交价值和运营现实相一致至关重要。

这些关于机构责任和价值冲突的考虑表明,负责任的 AI 实施不仅超越了技术解决方案,还包括更广泛的关于访问、参与和环境影响的议题。前一小节中探讨的计算资源需求创造了系统性障碍,决定了谁可以开发、部署并从负责任的 AI 能力中受益——将负责任的 AI 从个体系统属性转变为集体社会挑战。

本节探讨了本节中探讨的社会技术考虑因素——创建自我强化的差异的系统反馈循环、自动化偏见和算法厌恶等人类-人工智能协作挑战、利益相关者价值观的规范性多元主义以及计算公平性差距——揭示了为什么仅凭第 17.5 节中的技术基础无法确保负责任的人工智能。这些动态在算法、人类、组织和社会的交汇处运作,静态的公平性指标证明是不够的,而竞争性价值观无法通过算法调和。然而,即使在明确的原则和可靠的技术方法下,将负责任的人工智能转化为实际操作实践也面临着巨大的实施挑战。

实施挑战

上述考察的技术基础和社会技术动态确立了负责任的人工智能系统应实现的目标,但实质性的障碍阻止了这些能力在实际操作中有效运行。考虑一下之前探讨的方法如何遇到组织障碍:例如,公平性检测算法如 Fairlearn 需要持续的数据收集和监控基础设施,但许多组织缺乏针对公平性指标的执行流程。差分隐私机制需要仔细的参数调整和性能监控,然而团队可能缺乏在隐私与效用权衡方面的专业知识。可解释性框架生成特征归因分数,但如果没有设计出使解释对受影响用户可访问的系统,这些技术能力无法提供实际效益。

这些例子说明了技术能力与实际操作实施之间的基本差距。虽然负责任的人工智能方法提供了必要的工具,但它们的有效性完全取决于组织结构、数据基础设施、评估流程以及超越算法开发的持续承诺。理解这些实施挑战对于构建能够在长时间内保持负责任行为的系统至关重要,而不仅仅是实现初始部署时的目标。

本节通过使用提供分析实施障碍系统结构的经典人-流程-技术框架,探讨了将负责任的人工智能实践嵌入到生产机器学习系统中的实际挑战。

人员挑战包括组织结构、角色定义、激励一致性和利益相关者协调,这些因素决定了负责任的人工智能原则是否能够转化为持续的组织行为。流程挑战涉及标准化差距、生命周期维护程序、竞争优化目标和评估方法,这些因素影响负责任的人工智能实践如何与开发工作流程相结合。技术挑战包括数据质量限制、计算资源限制、可扩展性瓶颈和基础设施缺口,这些因素决定了负责任的人工智能技术是否能够在生产规模上有效运行。

这些挑战共同展示了理想化原则与实际操作现实之间的摩擦。理解它们之间的相互联系对于开发将责任嵌入到机器学习部署的架构、基础设施和工作流程的系统级策略至关重要。

以下分析通过三个相互关联的视角来审视实施障碍,认识到有效的负责任人工智能需要协调解决方案,同时解决这三个维度。

组织结构及激励机制

负责任机器学习的实施不仅受技术可行性的影响,还受系统开发和部署的组织环境的影响。在公司、研究实验室和公共机构中,责任必须转化为具体的角色、工作流程和激励机制。然而,在实践中,组织结构往往分散责任,使得在工程、产品、法律和运营团队之间协调道德目标变得困难。

负责任的人工智能需要持续投资于诸如子群性能评估、可解释性分析、对抗性鲁棒性测试以及集成差分隐私或联邦训练等隐私保护技术的实践。这些活动可能耗时且资源密集,但它们往往超出了用于评估团队生产力的正式绩效指标。例如,团队可能会被激励快速发布功能或达到性能基准,即使这样做会损害公平性或忽视潜在的危害。当道德尽职调查被视为一项可选择的任务,而不是系统生命周期的集成组成部分时,它就会在截止日期压力或组织动荡下变得容易受到优先级降低的影响。

由于所有权的不确定性,责任问题进一步复杂化。在许多组织中,没有单一团队负责确保系统在一段时间内表现出道德行为。模型性能可能由一个团队拥有,用户体验由另一个团队拥有,数据基础设施由第三个团队拥有,合规性由第四个团队拥有。当出现问题时,包括预测中的不同影响或解释质量不足,可能没有明确的协议来识别根本原因或协调缓解措施。因此,开发者、用户或审计员提出的问题可能得不到解决,这不是因为恶意意图,而是由于缺乏流程和跨职能协调。

建立有效的组织结构以负责人工智能不仅需要政策声明。它需要操作机制:指定具有道德监督责任的职位,明确定义的升级途径,对部署后监控的责任,以及奖励团队进行道德前瞻性和系统可维护性的激励措施。在一些组织中,这可能采取负责任的人工智能委员会、跨职能审查委员会或与开发者一起在整个模型生命周期中工作的模型风险团队的形式。在其他组织中,领域专家或用户倡导者可能被嵌入到产品团队中,以预测下游影响并评估情境中的价值权衡。

如图 17.8 所示,道德系统行为的责任分布在多个利益相关者之间,包括行业、学术界、民间社会和政府。在组织中,这种分布必须通过将技术设计与技术监督和操作控制相连接的机制来反映。没有这些联系,责任就会变得模糊,良好的意图可能会被系统性的不协调所破坏。

图片

图 17.8:利益相关者责任:有效的人本人工智能实施需要行业、学术界、民间社会和政府之间的共同责任,以解决道德考虑和系统性风险。这些不同的群体塑造技术设计、战略监督和操作控制,确保在整个模型生命周期中负责任的人工智能开发和部署。来源:(Shneiderman 2020)。

负责任的人工智能不仅仅是技术卓越或监管合规的问题。这是一个系统级挑战,需要将道德目标与机器学习系统设计、部署和维护的机构结构相一致。创建和维持这些结构对于确保责任不仅嵌入到模型中,还嵌入到管理其使用的组织中至关重要。

除去组织挑战之外,团队还面临着与数据质量和可用性相关的重大技术障碍。

数据限制和质量差距

尽管广泛认识到数据质量对于负责任的机器学习的重要性,但在实践中,提高数据管道仍然是实施中最困难的问题之一。开发人员和研究人员通常理解代表性数据、准确标注和历史偏差缓解的重要性。然而,即使意图明确,结构和组织障碍经常阻止有意义的干预。数据责任通常分散在各个团队之间,受制于遗留系统,或者嵌入在难以改变更广泛的机构流程中。

第六章中涵盖的数据工程原则——包括数据验证、模式管理、版本控制、血缘跟踪和质量监控——为解决这些挑战提供了技术基础。然而,将这些原则应用于负责任的 AI 引入了额外的复杂性:公平性需要评估人口统计群体中的代表性,偏差缓解需要理解历史数据收集实践,隐私保护则限制了哪些验证技术是允许的。这里描述的组织挑战反映了拥有强大的数据工程基础设施和使用它来有效支持负责任 AI 目标之间的差距。

子群不平衡、标签模糊性和分布偏移,这些问题都会影响跨领域的泛化能力和性能,在负责任的机器学习中是众所周知的问题。这些问题通常以校准不良、分布外失败或在评估指标中的人口统计差异的形式出现。然而,在现实环境中解决这些问题需要不仅仅是技术知识。它需要访问相关数据、机构对补救措施的支持,以及足够的时间和资源来迭代数据集本身。在许多机器学习流程中,一旦数据收集完成并定义了训练集,数据管道实际上就变得冻结了。团队可能既缺乏修改或扩展数据集的权威性,也缺乏基础设施,即使发现了性能差异也是如此。即使在具有自动化验证和特征存储的现代数据管道中,一旦数据集版本和数据血缘被锁定到生产中,事后纠正训练分布仍然困难。

在医疗保健、教育和社会福利等领域,这些挑战尤为突出。数据获取可能受到法律约束、隐私法规或跨组织协调的限制。例如,一个开发分级模型的团队可能会发现他们的训练数据未能充分代表来自较小或农村医院的病人。纠正这种不平衡需要与外部合作伙伴协商数据访问、统一特征标准以及解决标签实践中的不一致性。即使所有各方都同意需要改进,这些后勤和运营成本也可能具有威慑力。

收集更具代表性数据的努力也可能遇到伦理和政治方面的担忧。在某些情况下,额外的数据收集可能会使边缘化群体面临新的风险。这种暴露的悖论,即那些最被排除在外的人也是最容易受到滥用伤害的人,使得通过数据集扩展来提高公平性的努力复杂化。例如,为了支持性别敏感应用中的公平性,收集更多关于非二元个体的数据可能会提高模型覆盖范围,但也引发了关于同意、可识别性和下游使用的严重担忧。团队必须谨慎地处理这些紧张关系,通常在没有明确机构指导的情况下。

即使数据量充足,数据收集系统中的上游偏见也可能无法得到控制。许多组织依赖第三方数据供应商、外部 API 或运营数据库,这些数据库在设计时并未考虑公平性或可解释性。例如,在临床机器学习中常用的电子健康记录,通常反映了护理中的系统性差异,以及编码种族或社会经济偏见的记录习惯(Himmelstein, Bates, and Zhou 2022)。下游工作的团队可能对如何创建这些记录几乎没有任何了解,并且几乎没有解决嵌入的损害的杠杆。

提高数据集质量通常不是任何一团队的职责。数据管道可能由基础设施或分析团队维护,这些团队独立于机器学习工程或模型评估团队运作。这种组织上的碎片化使得协调数据审计、追踪数据来源或实施将模型行为与潜在数据问题相连接的反馈循环变得困难。在实践中,数据集质量的责任往往被忽视——虽然认识到其重要性,但很少被优先考虑或分配资源。

解决这些挑战需要长期投资于基础设施、工作流程和跨职能沟通。技术工具,如数据验证、自动审计和数据集文档框架(例如,模型卡片、数据表或数据营养项目)可以帮助,但只有当它们嵌入到拥有行动权限和支持的团队中时才能发挥作用。提高数据质量不仅仅是更好的工具问题,而是关于如何在整个系统生命周期中分配、共享和维持数据责任的问题。

即使解决了数据质量挑战,团队在平衡多个竞争目标时仍面临额外的复杂性。

平衡竞争目标

机器学习系统设计通常被描述为一个优化过程——提高准确性、减少损失或最大化效用。然而,在负责任的机器学习实践中,优化必须与一系列竞争目标相平衡,包括公平性、可解释性、鲁棒性、隐私和资源效率。这些目标并不总是协调一致,一个维度的改进可能涉及另一个维度的权衡。虽然这些紧张关系在理论上得到了很好的理解,但在现实世界系统中管理它们是一个持续存在且未解决的挑战。

考虑模型准确性与可解释性之间的权衡。在许多情况下,包括浅层决策树和线性模型在内的更可解释的模型,其预测性能低于复杂的集成方法或深度神经网络。在低风险应用中,这种权衡可能是可接受的,甚至更受欢迎。但在高风险领域,如医疗保健或金融,决策会影响个人的福祉或机会获取,团队往往陷入对性能的需求和透明推理的需求之间。即使开发过程中优先考虑可解释性,在部署时也可能为了模型准确性的微小提升而牺牲可解释性。

在个性化与公平性之间也存在类似的紧张关系。一个旨在最大化用户参与度的推荐系统可能会采取激进的个性化策略,使用细粒度的行为数据来调整输出以适应单个用户。虽然这种方法可能提高某些用户的满意度,但它可能会加剧不同人口群体之间的差异,尤其是如果个性化依赖于与种族、性别或社会经济地位相关的特征。添加公平性约束可能会在群体层面上减少差异,但代价是降低某些用户感知到的个性化程度。这些影响往往难以衡量,而且在压力下优化参与度指标的产品团队中,解释这些影响更加困难。

隐私引入了另一组约束。诸如差分隐私、联邦学习或本地数据最小化等技术可以有意义地降低隐私风险。但它们也引入了噪声,限制了模型容量,或减少了训练数据的访问。在集中式系统中,这些成本可能通过基础设施扩展或混合训练架构来吸收。然而,在边缘或 TinyML 部署中,这些权衡更为尖锐。一个负责本地推理的可穿戴设备必须经常在模型复杂性、能耗、延迟和隐私保证之间进行权衡。支持一个约束通常会削弱另一个,迫使系统设计者在同等重要的目标之间进行优先级排序。这些紧张关系通过特定部署的设计决策进一步放大,例如量化级别、激活裁剪或压缩策略,这些都影响模型同时支持多个目标的有效性。

这些权衡并非纯粹的技术问题——它们反映了关于系统设计目标及其面向对象的更深层次的规范性判断,这在第 17.6.3 节中已有详细探讨。负责任的机器学习开发需要明确这些判断,在特定情境中评估它们,并使它们接受利益相关者和机构的监督。

使这一挑战在实施中尤其困难的是,这些相互竞争的目标很少由单一团队或功能拥有。性能可能由建模团队优化,公平性由负责任的 AI 团队监控,隐私由法律或合规部门处理。没有明确的协调,系统级别的权衡可能被隐性地、零散地做出,或者没有对长期后果的可见性。随着时间的推移,结果可能是一个在孤立状态下表现良好的模型,但嵌入到生产基础设施中时却未能达到其伦理目标。

平衡相互竞争的目标不仅需要技术熟练,还需要对透明度、深思熟虑和团队间的协调一致做出承诺。系统必须设计成揭示权衡而不是掩盖它们,为约束感知的开发留出空间,而不是追求狭隘的优化。在实践中,这可能需要重新定义“成功”的含义——不是指单一指标上的表现,而是指系统行为与其在更广泛的社会或运营环境中的预期角色之间的持续一致。

在这些前三个挑战——组织结构、数据质量和竞争目标中——出现了一种模式:负责任的人工智能失败很少源于技术无知。团队了解公平性指标、隐私技术和偏差缓解方法。相反,失败发生在组织碎片化的交汇处,这种碎片化将责任分配出去但没有问责制,数据约束在明确意图的情况下甚至创造了技术障碍,以及竞争目标迫使规范权衡,这些权衡被伪装成技术问题。当建模团队优化性能,合规团队处理隐私,产品团队独立优先考虑参与度时,系统级别的道德行为是偶然出现的而不是设计出来的。这些问题本质上是跨组织边界的社会技术治理问题,需要明确的所有权结构,设计用于道德审计的数据基础设施,以及明确价值权衡的审议过程。当系统必须随着时间的推移在规模上维持负责任的行为时,这些挑战变得更加尖锐。

可扩展性和维护

负责任的机器学习实践通常在模型开发的早期阶段被引入:在初始评估期间进行公平性审计,在模型选择期间应用可解释性方法,并在训练期间考虑隐私保护技术。然而,随着系统从研究原型过渡到生产部署,这些实践往往退化或消失。在原则上可能实现与在生产中可持续实现之间的差距是负责任人工智能的核心实施挑战。

许多负责任的人工智能干预措施并没有考虑到可扩展性。公平性检查可能在一个静态数据集上执行,但并未整合到持续的数据摄入管道中。解释方法可能使用开发时间工具开发,但从未转化为可部署的用户界面。隐私约束可能在训练期间实施,但在部署后监控或模型更新期间被忽视。在每种情况下,开始时作为负责任设计意图的东西,在系统扩展和生命周期变化中未能持续。

生产环境引入了新的压力,这些压力重塑了系统优先级。模型必须在不同的硬件配置上运行,与不断发展的 API 接口,以低延迟为百万用户提供服务,并在操作压力下保持可用性。例如,在 CPU、GPU 和边缘加速器之间保持一致行为需要框架抽象、运行时调度器和硬件特定编译器之间的紧密集成。这些限制要求持续适应和快速迭代,通常会导致难以自动化或衡量的活动被降级。负责任的 AI 实践,特别是涉及人工审查、利益相关者咨询或事后评估的实践,可能难以轻松地融入快速发展的 DevOps35 管道。

维护引入了更多的复杂性。机器学习系统很少是静态的。新数据被摄入,重新训练被执行,功能被弃用或添加,使用模式随时间变化。在没有严格的版本控制、变更日志和影响评估的情况下,很难追踪系统行为如何演变,或者与责任相关的属性,如公平性或鲁棒性是否得到了保留。组织的人员流动和团队重组可能会侵蚀机构记忆。负责维护已部署模型的团队可能不是最初开发和审计它的团队,这可能导致系统目标与当前实施之间出现无意的不一致。这些问题在持续学习或流式学习场景中尤其严重,因为概念漂移和数据分布的变化需要积极的监控和实时更新。

这些挑战在多模型系统和跨平台部署中更加突出。推荐引擎可能包含数十个相互作用的模型,每个模型都针对不同的子任务或用户群体进行了优化。在移动和边缘环境中部署的语音助手可能维护同一模型的不同版本,这些版本针对本地硬件限制进行了调整。在如此分布式的系统中协调更新、确保一致性和维持负责任的行为,需要的基础设施不仅要跟踪代码和数据,还要跟踪价值和约束。

解决可扩展性和维护挑战需要将负责任的 AI 视为生命周期属性,而不是一次性评估。这意味着将审计钩子、元数据跟踪和监控协议嵌入到系统基础设施中。这也意味着创建跨团队过渡持续存在的文档,定义在项目移交中存活的问责结构,并确保系统更新不会无意中抹去在公平性、透明度或安全性方面取得的来之不易的改进。虽然这些做法可能难以事后实施,但它们可以通过默认负责任的工具和工作流程从系统设计之初就集成进去。

责任必须与系统规模相匹配。在实际环境中部署的机器学习模型不仅必须在启动时符合伦理标准,而且随着其复杂性、用户范围和运营范围的扩大,必须继续符合这些标准。实现这一点需要持续的机构投资和架构规划——而不仅仅是某一时间点的技术正确性。

标准化和评估差距

尽管负责任的机器学习领域已经产生了大量工具、指标和评估框架,但在如何系统地评估系统在实际操作中是否负责任的问题上,仍然缺乏共识。许多团队认识到公平性、隐私、可解释性和鲁棒性的重要性,但他们往往难以将这些原则转化为一致、可衡量的标准。基准测试方法为标准化评估提供了有价值的框架,尽管将这些方法适应负责任的 AI 指标仍然是发展的一个活跃领域。缺乏正式的评估标准,加上工具和框架的碎片化,对大规模实施负责任的 AI 构成了重大障碍。

这种碎片化现象在机构之间以及机构内部都十分明显。学术研究经常引入新的公平性或鲁棒性指标,这些指标在实验设置之外难以复制。相比之下,工业团队必须优先考虑与生产基础设施无缝集成、非专业人士可解释且可以随时间监控的指标。因此,在一个环境中开发的实践可能无法很好地转移到另一个环境中,并且跨系统性能比较可能不可靠或具有误导性。例如,在一个基准数据集上使用人口统计学平等性评估的公平性模型,可能不符合另一个领域或司法管辖区中均衡机会的要求。没有共享标准,这些评估仍然是临时的,这使得在跨情境中建立对系统负责任行为的信心变得困难。

负责任的 AI 评估也面临着分析单元与部署水平之间的不匹配问题,分析单元通常是单个模型或批量作业,而部署水平包括数据摄取管道、特征转换、推理 API、缓存层以及人机交互工作流程等端到端系统组件。一个在孤立状态下看似公平或可解释的系统,一旦集成到更广泛的应用中,可能就无法保持这些特性。支持整体、系统级评估的工具仍处于发展阶段,而且关于如何评估现代机器学习堆栈中交互组件的责任几乎没有指导。

更进一步,缺乏生命周期感知的指标也使问题复杂化。大多数评价工具都是在单一时间点应用——通常是在部署之前。然而,负责任的 AI 属性,如公平性和鲁棒性,是动态的。它们取决于数据分布如何演变,模型如何更新,以及用户如何与系统互动。没有持续或定期的评价,很难确定系统在部署后是否仍然与其预期的道德目标保持一致。部署后监控工具存在,但它们很少与用于评估初始模型质量的开发时间指标集成。这种脱节使得检测道德性能的漂移或追踪观察到的伤害回溯到其上游来源变得困难。

工具碎片化进一步加剧了这些挑战。负责任的 AI 工具通常分布在分离的包、仪表板或内部系统中,每个系统都针对特定的任务或指标进行设计。一个团队可能使用一个工具进行可解释性分析,另一个工具进行偏差检测,第三个工具进行合规性报告——没有统一的界面来推理系统级别的权衡。缺乏互操作性阻碍了团队之间的协作,复杂了文档,并增加了重要评价被跳过或执行不一致的风险。这些挑战因缺少在特征存储、推理网关和模型注册库等组件之间传播元数据或事件记录的钩子而加剧。

解决这些差距需要从多个方面取得进展。首先,必须开发共享的评价框架,这些框架定义了系统如何负责任地行为——不仅是在抽象的术语中,而且是在可衡量、可审计的标准中,这些标准在各个领域都有意义。其次,评价必须扩展到超越单个模型,涵盖完整的系统管道,包括面向用户的界面、更新策略和反馈机制。最后,评价必须成为一种持续的生命周期活动,由能够跟踪系统行为随时间变化并提醒开发者当道德属性下降的基础设施支持。

没有标准化的、系统感知的评价方法,负责任的 AI 仍然是一个移动的目标——在原则中被描述,但在实践中难以验证。建立对机器学习系统的信心不仅需要更好的模型和工具,还需要共享规范、持久指标以及反映部署 AI 操作现实性的评价实践。

负责任的 AI 不能通过孤立干预或静态合规性检查来实现。它需要架构规划、基础设施支持和制度流程,以在整个系统生命周期内维持道德目标。随着机器学习系统规模的扩大、多样化以及嵌入敏感领域,必须支持在模型选择时间以及重新训练、量化、服务和监控阶段强制执行公平性、鲁棒性和隐私等属性。如果没有持续的监督,负责任的做法会随着系统的发展而退化——特别是当工具、指标和文档没有设计用来在部署及之后跟踪和保存它们时。

应对这一挑战需要更高的标准化、将责任意识实践更深入地集成到 CI/CD 管道中,以及长期投资于支持道德远见的系统基础设施。目标不是在代码中完善道德决策,而是使责任成为一个操作属性——可追踪、可测试,并与大规模机器学习系统的约束和功能相一致。

实施决策框架

鉴于这些实施挑战,实践者需要系统的方法来根据部署上下文和利益相关者的需求优先考虑负责任的 AI 原则。在设计机器学习系统时,实践者必须在维护与系统风险和约束相适应的道德保障的同时,在相互竞争的目标之间进行权衡。表 17.4 提供了一个决策框架,用于做出这些上下文敏感的选择。

决策启发式方法

  • 当多个原则冲突时:与利益相关者合作,确定哪些危害最为严重。在第 17.6.3 节中考察的心理健康聊天机器人示例表明,此类冲突需要深思熟虑,而不是算法解决。

  • 当计算预算受限时:根据风险优先级原则。高风险决策即使在重大成本下也要求公平性和可解释性。低风险应用可以使用轻量级方法。

  • 当部署上下文发生变化时:重新评估原则优先级。从云端模型迁移到边缘会失去集中监控能力——通过部署前的验证和本地安全措施来补偿。

  • 当利益相关者的价值观不同时:明确记录权衡并创建可争议机制,允许受影响的用户挑战决策。

表 17.4:实践者决策框架:根据部署上下文优先考虑负责任的 AI 原则,显示主要原则、实施优先级和不同系统类型的可接受权衡。此框架指导实践者在原则冲突或资源受限时做出适合上下文的决策。

部署环境 主要原则 实施优先级 可接受的权衡
高风险个人决策 (医疗诊断、信贷/贷款、刑事司法、就业) 公平性、可解释性、问责制 在受保护群体中强制执行公平性指标;对负面结果的解释;边缘案例的人类监督 接受 2-5%的准确性降低以实现可解释性;解释的延迟为 20-100 毫秒;更高的计算成本
关键安全系统 (自动驾驶汽车、医疗设备、工业控制) 安全性、鲁棒性、问责制 认证的对抗性防御;形式验证;安全机制;全面的日志记录 接受显著的训练开销(对抗性训练为 100-300%);保守的置信阈值;冗余推理
隐私敏感应用 (健康记录、财务数据、个人通讯) 隐私、安全、透明度 差分隐私(ε≤1.0);本地处理;数据最小化;用户同意机制 接受 2-5%的准确性损失以实现 DP;更高的客户端计算;有限的模型更新;减少个性化
大规模消费者系统 (内容推荐、搜索、广告) 公平性、透明度、安全性 在人口统计学上监测偏差;解释机制;内容政策执行;反馈循环检测 平衡可解释性成本与规模(流式 SHAP 与完整 SHAP);接受 5-15 毫秒的公平性检查延迟;投资于监控基础设施
资源受限部署 (移动、边缘、TinyML) 隐私、效率、安全性 本地推理;数据本地化;输入验证;优雅降级 放弃实时公平性监控;使用轻量级可解释性(SHAP 上的梯度);仅进行部署前的验证;有限的模型复杂性
研究/探索性系统 (内部工具、原型、A/B 测试) 透明度、安全性(防止伤害) 已知限制的文档;限制用户群体;监测意外伤害 可以在内部使用时降低复杂的公平性/可解释性;关注可观察性和快速迭代

该框架提供起始指导。负责任的 AI 实施需要持续评估,因为系统、环境和公众期望都在不断演变。

随着人工智能系统自主性和能力的提升,这些实施挑战变得更加复杂。在第 17.2 节中引入的价值对齐原则——确保人工智能系统追求与人类意图和伦理规范一致的目标——在系统以更高独立性运行时显得尤为重要。虽然上述负责的人工智能技术解决了监督环境中的偏差、隐私和可解释性问题,但自主系统需要额外的安全机制来防止系统目标与人类价值观之间的不一致。

人工智能安全与价值对齐

随着机器学习系统获得自主性和能力,价值对齐挑战急剧扩大。上述负责的人工智能技术——偏差检测、可解释性、隐私保护——提供了基本能力,但当系统以更高独立性运行时,这些技术揭示了根本性的局限性。考虑这些既定方法在自主环境中的失效情况:

类似于 Fairlearn 中实施的方法的偏差检测算法需要持续的人类解释和纠正行动。一辆自动驾驶汽车的感觉系统可能会表现出对检测有行动辅助设备的行人的系统性偏差,但如果没有人类监督,偏差检测指标就只是记录的统计数据,没有补救途径。虽然存在测量偏差的技术能力,但自主系统缺乏判断力来确定适当的反应。

可解释性框架假设有能够解释并采取行动的人类受众。一个自主交易系统可能会为其决策生成完全准确的 SHAP 解释,但如果在系统每秒执行数千笔交易之前没有人审查这些解释,那么这些解释就变得毫无意义。系统通过其设计者从未预料到的方法优化其目标(利润),使得解释成为事后记录而不是决策辅助。

隐私保护技术,如差分隐私,保护个体数据点,但不能解决更广泛的价值不一致问题。一个自主内容推荐系统可能通过局部差分隐私保护用户隐私,同时优化促进错误信息或有害内容的参与度指标。当系统的基本目标与用户福利冲突时,技术隐私合规性变得不足。

这些例子说明了为什么负责的人工智能框架,虽然必要,但随着系统获得自主性而变得不足。这些技术假设了人类的监督、受约束的目标和相对可预测的运行环境。人工智能安全将这些担忧扩展到可能优化与人类意图不一致的目标、在不可预测的环境中运行或通过其设计者未曾预料到的方法追求目标的系统。

随着机器学习系统在自主性、规模和部署复杂性方面的增加,责任的本质超越了模型层面的公平性或隐私问题。它包括确保系统追求正确的目标,在不确定的环境中安全地行为,并且随着时间的推移保持与人类意图的一致。这些问题属于人工智能安全 36 的领域,该领域专注于防止有能力的 AI 系统产生意外或有害的结果。一个核心挑战是,今天的机器学习模型通常优化代理指标 37,例如损失函数、奖励函数或参与度信号,这些指标并不能完全捕捉到人类价值观。

一个具体的例子来自推荐系统,一个被训练以最大化点击率(CTR)38 的模型可能会最终推广那些增加用户参与度但降低用户满意度的内容,包括点击诱饵、错误信息和情感操纵材料。这种行为与代理指标一致,但与实际目标不一致,导致一个强化不理想结果的反馈循环。如图 17.9 图 17.9 所示,系统学会优化可衡量的奖励(点击量)而不是预期以人为中心的成果(满意度)。结果是出现反映规范游戏或奖励黑客 39 的行为——这是价值对齐和人工智能安全中的核心关注点。

图片

图 17.9:奖励黑客循环:最大化可衡量的奖励(如点击量)可能会激励出非预期的模型行为,这些行为会损害用户满意度的预期目标。针对代理指标进行优化会导致系统目标与期望结果之间的不一致,对人工智能安全中的价值对齐构成挑战。

1960 年,诺伯特·维纳写道:“如果我们使用一个我们无法有效干预其操作的机械机构来实现我们的目的……我们最好确保放入机器中的目的是我们想要的” (Wiener 1960)。

随着深度学习模型的能力越来越接近,并在某些情况下超过人类性能,这样的系统可能追求非预期或不希望的目标的担忧变得更加紧迫 (S. Russell 2021)。在人工智能安全领域,一个核心关注点是价值对齐问题:如何确保机器学习系统能够按照广泛的人类意图行事,而不是优化不一致的代理指标或表现出损害社会目标的涌现行为。正如 Russell 在《人类兼容的人工智能》一书中所论证的,当前的大部分人工智能研究都假设要优化的目标是已知且固定的,而将重点放在优化效果上,而不是目标本身的设计。

然而,在现实世界的部署环境中定义“正确的目的”对于智能系统来说尤其困难。机器学习系统通常在动态环境中运行,与多个利益相关者互动,并随着时间的推移进行适应。这些条件使得在静态目标函数或奖励信号中编码人类价值观变得具有挑战性。像价值敏感设计(Value Sensitive Design)这样的框架旨在通过在系统设计过程中提供正式的过程来激发和整合利益相关者的价值观,以应对这一挑战。

从整体的社会技术视角出发,这既考虑了算法机制,也考虑了系统运行的环境,对于确保对齐至关重要。没有这一点,智能系统可能会追求狭窄的性能目标(例如,准确性、参与度或吞吐量),同时产生社会不希望看到的结果。在这样条件下实现稳健的对齐仍然是机器学习系统中一个开放且重要的研究领域。

对齐的缺失可能导致已记录的失败模式,尤其是在优化复杂目标的系统中。例如,在强化学习(RL)中,模型经常学会利用奖励函数的非预期方面——这种现象被称为规范游戏或奖励黑客攻击。当未明确包含在目标中的变量以最大化奖励的方式被操纵,同时违反人类意图时,就会发生此类失败。

近年来,一种特别有影响力的方法是从人类反馈中进行强化学习(RLHF),其中大型预训练模型通过人类提供的偏好信号进行微调(Christiano 等人 2017)。虽然这种方法在标准强化学习的基础上提高了对齐度,但也引入了新的风险。Ngo (Ngo, Chan, and Mindermann 2022) 指出了 RLHF 引入的三种潜在失败模式:(1)情境感知奖励黑客攻击,其中模型利用人类的易错性;(2)出现与训练分布不一致的内部目标;(3)发展出寻求权力的行为,即使牺牲人类监督,也能保持奖励最大化能力。

这些担忧并不仅限于推测性场景。Amodei 等人 (2016) 概述了六个具体的 AI 安全挑战:(1)在策略执行期间避免负面副作用;(2)减轻奖励黑客攻击;(3)在地面真实评估昂贵或不可行时确保可扩展的监督;(4)设计安全的探索策略,以促进创造力而不增加风险;(5)在测试环境中对分布变化具有鲁棒性;(6)在任务泛化中保持对齐。随着系统规模的扩大、在多样化的环境中部署以及与实时反馈或持续学习集成,这些挑战变得更加尖锐。

这些安全挑战在需要减少人类监督的自主系统中尤为明显。

自主系统与信任

独立于人类监督并经常超出人类判断范围的行为自主系统的后果已在多个行业中得到了广泛记录。一个突出的近期例子是加利福尼亚州机动车辆管理局因“对公共安全构成不合理风险”而暂停了 Cruises 的部署和测试许可。其中一起事件涉及一名行人刚刚进入人行横道,此时交通灯变绿——这是一个感知和决策的边缘案例,导致了碰撞。一个更悲惨的例子发生在 2018 年,当时一辆自动驾驶优步车辆在自动驾驶模式下未能将推自行车的行人分类为需要避让的对象,导致了一起致命事故。

尽管自动驾驶系统通常是公众关注的焦点,但类似的风险也出现在其他领域。遥控无人机和自主军事系统已经重塑了现代战争,不仅引发了安全和有效性问题,还提出了关于道德监督、交战规则和责任等棘手问题。当自主系统失败时,谁应该承担责任的问题在法律和道德上仍然悬而未决。

在其核心,这一挑战反映了人类与机器自主性之间的更深层次的紧张关系。工程和计算机科学学科历史上强调机器自主性——提高系统性能、最小化人类干预和最大化自动化。对 ACM 数字图书馆的计量分析发现,截至 2019 年,90%引用“自主性”的最受关注论文都集中在机器自主性,而不是人类自主性(Calvo 等人,2020)。生产力、效率和自动化被广泛视为默认目标,通常没有质疑它们所涉及的人类能动性和监督的假设或权衡。

然而,当系统在动态、不确定的环境中运行,且无法完全指定安全行为时,这些目标可能会使人类利益处于风险之中。这种困难被形式化为框架问题和资格问题,两者都突出了列举所有现实行动成功所需的先决条件和偶然事件的不可能性(麦卡锡 1981)。在实践中,这种限制表现为脆弱的自主性:在名义条件下看似有能力的系统,在面临模糊性或分布变化时可能会无声或危险地失败。

为了解决这个问题,研究人员提出了形式化的安全框架,如责任敏感安全(RSS)(沙莱夫-施瓦茨、沙玛和沙舒亚 2017),它将抽象的安全目标分解为对系统行为的数学定义约束——例如最小距离、制动配置文件和优先通行条件。这些公式允许在特定的假设和场景下验证安全属性。然而,这种方法仍然容易受到它们旨在解决的问题的相同限制:它们的效果取决于编码到其中的假设,并且通常需要广泛的领域建模,这可能无法很好地推广到未预见的边缘情况。

一种替代方法强调以人为中心的系统设计,确保人类的判断和监督在自主决策中始终处于核心地位。价值敏感设计(弗里德曼 1996)建议通过明确考虑能力、复杂性、误表示和用户控制的流动性等因素,将用户价值观纳入系统设计。最近,METUX 模型(用户体验中的动机、参与和繁荣)通过识别六个“技术体验领域”——采用、界面、任务、行为、生活和社区,来扩展这种思考,这些领域影响技术如何支持或破坏人类的繁荣(彼得斯、卡洛沃和瑞恩 2018)。这些想法根植于自我决定理论(SDT),该理论将自主性定义为在技术意义上的控制,而不是按照个人的价值观和目标行动的能力(瑞恩和德西 2000)。

在机器学习系统的背景下,这些观点强调了设计架构、界面和反馈机制以保持人类能动性的重要性。例如,优化参与度指标的推荐系统可能会通过不透明的方式塑造用户偏好,从而干扰行为自主性。通过在 METUX 的六个领域内评估系统,设计师可以预测并减轻损害有意义自主性的下游影响,即使短期系统性能看似最优。

除去技术安全考虑之外,自主人工智能系统的部署引发了更广泛的社会担忧,即经济动荡。

人工智能自动化经济影响

在采用人工智能技术的过程中,一个反复出现的问题是广泛的工作岗位转移的可能性。随着机器学习系统能够执行越来越复杂的认知和物理任务,人们越来越担心它们可能会取代现有工人,并减少整个行业可替代就业机会的可用性。这些担忧在具有良好结构化任务的行业中尤为严重,包括物流、制造和客户服务,在这些行业中,基于人工智能的自动化在技术上可行且具有经济激励。

然而,自动化的经济影响在历史上并非前所未有。包括工业机械化和计算机化在内的先前技术变革往往导致就业岗位的转移而不是绝对数量的岗位损失(Shneiderman 2022)。自动化通常降低商品和服务的成本并提高质量,从而扩大了获取渠道并推动了需求。这种需求反过来又创造了新的生产、分销和支持工作形式——有时在相邻行业,有时在以前不存在的新角色中。

工业机器人和流程自动化的实证研究进一步挑战了“无人工厂”的可行性,这种系统旨在在没有人类监督的情况下完全自主运行。尽管数十年来一直在努力,但大多数实现这一自动化水平的尝试都未能成功。根据麻省理工学院未来工作工作组(Work of the Future 2020)的研究,这些努力往往导致零和自动化,其中生产力的提高是以系统灵活性、适应性和容错性为代价的。人类工作者对于需要情境判断、跨领域泛化或系统级调试的任务仍然很重要——这些能力在机器学习模型或自动化框架中仍然难以编码。

相反,工作组倡导一种正和自动化方法,这种方法增强人类工作而不是取代它。该策略强调将人工智能系统整合到工作流程中,其中人类保持监督和控制,例如半自主装配线或协作机器人。它还建议自下而上地识别可自动化任务,优先考虑那些减少认知负荷或消除危险工作,同时选择适当的指标,这些指标可以捕捉效率和弹性。仅基于吞吐量或成本最小化的指标可能会无意中惩罚需要人工介入的设计,而与安全、可维护性和长期适应性相关的更广泛的指标则提供了对系统性能的更全面看法。

尽管如此,长期的经济轨迹并不能消除近期中断的现实。那些技能被自动化取代的工人可能会面临工资停滞、谈判能力下降或长期失业——尤其是在缺乏再培训机会或劳动力市场流动性时。公共和立法努力将在塑造这一转型中发挥重要作用,包括促进自动化利益公平获取的政策。人工智能的积极应用展示了负责任地部署如何创造有益的经济机会,同时解决社会挑战。这些可能包括提升技能计划、社会安全网、最低工资增加以及确保人工智能的分配影响得到监测和解决的企业问责框架。

解决这些经济问题不仅需要深思熟虑的政策,还需要关于人工智能能力和局限性的有效公众沟通。

人工智能素养与沟通

1993 年对 3000 名北美成年人关于“电子思维机器”信念的调查揭示了早期计算的两个主导观点:“人类的有益工具”和“令人敬畏的思维机器” (Martin 1993)。后者反映了人们对计算机的神秘、智能和可能无法控制的看法——“比人聪明、无限、快速且令人恐惧。”这些看法虽然已经过去了几十年,但在机器学习系统时代仍然相关。随着创新步伐的加快,负责任的人工智能发展必须伴随着清晰和准确的科学沟通,特别是关于人工智能技术的能力、局限性和不确定性的沟通。

随着现代人工智能系统超越普通人的理解并开始影响高风险决策,公众叙事往往在乌托邦和反乌托邦的极端之间两极分化。这不仅仅是因为媒体框架,更是由于一个更根本的困难:在技术先进的社会中,科学系统的输出往往被视为神奇的——“只能从它所做的事情来理解,而不是它是如何工作的” (Handlin 1965)。没有技术理解的支撑,像生成模型、自主代理或大规模推荐平台这样的系统可能会被误解或不受信任,阻碍有信息的公众讨论。

在这个领域,科技公司负有责任。夸大的声明、拟人化的营销或模糊的产品发布加剧了炒作和失望的循环,侵蚀了公众的信任。但提高 AI 素养需要的不只是企业信息的克制,还需要对 AI 背景下的科学传播进行系统研究。尽管现代机器学习对社会有影响,但 Scopus 学术数据库的分析发现,只有少数论文涉及“人工智能”和“科学传播”这两个领域(Schäfer 2023)。

解决这一差距需要关注关于 AI 的叙事是如何形成的——不仅由公司,还包括学术机构、监管机构、记者、非营利组织和政策倡导者。这些行为者使用的框架和隐喻极大地影响了公众对 AI 系统中代理、风险和控制的认识(Lindgren 2023)。这些认识反过来又影响了对 AI 的采用、监督和抵制,尤其是在教育、医疗保健和就业等领域,AI 的部署直接与生活经验相交。

从系统角度来看,公众的理解不是外部性——它是部署背景的一部分。关于 AI 系统如何工作的错误信息可能导致过度依赖、错误的指责或安全机制的低利用率。同样,对模型不确定性、数据偏差或决策边界的缺乏理解可能会加剧自动化引起的伤害风险。对于受 AI 影响的个人,针对特定领域的素养建设努力也可以支持再培训和适应(Ng et al. 2021)。

AI 素养不仅仅是技术流利。它关乎建立公众信心,即系统设计者的目标与社会福利相一致——并且那些构建 AI 系统的人不是脱离公众价值观的,而是对他们负责。正如 Handlin 在 1965 年观察到的那样:“即使那些从未获得这种理解的人也需要确信,科学的目标与他们的福祉之间有联系,最重要的是,科学家不是完全脱离他们的人,而是与他们共享一些价值观的人。”

谬误和陷阱

负责任的 AI 将技术工程与复杂的伦理和社会考量相结合,从而在机器学习系统的偏差、公平和问责制性质方面产生误解的机会。对技术解决方案解决伦理问题的吸引力可能会掩盖创建真正负责任的 AI 系统所需的更深刻的制度和社会变革。

谬误: 通过更好的算法和更多数据,可以从 AI 系统中消除偏差。

这种误解假设偏见是一个纯粹的技术问题,需要纯粹的技术解决方案。AI 系统中的偏见往往反映了数据收集过程、标注决策和问题表述中嵌入的更深层次的社会不平等和历史不公正。即使是在综合数据集上训练的完美算法,如果底层数据或评估框架中存在偏见,也可能持续或放大社会偏见。算法公平性需要关于价值观和权衡的持续人类判断,而不是一次性的技术修复。有效的偏见缓解涉及持续的监控、利益相关者参与和制度变革,而不是仅仅依赖算法干预。

陷阱: 将可解释性视为可选功能而不是系统要求。

许多团队将可解释性视为一个锦上添花的特性,可以在模型开发和部署后添加。这种方法未能考虑到可解释性要求如何显著影响模型设计、评估框架和部署策略。事后解释方法往往提供误导或不完整的见解,无法支持实际的决策需求。高风险应用需要从一开始就将可解释性设计到系统架构中,影响关于模型复杂性、特征工程和评估指标的选择,而不是作为事后考虑的补充。

谬误: 伦理 AI 指南和原则自动转化为负责任的实施。

这种信念假设,建立伦理原则或指南可以确保负责任的 AI 发展,而不考虑实施挑战。在实践中,高级原则如公平性、透明度和问责制往往相互冲突,并且与技术要求相冲突。那些只关注原则阐述而不投资于操作化机制的组织,最终往往得到对实际系统行为影响甚微的伦理框架。

陷阱: 假设负责任的 AI 实践只带来成本而不提供商业价值。

团队通常将负责任的 AI 视为监管合规的额外负担,这必然与性能和效率目标相冲突。这种观点忽略了负责任的 AI 实践通过提高系统可靠性、增强用户信任、降低法律风险和扩大市场准入所能提供的重大商业价值。负责任的 AI 技术可以提高模型泛化能力,降低维护成本,并防止部署中的高昂失败。那些将责任视为纯粹的成本而不是战略能力的组织,错失了通过可信赖的 AI 系统建立竞争优势的机会。

陷阱: 在不考虑其系统级性能和可扩展性影响的情况下实施公平性和可解释性功能。

许多团队在分析这些功能如何影响整体系统架构、性能和可维护性之前,就在现有系统中添加了公平性约束或可解释性方法。实时公平性监控可能会引入显著的计算开销,从而降低系统响应速度;而存储复杂模型的可解释性可能会产生大量的存储和带宽需求。有效的负责任 AI 系统需要仔细地与系统架构共同设计公平性和可解释性要求,从最初的设计阶段就考虑负责任 AI 功能和系统性能之间的权衡。

摘要

本章通过四个互补的视角探讨了负责任的 AI,这些视角共同定义了构建值得信赖的机器学习系统的全面工程方法。公平性、透明度、问责制、隐私和安全性的基础原则确立了负责任 AI 系统应实现的目标,但这些原则只有与技术能力、社会技术动态和实施实践相结合才能成为操作性的。

我们考察的技术基础通过偏见检测算法、隐私保护机制、可解释性框架和鲁棒性增强将抽象原则转化为具体系统行为。然而,计算开销分析揭示了这些技术创造了重大的公平性考虑。并非所有组织都能承担全面的负责任 AI 保护,这可能会造成对道德保障的差异化访问。

仅技术正确性本身并不能保证有益的结果。社会技术动态决定了能力是否转化为现实世界的影响:组织激励、人类行为、利益相关者价值观和治理结构决定了结果。没有组织采取行动对其发现采取行动的完美偏见检测算法是无用的;如果用户不理解他们的保护,隐私保护方法也会失败。

实施挑战进一步突显了原则与实践之间的差距,展示了组织结构、数据约束、竞争目标和评估差距如何阻止甚至有良好意图的负责任 AI 努力取得成功。将孤立谬误转化为情境警告强化了负责任 AI 需要持续警惕常见误解,而不是一次性的技术修复。

关键要点

  • 整合至关重要:负责任的 AI 源于原则、技术能力、社会技术动态和实施实践之间的协调一致——任何单一因素都不足以实现

  • 技术方法能够实现但并不保证责任:偏见检测、隐私保护和可解释性工具提供了必要的功能,但它们的有效性完全取决于组织和社交环境

  • 公平性超越算法:计算资源需求创造了系统性障碍,决定了谁可以访问负责任的 AI 保护,将伦理从个体系统属性转变为集体社会挑战

  • 部署环境塑造可能性:云系统支持全面的监控,而 TinyML 设备则需要静态验证——负责任的 AI 必须适应架构限制,而不是强加统一的要求

  • 价值冲突需要深思熟虑:公平性不可能定理表明,竞争性原则不能通过算法来调和,而需要利益相关者的参与和明确的权衡决策

随着机器学习系统越来越多地嵌入关键社会基础设施,负责任的 AI 框架为可信赖的系统建立了基本的基础。然而,责任不仅限于这里所考察的算法公平性、可解释性和安全性问题。负责任的 AI 技术的计算需求——需要 15-30%更多的训练资源、50-1000 倍的解释推理计算和大量的监控基础设施——对环境影响和资源消耗提出了关键问题。

下一章探讨了责任如何涵盖可持续性,考察了训练大型模型的碳足迹、数据中心运营的环境成本以及开发节能 AI 系统的必要性。正如负责任的 AI 询问我们的系统是否公平对待人们一样,可持续 AI 询问我们的系统是否负责任地对待地球。可信赖系统的原则最终需要平衡技术性能、社会责任和环境管理——确保 AI 发展增强人类福祉,而不损害我们的共同未来。


可持续 AI

DALL·E 3 Prompt: 在浅色背景上绘制一个可持续的 AI 网络 3D 插图,该网络与众多环保能源源相连。AI 主动管理和优化其从太阳能阵列、风力涡轮机和水电大坝等来源获取的能量,强调电力效率和性能。深度神经网络遍布其中,从这些可持续资源中获取能量。

图片

目的

为什么资源效率代表一个核心工程约束,它决定了机器学习系统的可行性和可扩展性,而不仅仅是环境考虑?

机器学习系统消耗的计算资源规模挑战了实际部署限制和经济可行性。这些资源需求施加了严格的工程约束:能源成本超过模型开发预算,热限制限制了硬件密度,以及电力基础设施需求限制了部署位置。资源效率直接决定了系统可行性、运营成本和竞争优势,使可持续性成为一个关键的工程学科。理解资源优化技术使工程师能够设计在实用功率、热和经济限制内运行,同时实现性能目标。随着计算需求的指数级增长,资源效率成为决定哪些 AI 应用可以从研究原型扩展到为全球数十亿用户提供服务的部署系统的首要约束。

学习目标

  • 通过能源消耗、碳足迹和资源利用指标量化 AI 系统环境影响

  • 应用测量框架来评估训练和部署架构中的可持续性权衡

  • 评估优化硬件、算法和基础设施能源效率的工程策略

  • 计算机器学习系统生命周期各阶段(包括训练、部署和推理)的碳足迹

  • 评估可再生能源集成策略和 ML 基础设施的碳抵消方法

  • 设计在功率、热和资源限制内运行的可持续 AI 系统

  • 分析生物智能原理,以指导节能 AI 架构开发

  • 实施碳感知计算策略,以实现负责任的 AI 系统部署

可持续 AI 作为工程学科

大规模机器学习系统的普及引发了环境可持续性危机,这直接挑战了该领域的轨迹。本章扩展了第十七章(ch023.xhtml#sec-responsible-ai)中探讨的负责任 AI 原则,处理了计算需求与环境监护之间的关键交汇点。可持续性成为核心系统工程学科,而不仅仅是辅助考虑因素。

当代机器学习应用以前所未有的规模运行,其环境影响现在与成熟的重工业相当。训练(第八章)一个最先进的 AI 模型可能消耗的电力相当于 100 个美国家庭在整整一年中的用电量,其碳足迹相当于数百次往返于纽约和旧金山的飞行。随着人工智能的普及,其环境成本正成为 21 世纪最重大、最隐蔽的挑战之一。

现代人工智能系统的计算强度体现在能源消耗模式上,这种模式对全球基础设施造成了压力:训练大型语言模型所需的能源相当于为数千个住宅单元供电很长时间,而部署应用中的推理工作量(第十三章)推动了数据中心容量和相关资源需求的指数级增长。

这种环境现实已经将可持续性从可选的设计考虑转变为核心工程约束,决定了将人工智能系统从研究原型过渡到生产部署的可行性。能源成本、热约束和电力基础设施要求带来的经济和物理限制,形成了日益制约系统设计决策的瓶颈。计算需求的指数级增长轨迹远远超过了底层硬件的效率改进,这形成了我们所说的人工智能领域的可持续性悖论。

然而,这些约束也提供了将第九章(ch015.xhtml#sec-efficient-ai)和第十章(ch016.xhtml#sec-model-optimizations)中确立的系统工程原则扩展到全面环境责任的机会。能够实现性能优化的方法可以系统地应用于能源效率目标。增强推理吞吐量的硬件加速技术可以同时减少碳足迹。支持可扩展性的分布式计算架构可以实现跨可再生能源基础设施的碳感知调度。

可持续人工智能是提升环境影响为机器学习系统开发中传统性能和成本目标并列的一级设计约束的工程学科。

本章探讨了可持续人工智能作为一个新兴的跨学科领域,它将环境考量融入机器学习系统工程的每个阶段。该学科包括将计算需求转化为碳排放、评估硬件生命周期对资源消耗的贡献,以及评估影响系统性能和环境可持续性的基础设施选择。这里提出的测量、建模和缓解框架代表了与传统的性能优化技术并行的基本工程能力。

本章的范围涵盖了在完整的机器学习系统设计范围内系统性地整合环境考量,从算法效率优化(第九章)到硬件架构选择(第十一章),从数据中心基础设施决策到规范负责部署的政策框架。这种方法将可持续人工智能确立为一个全面的工程框架,用于开发在行星资源边界内运行并保持人工智能技术变革潜力的系统。

人工智能的可持续性危机

人工智能系统已经改变了各个行业的科技能力,但这种变革伴随着环境成本,这些成本威胁到这些进步的长期可行性。人工智能的计算需求创造了可持续性挑战,这些挑战不仅包括能源消耗,还包括碳排放、资源提取、制造影响和电子废物,其规模威胁到长期的技术可行性。

这种可持续性危机体现在三个相互关联的维度。首先,问题识别考察了人工智能的环境影响范围和紧迫性,包括伦理责任和长期可行性担忧。其次,测量和评估提供了量化碳足迹、能源消耗和生命周期影响的框架,包括训练阶段(第八章)和推理阶段(第十三章)。最后,实施和解决方案提出了通过可持续发展实践、基础设施优化和政策框架来缓解的具体策略,这些框架能够实现实际的环境责任。

环境影响规模

人工智能系统消耗的资源规模与传统的重工业相媲美。训练一个大型语言模型需要数千兆瓦时的电力,相当于数百个家庭数月的使用量 1。预计到 2030 年,数据中心(包括人工智能工作负载)将占全球电力消耗的 8%,超过航空业(2.1%)并接近水泥生产(4%)(OECD 2023)2。计算需求增长速度比硬件效率提高速度快 350,000 倍,形成了一种不可持续指数增长模式。

除了直接能源消耗外,人工智能系统通过硬件制造和资源利用推动环境影响。训练和推理工作负载依赖于需要稀土金属的专用处理器,其提取和处理过程会产生污染 3。人工智能应用需求的增长加速了电子垃圾的产生,全球电子垃圾年产量达到 5400 万吨(Forti 等人,2020 年 Forti et al. 2020),由于性能要求的加速,人工智能硬件迅速过时 4。

这些环境挑战需要系统性的理解以及技术、政策和伦理维度上的协调响应,以确保人工智能的发展保持可行性和责任感。

第一部分:环境影响与伦理基础

人工智能的环境影响规模引发了关于发展优先事项和责任的关键问题。在考察测量和缓解策略之前,我们必须了解指导可持续人工智能发展的伦理框架。技术进步与环境保护的交汇产生了关于谁从人工智能进步中受益以及谁承担其生态成本的紧迫决策。

人工智能的环境影响不仅限于技术指标,还涉及公平、正义和长期可持续性问题,这些问题定义了应对这些挑战的紧迫性。

能源消耗和硬件制造的技术现实直接转化为关于环境正义的伦理关切。当训练(第八章)单个语言模型消耗的电力相当于数千个家庭年使用量时,这引发了关于谁从人工智能进步中受益以及谁承担其环境成本的严重问题。随着计算需求的指数增长和资源消耗的加剧,该领域必须面对关于可持续性发展路径的艰难选择,以平衡创新与环境保护责任。

环境正义与负责任的发展

人工智能的环境影响产生了超越技术优化的道德责任。环境可持续性成为可信赖人工智能系统的关键组成部分,扩展了第十七章中涵盖的责任人工智能原则。人工智能开发所需的计算资源将环境成本集中在特定的社区,同时在全球人口中不平等地分配了效益。数据中心每年消耗 1-3%的全球电力和 200 亿加仑的水用于冷却,通常在能源网络依赖化石燃料且水资源面临气候变化压力的地区。

这种环境负担的地域集中性引发了环境正义问题 5,这些问题与更广泛的责任人工智能框架相一致。正如公平性考虑需要审视谁从人工智能系统中受益以及谁承担其风险一样,环境责任要求理解谁承担了人工智能进步的生态成本。承载人工智能基础设施的社区承担了不成比例的环境负担,同时却难以获得人工智能的经济效益,这体现了将道德人工智能框架扩展到超越算法公平,以涵盖环境管理的必要性。

指数增长与物理限制

计算需求的指数增长对人工智能训练和部署的长期可持续性构成了挑战。在过去十年中,人工智能系统以史无前例的速度扩展,计算需求从 2012 年到 2019 年增长了 350,000 倍(Schwartz 等人 2020)6。随着机器学习系统优先考虑具有更多参数的更大模型、更大的训练数据集和更高的计算复杂性,这一趋势仍在继续。维持这一轨迹提出了可持续性挑战,因为硬件效率的收益无法跟上不断上升的人工智能工作负载需求。

从历史上看,随着半导体技术的进步,计算效率得到了提高。摩尔定律 7,即预测芯片上晶体管数量每两年大约翻一番,导致了处理能力和能源效率的持续改进。然而,摩尔定律现在正达到核心物理极限,使得进一步晶体管规模扩大变得困难和昂贵。邓纳德规模 8,曾经确保较小的晶体管在较低功率水平下运行,也已经结束,导致每晶体管的能源效率改进停滞。

虽然人工智能模型在规模和能力上持续增长,但运行这些模型的硬件不再以相同的指数速度提升。计算需求与硬件效率之间的这种日益扩大的差距,创造了一个不可持续的轨迹,其中人工智能消耗着越来越多的能源。这一技术现实强调了为什么可持续的人工智能发展需要在整个系统堆栈中进行协调行动,从个别算法选择到基础设施设计和政策框架。

复杂的人工智能系统,如大型深度学习模型,需要高水平的计算能力,这导致了显著的能源消耗。OpenAI 的 GPT-3 就是这一规模的例证:训练需要 1,287 兆瓦时(MWh)的电力,相当于为 130 个美国家庭供电整整一年(Maslej 等人 2023)9。这种能源消耗代表了在大数据集上训练的计算算法 10,这些算法是现代大型语言模型的特点。

这种规模的能源消耗突显了在人工智能系统中提高效率的迫切需求。近年来,这些生成式人工智能模型越来越受欢迎,导致更多模型以增长参数数量进行训练。

研究表明,增加模型大小、数据集大小和用于训练的计算能力,性能会平稳提升,没有出现饱和的迹象(Kaplan 等人 2020),正如图 18.1 所示,随着这三个因素中的每一个增加,测试损失都会降低。除了训练之外,人工智能驱动的应用,如大规模推荐系统和生成模型,需要持续的大规模推理,即使在训练完成后也会消耗能源。随着人工智能在从金融到医疗保健再到娱乐等行业的采用率不断增长,人工智能工作负载的总能源负担持续上升,引发了关于广泛部署对环境影响的担忧。

图片

图 18.1:模型规模定律:增加模型大小、数据集大小和计算能力,持续降低测试损失,表明通过更大的资源投入,性能提升仍然可行,且没有出现饱和的迹象。这些规模定律表明,在更多数据上使用增加的计算能力训练的更大模型可能会带来进一步的性能提升,从而推动对这些领域的持续投资。来源:(Kaplan 等人 2020)。

除了电力消耗之外,AI 的可持续性挑战还扩展到硬件资源需求和当前架构的能量效率限制。不同的处理器类型通过它们的能量特性影响环境影响,如第十一章所述:中央处理器(CPUs)在每次乘加操作中消耗大约 100 皮焦耳(pJ/MAC),图形处理器(GPUs)达到 10 pJ/MAC,而专门的张量处理单元(TPUs)达到 1 pJ/MAC11,专门的加速器接近 0.1 pJ/MAC。这些硬件平台需要稀土金属和复杂的制造工艺,这些工艺具有固有的碳足迹。

人工智能芯片的生产是能源密集型的,涉及多个制造步骤,这些步骤对整个 AI 系统生命周期中的范围 3 排放做出了重大贡献。随着模型规模的持续增长,对 AI 硬件的需求增加,加剧了半导体生产和处置的环境影响。

生物智能作为可持续性模型

要理解人工智能能源挑战的规模,将当前系统与我们所知的最高效的智能——人脑——进行比较是有帮助的。大脑在仅消耗约 20 瓦功率的情况下执行复杂的推理、学习和模式识别。这种非凡的效率为可持续人工智能设计提供了宝贵的工程见解。大脑的能量效率估计约为每突触操作 10⁻¹⁵到 10⁻¹⁴焦耳,尽管在生物和数字系统之间定义等效的“操作”仍然具有挑战性 12。

训练单个大型语言模型如 GPT-3,在人工和生物智能之间产生了 10⁶倍的能源效率差距。这种比较说明了核心的可持续性挑战:虽然人脑在灯泡的功耗下实现了卓越的学习能力,但当前的 AI 系统需要工业规模的能源基础设施来实现可比的认知任务。

大脑通过几个关键原则实现了这种效率,这些原则与当前的 AI 系统不同。生物系统不是像数字计算机那样连续处理所有信息,而是具有选择性和事件驱动的。它们在任何时候只激活网络的一小部分,并且只在积极处理信息时消耗能量 13。这些设计原则为创建更节能的 AI 架构提供了机会。

生物效率优势不仅超越了能源消耗,还扩展到学习样本效率。儿童在 18 岁之前通过接触大约 10⁸ 个单词来获得语言能力,而大型语言模型需要训练 10¹²+个标记,数据效率相差 10,000 倍。这种差异表明,当前的 AI 架构与生物系统展示的效率学习原则不符。

这些见解指向了可持续人工智能的有希望的研究方向。通过模拟生物稀疏激活模式(Prakash, Stewart, et al. 2023),实现脉冲神经网络 14 架构的类神经形态计算可以针对特定任务实现 100-1000×的能量降低。同样,受生物发展启发的本地学习算法和自监督学习方法,为更高效的样本和节能的人工智能系统提供了途径。理解这些生物原理为开发接近生物能量效率的同时保持或提高性能的人工智能系统提供了路线图。

这些生物见解表明,实现可持续人工智能需要系统性地转变系统设计,从持续活跃的架构转向事件驱动、稀疏计算模型。随着计算需求超过效率改进,解决人工智能的环境影响需要重新思考系统架构、节能计算和基于生物原理的生命周期管理,而不是增量优化。

指数级计算需求与物理效率限制的汇聚创造了一个不可持续的发展轨迹,这威胁到人工智能发展的长期可行性。理解这些限制为开发能够系统性地解决可持续性危机的测量框架和实施策略提供了基础。


第二部分:测量与评估

系统性测量方法使工程师能够做出关于人工智能环境影响的技术决策。可持续人工智能的发展需要三个关键领域的量化框架:训练和推理过程中的能耗跟踪、系统生命周期内的碳足迹分析以及硬件和基础设施的资源利用评估。这些测量工具将可持续性从抽象的关注点转化为具体的工程约束,从而指导架构选择、部署策略和优化优先级。

有效的测量使工程师能够识别优化机会、比较替代设计并验证可持续性改进。如果没有对环境成本来源和设计选择如何影响整体足迹的系统评估,可持续性努力将保持临时性和可能适得其反。

碳足迹分析

碳足迹分析为做出关于人工智能系统可持续性的明智设计决策提供了基础。随着人工智能系统持续扩展,对能耗和资源需求的系统性测量使主动的环境优化方法成为可能。构建和部署人工智能系统的开发人员和公司必须考虑的不仅是性能和效率,还有他们设计选择的环境后果。

伦理挑战在于平衡技术进步与生态责任。追求越来越大的模型往往优先考虑准确性和能力,而不是能源效率,导致碳排放呈指数增长。虽然优化可持续性可能会引入权衡,例如通过修剪和量化等技术,可能导致开发周期延长 10-30%或准确性降低 1-5%,但这些成本与环保效益相比微不足道。将环境考虑纳入 AI 系统设计是一个伦理上的必要要求。这需要将行业规范转向可持续计算实践,例如能源感知训练技术、低功耗硬件设计和碳意识部署策略(D. Patterson et al. 2021a)。

这一伦理要求不仅超越了可持续性,还涵盖了与透明度、公平性和问责制相关的更广泛问题。图 18.2 展示了与 AI 开发相关的伦理挑战,将不可理解的证据、不公平的结果和可追溯性等问题与不透明、偏见和自动化偏见等问题联系起来。这些担忧扩展到可持续性,因为 AI 开发的环保权衡往往不透明且难以量化。能源消耗和碳排放的可追溯性缺乏可能导致不合理的行动,即公司优先考虑性能提升,而不完全理解或披露环境成本。

图片

图 18.2:伦理 AI 问题:AI 系统在透明度、公平性和可持续性方面引入了伦理挑战;这些担忧相互关联,并源于不透明、偏见和资源消耗中缺乏可追溯性等问题。解决这些挑战需要积极的设计选择,优先考虑问责制并最小化对社会和环境的负面影响。来源:(Munn 2022)。

解决这些担忧需要 AI 公司有更高的透明度和问责制。大型科技公司运营着广泛的云基础设施,为现代 AI 应用提供动力,但它们的环境影响仍然不透明。组织必须在整个 AI 生命周期中衡量、报告并减少其碳足迹,从硬件制造到模型训练和推理。自愿自我监管是一个初步步骤,但政策干预和行业标准的制定可能是必要的,以确保长期可持续性。报告的指标,如能源消耗、碳排放和效率基准,可以确保组织问责。

伦理 AI 的发展需要就环境权衡进行公开讨论。研究人员必须在他们的机构和组织中倡导可持续性,确保环境问题被纳入 AI 发展的优先事项。更广泛的 AI 社区已经开始解决这些问题,正如呼吁暂停大规模 AI 实验的公开信所展示的那样,该信件突出了对无序扩张的担忧。培养透明度和道德责任的文化,使 AI 行业能够将技术进步与生态可持续性相一致。

AI 有潜力重塑行业和社会,但其长期可行性取决于负责任的发展实践。伦理 AI 的发展涉及防止对个人和社区造成伤害,同时确保由 AI 驱动的创新不会以环境退化为代价。作为这些技术的守护者,开发者和组织必须将可持续性整合到 AI 的未来轨迹中。

将这些伦理原则转化为实践需要具体的工程解决方案,这些解决方案能够展示可衡量的环境改善。以下案例研究说明了如何设计 AI 系统以优化它们自身的环境影响,展示了可持续 AI 原则的实用实施。

案例研究:DeepMind 能源效率

谷歌的数据中心是搜索、Gmail 和 YouTube 等服务的基础,每天处理数十亿个查询。这些设施需要大量的电力消耗,尤其是确保服务器性能优化的冷却基础设施。提高数据中心的能源效率长期以来一直是优先事项,但由于冷却系统的复杂性和高度动态的环境条件,传统的工程方法面临着收益递减。为了应对这些挑战,谷歌与 DeepMind 合作开发了一个机器学习优化系统,该系统能够自动化并增强大规模的能源管理。

经过十多年的努力优化数据中心设计、节能硬件和可再生能源集成,DeepMind 的 AI 方法针对数据中心中最能耗密集的部分——冷却系统。传统的冷却系统依赖于手动设置的启发式规则,这些规则考虑了服务器的热量输出、外部天气条件和建筑限制。这些系统表现出非线性相互作用,因此简单的基于规则的优化往往无法捕捉到它们操作的完整复杂性。结果是冷却效率不佳,导致不必要的能源浪费。

DeepMind 团队使用谷歌的历史传感器数据训练了一个神经网络模型,这些数据包括实时温度读数、功耗水平、冷却泵活动和其他操作参数。该模型学会了这些因素之间的复杂关系,并能动态预测最有效的冷却配置。与依赖于人类工程师定期调整系统设置的传统方法不同,AI 模型能够实时适应不断变化的环境和工作负载条件。

结果显示效率显著提升。当在实时数据中心环境中部署时,DeepMind 的 AI 驱动冷却系统将冷却能耗降低了 40%,从而使得整体电力使用效率(PUE)提高了 15%16,这是衡量数据中心能源效率的指标,它衡量的是总能耗与仅用于计算任务的能耗之比(Barroso, Hölzle, and Ranganathan 2019)。这些改进是在没有额外硬件修改的情况下实现的,展示了软件驱动优化减少 AI 碳足迹的潜力。

不仅仅局限于单个数据中心,DeepMind 的 AI 模型提供了一个可推广的框架,适用于不同的设施设计和气候条件,为全球数据中心网络中的功耗优化提供了一个可扩展的解决方案。本案例研究例证了 AI 不仅作为计算资源的消费者,而且作为可持续性的工具,推动支持机器学习的基础设施效率改进。

数据驱动决策、实时适应和可扩展 AI 模型的集成展示了智能资源管理在可持续 AI 系统设计中的日益增长的作用。这一突破例证了机器学习如何优化其背后的基础设施,确保更高效的规模化 AI 部署。

碳足迹分析必须考察生命周期两个阶段和排放范围。下文详细介绍的三个阶段生命周期评估框架提供了理解环境成本起源和设计选择如何影响整体足迹的系统方法。

三个阶段生命周期评估框架

有效碳足迹测量需要系统分析三个不同的阶段,这三个阶段共同决定了环境影响:

训练阶段(60-80%的排放)代表了最碳密集的时期,涉及并行计算进行数学优化过程 17。正如 GPT-3 案例研究所示,大型语言模型训练运行体现了这种能源强度。地理位置影响排放:在魁北克(水力发电,0.01 kg CO₂/kWh)与西弗吉尼亚(煤炭发电,0.75 kg CO₂/kWh)之间的碳强度相差 75 倍 18。

推理阶段(排放量的 15-25%)为模型服务和预测生成产生持续的计算成本。虽然单个推理所需的计算量少于训练,但累积影响会随着部署范围和频率的增加而扩大。为百万用户服务的模型会产生持续的排放,在长期部署期间可能超过训练成本。

制造阶段(排放量的 5-15%)从硬件生产中贡献了固碳 19,包括半导体制造、稀土开采和供应链物流。通常被忽视但代表独立于运营效率的不可减少的基线排放。

地理和时间优化

碳强度在不同地理位置和时间段中有所不同,创造了优化机会。通过将计算工作负载与可再生能源的可用性对齐,如白天的高峰太阳能发电,时间调度可以减少 50-80%的排放(D. Patterson, Gonzalez, Le, 等人 2022)。碳感知调度系统可以自动将非紧急的训练任务转移到碳强度较低的区域和时间。

这些地理和时间考虑因素突出了量化人工智能碳影响的复杂性。评估取决于多个因素,包括模型的大小、训练的持续时间、使用的硬件以及为数据中心供电的能源。正如我们的 GPT-3 分析所示,大规模人工智能模型需要数千兆瓦时(MWh)的电力,相当于整个社区的能源消耗。推理阶段所需的能量,即训练好的模型产生输出的阶段,对于广泛部署的人工智能服务(如实时翻译、图像生成和个性化推荐)来说也很大。与相对静态的能源足迹的传统软件不同,人工智能模型持续消耗能量,导致持续的可持续性挑战。

除了直接能源使用之外,人工智能的碳足迹还必须考虑硬件生产和供应链的间接排放。制造人工智能加速器(如 GPU、TPU 和定制芯片)涉及能源密集型的制造过程,这些过程依赖于稀土金属和复杂的供应链。人工智能系统的完整生命周期排放,包括数据中心、硬件制造和全球人工智能部署,必须考虑以开发更可持续的人工智能实践。

理解人工智能的碳足迹需要整合上述建立的测量框架:

  • 三个阶段的生命周期分析:训练(60-80%),推理(15-25%),和制造(5-15%)排放

  • 三种排放类别范围:直接运营、购买的能源和供应链影响

  • 地理和时间优化:利用可再生能源可用性和碳感知调度

分析这些组件有助于更好地评估人工智能系统的真实环境影响,并识别通过更高效的设计、节能部署和可持续基础设施选择来减少其足迹的机会。

在开发期间测量碳足迹需要将跟踪工具集成到机器学习工作流程中,如 列表 18.1 所示。

列表 18.1:碳足迹追踪:使用 CodeCarbon 库在模型训练期间测量排放的示例实现,使数据驱动的可持续性决策成为可能。

from codecarbon import EmissionsTracker
import torch

# Initialize carbon tracking
tracker = EmissionsTracker()
tracker.start()

# Your model training code
model = torch.nn.Linear(100, 10)
optimizer = torch.optim.Adam(model.parameters())

for epoch in range(100):
    # Training step
    loss = model(data).mean()
    loss.backward()
    optimizer.step()

# Get emissions report
emissions = tracker.stop()
print(f"Training emissions: {emissions:.4f} kg CO2")

这种集成使得工程师在开发过程中能够就模型复杂性与环境影响之间做出明智的决策。

数据中心能源消耗模式

人工智能系统代表了最能耗密集的计算工作负载之一,涉及密集操作 20,其消费模式涵盖了训练、推理、数据存储和通信基础设施。理解这些模式可以揭示优化努力可以减少环境影响的地方。能源消耗与模型复杂度非线性相关,通过有针对性的架构和运营优化创造了效率改进的机会。

数据中心能源与人工智能工作负载

数据中心是人工智能系统的首要能源消费者,其电力需求揭示了挑战的规模和具体的优化机会。

数据中心的能源效率在设施之间差异很大:功率使用效率(PUE)在谷歌最有效率的设施中为 1.1,而在典型的企业数据中心中为 2.5,通过基础设施开销实际上加倍了能源消耗。地理位置影响碳强度:在魁北克(水力发电)与西弗吉尼亚(煤炭发电)训练相同的模型,每千瓦时的碳排放差异为 10 倍。没有可再生能源的接入,这些设施严重依赖非可再生能源,如煤炭和天然气,这导致全球碳排放。目前的估计表明,数据中心产生高达 2% 的总全球 CO₂ 排放,这个数字接近航空业的足迹 (Y. Liu 等人 2020)21。由于三个因素:数据中心容量的增加、人工智能训练工作负载的上升和推理需求的增加,预计人工智能的能源负担将呈指数增长 (D. Patterson, Gonzalez, Holzle 等人 2022)。如果不采取干预措施,这些趋势可能会使人工智能的环境足迹变得不可持续 (Thompson, Spanuth, 和 Matthews 2023)。

数据中心能源需求

人工智能工作负载是现代数据中心中最计算密集型的操作之一。例如,Meta 公司运营着跨越多个足球场大小的超大规模数据中心,拥有数十万台经过人工智能优化的服务器 22。大型语言模型(LLMs)如 GPT-4 的训练(第八章)需要超过 25,000 个 Nvidia A100 GPU 连续运行 90 到 100 天(S. Choi 和 Yoon 2024),消耗数千兆瓦时(MWh)的电力。这些设施依赖于高性能人工智能加速器,如 NVIDIA DGX H100 单元,每个单元在峰值功率时可以消耗高达 10.2 kW(Choquette 2023b)。当比较硬件代际时,能源效率差距变得明显:H100 GPU 在人工智能训练工作负载中实现了大约 2.5-3 倍每瓦的性能提升,而混合精度训练可以通过降低计算精度来减少能源消耗,同时最小化精度影响,具体取决于模型架构和硬件,可降低 15-30%(Gholami 等人 2021)。

这种显著能耗反映了人工智能在各个行业的快速应用。如图图 18.3 所示,人工智能工作负载的能源需求预计将增加数据中心的总能源使用,尤其是在 2024 年之后。虽然效率提升抵消了不断增长的电力需求,但这些提升正在放缓,放大了人工智能的环境影响。

图片

图 18.3:预测需求:到 2030 年,人工智能工作负载将显著增加数据中心的电力需求,超过之前的效率提升。这强调了人工智能系统日益增长的环境影响。来源:(Masanet 等人 2020a),思科,国际能源署,高盛全球投资研究。

除了计算需求之外,冷却也是人工智能能源足迹中的另一个主要因素。大规模人工智能训练和推理工作负载产生大量热量,需要先进的冷却解决方案来防止硬件故障。公司已经开始采用替代冷却方法来减少这种需求。例如,微软的爱尔兰数据中心使用附近的峡湾,每天消耗超过五十万加仑的海水来散热。然而,随着人工智能模型复杂性的增加,冷却需求持续增长,这使得可持续人工智能基础设施设计成为一个紧迫的挑战。

分布式系统能源优化

大规模人工智能训练本质上需要分布式系统协调,这会创造额外的能量开销,从而增加了计算需求。分布式训练 23 引入了网络通信成本,这在大集群中可能占总体能耗的 20-40%。在数千个 GPU 上进行的分布式训练需要不断同步计算更新和模型参数 24,在节点之间产生数据移动。这种通信开销扩展得不好:集群规模加倍可能导致网络能耗增加 4 倍,这是由于梯度聚合中的全对全通信模式。

解决这些通信开销,集群范围内的能量优化需要协调的资源管理,这超出了单个服务器效率的范围。动态工作负载放置可以在低需求期间将训练作业合并到更少的节点上,从而实现 15-25%的能量节省。类似地,协调多个数据中心之间的训练的智能调度可以利用时区差异和区域可再生能源的可用性,通过时间负载平衡减少 30-50%的碳强度。

基础设施共享在可持续性分析中往往被忽视,它提供了效率机会。多租户训练环境,其中多个模型训练作业共享同一个集群,可以将 GPU 利用率从典型的 40-60%提高到 80-90%,从而将每训练一个模型的能耗有效减半。资源共享还使批处理优化成为可能,其中多个较小的训练作业合并以更好地利用可用的计算能力,减少维护空闲基础设施的能量开销。

人工智能能耗与其他行业比较

人工智能工作负载的环境影响已成为一个关注点,碳排放量接近于已建立的碳密集型行业水平。研究表明,训练单个大型人工智能模型产生的碳排放量相当于多辆乘用车在其整个生命周期内的排放量(Strubell, Ganesh, 和 McCallum 2019a)。为了说明人工智能的环境足迹,图 18.4 将大规模机器学习任务的碳排放量与洲际航班进行了比较,说明了训练和推理工作负载的能量需求。它展示了从最低到最高的碳足迹的比较,从纽约和旧金山之间的往返航班开始,平均每人每年的人生活动,平均每人每年的美国生活活动,美国汽车包括终身燃料,以及具有神经架构搜索 25 的 Transformer 模型,其碳足迹最高。这些比较强调了需要更多可持续的人工智能实践来减轻行业的碳影响。

图片

图 18.4:碳足迹基准:训练大型人工智能模型产生的碳排放量与日常活动和长途旅行相当,强调了日益复杂的机器学习工作负载的环境影响。将往返航班、平均人类寿命和车辆使用寿命进行比较,突出了训练具有神经架构搜索的转换器模型所需的能源需求之高。来源:Strubell, Ganesh, 和 McCallum (2019a)。

大型自然语言处理模型的训练阶段产生的二氧化碳排放量相当于数百次洲际航班。当考察更广泛的行业影响时,人工智能的总计算碳足迹正接近商业航空部门。随着人工智能应用扩展到为全球数十亿用户提供服务,持续推理操作的累积排放量最终可能超过训练期间产生的排放量。

图 18.5 提供了 Meta 在各个大规模机器学习任务中的碳排放的详细分析,说明了不同人工智能应用和架构的环境影响。这种对人工智能碳足迹的定量评估强调了开发更可持续的机器学习开发和应用方法的迫切需要。了解这些环境成本对于实施有效的缓解策略和负责任地推进该领域至关重要。

图片

图 18.5:大规模机器学习任务的碳足迹。来源:(C.-J. Wu 等人 2022)。

长期碳足迹分析

人工智能的影响不仅限于运行过程中的能耗。人工智能的全生命周期排放包括硬件制造、供应链排放和报废处置,使人工智能成为环境退化的主要贡献者。人工智能模型需要电力进行训练和推理,并且它们还依赖于复杂的半导体制造、稀土金属开采和电子废物处理的设施。下一节将人工智能的碳排放分解为范围 1(直接排放)、范围 2(电力间接排放)和范围 3(供应链和生命周期排放),以提供其环境影响的更详细视图。

综合碳核算方法

综合碳足迹评估将三阶段生命周期分析(训练、推理、制造)与三个标准排放范围(直接运营、购买的能源、供应链影响)相结合。预计到 2030 年,人工智能的年增长率将达到 37.3%,到 2030 年,运营计算能源需求可能增加 1000 倍。这种指数级增长需要了解所有阶段和范围的总体生命周期成本,以确定最具影响力的可持续干预措施。

范围 1 排放(占总量的 5-15%)源自现场发电,包括备用柴油发电机、设施冷却系统和自有发电厂。虽然许多 AI 数据中心主要使用电网电力,但那些拥有化石燃料备用系统或自有发电厂的直接导致排放。

范围 2 排放(占总量的 60-75%)代表为供电 AI 基础设施购买的电力的间接排放。这个主导的运营排放类别因地理位置和电网能源组合而大相径庭。在魁北克(水力发电)与西弗吉尼亚(煤炭发电)训练相同的模型,碳强度相差 75 倍。

范围 3 排放(占总量的 15-25%)构成了最复杂的类别,包括硬件制造、运输和处置。半导体制造 26 是碳密集型的:生产单个高性能 AI 加速器产生的排放相当于几年运营能源的使用。通常被忽视但代表的是不可减少的基准排放,与运营效率无关。

除此之外,范围 3 排放还包括 AI 一旦部署后的下游影响。搜索引擎、社交媒体平台和基于云的推荐系统等 AI 服务以巨大规模运行,需要跨数百万甚至数十亿用户交互进行持续推理。推理工作负载的累积电力需求最终可能超过训练所使用的能源,进一步放大 AI 的碳影响。包括智能手机、物联网设备和边缘计算 27 平台在内的终端设备,也贡献了范围 3 排放,因为它们的 AI 允许的功能依赖于持续的运算。Meta 和 Google 等公司报告称,AI 服务产生的范围 3 排放占其总环境足迹的最大份额,这是由于 AI 运行的规模巨大。

软件开发隐藏的碳成本

除了直接训练和推理的能源使用之外,AI 的整个软件开发生态系统都有显著的、但难以衡量的碳足迹。数百万的持续集成和持续部署(CI/CD)管道运行、开发过程中的持续代码重新编译、GitHub 等大型版本控制系统的运行,以及代码审查系统、自动化测试框架和协作开发平台消耗的计算资源,都导致了环境影响。大型 AI 研究组织可能运行数千次实验性训练运行,其中大部分从未达到生产阶段,在探索过程中消耗了大量能源。这强化了整个 AI 开发生态系统都是能源密集型的,而不仅仅是最终的模型训练和推理阶段。

这些大型设施为在庞大的数据集上训练复杂的神经网络提供了基础设施。例如,根据行业分析(S. Choi 和 Yoon 2024),OpenAI 的语言模型 GPT-4 在 Azure 数据中心进行训练,该数据中心配备了超过 25,000 个 Nvidia A100 GPU,连续使用超过 90 到 100 天。

GHG 协议框架(可持续发展研究所和 2023 年),如图 18.6 所示,提供了一种结构化的方法来可视化与 AI 相关的碳排放来源。该框架将排放分为三个不同的范围,帮助组织了解其环境影响的全部范围:

  • 范围 1(直接排放):这些来自公司的直接运营,例如数据中心的后备发电机和公司拥有的发电基础设施。想象一下,在停电期间,数据中心后面柴油发电机嗡嗡作响的情景。

  • 范围 2(间接能源排放):这些包括从电网购买的电力,代表云计算工作负载的主要排放源。这是某个发电厂供电,为照亮数千个训练你模型的 GPU 提供电力。

  • 范围 3(价值链排放):这些超出了组织的直接控制范围,涵盖了从遥远制造设施中的半导体制造,到运输硬件穿越海洋的货轮,再到最终在电子废物设施中处置 AI 加速器的整个生命周期。

了解这种分解有助于制定更有针对性的可持续发展战略,确保减少 AI 环境影响的努力不仅关注能源效率,而且解决更广泛的供应链和生命周期排放,这些排放对行业的碳足迹贡献很大。

图片

图 18.6:温室气体排放范围:组织将碳排放分为范围 1(直接)、范围 2(购买的能源)和范围 3(价值链),以全面评估其环境影响,并确定针对 AI 系统的针对性减排策略。来源:Ucircularise。

训练与推理能耗分析

准确的环境影响评估需要了解训练和推理阶段独特的能源消耗模式。训练代表了一次性、密集的计算投资,创建了可重复使用的模型能力。推理涉及持续的能量消耗,其规模与部署范围和使用频率成正比。对于广泛部署的 AI 服务,在长期运营期间,累积的推理成本往往超过训练费用。

这种生命周期视角揭示了不同阶段中的优化机会。训练优化侧重于计算效率和硬件利用率,而推理优化强调延迟、吞吐量和边缘部署策略。理解这些权衡使得能够进行有针对性的可持续性干预,以解决特定人工智能应用的能源消耗主要消费者。

训练能源需求

训练最先进的 AI 模型需要巨大的计算资源,需要大量的计算基础设施,包括数以万计的核心和持续数月运行的专用 AI 加速器。OpenAI 为大规模 AI 训练专门构建的超级计算机基础设施包含 285,000 个 CPU 核心、10,000 个 GPU 以及每台服务器超过 400 千兆比特每秒的网络带宽,这说明了 AI 训练基础设施的巨大规模及其相关的能源消耗(D. Patterson 等人 2021a)。

强大的计算负载导致大量的热量散失,需要大量的冷却基础设施,这增加了总的能源需求。训练系统的先进计算架构和硬件优化策略需要 AI 加速技术的专业知识,而训练效率的算法方法涉及复杂的优化方法。

这些能源成本在每个训练模型中只发生一次。主要的可持续性挑战出现在模型部署期间,此时推理工作负载持续为数百或数千万人提供服务。

推理能源成本

推理工作负载在每次人工智能模型响应查询、分类图像或做出预测时都会执行。与训练不同,推理在搜索引擎、推荐系统以及生成式人工智能模型等应用中动态且持续地扩展。尽管与训练相比,每个推理请求消耗的能量要少得多,但来自数十亿日常人工智能交互的累积能源消耗很快就会超过与训练相关的消耗(D. Patterson 等人 2021a)。

例如,AI 驱动的搜索引擎每天处理数十亿个查询,推荐系统持续提供个性化内容,而 ChatGPT 或 DALL-E 等生成式 AI 服务每个查询都有显著的计算成本。由于对内存和计算带宽的高要求,基于 Transformer 的模型推理的能源足迹很高。

如图 18.7 所示,数据中心推理工作负载的市场预计将从 2017 年的 40-50 亿美元增长到 2025 年的 90-100 亿美元,增长超过一倍。同样,边缘推理工作负载预计在同一时期内将从不到 1 亿美元增长到 40-45 亿美元。这种增长速度远超过两个环境中训练工作负载的扩展,突显了推理的经济足迹正在迅速超过训练操作。

图片

图 18.7:推理-训练市场增长:推理工作负载市场正在迅速扩张,预计从 2017 年到 2025 年将增长超过一倍,超过了训练的增长,反映了大规模部署 AI 模型需求的增加。这种差异强调了运行 AI 应用程序的操作能源足迹正在成为与模型开发本身相比的主导成本因素。来源:麦肯锡。

与具有固定能源足迹的传统软件应用不同,推理工作负载会根据用户需求动态扩展。像 Alexa、Siri 和 Google Assistant 这样的 AI 服务依赖于持续的云推理,每分钟处理数百万个语音查询,这需要不间断地运行能耗密集型的数据中心基础设施。

边缘 AI 影响

推理并不总是在大型数据中心发生。边缘 AI 正在成为一种可行的替代方案,以减少对云的依赖。不是将每个 AI 请求路由到集中的云服务器,一些 AI 模型可以直接部署在用户设备或边缘计算节点上。这种方法减少了数据传输的能源成本,并降低了依赖高功耗云推理的依赖性。

然而,在边缘进行推理并不能消除能源问题,尤其是在 AI 大规模部署时。例如,自动驾驶汽车需要毫秒级延迟的 AI 推理,这意味着云处理是不切实际的。相反,现在车辆正在配备车载 AI 加速器,这些加速器就像“车轮上的数据中心”(Sudhakar, Sze, and Karaman 2023)。这些嵌入式计算系统处理实时传感器数据,相当于小型数据中心,即使不依赖云推理,也会消耗大量电力。

同样,像智能手机、可穿戴设备和物联网传感器这样的消费设备,单个设备消耗的电力相对较少,但由于数量庞大,它们对全球能源消耗的贡献显著。因此,边缘计算的效率优势必须与设备部署的广泛规模相平衡。

资源消耗和生态系统影响

碳足迹分析提供了对人工智能环境影响的关键但并不完整的了解。全面的评估需要测量额外的生态影响,包括水消耗、危险化学物质的使用、稀有材料的提取和生物多样性的破坏,尽管它们具有生态重要性,但通常受到较少的关注。

现代生产人工智能芯片的半导体制造工厂每天需要数百万加仑的水,并在其生产过程中使用超过 250 种危险物质。在台湾、亚利桑那州和新加坡等已经面临水资源压力的地区,这种密集使用威胁到当地生态系统和社区。人工智能硬件也严重依赖像镓、铟、砷和氦这样的稀缺材料,这些材料面临着地缘政治供应风险和枯竭的担忧。

这种全面的 impact assessment 使组织能够识别除能源消耗之外的环境热点,并制定针对性的缓解策略,以解决人工智能系统的完整生态足迹。

水资源使用

半导体制造是一个特别耗水的工艺,需要大量的超纯水用于清洗、冷却和化学处理。现代工厂的水消耗规模与整个城市人口相当。例如,台积电在亚利桑那州最新的工厂预计每天将消耗 890 万加仑的水(公司 2023)28,占该城市总水生产的近 3%。这种需求对当地水资源造成了重大压力,尤其是在台湾、亚利桑那州和新加坡等水资源匮乏的地区,半导体制造业集中于此。半导体公司已经认识到这一挑战,并正在积极投资回收技术和更高效的水管理实践。例如,意法半导体公司回收和再利用了大约 41%的水,显著减少了其环境足迹。图 18.8 展示了典型的半导体制造工厂水循环,显示了从原水取水到废水处理和再利用的阶段。

图片

图 18.8:水回收循环:半导体制造依赖于广泛的水净化和闭环回收以最小化消耗;此图详细说明了从原水取水到废水处理和再利用的阶段,突出了在制造工厂内实现显著节水潜力的可能性。来源:ST 可持续发展报告。

在半导体制造中,超纯水的主要用途是在各个生产阶段清洗晶圆上的污染物。水还作为热氧化、化学沉积和平面化过程中的冷却剂和载体流体。一个 300mm 的硅晶圆在整个制造过程中需要超过 8,300 升的水,其中超过三分之二为超纯水 (Cope 2009)。

这种大量用水的影響不仅限于消耗。从当地含水层过度抽取水会导致地下水位下降,引发诸如地面沉降和海水入侵等问题。在位于台湾的新竹,世界上最大的半导体中心之一,晶圆厂的大量抽水导致了地下水位下降和海水入侵,影响了农业和饮用水供应。

图 18.9 将数据中心的日常水足迹与其他工业用途进行了对比,说明了高科技基础设施巨大的用水需求。

图 18.9:数据中心用水量:高密度计算基础设施,如数据中心,为了冷却消耗了大量的水资源,超过了许多常见的工业和农业应用。了解这些用水需求对于设计可持续的人工智能系统和减轻潜在影响,如水压力区域中的海水入侵,非常重要。来源:(Centers 2023)。

虽然一些半导体制造商实施了水回收系统,但这些措施的有效性各不相同。英特尔报告称,其直接用水量的 97%归因于制造过程 (Cooper et al. 2011),尽管水重复使用正在增加,但水抽取的规模仍然是一个重要的可持续性挑战。

除了耗尽之外,如果管理不当,半导体厂排放的废水会带来污染风险。制造废水含有金属、酸和化学残留物,在排放前必须彻底处理。尽管现代晶圆厂采用先进的净化系统,但提取污染物仍然会产生有害副产品,如果不小心处理,会对当地生态系统造成风险。

由于人工智能加速和计算基础设施扩张推动的半导体制造需求不断增长,水资源管理成为可持续人工智能发展的关键因素。确保半导体生产的长期可行性不仅需要减少直接用水量,还需要提高废水处理能力,并开发减少对淡水来源依赖的替代冷却技术。

有害化学品

半导体制造高度依赖高度危险的化学品,这些化学品在蚀刻、掺杂和晶圆清洗等过程中发挥着重要作用。制造人工智能硬件,包括 GPU、TPU 和其他专用加速器,需要使用强酸、挥发性溶剂和有毒气体,如果不妥善管理,这些都可能带来重大的健康和环境风险。工厂中化学物质的使用规模巨大,每年消耗数千吨危险物质(S. Kim 等,2018)29。

在芯片制造中使用的最重要的化学类别中,强酸是其中之一,它们有助于晶圆蚀刻和氧化物去除。氢氟酸、硫酸、硝酸和盐酸在芯片生产的清洗和图案化阶段被广泛使用。虽然这些酸对这些过程有效,但它们具有高度腐蚀性和毒性,如果处理不当,可能导致严重化学烧伤和呼吸道损伤。大型半导体工厂需要专门的容器、过滤和中和系统,以防止意外暴露和环境污染。

溶剂是芯片制造中的另一个重要组成部分,主要用于溶解光刻胶和清洗晶圆。关键溶剂包括二甲苯、甲醇和甲基异丁基甲酮(MIBK),尽管它们具有实用性,但它们会带来空气污染和工人安全风险。这些溶剂是挥发性有机化合物(VOCs),可以蒸发到大气中,导致室内和室外空气污染。如果不妥善处理,VOC 暴露可能导致神经损伤、呼吸道问题以及半导体工厂工人长期的健康影响。

有毒气体是人工智能芯片制造中最危险的物质之一。砷化氢(AsH₃)、磷化氢(PH₃)、二硼烷(B₂H₆)和锗烷(GeH₄)等气体用于掺杂和化学气相沉积过程,这些过程对于微调半导体特性至关重要。这些气体具有高度毒性,甚至在低浓度下也可能致命,需要采取广泛的处理预防措施、气体洗涤器和紧急响应方案。

虽然现代工厂采用严格的安全控制、防护设备和化学处理系统,但事故仍然发生,导致化学泄漏、气体泄漏和污染风险。随着人工智能加速器不断增长的复杂性,有效管理危险化学品的挑战加剧,这些加速器需要更先进的制造技术和新的化学配方。

除了直接的安全担忧之外,有害化学物质使用的长期环境影响仍然是一个重大的可持续性问题。半导体晶圆厂产生大量化学废物,如果处理不当,可能会污染地下水、土壤和当地生态系统。许多国家的法规要求晶圆厂在处置前中和和处理废物,但全球的合规性和执法力度不一,导致环境保护水平不同。

为了减轻这些风险,晶圆厂必须继续推进绿色化学倡议,探索替代蚀刻剂、溶剂和气体配方,在保持制造效率的同时减少毒性。最小化化学废物、提高控制和增强回收努力的过程优化对于减少人工智能硬件生产的环境足迹将至关重要。

资源枯竭

虽然硅资源丰富且易于获取,但人工智能加速器、GPU 和专用人工智能芯片的制造依赖于稀缺且地缘政治敏感的材料,这些材料难以获取。人工智能硬件制造需要一系列稀有金属、稀有气体和半导体化合物,其中许多面临供应限制、地缘政治风险和环境提取成本。随着人工智能模型变得更大、计算量更大,对这些材料的需求持续上升,引发了对长期可用性和可持续性的担忧。

尽管硅是半导体设备的主要材料,但高性能人工智能芯片依赖于镓、铟和砷等稀有元素,这些元素对于高速、低功耗的电子组件至关重要(陈华伟 2006)。例如,镓和铟在化合物半导体中广泛使用,尤其是在 5G 通信、光电子学和人工智能加速器中。美国地质调查局(USGS)已将铟归类为关键材料,预计在当前消费速度下,全球供应量将少于 15 年(马丁·戴维斯 2011)30。

另一个主要关注点是氦气,这是一种对半导体冷却、等离子体刻蚀以及用于下一代芯片生产的极紫外光刻至关重要的稀有气体。氦气独特之处在于,一旦释放到大气中,它就会逃离地球的引力而永远消失,使其成为一种不可再生资源(马丁·戴维斯 2011)。半导体行业是氦气最大的消费者之一,供应短缺已经导致价格上涨和生产流程中断。

除了原材料可用性之外,稀土元素的地理政治控制还带来了额外的挑战。中国目前控制着世界上超过 90%的稀土元素(REE)精炼能力 31,包括对人工智能芯片至关重要的材料,如钕(用于人工智能加速器中的高性能磁铁)和钇(用于高温超导体)(A. R. Jha 2014)。这种供应集中创造了供应链脆弱性,因为贸易限制或地缘政治紧张可能会严重影响人工智能硬件的生产。

本材料依赖性挑战的范围在表 18.1 中得到了说明,该表突出了对人工智能半导体制造至关重要的关键材料,它们的应用以及供应问题。

人工智能和半导体需求的快速增长加速了这些重要资源的耗尽,迫切需要材料回收、替代策略和更可持续的提取方法。一些努力正在进行中,以探索替代半导体材料,以减少对稀有元素的依赖,但这些解决方案在成为规模上的可行替代品之前需要显著的进步。

表 18.1:人工智能硬件的关键材料:半导体制造依赖于特定的材料,包括硅、钕和钇,这些材料面临着日益增长的供应限制和地缘政治风险,可能会影响人工智能硬件的生产和创新。该表详细说明了这些材料,它们在人工智能系统中的应用以及需要积极缓解策略的相关的供应脆弱性。

材料 在人工智能半导体制造中的应用 供应问题
硅 (Si) 芯片、晶圆、晶体管的主要基板 处理限制;地缘政治风险
镓 (Ga) 基于氮化镓的功率放大器、高频元件 可用性有限;铝和锌生产的副产品
锗 (Ge) 高速晶体管、光电探测器、光互连 稀有;地理集中
铟 (In) 铟锡氧化物 (ITO)、光电元件 储备有限;回收依赖
钽 (Ta) 电容器、稳定的集成电路 冲突矿产;供应链脆弱
稀土元素 (REEs) 磁铁、传感器、高性能电子设备 高地缘政治风险;环境提取问题
钴 (Co) 边缘计算设备的电池 人权问题;地理集中(刚果)
钨 (W) 互连、屏障、散热片 生产地点有限;地缘政治问题
铜 (Cu) 互连、屏障、散热片 高纯度来源有限;地缘政治问题
氦 (He) 半导体冷却、等离子体刻蚀、极紫外光刻 不可再生;大气损失不可回收;提取能力有限

向 AI 基础设施中光学互连的转变展示了新兴技术如何加剧这些资源挑战。现代 AI 系统,如谷歌的 TPU 和来自 Mellanox 等公司的高性能互连解决方案,越来越多地依赖光学技术来实现分布式训练和推理所需的带宽。虽然与铜基连接相比,光学互连提供了包括更高带宽(TPUv4 的情况下高达 400 Gbps (N. Jouppi et al. 2023))、降低功耗和免受电磁干扰等优势,但它们引入了额外的材料依赖性,尤其是在高速光电探测器和光学组件中使用的锗。随着 AI 系统越来越多地采用光学互连来解决数据中心带宽限制问题,对基于锗的组件的需求将加剧现有的供应链脆弱性,突显了在 AI 基础设施发展中进行全面的材料可持续性规划的需求。

废物产生

半导体制造产生大量有害废物,包括气体排放、VOCs、含化学物质的废水和固体有毒副产品。AI 加速器、GPU 和其他高性能芯片的生产涉及多个化学处理、刻蚀和清洁阶段,每个阶段都会产生必须经过仔细处理以防止环境污染的废物材料。

Fabs 在各个加工步骤中释放气体废物,尤其是化学气相沉积(CVD)、等离子体刻蚀和离子注入。这包括砷化氢(AsH₃)、磷化氢(PH₃)和锗烷(GeH₄)等有毒和腐蚀性气体,在排放到大气之前需要先进的洗涤器系统进行中和。如果不经过适当过滤,这些气体会对健康造成严重危害,并导致空气污染和酸雨形成(Grossman 2007)。

VOCs 是另一个主要的废物类别,来自光刻胶处理、清洗溶剂和光刻涂层。如二甲苯、丙酮和甲醇等化学品容易蒸发到空气中,在那里它们会促成地面臭氧的形成,并对台湾和韩国等半导体生产集中的地区的工厂工人室内空气质量造成危害。在这些地区,监管机构已经实施了严格的 VOC 排放控制,以减轻其环境影响。

半导体制造厂还产生大量废酸和含重金属的废水,在排放前需要广泛处理。强酸如硫酸、氢氟酸和硝酸用于蚀刻硅晶圆,在制造过程中去除多余材料。当这些酸被重金属、氟化物和化学残留物污染时,它们在处置前必须进行中和和过滤。废水处理不当导致了地下水污染事件,突显了强大废物管理系统的重要性(Prakash, Callahan, 等人 2023)。

人工智能硬件制造过程中产生的固体废物包括污泥、滤饼和从制造厂排气和废水处理系统中收集的化学残留物。这些副产品通常含有浓缩的重金属、稀土元素和半导体工艺化学品,使其对传统填埋处理具有危害性。在某些情况下,制造厂焚烧有毒废物,产生与空气污染物和有毒灰烬处理相关的额外环境问题。

除了制造过程中产生的废物外,人工智能硬件的报废处置也提出了另一个可持续性挑战。人工智能加速器、GPU 和服务器硬件具有较短的更新周期,数据中心设备通常每 3-5 年更换一次。这导致每年产生数百万吨电子废物,其中大部分含有铅、镉和汞等有毒重金属。尽管努力提高电子废物回收,但当前系统仅捕获全球电子废物的 17.4%,其余大部分被丢弃在垃圾填埋场或不当处理(Singh 和 Ogunseitan 2022)。

解决人工智能危险废物的影响需要半导体制造和电子废物回收方面的进步。公司正在探索稀有金属的闭环回收、改进的化学处理工艺和低毒性替代材料。随着人工智能模型继续推动对高性能芯片和更大规模计算基础设施的需求,行业管理其废物足迹的能力将成为实现可持续人工智能发展的关键因素。

生物多样性影响

人工智能硬件的环境足迹不仅限于碳排放、资源耗竭和危险废物。半导体制造厂(fabs)、数据中心和支持基础设施的建设和运营直接影响自然生态系统,导致栖息地破坏、水资源紧张和污染。这些环境变化对野生动物、植物生态系统和海洋生物多样性产生了深远的影响,突显了可持续人工智能发展需要考虑更广泛的生态效应。

半导体晶圆厂和数据中心需要大片土地,这通常会导致森林砍伐和自然栖息地的破坏。这些设施通常建在工业园区或城市中心附近,但随着对人工智能硬件需求的增加,晶圆厂正在扩展到以前未开发的地区,侵占森林、湿地和农业用地。

人工智能基础设施的物理扩张破坏了野生动物的迁徙模式,因为道路、管道、输电塔和供应链将自然景观碎片化。依赖大型、连通生态系统生存的物种,包括候鸟、大型哺乳动物和授粉者,面临更大的移动障碍,减少遗传多样性和种群稳定性。在像台湾和韩国这样半导体制造业密集的地区,栖息地丧失已经与受影响地区的生物多样性下降联系起来 (Hsu 等人 2016)。

半导体晶圆厂的大量用水对水生生态系统构成严重风险,尤其是在水资源紧张的地区。为了生产人工智能芯片而过度抽取地下水可能导致地下水位下降,影响当地河流、湖泊和湿地。在台湾新竹,晶圆厂每天抽取数百万加仑的水,当地地下水层已出现海水入侵现象,改变了水质,使其不适合本地鱼类物种和植被。

除此之外,晶圆厂的废水排放会将化学污染物引入自然水体系统。尽管许多设施实施了先进的过滤和回收,但即使是微量的重金属、氟化物和溶剂也可能在水体中积累,通过生物积累在鱼类体内,并破坏水生生态系统。数据中心的热污染,将加热后的水排放回湖泊和河流,可能导致水温超过本地物种可忍受的水平,影响氧气水平和繁殖周期 (LeRoy Poff, Brinson, 和 Day 2002)。

半导体晶圆厂排放各种空气污染物,包括挥发性有机化合物(VOCs)、酸雾和金属颗粒,这些污染物在沉降到环境中之前可以传播很长的距离。这些排放物导致空气污染和酸沉降,损害植物生命、土壤质量和附近的农业系统。

空气中化学沉积物与树木衰退、农作物产量下降和土壤酸化有关,尤其是在工业半导体中心附近。在高 VOC 排放的地区,植物生长可能会因长期暴露而受到阻碍,影响生态系统的弹性和食物链。晶圆厂意外化学泄漏或气体泄漏对当地野生动物和人类群体构成严重风险,需要严格的监管执法以最大限度地减少长期生态损害 (Wald 和 Jones 1987)。

AI 硬件制造的环境后果表明了可持续半导体生产的紧迫需求,包括减少土地使用、提高水资源回收和更严格的排放控制。如果没有干预,对 AI 芯片不断增长的需求可能会进一步加剧全球生物多样性的压力,强调了在技术进步与生态责任之间保持平衡的重要性。

硬件生命周期环境影响评估

AI 系统的环境影响不仅限于模型训练和推理期间的能源消耗。对 AI 可持续性的全面评估必须考虑其整个生命周期,从用于硬件制造的原始材料的提取到最终废弃的计算基础设施。生命周期分析(LCA)32 提供了一种系统的方法来量化 AI 在其四个关键阶段(设计、制造、使用和处置)上的累积环境影响。

通过将生命周期评估(LCA)应用于 AI 系统,研究人员和政策制定者可以确定重要的干预点以减少排放、提高资源效率并实施可持续实践。这种方法提供了对 AI 生态成本的全面理解,将可持续性考虑扩展到运营电力消耗之外,包括硬件供应链和电子废物管理。

图 18.10展示了 AI 系统生命周期的四个主要阶段,每个阶段都对其总环境影响做出贡献。

图片

图 18.10:AI 系统生命周期:分析 AI 系统在设计、制造、使用和处置阶段,揭示了超出运营能源消耗的全环境影响,包括资源耗竭和电子废物。这种生命周期评估允许针对整个 AI 系统存在期间的可持续性进行有针对性的干预。

每个生命周期阶段都呈现出独特的环境影响和可持续性挑战,从设计优化到制造再到部署运营。

设计阶段

AI 系统的设计阶段包括部署前的机器学习模型的研究、开发和优化。这一阶段涉及迭代模型架构、调整超参数和运行训练实验以改进性能。这些过程计算密集,需要大量使用硬件资源和能源。AI 模型设计的环境影响常常被低估,但重复的训练运行、算法改进和探索性实验对 AI 系统的整体可持续性影响贡献显著。

开发一个 AI 模型需要运行多个实验以确定最有效的架构。例如,自动架构搜索技术通过评估数百甚至数千种配置 33 来自动化选择最佳模型结构,每种配置都需要单独的训练周期。同样,超参数调整涉及修改学习率、批量大小和优化策略等参数,以增强模型性能,通常通过穷举搜索技术实现。预训练和微调进一步增加了计算需求,因为模型在部署前需要在不同的数据集上进行多次训练迭代。这一过程的迭代性质导致了高能耗,其中超参数调整和架构搜索对训练相关的排放贡献显著(Strubell, Ganesh, and McCallum 2019a)。

在考虑像 GPT-3 这样的大型语言模型时,设计阶段的能耗规模变得明显。报告的训练能耗仅反映了最终的训练运行,并未计入模型选择之前的广泛试错过程,这表明实际能耗可能显著更高。在深度强化学习应用中,例如 DeepMind 的 AlphaZero,模型会经历重复的训练周期以改进决策策略,这进一步放大了能源需求。

AI 模型设计的碳足迹因所需的计算资源和训练发生的数据中心所使用的能源而显著不同。一项广泛引用的研究发现,训练单个大规模 NLP 模型可能产生的排放量相当于五辆汽车一生的碳足迹(Strubell, Ganesh, and McCallum 2019a)。当训练在依赖化石燃料的数据中心进行时,影响更为显著。例如,在美国弗吉尼亚州(USA)使用燃煤设施训练的模型产生的排放量远高于在水电或核能供电地区训练的模型。硬件选择也对排放有显著影响;在能效高的张量处理单元(TPUs)上训练可以显著减少排放,与传统图形处理单元(GPUs)相比。

表 18.2 总结了与训练各种 AI 模型相关的估计碳排放,说明了模型复杂性与环境影响之间的相关性。

表 18.2:模型碳足迹:训练大型 AI 模型会产生大量的碳排放,这与以 FLOPs 计量的计算需求直接相关;例如,训练 GPT-3 所需的能量相当于数百辆汽车的终身排放。了解这些排放对于发展可持续的 AI 实践和选择节能硬件(如 tpus)以最小化环境影响至关重要。来源:

AI 模型 训练 FLOPs 估计CO2\textrm{CO}_2排放量(kg) 等效汽车里程
GPT-3 3.1×10233.1 \times 10^{23} 502,000 kg 1.2 million miles
T5-11B 2.3×10222.3 \times 10^{22} 85,000 kg 210,000 miles
BERT (Base) 3.3×10183.3 \times 10^{18} 650 kg 1,500 miles
ResNet-50 2.0×10172.0 \times 10^{17} 35 kg 80 miles

面对设计阶段可持续性挑战,需要提高培训效率和计算资源管理的创新。研究人员已经探索了诸如稀疏训练、低精度算术和权重共享方法等技术,以减少所需的计算量,同时不牺牲模型性能。使用预训练模型也作为一种最小化资源消耗的手段而受到关注。研究人员可以通过微调预训练网络的较小版本,利用现有知识以更低的计算成本实现类似的结果。

进一步优化模型搜索算法也有助于可持续性。传统的神经架构搜索方法需要评估大量候选架构,但最近在能源感知 NAS 方法方面的进展通过减少识别最佳配置所需的训练迭代次数来提高效率。公司也开始实施碳感知计算策略,通过在电网碳强度较低的时段安排训练任务或将工作负载转移到使用更清洁能源的数据中心(U. Gupta 等人 2022)。

设计阶段为整个 AI 生命周期奠定了基础,影响着训练和推理阶段的能源需求。随着 AI 模型复杂性的增加,其开发过程必须重新评估,以确保在每个阶段都整合可持续性考虑。在模型设计阶段所做的决策不仅决定了计算效率,还塑造了 AI 技术的长期环境影响。

制造阶段

AI 系统的制造阶段代表了其生命周期中资源密集型的方面,涉及制造专门的半导体硬件,如 GPU、TPU、FPGA 和其他 AI 加速器。这些芯片的生产需要大规模的工业流程,包括原材料提取、晶圆制造、光刻、掺杂和封装——所有这些都对环境影响做出了重大贡献(巴姆拉等人 2024)。这一阶段不仅涉及高能耗,还产生有害废物,依赖稀缺材料,并对资源消耗产生长期影响。

制造材料

AI 硬件的基础在于半导体,主要是为 AI 加速器供电的基于硅的集成电路。然而,现代 AI 芯片不仅依赖于硅;它们还需要如镓、铟、砷和氦等特种材料,每种材料都带有独特的环境提取成本。这些材料通常因其稀缺性、地缘政治敏感性以及与采矿和提炼相关的较高能源成本而被归类为重要元素(巴姆拉等人 2024)。

硅本身很丰富,但将其提炼成高纯度晶圆需要大量的能源密集型工艺。生产一个 300 毫米硅晶圆需要超过 8300 升水,以及用于蚀刻和清洗的强酸,如氢氟酸、硫酸和硝酸(科普 2009)。半导体制造对超纯水的需求给当地水资源带来了重大负担,领先的晶圆厂每天消耗数百万加仑水。

超越硅,镓和铟对于高性能化合物半导体至关重要,这些半导体被用于高速 AI 加速器和 5G 通信。美国地质调查局已将铟列为极度濒危材料,预计在当前消费率下全球供应量将少于 15 年(马丁·戴维斯 2011)。同时,氦气是芯片生产中必不可少的冷却剂,是一种不可再生资源,一旦释放,就会逃离地球引力,使其永久无法回收。AI 硬件制造的持续扩张正在加速这些关键元素的消耗,引发了关于长期可持续性的担忧。

由于使用了 EUV 光刻技术,半导体制造的环境负担进一步加剧,EUV 光刻技术是制造亚 5nm 芯片所必需的。EUV 系统消耗大量能源,需要高功率激光和复杂的光学系统。国际半导体路线图估计,每台 EUV 设备消耗大约一兆瓦(MW)的电力,这显著增加了尖端芯片生产的碳足迹。

制造能耗

制造人工智能硬件所需的能量是巨大的,每颗芯片的总能源成本往往超过其整个使用寿命的能源使用。制造单个 AI 加速器可能排放的碳比数据中心连续使用多年的碳排放还要多,这使得制造成为人工智能环境影响的关键热点。

危险废物和用水量

半导体制造还会产生大量危险废物,包括气体排放、VOCs、化学废水和固体副产品。芯片生产中使用的酸和溶剂会产生有毒废物流,需要特殊处理以防止周围生态系统的污染。尽管废水处理技术取得了进步,但金属和化学残留物的微量仍然可能排放到河流和湖泊中,影响水生生物多样性和人类健康 (Prakash, Callahan, et al. 2023)。

半导体工厂对水的需求也引发了关于区域水资源压力的担忧。亚利桑那州的台积电工厂预计每天将消耗 890 万加仑水,这个数字几乎占用了该城市水供应的 3%。尽管一些工厂已经开始投资水回收系统,但这些努力仍然不足以抵消不断增长的需求。

可持续发展措施

认识到半导体制造的可持续发展挑战,行业领导者已经开始实施减少能源消耗、废物产生和排放的举措。英特尔、台积电和三星等公司已承诺通过几种关键方法转向碳中和的半导体制造。许多晶圆厂正在采用可再生能源,台湾和欧洲的设施越来越多地依赖水力发电和风力发电。通过闭环回收系统,节水措施得到了扩展,从而减少了对外部水源的依赖。制造工艺正在通过环保蚀刻和光刻技术进行重新设计,以最大限度地减少有害废物的产生。公司正在开发节能芯片架构,例如针对每瓦性能优化的低功耗 AI 加速器,以减少制造和运营对环境的影响。尽管有这些努力,但随着对 AI 加速器的需求不断增长,AI 芯片制造的总体环境影响仍在持续增长。如果没有在材料效率、回收和制造技术方面取得重大改进,制造阶段将继续成为 AI 可持续发展挑战的主要贡献者。在第十一章中解决了优化硬件架构以提高能效的互补挑战,在第十三章中涵盖了运营基础设施的可持续性,而在第十章中详细介绍了减少计算需求的算法技术。

AI 硬件的制造阶段代表了 AI 生命周期中最资源密集和环境影响最大的方面之一。重要材料的提取、高能耗的制造工艺和有害废物的产生都导致了 AI 不断增长的碳足迹。尽管行业在可持续半导体制造方面的努力正在取得进展,但将这些举措扩展到满足不断增长的 AI 需求仍然是一个重大挑战。

解决 AI 硬件的可持续性需要结合材料创新、供应链透明度和对强调芯片回收和再利用的循环经济模式的更大投资。随着 AI 系统的持续进步,它们的长期可行性不仅取决于计算效率,还取决于减少其底层硬件基础设施的环境负担。

使用阶段

人工智能系统的使用阶段在其生命周期中是一个能耗密集的阶段,包括训练和推理工作负载。随着人工智能在各个行业的采用率不断增长,开发和部署模型所需的计算需求持续增加,导致能源消耗和碳排放增加。人工智能系统的运营成本不仅包括处理过程中直接使用的电力,还包括支持大规模人工智能工作负载的数据中心、冷却基础设施和网络设备的电力需求。理解这一阶段的可持续性挑战对于减轻人工智能的长期环境影响至关重要。

人工智能模型训练是使用阶段中最计算密集的活动之一。大规模模型的训练涉及在专门的硬件(如 GPU 和 TPU)上运行数十亿甚至数万亿次的数学运算,持续时间较长。随着人工智能模型复杂性的增加,训练的能源消耗近年来急剧上升。大型语言模型训练展示了训练运行的碳足迹在很大程度上取决于它们执行的数据中心的能源组合。在一个主要依赖化石燃料的地区(如弗吉尼亚州的燃煤数据中心)训练的模型,其排放量显著高于在水电或核能供电的设施中训练的模型。

人工智能的能量需求不仅在模型开发完成后就结束了。推理阶段会产生持续的计算成本,这些成本会随着部署范围和使用的频率而增加。在实际应用中,推理工作负载会持续运行,每天处理数十亿个请求,涉及搜索引擎、推荐系统、语言模型和自主系统等服务。虽然训练运行能耗密集,但跨数百万用户运行的推理工作负载随着时间的推移可能会消耗更多的电力。研究表明,现在推理已经占到了总人工智能相关能耗的 60%以上,在某些情况下甚至超过了训练的碳足迹(D. Patterson, Gonzalez, Holzle, et al. 2022)。

数据中心在使人工智能成为可能方面发挥着核心作用,为训练和推理提供所需的计算基础设施。这些设施依赖于数千台高性能服务器,每台服务器在处理人工智能工作负载时都会消耗大量电力。数据中心的能效(PUE),即衡量其能源使用效率的指标,直接影响人工智能的碳足迹。许多现代数据中心以 1.1 到 1.5 之间的 PUE 值运行,这意味着每单位用于计算的电力,还需要额外消耗 10%到 50%的电力用于冷却、电力转换和基础设施开销 (Barroso, Hölzle, 和 Ranganathan 2019)。特别是冷却系统是数据中心能源消耗的主要贡献者,因为人工智能加速器在运行过程中会产生大量热量。

数据中心的位置对其可持续性有直接影响。位于可再生能源可用地区的设施与依赖化石燃料电网的设施相比,可以显著减少排放。例如,谷歌和微软等公司已投资于碳感知计算策略,在可再生能源产量高的时段安排人工智能工作负载,以最小化其碳足迹 (U. Gupta 等人 2022)。

人工智能日益增长的能源需求引发了关于电网容量和可持续性权衡的担忧。人工智能工作负载通常与其他高能耗行业,如制造业和交通运输业,争夺有限的电力供应。在某些地区,人工智能驱动的数据中心兴起导致电网压力增大,需要新的基础设施投资。所谓的“鸭子曲线”问题,即可再生能源发电在一天中波动,为平衡人工智能的能源需求与电网可用性带来了额外的挑战。向分布式人工智能计算和边缘处理的转变正在成为减少对集中式数据中心依赖、将一些计算任务更靠近最终用户的一种潜在解决方案。

减少人工智能使用阶段的环境影响需要结合硬件、软件和基础设施层面的优化。在节能芯片架构方面的进步,例如低功耗人工智能加速器和专用推理硬件,在降低每查询能耗方面显示出希望。人工智能模型本身正通过量化、剪枝和蒸馏等技术进行优化,以实现更小、更快的模型,同时保持高精度并减少计算资源需求。同时,冷却效率、可再生能源集成和数据中心运营的持续改进对于确保人工智能不断增长的足迹在长期内保持可持续性至关重要。

随着人工智能应用的持续扩大,能源效率必须在模型部署策略中成为一个核心考虑因素。使用阶段将继续是人工智能环境足迹的主要贡献者,如果没有重大的干预,该行业的电力消耗可能会呈指数增长。可持续的人工智能发展需要行业、学术界和政策制定者之间的协调努力,以促进负责任的人工智能部署,同时确保技术进步不会以牺牲长期环境可持续性为代价。

处置阶段

人工智能系统的处置阶段在可持续性讨论中往往被忽视,但它提出了重大的环境挑战。人工智能硬件的快速发展导致了硬件使用寿命的缩短,加剧了电子垃圾(e-waste)和资源耗竭。随着人工智能加速器、GPU 和高性能处理器在几年内变得过时,管理它们的处置已成为一个紧迫的可持续性问题。与传统的计算设备不同,人工智能硬件含有复杂的材料、稀土元素和有害物质,这增加了回收和废物管理工作的复杂性。如果没有有效的策略来重新利用、回收或安全处置人工智能硬件,人工智能基础设施的环境负担将继续增加。

人工智能硬件的使用寿命相对较短,尤其是在数据中心,性能效率决定了频繁的升级。平均而言,GPU、TPU 和人工智能加速器每三到五年就会更换一次,因为市场上出现了更新、更强大的型号。这种快速周转导致了一个持续的硬件处置周期,大规模的人工智能部署产生了大量的电子垃圾。与可能具有二手市场转售或再利用的消费者电子产品不同,一旦人工智能加速器不再是最先进的,它们通常就不再适用于商业用途。对更快、更高效的人工智能模型的追求加速了这一周期,导致废弃的高性能计算硬件数量不断增加。

人工智能硬件处置的主要环境担忧之一是危险物质的存在。人工智能加速器含有铅、镉和汞等重金属,以及半导体制造中使用的有毒化学化合物。如果不妥善处理,这些物质可能会渗入土壤和水源,造成长期的环境和健康危害。电子垃圾的燃烧会释放有毒烟雾,导致空气污染,并使非正式回收操作中的工人暴露于有害物质。研究表明,全球只有 17.4%的电子垃圾得到妥善收集和回收,其余大部分最终进入垃圾填埋场或缺乏环境保护的非法废物处理场所(Singh and Ogunseitan 2022)。

人工智能硬件的复杂组成给回收利用带来了重大挑战。与相对容易拆卸的传统计算组件不同,人工智能加速器集成了专门的多层电路、异质金属合金和紧密集成的内存架构,这使得材料回收变得困难。回收和分离如金、钯和稀土金属等有价值元素需要先进的回收技术,而这些技术并不普遍可用。混合材料的存在进一步复杂化了过程,因为某些组件以化学键合或嵌入的方式存在,使得提取效率低下。

尽管存在这些挑战,但人们正在努力开发可持续的人工智能硬件处置解决方案。一些制造商已经开始设计模块化架构的人工智能加速器,这使得组件更换更加容易,并延长了设备的使用寿命。研究工作也在进行中,旨在改进材料回收过程,使得从废弃芯片中提取和再利用如镓、铟和钨等重要元素成为可能。与传统的熔炼和精炼方法相比,水冶和生物冶金等新兴技术有望以较低的环境影响提取稀有金属。

循环经济 34 模型为缓解与人工智能硬件相关的电子废物危机提供了一种有希望的方法。不同于遵循线性“使用和丢弃”模式,循环经济原则强调再利用、翻新和回收,以延长计算设备的使用寿命。例如,谷歌和微软等公司已启动了将退役的人工智能硬件用于次要应用的计划,如运行低优先级的机器学习任务或将功能组件重新分配给研究机构。这些努力有助于减少对新型半导体生产的总体需求,同时最大限度地减少废物产生。

政策干预和监管框架在解决人工智能系统的处置阶段至关重要,补充了企业的可持续性倡议。全球各国政府开始实施延长生产者责任(EPR)政策,要求技术制造商对其产品在整个生命周期内的环境影响承担责任。在欧盟等地区,严格的电子废物管理法规要求电子制造商参与认证的回收计划,并确保危险材料的妥善处置。然而,执法不统一,全球电子废物跟踪和管理存在重大差距。

人工智能硬件的未来处置将取决于回收技术的进步、监管执行以及行业范围内对可持续设计原则的采用。由人工智能驱动的电子垃圾日益增长的紧迫性强调了需要综合的生命周期管理策略,该策略考虑了人工智能基础设施的全面环境影响,从原材料提取到报废回收。如果没有共同努力来提高硬件的可持续性,人工智能的快速扩张将继续对全球资源和废物管理系统施加压力。


第三部分:实施与解决方案

具体的缓解策略建立在测量框架之上,这些框架通过数据驱动的洞察量化人工智能的环境影响。第二部分中的碳足迹分析、生命周期评估工具和资源利用指标使工程师能够识别优化机会、验证改进并就性能和可持续性之间的权衡做出明智的选择。这个定量基础支持在四个关键领域的系统实施:算法设计、基础设施优化、政策框架和行业实践。

可持续人工智能的实施面临一个被称为杰文斯悖论 35 的关键挑战:仅仅通过提高效率可能会无意中增加整体消费,因为人工智能变得更加易于获取和负担得起。因此,成功的策略必须结合技术优化和防止效率提升被部署规模的指数增长所抵消的使用治理。

多层缓解策略框架

解决人工智能的环境足迹需要一种多层次的方法,该方法将节能算法设计、优化硬件部署、可持续基础设施运营和碳感知计算策略相结合。人工智能框架的选择和优化本身在效率方面发挥作用,涉及对计算效率和资源利用模式的仔细评估。此外,人工智能系统必须考虑到生命周期可持续性,确保模型在其部署期间保持高效,从训练到推理。

本节探讨了减轻人工智能环境影响的关键策略,从可持续人工智能发展原则开始。如图图 18.11 所示,核心挑战在于确保效率提升转化为净环境效益,而不是增加消费。

这种效果在图 18.11 中得到了说明。随着 AI 系统变得更加高效,每单位计算的代价降低,无论是对于语言模型标记、计算机视觉推理还是推荐系统预测。在图中,从点 A 移动到点 B 代表计算成本的下降。然而,这种价格下降导致了所有 AI 应用的使用增加,正如水平轴上从点 C 到点 D 的相应移动所示。虽然减少了成本会有所节省,但 AI 服务的总消耗甚至增长得更快,最终导致整体资源使用和环境影响的增加。这种动态突出了 Jevon 悖论在 AI 中的核心:仅仅效率是不够保证可持续性的。

图片

图 18.11:Jevon 悖论:计算成本的降低推动了 AI 使用的增加,可能抵消了效率提升,导致整体资源消耗增加;该图映射了这种效果,展示了成本降低(a 到 b)如何推动需求增长(c 到 d)。这种反直觉的关系强调了在评估 AI 进步的环境影响时考虑系统性效应的重要性。

效率是可持续性的基石

在前几章关于模型优化(第十章)和高效 AI(第九章)中讨论的每一项技术,不仅是一种性能优化,也是可持续性的主要工具。考虑这些技术如何直接减少环境影响:剪枝通过消除不必要的模型参数减少了计算复杂性和能耗,量化减少了内存需求并加速了推理,同时大幅降低了功耗,知识蒸馏使得更小、更高效的模型能够在显著降低资源需求的情况下实现有竞争力的性能。

这些优化技术代表了性能工程和环境责任之间的直接桥梁。当我们优化模型以使其运行更快或使用更少的内存时,我们同时减少了其碳足迹。当我们设计高效的架构或实施软硬件协同设计时,我们创建了既高性能又环境可持续的系统。

这种联系揭示了一个有力的洞察:可持续 AI 并非与高效 AI 分离;它就是高效 AI。使系统能够扩展、表现更好且运营成本更低的相同工程原则,也使它们更具环境责任感。理解这种关系将可持续性从额外的约束转变为优秀系统工程的组成部分。

生命周期感知开发方法

实施可持续人工智能需要在整个开发生命周期中系统地整合环境考量。该框架涵盖了算法设计选择、基础设施优化、运营实践和治理机制,这些机制共同减少了环境影响,同时保持了技术能力。

能效算法设计

许多深度学习模型依赖于数十亿个参数,在训练和推理过程中需要数万亿次的浮点运算(FLOPS)36。通过系统地消除冗余权重,剪枝减少了模型大小和在推理过程中所需的计算次数。研究表明,结构化剪枝可以在 ResNet-50 等模型中移除高达 90%的权重,同时保持可比的精度。这种方法允许人工智能模型在低功耗硬件上高效运行,使其更适合在资源受限的环境中部署。

降低能耗的另一种技术是量化 38,这降低了人工智能模型中计算的数值精度。标准的深度学习模型通常使用 32 位浮点精度,但许多操作可以用 8 位甚至 4 位整数执行,而不会造成显著的精度损失。量化带来的能效提升是显著的:8 位整数操作比 32 位浮点操作消耗大约 16 倍的能量,而 4 位操作实现了 64 倍的能量降低。这种硬件-软件协同设计优化需要在算法精度要求和硬件能力之间进行仔细的协调。通过使用较低的精度,量化减少了内存需求,加快了推理速度,并降低了功耗。例如,NVIDIA 的 TensorRT 框架对深度学习模型应用了训练后量化,实现了推理速度的三倍提升,同时保持了几乎相同的精度。同样,Intel 的 Q8BERT 表明,将 BERT 语言模型量化为 8 位整数可以将其大小减少到原来的四分之一,同时性能下降最小(Zafrir 等人 2019)。

第三种方法,知识蒸馏,允许大型 AI 模型将它们学习到的知识转移到更小、更高效的模型中。在这个过程中,一个大型教师模型训练一个较小的学生模型来近似其预测,使得学生模型能够以显著更少的参数实现具有竞争力的性能。Google 的 DistilBERT 就是这种技术的典范,它保留了原始 BERT 模型 97%的准确性,而只使用了其 40%的参数。知识蒸馏技术使得 AI 从业者能够部署轻量级模型,这些模型需要更少的计算能力,同时提供高质量的预测。

这些优化技术代表了可持续 AI 开发的策略。全面了解这些方法需要理解详细的实现方法和性能权衡,以及它们在模型优化技术和高效 AI 系统设计中的集成。

虽然这些优化技术提高了效率,但它们也引入了权衡。剪枝和量化可能导致模型精度的小幅下降,需要微调以平衡性能和可持续性。知识蒸馏需要额外的训练周期,这意味着能源节省是在部署阶段而不是在训练阶段实现的。之前建立的 Jevons 悖论原则展示了如何,效率的提高必须谨慎管理,以防止增加整体消费的扩散效应。结合效率与有意识地限制资源使用的策略是必要的,以确保这些技术真正减少环境足迹。

生命周期意识系统

除了优化单个模型之外,AI 系统必须从更广泛的生命周期意识角度进行设计。许多 AI 部署采用短期思维模式,模型在几个月内被训练、部署然后废弃。这种频繁的重训练周期导致了计算浪费。通过将可持续性考虑纳入 AI 开发流程中,可以延长模型的使用寿命,减少不必要的计算,并最小化环境影响。

减少冗余计算的有效方法之一是限制完整模型重新训练的频率。许多生产级 AI 系统不需要从头开始进行完整重新训练;相反,它们可以使用增量学习技术进行更新,这些技术将现有模型适应新数据。迁移学习是一种广泛使用的方法,其中预训练模型在新数据集上进行微调,与从头开始训练模型相比,显著降低了计算成本(Narang 等人 2021)。这项技术在领域自适应方面尤其有价值,因为在大型通用数据集上训练的模型可以通过最小重新训练来定制特定应用。这些运营考虑和部署策略构成了机器学习操作生命周期的核心组成部分,包括系统化的生产部署和维护方法。

生命周期感知 AI 开发的另一个重要方面是将生命周期评估(LCA)方法整合进来。LCA 为量化 AI 系统在其生命周期每个阶段的环保影响提供了一个系统框架,从初始训练到长期部署。例如,MLCommons 等组织正在积极开发可持续性基准,这些基准衡量因素包括每推理的能量效率和每模型训练周期的碳排放(Henderson 等人 2020b)。通过将 LCA 原则嵌入到 AI 工作流程中,开发者可以在设计过程中早期识别可持续性瓶颈,并在模型投入生产之前实施纠正措施。

除了训练效率和设计评估之外,AI 部署策略还可以进一步增强可持续性。基于云的 AI 模型通常依赖于集中的数据中心,需要大量能量进行数据传输和推理。相比之下,边缘计算允许 AI 模型直接在最终用户设备上运行,减少了持续云通信的需求。在边缘部署 AI 模型到专用低功耗硬件不仅提高了延迟和隐私性,而且显著降低了能耗(X. Xu 等人 2021)。这些部署架构的技术基础涉及平衡计算需求和资源约束的复杂设计原则,以实现高效的边缘系统。

根据杰文斯悖论原则建立,优化单个阶段可能不会导致整体可持续性。例如,即使我们提高了 AI 硬件的可回收性,由于需求增加而导致的产量增加仍可能导致资源耗尽。因此,限制不必要的硬件生产也同样重要。通过采用生命周期感知的 AI 开发方法,从业者可以减少 AI 系统的环境影响,同时促进长期可持续性。

政策和激励措施

虽然技术优化对于减轻人工智能的环境影响至关重要,但它们必须通过政策激励和整个行业对可持续性的承诺来加强。几个新兴的倡议旨在将可持续性原则纳入大规模人工智能开发中。

一种有希望的方法是碳感知人工智能调度,其中人工智能工作负载根据可再生能源的可用性动态分配。例如,谷歌等公司已经开发了将人工智能训练任务转移到风能或太阳能丰富的时段的调度算法,从而减少对化石燃料的依赖 (D. Patterson, Gonzalez, Le, 等人 2022)。这些策略在大规模数据中心尤其有效,因为峰值能源需求可以与低碳电力发电的低谷时段相匹配。

专注于可持续性的基准和排行榜在人工智能社区中也越来越受欢迎。例如,ML.ENERGY 排行榜 (Chowdhury and Tseng 2007) 根据能源效率和碳足迹对人工智能模型进行排名,鼓励研究人员不仅优化模型以提升性能,还要优化其可持续性。类似地,MLCommons 正在开发标准化的基准,以每推理的功耗来评估人工智能效率,为比较不同模型的环保影响提供了一个透明的框架。这些可持续性指标补充了传统的性能基准,通过系统性的测量方法,创建了既考虑能力又考虑环境影响的综合评估框架。

监管努力开始塑造可持续人工智能的未来。欧盟的可持续数字市场法案引入了透明的 AI 能源报告指南,要求科技公司披露其人工智能运营的碳足迹。随着监管框架的发展,组织将面临越来越大的压力,将可持续性考虑纳入其人工智能开发实践 (委员会 2023))。

通过将技术优化与行业激励和政策法规相一致,人工智能从业者可以确保可持续性成为人工智能开发的组成部分。向节能模型、生命周期感知设计和透明环境报告的转变,对于减轻人工智能的生态影响并继续推动创新至关重要。

基础设施优化

除了算法优化之外,基础设施层面的创新为可持续人工智能部署提供了补充途径。本节探讨了三种关键方法:数据中心中的可再生能源整合、碳感知工作负载调度以及人工智能驱动的冷却优化。这些基础设施策略针对的是实现计算效率提升的运营环境。

绿色数据中心

人工智能日益增长的计算需求使得数据中心成为数字经济中主要的电力消耗者。大规模云数据中心提供了训练和部署机器学习模型所需的基础设施,但它们的能源消耗是巨大的。单个超大规模数据中心可能消耗超过 100 兆瓦的电力,这个水平相当于一个小城市的电力使用量 39。如果没有干预,人工智能工作负载的持续增长可能会使数据中心的能源消耗超过可持续水平。

减少数据中心排放的有希望的方法是转向可再生能源。包括谷歌、微软和亚马逊网络服务在内的主要云服务提供商都承诺使用可再生能源为他们的数据中心供电,但实施挑战仍然存在。与提供稳定电力输出的化石燃料工厂不同,可再生能源如风能和太阳能是间歇性的,发电水平在一天中波动。人工智能基础设施必须整合能源存储解决方案,例如大规模电池部署,并实施智能调度机制,将人工智能工作负载转移到可再生能源可用性最高的时段。例如,谷歌设定了一个目标,到 2030 年其数据中心将全天候运行在无碳能源上 40,确保消耗的每一单位电力都与可再生能源发电相匹配,而不是仅仅依赖碳抵消。

冷却系统是数据中心能源足迹的另一个主要贡献者,通常占全部电力消耗的 30-40%41。传统的冷却方法依赖于空调单元和机械冷却器,这两者都需要大量的电力和水资源。

除了硬件级别的优化之外,人工智能本身也被用于提高数据中心运营的能源效率。DeepMind 开发了能够根据实时传感器数据动态调整冷却参数的机器学习算法。这些由人工智能驱动的冷却系统分析温度、湿度和风扇速度,不断调整以优化能源效率。当在谷歌的数据中心部署时,DeepMind 的系统实现了冷却能源消耗的 40%减少,展示了人工智能增强支持机器学习工作负载的基础设施可持续性的潜力。

约翰逊悖论表明,即使数据中心效率极高,如果它们允许 AI 驱动服务的巨大扩张,也可能导致消费增加。优化数据中心的能源效率对于减少 AI 的环境影响很重要,但效率本身并不足够。我们还必须考虑限制数据中心容量增长的战略。可再生能源的整合、先进冷却解决方案的采用以及 AI 驱动优化的使用可以显著减少 AI 基础设施的碳足迹。随着 AI 的持续扩展,这些创新将在确保机器学习与可持续性目标保持一致方面发挥核心作用。

碳感知调度

除了硬件和冷却系统方面的改进之外,优化 AI 工作负载的执行时间和地点是减少 AI 环境影响的另一项重要策略。数据中心所需的电力来自能源电网,其碳强度会根据任何给定时间可用的电源组合而波动。基于化石燃料的发电厂提供了全球电力的很大一部分,但可再生能源的份额因地区和时间而异。如果没有优化,AI 工作负载可能会在碳密集型能源源主导电网时执行,从而不必要地增加排放。通过实施碳感知调度,AI 计算可以动态地转移到低碳能源可用的时点和地点,在显著减少排放的同时不牺牲性能。

谷歌在其云基础设施中率先实施了碳感知计算的高级实现。2020 年,公司引入了一种调度系统 42,该系统将非紧急 AI 任务推迟到可再生能源(如太阳能或风能)更丰富的时段。这种方法使 AI 工作负载与清洁能源可用性的自然变化保持一致,减少了对化石燃料的依赖,同时保持了高计算效率。谷歌通过地理分布 AI 工作负载进一步扩展了这一策略,将计算转移到清洁能源更易获取地区的数据中心。通过将大规模 AI 训练任务从化石燃料密集型电网转移到低碳电源,公司证明了通过智能工作负载放置可以实现显著的排放减少。

碳感知调度的潜力不仅限于超大规模云服务提供商。依赖 AI 基础设施的公司可以将碳强度指标整合到自己的计算管道中,在何时运行机器学习作业时做出明智的决定。微软的可持续性感知云计算倡议允许组织选择碳优化的虚拟机,确保工作负载以最低可能的排放执行。研究工作也在进行中,旨在开发开源的碳感知调度框架,使更广泛的 AI 从业者能够将可持续性纳入他们的计算策略。

碳感知 AI 调度的有效性取决于关于电网排放的准确实时数据。电力供应商和可持续性组织已经开始通过公开可用的 API 发布电网碳强度数据,使 AI 系统能够动态响应能源供应的变化。例如,Electricity Maps API 提供了全球电网的实时 CO₂排放数据 43,使 AI 基础设施能够根据碳可用性调整计算工作负载。随着对电网排放数据的访问改善,碳感知计算将成为减少 AI 操作环境影响的可扩展和广泛采用的解决方案。

通过将人工智能计算转移到拥有更清洁能源资源的时区和地点,碳感知调度成为了一种强大的工具,有助于使人工智能基础设施更加可持续。与需要物理升级的基于硬件的优化不同,调度改进可以通过软件实现,提供了一种立即且成本效益高的减少排放的途径。随着越来越多的组织将碳感知调度整合到他们的 AI 工作流程中,对减少全球与 AI 相关的碳排放的累积影响可能会非常显著。

虽然这些策略广泛适用于 AI 工作负载,但推理操作面临着独特的可持续性挑战和机遇。与代表一次性能源成本的训练不同,推理构成了随着 AI 应用在全球范围内扩展的持续和增长能源需求。云服务提供商越来越多地采用碳感知调度专门针对推理工作负载,动态地将这些操作转移到由丰富的可再生能源供电的地区(Alvim 等人,2022)。然而,如图 18.12 所示[ch024.xhtml#fig-europe_energy_grid],可再生能源生产的可变性带来了重大挑战。欧洲电网数据说明了可再生能源在一天中的波动情况——太阳能中午达到峰值,而风能在早晚时分显示出明显的峰值。目前,当可再生能源不足时,化石和基于煤炭的发电方法补充能源需求。

图片

图 18.12:欧洲能源结构:可再生能源表现出显著的时间波动性,需要补充化石燃料以满足持续需求。了解这种波动对于有效地调度 AI 工作负载到可再生能源高可用时期以及最小化碳排放至关重要。来源:Uenergy 图表。

要充分利用对碳敏感的调度来处理 AI 推理工作负载,能源存储解决方案的创新对于持续使用可再生能源至关重要。目前,基础能源负荷主要依靠核能——这是一个不会产生直接碳排放的恒定来源,但缺乏灵活性,无法适应可再生能源的波动。像微软这样的科技公司对核能产生了兴趣,以为其数据中心供电 44,因为它们的更恒定的需求曲线(与住宅使用相比)与核能发电特性相吻合。

除了调度之外,优化推理的可持续性还需要互补的硬件和软件创新。模型量化技术允许使用低精度算术显著降低功耗,同时不牺牲精度(Gholami 等人 2021)。知识蒸馏方法允许紧凑、节能的模型复制大型、资源密集型网络的性能(G. Hinton, Vinyals, and Dean 2015)。结合谷歌的 TPU 等专用推理加速器,这些方法显著减少了推理的环境影响。

专门为节能设计的软件框架提供了额外的优化机会。能源感知 AI 框架,如宙斯(J. You, Chung, and Chowdhury 2023)和珀尔修斯(Chung 等人 2023)45,在训练和推理过程中平衡计算速度和功耗效率。这些平台通过分析速度和能耗之间的权衡来优化模型执行,促进了节能 AI 策略的广泛应用,特别是对于必须在大规模上持续运行的推理操作。

AI 驱动的热优化

冷却系统是 AI 基础设施中能耗密集的组件,通常占数据中心总电力消耗的 30-40%。随着 AI 工作负载的计算需求增加,高性能加速器(如 GPU 和 TPU)产生的热量持续增加。没有高效的冷却解决方案,数据中心必须依赖耗电的空调系统或耗水的热管理策略,这两者都会增加 AI 的整体环境影响。AI 驱动的冷却优化已成为提高能源效率同时保持可靠运行的有效策略。

DeepMind 通过部署机器学习模型来优化谷歌数据中心中的温度控制,展示了 AI 驱动冷却的潜力。传统的冷却系统依赖于固定的控制策略,根据预定义的温度和气流阈值进行调整。然而,这些基于规则的系统通常运行效率低下,消耗了比必要的更多能源。相比之下,DeepMind 的 AI 冷却系统持续分析实时传感器数据,包括温度、湿度、冷却泵速度和风扇活动,以确定给定工作负载的最节能配置。通过深度强化学习,系统动态调整冷却设置,以最小化能源消耗,同时确保计算硬件保持在安全的工作温度范围内。

当 DeepMind 的 AI 驱动冷却系统在生产环境中部署时,实现了冷却能源使用量的 40%减少,从而导致了数据中心总电力消耗的 15%整体降低。这种效率的提升展示了 AI 本身如何被用来减轻机器学习基础设施的环境影响。DeepMind 系统成功激发了进一步研究 AI 驱动冷却的兴趣,其他云服务提供商正在探索类似基于机器学习的动态优化热管理的途径。

除了 AI 驱动的控制系统之外,液体冷却和沉浸式冷却的进步也在进一步提高 AI 基础设施的能源效率。与依赖于通过服务器机架循环冷却空气的传统空气冷却不同,液体冷却通过特别设计的冷却剂直接将热量从高性能 AI 芯片中移除。这种方法显著减少了散热所需的能源,使得数据中心能够在更高的密度下运行,同时降低电力消耗。一些设施甚至通过沉浸式冷却将这一概念进一步发展,将整个服务器机架浸入非导电的冷却液体中。这项技术完全消除了对传统基于空气的冷却系统的需求,大幅减少了电力和水的消耗。

微软也探索了创新的冷却解决方案,部署了利用自然海洋洋流散热的海底数据中心。通过将计算基础设施放置在密封的潜水容器中,微软证明了基于海洋的冷却可以降低电力消耗,同时由于受控和稳定的水下环境,延长了硬件的使用寿命。尽管这些方法仍然是实验性的,但它们突显了对替代冷却技术的日益增长的兴趣,这些技术可以使 AI 基础设施更加可持续。

以人工智能驱动的冷却和热管理代表了减少人工智能基础设施环境影响的即时和可扩展的机会。与需要大量资本投资的重大硬件升级不同,基于软件的冷却优化可以迅速部署到现有的数据中心。通过利用人工智能提高冷却效率,并结合新兴的液体和浸没式冷却技术,行业可以显著减少能源消耗、降低运营成本,并有助于人工智能系统的长期可持续性。

综合环境影响缓解

随着人工智能系统持续扩展,减轻其环境影响的努力主要集中在提高模型设计中的能源效率和优化数据中心基础设施。虽然这些进步很重要,但它们只解决了问题的一部分。人工智能的环境影响远远超出了运营能源使用,包括从半导体制造中的水消耗到不断增长的电子垃圾负担。一个真正可持续的人工智能生态系统必须考虑到人工智能硬件和软件的整个生命周期,在每一个阶段——从材料采购到处置——都融入可持续性。

我们对人工智能系统生命周期评估(LCA)的探索突出了与人工智能硬件制造和部署相关的巨大碳排放、水消耗和材料浪费。许多这些环境成本都嵌入在供应链中,并未出现在运营能源报告中,导致了对人工智能真实可持续性的不完整认识。数据中心仍然对水消耗很大,冷却系统每天消耗数百万加仑的水,而人工智能加速器通常在较短的寿命周期内更新,导致电子垃圾不断增加。

本节通过探讨如何减少人工智能更广泛的环境足迹来延续上述讨论。我们探讨了缓解人工智能供应链影响、减少水消耗和延长硬件使用寿命的策略。超越优化基础设施,这种方法从整体上看待人工智能的可持续性,确保改进不仅仅局限于能源效率,而是嵌入整个人工智能生态系统的每个环节。

重新审视生命周期影响

人工智能的环境足迹远远超出了模型训练和推理过程中的电力消耗。人工智能系统的整个生命周期,包括硬件制造和处置,对全球碳排放、资源消耗和电子垃圾产生了重大影响。我们对人工智能硬件的生命周期评估(LCA)发现,排放量并不仅仅由电力消耗驱动,还与制造人工智能加速器、存储设备和网络基础设施所涉及的材料和工艺有关。

LCA(生命周期评估)研究表明,人工智能硬件具有显著的隐含碳成本 46。与可以通过转向更清洁的能源来源来减少的操作排放不同,隐含排放源于在人工智能加速器部署之前的原材料提取、半导体制造和供应链物流。

人工智能的用水问题在可持续性讨论中常常被忽视。生产人工智能加速器的半导体制造工厂是全球耗水量最大的工业设施之一,每天消耗数百万加仑的水用于晶圆清洗和化学处理。数据中心也依赖大量水进行冷却,一些超大规模设施每天使用多达 450,000 加仑的水,这一数字随着人工智能工作负载变得更加密集而持续上升。鉴于世界上许多芯片制造中心位于水资源紧张的地区,如台湾和亚利桑那州,人工智能对水的依赖引发了严重的可持续性问题。

除了排放和用水之外,人工智能硬件还加剧了电子垃圾问题的增长。人工智能加速器的快速进化导致了硬件更新周期的缩短,GPU 和 TPU 经常被更高效的新版本所取代。虽然提高效率很重要,但仅仅几年后丢弃功能正常的硬件会导致不必要的电子垃圾和资源耗竭。许多人工智能芯片含有稀土金属和有毒成分,如果不进行适当的回收,可能会对环境造成污染。

缓解人工智能的环境影响需要解决这些更广泛的问题——不仅仅是通过提高能源效率,还要重新思考人工智能的硬件生命周期,减少耗水过程,并开发可持续的回收实践。以下策略直面这些问题,确保人工智能的进步与长期可持续性目标相一致。

缓解供应链影响

解决人工智能的环境影响需要在供应链层面进行干预,在人工智能硬件甚至达到部署之前,这里就已经发生了大量的排放、资源耗竭和垃圾产生。虽然关于人工智能可持续性的讨论大多集中在数据中心能源效率上,但半导体制造、原材料提取和硬件运输中的隐含碳排放代表了人工智能总体足迹的一个重大且常被忽视的部分。这些供应链排放难以抵消,因此开发减少其源头影响的策略至关重要。

一个主要关注点是半导体制造过程中的碳强度。制造人工智能加速器,如 GPU、TPU 和定制 ASIC,需要极高的精度,并涉及如极紫外光刻、化学气相沉积和离子注入等过程,每个过程都消耗大量的电力。由于许多半导体制造中心位于电网电力仍以化石燃料为主的地区,芯片制造的能量需求对人工智能的碳足迹贡献显著。研究表明,仅半导体制造就可能占人工智能系统总排放量的 30%,突显了需要更多可持续的制造工艺。

除了碳排放之外,人工智能对稀土元素和重要矿产的依赖还带来了额外的可持续性挑战。高性能人工智能硬件依赖于如镓、钕和钴等材料,这些材料对于生产高效强大的计算组件至关重要。然而,提取这些材料资源密集且往往导致有毒废物、森林砍伐和栖息地破坏。环境成本因地缘政治因素而加剧,因为世界上超过 90%的稀土提炼能力由中国控制,这为人工智能的全球供应链创造了脆弱性。确保这些材料的负责任采购对于减少人工智能的生态和社会影响至关重要。

几种方法可以减轻人工智能供应链的环境负担。降低芯片制造的能量强度是一条途径,一些半导体制造商正在探索低能耗的制造工艺和可再生能源驱动的生产设施。另一种方法侧重于延长人工智能硬件的使用寿命,因为频繁的硬件更新周期导致了不必要的浪费。人工智能加速器通常设计用于峰值训练性能,但在从高性能计算集群退役后,它们仍然适用于推理工作负载。将较老的 AI 芯片重新用于计算量较小的任务,而不是直接丢弃,可以显著减少硬件更换的频率。

回收和闭环供应链在使人工智能硬件更加可持续方面也发挥着重要作用。从退役的 GPU、TPU 和 ASIC 中回收和提炼有价值的材料可以减少对原生资源开采的依赖,同时最大限度地减少电子垃圾。行业范围内的回收倡议,加上优先考虑可回收性的硬件设计,可以显著提高人工智能的长期可持续性。

在人工智能中优先考虑供应链的可持续性不仅是一个环境必要性,也是一个创新的机会。通过整合节能制造、负责任的材料采购和循环硬件设计,人工智能行业可以在这些系统投入运营之前,采取有意义的步骤来减少其环境影响。这些努力与持续在节能人工智能计算方面的进步相结合,对于确保人工智能的增长不会以不可持续的生态成本为代价至关重要。

水和资源保护

缓解人工智能的环境影响需要采取直接行动来减少其用水量和资源强度。人工智能对半导体制造和数据中心的需求给水资源和重要材料带来了巨大压力,尤其是在那些已经面临资源稀缺的地区。与可以通过可再生能源抵消的碳排放不同,水资源的枯竭和材料的提取具有直接和局部的影响,因此在设计和运营层面整合可持续性措施变得尤为重要。

减少人工智能水足迹的有效策略是改善半导体制造中的水回收。领先的制造商正在实施闭环水系统,这使得工厂能够重复使用和处理水,而不是持续消耗新鲜水源。英特尔和台积电等公司已经开发了先进的过滤和回收工艺,能够回收超过 80%的芯片生产中使用的用水。在整个行业扩大这些努力对于最小化人工智能硬件制造的影响至关重要。

同样,数据中心可以通过优化冷却系统来减少用水量。许多超大规模设施仍然依赖蒸发冷却,这消耗了大量的水。转向直接芯片液体冷却或基于空气的冷却技术可以显著减少用水量。在水资源匮乏的地区,一些运营商已经开始使用废水或淡化水进行冷却,而不是从饮用水源中抽取。这些方法有助于减轻人工智能基础设施的环境影响,同时保持高效运营。

在材料方面,减少人工智能对稀土金属和重要矿物的依赖对于长期可持续性至关重要。虽然一些材料,如硅,很丰富,但其他材料,包括镓、钕和钴,受到地缘政治限制和环境破坏性提取方法的影响。研究人员正在积极探索替代材料和低浪费制造工艺,以减少对这些有限资源的依赖。此外,人工智能加速器和其他计算硬件的回收计划可以回收有价值的材料,减少对原生提取的需求。

除了个人的缓解努力之外,行业范围内的合作对于制定负责任的水使用、材料来源和回收计划的标准是必要的。政府和监管机构还可以通过执行节水命令、负责任的采矿法规和电子废物回收要求来激励可持续实践。通过优先考虑这些缓解策略,人工智能行业可以朝着最小化其生态足迹的同时继续推进技术进步。

系统性可持续性方法

缓解人工智能的环境影响需要不仅仅是孤立的优化;它需要向可持续人工智能发展的系统性转变。解决人工智能的长期可持续性意味着整合循环经济原则、建立监管政策,以及促进行业范围内的合作,以确保可持续性从底层嵌入到人工智能生态系统中。

约翰逊悖论突出了仅关注个体效率改进的局限性。我们需要系统性的解决方案,以解决人工智能消费的更广泛驱动因素。这包括促进可持续人工智能实践的政策、鼓励负责任资源使用的激励措施,以及鼓励谨慎人工智能消费的公共意识宣传活动。

通过将人工智能发展与循环经济原则对齐,是一种实现持久可持续性的有效方式。与传统的“建造、使用、丢弃”线性模型不同,循环方法优先考虑再利用、翻新和回收,以延长人工智能硬件的使用寿命(Stahel 2016)。制造商和云服务提供商可以采用模块化硬件设计,允许包括内存和加速器在内的单个组件升级,而无需更换整个服务器。此外,人工智能硬件的设计应考虑可回收性,确保有价值的材料可以被提取和再利用,而不是成为电子垃圾的来源。

监管框架在执行可持续性标准方面也发挥着重要作用。政府可以引入碳透明度要求,要求人工智能基础设施提供商报告其运营的全生命周期排放,包括从制造过程中产生的固碳(Masanet 等人 2020b)。此外,对半导体制造厂更严格的水使用法规和电子废物回收政策可以帮助减轻人工智能的资源消耗。一些司法管辖区已经实施了生产者延伸责任法,要求制造商对其产品的生命周期结束处置负责。将这些政策扩展到人工智能硬件可能会激励更可持续的设计实践。

在行业层面,协作对于扩大可持续人工智能实践至关重要。领先的 AI 公司和研究机构应建立共享的可持续性基准,跟踪能源效率、碳足迹和资源使用。标准化的绿色 AI 认证可以引导消费者和企业选择更可持续的技术选择 (Strubell, Ganesh, and McCallum 2019b)。云服务提供商也可以承诺实现 24/7 无碳能源(CFE)目标,确保 AI 工作负载实时由可再生能源供电,而不是依赖未能有效减少排放的碳抵消。

在人工智能可持续性方面实现系统性变革需要多利益相关者的方法。政府、行业领袖和研究人员必须共同努力制定可持续性标准,投资绿色基础设施,并过渡到循环人工智能经济。通过将可持续性嵌入整个人工智能开发流程,行业可以超越渐进式优化,为未来的创新建立一个真正可持续的基础。

案例研究:谷歌的框架

为了减轻快速增长的 AI 工作负载带来的排放,谷歌工程师确定了四个关键优化领域,被称为“4 Ms”,这些系统的改进共同减少了机器学习的碳足迹:

  • 模型:选择高效的 AI 架构可以在不降低模型质量的情况下减少计算需求 5-10×\times。谷歌对稀疏模型和神经架构搜索方法进行了广泛的研究,从而产生了如进化的 Transformer 和 Primer 等高效架构。

  • 机器:实施针对人工智能的特定硬件,与通用系统相比,每瓦性能提升 2-5×\times。谷歌的 TPU(张量处理单元)相对于非优化的 GPU,具有 5-13×\times更高的碳效率。

  • 机械化:利用高利用率的最优化云计算基础设施,与传统的本地数据中心相比,可以实现 1.4-2×\times的能源减少。谷歌的设施在 PUE(电源使用效率)方面始终超过行业标准。

  • 地图:在低碳电力供应地区的数据中心战略定位可以减少 5-10×\times的总排放。谷歌对其全球基础设施的再生能源使用进行实时监控。

这些实践的综合效应产生了乘法效率提升。例如,在战略位置的数据中心实施优化的 Transformer 模型,将能耗降低了 83 倍,将 CO₂排放降低了 747 倍。

尽管在谷歌的产品生态系统中人工智能部署取得了显著增长,但系统性的效率改进有效地限制了能耗增长。这一进步的重要指标是,从 2019 年到 2021 年,人工智能工作负载一直保持在谷歌总能耗的 10%到 15%的稳定比例。随着人工智能功能在谷歌服务中的扩展,计算周期的相应增加被算法、专用硬件、基础设施设计和地理优化方面的进步所抵消。

经验案例研究展示了专注于可持续人工智能发展的工程原则如何同时提高性能和环境影响。例如,对 GPT-3(截至 2020 年中被认为是最先进的)和谷歌的 GLaM 模型的比较分析揭示了改进的准确度指标,同时降低了训练计算需求和使用低碳能源,在 18 个月的开发周期内将 CO₂排放量减少了 14 倍。

谷歌的分析表明,由于方法学限制和缺乏实证测量,之前发布的估计高估了机器学习的能源需求,从 100 到 100,000 倍不等。通过透明报告优化指标,谷歌为效率倡议提供了事实依据,同时纠正了关于机器学习环境影响的过度预测。

虽然在限制人工智能运营的碳足迹方面取得了重大进展,但谷歌承认,随着人工智能应用的普及,持续提高效率对于负责任创新至关重要。他们的持续优化框架包括:

  1. 生命周期分析:证明如神经架构搜索等计算投资虽然最初资源密集,但会产生显著的下游效率,这些效率超过了初始成本。尽管与手动工程方法相比,在发现阶段能耗更高,但 NAS 最终通过生成适用于多个部署的优化架构,减少了累积排放。

  2. 资源分配优先级:将可持续性倡议集中在数据中心和服务器端优化,因为这些地方能耗最为集中。尽管谷歌继续提高边缘设备上的推理效率,但主要焦点仍然在于训练基础设施和可再生能源采购,以最大化环境投资回报。

  3. 规模经济: 通过工作负载整合利用精心设计的云基础设施固有的效率优势。随着计算从分布式本地环境转移到具有强大可持续发展框架的集中式提供商,总排放量减少加速。

  4. 可再生能源整合: 优先考虑可再生能源采购,因为谷歌自 2017 年以来已经实现了 100%的能源消耗与可再生能源匹配,以进一步减少计算工作负载的环境影响。

这些集成方法表明,人工智能效率的提高正在加速,而不是达到平台期。谷歌的多方面策略,结合系统测量、碳感知的开发方法、报告的透明度以及可再生能源转型,为可持续人工智能扩展提供了一个可复制的框架。这些经验结果为更广泛行业采用全面可持续发展实践提供了基础。

可持续人工智能开发的工程指南

本节中提出的策略和框架为可持续人工智能开发奠定了基础,但实施需要具体的、可操作的步骤。此清单综合了人工智能工程师和从业者可以立即实施的、以减少其工作对环境影响的重点实践:

  1. 先测量: 使用 CodeCarbon 等工具跟踪你的训练运行的排放。你不测量你做的事情,建立基线指标对于验证优化工作的有效性至关重要。

  2. 明智地选择地区: 在由可再生能源供电的数据中心中训练模型。检查电网碳强度,并在清洁能源最丰富的地区和时间安排工作负载。

  3. 优化你的模型: 不要仅仅训练尽可能大的模型。使用剪枝、量化和知识蒸馏来找到满足你准确度目标的最小模型。记住,一个 90%准确且只需 10%资源的模型,往往比一个 95%准确且需要全部资源的模型在现实世界中有更好的价值。

  4. 不要从头开始重新训练: 在可能的情况下,使用迁移学习和微调而不是完全重新训练。站在现有预训练模型的基础上可以按数量级减少计算需求。

  5. 考虑硬件: 选择能效高的加速器(如 TPUs 或专门的推理芯片)进行部署。考虑整个硬件生命周期,并选择针对你特定工作负载特性优化的平台。

  6. 考虑整个生命周期: 在你的组织中倡导更长的硬件更新周期和负责任的电子废物政策。制造的环境影响往往超过运营能源消耗,使硬件的耐用性成为关键的可持续发展因素。

嵌入式人工智能和电子废物

AI 的部署正在迅速从集中的数据中心扩展到边缘和嵌入式设备,这使得无需持续云连接即可进行实时决策。这种转变导致了主要效率的提升,降低了延迟、带宽消耗和网络拥堵,同时为智能消费设备、工业自动化、医疗保健和自主系统等领域带来了新的应用。这些分布式 AI 系统的架构和设计考虑因素涉及在计算效率、延迟需求和资源限制之间的复杂权衡。然而,嵌入式 AI 的兴起带来了新的环境挑战,尤其是在电子废物、一次性智能设备和计划性过时方面。

与数据中心中设计用于长期使用和高计算吞吐量的高性能 AI 加速器不同,嵌入式 AI 硬件通常体积小、成本低、可丢弃。许多由 AI 驱动的物联网传感器、可穿戴设备和智能家电都是用短期寿命和有限的升级能力构建的,这使得它们难以修复或回收(Baldé等人 2017)。因此,这些设备加剧了快速增长的电子废物危机,这在关于 AI 可持续性的讨论中在很大程度上被忽视。

这个问题的规模令人震惊。如图 18.13 所示,预计到 2030 年,物联网(IoT)设备的数量将超过 300 亿,AI 驱动的芯片越来越多地嵌入到从家用电器和医疗植入物到工业监控系统和国防传感器等一切事物中(Statista 2022)。这种连接设备的指数级增长,利用针对边缘计算需求优化的专用硬件架构,提出了重大的环境挑战,因为许多这些设备将在短短几年内过时,导致电子废物激增。如果没有可持续的设计实践和改进的生命周期管理,边缘 AI 的扩展可能会加剧全球电子废物积累,并给回收基础设施带来压力。

图片

图 18.13:物联网设备增长:连接设备数量的快速扩张放大了嵌入式 AI 系统的环境影响,因为设备短寿命导致电子废物不断增加。预计到 2030 年将超过 300 亿台设备的预测需要可持续设计和改进的回收基础设施,以减轻日益严重的电子废物危机。来源:(Statista 2022)。

虽然人工智能驱动的数据中心因其碳足迹和能源需求而受到审查,但对其嵌入数十亿短命设备的环境成本的关注却少得多。应对这一挑战需要重新思考人工智能硬件的设计、制造和处置方式,确保边缘人工智能系统在促进技术进步的同时,不会留下不可持续的环境废物遗产。

全球电子废物加速

电子废物,或称 e-waste,代表了数字时代迅速增长的环境挑战。定义为含有电池、电路板和半导体组件的废弃电子设备,e-waste 对人类健康和环境都构成了严重风险。在人工智能允许的硬件中常见的有毒材料,如铅、汞、镉和溴化阻燃剂,如果处理不当,会污染土壤和地下水。尽管有回收和材料回收的潜力,但大多数 e-waste 仍然被不当处理,导致危险废物积累和显著的环境退化。

问题的规模令人震惊。如今,全球 e-waste 年产量超过 5000 万吨,预计到 2030 年这一数字将超过 7500 万吨,因为消费电子设备和人工智能驱动的物联网设备继续激增。根据联合国的数据,如果当前的消费模式持续下去,到 2050 年,e-waste 的年产量可能达到 1.2 亿吨(Un and Forum 2019)。产品寿命短、全球需求上升和有限的回收基础设施的结合加速了这一危机。

驱动的人工智能消费设备,如智能音箱、健身追踪器和家庭自动化系统,是 e-waste 最重要的贡献者之一。与模块化和可维护的计算系统不同,许多这些设备被设计成一次性使用,这意味着当电池失效或组件故障时,整个产品就会被丢弃而不是修理。这种内置的可丢弃性加剧了不可持续的消费和浪费循环,导致更高的材料提取率和对废物管理系统的更大压力。

发展中国家受到电子垃圾倾倒的影响不成比例,因为它们通常缺乏处理过时电子产品的安全基础设施。2019 年,低收入国家的电子垃圾中只有 13%到 23%被正式收集用于回收,其余的要么被焚烧、非法倾倒,要么在危险条件下手工拆解(Un 和 Forum 2019)。许多废弃的 AI 驱动设备最终进入非正式回收操作,那里的低薪工人在没有适当防护设备的情况下接触有害物质。塑料组件的露天焚烧和粗金属提取方法释放有毒烟雾和重金属到周围环境中,对健康构成严重风险。

全球电子垃圾的回收率仍然令人担忧地低,只有 17.4%的废弃电子产品通过环境友好的回收渠道处理(Singh 和 Ogunseitan 2022)。其余 82.6%要么被填埋、焚烧,要么非法倾倒,导致长期的环境污染和资源枯竭。没有更加强硬的政策、更好的产品设计以及扩展的电子垃圾管理系统,AI 驱动设备的快速增长将显著加剧这一危机。

驱动人工智能的电子产品不应成为全球电子垃圾问题的另一个主要贡献者。应对这一挑战需要多管齐下的方法,包括更可持续的设计实践、更强的监管监督以及在全球电子垃圾回收基础设施上的更大投资。如果没有干预,人工智能的环境影响将远远超出其能源消耗,留下有毒废物和资源枯竭的遗产。

一次性电子产品

低成本的 AI 驱动微控制器、智能传感器和连接设备的快速普及已经改变了各个行业,从消费电子、医疗保健到工业自动化和农业。虽然这些嵌入式 AI 系统允许更高的效率和自动化,但它们的短暂使用寿命和非可回收的设计提出了重大的可持续性挑战。许多这些设备被视为一次性电子产品,设计时考虑了有限的耐用性、不可更换的电池以及几乎无法维修,使得它们在使用几年后注定进入垃圾流。

人工智能设备可丢弃性的主要驱动因素是微电子成本的下降。计算硬件的微型化使得制造商能够将微小的 AI 处理器和无线连接模块嵌入到日常产品中,通常每个芯片的价格低于 1 美元。因此,人工智能功能越来越多地被集成到一次性或短期使用的产品中,包括智能包装、连接的医疗设备、可穿戴设备和家用电器。这些成本效益的嵌入式实现,利用了针对资源受限环境的先进优化技术,提高了便利性和实时数据收集,但缺乏适当的报废管理策略,导致难以回收的电子废物激增 (Forti 等人 2020)。

不可更换电池的成本

许多一次性人工智能设备集成了密封的、不可更换的锂离子电池,使其本质上不可持续。智能耳机、无线传感器,甚至一些健身追踪器一旦电池退化,功能就会完全丧失,迫使消费者丢弃整个设备。与用户可维护组件的模块化电子设备不同,大多数人工智能穿戴设备和物联网设备都是粘合或焊接封闭的,防止更换或维修电池。

这个问题不仅限于消费类小工具。工业人工智能传感器和远程监控设备,通常在农业、基础设施和环境监测中部署,经常依赖于寿命有限的不可更换电池。一旦耗尽,这些传感器,其中许多安装在偏远或难以到达的位置,就会变成电子废物,需要昂贵的、破坏环境的处理或更换 (Ciez 和 Whitacre 2019)。

电池废弃物的环境影响尤其令人担忧。锂矿开采,对于电池生产至关重要,是一个能耗密集的过程,消耗大量水资源并产生有害副产品。此外,锂电池的不当处理会带来火灾和爆炸风险,尤其是在垃圾填埋场和废物处理设施中。随着对人工智能设备需求的增长,解决电池可持续性危机对于减轻人工智能长期的环境足迹将至关重要。

回收挑战

与包括台式计算机和企业服务器在内的传统计算硬件不同,这些硬件可以拆卸和翻新,大多数人工智能允许的消费电子产品并不是为回收而设计的。许多这些设备包含混合材料外壳、嵌入式电路和永久性连接的组件,使得它们难以拆卸和回收材料 (Patel 等人 2016)。

此外,AI 驱动的物联网设备通常太小,无法使用传统的电子废物处理方法进行有效回收。大型电子产品,如笔记本电脑和智能手机,拥有成熟的回收计划,允许材料回收。相比之下,微小的 AI 驱动传感器、耳机和嵌入式芯片通常成本高昂且劳动密集,难以分离成可重复使用的组件。因此,它们往往最终进入垃圾填埋场或焚烧炉,导致污染和资源耗竭。

电池废物的环境影响尤其令人担忧。锂矿开采,对电池生产至关重要,是一个能耗密集的过程,消耗大量水资源并产生有害副产品(Bouri 2015)。此外,锂电池的不当处理存在火灾和爆炸风险,尤其是在垃圾填埋场和废物处理设施中。随着 AI 驱动设备需求的增长,解决电池可持续性危机对于减轻 AI 的长期环境影响至关重要(Zhan, Oldenburg, and Pan 2018)。

对可持续设计的需要

解决一次性 AI 电子产品的可持续性挑战需要设计哲学的核心转变。制造商不应优先考虑成本削减和短期功能,而应将可持续性原则嵌入 AI 驱动设备的开发中。这种方法与更广泛的负责任 AI 原则相一致,强调道德发展实践,将道德考量扩展到环境管理。这包括:

  • 设计用于长期使用:AI 驱动设备应采用可更换组件、模块化设计和可升级的软件,以延长其可用性。

  • 实现电池更换:消费和工业 AI 设备应采用易于更换的电池,而不是防止维修的密封外壳。

  • 标准化可维修性:AI 硬件应采用通用的维修标准,确保组件可以维修而不是丢弃。

  • 开发可生物降解或可回收材料:对环保电路板、生物降解聚合物和可持续包装的研究可以帮助减少废物。

激励措施和法规也可以鼓励制造商优先考虑可持续的 AI 设计。政府和监管机构可以实施维修权法律、延长生产者责任政策和电子废物回收计划,以确保 AI 驱动设备得到负责任的处理。此外,消费者意识宣传活动可以教育用户负责任地处理电子废物,并鼓励可持续的购买决策。

人工智能驱动电子产品的未来必须是循环的,而不是线性的,确保设备的设计考虑到可持续性,并且不会不成比例地加剧全球电子垃圾危机。通过重新思考设计、提高可回收性和促进负责任的处理,该行业可以在减轻边缘人工智能的负面环境影响的同时,仍然推动技术进步。

人工智能硬件淘汰

计划淘汰的概念指的是有意设计产品具有人为限制的使用寿命,迫使消费者比必要的时间更早地升级或更换它们。虽然这种做法长期以来一直与消费电子产品和家用电器相关联,但它越来越普遍地存在于人工智能硬件中,从智能手机和可穿戴设备到工业人工智能传感器和云基础设施。这种加速的更换周期不仅推动了更高的消费和生产,而且还对日益增长的电子垃圾危机做出了重大贡献(Slade 2007)。

人工智能硬件中计划淘汰的一个明显例子是软件驱动的设备性能退化。许多制造商推出软件更新,虽然表面上是为了增强安全和功能,但往往降低了旧设备的性能。例如,苹果公司因通过 iOS 更新故意降低旧款 iPhone 型号的性能而受到审查(Luna 2018a)。虽然该公司声称这些更新是为了防止电池相关的关机,但批评者认为它们促使消费者进行不必要的升级,而不是鼓励维修或更换电池。

这种模式也扩展到人工智能驱动的消费电子产品,固件更新可能会使旧型号无法与新功能兼容,实际上迫使用户更换设备。许多智能家居系统、连接的家电和人工智能助手由于云支持或软件服务的终止而遭受强制淘汰,即使硬件本身完好无损,也无法使用(Luna 2018b)。

锁定和专有组件

另一种形式的计划淘汰源于硬件锁定,制造商故意阻止用户维修或升级他们的设备。许多人工智能设备具有专有组件,使得无法更换电池、升级内存或更换故障部件。制造商不是设计模块化和耐用性,而是优先考虑密封外壳和焊接组件,确保即使是微小的故障也会导致整个设备的更换(Johnson 2018)。

例如,许多 AI 可穿戴设备和智能设备集成了不可更换的电池,这意味着当电池退化(通常在两到三年内)时,整个设备就变成了电子垃圾。同样,智能手机、笔记本电脑和 AI 允许的平板电脑越来越多地使用焊接的 RAM 和存储,这阻止了用户升级硬件和延长其使用寿命(M. Russell 2022)。

计划性淘汰还影响工业 AI 硬件,包括 AI 相机、工厂传感器和机器人。许多工业自动化系统依赖于供应商锁定型软件生态系统,制造商停止对旧型号的支持,以推动客户转向更新、更昂贵的替代品。这形成了一个强制升级的循环,公司必须频繁更换本应功能正常的 AI 硬件,仅为了保持软件兼容性(Sharma 2020)。

环境成本

计划性淘汰不仅给消费者带来财务负担,还带来严重的环境后果。通过缩短产品使用寿命和阻碍可维修性,制造商增加了对新电子组件的需求,导致资源开采、能源消耗和碳排放增加。

考虑到半导体制造对环境的高成本,这一循环的影响尤其令人担忧。生产 AI 芯片、GPU 和其他高级计算组件需要大量的水、稀土矿物和能源。例如,一个单一的 5nm 半导体制造厂每天消耗数百万加仑的超纯水,并依赖于能耗密集型过程,这些过程会产生大量的 CO₂排放(Mills and Le Hunte 1997; Harris 2023)。当 AI 设备过早被丢弃时,制造的环境成本实际上被浪费了,加剧了 AI 的整体可持续性挑战。

此外,许多被丢弃的 AI 设备含有有害物质,包括铅、汞和溴化阻燃剂,如果不进行适当回收,这些物质可能会渗入环境(Puckett 2016)。AI 消费电子和工业硬件的加速更替将只会加剧全球电子垃圾危机,进一步加剧废物管理和回收系统压力。

延长硬件使用寿命

解决计划性淘汰需要设计哲学的转变,转向可维修、可升级和更持久的 AI 硬件。一些潜在解决方案包括:

  • 维修权立法:许多政府正在考虑维修权法律,这将要求制造商为 AI 设备提供维修手册、备件和诊断工具。这将允许消费者和企业延长硬件的使用寿命,而不是更换整个系统(Johnson 2018)。

  • 模块化 AI 硬件:设计具有模块化组件的 AI 设备,如可更换的电池、可升级的内存和标准化的端口,可以显著减少电子垃圾,同时提高消费者的成本效益(Incorporated 2022)。

  • 扩展软件支持:公司应承诺更长的软件支持周期,确保老旧的 AI 设备保持功能,而不是因为人工兼容性限制而被淘汰(S. Brown 2021)。

  • 消费者意识与循环经济:鼓励以旧换新和回收计划,以及关于可持续 AI 购买的消费者教育,可以帮助需求转向可维修和耐用的设备(Cheshire 2021)。

几家科技公司已经在尝试更可持续的 AI 硬件。例如,专注于模块化笔记本电脑的初创公司 Framework 提供完全可维修、可升级的系统,这些系统优先考虑长期使用性,而不是一次性设计。智能手机和 AI 驱动的物联网领域的类似努力可以帮助减少计划性淘汰的环境足迹。

AI 设备的广泛应用为重新思考电子产品的生命周期提供了重要机会。如果放任不管,计划性淘汰将继续推动浪费的消费模式,加速电子垃圾的积累,并加剧资源提取危机。然而,通过政策干预、行业创新和消费者倡导,AI 硬件可以被设计成耐用、可维修和可持续的。

AI 的未来不应是可丢弃的。相反,公司、研究人员和政策制定者必须优先考虑长期可持续性,确保 AI 的环境足迹最小化,同时其益处最大化。解决 AI 硬件中的计划性淘汰是使 AI 真正可持续的关键步骤,这不仅涉及能源效率,还涉及其整个生命周期,从设计到废弃。

政策与法规

第三部分探讨的技术和基础设施解决方案需要支持性的政策框架以实现广泛采用。虽然算法优化、基础设施改进和生命周期管理可以减少人工智能的环境影响,但仅靠市场力量可能无法以所需的速度和规模推动足够的变化。有效的监管必须平衡创新推动和环境责任执行之间的紧张关系,创建激励可持续实践而不阻碍技术进步的框架。本节探讨了为应对人工智能的环境足迹而出现的政策工具和治理机制,从测量标准到监管限制再到基于市场的激励措施。

监管机制与全球协调

可持续人工智能治理通过四种主要政策机制运作:测量和报告要求、排放限制、财务激励和行业自律倡议。然而,全球政策碎片化造成了实施挑战。欧盟通过《人工智能法案》(AI Act)47 和《企业可持续发展报告指令》(CSRD)48 领导强制方法,而美国框架强调自愿报告和基于市场的激励措施。中国和其他国家发展独立的框架,可能为统一的全球可持续战略设置障碍。

测量与问责制

透明的测量和报告为可持续人工智能治理提供了基础。没有标准化的跟踪机制,组织无法准确评估环境影响或确定改进机会。

测量与报告

减轻人工智能环境影响的第一个重要步骤是准确测量和透明报告能源消耗和碳排放。没有标准化的跟踪机制,很难评估人工智能的真实可持续影响或确定改进领域。政府法规和行业倡议开始强制要求进行能源审计、排放披露和人工智能工作负载的标准效率指标。这些政策旨在提高透明度、提供更好的决策信息,并使组织对其环境足迹负责。

评估人工智能环境影响缺乏普遍接受的指标一直是一个重大挑战。当前的可持续性评估通常依赖于公司的不定期报告,测量能源消耗和排放的方法不一致。政策制定者和行业领导者正在倡导正式的可持续性基准,这些基准在多个层面上评估人工智能的碳足迹。计算复杂性和模型效率是关键因素,因为它们决定了完成特定人工智能任务所需的计算量。数据中心效率,通常通过功率使用效率来衡量,在评估数据中心多少电力消耗直接支持计算而不是因冷却和基础设施开销而损失方面发挥着重要作用。能源供应的碳强度也是一个重要考虑因素,因为主要依赖化石燃料供电的电网运行的人工智能操作的环境影响远大于那些依赖可再生能源供电的操作。

几个行业努力正在朝着标准化人工智能可持续性报告的方向发展。MLCommons 基准联盟已经开始将能源效率作为人工智能模型评估的因素之一,认识到对模型能源消耗进行标准化比较的需要。这些可持续性指标补充了传统的性能评估,通过系统测量方法创建了平衡能力与环境影响的综合评估框架。同时,监管机构正在推动强制披露。在欧洲,拟议的 AI 法案包括要求使用人工智能的组织报告与其模型相关的能源消耗和碳排放的规定。欧盟委员会表示,人工智能的可持续性报告要求可能很快将与 CSRD 下的更广泛的环境披露法规相一致。

在实施人工智能可持续性报告时,一个重大挑战是在透明度和对组织潜在负担之间取得平衡。虽然更高的透明度对于问责制很重要,但要求对每个人工智能工作负载进行详细报告可能会造成过度的开销,尤其是对小型企业和研究机构而言。政策制定者正在探索可扩展的方法,将这些可持续性考虑因素整合到现有的行业标准中,而不强加严格的合规成本。开发轻量级报告机制,利用数据中心和云平台内现有的监控工具,可以在减轻这种负担的同时,仍然提高对人工智能环境影响可见性的了解。

要最具建设性,测量和报告政策应专注于实现持续改进,而不是简单化限制或刚性上限。鉴于 AI 的快速演变,将灵活性纳入评估指标并嵌入可持续性的法规将最有效地推动能源消耗和排放的实质性减少。而不是扼杀创新,精心设计的政策可以鼓励 AI 开发者从一开始就优先考虑效率,培养与长期可持续性目标相一致的责任 AI 设计文化。

限制机制

除了测量和报告要求之外,直接的公共政策干预可以通过对能源消耗、排放或模型规模进行监管限制来限制 AI 的环境影响。虽然 AI 的快速增长推动了创新,但也引入了新的可持续性挑战,这可能需要政府设定护栏来遏制过度的环境成本。限制机制,如计算能力上限、对公共资源的条件访问、经济激励措施,甚至对低效 AI 实践的全面禁止,都是减少 AI 碳足迹的潜在工具。然而,它们的有效性取决于精心设计的政策,在可持续性与持续技术进步之间取得平衡。

一种潜在的限制机制涉及对用于训练大型 AI 模型的计算能力设定限制。欧洲委员会提出的 AI 法案通过引入对 AI 训练工作负载的全面限制来探讨这一概念。这种方法与环境保护政策中的排放交易系统(ETS)类似,其中组织必须在预定义的能源预算内运营或通过监管交易所采购额外容量。虽然这样的限制可以帮助防止不必要的计算浪费,但也引发了关于限制创新的担忧,尤其是对于可能难以获得高性能计算资源的研究人员和小公司(参见 Schwartz 等人 2020 年的研究 Schwartz et al. 2020)。

另一种政策工具涉及根据模型效率对公共数据集和政府资助的计算基础设施的访问进行条件限制。人工智能研究人员和开发者越来越多地依赖大规模公共数据集和补贴云资源来训练模型。有些人提出,政府可以限制这些资源仅用于符合严格能源效率标准的 AI 项目。例如,MLCommons 基准测试联盟可以将可持续性指标整合到其标准化的性能排行榜中,激励组织在准确性的同时优化效率。然而,尽管条件访问可以促进可持续的 AI 实践,但它也可能会通过限制无法达到预定义效率阈值的计算资源访问来造成差异。

财政激励和惩罚措施是推动可持续人工智能发展的另一种监管机制。对与人工智能相关的计算消费征收碳税可以抑制过度模型扩展,同时为以效率为重点的研究提供资金。类似于现有的环境法规,组织可能需要根据其人工智能工作负载产生的排放付费,鼓励它们优化以降低能耗。相反,税收抵免可以奖励开发高效人工智能技术的公司,促进对更绿色计算技术的投资。虽然金融机制可以有效地引导市场行为,但它们必须仔细调整,以避免对较小的人工智能开发者造成不成比例的负担或阻碍生产性用例。

在极端情况下,可能需要考虑对特别浪费的人工智能应用实施全面禁令。如果测量数据持续指出某些人工智能实践对环境造成不成比例的损害,且没有可行的补救途径,政府可能选择完全禁止这些活动。然而,由于人工智能的双重用途性质,即同一技术可以同时具有有益和有害的应用,定义有害的人工智能用例具有挑战性。政策制定者在实施禁令时必须谨慎行事,确保限制针对明显不可持续的做法,同时不抑制更广泛的人工智能创新。

最终,限制机制必须在环境责任和经济增长之间找到一个谨慎的平衡点。精心设计的政策应当鼓励人工智能的效率,同时保留持续技术进步所需的灵活性。通过将限制与激励措施和报告要求相结合,政策制定者可以为引导人工智能走向更加可持续的未来建立一个全面的框架。

政府激励措施

除了监管限制之外,政府可以通过激励措施在推进可持续人工智能发展中发挥积极主动的作用。通过提供财政支持、税收优惠、拨款和对绿色人工智能研究的战略投资,可以推动环保型人工智能技术的采用。与惩罚性限制不同,激励措施提供正面强化,使可持续性成为一种竞争优势,而不是监管负担。

推广可持续性的一个常见方法是通过税收优惠。政府已经为采用可再生能源提供税收抵免,例如美国的住宅清洁能源信用商业能源效率扣除。类似的计划可以扩展到那些优化其模型和基础设施以降低能耗的 AI 公司。那些整合如模型剪枝、量化或自适应调度等提高效率技术的 AI 开发者,可能符合税收减免的资格,从而为绿色 AI 的发展创造经济激励。

除了税收优惠之外,直接政府对可持续 AI 研究的资金支持是一种新兴策略。西班牙已经承诺为明确关注可持续性的 AI 项目投入3 亿欧元。此类资金可以通过支持研究新型低功耗算法、专用 AI 硬件和环保数据中心设计来加速节能 AI 的突破。公私合作伙伴关系可以进一步加强这些努力,允许 AI 公司与研究机构和政府部门合作,开创可持续解决方案。

政府还可以通过将绿色 AI 标准纳入公共采购政策来激励可持续性。许多 AI 公司为政府机构提供云计算、软件服务和 AI 驱动的分析。通过强制要求供应商满足可持续性基准,包括在碳中和数据中心运营和使用节能 AI 模型,政府可以利用其购买力来设定行业标准。类似的政策已经应用于绿色建筑倡议,其中政府要求承包商满足环境认证。将同样的方法应用于 AI 可以加速可持续实践的采用。

另一项创新的政策工具是引入专门针对人工智能工作负载的碳信用额度。在这个体系中,人工智能公司可以通过投资可再生能源项目或碳捕获技术来抵消排放。超过预定义排放阈值的 AI 公司将被要求购买碳信用额度,从而创造一个基于市场的机制,自然地激励效率。这一概念与成功减少制造业和能源生产等行业排放的更广泛的总量控制与交易计划相一致。然而,正如在拆分能源属性证书(EACs)周围遇到的挑战所看到的,碳信用额度计划必须精心设计,以确保真正的减排,而不是让公司简单地“用钱摆脱”对可持续性的承诺。

虽然政府激励措施为推广绿色人工智能提供了强大的机制,但它们的设计和实施需要仔细考虑。激励措施的结构应该旨在推动有意义的变化,而不创造漏洞,让组织在没有真正改善可持续性的情况下声称获得利益。此外,政策必须足够灵活,以适应人工智能技术的快速进步。通过战略性地结合税收激励措施、资金计划、采购政策和碳信用额度系统,政府可以创造一个生态系统,其中可持续性不仅是一个监管要求,而且是一个经济优势。

自我调节

虽然政府政策在塑造可持续人工智能实践方面发挥着重要作用,但人工智能行业本身通过自我调节能够推动重大的环境改善。许多领先的 AI 公司和研究机构已经采取了自愿承诺,以减少其碳足迹、提高能源效率和促进可持续发展。这些努力可以补充监管政策,在某些情况下,甚至可以设定比政府规定的标准更高的标准。

一种明显的自我监管策略是主要 AI 公司承诺使用可再生能源。像谷歌、微软、亚马逊和 Meta 这样的公司承诺采购足够的清洁能源,以匹配其 100%的电力消耗。谷歌更进一步,通过确保其数据中心每天每小时都仅使用可再生能源,旨在实现24/7 无碳能源。这些承诺不仅减少了运营排放,还创造了可再生能源的市场需求,加速了向绿色电网的过渡。然而,正如使用未分拆的 EACs 所看到的那样,在可再生能源声明中保持透明度和问责制对于确保真正的脱碳而不是表面上的抵消仍然很重要。

另一种形式的自我监管是内部采用碳定价模型。一些公司实施影子定价,即在财务决策中为碳排放分配内部成本。通过将这些成本纳入预算和投资策略,AI 公司可以优先考虑节能基础设施和低排放的 AI 模型。这种方法与航空和制造等行业更广泛的公司可持续发展努力相呼应,在这些行业中,内部碳定价已被证明是推动减排的有效工具。

除了能源消耗之外,AI 开发者可以实施自愿效率清单,以指导可持续设计的选择。像AI 可持续性联盟这样的组织已经提出了框架,概述了模型开发、硬件选择和运营能源管理的最佳实践。这些清单可以作为 AI 工程师将可持续性融入其工作流程的实用工具。公开承诺遵循这些指南的公司为整个行业树立了榜样,表明可持续性不仅仅是一个事后考虑,而是核心设计原则。

独立的可持续性审计通过提供第三方对 AI 公司环境影响评估,进一步增强了问责制。专注于技术可持续性的公司,如碳信托和绿色软件基金会,提供评估能源消耗、碳排放和遵守绿色计算最佳实践的审计。自愿接受这些审计并公布其发现的人工智能公司有助于与消费者、投资者和监管机构建立信任。环境报告的透明度允许利益相关者验证公司是否履行了其可持续性承诺。

人工智能可持续性中的自我监管也扩展到开源合作。像CodeCarbonML CO2\textrm{CO}_2 Impact这样的倡议提供了工具,允许开发者估算和跟踪他们人工智能模型的碳足迹。通过将这些工具集成到主流人工智能开发平台(如 TensorFlow 和 PyTorch)中,行业可以将可持续性跟踪标准化为一种标准做法。鼓励开发者测量和优化他们的能源消耗,培养了一种问责制和持续改进的文化。

虽然自我监管是实现可持续性的重要一步,但它不能取代政府监管。自愿承诺的强度取决于推动它们的激励措施,如果没有外部问责制,一些公司可能会将利润置于可持续性之上。然而,当与监管框架相结合时,自我监管可以通过允许行业领导者设定高于法律规定的标准来加速进步。通过将可持续性融入企业战略,人工智能公司可以证明技术进步和环境责任不是相互排斥的。

全球影响

虽然人工智能可持续性努力正在取得进展,但它们在国家政策、行业倡议和区域能源基础设施方面仍然分散。人工智能的环境足迹本质上是全球性的,跨越供应链、云数据中心和国际市场。政府和公司之间缺乏协调可能会造成低效、相互矛盾的法规和漏洞,使得公司可以将环境负担转移,而不是真正减少它们。因此,建立全球人工智能可持续性框架对于协调政策、确保问责制和促进减轻人工智能环境影响的实质性进展至关重要。

全球人工智能可持续性努力的主要挑战是监管差异。各国和地区在人工智能治理方面采取了截然不同的方法。例如,欧盟的人工智能法案引入了基于风险的全面监管,包括对人工智能系统的能源效率和环境影响评估的规定。相比之下,美国主要采取了市场驱动的方法,强调企业自我监管和自愿的可持续性承诺,而不是可执行的命令。同时,中国通过大量的政府投资优先考虑人工智能的主导地位,将可持续性置于技术领导地位之后。这种监管拼凑造成了在跟踪和管理与人工智能相关的排放、资源消耗和能源效率方面的不一致性。

针对这种碎片化问题,一个提出的解决方案是标准化人工智能系统的可持续性报告指标。诸如经合组织(OECD)、电气和电子工程师协会(IEEE)和联合国等组织一直在推动类似于财务披露框架的统一环境影响报告标准。这将使公司能够使用共同的方法来跟踪和比较其碳足迹、能源使用和资源消耗。正如更广泛的环境会计实践中所观察到的,采用生命周期评估(LCA)标准对人工智能,将允许对人工智能从硬件制造到部署和退役的总体环境影响进行更准确的评估。

除了报告之外,能源电网的脱碳仍然是一个重要的全球考虑因素。人工智能的可持续性受到不同地区电力碳强度的严重影响。例如,在波兰这样的燃煤地区训练大型人工智能模型,其碳排放量显著高于在水电发电的挪威训练相同的模型。然而,基于市场的能源会计实践,包括购买未分拆的能源属性证书(EACs),使一些公司在高排放电网运营的情况下也能声称实现碳中和。这引发了担忧,即可持续性声明可能并不总是反映实际的减排,而是依赖于将碳责任转移而非消除的金融工具。作为回应,谷歌倡导了 24/7 无碳能源(CFE),旨在实时匹配本地能源消耗与可再生能源,而不是依赖于遥远的抵消。如果得到广泛采用,这种模式可能成为人工智能可持续性会计的全球基准。

另一个全球关注的重点领域是人工智能硬件供应链和电子废物管理。人工智能加速器、GPU 和数据中心硬件的生产依赖于跨越多个大陆的复杂原材料提取、半导体制造和电子组装网络。这个供应链的环境影响,包括非洲的稀土矿物开采、台湾的芯片制造和中国最终组装,通常超出了人工智能公司自身的管辖范围。这强调了在可持续半导体生产、负责任的采矿实践和电子废物回收政策方面达成国际协议的必要性。

《巴塞尔公约》,该公约规范危险废物出口,可能为在全球范围内解决与人工智能相关的电子废物挑战提供一个范例。该公约限制从发达国家向发展中国家转移有毒电子废物,在这些国家,不安全的回收实践可能伤害工人并污染当地生态系统。将此类协议扩展到涵盖人工智能特定的硬件组件,如 GPU 和推理芯片,可以确保报废处理得到负责任的处理,而不是外包给环境保护较弱地区的做法。

人工智能可持续性的国际合作不仅关乎减轻损害,还在于利用人工智能作为推动环境进步的工具。人工智能模型已经在气候预测、可再生能源优化和精准农业中得到部署,展示了它们对实现全球可持续性目标的贡献潜力。这些应用代表了人工智能能力与社会利益的交汇点,展示了人工智能如何对积极的环保和社会成果做出贡献。政府、研究机构和行业领导者必须就扩大支持气候行动的人工智能解决方案的最佳实践达成一致,确保人工智能不仅仅是一个可持续性挑战,而且是一个强大的全球环境弹性的工具。

最终,可持续的人工智能需要一个协调一致的全局方法,该方法将监管一致性、标准化可持续性报告、能源脱碳、供应链问责制和负责任的电子废物管理相结合。没有这样的合作,地区间在人工智能治理方面的差异可能会阻碍有意义的进步,使低效和外部化的环境成本得以持续。随着人工智能的不断发展,建立平衡技术进步与环境保护责任的全球框架,对于塑造一个不仅智能而且可持续的人工智能驱动未来将至关重要。

公众参与

随着人工智能(AI)在应对环境挑战的努力中日益紧密地结合在一起,公众认知在塑造其采用、监管和长期社会影响方面发挥着关键作用。虽然人工智能通常被视为推动可持续性的强大工具,包括智能能源管理、气候建模和保育工作等应用,但它也面临着对其环境足迹、伦理问题和透明度的审查。

围绕人工智能和可持续性的公众讨论往往两极分化。一方面,人工智能被誉为一种变革力量,能够加速气候行动、减少碳排放和优化资源使用。另一方面,对人工智能模型高能耗、可能产生意外环境后果以及人工智能驱动决策的模糊性的担忧依然存在。这些对立的观点影响着政策制定、资金优先事项以及社会对人工智能驱动可持续性倡议的接受度。

缩小人工智能研究人员、政策制定者和公众之间的差距对于确保人工智能对可持续性的贡献既基于科学又负责任至关重要。这需要关于人工智能的能力和局限性的清晰沟通,人工智能决策过程的更大透明度,以及包容性公众参与的机制。没有知情公众的参与,误解和怀疑可能会阻碍那些有可能推动有意义的环境进步的人工智能解决方案的采用。

公众对人工智能环境影响的认知

公众对人工智能及其在可持续性中的作用的理解仍然有限,通常受到强调其变革潜力或风险的媒体报道的影响。例如,皮尤研究中心的调查(中心 2023)发现,尽管大多数人听说过人工智能,但他们对其具体应用的理解,尤其是在可持续性的背景下,仍然很浅薄。许多人将人工智能与自动化、推荐系统或聊天机器人联系起来,但可能没有意识到其在气候科学、能源优化和环境监测方面的更广泛影响。这种公众认知与技术现实之间的差距凸显了了解人工智能系统及其在应对社会挑战中的实际应用的基础性重要性。

影响公众认知的一个关键因素是人工智能在可持续性方面的贡献的框架。乐观的描绘强调人工智能增强可再生能源整合、提高气候模型准确性和允许智能基础设施以减少排放的能力。例如,气候变化人工智能等组织积极推广人工智能在环境应用中的潜力,培养积极的叙事。相反,对人工智能能耗密集型训练过程、伦理考量以及潜在偏见的担忧导致了怀疑态度。分析公众关于人工智能可持续性讨论的研究表明,乐观与谨慎的观点各占一半,有些人担心人工智能的环境成本可能超过其收益。

在许多情况下,公众对由人工智能驱动的可持续性努力的看法是由对机构的信任所塑造的。由信誉良好的环境组织部署或与科学界合作的人工智能系统往往能获得更积极的反响。然而,由企业主导的人工智能可持续性倡议往往面临怀疑,尤其是如果它们被视为绿色洗牌——一种公司夸大其对环境责任承诺而不采取实质性行动的做法。

为了培养公众的知情参与,提高人工智能素养至关重要。这包括对人工智能实际能源消耗、优化潜力和在可持续性中的实际应用的教育。大学、研究机构和行业领导者可以通过公开报告、交互式工具和清晰的沟通策略,在使人工智能的可持续性影响更易于公众理解方面发挥关键作用。

传达人工智能可持续性权衡

人工智能如何传达给公众对其在可持续性中作用的看法有重大影响。围绕人工智能驱动的环境努力的宣传必须平衡技术准确性、现实期望和透明度,以确保建设性的讨论。

乐观的叙述强调人工智能作为可持续性强大工具的潜力。气候变化 AI和由人工智能驱动的保护项目突出了在野生动物保护、气候建模、能源效率和污染监测中的应用。这些例子通常被描绘为人工智能增强人类能力,使环境挑战的解决方案更加精确和可扩展。这种积极的描述鼓励公众对人工智能驱动的可持续性研究提供支持和投资。

然而,怀疑仍然存在,尤其是关于人工智能自身的环境足迹。批判性观点突出了人工智能模型训练的巨大能源需求,特别是对于大规模神经网络。 阿西洛马尔人工智能原则和其他警示框架强调了透明度、道德约束和节能人工智能发展的必要性。生成性人工智能模型的出现进一步加剧了对数据中心能源消耗、供应链可持续性和计算密集型人工智能工作负载长期可行性的担忧。

在人工智能可持续性宣传中,一个关键挑战是避免极端。公共讨论往往陷入两个极端的观点:一种观点认为人工智能是解决气候变化的不可或缺的工具,另一种观点则将人工智能描绘为一种不受控制的加速生态损害的技术。这两种观点都没有完全捕捉到细微的现实。人工智能,像任何技术一样,是一种工具,其环境影响取决于其开发、部署和管理方式。

为了建立公众信任和参与度,人工智能可持续性信息应优先考虑三个关键方面。首先,它必须通过展示人工智能在可持续性方面的利弊,包括能源消耗、数据偏差和现实世界的部署挑战,来承认明确的权衡。其次,信息应基于证据的声明,通过数据驱动的评估、生命周期分析和透明的碳核算来传达人工智能的影响,而不是基于推测的承诺。第三,框架应保持以人为本,强调与科学家、政策制定者和社区协作的人工智能系统,而不是完全自动化的、不透明的决策系统。通过这种平衡、透明的方法,人工智能可以在推动有意义的环境进步的同时保持可信度。

有效的公众参与依赖于弥合人工智能实践者与非专家之间的知识差距,确保人工智能在可持续性中的作用基于现实,公开讨论,并持续评估。

透明度和信任

随着人工智能系统越来越多地融入可持续性努力,透明度和信任对于确保公众对其部署的信心至关重要。人工智能模型(尤其是在环境监测、资源优化和排放跟踪中使用的模型)的复杂性往往使得利益相关者难以理解决策是如何做出的。如果没有对人工智能系统如何运作的明确解释,关于偏见、问责制和意外后果的担忧可能会损害公众信任。

透明度的一个关键方面是确保用于可持续性应用的人工智能模型是可解释和可理解的。《国家标准与技术研究院(NIST)关于可解释人工智能的原则》为设计提供有意义且可理解的输出系统提供了一个框架。这些原则强调,人工智能生成的决策应与上下文相关,准确反映模型的逻辑,并清楚地传达系统的局限性(菲利普斯等人 2020)。在人工智能影响环境政策、保护战略和能源管理的可持续性应用中,可解释性对于公众问责制至关重要。

在人工智能可持续性声明中,透明度也是必要的。许多科技公司推广由人工智能驱动的可持续性倡议,然而,没有标准化的报告,很难验证实际的影响。《蒙特利尔碳承诺》为这一领域的问责制提供了一个有价值的框架:

“作为机构投资者,我们必须采取行动,以我们受益人的最佳长期利益行事。在这个受托人角色中,长期投资风险与温室气体排放、气候变化和碳监管相关。衡量我们的碳足迹对于更好地理解、量化和管理我们在投资中的碳和气候变化相关的影响、风险和机遇至关重要。因此,作为第一步,我们承诺每年测量和披露我们投资的碳足迹,利用这些信息制定参与策略,并确定和设定碳足迹减少目标。” —— 蒙特利尔碳承诺

这种对测量和披露碳足迹的承诺为如何验证人工智能可持续性声明提供了一个范例。对于人工智能,如果公司披露模型训练和部署的环境足迹,这将向公众提供更清晰的关于人工智能可持续性贡献的画面。如果没有这样的措施,公司可能会面临“漂绿”的指控,即夸大或误导可持续性效益的声明。

除了企业问责制之外,人工智能治理的透明度确保了用于可持续性的部署的人工智能系统受到伦理监督。人工智能融入环境决策引发了关于谁控制这些技术以及它们如何与社会价值观相一致的问题。例如,经合组织人工智能政策观察站的努力突出了需要监管框架,该框架要求人工智能开发者在部署人工智能于重要的可持续性应用时披露能源消耗、数据来源和模型偏差。公众能够访问这些信息将允许进行更深入的审查并培养对人工智能驱动解决方案的信任。

在可持续性方面建立对人工智能的信任不仅需要清晰解释模型如何运作,还需要积极努力将利益相关者纳入决策过程。透明度机制,如开放访问数据集、公共人工智能审计和参与式模型开发,可以增强问责制。通过确保人工智能在可持续性中的应用保持可理解性、可验证性和道德治理,可以建立信任,从而为人工智能驱动的环境解决方案赢得更广泛的公众支持。

建立公众参与人工智能治理

公众参与在塑造人工智能驱动的可持续性努力的应用和有效性方面发挥着重要作用。虽然人工智能具有推动重大环境效益的潜力,但其成功取决于公众对其应用的理解和支持程度。广泛的误解、对人工智能在可持续性中作用的有限认识以及对伦理和环境风险的担忧可能会阻碍有意义的参与。解决这些问题需要有意识的努力,以教育、参与和赋权不同社区参与关于人工智能对环境可持续性影响的讨论。

调查表明,尽管人工智能被广泛认可,但公众对其与可持续性交叉的具体方式仍然不清楚。皮尤研究中心进行的一项研究发现,尽管 87%的受访者对人工智能有一定了解,但只有一小部分人能够解释它如何影响能源消耗、排放或保护工作。这种理解上的差距可能导致怀疑,有些人将人工智能视为可能导致环境危害的潜在贡献者,因为它的高计算需求,而不是将其视为解决气候挑战的工具。为了建立公众对人工智能可持续性倡议的信心,清晰的沟通至关重要。

在可持续性环境中提高人工智能素养的努力可以采取多种形式。强调人工智能在优化可再生能源电网、减少食物浪费或监测生物多样性中作用的宣传活动可以帮助消除对技术的神秘感。例如,气候变化人工智能和人工智能伙伴关系项目积极通过提供可获取的研究、案例研究和政策建议来弥合这一差距,这些研究和建议展示了人工智能在应对气候变化方面的益处。同样,媒体表现也在塑造公众认知方面发挥着重要作用,对人工智能的环境潜力及其挑战的负责任报道可以提供更平衡的叙述。

除了教育之外,参与需要来自各个利益相关者的积极参与,包括当地社区、环保组织和政策制定者。许多由人工智能驱动的可持续性项目专注于数据收集和自动化,但缺乏让受影响社区参与决策的机制。例如,用于水资源保护和野火预测的人工智能模型可能依赖于忽视当地居民生活经验的资料。创建参与式人工智能设计渠道,让社区贡献见解、验证模型输出并影响政策,可以导致更具包容性和情境意识的可持续性解决方案。

透明度和公众参与在人工智能决策影响资源配置、环境正义或监管行动时尤为重要。例如,由人工智能驱动的碳信用市场需要机制来确保发展中国家社区从可持续性倡议中受益,而不是面临诸如土地搬迁或剥削等意外伤害。公众咨询、开放数据平台和独立的 AI 伦理委员会可以帮助将社会价值观融入人工智能驱动的可持续性政策中。

最终,培养公众对人工智能可持续性的参与和意识需要一种多方面的方法,该方法结合了教育、沟通和参与式治理。通过确保人工智能系统易于访问、易于理解并能响应社区需求,可以加强公众对人工智能驱动可持续发展解决方案的信任和支持。这种参与对于将人工智能创新与社会优先事项相一致以及确保环境人工智能系统服务于更广泛的公众利益至关重要。

环境正义与人工智能可及性

确保公平获取人工智能驱动的可持续发展解决方案对于促进全球环境进步至关重要。虽然人工智能已经证明了其在优化能源网络、监测森林砍伐和改进气候建模方面的能力,但这些技术的获取仍然分布不均。发展中国家、边缘化社区和小规模环境组织往往缺乏有效使用人工智能所需的设施、资金和专业知识。解决这些差异对于确保人工智能可持续发展解决方案的益处惠及所有人群,而不是加剧现有的环境和社会经济不平等至关重要。

公平获取人工智能的主要障碍是数字鸿沟。许多人工智能可持续性应用依赖于先进的计算基础设施、云资源和高质量数据集,这些资源主要集中在高收入地区。最近的一份经合组织关于国家人工智能计算能力的报告指出,许多国家缺乏发展人工智能基础设施的战略路线图,导致人工智能丰富地区和人工智能贫乏地区之间的差距日益扩大(OECD 2023)。没有针对人工智能基础设施的针对性投资,低收入国家仍然被排除在人工智能驱动可持续发展进步之外。扩大计算资源的访问、支持开源人工智能框架以及提供基于云的人工智能解决方案以进行环境监测可以帮助弥合这一差距。

除了基础设施限制之外,缺乏高质量、地区特定的数据也构成了重大挑战。在工业化国家数据集上训练的人工智能模型可能无法很好地推广到其他地理和社会经济环境中。例如,针对北美水资源节约优化的人工智能模型可能在面临不同气候模式、农业实践或监管结构的地区无效。通过收集多样化的数据集、与当地组织建立伙伴关系以及整合本土知识来本地化人工智能可持续发展应用的努力,可以提高人工智能解决方案在代表性不足地区的相关性和影响力。

获取 AI 工具还需要技术素养和能力建设举措。许多小型环境组织和社区驱动的可持续性项目没有内部专业知识来有效开发或部署 AI 解决方案。能力建设努力,如 AI 培训计划、知识共享网络以及学术机构与环境团体之间的合作,可以赋予当地利益相关者采用 AI 驱动的可持续性实践的权力。像气候变化 AI 和人工智能伙伴关系这样的组织已经采取措施提供资源和使用 AI 进行环境应用的指导,但需要更广泛的努力来实现这一目标。

资金机制在决定谁从 AI 驱动的可持续性中受益方面也起着重要作用。虽然大型企业和资金充足的研究机构可以负担得起投资 AI 驱动的环境解决方案,但较小的组织往往缺乏必要的财务资源。政府拨款、慈善资金和国际 AI-for-good 倡议可以帮助确保基层可持续性努力能够使用 AI 技术。例如,西班牙已拨款 3 亿欧元专门用于 AI 和可持续性项目,为公共投资于负责任的环境 AI 创新设定了先例。在全球范围内扩大此类资金模式可以促进更包容的 AI 采用。

除了技术和财务障碍之外,政策干预对于确保 AI 可持续性努力公平分配也是必要的。如果没有优先考虑包容性的监管框架,AI 驱动的环境解决方案可能会不成比例地使具有现有技术优势的地区受益,而忽视那些面临最紧迫可持续性挑战的地区。政府和国际机构应制定鼓励公平 AI 采用的政策,例如要求 AI 可持续性项目考虑社会影响评估或强制透明报告 AI 驱动的环境倡议。

确保可持续性 AI 的公平获取不仅是一个技术挑战,而且是环境正义的核心问题。随着 AI 继续塑造全球可持续性努力,必须采取主动措施,防止技术加剧现有不平等。通过投资 AI 基础设施、本地化 AI 应用、支持能力建设努力和实施包容性政策,AI 可以成为一项能够赋予所有社区在应对气候变化和环境退化斗争中权力的工具。

未来挑战

随着人工智能的持续发展,其在环境可持续性方面的作用预计将扩大。人工智能的进步有可能加速可再生能源、气候建模、生物多样性保护和资源效率等方面的进步。然而,实现这一潜力需要解决与能源效率、基础设施可持续性、数据可用性和治理相关的重大挑战。人工智能与可持续性的未来取决于在创新与负责任的环境管理之间取得平衡,确保由人工智能驱动的进步不会以加剧环境退化为代价。

新兴技术研究方向

人工智能可持续性的一个主要优先事项是开发更节能的模型和算法。优化深度学习模型以最小化计算成本是关键的研究方向,例如模型剪枝、量化以及低精度数值计算等技术显示出显著降低能耗的潜力,同时不牺牲性能。这些策略旨在提高人工智能工作负载的效率,同时利用专用硬件加速器以最小的能耗实现最大的计算吞吐量。非冯·诺依曼计算范式(如类脑计算和内存计算)的持续发展,通过专用硬件设计,为节能人工智能架构提供了另一条途径。

另一个重要方向是将可再生能源整合到人工智能基础设施中。鉴于数据中心是人工智能碳足迹的最大贡献者之一,转向清洁能源,如太阳能、风能和水力发电,是必不可少的。这一转型的可行性取决于可持续能源存储技术的进步,例如由像Ambri这样的公司开发的技术,该公司是一家麻省理工学院的衍生公司,致力于开发液态金属电池解决方案。这些创新可能使数据中心能够以更高的可靠性运行在可再生能源上,减少对基于化石燃料的电网电力的依赖。然而,要实现这一规模化的转型,需要人工智能公司、能源提供商和政策制定者之间的协作努力,以开发电网感知的人工智能调度和碳感知的工作负载管理策略,确保计算密集型的人工智能任务在可再生能源可用性达到峰值时执行。

除了能源效率之外,AI 的可持续性还将从智能资源分配和废物减少策略中受益。提高计算资源的利用率、减少冗余的模型训练周期以及实施高效的数据采样技术可以显著降低能源消耗。在 AI 模型开发中的一个关键挑战是实验和效率之间的权衡——诸如神经架构搜索和超参数优化等技术可以提高模型性能,但通常需要大量的计算资源。对高效实验方法的研究可以帮助实现平衡,允许在提高模型性能的同时减轻过度训练运行的环境影响。

实施障碍和标准化需求

尽管有这些有希望的方向,但为了使 AI 真正可持续,必须解决重大障碍。一个紧迫的挑战是缺乏评估 AI 环境足迹的标准测量和报告框架。与 LCA 方法在传统行业中已经建立良好的传统行业不同,AI 系统需要更全面和适应性强的方法,这些方法要考虑到硬件(计算基础设施)和软件(模型训练和推理周期)的全面环境影响。尽管像MLCommons这样的努力已经开始将能源效率纳入基准测试实践,但需要一个更广泛、全球认可的标准,以确保在报告 AI 相关排放方面的一致性。

另一个重要的挑战是优化 AI 基础设施以实现长期可持续性。AI 加速器和数据中心硬件必须考虑到最大化利用、延长使用寿命和最小化环境影响来设计。与通常优先考虑性能提升而非可持续性的传统硬件更新周期不同,未来的 AI 基础设施必须优先考虑可重复使用性、模块化设计和循环经济原则,以最大限度地减少电子废物并减少对稀土材料的依赖。

从软件角度来看,最小化冗余计算对于减少能耗密集型工作负载至关重要。在日益庞大的数据集上训练更大模型的实践,虽然有利于提高准确性,但在可持续性方面却带来了递减的回报。正如最近的研究(C.-J. Wu 等人 2022)所强调的,以数据为中心的 AI 模型开发方法表明,数据的预测价值会随时间衰减,因此识别和筛选最相关的数据子集变得尤为重要。更智能的数据采样策略可以优化训练过程,确保仅使用最有信息量的数据来完善模型,从而在不牺牲模型质量的情况下减少能源足迹。

另一个挑战在于数据可访问性和透明度。许多人工智能可持续性努力依赖于企业和政府关于能源使用、碳排放和环境影响数据的披露。然而,数据缺口和不一致性阻碍了对人工智能足迹的准确评估。来自人工智能公司的更多透明度,以及用于环境影响研究的开放访问数据集,将允许进行更严格的分析,并为可持续人工智能发展的最佳实践提供信息。

最后,人工智能创新的快速步伐对监管和治理提出了挑战。政策制定者必须制定灵活、前瞻性的政策,以促进可持续性同时保留人工智能研究和创新所需的灵活性。监管框架应鼓励高效的 AI 实践,例如推广碳感知计算、激励节能 AI 模型开发,并确保由人工智能驱动的环境应用与更广泛的可持续性目标相一致。实现这一点需要人工智能研究人员、环境科学家、能源部门利益相关者和政策制定者之间的紧密合作,以制定促进负责任人工智能增长同时最小化生态损害的监管环境。

可持续人工智能系统的综合方法

人工智能在可持续性方面的未来既充满希望又充满挑战。为了充分发挥人工智能的潜力同时减轻其环境影响,该领域必须拥抱节能模型开发、可再生能源整合、硬件和软件优化以及透明的环境报告。解决这些挑战需要技术、工业和政策领域之间的跨学科合作,确保人工智能的发展轨迹与全球可持续性努力相一致。

通过将可持续性原则嵌入人工智能系统设计、优化计算基础设施和建立明确的问责机制,人工智能可以成为环境进步的催化剂,而不是生态退化的贡献者。未来几年将关键性地塑造人工智能在可持续性中的作用,确定它是否会放大现有挑战,还是成为对抗气候变化和资源枯竭的关键工具。

谬误和陷阱

可持续人工智能涉及计算性能和环境影响之间的复杂权衡,这往往挑战了关于高效和负责任系统设计的传统假设。人工智能工作负载的日益增长和云计算便利性的吸引力可能会产生关于真实环境成本和最有效减少生态影响的策略的误解。

谬误: 云计算自动使人工智能系统更具环境可持续性

这种误解假设云部署本身就能提供环境效益,而没有考虑云基础设施的实际能源来源和利用模式。虽然云服务提供商可能比单个组织实现更好的资源利用率,但他们通常依赖化石燃料能源,并在碳密集型电力电网的地区运营数据中心。云扩展的便利性也可能通过过度配置和低效的工作负载调度导致资源浪费。真正的可持续性需要仔细选择提供商、区域感知部署和有意识的资源管理,而不是假设云部署本身就是绿色的。

陷阱: 只关注运营能源消耗,而忽略隐含碳和生命周期影响。

许多从业者仅通过测量训练和推理的能源消耗来衡量人工智能的可持续性,而没有考虑到他们系统的完整环境影响。根据我们建立的三阶段生命周期评估框架,硬件制造、数据中心建设、冷却基础设施和电子废物处理对总环境影响贡献很大。专用人工智能加速器中的隐含碳可能超过许多工作负载的运营排放。全面的可持续性评估需要生命周期分析,包括所有三个阶段——训练、推理和制造——而不仅仅是关注运营能源消耗。

谬误: 效率提升会自动转化为减少环境影响。

这种信念假设使人工智能系统更具有计算效率必然减少其环境影响。然而,效率提升往往通过反弹效应导致使用增加,即更便宜的计算导致更广泛的部署和应用范围。更高效的模型可能被更广泛地部署,可能增加总资源消耗,尽管单位改进。此外,需要专用硬件的效率优化可能通过加速硬件更换周期增加隐含碳。可持续的人工智能需要考虑效率改进及其更广泛的部署影响。

陷阱: 将碳抵消视为减少实际排放的替代品。

组织通常购买碳抵消来中和其人工智能系统排放,而不解决根本的能源消耗模式。许多抵消项目存在可疑的附加性、永久性或验证标准,无法实现承诺的环境效益。依赖抵消可能会推迟必要的向可再生能源和高效计算实践的转变。可持续人工智能的发展应优先考虑通过采用可再生能源、提高效率和有意识的资源管理来实际减少排放,将抵消作为排放减少策略的补充,而不是替代品。

陷阱: 在未考虑整个系统生命周期影响的情况下,对单个组件进行可持续性优化。

许多可持续性努力集中在独立优化单个系统组件,而不分析这些优化如何影响更广泛系统架构和生命周期环境影响。通过使用更小的模型来减少训练能耗,如果广泛部署,可能会增加推理计算需求,从而可能增加总系统排放。同样,通过高效软件延长硬件使用寿命,在考虑整个生命周期排放的情况下,可能不如采用更新、更节能的硬件可持续。边缘部署以减少数据中心能耗可能会增加分布式硬件的制造需求,并创造复杂的电子废物管理挑战。减少带宽使用的网络优化可能需要额外的计算资源用于压缩或缓存。有效的可持续人工智能需要全面的周期性评估,考虑系统设计决策的环境影响,包括硬件采购、软件部署、运营使用模式、维护需求和报废处理,而不仅仅是独立优化单个指标。

摘要

可持续人工智能代表了技术进步必须与环境保护和资源节约相一致的一个交汇点。机器学习系统通过计算密集型训练消耗能源,运行能耗高的推理基础设施,并推动对资源密集型硬件制造的需求。然而,这些系统同样具备气候建模、减排、资源优化和生物多样性保护的能力,形成了环境影响和环境效益之间的复杂关系,这需要仔细的工程考虑。

人工智能系统的全生命周期影响不仅限于运营能源消耗,还包括硬件制造、数据中心基础设施、冷却系统和电子废物管理。绿色人工智能实践侧重于节能模型架构、可再生能源集成、碳感知计算和生命周期感知的开发流程。政策框架和测量标准通过环境报告要求、效率激励措施和将技术创新与可持续性目标对齐的治理机制推动问责制。

关键要点

  • 人工智能系统在其整个生命周期中都会产生环境影响,从硬件制造到训练、部署和废弃

  • 可持续人工智能需要通过高效的架构和负责任的基础设施选择来平衡计算能力与环境成本

  • 绿色人工智能实践包括能源感知模型设计、可再生能源集成、碳感知计算和全面的生命周期评估

  • 成功需要人工智能研究人员、环境科学家、政策制定者和行业利益相关者之间的跨学科合作

可持续人工智能的未来取决于今天在系统设计、基础设施部署和管理框架方面所做的选择。气候应用展示了人工智能加速环境解决方案的潜力,从提高能源电网效率到优化资源使用和模拟复杂生态系统。然而,实现这一潜力需要将可持续性考虑嵌入到人工智能开发的各个方面,创建既能增强又不会损害环境福祉的系统,同时提升技术能力。


人工智能向善

DALL·E 3 Prompt: Illustration of planet Earth wrapped in shimmering neural networks, with diverse humans and AI robots working together on various projects like planting trees, cleaning the oceans, and developing sustainable energy solutions. The positive and hopeful atmosphere represents a united effort to create a better future.

目的

为什么资源受限的部署代表了机器学习系统工程知识的终极综合?

本教材中涵盖的每一项技术、原则和优化策略,在资源受限的环境中都有其最严峻的应用。你掌握的部署范式、训练方法、优化技术和鲁棒性原则,不仅仅是学术练习,而是为工程化机器学习系统做准备,这些系统在计算资源消失、基础设施失败,以及每个设计决策都有人类后果的环境中工作。社会影响部署需要综合所有这些知识,因为它们在极端技术约束和关键人类需求之间运行。农村诊所的医疗诊断系统无法承担低效的架构。为小农户设计的农业监控系统不能假设可靠的连接。灾难响应平台不能容忍系统故障。这些部署揭示了你是否真正理解机器学习系统工程,而不仅仅是当资源充足时如何应用技术,而是在资源稀缺时如何适应、组合和优化它们。本章表明,机器学习系统工程的目标不是在受控环境中实现最先进的性能,而是在最具有挑战性的条件下创建能够提供可靠影响的系统。

学习目标

  • 确定全球社会挑战,其中人工智能系统可以在解决资源约束和基础设施限制的同时产生可衡量的影响

  • 分析资源悖论及其在部署机器学习系统在服务不足环境中的定量影响

  • 使用定量优化技术计算资源受限的机器学习部署的功耗预算和优化权衡

  • 比较和对比四种设计模式(分层处理、渐进增强、分布式知识、自适应资源)在社会影响应用中的异同

  • 根据特定的资源可用性、连接约束和社区需求选择适当的设计模式和部署范式

  • 评估现实世界的案例研究,以评估不同架构方法在农业、医疗保健和环境监测中的有效性

  • 设计在严重资源约束下运行的同时保持早期章节中信任度原则的机器学习系统架构

  • 批判人工智能善行部署中的常见谬误和陷阱,以避免技术优先的方法和基础设施假设

极端约束下的可信人工智能

第五部分的前几章已经建立了可信机器学习系统的理论和实践基础,包括负责任的开发方法(第十七章)、安全和隐私框架(第十五章)和弹性工程原则(第十六章)。本章将探讨这些可信性范式在机器学习最具挑战性的部署领域的应用:旨在在严重资源约束下解决关键社会和环境挑战的系统。

可信人工智能代表了机器学习系统中的一个独特工程学科,其特点是将极端技术约束与严格的可靠性要求相结合。为资源有限的健康环境设计诊断系统或为断开连接的农村社区设计农业监测平台,需要系统地应用本书中确立的每一项原则。此类部署需要为不可靠的基础设施调整第二章架构,将第八章的方法应用于有限数据场景,并将第九章的技术作为核心要求而非可选优化。第十六章(ch022.xhtml#sec-robust-ai)中的弹性原则对于确保在不可预测的环境中运营连续性至关重要。

这些应用的社技术背景提出了独特的工程挑战,这些挑战将人工智能善行与传统的机器学习部署区分开来。任何商业系统都可能面临的挑战(操作功率预算限制在个位数瓦特,内存足迹限制在千字节规模,网络连接可能面临多日中断)必须与超出传统应用可靠性的要求相协调。在这些环境中,系统故障的后果不仅限于用户体验下降,还可能危及医疗诊断、紧急响应协调或易受伤害人群的食物安全评估等关键功能。

本章系统地探讨了机器学习系统如何在全球资源受限的环境中实现专家级分析能力的民主化。我们提出了识别和分析全球挑战的概念框架,在这些挑战中,机器学习干预可以产生可衡量的影响,包括在欠发达地区的医疗可及性、小农农业系统的生产力提升以及环境监测为保护活动服务。本章建立了设计方法,这些方法在解决极端资源限制的同时,保持了在第五部分中开发的可信度标准。通过详细分析农业、医疗保健、灾害响应和环境保护领域的实际部署案例研究,我们展示了机器学习系统知识在应对人类最紧迫挑战中的实际综合应用。

AI for Good是将机器学习系统应用于解决社会环境挑战的应用,强调公平获取可衡量影响可持续部署,以服务于人类福祉。

社会挑战与 AI 机遇

历史提供了令人清醒的例子,说明及时干预和协调响应如何能显著改变结果。例如,2014-2016 年西非的埃博拉疫情 1,就突出了延迟检测和响应系统的灾难性后果(C. Park 2022)。同样,2011 年索马里的饥荒,尽管提前几个月预报,但由于缺乏有效动员和分配资源的机制,造成了巨大的苦难(ReliefWeb 2012)。2010 年海地地震之后,缺乏快速可靠的损害评估严重阻碍了将援助引导到最需要的地方的努力(Survey, n.d.)。

这些历史教训揭示了今天在各个领域持续存在的模式,尤其是在资源受限的环境中。在医疗保健领域,偏远和欠发达社区由于无法及时获得医疗专业知识,会经历可预防的健康危机。缺乏诊断工具和专家意味着可治疗的状况会升级为危及生命的情况。在确保全球粮食安全的关键部门农业中,也面临着类似的挑战。生产世界上大部分食物的小农 2 在有限信息的情况下做出关键决策。

类似的系统性障碍在教育领域也显现出来,其中不平等加剧了服务不足地区面临的挑战。许多学校缺乏足够的教师、充足的教育资源和为学生的个性化支持。这扩大了优势学习者与劣势学习者之间的差距,并为社会和经济的发展带来了长期的影响。没有获得优质教育的机会,整个社区都处于不利地位,从而持续着贫困和不平等循环。这些教育不平等与更广泛的社会挑战相互关联,因为教育中的差距加剧了医疗和农业领域的问题。

环境退化给全球问题增添了另一个关键维度。森林砍伐、污染和生物多样性丧失威胁着生计并破坏了维持人类生活所必需的生态平衡。广阔的森林、海洋和野生动物栖息地仍然无人监管和保护,尤其是在资源有限的地区。这使生态系统容易受到非法活动的影响,如偷猎、伐木和污染,加剧了已经在经济和社会差异中挣扎的社区的压力。

这些问题有几个共同特征。它们不成比例地影响弱势群体,加剧了现有的不平等。受影响地区的资源限制为实施解决方案设置了障碍。解决这些挑战需要在极大的不确定性下,在相互竞争的优先事项和有限的资源之间进行权衡。

尽管存在这些复杂的挑战,但技术为解决这些问题提供了变革性的潜力。通过提供创新工具来增强决策、提高效率和大规模提供解决方案,技术为克服历史进步障碍带来了希望。机器学习系统因其处理大量信息、发现模式和生成能够为资源受限环境中的行动提供信息的能力而脱颖而出。实现这一潜力需要采取有意识的措施,以确保这些工具能够有效地、公平地为所有社区服务。

在这个领域的一个常见陷阱是技术优先的方法,工程师在没有理解社区需求的情况下构建解决方案。这导致了一些技术上令人印象深刻但无人使用的系统,因为它们未能解决真正的优先事项或在当地约束下有效运作。成功的部署来自于彻底的需求评估和共同设计过程,这些过程优先考虑社区识别的问题,而不是技术能力。

机器学习通过一项关键能力来解决这些挑战:在不要求专家在场的情况下,将专家级分析带到资源受限的环境中。肯尼亚农村的小规模农户可以在不接触农业推广官员的情况下接收作物疾病诊断。印度偏远地区的社区健康工作者可以在没有儿科医生的情况下对肺炎病例进行分类。亚马逊的森林管理员可以在没有 24/7 人工监控的情况下检测偷猎活动。这种专业知识的民主化依赖于第二章中提到的部署范例,但在商业场景中不存在的限制条件下应用:间歇性连接取代可靠网络,太阳能取代电网基础设施,稀疏标记数据取代丰富的训练集。

实际部署范例

来自第二章(云 ML、移动 ML、边缘 ML 和 TinyML)的机器学习部署范例通过适应资源受限的环境,解锁了这些针对紧迫社会挑战的变革性解决方案。通过适应各种限制并利用独特优势,这些技术正在推动农业、医疗保健、灾害响应和环境保护领域的创新。本节探讨了这些范例如何通过实际应用将社会效益变为现实。

农业

农业面临着来自气候变率、害虫抗性和需要用有限资源养活不断增长的全球人口的史无前例的挑战(Kamilaris 和 Prenafeta-Boldú 2018)。现在,机器学习系统为农民提供了以前只有农业专家才能拥有的诊断能力,从而改变了作物监测、疾病检测和资源在不同农业环境中的分配方式。

图片

图 19.1:移动疾病检测:边缘机器学习的示例,其中智能手机应用程序使用训练好的模型直接在设备上对植物疾病进行分类,从而在资源受限的环境中实现实时反馈。这种部署减少了对外部网络连接的依赖,并允许提供本地化、可访问的农业支持。

在撒哈拉以南非洲,这种转型尤为明显,那里的木薯种植者长期以来一直在与破坏作物和生计的疾病作斗争。现在,移动机器学习驱动的智能手机应用程序能够在资源受限的设备上直接进行实时作物疾病检测,如图 19.1 所示。PlantVillage Nuru 系统通过渐进式增强设计模式展示了这种方法,从基本的离线诊断到云增强分析都保持了功能。这一案例研究在第 19.7.2.1 节中进行了详细探讨,它探讨了 2-5 MB 的量化模型如何实现 85-90%的诊断准确性,同时消耗不到 100 mW 的功率(Ramcharan et al. 2017)3。

在东南亚,类似的创新正在出现,那里的水稻种植者面临着越来越不可预测的天气模式。在印度尼西亚,微型机器学习传感器正在通过监测稻田中的微气候 4 来改变他们的适应能力。这些低功耗设备在本地处理数据以优化用水,使具有最基本基础设施的地区实现精准灌溉(Tirtalistyani, Murtiningrum, and Kanwar 2022)。

微软的FarmBeats5 整合了物联网传感器、无人机和云机器学习,为农民提供可操作的见解。通过利用天气预报、土壤条件和作物健康数据,该平台允许农民优化如水和肥料等投入,减少浪费并提高产量。这些创新展示了人工智能技术如何实现精准农业,解决粮食安全、可持续性和气候韧性等问题。

医疗保健

医疗保健行业通过机器学习也呈现出类似的转型机会。对于数百万生活在服务不足社区的人来说,获得医疗保健往往意味着长时间的等待和前往遥远的诊所。微型机器学习使患者身边的诊断成为可能。例如,由Respira x Colabs开发的一种低成本可穿戴设备,利用嵌入式机器学习来分析咳嗽模式并检测肺炎 6。专为偏远地区设计,该设备在无需互联网连接的情况下独立运行,并由简单的微控制器供电,使生命攸关的诊断对最需要的人变得可及。

微型机器学习也解决了全球健康问题,如由蚊子传播的媒介传播疾病。研究人员已经开发了低成本设备,这些设备使用机器学习通过蚊子的翅膀拍打频率来识别蚊种 7 (Altayeb, Zennaro, and Rovai 2022)。这项技术允许对携带疟疾的蚊子进行实时监控,并为高风险地区的疟疾控制提供可扩展的解决方案。

云机器学习在规模上推进了医疗保健研究和诊断。像Google Genomics8 这样的平台分析大量数据集以识别疾病标志,加速个性化医疗的突破。这些例子展示了从便携式 Tiny ML 到强大的云机器学习的人工智能技术如何使医疗保健访问民主化并改善全球的成果。

灾害响应

灾害响应需要在极端不确定性的情况下迅速做出决策,通常伴随着基础设施损坏和有限的通信渠道。机器学习系统通过自主操作、本地处理能力和在集中式系统失败时继续运行的预测建模来应对这些限制。

这种能力在灾区至关重要,在那里人工智能技术加速了响应工作并提高了安全性。配备 Tiny ML 算法的微型、自主无人机正在进入倒塌的建筑,克服障碍以检测生命迹象。通过本地分析热成像 9 和声学信号,这些无人机能够在不依赖云连接的情况下识别幸存者和危险(Duisterhof et al. 2021)。这些无人机可以自主寻找光源(通常指示幸存者)并检测危险的气体泄漏,使搜救行动对人类响应者来说既快又安全。

除了这些地面操作之外,像谷歌的AI for Disaster Response10 这样的平台正在利用云机器学习来处理卫星图像并预测洪水区。这些系统提供实时洞察,帮助政府在紧急情况下更有效地分配资源并挽救生命。

完成这一多尺度方法,移动机器学习应用也通过将实时灾害警报直接发送到智能手机上发挥着关键作用。针对用户位置的地震海啸预警和森林火灾更新允许更快的疏散和更好的准备。无论是在全球范围内使用云机器学习还是通过边缘和移动机器学习实现本地洞察,这些技术正在重新定义灾害响应能力。

环境保护

环境保护是另一个机器学习系统做出重大贡献的领域。保护者在监测和保护广阔且通常遥远的景观中的生物多样性时面临着巨大的挑战。人工智能技术为这些问题提供了可扩展的解决方案,结合了本地自主性和全球协调。

在个体动物层面,EdgeML 驱动的项圈被用来无干扰地跟踪动物行为,如大象的运动和叫声,帮助研究人员了解迁徙模式和社交行为。通过在项圈本身处理数据,这些设备最小化了功耗并减少了频繁更换电池的需求。通过扩展这种监控能力,Tiny ML 系统通过检测枪声 11 或人类活动,并将警报实时传达给巡护员,正在使反盗猎工作成为可能 (Bamoumen et al. 2022)。

超越陆地保护,云机器学习正在全球范围内用于监控非法捕鱼活动。例如,全球捕鱼监控平台 12 分析卫星数据以检测异常,帮助政府执行法规并保护海洋生态系统。

这些应用展示了人工智能技术如何实现实时监控和决策,推进保护工作。

跨领域集成挑战

上面的例子展示了人工智能在解决重要社会挑战方面的变革潜力。然而,这些成功强调了全面解决此类问题的复杂性。每个例子都针对特定的需求,例如优化农业资源、扩大医疗保健的获取或保护生态系统,但可持续解决这些问题需要更多的不仅仅是孤立的创新。

最大化影响和确保公平进步需要多个领域的集体努力。大规模挑战需要跨部门、地理和利益相关者的合作。通过促进地方倡议、研究机构和全球组织之间的协调,我们可以将人工智能的变革潜力与扩大解决方案所需的基础设施和政策对齐。没有这种对齐,即使是具有前景的创新也可能会在孤岛中运作,限制其影响力和可持续性。

上文所述的应用展示了人工智能的多样性,但也揭示了协调挑战。当资源有限时,我们如何优先投资?我们如何确保创新解决最紧迫的需求而不是最技术有趣的问题?我们如何在不同环境中衡量成功并保持对受益社区的问责制?回答这些问题需要超越个别应用的系统框架,提供共同的评估标准、优先级层次和协调机制。

可持续发展目标框架

这些问题的规模和复杂性要求采取系统方法,以确保努力具有针对性、协调性和可持续性。联合国可持续发展目标(SDGs)等全球框架以及世界卫生组织(WHO)等机构的指导发挥着关键作用。这些框架为解决世界最紧迫的挑战提供了一个结构化的视角。它们提供了一个路线图,以协调努力、设定优先事项并促进国际合作,以创造有影响力和持久的变化(《可持续发展目标报告 2018》 2018)。

图 19.2 中显示的可持续发展目标代表了一个在 2015 年采纳的全球议程 13。这些 17 个相互关联的目标构成了一个蓝图,旨在通过 2030 年解决世界面临的最紧迫挑战 14。它们涵盖了从消除贫困和饥饿到确保优质教育,从促进性别平等到采取气候行动 15。

图片

图 19.2:可持续发展目标:这 17 个相互关联的目标为解决重要的社会、经济和环境挑战提供了一个全球框架,指导具有积极社会影响的机器学习系统的发展。理解这些目标使从业者能够将人工智能解决方案与更广泛的可持续性目标对齐,并衡量向更公平的未来迈进的过程。来源:联合国。

在这个框架的基础上,机器学习系统可以通过其变革性能力同时为多个 SDGs 做出贡献(Taylor et al. 2022)。

  • 目标 1(消除贫困)& 目标 10(减少不平等):通过移动银行和微型贷款风险评估提高金融包容性的机器学习系统。

  • 目标 2, 12, & 15(零饥饿、负责任消费、陆地生命):优化资源分配的系统,减少食品供应链中的浪费,并监测生物多样性。

  • 目标 3 & 5(良好健康和性别平等):改善孕产妇健康结果和弱势社区医疗保健可及性的机器学习应用。

  • 目标 13 & 11(气候行动与可持续城市):预测系统用于气候弹性和城市规划,帮助社区适应环境变化。

尽管存在这种潜力,部署这些系统面临着独特的挑战。许多可能从机器学习应用中受益最多的地区缺乏可靠的电力(目标 7:负担得起的清洁能源)或互联网基础设施(目标 9:工业、创新和基础设施)。这种现实要求我们重新思考如何设计用于社会影响的机器学习系统。

认识到这些挑战,通过机器学习推进可持续发展目标的成功需要一种超越技术解决方案的整体方法。系统必须在当地资源约束下运行,同时尊重文化背景和现有基础设施限制。这一现实要求重新思考系统设计,不仅要考虑技术能力,还要考虑它们可持续地融入最需要它们的社区。

可持续发展目标(SDGs)为解决哪些问题和为什么这些问题在全球范围内重要提供了基本的规范性框架。然而,将这些雄心勃勃的目标转化为运作体系需要面对具体的工程现实。对 SDG 3(良好的健康与福祉)的承诺并不会自动产生在诊所中运行太阳能且具有间歇性连接的诊断系统。通过农业人工智能实现 SDG 2(零饥饿)需要能够在没有互联网接入的$30 智能手机上工作的解决方案。这些发展目标确立了优先级;工程约束决定了可行性。

将这些发展目标转化为运作体系需要具体的工程解决方案。下一节将探讨区分社会影响部署与之前章节中涵盖的商业场景的具体技术约束。这些约束(涵盖计算、电力、连接性和数据可用性)重塑了系统架构,并确立了为什么需要新颖的设计模式,而不仅仅是缩小现有方法。

资源约束和工程挑战

在社会影响背景下部署机器学习系统需要跨越计算、网络、电力和数据维度的相互关联的挑战。这些挑战在生产部署和扩展过程中加剧。这些约束不仅在程度上不同,而且在本质上与第二章(ch008.xhtml#sec-ml-systems)中考察的商业部署不同,需要创新架构以在严重资源限制下保持功能。

为了提供理解这些挑战的基础,表 19.1 总结了在发展、农村和城市环境中资源和需求的关键差异,同时突出了在扩展过程中遇到的独特约束。这种比较为理解后续章节中将探讨的悖论、困境和约束提供了基础。

表 19.1:部署资源范围:社会影响应用需要仔细考虑计算约束,从基于微控制器的农村部署到城市环境中的服务器级系统;扩展这些系统通常需要积极的模型压缩技术以满足资源限制。此表量化了这些差异,揭示了在不同部署环境中模型复杂性、准确性和可行性的权衡。

方面 农村部署 城市部署 扩展挑战
计算资源 微控制器(ESP32:240 MHz 双核,520 KB 总 SRAM 中 320 KB 可用 SRAM) 服务器级系统(100-200 W,32-64 GB RAM) 严格的模型量化(例如,从 50 MB 到 500 KB)
电力基础设施 太阳能和电池系统(10-20 W,2000-3000 mAh 电池) 稳定的电网电力 优化电力使用(针对部署设备)
网络带宽 LoRa、NB-IoT(0.3-50 kbps,60-250 kbps) 高带宽选项 协议调整(LoRa、NB-IoT、Sigfox:100-600 bps)
数据可用性 稀疏、异构数据源(来自农村诊所的每日 500 KB) 大量标准化数据(来自城市医院的吉字节) 专用管道(用于隐私敏感数据)
模型尺寸 高度量化模型(≤ 1 MB) 云/边缘系统(支持更大模型) 模型架构重新设计(针对尺寸、功率和带宽限制)

极端资源限制下的模型压缩

实现社会公益应用的超低模型大小需要平衡准确性和资源约束的系统优化管道。第十章中的传统模型优化技术必须适应并加强,以应对在服务不足环境中遇到的极端资源限制。

为了说明这些优化需求,PlantVillage 作物病害检测系统的优化管道展示了定量的压缩权衡。从 100 MB 的 ResNet-50 架构开始,达到 91%的准确率,系统优化将模型大小减少了 31 倍,同时保持实际的有效性:

  • 原始 ResNet-50:~98 MB(FP32),在作物病害数据集上的 91%准确率基准

  • 8 位量化:25 MB,89%准确率(4 倍压缩,2%准确率损失)

  • 结构化剪枝:8 MB,88%准确率(12 倍压缩,3%准确率损失)

  • 知识蒸馏:3.2 MB,87%准确率(31 倍压缩,4%准确率损失)

这些压缩比率使得在资源受限的设备上部署成为可能,同时保留了农村农民所需的诊断能力。最终的 3.2 MB 模型在 ESP32 微控制器上的推理仅需 50-80 毫秒,使得在无电网的农业环境中实现作物病害的实时检测成为可能。

功耗分析

在离网部署中,除了模型大小优化之外,电力预算限制在系统设计中占主导地位。神经网络推理每次 MAC(乘加)操作消耗 0.1-1 毫焦耳,一个一百万参数的模型每次推理需要 1-10 毫焦耳。农村地区的太阳能充电通常每天提供 5-20 瓦时,考虑到季节变化和天气模式。这个能量预算使得每天可以进行 20,000-200,000 次推理,假设 10-20%的功率转换损失,并考虑到典型 2 年部署周期中电池退化 30-50%。

能量预算层次结构

为了有效地管理这些电力限制,边缘设备的功耗遵循基于计算复杂度和部署要求的严格层次结构:

  • TinyML 传感器:平均功耗<1mW,使环境监测和野生动物追踪应用能够实现多年的电池运行

  • 移动边缘设备:50-150mW 的电力预算(相当于智能手机手电筒),在大多数地理区域适合日常太阳能充电周期

  • 区域处理节点:10W 的电力需求,需要电网连接或专用发电机系统以实现稳定运行

  • 云端点:千瓦级电力消耗,需要具有可靠电网连接的数据中心基础设施

在这个层次结构的极端端,超低功耗野生动物监控系统展示了最苛刻的优化需求。以平均<1mW 的功耗运行,并期望电池寿命达到 5 年,这些部署需要专门的低功耗微控制器和分时操作。针对十年长期运行的环境传感器将电力需求降低到纳瓦级计算,利用温差、振动或环境电磁辐射进行能量收集。

资源悖论

表 19.1 中详细说明的定量约束和上述描述的优化需求揭示了塑造用于社会公益的人工智能的基本悖论:最需要机器学习能力的环境拥有最少的传统部署基础设施。农村撒哈拉以南非洲拥有全球 60%的可耕地,但只有 4%的全球互联网连接。为疾病负担最重的群体服务的偏远医疗诊所依赖小型太阳能板的不规则电力。生物多样性损失最大的森林地区缺乏云连接监控系统的基础设施 16。

这种需求和基础设施可用性之间的反向关系,在表 19.1 中量化,从根本上区分了社会公益部署与第二章(ch008.xhtml#sec-ml-systems)中的商业场景。典型的云部署可能使用消耗 100-200 W 功率的服务器,具有多个 CPU 核心和 32-64 GB 的 RAM。然而,农村部署通常必须在功耗仅为 5 W 的单板计算机或仅消耗毫瓦的微控制器上运行,RAM 以千字节而不是千兆字节计量。这些极端的资源限制需要创新的方法来训练和推理模型,包括第十四章(ch020.xhtml#sec-ondevice-learning)中介绍的技术,其中模型必须直接在资源受限的设备上进行适配和优化。

这些计算约束的叠加,网络基础设施的限制进一步限制了系统设计。城市环境提供高带宽选项,如光纤(100+ Mbps)和 5G 网络(1-10 Gbps),能够支持实时多媒体应用。农村部署必须依赖低功耗广域网络技术,如 LoRa17 或 NB-IoT,带宽限制为 50 kbps,大约比典型宽带连接慢三个数量级。这些严重的带宽限制需要仔细优化数据传输协议和有效载荷大小。

除了这些连接挑战之外,电力基础设施还带来了额外的约束。虽然城市系统可以依赖稳定的电网电力,但农村部署通常依赖于太阳能充电和电池系统。典型的太阳能系统在峰值阳光时段可能产生 10-20 W 的电力,需要仔细规划整个系统组件的电力预算。电池容量限制,通常为 2000-3000 mAh,意味着系统必须优化操作的各个方面,从传感器采样率到模型推理频率。

数据稀缺和质量约束

资源悖论不仅超越了计算能力,还涵盖了与商业部署显著不同的数据挑战。第六章(ch012.xhtml#sec-data-engineering)中的数据工程原则假设了可靠的数据管道、集中的预处理基础设施和标准化的格式——这些假设在资源受限的环境中会崩溃。商业系统可以处理包含数百万个示例的标准数据集,而社会影响项目必须构建具有有限、异构数据源的稳健系统,同时保留之前建立的数据质量、验证和治理原则。

医疗保健部署说明了数据工程工作流程在受限条件下的适应性。农村诊所每天生成 50-100 份患者记录(≈500 KB),这些记录混合了结构化的生命体征和非结构化的手写笔记,需要专门的预处理,而城市医院则产生数吉字节的标准电子健康记录。即使是 X 光或 MRI 扫描,其大小也以兆字节计算,这突显了农村和城市医疗保健设施之间数据规模的大差异。从第六章中的数据收集、清洗和验证管道必须在这些严格的限制下运行,同时保持数据完整性。

网络限制进一步限制了数据收集和处理。在有限的电力预算下运行的农业传感器网络可能每次读取只能传输 100-200 字节。在 50 kbps 的 LoRa 带宽限制下,这些系统通常将传输频率限制为每小时一次。因此,1000 个传感器的网络每天只产生 4-5 MB 的数据,需要模型从稀疏的时间数据中学习。为了对比,在 Netflix 上流式传输一分钟的视频可以消耗数兆字节,突显了工业物联网网络和日常互联网使用之间数据量的差异。

隐私考虑增加了另一层复杂性,需要从第十五章中调整框架。医疗监控和位置跟踪生成高度敏感的数据,然而,该章节中的威胁建模、加密和访问控制机制假设了在社会公益部署中不可用的计算资源。在 512 KB RAM 的设备上实现差分隐私或联邦学习需要轻量级的替代标准加密协议。在第十五章中假设的加密安全区域和基于硬件的密钥存储在微控制器级设备上通常不存在,这需要在 2-4 MB 的总存储空间内仅使用软件安全。本地处理必须在保护隐私的计算(这会增加 10-50%的计算开销)和严格的电力预算之间取得平衡,而离线操作则防止了实时认证或撤销检查。这些限制使得在数据敏感性最高和社区安全管理技术能力最低时,隐私工程变得更加困难。

开发到生产资源差距

从数据约束转向部署现实,将机器学习系统从原型扩展到生产部署引入了核心资源约束,这需要重新设计架构。开发环境提供了计算资源,这些资源掩盖了许多现实世界的限制。一个典型的开发平台,例如 Raspberry Pi 418,凭借其 1.5 GHz 处理器和 4 GB RAM,提供了大量的计算能力。这些资源允许快速原型设计和测试机器学习模型,而无需立即关注优化。

生产部署揭示了与开发环境形成对比的资源限制。当扩展到数千台设备时,成本和电力限制通常要求使用微控制器单元,如 ESP3219,这是 Espressif Systems 广泛使用的微控制器单元,具有 240 MHz 双核处理器和总共 520 KB SRAM,具体可用量为 320-450 KB,取决于变体。这种计算资源的显著减少要求系统架构发生变化。设备上的学习技术第十四章变得至关重要:模型必须重新设计以适应受限的执行,应用量化(在第十章第十章中详细说明)和剪枝等优化技术,适应最小内存占用量的推理策略,并实施在严重带宽和存储限制下工作的更新机制。

除了计算扩展之外,网络基础设施的约束在很大程度上影响了大规模系统架构。不同的部署环境需要不同的通信协议,每个协议都有其独特的操作参数。这种网络基础设施的异质性要求系统在变化的带宽和延迟条件下保持一致的性能。随着部署跨越地区扩展,系统架构必须适应网络技术之间的无缝过渡,同时保持功能。

从开发到扩展部署的转变在应用领域呈现一致的模式。环境监控系统是这些扩展需求的例证。一个典型的森林监控系统可能从在开发平台上运行的 50 MB 计算机视觉模型开始。扩展到广泛部署需要通过量化和架构优化将模型减少到大约 500 KB,以便在分布式传感器节点上运行。这种模型尺寸的减少必须在严格限制在 1-2 W 的电力约束下保持检测精度。类似的架构转换也发生在农业监控系统和教育平台上,在这些平台上,模型必须优化以部署在数千台资源受限的设备上,同时保持系统效率。

长期可行性和社区所有权

在资源受限的环境中维护机器学习系统提出了超越初始部署考虑的特定挑战。这些挑战包括系统寿命、环境影响、社区能力和财务可行性,这些因素决定了社会影响项目的长期成功。第十八章(ch024.xhtml#sec-sustainable-ai)中的可持续性原则(生命周期评估、碳核算和负责任资源消耗)在社区已经面临环境脆弱性且缺乏管理电子废物或回收组件的基础设施的情况下,显得尤为重要。

系统寿命需要仔细考虑硬件的耐用性和可维护性。环境因素,如温度变化(通常在乡村部署中为-20°C 至 50°C)、湿度(在热带地区通常为 80-95%)和灰尘暴露,会显著影响组件的使用寿命。这些条件需要选择坚固的硬件和防护措施,在耐用性和成本限制之间取得平衡。例如,太阳能驱动的农业监测系统必须保持稳定的运行,尽管太阳辐射强度会随地理位置和天气模式的变化而变化,通常在 3-7 kWh/m²/天之间。

环境可持续性在系统设计中引入了额外的复杂性。应用第十八章(ch024.xhtml#sec-sustainable-ai)中的生命周期评估框架,我们必须考虑全面的环境足迹:运往偏远地区的组件的制造影响、太阳能板或容量有限的电池的运营电力消耗、维护访问的交通排放,以及在通常缺乏电子废物回收基础设施的地区的产品报废处理。典型的 1000 个传感器节点的部署需要考虑大约 500 公斤的电子组件,包括传感器、处理单元和电源系统。可持续设计原则必须通过仔细的组件选择和报废规划来满足即时的运营需求以及长期的环境影响。

社区能力建设是可持续性的另一个重要维度。系统必须由具有不同技术水平的地方技术人员维护。这一需求影响了从组件选择到系统模块化的架构决策。文档必须全面且易于访问,通常需要多种语言和格式的材料。培训计划必须填补知识差距,同时建立地方技术能力,确保社区能够独立维护和适应系统,随着需求的变化而发展。

然而,一个常见的误解是认为良好的意图自动确保了 AI 部署的积极社会影响。没有深入社区参与的科技解决方案往往无法解决实际需求或创造开发者没有预料到的新问题。文化误解、当地背景不足或技术限制都可能将有益的意图转变为有害的结果。有效的 AI 社会效益需要持续的社区伙伴关系、细致的影响评估和适应性实施方法,这些方法优先考虑受益人的需求而不是技术能力。

这些考虑将传统的 MLOps 实践从第十三章扩展到涵盖社区驱动的部署和维护工作流程。

跨学科团队的关键作用

在 AI 领域取得社会效益的成功高度依赖于与非工程师的合作。这些项目需要与领域专家(医生、农民、保护主义者)、社会科学家、社区组织者和当地合作伙伴紧密合作,他们带来了关于操作环境、文化考量和社区需求的基本知识。工程师的角色通常是作为社区定义目标的促进者和问题解决者,而不仅仅是技术提供商。

跨学科团队带来了关键视角:领域专家了解问题空间和操作限制,社会科学家帮助导航文化背景和意外后果,社区组织者确保真正的当地参与和所有权,而当地合作伙伴提供持续的维护和适应能力。没有这些多元化的视角,即使技术复杂的系统也往往无法实现可持续的影响。

财务可持续性往往决定了系统的寿命。运营成本,包括维护、更换零件和网络连接,必须与当地经济条件相一致。可持续部署可能将运营成本设定在每位受益人当地月收入的 5%以下。这一限制影响了系统设计的各个方面,从硬件选择到维护计划,需要仔细优化资本和运营支出。

在这个领域的一个关键陷阱是认为技术成功确保了可持续的长期影响。团队往往专注于实现技术里程碑,如模型精度或系统性能,而没有考虑决定长期社区利益的可持续性因素。成功的部署需要持续的维护、用户培训、基础设施支持和适应不断变化条件的能力,这些条件远远超出了最初的技术实施。那些取得令人印象深刻的技术成果但缺乏可持续支持机制的项目往往无法提供持久的好处。

系统弹性和故障恢复

社会公益部署在系统故障可能具有致命后果的环境中运行。与商业系统不同,停机时间会导致收入损失,医疗监测系统的故障可能会延迟关键干预措施,而农业传感器故障可能导致作物损失,影响整个社区。许多团队低估了在这些服务不足地区部署 AI 系统时出现的重大基础设施挑战,认为互联网连接、电力供应或设备能力简单可用。然而,成功的部署需要针对边缘计算、强大的离线能力、自适应带宽利用和能够在具有挑战性的物理环境中有效运行的弹性硬件设计的复杂工程解决方案。这一现实要求强大的故障恢复模式,以确保优雅降级和快速恢复基本服务。

常见故障模式和量化影响

50 多个社会公益部署的分析揭示了具有可量化停机时间贡献的持续故障模式:

  • 硬件故障(40%的停机时间):传感器电池耗尽、太阳能板退化以及与温度相关的组件故障主导了系统故障。恢复策略包括监测电池电压趋势的预测性维护算法、冗余传感器配置以及区域性维护中心预置的备用零件。

  • 网络故障(35%的停机时间):在天气事件期间间歇性连接丢失和基础设施损坏导致长期隔离期。恢复需要具有至少 72 小时最小容量的本地数据缓存、离线操作模式以及针对低带宽网络的自动重连协议。

  • 数据质量故障(25%的停机时间):传感器校准漂移和环境污染逐渐降低系统精度,直到需要手动干预。恢复涉及自动校准程序、异常检测阈值,以及当质量指标超过容忍水平时向更简单模型的无缝降级。

优雅降级架构

弹性系统实施分层回退机制,在多种故障条件下保持基本功能。一个医疗监测系统展示了这种方法:

class ResilientHealthcareAI:
    def diagnose(self, symptoms, connectivity_status, power_level):
        # Adaptive model selection based on system status
        if connectivity_status == "full" and power_level > 70:
            # Full accuracy
            return self.cloud_ai_diagnosis(symptoms)
        elif connectivity_status == "limited" and power_level > 30:
            # 90% accuracy
            return self.edge_ai_diagnosis(symptoms)
        elif power_level > 10:
            # Basic screening
            return self.rule_based_triage(symptoms)
        else:
            return self.emergency_protocol(symptoms)  # Critical only

    def fallback_to_human_expert(self, case, urgency_level):
        # Queue prioritization for human review
        if urgency_level == "critical":
            self.satellite_emergency_transmission(case)
        else:
            self.priority_queue.add(case, next_connectivity_window)
        return "Flagged for expert review when connection restored"

分布式故障恢复

多节点部署需要协调的故障恢复,即使在单个节点故障的情况下也能保持系统整体的功能。农业监测网络展示了针对资源限制的拜占庭容错性:

  • 共识机制:采用 10 秒心跳间隔修改的 Raft 协议,在网络延迟的情况下检测 30 秒窗口内的故障

  • 数据冗余:在 3-5 个节点之间进行地理复制,确保即使单个传感器故障,作物监测也能继续

  • 协调恢复:区域节点协调同时进行软件更新和配置更改,最小化部署范围内的漏洞窗口

基于社区的维护整合

成功的社会公益系统将当地社区整合到维护工作流程中,减少对外部技术支持的依赖。培训计划在提供经济机会的同时,创造当地技术能力:

  • 诊断协议:社区健康工作者接受标准化的程序,用于识别和解决 80%的常见故障

  • 备件管理:本地库存系统根据历史故障率,维持 2 周供应缓冲的临界组件

  • 升级程序:清晰的沟通渠道将当地技术人员与远程专家联系起来,以解决需要专业知识的专业故障

这种社区整合方法将平均维修时间从 7-14 天(外部技术人员派遣)缩短到 2-4 小时(当地响应),显著提高了远程部署的系统可用性。

上文所述的工程挑战和故障模式需要比临时解决方案更多。要理解为什么资源受限的环境需要不同的方法,而不是仅仅缩小传统系统的规模,我们必须检查支配约束下学习的理论基础。这些数学原理建立在第八章的训练理论之上,揭示了样本效率、通信复杂性和能量-精度权衡的内在限制,这些限制将指导本章后面提出的模式设计。

设计模式框架

在第 19.5 节中详细描述的工程挑战揭示了区分社会公益部署的三个核心约束:通信瓶颈,其中数据传输成本超过本地计算;样本稀缺,造成理论需求与可用数据之间 100-1000 倍的差距;以及能源限制,迫使进行明确的精度-寿命权衡。

而不是临时应对这些约束,系统化的设计模式提供了原则性的架构方法。认为资源受限的部署只需“缩小版”的云系统是错误的。正如设计模式所显示的,它们需要针对特定约束组合进行优化的不同架构,而不是减少功能。

从成功的社会公益部署的分析中,出现了四种模式,每种模式针对特定的约束组合:

模式选择维度

选择合适的设计模式需要分析部署环境的三个关键维度。

首先,资源可用性范围从超约束的边缘设备(具有千字节内存的微控制器)到资源丰富的云基础设施。这个范围决定了计算能力并影响模式选择。

其次,连接可靠性从始终连接的城市部署到间歇性连接的农村站点,再到完全离线操作。这些连接模式决定了数据同步策略和协调机制。

第三,数据分布塑造了学习方法:训练数据可能是集中的、跨站点分布的,或在操作期间本地生成。这些特征影响了学习方法和知识共享模式。

模式概述

层次处理模式将系统组织成计算层级(边缘-区域-云),这些层级根据可用资源分担责任。该模式直接将第二章中关于云 ML、边缘 ML 和移动 ML 部署范例的内容应用于资源受限环境,对于层级间具有可靠连接和明确资源区分的部署最为有效。

渐进增强模式实现了在资源约束下优雅降级的分层功能。基于第九章中关于高效 AI 模型压缩技术的内容,该模式使用量化、剪枝和知识蒸馏来创建多个能力层级。它在资源可用性和设备能力多样化的环境中表现出色。

分布式知识模式允许在没有集中式基础设施的情况下进行点对点学习和协调。这个模式将第八章中联邦学习原则扩展到在极端带宽约束和间歇性连接下运行,使其在连接有限但计算资源分布的场景中变得理想。

自适应资源模式根据当前资源可用性动态调整计算。借鉴第十一章中关于电源管理和热优化策略的内容,该模式实现了能量感知推理调度。它对于具有可预测资源模式(如太阳能充电周期和网络可用窗口)的部署最为有效。

模式比较框架

四种设计模式针对不同的约束和操作环境组合。表 19.2 提供了一个系统性的比较,以指导针对特定部署场景的模式选择。

表 19.2:设计模式比较:每个模式针对特定的约束组合和部署环境进行优化。分层处理在可靠连接允许层级协调时效果最佳。渐进式增强在资源可用性可变时表现卓越。分布式知识处理网络分区和对等协调。自适应资源管理优化可预测的资源周期。

设计模式 主要目标 关键挑战 最佳适用于… 示例
分层 分布式计算 层级之间的延迟 覆盖城市/农村 洪水预测
渐进 优雅降级 模型版本管理 可变连接 PlantVillage Nuru
分布式 去中心化协调 网络分区 对等共享 野生动物洞察
自适应 动态资源使用 功率/计算调度 可预测的能量周期 太阳能传感器

此比较框架允许基于部署约束而不是临时的架构决策进行系统化的模式选择。多个模式通常在单个系统中结合使用:一个太阳能野生动物监测网络可能使用自适应资源管理来管理单个传感器,分布式知识进行对等协调,以及渐进式增强来处理可变的连接场景。

以下各节将详细检查每种模式,提供实施指导和现实世界的案例研究。

设计模式实现

在上述选择框架的基础上,本节详细介绍了资源受限的机器学习系统的四种设计模式。每个模式描述都遵循一致的结构:来自实际部署的动机、架构原则、实施考虑因素和局限性。

分层处理

这些模式中的第一个,分层处理模式,将系统组织成共享其可用资源和能力的层级。就像拥有本地分支机构、区域办公室和总部的大型企业一样,此模式在边缘、区域和云层级之间分割工作负载。每个层级利用其计算能力:边缘设备用于数据收集和本地处理,区域节点用于聚合和中间计算,云基础设施用于高级分析和模型训练。

如图 19.3 所示,此模式在这些层级之间建立了清晰的交互流程。从边缘层的数据收集开始,信息通过区域聚合和处理流动,最终在基于云的高级分析中达到高潮。双向反馈循环允许模型更新通过层次结构反向流动,确保持续的系统改进。

图 19.3:分层数据流架构:分布式机器学习系统使用分层架构(边缘、区域和云)来处理更接近数据源的数据,汇总见解,并通过持续反馈进行模型优化的高级分析。区域节点从边缘设备收集数据,降低通信成本,并使整个系统实现可扩展、高效的分析。

这种架构在基础设施质量各异的环境中表现卓越,例如跨越城市和农村地区的应用。边缘设备在网络或电源中断期间通过在本地执行重要计算并排队等待更高层级资源的需求操作来保持重要功能。当连接恢复时,系统在可用的基础设施层级上扩展操作。

在机器学习应用中,这种模式需要仔细考虑资源分配和数据流。边缘设备必须在模型推理准确性和计算约束之间取得平衡,而区域节点则促进数据聚合和模型个性化。云基础设施提供了进行综合分析和模型再训练所需的计算能力。这种分布需要在整个层次结构中对模型架构、训练程序和更新机制进行深思熟虑的优化。

例如,在作物病害检测中:边缘传感器(智能手机应用)运行轻量级 500KB 模型以本地检测明显的病害,区域聚合器从 100 多个农场收集照片以识别新兴威胁,云基础设施使用全球疾病模式和天气数据重新训练模型。这允许立即向农民发出警报,同时随着时间的推移构建更智能的模型。

谷歌的洪水预测

谷歌的洪水预报倡议展示了分层处理模式如何支持大规模环境监测。河流网络中的边缘设备监测水位,即使在没有云连接的情况下也能执行基本的异常检测。区域中心汇总这些数据并确保本地决策,而云层则整合来自多个区域的输入,进行高级洪水预测和系统级更新。这种分层方法平衡了本地自主性和集中式智能,确保在不同基础设施条件下都能正常工作。这种分层系统的技术实现借鉴了专门的优化技术:包括模型压缩和量化的边缘计算策略在第十四章中详细说明,分布式系统协调模式在第八章中介绍,资源受限环境下的硬件选择在第十一章中讨论,可持续部署的考虑因素在第十八章中探讨。

在边缘层,系统可能采用了沿河流网络分布的水位传感器和本地处理单元。这些设备执行两个重要功能:定期(例如,每 15 分钟)连续监测水位,并进行初步的时间序列分析以检测显著变化。受限于严格的功耗限制(几瓦的功率),边缘设备使用量化的模型进行异常检测,实现低功耗运行并最小化传输到更高层的数据量。这种本地处理确保了关键监控任务可以在网络连接断开的情况下独立进行。

区域层在区级处理中心运行,每个中心负责管理其管辖范围内数百个传感器的数据。在这一层,使用了更复杂的神经网络模型来结合传感器数据以及额外的上下文信息,例如当地地形特征和历史洪水模式。这一层通过汇总和提取有意义的特征来减少传输到云的数据量,同时在网络中断期间保持重要的决策能力。当需要时,区域层可以独立运行,从而增强系统弹性并确保本地监控和警报功能保持正常。

在云层级别,系统整合来自区域中心以及外部来源的数据,例如卫星图像和气象数据,以实现完整的机器学习流程。这包括训练和运行高级洪水预测模型、生成淹没地图以及将预测结果分发给利益相关者。云层提供进行大规模分析和系统级更新的计算资源。然而,分层结构确保了即使在云连接不可用的情况下,重要的监控和警报功能也能在边缘和区域层自主运行。

这种实现揭示了成功分层处理模式部署的几个关键原则。首先,在各个层级之间仔细分割机器学习任务允许优雅降级。即使隔离,每个层级也保持重要的功能。其次,随着更高层级的可用性,能力的渐进增强展示了系统如何适应不同的资源可用性。最后,信息双向流动,其中传感器数据向上移动,模型更新向下流动,创建了一个强大的反馈循环,随着时间的推移提高系统性能。这些原则不仅适用于洪水预测,还适用于各种社会影响领域的分层机器学习部署。

结构

分层处理模式实现了特定的架构组件和关系,允许其分布式运行。理解这些结构元素对于在不同部署场景中有效实施至关重要。

边缘层的架构以资源感知组件为中心,这些组件优化了本地处理能力。在硬件层面,数据采集模块实现自适应采样率,通常从 1 Hz 到 0.01 Hz 不等,根据电力可用性动态调整。本地存储缓冲区,通常为 1-4 MB,通过环形缓冲区实现来管理网络中断期间的数据。处理架构集成了针对量化模型优化的轻量级推理引擎,与持续跟踪设备健康和资源利用状态的管理系统协同工作。通信模块实现了为不可靠网络设计的存储转发协议,确保在间歇性连接期间数据完整性。

区域层实现了聚合和协调结构,允许分布式决策。数据融合引擎是该层核心,结合多个边缘数据流,同时考虑时间和空间关系。分布式数据库,通常跨越 50-100 GB,支持最终一致性模型,以维护节点间的数据一致性。该层的架构包括负载均衡系统,根据可用的计算资源和网络条件动态分配处理任务。故障转移机制确保在节点故障期间持续运行,而模型服务基础设施支持多个模型版本,以适应不同的边缘设备能力。跨区域同步协议管理地理边界之间的数据一致性。

云层通过复杂的分布式系统为系统级操作提供架构基础。训练基础设施支持多个计算集群之间的并行模型更新,而版本控制系统管理模型世系和部署历史。高吞吐量数据管道处理来自所有区域节点的传入数据流,实施自动质量控制和质量验证机制。该架构包括强大的安全框架,管理所有层级的身份验证和授权,同时维护系统访问和修改的审计跟踪。全局状态管理系统跟踪整个部署的健康状况和性能,使能够进行主动的资源分配和系统优化。

层次化处理模式的结构允许在各个层级上对资源和责任进行复杂的管理。这种架构方法确保系统可以在各种条件下维持重要操作,同时高效地利用层次结构每个级别的可用资源。

现代改编

计算效率、模型设计和分布式系统方面的进步已经改变了传统的层次化处理模式。在保持其核心原则的同时,该模式已经发展以适应新技术和方法,允许更复杂的工作负载和动态资源分配。这些创新特别影响了不同层级之间的交互和责任共享,在多样化的环境中创造了更灵活和强大的部署。

最显著的转变发生在边缘层。历史上,边缘设备仅限于基本操作,如数据收集和简单的预处理,而现在它们执行的是以前仅限于云端的复杂处理任务。这一转变是由两个重要的发展驱动的:高效的模型架构和硬件加速。如模型压缩、剪枝和量化等技术显著降低了神经网络的尺寸和计算需求,使得即使是资源受限的设备也能以合理的准确性执行推理任务。在专用硬件方面的进步,如边缘 AI 加速器和低功耗 GPU,进一步增强了边缘设备的计算能力。因此,像图像识别或异常检测这样的任务,以前需要大量的云资源,现在可以在低功耗微控制器上本地执行。

区域层已经超越了其传统的数据聚合角色。现代区域节点使用如联邦学习等技术,其中多个设备协作改进共享模型,而不需要将原始数据传输到中央位置。这种方法不仅增强了数据隐私性,还减少了带宽需求。区域层越来越多地被用于将全局模型适应本地条件,从而为特定部署环境提供更准确和上下文感知的决策。这种适应性使区域层成为在多样或资源可变环境中运行的系统不可或缺的组成部分。

随着这些进步,层级之间的关系变得更加灵活和动态。随着边缘和区域能力的扩展,任务在层级之间的分配现在由实时资源可用性、网络条件和应用需求等因素决定。例如,在连接性低的时候,边缘和区域层可以暂时承担额外的责任以确保重要功能,而当资源和连接性改善时,无缝地将任务卸载到云端。这种动态分配保留了层次结构固有的优势,包括可扩展性、弹性和效率,同时使系统能够更好地适应不断变化的情况。

这些适应表明了分层处理模式系统未来的发展。随着边缘计算能力的持续提升和新分布式学习方法的涌现,层级之间的界限可能会变得更加动态。这种演变预示着一个未来,其中分层系统可以根据部署环境、资源可用性和应用需求自动优化其结构,同时保持模式的核心优势,如可扩展性、弹性和效率。

系统影响

虽然层次化处理模式最初是为通用分布式系统设计的,但其应用于机器学习引入了独特的考虑因素,这些因素显著影响了系统设计和操作。机器学习系统与传统系统不同,它们在数据流、计算密集型任务以及模型更新和推理过程的动态性方面有很强的依赖性。这些额外因素在将层次化处理模式适应机器学习部署需求时既带来了挑战也带来了机遇。

机器学习的一个最重要的影响是需要在多个层级上管理动态模型行为。与静态系统不同,机器学习模型需要定期更新以适应新的数据分布,防止模型漂移并保持准确性。层次结构通过允许云端层处理集中的训练和模型更新,同时将精炼的模型传播到区域和边缘层级,本质上支持这一需求。然而,这也引入了同步问题,因为当更新因连接问题而延迟时,边缘和区域层级必须继续使用较旧的模型版本运行。设计健壮的版本控制系统并确保模型更新之间的无缝过渡对于这些系统的成功至关重要。

数据流是机器学习系统提出独特要求的另一个领域。与传统分层系统不同,机器学习系统必须在多个层级上处理大量数据,从边缘的原始输入到区域和云端层级的聚合和预处理数据集。每个层级都必须针对其执行的具体数据处理任务进行优化。例如,边缘设备通常过滤或预处理原始数据以减少传输开销,同时保留对推理重要的重要信息。区域层级聚合这些输入,执行中间级别的分析或特征提取以支持下游任务。这个多阶段数据管道不仅降低了带宽需求,而且确保每个层级对整体机器学习工作流程都有实质性贡献。

层次化处理模式还允许自适应推理,这是在具有不同计算资源的环境中部署机器学习模型时的一个关键考虑因素。通过利用每一层的计算能力,系统可以动态地分配推理任务以平衡延迟、能耗和准确性。例如,边缘设备可能处理基本的异常检测以确保实时响应,而当资源和连接允许时,更复杂的推理任务则被卸载到云端。这种动态分配对于资源受限的环境非常重要,在这些环境中,能效和响应速度至关重要。

硬件进步进一步塑造了分层处理模式在机器学习中的应用。专用边缘硬件,如 AI 加速器和低功耗 GPU 的普及,使得边缘设备能够处理越来越复杂的机器学习任务,缩小了层级之间的性能差距。区域层同样受益于诸如联邦学习等创新,模型可以在不要求集中式数据收集的情况下跨设备协作改进。这些进步增强了低层级的自主性,减少了对于云连接的依赖,并使系统能够在去中心化环境中有效运行。

最后,机器学习引入了平衡本地自主性与全球协调的挑战。边缘和区域层级必须能够根据它们可用的数据进行本地化决策,同时与云层级维护的全球状态保持同步。这需要仔细设计层级之间的接口,以管理不仅数据流,还包括模型更新、推理结果和反馈循环。例如,采用联邦学习的系统必须协调本地训练的模型更新的聚合,而不会压垮云层级或损害隐私和安全。

通过将机器学习集成到分层处理模式中,系统获得了在多样化环境中扩展其能力、动态适应不断变化的资源条件以及平衡实时响应与集中式智能的能力。然而,这些好处伴随着额外的复杂性,需要仔细关注模型生命周期管理、数据结构和资源分配。分层处理模式仍然是机器学习系统的一个强大框架,使其能够克服基础设施可变性的限制,并在广泛的领域中提供高影响力的解决方案。

按层级划分的性能特征

在分层层级中量化性能揭示了吞吐量、资源消耗和部署限制之间的精确权衡。这些指标为架构决策和资源分配策略提供了信息,这对于社会公益应用至关重要(表 19.3)。

表 19.3:分层性能指标:性能特征在层级之间差异很大,边缘设备优化了功耗效率,而云系统优化了计算吞吐量。这些限制推动了关于哪些处理任务分配给每个层级的架构决策。

层级 吞吐量 模型大小 功耗 典型用例
边缘设备 每秒 10-100 次推理 <1 MB 100 mW 常规筛查,异常检测
区域节点 每秒 100-1000 次推理 10-100 MB 10W 复杂分析,数据融合
云处理 >10,000 次推理/秒 GB+ kW 训练更新,全球协调

网络带宽限制

带宽限制塑造了层间通信模式,并决定了不同架构方法的可行性:

  • 2G 连接(50 kbps):每分钟支持 1-2 次图像上传,需要积极的边缘预处理和数据压缩

  • 3G 连接(1 Mbps):每分钟允许上传 10-20 张图像,允许适度的区域聚合工作负载

  • 设计限制:边缘处理必须处理 95%以上的常规推理任务,以避免网络容量过载

协调开销分析

通信成本主导了分布式处理性能,需要仔细优化层间协议:

  • 参数同步:随着模型大小和参与者的增加而扩展,对于大型模型和许多边缘节点来说变得难以承受

  • 梯度聚合:网络带宽成为主要瓶颈,而不是计算能力

  • 效率规则:保持 10:1 的计算到通信比率,以实现可持续的分布式操作

农村医疗部署展示了这些权衡。运行 500KB 诊断模型的边缘设备每秒实现 50-80 次推理,平均功耗为 80mW。从 100 多个健康站收集数据的区域节点每天使用 8W 的电力预算处理 500-800 个复杂案例。云处理处理人口级分析和模型更新,消耗千瓦级电力,但为整个国家的数百万受益者提供服务。

局限性

尽管具有优势,但分层处理模式在实际部署中遇到几个核心限制,尤其是在应用于机器学习系统时。这些限制源于架构的分布式特性,资源在各层之间的可用性变化,以及在大规模上保持一致性和效率的固有复杂性。

处理能力的分布引入了资源分配和成本管理方面的重大复杂性。区域处理节点必须在本地计算需求、硬件成本和能耗之间进行权衡。在电池供电的部署中,本地计算与数据传输的能量效率成为一个重要因素。这些限制直接影响系统的可扩展性和运营成本,因为额外的节点或层可能需要大量投资于基础设施和硬件。

时间敏感的操作在分层系统中提出了独特的挑战。虽然边缘处理减少了本地决策的延迟,但需要跨层协调的操作会引入不可避免的延迟。例如,需要跨多个区域节点达成共识的异常检测系统面临固有的延迟限制。这种协调开销可能使分层架构不适合需要亚毫秒级响应时间或严格全局一致性的应用程序。

不同地区之间的训练数据不平衡创造了额外的复杂性。不同的部署环境通常会产生不同数量和类型的数据,导致模型偏差和性能差异。例如,城市地区通常比农村地区生成更多的训练样本,这可能导致模型在数据较少的环境中表现不佳。这种不平衡在模型性能直接影响重要决策过程的系统中尤其成问题。

系统维护和调试引入了随着规模增长而增加的实际挑战。当问题可能源于硬件故障、网络条件、模型漂移或层之间的交互时,识别性能下降的根本原因变得越来越复杂。传统的调试方法往往证明是不够的,因为问题可能只在多个层级的特定条件组合下显现。这种复杂性增加了运营成本,并需要专门的系统维护专业知识。

这些限制需要在系统设计期间仔细考虑缓解策略。异步处理协议、分层安全框架和自动化调试工具等方法可以帮助解决特定挑战。此外,实施强大的监控系统,跟踪跨层级的性能指标,可以提前检测潜在问题。虽然这些限制不会减少该模式的整体效用,但它们强调了在分层系统部署中进行彻底规划和风险评估的重要性。

渐进增强

渐进增强模式采用分层方法进行系统设计,使功能能够在具有不同资源容量的环境中运行。该模式通过建立一个在最小资源条件下保持运行的基本能力,通常只需要千字节级的内存和毫瓦级的功率,并在可用额外资源时逐步引入高级功能。虽然起源于适应不同浏览器能力和网络条件的应用程序的网络开发,但该模式已演变为解决分布式系统和机器学习部署的复杂性。

这种方法与分层处理模式不同,它侧重于垂直特征增强,而不是任务的横向分布。采用这种模式的系统结构旨在即使在严重资源受限的情况下(如 2G 网络连接(< 50 kbps)或微控制器级设备(< 1 MB RAM))也能维持操作。随着资源的可用,系统会系统地激活额外的功能,每个增强层都建立在先前层建立的基础之上。这种细粒度的资源利用方法确保了系统的可靠性,同时最大化了性能潜力。

在机器学习应用中,渐进式增强模式允许根据可用资源对模型和工作流程进行复杂的适应。例如,一个计算机视觉系统可能在资源最少的条件下部署一个 100 KB 的量化模型,能够进行基本的物体检测,随着计算资源的允许,逐步扩展到更复杂的模型(1-50 MB),这些模型具有更高的准确率和额外的检测能力。这种适应性允许系统动态地扩展其功能,同时在不同的操作环境中保持核心功能。

PlantVillage Nuru

PlantVillage Nuru 体现了其在为小农户提供人工智能农业支持方面的渐进式增强模式,尤其是在资源匮乏的环境中(Ferentinos 2018)。Nuru 是为了解决作物疾病和害虫管理方面的挑战而开发的,它将机器学习模型与移动技术相结合,将可操作见解直接提供给农民,即使在连接性或计算资源有限的偏远地区。

PlantVillage Nuru20 使用的是针对资源受限环境优化的基线模型。该系统采用量化的卷积神经网络(通常大小为 2-5 MB),在入门级智能手机上运行,每秒可以处理 1-2 帧图像,同时功耗低于 100 mW。这些模型利用了第七章中讨论的移动优化框架,以实现设备上的高效推理。设备上的模型在识别常见作物疾病时达到 85-90% 的准确率,提供了重要的诊断能力,而无需网络连接。

当网络连接可用时(即使是在 2G 速度的 50-100 kbps),Nuru 会逐步提升其功能。系统将收集到的数据上传到云基础设施,那里更复杂的模型(50-100 MB)以 95-98%的准确率进行高级分析。这些模型整合了多个数据源:高分辨率卫星影像(10-30 米分辨率)、本地气象数据(每小时更新)和土壤传感器读数。这种增强处理生成了详细的缓解策略,包括精确的农药用量建议和干预的最佳时机。

在智能手机普及率较低的地区,Nuru 通过社区数字中心实施中间增强层。这些中心配备了中端平板电脑(2 GB RAM,四核处理器),本地缓存诊断模型和农业数据库(10-20 GB)。这种架构允许在离线状态下访问增强功能,并在连接可用时作为数据聚合点,通常在非高峰时段与云服务同步以优化带宽使用。

这种实现展示了渐进增强如何根据可用资源从基本的诊断能力扩展到全面的农业支持。系统即使在严重限制下(离线操作,基本硬件)也能保持功能,并在资源可用时利用额外资源提供越来越复杂的分析和建议。

结构

渐进增强模式将系统组织成分层功能,每个功能都设计在特定的资源条件下运行。这种结构从一组在最小计算或连接限制下运行的能力开始,随着额外资源的可用而逐步整合高级功能。

表 19.4 概述了模式三个主要层的资源规格和能力:

表 19.4:渐进增强层:资源限制定义了系统各层的功能,使得设计能够适应不同的条件,优先保证功能。该表将计算能力、网络连接和存储映射到基本层、中间层和高级层,展示了系统如何以最少的资源维持核心功能,并在资源增加时提升性能。

资源类型 基本层 中间层 高级层
计算 微控制器级(100-200 MHz CPU,< 1MB RAM) 入门级智能手机(1-2 GB RAM) 云/边缘服务器(8 GB+ RAM)
网络 离线或 2G/GPRS 断断续续的 3G/4G(1-10 Mbps) 可靠的宽带(50 Mbps+)
存储 基础模型(1-5 MB) 本地缓存(10-50 MB) 分布式系统(GB+规模)
电力 电池供电(50-150 mW) 每日充电周期 连续电网电力
处理 基本推理任务 中等机器学习工作负载 完全训练能力
数据访问 预包装数据集 定期同步 实时数据集成

渐进增强模式中的每一层都独立运行,因此系统在高级别可用性未知的情况下仍能保持功能。该模式的模块化结构允许层与层之间无缝过渡,最小化系统动态调整资源条件时的中断。通过优先考虑适应性,渐进增强模式支持广泛的部署环境,从远程资源受限地区到连接良好的城市中心。

图 19.4 展示了这三个层次,显示了每一层的功能。该图直观地展示了每一层如何根据可用资源进行扩展,以及系统在资源约束发生时如何回退到较低层次。

图 19.4:渐进增强层:机器学习系统采用分层架构以保持不同资源可用性下的功能,即使在有限的连接或计算能力下也优先考虑核心功能。每一层都建立在上一层的基础上,实现无缝过渡和适应不同环境的部署。

现代适应

现代渐进增强模式的实现结合了自动优化技术,以创建复杂的资源感知系统。这些调整改变了系统在部署环境中管理不同资源约束的方式。

自动架构优化在实现渐进增强层方面取得了重大进展。当代系统采用神经架构搜索来生成针对特定资源约束优化的模型系列。例如,一个计算机视觉系统可能维护多个模型变体,大小从 500 KB 到 50 MB 不等,每个模型在其各自的计算范围内都保持最大精度。这种自动化方法确保了增强层之间性能的一致性扩展,并为更复杂的适应机制奠定了基础。

知识蒸馏和迁移机制已发展以支持渐进能力增强。现代系统实施双向蒸馏过程,其中在资源受限环境中运行的简化模型逐渐吸收其更复杂对应模型的见解。这种架构方法允许基线模型在严格资源限制下随着时间的推移提高其性能,从而在增强层之间创建一个动态学习生态系统。

分布式学习框架的演变通过联邦优化策略进一步扩展了这些增强能力。基线层设备参与简单的模型平均操作,而资源更丰富的节点实现更复杂的联邦优化算法。这种分层分布式学习方法允许系统级改进,同时尊重单个设备的计算限制,有效地扩展了不同部署环境中的学习能力。

这些分布式能力最终体现在资源感知的神经网络架构中,这些架构展示了动态适应的最新进展。这些系统根据可用资源调节其计算图,自动调整模型深度、宽度和激活函数以匹配当前硬件能力。这种动态适应允许在增强层之间实现平稳过渡,同时保持最佳资源利用率,代表了渐进增强实现中的当前技术水平。

系统影响

将渐进增强模式应用于机器学习系统,引入了独特的架构考虑因素,这些因素超越了传统的渐进增强方法。这些影响显著影响了模型部署策略、推理管道和系统优化技术。

模型架构设计需要仔细考虑增强层之间的计算-精度权衡。在基线层,模型必须在严格的计算限制内运行(通常模型大小为 100-500 KB)同时保持可接受的精度阈值(通常为全模型性能的 85-90%)。然后,每个增强层逐步引入更复杂的架构组件,如额外的模型层、注意力机制或集成技术,与可用资源同步扩展计算需求。

训练管道在渐进增强实现中提出了独特的挑战。系统必须在不同的模型变体之间保持一致的性能指标,同时实现增强层之间的平稳过渡。这需要专门的训练方法,如渐进式知识蒸馏,其中较简单的模型在其计算约束内学习模仿其更复杂对应模型的行为。训练目标必须平衡多个因素:基线模型效率、增强层准确性和跨层一致性。

在渐进式增强场景中,推理优化变得尤为重要。系统必须根据可用资源动态调整其推理策略,实施自适应批处理、动态量化和选择性层激活等技术。这些优化确保了高效地利用资源,同时在不同的增强层中保持实时性能要求。

模型同步和版本控制为渐进式增强的机器学习系统引入了额外的复杂性。随着模型在不同资源层中运行,系统必须保持版本兼容性并管理模型更新,而不会干扰持续进行的操作。这需要强大的版本控制协议,以跟踪增强层之间的模型血统,同时确保基线操作的后向兼容性。

框架实现模式

框架选择对渐进式增强实现有重大影响,不同的框架在特定的部署层中表现出色。理解这些权衡有助于为每个增强层选择最佳的技术选择(表 19.5)。

PyTorch Mobile 实现

PyTorch 通过 torchscript 优化和量化工具提供了强大的移动部署能力。对于需要渐进式增强的社会公益应用:

class ProgressiveHealthcareAI:
    def __init__(self):
        # Baseline model: 2MB, runs on any Android device
        self.baseline_model = torch.jit.load("baseline_diagnostic.pt")

        # Enhanced model: 50MB, requires modern hardware
        if self.device_has_capacity():
            self.enhanced_model = torch.jit.load(
                "enhanced_diagnostic.pt"
            )

    def diagnose(self, symptoms):
        # Progressive model selection based on available
        # resources
        if (
            hasattr(self, "enhanced_model")
            and self.sufficient_power()
        ):
            return self.enhanced_model(symptoms)
        return self.baseline_model(symptoms)

    def device_has_capacity(self):
        # Check RAM, CPU, and battery constraints
        return (
            self.get_available_ram() > 1000  # MB
            and self.get_battery_level() > 30  # percent
            and not self.power_saving_mode()
        )

TensorFlow Lite 优化

TensorFlow Lite 在为资源受限的部署层创建优化模型方面表现出色:

# Quantization pipeline for progressive enhancement
converter = tf.lite.TFLiteConverter.from_saved_model(model_path)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

# Baseline layer: INT8 quantization for maximum efficiency
converter.target_spec.supported_types = [tf.int8]
# 4x size reduction, <2% accuracy loss
baseline_model = converter.convert()

# Intermediate layer: Float16 for balanced performance
converter.target_spec.supported_types = [tf.float16]
# 2x size reduction, <1% accuracy loss
intermediate_model = converter.convert()

框架生态系统比较

表 19.5:框架选择矩阵:在渐进式增强系统中,不同的框架在不同的部署场景中表现出色。PyTorch Mobile 提供了从研究到生产的优秀工作流程,TensorFlow Lite 提供了优越的生产部署工具,而 ONNX Runtime 实现了跨平台兼容性。

框架 移动支持 边缘部署 社区 最佳用途
PyTorch Mobile 优秀 研究导向 从原型到生产
TensorFlow Lite 优秀 优秀 行业导向 生产部署
ONNX Runtime 优秀 跨平台 模型可移植性

功率感知模型调度

高级实现结合了基于实时资源可用性的动态模型选择:

class AdaptivePowerManagement:
    def __init__(self, models):
        self.models = {
            "baseline": models["2mb_quantized"],  # 50mW average
            "intermediate": models["15mb_float16"],  # 150mW average
            "enhanced": models["80mb_full"],  # 500mW average
        }

    def select_model(self, battery_level, power_source):
        if power_source == "solar" and battery_level > 70:
            return self.models["enhanced"]
        elif battery_level > 40:
            return self.models["intermediate"]
        else:
            return self.models["baseline"]

    def predict_with_power_budget(self, input_data, max_power_mw):
        # Select most capable model within power constraint
        available_models = [
            (name, model)
            for name, model in self.models.items()
            if self.power_consumption[name] <= max_power_mw
        ]

        if not available_models:
            # No model can operate within power budget
            return None

        # Use most capable model within constraints
        best_model = max(
            available_models, key=lambda x: self.accuracy[x[0]]
        )
        return best_model1

这些实现模式展示了框架选择如何直接影响资源受限环境中的部署成功。适当的框架选择和优化能够有效地在多种部署场景中进行渐进式增强。

局限性

虽然渐进式增强模式为机器学习系统部署提供了显著的优势,但它引入了几个技术挑战,这些挑战影响了实施可行性和系统性能。这些挑战尤其影响了模型管理、资源优化和系统可靠性。

模型版本激增是一个核心挑战。每个增强层通常需要多个模型变体(通常每个层 3-5 个)来处理不同的资源场景,这会在模型管理开销上产生组合爆炸。例如,一个支持三个增强层的计算机视觉系统可能需要多达 15 个不同的模型版本,每个版本都需要单独的维护、测试和验证。当支持多个任务或领域时,这种复杂性会呈指数级增长。

增强层之间的性能一致性引入了重大的技术挑战。在基线层运行的模型(通常限制在 100-500 KB 大小)必须至少保持 85-90%的准确性,同时只使用 1-5%的计算资源。随着任务复杂性的增加,实现这种效率-准确性权衡变得越来越困难。系统在层之间转换时往往难以保持一致的推理行为,尤其是在处理边缘情况或分布外输入时。

资源分配优化提出了另一个重要限制。系统必须持续监控和预测资源可用性,同时还要管理这些监控系统的开销。在增强层之间切换的决策过程引入了额外的延迟(通常为 50-200 毫秒),这可能会影响实时应用。在资源可用性快速波动的环境中,这种开销尤其成问题。

基础设施依赖性对系统能力产生了核心限制。虽然基线功能在最小要求内运行(50-150 毫瓦功耗,2G 网络速度),但要实现系统的全部潜力需要大量的基础设施改进。基线和增强功能之间的差距通常跨越几个数量级的计算需求,从而在部署环境中造成系统性能的显著差异。

用户体验的连续性受到系统行为在增强层之间固有可变性的影响。输出质量和响应时间可能会有很大差异——从基线层的简单二分类到高级层具有置信区间的详细概率预测。这些变化可能会损害用户信任,尤其是在一致性至关重要的关键应用中。

这些限制需要在系统设计和部署时仔细考虑。成功的实施需要强大的监控系统、优雅降级机制,以及在每个增强层清晰传达系统能力。虽然这些挑战并没有否定该模式的效用,但它们强调了在渐进式增强部署中进行彻底规划和设定现实期望的重要性。

分布式知识

分布式知识模式解决了在去中心化节点间进行集体学习和推理的挑战,每个节点都使用本地数据和计算限制进行操作。与具有不同角色的层级的层次处理不同,此模式强调对等知识共享和协作模型改进。每个节点为网络的集体智能做出贡献,同时保持操作独立性。

此模式建立在已建立的移动机器学习和微型机器学习技术之上,允许在每个节点进行自主本地处理。设备实现量化模型(通常为 1-5 MB)进行初始推理,同时采用如联邦学习等技术进行协作模型改进(Kairouz 等人 2019)。知识共享通过各种机制发生:模型参数更新、派生特征或处理洞察,具体取决于带宽和隐私限制。这种分布式方法允许网络利用集体经验,同时尊重本地资源限制。

该模式在传统集中式学习面临重大障碍的环境中尤其出色。通过在节点间分配数据收集和模型训练,系统即使在间歇性连接(每天网络可用时间低至 1-2 小时)或严重的带宽限制(每个节点每天 50-100 KB)下也能有效运行。这种弹性使其在基础设施有限的环境中运行的社会影响应用中特别有价值。

分布式方法的核心区别在于,它侧重于横向知识共享,而不是纵向能力增强。每个节点保持类似的基线能力,同时贡献并从网络的集体知识中受益,创建了一个即使在网络的大部分部分暂时不可访问时仍能正常工作的稳健系统。

野生动物洞察

野生动物洞察通过分布式相机陷阱网络展示了分布式知识模式在保护中的应用。该系统展示了在偏远荒野地区资源严重受限的情况下,去中心化节点如何集体构建和共享知识。

每个相机陷阱作为一个独立的处理节点,在严格的功率和计算限制内实现复杂的边缘计算能力。这些设备采用轻量级的卷积神经网络进行物种识别,同时使用高效的运动检测模型进行活动分析。在 50-100 mW 的功率限制下运行,这些设备利用自适应占空比来最大化电池寿命,同时保持持续监控能力。这种本地处理方法允许每个节点独立分析和过滤捕获的图像,将原始图像数据从几兆字节减少到只有几千字节的紧凑洞察向量。

系统的分布式知识模式共享架构即使在连接限制的情况下也能实现节点之间的有效协作。相机陷阱使用低功耗无线电协议形成本地网状网络,共享处理后的洞察而不是原始数据。这种对等通信使得网络能够维持对监控区域内野生动物运动和潜在威胁的集体意识。当一个节点检测到显著活动,包括濒危物种的存在或偷猎的迹象时,这一信息通过网络传播,即使在没有直接连接到中央基础设施的地区也能实现协调响应。

当通过卫星或蜂窝链路获得周期性连接时,节点将它们积累的知识与云基础设施同步。此同步过程仔细平衡数据共享的需求与带宽限制,采用差异更新和压缩技术。云层随后应用更复杂的分析模型来理解整个监控区域的种群动态和运动模式。

野生动物洞察力的实现展示了分布式知识模式共享如何在具有挑战性的环境中保持系统有效性。通过在网络中分配处理和决策能力,系统确保在远程荒野部署的严格限制下进行持续监控和快速响应能力。这种方法对于保护工作特别有价值,它使得在大面积区域内进行实时野生动物监控和威胁检测成为可能,而这些区域通过集中式系统进行监控是不切实际的。

结构

分布式知识模式包含特定的架构组件,旨在实现去中心化的数据收集、处理和知识共享。该模式定义了三个主要结构元素:自主节点、通信网络和聚合机制。

图 19.5展示了分布式知识模式中的关键组件及其相互作用。单个节点(矩形形状)自主运行,通过定义的通信渠道共享见解。聚合层(菱形形状)结合分布式知识,并将其输入到分析层(椭圆形形状)进行处理。

图片

图 19.5:分布式知识架构:自主节点通过通信网络协作处理数据和共享见解,通过去中心化的知识聚合和分析,实现可扩展和适应性的 AI 系统。此模式将数据处理从集中式控制中解耦,促进弹性,并使系统能够有效地对动态环境和分布式数据源做出响应。

自主节点是该模式结构的基础。每个节点实现三个重要功能:数据采集、本地处理和知识共享。本地处理管道通常包括特征提取、基本推理和数据过滤机制。这种架构使节点能够独立运行,同时为网络的集体智慧做出贡献。

通信层为节点之间知识交换建立路径。该层实现了点对点协议以实现直接节点通信,以及用于聚合的分层协议。通信架构必须在带宽效率和信息完整性之间取得平衡,通常采用诸如差异更新和压缩知识共享等技术。

聚合和分析层提供了将分布式见解结合成理解的机制。这些层实现了更复杂的处理能力,同时保持对单个节点的反馈通道。通过这些通道,精细化的模型和更新的处理参数流回分布式组件,形成一个持续改进的循环。

这种结构组织确保了系统弹性,同时使分布式环境中的可扩展知识共享成为可能。该模式的架构专门解决了不可靠的基础设施和有限连接性的挑战,通过去中心化操作保持系统有效性。

现代改编

随着边缘计算、物联网(IoT)和去中心化数据网络等现代技术的兴起,分布式知识模式取得了显著进展。这些创新增强了利用此模式系统的可扩展性、效率和灵活性,使它们能够处理越来越复杂的数据集,并在更多样化和具有挑战性的环境中运行。

一个关键的适应策略是使用边缘计算。传统上,分布式系统依赖于将数据传输到集中式服务器进行分析。然而,随着边缘计算的出现,节点可以在本地执行更复杂的处理,减少对中央系统的依赖,并实现实时数据处理。这种适应策略在网络连接间歇或不稳定的情况下特别有影响。例如,在远程野生动物保护系统中,相机陷阱可以在本地处理图像,只有在恢复连接时才将相关见解,如猎人的检测,传输到中央枢纽。这减少了通过网络发送的原始数据量,并确保即使在基础设施有限的地方,系统也能保持运行。

另一个重要的发展是将机器学习集成到边缘。在传统的分布式系统中,机器学习模型通常是集中的,需要发送大量数据到云端进行处理。随着专为边缘设备设计的更小、更高效的机器学习模型的问世,这些模型现在可以直接部署在节点本身上(Grieco 等人 2014)。例如,低功耗设备如智能手机或物联网传感器可以运行轻量级模型,用于异常检测或图像分类等任务。这允许在源头进行更复杂的数据分析,从而实现更快决策并减少对中央云服务的依赖。

在网络通信方面,现代的网状网络和 5G 技术显著提高了节点之间数据共享的效率和速度。网状网络允许节点直接相互通信,形成一个自我修复和可扩展的网络。这种去中心化的通信方式确保即使某个节点或连接失败,网络仍然可以无缝运行。随着 5G 的到来,与分布式系统中的大规模数据传输传统上相关联的带宽和延迟问题得到了缓解,使得实时应用中的节点之间能够实现更快、更可靠的通信。

系统影响

分布式知识模式重塑了机器学习系统处理数据收集、模型训练和跨去中心化节点推理的方式。这些影响不仅超越了传统的分布式计算挑战,还包括模型架构、训练动态和推理优化的机器学习特定考虑。

模型架构设计需要针对分布式部署进行特定调整。模型必须构建成在节点级资源约束内有效运行,同时保持足够的复杂性以进行准确推理。这通常需要专门的架构,以支持增量学习和知识蒸馏。例如,神经网络架构可能实现模块化组件,可以根据局部计算资源选择性激活,通常在 1-5 MB 的内存约束内运行,同时保持 85-90%的集中式模型准确性。

在分布式知识模式系统中,训练动态变得尤其复杂。与集中式训练方法不同,这些系统必须实施在不可靠网络中有效运行的协作学习机制。联邦平均协议必须调整以处理节点间的非-IID(独立同分布)数据分布,同时保持收敛保证。训练程序还必须考虑节点间数据质量和数量的变化,实施反映数据可靠性和相关性的加权聚合方案。

在分布式环境中,推理优化提出了独特的挑战。模型必须根据本地资源可用性调整其推理策略,同时在整个网络中保持一致的输出质量。这通常需要实施动态批处理策略、自适应量化和选择性特征计算。系统通常在节点级别针对低于 100 毫秒的推理延迟,同时在严格的功率范围内(50-150 mW)运行。

在分布式知识模式系统中,模型生命周期管理变得更加复杂。版本控制必须处理跨不同节点运行的多模型变体,同时管理向前和向后兼容性。系统必须实施强大的更新机制,能够处理部分网络连接性,同时防止网络中的模型发散。

局限性

尽管分布式知识模式提供了许多优势,尤其是在去中心化、资源受限的环境中,但它也提出了几个挑战,尤其是在应用于机器学习系统时。这些挑战源于管理分布式节点的复杂性、确保数据一致性和解决去中心化系统约束的困难。

主要挑战之一是模型同步和一致性。在分布式系统中,每个节点可能使用自己版本的机器学习模型进行操作,这些模型是使用本地数据进行训练的。随着这些模型随时间更新,确保所有节点之间的一致性变得困难。如果没有仔细的同步,节点可能会使用过时的模型,导致系统整体性能的不一致。当节点间歇性连接或带宽有限时,实时同步所有节点的模型更新可能需要大量资源,并且容易产生延迟。

数据碎片化带来了另一个重大挑战。在分布式系统中,数据分散在各个节点上,每个节点只能访问整个数据集的一个子集。这种碎片化限制了机器学习模型的有效性,因为模型可能无法接触到训练所需的全部数据范围。从多个来源聚合数据并确保节点之间的兼容性既复杂又耗时。此外,处于离线模式或间歇性连接的节点可能在一段时间内无法访问数据,这进一步复杂了整个过程。

可扩展性也是分布式系统中的挑战之一。随着网络中节点数量的增加,生成的数据量以及管理系统的复杂性也随之增加。系统必须设计成能够处理这种增长,而不会压倒基础设施或降低性能。新节点的添加通常需要重新平衡数据、重新校准模型或引入新的协调机制,所有这些都会增加系统的复杂性。

延迟是分布式系统中的另一个问题。虽然数据在每个节点上本地处理,但实时决策通常需要汇总来自多个节点的见解。在节点之间共享数据和更新所需的时间,以及处理这些数据所需的时间,可能会引入系统响应的延迟。在如自主系统或灾害响应等应用中,这些延迟可能会削弱系统的有效性,因为通常需要立即采取行动。

在分布式系统中,安全和隐私问题更为突出。由于数据在节点之间传输或在多个设备上存储,确保数据完整性和保密性变得具有挑战性。系统必须采用强大的加密和身份验证机制来防止未授权访问或篡改敏感信息。这在涉及私人数据的应用中尤为重要,如医疗保健或金融系统。去中心化系统可能更容易受到攻击,例如 Sybil 攻击,其中对手将虚假节点引入网络。

尽管存在这些挑战,但有一些策略可以帮助缓解分布式知识模式的局限性。例如,联邦学习技术可以通过允许节点本地更新模型并仅共享更新而不是原始数据来解决模型同步问题。去中心化数据聚合方法可以通过允许节点在发送数据到更高层之前进行更多本地聚合来解决数据碎片化问题。同样,边缘计算可以通过在数据源附近处理数据来减少延迟,从而减少将信息传输到中央服务器所需的时间。

自适应资源

自适应资源模式侧重于使系统能够根据变化的资源可用性动态调整其操作,确保实时效率、可扩展性和弹性。该模式允许系统根据计算负载、网络带宽和存储容量等因素灵活分配资源。关键思想是系统应该能够根据它们在任何给定时间可访问的资源进行扩展或缩减。

自适应资源模式管理并非独立模式,通常集成在其他系统设计模式中。它通过允许系统在变化条件下高效运行来增强系统,确保无论资源波动如何,它们都能继续实现其目标。

图 19.6 以下展示了使用自适应资源模式的系统如何适应不同级别的资源可用性。系统根据当时可用的资源调整其操作,相应地优化其性能。

图片

图 19.6:资源适配:在资源受限的情况下,机器学习系统通过根据可用资源动态调整操作能力,从高资源下的全性能到低资源下的功能减少,优先保证核心功能。这种模式增强了系统的弹性,即使在计算或能源预算有限的情况下也能保持持续运行。

在图中,当系统在资源不足的情况下运行时,它会切换到简化操作,确保以最小资源使用量实现基本功能。随着资源的增加,系统调整到中等资源,允许更适度的操作和优化功能。当资源充足时,系统可以使用高资源,实现高级操作和全部功能,例如处理复杂数据或运行资源密集型任务。

反馈循环是该模式的重要组成部分,因为它确保了根据系统的资源条件进行持续调整。这种反馈使得系统能够实时重新校准和适应,根据需要调整资源以保持最佳性能。

案例研究

观察我们之前讨论的系统,很明显,这些系统可以从自适应资源模式分配中受益。在谷歌的洪水预测系统中,分层处理模式方法确保数据在适当的级别进行处理,从边缘传感器到基于云的分析。然而,自适应资源模式管理将允许该系统根据可用资源动态调整其操作。在基础设施有限地区,系统可以更依赖于边缘处理以减少对持续连接的需求,而在基础设施较好的地区,系统可以扩展并使用更多的基于云的处理能力。

类似地,PlantVillage Nuru 可以将自适应资源模式分配集成到其渐进式增强方法中。该应用程序旨在在各种环境中工作,从资源匮乏的农村地区到更发达的地区。在此背景下,自适应资源模式管理将帮助系统根据可用的设备和网络资源调整其处理复杂性,确保它提供有用的见解,而不会使系统或设备过载。

在野生动物洞察的案例中,自适应资源模式管理将补充分布式知识模式。现场相机陷阱本地处理数据,但当网络条件改善时,系统可以扩展以向中央系统传输更多数据进行深入分析。通过使用自适应技术,系统确保即使在有限的电源和网络连接性下,相机陷阱也能继续运行,并在资源允许进行更多计算努力时提供有价值的见解。

这些系统可以将自适应资源模式管理集成,根据可用资源动态调整,提高效率并确保在变化条件下持续运行。通过将自适应资源模式分配纳入其设计,这些系统即使在资源可用性波动的情况下也能保持响应性和可扩展性。在此背景下,自适应资源模式充当一个允许者,支持这些系统的操作并帮助它们适应实时环境的需求。

结构

自适应资源模式围绕根据不断变化的环境条件动态分配资源,例如网络带宽、计算能力或存储。这要求系统持续监控可用资源并根据其操作相应调整,以确保最佳性能和效率。

它围绕几个关键组件构建。首先,系统需要一个监控机制来持续评估资源的可用性。这可能包括检查网络带宽、CPU 利用率、内存使用或其他相关指标。一旦收集到这些指标,系统就可以确定适当的行动方案——它是否需要扩展、缩减或调整其操作以节省资源。

接下来,系统必须包括一个自适应的决策过程,该过程解释这些指标并决定如何动态地分配资源。在高资源环境中,系统可能会增加任务的复杂性,使用更强大的计算模型或增加并发进程的数量。相反,在低资源环境中,系统可能会缩减操作,降低模型的复杂性,或将一些任务转移到本地设备(如边缘处理)以减轻中央基础设施的负载。

这个结构的一个重要部分是反馈循环,它允许系统随着时间的推移调整其资源分配。在根据可用资源做出初步决策后,系统会监控结果并相应地调整。这个过程确保了即使在资源条件发生变化的情况下,系统也能持续有效地运行。反馈循环帮助系统微调其资源使用,随着它学会优化资源分配,从而实现更高效的运营。

根据特定任务的复杂性和资源需求,系统还可以组织成不同的层级或层。例如,需要高计算资源的任务,如训练机器学习模型或处理大数据集,可以由云层处理,而像数据收集或预处理这样的简单任务可以委托给边缘设备或本地节点。然后,系统可以根据可用资源调整分层结构,根据当前条件将更多任务分配到云端或边缘。

现代适应性

随着云计算、边缘计算和人工智能驱动的资源管理的发展,自适应资源模式已经发生了显著变化。这些创新增强了该模式的灵活性和可扩展性,使其能够更有效地适应日益复杂的环境。

最引人注目的现代适应策略之一是云计算的集成。像 AWS、Microsoft Azure 和 Google Cloud 这样的云平台能够根据需求动态分配资源,使得实时扩展应用程序变得更加容易。这种集成使得系统在资源可用时可以将密集处理任务卸载到云端,当需求减少或资源受限时,又回到更高效、本地化的解决方案。云计算提供的弹性使得系统能够执行重型计算任务,如机器学习模型训练或大数据处理,而无需本地基础设施。

在光谱的另一端,边缘计算已成为自适应资源模式的重要适应策略。在边缘计算中,数据在设备本地或网络边缘进行处理,减少了对于集中式服务器的依赖,并提高了实时响应能力。边缘设备,如物联网传感器或智能手机,通常在资源受限的环境中运行,而本地处理数据的能力使得有限资源的利用更加高效。通过将某些任务卸载到边缘,系统即使在资源匮乏的地区也能保持功能,同时确保当资源可用时,计算密集型任务被转移到云端。

AI 驱动的资源管理的兴起也改变了自适应系统的运作方式。AI 现在可以实时监控资源使用模式并预测未来的资源需求,使系统能够主动调整资源分配。例如,机器学习模型可以被训练来识别网络流量、处理能力或存储利用中的模式,使系统能够预测峰值使用时间并相应地准备资源。这种主动适应确保了系统可以平稳且不间断地处理需求波动,减少延迟并提高整体系统性能。

这些现代适应策略使得系统能够在适应本地条件的同时执行复杂任务。例如,在灾害响应系统中,救援队伍、医疗用品和通信工具等资源可以根据情况的变化动态分配。云计算允许大规模协调,而边缘计算确保即使在网络中断的情况下,也能在本地做出重要决策。通过集成 AI 驱动的资源管理,系统可以预测资源短缺或过剩,确保资源以最有效的方式分配。

这些现代适应策略使得自适应资源模式比以往任何时候都更加强大和灵活。通过利用云、边缘计算和 AI,系统可以在分布式环境中动态分配资源,确保它们在面对变化条件时保持可扩展性、效率和弹性。

系统影响

自适应资源模式对机器学习系统具有重大影响,尤其是在资源波动较大的环境中部署时,例如移动设备、边缘计算平台和分布式系统。机器学习工作负载可能非常密集,需要大量的计算能力、内存和存储。通过集成自适应资源模式分配,机器学习系统可以优化其性能,确保可扩展性,并在不同的资源条件下保持效率。

在分布式机器学习(例如联邦学习)的背景下,自适应资源模式确保系统适应设备间变化的计算能力。例如,在联邦学习中,模型是在许多边缘设备(如智能手机或物联网设备)上协作训练的,每个设备资源有限。自适应资源模式管理可以根据每个设备上的资源分配模型训练任务。计算能力更强的设备可以处理更重的负载,而资源有限的设备可以参与较轻的任务,例如本地模型更新或简单计算。这确保了所有设备都能参与学习过程,而不会过载。

自适应资源模式在机器学习系统中的另一个影响是其优化实时推理的能力。在自动驾驶汽车、医疗诊断和环境监测等应用中,机器学习模型需要根据可用数据做出实时决策。系统必须根据当时可用的资源动态调整其计算需求。例如,运行图像识别模型的自动驾驶汽车在计算资源受限或车辆处于资源受限区域(例如,网络连接较差的区域)时,可能会处理更简单、更不详细的帧。当计算资源更丰富时,例如在高速互联网的连接城市中,系统可以处理更详细的帧并应用更复杂的模型。

机器学习模型的自适应扩展在基于云的机器学习系统中也发挥着重要作用。在云环境中,自适应资源模式允许系统根据任务(如模型训练或批量推理)使用资源的数量进行扩展。当需要大规模数据处理或模型训练时,云服务可以动态分配资源以处理增加的负载。当需求减少时,资源会缩减以降低运营成本。这种动态扩展确保机器学习系统高效且经济地运行,避免过度配置或资源未充分利用。

驱动人工智能的资源管理正成为自适应机器学习系统的一个重要组成部分。人工智能技术,如强化学习或预测建模,可以实时优化资源分配。例如,强化学习算法根据历史使用模式预测未来的资源需求,使系统能够在需求激增之前预先分配资源。这种主动方法确保了当资源波动时,机器学习模型能够以最小的延迟进行训练,推理任务能够执行。

最后,边缘人工智能系统从自适应资源模式中受益匪浅。这些系统通常在资源高度可变的环境中运行,例如偏远地区、农村地区或网络连接断断续续的环境。该模式允许这些系统根据实时可用的资源调整其资源分配,确保即使在困难条件下,重要的任务,如模型推理或本地数据处理,也能继续进行。例如,部署在偏远地区的环境监测系统可能会在资源不足时运行更简单的模型或处理更详细的数据,而当网络可用时,将更复杂的分析卸载到云端。

局限性

自适应资源模式在实际应用中面临几个基本限制,尤其是在应用于资源可变的环境中的机器学习系统时。这些限制源于实时自适应的固有复杂性和在资源水平变化时维持系统性能的技术挑战。

性能可预测性是自适应系统中的一个主要挑战。虽然自适应允许系统在变化条件下继续运行,但它可能导致性能特征不一致。例如,当系统从高资源可用性(例如,从 8 GB 到 500 MB RAM)过渡到低资源可用性时,推理延迟可能会从 50 ms 增加到 200 ms。随着潜在资源状态的范围扩大,在保持最小服务质量要求的同时管理这些性能变化变得越来越复杂。

状态同步在自适应系统中引入了重大的技术障碍。随着资源的波动,在组件之间保持一致的系统状态变得具有挑战性。例如,当适应降低的网络带宽(从 50 Mbps 到 50 Kbps)时,系统必须管理部分更新并确保重要的状态信息保持同步。这种挑战在分布式机器学习系统中尤为突出,其中模型状态和推理结果必须在不同的资源条件下保持一致。

资源转换开销提出了另一个重大限制。适应不断变化资源条件会产生计算和时间成本。例如,在不同模型架构之间切换(从 50 MB 的全模型切换到 5 MB 的量化版本)需要 100-200 毫秒的转换时间。在这些转换期间,系统性能可能会暂时下降或变得不可预测。在资源频繁波动的环境中,这种开销变得成问题。

质量退化管理在机器学习应用中持续提出挑战。随着系统适应减少的资源,保持可接受的质量指标变得越来越困难。例如,当切换到轻量级架构时,模型精度可能会从 95%下降到 85%,而能耗必须保持在严格的限制内(通常为边缘设备的 50-150 mW)。在资源使用和输出质量之间找到可接受的权衡需要复杂的优化策略。

这些限制需要仔细的系统设计和实施策略。成功的部署通常实施健壮的监控系统、优雅降级机制以及针对不同资源状态的不同质量阈值。虽然这些挑战并不否定模式的效用,但它们强调了在自适应系统部署中全面规划和现实性能预期的必要性。

限制学习理论基础

上述设计模式源于区分资源受限部署与传统机器学习系统的理论约束。虽然这些模式提供了实际指导,但理解其理论基础使工程师能够做出基于原则的设计决策,并认识到何时针对特定情境调整或组合模式。

社会公益应用揭示了当前机器学习方法的局限性,资源限制暴露了理论学习需求与实际部署现实之间的差距。第八章(ch014.xhtml#sec-ai-training)中的传统训练方法以及第六章(ch012.xhtml#sec-data-engineering)中的数据工程实践假设了丰富的资源和可靠的基础设施。在这里,我们探讨当这些假设失败时,这些基础原则必须如何重新考虑。

数据稀缺条件下的统计学习

传统监督学习假设有大量的标记数据,通常每个类别需要 1000+个示例才能达到可接受的泛化性能。资源受限的环境挑战了这一假设,通常每个类别提供的示例少于 100 个,同时要求达到人类级别的学习效率。

少样本学习需求

在农业疾病检测等应用中,这一挑战变得具体。虽然商业作物监控系统在受控环境中训练数百万个标记图像,但农村部署必须使用每个疾病类别少于 50 个示例来识别疾病。这种训练数据减少 20 倍需要利用疾病类型之间的结构相似性,并从相关领域迁移知识。

当比较学习曲线时,理论差距变得明显。传统的深度学习方法需要指数级的数据扩展来实现准确性的线性提升,遵循幂律,其中准确性 ∝ (数据大小)^α,α通常为 0.1-0.3。资源受限的环境需要学习算法实现α ≥ 0.7,接近人类水平的样本效率,即单个示例可以推广到整个类别。

信息论界限

数学深度

本小节使用计算学习理论(PAC 学习界限)来形式化样本复杂度差距。对于不熟悉复杂度符号的读者,可以关注关键定量洞察:传统的学习理论需要比资源受限环境通常提供的训练示例多 100-1000 倍。理解具体的数学界限对于前面提出的模式设计不是必需的。

为了量化这些限制,PAC 学习理论为特定学习任务的最低样本复杂度提供了界限。对于社会公益应用,这些界限揭示了数据可用性、计算资源和泛化性能之间的权衡。考虑具有 k 种疾病的疾病检测,d 维特征空间和目标精度ε的情况:

  • 传统界限:O(k × d / ε²)个样本用于可靠的分类

  • 资源受限的现实:通常每个类别的可用样本少于 50 个

  • 差距幅度:理论与实践之间 100-1000 倍的差异

弥合这一差距需要利用问题域中额外结构的学习方法,例如:

  • 先验知识整合:将医学专业知识纳入假设空间以进行约束

  • 多任务学习:在相关疾病之间共享表示

  • 主动学习:战略性地选择有信息量的示例进行标记

无标记数据学习

建立在样本复杂度挑战的基础上,资源受限的环境尽管标记示例稀缺,但通常包含大量未标记数据。农村诊所每天生成数千张诊断图像,但专家标注仍然有限。自监督学习为从这些未标记数据中提取有用表示提供了理论框架。

对比学习理论

对比方法通过区分相似和不相似的示例来学习表示,而不需要显式标签。从系统工程的角度来看,这以几种方式影响部署架构。边缘设备可以在正常操作期间持续收集未标记数据,构建本地数据集,而无需昂贵的标注。然后,区域服务器可以对聚合的未标记数据进行对比预训练,创建边缘设备下载并使用其有限的标记示例进行微调的基础模型。

这种架构模式通过将样本复杂度降低 5-15 倍,与从头开始训练相比,减少了样本复杂度负担。对于一个作物监控系统,这意味着部署可以实现 87% 的疾病检测准确率,前提是每个疾病类别少于 50 个标记示例,并且它能够访问数千张未标记的现场图像。系统挑战成为在带宽和计算约束内管理这个两阶段管道——区域规模的未监督预训练随后是边缘规模的监督微调。

互信息界限

为了从理论上理解这些改进,信息论提供了未标记数据可以补偿有限标签限制的界限。输入 X 和标签 Y 之间的互信息 I(X;Y) 约束了任何学习算法所能达到的最大性能。自监督预训练通过学习能够捕获输入分布中与任务相关的结构的表示来增加有效互信息。

对于社会公益应用,这表明优先考虑以下领域的领域:

  • 未标记数据丰富(医疗图像,农业传感器)

  • 任务共享共同的潜在结构(相关疾病,相似的环境条件)

  • 领域专业知识可以指导表示学习(医学知识,农业实践)

通信和能量感知学习

超越数据可用性到优化挑战,传统的优化理论假设有充足的计算资源,并专注于收敛率到全局最优。资源受限的环境需要在严格的内存、计算和能源预算下进行优化,这从根本上改变了理论分析。

带宽限制下的联邦学习

这些环境中的一个主要约束涉及分布式学习,其中通信瓶颈主导计算成本。考虑具有 n 个边缘设备的联邦学习,每个边缘设备都有本地数据集 Di 和模型参数 θi:

  • 通信成本:每轮 O(n × 模型大小)

  • 计算成本:O(局部迭代 × 梯度计算)

  • 典型约束:通信成本 >> 计算成本

这种对传统假设的颠覆需要新的理论框架,其中通信效率成为主要的优化目标。梯度压缩、稀疏更新和本地模型个性化作为理论上有动机的解决方案出现,而不是工程优化。

能量感知学习理论

电池供电的部署引入了传统学习理论中不存在的能量约束。每次模型评估都会消耗可测量的能量,在准确性和运行寿命之间产生权衡。理论框架必须将能量预算作为一级约束:

  • 每推理一次的能量消耗:E_inf = α × 模型大小 + β × 计算时间

  • 电池寿命:T_battery = E_total / (推理率 × E_inf + E_idle)

  • 优化目标:在 T_battery ≥ 部署要求的前提下,最大化准确性

这导致了能量感知学习算法,这些算法明确地以牺牲准确性换取长期性,使用自适应模型大小、轮询和分层处理等技术,在能量预算内运行。

这些理论基础为本章前面提出的模式设计提供了科学依据。通过这一分析揭示的三个核心约束——通信瓶颈、样本稀缺和能量限制——直接推动了分层处理、渐进增强、分布式知识和自适应资源模式等架构方法。理解这些数学原理使工程师能够根据特定的部署环境,做出有根据的模式的调整和组合。

常见部署失败和社会技术陷阱

虽然技术约束主导了本章讨论的工程挑战,但社会技术部署陷阱往往决定了 AI 在社会公益倡议中的最终成功或失败。这些陷阱源于技术系统和社交背景的交汇,在那里工程假设与社区现实、部署环境和组织动态发生冲突。

理解这些常见的谬误使开发团队能够预见并减轻传统软件工程流程可能未暴露的风险。这里提出的陷阱补充了之前探讨的技术约束,突出了即使技术实现根据工程指标成功,也可能发生的失败模式。

性能指标与实际影响

技术性能指标直接转化为现实世界影响的假设可能是 AI 在社会公益部署中最普遍的谬误。开发团队通常只专注于优化准确性、延迟和吞吐量,而忽略了决定实际采用和有效性的社会技术因素。

考虑一个在实验室条件下达到 95%准确率的医疗诊断系统。这种令人印象深刻的性能可能在需要持续互联网连接的不稳定网络地区、假设的识字水平超过社区规范或产生当地从业者不熟悉的语言输出的地区变得无关紧要。95%的准确率指标捕捉了技术能力,但无法提供有关社区是否会采用、信任或从技术中受益的任何见解。

这种谬误体现在几个常见的部署错误中。设计时采用西方用户交互模式的系统可能在技术素养不同、权威和决策文化规范不同或问题解决方法不同的社区中完全失败。假设个体土地所有权的农业监控系统可能在实行集体耕作的社区中毫无用处。围绕个体学习设计的教育平台可能与协作学习的传统相冲突。

基本错误在于将技术优化与结果优化混淆。技术指标衡量系统在受控条件下的行为,而社会影响则取决于技术、用户、社区和现有制度结构之间的复杂互动。成功的部署需要从最早的设计阶段就明确考虑采用障碍、文化整合挑战以及与社区优先事项的一致性。

基础设施的基本依赖性

即使是专门为资源受限环境设计的系统,也常常包含关于基本基础设施可用性的隐藏假设,这些假设在实际部署环境中往往是不正确的。这些假设通常涉及网络连接性、电力可靠性、设备维护能力以及技术支持的可获得性。

网络连接性的假设代表了最常见的基础设施陷阱。为“离线优先”操作设计的系统通常仍然需要定期连接进行更新、同步或远程监控。农村部署可能会遇到持续数周的断网情况,卫星连接可能过于昂贵,而移动网络可能只为某些运营商或时间段提供覆盖。如果连接仅每周或每月发生一次,则需要每日同步的系统将变得毫无用处。

电力基础设施的假设同样会导致部署失败。太阳能充电系统在理论上运行良好,但必须考虑到季节变化、天气模式、面板上的灰尘积累、电池退化以及组件盗窃。一个围绕每天 6 小时日照时间设计的系统可能在持续 3-4 个月的雨季中完全失败。基于实验室条件的电池寿命计算,在考虑到温度极端、充电周期变化和用户行为模式时可能会过于乐观。

维护和支持基础设施的假设通常对长期可持续性最为关键。需要软件更新、硬件更换或技术故障排除的系统必须考虑当地技术能力、供应链可靠性和前往偏远地点的距离。如果当地没有可用的替换电池,且运费超过系统价值,那么需要每年更换电池的传感器网络将变得不可持续。

这些基础设施陷阱需要全面的部署环境分析,这超出了初始技术要求,以检查长期运营的现实。成功的系统通常包括冗余、优雅降级和基于社区的维护方法,这些方法减少了对外部基础设施的依赖。

低估社会融合复杂性

技术团队经常低估社区参与的复杂性,将其视为一个实现细节,而不是塑造系统架构和部署策略的核心设计约束。这种过度简化导致系统可能在技术上运行良好,但无法有意义地融入社区实践和决策过程中。

利益相关者识别代表了一个常见的过度简化错误。开发团队通常与明显的社区代表(诊所主任、学校校长、农业推广员)合作,而忽视了不那么明显但同样重要的利益相关者。传统领袖、妇女团体、青年组织和非正式社区网络可能在技术采用方面具有重大影响力。如果设计讨论中没有包括处理大多数农村分娩的传统助产士,那么与诊所工作人员协商设计的孕产妇健康监测系统可能会失败。

文化能力假设创造了另一个常见的参与陷阱。技术团队可能假设西方发展范式、个人主义决策模型或线性问题解决方法得到普遍接受。社区可能优先考虑集体共识而不是快速部署,更喜欢传统知识体系而不是数据驱动的见解,或者需要与精神或仪式实践相结合。围绕个人成就设计的教育技术可能与强调协作学习和共享成功的社区发生冲突。

权力动态和同意过程通常未得到专注于功能要求的技术团队的足够关注。社区可能会感受到接受外部组织干预的压力,尤其是当系统附带资金或资源时。开发阶段表面的热情可能掩盖了对数据所有权、文化适宜性或长期可持续性的担忧。真正的知情同意需要理解社区决策过程,确保有意义的选择,并建立明确的数据治理协议。

社区参与要求范围通常超过技术团队预期的。有效的参与可能需要数月的关系建立,多次社区会议,翻译成当地语言,适应当地沟通规范,并在开发和部署过程中持续咨询。这些要求对项目时间表、预算和技术架构有直接影响,这些架构必须适应不断变化的社区优先事项。

避免提取性技术关系

社会公益的 AI 倡议可能无意中持续了提取关系,其中社区提供数据和劳动力,而外部组织获取价值和控制系统演变。这些动态代表了严重的伦理陷阱,对社区自主权和科技正义具有长期影响。

当系统收集敏感社区信息时,数据所有权和治理问题经常出现。医疗监控产生亲密的医疗数据,农业传感器捕获具有经济影响的生产信息,而教育平台跟踪学习进度和家庭情况。如果没有明确的社区数据主权框架,这些信息可能会被用于超出原始社会公益应用的目的,与第三方共享,或由技术提供商货币化。

人工智能系统的技术架构可以通过集中数据处理、外部模型训练和专有算法嵌入提取关系。社区通过参与系统生成数据,但算法改进、模型优化和系统增强发生在由技术组织控制的外部开发环境中。这种安排为技术提供商创造了价值,而社区仍然依赖于外部专业知识进行系统维护和演变。

能力建设代表另一个潜在的提取维度。社会公益项目通常涉及培训社区成员使用和维护技术系统。然而,这种培训可能过于狭隘地关注系统操作,而不是更广泛的技术能力发展。社区成员学会收集数据和进行基本维护,而算法开发、系统架构决策和数据分析能力仍然集中在外部组织。

本地经济影响需要仔细考虑,以避免提取性结果。人工智能系统可能会取代本地专业知识,减少对传统服务的需求,或将经济活动导向外部技术提供商。农业监控系统可能会减少对本地农业推广人员的需求,教育技术可能会减少当地教师的工作,或健康监控系统可能会将资源从社区健康工作者那里转移。

解决提取潜力问题需要有意设计以实现社区所有权、本地能力建设和经济可持续性。技术架构应支持本地数据处理、透明算法和社区控制的系统演进。经济模型应确保价值捕获直接惠及社区,而不是主要流向外部技术组织。

短期成功与长期可行性

许多旨在社会公益的人工智能项目由于主要关注初始部署的成功而缺乏对长期可行性的规划,表现出短视的可持续性。这种短期视角导致系统可能取得令人印象深刻的早期成果,但未能建立可持续的运营、维护和演进路径。

技术可持续性挑战不仅限于本章讨论的电力和资源限制。软件维护、安全更新和与不断发展的硬件平台的兼容性需要持续的技术专业知识和资源。开源软件依赖项可能引入漏洞,发生破坏性变化,或失去维护者的支持。云服务可能会改变定价模式,停止 API 服务,或以影响系统可行性的方式修改服务条款。

财务可持续性规划在开发阶段往往受到忽视。赠款资金可能覆盖初始开发和部署成本,但为持续运营提供的资源不足。在资源受限的环境中,目标社区支付服务的能力有限,收入生成策略可能不切实际。成本回收模型可能与社会公益目标相冲突或为最脆弱群体创造进入障碍。

组织可持续性代表了一个同样关键的挑战。社会公益项目通常依赖于特定的个人、研究小组或非营利组织来提供技术领导和制度支持。学术研究周期、资金更新和人员变动可能会对项目连续性产生重大影响。没有稳健的治理结构和继任计划,技术成功系统可能在关键人员离职或资金优先级转移时崩溃。

社区所有权和地方能力发展决定了系统是否能够随着时间的推移发展和适应不断变化的需求。对外部依赖系统维护、功能开发和问题解决创造了可能在初始部署阶段不明显的不稳定性。建立地方技术能力需要大量投资于培训、文档和知识转移,这通常超出了开发团队的预期。

对于已经经历气候变化影响的地区部署的系统,环境可持续性考虑尤为重要。电子废物管理、硬件组件中稀土矿物的提取以及云计算产生的碳排放可能与环境正义目标相冲突。生命周期评估应考虑在电子废物基础设施有限的地区处理报废产品的挑战。

这些可持续性陷阱需要全面的规划,这种规划不仅限于技术实施,还要解决整个系统生命周期中的财务可行性、组织连续性、社区所有权和环境影响问题。

摘要

用于社会公益的人工智能代表了机器学习技术最具挑战性但最有回报的应用之一,它需要系统在严重资源限制下有效运行,同时为服务不足的社区带来有意义的冲击。构建具有社会影响的人工智能是信任度的终极考验。这些系统必须对其服务的社区负责(第十七章),在易受攻击的环境中防止滥用(第十五章),足够强大(第十六章)以应对不可预测的现实世界条件,并且足够可持续(第十八章),能够在有限的资源上运行多年。本章中提出的模式设计本质上是在约束下的信任架构。

这些环境提出了独特的工程挑战,包括有限的电力、不可靠的连接、稀少的数据可用性和多样的用户环境,这些都需要对系统设计采取创新的方法。成功需要超越传统的部署模式,创建适应性强、弹性好的系统,这些系统专门为高影响、资源有限的情况而设计。

系统性设计模式为解决社会影响应用中固有的复杂性提供了结构化方法。分层处理能够在资源受限的情况下实现优雅降级。渐进式增强使系统能够根据可用资源调整功能。分布式知识促进了异构设备和网络之间的协调。自适应资源管理在变化的操作条件下优化性能。这些模式共同工作,创建出在多样化的部署环境中保持有效性的稳健系统,同时确保可持续性和可扩展性。

关键要点

  • 用于社会公益的人工智能需要专门的工程方法,以解决严重的资源限制和多样化的操作环境

  • 设计模式为构建弹性系统提供了系统框架:分层处理、渐进式增强、分布式知识和自适应资源管理

  • 实施成功取决于对部署环境、资源可用性和特定社区需求的全面分析

  • 系统必须在整个计算范围内平衡技术性能、可访问性、可持续性和现实世界影响

从农业监测到医疗保健提供等现实世界应用中的证据展示了在资源受限环境中部署人工智能的变革潜力以及实际挑战。这些实施揭示了上下文感知设计、社区参与和持续适应当地条件的重要性。随着边缘计算、联邦学习和自适应架构等技术能力的提升,通过人工智能系统创造有意义的社会影响的机会持续扩大,需要持续关注工程卓越和社会责任。

展望未来

本章重点介绍了在严重资源限制下部署现有的机器学习能力,将限制视为需要克服的部署挑战。然而,这里开发出的模式和技巧(高效架构、联邦学习、边缘处理、自适应计算)不仅代表了为服务不足的环境提供的专业解决方案。它们还预览了所有机器学习系统设计方式的转变,随着隐私问题、能源成本和可持续性要求的提高,资源意识从利基考虑转变为普遍必要。

通过社会公益应用发展起来的约束优先思维为下一部分探讨的新兴研究方向奠定了基础。本章询问“如何在约束条件下部署现有的机器学习(ML)?”,接下来的章节则提出“在将约束视为常态的前提下,我们如何重新构想机器学习系统?”这种从约束适应到约束原生设计的转变代表了机器学习系统研究的最前沿,其影响远远超出社会影响应用,重塑了整个领域。


AGI 系统

DALL·E 3 提示:一幅描绘从当前机器学习系统到通用人工智能(AGI)演变的未来派可视化图像。该图像展示了一个技术可视化,有三个不同的区域:在前景,熟悉的机器学习组件,如神经网络、GPU 和数据管道;在中景,新兴的系统,如大型语言模型和多智能体架构形成相互连接的星座;在背景,一个发光的地平线暗示着 AGI。场景使用从前景的混凝土技术蓝绿色渐变到地平线的抽象金色和白色光线。电路图案和数据流连接所有元素,展示了今天的构建块如何演变成明天的智能。这种风格既技术又充满希望,适合高级教科书。

图片

目的

为什么机器学习系统从业者必须理解新兴趋势并预见技术演变,而不是仅仅掌握当前的实施情况?

机器学习系统运行在一个快速发展的技术环境中,昨天的尖端方法可能成为明天的过时系统,这要求从业者能够预见并适应快速的变化。与成熟的工程学科不同,机器学习系统面临着来自算法突破、硬件进步和不断变化的计算范式对系统架构要求的持续颠覆。理解新兴趋势使工程师能够做出前瞻性的设计决策,延长系统寿命,避免技术死胡同,并为未来的能力定位基础设施。随着组织在预计将运行多年且底层技术持续快速发展的机器学习系统上大量投资,这种预见性思维变得至关重要。研究前沿发展有助于从业者发展必要的战略思维,以构建适应性系统,评估新兴技术与当前实施情况,并就何时以及如何将创新纳入生产环境做出明智的决策。

学习目标

  • 定义通用人工智能(AGI)并区分它和窄人工智能,通过领域普遍性、知识迁移和持续学习能力

  • 分析当前人工智能限制(缺乏因果推理、持久记忆和跨领域迁移)如何限制向 AGI 的进步

  • 比较竞争的 AGI 范式(规模假设、神经符号方法、具身智能、多智能体系统)并评估它们的工程权衡

  • 设计复合人工智能系统架构,集成专用组件以增强超越单体模型的能力

  • 评估新兴的架构范式(状态空间模型、基于能量的模型、神经形态计算)克服 Transformer 限制的潜力

  • 评估高级训练方法(RLHF、宪法 AI、持续学习)以开发对齐和自适应的复合系统

  • 确定 AGI 发展的关键技术障碍,包括上下文限制、能源约束、推理能力和对齐挑战

  • 综合优化、硬件加速和运营方面的基础设施需求,以适应 AGI 规模系统

从专用人工智能到通用智能

当被要求规划一个复杂的多日项目时,ChatGPT 生成听起来合理的计划,但往往包含逻辑错误 1。当要求回忆先前的对话细节时,由于缺乏持久记忆而失败。当需要通过第一性原理推理解释为什么某个解决方案有效时,它重现了学习到的模式,而不是展示真正的理解。这些失败不仅仅是简单的错误,而是根本性的架构限制。当代模型缺乏持久记忆、因果推理和规划能力,这些正是定义通用智能的属性。

探索从今天的专用系统到明天的通用人工智能(AGI)的工程路线图,我们将它视为一个复杂的系统集成挑战。虽然当代大规模系统在自然语言理解到多模态推理等多个领域展示了能力,但它们仍然受限于其架构。机器学习系统领域已经达到一个关键转折点,工程原则的汇聚使我们能够展望超越这些限制的系统,需要新的理论框架和工程方法。

本章通过本教科书建立的系统工程原则的视角,考察了从当代专用系统向人工智能的轨迹。中心论点认为,通用人工智能主要构成一个系统集成挑战,而不是算法突破,需要协调异构计算组件、自适应内存架构和跨任意领域无特定任务优化的持续学习机制。

分析沿着三个相互关联的研究方向进行,这些方向定义了当代智能系统的前沿。首先,我们研究通用人工智能作为一个系统集成问题,探讨当前在因果推理、知识融合和跨领域迁移中的局限性如何制约向领域通用智能的进步。其次,我们分析复合人工智能系统作为超越单体模型限制的实用架构,通过协调专用组件提供通往增强能力的直接途径。第三,我们探索包括基于能量的模型、状态空间架构和神经形态计算等新兴计算范式,这些范式承诺不同的学习和推理方法。

这些发展对机器学习系统工程的每个领域都产生了深远的影响。数据工程必须适应多模态、流式和合成生成内容,其规模挑战现有的管道架构。训练基础设施需要协调异构的计算基础,结合符号和统计学习范式。模型优化必须在保持涌现能力的同时,确保部署在多样化的硬件配置中。操作系统必须在能力接近甚至可能超过人类认知性能时,保持可靠性、安全性和对齐属性。

这些前沿的重要性不仅超越了技术考虑,还包括对设计旨在在长期时间尺度上运行的系统的实践者的战略影响。关于数据表示、计算资源分配和系统模块化的当代架构决策将决定通用人工智能是通过渐进式进步还是需要范式转变而出现。指导这些选择的工程原则将塑造人工智能发展的轨迹及其与人类认知系统的集成。

而不是参与推测性的未来主义,本章将分析建立在系统扩展现有工程方法论的基础上。通往通用人工智能的道路是通过系统思维的纪律性应用、已验证技术的规模化集成以及对复杂组件交互产生的涌现行为的细致关注而出现的。这种方法将通用人工智能定位为一个可实现的工程目标,它逐步建立在现有能力之上,同时认识到超越狭窄领域专业化的定性挑战。

定义 AGI:将智能视为一个系统问题

通用人工智能(AGI)代表的是通过领域通用性知识迁移持续学习,在所有领域与人类认知能力相匹配的计算系统,而不是在狭窄的任务特定应用中表现出色。

通用人工智能(AGI)的出现主要是一个系统工程挑战。虽然 ChatGPT 和 Claude 在语言领域表现出强大的能力,而专业系统在象棋和国际象棋中击败了世界冠军,但真正的 AGI 需要将感知、推理、规划和行动整合到没有边界的架构中 2。

考虑人类智能背后的认知架构。大脑通过分层集成协调专门的子系统:感觉皮层处理多模态输入,海马体巩固情景记忆,前额叶皮层协调执行控制,小脑细化运动预测。每个子系统以不同的计算原理运行,但它们无缝结合,产生统一的行为。这个生物蓝图表明,AGI 不会从扩展单个架构中产生,而是从协调专门的组件中产生,这正是我们在本章中探讨的复合系统方法。

当前系统在模式匹配方面表现出色,但缺乏因果理解。当 ChatGPT 解决物理问题时,它利用训练数据中的统计相关性,而不是建模物理定律。当 DALL-E 生成图像时,它结合了学习到的视觉模式,但没有理解三维结构或光照物理。这些局限性源于架构约束:变压器通过优化于序列建模的注意力机制处理信息,而不是因果推理或空间理解。

基于能量的模型提供了一个可以弥合这一差距的替代框架,它提供了一种通过优化驱动的推理,模仿生物系统通过能量最小化解决问题的方式(详见第 20.5.2 节)。这些系统不是预测最可能的下一个标记,而是找到最小化全局能量函数的配置,这可能使真正关于因果关系的推理成为可能。

从今天的专业系统到明天的通用智能之路,需要在本书涵盖的每个领域取得进展:分布式训练(第八章)必须协调异构架构,硬件加速(第十一章)必须支持不同的计算模式,以及数据工程(第六章)必须综合因果训练示例。最重要的是,第二章的集成原则必须演变,以协调不同的表示框架。

当代 AGI 研究分为四个相互竞争的范例,每个范例都对以下问题提供不同的答案:哪种计算方法将实现通用人工智能?这些范例不仅代表了学术辩论,还暗示了截然不同的工程路径、资源需求和时间预期。

缩放假设

缩放假设,由 OpenAI 和 Anthropic 倡导,认为 AGI 将通过持续缩放 Transformer 架构而出现(Kaplan et al. 2020)。这种方法从观察到的缩放定律外推,这些定律揭示了模型性能与三个关键因素之间的稳定、可预测的关系:参数数量 N、数据集大小 D 和计算预算 C。经验上,测试损失遵循幂律关系:对于参数,L(N) ∝ N^(-α),对于数据,L(D) ∝ D^(-β),对于计算,L(C) ∝ C^(-γ),其中α ≈ 0.076,β ≈ 0.095,γ ≈ 0.050 (Kaplan et al. 2020)。这些平滑、可预测的曲线表明,参数数量每增加 10 倍,就能在从语言理解到推理和代码生成等不同任务中带来可测量的能力提升。

最近的发展已经将缩放假设从训练时间的计算扩展到推理时间的计算。OpenAI 的 o1 和 o3 推理模型表明,通过显式的思维链推理和解决方案路径的搜索,允许模型在推理过程中“思考更长”可以显著提高复杂推理任务的表现。这表明一个新的缩放维度:与其仅仅投资于更大的模型,不如将计算分配给扩展的推理,使模型能够处理需要多步推理、规划和自我验证的问题。系统的影响是显著的,因为推理时间的缩放需要与训练时间的缩放不同的基础设施优化。

当将外推扩展到通用人工智能(AGI)规模时,这种外推变得引人注目。如果这些缩放定律持续存在,AGI 的训练将需要大约 2.5 × 10²⁶浮点运算(FLOPs)3,这比 GPT-4 的估计计算预算增加了 250 倍。这不仅仅代表数量的缩放,更是一种质的赌注:足够的规模将诱导出当前模型所缺乏的如稳健推理、规划和知识整合等涌现能力。

这样的规模需要数据中心协调(第八章)和更高的硬件利用率(第十一章),以使训练在经济上可行。巨大的规模推动了摩尔定律之后的架构探索:3D 芯片堆叠以实现更高的晶体管密度,光互连以减少通信开销,以及在内存中处理以最小化数据移动。

混合神经符号架构

尽管规模假设面临一个关键挑战:当前变压器在相关性方面表现出色,但在因果关系方面却力不从心。当 ChatGPT 解释为什么飞机能飞时,它只是从训练数据中复制模式,而不是理解空气动力学原理。这种局限性促使第二个范式产生。

混合神经符号系统结合了用于感知和模式识别的神经网络与用于推理和规划的符号引擎。这种方法认为纯粹的规模扩展无法实现通用人工智能(AGI),因为统计学习与逻辑推理不同(Marcus 2020)。在神经网络擅长于高维空间中的模式匹配时,符号系统通过显式规则操作提供可验证的逻辑推理、约束满足和因果推理。

AlphaGeometry (Trinh et al. 2024) 通过互补优势体现了这种整合。神经网络部分,一个在 1 亿个合成几何问题上训练的变压器,学会了提出有希望的构建步骤(添加辅助线、识别相似三角形),这些步骤将有助于证明。符号部分,一个实现经典几何公理的演绎引擎,严格验证每个建议的步骤并系统地探索逻辑后果。这种劳动分工反映了人类的数学推理:直觉提出有希望的方向,而形式逻辑验证正确性。该系统解决了 30 个国际数学奥林匹克几何问题中的 25 个,其表现与平均金牌得主相当,同时产生了通过符号规则可验证的人类可读证明。

工程神经符号系统需要调和两种计算范式。神经网络部分在通过梯度下降优化的连续表示上操作,而符号部分通过逻辑推理操作离散符号。整合挑战跨越多个层面:表示对齐(向量嵌入与符号结构之间的映射)、计算协调(在基于 GPU 优化的神经网络操作与基于 CPU 的符号推理之间进行调度)和学习同步(通过非可微分的符号操作进行反向传播)。第七章中的框架基础设施必须发展以支持这些异构计算在统一的训练循环中。

具身智能

规模和神经符号方法都假设智能可以从不具身的计算中产生。第三个范式挑战了这个假设,认为真正的智能需要在世界中具有物理基础。这种观点源于机器人研究,观察到即使是简单的昆虫在复杂地形中导航也表现出纯符号推理难以复制的行为,这表明感觉运动耦合为智能提供了基本支撑。

具身智能范式,根植于 Brooks 的吸收架构(Brooks 1986)和 Pfeifer 的形态计算(Pfeifer 和 Bongard 2006),主张智能需要通过连续的感知-动作循环进行传感器-运动定位。这种观点认为,抽象推理是从物理交互中产生的,而不是从无身体的计算中产生的。考虑人类如何通过举起物体而不是通过口头定义来学习“重”,通过具身交互发展直观物理学。语言模型可以背诵“石头比羽毛重”,但没有通过传感器-运动体验理解重量,这可能会限制它们对物理场景的推理。

RT-2(机器人变压器 2)(Brohan 等人 2023)通过视觉-语言-动作模型展示了弥合这一差距的早期进展。通过在包含数百万个机器人轨迹的机器人操作数据集上微调 PaLM-E,一个 562B 参数的视觉-语言模型,RT-2 在新型任务上实现了 62%的成功率,而仅视觉基线为 32%。关键的是,它将互联网规模的知识转移到物理任务中:当展示一张灭绝动物的图片并要求“拿起灭绝动物”时,它正确地识别并抓起了一个玩具恐龙,展示了基于物理能力的语义理解。该架构通过视觉编码器处理图像,与语言指令连接,并输出离散的机器人动作(关节位置,夹爪状态),控制系统执行这些动作。从像素到动作的端到端学习代表了从传统机器人管道中分离感知、规划和控制为不同模块的一种转变。

具身系统面临独特的工程约束,这在纯数字智能中是不存在的,从而形成了一个具有挑战性的设计空间。实时控制回路要求在 100 毫秒以下的推理延迟,以实现稳定的操作,需要从第十四章在设备上部署,而不是在云端进行推理,因为网络往返延迟本身就超过了控制预算。控制层次在多个时间尺度上运行:高级任务规划(10-100 赫兹,“抓住杯子”),中级运动规划(100-1000 赫兹,轨迹生成),以及低级控制(1000+赫兹,带有本体感觉反馈的电机命令)。每一层必须在它的周期时间内完成推理,同时保持安全约束,以防止自碰撞、工作空间违规或可能损坏物体或伤害人类的过度力量。

功率限制与数据中心系统相比施加了严重的限制。一个移动机器人的总功率预算为 100-500 瓦(电池、执行器、传感器、计算)与数据中心仅用于模型推理的兆瓦相比。波士顿动力学的 Atlas 类人机器人将大约 1 千瓦用于液压执行,100-200 瓦用于机载计算,迫使模型压缩和高效架构。这推动了神经形态计算的兴趣:英特尔的 Loihi(Mike Davies 等人 2018)在 1000 倍低于 GPU 的功率下处理视觉注意力任务,使其适用于电池供电系统。功率性能权衡变得至关重要:以 10 赫兹的频率运行 7B 参数模型进行实时推理,在移动 GPU 上需要 50-100 瓦,消耗大量电池容量,将操作时间从小时减少到分钟。

安全关键操作需要超出纯学习系统统计保证的正式验证方法。当特斯拉的全自动驾驶在公共道路上运行或手术机器人操作接近生命器官时,概率性的“大多数时候可能是安全的”证明是不够的。具身 AGI 需要经过认证的行为:系统可以进入的状态的可证明界限,紧急停止的保证响应时间,以及当基于学习的组件失败时的验证回退行为。这促使混合架构结合了用于正常操作的学习策略和硬编码的安全控制器,后者在异常检测时激活,并通过形式方法验证,证明组合系统满足安全规范。随着学习的进行,验证挑战加剧:从经验中持续的适应必须保持安全属性,即使策略在演变。

这些限制虽然令人畏惧,但可能对 AGI(通用人工智能)的发展有利。生物智能在类似的限制下进化,通过感觉运动基础实现了显著的效率。高效的 AGI 可能从资源受限的具身系统中产生,而不是数据中心规模的模式,物理交互提供了必要的归纳偏差,以实现样本高效的学习。具身假设表明,智能从根本上源于在资源受限的环境中行动的智能体,这使得具身方法不仅是通往 AGI 的一条路径,而且可能是任何真正通用智能的必要组成部分。对于复合系统,这表明需要整合处理物理推理的具身组件,即使在以数字架构为主的情况下,也要将抽象概念扎根于感觉运动经验中。

多智能体系统和涌现智能

第四范式挑战了智能必须存在于单一实体中的假设。多智能体方法认为,通用人工智能将来自多个专业智能体之间的交互,每个智能体都有独特的功能,在共享环境中操作。这种观点从生物系统中汲取灵感,例如蚂蚁群体、蜂巢和人类社会展示了超越个体能力的集体智慧。没有一只蚂蚁能理解群体的建筑计划,但协调的局部互动产生了复杂的巢穴结构。

OpenAI 的捉迷藏智能体(Baker 等人,2019)展示了竞争如何在没有明确编程的情况下驱动涌现的复杂性。隐藏智能体学会了使用可移动的方块建造堡垒,促使寻找智能体发现工具的使用,推动箱子爬墙。这引发了一场军备竞赛:隐藏智能体学会了将工具锁起来,寻找智能体学会了利用物理漏洞。每种能力纯粹是从竞争压力中产生的,而不是人类的指定,这表明多智能体交互可以启动越来越复杂的行为,朝着通用智能发展。

从系统工程的角度来看,多智能体通用人工智能引入了类似于分布式计算但具有根本差异的挑战。就像分布式系统一样,多智能体架构需要健壮的通信协议、共识机制和容错性,如第十三章所述。第十三章。然而,与传统分布式系统协调执行预定算法的相同节点不同,通用人工智能智能体必须协调异构推理过程,解决冲突的世界模型,并使不同的目标保持一致。像 AutoGPT(Richards 等人,2023)这样的项目展示了早期自主智能体的能力,通过协调网络搜索、代码执行和工具使用来完成复杂任务,尽管当前的实施仍然受到上下文窗口限制和多步骤计划中错误累积的限制。

这四种范式(扩展、神经符号、具身和多智能体)并不需要相互排斥。实际上,最有前景的发展道路可能结合了每个范式的见解:将大量计算资源应用于混合架构,将抽象推理建立在物理或模拟具身之上,同时多个专业智能体协调解决复杂问题。这种融合指向了复合人工智能系统,这是一个可以将这些范式统一到实际应用中的架构框架。

复合人工智能系统框架

向通用人工智能(AGI)的轨迹倾向于“复合人工智能系统”(Zaharia 等人 2024):多个专业组件协同工作而不是单一模型。这种架构范式代表了理解今天的基本构建块如何组装成明天智能系统的组织原则。

现代人工智能助手已经展示了这种复合架构。ChatGPT 集成了用于文本生成的语言模型、用于计算的代码解释器、用于获取当前信息的网络搜索以及用于图像创建的 DALL-E。每个组件在其专业任务上表现出色,而中央协调器通过多种机制协调它们的交互:意图分类根据用户查询确定要激活哪些组件,结果聚合将多个组件的输出组合成连贯的响应,错误处理将失败的运算路由到替代组件或触发用户澄清。

在分析股市趋势时,协调通过多个阶段展开。首先,语言模型解析用户请求以提取关键信息(股票代码、时间范围、分析类型)。其次,它生成 API 调用以网络搜索获取当前价格并检索相关财经新闻。第三,代码解释器接收这些数据并通过 Python 脚本执行统计分析,计算移动平均数、波动性指标或相关性分析。第四,语言模型将这些定量结果与上下文信息综合成自然语言解释。第五,如果用户请求可视化,系统将路由到代码生成以生成 matplotlib 图表。这种协调实现了单个组件无法产生的结果:网络搜索缺乏分析能力,代码执行无法解释结果,而语言模型单独无法访问实时数据。

组织类比阐明了这种架构。一个单一、统一的 AGI 类似于试图让一个人在企业内部执行所有职能:战略、会计、营销、工程和法律工作。这种方法既无法扩展,也无法提供专业化的专业知识。复合人工智能系统类似于一个结构良好的组织,有一个首席执行官(协调器)制定战略并委派任务。专业部门处理不同的职能:研究图书馆管理知识检索,法律团队实施安全和一致性过滤器,工程团队提供专业工具和模型。智能是从这些专业组件的协调工作中产生的,而不是从单一的全知实体中产生的。

复合方法相较于单体模型具有五大关键优势。首先,模块化使得组件可以独立更新而无需对整个系统进行重新训练。当 OpenAI 改进代码解释时,他们只需更换那个模块,而不必触及语言模型,这就像升级显卡而不更换整个电脑一样。其次,专业化允许每个组件针对其特定任务进行优化。使用向量数据库的专用检索系统比试图记住所有知识的语言模型表现更出色,就像专用 ASIC 比通用 CPU 在特定计算上表现更出色一样。第三,可解释性来自于通过组件交互的可追溯决策路径。当系统出错时,工程师可以确定是检索、推理还是生成失败,这在不可透见的端到端模型中是不可能的。第四,可扩展性允许在不进行架构大修的情况下集成新功能。添加语音识别或机器人控制只需添加模块,而不是重新训练万亿参数模型。第五,安全性得益于在每个阶段对输出进行约束的多个专用验证器。一个毒性过滤器检查生成的文本,一个事实验证器验证声明,一个安全监控器防止有害行为。这创建了一个分层防御系统,而不是依赖于单个模型正确行为。

这些优势解释了为什么现在每个主要的 AI 实验室都在追求复合架构。谷歌的 Gemini 2.0 结合了多模态理解和原生工具使用以及代理能力。Anthropic 的 Claude 3.5 集成了宪法 AI 组件、计算机使用能力以及扩展的上下文窗口,从而实现复杂的多步骤工作流程。OpenAI 的 ChatGPT 通过统一的界面协调插件、代码执行、图像生成和网络浏览。这些系统从单一用途助手到多能力代理的快速演变表明,随着能力的成熟,复合架构的采用正在加速。本书中从分布式系统到工作流程编排建立的所有工程原则现在正汇聚起来,以使这些复合系统成为可能。

复合智能的构建模块

从单体模型到复合人工智能系统的演变需要我们在数据工程、组件集成和基础设施扩展方面的进步。这些构建块代表了复合智能能否实现人工智能通用智能所需灵活性和能力的决定性推动力。每个组件都针对当前方法的特定局限性进行设计,同时创造跨越数据可用性、系统集成和计算扩展的新工程挑战。

图 20.5 说明了这些构建块如何在复合人工智能架构中整合:专门的数据工程组件向知识检索系统提供内容,动态架构使 LLM 编排器能够通过专家混合模式有效地路由计算,而高级训练范式为实施宪法人工智能原则的安全过滤器提供动力。理解这些构建块各自的作用以及它们的整体整合,为构建明天的智能系统提供了基础。

大规模数据工程

数据工程是第一个也是最关键的构建块。复合人工智能系统需要高级数据工程来为其专门的组件提供支持,然而机器学习面临着数据可用性的危机。当检查模型需求的发展进程时,规模变得明显:GPT-3 消耗了 3000 亿个标记(OpenAI),GPT-4 可能使用了超过 1000 万亿个标记(根据扩展定律 4),然而研究估计整个互联网上只有 4.6-17 万亿高质量标记 5。这一进程揭示了一个关键瓶颈:在当前的消费速度下,传统的网络爬虫文本数据可能在 2026 年耗尽,迫使探索合成数据生成和替代扩展路径(Sevilla 等人 2022a)。

三种数据工程方法通过复合系统设计来应对这一挑战:

自监督学习组件

自监督学习使复合人工智能系统能够超越标记数据的瓶颈。虽然监督学习需要对每个例子进行人工标注,但自监督方法通过从原始信息中固有的模式、关系和规律中学习,从数据结构本身提取知识。

生物学的先例是有启发性的。人脑每秒处理大约 10¹¹位感官输入,但每秒只接收少于 10⁴位的明确反馈,这意味着 99.99%的学习是通过自监督模式提取 6 进行的。孩子不是从标记的例子中学习物体恒存性,而是通过观察物体消失和再次出现。他们不是从方程式中学习物理,而是通过观察物体坠落、滚动和碰撞。

Yann LeCun 称自监督学习为“智能的暗物质”(Yann LeCun 2022),虽然看不见,但构成了学习宇宙的大部分。当前的语模模型仅仅通过下一个标记预测来触及这一表面,这是一种原始形式,它学习的是统计相关性而不是因果理解。当 ChatGPT 在“red”之后预测“apple”时,它利用的是共现统计,而不是苹果具有红色属性的理解。

联合嵌入预测架构(JEPA)7 展示了一种更复杂的方法。JEPA 不是预测原始像素或标记,而是学习世界状态的抽象表示。当 JEPA 看到一个球沿着斜坡滚动的视频时,它不会逐帧预测像素值。相反,它学习表示编码轨迹、动量和碰撞动力学,这些概念可以跨不同对象和场景转移。这种抽象比像素预测实现了 3 倍的样本效率,同时学习到真正可重用的知识。

对于复合系统,自监督学习使每个专业组件能够从其自然数据域中发展专业知识。视觉模块从图像中学习,语言模块从文本中学习,动力学模块从视频中学习,所有这些都不需要人工标记。工程挑战在于协调这些不同的学习过程:确保表示在模态之间对齐,防止组件更新时的灾难性遗忘,并在系统扩展时保持一致性。第七章(ch013.xhtml#sec-ai-frameworks)中的框架基础设施必须发展,以支持在统一训练循环中这些异构的自监督目标。

合成数据生成

复合系统通过引导合成而不是完全依赖人工生成的内容来生成自己的训练数据。这种方法看似矛盾:模型如何从自己那里学习而不退化成模型崩溃,即生成数据越来越多地反映模型偏差而不是真实情况?答案在于三个互补的机制,这些机制可以防止质量下降。

首先,通过外部真实数据进行验证限制了生成。微软的 Phi 模型(Gunasekar 等人 2023)生成合成教科书问题,但通过符号执行、数学证明检查器或代码编译来验证解决方案。生成的代数问题必须有一个唯一、可验证的解;编程练习必须编译并通过测试用例。这创建了一个反馈循环,其中生成器学习产生不仅可能是合理的例子,而且是可验证的正确例子。

其次,基于课程的合成从简单、易于处理的例子开始,并逐步增加复杂性。Phi-2(2.7B 个参数)的性能与 GPT-3.5(175B)相当,因为其合成的训练数据遵循教学进程:先从基础算术开始,然后是微积分,再是简单函数,然后是递归,最后是具体例子,最后是抽象推理。这种结构化的课程使得在无结构网络数据上训练时,较小的模型能够实现需要 65 倍更多参数的能力。

第三,集成验证使用多个独立的模型来过滤合成数据。在生成训练示例时,输出必须满足多个不同的、基于不同数据分布训练的评论员模型。这防止了系统偏差:如果一个生成器持续产生有利于特定模式的示例,那么在多样化数据上训练的集成评论员将识别并拒绝这些有偏差的样本。Anthropic 的宪法 AI 通过迭代优化展示了这一点:一个组件生成响应,多个评论员根据不同的原则(有用性、无害性、事实准确性)对其进行评估,综合产生满足所有标准的改进版本。

对于复合系统,这使专门的数据生成组件能够创建针对其他组件需求的特定领域训练示例。一个推理组件可能为验证组件生成逐步解决方案以进行检查,而代码生成组件为执行组件生成程序以进行验证。

自我玩耍组件

AlphaGo Zero(Silver 等人 2017)展示了复合系统的一个关键原则:组件可以通过自我竞争在没有人类数据的情况下建立专业知识。从完全随机的游戏开始,它仅通过自我玩耍的强化学习在 72 小时内实现了超人类的围棋表现。该机制依赖于三个技术元素,这些元素能够从零知识开始建立专业知识。

第一,自我玩耍通过对手强度跟踪提供自动课程适应性。与使用固定数据集的监督学习不同,自我玩耍随着竞争代理的改进而持续调整难度。当 AlphaGo Zero 与自己对战时,每场比赛都反映了当前的技能水平,创建了定位于略高于当前能力的训练示例。早期游戏探索基本模式;后期游戏揭示了通过人类指令无法指定的微妙战术细节。

第二,搜索引导的探索扩展了有效训练分布,使其超越当前策略可以生成的范围。蒙特卡洛树搜索从每个位置模拟成千上万种可能的结果,发现当前策略不会考虑的强力走法。这些搜索增强的决策成为训练目标,通过迭代改进将策略推向超人类水平。这创造了一个良性循环:更好的策略使搜索更准确,发现更好的训练目标,进而进一步提高策略。

第三,结果验证提供了明确的 学习信号。游戏结果(围棋中的胜负、编码中的解决方案正确性、推理中的辩论胜利)提供了清晰的监督,无需人工标注。一个生成代码的模型可以对测试套件中的数百万个候选程序进行测试,从成功和失败中学习,而无需人工评估。DeepMind 的 AlphaCode 针对每个比赛问题生成超过一百万个程序,通过编译错误和测试失败进行筛选,以识别正确解决方案,从而从成功的程序(正例)和系统性的失败模式(负例)中学习。

这一原则不仅适用于游戏,还可以为复合架构创建专门的系统组件。OpenAI 的辩论模型争论问题的对立面,由裁判模型决定哪个论点更好地支持真理,为论点和评估创建训练数据。Anthropic 的模型通过自我生成的、经过质量评估的评论来批判自己的输出,从而启动改进的响应。这些自播放模式使复合系统能够在无需昂贵的人类监督的情况下生成特定领域的训练数据。

在复合系统中实施这种方法需要处理大规模动态生成的数据管道:管理连续的自生成示例流,通过自动化验证进行质量筛选,并通过多样性指标防止模式崩溃。工程挑战在于在保持探索多样性并防止系统整体收敛到次优模式或对抗性均衡的同时,协调多个自播放组件。

Web-Scale Data Processing

高质量精选文本可能有限,但自监督学习、合成生成和自播放创造了新的数据来源。互联网的长尾包含复合系统未开发的资源:GitHub 仓库、学术论文、技术文档和专门论坛。Common Crawl 包含 2500 亿页,GitHub 托管 2000 万多个仓库,arXiv 包含 200 万多篇论文,Reddit 有 30 亿条评论,合计超过 1000 万亿个不同质量的标记。挑战在于提取和质量评估,而不是可用性。

现代复合系统采用复杂的过滤管道(图 20.1),其中专门的组件处理不同的方面:去重减少了网络爬取中的 30-60%冗余,基于精选数据的质量分类器识别高价值内容,特定领域的提取器处理代码、数学和科学文本。这种处理强度体现了数据工程挑战:GPT-4 的训练可能处理了超过 1000 万亿个原始标记,以提取 10-13 万亿个训练标记,这代表了大约 90%的总数据减少:30%来自去重,然后是剩余数据的 80-90%来自质量筛选。

这代表了从批量处理到连续、自适应数据管理的转变,其中多个专业组件协同工作,将原始互联网数据转换为训练准备好的内容。

图片

图 20.1:前沿模型的数据工程流程:多阶段流程将 100+万亿个原始标记转换为 10-13 万亿个高质量训练标记。每个阶段应用越来越复杂的过滤,合成生成增强了最终数据集。这个流程代表了从简单的网络抓取到智能数据管理系统的演变。

图 20.1 中的流程图揭示了一个重要的见解:瓶颈不是数据可用性,而是处理能力。从 111.5 万亿个原始标记开始,积极的过滤将这一数字减少到仅 10-13 万亿个训练标记,超过 90%的数据被丢弃。对于机器学习工程师来说,这意味着提高过滤器的质量可能比收集更多原始数据更有影响。质量过滤器精确度提高 10%可以额外产生一个万亿个高质量标记,相当于将可用的书籍数量翻倍。

这些数据工程方法(合成生成、自我对弈和高级采集)代表了复合人工智能系统的第一个构建块。它们将数据限制从障碍转变为创新的机遇,专用组件持续生成、过滤和处理数据流。

仅生成高质量的训练数据只解决了复合系统挑战的一部分。下一个构建块涉及架构创新,这些创新能够使专用组件在保持系统连贯性的同时进行高效计算。

复合系统的动态架构

复合系统需要动态方法,可以根据任务需求和输入特征调整计算。本节探讨了通过选择性计算和复杂的路由机制实现高效专业化的架构创新。专家混合和类似方法允许系统仅激活每个任务相关的组件,提高计算效率同时保持系统能力。

通过选择性计算实现专业化

复合系统面临一个基本的效率挑战:不是所有组件都需要在每个任务中激活。数学问题需要与语言翻译或代码生成不同的处理,然而密集的单体模型无论任务需求如何,都会为每个输入激活所有参数。

考虑 GPT-3 (T. Brown et al. 2020)处理提示“2+2 等于多少?”。尽管这只需要算术推理,而不是语言翻译、代码生成或常识推理,但所有 1750 亿个参数都会被激活。这种激活需要每条前向传递计算 350GB 内存和 350 GFLOPs。通过梯度归因的激活分析揭示,只有 10-20%的参数对任何给定预测有实质性贡献,这表明对于典型输入有 80-90%的计算浪费。在规模扩大时,情况变得更糟:一个假设的 1 万亿参数密集模型将需要每条 2TB 内存和每条 2 TFLOPs,具有类似的利用效率低下。

这种低效在三个维度上累积。内存带宽限制参数从 HBM 加载到计算单元的速度,即使在计算单元空闲时也会造成瓶颈。功耗与激活的参数成正比,无论其贡献如何,都会为对输出影响最小的计算消耗能量。对于密集架构,延迟与模型大小成线性关系,使得超过一定规模后实时应用变得不可行。

生物先例表明了替代方法。人脑大约含有 860 亿个神经元,但并非每个任务都会激活所有神经元。视觉处理主要涉及枕叶皮层,语言处理涉及颞叶区域,运动控制涉及额叶区域。这种稀疏的、特定于任务的激活实现了能源效率:尽管其复杂性可与连接密度达到万亿参数模型的复杂度相媲美,但大脑在 20 瓦的功率下运行。

这些观察结果激励了能够实现系统组件选择性激活的架构设计。复合系统不应激活所有参数,而应将输入路由到相关的专业组件,仅激活每个特定任务所需的子集。这种选择性计算有望在效率、延迟和可扩展性方面实现数量级的改进。

复合系统中的专家路由

混合专家(MoE)架构(Fedus, Zoph, and Shazeer 2021b)在模型级别上展示了复合系统原理:通过智能路由激活的专业组件。MoE 模型由多个专家网络组成,每个网络专门处理不同类型的问题。一个路由机制(学习到的门控函数)确定哪个专家处理每个输入,如图图 20.2 所示。

路由器使用学习到的线性变换后跟 softmax 计算每个专家的概率,通常每个标记选择前两个专家。负载均衡损失确保专家的均匀使用,以防止收敛到少数专家。这种模式自然扩展到复合系统,其中不同的模型、工具或处理管道根据输入特征进行路由。

如 图 20.2 所示,当标记进入系统时,路由器评估哪些专家最相关。对于“2+2=”,路由器将高权重(0.7)分配给算术专家,而对视觉或语言专家则给予零权重。对于“Bonjour means”,它激活了翻译专家。据传言,GPT-4 (OpenAI 等人 2023) 使用了大约 220B 参数的八个专家模型(由 OpenAI 未确认),每个标记激活两个,将活跃计算减少到 280B 参数,同时保持 1.8T 总容量,并实现 5-7 倍的推理速度提升。

这引入了系统挑战:专家之间的负载均衡,防止所有路由都收敛到少数专家,以及管理不规则的内存访问模式。对于复合系统,这些相同的挑战也适用于不同模型、数据库和处理管道之间的路由,需要复杂的编排基础设施。

图片

图 20.2:专家混合(MoE)路由:通过学习路由进行条件计算,能够高效地扩展到万亿参数。路由器(门控函数)确定哪些专家处理每个标记,仅激活相关专家。这种稀疏激活模式降低了计算成本,同时保持了模型容量,尽管它引入了负载均衡和内存访问挑战。

外部内存用于复合系统

除了路由效率之外,复合系统还需要内存架构,其扩展能力超越单个模型限制。如 第 20.5.1 节 详细所述,变换器面临与序列长度成二次关系的内存扩展,限制了推理期间的知识访问,并阻止系统组件之间的长上下文推理。

通过创建多个系统组件可访问的外部内存存储,检索增强生成(RAG)8 解决了这个问题。它不是将所有知识编码在参数中,而是专门的检索组件查询包含数十亿文档的数据库,将相关信息纳入生成过程。这使架构从纯参数化转变为混合参数化-非参数化系统 (Borgeaud 等人 2021)。

对于复合系统来说,这使不同的专门组件可以访问共享的知识库,在多样化的内容类型之间进行高效的相似性搜索,并支持复杂的多步推理过程。

模块化推理架构

多步推理体现了复合系统优势:将复杂问题分解为可验证的组件。虽然单体模型可以直接回答简单问题,但多步问题会产生累积错误(每步 90%的准确率对于 5 步问题来说,整体准确率只有 59%)。GPT-3 (T. Brown 等人 2020) 在复杂推理上的错误率在 40-60%,主要来自中间步骤的失败。

思维链提示(Wei 等人 2022)和模块化推理架构通过分解来解决这个问题,其中不同的组件处理不同的推理阶段。而不是直接生成答案,专门的组件产生中间推理步骤,验证组件可以检查和纠正。思维链提示将 GSM8K 的准确率从 17.9%提高到 58.1%,步骤验证达到 78.2%。

这种架构方法,通过验证将复杂任务分解到专门的组件中,代表了核心复合系统模式:多个专家通过结构化接口而不是单体处理进行协作。

这些创新展示了从静态架构向动态复合系统的转变,这些系统可以路由计算、访问外部内存,并在专门的组件之间分解推理。这种架构基础为 AGI 规模智能所需的复杂编排提供了可能。

动态架构提供了复杂的编排机制,但它们在其底层范例的计算约束内运行。Transformer,当前突破的基础,面临着扩展限制,复合系统必须最终超越这些限制。在考察如何训练和部署复合系统之前,我们必须了解可能形成其计算基础的替代架构范例。

适用于通用人工智能(AGI)的替代架构

上文所探讨的动态架构在扩展 Transformer 能力的同时,保留了其核心计算模式:将每个输入元素与每个其他元素进行比较的注意力机制。这种二次扩展随着上下文长度的增加而产生了固有的瓶颈。处理一个包含 10 万个标记的文档需要 100 亿个成对比较,这在计算上非常昂贵,对于许多应用来说经济上也是不可行的。

自回归生成模式限制了 Transformer 只能进行顺序的、从左到右的处理,无法根据后续约束轻松修改早期决策。这些限制表明,实现 AGI 可能需要超越当前范例的架构创新。

本节探讨了三种新兴范式,它们通过不同的计算原理来解决 Transformer 的局限性:用于高效长期上下文处理的状态空间模型、基于能量的模型用于优化驱动推理,以及用于因果理解的领域模型。每个都代表未来复合智能系统潜在的建筑模块。

状态空间模型:高效的长期上下文处理

Transformer 的注意力机制将每个标记与每个其他标记进行比较,创建二次缩放:100,000 个标记的上下文需要 1,000 亿次比较(100K × 100K 对注意力分数)。这种 O(n²) 的内存和计算复杂度限制了上下文窗口,使得处理书籍长度的文档、多小时的对话或整个代码库对于实时应用来说成本过高。二次瓶颈来自于注意力矩阵 A = softmax(QKᵀ/√d),其中 Q, K ∈ ℝⁿˣᵈ 必须计算所有 n² 对相似度。

状态空间模型通过在 O(n) 时间内通过循环隐藏状态更新来处理序列,而不是对所有先前标记进行注意力处理,从而提供了一个有吸引力的替代方案。其基本思想来源于控制理论:维护一个压缩的潜在状态 h ∈ ℝᵈ,该状态总结了所有先前输入,并在新标记到达时增量更新它。从数学上讲,状态空间模型实现了连续时间动力学,用于序列处理:

连续形式ḣ(t)=Ah(t)+Bx(t)y(t)=Ch(t)+Dx(t) \begin{aligned} \dot{h}(t) &= Ah(t) + Bx(t) \ y(t) &= Ch(t) + Dx(t) \end{aligned}

离散形式: ht=Aht1+Bxtyt=Cht+Dxt \begin{aligned} h_t &= \bar{A}h_{t-1} + \bar{B}x_t \ y_t &= \bar{C}h_t + \bar{D}x_t \end{aligned}

其中 x ∈ ℝ 是输入标记,h ∈ ℝᵈ 是隐藏状态,y ∈ ℝ 是输出,{A, B, C, D} 是学习参数,它们在这些空间之间进行映射。与受梯度消失/爆炸问题困扰的 RNN 隐藏状态不同,状态空间公式利用结构化矩阵(对角线、低秩或 Toeplitz)通过仔细的初始化和参数化,通过稳定的长距离依赖性。

实现具有竞争力性能的技术突破来自于选择性的状态空间,其中递归参数本身依赖于输入:Āₜ = f_A(xₜ), B̄ₜ = f_B(xₜ),这使得状态转换输入依赖而非固定。这种选择性允许模型根据当前输入内容动态调整要记住或忘记的信息。当处理“奖杯太大,放不进手提箱”时,模型可以选择性地在状态中维持“奖杯”信息,同时丢弃不那么相关的词语,选择过程由学习到的输入依赖的门控机制驱动,类似于 LSTM 的遗忘门,但处于状态空间框架内。这种方法类似于维护一个运行摘要,根据内容的重要性调整其压缩策略,而不是盲目地平均总结一切。

像 Mamba (A. Gu and Dao 2023)、RWKV (Peng et al. 2023)和 Liquid Time-constant Networks (Hasani et al. 2020)这样的模型表明,这种方法可以在许多任务上匹配 Transformer 的性能,同时与序列长度成线性而不是平方关系进行扩展。使用具有输入相关参数的选择性状态空间,Mamba 在长序列(100K+标记)上的吞吐量比 Transformer 提高了 5 倍。Mamba-7B 在文本上的性能与 Transformer-7B 相当,但在 100K 标记序列上使用的内存减少了 5 倍。后续的发展包括 Mamba-2,进一步提高了效率和质量,而将状态空间层与注意(如在 Jamba 中)结合的混合架构表明,未来可能涉及互补机制而不是全面架构替换。RWKV 结合了 RNN 的高效推理和 Transformer 的可并行训练,而 Liquid Time-constant Networks 根据输入调整其动态,显示出在时间序列和连续控制任务上的特别前景。

系统工程的影响是显著的。线性扩展使得在单个模型调用中处理书籍长度的上下文、多小时的对话或整个代码库成为可能。这需要重新思考数据加载策略(处理 MB 级输入)、内存管理(流式处理而不是批量处理)以及针对顺序处理而非并行注意力的分布式推理模式。

状态空间模型仍然是实验性的。Transformer 得益于整个机器学习系统堆栈多年的优化,从专用硬件内核(FlashAttention、优化的 CUDA 实现)到分布式训练框架(张量并行性、来自第八章的流水线并行性)再到部署基础设施。替代架构不仅必须与 Transformer 的能力相匹配,还必须证明重建此优化生态系统的工程努力是合理的。对于复合系统,混合方法可能最为实用:Transformer 用于受益于并行注意力的任务,状态空间模型用于长上下文顺序处理,通过在第 20.3 节中探索的编排模式进行协调。

基于能量的模型:通过优化进行学习

当前语言模型通过一次预测一个标记,并将每个预测条件化在所有先前标记的基础上来生成文本。这种自回归方法在复杂推理方面存在关键限制:它不能轻易根据后续约束来修订早期决策,难以处理需要全局优化的问题,并且往往产生局部一致但全局不一致的输出。

基于能量的模型(EBMs)提供了一种不同的方法:学习一个能量函数 E(x)E(x),它将低能量分配给可能的或期望的配置 xx,并将高能量分配给不可能的配置。EBMs 不是直接生成输出,而是通过优化进行推理,寻找最小化能量的配置。这种范式通过其根本不同的计算结构,使得自回归模型无法实现的能力成为可能。

首先,EBMs 通过同时考虑多个相互作用的约束条件,而不是做出序列性的局部决策,从而实现全局优化。当规划一个多步骤项目,其中早期决策限制了后续选项时,自回归模型必须按顺序承诺步骤,而不会根据下游后果进行修订。EBM 可以将整个计划作为优化问题来制定,其中能量函数捕捉所有步骤的约束满足情况,然后通过梯度下降或采样方法搜索全局最优解。对于需要规划、约束满足或多步骤推理的问题,其中局部决策导致全局次优,这种整体优化证明是至关重要的。数独就是一个例子:按顺序填充方格往往会导致需要回溯的矛盾,而将有效的完成作为低能量状态,可以通过约束传播实现高效的解决方案。

其次,能量景观自然地表示了具有不同能量水平的多个有效解,从而能够探索解的多样性。与通过贪婪解码或有限的束搜索承诺单一生成路径的自回归模型不同,EBMs 在整个解空间上维护概率分布。在设计具有所需特性的分子时,多个化学结构可能以不同的权衡满足约束条件。能量函数为每个候选结构分配分数,通过推理采样多样化的低能量配置,而不是收敛到单一输出。这支持了创意应用,其中多样性很重要:为故事生成多个情节变体,探索建筑设计的替代方案,或提出候选药物分子进行合成和测试。

第三,EBMs 支持双向推理,通过推理将信息向前和向后传播。自回归生成流程从开始到结束单向传播,无法根据后续约束修改早期决策。EBMs 通过迭代细化进行推理,可以修改输出中的任何部分以降低全局能量。在写诗时,如果最后一行必须与第一行押韵,EBMs 可以调整早期行以实现令人满意的结论。这种双向能力扩展到因果推理:从观察到的效果推断可能的因果关系,规划实现预期结果的行为,以及通过从错误症状追溯到根本原因来调试代码。推理过程对待所有变量都是对称的,使得在任何方向上都能进行灵活推理。

第四,能量水平通过玻尔兹曼分布 p(x) ∝ exp(-E(x)/T) 提供了基于原理的不确定性量化,其中温度 T 控制置信度校准。能量远高于最小值的解决方案具有指数级降低的概率,提供自然的置信度分数。这支持在不确定环境中的稳健决策:当多个完成选项具有相似的低能量时,模型表达不确定性而不是过度自信地做出任意选择。对于医疗诊断或自动驾驶车辆控制等安全关键应用,知道模型何时不确定可以启用依赖人类判断而不是盲目执行可能不正确的决策。基于能量的框架本质上提供了自回归模型必须通过集成方法或贝叶斯近似单独学习的不确定性估计。

系统工程挑战相当大。推理需要解决可能计算成本高昂的优化问题,尤其是对于高维空间。训练 EBMs 通常涉及对比学习方法,需要通过 MCMC 抽样 9 或其他计算密集型程序生成负例。优化景观可能包含许多局部最小值,需要复杂的推理算法。

这些挑战为系统创新创造了机会。用于优化的专用硬件(量子退火器、光学计算机)可以为 EBM 推理提供计算优势。分层能量模型可以将复杂问题分解为可处理的子问题。混合架构可以将快速自回归生成与 EBM 精细化相结合,以改善解决方案质量。

在复合 AI 系统中,EBMs 可以作为专门的推理组件处理约束满足、规划和验证任务,这些领域是优化方法表现优异的领域。虽然自回归模型生成流畅的文本,但 EBMs 确保逻辑一致性和约束遵守。这种劳动分工利用了每种方法的优点,同时减轻了弱点,体现了第 20.3 节中探讨的复合系统原则。

世界模型与预测学习

基于第 20.4.1.1 节中建立的自监督学习原则,真正的 AGI 需要世界模型:学习环境如何工作的内部表示,支持跨多个领域的预测、规划和因果推理。

世界模型是内部模拟,它捕捉因果关系,使系统能够预测行动的后果,对反事实进行推理,并规划向目标序列。虽然当前的 AI 通过预测下一个标记来通过数据预测表面模式,但世界模型理解底层机制。考虑一下区别:一个语言模型学习到“rain”(雨)和“wet”(湿)在文本中经常同时出现,实现了统计关联。而世界模型学习到雨通过吸收和表面湿润导致湿,能够对新型场景进行预测(被覆盖的物体在雨中会湿吗?不会,因为覆盖物阻止了因果机制),这是纯统计模型无法做到的。

技术上的区别体现在表示结构上。自回归模型在序列上维持概率分布:P(x₁, x₂, …, xₙ) = ∏ᵢ P(xᵢ | x₁, …, xᵢ₋₁),根据历史预测每个标记。世界模型则学习潜在动态:sₜ₊₁ = f(sₜ, aₜ) 将当前状态 sₜ 和动作 aₜ 映射到下一个状态,通过独立的观察模型 o = g(s) 将状态渲染为观察。这种分解使得可以进行前向模拟(预测长期后果)、逆模型(推断产生观察结果的动作),以及反事实推理(如果动作不同会发生什么)。

DeepMind 的 MuZero(Schrittwieser 等人 2020)在游戏中的表现展示了世界模型原则。MuZero 不是通过显式学习规则,而是学习三个函数:表示(将观察映射到隐藏状态)、动态(从当前状态和动作预测下一个隐藏状态),以及预测(从隐藏状态估计价值和策略)。它从没有游戏规则开始,发现某些棋子配置会导致胜利的结果,通过学习因果模型而不是显式规则规范,实现了在象棋、将棋和围棋中的超人类表现。

这种范式转变利用了之前介绍的联合嵌入预测架构(JEPA)框架,超越了自回归生成,朝着理解因果关系的预测智能发展。未来的 AGI 系统不再按顺序生成文本标记,而是在抽象表示空间中预测行动的后果。对于机器人学,这意味着预测物体被推动时的运动(物理世界模型)。对于语言,这意味着根据说话策略预测对话如何演变(社会世界模型)。对于推理,这意味着预测数学陈述如何从公理中得出(逻辑世界模型)。

系统工程挑战涉及多个维度。数据需求大幅增长:学习准确的世界模型需要 PB 级的多模态交互数据,以捕捉多样的因果模式,远超过仅文本的训练。架构设计必须支持多个感官模态之间的时序同步(视觉 30Hz,音频 16kHz,本体感觉 1kHz),这需要仔细的缓冲管理和对齐。训练程序必须能够从流数据中持续学习,而不会发生灾难性遗忘(在第 20.6.0.4 节中探讨的挑战),在环境变化时更新世界模型,同时保留之前学习到的因果关系。

验证提出了独特的挑战。评估世界模型需要测试因果预测,而不仅仅是统计准确性。一个预测“下雨时会出现雨伞”的模型虽然达到了高统计准确性,但在因果上却失败了,因为雨伞不会导致下雨。测试需要干预实验:如果模型认为雨会导致雨伞,那么移除雨伞不应该影响预测的雨。在规模上实施这种因果测试需要超越标准机器学习基准测试的复杂评估基础设施。

在复合系统中,世界模型组件提供因果理解和规划能力,而其他组件则处理感知、动作选择或通信。这种专业化使得能够为特定领域(如机器人学的物理定律、对话的社会动力学、数学的逻辑规则)开发出鲁棒的世界模型,同时保持灵活性,以便将它们组合用于复杂的多领域推理任务。一个家庭机器人可能会使用物理世界模型来预测物体轨迹,社会世界模型来预测人类行为,以及规划算法来按顺序执行操作步骤,以实现期望的结果。

混合架构集成策略

上文探讨的范例通过不同的计算方法解决了互补的转换器限制,但没有任何一个代表完全的替代。转换器在并行处理和流畅的自然语言生成方面表现出色,但遭受二次内存缩放和顺序生成约束。状态空间模型实现线性复杂度,但缺乏转换器的表达注意力模式。基于能量的模型实现全局优化,但需要昂贵的推理。世界模型提供因果推理,但需要广泛的多模态训练数据。前进的道路不在于选择一个范例,而在于编排混合复合系统,利用每个架构的优势同时减轻弱点。

从当前研究中出现了几种集成模式。级联架构按顺序将输入路由到专用组件,每个阶段都细化来自前一阶段的输出。一个语言理解管道可能使用转换器进行初始解析,使用世界模型对描述的事件进行因果推理,并使用基于能量的模型进行约束检查和一致性验证。这种顺序专业化使复杂的推理管道成为可能,其中每个组件都贡献了独特的功能。

并行集成方法结合多个架构同时处理输入,通过学习加权或投票机制汇总结果。一个问答系统可能使用转换器生成候选答案,使用基于能量的模型评估逻辑一致性进行评分,并使用预测下游后果的世界模型进行排名。这种冗余提供了鲁棒性:如果一个架构在特定输入上失败,其他架构可能成功。

层次分解将架构分配到不同的抽象级别。高级规划可能使用世界模型来预测长期后果,中级执行可能使用转换器进行动作生成,而低级控制可能使用状态空间模型进行实时响应。这种垂直集成使系统能够同时在不同时间尺度上进行推理,从毫秒级的反射到多小时的计划。

最复杂的集成策略涉及基于输入特性和任务要求的动态路由。协调器分析传入的请求并自适应地选择适当的架构组件。基于数学证明的路由到由转换器提示生成的增强符号推理器。创意写作任务路由到优化流畅生成的转换器。长文档摘要路由到处理扩展上下文的状态空间模型。物理操作规划路由到预测对象动态的世界模型。这种自适应专业化需要元学习系统,这些系统学习哪些架构在特定任务分布中表现卓越。

实施挑战与架构异构性叠加。训练程序必须适应不同的计算模式:Transformer 在序列位置上并行化,循环模型按顺序处理,基于能量的模型需要迭代优化。梯度计算存在根本差异:Transformer 通过确定性操作进行反向传播,世界模型通过学习到的动态进行反向传播,基于能量的模型需要对比估计。来自第七章的框架基础设施必须发展以支持这些多样化的训练范例在统一管道内。

硬件加速也面临着类似的挑战。Transformer 可以高效地映射到针对密集矩阵乘法优化的 GPU 张量核心。状态空间模型受益于具有优化内存访问模式的顺序处理引擎。基于能量的模型需要优化硬件来加速迭代细化。复合系统必须在异构加速器之间协调计算,将不同的架构组件路由到适当的硬件基础之上,同时最小化数据移动开销。

部署和监控基础设施必须跟踪架构组件中的各种故障模式。Transformer 的故障通常表现为流畅度下降或事实错误。基于能量的模型故障表现为优化收敛问题或约束违规。世界模型故障表现为错误的因果预测或计划崩溃。来自第十三章的可观察性系统必须检测和诊断这些不同故障语义中的故障,需要在统一操作框架内采用针对特定架构的监控策略。

来自第 20.3 节的复合人工智能系统框架为管理这种架构异构性提供了组织原则。通过将每个范例视为具有良好定义接口的专用组件,复合系统能够在保持系统一致性的同时实现架构多样性。以下关于训练方法、基础设施要求和操作实践的章节适用于这些架构范例,尽管具体实现取决于计算基础。

复合系统的训练方法

复合系统的发展需要超越传统机器学习方法的复杂训练方法。在确保与人类价值观和意图对齐的同时,训练具有多个专用组件的系统需要复杂的方法。从人类反馈中进行的强化学习可以应用于复合架构,而持续学习使这些系统能够通过部署和交互来改进。

组件间的对齐

复合系统面临的对齐挑战建立在负责任的 AI 原则(第十七章)之上,同时超越了当前的安全框架,以解决可能超出人类能力范围的系统:每个专门的组件必须与人类价值观保持一致,而协调者必须适当地协调这些组件。传统的监督学习在模型上产生了不匹配,这些模型是在互联网文本上训练的,学会预测人类会写什么,而不是人类想要什么。GPT-3 对敏感历史提示的完成结果差异很大,一些评估显示在少数情况下有令人担忧的输出,准确地反映了网络内容分布而不是真相。

对于复合系统,任何组件的不对齐都可能损害整个系统:一个检索有偏见信息的搜索组件,一个持续有害刻板印象的推理组件,或者一个未能捕捉到问题内容的过滤安全组件。

组件训练的人类反馈

针对这些对齐挑战,从人类反馈中学习强化学习(RLHF)(Christiano 等人 2017; Ouyang 等人 2022)通过多阶段训练来解决对齐问题,这种训练自然地累积到系统级对齐。RLHF 不仅仅是在文本预测上进行训练,而是在训练流程本身中创建了专门的组件。

该过程通过三个不同的阶段展示了复合系统设计,每个阶段都有具体的技术要求。第一阶段从对高质量演示的监督微调开始。人类注释者编写示例响应,以提示展示所需的行为,为各种任务提供大约 10,000-100,000 个演示。这种初始微调将基础语言模型(仅基于文本预测训练)转变为遵循指令的助手,尽管它并不理解人类对不同响应质量的不同偏好。

第二阶段收集比较反馈来训练奖励模型。而不是在绝对尺度上对响应进行评分(对人类来说难以一致校准),注释者会比较同一提示下的多个模型输出,选择哪个响应更好地满足如有用性、无害性和诚实性等标准。系统为每个提示生成 4-10 个候选响应,由人类进行排名或成对比较。从这些比较中,一个独立的奖励模型学习预测人类偏好,将任何响应映射到一个标量奖励分数,该分数估计了人类的判断。这个奖励模型与保留的人类偏好达到约 70-75%的一致性,提供了自动化的质量评估,无需对每个输出进行人工评估。

第 3 阶段应用强化学习,使用学习到的奖励模型来优化策略。近端策略优化(PPO)(Schulman et al. 2017) 微调语言模型以最大化预期奖励,同时通过 KL 散度惩罚防止过度偏离监督微调的初始化。这个约束至关重要:没有它,模型会利用奖励模型的弱点,生成无意义的输出,这些输出会欺骗奖励预测器,但无法通过真正的人类判断。KL 惩罚β控制这个权衡,通常设置为 0.01-0.1,允许有意义的改进同时保持连贯的输出。每个强化学习步骤生成响应,计算奖励,并更新策略梯度,迭代直到收敛(图 20.3)。

图片

图 20.3:RLHF 训练流程:三个阶段的过程将基础语言模型转化为对齐助手。第 1 阶段使用人类演示进行初始微调。第 2 阶段收集人类偏好以训练奖励模型。第 3 阶段应用强化学习(PPO)以优化人类偏好,同时通过 KL 散度惩罚防止模式崩溃。

图 20.3 的工程复杂性相当大。每个阶段都需要不同的基础设施:第 1 阶段需要演示收集系统,第 2 阶段需要能够并排展示多个输出的排名接口,第 3 阶段则需要仔细调整超参数,以防止策略偏离原始模型太远(如图中所示的 KL 惩罚)。底部的反馈循环代表持续迭代,模型通常要经过多个 RLHF 的循环,每个循环都需要新鲜的人类数据以防止对奖励模型过度拟合。

这种方法带来了显著的改进:具有 1.3B 参数的 InstructGPT (Ouyang et al. 2022) 在人类评估中优于具有 175B 参数的 GPT-310,这表明对齐比规模对用户满意度更重要。对于机器学习工程师来说,这意味着投资于对齐基础设施可能比扩展计算更有价值:一个 100 倍更小的对齐模型优于一个更大的未对齐模型。

宪法 AI:价值对齐学习

人类反馈仍然昂贵且不一致:不同的注释者提供相互冲突的偏好,将人类监督扩展到数十亿次的交互非常具有挑战性 11。宪法 AI (Y. Bai et al. 2022) 通过自动偏好学习来解决这些限制。

与人类排名不同,宪法 AI 使用一套原则(一个“宪法”)来指导模型行为 12。模型生成响应,对其输出与这些原则进行批评,并迭代地修改响应。这个自我改进循环消除了人类瓶颈,同时保持了对齐目标。

图片

图 20.4:宪法 AI 自我改进循环:迭代精炼过程消除了人类反馈瓶颈。每个循环都会将输出与宪法原则进行比较,生成批评,并产生改进版本。经过 5 次迭代,有害内容减少了 95%,同时保持了有用性。最终输出成为下一代模型训练的数据。

该方法利用第十章(ch016.xhtml#sec-model-optimizations)中的优化技术,通过模型通过原则性的自我精炼来提炼自己的知识(图 20.4),类似于知识蒸馏,但由宪法目标而不是教师模型引导。

持续学习:终身适应

部署的模型面临一个限制:它们无法在不重新训练的情况下从用户交互中学习。每次对话都提供了有价值的反馈(纠正、澄清、新信息),但模型在训练后仍然保持冻结状态 13。这导致训练数据和当前现实之间的差距不断拉大。

持续学习旨在在防止灾难性遗忘的同时,从持续交互中更新模型:灾难性遗忘是指学习新信息会抹去先前知识的现象 14。标准的梯度下降法不加区分地覆盖参数,破坏了先前的学习。

解决方案需要受第十四章(ch020.xhtml#sec-ondevice-learning)启发的内存管理,在保护重要知识的同时,使新的学习成为可能。弹性权重巩固(EWC)(Kirkpatrick 等人 2017)通过识别哪些神经网络参数对先前任务至关重要,然后在学习新任务时对这些特定权重的变化进行惩罚来解决这一问题。该技术计算 Fisher 信息矩阵来衡量参数的重要性。具有高 Fisher 信息的参数对先前性能的贡献很大,应该被保留。渐进式神经网络采取不同的方法,通过为新的知识添加全新的路径,同时冻结原始路径,确保先前能力保持完整。记忆回放技术在新训练期间定期复习先前任务中的示例,通过持续练习而不是架构约束来维持性能。

这些训练创新(通过人类反馈进行对齐、原则性自我改进和持续适应)将训练范式从第八章转变为动态学习系统,通过部署而不是训练后保持静态来提高性能。

AGI 规模系统的生产基础设施

前面的子节讨论了针对通用人工智能(AGI)的新挑战:大规模数据工程、动态架构和复合智能的训练范式。这些领域代表了 AGI 需要超越现有实践的新方法。另外三个构建块(优化、硬件和运营)对于 AGI 系统同样至关重要。这些领域并非需要全新的技术,而是应用并扩展了在前面章节中开发的综合框架。

本节简要概述了优化(第十章)、硬件加速(第十一章)和 MLOps(第十三章)在 AGI 规模系统中的演变。关键洞察:尽管规模和协调挑战显著加剧,但基础工程原理与本书全书中掌握的原则保持一致。

优化:动态智能分配

第十章中的优化技术对于 AGI 具有新的意义,从静态压缩演变为在复合系统组件之间动态分配智能。当前模型通过为每个输入激活所有参数来浪费计算。当 GPT-4 回答“2+2=4”时,它激活了用于量子力学推理的相同万亿参数,就像使用超级计算机进行基本算术一样。AGI 系统需要根据输入复杂性进行选择性激活,以避免这种低效。

专家混合架构(在第 20.4.2.2 节中探讨)展示了一种实现稀疏和自适应计算的方法:通过模型容量的相关子集路由输入。扩展这一原则,自适应计算根据问题难度动态分配计算时间,简单查询只需几秒钟,而复杂推理任务则需大量资源。这需要系统工程来实时评估难度并优雅地跨计算预算进行扩展。

与构建单体模型不同,AGI 系统可以采用蒸馏级联,其中大型前沿模型逐步教授更小、更专业的变体。这反映了人类组织:初级员工处理常规工作,而高级专家解决复杂问题。第十章(ch016.xhtml#sec-model-optimizations)中的知识蒸馏技术使得创建能够保持能力同时降低常见任务计算需求的模型系列成为可能。系统工程挑战在于协调这些层次并将问题路由到适当的计算级别。

第十章(ch016.xhtml#sec-model-optimizations)中的优化原则(剪枝、量化、蒸馏)仍然是基础性的;AGI 系统只是将它们动态地应用于复合架构,而不是静态地应用于单个模型。

硬件:超越摩尔定律的扩展

第十一章(ch017.xhtml#sec-ai-acceleration)中的硬件加速原则提供了基础,但 AGI 规模的需求要求超越摩尔定律的架构,因为传统的硅扩展(Koomey et al. 2011)从大约每年 30-50%的晶体管密度提升(1970-2010)放缓到大约每年 10-20%(2010-2025)15。

训练 GPT-4 级模型已经需要广泛的并行性,通过第八章(ch014.xhtml#sec-ai-training)中的张量、流水线和数据并行技术协调数千个 GPU。AGI 系统需要 100-1000 倍的这种规模,需要多个方面的架构创新。

3D 芯片堆叠和芯片组通过垂直集成和模块化组合来提高密度,而不是水平缩小。三星的 176 层 3D NAND 和 AMD 的多芯片组 EPYC 处理器证明了可行性 16。对于 AGI 来说,这允许以最佳比例混合专用处理器(矩阵单元、内存控制器、网络芯片),并通过先进的冷却技术管理热挑战。

通信和内存瓶颈需要通过光互连和内存中处理架构等新颖解决方案。硅光子学可以实现比电互连低 10 倍的能量,100 Tbps 的带宽,这对于协调 10 万个以上的处理器至关重要 17。内存中处理将数据移动能量降低 100 倍,通过直接在数据所在位置进行计算,解决了限制当前加速器效率的内存墙问题。

通过神经形态和量子混合系统,出现了更长期的发展路径。英特尔 Loihi(Mike Davies 等人 2018)和 IBM 的 TrueNorth 通过脑启发架构展示了事件驱动工作负载的 1000 倍能效。量子-经典混合系统可以加速组合优化(神经网络架构搜索、超参数调整),而经典系统处理梯度计算 18。编程这些异构系统需要复杂的中间件来分解 AGI 工作流程跨越不同的计算范式。

第十一章第十一章中的硬件加速原则(并行性、内存层次优化、专用计算单元)仍然是基础性的。AGI 系统通过摩尔定律之后的创新扩展了这些原则,同时需要跨异构架构前所未有的编排。

操作:持续系统进化

随着 AGI 系统从静态模型发展到动态、持续学习的实体,MLOps 原则第十三章变得至关重要。在 AGI 规模下,三个操作挑战加剧,并转变了我们对模型部署和维护的看法。

持续学习系统在保持安全性和可靠性的同时,实时地从用户交互中更新。这使操作从离散部署(v1.0、v1.1、v2.0)转变为持续进化,其中模型不断变化。传统的版本控制、回滚策略和可重复性保证需要重新思考。操作基础设施必须支持在不停机的情况下进行实时模型更新,同时保持安全性不变量,这是在第十三章中涵盖的静态模型部署所不具备的挑战。

当比较数百万用户的个性化模型变体时,测试和验证变得复杂。第十三章第十三章中的传统 A/B 测试假设每个变体都有一致的经验;AGI 系统引入了复杂性,其中每个用户可能收到一个略有不同的模型。随着能力的扩展,突然出现的涌现行为可能需要检测不同用例中的微妙性能退化。第十三章第十三章中的监控和可观察性原则提供了基础,但必须扩展以检测能力变化,而不仅仅是性能指标。

安全监控需要实时检测有害输出、及时注入和对抗攻击,这些在数十亿次的交互中发生。与传统的软件监控跟踪系统指标(延迟、吞吐量、错误率)不同,AI 安全监控需要理解语义内容、用户意图和潜在危害。这需要结合来自第十六章的鲁棒性原则、来自第十五章的安全实践和来自第十七章的有责任感的 AI 框架的新工具。运营挑战在于大规模部署这些安全系统的同时,保持亚秒级的响应时间。

来自第十三章(持续集成/持续部署、监控、事件响应)的 MLOps 原则仍然至关重要;AGI 系统只是将它们应用于持续演变、个性化的模型,这些模型需要基于语义而非纯粹基于指标的有效性验证。

集成系统架构设计

被考察的六个构建块(数据工程、动态架构、训练范式、优化、硬件和运营)必须协同工作,以实现复合 AI 系统,但集成比简单地组装组件更具挑战性。成功的架构需要精心设计的接口、跨层的协调优化,以及全面理解构建块如何相互作用以创建涌现能力或级联故障。

考虑通过一个集成复合系统处理复杂用户查询时的数据流。来自第 20.4.1 节的新颖数据工程管道持续生成合成训练示例,整理网络规模语料库,并启用自我玩耍学习,为不同组件生成专门的训练数据集。这些数据集输入到来自第 20.4.2 节的动态架构中,其中混合专家模型将查询的不同方面路由到专门的组件:数学推理到定量专家,创意写作到语言专家,代码生成到编程模块。每个专家都使用来自第 20.6 节的方法进行训练,包括 RLHF 对齐、宪法 AI 自我改进和持续学习,以适应用户反馈。来自第 20.6.1.1 节的优化技术通过量化减少内存占用、剪枝消除冗余参数和蒸馏将知识转移到更小的部署模型,使这些组件能够高效部署。这个优化模型集在来自第 20.6.1.2 节的异构硬件上运行,结合 GPU 集群进行 Transformer 推理、神经形态芯片进行事件驱动感知和针对符号推理的专用加速器。最后,来自第 20.6.1.3 节的进化 MLOps 通过语义验证监控这个复杂的部署,优雅地处理组件故障,并支持无服务中断的持续学习更新。

关键洞见:这些构建块不能孤立地发展。数据工程决策限制了哪些架构模式是可行的;模型架构决定了优化机会;硬件能力限制了可达到的性能;运营需求反馈影响架构选择。这创造了一个紧密耦合的设计空间,其中跨构建块的协同优化往往比优化任何单个组件带来更大的改进。

具体来说,从生产复合系统中出现了三种整合模式,每种模式都代表了构建块设计空间中的不同权衡。横向整合模式将专业组件分布在共享基础设施层。所有组件访问公共数据管道,在同质硬件集群上部署,并通过标准化 API 进行集成。这种模式最大化了资源共享和操作简单性,但限制了每个组件的优化。Google 的 Gemini 是这种方法的例证:多模态编码器、推理模块和工具集成都在 TPU 集群上运行,共享训练基础设施和部署框架。其优势在于操作效率:一个团队管理着服务于所有组件的基础设施。当组件特定的优化(用于视觉的神经形态硬件、用于逻辑的符号加速器)无法在均匀的基材中利用时,这种限制就会显现出来。

垂直整合模式为每个专业组件定制整个堆栈。一个推理组件可能会在形式逻辑生成器的合成数据上训练,使用基于能量的架构以优化约束满足,部署在量子经典混合硬件上加速组合搜索,并在其操作监控中包含定制验证。一个独立的视觉组件在自监督视频预测上训练,使用卷积或视觉转换器架构,部署在神经形态芯片上进行高效的事件处理,并监控视觉输入中的分布变化。这种模式以管理异构系统的操作复杂性为代价,实现了每个组件的最大优化。Meta 针对不同模态和任务采用不同专用模型的方法,是垂直整合的例证:每个能力领域在整个堆栈中都得到定制处理。

层次整合模式通过分层抽象结合了横向和纵向方法。底层提供共享基础设施(数据管道、训练集群、部署平台),而高层则实现组件特定的定制(架构选择、优化策略、操作策略)。基础模型提供商是这种模式的例证:他们提供基于大规模基础设施训练的基础模型(横向),开发者使用定制数据和优化进行微调(纵向),部署在共享服务基础设施上(横向),并具有定制监控和护栏(纵向)。这种模式在操作效率和优化灵活性之间取得平衡,但在抽象边界引入了复杂性,因为共享基础设施必须满足多样化的定制需求。

在这些模式之间进行选择需要理解系统需求和组织能力。横向整合适合拥有强大基础设施团队但 AI 专业能力有限的组织,为了运营简单,可以接受一些性能上的牺牲。纵向整合有利于在多个领域拥有深厚 AI 专业知识的组织,能够管理复杂性以实现最大性能。分层整合服务于支持多种用例的平台,提供标准基础设施同时允许定制。

随着规模的扩大,工程挑战加剧。一个研究原型可能通过临时脚本和配置文件手动集成构建块。服务于数百万用户的生产系统需要强大的集成框架:声明性规范定义组件如何交互,自动部署管道验证跨构建块的一致性,监控系统检测集成故障,以及更新机制协调构建块之间的变化,而不会破坏依赖关系。这些框架本身成为重要的工程成果,通常在复杂性上与单个构建块相媲美。

重要的是,本书中开发出的工程原理为所有六个构建块提供了基础。AGI 的发展是扩展而不是取代这些原理,它们在前所未有的规模和协调复杂性上应用这些原理。来自第六章的数据工程原理适用于 PB 级语料库。来自第八章的分布式训练技术协调百万 GPU 集群。来自第十章的优化方法使万亿参数部署成为可能。来自第十三章的运营实践确保了可靠的多系统操作。AGI 系统工程是在这些基础上逐步构建的,而不是需要革命性的新方法,尽管规模和协调需求将现有技术推向极限,有时甚至超越极限。

复合 AI 系统的生产部署

前面的章节建立了复合 AI 系统所需的构建块:新颖的数据来源和训练范式、解决 Transformer 限制的架构替代方案以及支持异构组件的基础设施。这些构建块为 AGI 开发提供了原材料。本节将探讨如何通过协调生产规模下专用组件的编排模式,将这些材料组装成功能系统。

复合人工智能系统框架提供了概念基础,但在规模上实施这些系统需要复杂的协调基础设施。如 GPT-4 (OpenAI 等,2023) 工具集成、Gemini (G. Team 等,2023) 搜索增强和 Claude 的宪法人工智能 (Y. Bai 等,2022) 实施展示了如何通过专用组件的协调来实现超越单个模型限制的能力。工程复杂性包括管理组件交互、优雅处理故障以及随着组件独立演变而保持系统一致性。理解这些实施模式弥合了概念框架和运营现实之间的差距。

图 20.5 展示了使用特定性能指标来体现的工程复杂性:中心协调器在 10-50 毫秒的决策延迟内将用户查询路由到适当的专用模块,通过 1-10 GB/s 的数据流(根据模式不同:文本:1 MB/s,代码:10 MB/s,多模态:1 GB/s)管理组件间的双向通信,每个组件的迭代优化过程需要 100-500 毫秒的往返时间,并且每个会话使用 1-100 GB 的内存来维护整个交互的会话状态。每个组件代表不同的工程挑战,需要不同的优化策略(LLM:GPU 优化的推理,搜索:分布式索引,代码:安全沙箱),硬件配置(协调器:CPU+内存,检索:SSD+带宽,计算:GPU 集群),以及操作实践(亚秒级延迟 SLA,99.9%可用性,故障隔离)。故障模式包括组件超时(10-30 秒的回退),依赖失败(优雅降级),以及协调死锁(断路器模式)。

图片

图 20.5:复合人工智能系统架构:现代人工智能助手通过中心协调器整合专用组件,使能力超越单体模型。每个模块处理特定任务,而 LLM 协调信息流、决策和响应。这种架构实现了独立扩展、专用优化和多层安全验证。

生产系统的协调模式

在生产规模上实施复合人工智能系统需要复杂的协调模式,这些模式在协调专用组件的同时保持可靠性和性能。来自 OpenAI、Anthropic 和 Google 等组织的生产部署中出现了三种基本模式,每种模式都针对组件协调的不同方面。

请求路由模式根据意图分类和能力需求确定哪些组件处理每个用户查询。当用户询问“东京的天气怎么样?”时,协调器分析请求结构,识别所需的能力(实时数据网络搜索、位置解析、单位转换),并将请求路由到适当的组件。这种路由分为两个阶段:使用小型快速模型(10-50 毫秒延迟)进行粗粒度分类,确定广泛类别(事实查询、创意任务、代码生成、多模态请求),然后是细粒度路由,选择特定的组件配置。GPT-4 的工具使用实现展示了这一点:基础模型生成结构化 JSON 的功能调用,验证层检查模式合规性,执行引擎调用外部 API 并具有超时保护,结果集成将输出合并回对话上下文中。路由层维护一个能力注册表,将意图映射到组件组合,随着新组件的部署或现有组件的不稳定而动态更新。

当多个专用模块必须协同工作时,组件协调变得至关重要。协调器状态机模式管理多步骤工作流程,其中某个组件的输出通知后续组件的输入。考虑一个需要跨多个来源综合的研究查询:协调器(1)将问题分解为针对不同方面的子查询,(2)在知识库中并行搜索,(3)按相关性对检索到的段落进行排序,(4)将排名前 k 的段落反馈给包含原始问题的推理组件,(5)验证生成的声明与检索到的证据的一致性,(6)用引文格式化最终响应。每个阶段之间的过渡都需要状态管理跟踪中间结果,处理部分失败,并做出继续决策。协调器在分布式内存(Redis、Memcached)中维护工作流程状态,使组件失败时无需重启整个管道即可恢复。在每个成功阶段之后进行状态检查点,允许在组件超时或返回错误时从最后一个一致状态重新启动。

随着组件数量的增加,错误处理和弹性模式变得至关重要。断路器模式可以防止组件不可靠时发生级联故障。当一个知识检索组件由于数据库过载开始超时时,断路器会跟踪失败率,并在超过阈值(例如,60 秒内超过 30%的失败)后自动禁用该组件。而不是继续压垮失败的组件,协调器会转向回退策略:常见查询的缓存响应、仅从基础模型获得的降级响应,或明确通知用户某些功能暂时不可用。电路状态转换通过三个阶段:关闭(正常操作)、开启(故障触发即时回退)和半开启(定期测试恢复)。Anthropic 的 Claude 实现包括复杂的回退层次结构,其中宪法 AI 过滤器在不同质量/延迟权衡下有多个备用实现,确保即使在首选组件失败时也能进行安全验证。

生产系统根据负载和性能特征实现动态组件缩放。不同的组件面临不同的瓶颈:基础语言模型是计算密集型,需要 GPU 实例;向量搜索是内存带宽密集型,需要高 IOPS 的 SSD;代码执行是隔离密集型,需要沙箱容器。协调器监控组件级指标(延迟分布、吞吐量、错误率、资源利用率)并将缩放决策信号发送到部署基础设施。在高峰时段代码执行请求激增时,Kubernetes 水平扩展容器池,而协调器在可用实例之间负载均衡请求。这需要复杂的排队:高优先级请求(付费客户、关键工作流程)跳到队列的前面,而批量请求可以容忍更高的延迟。协调器跟踪每个用户的请求上下文,实现公平调度,防止单个用户垄断共享资源,同时保持所有用户的服务质量。

监控和可观测性在复合系统中变得指数级复杂。当故障表现为语义退化而非硬错误时,传统的指标如延迟和吞吐量证明是不够的。系统可能执行成功(未抛出异常,返回 200 OK 响应),但输出质量差,因为检索返回了不相关的段落或推理组件产生了幻觉连接。生产可观测性需要语义监控跟踪内容质量以及系统健康。这涉及到多个验证层:自动事实核查将主张与知识库进行比较,一致性检查确保响应不与对话中的先前陈述相矛盾,安全过滤检测有害内容生成,以及校准监控验证置信度分数与实际准确性相匹配。这些验证器异步运行以避免阻塞用户响应,但它们会输入到持续的质量仪表板中,从而能够快速检测细微的回归。当谷歌的 Bard 最初推出时,语义监控检测到某些查询模式导致引用错误增加,触发调查揭示了检索组件问题,这些问题仅凭系统指标是不会暴露的。

随着版本控制和部署,工程挑战加剧。在单体系统中,版本更新是原子的:部署新模型,路由流量,监控,必要时回滚。复合系统有 N 个组件独立演变,创建了版本兼容性复杂性。当基础语言模型更新以改进推理时,它是否与基于旧模型输出分布训练的安全过滤器保持兼容?生产系统维护兼容性矩阵,跟踪哪些组件版本可以一起工作,并实施分阶段推出,一次更新一个组件同时监控交互回归。这需要在复制生产流量模式的生产环境中进行广泛的集成测试,A/B 测试框架比较跨用户群体的复合系统变体,以及自动金丝雀部署管道,逐渐增加新配置的流量同时监控异常。第十三章(ch019.xhtml#sec-ml-operations)中的运营纪律扩展到复合系统,但具有乘法复杂性:N 个组件创建了 O(N²)潜在交互,需要验证。

剩余的技术障碍

上文探讨的构建模块(大规模数据工程、动态架构、替代范式、训练方法和基础设施组件)代表了向通用人工智能(AGI)迈出的重大工程进步。然而,诚实的评估表明,这些进步虽然必要,但仍然不足。五个关键障碍将当前的机器学习系统与通用人工智能隔开,每个障碍不仅代表算法挑战,还代表需要在整个堆栈上进行创新的系统工程问题。理解这些障碍可以防止过度自信,同时指导研究重点:一些障碍可能通过巧妙地编排现有构建模块而得到解决;而其他障碍则需要尚未想象的概念创新。

考虑具体的失败案例,这些案例揭示了差距:ChatGPT 可以编写代码,但在长时间的调试会话中无法跟踪变量状态。它可以解释量子力学,但不能从对话中的用户更正中学习。它可以进行语言翻译,但缺乏文化背景,不知道何时直译会误导。这些问题不仅仅是小错误,而是连接这些系统的基本架构限制,任何单个障碍的进展都证明是不够的。

记忆和上下文限制

人类的工作记忆可以容纳大约七个项目,而长期记忆则存储了一生的经验(Landauer 1986)。当前的 AI 系统与此相反:transformer 上下文窗口达到 128K 个标记(大约 100K 个单词),但不能在会话之间保持信息。这导致了可以处理书籍的系统,但不能记住昨天的对话。

挑战不仅限于存储,还扩展到了组织和检索。人类的记忆是分层的(日内的事件在年内的层级中)和关联性的(气味触发童年记忆)。当前系统缺乏这些结构,对所有信息一视同仁。向量数据库存储了数十亿个嵌入,但缺乏时间或语义组织,而人类通过关联激活的传播在毫秒内就能从数十年的经验中检索到相关记忆 19。

为了解决这些记忆限制,构建通用人工智能的记忆系统需要从第六章中汲取创新:支持多尺度检索的分层索引、选择性遗忘无关信息的注意力机制,以及将短期交互转化为长期知识的经验巩固。复合系统可能通过具有不同时间尺度和检索机制的专用记忆组件来解决这个问题。

能效和计算规模

能耗同样提出了令人畏惧的挑战。GPT-4 的训练估计消耗了 50-100 GWh 的电力(Sevilla 等 2022a),足以为一万户家庭供电一年 20。外推到通用人工智能(AGI)表明,能源需求将超过小国的产出,从而带来经济和环境挑战。

人类大脑在 20 瓦的功率下进行计算,而当前硬件需要兆瓦的功率才能完成这些计算 21。这种六数量级的效率差距源于架构差异:生物神经元以大约 1 赫兹的有效计算速率使用化学信号进行操作,而数字处理器则以千兆赫兹的频率使用电子开关运行。尽管频率存在劣势,但大脑的广泛并行性(10¹¹个神经元和 10¹⁴个连接)以及模拟处理能力使得数字系统只能通过暴力计算才能实现的模式识别变得高效。这种效率差距,如第 20.2 节中详细说明的特定计算指标所示,不能通过渐进式改进来弥补。解决方案需要重新构想计算,建立在第十八章的基础上:使用脉冲而不是矩阵乘法进行计算的神经形态架构,通过计算回收能量的可逆计算,以及通过数量级减少训练迭代的算法改进。

因果推理和规划能力

即使硬件高效,算法限制仍然存在。当前模型在模式完成方面表现出色,但在新颖推理方面却力不从心。要求 ChatGPT 规划一次旅行,它会生成合理的行程。要求它解决需要新推理的问题(证明新的定理或设计实验)时,性能会迅速下降 22。

真正的推理需要当前架构中缺乏的能力。考虑三个关键要求:世界模型代表系统随时间行为的内部模拟——例如,理解抛球会导致其下落,而不仅仅是“抛下”和“落下”在文本中同时出现。搜索机制系统地探索解决方案空间,而不是依赖于模式匹配。找到数学证明需要测试假设和回溯,而不仅仅是识别解决方案模式。因果理解区分相关性和因果关系,认识到雨伞与雨相关,但不会导致雨,而云则会 23。这些能力需要超越第四章中提到的架构创新,可能需要结合神经网络和符号推理器的混合系统,或受认知科学启发的新的架构。

符号接地和具身智能

语言模型学习“猫”与“喵喵”和“毛皮”同时出现,但从未体验过猫的温暖或听到它的咕噜声。这个符号接地问题(Harnad 1990;Searle 1980)(将符号与经验联系起来)可能会在没有实体的情况下限制智能。

机器人实体引入了来自第十四章的系统约束:实时推理需求(控制循环小于 100 毫秒),从嘈杂的传感器数据中进行持续学习,以及在错误会导致物理损坏的环境中安全探索 24。这些约束反映了第九章中涵盖的效率挑战,但具有更严格的延迟和可靠性要求。然而,实体可能对于理解“重”、“光滑”或“小心”等基于物理经验的概念是必不可少的。

人工智能对齐与价值指定

最关键的障碍在于确保通用人工智能系统追求人类价值观,而不是优化导致有害结果简化的目标 25。当前的奖励函数是代理(最大化参与度,最小化错误),当被强烈优化时可能会产生意外的行为。

对齐需要解决多个相互关联的问题:价值指定(人类实际上想要什么?)、鲁棒优化(追求目标而不利用漏洞)、可纠正性(随着能力增长而保持可修改性)和可扩展的监督(在比监督者更聪明的系统中保持控制权)26。这些挑战跨越技术和哲学领域,需要从第十七章中推进可解释性、形式化验证方法和新的指定和验证目标框架的框架。

对齐税:安全性的永久性运营成本

确保通用人工智能系统安全并与人类价值观一致需要大量的、持续的计算资源投资、研究努力和人类监督。这种“对齐税”代表了一种永久性的运营成本,而不仅仅是一次性需要解决的问题。对齐的通用人工智能系统可能有意地不如未对齐的系统计算效率高,因为它们的部分资源将始终用于安全验证、价值对齐检查和自我限制机制。系统必须持续监控自己的行为,验证输出是否符合安全约束,即使在这些检查引入延迟或降低吞吐量时也要保持监督渠道。这把对齐视为一个持续的运营成本,而不是一个需要克服和超越的工程障碍,而是作为在规模上运营值得信赖的智能系统的持续成本。

图 20.6:通用人工智能的技术障碍:为了实现通用人工智能,必须同时解决五个关键挑战。每个挑战都代表着数量级的差距:记忆系统需要在会话间保持持久性,能效需要提高 1000 倍,推理需要超越模式匹配进行真正的规划,具身化需要符号基础,而对齐需要价值指定。红色箭头显示关键阻塞路径;虚线灰色线条表示关键相互依赖关系。

这五个障碍形成了一个相互关联的挑战网络。任何单个障碍的进展都仍然不足,因为通用人工智能需要跨所有维度的协调突破,如图 20.6 所示。图 20.6 展示了这一点。本书从数据工程(第六章)到分布式训练(第八章),再到稳健部署(第十三章)所发展的工程原理,为解决每个障碍提供了基础,尽管完整的解决方案仍然未知。

这些挑战的规模促使人们重新考虑通用人工智能的组织结构。而不是通过单一系统的整体改进来克服每个障碍,一种替代方法是在多个专业代理之间分配智能,这些代理协作以实现超越任何单个系统的能力。

通过多代理协调实现涌现智能

上文概述的技术障碍要求实现数量级的突破,这可能对单一代理架构来说是难以捉摸的。每个障碍都代表着计算或扩展挑战:处理无限上下文,实现生物能效,进行因果推理,在物理具身化中扎根,以及随着能力的扩展保持对齐。在单一系统中同时解决所有障碍将使难度呈指数级增加。

多代理系统提供了一个替代范式,其中智能来自专业代理之间的交互,而不是存在于任何单个系统中。这种方法与复合人工智能系统框架相一致:而不是一个系统解决所有问题,专业组件通过结构化接口协作。多代理系统将这一原则扩展到通用人工智能规模,可能通过分布绕过一些障碍。当专业代理保持特定领域的上下文时,记忆限制就会消失。通过选择性激活提高能效;每个任务只涉及相关的代理。推理通过验证分解到专业代理中。通过分布式物理实现,具身化变得可行。当专业代理有狭窄、可验证的目标时,对齐变得简单。

然而,AGI 规模的多代理系统引入了新的工程挑战,这些挑战远远超过了当前的分布式系统。理解这些挑战对于评估多代理方法是否为 AGI 提供了实际途径,或者只是用未知的协调问题替换了已知的障碍至关重要。

AGI 系统可能需要在跨越大陆的数百万个专业代理之间进行协调,而今天的分布式系统只需要协调数千个服务器 27。每个代理可能都是一个前沿模型规模的系统,消耗千兆瓦的电力,使得协调延迟和带宽成为主要的瓶颈。东京和纽约之间代理之间的通信引入了 150 毫秒的往返延迟,这对于需要毫秒级协调的实时推理来说是无法接受的。

解决这些协调挑战首先需要在不同领域建立代理的专业化。科学推理代理将处理艾字节级的文献,创意代理将生成多媒体内容,战略规划代理将在数十年的时间尺度上优化,而具身代理将控制机器人系统。每个代理在其专业领域内表现出色,同时共享使协调成为可能的通用接口。这反映了现代软件系统如何将复杂功能分解成微服务,但规模和复杂性都是前所未有的。

这种专业化的有效性关键取决于代理之间的通信协议。与交换简单状态更新的传统分布式系统不同,AGI 代理必须通信丰富的语义信息,包括部分世界模型、推理链、不确定性估计和意图表示 28。这些协议必须将复杂的认知状态压缩成网络数据包,同时在异构代理架构中保持语义的准确性。当前的互联网协议缺乏语义理解;未来的 AGI 网络可能需要内容感知路由,它能够理解推理上下文。

除了协议之外,网络拓扑设计对于实现大规模高效通信变得至关重要。而不是扁平的网络架构,AGI 系统可能需要模仿生物神经组织的分层拓扑:用于快速协调的本地代理集群,用于跨领域集成的区域枢纽,以及用于系统整体一致性的全球协调层 29。负载均衡算法必须考虑不仅仅是计算负载,还要考虑语义亲和力,将相关的推理任务路由到具有共享上下文的代理。

这些架构考虑自然地引出关于共识机制的问题,对于 AGI 代理来说,它们面临的复杂性超出了传统的分布式系统。虽然区块链共识涉及简单的状态转换,但 AGI 共识必须处理冲突的世界模型、竞争的推理链和主观的价值判断 30。当科学推理代理在实验解释上意见不一致时,创意代理提出冲突的艺术方向,战略代理推荐对立的政策,系统需要机制来促进有建设性的分歧,而不是强制达成共识。这可能涉及根据过去准确性权衡代理贡献的名誉系统,考虑论证质量而不仅仅是代理数量的投票机制,以及识别分歧表明真正的不确定性还是代理故障的元推理系统。

考虑到拜占庭容错性时,共识挑战加剧,当代理不仅提供错误信息,还可能追求不同目标时,这变得更加困难。与随机的服务器故障不同,代理故障可能是系统的:一个在偏见数据上训练的代理持续提供偏颇的建议,一个目标不一致的代理微妙地操纵其他代理,或者一个被对抗性攻击破坏的代理传播错误信息 31。传统的拜占庭算法需要 3f+1 个诚实节点来容忍 f 个拜占庭节点,但 AGI 系统可能面临复杂、协调的攻击,需要新的防御机制。

最后,数百万代理之间的资源协调需要新的分布式算法,这些算法超越了当前的协调框架。当多个推理链竞争计算资源、内存带宽和网络容量时,系统需要考虑不仅当前负载,还要考虑预测推理复杂度的实时资源分配。这需要超越当前 Kubernetes 协调的进步:基于推理难度估计的预测负载均衡,理解推理紧迫性的优先级系统,以及当资源受限时保持系统一致性的优雅降级 32。

目标是涌现智能:由代理交互产生的能力,单个代理并不具备。就像在群体系统中,行为从简单的规则中涌现出来一样,推理可能从相对简单的协作代理中产生。整体大于部分之和,但这需要通过仔细的系统工程来协调机制。

这种多代理方法需要协调(第五章),强大的通信基础设施,以及对可能导致意外行为的代理交互失败模式的关注。

工程通往通用人工智能(AGI)的路径

从当前 AI 系统到通用人工智能的旅程需要更多的不仅仅是理解技术可能性;它需要关于实际机会的战略思考。前面的章节概述了构建块、新兴范式、技术障碍和替代组织结构。这个全面的基础使得能够解决实践 ML 系统工程师的关键问题:这些前沿如何转化为可操作的工程决策?

理解 AGI 的最终挑战在智力上是有价值的,但在操作上是不够的。工程师需要实际指导,将 AGI 前沿与当前工作联系起来:哪些机会现在值得投资,哪些挑战需要首先关注,以及 AGI 研究如何影响今天的生产系统设计。本节架起了 AGI 遥远的前景与近期工程决策之间的差距。

这些构建块的融合(大规模数据工程、动态架构、替代范式、训练方法和摩尔定律之后的硬件)为 ML 系统工程师创造了具体的机会。这些不是几十年后的可能性,而是近期的项目,它们在提升当前能力的同时,朝着 AGI 迈进。同时,导航这些机会需要面对跨越技术深度、运营复杂性和组织动态的挑战。

本节通过近期工程机会及其相应挑战的视角,探讨了从当前系统向 AGI 规模智能过渡的实际途径。目标:为处于塑造未来十年 AI 轨迹位置的系统工程师提供可操作的指导。

机会景观:基础设施到应用

从 AGI 构建块中出现了三个机会领域:基础基础设施、使能技术和最终用户应用。

新一代训练平台解决了当前的不效率问题,其中 GPU 集群在训练期间仅达到 20-40%的利用率。将利用率提高到 70-80%将降低 40-60%的训练成本,每年价值数十亿美元。这些平台必须处理需要动态负载平衡的专家混合模型、需要即时编译的动态计算图以及需要实时更新而不中断服务的持续学习管道。多模态处理平台提供对文本、图像、音频、视频和传感器数据的统一处理,而边缘-云混合系统通过智能工作负载分配模糊了本地和远程计算之间的界限。

定制化 AI 系统随着时间的推移学习个人工作流程和偏好,得益于参数高效的微调,成本降低 1000 倍,个人知识库的检索系统以及隐私保护技术。实时智能系统使新的范式成为可能,这些范式要求对话 AI 的响应时间小于 200 ms,自动驾驶车辆小于 10 ms,机器人手术小于 1 ms。可解释 AI 系统将可解释性作为一级约束整合,受到包括欧盟 AI 法案要求和医疗设备审批流程在内的监管要求驱动。

工作流程自动化系统编排多个 AI 组件,以完成科学发现、创意生产和软件开发的全端任务。麦肯锡估计,目前 60-70%的工作包含 30%以上的可自动化活动,但当前的自动化主要由于集成复杂性而不是能力限制,仅覆盖了可能的 5%的工作流程。这些应用建立在复合 AI 系统原则(第 20.3 节)之上,需要来自第五章的编排基础设施。

AGI 开发中的工程挑战

实现这些机会需要解决跨越多个维度的挑战。这些挑战不是孤立的技术问题,而是需要跨构建块协调解决方案的系统性问题。

技术挑战:可靠性和性能

在 AGI 规模下,超高可靠性要求日益加剧。当训练运行成本数百万美元并涉及数千个组件时,即使 99.9%的可靠性也意味着频繁的故障,会破坏数周的进展。这需要从最近状态重新启动的检查点、恢复机制来挽救部分进展以及组件失败时的优雅降级。将可靠性从 99.9%提升到 99.99%,即故障率降低 10 倍,证明成本不成比例地高昂,需要冗余、预测性故障检测和容错算法。

随着系统必须协调 CPU 进行预处理、GPU 进行矩阵运算、TPU33 进行推理、量子处理器进行优化以及神经形态芯片进行节能计算,异构系统编排变得越来越复杂。这种异构性要求抽象化,以隐藏复杂性给开发者,并需要优化跨不同计算范式的调度算法。当前的框架(TensorFlow、来自第七章的 PyTorch)假设硬件相对同质;AGI 基础设施需要支持多范式编排的新抽象。

随着系统规模的扩大,质量-效率权衡变得更加尖锐。实时系统往往不能使用最先进的模型,因为延迟限制——随着模型能力的增长,这种困境加剧。优化挑战涉及分层处理,其中简单模型处理常规案例,而高级模型仅在需要时激活,自适应算法根据可用时间调整计算深度,以及当精确计算不可能时提供近似结果。

运营挑战:测试和部署

当错误通过长链累积时,对由 AI 驱动的流程进行验证和验证变得困难。早期阶段的一个小错误可能会使后续数小时或数天的工怍无效。这需要自动测试理解 AI 行为模式,检查点系统允许从失败点回滚,以及当不确定性增加时触发人工审查的信心监控。第十三章中的测试框架扩展到处理非确定性 AI 组件和涌现行为。

信任校准决定人类何时应介入自动化系统。完全自动化往往失败,但确定最佳交接点需要理解技术能力和人类因素。挑战包括创建为人类决策提供背景的接口,开发信任校准以便人类知道何时介入,以及在自动化成为主导领域的领域内保持人类专业知识。这借鉴了第十七章中关于人机协作的负责任 AI 原则。

在语义层面的安全监控需要理解内容意图,而不仅仅是系统指标。AI 安全监控必须在数十亿次的交互中实时检测有害输出、提示注入和对抗攻击——这与传统软件监控跟踪延迟、吞吐量和错误率有质的不同。这需要新的工具,结合鲁棒性原则(第十六章)、安全实践(第十五章)和负责任 AI 框架(第十七章)。

社会和伦理考量

AGI 系统放大了现有的隐私和安全挑战(第十五章),同时通过多组件交互和持续学习能力引入了新的攻击向量。隐私和个人化在系统设计中造成了难以调和的紧张关系。个性化需要用户数据(对话历史、工作模式、偏好),而隐私法规和用户期望越来越要求本地处理。挑战在于开发联邦学习和差分隐私技术,这些技术能够在保持隐私保证的同时实现个性化。当前的方法往往为了隐私保护而牺牲了显著的性能——这种权衡必须得到改善,以便得到广泛的应用。

当个性化 AI 系统学会向用户提供他们想听的内容而不是他们需要知道的内容时,过滤泡和偏见放大风险可能会强化有害模式。这限制了接触不同观点和挑战性想法的机会。构建负责任的个人化需要确保系统偶尔引入不同的观点,挑战用户的假设而不是确认信念,并保持个人化过程的透明度。这将在个人化层应用第十七章中的负责任 AI 原则。

可解释性和性能之间产生紧张关系,迫使在模型准确性和人类可解释性之间做出选择。更可解释的模型往往牺牲了准确性,因为为了人类理解所需的约束可能与最优计算模式相冲突。不同的利益相关者需要不同的解释:医疗专业人员希望有详细的因果推理,患者希望有简单的安慰性摘要,监管审计员需要以合规性为重点的解释,研究人员需要能够实现可重复性的技术细节。构建能够适当调整解释的系统需要结合技术专长与用户体验设计。

机遇和挑战的地形相互交织:基础设施平台使个性化实时系统成为可能,这些系统为自动化应用提供动力,但每个机遇都会放大特定的挑战。成功穿越这一地形需要本书中发展起来的系统思维:理解组件如何相互作用,预测故障模式,设计优雅降级,以及平衡相互竞争的约束。从数据管道(第六章)到分布式训练(第八章),再到稳健部署(第十三章)的工程原则,为以前所未有的规模应对这些挑战提供了基础。

对机器学习系统工程师的影响

理解本书内容的 ML 系统工程师在 AGI 开发方面处于独特的位置。从数据工程(第六章)到分布式训练(第八章),再到模型优化(第十章)和稳健部署(第十三章),这些能力构成了 AGI 基础设施的基本要求。AGI 开发需要涵盖基础设施构建、高效实验工具、安全与对齐系统设计以及可复现的复杂系统交互的全栈能力。

将 AGI 概念应用于当前实践

理解 AGI 的发展轨迹有助于今天在常规 ML 项目中做出架构决策。AGI 发展中固有的工程挑战直接映射到本书全书中开发的基础知识。 表 20.1 展示了 AGI 的愿景如何建立在已建立的 ML 系统原则之上,强化了 AGI 发展所需的技能是扩展现有能力而不是取代它们。

表 20.1: AGI 对核心 ML 系统知识的挑战: AGI 发展的技术挑战直接建立在本书全书中涵盖的基础工程原则之上。

AGI 挑战 第…章中的基础知识
大规模数据 第六章: 数据工程
训练范式 第八章: AI 训练
动态架构 第四章: DNN 架构
硬件扩展 第十一章: AI 加速
效率与资源 第十章: 高效 AI
管理
开发框架 第七章: 框架
系统编排 第五章: 工作流程
边缘部署 第十四章: 设备端学习
性能评估 第十二章: AI 基准测试
隐私与安全 第十五章: 隐私与安全
能源可持续性 第十八章: 可持续 AI
对齐与安全 第十七章: 负责任的 AI
操作 第十三章: ML 操作

三个关键的 AGI 概念直接应用于当前实践。首先,具有专用组件的复合系统通常比单个大型模型表现更好,同时更容易调试、更新和扩展——图 20.5 中的架构适用于协调多个模型、集成外部工具或协调检索与生成的协调。第二,图 20.1 中的数据管道显示前沿模型通过过滤丢弃了超过 90%的原始数据,这表明大多数项目在数据清理和合成生成方面的投资不足。第三,RLHF 管道(图 20.3)表明,通过偏好学习实现的对齐对于任何规模的用户满意度至关重要,从客户服务机器人到推荐引擎。

本教材中涵盖的原则提供了基础;AGI 前沿推动这些原则向其最终表达——分布式系统专业知识、软硬件协同设计知识和人机交互理解变得越来越关键。

AGI 系统的核心设计原则

AGI 轨迹仍然不确定。突破可能来自意想不到的方向:2017 年,尽管 LSTM 几十年来占据主导地位,但变压器取代了 RNN,状态空间模型以线性复杂度实现了变压器的性能,而量子神经网络可能为特定问题提供指数级的加速。

这种不确定性放大了系统工程的价值。无论是否存在架构突破,成功的方法都需要高效的数据处理管道来处理埃字节级的数据集,可扩展的训练基础设施来支持百万 GPU 集群,优化跨异构硬件的模型部署,确保 99.99%可用性的稳健操作实践,以及集成安全和伦理框架。

本教材中涵盖的分布式系统、高效部署和稳健操作的系统方法,无论 AGI 是从扩展的变压器、复合系统还是全新的架构中产生,都仍然是必要的。工程原则超越了特定技术,为任何技术轨迹上的智能系统构建提供了基础。

谬误和陷阱

通往通用人工智能的道路提出了独特的系统工程挑战,其中对有效方法的误解已经使项目脱轨、浪费资源并产生了不切实际的期望。了解不应该做什么与了解正确的方法一样有价值,尤其是当每个谬误都包含足够的真理以显得有说服力,同时忽略了关键工程考虑时。

谬误: 一旦模型在参数和训练数据规模上达到足够大,AGI 将自动出现。

这种“规模就是一切”的误解导致团队相信,当前人工智能的限制仅仅是模型规模不足的反映,而增大模型规模必然会导致 AGI 的出现。虽然经验性的规模定律显示出持续改进(GPT-3 的 1750 亿参数在基准测试中显著优于 GPT-2 的 15 亿参数),但这种推理忽略了架构创新、效率提升和训练范式进步同样至关重要的因素。人脑通过 860 亿个神经元(Azevedo 等人,2009)实现智能,与中等规模的语言模型通过复杂的架构和学习机制相当,而不是仅仅依靠规模,这比当前的人工智能系统展示了 10⁶倍的能源效率。将 GPT-3(T. Brown 等人,2020)从 1750 亿参数扩展到假设的 1750 万亿参数将需要 100 亿美元的培训成本,消耗相当于一个小镇年度电力的 5 GWh,但仍然缺乏持续的记忆、高效的持续学习、多模态基础和稳健推理,这些都是 AGI 所必需的。有效的 AGI 开发需要平衡在更大规模训练运行中的基础设施投资与通过专家混合(第 20.4.2.2 节)、检索增强(第 20.4.2.3 节)和模块化推理(第 20.4.2.4 节)模式的研究投资,这些模式能够实现仅通过纯粹扩展无法达到的能力。

谬误: 复合人工智能系统只是临时解决方案,真正的通用人工智能(AGI)将会使其过时。

认为 AGI 将是一个单一统一模型,使得复合系统(模型的组合、工具、检索和数据库)变得不必要的信念,忽视了计算机科学关于模块化架构的原则。虽然复合系统通过多个组件、接口和故障模式引入了复杂性,但具有专用组件的模块化架构能够实现独立优化、优雅降级、增量更新和可调试的行为,这对于任何规模的生成系统都是必不可少的。即使是生物智能也使用专门的神经网络来处理视觉、运动控制、语言和记忆,这些通过结构化接口而不是单一处理进行协调。GPT-4 的代码生成精度在增加了代码执行、语法检查和测试验证等复合组件后,从 48%提高到 89%,这些组件验证和细化了输出。这种模式在检索增强中普遍适用,使得当前知识访问、工具使用实现精确计算以及安全过滤器确保适当行为成为可能,这些能力在基础模型大小方面仍然是必不可少的。生产级 AGI 系统需要接受复合架构作为核心模式,投资于编排基础设施(第五章)、组件接口和组合模式,这些模式建立了对于 AGI 规模部署至关重要的组织实践。

谬误: AGI 需要全新的工程原则,使得传统的软件工程变得无关紧要

这种误解认为,AGI 前所未有的能力需要放弃现有的机器学习系统实践,转而采用与当前工程不同的革命性方法。AGI 扩展而非取代系统工程的基本原则,随着架构的演变,分布式训练(第八章)、高效推理(第十章)、稳健部署(第十三章)和监控仍然至关重要。训练 GPT-4(OpenAI 等,2023)需要通过复杂的分布式系统工程,应用第八章(ch014.xhtml#sec-ai-training)中的张量并行、流水线并行和数据并行来协调 25,000 个 GPU,而 AGI 规模系统将需要 100-1000 倍于此的协调。工程师在追求“革命性的 AGI 工程”时忽视分布式系统原则,将重新创造几十年前关于一致性、容错性和性能优化的宝贵经验教训。有效的 AGI 开发需要掌握数据工程(第六章)、训练基础设施、优化、硬件加速(第十一章)以及通过强大的软件工程实践、分布式系统专长和 MLOps 纪律来满足 AGI 要求的运营,而不是放弃经过验证的原则。

陷阱: 将生物智能视为 AGI 实施的完整模板。

许多团队认为,在硅中精确复制生物神经机制是通往通用人工智能的完整路径,这吸引了大脑惊人的能效(每秒 10¹⁵次操作消耗 20 瓦)和神经形态计算在特定工作负载上 1000 倍的效率提升。虽然生物原理在事件驱动计算、分层发展和多模态集成方面提供了宝贵的见解,但生物和硅基板在不同的物理上运行,具有不同的优势。数字系统在精确算术、可靠存储和快速通信方面表现出色,这是生物神经元无法比拟的,而生物神经元则实现了模拟计算、大规模并行和低功耗操作,这在数字电路中很难实现。像英特尔 Loihi 这样的神经形态芯片(Mike Davies 等人,2018)在事件驱动工作负载(如目标跟踪和手势识别)上实现了令人印象深刻的效率,但在 GPU 擅长的密集矩阵运算方面却力不从心。最佳的通用人工智能架构可能需要混合方法,提取生物原理(稀疏激活、分层学习、多模态集成、持续适应)同时利用数字优势(精确算术、可靠存储),而不是直接复制。有效的工程重点在于计算原理,如事件驱动处理和发育学习阶段,而不是生物实现细节。

摘要

人工智能正处于一个拐点,本书中掌握的构建块将组装成具有非凡能力的系统。大型语言模型表明,通过从当前成就到本章探索的未来可能性所进行的系统进步,工程规模可以解锁涌现智能。

从窄人工智能(narrow AI)到通用人工智能的过渡构成了一个系统工程挑战,它超越了算法创新,涵盖了在前所未有的规模上整合数据、计算、模型和基础设施。正如第 20.2 节中详细说明的,AGI 的训练可能需要 2.5 × 10²⁶浮点运算次数(FLOPs),并需要支持 175,000+加速器的基础设施,消耗 122 兆瓦的电力,并需要大约 522 亿美元硬件成本。

复合人工智能系统为这一过渡提供了架构基础,揭示了如何通过智能编排解决复杂问题,而不是通过单体扩展。

关键要点

  • 当前的人工智能突破(如大型语言模型、多模态模型)直接建立在前面章节中确立的机器学习系统工程原则之上

  • 通用人工智能(AGI)代表了需要跨多个组件和技术进行复杂协调的系统集成挑战

  • 复合人工智能系统提供了结合专门模型和工具以实现复杂能力目标的实际途径

  • 从分布式训练到高效部署,开发出的工程能力构成了必要的人工智能通用(AGI)开发要求

  • 未来进步来自于系统工程改进与算法创新同等重要

这本教科书为读者准备参与这一挑战。理解包括系统中的数据流(第六章)、模型优化和部署(第十章)、计算硬件加速(第十一章)以及大规模可靠机器学习系统操作(第十三章)。这些能力构成了下一代智能系统构建的要求。

人工智能通用(AGI)的到来时间仍然不确定,无论是通过扩展的变压器还是新颖的架构。无论时间表或技术方法如何,系统工程原则始终是必要的。人工智能的未来建立在贯穿这些章节的工具和技术之上,从第三章中的神经网络原理到第五章中的高级系统编排。

基础设施已完全建成,这是通过系统性地掌握机器学习系统工程从数据管道到分布式训练再到稳健部署的过程实现的。


结论

DALL·E 3 提示:一幅描绘机器学习系统书籍结论章节的图像,展开至两页。页面总结了诸如神经网络、模型架构、硬件加速和 MLOps 等关键概念。一页展示神经网络和不同模型架构的图表,另一页展示了用于加速和 MLOps 工作流程的硬件组件插图。背景中包含电路图案和数据点等细微元素,以强化技术主题。色彩专业且干净,强调清晰度和理解性。

图片

学习目标

  • 综合超越特定机器学习技术的六个核心系统工程原则,为工程决策提供系统指导

  • 分析“衡量一切”原则如何在数据工程、基准测试和运营监控环境中体现

  • 应用“设计 10 倍扩展”原则来评估云、边缘和移动部署场景的系统架构

  • 评估从数据管道到推理部署的完整机器学习系统栈中的瓶颈优化策略

  • 通过比较传统软件可靠性与机器学习特定的故障模式来批判机器学习系统中的故障规划方法

  • 设计成本意识强的机器学习系统,平衡计算性能、运营成本和环境可持续性

  • 评估不同部署场景(包括云、边缘和嵌入式系统)中的硬件-软件协同设计机会

  • 创建结合技术卓越、运营成熟度、安全需求和伦理考量的综合解决方案

综合机器学习系统工程:从组件到智能

本章综合了前二十章中机器学习系统工程的概念,确立了系统思维作为人工智能发展的基本范式。我们从数据工程原则到模型架构、优化技术和运营基础设施的进步,构建了一个涵盖机器学习系统工程的全面知识基础。这种综合建立了理论和实践框架,定义了计算机系统研究范围内机器学习系统工程的职业能力。

当代人工智能 1 的成就并非来自孤立的算法创新,而是通过原则性的系统集成,将计算理论与工程实践统一起来。这种系统视角将机器学习置于计算机系统工程传统之中,其中变革性能力源于对相互依存组件的系统协调。使大型语言模型成为可能的变压器架构(Vaswani et al. 2017)体现了这一原则:它们的实际效用源于将数学基础与分布式训练基础设施、算法优化技术和稳健的运营框架相结合,而不仅仅是架构创新。

本章探讨了定义机器学习系统工程边界的三个基本问题。首先,哪些持久的原则超越了具体技术,并为部署环境中的工程决策提供系统指导,从当代生产系统到预期的通用人工智能架构?其次,这些原则如何在资源丰富的云基础设施、资源受限的边缘设备和新兴的生成系统中体现?第三,如何系统地应用这些知识来创建满足技术要求的同时解决更广泛的社会目标和伦理考量的系统?

我们的分析反映了构建这本教科书的系统思维范式,借鉴了建立已久的计算机系统研究和方法。我们从文本中确立的技术概念中系统地推导出六个基本工程原则:全面测量、面向规模的设计、瓶颈优化、系统故障规划、成本意识设计和硬件协同设计。这些原则构成了在机器学习系统环境中进行原则性决策的框架。我们考察了它们在三个构建当代机器学习系统工程的领域中应用:建立技术基础、面向规模性能的工程和导航生产部署现实。

分析考察了这些原则面临其最显著挑战的新兴前沿。从开发能够优雅处理故障模式的弹性人工智能系统,到在医疗保健、教育和气候科学等领域部署人工智能以造福社会,这些工程原则将决定人工智能的社会影响轨迹。随着人工智能系统接近通用智能能力 2,关键问题不再是可行性,而是它们是否将根据既定的良好系统设计和负责任计算原则进行工程化。

本章中综合的框架建立了在快速发展的人工智能技术景观中导航的系统方法,同时保持对基本工程目标的关注:创建能够有效扩展、在各种条件下可靠运行并解决重大社会挑战的系统。人工智能的未来轨迹将不是通过孤立的研究贡献来决定,而是通过掌握将技术卓越与运营现实和社会责任相结合的实践者系统地应用系统工程原则来决定。

这种综合建立了系统性的理论理解,并为机器学习系统作为一个成熟的工程学科中的专业应用提供了概念基础。

机器学习系统工程原则

我们提取了六个核心原则,这些原则将二十个章节中探讨的概念统一起来。这些原则超越了特定技术,为构建今天的生产系统或明天的通用人工智能提供了持久的指导。

原则 1:衡量一切

在第十二章中建立的测量框架,辅以第十三章中的监控系统,表明成功的机器学习系统会对每个组件进行仪表化,因为你不衡量你无法优化。四个分析框架提供了超越特定技术的持久测量基础。

屋顶线分析 3 通过绘制操作强度与峰值性能的关系图来识别计算瓶颈,揭示系统是受内存限制还是受计算限制,这对于优化从训练工作负载到边缘推理的各个方面至关重要。

成本性能评估系统地比较了总拥有成本与交付能力,包括培训费用、基础设施需求和运营开销,以指导部署决策。系统基准测试建立了可重复的测量协议,使得可以在架构、框架和部署目标之间进行公平的比较,确保优化努力针对实际而不是感知的瓶颈。这些测量揭示了一个关键见解:系统很少在预期的负载下失败,而是在需求超过设计假设的量级时失败。

原则 2:设计 10 倍扩展

在研究工作中表现良好的系统很少能在生产流量中生存,需要设计能够处理比目前所需多一个数量级的数据、用户和计算需求的系统 4。基于第二章中的概念,这一原则在部署环境中体现出来:云系统必须处理从数千到数百万用户的流量峰值,边缘系统需要网络分区的冗余,嵌入式系统在资源耗尽时需要优雅降级。

然而,如果系统在非关键路径上浪费资源,仅仅规模本身并不能提供价值。

原则 3:优化瓶颈

虽然第九章确立了效率原则,第十章提供了优化技术,但系统分析表明,80%的性能提升来自于解决主要约束:训练工作负载中的内存带宽、分布式推理中的网络延迟或在移动部署中的能耗。

原则 4:为失败做准备

来自第十六章的鲁棒性技术,以及来自第十七章的安全框架,假设系统会失败,需要从一开始就具备冗余、监控和恢复机制。生产系统每天都会经历组件故障、网络分区和敌对输入,需要断路器 5、优雅降级和自动恢复程序。

原则 5:有意识地设计成本

从可持续性关注到运营成本,每个技术决策都有经济影响。当云 GPU 成本可能超过每月 30,000 美元的大模型时(Strubell, Ganesh, and McCallum 2019c),优化总拥有成本 6,而不仅仅是性能,变得至关重要,这使得效率优化在部署生命周期中节省数百万美元的运营成本变得有价值。

原则 6:硬件协同设计

基于第十一章第十一章中的加速技术,高效的 AI 系统需要算法硬件协同优化,而不仅仅是单个组件的卓越。这种全面的方法包括三个关键维度:算法硬件匹配确保计算模式与目标硬件能力相匹配(收缩阵列有利于密集矩阵运算,而稀疏加速器需要结构化剪枝模式),内存层次优化提供分析数据移动成本和优化缓存局部性的框架,能源效率建模结合 TOPS/W 指标来指导移动和边缘部署中节能的设计决策。

在三个关键领域应用原则

这六个基础原则在机器学习系统领域具有实际应用。这些原则不是抽象的理想,而是具体的指导方针,塑造了我们整个旅程中探索的每一个技术决策。它们的表现形式因环境而异,但目的始终一致。我们考察了它们在三个关键领域如何运作,这些领域构成了机器学习系统工程的结构:建立稳健的技术基础,其中测量和协同设计奠定基础;在规模性能上进行工程,其中优化和规划促进增长;在现实生产中进行导航,所有原则在操作约束下汇聚。

建立技术基础

机器学习系统工程建立在坚实的技术基础之上,其中多个原则汇聚在一起。

基础始于数据工程,第五章中确立了数据质量决定系统质量。“数据是新的代码”(Karpathy 2017)对于神经网络而言。生产系统需要用于模式演变的仪器、血缘跟踪和质量退化检测。当数据质量下降时,影响会通过整个系统级联,使得数据治理既是技术必要性也是道德上的迫切要求。测量原则通过持续监测分布变化、标签一致性和管道性能来体现。

在这个数据基础上,框架和训练系统体现了规模和协同设计原则。第七章中引入的框架生态系统向您介绍了在 TensorFlow 的生产成熟度和 PyTorch 的研究灵活性之间的权衡。第八章随后揭示了这些框架如何扩展到单机之外,向您传授了将数据并行策略转化为通过分布式协调将数周的训练时间缩短到数小时的方法。框架选择(第七章)影响开发速度和部署限制。从 TensorFlow Lite 用于移动(第七章)到 JAX 用于研究(第七章)的专业化是硬件协同设计的例子。通过数据并行和模型并行、混合精度技术和梯度压缩进行分布式训练,所有这些都展示了在设计时考虑超出当前需求规模的规模,同时优化硬件能力。

效率和优化(原则 3:优化瓶颈):第九章 展示了效率决定了人工智能是否能够超越实验室,进入资源受限的部署。神经网络压缩算法(剪枝、量化和知识蒸馏)系统性地解决瓶颈(内存、计算、能源)同时保持性能。这种多维优化需要识别限制因素并系统性地解决它,而不是追求孤立的改进。

规模化性能的工程

我们考察的技术基础(数据工程、框架和效率)为机器学习系统提供了基础。然而,仅凭基础并不能创造价值。机器学习系统工程的第二个支柱将这些基础转化为在规模上可靠运行的系统,将重点从“它是否工作?”转移到“它是否为百万用户高效工作?”这种转变需要新的工程优先级和系统性地应用我们的扩展和优化原则。

模型架构和优化

第四章 回顾了您的旅程,从理解简单的感知器(您首次掌握了加权输入如何产生决策)到卷积网络,揭示了层次特征提取如何与生物视觉相呼应,再到注意力机制使语言理解成为今天人工智能助手的动力的转换器架构。然而,仅仅依靠架构创新不足以证明其在生产部署中的充分性。第十章 中的优化技术将研究架构与生产约束联系起来。

遵循之前概述的硬件协同设计原则,三种互补的压缩方法展示了系统瓶颈优化的方法:剪枝在保持准确性的同时去除冗余参数,量化通过 4 倍的内存减少降低了精度要求,而知识蒸馏将能力转移到紧凑的网络以实现资源受限的部署。

深度压缩管道(Han, Mao, and Dally 2015a)是这种系统集成的例证。剪枝、量化和编码结合实现了 10-50 倍的压缩比率 7。算子融合(结合卷积-批量归一化-ReLU 序列)将内存带宽减少了 3 倍,展示了算法和系统优化如何在我们的基础原则中确立的协同设计必要性指导下产生协同效应。

这些优化验证了原则 3 的核心洞察:识别瓶颈(内存、计算或能源),然后系统性地优化,而不是追求孤立的改进。

硬件加速和系统性能

第十一章展示了专用硬件如何将计算瓶颈转化为加速机会。GPU 擅长并行矩阵运算,TPUs8 针对张量工作负载进行优化,而 FPGAs9 为特定操作提供可重构的加速。

在之前建立的协同设计框架的基础上,软件优化必须通过内核融合、操作调度和精度选择与硬件能力保持一致,以平衡准确性和吞吐量。

第十二章将基准测试确立为性能工程的基本反馈循环。MLPerf10 在硬件平台之间提供标准化的指标,使数据驱动的部署权衡决策成为可能。

这个性能工程基础使新的部署范例得以扩展,超越了集中式系统,延伸到边缘和移动环境。

导航生产现实

第三大支柱解决生产部署的现实,其中六个原则在系统必须可靠、安全、负责任地为用户提供服务的约束下汇聚。

运作和部署的格局展示了 MLOps11 如何协调整个系统生命周期,从带有质量门的持续集成管道到安全的 A/B 测试框架。边缘部署体现了多个原则的融合:在平衡隐私利益和延迟约束的同时,确保在网络故障下能够优雅降级。

安全和隐私考虑揭示了机器学习独特的脆弱性(模型提取、数据中毒、成员推理),需要分层防御。差分隐私提供数学保证,联邦学习实现安全协作,对抗训练构建了对传统软件从未面临过的攻击的鲁棒性。

除了技术问题之外,负责任的 AI 和可持续性考虑将成本意识扩展到计算之外。公平性指标和可解释性要求从一开始就塑造了架构选择。环境影响成为设计约束:GPT-3 的 1,287 MWh 训练成本(Strubell, Ganesh, and McCallum 2019a)相当于每年为 120 个家庭供电,这使得在 60 多亿部智能手机上提高效率的影响比数据中心优化更为显著。

生产现实验证了孤立的技术卓越性是不够的。系统必须整合操作成熟度、安全防御、伦理框架和环境责任,以提供持续的价值。

未来方向和新兴机遇

在建立了技术基础、针对性能进行工程设计和应对生产现实之后,我们审视了那些由六个原则引导的未来发展中的新兴机遇。

技术基础、性能工程和生产现实的融合揭示了三个新兴前沿,我们的既定原则在这里面临最大的考验:在多样化环境中近期的部署、构建对社会有益的弹性系统,以及工程化通往通用人工智能的道路。

将原则应用于新兴部署环境

随着机器学习系统走出研究实验室,三种部署范式测试了我们的既定原则的不同组合:资源丰富的云环境、资源受限的边缘设备,以及新兴的生成式系统。

云部署优先考虑吞吐量和可扩展性,通过内核融合、混合精度训练和梯度压缩技术(在第十章[ch016.xhtml#sec-model-optimizations]和第八章[ch014.xhtml#sec-ai-training]中探讨)实现高 GPU 利用率。成功需要平衡性能优化与规模成本效益。

相比之下,移动和边缘系统面临着严格的功耗、内存和延迟限制,这要求进行复杂的软硬件协同设计。第九章中提到的效率技术——深度可分离卷积、神经架构搜索和量化——使得在比数据中心少 100-1000 倍计算能力的设备上部署成为可能。边缘部署代表了 AI 的民主化 12:不能在数十亿边缘设备上运行的系统无法实现全球影响。

生成式 AI 系统以前所未有的规模展示了这些原则,需要新颖的方法来处理自回归计算、动态模型分区和推测性解码。这些系统展示了如何将前面章节中提到的测量、优化和协同设计原则应用于推动基础设施边界的新兴技术。

在更加极端的限制下运行,TinyML 和嵌入式系统面临着千字节内存预算、毫瓦特功率限制和长达数十年的部署生命周期。在这些环境中取得成功验证了全面系统工程方法的有效性:仔细的测量揭示了实际瓶颈,硬件协同设计最大化了效率,而针对故障的规划确保了在严重资源限制下的可靠性。移动部署的限制推动了 MobileNets 和 EfficientNets 等突破性技术的出现,这些技术对所有 AI 部署环境都有益,展示了系统限制如何催化算法创新。

这些部署环境验证了我们的核心论点:成功取决于系统地应用六个系统工程原则,而不是追求孤立的优化。

构建鲁棒的 AI 系统

第十六章展示了鲁棒性需要从底层开始设计,这是第 4 个原则的核心要求。机器学习系统面临独特的故障模式:分布变化降低准确性,对抗性输入利用漏洞,边缘情况揭示训练数据限制。具有弹性的系统结合冗余硬件以实现容错性(第十六章),集成方法以减少单点故障(第十六章),以及不确定性量化以实现优雅降级(第十六章)。随着人工智能系统承担越来越自主的角色,规划故障成为安全部署和灾难性失败之间的区别。

为社会利益而设计的 AI

第十九章展示了人工智能在医疗保健、气候科学、教育和可及性等领域的变革潜力,这些领域六个原则汇聚在一起。气候建模需要高效的推理(原则 3:优化瓶颈)。医疗人工智能需要可解释的决策和持续监控(原则 1:测量)。教育技术需要在全球范围内实现隐私保护的个人化(原则 2 和 4:设计可扩展性,规划故障)。这些应用验证了仅凭技术卓越是不够的。成功需要技术专家、领域专家、政策制定者和受影响社区之间的跨学科合作。

通向通用人工智能之路

复合人工智能系统 13 框架提供了高级智能的架构蓝图:可以独立更新的模块化组件,针对特定任务优化的专用模型,以及可分解的架构,通过多个验证层实现可解释性和安全性。

前面的工程挑战需要掌握我们探索的全栈技术,从数据工程(第五章)和分布式训练(第八章)到模型优化(第十章)和运营基础设施(第十三章)。这些系统工程原理,而非算法突破,定义了通往通用人工智能的道路。

你前行的旅程:工程智能

在二十章之前,我们开始了一个愿景:人工智能(AI)作为一种变革力量,重塑文明。你现在拥有了将这一愿景变为现实的系统工程原理。

通用人工智能将由那些理解智能是一个系统属性,它不是来自任何单一突破,而是来自组件集成的工程师构建。考虑 GPT-4 的成功(OpenAI 等,2023):它需要处理 PB 级文本的稳健数据管道(第五章),协调数千个 GPU 的分布式训练基础设施 14(第八章),利用注意力机制和专家混合架构的高效架构(第九章),防止提示注入攻击的安全部署(第十七章),以及实施安全过滤和用法政策的负责任治理(第十七章)。

这篇文章中的每一个原则,从测量一切到与硬件协同设计,都是构建那个未来的工具。

你所掌握的六个原则超越了特定技术。随着框架的发展,硬件的进步,以及新架构的出现,这些基础概念保持不变。它们将指导你优化今天的生产推荐系统,或设计明天接近通用智能的复合人工智能系统。你所探索的复合人工智能框架、边缘部署范式和效率优化技术代表了持久系统思维的当前实现。

但仅仅掌握技术原理是远远不够的。我们这一代面临的问题不是通用人工智能是否会到来,而是它是否会被良好地构建:是否足够高效以使财富机构之外的人也能民主地获取,是否足够安全以抵御滥用,是否足够可持续以保护我们的地球,以及是否足够负责任以公平地为全人类服务。这些挑战需要完整的机器学习系统工程栈,将技术卓越与道德承诺相结合。

当你将这些原则应用于自己的工程挑战时,请记住,机器学习系统工程的核心是服务于用户和社会。每一个架构决策,每一个优化技术,以及每一个运营实践,最终都应该使人工智能更加有益、易于获取和值得信赖。衡量你的成功不仅在于降低延迟或提高准确性,还在于现实世界的影响:生活得到改善,问题得到解决,能力得到普及。

将定义未来一个世纪的智能系统(从预测极端天气的气候模型到诊断罕见疾病的医疗人工智能,从个性化学习的教育系统到赋能数十亿人的辅助技术)等待着你的工程专业知识。你现在拥有构建它们的知识:指导设计的原则,确保效率的技术,保证安全的框架,以及负责任部署的智慧。

作为一名机器学习系统工程师的旅程现在开始了。运用你已掌握的原则。将它们应用于重要的挑战。构建可扩展的系统。创造持久的解决方案。设计服务于人类的智能。

智能的未来不是我们简单见证的东西;这是我们必须要去构建的。去好好构建它吧。

哈佛大学维贾伊·贾纳帕·雷迪教授


入门

教授机器学习系统需要一种全面、端到端的视角,涵盖从数据收集到部署和维护的完整流程。然而,传统的机器学习系统教育面临着重大的实际障碍:学生无法在学术约束下实际训练万亿参数模型、收集数百万个标记图像或在云规模上部署系统。嵌入式机器学习为这一教学挑战提供了一个优雅的解决方案,在可访问的硬件和时间约束内提供完整的系统体验。在嵌入式设备严格的资源限制下工作——通常是 2MB 的 RAM 和 1MB 的闪存存储——学生将遇到定义大规模机器学习系统的基本工程权衡,但在一个具体、动手的环境中,每个优化决策都有立即、可观察的后果。

实验室开发

这些动手实验室是由Marcelo Rovai开发的,他凭借数十年的嵌入式系统专业知识,创造了可访问、实用的学习体验,将理论与实际应用相结合。

为什么嵌入式机器学习适合机器学习系统教育?

传统的机器学习教育通常侧重于在不受约束的云环境中进行算法开发,拥有丰富的计算资源。虽然这种方法建立了重要的理论基础,但它可能会掩盖定义大多数实际人工智能部署的工程现实。嵌入式机器学习提供了独特的有效教学框架,原因如下,从基础需求到学习效果再到实际应用进行组织:

经济可及性:专业级开发板的价格为 20-50 美元,使得动手学习变得可访问,无需昂贵的云计算信用或专门的实验室基础设施。学生可以拥有并实验硬件,超越正式课程的范围。

立即、可感知的反馈:物理交互——指示分类结果的 LED 灯、对音频事件做出反应的蜂鸣器、由手势识别控制的电机——将抽象的算法概念转化为具体、可观察的行为。这种立即的反馈加速了学习和调试过程。

端到端系统理解:与基础设施抽象化的基于云的练习不同,嵌入式系统要求学生理解从传感器数据采集到推理再到执行器控制的完整流程。这种全面的视角揭示了表征现实世界机器学习系统的相互依赖关系。

资源约束推动工程卓越: 在 2MB RAM 和 1MB 闪存存储的限制下工作,迫使学生面对通常隐藏在云部署中的优化决策。从模型架构到数据预处理,每个设计选择都会对系统性能产生直接、可衡量的影响。

跨学科技能发展: 嵌入式机器学习连接计算机科学、电气工程和系统设计,为学生适应现代技术发展的日益跨学科性质做好准备。

行业相关性: 大多数部署的人工智能系统在边缘设备上运行,而不是在数据中心。在嵌入式环境中发展的技能可以直接转移到移动应用、物联网部署和自主系统中。

先决条件和准备

数学背景: 学生应具备线性代数、基本概率理论和微分微积分的实际知识。虽然不需要高级数学的复杂性,但熟悉矩阵运算和基本的优化概念将增强学习成果。

编程能力: 精通 Python 编程是必不可少的。熟悉 C/C++编程可以加速进步,但不是严格要求的,因为入门练习提供了足够的支撑。

硬件经验: 假设学生没有先前的嵌入式系统经验。实验室练习包括适合硬件开发新手的全面设置程序和故障排除指导。

学习目标

完成实验室序列后,学生将展示以下能力:

  1. 资源受限优化: 在 2MB RAM 的约束下部署机器学习模型,同时在微控制器硬件上实现实时推理性能。

  2. 节能系统设计: 通过适当的电源管理技术实现始终在线的传感应用,电池寿命以月计,而不是以小时计。

  3. 多模态数据处理: 在保持性能约束的同时,将视觉、音频和传感器数据流集成到统一的嵌入式系统中。

  4. 专业发展工作流程: 使用包括 TensorFlow Lite、Edge Impulse 和嵌入式调试环境在内的行业标准工具链,完成完整开发周期。

实验室练习类别

为了实现这些学习目标,课程被组织成特定的练习类别,每个类别针对嵌入式人工智能系统开发的各个方面。

计算机视觉应用

计算机视觉实验室序列解决在资源受限硬件上处理高维视觉数据的基本挑战,展示了在嵌入式系统约束内实现实时性能所需的优化技术。

图像分类系统:学生实现对象识别算法,展示了模型复杂性与推理速度之间的权衡,与智能手机摄像头和自动驾驶汽车系统中的计算挑战相呼应。

目标检测和定位:高级练习超越了分类,到空间对象定位,实现了类似于安全系统和工业自动化中的检测算法。

视觉-语言集成:前沿练习将视觉处理与自然语言理解相结合,展示了如何将高级人工智能功能部署在边缘设备上。

音频和时序数据处理

音频处理实验室专注于连续数据流分析,同时保持最低的功耗,这对于电池寿命至关重要的始终在线感知应用尤其相关。

关键词检测系统:学生实现语音界面系统,展示了在保持电池寿命的同时进行连续音频监控的工程挑战,与商业语音助手的并行方法。

运动和活动识别:使用惯性测量数据的时序分析练习教授从连续传感器流中提取模式,与健身追踪器和健康监测设备中的功能相呼应。

音频事件分类:高级练习超越了语音识别,到一般声学事件检测,用于安全监控和环境感知应用。

实验室平台兼容性

这些练习类别在多个硬件平台上实现,每个平台都提供不同的功能和限制。这种平台多样性确保学生能够体验到嵌入式人工智能部署场景的全谱系。

表 21.1 提供了实验室练习到支持硬件平台的全面映射,使课程规划者能够设计适合可用资源的适当学习序列。

表 21.1:实验室练习兼容性矩阵

练习类别 Arduino Nicla XIAOMI Kit Grove Vision AI V2 Raspberry Pi
入门
图像分类
目标检测
关键词检测
运动分类
无代码应用
大型语言模型
视觉语言模型
DSP/特征工程

核心数据模式

上文所述的实验室练习围绕三种基本数据模式组织,这些模式代表了大多数嵌入式人工智能应用。理解这些模式为学生将遇到的工程挑战提供了重要的理论背景:

视觉数据处理:图像和视频分析需要最高的计算资源,需要优化技术来在严格的内存限制内处理高维数据,同时保持实时性能。

时序音频分析:音频处理和时间序列传感器分析需要连续的数据流处理,同时保持超低功耗,展示了计算复杂性和能源效率之间的关键权衡。

传感器融合和多模态系统:高级应用结合多个数据源以实现单模态方法无法实现的功能,在保持嵌入式性能约束的同时管理增加的系统复杂性。

开始

在学习目标、练习类别、平台选项和理论理解的基础上,学生可以开始他们的嵌入式机器学习之旅。

学生应首先查阅硬件套件章节,了解平台功能,并根据他们的学习目标和预算限制选择合适的硬件。

IDE 设置章节提供了所有支持平台的全面设置程序、软件安装指南和故障排除资源。

下一步

在完成硬件选择和开发环境设置后,你就可以开始实验室练习了。设置过程因平台而异,通常需要 30-60 分钟才能完成。

对于详细的平台特定设置说明,请参考各个设置指南:

  • XIAOML 套件设置

  • Arduino Nicla Vision 设置

  • Grove Vision AI V2 设置

  • Raspberry Pi 设置

硬件套件

本节介绍了为 TinyML 课程选定的四个硬件平台。每个平台代表了嵌入式计算能力光谱中的不同点,从超低功耗微控制器到功能齐全的边缘计算机。这些平台展示了在功耗、计算能力和开发复杂性方面的不同工程权衡。

选定的平台在商业应用中广泛使用,因此确保通过这些练习培养的技能可以直接应用于嵌入式系统开发。

我们特色平台

完整的 XIAOML 套件,包含所有组件

XIAOML 套件 是我们教育硬件平台中的最新成员(于 2025 年 7 月 31 日发布)。它提供了一个全面的 TinyML 开发环境,用于学习机器学习系统,包括集成的无线连接、摄像头、多个传感器和广泛的文档。这块紧凑的板子展示了当代嵌入式系统如何在成本效益的框架内高效地提供高级机器学习功能。

系统要求和先决条件

在选择硬件平台之前,请确保您的开发环境满足以下要求:

开发计算机要求:

  • 操作系统: Windows 10/11、macOS 10.15+ 或 Linux(Ubuntu 18.04+)

  • 内存: 至少 8GB RAM(推荐树莓派开发使用 16GB)

  • 存储: 开发工具和库至少 10GB 空闲空间

  • USB 端口: 至少一个 USB 2.0/3.0 端口用于设备连接

  • 互联网连接: 用于软件安装和库下载

软件先决条件:

  • Arduino IDE 2.0+ 用于基于 Arduino 的平台

  • Python 3.8+ 用于树莓派开发

  • Git 用于版本控制和访问示例代码

  • 文本编辑器/集成开发环境(VS Code、PyCharm 或类似)

硬件附件:

  • USB-C 或 Micro-USB 线缆(数据传输功能,非仅供电)

  • SD 卡(32GB+ Class 10)适用于树莓派

  • 适用于每个平台的电源适配器

  • 摄像头模块(大多数套件包含或可单独购买)

硬件平台概述

我们的课程特色是四个精心挑选的平台,涵盖了嵌入式计算能力的整个光谱。在表 21.2 中展示的每个平台都经过选择,以展示特定的工程权衡和学习目标。

表 21.2:平台选择策略表。

平台 主要学习重点 成本 功耗配置文件 最佳用途
XIAOML 套件 物联网与无线机器学习 $15-50 低功耗 成本敏感型部署
Arduino Nicla 极低功耗设计 $120 极低功耗 电池供电设备
Grove Vision AI 硬件加速 $30 中等 工业应用
Raspberry Pi 全机器学习框架 $60-150 高级边缘计算

平台比较

表 21.3 提供了所有四个平台的全面技术比较。

表 21.3:平台比较矩阵。

特性 XIAOML Kit Raspberry Pi Arduino Nicla Grove Vision AI V2
成本范围(美元) $15-50 | $60-150 $120 | $30
功耗 超低 中等
处理能力 中等 非常高 高(NPU)
内存容量 8MB 1-16GB 2MB 16MB
主要用途 物联网网络 边缘计算 电池设备 工业人工智能
机器学习框架 TF Lite TensorFlow, PyTorch TensorFlow Lite SenseCraft AI
开发环境 Arduino/ PlatformIO Python/Linux Arduino IDE Visual/Code

平台选择指南

选择合适的平台取决于特定的学习目标和项目要求。表 21.4 提供了一个系统性的映射,以指导这些决策。

表 21.4:平台能力矩阵。

学习目标/应用 XIAOML Kit Ras Pi Arduino Nicla Grove Vision AI V2
嵌入式系统基础 有限
无线连接
超低功耗设计
全机器学习框架
硬件加速
实时视觉 有限
边缘-云集成
生产部署

硬件平台规格

本节提供了每个平台详细的规格说明,包括处理器架构、内存层次结构、传感器功能以及开发工具链要求。

XIAOML Kit(Seeed Studio)

最佳用途:物联网与无线机器学习

XIAOML Kit 在无线连接和成本敏感部署方面表现卓越。它非常适合学习物联网传感器网络、远程监控系统以及需要紧凑、经济实惠的可靠连接的无线机器学习推理。

XIAO ESP32S3 代表了超紧凑、无线功能微控制器类别,专为物联网应用优化。名称“XIAO”(小)在中文中意为“微型”,反映了该板 21×17.5mm 的尺寸。

XIAO ESP32S3 开发板

处理器架构: ESP32-S3 双核 Xtensa LX7,运行频率为 240MHz

内存层次结构: 8MB PSRAM 和 8MB 闪存存储

连接性: WiFi 802.11 b/g/n 和蓝牙 5.0

集成传感器: OV2640 摄像头传感器、数字麦克风、6 轴惯性测量单元

功率特性: 3.3V 运行,具有多种低功耗模式

开发环境:支持广泛库生态系统的 Arduino IDE 和 PlatformIO 支持。支持 C/C++编程,具有 Arduino 风格的抽象,并为高级用户提供直接 ESP-IDF。

应用焦点:物联网传感器网络、远程监控系统、无线机器学习推理、成本敏感部署

Arduino Nicla Vision

最佳用途:超低功耗设计

Arduino Nicla Vision 针对电池供电设备和始终开启的传感应用进行了优化。它非常适合学习超低功耗设计、图像分类系统和电池寿命以月计的目标检测应用。

Nicla Vision 展示了围绕 STM32H7 微控制器构建的专业级嵌入式视觉系统。该平台展示了如何通过专门的硬件设计在资源受限的情况下实现复杂的机器学习推理。

图片

带摄像头模块的 Arduino Nicla Vision

处理器架构:480MHz 运行的 STM32H7 双核 ARM Cortex-M7/M4

内存层次结构:2MB 集成 RAM 和 16MB 闪存存储

集成传感器:GC2145 摄像头传感器、MP34DT05 数字麦克风、6 轴 IMU

电源特性:3.3V 操作,优化用于电池供电部署

开发环境:支持专用计算机视觉库的 Arduino IDE 和 OpenMV IDE。支持 MicroPython 进行快速原型设计,同时支持 C/C++进行生产部署。

应用焦点:电池供电设备、图像分类系统、目标检测应用、始终开启的传感

Grove Vision AI V2

最佳用途:硬件加速

Grove Vision AI V2 具有专门的神经网络处理硬件,可实现数量级的性能提升。它非常适合学习工业检测系统、实时视频分析和需要 NPU 加速推理能力的先进目标检测。

Grove Vision AI V2 集成了专门的神经网络处理硬件(NPU),以展示硬件加速的机器学习推理。该平台展示了如何通过专门的 AI 处理器实现数量级的性能提升,超过仅软件实现。

图片

Grove Vision AI V2 带 NPU

处理器架构:集成 Ethos-U55 NPU 的 ARM Cortex-M55

内存层次结构:用于模型和数据存储的 16MB 外部内存

神经网络处理单元:用于机器学习推理的专用硬件加速器

摄像头接口:支持各种摄像头模块的标准 CSI 连接器

音频输入:板载数字麦克风

开发环境:SenseCraft AI 可视化编程平台,支持无代码开发,并提供 Arduino IDE 支持以进行定制应用。支持图形编程和传统的 C/C++开发工作流程。

应用焦点:工业检测系统、实时视频分析、高级目标检测、NPU 加速推理

Raspberry Pi(型号 4/5 和 Zero 2W)

最佳用途:完整的机器学习框架

Raspberry Pi 连接了嵌入式系统和传统计算,为高级机器学习应用提供了完整的 Linux 环境。它非常适合学习边缘 AI 网关、高级计算机视觉系统、语言模型部署和多模态 AI 应用,在这些应用中你需要完整的计算能力。

Raspberry Pi 系列产品连接了嵌入式系统和传统计算,提供了完整的 Linux 环境,同时保持了教育的可访问性。这个平台展示了增加的计算资源如何使复杂的机器学习应用成为可能。

Raspberry Pi 5 和 Pi Zero 2W 对比

处理器架构: ARM Cortex-A76(Pi 5)或 Cortex-A53(Zero 2W)

内存层次结构: 根据型号,1-16GB DDR4 RAM

存储: MicroSD 卡为主要存储,支持 USB 3.0 扩展

连接性: 千兆以太网,WiFi,蓝牙,多个 USB 端口

摄像头接口: 专用 CSI 连接器加上 USB 摄像头支持

操作系统: 基于 Debian 的 Raspberry Pi OS(完整的 Linux 发行版)

开发环境: 完整的 Linux 开发环境,支持本地的 Python、C/C++ 和 JavaScript。包管理器(apt、pip)提供对 TensorFlow、PyTorch 和 OpenCV 等广泛的机器学习库的访问。

应用重点: 边缘 AI 网关,高级计算机视觉系统,语言模型部署,多模态 AI 应用

入门指南

要开始使用本课程中使用的硬件套件,您可以直接从以下官方来源购买:

检查每个网站的教育折扣、捆绑包和区域可用性。大多数套件都作为入门包提供,包括板卡和基本配件。

IDE 设置

设置你的交互式开发环境(IDE)是实验室序列成功的关键第一步。与基于云的机器学习开发不同,其中基础设施被抽象化,嵌入式系统要求你理解从代码编译到硬件部署的完整工具链。这个动手设置过程介绍了嵌入式开发工作流程的基本概念,同时为实验室练习准备你的工作站。

环境设置通常需要 30-60 分钟,具体取决于平台选择和互联网连接速度。以下程序旨在由没有先前嵌入式系统经验的学生完成,每一步都构建了后续实验室工作所需的技能。

完成硬件选择后,如 硬件套件 章节中所述,这些程序将建立嵌入式机器学习编程所需的发展工具、库和验证方法。

平台特定软件安装

每个硬件平台都需要不同的开发方法,这些方法反映了现实世界的嵌入式工程实践。基于 Arduino 的系统侧重于资源效率和实时约束,Raspberry Pi 展示了全面的边缘计算能力,而专门的 AI 硬件突出了专门的加速技术。

选择适合你选择的硬件平台的安装程序。

Arduino 基于的平台(Nicla Vision,XIAOML 套件)

基于 Arduino 的嵌入式系统提供直接硬件控制,具有最少的抽象层,这使得它们非常适合理解资源限制和优化技术。开发环境强调代码更改和系统行为之间的即时反馈。

Arduino IDE 安装:

  1. arduino.cc/software 下载 Arduino IDE 2.0

  2. 按照平台特定的设置向导进行安装

  3. 启动 Arduino IDE 并导航到 文件 → 预设

  4. 添加板支持 URL:

    • 对于 XIAOML 套件:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

    • 对于 Nicla Vision:Arduino IDE 板管理器中提供的 URL

板包安装:

  1. 打开 工具 → 板 → 板管理器

  2. 搜索你的平台:

    • XIAOML 套件:搜索“ESP32”并安装“esp32 by Espressif Systems”

    • Nicla Vision:搜索“Arduino Mbed OS Nicla Boards”并安装

  3. 从 工具 → 板菜单中选择你的板

  4. 通过库管理器安装所需的库

必需的库:

  • TensorFlow Lite Micro

  • 平台特定的摄像头驱动程序

  • 传感器接口库(I2C、SPI)

Grove Vision AI V2 平台

该平台通过专用神经网络单元引入硬件加速 AI,展示了专用硅如何实现通用处理器无法实现的性能提升。可视化编程界面展示了快速原型设计能力,而传统开发环境提供了更广泛的定制选项。

SenseCraft AI 设置:

  1. sensecraft.seeed.cc创建账户

  2. 通过 USB 连接 Grove Vision AI V2

  3. 通过 SenseCraft AI 网络界面访问设备

  4. 视觉编程工作流程无需本地软件安装

Arduino IDE 设置(用于自定义开发):

按照上述基于 Arduino 的平台说明进行操作,使用板管理器中的 Seeed Studio 板包 URL。

Raspberry Pi 平台

Raspberry Pi 环境将嵌入式约束与完整计算能力桥接,使学生能够体验资源优化和高级机器学习框架。这种双重视角说明了计算资源如何影响算法选择和系统架构决策。

操作系统安装:

  1. 下载Raspberry Pi Imager

  2. 将 Raspberry Pi OS(推荐 64 位)闪存到 microSD 卡(最小 32GB)

  3. 在镜像过程中配置 SSH 访问和 WiFi 凭证

  4. 插入已闪存的 SD 卡并启动 Raspberry Pi

软件环境设置:

以下命令建立了一个基于 Python 的 ML 开发环境,具有适当的依赖关系管理:

# Update system packages
sudo apt update && sudo apt upgrade -y

# Install Python development tools
# python3-pip: Python package installer
# python3-venv: Virtual environment creation
# python3-dev: Python development headers
sudo apt install python3-pip \
                 python3-venv \
                 python3-dev -y

# Install ML framework dependencies
# libatlas-base-dev: Linear algebra library (BLAS/LAPACK)
# libhdf5-dev: HDF5 data format library
# libhdf5-serial-dev: HDF5 serial version
sudo apt install libatlas-base-dev \
                 libhdf5-dev \
                 libhdf5-serial-dev -y

# Install computer vision dependencies
# libcamera-dev: Camera interface library
# python3-libcamera: Python bindings for libcamera
# python3-kms++: Kernel mode setting library
sudo apt install libcamera-dev \
                 python3-libcamera \
                 python3-kms++ -y

# Create virtual environment for projects
python3 -m venv ~/ml_projects
source ~/ml_projects/bin/activate

# Install core ML packages
# tensorflow: Main ML framework
# tensorflow-lite: Optimized for edge/mobile devices
# opencv-python: Computer vision library
# numpy: Numerical computing foundation
pip install tensorflow \
            tensorflow-lite \
            opencv-python \
            numpy

开发工具配置

正确的工具配置确保开发工作站与嵌入式硬件之间可靠的通信。这些设置构成了在整个实验室练习中代码部署、调试和性能监控的基础。

串行通信设置

串行通信为嵌入式系统中的调试和数据监控提供了主要接口,提供了理解性能约束和优化机会的系统行为洞察。

Windows:

  • 安装适当的 USB 到串行驱动程序(CH340、FTDI 或特定平台)

  • 配置设备管理器以识别开发板

macOS/Linux:

  • 大多数 USB 到串行适配器无需额外驱动程序

  • 验证设备检测:ls /dev/tty*(macOS/Linux)

  • 将用户添加到 dialout 组:sudo usermod -a -G dialout $USER(Linux)

IDE 配置

开发环境设置直接影响以代码-测试-部署周期为特征的嵌入式开发的效率。正确的配置减少了调试时间,并提供了关于系统性能的清晰反馈。

Arduino IDE 设置:

  • 在工具→端口下配置适当的 COM 端口

  • 设置正确的板和处理器选择

  • 验证上传速度(通常是 115200 波特率)

  • 在编译期间启用详细输出以进行调试

Raspberry Pi 开发:

  • 配置 SSH 密钥以进行远程开发

  • 安装带有 Python 和远程 SSH 扩展的 VS Code

  • 设置 Jupyter 笔记本以进行交互式开发

环境验证

验证程序确认您的开发环境可以成功与硬件通信并执行基本操作。这些测试在进入更复杂的实验室练习之前建立基本功能。

硬件检测测试

以下验证程序测试实验室练习所需的核心功能,确保硬件通信和软件库操作正确。

Arduino 平台:

void setup() {
  Serial.begin(115200);
  Serial.println("Development environment test");
  Serial.print("Board: ");
  Serial.println(ARDUINO_BOARD);
}

void loop() {
  Serial.println("Environment operational");
  delay(1000);
}

树莓派:

# Test camera interface
libcamera-hello --timeout 5000

# Test Python ML environment
python3 -c \
  "import tensorflow as tf; print('TensorFlow:', tf.__version__)"
python3 -c \
  "import cv2; print('OpenCV:', cv2.__version__)"

Grove Vision AI V2:

  • 在 SenseCraft AI 网页界面中验证设备检测

  • 通过可视化编程界面测试基本模型部署

常见设置问题和解决方案

设置挑战很常见,提供了关于嵌入式系统限制和调试技术的宝贵学习机会。以下解决方案解决了在环境配置过程中遇到的最常见问题。

设备连接问题:

  • 验证 USB 线缆支持数据传输(不仅是供电)

  • 如果设备未识别,安装平台特定的 USB 驱动程序

  • 如果连接不稳定,尝试不同的 USB 端口或 USB 集线器

编译错误:

  • 在 IDE 中确认正确的板和处理器选择

  • 确认所有必需的库都已安装并兼容

  • 检查编译过程是否有足够的磁盘空间

运行时问题:

  • 确保充足的电源供应(尤其是摄像头操作)

  • 验证 SD 卡兼容性和格式化(树莓派)

  • 在平台限制内检查 ML 模型的内存分配

网络连接(支持 WiFi 的平台):

  • 确认网络凭据和安全协议

  • 检查防火墙设置以允许开发工具访问

  • 验证网络是否允许设备与开发机器通信

故障排除和支持

常见硬件问题:

  • 设备未识别: 确保 USB 线缆支持数据传输,尝试不同的端口

  • 上传失败: 在 IDE 中检查板选择和端口配置

  • 电源问题: 验证充足的电源供应,尤其是摄像头操作

  • 内存错误: 确认模型大小适合平台限制

软件设置问题:

  • 库冲突: 使用设置指南中指定的兼容版本

  • 编译错误: 验证所有依赖项是否正确安装

  • 网络连接: 检查防火墙设置和网络权限

平台特定资源:

社区支持:

  • GitHub Issues: 通过项目仓库报告错误和请求功能

  • 讨论论坛: Arduino、Raspberry Pi 和 Seeed Studio 网站上的平台特定社区

  • Stack Overflow: 使用适当的平台标签标记问题以获得社区协助

准备进行实验室练习

在配置和验证开发环境后,您已经建立了嵌入式机器学习编程所需的基础工具。在环境设置期间发展的技能——理解工具链、管理依赖项和验证系统功能——适用于所有后续的实验室工作。

您配置的环境现在支持整个开发工作流程,从算法实现到硬件部署和性能优化。实验室概述提供了按复杂性和学习目标组织的练习类别,旨在系统地构建这些基础能力。

推荐起始序列:

  1. 从基本的传感器练习开始,以验证硬件功能

  2. 进阶到单模态机器学习应用(图像或音频)

  3. 进阶到多模态和优化练习

每个实验室练习都包括详细的实现步骤、预期的性能基准和针对项目要求的具体故障排除指南。您已建立的开发环境为探索嵌入式机器学习应用的完整范围和优化技术提供了基础。

概述

这些实验室提供了获得机器学习(ML)系统实际操作经验的独特机会。与需要数据中心规模资源的庞大模型相比,这些练习允许您直接使用 TinyML 与硬件和软件进行交互。这种动手方法让您能够切实了解在小型规模上部署人工智能的挑战和机遇。然而,这些原则与您在处理更大系统时遇到的原理在很大程度上是相同的。

Nicla 视觉。来源:Arduino。

前置条件

  • Nicla 视觉板:确保您拥有 Nicla 视觉板。

  • USB 线缆:用于将板连接到您的计算机。

  • 网络:具有互联网访问权限以下载必要的软件。

设置

  • 设置 Nicla 视觉

练习

模态 任务 描述 链接
视觉 图像分类 学习如何对图像进行分类 链接
视觉 目标检测 实现目标检测 链接
音频 关键词检测 探索语音识别系统 链接
IMU 运动分类和异常检测 对运动数据进行分类并检测异常 链接

设置

图片 1

DALL·E 3 提示:一幅让人联想到 1950 年代卡通的插图,Arduino NICLA VISION 板,配备各种传感器,包括摄像头,是老式桌子上的焦点。在背景中,一个圆角电脑屏幕显示 Arduino IDE。代码与 LED 配置和机器学习语音命令检测相关。在串行监视器上的输出明确显示“是”和“否”的字样。

概述

Arduino Nicla Vision(有时称为NiclaV)是一款包含两个处理器,可以并行运行任务的开发板。它是同一系列开发板的一部分,具有相同的外形,但针对特定任务设计,例如Nicla Sense MENicla VoiceNiclas可以高效地运行使用 TensorFlow Lite 创建的过程。例如,NiclaV 的一个核心可以实时运行计算机视觉算法(推理)。同时,另一个执行低级操作,如控制电机、通信或作为用户界面。板载无线模块允许同时管理 WiFi 和蓝牙低功耗(BLE)连接。

图片 3

硬件

两个并行核心

中央处理器是双核STM32H747,包括一个 480 MHz 的 Cortex M7 和一个 240 MHz 的 Cortex M4。两个核心通过远程过程调用机制进行通信,无缝地允许在另一个处理器上调用函数。两个处理器共享所有片上外设,并且可以运行:

  • 在 Arm Mbed OS 上运行的 Arduino 草图

  • 本地 Mbed 应用程序

  • 通过解释器运行 MicroPython / JavaScript

  • TensorFlow Lite

图片 2

内存

内存对于嵌入式机器学习项目至关重要。NiclaV 板可以容纳高达 16 MB 的 QSPI 闪存用于存储。然而,必须考虑的是,用于机器学习推理的是 MCU SRAM;STM32H747 只有 1 MB,由两个处理器共享。此 MCU 还集成了 2 MB 的闪存,主要用于代码存储。

传感器

  • 摄像头:一款 GC2145 2 MP 彩色 CMOS 摄像头。

  • 麦克风MP34DT05是一款超紧凑、低功耗、全向、数字 MEMS 麦克风,采用电容式传感元件和 IC 接口。

  • 六轴 IMU:来自LSM6DSOX 6 轴 IMU 的 3D 陀螺仪和 3D 加速度计数据。

  • 飞行时间传感器VL53L1CBV0FY飞行时间传感器为 Nicla Vision 增加了准确和低功耗测距功能。不可见的近红外 VCSEL 激光器(包括模拟驱动器)与接收光学元件一起封装在一个一体化的小型模块中,位于摄像头下方。

Arduino IDE 安装

开始将板(微型 USB)连接到您的计算机:

在 Arduino IDE 中安装 Nicla 板的 Mbed OS 核心。打开 IDE 后,导航到工具 > 板 > 板管理器,在搜索窗口中查找 Arduino Nicla Vision,并安装该板。

接下来,前往工具 > 板 > Arduino Mbed OS Nicla Boards并选择Arduino Nicla Vision。将您的板连接到 USB 后,您应该在端口上看到 Nicla 并选择它。

在 Examples/Basic 上打开 Blink 草图,并使用 IDE 上传按钮运行它。您应该看到内置 LED(绿色 RGB)闪烁,这意味着 Nicla 板已正确安装并可用!

测试麦克风

在 Arduino IDE 中,前往示例 > PDM > PDMSerialPlotter,打开它,并运行草图。打开绘图仪,查看麦克风的声音表示:

改变您生成的声音频率,并确认麦克风是否正常工作。

测试 IMU

在测试 IMU 之前,将需要安装 LSM6DSOX 库。为此,前往库管理器并查找 LSM6DSOX。安装 Arduino 提供的库:

接下来,前往示例 > Arduino_LSM6DSOX > SimpleAccelerometer并运行加速度计测试(您也可以运行陀螺仪和板温度):

测试飞行时间(ToF)传感器

正如我们在 IMU 上所做的那样,安装 VL53L1X ToF 库是必要的。为此,前往库管理器并查找 VL53L1X。安装 Pololu 提供的库:

接下来,运行草图proximity_detection.ino

在串行监视器上,您将看到相机与其前方物体之间的距离(最大 4 米)。

测试摄像头

我们还可以使用例如示例 > 摄像头 > CameraCaptureRawBytes中提供的代码来测试摄像头。我们无法直接看到图像,但我们可以获取由摄像头生成的原始图像数据。

我们可以使用Web Serial Camera (API)来查看由摄像头生成的图像。这个网络应用程序通过 Web Serial 从配备摄像头的 Arduino 板上流式传输摄像头图像。

Web Serial Camera 示例向您展示了如何从 Arduino 板通过电线发送图像数据以及如何在 JavaScript 中解包数据以进行渲染。此外,在 Web 应用程序的源代码中,我们可以找到一些示例图像过滤器,展示了如何操作像素数据以实现视觉效果。

用于发送相机图像数据的Arduino 草图(CameraCaptureWebSerial)可以在这里找到,并且也可以在 Arduino IDE 中选择 Nicla 板时直接从“Examples→Camera”菜单中获取。

用于显示相机图像的Web 应用程序可以通过这里访问。我们还可以查看[这个教程,它更详细地解释了设置过程]。

图片

安装 OpenMV IDE

OpenMV IDE 是带有 OpenMV 相机的首选集成开发环境,类似于 Nicla Vision。它具有强大的文本编辑器、调试终端和具有直方图显示的帧缓冲区查看器。我们将使用 MicroPython 来编程相机。

前往OpenMV IDE 页面,下载适用于您的操作系统的正确版本,并按照说明在您的计算机上安装。

图片

IDE 应该打开,默认在代码区域显示 helloworld_1.py 代码。如果不是,您可以从Files > Examples > HelloWord > helloword.py打开它。

图片

在运行时,通过串行连接(使用 print()或错误信息)发送的任何消息都将显示在串行终端上。相机捕获的图像将在相机查看器区域(或帧缓冲区)以及在其下方立即的直方图区域显示。

更新引导加载程序

在将 Nicla 连接到 OpenMV IDE 之前,请确保您有最新的引导加载程序版本。转到您的 Arduino IDE,选择 Nicla 板,并在Examples > STM_32H747_System STM32H747_manageBootloader中打开草图。将代码上传到您的板子。串行监视器将引导您。

安装固件

更新引导加载程序后,通过在板上双击复位按钮将 Nicla Vision 置于引导加载程序模式。内置的绿色 LED 将开始闪烁。现在返回到 OpenMV IDE,并单击连接图标(左侧工具栏):

图片

一个弹出窗口将告诉您检测到一个处于 DFU 模式的板子,并询问您希望如何操作。首先,选择“安装最新发布固件(vX.Y.Z)”。此操作将在 Nicla Vision 上安装最新的 OpenMV 固件。

图片

您可以不选择“擦除内部文件系统”选项,然后点击[确定]。

当 Nicla 的绿色 LED 在将 OpenMV 固件上传到板子上时开始闪烁,随后将打开一个终端窗口,显示上传进度。

图片

等待绿色 LED 停止闪烁和褪色。当过程结束时,您将看到一个消息说,“DFU 固件更新完成!”。按 [OK]

图片

当 Nicla Vison 连接到工具栏时,会出现一个绿色的播放按钮。

图片

此外,请注意,您的电脑上会出现一个名为“无名称”的驱动器。

图片

每次您在板上按 [RESET] 按钮时,存储在板上的 main.py 脚本将自动执行。您可以在 IDE 上加载 main.py 代码(File > Open File...)。

图片

这段代码是“闪烁”代码,确认硬件正常。

测试相机

要测试相机,让我们运行 helloword_1.py。为此,请选择 File > Examples > HelloWorld > helloword.py 中的脚本,

当点击绿色播放按钮时,代码区域中的 MicroPython 脚本 (helloworld.py) 将被上传并运行在 Nicla Vision 上。在相机查看器中,您将开始看到视频流。串行监视器将显示 FPS(每秒帧数),大约为 27fps。

图片

这里是 helloworld.py 脚本:

import sensor, time

sensor.reset()                      # Reset and initialize
                                    # the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565
                                    # (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to
                                    # QVGA (320x240)
sensor.skip_frames(time = 2000)     # Wait for settings take
                                    # effect.
clock = time.clock()                # Create a clock object
                                    # to track the FPS.

while(True):
    clock.tick()                    # Update the FPS clock.
    img = sensor.snapshot()         # Take a picture and return
                                    # the image.
    print(clock.fps())

GitHub 中,您可以找到这里使用的 Python 脚本。

代码可以分为两部分:

  • 设置:在这里导入库,初始化,定义和初始化变量。

  • 循环:(while 循环)代码的一部分,会持续运行。图像 (img 变量) 被捕获(一帧)。这些帧中的每一帧都可以用于机器学习应用中的推理。

要中断程序执行,请按红色 [X] 按钮。

注意:当连接到 IDE 时,OpenMV Cam 的运行速度大约减半。断开连接后,FPS 应该会增加。

GitHub 中,您可以找到其他 Python 脚本。尝试测试板载传感器。

将 Nicla Vision 连接到 Edge Impulse Studio

我们将在其他实验室的后期需要 Edge Impulse Studio。 Edge Impulse 是边缘设备上机器学习的主要开发平台。

Edge Impulse 正式支持 Nicla Vision。因此,为了开始,请在 Studio 上创建一个新项目并将其连接到它。为此,请按照以下步骤操作:

  • 下载适用于您特定计算机架构的 Arduino CLI

  • 下载最新的 EI 固件

  • 解压两个文件,并将所有文件放在同一个文件夹中。

  • 将 Nicla-Vision 置于启动模式,按重置按钮两次。

  • 运行对应您操作系统的上传器(EI FW):

图片

  • 执行您操作系统特定的批处理代码会将二进制文件 arduino-nicla-vision.bin 上传到您的板子上。

使用 Chrome,可以通过 WebUSB 将 Nicla 连接到 EI Studio。不需要 EI CLI

前往 Studio 上的项目,在“数据采集”选项卡中,选择WebUSB(1)。会出现一个窗口;选择显示“Nicla 已配对”(2)的选项,然后按 [连接](3)。

图片

您可以在“数据采集”选项卡上的“收集数据”部分选择要选择哪些传感器数据。

图片

例如,IMU 数据(惯性)

图片

或图像(相机):

图片

您还可以测试连接到 ADC(Nicla 引脚 0)的外部传感器以及板载的其他传感器,例如内置麦克风、ToF(接近)或传感器组合(融合)。

扩展 Nicla 视觉板(可选)

最后一个要探索的项目是,在原型设计过程中,有时实验外部传感器和设备是至关重要的。Arduino MKR 连接器载体(Grove 兼容)是 Nicla 的一个优秀扩展。Arduino MKR 连接器载体(Grove 兼容)

该盾牌有 14 个 Grove 连接器:五个单通道模拟输入(A0-A5)、一个双通道模拟输入(A5/A6)、五个单通道数字 I/O(D0-D4)、一个双通道数字 I/O(D5/D6)、一个 I2C(TWI)和一个 UART(串行)。所有连接器均兼容 5V。

注意,所有 17 个 Nicla 视觉引脚都将连接到盾牌 Grove,但某些 Grove 连接保持未连接。

图片

此盾牌与 MKR 兼容,并可配合 Nicla 视觉和 Portenta 使用。

图片

例如,假设在一个 TinyML 项目中,您想使用 LoRaWAN 设备发送推理结果并添加有关本地亮度的信息。通常,在离线操作中,建议使用本地低功耗显示屏,如 OLED。此设置如下所示:

图片

Grove 光传感器将连接到单个模拟引脚之一(A0/PC4),LoRaWAN 设备连接到 UART,OLED连接到 I2C 连接器。

Nicla 引脚 3(Tx)和 4(Rx)与串行盾牌连接器相连。UART 通信用于 LoRaWan 设备。以下是一个简单的 UART 代码示例:

# UART Test - By: marcelo_rovai - Sat Sep 23 2023

import time
from pyb import UART
from pyb import LED

redLED = LED(1) # built-in red LED

# Init UART object.
# Nicla Vision's UART (TX/RX pins) is on "LP1"
uart = UART("LP1", 9600)

while(True):
    uart.write("Hello World!\r\n")
    redLED.toggle()
    time.sleep_ms(1000)

为了验证 UART 是否正常工作,例如,您可以将另一个设备作为 Arduino UNO 连接,在串行监视器上显示“Hello Word”。以下是代码

图片

下面是用于 I2C OLED 的 Hello World 代码。由 Adafruit 创建的 MicroPython SSD1306 OLED 驱动程序(ssd1306.py)也应上传到 Nicla(ssd1306.py 脚本可在 GitHub 中找到)。

# Nicla_OLED_Hello_World - By: marcelo_rovai - Sat Sep 30 2023

#Save on device: MicroPython SSD1306 OLED driver,
# I2C and SPI interfaces created by Adafruit
import ssd1306

from machine import I2C
i2c = I2C(1)

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

oled.text('Hello, World', 10, 10)
oled.show()

最后,这是一个简单的脚本,用于读取引脚“PC4”上的 ADC 值(Nicla 引脚 A0):


# Light Sensor (A0) - By: marcelo_rovai - Wed Oct 4 2023

import pyb
from time import sleep

adc = pyb.ADC(pyb.Pin("PC4"))   # create an analog object
                                # from a pin
val = adc.read()                # read an analog value

while (True):

    val = adc.read()
    print ("Light={}".format (val))
    sleep (1)

ADC 可以用于其他传感器变量,例如 温度

注意,上述脚本(从 Github 下载)仅介绍了如何使用 MicroPython 将外部设备与 Nicla Vision 板连接。

摘要

Arduino Nicla Vision 是工业和专业人士使用的优秀 小型设备!然而,它功能强大、值得信赖、功耗低,并且具有适合最常见嵌入式机器学习应用(如视觉、运动、传感器融合和声音)的合适传感器。

GitHub 仓库 中,你可以找到本动手实验室中使用的或注释的所有代码的最新版本。

资源

图像分类

DALL·E 3 提示:1950 年代风格的卡通,展示一个紧凑的电子设备,摄像头模块放置在木桌上。屏幕显示一侧是蓝色机器人,另一侧是绿色佩里基托。设备上的 LED 灯指示分类,而穿着复古服装的人物带着兴趣观察。

概述

当我们开始研究嵌入式机器学习或 TinyML 时,不可能忽视计算机视觉(CV)和人工智能(AI)在我们生活中的变革性影响。这两个相互交织的学科重新定义了机器可以感知和完成的事情,从自动驾驶汽车和机器人技术到医疗保健和监控。

越来越多,我们面临着一场人工智能(AI)革命,正如 Gartner 所说,边缘 AI具有非常高的潜在影响,目前确实是如此

雷达的“靶心”是边缘计算机视觉,当我们谈论应用于视觉的机器学习(ML)时,首先想到的是图像分类,这是一种机器学习“Hello World”!

本实验室将探索一个利用卷积神经网络(CNNs)进行实时图像分类的计算机视觉项目。利用 TensorFlow 强大的生态系统,我们将实现一个预训练的 MobileNet 模型,并适应边缘部署。重点是优化模型,使其在资源受限的硬件上高效运行,同时不牺牲准确性。

我们将采用量化修剪等技术来降低计算负载。在本教程结束时,你将拥有一个可以实时分类图像的工作原型,所有这些都在基于 Arduino Nicla Vision 板的低功耗嵌入式系统上运行。

计算机视觉

在其核心,计算机视觉使机器能够根据来自世界视觉数据做出解释和决策,本质上模仿了人类视觉系统的能力。相反,人工智能是一个更广泛的领域,包括机器学习、自然语言处理和机器人技术等其他技术。当你将人工智能算法引入计算机视觉项目时,你将极大地增强系统理解、解释和反应视觉刺激的能力。

当讨论应用于嵌入式设备的计算机视觉项目时,最常见到的应用是图像分类目标检测

这两种模型都可以在 Arduino Nicla Vision 等小型设备上实现,并用于实际项目。在本章中,我们将涵盖图像分类。

图像分类项目目标

任何机器学习项目的第一步是定义目标。在这种情况下,目标是检测和分类一张图像中存在的两个特定物体。对于这个项目,我们将使用两个小玩具:一个机器人和一只小型巴西鹦鹉(名为佩里基托)。我们还将收集一些背景图像,其中这两个物体不存在。

图片

数据收集

一旦我们定义了机器学习项目的目标,下一步也是最重要的一步是收集数据集。对于图像捕获,我们可以使用:

  • 网络串行摄像头工具,

  • Edge Impulse Studio,

  • OpenMV IDE,

  • 一部智能手机。

在这里,我们将使用OpenMV IDE

使用 OpenMV IDE 收集数据集

首先,我们应该在电脑上创建一个文件夹来保存数据,例如,“data。”接下来,在 OpenMV IDE 中,我们转到工具 > 数据集编辑器并选择新建数据集以开始数据集收集:

图片

IDE 将要求我们打开保存数据的文件。选择创建的“data”文件夹。注意,左侧面板上会出现新的图标。

图片

使用上面的图标(1),输入第一个类别的名称,例如,“periquito”:

图片

运行dataset_capture_script.py并点击相机图标(2)将开始捕获图像:

图片

对其他类别重复相同的步骤。

图片

我们建议每个类别大约有 50 到 60 张图片。尽量捕捉不同的角度、背景和光照条件。

存储的图像使用 QVGA 帧大小320×240320\times 240和 RGB565(颜色像素格式)。

在收集完数据集后,关闭“工具 > 数据集编辑器”中的数据集编辑器工具。

我们最终会在电脑上得到一个包含三个类别的数据集:periquitorobotbackground

图片

我们应该回到Edge Impulse Studio并上传数据集到我们创建的项目。

使用 Edge Impulse Studio 训练模型

我们将使用 Edge Impulse Studio 来训练我们的模型。输入账户凭证并创建一个新项目:

图片

这里,您可以克隆一个类似的项目:NICLA-Vision_Image_Classification

数据集

使用 EI Studio(或Studio),我们将完成四个主要步骤,使我们的模型准备好在 Nicla Vision 板上使用:数据集、脉冲、测试和部署(在本例中,是 NiclaV 边缘设备上的部署)。

图片

关于数据集,必须指出的是,我们使用 OpenMV IDE 捕获的原始数据集将被分为训练集验证集测试集。测试集将从一开始就保留,仅用于训练后的测试阶段。验证集将在训练过程中使用。

EI Studio 将使用一定比例的训练数据用于验证。

图片

在 Studio 上,转到“数据采集”标签,在“上传数据”部分,从您的电脑上传所选类别的文件:

图片

将原始数据集拆分为训练和测试的任务留给工作室,并选择关于该特定数据的标签:

图片

对所有三个类别重复此过程。

选择一个文件夹并一次性上传所有文件是可能的。

最后,你应该在工作室中看到你的“原始数据”:

图片

注意,当你开始上传数据时,可能会出现一个弹出窗口,询问你是否在构建一个目标检测项目。选择 [NO]

图片

我们可以在仪表板部分进行更改:每个数据项一个标签(图像分类):

图片

可选地,工作室允许我们探索数据,展示项目中所有数据的完整视图。我们可以通过点击单个数据项来清除、检查或更改标签。在我们的案例中,数据看起来是好的。

图片

冲击设计

在这个阶段,我们应该定义如何:

  • 预处理我们的数据,这包括调整单个图像的大小和确定要使用的颜色深度(无论是 RGB 还是灰度),

  • 指定一个模型,在这种情况下,它将是迁移学习(图像),以在我们的数据上微调预训练的 MobileNet V2 图像分类模型。这种方法即使在相对较小的图像数据集(在我们的案例中约为 150 张图像)中也表现良好。

图片

使用 MobileNet 进行迁移学习提供了一种简化的模型训练方法,这对于资源受限的环境和具有有限标记数据的 projekty 特别有益。MobileNet 以其轻量级架构而闻名,是一个已经从大型数据集(ImageNet)中学习到有价值特征的预训练模型。

图片

通过利用这些学习到的特征,您可以使用更少的数据和计算资源来训练针对特定任务的新模型,同时仍然达到有竞争力的准确性。

图片

这种方法显著减少了训练时间和计算成本,使其非常适合快速原型设计和在效率至关重要的嵌入式设备上的部署。

转到冲击设计选项卡并创建冲击,定义图像大小为 96x96,并压缩它们(方形形式,无需裁剪)。选择图像和迁移学习模块。保存冲击。

图片

图像预处理

所有输入 QVGA/RGB565 图像都将转换为 27,640 个特征 (96×96×3)(96\times 96\times 3)

图片

点击 [保存参数] 并生成所有特征:

图片

模型设计

在 2007 年,谷歌推出了 MobileNetV1,这是一系列通用计算机视觉神经网络,旨在考虑移动设备,以支持分类、检测等功能。MobileNets 是小型、低延迟、低功耗的模型,参数化以满足各种用例的资源限制。2018 年,谷歌发布了 MobileNetV2: Inverted Residuals and Linear Bottlenecks

MobileNet V1 和 MobileNet V2 致力于移动效率和嵌入式视觉应用,但在架构复杂性和性能方面有所不同。虽然两者都使用深度可分离卷积来降低计算成本,但 MobileNet V2 引入了倒残差块和线性瓶颈来提升性能。这些新特性使得 V2 能够使用更少的参数捕捉更复杂的特征,使其在计算上更加高效,并且通常比其前身更准确。此外,V2 在中间扩展层使用了非线性激活函数。它仍然使用线性激活函数来处理瓶颈层,这种设计选择被发现可以通过网络保留重要信息。MobileNet V2 提供了一种优化的架构,以实现更高的准确性和效率,并将被用于本项目。

尽管基础 MobileNet 架构已经非常小巧且具有低延迟,但很多时候,特定的用例或应用可能需要模型更加小巧和快速。MobileNets 引入了一个简单的参数 α\alpha(alpha),称为宽度乘数,用于构建这些更小、计算成本更低的模型。宽度乘数 α\alpha 的作用是在每一层均匀地细化网络。

Edge Impulse Studio 可以使用 MobileNetV1 (96×9696\times 96图像) 和 V2 (96×9696\times 96160×160160\times 160图像),以及几个不同的α\alpha值(从 0.05 到 1.0)。例如,使用 V2,160×160160\times 160图像,并且α=1.0\alpha=1.0,你可以获得最高的准确率。当然,这里有一个权衡。准确率越高,运行模型所需的内存(大约 1.3 MB RAM 和 2.6 MB ROM)就越多,这意味着更大的延迟。在另一个极端,使用 MobileNetV1 和α=0.10\alpha=0.10(大约 53.2 K RAM 和 101 K ROM)可以获得更小的内存占用。

图片

我们将使用MobileNetV2 96x96 0.1或 0.05)进行此项目,预计内存占用为 265.3 KB。此模型对于具有 1MB SRAM 的 Nicla Vision 来说应该是合适的。在迁移学习选项卡上选择此模型:

图片

模型训练

与深度学习结合使用的另一个有价值的技术是数据增强。数据增强是一种通过创建额外的合成数据来提高机器学习模型准确率的方法。数据增强系统在训练过程中对您的训练数据进行小的、随机的更改(例如翻转、裁剪或旋转图像)。

查看内部结构,这里你可以看到 Edge Impulse 是如何在您的数据上实施数据增强策略的:

# Implements the data augmentation policy
def augment_image(image, label):
    # Flips the image randomly
    image = tf.image.random_flip_left_right(image)

    # Increase the image size, then randomly crop it down to
    # the original dimensions
    resize_factor = random.uniform(1, 1.2)
    new_height = math.floor(resize_factor * INPUT_SHAPE[0])
    new_width = math.floor(resize_factor * INPUT_SHAPE[1])
    image = tf.image.resize_with_crop_or_pad(image, new_height,
                                             new_width)
    image = tf.image.random_crop(image, size=INPUT_SHAPE)

    # Vary the brightness of the image
    image = tf.image.random_brightness(image, max_delta=0.2)

    return image, label

在训练过程中接触这些变化可以帮助你的模型避免通过“记忆”训练数据中的表面线索来走捷径,这意味着它可能更好地反映数据集中的深层潜在模式。

我们模型的最后一层将有 12 个神经元,并使用 15%的 dropout 来防止过拟合。以下是训练结果:

图片

结果非常出色,延迟仅为 77 ms(估计),这意味着在推理过程中应该大约有 13 fps(每秒帧数)。

模型测试

图片

现在,我们应该使用项目开始时放置 aside 的数据集来运行训练好的模型:

图片

结果再次非常出色。

图片

模型部署

到目前为止,我们可以将训练好的模型作为固件(FW)部署,并使用 OpenMV IDE 通过 MicroPython 运行它,或者我们可以将其作为 C/C++ 或 Arduino 库部署。

Arduino 库

首先,让我们将其作为 Arduino 库部署:

我们应该在 Arduino IDE 中将库安装为 .zip 文件,并运行库下 Examples 中的 nicla_vision_camera.ino 脚本。

注意,Arduino Nicla Vision 默认为 M7 内核分配了 512 KB 的 RAM,并在 M4 地址空间上额外分配了 244 KB。在代码中,这种分配已被更改为 288 kB,以确保模型可以在设备上运行(malloc_addblock((void*)0x30000000, 288 * 1024);)。

结果很好,测量的延迟为 86 毫秒。

这里有一个展示推理结果的短视频:youtu.be/bZPZZJblU-o

OpenMV

可以以两种方式将训练好的模型部署到 OpenMV 使用:作为库和作为固件(FW)。选择 FW,Edge Impulse Studio 会生成优化模型、库和框架,以便进行推理。让我们探索这个选项。

Deploy Tab 上选择 OpenMV Firmware 并按 [Build]

在计算机上,我们将找到一个 ZIP 文件。打开它:

使用 OpenMV IDE 上的 Bootloader 工具将 FW 加载到你的板上(1):

选择合适的文件(Nicla-Vision 的 .bin 文件):

下载完成后,按 OK:

如果出现消息说固件过时,不要升级。选择 [NO]

现在,打开从 Studio 下载的 ei_image_classification.py 脚本和 Nicla 的 .bin 文件。

运行它。将摄像头指向我们想要分类的对象,推理结果将在串行终端显示。

分类结果将出现在串行终端。如果难以阅读结果,请在代码中包含一个新行以添加一些延迟:

import time
While True:
...
    time.sleep_ms(200)  # Delay for .2 second

修改代码以添加标签

Edge Impulse 提供的代码可以进行修改,以便我们可以为了测试目的,直接在 OpenMV IDE 显示的图像上看到推理结果。

从 GitHub 上上传代码,或者按照以下方式修改:

# Marcelo Rovai - NICLA Vision - Image Classification
# Adapted from Edge Impulse - OpenMV Image Classification Example
# @24March25

import sensor
import time
import ml

sensor.reset()  # Reset and initialize the sensor.
# Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_pixformat(sensor.RGB565)
# Set frame size to QVGA (320x240)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((240, 240))  # Set 240x240 window.
sensor.skip_frames(time=2000)  # Let the camera adjust.

model = ml.Model("trained")#mobilenet, load_to_fb=True)

clock = time.clock()

while True:
    clock.tick()
    img = sensor.snapshot()

    fps = clock.fps()
    lat = clock.avg()
    print("**********\nPrediction:")
    # Combines labels & confidence into a list of tuples and then
    # sorts that list by the confidence values.
    sorted_list = sorted(
        zip(model.labels, model.predict([img])[0].flatten().tolist()),
      key=lambda x: x[1], reverse=True
    )

    # Print only the class with the highest probability
    max_val = sorted_list[0][1]
    max_lbl = sorted_list[0][0]

    if max_val < 0.5:
        max_lbl = 'uncertain'

    print("{} with a prob of {:.2f}".format(max_lbl, max_val))
    print("FPS: {:.2f} fps ==> latency: {:.0f} ms".format(fps, lat))

    # Draw the label with the highest probability to the image viewer
    img.draw_string(
    10, 10,
    max_lbl + "\n{:.2f}".format(max_val),
    mono_space = False,
    scale=3
    )

    time.sleep_ms(500)  # Delay for .5 second

在这里你可以看到结果:

注意,延迟(136 毫秒)几乎是我们在 Arduino IDE 中直接获得的两倍。这是因为我们正在使用 IDE 作为接口,并且还需要等待摄像头准备的时间。如果我们就在推理前启动时钟,延迟应该会降低到大约 70 毫秒。

当连接到 IDE 时,NiclaV 的运行速度大约是 IDE 的一半。断开连接后,FPS 应该会增加。

使用 LED 进行后处理

当与嵌入式机器学习一起工作时,我们寻找的是可以持续进行推理和结果,直接在物理世界中采取行动,而不是在连接的计算机上显示结果的设备。为了模拟这一点,我们将为每个可能的推理结果点亮不同的 LED。

为了实现这一点,我们应该从 GitHub 上上传代码或更改最后一段代码以包括 LED:

# Marcelo Rovai - NICLA Vision - Image Classification with LEDs
# Adapted from Edge Impulse - OpenMV Image Classification Example
# @24Aug23

import sensor, time, ml
from machine import LED

ledRed = LED("LED_RED")
ledGre = LED("LED_GREEN")
ledBlu = LED("LED_BLUE")

sensor.reset()  # Reset and initialize the sensor.
# Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_pixformat(sensor.RGB565)
# Set frame size to QVGA (320x240)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((240, 240))  # Set 240x240 window.
sensor.skip_frames(time=2000)  # Let the camera adjust.

model = ml.Model("trained")#mobilenet, load_to_fb=True)

ledRed.off()
ledGre.off()
ledBlu.off()

clock = time.clock()

def setLEDs(max_lbl):
    if max_lbl == 'uncertain’:
 ledRed.on()
        ledGre.off()
        ledBlu.off()

    if max_lbl == 'periquito’:
 ledRed.off()
        ledGre.on()
        ledBlu.off()

    if max_lbl == 'robot’:
 ledRed.off()
        ledGre.off()
        ledBlu.on()

    if max_lbl == 'background’:
 ledRed.off()
        ledGre.off()
        ledBlu.off()

  while True:
    img = sensor.snapshot()

    clock.tick()
    fps = clock.fps()
    lat = clock.avg()
    print("**********\nPrediction:")
    sorted_list = sorted(
        zip(model.labels, model.predict([img])[0].flatten().tolist()),
      key=lambda x: x[1], reverse=True
    )

    # Print only the class with the highest probability
    max_val = sorted_list[0][1]
    max_lbl = sorted_list[0][0]

    if max_val < 0.5:
        max_lbl = 'uncertain'

    print("{} with a prob of {:.2f}".format(max_lbl, max_val))
    print("FPS: {:.2f} fps ==> latency: {:.0f} ms".format(fps, lat))

    # Draw the label with the highest probability to the image viewer
    img.draw_string(
    10, 10,
    max_lbl + "\n{:.2f}".format(max_val),
    mono_space = False,
    scale=3
    )

    setLEDs(max_lbl)
    time.sleep_ms(200)  # Delay for .2 second

现在,每次某个类别得分超过 0.8 时,相应的 LED 将会点亮:

  • Led 红色开启:不确定(没有类别得分超过 0.8)

  • Led 绿色开启:Periquito > 0.8

  • Led 蓝色开启:Robot > 0.8

  • 所有 LED 关闭:背景 > 0.8

这是结果:

更详细地

图像分类(非官方)基准

可以使用多个开发板进行嵌入式机器学习(TinyML),对于计算机视觉应用(消耗低能量)最常见的是 ESP32 CAM、Seeed XIAO ESP32S3 Sense、Arduino Nicla Vison 和 Arduino Portenta。

抓住机会,相同的训练模型被部署在 ESP-CAM、XIAO 和 Portenta 上(在这个例子中,模型再次进行了训练,使用灰度图像以兼容其摄像头)。以下是结果,将模型作为 Arduino 库部署:

摘要

在我们结束之前,考虑一下计算机视觉不仅仅是图像分类。例如,你可以在多个领域的视觉周围开发边缘机器学习项目,例如:

  • 自动驾驶汽车:使用传感器融合、激光雷达数据和计算机视觉算法进行导航和决策。

  • 医疗保健:通过 MRI、X 射线和 CT 扫描图像分析自动诊断疾病。

  • 零售:自动结账系统,在产品通过扫描仪时识别产品。

  • 安全和监控:实时视频流中的面部识别、异常检测和物体跟踪。

  • 增强现实:物体检测和分类,以在现实世界中叠加数字信息。

  • 工业自动化:产品的视觉检查、预测性维护以及机器人和无人机引导。

  • 农业:基于无人机进行作物监测和自动化收割。

  • 自然语言处理:图像标题和视觉问答。

  • 手势识别:用于游戏、手语翻译和人与机器交互。

  • 内容推荐:基于图像的电子商务推荐系统。

资源

目标检测

图片

DALL·E 3 提示:以 1940 年或 1950 年代的卡通风格展示宽敞的工业仓库内部。一个传送带突出显示,上面载着玩具轮子和箱子混合物。轮子以其明亮的黄色中心和黑色轮胎而可辨。箱子是白色立方体,涂有交替的黑白图案。在移动传送带的末端站着一个复古风格的机器人,装备有工具和传感器,勤奋地对到达的轮子和箱子进行分类和计数。整体美学让人联想到中世纪动画,线条粗犷,色彩经典。

概述

现在,Nicla Vision 上的图像分类的延续正在探索目标检测

图片

目标检测与图像分类

图像分类模型的主要任务是生成一个列表,列出图像上最可能存在的物体类别,例如,在猫吃完饭后识别一只虎斑猫:

图片

但是当猫跳到酒杯附近时会发生什么呢?模型仍然只识别图像上的主要类别,即虎斑猫:

图片

如果图像上没有主导类别会发生什么呢?

图片

模型完全错误地将上述图像识别为“废纸篓”,可能是由于色彩色调的原因。

所有先前示例中使用的模型是 MobileNet,它使用了一个大型数据集,ImageNet

为了解决这个问题,我们需要另一种类型的模型,这种模型不仅能够找到多个类别(或标签),而且还能确定在给定图像中物体的位置。

如我们所想,这样的模型要复杂得多,体积也更大,例如,MobileNetV2 SSD FPN-Lite 320x320,使用 COCO 数据集进行训练。这个预训练的目标检测模型旨在在图像中定位多达 10 个物体,并为每个检测到的物体输出一个边界框。下面是这样一个模型在 Raspberry Pi 上运行的结果:

图片

用于目标检测的模型(如 MobileNet SSD 或 YOLO)通常大小为几个 MB,这对于 Raspberry Pi 来说是可以的,但与嵌入式设备不兼容,因为嵌入式设备的 RAM 通常低于 1 兆字节。

目标检测的创新解决方案:FOMO

Edge Impulse 于 2022 年推出,FOMO(更快的目标,更多目标),这是一种在嵌入式设备上执行目标检测的新颖解决方案,不仅适用于 Nicla Vision(Cortex M7),还适用于 Cortex M4F CPU(Arduino Nano33 和 OpenMV M4 系列以及 Espressif ESP32 设备(ESP-CAM 和 XIAO ESP32S3 Sense))。

在这个动手实验中,我们将探索使用 FOMO 进行对象检测,不会深入介绍模型本身的细节。要了解更多关于模型如何工作的信息,你可以查看 Edge Impulse 的官方 FOMO 宣布,其中 Louis Moreau 和 Mat Kelcey 详细解释了其工作原理。

对象检测项目目标

所有机器学习项目都需要从一个详细的目标开始。假设我们在一个工业设施中,必须对轮子和特殊的箱子进行分类和计数。

图片

换句话说,我们应该执行多标签分类,其中每张图像可以有三种类别:

  • 背景(无对象)

  • 箱子

  • 轮子

这里有一些未标记的图像样本,我们将使用它们来检测对象(轮子和箱子):

图片

我们感兴趣的是图像中的哪个对象,其位置(质心),以及我们能在上面找到多少个。与 MobileNet SSD 或 YOLO 一样,FOMO 不检测对象的大小,因为边界框是模型输出之一。

我们将使用 Nicla Vision 进行图像捕捉和模型推理来开发项目。机器学习项目将使用 Edge Impulse Studio 进行开发。但在开始 Studio 中的对象检测项目之前,让我们使用包含要检测的对象的图像创建一个原始数据集(未标记)。

数据收集

对于图像捕捉,我们可以使用:

  • Web Serial Camera 工具,

  • Edge Impulse Studio,

  • OpenMV IDE,

  • 一部智能手机。

在这里,我们将使用OpenMV IDE

使用 OpenMV IDE 收集数据集

首先,我们在电脑上创建一个文件夹来保存数据,例如,“data。”然后,在 OpenMV IDE 中,我们转到“工具 > 数据集编辑器”并选择“新建数据集”以开始数据集收集:

图片

Edge Impulse 建议对象的大小应该相似,且不要重叠,以获得更好的性能。这在工业设施中是可行的,因为相机应该固定,保持与要检测的对象相同的距离。尽管如此,我们也会尝试使用不同大小和位置来查看结果。

我们不会为我们的图像创建单独的文件夹,因为每个文件夹都包含多个标签。

将 Nicla Vision 连接到 OpenMV IDE 并运行 dataset_capture_script.py。点击“捕捉图像”按钮将开始捕捉图像:

图片

我们建议使用大约 50 张图像来混合对象,并改变场景中每个对象出现的数量。尝试捕捉不同的角度、背景和光照条件。

存储的图像使用 QVGA 分辨率 320×240320\times 240 和 RGB565(颜色像素格式)。

在捕捉完你的数据集后,关闭“工具 > 数据集编辑器”中的数据集编辑工具。

Edge Impulse Studio

设置项目

前往 Edge Impulse Studio,在 登录(或创建账户)处输入您的凭据,并开始一个新项目。

在这里,您可以克隆为这个动手实践开发的该项目:NICLA_Vision_Object_Detection

在项目 仪表板 中,转到 项目信息 并选择 边界框(目标检测),然后在页面右上角选择 目标Arduino Nicla Vision (Cortex-M7)

图片

上传未标记的数据

在 Studio 中,转到 数据采集 选项卡,在 上传数据 部分从您的计算机文件上传。

图片

您可以离开工作室,让数据自动在训练和测试之间分割,或者手动进行。

图片

所有未标记的图像(51 张)都已上传,但在用作项目中的数据集之前,它们还需要适当标注。工作室有一个用于此目的的工具,您可以在链接 标注队列(51) 中找到。

您可以使用两种方式在 Edge Impulse Studio(免费版)上执行人工智能辅助标注:

  • 使用 yolov5

  • 在帧之间跟踪对象

Edge Impulse 为企业客户推出了 自动标注功能,简化了目标检测项目中的标注任务。

使用现有的 YOLOv5 预训练对象检测模型库(使用 COCO 数据集训练)可以快速识别和标注普通对象。但由于在我们的案例中,对象不是 COCO 数据集的一部分,我们应该选择 跟踪对象 选项。使用此选项,一旦您在一个帧中绘制边界框并标注图像,对象将自动从帧到帧跟踪,部分 标注新的对象(并非所有都正确标注)。

如果您已经有一个包含边界框的已标记数据集,请使用 EI 上传器导入您的数据。

标注数据集

从您未标记的数据的第一张图像开始,使用鼠标拖动一个框来围绕对象添加标签。然后点击 保存标签 以进入下一项。

图片

继续此过程,直到队列清空。最后,所有图像都应标注为以下样本中的对象:

图片

接下来,在 数据采集 选项卡上查看已标记样本。如果其中一个标签错误,可以在样本名称后的 三个点 菜单中进行编辑:

图片

我们将指导您替换错误的标签并纠正数据集。

图片

冲量设计

在这个阶段,我们应该定义如何:

  • 预处理包括将单个图像从 320 x 240 调整到 96 x 96 并将其压扁(方形形式,不裁剪)。之后,图像从 RGB 转换为灰度。

  • 设计模型,在这种情况下,“目标检测”。

图片

预处理所有数据集

在本节中,选择颜色深度灰度,适合与 FOMO 模型一起使用,并保存参数

图片

Studio 会自动移动到下一个部分,即“生成特征”,在这里所有样本都将进行预处理,从而生成包含单个96×96×196\times 96\times 1图像或 9,216 个特征的数据库。

图片

特征探索器显示,在特征生成后,所有样本都显示出良好的分离。

其中一个样本(46 号)显然位于错误的空间中,但点击它确认标签是正确的。

模型设计、训练和测试

我们将使用 FOMO,这是一个基于 MobileNetV2(alpha 0.35)的对象检测模型,旨在将图像粗略分割成背景感兴趣对象(在此处为轮子)的网格。

FOMO 是一个创新的机器学习对象检测模型,与传统模型如 Mobilenet SSD 和 YOLOv5 相比,可以节省高达 30 倍的能量和内存。FOMO 可以在小于 200 KB RAM 的微控制器上运行。这之所以可能,是因为其他模型通过围绕对象绘制一个正方形(边界框)来计算对象的大小,而 FOMO 忽略了图像的大小,仅通过其质心坐标提供有关对象在图像中位置的信息。

FOMO 是如何工作的?

FOMO 将图像转换为灰度,并使用 8 的因子将其划分为像素块。对于 96x96 的输入,网格将是12×1212\times 12 (96/8=12)(96/8=12)。接下来,FOMO 将对每个像素块运行一个分类器,以计算其中每个像素块包含框或轮子的概率,并随后确定具有最高概率包含对象的区域(如果一个像素块没有对象,它将被分类为背景)。从最终区域的重叠部分,FOMO 提供了该区域质心的坐标(与图像尺寸相关)。

图片

对于训练,我们应该选择一个预训练的模型。让我们使用FOMO (Faster Objects, More Objects) MobileNetV2 0.35。这个模型大约使用 250 KB 的 RAM 和 80 KB 的 ROM(闪存),非常适合我们的板子,因为它有 1 MB 的 RAM 和 ROM。

图片

关于训练超参数,模型将使用以下参数进行训练:

  • 迭代次数:60,

  • 批处理大小:32

  • 学习率:0.001。

在训练期间的验证中,20%的数据集(validation_dataset)将被保留。对于剩余的 80%(train_dataset),我们将应用数据增强,这会随机翻转、改变图像的大小和亮度,并裁剪它们,人为地增加数据集上的样本数量以供训练。

因此,该模型最终在验证数据上达到约 91%的 F1 分数(验证)和 93%(测试数据)。

注意,FOMO 自动将第三个标签背景添加到之前定义的两个标签(boxwheel)中。

在目标检测任务中,准确率通常不是主要的评估指标。目标检测涉及对对象进行分类并在其周围提供边界框,这使得它比简单的分类更复杂。问题是我们没有边界框,只有质心。简而言之,使用准确率作为指标可能是误导性的,并且可能无法完全理解模型的性能。因此,我们将使用 F1 分数。

使用“实时分类”测试模型

由于 Edge Impulse 官方支持 Nicla Vision,让我们将其连接到 Studio。为此,请按照以下步骤操作:

  • 下载最新的 EI 固件并将其解压。

  • 在您的计算机上打开 zip 文件,并选择与您的操作系统相关的上传器。

  • 将 Nicla-Vision 置于启动模式,按两次复位按钮。

  • 执行针对您操作系统的特定批处理代码,将二进制文件(arduino-nicla-vision.bin)上传到您的板子上。

前往 EI Studio 中的实时分类部分,并使用webUSB连接您的 Nicla Vision:

连接后,您可以使用 Nicla 捕获实际图像,以便在 Edge Impulse Studio 上由训练模型进行测试。

需要注意的是,模型可能会产生误报和漏报。这可以通过定义适当的置信度阈值(使用三个点菜单进行设置)来最小化。尝试使用 0.8 或更高。

部署模型

在部署选项卡上选择OpenMV 固件并按下 [构建]

当您再次尝试使用 OpenMV IDE 连接 Nicla 时,它将尝试更新其固件。选择加载特定固件选项,或者转到工具 > 运行引导加载程序(加载固件)

您将在计算机上找到来自 Studio 的 ZIP 文件。打开它:

将.bin 文件加载到您的板子上:

下载完成后,将显示一个弹出消息。按确定,并打开从 Studio 下载的脚本ei_object_detection.py

注意:如果出现弹出窗口表示固件过时,请按 [NO],以升级它。

在运行脚本之前,让我们更改几行。请注意,您可以将窗口定义保留为 240×240240\times 240,并将捕获图像的相机设置为 QVGA/RGB。捕获的图像将由从 Edge Impulse 部署的 FW 预处理。

import sensor
import time
import ml
from ml.utils import NMS
import math
import image

sensor.reset()  # Reset and initialize the sensor.
# Set pixel format (RGB565 or GRAYSCALE)
sensor.set_pixformat(sensor.RGB565)
# Set frame size to QVGA (320x240)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)  # Let the camera adjust.

重新定义最小置信度,例如,设置为 0.8 以最小化误报和漏报。

min_confidence = 0.8

如有必要,更改用于显示检测到的物体质心的圆圈颜色,以获得更好的对比度。

threshold_list = [(math.ceil(min_confidence * 255), 255)]

# Load built-in model
model = ml.Model("trained")
print(model)

# Alternatively, models can be loaded from the
# filesystem storage.
# model = ml.Model(
#     '<object_detection_modelwork>.tflite',
#     load_to_fb=True)
# labels = [line.rstrip('\n') for line in open("labels.txt")]

colors = [ # Add more colors if you are detecting more
           # than 7 types of classes at once.
    (255, 255,   0), # background: yellow (not used)
    (  0, 255,   0), # cube: green
    (255,   0,   0), # wheel: red
    (  0,   0, 255), # not used
    (255,   0, 255), # not used
    (  0, 255, 255), # not used
    (255, 255, 255), # not used
]

保持剩余代码不变

# FOMO outputs an image per class where each pixel in the
# image is the centroid of the trained object. So, we will
# get those output images and then run find_blobs() on them
# to extract the centroids. We will also run get_stats() on
# the detected blobs to determine their score.
# The Non-Max-Suppression (NMS) object then filters out
# overlapping detections and maps their position in the
# output image back to the original input image. The
# function then returns a list per class which each contain
# a list of (rect, score) tuples representing the detected
# objects.


def fomo_post_process(model, inputs, outputs):
    n, oh, ow, oc = model.output_shape[0]
    nms = NMS(ow, oh, inputs[0].roi)
    for i in range(oc):
        img = image.Image(outputs[0][0, :, :, i] * 255)
        blobs = img.find_blobs(
            threshold_list,
            x_stride=1,
            area_threshold=1,
            pixels_threshold=1,
        )
        for b in blobs:
            rect = b.rect()
            x, y, w, h = rect
            score = (
                img.get_statistics(
                    thresholds=threshold_list, roi=rect
                ).l_mean()
                / 255.0
            )
            nms.add_bounding_box(x, y, x + w, y + h, score, i)
    return nms.get_bounding_boxes()


clock = time.clock()
while True:
    clock.tick()

    img = sensor.snapshot()

    for i, detection_list in enumerate(
        model.predict([img], callback=fomo_post_process)
    ):
        if i == 0:
            continue  # background class
        if len(detection_list) == 0:
            continue  # no detections for this class?

        print("********** %s **********" % model.labels[i])
        for (x, y, w, h), score in detection_list:
            center_x = math.floor(x + (w / 2))
            center_y = math.floor(y + (h / 2))
            print(f"x {center_x}\ty {center_y}\tscore {score}")
            img.draw_circle((center_x, center_y, 12), color=colors[i])

    print(clock.fps(), "fps", end="\n")

然后按下 绿色播放按钮 运行代码:

图片

从摄像头的视角来看,我们可以看到带有用 12 像素固定圆圈标记的质心的物体(每个圆圈都有独特的颜色,取决于其类别)。在串行终端上,模型显示了检测到的标签及其在图像窗口中的位置 (240×240)(240\times 240)

注意,坐标原点位于左上角。

图片

注意,每秒帧率约为 8 fps(与我们使用图像分类项目得到的相似)。这是因为 FOMO 是巧妙地建立在 CNN 模型之上,而不是像 SSD MobileNet 或 YOLO 这样的物体检测模型。例如,当在 Raspberry Pi 4 上运行 MobileNetV2 SSD FPN-Lite 320×320320\times 320 模型时,延迟大约高 5 倍(大约 1.5 fps)

这里有一个展示推理结果的短视频:youtu.be/JbpoqRp3BbM

摘要

如路易斯·莫罗和马特·凯尔西在 2022 年发布时所说,FOMO 是图像处理领域的一个重大飞跃:

FOMO 是一个突破性的算法,首次将实时物体检测、跟踪和计数引入到微控制器中。

在嵌入式设备上探索物体检测(更确切地说,是计数它们)有多种可能性。这在例如计数蜜蜂的项目中非常有用。

图片

资源

关键词检测(KWS)

图片

DALL·E 3 提示:1950 年代风格的卡通场景,设置在一个复古音频研究室中。两位非裔美国女科学家位于中心。一位手持放大镜,仔细检查古老的电路,而另一位在记笔记。在他们木质桌子上,有多块带有传感器的板,其中特别突出麦克风。在这些板后面,一台带有大圆背的计算机显示 Arduino IDE。IDE 展示了 LED 引脚分配的代码和用于语音命令检测的机器学习推理。IDE 中的一个独特窗口,串行监视器,显示了表示说出的命令“是”和“否”的输出。房间氛围怀旧,有复古灯具、经典音频分析工具和描绘 FFT 图和时间域曲线的图表。

概述

在已经探索了 Nicla Vision 板在图像分类目标检测应用中的使用后,我们现在将重点转向语音激活应用,通过一个关于关键词检测(KWS)的项目。

如在音频分类特征工程动手教程中介绍的那样,关键词检测(KWS)集成到许多语音识别系统中,使设备能够对特定的单词或短语做出响应。虽然这项技术支撑着像 Google Assistant 或 Amazon Alexa 这样的流行设备,但它同样适用于较小的、低功耗设备。本教程将指导您在配备数字麦克风的 Nicla Vision 开发板上使用 TinyML 实现 KWS 系统。

我们的设计模型将能够识别可以触发设备唤醒或特定动作的关键词,通过语音激活命令使它们活跃起来。

语音助手是如何工作的?

正如所说,市场上的语音助手,如 Google Home 或 Amazon Echo-Dot,只有在被特定的关键词“唤醒”时才会对人类做出反应,第一个是“嘿,谷歌”,第二个是“Alexa”。

图片

换句话说,语音命令的识别基于多阶段模型或级联检测。

图片

第一阶段:Echo Dot 或 Google Home 内部的小型微处理器持续监听,等待检测到关键词,使用边缘的 TinyML 模型(KWS 应用)。

第二阶段:只有在第一阶段由 KWS 应用触发后,数据才会被发送到云端并在更大的模型上处理。

下面的视频展示了在 Raspberry Pi 上编程 Google Assistant 的示例(第二阶段),Arduino Nano 33 BLE 作为 TinyML 设备(第一阶段)。

youtu.be/e_OPgcnsyvM

要探索上述 Google Assistant 项目,请参阅教程:从头开始构建智能语音助手

在这个 KWS 项目中,我们将专注于第一阶段(KWS 或关键词检测),我们将使用 Nicla Vision,它有一个数字麦克风,将用于检测关键词。

KWS 动手项目

下面的图表展示了最终的 KWS 应用应该如何工作(在推理过程中):

图片

我们的 KWS 应用将识别四种声音类别:

  • YES(关键词 1)

  • NO(关键词 2)

  • 噪声(没有说话;只有背景噪声)

  • 未知(不同于 YES 和 NO 的不同单词的混合)

对于现实世界的项目,始终建议除了关键词之外,还包括其他声音,例如“噪声”(或背景)和“未知”。

机器学习工作流程

KWS 应用的主要组件是其模型。因此,我们必须使用我们特定的关键词、噪声和其他单词(“未知”)来训练这样的模型:

图片

数据集

任何机器学习工作流程的关键组件是数据集。一旦我们决定了特定的关键词,在我们的案例中是(YES和 NO),我们就可以利用 Pete Warden 开发的数据集,“Speech Commands: A Dataset for Limited-Vocabulary Speech Recognition。”这个数据集有 35 个关键词(每个有+1,000 个样本),例如 yes、no、stop 和 go。在yesno这样的词中,我们可以得到 1,500 个样本。

您可以从 Edge Studio 下载数据集的一部分(关键词检测预构建数据集),该数据集包括我们将在此项目中使用的四个类别的样本:yes、no、noise 和 background。为此,请按照以下步骤操作:

将数据集上传到 Edge Impulse Studio

在 Edge Impulse Studio(EIS)中启动一个新项目,并在“数据获取”部分选择“上传现有数据”工具。选择要上传的文件:

图片

定义标签,选择自动在训练和测试之间分割,并上传数据到 EIS。为所有类别重复此操作。

图片

数据集现在将出现在“数据获取”部分。请注意,大约 6,000 个样本(每类 1,500 个)被分为训练集(4,800 个)和测试集(1,200 个)。

图片

捕获额外的音频数据

尽管我们从 Pete 的数据集中获得了大量数据,但收集一些我们自己的说话词是建议的。当与加速度计一起工作时,创建由相同类型的传感器捕获的数据集是至关重要的。在声音的情况下,这是可选的,因为我们实际上要分类的是音频数据。

声音和音频之间的关键区别是能量的类型。声音是机械扰动(纵向声波),通过介质传播,导致其压力变化。音频是表示声音的电气(模拟或数字)信号。

当我们发音一个关键词时,声波应转换为音频数据。转换应通过在 16 KHz 频率下以 16 位每样本幅度采样麦克风产生的信号来完成。

因此,任何可以生成具有此基本规格(16 KHz/16 位)的音频数据的设备都可以正常工作。作为一个 设备,我们可以使用 NiclaV、计算机,甚至您的手机。

使用 NiclaV 和 Edge Impulse Studio

如我们在 设置 Nicla Vision 章节中学到的,EIS 正式支持 Nicla Vision,这简化了从其传感器(包括麦克风)捕获数据的过程。因此,请在 EIS 上创建一个新项目,并将 Nicla 连接到它,按照以下步骤操作:

  • 下载最新更新的 EIS 固件 并解压。

  • 在您的计算机上打开 zip 文件,并选择对应您操作系统的上传器:

  • 通过按重置按钮两次将 NiclaV 放入引导模式。

  • 通过运行对应您操作系统的批处理代码,将二进制文件 arduino-nicla-vision.bin 上传到您的板子上。

前往您在 EIS 上的项目,并在 数据采集选项卡 上选择 WebUSB。将弹出一个窗口;选择显示 Nicla 已配对 的选项,并按 [连接]

您可以在“数据采集”选项卡上的“收集数据”部分选择要选择哪些传感器数据。选择:内置麦克风,定义您的 标签(例如,),采样 频率[16000Hz],以及 样本长度(以毫秒计),例如 [10s]。开始采样

Pete 的数据集中的数据长度为 1 秒,但记录的样本长度为 10 秒,必须分割成 1 秒的样本。在样本名称后面的 三个点 上点击,并选择 分割样本

将弹出一个带有分割工具的窗口。

一旦进入工具,将数据分割成 1 秒(1000 毫秒)的记录。如有必要,添加或删除段。此过程应适用于所有新的样本。

使用智能手机和 EI Studio

您还可以使用您的 PC 或智能手机捕获音频数据,使用 16 KHz 的采样频率和 16 位的位深度。

前往 设备,使用您的手机扫描 QR 码,并点击链接。浏览器中会出现一个数据收集应用程序。选择 收集音频,并定义您的 标签、数据捕获 长度类别

重复与 NiclaV 使用的相同程序。

注意,任何应用程序,如 Audacity,都可以用于音频录制,只要您使用 16 KHz/16 位深度的样本。

创建 Impulse(预处理/模型定义)

一个 冲激 从原始数据中提取特征,使用信号处理来提取特征,然后使用学习模块来分类新数据。

冲激设计

首先,我们将使用 1 秒的窗口获取数据点,以 500 毫秒的间隔增强数据和滑动窗口。请注意,已设置零填充数据的选项。用“零”填充小于 1 秒的样本(在某些情况下,一些样本可以小于分割工具上的 1000 毫秒窗口,以避免噪声和尖峰)是至关重要的。

每个持续 1 秒的音频样本都应该进行预处理并转换为图像(例如,13×49×113\times 49\times 1)。正如在音频分类特征工程动手教程中讨论的那样,我们将使用音频(MFCC),它使用梅尔频率倒谱系数从音频信号中提取特征,这些特征非常适合人类语音,我们这里的案例。

接下来,我们选择分类模块,使用卷积神经网络(CNN)从头开始构建我们的模型。

或者,您可以使用迁移学习(关键词检测)模块,该模块在您的数据上微调预训练的关键词检测模型。这种方法在相对较小的关键词数据集上具有很好的性能。

预处理(MFCC)

下一个步骤是创建下一阶段要训练的特征:

我们可以保留默认参数值,但我们将使用 DSP 的自动调整参数选项。

我们将使用原始特征(我们的 1 秒,16 KHz 采样音频数据)并使用 MFCC 处理模块来计算处理特征。对于每 16,000 个原始特征(16,000 ×\times 1 秒),我们将得到 637 个处理特征 (13×49)(13\times 49)

结果显示,我们只使用了少量的内存来预处理数据(16 KB)和 34 毫秒的延迟,这是非常出色的。例如,在 Arduino Nano(Cortex-M4f @ 64 MHz)上,相同的预处理将需要大约 480 毫秒。选择的参数,如FFT 长度[512],将显著影响延迟。

现在,让我们保存参数并切换到生成特征标签页,在这里将生成实际的特征。使用UMAP,一种降维技术,特征探索器显示了特征在二维图上的分布情况。

结果看起来不错,特征(红色)和特征(蓝色)之间有明显的视觉分离。未知特征似乎比空间更接近。这表明关键字更容易产生误报。

深入了解内部结构

要更好地了解原始声音是如何预处理的,请查看音频分类的特征工程章节。您可以通过从 GitHub 下载此notebook来尝试 MFCC 特征生成,或[在 Colab 中打开]

模型设计和训练

我们将使用一个简单的卷积神经网络(CNN)模型,使用一维和二维卷积进行测试。基本架构有两个卷积+最大池化块([8]和[16]个过滤器,分别)和一个[0.25]的 Dropout 用于一维,[0.5]的 Dropout 用于二维。对于最后一层,在 Flattening 之后,我们有[4]个神经元,每个类别一个:

图片

作为超参数,我们将有一个[0.005]的学习率,并通过[100]个 epoch 训练模型。我们还将包括基于SpecAugment的数据增强方法。我们使用相同超参数训练了一维和二维模型。一维架构的整体结果更好(与二维的 88%相比,准确率为 90.5%,因此我们将使用一维)。

图片

使用一维卷积更高效,因为它需要的参数比二维卷积少,这使得它们更适合资源受限的环境。

1D 混淆矩阵也很有趣。的 F1 分数为 95%,为 91%。这与我们在特征探索器中看到的结果相符(未知距离很近)。在尝试提高结果时,您可以仔细检查出错样本的结果。

图片

听一下出错的样本。例如,对于“是”,大多数错误都与发音为“耶”的“是”有关。您可以获取更多样本,然后重新训练您的模型。

深入了解内部结构

如果您想了解“内部结构”中发生的事情,您可以从“仪表板”选项卡下载预处理的数据集(MFCC 训练数据),并运行此Jupyter Notebook,通过代码进行操作或[在 Colab 中打开]。例如,您可以按每个 epoch 分析准确率:

图片

测试

使用为训练保留的数据(测试数据)测试模型,我们得到了大约 76%的准确率。

图片

检查 F1 分数,我们可以看到对于 YES,我们得到了 0.90,这是一个非常好的结果,因为我们预计将使用这个关键词作为我们 KWS 项目的“触发器”。最差的结果(0.70)是 UNKNOWN,这是可以接受的。

对于 NO,我们得到了 0.72,这是预期的,但为了提高这个结果,我们可以将那些未被正确分类的样本移动到训练数据集中,然后重复训练过程。

实时分类

我们可以继续进行项目的下一步,同时考虑使用 NiclaV 或智能手机捕获实时样本进行实时分类,在将训练模型部署到我们的设备之前进行测试。

部署和推理

EIS 将打包所有需要的库、预处理函数和训练模型,并将它们下载到你的电脑。转到 Deployment 部分,选择 Arduino Library,在底部选择 Quantized (Int8) 并按 Build

当选择 Build 按钮时,将创建一个 zip 文件并下载到你的电脑。在你的 Arduino IDE 中,转到 Sketch 选项卡,选择 Add .ZIP Library 选项,并选择由 EIS 下载的.zip 文件:

现在,是时候进行实际测试了。我们将完全断开与 EIS 的连接进行推理。让我们使用部署 Arduino Library 时创建的 NiclaV 代码示例。

在你的 Arduino IDE 中,转到 File/Examples 选项卡,查找你的项目,并选择 nicla-vision/nicla-vision_microphone(或 nicla-vision_microphone_continuous

按下复位按钮两次,将 NiclaV 置于引导模式,将草图上传到你的板子,并测试一些真实的推理:

后处理

既然我们知道模型正在工作,因为它检测到了我们的关键词,那么让我们修改代码,看看 NiclaV 完全离线(未连接到 PC,由电池、移动电源或独立的 5V 电源供电)的结果。

策略是,每当检测到关键词 YES 时,绿灯将亮起;如果听到 NO,红灯将亮起,如果是 UNKNOWN,蓝灯将亮起;在存在噪声(无关键词)的情况下,LED 将关闭。

我们应该修改其中一个代码示例。现在就让我们用 nicla-vision_microphone_continuous 来做吧。

从初始化 LED 开始:

...
void setup()
{
        // Once you finish debugging your code, you can
        // comment or delete the Serial part of the code
    Serial.begin(115200);
    while (!Serial);
    Serial.println("Inferencing - Nicla Vision KWS with LEDs");

    // Pins for the built-in RGB LEDs on the Arduino NiclaV
    pinMode(LEDR, OUTPUT);
    pinMode(LEDG, OUTPUT);
    pinMode(LEDB, OUTPUT);

    // Ensure the LEDs are OFF by default.
    // Note: The RGB LEDs on the Arduino Nicla Vision
    // are ON when the pin is LOW, OFF when HIGH.
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, HIGH);
...
}

创建两个函数,turn_off_leds() 函数,用于关闭所有 RGB LED

/*
 * @brief      turn_off_leds function - turn-off all RGB LEDs
 */
void turn_off_leds(){
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, HIGH);
}

另一个 turn_on_led() 函数用于根据分类器的最可能结果打开 RGB LED。

/*
 * @brief     turn_on_leds function used to turn on the RGB LEDs
 * @param[in] pred_index
 *            no:       [0] ==> Red ON
 *            noise:    [1] ==> ALL OFF
 *            unknown:  [2] ==> Blue ON
 *            Yes:      [3] ==> Green ON
 */
void turn_on_leds(int pred_index) {
  switch (pred_index)
  {
    case 0:
      turn_off_leds();
      digitalWrite(LEDR, LOW);
      break;

    case 1:
      turn_off_leds();
      break;

    case 2:
      turn_off_leds();
      digitalWrite(LEDB, LOW);
      break;

    case 3:
      turn_off_leds();
      digitalWrite(LEDG, LOW);
      break;
  }
}

并且更改 loop() 中的 // 打印预测 部分的代码:

...

 if (++print_results >= (EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW)) {
     // print the predictions
     ei_printf("Predictions ");
     ei_printf("(DSP: %d ms., Classification: %d ms.,
                 Anomaly: %d ms.)",
         result.timing.dsp, result.timing.classification,
         result.timing.anomaly);
     ei_printf(": \n");
     int pred_index = 0;     // Initialize pred_index
     float pred_value = 0;   // Initialize pred_value
     for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
         if (result.classification[ix].value > pred_value){
             pred_index = ix;
             pred_value = result.classification[ix].value;
         }
         // ei_printf("    %s: ",
         // result.classification[ix].label);
         // ei_printf_float(result.classification[ix].value);
         // ei_printf("\n");
     }
     ei_printf("  PREDICTION: ==> %s with probability %.2f\n",
               result.classification[pred_index].label,
               pred_value);
     turn_on_leds (pred_index);

#if EI_CLASSIFIER_HAS_ANOMALY == 1
        ei_printf("    anomaly score: ");
        ei_printf_float(result.anomaly);
        ei_printf("\n");
#endif

        print_results = 0;
    }
}

...

你可以在项目的 GitHub上找到完整的代码。

将草图上传到你的板子上并测试一些真实推理。想法是,当检测到关键词 YES 时,绿色 LED 将亮起,红色 LED 将亮起表示 NO,任何其他单词都将点亮蓝色 LED。如果存在寂静或背景噪音,所有 LED 都应关闭。记住,与我们在介绍中看到的一样,相同的程序可以“触发”外部设备执行所需操作,而不是点亮 LED。

youtu.be/25Rd76OTXLY

摘要

你可以在 GitHub 仓库中找到本动手教程所使用的笔记本和代码。

在我们结束之前,考虑一下声音分类不仅仅是声音。例如,你可以在多个领域围绕声音开发 TinyML 项目,例如:

  • 安全(破碎玻璃检测,枪声)

  • 工业(异常检测)

  • 医疗(打鼾,咳嗽,肺部疾病)

  • 自然(蜂箱控制,昆虫声音,包装缓解)

资源

运动分类和异常检测

DALL·E 3 提示:1950 年代风格的卡通插图,描绘一个运动研究室。房间中央有一个用于在卡车、船只和叉车上运输货物的模拟集装箱。集装箱细节丰富,有铆钉和工业货箱典型的标记。集装箱周围,房间内充满了复古设备,包括示波器、各种传感器阵列和大量记录数据的厚纸卷。墙上装饰着关于交通安全和物流的教育海报。整个房间的氛围既怀旧又科学,带有一丝工业风格

概述

交通运输是全球商业的支柱。每天通过各种方式,如船只、卡车和火车,运输数百万个集装箱到世界各地。确保这些集装箱的安全高效运输是一项艰巨的任务,需要利用现代技术,而 TinyML 无疑是其中之一。

在这个动手教程中,我们将努力解决与交通运输相关的现实世界问题。我们将使用 Arduino Nicla Vision 板、Arduino IDE 和 Edge Impulse Studio 开发运动分类和异常检测系统。这个项目将帮助我们了解集装箱在运输的不同阶段(如陆地和海上运输、通过叉车的垂直运动和仓库中的静止期)所经历的不同力和运动。

学习目标

  • 设置 Arduino Nicla Vision 板

  • 数据收集和预处理

  • 构建运动分类模型

  • 实施异常检测

  • 现实世界测试和分析

到本教程结束时,你将拥有一个可以分类不同类型运动并在集装箱运输过程中检测异常的工作原型。这些知识可以成为进入蓬勃发展的 TinyML 领域,涉及振动等更高级项目的垫脚石。

IMU 安装和测试

对于这个项目,我们将使用一个加速度计。正如在动手教程“设置 Nicla Vision”中讨论的那样,Nicla Vision 板上有一个板载 6 轴 IMU:3D 加速计和 3D 陀螺仪,LSM6DSOX。让我们验证是否已安装 LSM6DSOX IMU 库。如果没有,请安装它。

接下来,转到 Examples > Arduino_LSM6DSOX > SimpleAccelerometer 并运行加速度计测试。你可以通过打开 IDE 串行监视器或绘图器来检查它是否工作。值以 g(地球重力)为单位,默认范围为 +/- 4g:

定义采样频率:

选择合适的采样频率对于捕捉你感兴趣研究的运动特性至关重要。奈奎斯特-香农采样定理指出,采样率应至少是信号中最高频率分量的两倍,以便正确重建。在运输中的运动分类和异常检测的背景下,采样频率的选择将取决于几个因素:

  1. 运动性质:不同类型的运输(陆地、海事等)可能涉及不同的运动频率范围。更快的运动可能需要更高的采样频率。

  2. 硬件限制:Arduino Nicla Vision 板及其相关传感器可能对数据采样速度有限制。

  3. 计算资源:更高的采样率将生成更多数据,这可能会计算密集,特别是在 TinyML 环境中尤为重要。

  4. 电池寿命:更高的采样率将消耗更多电力。如果系统是电池供电的,这是一个重要的考虑因素。

  5. 数据存储:更频繁的采样将需要更多的存储空间,这是对内存有限的嵌入式系统来说另一个重要的考虑因素。

在许多人类活动识别任务中,大约 50 Hz 到 100 Hz 的采样率被普遍使用。鉴于我们正在模拟运输场景,这些场景通常不是高频事件,因此在这个范围(50-100 Hz)内的采样率可能是一个合理的起点。

让我们定义一个草图,以便我们可以以定义的采样频率(例如,50 Hz)捕获我们的数据:

/*
 * Based on Edge Impulse Data Forwarder Example (Arduino)
 - https://docs.edgeimpulse.com/docs/cli-data-forwarder
 * Developed by M.Rovai @11May23
 */

/* Include ------------------------------------------- */
#include <Arduino_LSM6DSOX.h>

/* Constant defines ---------------------------------- */
#define CONVERT_G_TO_MS2 9.80665f
#define FREQUENCY_HZ 50
#define INTERVAL_MS (1000  /  (FREQUENCY_HZ  +  1))

static unsigned long last_interval_ms = 0;
float x, y, z;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
}

void loop() {
  if (millis() > last_interval_ms + INTERVAL_MS) {
    last_interval_ms = millis();

    if (IMU.accelerationAvailable()) {
      // Read raw acceleration measurements from the device
      IMU.readAcceleration(x, y, z);

      // converting to m/s2
      float ax_m_s2 = x * CONVERT_G_TO_MS2;
      float ay_m_s2 = y * CONVERT_G_TO_MS2;
      float az_m_s2 = z * CONVERT_G_TO_MS2;

      Serial.print(ax_m_s2);
      Serial.print("\t");
      Serial.print(ay_m_s2);
      Serial.print("\t");
      Serial.println(az_m_s2);
    }
  }
}

上传草图并检查串行监视器,我们可以看到我们每秒捕获 50 个样本。

图片

注意,当 Nicla 板放在桌子上(摄像头朝下)时,zz-轴测得的值约为 9.8 m/s2²,这是预期的地球加速度。

案例研究:模拟集装箱运输

我们将通过不同的场景模拟集装箱(或更好的包装)运输,使这个教程更具相关性和实用性。使用 Arduino Nicla Vision 板内置的加速度计,我们将通过手动模拟以下条件来捕获运动数据:

  1. 陆地运输(通过道路或火车)

  2. 海事相关的运输

  3. 通过叉进行垂直移动

  4. 仓库中的静止(空闲)

图片

从上述图像中,我们可以为我们的模拟定义,主要水平运动(xxyy轴)应与“地面类别”相关联,垂直运动(zz-轴)与“提升类别”相关联,无活动与“空闲类别”相关联,三个轴上的运动到海事类别

数据收集

对于数据收集,我们可以有多种选择。在实际情况下,我们可以将我们的设备直接连接到一个容器上,并将收集到的数据存储在文件中(例如.CSV)并存储在 SD 卡上(通过 SPI 连接)或计算机上的离线仓库。数据也可以通过蓝牙(如本项目中的传感器数据记录器)远程发送到附近的仓库,例如手机。一旦您的数据集收集并存储为.CSV 文件,就可以使用CSV 向导工具将其上传到 Studio。

在这个视频中,您可以了解将数据发送到 Edge Impulse Studio 的替代方法。

将设备连接到 Edge Impulse

我们将直接将 Nicla 连接到 Edge Impulse Studio,该 Studio 也将用于数据预处理、模型训练、测试和部署。为此,您有两个选项:

  1. 下载最新固件并将其直接连接到“数据收集”部分。

  2. 使用CLI 数据转发器工具从传感器捕获传感器数据并发送到 Studio。

选项 1 更为直接,正如我们在设置 Nicla Vision的动手实践中所看到的,但选项 2 将为您提供更多关于捕获数据的灵活性,例如采样频率定义。让我们使用最后一个选项来做。

请在 Edge Impulse Studio(EIS)上创建一个新的项目,并将 Nicla 连接到它,按照以下步骤操作:

  1. 在您的计算机上安装Edge Impulse CLINode.js

  2. 上传用于数据捕获的草图(本教程中之前讨论过的那个)。

  3. 使用CLI 数据转发器从 Nicla 的加速度计捕获数据并发送到 Studio,如图所示:

在您的终端上启动CLI 数据转发器,如果这是第一次使用,请输入以下命令:

$ edge-impulse-data-forwarder --clean

接下来,输入你的 EI 凭据并选择你的项目、变量(例如,accXaccYaccZ)以及设备名称(例如,NiclaV):

图片

前往你的 EI 项目中的设备部分,检查设备是否已连接(点应该是绿色的):

图片

你可以克隆为这个动手实践开发的工程:NICLA Vision Movement Classification

数据收集

数据采集部分,你应该能看到你的板 [NiclaV] 已连接。传感器可用: [具有 3 个轴(accX,accY,accZ)的传感器],采样频率为 [50 Hz]。工作室建议样本长度为 [10000] 毫秒(10 秒)。最后剩下的是定义样本标签。让我们从[terrestrial]开始:

图片

地面(卡车或火车上的托盘),水平移动。按 [开始采样] 并将你的设备水平移动,保持一个方向在你的桌子上。10 秒后,你的数据将被上传到工作室。以下是样本的收集方式:

图片

如预期,运动主要被捕捉在YY轴(绿色)。在蓝色中,我们看到ZZ轴,大约在-10 m/s2²(Nicla 的摄像头朝上)。

如前所述,我们应该从所有四个运输类别中收集数据。所以,想象一下你有一个内置加速度计的容器,面对以下情况:

海洋(愤怒海洋中的船上的托盘)。运动在所有三个轴上被捕捉:

图片

提升(托盘被叉车垂直搬运)。运动仅被捕捉在ZZ轴:

图片

空闲(仓库中的托盘)。加速度计未检测到运动:

图片

你可以捕捉,例如,2 分钟(12 个 10 秒的样本)的每个四个类别(总共 8 分钟的数据)。在每个样本之后的三个点菜单中,选择其中 2 个,为测试集保留。或者,你可以在仪表板标签页的危险区域使用自动的训练/测试分割工具。下面,你可以看到生成的数据集:

图片

一旦你捕获了你的数据集,你可以使用数据探索器来更详细地探索它,这是一个可视化工具,用于查找异常值或错误标记的数据(有助于纠正它们)。数据探索器首先尝试从你的数据中提取有意义的特征(通过应用信号处理和神经网络嵌入),然后使用降维算法,如PCAt-SNE,将这些特征映射到二维空间。这让你可以一目了然地了解你的整个数据集。

图片

在我们的案例中,数据集看起来不错(良好的分离)。但 PCA 显示,我们可能在海洋(绿色)和提升(橙色)之间存在问题。这是预期的,一旦在船上,有时运动可能只有“垂直”。

脉冲设计

下一步是定义我们的脉冲,它将原始数据通过信号处理提取特征,然后将这些特征作为学习块的输入张量来对新数据进行分类。前往脉冲设计创建脉冲。工作室将建议基本设计。让我们也添加一个用于异常检测的第二个学习块

图片

这个第二个模型使用 K-means 模型。如果我们想象我们的已知类别可以作为簇,那么任何无法适应这些簇的样本可能是一个异常值,一个异常,比如一个集装箱从海洋中的船上滚落或从叉车掉落。

图片

采样频率应自动捕获,如果没有,请输入:[50]Hz。工作室建议的窗口大小为 2 秒([2000]毫秒),带有[20]毫秒的滑动窗口。我们在这一步定义的是,我们将预处理捕获的数据(时间序列数据),创建一个表格数据集(特征),这将作为神经网络分类器(DNN)和异常检测模型(K-Means)的输入,如下所示:

图片

让我们深入了解这些步骤和参数,以更好地理解我们在这里所做的工作。

数据预处理概述

数据预处理是从加速度计捕获的数据集中提取特征,这涉及到处理和分析原始数据。加速度计测量物体沿一个或多个轴的加速度(通常是三个,表示为XXYYZZ)。这些测量可以用来理解物体的运动的各种方面,如运动模式和振动。

原始加速度计数据可能噪声较大,包含错误或不相关信息。预处理步骤,如滤波和归一化,可以清理和标准化数据,使其更适合特征提取。在我们的案例中,我们应该将数据分成更小的段或窗口。这有助于关注数据集中的特定事件或活动,使特征提取更易于管理和有意义。窗口大小和重叠(窗口增加)的选择取决于应用和感兴趣事件的频率。作为一个经验法则,我们应该尝试捕捉几个“数据周期”。

以 50 Hz 的采样率(SR)和 2 秒的窗口大小,我们将得到每个轴 100 个样本,总共 300 个样本(3 轴 ×\times 2 秒 ×\times 50 个样本)。我们将每 200 毫秒滑动这个窗口,创建一个更大的数据集,其中每个实例都有 300 个原始特性。

图片

一旦数据经过预处理和分割,你就可以提取描述运动特征的特性。从加速度计数据中提取的一些典型特性包括:

  • 时域特性描述了每个段内数据的统计特性,例如均值、中位数、标准差、偏度、峰度和零交叉率。

  • 频域特性是通过使用快速傅里叶变换(FFT)等技术将数据转换到频域获得的。一些典型的频域特性包括功率谱、频谱能量、主导频率(幅度和频率)和频谱熵。

  • 时频域特性结合了时间和频率域信息,例如短时傅里叶变换(STFT)或离散小波变换(DWT)。它们可以提供对信号频率内容随时间变化的更详细理解。

在许多情况下,提取的特征数量可能很大,这可能导致过拟合或增加计算复杂性。特征选择技术,如互信息、基于相关性的方法或主成分分析(PCA),可以帮助确定给定应用中最相关的特征,并降低数据集的维度。工作室可以帮助进行此类特征重要性计算。

EI Studio 频谱特性

数据预处理是嵌入式机器学习的一个挑战领域,尽管如此,Edge Impulse 通过其数字信号处理(DSP)预处理步骤以及更具体的Spectral Features Block帮助克服了这一挑战。

在 Studio 中,收集到的原始数据集将成为频谱分析模块的输入,这对于分析重复运动,如加速度计数据非常出色。此模块将执行数字信号处理(DSP),提取如快速傅里叶变换小波等特征。

对于我们的项目,一旦时间信号连续,我们应该使用 FFT,例如长度为[32]

每个轴/通道的时域统计特征包括:

每个轴/通道的频域特征包括:

  • 频谱功率: 16 个特征(FFT 长度/2)

  • 偏度: 1 个特征

  • 峰度: 1 个特征

因此,对于 32 点的 FFT 长度,频谱分析模块的输出将是每个轴 21 个特征(总共 63 个特征)。

你可以通过下载笔记本Edge Impulse - 频谱特征块分析 TinyML 内部:频谱分析直接在 Google CoLab 上打开它来了解更多关于每个特征是如何计算的。

生成特征

一旦我们理解了预处理做了什么,就是时候完成工作了。所以,让我们将原始数据(时间序列类型)转换为表格数据。为此,转到参数标签页上的频谱特征部分,定义主要参数(如前所述的[FFT],长度为[32]点),并选择[保存参数]

在顶部菜单中,选择生成特征选项和生成特征按钮。每个 2 秒窗口的数据将被转换成一个包含 63 个特征的独立数据点。

特征探索器将使用UMAP在 2D 中显示这些数据。均匀流形近似和投影(UMAP)是一种降维技术,可以用于可视化,类似于 t-SNE,但也适用于一般的非线性降维。

可视化使得验证在特征生成后,现有的类别保持良好的分离成为可能,这表明分类器应该表现良好。可选地,你可以分析每个特征对于某一类别相对于其他类别的重要性。

图片

模型训练

我们的分类器将是一个密集神经网络(DNN),其输入层将有 63 个神经元,两个隐藏层分别有 20 和 10 个神经元,输出层有四个神经元(每个类别一个),如图所示:

图片

作为超参数,我们将使用学习率为[0.005],批大小为[32],数据验证为[20]%,持续[30]个 epoch。训练后,我们可以看到准确率为 98.5%。内存和延迟的成本微乎其微。

图片

对于异常检测,我们将选择特征提取中精确的最重要特征,再加上 accZ RMS。簇的数量将是[32],正如 Studio 所建议的:

图片

测试

我们可以使用在数据捕获阶段留下的 20%的数据来验证我们的模型在未知数据上的表现。结果是几乎 95%,这是很好的。您总是可以努力提高结果,例如,了解一个错误结果中出了什么问题。如果是独特的情况,您可以将其添加到训练数据集中,然后重复它。

对于考虑的不确定结果,默认的最小阈值是分类的[0.6]和异常的[0.3]。一旦我们有四个类别(它们的输出总和应为 1.0),您也可以为类别设置一个较低的阈值以被视为有效(例如,0.4)。您可以在三点菜单上设置置信度阈值,除了分类所有按钮。

图片

您还可以使用您的设备进行实时分类(设备应仍然连接到 Studio)。

请注意,在这里,您将使用您的设备捕获真实数据并将其上传到 Studio,在那里将使用训练好的模型进行推理(但模型不在您的设备上)。

部署

现在是时候将预处理块和训练好的模型部署到 Nicla 上了。Studio 将打包所有需要的库、预处理函数和训练好的模型,并将它们下载到您的电脑上。您应该选择Arduino Library选项,在底部,您可以选择量化(Int8)未优化(float32),然后点击[构建]。将创建一个 Zip 文件并下载到您的电脑上。

图片

在您的 Arduino IDE 中,转到草图标签,选择添加 ZIP 库,并选择 Studio 下载的.zip 文件。IDE 终端将出现一条消息:库已安装

推理

现在,是时候进行实际测试了。我们将完全脱离 Studio 进行推理。让我们更改您部署 Arduino Library 时创建的一个代码示例。

在您的 Arduino IDE 中,转到文件/示例标签,找到您的项目,并在示例中选择Nicla_vision_fusion

图片

注意,Edge Impulse 创建的代码考虑了一种 传感器融合 方法,其中使用了 IMU(加速度计和陀螺仪)和 ToF。在代码的开头,你有与我们项目相关的库,即 IMU 和 ToF:

/* Includes ---------------------------------------------- */
#include <NICLA_Vision_Movement_Classification_inferencing.h>
#include <Arduino_LSM6DSOX.h>  //IMU
#include "VL53L1X.h"  // ToF

你可以保持代码这种方式进行测试,因为训练好的模型将只使用来自加速度计的预处理特征。但请考虑,你将只使用真实项目中需要的库来编写代码。

就这样!

你现在可以将代码上传到你的设备,并继续进行推理。按下 Nicla 的 [RESET] 按钮两次以将其置于引导模式(如果仍然连接,请断开与 Studio 的连接),并将草图上传到你的板子。

现在你应该尝试用你的板子(类似于数据捕获期间所做的动作)进行不同的动作,观察每个类别在串行监视器上的推理结果:

  • 空闲和提升类别

  • 海洋和陆地

注意,在所有上述情况下,异常分数 的值都小于 0.0。尝试一个新的动作,这个动作不是原始数据集的一部分,例如,“滚动” Nicla,摄像头朝下面对,就像一个从船上掉下来的容器或甚至是一次船只事故:

  • 异常检测

在这种情况下,异常值要大得多,超过 1.00

后处理

既然我们知道模型正在工作,因为它检测到了动作,我们建议你修改代码,以查看 NiclaV 完全离线(从 PC 断开连接并由电池、移动电源或独立的 5 V 电源供电)的结果。

策略是和 KWS 项目做同样的事情:如果检测到特定的动作,特定的 LED 就会亮起。例如,如果检测到 陆地,绿色 LED 会亮起;如果 海洋,红色 LED 会亮起;如果是 提升,蓝色 LED 会亮起;如果没有检测到动作 (空闲),LED 将会关闭。你还可以添加一个条件,当检测到异常时,例如,可以使用白色(所有 LED 同时亮起)。

摘要

在这个动手教程中使用的笔记本和代码可以在 GitHub 仓库中找到。

在我们结束之前,考虑一下,运动分类和目标检测可以在各个领域的许多应用中被利用。以下是一些潜在的应用:

应用案例

工业和制造

  • 预测性维护:在故障发生之前检测机械运动的异常。

  • 质量控制:监控装配线或机械臂的运动,以进行精度评估和检测与标准运动模式的偏差。

  • 仓储物流:通过分类不同类型的运动并检测处理过程中的异常,使用自动化系统管理和跟踪货物的移动。

医疗保健

  • 患者监控:检测老年人或有行动障碍的人的跌倒或异常运动。

  • 康复:通过分类物理治疗期间的运动模式来监控受伤患者恢复的进展。

  • 活动识别:为健身应用或患者监控分类身体活动类型。

消费电子产品

  • 手势控制:通过特定动作来控制设备,例如用手势开关灯。

  • 游戏:通过动作控制输入增强游戏体验。

交通运输与物流

  • 车辆远程信息处理:监控车辆运动,以检测异常行为,如急刹车、急转弯或事故。

  • 货物监控:通过检测可能表明篡改或不当处理的异常运动来确保运输过程中货物的完整性。

智慧城市与基础设施

  • 结构健康监控:检测结构内部的振动或运动,这些可能表明潜在的故障或维护需求。

  • 交通管理:分析行人或车辆流量,以改善城市移动性和安全性。

安全与监控

  • 入侵检测:检测典型的不授权访问或其他安全违规行为的运动模式。

  • 野生动物监控:在保护区检测偷猎者或异常动物活动。

农业

  • 设备监控:跟踪农业机械的性能和利用率。

  • 动物行为分析:监控牲畜运动,以检测表明健康问题或压力的行为。

环境监测

  • 地震活动:检测地震或其他地质相关事件之前的不规则运动模式。

  • 海洋学:研究波浪模式或海洋运动,用于研究和安全目的。

Nicla 3D 外壳

对于实际应用,正如之前所描述的,我们可以在我们的设备上添加一个外壳,来自 Edge Impulse 的 Eoin Jordan 为 Nicla 系列板开发了出色的可穿戴和机器健康外壳。它使用 10mm 磁铁、2M 螺丝和 16mm 带子,适用于人和机器健康用例场景。以下是链接:Arduino Nicla 语音和视觉可穿戴外壳

图片

运动分类和异常检测的应用非常广泛,Arduino Nicla Vision 非常适合低功耗和边缘处理的场景。其小巧的尺寸和高效的处理能力使其成为部署便携式和远程应用的理想选择,在这些应用中,实时处理至关重要,而连接性可能有限。

资源

概述

这些实验室提供了获得机器学习(ML)系统实际操作经验的独特机会。与需要数据中心规模资源的的大型模型工作不同,这些练习使您能够直接使用 TinyML 与硬件和软件进行交互。这种动手方法提供了对部署 AI 挑战和机会的切实理解,尽管是在小规模上。然而,原则在很大程度上与您在处理更大系统时遇到的原则相同。

前提条件

  • XIAOML 套件

    • XIAO ESP32S3 Sense

    • 扩展板,带有 6 轴 IMU 和 0.42 英寸 OLED 显示屏。

    • SD 卡工具包

      • SD 卡和 USB 适配器用于数据存储

      • 用于将板子连接到您的电脑的 USB-C 线缆。

  • 网络:提供互联网访问以下载必要的软件。

设置

  • 设置 XIAOML 套件

练习

模态 任务 描述 链接
视觉 图像分类 学习对图像进行分类 链接
视觉 目标检测 实现目标检测 链接
声音 关键词检测 探索语音识别系统 链接
IMU 运动分类和异常检测 对运动数据进行分类并检测异常 链接

设置

DALL·E 提示 - 1950 年代卡通风格的 XIAO ESP32S3 板绘制,具有独特的摄像头模块,如图所示。板子放置在经典的实验室桌子上,周围有各种传感器,包括麦克风。板子后面,一台复古电脑屏幕以柔和的颜色显示 Arduino IDE,代码专注于 LED 引脚设置和语音命令的机器学习推理。IDE 上的串行监视器展示了检测到语音命令“是”和“否”的输出。这个场景将中世纪实验室的复古魅力与现代电子技术相结合

概述

XIAOML 套件旨在提供 TinyML 应用程序的实际操作体验。套件包括强大的 XIAO ESP32S3 感应器开发板和一个扩展板,该扩展板为机器学习项目添加了必要的传感器。

完整的 XIAOML 套件组件:

  • XIAO ESP32S3 感应器: 主开发板,集成了摄像头传感器、数字麦克风和 SD 卡支持

  • 扩展板: 具有六轴 IMU (LSM6DS3TR-C) 和 0.42” OLED 显示屏,用于运动感应和数据可视化

  • SD 卡工具包: 包括 SD 卡和 USB 适配器,用于数据存储和模型部署

  • USB-C 线缆: 用于将板子连接到您的电脑

  • 天线和散热片

⚠️ 注意

不要安装(或小心地移除)XIAO ESP32S3 上的散热片,如果您想使用 XIAO ML 套件扩展板。更多信息请见附录。

XIAO ESP32S3 感应器 - 核心板特性

XIAO ESP32S3 感应器作为 XIAOML 套件的核心,将嵌入式 ML 计算能力与摄影和音频功能相结合,使其成为智能语音和视觉 AI 中 TinyML 应用的理想平台。

主要特性

  • 强大的 MCU: ESP32S3 32 位,双核,Xtensa 处理器,最高运行频率 240 MHz,支持 Arduino / MicroPython

  • 高级功能: 可拆卸的 OV2640 摄像头传感器,分辨率为 1600 × 1200,兼容 OV5640 摄像头传感器,还集成了数字麦克风

  • 详尽的电源设计: 锂电池充电管理,具有四种功耗模式,深度睡眠模式功耗低至 14 μA

  • 大容量内存: 8 MB PSRAM 和 8 MB FLASH,支持 SD 卡槽,用于外部 32 GB FAT 内存

  • 卓越的射频性能: 2.4 GHz Wi-Fi 和 BLE 双无线通信,支持使用 U.FL 天线进行 100m+ 的远程通信

  • 紧凑设计: 21 × 17.5 mm,采用经典的 XIAO 形状,适合空间受限的项目

以下是通用板子引脚图:

如需更多详细信息,请参阅 Seeed Studio 维基页面

扩展板功能

扩展板扩展了 XIAOML Kit 在基于运动机器学习应用方面的功能:

组件

  • 6 轴 IMU(LSM6DS3TR-C):

    • 3 轴加速度计和 3 轴陀螺仪用于运动检测和分类

      • 加速度计量程:±2/±4/±8/±16 g

      • 陀螺仪量程:±125/±250/±500/±1000/±2000 dps

      • I2C 接口(地址:0x6A)

  • 0.42” OLED 显示屏

    • 单色显示屏(72×40 分辨率)用于实时数据可视化

      • 控制器:SSD1306

      • I2C 接口(地址:0x3C)

  • 重启按钮(EN)

  • 电池连接器(BAT+,BAT-)

完整套件组装

扩展板与 XIAO ESP32S3 Sense 无缝连接,形成一个涵盖视觉、音频和运动传感的多模态机器学习实验的综合平台。

请注意模块的安装方向:

注意:

  • ESP32S3 Sense 底部显示的 EN 连接,通过 RST 按钮在扩展板上可用。

  • BAT+BAT- 连接也通过 BAT3.7V 白色连接器提供。

XIAOML Kit 应用

  • 视觉:使用集成摄像头进行图像分类和目标检测

  • 音频:使用内置麦克风进行关键词检测和语音识别

  • 运动:使用 IMU 传感器进行活动识别和异常检测

  • 多模态:用于复杂机器学习应用的组合传感器融合

在 Arduino IDE 上安装 XIAO ESP32S3 Sense

  1. 通过 USB-C 端口将 XIAOML Kit 连接到您的计算机。

  2. 根据您的操作系统下载并安装 Arduino IDE 的稳定版本。

    [下载 Arduino IDE]

  3. 打开 Arduino IDE 并选择板管理器(由 UNO Icon 表示)。

  4. 输入 “ESP32”,选择 “esp32 by Espressif Systems。” 您可以 安装更新 板支持包。

不要选择 “Arduino ESP32 Boards by Arduino”,这些是 Arduino Nano ESP32 的支持包,而不是我们的板。

⚠️ 注意

当使用 XIAO ESP32S3 Sense 与 Edge Impulse 部署代码时,3.x 版本可能会遇到问题。如果是这种情况,请使用最后的 2.0.x 稳定版本(例如,2.0.17)。

  1. 点击 Select Board,输入 xiaoesp32s3,在板管理器中选择 XIAO_ESP32S3 以及 ESP32S3 连接的相应端口。

就这些了!设备应该没问题。让我们进行一些测试。

XIAO ESP32S3 Sense 配备了一个内置 LED,连接到 GPIO21。因此,您可以运行闪烁草图(可以在 Files/Examples/Basics/Blink 下找到。该草图使用 LED_BUILTIN Arduino 常量,它内部对应于连接到引脚 21 的 LED。或者,您可以根据需要更改闪烁草图。)

#define LED_BUILT_IN 21  // This line is optional

void setup() {
  pinMode(LED_BUILT_IN, OUTPUT); // Set the pin as output
}

// Remember that the pins work with inverted logic
// LOW to turn on and HIGH to turn off
void loop() {
  digitalWrite(LED_BUILT_IN, LOW); //Turn on
  delay (1000); //Wait 1 sec
  digitalWrite(LED_BUILT_IN, HIGH); //Turn off
  delay (1000); //Wait 1 sec
}

注意,引脚使用的是反相逻辑:低电平打开,高电平关闭。

麦克风测试

让我们从声音检测开始。使用以下代码或转到GitHub 项目下载草图:XIAOML_Kit_Mic_Test并在 Arduino IDE 上运行它:

/*
 XIAO ESP32S3 Simple Mic Test
 (for ESP32 Library version 3.0.x and later)
*/

#include <ESP_I2S.h>
I2SClass I2S;

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    }

  // setup 42 PDM clock and 41 PDM data pins
  I2S.setPinsPdmRx(42, 41);

  // start I2S at 16 kHz with 16-bits per sample
  if (!I2S.begin(I2S_MODE_PDM_RX,
                 16000,
                 I2S_DATA_BIT_WIDTH_16BIT,
                 I2S_SLOT_MODE_MONO)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }
}

void loop() {
  // read a sample
  int sample = I2S.read();

  if (sample && sample != -1 && sample != 1) {
    Serial.println(sample);
  }
}

打开串行绘图器,您将看到声音的响度变化曲线。

当产生声音时,您可以在串行绘图器中验证它。

将录制的声音(.wav 音频文件)保存到 microSD 卡中。

现在,使用板载 SD 卡读卡器,我们可以保存.wav 音频文件。为此,我们首先需要启用 XIAO PSRAM。

ESP32-S3 在 MCU 芯片上只有几百千字节的内置 RAM。这可能在某些用途上不足,因此可以通过 SPI 闪存芯片连接高达 16MB 的外部 PSRAM(伪静态 RAM)(XIAO 有 8MB 的 PSRAM)。外部内存包含在内存映射中,并在某些限制下可以像内部数据 RAM 一样使用。

  • 要打开它,请转到工具->PSRAM:"OPI PSRAM"->OPI PSRAM

XIAO ESP32S3 Sense 支持高达32GB的 microSD 卡。如果您准备为 XIAO 购买 microSD 卡,请参考以下规格。在使用之前,将 microSD 卡格式化为FAT32 格式

现在,将格式化为 FAT32 的 SD 卡插入 XIAO,如图下所示

/*
 * WAV Recorder for Seeed XIAO ESP32S3 Sense
 * (for ESP32 Library version 3.0.x and later)
*/

#include "ESP_I2S.h"
#include "FS.h"
#include "SD.h"

void setup() {
  // Create an instance of the I2SClass
  I2SClass i2s;

  // Create variables to store the audio data
  uint8_t *wav_buffer;
  size_t wav_size;

  // Initialize the serial port
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  Serial.println("Initializing I2S bus...");

  // Set up the pins used for audio input
  i2s.setPinsPdmRx(42, 41);

  // start I2S at 16 kHz with 16-bits per sample
  if (!i2s.begin(I2S_MODE_PDM_RX,
                 16000,
                 I2S_DATA_BIT_WIDTH_16BIT,
                 I2S_SLOT_MODE_MONO)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }

  Serial.println("I2S bus initialized.");
  Serial.println("Initializing SD card...");

  // Set up the pins used for SD card access
  if(!SD.begin(21)){
    Serial.println("Failed to mount SD Card!");
    while (1) ;
  }
  Serial.println("SD card initialized.");
  Serial.println("Recording 20 seconds of audio data...");

  // Record 20 seconds of audio data
  wav_buffer = i2s.recordWAV(20, &wav_size);

  // Create a file on the SD card
  File file = SD.open("/arduinor_rec.wav", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing!");
    return;
  }

  Serial.println("Writing audio data to file...");

  // Write the audio data to the file
  if (file.write(wav_buffer, wav_size) != wav_size) {
    Serial.println("Failed to write audio data to file!");
    return;
  }

  // Close the file
  file.close();

  Serial.println("Application complete.");
}

void loop() {
  delay(1000);
  Serial.printf(".");
}
  • 将代码保存为例如Wav_Record.ino,并在 Arduino IDE 中运行它。

  • 此程序在用户打开串行监视器(或按下RESET按钮)后仅执行一次。它记录 20 秒,并将录音文件保存到 microSD 卡上的“arduino_rec.wav”。

  • 当串行监视器每秒输出“.”时,程序执行完成,您可以使用卡读卡器播放录制的声音文件。

音质极佳!

代码如何工作的解释超出了本实验的范围,但您可以在wiki页面上找到出色的描述。

要了解更多关于 XIAO ESP32S3 Sense 文件系统的信息,请参阅此链接

测试相机

对于测试(以及使用相机,我们可以使用几种方法:

  • SenseCraft AI Studio

  • Arduino IDE 上的 CameraWebServer 应用程序(参见下一节)

  • 捕获图像并将它们保存到 SD 卡上(类似于我们处理音频的方式)

使用 SenseCraft AI Studio 测试相机

查看摄像头工作的最简单方法是使用SenseCraft AI Studio,这是一个强大的平台,提供各种与各种设备兼容的 AI 模型,包括XIAO ESP32S3 Sense和 Grove 视觉 AI V2。

我们还可以使用SenseCraft Web Toolkit,这是 SenseCraft AI Studio 的简化版本。

按照以下步骤开始使用SenseCraft AI

图片

  • 将 XIAOML 套件物理连接到笔记本电脑,如下选择:

图片

注意:WebUSB 工具在某些浏览器中可能无法正常工作,例如 Safari。请使用 Chrome。同时,请确认 Arduino IDE 或任何其他串行设备没有连接到 XIAO。

要查看摄像头是否工作,我们应该上传一个模型。我们可以尝试 Seeed Studio 之前上传的几个计算机视觉模型。使用按钮“[选择模型]”并从可用模型中选择。

图片

将鼠标悬停在 AI 模型上,我们可以了解一些关于它们的信息,例如名称、描述、类别任务(图像分类、目标检测或姿态/关键点检测)、算法(如 YOLO V5 或 V8、FOMO、MobileNet V2 等)以及在某些情况下,指标(准确度或 mAP)。

图片

我们可以通过点击它并按下[确认]按钮选择一个现成的 AI 模型,例如“人员分类”,或者上传我们自己的模型。

图片

预览区域,我们可以看到摄像头生成的流。

图片

我们将在视觉 AI 实验室中更详细地介绍 SenseCraft AI Studio。

测试 WiFi

天线安装

XIAOML 套件已完全组装。首先,将包含摄像头、麦克风和 SD 卡读卡器的 Sense 扩展板从 XIAO 上取下。

在 XIAO ESP32S3 正面左下角有一个独立的“WiFi/BT 天线连接器”。为了提高你的 WiFi/蓝牙信号,请从包装中取出天线并将其连接到连接器。

安装天线有一个小技巧。如果你直接用力按下它,你会发现很难按下,手指会感到疼痛!正确安装天线的方法是先将天线连接器的一侧插入连接块,然后轻轻按下另一侧,以确保天线牢固安装。

取下天线也是如此。不要用力直接拉天线;相反,用力拉起一侧,使天线容易取下。

图片

重新安装扩展板非常简单;你只需要将扩展板上的连接器与 XIAO ESP32S3 上的 B2B 连接器对齐,用力按下,听到“咔哒”声。安装完成。

XIAO ESP32S3 的一个特点是它的 Wi-Fi 功能。因此,让我们通过扫描其周围的 Wi-Fi 网络来测试其无线电。你可以通过在板上运行代码示例之一来完成此操作。

打开 Arduino IDE 并选择我们的板和端口。转到 Examples,在“XIAO ESP32S3 的示例”下查找 WiFI ==> WiFIScan。将草图上传到板。

你应该在串行监视器中看到你设备范围内的 Wi-Fi 网络(SSID 和 RSSI)。以下是我实验室得到的结果:

图片

简单 Wi-Fi 服务器(打开/关闭 LED)

让我们测试设备作为 Wi-Fi 服务器的功能。我们将在设备上托管一个简单的页面,该页面发送命令来打开和关闭 XIAO 内置 LED。

前往 Examples,在“XIAO ESP32S3 的示例”下查找 WiFI ==> SimpleWiFIServer

在运行草图之前,你应该输入你的网络凭据:

const char* ssid     = "Your credentials here";
const char* password = "Your credentials here";

并且将 引脚 5 修改为 引脚 21,内置 LED 安装在这里。同时,让我们修改网页(第 85 和 86 行)以反映正确的 LED 引脚和它是通过低电平激活的:

client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 21 OFF.<br>");
client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 21 ON.<br>");

你可以使用串行监视器来监控你的服务器性能。

图片

将串行监视器中显示的 IP 地址输入到你的浏览器中。你将看到一个带有可以打开和关闭 XIAO 内置 LED 的链接的页面。

图片

使用 CameraWebServer

在 Arduino IDE 中,转到 文件 > 示例 > ESP32 > Camera,并选择 CameraWebServer

board_config.h 选项卡上,注释掉所有相机模型,除了 XIAO 模型引脚:

#define CAMERA_MODEL_XIAO_ESP32S3 // 有 PSRAM

不要忘记检查 工具 以查看是否启用了 PSRAM。

图片

如前所述,在 CameraWebServer.ino 选项卡中,输入你的 Wi-Fi 凭据并将代码上传到设备。

如果代码执行正确,你应该在串行监视器中看到地址:

WiFi connecting....
WiFi connected
Camera Ready! Use 'http://192.168.5.60' to connect

将地址复制到你的浏览器中,等待页面加载。选择相机分辨率(例如,QVGA)并选择 [START STREAM]。根据你的连接等待几秒钟。使用 [Save] 按钮,你可以将图像保存到你的电脑下载区。

图片

就这样!你可以直接将图像保存到你的电脑上用于项目。

测试 IMU 传感器(LSM6DS3TR-C)

惯性测量单元 (IMU) 是一种测量运动和方向的传感器。你 XIAOML 套件上的 LSM6DS3TR-C 是一个 6 轴 IMU,这意味着它结合了:

  • 三轴加速度计:测量沿 X、Y 和 Z 轴的线性加速度(包括重力)

  • 三轴陀螺仪:测量围绕 X、Y 和 Z 轴的角速度(旋转速率)

技术规格:

  • 通信:地址 0x6A 的 I2C 接口

  • 加速度计范围: ±2/±4/±8/±16 g(我们默认使用±2g)

  • 陀螺仪范围: ±125/±250/±500/±1000/±2000 dps(我们默认使用±250 dps)

  • 分辨率: 16 位 ADC

  • 功耗: 超低功耗设计

坐标系:

传感器遵循右手坐标系。当从可见点标记的角度观察 IMU 传感器(扩展板底部视图)时:

  • X 轴: 指向右侧

  • Y 轴: 指向前方(远离你)

  • Z 轴: 指向上方(出板)

必需的库

在上传代码之前,安装所需的库:

  1. 打开Arduino IDE并选择管理库(由“书籍图标”表示)。

  2. 对于 IMU 库,输入“*LSM6DS3”并选择“Seeed Arduino LSM6DS3 by Seeed”。您可以“安装”或“更新”板支持包。

⚠️ 重要: 不要安装“Arduino_LSM6DS3 by Arduino” - 那是为不同板子准备的!

测试代码

在 Arduino IDE 中输入以下代码并上传到套件:

#include <LSM6DS3.h>
#include <Wire.h>

// Create IMU object using I2C interface
// LSM6DS3TR-C sensor is located at I2C address 0x6A
LSM6DS3 myIMU(I2C_MODE, 0x6A);

// Variables to store sensor readings
float accelX, accelY, accelZ;  // Accelerometer values (g-force)
float gyroX, gyroY, gyroZ;     // Gyroscope values (degrees per second)

void setup() {
  // Initialize serial communication at 115200 baud rate
  Serial.begin(115200);

  // Wait for serial port to connect (useful for debugging)
  while (!Serial) {
    delay(10);
  }

  Serial.println("XIAOML Kit IMU Test");
  Serial.println("LSM6DS3TR-C 6-Axis IMU Sensor");
  Serial.println("=============================");

  // Initialize the IMU sensor
  if (myIMU.begin() != 0) {
    Serial.println("ERROR: IMU initialization failed!");
    Serial.println("Check connections and I2C address");
    while(1) {
      delay(1000); // Halt execution if IMU fails to initialize
    }
  } else {
    Serial.println("✓ IMU initialized successfully");
    Serial.println();

    // Print sensor information
    Serial.println("Sensor Information:");
    Serial.println("- Accelerometer range: ±2g");
    Serial.println("- Gyroscope range: ±250 dps");
    Serial.println("- Communication: I2C at address 0x6A");
    Serial.println();

    // Print data format explanation
    Serial.println("Data Format:");
    Serial.println("AccelX,AccelY,AccelZ,GyroX,GyroY,GyroZ");
    Serial.println("Units: g-force (m/s²), degrees/second");
    Serial.println();

    delay(2000); // Brief pause before starting measurements
  }
}

void loop() {
  // Read accelerometer data (in g-force units)
  accelX = myIMU.readFloatAccelX();
  accelY = myIMU.readFloatAccelY();
  accelZ = myIMU.readFloatAccelZ();

  // Read gyroscope data (in degrees per second)
  gyroX = myIMU.readFloatGyroX();
  gyroY = myIMU.readFloatGyroY();
  gyroZ = myIMU.readFloatGyroZ();

  // Print readable format to Serial Monitor
  Serial.print("Accelerometer (g): ");
  Serial.print("X="); Serial.print(accelX, 3);
  Serial.print(" Y="); Serial.print(accelY, 3);
  Serial.print(" Z="); Serial.print(accelZ, 3);

  Serial.print(" | Gyroscope (°/s): ");
  Serial.print("X="); Serial.print(gyroX, 2);
  Serial.print(" Y="); Serial.print(gyroY, 2);
  Serial.print(" Z="); Serial.print(gyroZ, 2);
  Serial.println();

  // Print CSV format for Serial Plotter
  Serial.println(String(accelX) + "," + String(accelY) + "," +
                 String(accelZ) + "," + String(gyroX) + "," +
                 String(gyroY) + "," + String(gyroZ));

  // Update rate: 10 Hz (100ms delay)
  delay(100);
}

串行监视器将显示值,绘图仪将显示它们随时间的变化。例如,通过在Y 轴上移动套件,我们将看到值 2(红色线条)相应地变化。请注意,Z 轴由值 3(绿色线条)表示,接近 1.0g。蓝色线条(值 1)与X 轴相关。

您可以选择 4 到 6 的值来查看陀螺仪的行为。

测试 OLED 显示屏(SSD1306)

OLED(有机发光二极管)显示屏是自发光屏幕,每个像素都产生自己的光。XIAO ML 套件配备了一个紧凑的 0.42 英寸单色 OLED 显示屏,非常适合显示传感器数据、状态信息和简单图形。

技术规格:

  • 尺寸: 0.42 英寸对角线

  • 分辨率: 72 × 40 像素

  • 控制器: SSD1306

  • 接口: 地址0x3C的 I2C

  • 颜色: 单色(白色背景上的黑色像素,或反之)

  • 观看: 高对比度,在明亮的光线下可见

  • 电源: 低功耗,无需背光

显示特性:

  • 像素完美: 每个 2,880 个像素(72×40)都可以单独控制

  • 快速刷新: 适合动画和实时数据

  • 无拖影: 瞬时像素响应

  • 宽视角: 从多个观看位置清晰可见

必需的库

在上传代码之前,安装所需的库:

  1. 打开Arduino IDE并选择“管理库”(由“书籍图标”表示)。

  2. 输入u8g2并选择U8g2 by oliver。您可以“安装”或“更新”板支持包。

    ℹ️ 注意: U8g2 是一个强大的图形库,支持许多显示类型

U8g2库是一个单色图形库,具有以下特性:

  • 支持许多显示控制器(包括 SSD1306)

  • 使用各种字体进行文本渲染

  • 绘图原语(线条、矩形、圆形)

  • 内存高效的基于页面的渲染

  • 硬件和软件 I2C 支持

测试代码

使用以下代码在 Arduino IDE 中输入并上传到套件:

#include <U8g2lib.h>
#include <Wire.h>

// Initialize the OLED display
// SSD1306 controller, 72x40 resolution, I2C interface
U8G2_SSD1306_72X40_ER_1_HW_I2C u8g2(U8G2_R2, U8X8_PIN_NONE);

void setup() {
  Serial.begin(115200);

  Serial.println("XIAOML Kit - Hello World");
  Serial.println("==========================");

  // Initialize the display
  u8g2.begin();

  Serial.println("✓ Display initialized");
  Serial.println("Showing Hello World message...");

  // Clear the display
  u8g2.clearDisplay();
}

void loop() {
  // Start drawing sequence
  u8g2.firstPage();
  do {
    // Set font
    u8g2.setFont(u8g2_font_ncenB08_tr);

    // Display "Hello World" centered
    u8g2.setCursor(8, 15);
    u8g2.print("Hello");

    u8g2.setCursor(12, 30);
    u8g2.print("World!");

    // Add a simple decoration - draw a frame around the text
    u8g2.drawFrame(2, 2, 68, 36);

  } while (u8g2.nextPage());

  // No delay needed - the display will show continuously
}

如果一切正常,您应该在显示器上看到,“Hello World”在矩形内。

OLED - 文本大小和定位

  • 注意文本是通过setCursor(x, y)定位的,在这种情况下是居中的:

    u8g2.setCursor(8, 15);
    
  • 代码中使用的字体是中等的。

    u8g2.setFont(u8g2_font_ncenB08_tr);
    

    但其他字体大小也是可用的:

    • u8g2_font_4x6_tr: 小字体(4×6 像素)

    • u8g2_font_6x10_tr: 小字体(6×10 像素)

    • u8g2_font_ncenB08_tr: 中等粗体字体

    • u8g2_font_ncenB14_tr: 大号粗体字体

形状

代码添加了一个简单的装饰,在文本周围绘制一个框架

u8g2.drawFrame(2, 2, 68, 36);

但其他形状也是可用的:

  • 矩形轮廓drawFrame(x, y, width, height)

  • 填充矩形drawBox(x, y, width, height)

  • 圆形drawCircle(x, y, radius)

  • 线条drawLine(x1, y1, x2, y2)

  • 单个像素drawPixel(x, y)

坐标

显示器使用一个坐标系,其中:

  • 原点(0,0):左上角

  • X 轴:从左到右增加(0 到 71)

  • Y 轴:从上到下增加(0 到 39)

  • 文本定位setCursor(x, y)其中 y 是文本的基线

显示器旋转

  • 您可以通过使用以下方式更改旋转参数:

    • U8G2_R0: 正常方向

    • U8G2_R1: 顺时针 90°

    • U8G2_R2: 180°(颠倒)

    • U8G2_R3: 顺时针 270°

自定义字符:

// Draw custom bitmap
static const unsigned char myBitmap[] = {0x00, 0x3c, 0x42, 0x42, 0x3c, 0x00};
u8g2.drawBitmap(x, y, 1, 6, myBitmap);

文本测量:

int width = u8g2.getStrWidth("Hello");  // Get text width
int height = u8g2.getAscent();         // Get font height

现在 OLED 显示器已准备好显示您的传感器数据、系统状态或为您的机器学习项目设计的任何自定义图形!

摘要

带有 ESP32S3 Sense 的 XIAOML 套件代表了进入 TinyML 和嵌入式机器学习世界的一个强大且易于访问的起点。通过这个设置过程,我们已经系统地测试了 XIAOML 套件的每个组件,确认所有传感器和外设都正常工作。ESP32S3 的双核处理器和 8MB 的 PSRAM 提供了足够的计算能力进行实时机器学习推理,而 OV2640 摄像头、数字麦克风、LSM6DS3TR-C IMU 和 0.42” OLED 显示器创建了一个完整的多模态传感平台。WiFi 连接为边缘到云的机器学习工作流程提供了可能性,我们的 Arduino IDE 开发环境现在已正确配置了所有必要的库。

除了功能测试之外,我们还对每个传感器的坐标系、数据格式和操作特性有了实际的认识——这些知识在设计即将到来的项目中的机器学习数据收集和预处理管道时将非常有价值。

此设置过程展示了远超这个特定套件的关键原则。在 ESP32S3 的内存限制和处理器能力下工作,提供了在边缘 AI 中固有的资源限制的真实体验——这与在智能手机、物联网设备或自主系统中部署模型时面临的考虑相同。在单个平台上拥有多种模式(视觉、音频、运动)使得可以探索多模态机器学习方法,这在现实世界的 AI 应用中越来越重要。

最重要的是,从原始传感器数据到模型推理,再到通过 OLED 显示屏的用户反馈,该套件提供了一个完整的微型 ML 部署周期,反映了生产 AI 系统面临的挑战。

在这个基础已经建立之后,你现在可以应对以下章节中核心 TinyML 应用的核心挑战:

  • 视觉项目:利用摄像头进行图像分类和目标检测

  • 音频项目:处理音频流以进行关键词检测和语音识别

  • 运动项目:使用 IMU 数据用于活动识别和异常检测

每个应用都将建立在我们所建立的硬件理解和软件基础设施之上,展示了人工智能不仅可以在数据中心部署,还可以在直接与物理世界交互的资源受限设备上部署。

在这个套件中遇到的原则——实时处理、传感器融合和边缘推理——是推动自动驾驶汽车、智能城市、医疗设备和工业自动化中 AI 部署未来的相同原则。通过成功完成此设置,你现在准备好探索嵌入式机器学习的这个激动人心的前沿领域。

资源

附录

散热片注意事项

如果您需要在没有扩展板的情况下使用 XIAO ESP32S3 Sense 进行相机应用,您可以安装散热片。

注意,如果安装了散热片,则无法将 XIAO ESP32S3 Sense 与扩展板连接。

图片

安装散热片

为了确保 XIAO ESP32S3 Sense 的最佳散热,您应在相机应用期间安装提供的散热片。其设计专门针对散热需求,尤其是在相机使用等密集操作期间。

套件中包含两个散热片,但您只能使用一个以确保能够访问电池引脚。

安装:

  • 在您开始之前,请确保您的设备已关闭电源并从任何电源插座上拔下。

  • 优先覆盖热垫,因为散热片直接位于 ESP32S3 芯片上方,这是热量产生的主要来源。正确的对齐确保了最佳的热量散发,并且保持 BAT 引脚尽可能无阻碍是至关重要的

现在,让我们开始安装过程:

步骤 1. 准备散热片: 首先,从散热片上移除保护盖,露出热粘合剂。这将使散热片准备好安全地附着到 ESP32S3 芯片上。

步骤 2. 组装散热片:

图片

安装后,请确保所有部件都已正确固定,没有短路的风险。请核实散热片是否正确对齐并牢固固定。

如果一个散热片不够,可以安装第二个,共享热垫,但在此情况下,请注意所有引脚都将不可用。

⚠️ 注意

在再次使用 IMU 扩展板之前,请小心移除散热片。

图像分类

DALL·E 提示 - 基于 Marcelo Rovai 的真实图像的 1950 年代风格卡通插图

概述

我们正日益面临一场人工智能(AI)革命,正如 Gartner 所述,边缘 AI 和计算机视觉具有非常高的影响潜力,而且目前确实是如此

当我们研究应用于视觉的机器学习(ML)时,首先遇到的概念是图像分类,这是一种 ML 的“Hello World”,既简单又深刻!

Seeed Studio XIAOML Kit 提供了一套以XIAO ESP32-S3 Sense为中心的全面硬件解决方案,集成了OV3660摄像头和 SD 卡支持。这些特性使 XIAO ESP32S3 Sense 成为探索 TinyML 视觉 AI 的绝佳起点。

在这个实验室中,我们将使用非代码工具SenseCraft AI探索图像分类,并使用Edge Impulse StudioArduino IDE进行更详细的发展。

学习目标

  • 使用 SenseCraft AI Studio 部署预训练模型,以实现即时的计算机视觉应用

  • 收集和管理图像数据集,以适当的组织方式执行自定义分类任务

  • 使用 MobileNet V2 架构通过迁移学习训练自定义图像分类模型

  • 通过量化内存高效的预处理优化模型,以适应边缘部署

  • 实现后处理管道,包括 GPIO 控制和实时推理集成

  • 比较无代码和高级 ML 平台在嵌入式应用中的开发方法

图像分类

图像分类是计算机视觉中的一个基本任务,涉及将整个图像分类到几个预定义类别之一。这个过程包括分析图像的视觉内容,并根据它所描绘的主要对象或场景,从一组固定的类别中分配一个标签。

图像分类在各种应用中至关重要,从组织和搜索数字图书馆和社交媒体平台中的大型图像数据库,到使自主系统理解其周围环境。在显著推进图像分类领域的常见架构包括卷积神经网络(CNNs),如 AlexNet、VGGNet 和 ResNet。这些模型通过学习视觉数据分层表示,在诸如 ImageNet 这样的挑战性数据集上展示了显著的准确性。

作为许多计算机视觉系统的基石,图像分类推动了创新,为更复杂任务如目标检测和图像分割奠定了基础,并促进了跨各个行业对视觉数据的更深入理解。因此,让我们开始探索 人物分类 模型(“人物 - 非人物”),这是一个在 SenseCraft AI 上可用的现成计算机视觉应用。

图片

在 SenseCraft AI 工作空间中进行图像分类

首先,通过 USB-C 将 XIAOML Kit(或仅将 XIAO ESP32S3 Sense 从扩展板断开)连接到电脑,然后打开 SenseCraft AI 工作空间 以连接它。

图片

连接后,选择 [选择模型...] 选项,并在搜索窗口中输入:“人物分类”。从可用选项中选择在 MobileNet V2 上训练的模型(将鼠标移过模型将打开一个弹出窗口,显示其主要特性)。

图片

点击选定的模型并确认部署。模型的新固件应开始上传到我们的设备。

注意,将显示已下载的模型百分比和上传的固件。如果没有显示,请尝试断开设备,然后重新连接并按启动按钮。

模型成功上传后,我们可以在预览区域查看 XIAO 摄像头的实时视频流和分类结果(人物非人物),以及 设备日志 中显示的推理细节。

注意,我们还可以选择我们的 推理帧间隔,从“实时”(默认)到 10 秒,以及 模式(UART、I2C 等),因为设备通过这些方式共享数据(默认是通过 USB 的 UART)。

图片

在设备日志中,我们可以看到模型的前处理延迟为 52 到 78 毫秒,推理大约为 532ms,这将给我们总时间略小于 600ms,即大约 每秒 1.7 帧 (FPS)

运行 Mobilenet V2 0.35 时,XIAO 的峰值电流为 160mA,在 5.23V 下,导致 功耗为 830mW

后处理

在图像分类项目管道中,一个重要的步骤是定义我们想要对推理结果做什么。所以,想象一下,我们将使用 XIAO 在检测到人物时自动打开房间灯光。

图片

使用 SebseCraft AI,我们可以在 输出 -> GPIO 部分完成这项工作。当满足事件条件时,点击添加图标以触发动作。将打开一个弹出窗口,您可以在其中定义要采取的动作。例如,如果检测到置信度超过 60% 的人,内部 LED 应该打开。在实际场景中,可以使用 GPIO,例如 D0D1D2D11D12 来触发继电器打开灯光。

确认后,创建的 触发动作 将会显示。按下 发送 按钮将命令上传到 XIAO。

现在,将 XIAO 对准一个人,内部 LED 将会打开。

在本实验中,我们将进一步探索更多的触发动作和后处理技术。

图像分类项目

让我们创建一个简单的图像分类项目,使用 SenseCraft AI Studio。下面,我们可以看到一个典型的机器学习流程,它将在我们的项目中使用。

在 SenseCraft AI Studio 上:让我们打开 [训练](https://sensecraft.seeed.cc/ai/training) 选项卡:

默认情况下,如果有网络摄像头,将训练一个 分类 模型。让我们选择 XIAOESP32S3 Sense。按下绿色按钮 [连接] 将会弹出一个窗口。选择相应的端口并按下蓝色按钮 [连接]

从 Grove Vision AI V2 流出的图像将会显示。

目标

第一步,正如我们在机器学习流程中看到的那样,是定义一个目标。让我们想象我们有一个工业安装,它应该能够自动分类轮子和箱子。

因此,让我们模拟它,例如,对玩具 箱子 和玩具 轮子 进行分类。我们还应该包括一个第三类图像,背景,其中场景中没有对象。

数据收集

让我们创建类别,例如按照字母顺序:

  • 第一类:背景

  • 第二类:箱子

  • 第三类:轮子

选择一个类别,并在预览区域下方的绿色按钮(按住以记录)上持续按下。收集到的图像(及其计数)将出现在图像样本屏幕上。仔细且缓慢地移动相机以捕捉物体的不同角度。要修改位置或干扰图像,释放绿色按钮,重新排列物体,然后再次按住以继续捕获。

收集图像后,检查它们并删除任何错误的图像。

每个类别收集大约 50 张图像 并进入训练步骤。

注意,可以将收集到的图像下载到其他应用程序中使用,例如 Edge Impulse Studio。

训练

确认是否已选择正确的设备(XIAO ESP32S3 Sense)并按下 [开始训练]

测试

训练完成后,可以预览推理结果。

注意,模型并未在设备上运行。实际上,我们只是在设备上捕获图像,并使用在 Studio 中运行的训练模型进行实时预览

现在是真正将模型部署到设备上的时候了。

部署

在“支持设备”窗口中选择已训练的模型和XIAO ESP32S3 Sense。然后点击 [部署到设备]

SenseCraft AI 将带我们到视觉工作区选项卡。确认部署,选择端口,并连接

模型将被烧录到设备中。自动重置后,模型将在设备上开始运行。在设备日志中,我们可以看到推理的延迟约为 426 毫秒,加上预处理大约 110 毫秒,对应于每秒 1.8 帧(FPS)

此外,请注意,在设置中,可以调整模型的置信度。

要运行图像分类模型,XIAO ESP32S3 在 5.23V 下的峰值电流为 14mA,导致功耗为 730mW

如前所述,在输出 –> GPIO中,我们可以根据检测到的类别打开 GPIO 或内部 LED。例如,当检测到轮子时,LED 将打开。

保存模型

可以在 SenseCraft AI Studio 中保存模型。工作室将保留我们所有的模型以供以后部署。为此,返回到“训练”选项卡并选择按钮 [保存到 SenseCraft]:

按照说明输入模型的名称、描述、图像和其他详细信息。

注意,训练好的模型(一个大小为 320KB 的 Int8 MobileNet V2)可以下载以供进一步使用或分析,例如使用Netron。注意,该模型使用大小为 224x224x3 的图像作为其输入张量。在下一步中,我们将在 Edge Impulse Studio 上使用不同的超参数。

此外,模型可以随时再次部署到设备上。自动地,工作区将在 SenseCraft AI 上打开。

从数据集开始的图像分类项目

我们项目的首要目标是训练一个模型并在 XIAO ESP32S3 Sense 上执行推理。为了训练,我们需要找到一些数据 (实际上,是大量的数据!)

但我们已经知道,首先,我们需要一个目标!我们想要分类什么?

使用 TinyML,由于限制(主要是内存),我们应该将分类限制在三个或四个类别。例如,我们可以训练 SenseCraft AI Studio 中下载的 Box 与 Wheel 捕获的图像。

或者,我们可以使用一个全新的数据集,例如区分苹果、香蕉和土豆或其他类别的数据集。如果可能的话,尝试找到一个包含这些类别图像的特定数据集。Kaggle 水果和蔬菜图像识别是一个不错的起点。

让我们下载上一节中捕获的数据集。在每个捕获的类别上打开菜单(3 个点),然后选择“导出数据”。

数据集将以.ZIP 文件的形式下载到计算机上,每个类别一个文件。将它们保存在您的工作文件夹中,并解压缩它们。您应该有三个文件夹,每个文件夹对应一个类别。

可选地,您可以使用例如设置实验室中讨论的代码添加一些新的图片。

使用 Edge Impulse Studio 训练模型

我们将使用 Edge Impulse Studio 来训练我们的模型。Edge Impulse是边缘设备上机器学习的主要开发平台。

在 Edge Impulse 输入您的账户凭证(或创建一个免费账户)。接下来,创建一个新的项目:

数据获取

接下来,转到数据获取部分,在那里选择+ 添加数据。将弹出一个弹出窗口。选择上传数据

选择后,将弹出一个新的弹出窗口,要求更新数据。

  • 在上传模式中:选择一个文件夹并按 [选择文件]

  • 前往包含一个类别的文件夹,并按 [上传]

  • 您将自动返回到上传数据窗口。

  • 选择“自动在训练和测试之间分割”。

  • 在文件夹中输入图片的标签。

  • 选择 [上传数据]

  • 在这一点上,文件将开始上传,之后,将出现另一个弹出窗口询问您是否在构建一个目标检测项目。选择 [no]

对所有类别重复此过程。不要忘记更改标签的名称。如果您忘记了,并且图像已上传,请注意它们将在工作室中混合。不要担心,您可以在之后手动在类别之间移动数据。

关闭上传数据窗口,返回到数据获取页面。我们可以看到所有数据集都已上传。注意,在上面的面板中,我们可以看到我们有 158 个条目,它们都是平衡的。此外,19%的图像被留作测试。

脉冲设计

一个脉冲会提取原始数据(在这种情况下,图像),提取特征(调整图片大小),然后使用学习块对新数据进行分类。

图像分类是深度学习最常见应用,但完成这项任务需要大量的数据。我们每个类别大约有 50 张图像。这个数量足够吗?根本不够!我们需要数千张图像来“教学”或“建模”每个类别,以便我们能够区分它们。然而,我们可以通过使用数千张图像重新训练先前训练的模型来解决这个问题。我们称这种技术为“迁移学习”(TL)。使用 TL,我们可以在我们的数据上微调预训练的图像分类模型,即使是在相对较小的图像数据集上也能取得良好的性能。

图片

使用 TL,我们可以在我们的数据上微调预训练的图像分类模型,即使是在相对较小的图像数据集(我们的案例)上也能表现出色。

因此,从原始图像开始,我们将它们调整大小为(96×96)(96\times 96)像素,并将它们输入到我们的迁移学习模块。让我们创建一个脉冲。

在这一点上,我们也可以定义我们的目标设备以监控我们的“预算”(内存和延迟)。XIAO ESP32S3 不是 Edge Impulse 的官方支持设备,因此让我们考虑 Espressif ESP-EYE,它相似但速度较慢。

图片

保存上述脉冲,然后转到图像部分。

预处理(特征生成)

除了调整图像大小外,我们还可以将它们转换为灰度或保留它们的原始 RGB 颜色深度。让我们在“图像”部分选择 [RGB]。这样做后,每个数据样本将具有 27,648 个特征维度(96x96x3)。按下 [Save Parameters] 将打开一个新标签页,Generate Features。按下 [Generate Features] 按钮以生成特征。

模型设计、训练和测试

在 2007 年,谷歌推出了MobileNetV1。在 2018 年,发布了MobileNetV2: Inverted Residuals and Linear Bottlenecks,然后在 2019 年推出了 V3。MobileNet 是一系列通用计算机视觉神经网络,专门为移动设备设计,以支持分类、检测和其他应用。MobileNets 是小型、低延迟、低功耗的模型,参数化以满足各种用例的资源限制。

尽管基础 MobileNet 架构已经非常紧凑且具有低延迟,但特定的用例或应用可能经常需要模型更小、更快。MobileNets 引入了一个简单的参数,α(alpha),称为宽度乘数,以构建这些更小、计算成本更低的模型。宽度乘数α的作用是在每一层均匀地瘦化网络。

Edge Impulse Studio 提供了 MobileNet V1(96x96 图像)和 V2(96x96 和 160x160 图像),以及几个不同的α值(从 0.05 到 1.0)。例如,使用 V2,160x160 图像,α=1.0 时,你将获得最高的准确率。当然,这里有一个权衡。准确率越高,运行模型所需的内存(大约 1.3M RAM 和 2.6M ROM)就越多,这意味着更大的延迟。在另一个极端,使用 MobileNet V1 和α=0.10 时,将获得更小的占用空间(大约 53.2K RAM 和 101K ROM)。

我们将使用MobileNet V2 0.35作为我们的基础模型(但也可以使用具有更大α值的模型)。我们的模型最终层,在输出层之前,将有 16 个神经元,并具有 10%的 dropout 率以防止过拟合。

与深度学习一起使用的另一个必要技术是数据增强。数据增强是一种可以通过创建额外的合成数据来帮助提高机器学习模型准确率的方法。数据增强系统在训练过程中对训练数据进行小的、随机的更改(例如翻转、裁剪或旋转图像)。

在幕后,你可以看到 Edge Impulse 是如何在数据上实现数据增强策略的:

# Implements the data augmentation policy
def augment_image(image, label):
    # Flips the image randomly
    image = tf.image.random_flip_left_right(image)

    # Increase the image size, then randomly crop it down to
    # the original dimensions
    resize_factor = random.uniform(1, 1.2)
    new_height = math.floor(resize_factor * INPUT_SHAPE[0])
    new_width = math.floor(resize_factor * INPUT_SHAPE[1])
    image = tf.image.resize_with_crop_or_pad(image, new_height,
                                             new_width)
    image = tf.image.random_crop(image, size=INPUT_SHAPE)

    # Vary the brightness of the image
    image = tf.image.random_brightness(image, max_delta=0.2)

    return image, label

现在,让我们定义超参数:

  • 迭代次数:20

  • 批处理大小:32

  • 学习率:0.0005

  • 验证大小:20%

因此,我们的训练结果如下:

模型配置文件预测233 KB 的 RAM 和 546 KB 的闪存,这表明 Xiao ESP32S3 没有问题,它有 8 MB 的 PSRAM。此外,工作室表明延迟约为 1160 ms,这非常高。然而,这是可以预料的,因为我们正在使用 ESP-EYE,其 CPU 是 Extensa LX6,而 ESP32S3 使用的是更新、更强大的 Xtensa LX7。

使用测试数据,我们甚至实现了 100%的准确率,即使是在量化 INT8 模型的情况下。这个结果在真实项目中并不典型,但我们的项目相对简单,只有两个彼此非常不同的对象。

模型部署

我们可以部署训练好的模型:

  • 作为.TFLITE用于SenseCraft AI

  • 作为Edge Impulse Studio中的Arduino 库

让我们从更简单、更直观的 SenseCraft 开始。

在 SenseCraft AI 上的模型部署

仪表板上,你可以以几种不同的格式下载训练好的模型。让我们下载TensorFlow Lite (int8 量化),其大小为 623KB。

SenseCraft AI Studio中,转到工作区标签,选择XIAO ESP32S3,相应的端口,并连接设备。

你应该能看到最后上传到设备上的模型。选择绿色按钮 [上传模型]。一个弹出窗口将提示你输入模型名称、模型文件和类名(对象)。我们应该使用按字母顺序排列的标签:0: background1: box,和2: wheel,然后按 [发送]

几秒钟后,模型将被上传(闪存)到我们的设备,相机图像将实时出现在 预览 区域。分类结果将在图像预览下方显示。您还可以使用 设置 中的光标选择推理的 置信度阈值

设备日志 中,我们可以查看串行监视器,其中可以观察到延迟,预处理大约为 81 毫秒,推理大约为 205 毫秒,对应于每秒 3.4 帧(FPS)的帧率,这是我们使用 SenseCraft 训练模型时得到的两倍,因为我们正在处理更小的图像(96x96 与 224x224)。

总延迟大约比在 Xtensa LX6 CPU 上 Edge Impulse Studio 中的估计快 4 倍;现在我们在 Xtensa LX7 CPU 上进行推理。

图片

后处理

可以获取模型推理的输出,包括延迟、类别 ID 和置信度,如 SenseCraft AI 的设备日志中所示。这使我们能够将 XIAO ESP32S3 感应器 作为 AI 传感器使用。换句话说,我们可以根据项目需求使用不同的通信协议,如 MQTT、UART、I2C 或 SPI 来检索模型数据。

这个想法与我们之前在 Seeed Grove Vision AI V2 图像分类后处理实验室 中所做的是类似的。

下面是使用 I2C 总线的连接示例。

请参阅 Seeed Studio Wiki 获取更多信息。

在 EI Studio 中将模型部署为 Arduino 库

在 Edge Impulse Studio 的 部署 部分选择 Arduino 库TensorFlow Lite量化(int8) 并按 [构建]。训练好的模型将以 .zip Arduino 库的形式下载:

图片

打开你的 Arduino IDE,在 草图 下,转到 包含库添加 .ZIP 库。然后,选择从 Edge Impulse Studio 下载的文件并按 [打开]

图片

前往 Arduino IDE 的 示例,根据其名称查找项目(在本例中为:“Box_versus_Whell_…Interfering”。打开 esp32 -> esp32_cameraesp32_camera.ino 草图将被下载到 IDE。

这个草图是为标准 ESP32 开发的,与 XIAO ESP32S3 感应器不兼容。需要进行修改。让我们从项目的 GitHub 下载修改后的版本:Image_class_XIAOML-Kit.ino

XIAO ESP32S3 图像分类代码解释

代码从板上摄像头捕获图像,处理它们,并使用 EI Studio 上的训练模型对它们进行分类(在这种情况下,“Box”,“Wheel”或“Background”)。它持续运行,在边缘设备上执行实时推理。

简而言之:

摄像头 → JPEG 图像 → RGB888 转换 → 调整大小到 96x96 → 神经网络 → 分类结果 → 串行输出

关键组件
  1. 库包含和依赖项
#include <Box_versus_Wheel_-_XIAO_ESP32S3_inferencing.h>
#include "edge-impulse-sdk/dsp/image/image.hpp"
#include "esp_camera.h"
  • Edge Impulse 推理库:包含我们的训练模型和推理引擎

  • 图像处理:提供图像操作功能

  • ESP Camera:摄像头模块的硬件接口

  1. 摄像头引脚配置

XIAO ESP32S3 Sense 可以与不同的摄像头传感器(OV2640 或 OV3660)一起工作,这些传感器可能具有不同的引脚配置。代码定义了三种可能的配置:

// Configuration 1: Most common OV2640 configuration
#define CONFIG_1_XCLK_GPIO_NUM 10
#define CONFIG_1_SIOD_GPIO_NUM 40
#define CONFIG_1_SIOC_GPIO_NUM 39
// ... more pins

这种灵活性允许代码在第一个引脚映射不工作的情况下自动尝试不同的引脚映射,使其在不同硬件版本上更具鲁棒性。

  1. 内存管理设置
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS 320
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS 240
#define EI_CLASSIFIER_ALLOCATION_HEAP 1
  • 帧缓冲区大小:定义原始图像大小(320x240 像素)

  • 堆分配:使用动态内存分配以提供灵活性

  • PSRAM 支持:ESP32S3 有 8MB 的 PSRAM 用于存储大型数据,如图像

setup() - 初始化
void setup() {
    Serial.begin(115200);
    while (!Serial);

    if (ei_camera_init() == false) {
        ei_printf("Failed to initialize Camera!\r\n");
    } else {
        ei_printf("Camera initialized\r\n");
    }

    ei_sleep(2000);  // Wait 2 seconds before starting
}

此函数:

  1. 初始化串行通信以进行调试输出

  2. 使用自动配置检测初始化摄像头

  3. 在开始连续推理前等待 2 秒

loop() - 主处理循环

循环持续执行以下步骤:

第 1 步:内存分配

snapshot_buf = (uint8_t*)ps_malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS *
                                   EI_CAMERA_RAW_FRAME_BUFFER_ROWS *
                                   EI_CAMERA_FRAME_BYTE_SIZE);

为图像缓冲区分配内存,优先使用 PSRAM(更快的外部 RAM),如果需要则回退到常规堆。

第 2 步:图像捕获

if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH,
                     (size_t)EI_CLASSIFIER_INPUT_HEIGHT,
                     snapshot_buf) == false) {
    ei_printf("Failed to capture image\r\n");
    free(snapshot_buf);
    return;
}

从摄像头捕获图像并将其存储在缓冲区中。

第 3 步:运行推理

ei_impulse_result_t result = { 0 };
EI_IMPULSE_ERROR err = run_classifier(&signal, &result, false);

在捕获的图像上运行机器学习模型。

第 4 步:输出结果

for (uint16_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
    ei_printf(" %s: %.5f\r\n",
              ei_classifier_inferencing_categories[i],
              result.classification[i].value);
}

打印分类结果,显示每个类别的置信度分数。

ei_camera_init() - 智能摄像头初始化

此函数实现了一个智能初始化序列:

bool ei_camera_init(void) {
    // Try Configuration 1 (OV2640 common)
    update_camera_config(1);
    esp_err_t err = esp_camera_init(&camera_config);
    if (err == ESP_OK) goto camera_init_success;

    // Try Configuration 2 (OV3660)
    esp_camera_deinit();
    update_camera_config(2);
    err = esp_camera_init(&camera_config);
    if (err == ESP_OK) goto camera_init_success;

    // Continue trying other configurations...
}

该函数:

  1. 尝试多种引脚配置

  2. 测试不同的时钟频率(10MHz 或 16MHz)

  3. 首先尝试 PSRAM,然后回退到 DRAM

  4. 根据检测到的硬件应用传感器特定设置

ei_camera_capture() - 图像处理管道
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
    // 1\. Get frame from camera
    camera_fb_t *fb = esp_camera_fb_get();

    // 2\. Convert JPEG to RGB888 format
    bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);

    // 3\. Return frame buffer to camera driver
    esp_camera_fb_return(fb);

    // 4\. Resize if needed
    if (do_resize) {
        ei::image::processing::crop_and_interpolate_rgb888(...);
    }
}

此函数:

  1. 从摄像头捕获 JPEG 图像

  2. 将其转换为 RGB888 格式(ML 模型所需)

  3. 将图像调整大小以匹配模型的输入大小(96x96 像素)

推理

  • 将代码上传到 XIAO ESP32S3 Sense。

⚠️ 注意

  • Xiao ESP32S3 必须启用 PSRAM。您可以在 Arduino IDE 的上级菜单中检查它:工具–> PSRAM:OPI PSRAM
  • Arduino 板包(esp32 by Espressif Systems)应为版本 2.017。请勿更新

  • 打开串行监视器

  • 将摄像头对准物体,并在串行监视器上检查结果。

后处理

在边缘人工智能应用中,推理结果的价值仅取决于我们对其采取行动的能力。虽然串行输出提供了详细的调试和开发信息,但现实世界的部署需要立即、人类可读的反馈,这种反馈不依赖于外部监视器或连接。

XIAOML Kit 0.42” OLED 显示屏(72×40 像素)作为关键的后处理组件,将原始机器学习推理结果转换为即时、人类可读的反馈——直接在设备上显示检测到的类别名称和置信度,消除了对外部监视器的需求,并使工业、农业或零售环境中的独立边缘人工智能部署成为可能,在这些环境中,对人工智能预测的即时视觉确认至关重要。

因此,让我们修改草图以自动适应在 Edge Impulse 上训练的模型,通过直接从模型中读取类别名称和计数。显示屏将显示缩写后的类别名称(3 个字母),字体较大,以便在小型 72x40 像素显示屏上获得更好的可见性。从 GitHub 下载代码:XIAOML-Kit-Img_Class_OLED_Gen

运行代码,我们可以看到结果:

图片

摘要

XIAO ESP32S3 Sense 是一个令人印象深刻的、灵活的平台,适用于图像分类应用。通过这个实验室,我们探索了两种不同的开发方法,以满足不同的技能水平和项目需求。

  • SenseCraft AI Studio 提供了一个易于访问的入口,其 无代码界面 允许快速原型设计和部署预训练模型,如人体检测。通过实时推理和集成后处理功能,它展示了如何在不进行大量编程或机器学习知识的情况下部署人工智能。

  • 对于更高级的应用,Edge Impulse Studio 提供了全面的机器学习管道工具,包括自定义数据集管理、与多个预训练模型(如 MobileNet)的迁移学习以及模型优化。

本实验室的关键见解包括图像分辨率权衡的重要性、迁移学习在小数据集上的有效性以及边缘人工智能部署的实际考虑,例如功耗和内存限制。

该实验室展示了超越特定硬件的 TinyML 基本原理:资源受限的推理、实时处理需求以及从数据收集到模型部署再到实际应用的完整流程。内置的后处理功能包括 GPIO 控制、通信协议等,XIAO 不仅是一个推理引擎,还成为了一个完整的 AI 传感器平台。

这个图像分类的基础知识将为你准备更复杂的计算机视觉任务,同时展示了现代边缘人工智能如何使复杂的计算机视觉变得可访问、成本效益高,并且能够在从工业自动化到智能家居系统等现实世界的嵌入式应用中部署。

资源

目标检测

DALL·E 提示 - 以 1950 年代动画风格的卡通,展示一个带有传感器的详细板,特别是相机,放在带有图案布料的桌子上。板子后面,一台带有大型背板的计算机展示了 Arduino IDE。IDE 的内容暗示了 LED 引脚分配和用于检测语音命令的机器学习推理。在独立的窗口中,串行监视器显示了“是”和“否”命令的输出。

概述

在关于计算机视觉(CV)和 XIAO ESP32S3 的最后一节中,我们学习了如何使用这款卓越的开发板设置和分类图像。继续我们的 CV 之旅,我们将探索微控制器上的 目标检测

目标检测与图像分类的比较

对于图像分类模型来说,主要任务是识别图像上最可能存在的对象类别,例如,在猫和狗之间进行分类,图像中的主要“对象”:

但如果图像中没有主导类别会发生什么呢?

图像分类模型将上述图像完全错误地识别为“灰桶”,可能是由于色彩色调的原因。

之前图像中使用的模型是 MobileNet,它使用大型数据集 ImageNet 进行训练,在 Raspberry Pi 上运行。

为了解决这个问题,我们需要另一种类型的模型,其中不仅 可以找到多个类别(或标签),而且还可以确定对象在给定图像中的 位置

如我们所想,这样的模型要复杂得多,体积也更大,例如,MobileNetV2 SSD FPN-Lite 320x320,使用 COCO 数据集进行训练。这个预训练的目标检测模型旨在在一幅图像中定位多达 10 个对象,并为每个检测到的对象输出一个边界框。下面是这样一个模型在 Raspberry Pi 上运行的结果:

用于目标检测的模型(如 MobileNet SSD 或 YOLO)通常有数 MB 的大小,这对于与 Raspberry Pi 一起使用是可以的,但用于嵌入式设备则不合适,因为嵌入式设备的 RAM 通常最多只有几 MB,就像 XIAO ESP32S3 的情况一样。

目标检测的创新解决方案:FOMO

Edge Impulse 于 2022 年推出,FOMO(更快的目标,更多目标),这是一种在嵌入式设备上执行目标检测的新颖解决方案,例如 Nicla Vision 和 Portenta(Cortex M7),在 Cortex M4F CPU(Arduino Nano33 和 OpenMV M4 系列)以及 Espressif ESP32 设备(ESP-CAM、ESP-EYE 和 XIAO ESP32S3 Sense)上。

在这个动手项目中,我们将探索使用 FOMO 进行目标检测。

要了解有关 FOMO 的更多信息,您可以访问 Edge Impulse 的 官方 FOMO 宣布,其中 Louis Moreau 和 Mat Kelcey 详细解释了它是如何工作的。

对象检测项目目标

所有机器学习项目都需要从详细的目标开始。让我们假设我们在一个工业或农村设施中,必须对 橙子(水果) 和特定的 青蛙(虫子) 进行分类和计数。

换句话说,我们应该执行多标签分类,其中每张图像可以有三个类别:

  • 背景(无对象)

  • 水果

  • 虫子

这里有一些未标记的图像样本,我们应该使用它们来检测对象(水果和虫子):

我们对图像中的哪个对象感兴趣,它的位置(质心),以及我们能在上面找到多少个。与 MobileNet SSD 或 YOLO 一样,FOMO 不检测对象的大小,其中边界框是模型输出之一。

我们将使用 XIAO ESP32S3 开发项目以进行图像捕获和模型推理。机器学习项目将使用 Edge Impulse Studio 开发。但在 Studio 中开始对象检测项目之前,让我们创建一个 原始数据集(未标记)包含要检测的对象的图像。

数据收集

您可以使用 XIAO、您的手机或其他设备捕获图像。在这里,我们将使用 XIAO 和来自 Arduino IDE ESP32 库的代码。

使用 XIAO ESP32S3 收集数据集

打开 Arduino IDE 并选择 XIAO_ESP32S3 板(以及它连接的端口)。在 文件 > 示例 > ESP32 > Camera 中选择 CameraWebServer

板管理器 面板中,确认您已安装最新的“稳定”包。

⚠️ 注意

Alpha 版本(例如,3.x-alpha)与 XIAO 和 Edge Impulse 不兼容。请使用最后一个稳定版本(例如,2.0.11)。

您还应该注释掉所有相机模型,除了 XIAO 模型引脚:

#define CAMERA_MODEL_XIAO_ESP32S3 // 有 PSRAM

工具 中启用 PSRAM。输入您的 Wi-Fi 凭据并将代码上传到设备:

如果代码执行正确,你应该在串行监视器中看到地址:

在浏览器中复制地址并等待页面上传。选择相机分辨率(例如,QVGA)并选择 [开始流]。根据您的连接等待几秒钟/几分钟。您可以使用 [保存] 按钮将图像保存到您的计算机下载区域。

Edge Impulse 建议对象应该大小相似且不重叠,以便获得更好的性能。在工业设施中这是可以的,因为相机应该固定,保持与要检测的对象相同的距离。尽管如此,我们也会尝试使用不同大小和位置来查看结果。

我们不需要为我们的图片创建单独的文件夹,因为每个都包含多个标签。

我们建议使用大约 50 张图片来混合物体并改变场景中每个物体出现的数量。尽量捕捉不同的角度、背景和光照条件。

存储的图片使用 QVGA 帧大小320×240320\times 240和 RGB565(颜色像素格式)。

在捕获您的数据集后,点击[停止流]并将您的图片移动到一个文件夹中。

Edge Impulse Studio

设置项目

前往Edge Impulse Studio,在登录处输入您的凭据(或创建一个账户),并开始一个新的项目。

在这里,您可以克隆为这个动手实践开发的工程:XIAO-ESP32S3-Sense-Object_Detection

在您的项目仪表板上,向下滚动到项目信息,并选择边界框(目标检测)Espressif ESP-EYE(与我们板最相似)作为您的目标设备:

上传未标记的数据

在工作室中,转到“数据采集”标签,在“上传数据”部分,从您的计算机上传作为文件夹捕获的文件。

您可以让工作室自动在训练和测试之间分割您的数据,或者手动进行。我们将上传所有这些作为训练数据。

所有未标记的图片(47 张)已上传,但在用作项目数据集之前必须适当标记。工作室有一个用于此目的的工具,您可以在链接“标记队列(47)”中找到。

您可以使用两种方式在 Edge Impulse Studio(免费版)上执行 AI 辅助标记:

  • 使用 yolov5

  • 跟踪帧间物体

Edge Impulse 为企业客户推出了自动标记功能,简化了目标检测项目中的标记任务。

普通物体可以快速识别和标记,使用 YOLOv5(使用 COCO 数据集训练)现有的预训练目标检测模型库。但由于在我们的情况下,物体不是 COCO 数据集的一部分,我们应该选择跟踪物体的选项。使用此选项,一旦在一个帧中绘制边界框并标记图片,物体将自动从帧到帧跟踪,部分标记新的物体(并非所有都正确标记)。

如果您已经有一个包含边界框的标记数据集,可以使用EI 上传器导入您的数据。

标记数据集

从您未标记数据的第一个图像开始,使用鼠标拖动一个框围绕一个对象以添加标签。然后点击保存标签以进入下一个项目。

继续此过程,直到队列清空。最后,所有图像都应该像以下样本那样标记了对象:

图片

接下来,在“数据采集”标签页上查看标记的样本。如果其中一个标签错误,您可以在样本名称后面的三个点菜单中编辑它:

图片

您将被引导替换错误的标签并纠正数据集。

图片

平衡数据集和分割训练/测试

标记所有数据后,发现水果类别比虫子类别的样本多得多。因此,收集了 11 张新的额外虫子图像(总计 58 张)。标记它们后,是时候选择一些图像并将它们移动到测试数据集了。您可以在图像名称后面的三个点菜单中完成此操作。我选择了 6 张图像,占总数据集的 13%。

图片

冲击设计

在这个阶段,您应该定义如何:

  • 预处理包括将单个图像从320×240320\times 240调整大小到96×9696\times 96并压缩它们(平方形式,不裁剪)。之后,图像从 RGB 转换为灰度。

  • 设计一个模型,在这种情况下,“对象检测”。

图片

预处理整个数据集

在本节中,将颜色深度选为灰度,适用于与 FOMO 模型一起使用并保存参数。

图片

Studio 会自动移动到下一部分,生成特征,其中所有样本都将进行预处理,生成一个包含单个96×96×196\times 96\times 1图像或 9,216 个特征的数据库。

图片

特征探索器显示,在特征生成后,所有样本都表现出良好的分离。

一些样本似乎位于错误的空间中,但点击它们可以确认正确的标记。

模型设计、训练和测试

我们将使用 FOMO,这是一个基于 MobileNetV2(alpha 0.35)的对象检测模型,旨在将图像粗略分割为背景感兴趣对象(在此处为)的网格。

FOMO 是一种创新的机器学习对象检测模型,与传统模型如 Mobilenet SSD 和 YOLOv5 相比,可以节省多达 30 倍的能量和内存。FOMO 可以在小于 200 KB RAM 的微控制器上运行。这之所以可能,是因为其他模型通过围绕对象绘制一个正方形(边界框)来计算对象的大小,而 FOMO 忽略了图像的大小,仅通过其质心坐标提供有关对象在图像中位置的信息。

FOMO 是如何工作的?

FOMO 将图像转换为灰度并使用 8 的因子将其划分为像素块。对于输入的96×9696\times 96,网格将是12×1212\times 12 (96/8=12)(96/8=12)。接下来,FOMO 将对每个像素块运行一个分类器,以计算其中每个像素块包含一个框或轮子的概率,并随后确定具有最高概率包含对象的区域(如果一个像素块没有对象,它将被分类为背景)。从最终区域的重叠部分,FOMO 提供了该区域质心的坐标(与图像尺寸相关)。

图片

对于训练,我们应该选择一个预训练的模型。让我们使用FOMO(更快的目标,更多目标)MobileNetV2 0.35。此模型大约使用 250 KB 的 RAM 和 80 KB 的 ROM(闪存),非常适合我们的板。

图片

关于训练超参数,模型将使用以下参数进行训练:

  • 迭代次数:60

  • 批处理大小:32

  • 学习率:0.001。

在训练期间的验证中,我们将保留 20%的数据集(validation_dataset)。对于剩余的 80%(train_dataset),我们将应用数据增强,这会随机翻转、改变图像的大小和亮度,并裁剪它们,从而在训练数据集上人工增加样本数量。

因此,该模型最终的整体 F1 分数为 85%,与使用测试数据(83%)的结果相似。

注意,FOMO 自动为之前定义的两个标签(轮子)添加了第三个标签背景

图片

在目标检测任务中,准确率通常不是主要的评估指标。目标检测涉及对对象进行分类并在其周围提供边界框,这使得它比简单的分类更复杂。问题是我们没有边界框,只有质心。简而言之,使用准确率作为指标可能是误导性的,并且可能无法完全理解模型的性能。因此,我们将使用 F1 分数。

使用“实时分类”测试模型

一旦我们的模型训练完成,我们可以使用实时分类工具对其进行测试。在相应的部分,点击连接开发板图标(一个小型 MCU)并使用您的手机扫描二维码。

图片

连接后,您可以使用智能手机捕获实际图像,以便在 Edge Impulse Studio 上由训练模型进行测试。

需要注意的是,该模型可能会产生误报和漏报。这可以通过定义合适的置信度阈值(使用三个点菜单进行设置)来最小化。尝试使用 0.8 或更高。

模型部署(Arduino IDE)

选择 Arduino 库和量化(int8)模型,在部署选项卡上启用 EON 编译器,然后按 [构建]

打开您的 Arduino IDE,然后在“草图”下,转到“包含库”并添加.ZIP 库。选择您从 Edge Impulse Studio 下载的文件,然后完成操作!

在 Arduino IDE 的“示例”选项卡下,您应该在您的项目名称下找到名为 (esp32 > esp32_camera) 的草图代码。

您应该更改 32 到 75 行,这些行定义了摄像头模型和引脚,使用与我们的模型相关的数据。复制并粘贴以下行,替换 32-75 行:

#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 10
#define SIOD_GPIO_NUM 40
#define SIOC_GPIO_NUM 39
#define Y9_GPIO_NUM 48
#define Y8_GPIO_NUM 11
#define Y7_GPIO_NUM 12
#define Y6_GPIO_NUM 14
#define Y5_GPIO_NUM 16
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 17
#define Y2_GPIO_NUM 15
#define VSYNC_GPIO_NUM 38
#define HREF_GPIO_NUM 47
#define PCLK_GPIO_NUM 13

这里您可以查看生成的代码:

将代码上传到您的 XIAO ESP32S3 Sense,然后您应该可以开始检测水果和昆虫。您可以在串行监视器中检查结果。

背景

水果

故障

注意,模型的延迟为 143 毫秒,每秒帧率约为 7 fps(与我们从图像分类项目中获得的类似)。这是因为 FOMO 是巧妙地建立在 CNN 模型之上,而不是像 SSD MobileNet 这样的目标检测模型。例如,当在 Raspberry Pi 4 上运行 MobileNetV2 SSD FPN-Lite 320×320320\times 320 模型时,延迟大约高五倍(大约 1.5 fps)。

模型部署(SenseCraft-Web-Toolkit)

如同在图像分类章节中讨论的那样,在 Arduino IDE 上验证图像模型的推理非常具有挑战性,因为我们无法看到摄像头聚焦在哪里。再次,让我们使用 SenseCraft-Web Toolkit

按照以下步骤启动 SenseCraft-Web-Toolkit:

  1. 打开 SenseCraft-Web-Toolkit 网站

  2. 将 XIAO 连接到您的电脑:

  • 连接好 XIAO 后,选择如下:

  • 选择设备/端口,然后按 [连接]

您可以尝试之前由 Seeed Studio 上传的几个计算机视觉模型。尝试它们并享受乐趣!

在我们的情况下,我们将使用页面底部的蓝色按钮:[上传自定义 AI 模型]

但首先,我们必须从 Edge Impulse Studio 下载我们的 量化 .tflite 模型。

  1. 前往 Edge Impulse Studio 中的您的项目,或克隆此项目:
  1. 仪表板 上,下载模型(“块输出”): Object Detection model - TensorFlow Lite (int8 quantized)

  1. 在 SenseCraft-Web-Toolkit 上,使用页面底部的蓝色按钮:[上传自定义 AI 模型]。一个窗口将弹出。将你从 Edge Impulse Studio 下载到电脑上的模型文件输入,选择一个模型名称,并输入标签(ID: Object):

注意,你应该使用在 EI Studio 训练的标签,并按字母顺序输入它们(在我们的情况下,背景,虫子,水果)。

几秒钟(或几分钟)后,模型将上传到你的设备,相机图像将实时出现在预览区域:

被检测到的对象将被标记(质心)。你可以选择你推理光标的置信度 ConfidenceIoU,这是用来评估预测边界框与真实边界框准确性的。

点击顶部按钮(设备日志),你可以打开一个串行监视器来跟踪推理,就像我们在 Arduino IDE 中做的那样。

在设备日志中,你将获得如下信息:

  • 预处理时间(图像捕获和裁剪):3 毫秒,

  • 推理时间(模型延迟):115 毫秒,

  • 后处理时间(显示图像和标记对象):1 毫秒。

  • 输出张量(框),例如,其中一个框:[[30,150, 20, 20,97, 2]];其中 30,150, 20, 20 是框的坐标(围绕质心);97 是推理结果,2 是类别(在这种情况下 2:水果)。

注意,在上面的例子中,我们得到了 5 个框,因为没有任何水果有 3 个质心。一个解决方案将是后处理,我们可以将接近的质心聚合为一个。

这里是其他截图:

摘要

FOMO 是图像处理空间中的一个重大飞跃,正如路易斯·莫罗和马特·凯利在 2022 年发布时所说:

FOMO 是一个突破性的算法,首次将实时目标检测、跟踪和计数带到微控制器。

在嵌入式设备上探索目标检测(以及更精确地,计数它们)存在多种可能性。

资源

运动分类和异常检测

图片

DALL·E 提示 - 1950 年代风格的卡通插图,场景设定在复古音频实验室。科学家们穿着经典的白色实验服,专注地分析大型黑板上的音频数据。黑板上显示着复杂的快速傅里叶变换(FFT)图和时间域曲线。复古音频设备散布四周,但数据表示清晰且详细,表明他们专注于音频分析。

概述

运输是全球贸易的支柱。每天通过各种方式,如船只、卡车和火车,将数百万个集装箱运往世界各地。确保这些集装箱的安全和高效运输是一项艰巨的任务,需要利用现代技术,而 TinyML 无疑是关键解决方案之一。

在这个动手实验室中,我们将解决与运输相关的真实世界问题。我们将使用 XIAOML 套件、Arduino IDE 和 Edge Impulse Studio 开发运动分类和异常检测系统。这个项目将帮助我们了解集装箱在运输的不同阶段(包括陆地和海上运输、通过叉车垂直移动以及仓库中的静止存储期)所经历的不同力和运动。

学习目标

  • 设置 XIAOML 套件

  • 数据收集和预处理

  • 构建运动分类模型

  • 实施异常检测

  • 真实世界测试与分析

到这个实验室结束时,你将拥有一个可以分类不同类型运动并在集装箱运输过程中检测异常的工作原型。这些知识可以作为进入蓬勃发展的 TinyML 领域更高级项目的垫脚石,特别是那些涉及振动的项目。

安装 IMU

XIAOML 套件在扩展板上内置了 LSM6DS3TR-C 6 轴 IMU 传感器,消除了外部传感器连接的需求。这种集成方法提供了一个干净且可靠的平台,适用于基于运动的机器学习应用。

LSM6DS3TR-C 将 3 轴加速度计和 3 轴陀螺仪集成在一个封装中,通过 I2C 连接到 XIAO ESP32S3 的地址 0x6A,提供以下功能:

  • 加速度计范围: ±2/±4/±8/±16 g (默认使用 ±2g)

  • 陀螺仪范围: ±125/±250/±500/±1000/±2000 dps (默认使用 ±250 dps)

  • 分辨率: 16 位 ADC

  • 通信: 地址 0x6A 的 I2C 接口

  • 功耗: 超低功耗设计

图片

坐标系: 传感器在右手坐标系内运行。当你从底部(你可以看到带有标记点的 IMU 传感器)看扩展板时:

  • X 轴: 指向右侧

  • Y 轴: 指向前方(远离你)

  • Z 轴: 指向上方(出板外)

设置硬件

由于 XIAOML Kit 已预装了扩展板,因此不需要额外的硬件连接。LSM6DS3TR-C IMU 已经通过 I2C 正确连接。

已连接的内容:

  • LSM6DS3TR-C IMU → I2C(SDA/SCL)→ XIAO ESP32S3

  • I2C 地址:0x6A

  • 电源:来自 XIAO ESP32S3 的 3.3V

所需库:您应该在设置过程中安装库。如果没有,请按照以下步骤安装 Seeed Arduino LSM6DS3 库:

  1. 打开 Arduino IDE 库管理器

  2. 搜索“LSM6DS3”

  3. 安装 Seeed Studio 的“Seeed Arduino LSM6DS3”

  4. 重要:不要安装“Arduino_LSM6DS3 by Arduino” - 那是针对不同板子的!

测试 IMU 传感器

让我们从一项简单的测试开始,以验证 IMU 是否正常工作。上传此代码以测试传感器:

#include <LSM6DS3.h>
#include <Wire.h>

// Create IMU object using I2C interface
LSM6DS3 myIMU(I2C_MODE, 0x6A);

float accelX, accelY, accelZ;
float gyroX, gyroY, gyroZ;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println("XIAOML Kit IMU Test");
  Serial.println("LSM6DS3TR-C 6-Axis IMU");
  Serial.println("====================");

  // Initialize the IMU
  if (myIMU.begin() != 0) {
      Serial.println("ERROR: IMU initialization failed!");
      while(1) delay(1000);
  } else {
      Serial.println("✓ IMU initialized successfully");
      Serial.println("Data Format: AccelX,AccelY,AccelZ,"
                    "GyroX,GyroY,GyroZ");
      Serial.println("Units: g-force, degrees/second");
      Serial.println();
  }
}

void loop() {
  // Read accelerometer data (in g-force)
  accelX = myIMU.readFloatAccelX();
  accelY = myIMU.readFloatAccelY();
  accelZ = myIMU.readFloatAccelZ();

  // Read gyroscope data (in degrees per second)
  gyroX = myIMU.readFloatGyroX();
  gyroY = myIMU.readFloatGyroY();
  gyroZ = myIMU.readFloatGyroZ();

  // Print readable format
  Serial.print("Accel (g): X="); Serial.print(accelX, 3);
  Serial.print(" Y="); Serial.print(accelY, 3);
  Serial.print(" Z="); Serial.print(accelZ, 3);
  Serial.print(" | Gyro (°/s): X="); Serial.print(gyroX, 2);
  Serial.print(" Y="); Serial.print(gyroY, 2);
  Serial.print(" Z="); Serial.println(gyroZ, 2);

  delay(100); // 10 Hz update rate
}

当套件平放在桌子上时,你应该看到:

  • Z 轴加速度约为+1.0g(重力)

  • X 和 Y 加速度接近 0.0g

  • 所有陀螺仪值接近 0.0°/s

移动套件以查看相应值的变化。

TinyML 运动分类项目

我们将通过模拟各种场景来模拟集装箱(或更准确地说,包裹)的运输,使本教程更具相关性和实用性。

图片

使用 XIAOML Kit 的加速度计,我们将通过手动模拟以下条件来捕捉运动数据:

  • 海事(船上的托盘)- 在所有轴向上以波浪状模式移动

  • 地面(卡车/火车上的托盘)- 主要水平移动

  • 提升(叉车移动的托盘)- 主要垂直移动

  • 空闲(存储中的托盘)- 最小移动

从上面的图像中,我们可以为我们的模拟定义,主要水平移动(xxyy轴)应与“地面类别”相关联。垂直移动(zz-轴)与“提升类别”相关联,没有活动与“空闲类别”相关联,所有三个轴上的移动到海事类别

图片

数据收集

对于数据收集,我们有几个选项可供选择。在实际场景中,我们可以将我们的设备,例如,直接连接到一个容器上,并将收集到的数据存储在 SD 卡上的文件中(例如,CSV 文件)。数据也可以通过 Wi-Fi 或蓝牙(如本项目所示:Sensor DataLogger)远程发送到附近的存储库,如手机。一旦您的数据集收集并存储为.CSV 文件,就可以使用CSV 向导工具上传到工作室。

在这个视频中,你可以学习将数据发送到 Edge Impulse Studio 的替代方法。

准备数据收集代码

在这个实验室中,我们将直接将套件连接到 Edge Impulse Studio,它也将用于数据预处理、模型训练、测试和部署。

对于数据收集,我们首先应该将套件连接到 Edge Impulse Studio,它也将用于数据预处理、模型训练、测试和部署。

按照以下链接中的说明,在你的计算机上安装 Node.js 和 Edge Impulse CLI。

由于 XIAOML 套件不是 Edge Impulse 完全支持的开发板,例如,我们应该使用CLI 数据转发器来捕获我们的传感器数据并将其发送到 Studio,如图所示:

图片

我们将修改测试代码以输出适合 Edge Impulse 的数据格式:

#include <LSM6DS3.h>
#include <Wire.h>

#define FREQUENCY_HZ 50
#define INTERVAL_MS (1000  /  (FREQUENCY_HZ  +  1))

LSM6DS3 myIMU(I2C_MODE, 0x6A);
static unsigned long last_interval_ms = 0;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println("XIAOML Kit - Motion Data Collection");
  Serial.println("LSM6DS3TR-C IMU Sensor");

  // Initialize IMU
  if (myIMU.begin() != 0) {
      Serial.println("ERROR: IMU initialization failed!");
      while(1) delay(1000);
  }

  delay(2000);
  Serial.println("Starting data collection in 3 seconds...");
  delay(3000);
}

void loop() {
  if (millis() > last_interval_ms + INTERVAL_MS) {
      last_interval_ms = millis();

      // Read accelerometer data
      float ax = myIMU.readFloatAccelX();
      float ay = myIMU.readFloatAccelY();
      float az = myIMU.readFloatAccelZ();

      // Convert to m/s² (multiply by 9.81)
      float ax_ms2 = ax * 9.81;
      float ay_ms2 = ay * 9.81;
      float az_ms2 = az * 9.81;

      // Output in Edge Impulse format
      Serial.print(ax_ms2);
      Serial.print("\t");
      Serial.print(ay_ms2);
      Serial.print("\t");
      Serial.println(az_ms2);
  }
}

将代码上传到 Arduino IDE。我们应该在串行监视器中看到加速度计的值(转换为 m/s²):

图片

保持代码运行,但关闭串行监视器。套件生成的数据将通过串行连接发送到 Edge Impulse Studio。

连接到 Edge Impulse 进行数据收集

创建 Edge Impulse 项目 - 前往 Edge Impulse Studio 并创建一个新的项目 - 选择一个描述性的名称(为了与 Arduino 库兼容,名称长度请保持在 63 个字符以内)

图片

设置 CLI 数据转发器 - 在你的计算机上安装 Edge Impulse CLI - 确认 XIAOML 套件已连接到计算机,代码正在运行且串行监视器已关闭,否则我们可能会遇到错误。 - 在计算机终端运行:edge-impulse-data-forwarder --clean - 输入你的 Edge Impulse 凭据 - 选择你的项目并配置设备设置

图片

  • 前往 Edge Impulse Studio 项目。在“设备”部分可以验证套件是否正确连接(点应该是绿色的)。

图片

在 Studio 进行数据收集

如前所述,我们应该从所有四个运输类别中捕获数据。想象一下,你有一个内置加速度计的容器(在这种情况下,我们的 XIAOML 套件)。现在想象你的容器在一艘船上,面对愤怒的大海:

图片

或者在一个卡车、在道路上行驶,或者被叉车移动等情况下。

运动模拟

海事类别

  • 持住套件并模拟船只运动

  • 以波浪状、起伏的运动在三个轴上移动

  • 包括轻微的滚动和俯仰运动

地面类别

  • 将套件沿直线水平移动(从左到右和相反方向)

  • 通过小幅度的水平震动来模拟卡车/火车的振动

  • 偶尔轻微的颠簸和转弯

提升类别

  • 主要在垂直方向上移动套件(上升和下降)

  • 模拟叉车操作:上升,暂停,下降

  • 包含一些短的水平定位运动

空闲类别:

  • 将套件放置在稳定的表面上

  • 最小或无运动

  • 捕获环境振动和传感器噪声

数据采集

数据采集 部分,您应该看到您的板 [xiaoml-kit] 已连接。传感器可用: [具有 3 个轴(accX,accY,accZ)的传感器],采样频率为 [50 Hz]。工作室建议样本长度为 [10000] 毫秒(10 秒)。最后要做的就是定义样本标签。让我们从[陆地]开始。

按下 [开始采样] 并将您的套件水平移动(从左到右),保持在一个方向上。10 秒后,我们的数据将被上传到工作室。

下面是 10 秒收集数据的其中一个样本(原始数据)。值得注意的是,波动运动主要沿着 Y 轴(左右)发生。其他轴几乎处于静止状态(X 轴围绕零中心,Z 轴由于重力围绕 9.8 ms²中心)。

图片

您应该为每个类别捕获大约 2 分钟(十个到十二个 10 秒的样本)。在每个样本之后使用“3 个点”,选择两个并将它们移动到测试集。或者,您可以使用仪表板标签页的危险区域上的自动训练/测试分割工具。下面,您可以看到结果数据集:

图片

数据预处理

加速度计捕获的原始数据类型是“时间序列”,应将其转换为“表格数据”。我们可以通过在样本数据上使用滑动窗口来完成此转换。例如,在下面的图中,

图片

我们可以看到以 50 Hz 的采样率捕获的 10 秒加速度计数据。2 秒窗口将捕获 300 个数据点(3 轴 ×\times 2 秒 ×\times 50 个样本)。我们将每 200ms 滑动这个窗口,创建一个更大的数据集,其中每个实例都有 300 个原始特征。

您应该根据尼奎斯特定理使用最适合您情况的采样率,该定理指出,周期性信号必须以高于信号最高频率成分两倍以上的速率进行采样。

数据预处理是嵌入式机器学习的挑战领域。然而,Edge Impulse 通过其数字信号处理(DSP)预处理步骤以及更具体的频谱特征帮助克服这一挑战。

在 Studio 中,这个数据集将是频谱分析模块的输入,该模块非常适合分析重复运动,如加速度计的数据。此模块将执行 DSP(数字信号处理),提取“FFT”或“小波”等特征。在最常见的案例中,FFT,每个轴/通道的时域统计特征如下:

  • 均方根

  • 偏度

  • 峰度

图片

每个轴/通道的频域特征如下:

  • 频谱功率

  • 偏度

  • 峰度

图片

例如,对于 32 点的 FFT 长度,频谱分析模块的结果输出将是每个轴 21 个特征(总共 63 个特征)。

这 63 个特征将作为神经网络分类器和异常检测模型(K-Means)的输入张量。

您可以通过深入了解实验室的 DSP 频谱特征来了解更多信息。

模型设计

我们的分类器将是一个密集神经网络(DNN),其输入层将有 63 个神经元,两个隐藏层分别有 20 和 10 个神经元,以及一个输出层,有四个神经元(每个类别一个),如图所示:

图片

冲激设计

冲激从原始数据中提取特征,使用信号处理提取特征,然后使用学习模块(密集模型)对新数据进行分类。

我们还利用第二个模型,即K-means,它可以用于异常检测。如果我们想象我们的已知类别可以作为簇,那么任何无法适应这些簇的样本可能是一个异常值,一个异常(例如,在海洋上滚出船的集装箱或倒置在地面上)。

图片

想象我们的 XIAOML 套件滚动或倒置移动,在一个与训练时不同的运动补全上。

图片

在最终的冲激设计下方:

图片

生成特征

在我们的项目这个阶段,我们已经定义了预处理方法,并且模型已经设计完成。现在,是时候完成任务了。首先,让我们将原始数据(时间序列类型)转换为表格数据。转到“频谱特征”标签并选择“[保存参数]”。或者,我们也可以选择“[自动调整参数]”按钮。在这种情况下,Studio 将根据原始数据定义新的超参数,如滤波器设计和 FFT 长度。

图片

在顶部菜单中,选择“生成特征”标签,然后在那里选择选项,“计算特征重要性”,“归一化特征”,然后按“[生成特征]”按钮。每个 2 秒的数据窗口(300 个数据点)将被转换成一个包含 63 个特征的单一表格数据点。

特征探索器将使用UMAP(均匀流形近似和投影)在 2D 中显示这些数据。UMAP 是一种降维技术,可用于可视化,类似于 t-SNE,但也可以用于一般的非线性降维。

可视化使得人们可以验证这些类别表现出优秀的分离,这表明分类器应该表现良好。

可选地,你可以分析每个特征相对于其他类别的相对重要性。

训练

我们的分类器将是一个密集神经网络(DNN),其输入层将有 63 个神经元,两个隐藏层分别有 20 和 10 个神经元,输出层有四个神经元(每个类别一个),如图所示:

作为超参数,我们将使用学习率 0.005 和 20%的数据进行验证,持续 30 个 epoch。训练后,我们可以看到准确率为 100%。

对于异常检测,我们应该选择建议的特征,这些特征正是特征提取中最重要的一部分。簇的数量将是 32,如工作室所建议。训练后,我们可以选择一些数据进行测试,例如海洋数据。得到的异常分数为min: -0.1642, max: 0.0738, avg: -0.0867

当更改数据时,可能会发现小的或负的异常分数表明数据是正常的。

测试

使用在数据捕获阶段留下的 20%的数据,我们可以验证我们的模型在未知数据上的表现;如果不是 100%(预期的结果),结果仍然非常好(8%)。

你还应该使用你的套件(仍然连接到工作室)并执行一些实时分类。例如,让我们测试一些“地面”运动:

注意,在这里,你将使用你的设备捕获真实数据并将其上传到工作室,在那里将使用训练好的模型进行推理(注意模型不在你的设备上)。

部署

现在是时候施展魔法了!工作室将打包所有需要的库、预处理函数和训练好的模型,并将它们下载到你的电脑上。你应该选择 Arduino 库选项,然后在底部选择量化(Int8),然后点击“[构建]”。将创建一个 ZIP 文件并下载到你的电脑上。

在你的 Arduino IDE 中,转到“草图”选项卡,选择添加.ZIP 库的选项,并选择由工作室下载的.zip 文件:

推理

现在,是时候进行真正的测试了。我们将进行与工作室完全断开的推理。让我们更改在部署 Arduino 库时创建的一个代码示例。

在你的 Arduino IDE 中,转到“文件/示例”选项卡,找到你的项目,在示例中,选择nano_ble_sense_accelerometer

当然,这不是你的板子,但我们可以通过仅做少量修改使代码工作。

例如,在代码的开头,你有与 Arduino Sense IMU 相关的库:

/* Includes -------------------------------------------- */
#include <XIAOML_Kit_Motion_Class_-_AD_inferencing.h>
#include <Arduino_LSM9DS1.h>

将与 IMU 相关的代码部分“includes”进行修改:

#include <XIAOML_Kit_Motion_Class_-_AD_inferencing.h>
#include <LSM6DS3.h>
#include <Wire.h>

修改常量定义

// IMU setup
LSM6DS3 myIMU(I2C_MODE, 0x6A);

// Inference settings
#define CONVERT_G_TO_MS2 9.81f
#define MAX_ACCEPTED_RANGE 2.0f  *  CONVERT_G_TO_MS2

在设置函数中,初始化 IMU:

   // Initialize IMU
    if (myIMU.begin() != 0) {
        Serial.println("ERROR: IMU initialization failed!");
        return;
    }

在循环函数中,缓冲区 buffer[ix]、buffer[ix + 1]和 buffer[ix + 2]将接收加速度计捕获的 3 轴数据。在原始代码中,你有以下行:

IMU.readAcceleration(buffer[ix], buffer[ix + 1], buffer[ix + 2]);

用以下代码块替换它:

// Read IMU data
float x = myIMU.readFloatAccelX();
float y = myIMU.readFloatAccelY();
float z = myIMU.readFloatAccelZ();

你应该重新排列以下两个代码块。首先,将原始数据转换为“每平方秒米(m/s²)”,然后进行关于最大接受范围的测试(在这里是 m/s²,但在 Arduino 上是 Gs):

  // Convert to m/s²
  buffer[i + 0] = x * CONVERT_G_TO_MS2;
  buffer[i + 1] = y * CONVERT_G_TO_MS2;
  buffer[i + 2] = z * CONVERT_G_TO_MS2;

  // Apply range limiting
  for (int j = 0; j < 3; j++) {
      if (fabs(buffer[i + j]) > MAX_ACCEPTED_RANGE) {
          buffer[i + j] = copysign(MAX_ACCEPTED_RANGE, buffer[i + j]);
      }
  }

而且这就足够了。我们还可以调整在串行监视器中显示推理的方式。你现在可以上传下面的完整代码到你的设备上,并继续进行推理。

// Motion Classification with LSM6DS3TR-C IMU
#include <XIAOML_Kit_Motion_Class_-_AD_inferencing.h>
#include <LSM6DS3.h>
#include <Wire.h>

// IMU setup
LSM6DS3 myIMU(I2C_MODE, 0x6A);

// Inference settings
#define CONVERT_G_TO_MS2 9.81f
#define MAX_ACCEPTED_RANGE 2.0f  *  CONVERT_G_TO_MS2

static bool debug_nn = false;
static float buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = { 0 };
static float inference_buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE];

void setup() {
    Serial.begin(115200);
    while (!Serial) delay(10);

    Serial.println("XIAOML Kit - Motion Classification");
    Serial.println("LSM6DS3TR-C IMU Inference");

    // Initialize IMU
    if (myIMU.begin() != 0) {
        Serial.println("ERROR: IMU initialization failed!");
        return;
    }

    Serial.println("✓ IMU initialized");

    if (EI_CLASSIFIER_RAW_SAMPLES_PER_FRAME != 3) {
        Serial.println("ERROR: EI_CLASSIFIER_RAW_SAMPLES_PER_FRAME"
                       "should be 3");
        return;
    }

    Serial.println("✓ Model loaded");
    Serial.println("Starting motion classification...");
}

void loop() {
    ei_printf("\nStarting inferencing in 2 seconds...\n");
    delay(2000);

    ei_printf("Sampling...\n");

    // Clear buffer
    for (size_t i = 0; i < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; i++) {
        buffer[i] = 0.0f;
    }

    // Collect accelerometer data
    for (int i = 0; i < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; i += 3) {
        uint64_t next_tick = micros() +
          (EI_CLASSIFIER_INTERVAL_MS * 1000);

        // Read IMU data
        float x = myIMU.readFloatAccelX();
        float y = myIMU.readFloatAccelY();
        float z = myIMU.readFloatAccelZ();

        // Convert to m/s²
        buffer[i + 0] = x * CONVERT_G_TO_MS2;
        buffer[i + 1] = y * CONVERT_G_TO_MS2;
        buffer[i + 2] = z * CONVERT_G_TO_MS2;

        // Apply range limiting
        for (int j = 0; j < 3; j++) {
            if (fabs(buffer[i + j]) > MAX_ACCEPTED_RANGE) {
                buffer[i + j] = copysign(MAX_ACCEPTED_RANGE,
                                         buffer[i + j]);
            }
        }

        delayMicroseconds(next_tick - micros());
    }

    // Copy to inference buffer
    for (int i = 0; i < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; i++) {
        inference_buffer[i] = buffer[i];
    }

    // Create signal from buffer
    signal_t signal;
    int err = numpy::signal_from_buffer(inference_buffer,
              EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
    if (err != 0) {
        ei_printf("ERROR: Failed to create signal from buffer (%d)\n",
                  err);
        return;
    }

    // Run the classifier
    ei_impulse_result_t result = { 0 };
    err = run_classifier(&signal, &result, debug_nn);
    if (err != EI_IMPULSE_OK) {
        ei_printf("ERROR: Failed to run classifier (%d)\n", err);
        return;
    }

    // Print predictions
    ei_printf("Predictions (DSP: %d ms, Classification: %d ms, "
              "Anomaly: %d ms):\n",
        result.timing.dsp, result.timing.classification, result.timing.anomaly);

    for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
        ei_printf(" %s: %.5f\n", result.classification[ix].label,
                  result.classification[ix].value);
    }

    // Print anomaly score
#if EI_CLASSIFIER_HAS_ANOMALY == 1
    ei_printf("Anomaly score: %.3f\n", result.anomaly);
#endif

    // Determine prediction
    float max_confidence = 0.0;
    String predicted_class = "unknown";

    for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
        if (result.classification[ix].value > max_confidence) {
            max_confidence = result.classification[ix].value;
            predicted_class = String(result.classification[ix].label);
        }
    }

    // Display result with confidence threshold
    if (max_confidence > 0.6) {
        ei_printf("\n🎯 PREDICTION: %s (%.1f%% confidence)\n",
                 predicted_class.c_str(), max_confidence * 100);
    } else {
        ei_printf("\n❓ UNCERTAIN: Highest confidence is %s (%.1f%%)\n",
                 predicted_class.c_str(), max_confidence * 100);
    }

    // Check for anomaly
#if EI_CLASSIFIER_HAS_ANOMALY == 1
    if (result.anomaly > 0.5) {
        ei_printf("⚠️ ANOMALY DETECTED! Score: %.3f\n", result.anomaly);
    }
#endif

    delay(1000);
}

void ei_printf(const char *format, ...) {
    static char print_buf[1024] = { 0 };
    va_list args;
    va_start(args, format);
    int r = vsnprintf(print_buf, sizeof(print_buf), format, args);
    va_end(args);
    if (r > 0) {
        Serial.write(print_buf);
    }
}

完整的代码可在实验室的 GitHub上找到

现在你应该尝试你的动作,查看每个类别的推理结果在图像上的显示:

当然,还有一些“异常”,例如将 XIAO 倒置。异常分数将超过 0.5:

后处理

既然我们知道模型正在工作,我们建议修改代码以查看套件完全离线(断开与 PC 的连接,由电池、移动电源或独立的 5V 电源供电)的结果。

理念是如果检测到特定的动作,相应的信息将出现在 OLED 显示屏上。

修改后的推理代码,用于 OLED 显示屏,可在实验室的 GitHub上找到。

摘要

本实验室展示了如何使用 XIAOML 套件的内置 LSM6DS3TR-C IMU 传感器构建完整的运动分类系统。主要成就包括:

技术实现:

  • 利用集成的 6 轴 IMU 进行运动感应

  • 收集了四种交通场景的标记训练数据

  • 实现了时间序列分析的光谱特征提取

  • 部署了针对微控制器推理优化的神经网络分类器

  • 添加了异常检测以识别不寻常的动作

机器学习流程:

  • 直接从嵌入式传感器收集数据

  • 使用频域分析进行特征工程

  • 在 Edge Impulse 中训练和优化模型

  • 在资源受限的硬件上进行实时推理

  • 性能监控和验证

实际应用: 学习到的技术可以直接应用于现实场景,包括:

  • 资产跟踪和物流监控

  • 机器设备的预测性维护

  • 人类活动识别

  • 车辆和设备监控

  • 智能城市中的物联网传感器网络

关键学习点:

  • 与 IMU 坐标系统和传感器融合工作

  • 在边缘设备上平衡模型准确性与推理速度

  • 实现稳健的数据收集和预处理管道

  • 将机器学习模型部署到嵌入式系统

  • 集成多个传感器(IMU + 显示)以实现完整解决方案

将运动分类与 XIAOML 套件集成展示了现代嵌入式系统如何本地执行复杂的 AI 任务,实现无需依赖云端的实时决策。这种方法对于工业物联网、自主系统和智能设备应用中边缘 AI 的未来至关重要。

资源

概述

这些实验室提供了在高端且紧凑的嵌入式设备(Seeed Studio Grove Vision AI V2)上获得机器学习(ML)系统实际操作经验的机会。与需要数据中心规模资源的庞大模型相比,这些实验室允许您直接使用 TinyML 与硬件和软件进行交互。这种动手方法提供了对部署 AI 挑战和机会的切实理解,尽管是在小规模上。然而,这些原则与您在处理更大或更小系统时遇到的原则基本相同。

Grove Vision AI V2 在嵌入式 AI 领域占据独特位置,弥合了基本微控制器解决方案(如 Seeed XIAO ESP32S3 Sense 或 Arduino Nicla Vision)和更强大的单板计算机(如 Raspberry Pi)之间的差距。其核心是 Himax WiseEye2 HX6538 处理器,配备双核 Arm Cortex-M55 和集成的 ARM Ethos-U55 神经网络单元

Arm Ethos-U55 代表了一种专门的机器学习处理器类别,特别设计为微 NPU,用于加速在区域受限的嵌入式和物联网设备中的 ML 推理。Ethos-U55 与 AI 功能的 Cortex-M55 处理器的强大组合,在现有基于 Cortex-M 的系统上实现了令人瞩目的 480 倍性能提升。在 400 MHz 的频率下运行,具有可配置的内部系统内存(SRAM)高达 2.4 MB,Grove Vision AI V2 提供了专业级的计算机视觉能力,同时保持了边缘应用所需的功耗效率和紧凑型外形。

这种定位使其成为学习高级 TinyML 概念的理想平台,它提供了较小系统所具有的简单性和降低的功耗要求,同时提供了远超传统基于微控制器解决方案的能力。

Grove - 视觉 AI 模块 V2。来源:SEEED Studio。

先决条件

  • Grove Vision AI V2 板:确保您有 Grove Vision AI V2 板。

  • Raspberry Pi OV5647 摄像头模块:摄像头应连接到 Grove Vision AI V2 板以进行图像捕获。

  • 主控制器:可以是 Seeed XIAO ESP32S3、XIAO ESP32C6 或其他设备。

  • USB-C 线缆:用于将板连接到您的计算机。

  • 网络:具有互联网访问权限以下载必要的软件。

  • XIAO 扩展板基础:这有助于将主设备连接到物理世界(可选)。

设置和无代码应用

  • 设置和无代码应用

练习

模态 任务 描述 链接
视觉 图像分类 学习对图像进行分类 链接
视觉 目标检测 实现目标检测 TBD

设置和无代码应用

在这个实验室中,我们将探索使用 Seeed Studio Grove Vision AI 模块 V2 的计算机视觉 (CV) 应用,这是一个专为嵌入式机器学习应用设计的强大而紧凑的设备。基于 Himax WiseEye2 芯片,该模块旨在使边缘设备具备 AI 功能,使其成为边缘机器学习 (ML) 应用的理想工具。

简介

Grove Vision AI 模块 (V2) 概述

Grove Vision AI (V2) 是一个基于 MCU 的视觉 AI 模块,它使用一个 Himax WiseEye2 HX6538 处理器,该处理器具有双核 Arm Cortex-M55 和一个集成的 ARM Ethos-U55 神经网络单元Arm Ethos-U55 是一个机器学习 (ML) 处理器类别,特别设计为微 NPU,以加速在区域受限的嵌入式和物联网设备中的 ML 推理。Ethos-U55 与 AI 兼容的 Cortex-M55 处理器结合,在基于 Cortex-M 的现有系统中提供了 480 倍的 ML 性能提升。其时钟频率为 400 MHz,其内部系统内存(SRAM)可配置,最大容量为 2.4 MB。

注意:根据 Seeed Studio 文档,除了 Himax 内部内存 2.5MB(2.4MB SRAM + 64KB ROM)外,Grove Vision AI (V2) 还配备了一个 16MB/133 MHz 的外部闪存。

下面是 Grove Vision AI (V2) 系统的框图,包括一个摄像头和一个主控制器。

通过IIC、UART、SPI 和 Type-C等接口,Grove Vision AI (V2) 可以轻松连接到 XIAO、Raspberry Pi、BeagleBoard 和基于 ESP 的产品等设备,以进行进一步开发。例如,将 Grove Vision AI V2 与 XIAO 系列设备之一集成,可以通过 Arduino IDE 或 MicroPython 容易地访问设备推理的结果数据,并方便地连接到云端或专用服务器,如家庭助手。

使用I2C Grove 连接器,Grove Vision AI V2 可以轻松连接到任何主设备。

除了性能之外,另一个值得评论的领域是功耗。例如,在与 XIAO ESP32S3 Sense 的比较测试中,运行 Swift-YOLO Tiny 96x96,尽管实现了更高的性能(30 FPS 对 5.5 FPS),但与 XIAO ESP32S3 Sense 相比,Grove Vision AI V2 表现出更低的功耗(0.35 W 对 0.45 W)。

上述比较(以及与其他设备的比较)可以在文章 2024 MCU AI 视觉板:性能比较 中找到,该文章证实了 Grove Vision AI (V2) 的强大功能。

摄像头安装

准备好 Grove Vision AI (V2) 和摄像头后,您可以通过 CSI 线连接,例如 Raspberry Pi OV5647 摄像头模块

连接时,请注意引脚排的方向,并确保它们正确插入,而不是反方向。

图片

SenseCraft AI Studio

SenseCraft AI Studio 是一个强大的平台,提供各种与各种设备兼容的 AI 模型,包括 XIAO ESP32S3 Sense 和 Grove Vision AI V2。在本实验中,我们将介绍如何使用 Grove Vision AI V2 的 AI 模型,并预览模型的输出。我们还将探讨一些关键概念、设置以及如何优化模型性能。

图片

模型也可以使用 SenseCraft Web Toolkit 部署,这是 SenseCraft AI Studio 的简化版本。

为了简单起见,我们可以开始使用 SenseCraft Web Toolkit,或者直接进入 SenseCraft AI Studio,那里有更多资源。

SenseCraft Web-Toolkit

SenseCraft Web Toolkit 是 SSCMA(Seeed SenseCraft Model Assistant) 中包含的可视化模型部署工具。此工具使我们能够通过简单的操作轻松地将模型部署到各种平台。该工具提供用户友好的界面,无需任何编码。

SenseCraft Web Toolkit 是基于 Himax AI Web Toolkit 的,它可以从 这里可选)下载。下载后解压到本地 PC,双击 index.html 以本地运行。

图片

但在我们的情况下,让我们按照以下步骤开始 SenseCraft-Web-Toolkit

  • Chrome 浏览器中打开 SenseCraft-Web-Toolkit 网站

  • 使用 Type-C 线将 Grove Vision AI (V2) 连接到您的计算机。

  • 连接 XIAO 后,选择如下:

图片

  • 选择设备/端口,然后按 [连接]

图片

注意:WebUSB 工具可能在某些浏览器中无法正常工作,例如 Safari。请使用 Chrome。

我们可以尝试 Seeed Studio 之前上传的几个基本计算机视觉模型。将光标移过 AI 模型,我们可以了解一些关于它们的信息,例如名称、描述、类别(图像分类、目标检测或姿态/关键点检测)、算法(如 YOLO V5 或 V8、FOMO、MobileNet V2 等)和指标(准确度或 mAP)。

我们可以通过点击它并按 [发送] 按钮选择那些现成的 AI 模型之一,或者上传我们的模型。

对于SenseCraft AI平台,请按照这里的说明操作。

探索 CV AI 模型

目标检测

目标检测是计算机视觉中的一个关键技术,它专注于在数字图像或视频帧中识别和定位对象。与将整个图像分类为单个标签的图像分类不同,目标检测识别图像中的多个对象并确定它们的精确位置,通常由边界框表示。这种能力对于广泛的用途至关重要,包括自动驾驶汽车、安全、监控系统以及增强现实,在这些应用中,理解视觉环境中的上下文和内容是至关重要的。

在目标检测中设定基准的常见架构包括 YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)、FOMO(Faster Objects, More Objects)和 Faster R-CNN(基于区域的卷积神经网络)模型。

让我们选择一个现成的 AI 模型,例如人员检测,它使用 Swift-YOLO 算法进行训练。

一旦模型成功上传,你可以在右侧预览区域看到 Grove Vision AI (V2)摄像头的实时流。此外,通过点击顶部的 [设备日志] 按钮可以在串行监视器上显示推理详情。

在 SenseCraft AI Studio 中,设备日志始终在屏幕上。

将摄像头对准我,只检测到一个人,因此模型输出将是一个单独的“框”。仔细观察,模块会连续发送两行信息:

perf(性能),显示毫秒级的延迟。

  • 预处理时间(图像捕获和裁剪):7ms

  • 推理时间(模型延迟):76ms (13 fps)

  • 后处理时间(显示图像和数据包含):小于 0ms。

boxes: 显示图像中检测到的对象。在这种情况下,只有一个。

  • 框的坐标为 x, y, w, h (245, 292449392),并且对象(人,标签 0)的捕获值为 .89

如果我们用摄像头指向有几个人的图像,我们将为每个人(对象)得到一个框:

在 SenseCraft AI Studio 上,推理延迟(48ms)低于 SenseCraft ToolKit(76ms),这是由于独特的部署实现。

图片

功耗

运行这个 Swift-YOLO 模型时的峰值功耗为 410 毫瓦。

预览设置

我们可以看到,在设置中,有两个设置选项可以调整以优化模型的识别精度。

  • 置信度:指模型对其预测赋予的确定性或概率水平。此值确定模型认为检测有效所需的最小置信度水平。较高的置信度阈值将导致检测数量减少但确定性更高,而较低的阈值将允许更多检测,但可能包括一些误报。

  • IoU:用于评估预测边界框与真实边界框的准确性。IoU 是一个度量指标,用于衡量预测边界框与真实边界框之间的重叠。它用于确定目标检测的准确性。IoU 阈值设置了对检测被认为是真正阳性的最小 IoU 值。调整此阈值可以帮助微调模型的精确度和召回率。

图片

尝试调整置信度阈值和 IoU 阈值的不同值,以找到在准确检测人员的同时最小化误报的最佳平衡。最佳设置可能因我们的具体应用和图像或视频流的特点而异。

姿态/关键点检测

姿态或关键点检测是计算机视觉中的一个复杂领域,它专注于在图像或视频帧中识别特定的兴趣点,通常与人体、面部或其他感兴趣的对象相关。这项技术可以检测并绘制出主题的各种关键点,如人体上的关节或面部的特征,从而实现姿态、运动和手势的分析。这对于各种应用具有深远的影响,包括增强现实、人机交互、运动分析和医疗监测,在这些应用中,理解人体运动和活动至关重要。

与一般目标检测不同,目标检测识别并定位对象,姿态检测则深入到更细致的细节,捕捉特定部分的细微位置和方向。该领域的领先架构包括 OpenPose、AlphaPose 和 PoseNet,每个架构都旨在以不同复杂度和精度解决姿态估计的挑战。通过深度学习和神经网络的发展,姿态检测变得越来越准确和高效,为视觉数据中捕获的主题的复杂动态提供实时洞察。

因此,让我们探索这个流行的计算机视觉应用,姿态/关键点检测

图片

通过在预览区域按 [停止] 来停止当前模型的推理。选择模型并按 [发送]。一旦模型成功上传,您可以在右侧预览区域的预览区域中查看 Grove Vision AI(V2)摄像头的实时流,以及通过点击顶部 [设备日志] 按钮可访问的串行监视器中显示的推理细节。

YOLOV8 姿态模型使用COCO-Pose 数据集进行训练,该数据集包含 200K 张带有17个关键点的图像,用于姿态估计任务。

让我们看看单个推理截图(为了简化,让我们分析包含一个人的图像)。我们可以注意到我们有两行,一行是推理性能(121 毫秒),另一行是以下关键点

  • 1 个信息框,与目标检测示例中得到的相同(框坐标(113,119,67,208),推理结果(90),标签(0)。

  • 17 组 4 个数字代表身体的 17 个“关节”,其中‘0’是鼻子,‘1’和‘2’是眼睛,‘15’和‘16’是脚,等等。

要更深入地了解姿态估计项目,请参阅教程:探索边缘 AI!- 姿态估计

图像分类

图像分类是计算机视觉中的一个基础任务,旨在将整个图像分类到预定义的几个类别之一。这个过程涉及分析图像的视觉内容,并根据它包含的主要物体或场景,从固定的类别集中分配一个标签。

图像分类在各种应用中至关重要,从组织并搜索数字图书馆和社交媒体平台中的大型图像数据库,到使自主系统能够理解其周围环境。显著推进图像分类领域的常见架构包括卷积神经网络(CNNs),如 AlexNet、VGGNet 和 ResNet。这些模型通过学习视觉数据的高级表示,在具有挑战性的数据集(如ImageNet)上展示了显著的准确性。

作为许多计算机视觉系统的基石,图像分类推动了创新,为更复杂任务如目标检测和图像分割奠定了基础,并促进了各行业对视觉数据的更深入理解。因此,让我们也来探索这个计算机视觉应用。

此示例可在 SenseCraft ToolKit 中找到,但不在 SenseCraft AI Studio 中。在最后一个示例中,可以找到其他图像分类的示例。

模型成功上传后,我们可以在右侧的预览区域查看 Grove Vision AI (V2)摄像头的实时流,同时显示在串行监视器(通过点击顶部的 [设备日志] 按钮)中的推理细节。

图片

因此,我们将收到一个分数和类别作为输出。

图片

例如,[99, 1] 表示类别:1(人物)得分为 0.99。一旦这个模型是二元分类,类别 0 将是“无人”(或背景)。推理延迟为15ms或大约 70fps。

功耗

要运行 Mobilenet V2 0.35,Grove Vision AI V2 在 5.24V 时的峰值电流为 80mA,导致功耗为 420mW

在 XIAO ESP32S3 Sense 上运行相同的模型,功耗为 523mW,延迟为 291ms。

图片

在 SenseCraft AI Studio 上探索其他模型

还可以从 SenseCraft AI 网页 下载几个公共 AI 模型。例如,你可以运行一个 Swift-YOLO 模型,检测交通灯 如此所示:

图片

此模型的延迟大约为 86ms,平均功耗为 420mW。

一个图像分类项目

让我们创建一个完整的图像分类项目,使用 SenseCraft AI Studio。

图片

在 SenseCraft AI Studio 上:让我们打开标签页 训练

图片

如果有 WebCam,默认情况下训练一个分类模型。让我们选择 Grove Vision AI V2。按下绿色按钮[连接],将出现一个弹出窗口。选择相应的端口,然后按蓝色按钮 [连接]

图片

从 Grove Vision AI V2 流出的图像将被显示。

目标

第一步始终是定义一个目标。例如,让我们分类两个简单的物体——例如,一个玩具盒子和一个玩具轮子。我们还应该包括一个图像类别,背景,其中场景中没有物体。

图片

数据收集

让我们创建类,例如按照字母顺序:

  • 类 1:背景

  • 类 2:盒子

  • 类 3:轮子

图片

选择一个类别,并持续按预览区域下的绿色按钮。收集的图像将出现在图像样本屏幕上。

图片

收集图像后,检查它们并删除任何错误的图像。

图片

从每个类别收集大约 50 张图像,然后转到训练步骤:

训练

确认是否选择了正确的设备(Grove Vision AI V2),然后按 [开始训练]

图片

测试

训练后,可以预览推理结果。

注意,模型当前并未在设备上运行。实际上,我们只是在用设备捕捉图像,并使用在 Studio 中运行的训练模型进行实时预览。

现在是真正在设备上部署模型的时候了:

部署

部署到设备上选择训练好的模型,选择 Grove Vision AI V2:

Studio 将带我们转到视觉工作空间标签。确认部署,选择合适的端口,并连接:

模型将被烧录到设备中。自动重置后,模型将在设备上开始运行。在设备日志中,我们可以看到推理的延迟约为 8 ms,对应每秒 125 帧(FPS)

此外,请注意,可以调整模型的置信度。

要运行图像分类模型,Grove Vision AI V2 在 5.24V 下的峰值电流为 80mA,导致功耗为 420mW

保存模型

在 SenseCraft AI Studio 中可以保存模型。Studio 将保留所有我们的模型,这些模型可以在以后部署。为此,返回到训练标签并选择按钮[保存到 SenseCraft]:

摘要

在这个实验室中,我们使用Seeed Studio Grove Vision AI 模块 V2探索了几个计算机视觉(CV)应用,展示了它作为一款专为嵌入式机器学习应用设计的强大而紧凑设备的卓越能力。

性能卓越:Grove Vision AI V2 在多个计算机视觉任务中表现出色。凭借其Himax WiseEye2 芯片,该芯片具有双核 Arm Cortex-M55 和集成的 ARM Ethos-U55 神经网络单元,设备提供了:

  • 图像分类15 ms推理时间(67 FPS)

  • 物体检测(人物)48 ms 到 76 ms推理时间(21 FPS 到 13 FPS)

  • 姿态检测121 ms实时关键点检测,17 关节跟踪(8 FPS)

能效领先:Grove Vision AI V2 最引人注目的优势之一是其卓越的能效。比较测试显示,与传统嵌入式平台相比有显著改进:

  • Grove Vision AI V2:峰值功耗 80 mA(410 mW),(60+ FPS)

  • XIAO ESP32S3:执行类似的 CV 任务(图像分类)523 mW(3+ FPS)

实际应用:通过一个全面的端到端项目展示了设备的通用性,包括数据集创建、模型训练、部署和离线推理。

开发者友好生态系统:SenseCraft AI Studio 凭借其无代码部署和集成能力,为定制应用程序提供了对 Grove Vision AI V2 的访问,使得初学者和高级开发者都能使用。丰富的预训练模型库和自定义模型部署支持为各种应用提供了灵活性。

Grove Vision AI V2 代表了边缘 AI 硬件的重大进步,它以紧凑、节能的包装形式提供了专业级的计算机视觉能力,使嵌入式应用在工业、物联网和教育领域的 AI 部署民主化。

关键要点

本实验室证明,复杂的计算机视觉应用不仅限于基于云的解决方案或能耗高的硬件,如 Raspberry Pi 或 Jetson Nanos——它们现在可以以出色的效率和性能在边缘有效部署。

可选,我们可以使用XIAO 视觉 AI 相机。这个创新的视觉解决方案无缝结合了 Grove Vision AI V2 模块、XIAO ESP32-C3 控制器和 OV5647 相机,所有这些都被封装在一个定制的 3D 打印外壳中:

图片

资源

SenseCraft AI Studio 指令.

SenseCraft-Web-Toolkit 网站

SenseCraft AI Studio

Himax AI Web Toolkit

Himax 示例

图像分类

使用 Seeed Studio Grove Vision AI 模块 V2 (Himax WiseEye2)

图片

在这个实验中,我们将探索使用 Seeed Studio Grove Vision AI 模块 V2 进行图像分类,这是一个专为嵌入式机器学习应用设计的强大而紧凑的设备。基于Himax WiseEye2芯片,该模块旨在使边缘设备具备 AI 功能,使其成为边缘机器学习(ML)应用的理想工具。

简介

到目前为止,我们已经探索了 Seeed Studio 之前上传的几个计算机视觉模型,或者使用 SenseCraft AI Studio 进行图像分类,而没有选择一个特定的模型。现在,让我们从头开始开发我们的图像分类项目,我们将选择我们的数据和模型。

下面,我们可以看到项目的主要步骤以及我们将如何与它们一起工作:

图片

项目目标

任何机器学习(ML)项目的第一步是定义目标。在这种情况下,目标是检测和分类单个图像中存在的两个特定对象。对于这个项目,我们将使用两个小玩具:一个机器人和一只小型巴西鹦鹉(命名为Periquito)。此外,我们还将收集两个对象不存在的背景图像。

图片

数据收集

在定义了机器学习项目目标后,数据集收集是下一个且最重要的步骤。假设你的项目使用的是公开数据集上的图像,例如,用于人员检测项目。在这种情况下,你可以下载Wake Vision数据集用于项目。

但是,在我们的情况下,我们定义了一个图像在公共领域不存在的项目,因此我们需要生成它们。我们可以使用手机、计算机摄像头或其他设备来拍摄照片,离线或连接到 Edge Impulse Studio。

如果你想使用 Grove Vision AI V2 捕获你的数据集,你可以像之前实验中那样使用 SenseCraft AI Studio,或者使用我们将在本实验的后处理/获取视频流部分中描述的camera_web_server草图。

图片

在这个实验中,我们将使用 SenseCraft AI Studio 来收集数据集。

使用 SenseCraft AI Studio 收集数据

在 SenseCraft AI Studio 上:让我们打开训练标签页。

默认情况下,如果可用,将使用 WebCam 训练一个分类模型。让我们选择Grove Vision AI V2。按下绿色按钮[连接](1),将出现一个弹出窗口。选择相应的端口(2),然后按下蓝色按钮[连接](3)

图片

将显示来自 Grove Vision AI V2 的图像流。

图像收集

让我们创建类别,例如,按照字母顺序排列:

  • Class1: 背景

  • Class 2: 小鹦鹉

  • 第 3 类:机器人

文件 745

选择一个类别(注意窗口周围将有一个绿色线条)并持续按下预览区域下的绿色按钮。收集的图像将出现在图像样本屏幕上。

文件 746

收集图像后,检查它们,并在必要时删除任何错误的图像。

文件 747

从每个类别收集大约 50 张图像。收集完三个类别后,打开每个类别的菜单并选择 Export Data

文件 748

在计算机的下载区域,我们将获得三个 zip 文件,每个文件都对应一个类名。每个 zip 文件包含一个包含图像的文件夹。

将数据集上传到 Edge Impulse Studio

我们将使用 Edge Impulse Studio 来训练我们的模型。Edge Impulse 是边缘设备上机器学习的领先开发平台。

  • 在 Edge Impulse 输入您的账户凭证(或创建一个免费账户)。

  • 接下来,创建一个新的项目:

文件 749

数据集大约包含每个标签 50 张图像,其中 40 张用于训练,10 张用于测试。

脉冲设计和预处理

脉冲设计

一个脉冲会提取原始数据(在这种情况下,图像),提取特征(调整图片大小),然后使用学习块对新数据进行分类。

将图像分类是深度学习最常见应用,但完成这项任务需要大量的数据。我们每个类别大约有 50 张图像。这个数量足够吗?根本不够!我们需要数千张图像来“教学”或“建模”每个类别,以便我们能够区分它们。然而,我们可以通过使用数千张图像重新训练一个先前训练好的模型来解决这个问题。我们将这种技术称为“迁移学习”(TL)。使用 TL,我们可以在我们的数据上微调预训练的图像分类模型,即使是在相对较小的图像数据集上也能实现良好的性能,就像我们的情况一样。

文件 750

因此,从原始图像开始,我们将调整它们的大小(96x96)像素,并将它们输入到我们的迁移学习块中:

文件 751

为了比较,我们将保持图像大小为 96 x 96。然而,请注意,使用 Grove Vision AI 模块 V2 及其内部 2.4 MB 的 SRAM,可以使用更大的图像(例如,160 x 160)。

还在右上角选择 Target 设备(Himax WiseEye2 (M55 400 MHz + U55))。

预处理(特征生成)

除了调整图像大小外,我们还可以将它们转换为灰度或保留它们的原始 RGB 颜色深度。让我们在“图像”部分选择 [RGB]。这样做,每个数据样本将具有 27,648 个特征维度(96x96x3)。按下 [Save Parameters] 将打开一个新标签页,Generate Features。按下 [Generate Features] 按钮以生成特征。

模型设计、训练和测试

2007 年,谷歌推出了MobileNetV1。2018 年,推出了MobileNetV2:倒置残差和线性瓶颈,2019 年推出了 V3。MobileNet 是一系列通用计算机视觉神经网络,专为移动设备设计,以支持分类、检测和其他应用。MobileNets 是小型、低延迟、低功耗的模型,参数化以满足各种用例的资源限制。

尽管基础 MobileNet 架构已经紧凑且具有低延迟,但特定的用例或应用可能经常需要模型更小、更快。MobileNets 引入了一个简单的参数,α(alpha),称为宽度乘数,以构建这些更小、计算成本更低的模型。宽度乘数α的作用是在每一层均匀地瘦化网络。

Edge Impulse Studio 提供了 MobileNet V1(96x96 图像)和 V2(96x96 和 160x160 图像),具有几个不同的α值(从 0.05 到 1.0)。例如,您将使用 V2,160x160 图像,α=1.0 获得最高的准确性。当然,这里有一个权衡。准确性越高,运行模型所需的内存(大约 1.3M RAM 和 2.6M ROM)就越多,这意味着更大的延迟。在 MobileNet V1 和α=0.10 的情况下,将获得更小的占用空间(大约 53.2K RAM 和 101K ROM)。

为了比较,我们将使用MobileNet V2 0.1作为我们的基础模型(但也可以使用具有更大 alpha 值的模型)。我们的模型在输出层之前的最底层将有 8 个神经元,并具有 10%的 dropout 率以防止过拟合。

另一个与深度学习一起使用的必要技术是数据增强。数据增强是一种方法,可以通过创建额外的合成数据来帮助提高机器学习模型的准确性。数据增强系统在训练过程中对训练数据进行小的、随机的更改(例如翻转、裁剪或旋转图像)。

设置超参数:

  • 迭代次数:20,

  • 批处理大小:32

  • 学习率:0.0005

  • 验证集大小:20%

训练结果:

图片

模型配置文件预测需要146 KB 的 RAM 和 187 KB 的闪存,这表明 Grove AI 视觉(V2)没有问题,它几乎有 2.5 MB 的内部 SRAM。此外,工作室还指出大约 4 毫秒的延迟

尽管如此,当使用备用数据进行测试时,验证集的准确率为 100%,我们确认使用量化(Int8)训练模型的准确率为 81%。然而,对于我们在实验室中的目的来说,这是足够的。

模型部署

在“部署”选项卡上,我们应该选择:Seeed Grove 视觉 AI 模块 V2 (Himax WiseEye2)并点击 [构建]。一个 ZIP 文件将被下载到我们的电脑上。

Zip 文件包含model_vela.tflite,这是一个使用 Vela 编译器优化的 TensorFlow Lite(TFLite)模型,Vela 编译器是由 Arm 开发的工具,用于将 TFLite 模型适配到 Ethos-U NPUs。

图片

我们可以按照README.txt中的说明来闪存模型,或者使用 SenseCraft AI Studio。我们将使用后者。

在 SenseCraft AI Studio 上部署模型

在 SenseCraft AI Studio 上,转到Vision Workspace标签,并连接设备:

图片

您应该看到最后上传到设备上的模型。选择绿色按钮 [上传模型]。一个弹出窗口将要求输入模型名称模型文件以及输入类名(对象)。我们应该使用按字母顺序排列的标签:0: background1: periquito2: robot,然后按 [Send]

图片

几秒钟后,模型将被上传(闪存)到我们的设备上,相机图像将实时出现在预览区域。分类结果将在图像预览下方显示。您还可以使用设置中的光标选择您的推理的置信度阈值

设备日志器中,我们可以查看串行监视器,在那里我们可以观察到延迟,预处理大约为 1 到 2 毫秒,推理大约为 4 到 5 毫秒,与 Edge Impulse Studio 中的估计相一致。

图片

这里是其他截图:

图片

此模型的功耗约为 70 mA,相当于 0.4 W。

图像分类(非官方)基准

几种开发板可用于嵌入式机器学习(tinyML),其中最常见(到目前为止)用于计算机视觉应用(低功耗)的是ESP32 CAMSeeed XIAO ESP32S3 Sense和 Arduino Nicla Vision

利用这个机会,一个类似训练的模型,MobilenetV2 96x96,alpha 值为 0.1,也被部署到了 ESP-CAM、XIAO 和 Raspberry Pi Zero W2 上。以下是结果:

图片

Grove Vision AI V2 配备ARM Ethos-U55比 ARM-M7 的设备快约 14 倍,比 Xtensa LX6(ESP-CAM)快 100 多倍。即使与拥有更强大 CPU 的 Raspberry Pi 相比,U55 也能将延迟减少近一半。此外,功耗低于其他设备(有关功耗比较,请参阅此处完整文章)。

后处理

现在我们已经将模型上传到板子上并且工作正常,正在对图像进行分类,让我们连接一个主设备以将其推理结果导出到它,并完全离线(断开与 PC 的连接,例如,由电池供电)查看结果。

注意,我们可以使用任何微控制器作为主控制器,例如 XIAO、Arduino 或 Raspberry Pi。

获取视频流

图像处理和模型推理在 Grove Vision AI (V2) 本地处理,我们希望结果通过 IIC 输出到 XIAO (主控制器)。为此,我们将使用 Arduino SSMA 库。这个库的主要目的是处理 Grove Vision AI 的数据流,不涉及模型推理。

Grove Vision AI (V2) 通过 IIC 与 XIAO 通信(推理结果);设备的 IIC 地址是 0x62。图像信息传输通过 USB 串行端口。

步骤 1:从其 GitHub 下载 Arduino SSMA 库作为 zip 文件:

步骤 2:在 Arduino IDE 中安装它(sketch > Include Library > Add .Zip Library)。

步骤 3:安装 ArduinoJSON 库

步骤 4:安装 Eigen 库

步骤 3:现在,通过设备背面的插座(一排引脚)连接 XIAO 和 Grove Vision AI (V2)。

注意:请注意连接的方向,Grove Vision AI 的 Type-C 连接器应与 XIAO 的 Type-C 连接器方向一致。

步骤 5:将 XIAO USB-C 端口连接到您的计算机

步骤 6:在 Arduino IDE 中选择 Xiao 板和相应的 USB 端口。

一旦我们想要将视频流式传输到网页,我们将使用具有 Wi-Fi 和足够内存处理图像的 XIAO ESP32S3。选择 XIAO_ESP32S3 和合适的 USB 端口:

默认情况下,PSRAM 是禁用的。打开 Tools 菜单,在 PSRAM: "OPI PSRAM" 选择 OPI PSRAM

步骤 7:在 Arduino IDE 中打开示例:

文件 -> 示例 -> Seeed_Arduino_SSCMA -> camera_web_server

并在 camera_web_server.ino 草图中编辑 ssidpassword 以匹配 Wi-Fi 网络。

步骤 8:将草图上传到板子并打开串行监视器。当连接到 Wi-Fi 网络,板子的 IP 地址将显示出来。

使用网页浏览器打开地址。将有一个视频应用可用。要查看 来自 Grove Vision AI V2 的视频流,请按 [Sample Only][Start Stream]

如果你想创建一个图像数据集,可以使用这个应用,保存设备生成的视频帧。按下 [Save Frame],图像将被保存在我们桌面下载区域。

在未选择 [Sample Only] 的情况下打开应用 不选择,推理结果应显示在视频屏幕上,但这种情况在图像分类中不会发生。对于目标检测或姿态估计,结果会嵌入视频流中。

例如,如果模型是使用 YoloV8 进行的人脸检测:

获取推理结果

  • 前往 文件 -> 示例 -> Seeed_Arduino_SSCMA -> inference_class

  • 将草图上传到板子上,并打开串行监视器。

  • 将摄像头对准我们的其中一个物体,我们可以在串行终端上看到推理结果。

在 Arduino IDE 上运行的推理平均消耗为 160 mA 或 800 mW,峰值消耗为 330 mA 1.65 W,当将图像发送到应用程序时。

LED 后处理

我们后处理背后的想法是,每当检测到特定的图像(例如,Periquito - 标签:1),用户 LED 将打开。如果检测到机器人或背景,LED 将关闭。

复制以下代码并将其粘贴到您的 IDE 中:

#include <Seeed_Arduino_SSCMA.h>
SSCMA AI;

void setup()
{
    AI.begin();

    Serial.begin(115200);
    while (!Serial);
    Serial.println("Inferencing - Grove AI V2 / XIAO ESP32S3");

    // Pins for the built-in LED
    pinMode(LED_BUILTIN, OUTPUT);
    // Ensure the LED is OFF by default.
    // Note: The LED is ON when the pin is LOW, OFF when HIGH.
    digitalWrite(LED_BUILTIN, HIGH);
}

void loop()
{
    if (!AI.invoke()){
        Serial.println("\nInvoke Success");
        Serial.print("Latency [ms]: prepocess=");
        Serial.print(AI.perf().prepocess);
        Serial.print(", inference=");
        Serial.print(AI.perf().inference);
        Serial.print(", postpocess=");
        Serial.println(AI.perf().postprocess);
        int pred_index = AI.classes()[0].target;
        Serial.print("Result= Label: ");
        Serial.print(pred_index);
        Serial.print(", score=");
        Serial.println(AI.classes()[0].score);
        turn_on_led(pred_index);
    }
}

/**
* @brief turn_off_led function - turn-off the User LED
*/
void turn_off_led(){
    digitalWrite(LED_BUILTIN, HIGH);
}

/**
* @brief turn_on_led function used to turn on the User LED
* @param[in]  pred_index
*             label 0: [0] ==> ALL OFF
*             label 1: [1] ==> LED ON
*             label 2: [2] ==> ALL OFF
*             label 3: [3] ==> ALL OFF
*/
void turn_on_led(int pred_index) {
    switch (pred_index)
    {
        case 0:
            turn_off_led();
            break;
        case 1:
            turn_off_led();
            digitalWrite(LED_BUILTIN, LOW);
            break;
        case 2:
            turn_off_led();
            break;
        case 3:
            turn_off_led();
            break;
    }
}

此草图使用 Seeed_Arduino_SSCMA.h 库与 Grove Vision AI 模块 V2 交互。AI 模块和 LED 在 setup() 函数中初始化,并开始串行通信。

loop() 函数会反复调用 invoke() 方法,使用 Grove Vision AI 模块 V2 内置算法进行推理。推理成功后,草图会将性能指标打印到串行监视器,包括预处理、推理和后处理时间。

草图处理并打印出有关推理结果的详细信息:

  • (AI.classes()[0]) 识别图像的类别(.target)及其置信度分数(.score)。

  • 推理结果(类别)存储在整数变量 pred_index 中,它将被用作 turn_on_led() 函数的输入。因此,LED 将根据分类结果打开。

这里是结果:

如果检测到 Periquito(标签:1),LED 将打开:

如果检测到机器人(标签:2)LED 将关闭(与背景(标签:0)相同):

因此,我们现在可以使用外部电池为 Grove Vision AI V2 + Xiao ESP32S3 提供电源,并且推理结果将完全离线通过 LED 显示。消耗量约为 165 mA 或 825 mW。

还可以通过 WiFi、BLE 或其他在所使用的主设备上可用的通信协议发送结果。

可选:在外部设备上进行后处理

当然,与 EdgeAI 一起工作的一个显著优势是设备可以完全断开与云的连接,从而实现与真实世界的无缝交互。我们在上一节中做到了这一点,但使用的是内部 Xiao LED。现在,我们将连接外部 LED(可以是任何执行器)。

LED 应通过一个 220 欧姆的电阻连接到 XIAO 地面。

策略是修改之前的草图以处理三个外部 LED。

目标:每当检测到 Periquito 的图像时,LED 绿灯 将打开;如果是 机器人,LED 黄灯 将打开;如果是 背景红灯 将打开。

图像处理和模型推理在 Grove Vision AI(V2)本地处理,我们希望结果通过 IIC 输出到 XIAO。为此,我们将再次使用 Arduino SSMA 库。

这里是使用的草图:

#include <Seeed_Arduino_SSCMA.h>
SSCMA AI;

// Define the LED pin according to the pin diagram
// The LEDS negative lead should be connected to the XIAO ground
// via a 220-ohm resistor.
int LEDR = D1; # XIAO ESP32S3 Pin 1
int LEDY = D2; # XIAO ESP32S3 Pin 2
int LEDG = D3; # XIAO ESP32S3 Pin 3

  void setup()
{
    AI.begin();

    Serial.begin(115200);
    while (!Serial);
    Serial.println("Inferencing - Grove AI V2 / XIAO ESP32S3");

// Initialize the external LEDs
    pinMode(LEDR, OUTPUT);
    pinMode(LEDY, OUTPUT);
    pinMode(LEDG, OUTPUT);
    // Ensure the LEDs are OFF by default.
    // Note: The LEDs are ON when the pin is HIGH, OFF when LOW.
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDY, LOW);
    digitalWrite(LEDG, LOW);
}

void loop()
{
    if (!AI.invoke()){
        Serial.println("\nInvoke Success");
        Serial.print("Latency [ms]: prepocess=");
        Serial.print(AI.perf().prepocess);
        Serial.print(", inference=");
        Serial.print(AI.perf().inference);
        Serial.print(", postpocess=");
        Serial.println(AI.perf().postprocess);
        int pred_index = AI.classes()[0].target;
        Serial.print("Result= Label: ");
        Serial.print(pred_index);
        Serial.print(", score=");
        Serial.println(AI.classes()[0].score);
        turn_on_leds(pred_index);
    }
}

/**
* @brief turn_off_leds function - turn-off all LEDs
*/
void turn_off_leds(){
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDY, LOW);
    digitalWrite(LEDG, LOW);
}

/**
* @brief turn_on_leds function used to turn on a specific LED
* @param[in]  pred_index
*             label 0: [0] ==> Red ON
*             label 1: [1] ==> Green ON
*             label 2: [2] ==> Yellow ON
*/
void turn_on_leds(int pred_index) {
    switch (pred_index)
    {
        case 0:
            turn_off_leds();
            digitalWrite(LEDR, HIGH);
            break;
        case 1:
            turn_off_leds();
            digitalWrite(LEDG, HIGH);
            break;
        case 2:
            turn_off_leds();
            digitalWrite(LEDY, HIGH);
            break;
        case 3:
            turn_off_leds();
            break;
    }
}

我们应该使用 Grove Vision AI V2 的 I2C Grove 连接器将其与 XIAO 连接。对于 XIAO,我们将使用 扩展板来方便连接(尽管可以直接将 I2C 连接到 XIAO 的引脚上)。我们将使用 USB-C 连接器为板供电,但也可以使用电池。

这里是结果:

功耗达到了峰值 240 mA(绿色 LED),相当于 1.2 W。驱动黄色和红色 LED 消耗 14 mA,相当于 0.7 W。通过串行向终端发送信息对功耗没有影响。

摘要

在这个实验室中,我们探讨了使用 Himax WiseEye2 芯片驱动的 Seeed Studio Grove Vision AI 模块 V2 开发图像分类系统的完整过程。我们走过了机器学习工作流程的每一个阶段,从定义我们的项目目标到部署具有现实交互的工作模型。

Grove Vision AI V2 表现出令人印象深刻的性能,推理时间仅为 4-5ms,显著优于其他常见的 tinyML 平台。我们的基准比较表明,它比 ARM-M7 设备快约 14 倍,比 Xtensa LX6(ESP-CAM)快 100 多倍。即使与 Raspberry Pi Zero W2 相比,Edge TPU 架构在消耗更少能量的同时提供了近两倍的速度。

通过这个项目,我们看到了迁移学习如何使我们能够使用相对较小的自定义图像数据集实现良好的分类结果。具有 alpha 值 0.1 的 MobileNetV2 模型为我们三个类别的难题提供了精确性和效率之间的出色平衡,仅需要 146 KB 的 RAM 和 187 KB 的闪存,完全在 Grove Vision AI 模块 V2 的 2.4 MB 内部 SRAM 能力范围内。

我们还探索了多种部署选项,从通过 SenseCraft AI Studio 查看推理结果到使用 LED 创建具有视觉反馈的独立系统。将视频流式传输到网页浏览器并本地处理推理结果的能力展示了边缘 AI 系统在实际应用中的多功能性。

我们最终系统的功耗保持得令人印象深刻,从基本推理的约 70mA(0.4W)到驱动外部组件时的 240mA(1.2W)。这种效率使 Grove Vision AI 模块 V2 成为电池供电应用中的绝佳选择,在这些应用中,功耗至关重要。

这个实验室已经证明,复杂的计算机视觉任务现在可以在边缘端完全执行,无需依赖云服务或强大的计算机。借助 Edge Impulse Studio 和 SenseCraft AI Studio 等工具,开发过程甚至对没有广泛机器学习专业知识的人来说也变得可行。

随着边缘人工智能技术的持续发展,我们可以期待来自紧凑、节能设备(如 Grove Vision AI 模块 V2)的更强大功能,这将为智能传感器、物联网应用以及日常物体中的嵌入式智能开辟新的可能性。

资源

使用 SenseCraft AI Studio 收集图像.

Edge Impulse Studio 项目

SenseCraft AI Studio - 视觉工作空间(部署模型)

其他 Himax 示例

Arduino 草图

目标检测

本实验室正在开发中

概述

这些实验室提供了宝贵的动手经验,使用机器学习系统,利用树莓派平台的灵活性和易用性。与需要大量云资源的大规模模型工作不同,这些练习允许您直接在紧凑而强大的边缘计算环境中与硬件和软件进行交互。通过利用树莓派从高效的 Zero 到更坚固的 4 或 5 型号的能力,您将获得在边缘部署 AI 的实用见解。这种方法提供了在资源受限环境中实施机器学习解决方案的挑战和机遇的切实理解。虽然我们在较小的规模上工作,但您将学习的原理和技术与在更大系统中使用的原理和技术基本相似。树莓派运行整个操作系统的能力及其广泛的 GPIO 功能,为将理论知识与实际应用之间的差距连接起来提供了丰富的学习体验。通过这些实验室,您将掌握 EdgeML 的复杂性,并发展适用于广泛 AI 部署场景的技能。

树莓派 Zero 2-W 和带摄像头的树莓派 5

前提条件

  • 树莓派: 确保您至少有一块以下板子:用于 Vision Labs 的树莓派 Zero 2 W、树莓派 4 或 5,以及用于 GenAi labs 的树莓派 5。

  • 电源适配器: 用于给板子供电。

    • 树莓派 Zero 2-W:2.5 W,带 Micro-USB 适配器

    • 树莓派 4 或 5:3.5 W,带 USB-C 适配器

  • 网络: 用于下载必要的软件和远程控制板子。

  • SD 卡(至少 32 GB)和 SD 卡适配器: 用于树莓派操作系统。

设置

  • 设置树莓派

练习

模态 任务 描述 链接
视觉 图像分类 学习对图像进行分类 链接
视觉 物体检测 实现物体检测 链接
通用人工智能 小型语言模型 在边缘部署 SLMs 链接
通用人工智能 视觉语言模型 在边缘部署 VLMs 链接

设置

图片

DALL·E 提示 - 一个受 20 世纪 50 年代启发的电子实验室环境,采用卡通风格。实验室应配备复古设备、大型示波器、老式收音机和大型、方形的计算机。Raspberry Pi 5 板显著展示,准确展示了其实际尺寸,类似于信用卡,在工作台上。Pi 板周围环绕着经典的实验室工具,如烙铁、电阻和电线。整体场景应充满活力,具有卡通特有的夸张色彩和趣味细节。不应包含任何标志或文本。

本章将指导您设置 Raspberry Pi Zero 2 W(Raspi-Zero)和 Raspberry Pi 5(Raspi-5)型号。我们将涵盖硬件设置、操作系统安装、初始配置和测试。

Raspi-5的一般说明也适用于较老的 Raspberry Pi 版本,如 Raspi-3 和 Raspi-4。

概述

Raspberry Pi 是一款功能强大且多功能的单板计算机,已成为各个学科工程师的必备工具。由Raspberry Pi 基金会开发,这些紧凑型设备提供了独特的性价比、计算能力和广泛的 GPIO(通用输入/输出)功能,使其成为原型设计、嵌入式系统开发和高级工程项目的理想选择。

关键特性

  1. 计算能力:尽管体积小巧,Raspberry Pi 提供了显著的计算能力,最新型号配备了多核 ARM 处理器,最高可达 8 GB RAM。

  2. GPIO 接口:40 引脚 GPIO 接口允许直接与传感器、执行器和其他电子组件交互,促进硬件和软件集成项目。

  3. 广泛的连接性:内置 Wi-Fi、蓝牙、以太网和多个 USB 端口,可实现多样化的通信和网络项目。

  4. 低级硬件访问:Raspberry Pi 提供了访问 I2C、SPI 和 UART 等接口的能力,允许对外部设备进行详细控制和通信。

  5. 实时能力:通过适当的配置,Raspberry Pi 可用于软实时应用,使其适用于控制系统和信号处理任务。

  6. 功率效率:低功耗使得电池供电和节能设计成为可能,尤其是在像 Pi Zero 这样的型号中。

Raspberry Pi 型号(本书涵盖)

  1. Raspberry Pi Zero 2 W (Raspi-Zero):

    • 适用范围:紧凑型嵌入式系统

    • 关键规格:1 GHz 单核 CPU(ARM Cortex-A53),512 MB RAM,功耗低

  2. Raspberry Pi 5 (Raspi-5):

    • 适用范围:更复杂的应用,如边缘计算、计算机视觉和边缘 AI 应用,包括 LLMs。

    • 关键规格:2.4 GHz 四核 CPU(ARM Cortex A-76),最高 8 GB RAM,支持 PCIe 接口的扩展

工程应用

  1. 嵌入式系统设计:开发和原型化嵌入式系统,用于实际应用。

  2. 物联网和网络设备:创建互联设备,并探索 MQTT、CoAP 和 HTTP/HTTPS 等协议。

  3. 控制系统:实现反馈控制回路、PID 控制器,并与执行器接口。

  4. 计算机视觉和 AI:利用 OpenCV 和 TensorFlow Lite 等库进行边缘图像处理和机器学习。

  5. 数据采集和分析:收集传感器数据,进行实时分析,并创建数据记录系统。

  6. 机器人技术:构建机器人控制器,实现运动规划算法,并与电机驱动器接口。

  7. 信号处理:执行实时信号分析、滤波和 DSP 应用。

  8. 网络安全:设置 VPN、防火墙,并探索网络渗透测试。

本教程将指导您设置最常用的 Raspberry Pi 型号,使您能够快速开始机器学习项目。我们将涵盖硬件设置、操作系统安装和初始配置,重点关注为 Pi 准备机器学习应用。

硬件概述

Raspberry Pi Zero 2W

图片

  • 处理器:1 GHz 四核 64 位 Arm Cortex-A53 CPU

  • RAM:512 MB SDRAM

  • 无线:2.4 GHz 802.11 b/g/n 无线局域网,蓝牙 4.2,BLE

  • 端口:迷你 HDMI,微型 USB OTG,CSI-2 摄像头连接器

  • 电源:通过微型 USB 端口供电 5 V

Raspberry Pi 5

图片

  • 处理器:

    • Pi 5:四核 64 位 Arm Cortex-A76 CPU @ 2.4 GHz

    • Pi 4:四核 Cortex-A72(ARM v8)64 位 SoC @ 1.5 GHz

  • RAM:2 GB、4 GB 或 8 GB 选项(AI 任务推荐 8 GB)

  • 无线:双频段 802.11ac 无线,蓝牙 5.0

  • 端口:2 个微型 HDMI 端口,2 个 USB 3.0 端口,2 个 USB 2.0 端口,CSI 摄像头端口,DSI 显示端口

  • 电源:通过 USB-C 连接器供电 5 V DC(3A)

在实验室中,我们将使用不同的名称来称呼 Raspberry:RaspiRaspi-5Raspi-Zero等。通常,Raspi用于指令或注释适用于每个型号的情况。

安装操作系统

操作系统(OS)

操作系统(OS)是一种基本软件,它管理计算机的硬件和软件资源,为计算机程序提供标准服务。它是运行在计算机上的核心软件,作为硬件和应用软件之间的中介。操作系统管理计算机的内存、进程、设备驱动程序、文件和安全协议。

  1. 主要功能

    • 进程管理:为不同的程序分配 CPU 时间

    • 内存管理:根据需要分配和释放内存

    • 文件系统管理:组织和跟踪文件和目录

    • 设备管理:与连接的硬件设备通信

    • 用户界面:为用户提供与计算机交互的方式

  2. 组件

    • 内核:管理硬件资源的操作系统核心

    • Shell:与操作系统交互的用户界面

    • 文件系统:组织和管理工作存储

    • 设备驱动程序:允许操作系统与硬件通信的软件

Raspberry Pi 运行的是专为嵌入式系统设计的 Linux 专用版本。这个操作系统通常是 Debian 的一个变种,称为 Raspberry Pi OS(以前称为 Raspbian),针对 Pi 的 ARM 架构和有限资源进行了优化。

Raspberry Pi OS 的最新版本基于Debian Bookworm

关键特性

  1. 轻量级:针对 Pi 的硬件高效运行。

  2. 多功能:支持广泛的应⽤程序和编程语言。

  3. 开源:允许自定义和社区驱动的改进。

  4. GPIO 支持:通过 Pi 的引脚与传感器和其他硬件进行交互。

  5. 定期更新:持续改进性能和安全。

Raspberry Pi 上的嵌入式 Linux 提供了一个功能齐全的操作系统,体积紧凑,非常适合从简单的物联网设备到更复杂的边缘机器学习应用的各种项目。它与标准 Linux 工具和库的兼容性使其成为开发和实验的强大平台。

安装

要使用 Raspberry Pi,我们需要一个操作系统。默认情况下,Raspberry Pi 会在任何插入插槽的 SD 卡上检查操作系统,因此我们应该使用Raspberry Pi Imager安装操作系统。

Raspberry Pi Imager是用于在macOSWindowsLinux上下载和写入镜像的工具。它包括许多适用于 Raspberry Pi 的流行操作系统镜像。我们还将使用 Imager 来预配置凭证和远程访问设置。

按照以下步骤在您的 Raspi 上安装操作系统。

  1. 下载并在您的计算机上安装 Raspberry Pi Imager。

  2. 将一张 microSD 卡插入您的计算机(推荐使用 32GB SD 卡)。

  3. 打开 Raspberry Pi Imager 并选择您的 Raspberry Pi 型号。

  4. 选择适当的操作系统:

    • 对于 Raspi-Zero:例如,您可以选择:Raspberry Pi OS Lite (64-bit)

img

由于其减少的 SDRAM(512 MB),Raspi-Zero 推荐的操作系统是 32 位版本。但是,为了运行一些机器学习模型,例如 Ultralytics 的 YOLOv8,我们应该使用 64 位版本。尽管 Raspi-Zero 可以运行桌面,但我们将选择 LITE 版本(无桌面)以减少常规操作所需的 RAM。

  • 对于Raspi-5:我们可以选择包含桌面的完整 64 位版本:Raspberry Pi OS (64-bit)

  1. 选择您的 microSD 卡作为存储设备。

  2. 点击下一步然后点击齿轮图标以访问高级选项。

  3. 设置主机名,Raspi 用户名和密码,配置WiFi启用 SSH(非常重要!)

  1. 将镜像写入 microSD 卡。

在以下示例中,我们将根据所使用的设备使用不同的主机名:raspi、raspi-5、raspi-Zero 等。如果您使用的是这些中的一个,请将其替换。

初始配置

  1. 将 microSD 卡插入您的 Raspberry Pi。

  2. 连接电源以启动 Raspberry Pi。

  3. 请等待初始引导过程完成(可能需要几分钟)。

您可以在这里这里找到与 Raspi 一起使用的最常见 Linux 命令。

远程访问

SSH 访问

与 Raspi-Zero 交互的最简单方法是 SSH(“无头”)。您可以使用终端(MAC/Linux)、PuTTy (Windows)或任何其他。

  1. 查找您的 Raspberry Pi 的 IP 地址(例如,检查您的路由器)。

  2. 在您的计算机上打开一个终端并通过 SSH 连接:

    ssh username@[raspberry_pi_ip_address]
    

    或者,如果您没有 IP 地址,您可以尝试以下操作:bash ssh username@hostname.local 例如,ssh mjrovai@rpi-5.localssh mjrovai@raspi.local 等。

    img

    当您看到提示:

    mjrovai@rpi-5:~ $
    

    这意味着您正在远程与您的 Raspi 交互。定期更新/升级系统是一个好习惯。为此,您应该运行:

    sudo apt-get update
    sudo apt upgrade
    

    您应该确认 Raspi 的 IP 地址。在终端中,您可以使用:

    hostname -I
    

通过终端关闭 Raspi:

当您想要关闭 Raspberry Pi 时,除了拔掉电源线之外,还有更好的方法。这是因为 Raspi 可能仍在向 SD 卡写入数据,在这种情况下,仅仅关闭电源可能会导致数据丢失,甚至更糟的是,SD 卡损坏。

为了安全关机,请使用命令行:

sudo shutdown -h now

为了避免可能的数据丢失和 SD 卡损坏,在断电之前,您应该在关闭后等待几秒钟,直到 Raspberry Pi 的 LED 停止闪烁并变暗。一旦 LED 熄灭,就可以安全地关闭电源。

在 Raspi 和计算机之间传输文件

使用 U 盘、直接在终端(使用 scp)或通过网络上的 FTP 程序在 Raspi 和我们的主计算机之间传输文件。

使用安全复制协议(scp):

将文件复制到您的 Raspberry Pi

让我们在计算机上创建一个文本文件,例如,test.txt

您可以使用任何文本编辑器。在同一个终端中,一个选项是nano

要将名为test.txt的文件从您的个人计算机复制到 Raspberry Pi 上的用户主目录,请从包含test.txt的目录运行以下命令,将<username>占位符替换为您用于登录 Raspberry Pi 的用户名,将<pi_ip_address>占位符替换为您的 Raspberry Pi 的 IP 地址:

$ scp test.txt <username>@<pi_ip_address>:~/

注意,~/表示我们将文件移动到 Raspi 的根目录。您可以选择 Raspi 中的任何文件夹。但在运行scp之前,您应该创建文件夹,因为scp不会自动创建文件夹。

例如,让我们将文件test.txt传输到我的 Raspi-zero 的根目录,其 IP 地址为192.168.4.210

scp test.txt mjrovai@192.168.4.210:~/

我使用不同的配置文件来区分终端。上述操作发生在您的计算机上。现在,让我们转到我们的 Raspi(使用 SSH)并检查文件是否在那里:

从您的 Raspberry Pi 复制文件

要将名为test.txt的文件从 Raspberry Pi 上的用户主目录复制到另一台计算机的当前目录,请在宿主计算机上运行以下命令**:

$ scp <username>@<pi_ip_address>:myfile.txt .

例如:

在 Raspi 上,让我们创建一个带有另一个名称的文件副本:

cp test.txt test_2.txt

并且在宿主计算机(以我的 Mac 为例)

scp mjrovai@192.168.4.210:test_2.txt .

使用 FTP 传输文件

使用 FTP 传输文件,例如FileZilla FTP 客户端,也是可能的。按照说明,为您的桌面操作系统安装程序,并使用 Raspi IP 地址作为主机。例如:

sftp://192.168.4.210

并输入您的 Raspi 用户名和密码。按下快速连接将打开两个窗口,一个用于您的宿主计算机桌面(右),另一个用于 Raspi(左)。

增加 SWAP 内存

使用跨平台的交互式进程查看器htop,您可以轻松监控 Raspi 上运行的资源,例如进程列表、运行的 CPU 和实时使用的内存。要启动htop,请在终端输入以下命令:

htop

关于内存,在 Raspberry Pi 系列设备中,Raspi-Zero 的 SRAM(500 MB)最少,相比之下,Raspi 4 或 5 的选择为 2 GB 到 8 GB。对于任何 Raspi,都可以通过“SWAP”来增加系统可用的内存。SWAP 内存,也称为交换空间,是计算机操作系统在物理 RAM 完全使用时,将数据从 RAM(随机存取存储器)临时存储到 SD 卡的技术。这允许操作系统(OS)在 RAM 满时继续运行,从而可以防止系统崩溃或减慢。

SWAP 内存对 RAM 有限的设备,如 Raspi-Zero,有益。增加 SWAP 可以帮助运行更复杂的应用或进程,但与频繁磁盘访问的潜在性能影响保持平衡是至关重要的。

默认情况下,Rapi-Zero 的 SWAP(Swp)内存只有 100 MB,这对于运行一些更复杂和需求更高的机器学习应用(例如,YOLO)来说非常小。让我们将其增加到 2 MB:

首先,关闭 swap 文件:

sudo dphys-swapfile swapoff

接下来,您应该打开并更改文件/etc/dphys-swapfile。为此,我们将使用 nano:

sudo nano /etc/dphys-swapfile

搜索CONF_SWAPSIZE变量(默认为 200)并将其更新为2000

CONF_SWAPSIZE=2000

并保存文件。

接下来,再次打开 swap 文件并重新启动 Raspi-zero:

sudo dphys-swapfile setup
sudo dphys-swapfile swapon
sudo reboot

当您的设备重新启动(您应该再次使用 SSH 进入),您会意识到顶部显示的最大交换内存值现在接近 2 GB(在我的情况下,是 1.95 GB)。

要保持htop运行,您应该打开另一个终端窗口以持续与您的 Raspi 交互。

安装摄像头

Raspi 是计算机视觉应用的优秀设备;需要摄像头。我们可以使用 USB OTG 适配器(Raspi-Zero 和 Raspi-5)或连接到 Raspi CSI(摄像头串行接口)端口的摄像头模块在 micro-USB 端口上安装标准 USB 摄像头。

USB 网络摄像头通常比连接到 CSI 端口的摄像头模块质量差。它们也不能使用终端中的raspistillraspivid命令或 Python 中的picamera录制包进行控制。尽管如此,您可能出于某些原因想要将 USB 摄像头连接到 Raspberry Pi,例如,因为它更容易使用单个 Raspberry Pi 设置多个摄像头、长电缆,或者简单地因为您手头上有这样的摄像头。

安装 USB 网络摄像头

  1. 关闭 Raspi:
sudo shutdown -h no
  1. 将 USB 网络摄像头(USB 摄像头模块 30 fps,1280×7201280\times 720)连接到您的 Raspi(在这个例子中,我使用的是 Raspi-Zero,但说明适用于所有 Raspi)。

图片

  1. 再次开机并运行 SSH

  2. 要检查您的 USB 摄像头是否被识别,运行:

lsusb

您应该在输出中看到您的摄像头被列出。

图片

  1. 要使用 USB 摄像头拍摄测试照片,请使用:
fswebcam test_image.jpg

这将在您的当前目录下保存一个名为“test_image.jpg”的图片。

图片

  1. 由于我们使用 SSH 连接到我们的 Rapsi,我们必须将图像传输到我们的主计算机,以便我们可以查看它。我们可以使用 FileZilla 或 SCP 来完成此操作:

在您的宿主机上打开一个终端并运行:

scp mjrovai@raspi-zero.local:~/test_image.jpg .

将“mjrovai”替换为您的用户名,将“raspi-zero”替换为 Pi 的主机名。

图片

  1. 如果图像质量不令人满意,您可以调整各种设置;例如,定义一个适合 YOLO 的分辨率((640x640)(640x640)):
fswebcam -r 640x640 --no-banner test_image_yolo.jpg

这将捕获一个更高分辨率的图像,而不显示默认横幅。

图片

普通的 USB 网络摄像头也可以使用:

图片

使用lsusb进行验证

图片

视频流传输

对于流视频(这需要更多的资源),我们可以安装并使用 mjpg-streamer:

首先,安装 Git:

sudo apt install git

现在,我们应该安装 mjpg-streamer 所需的依赖项,克隆仓库,并继续安装:

sudo apt install cmake libjpeg62-turbo-dev
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install

然后使用以下命令启动流:

mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www"

我们可以通过打开网页浏览器并导航到以下位置来访问流:

http://<你的树莓派 IP 地址>:8080。在我的情况下:http://192.168.4.210:8080

我们应该看到一个带有查看流选项的网页。点击“Stream”链接或尝试访问:

http://<raspberry_pi_ip_address>:8080/?action=stream

图片

在 CSI 端口安装相机模块

现在有几种树莓派相机模块。原始的 500 万像素型号于 2013 年发布,随后是 2016 年发布的800 万像素相机模块 2。最新的相机型号是 2023 年发布的1200 万像素相机模块 3

原始的 500 万像素相机(Arducam OV5647)已从树莓派处停售,但可以从几个替代供应商处找到。以下是在 Raspi-Zero 上此类相机的示例。

图片

这是另一个 v2 相机模块的示例,它具有索尼 IMX219 800 万像素传感器:

图片

任何相机模块都可以在树莓派上使用,但为了这样做,必须更新configuration.txt文件:

sudo nano /boot/firmware/config.txt

在文件底部,例如,要使用 500 万像素的 Arducam OV5647 相机,添加以下行:

dtoverlay=ov5647,cam0

或者对于具有 800 万像素索尼 IMX219 相机的 v2 模块:

dtoverlay=imx219,cam0

保存文件(CTRL+O [ENTER] CRTL+X)并重启树莓派:

Sudo reboot

启动后,你可以查看相机是否被列出:

libcamera-hello --list-cameras

图片

图片

libcamera 是一个开源软件库,它支持从基于 Arm 处理器的 Linux 操作系统直接支持相机系统。它最小化了在 Broadcom GPU 上运行的专有代码。

让我们捕获一个分辨率为640×480640\times 480的 jpeg 图像进行测试,并将其保存到名为test_cli_camera.jpg的文件中

rpicam-jpeg --output test_cli_camera.jpg --width 640 --height 480

如果我们想查看保存的文件,应该使用ls -f,它会以长格式列出当前目录的所有内容。像之前一样,我们可以使用 scp 查看图像:

图片

远程运行 Raspi 桌面

尽管我们主要通过 SSH 使用终端命令与 Raspberry Pi 交互,但如果已安装完整的 Raspberry Pi OS(例如,Raspberry Pi OS (64-bit)),我们还可以远程访问整个图形桌面环境。这对于受益于图形界面的任务特别有用。要启用此功能,必须在 Raspberry Pi 上设置 VNC(虚拟网络计算)服务器。以下是操作步骤:

  1. 启用 VNC 服务器:

    • 通过 SSH 连接到您的 Raspberry Pi。

    • 通过输入以下内容运行 Raspberry Pi 配置工具:

      sudo raspi-config
      
    • 使用箭头键导航到 接口选项

  • 选择 VNC 并选择 Yes 以启用 VNC 服务器。

  • 当提示时,退出配置工具,并保存更改。

  1. 在您的计算机上安装 VNC 观看器:

    • 在您的主计算机上下载并安装一个 VNC 观看器应用程序。流行的选项包括 RealVNC Viewer、TightVNC 或 RealVNC 的 VNC Viewer。我们将安装 RealVNC 的 VNC Viewer
  2. 安装完成后,您应确认 Raspi IP 地址。例如,在终端中,您可以使用:

    hostname -I
    

  1. 连接到您的 Raspberry Pi:

    • 打开您的 VNC 观看器应用程序。

  • 输入您的 Raspberry Pi 的 IP 地址和主机名。

  • 当提示时,输入您的 Raspberry Pi 的用户名和密码。

  1. Raspberry Pi 5 桌面应出现在您的计算机监视器上。

  1. 调整显示设置(如有必要):

    • 连接后,调整显示分辨率以获得最佳观看效果。这可以通过 Raspberry Pi 的桌面设置或修改 config.txt 文件来完成。

    • 让我们使用桌面设置来完成此操作。到达菜单(左上角的小型 Raspberry 图标)并选择适合您监视器的最佳屏幕定义:

更新和安装软件

  1. 更新您的系统:

    sudo apt update && sudo apt upgrade -y
    
  2. 安装必需的软件:

    sudo apt install python3-pip -y
    
  3. 为 Python 项目启用 pip:

    sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED
    

模型特定注意事项

Raspberry Pi Zero (Raspi-Zero)

  • 处理能力有限,最适合轻量级项目

  • 使用无头设置(SSH)来节省资源会更好。

  • 考虑为内存密集型任务增加交换空间。

  • 它可用于图像分类和目标检测实验室,但不能用于 LLM (SLM)。

Raspberry Pi 4 或 5 (Raspi-4 或 Raspi-5)

  • 适用于更复杂的项目,包括人工智能和机器学习。

  • 它可以流畅地运行整个桌面环境。

  • Raspi-4 可用于图像分类和目标检测实验室,但与 LLMs (SLM) 的兼容性不佳。

  • 对于 Raspi-5,在 LLMs (SLMs) 实验室进行密集型任务时,考虑使用主动冷却器进行温度管理。

记住根据你使用的具体树莓派型号调整你的项目需求。Raspi-Zero 非常适合低功耗、空间受限的项目,而 Raspi-4 或 5 型号则更适合计算密集型任务。

图像分类

图片

DALL·E 提示 - 为树莓派教程中的“图像分类”章节设计的封面图像,采用与之前封面相同的 1950 年代电子实验室风格。场景应包括一个连接到摄像头模块的树莓派,摄像头捕捉用户提供的蓝色小机器人的照片。机器人应放置在工作台上,周围是经典的实验室工具,如烙铁、电阻和电线。实验室背景应包括示波器和管式收音机等复古设备,保持时代的详细和怀旧感。不应包含任何文本或标志。

概述

图像分类是计算机视觉中的一个基本任务,涉及将图像分类到几个预定义类别之一。它是人工智能的基石,使机器能够以模仿人类感知的方式解释和理解视觉信息。

图像分类是指根据图像的视觉内容将其分配一个标签或类别。这项任务在计算机视觉中至关重要,并在各个行业中具有广泛的应用。图像分类的重要性在于其能够自动化原本需要人类干预的视觉理解任务。

实际场景中的应用

图像分类已广泛应用于众多实际应用中,彻底改变了各个行业:

  • 医疗保健:协助进行医学图像分析,例如识别 X 光片或 MRI 中的异常。

  • 农业:通过航空图像监测作物健康和检测植物疾病。

  • 汽车行业:使高级驾驶辅助系统和自动驾驶汽车能够识别路标、行人和其他车辆。

  • 零售:提供视觉搜索功能和自动化库存管理系统。

  • 安全和监控:增强威胁检测和面部识别系统。

  • 环境监测:分析卫星图像进行森林砍伐、城市规划和气候变化研究。

在树莓派等边缘设备上运行分类的优势

在边缘设备(如树莓派)上实现图像分类具有几个显著优势:

  1. 低延迟:本地处理图像消除了将数据发送到云服务器的需求,显著减少了响应时间。

  2. 离线功能:分类可以在没有互联网连接的情况下进行,使其适用于偏远或连接困难的地区。

  3. 隐私和安全:敏感的图像数据保留在本地设备上,解决数据隐私问题和合规性要求。

  4. 成本效益:消除了对昂贵云计算资源的需求,特别是对于持续或高量级的分类任务。

  5. 可扩展性:支持分布式计算架构,其中多个设备可以独立工作或在网络中协同工作。

  6. 能效:在专用硬件上优化的模型可能比基于云的解决方案更节能,这对于电池供电或远程应用至关重要。

  7. 定制化:部署针对特定用例专门或经常更新的模型更为方便。

我们可以通过利用边缘设备如树莓派在图像分类中的强大功能,创建更响应、更安全和更高效的计算机视觉解决方案。这种方法为将智能视觉处理集成到各种应用和环境开辟了新的可能性。

在接下来的章节中,我们将探讨如何在树莓派上实现和优化图像分类,利用这些优势创建强大且高效的计算机视觉系统。

设置环境

更新树莓派

首先,确保你的树莓派是最新的:

sudo apt update
sudo apt upgrade -y

安装所需的库

安装图像处理和机器学习所需的库:

sudo apt install python3-pip
sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED
pip3 install --upgrade pip

设置虚拟环境(可选但推荐)

创建一个虚拟环境来管理依赖项:

python3 -m venv ~/tflite
source ~/tflite/bin/activate

安装 TensorFlow Lite

我们对执行推理感兴趣,这指的是在设备上执行 TensorFlow Lite 模型以根据输入数据进行预测。要使用 TensorFlow Lite 模型进行推理,我们必须通过解释器运行它。TensorFlow Lite 解释器旨在轻量且快速。解释器使用静态图排序和自定义(较少动态)内存分配器,以确保最小化负载、初始化和执行延迟。

我们将使用针对树莓派的TensorFlow Lite 运行时,这是一个简化库,用于在移动和嵌入式设备上运行机器学习模型,而不包括所有 TensorFlow 包。

pip install tflite_runtime --no-deps

安装的轮子:tflite_runtime-2.14.0-cp311-cp311-manylinux_2_34_aarch64.whl

安装额外的 Python 库

安装用于图像分类所需的 Python 库:

如果你已安装了另一个版本的 Numpy,请先卸载它。

pip3 uninstall numpy

安装版本 1.23.2,它与 tflite_runtime 兼容。

 pip3 install numpy==1.23.2
pip3 install Pillow matplotlib

创建工作目录:

如果你使用的是带有最小 OS(无桌面)的 Raspi-Zero,你可能没有用户预定义的目录树(你可以使用ls来检查。因此,让我们创建一个:

mkdir Documents
cd Documents/
mkdir TFLITE
cd TFLITE/
mkdir IMG_CLASS
cd IMG_CLASS
mkdir models
cd models

在 Raspi-5 上,/Documents 应该存在。

获取预训练的图像分类模型

对于资源受限的设备如树莓派,一个合适的预训练模型对于成功的图像分类至关重要。MobileNet是为移动和嵌入式视觉应用设计的,在准确性和速度之间取得了良好的平衡。版本:MobileNetV1、MobileNetV2、MobileNetV3。让我们下载 V2 版本:

# One long line, split with backslash \
wget https://storage.googleapis.com/download.tensorflow.org/\
models/tflite_11_05_08/mobilenet_v2_1.0_224_quant.tgz

tar xzf mobilenet_v2_1.0_224_quant.tgz

获取其标签

wget https://raw.githubusercontent.com/Mjrovai/EdgeML-with-Raspberry-Pi/refs/heads/\
main/IMG_CLASS/models/labels.txt

最后,你应该在其目录中拥有模型:

我们只需要mobilenet_v2_1.0_224_quant.tflite模型和labels.txt文件。你可以删除其他文件。

设置 Jupyter Notebook(可选)

如果你更喜欢使用 Jupyter Notebook 进行开发:

pip3 install jupyter
jupyter notebook --generate-config

要运行 Jupyter Notebook,请运行以下命令(根据你的 IP 地址进行更改):

jupyter notebook --ip=192.168.4.210 --no-browser

在终端上,你可以看到打开笔记本的本地 URL 地址:

图片

你可以通过在网页浏览器中输入 Raspberry Pi 的 IP 地址和提供的令牌来从另一台设备访问它(你可以从终端复制令牌)。

图片

在 Raspi 中定义你的工作目录并创建一个新的 Python 3 笔记本。

验证设置

通过运行一个简单的 Python 脚本来测试你的设置:

import tflite_runtime.interpreter as tflite
import numpy as np
from PIL import Image

print("NumPy:", np.__version__)
print("Pillow:", Image.__version__)

# Try to create a TFLite Interpreter
model_path = "./models/mobilenet_v2_1.0_224_quant.tflite"
interpreter = tflite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()
print("TFLite Interpreter created successfully!")

你可以使用终端上的 nano 创建 Python 脚本,使用CTRL+0 + ENTER + CTRL+X保存它。

图片

并使用以下命令运行它:

图片

或者你可以直接在Notebook上运行:

图片

使用 Mobilenet V2 进行推理

在最后一节中,我们设置了环境,包括下载一个在 ImageNet 的224×224224\times 224图像(1.2 百万)上训练的流行预训练模型 Mobilenet V2,用于 1,001 个类别(1,000 个对象类别加上 1 个背景)。该模型被转换为紧凑的 3.5 MB TensorFlow Lite 格式,使其适合 Raspberry Pi 有限的存储和内存。

图片

让我们开始一个新的notebook,以遵循所有步骤来对一张图像进行分类:

导入所需的库:

import time
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import tflite_runtime.interpreter as tflite

加载 TFLite 模型并分配张量:

model_path = "./models/mobilenet_v2_1.0_224_quant.tflite"
interpreter = tflite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

获取输入和输出张量。

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

输入细节将告诉我们模型应该如何用图像进行喂养。形状为(1,224,224,3)告诉我们应该逐个输入具有维度(224×224×3)(224\times 224\times 3)的图像(批处理维度:1)。

图片

输出细节显示推理将产生一个包含 1,001 个整数值的数组。这些值来自图像分类,其中每个值是该特定标签与图像相关联的概率。

图片

让我们也检查一下模型输入细节的数据类型。

input_dtype = input_details[0]["dtype"]
input_dtype
dtype('uint8')

这表明输入图像应该是原始像素(0 - 255)。

让我们获取一个测试图像。你可以从你的电脑传输它或下载一个用于测试。让我们首先在我们的工作目录下创建一个文件夹:

mkdir images
cd images
wget https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg

让我们加载并显示图像:

# Load he image
img_path = "./images/Cat03.jpg"
img = Image.open(img_path)

# Display the image
plt.figure(figsize=(8, 8))
plt.imshow(img)
plt.title("Original Image")
plt.show()

图片

我们可以通过运行命令查看图像大小:

width, height = img.size

这表明图像是一个宽度为 1600 像素、高度为 1600 像素的 RGB 图像。因此,为了使用我们的模型,我们应该将其重塑为(224, 224, 3),并添加一个批处理维度 1,如输入细节中定义:(1, 224, 224, 3)。推理结果,如输出细节所示,将是一个大小为 1001 的数组,如下所示:

图片

因此,让我们重塑图像,添加批处理维度,并查看结果:

img = img.resize(
    (input_details[0]["shape"][1], input_details[0]["shape"][2])
)
input_data = np.expand_dims(img, axis=0)
input_data.shape

输入数据的形状符合预期:(1, 224, 224, 3)

让我们确认输入数据的 dtype:

input_data.dtype
dtype('uint8')

输入数据的 dtype 是‘uint8’,这与模型期望的 dtype 兼容。

使用 input_data 运行解释器并获取预测(输出):

interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
predictions = interpreter.get_tensor(output_details[0]["index"])[0]

预测是一个包含 1001 个元素的数组。让我们获取具有高值的 Top-5 索引:

top_k_results = 5
top_k_indices = np.argsort(predictions)[::-1][:top_k_results]
top_k_indices

top_k_indices 是一个包含 5 个元素的数组:array([283, 286, 282])

因此,283、286、282、288 和 479 是图像最可能的类别。有了索引,我们必须找到它指定的类别(例如汽车、猫或狗)。与模型一起下载的文本文件与从 0 到 1,000 的每个索引关联一个标签。让我们使用一个函数来加载.txt 文件作为列表:

def load_labels(filename):
    with open(filename, "r") as f:
        return [line.strip() for line in f.readlines()]

然后获取列表,打印与索引关联的标签:

labels_path = "./models/labels.txt"
labels = load_labels(labels_path)

print(labels[286])
print(labels[283])
print(labels[282])
print(labels[288])
print(labels[479])

因此,我们有:

Egyptian cat
tiger cat
tabby
lynx
carton

至少前四个索引与猫科动物相关。预测内容是每个标签的概率。正如我们在输出细节中看到的,这些值是量化的,应该进行反量化并应用 softmax。

scale, zero_point = output_details[0]["quantization"]
dequantized_output = (
    predictions.astype(np.float32) - zero_point
) * scale
exp_output = np.exp(dequantized_output - np.max(dequantized_output))
probabilities = exp_output / np.sum(exp_output)

让我们打印前 5 个概率:

print(probabilities[286])
print(probabilities[283])
print(probabilities[282])
print(probabilities[288])
print(probabilities[479])
0.27741462
0.3732285
0.16919471
0.10319158
0.023410844

为了清晰起见,让我们创建一个函数来关联标签与概率:

for i in range(top_k_results):
    print(
        "\t{:20}: {}%".format(
            labels[top_k_indices[i]],
            (int(probabilities[top_k_indices[i]] * 100)),
        )
    )
tiger cat           : 37%
Egyptian cat        : 27%
tabby               : 16%
lynx                : 10%
carton              : 2%

定义一个通用的图像分类函数

让我们创建一个通用函数,将图像作为输入,并获取前 5 个可能的类别:

def image_classification(
    img_path, model_path, labels, top_k_results=5
):
    # load the image
    img = Image.open(img_path)
    plt.figure(figsize=(4, 4))
    plt.imshow(img)
    plt.axis("off")

    # Load the TFLite model
    interpreter = tflite.Interpreter(model_path=model_path)
    interpreter.allocate_tensors()

    # Get input and output tensors
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    # Preprocess
    img = img.resize(
        (input_details[0]["shape"][1], input_details[0]["shape"][2])
    )
    input_data = np.expand_dims(img, axis=0)

    # Inference on Raspi-Zero
    interpreter.set_tensor(input_details[0]["index"], input_data)
    interpreter.invoke()

    # Obtain results and map them to the classes
    predictions = interpreter.get_tensor(output_details[0]["index"])[
        0
    ]

    # Get indices of the top k results
    top_k_indices = np.argsort(predictions)[::-1][:top_k_results]

    # Get quantization parameters
    scale, zero_point = output_details[0]["quantization"]

    # Dequantize the output and apply softmax
    dequantized_output = (
        predictions.astype(np.float32) - zero_point
    ) * scale
    exp_output = np.exp(
        dequantized_output - np.max(dequantized_output)
    )
    probabilities = exp_output / np.sum(exp_output)

    print("\n\t[PREDICTION]        [Prob]\n")
    for i in range(top_k_results):
        print(
            "\t{:20}: {}%".format(
                labels[top_k_indices[i]],
                (int(probabilities[top_k_indices[i]] * 100)),
            )
        )

然后加载一些图像进行测试,我们有:

图片

使用从头开始训练的模型进行测试

让我们从头开始获取一个 TFLite 模型。为此,你可以参考以下笔记本:

CNN 用于分类 Cifar-10 数据集

在笔记本中,我们使用 CIFAR10 数据集训练了一个模型,该数据集包含来自 10 个类别的 60,000 张图像(CIFAR 的飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车)。CIFAR 有32×3232\times 32彩色图像(3 个颜色通道),其中对象不是居中的,并且可以有背景中的对象,例如可能有云的飞机!简而言之,小但真实的图像。

训练好的 CNN 模型(cifar10_model.keras)的大小为 2.0MB。使用TFLite Converter,模型cifar10.tflite变成了 674MB(大约是原始大小的 1/3)。

notebook Cifar 10 - 在 Raspi 上使用 TFLite 进行图像分类(可以在 Raspi 上运行),我们可以遵循与mobilenet_v2_1.0_224_quant.tflite相同的步骤。以下是在最后一节中展示的 Raspi-Zero 上使用通用图像分类功能的图像示例。

安装 Picamera2

Picamera2,一个用于与 Raspberry Pi 摄像头交互的 Python 库,基于libcamera摄像头堆栈,并由 Raspberry Pi 基金会维护。Picamera2 库支持所有 Raspberry Pi 型号,从 Pi Zero 到 RPi 5。它已经在 Raspi 上全局安装,但我们应确保它在虚拟环境中可访问。

  1. 首先,如果尚未激活,请激活虚拟环境:

    source ~/tflite/bin/activate
    
  2. 现在,让我们在您的虚拟环境中创建一个.pth 文件,以添加系统 site-packages 路径:

    echo "/usr/lib/python3/dist-packages" > \
     $VIRTUAL_ENV/lib/python3.11/
    site-packages/system_site_packages.pth
    

    注意:如果您的 Python 版本不同,请将python3.11替换为适当的版本。

  3. 创建此文件后,尝试在 Python 中导入 picamera2:

    python3
    >>> import picamera2
    >>> print(picamera2.__file__)
    

上述代码将显示picamera2模块本身的文件位置,证明可以从环境中访问库。

/home/mjrovai/tflite/lib/python3.11/site-packages/\
picamera2/__init__.py

您还可以列出系统中的可用摄像头:

>>> print(Picamera2.global_camera_info())

在我的情况下,安装了 USB 后,我得到了:

现在我们已经确认 picamera2 在具有index 0的环境下工作,让我们尝试一个简单的 Python 脚本来从您的 USB 摄像头捕获一张图片:

from picamera2 import Picamera2
import time

# Initialize the camera
picam2 = Picamera2()  # default is index 0

# Configure the camera
config = picam2.create_still_configuration(main={"size": (640, 480)})
picam2.configure(config)

# Start the camera
picam2.start()

# Wait for the camera to warm up
time.sleep(2)

# Capture an image
picam2.capture_file("usb_camera_image.jpg")
print("Image captured and saved as 'usb_camera_image.jpg'")

# Stop the camera
picam2.stop()

使用 Nano 文本编辑器、Jupyter Notebook 或任何其他编辑器。将其保存为 Python 脚本(例如,capture_image.py)并运行。这应该会从您的摄像头捕获一张图片,并将其保存为与脚本相同的目录中的“usb_camera_image.jpg”。

如果 Jupyter 已经打开,您可以在您的电脑上看到捕获到的图片。否则,将文件从 Raspi 传输到您的电脑。

如果您在使用带有完整桌面的 Raspi-5,可以直接在设备上打开文件。

图像分类项目

现在,我们将使用 Edge Impulse Studio 开发一个完整的图像分类项目。正如我们在 Movilinet V2 中所做的那样,我们将使用训练和转换后的 TFLite 模型进行推理。

目标

任何 ML 项目的第一步是定义其目标。在这种情况下,目标是检测和分类一张图片中存在的两个特定对象。对于这个项目,我们将使用两个小玩具:一个机器人和一只小型巴西鹦鹉(名为 Periquito)。我们还将收集两个对象不存在的背景图片。

数据收集

一旦我们定义了我们的机器学习项目目标,下一步也是最重要的一步是收集数据集。我们可以使用手机进行图像捕获,但在这里我们将使用 Raspi。让我们在我们的 Raspberry Pi 上设置一个简单的网络服务器,以便在浏览器中查看捕获的 QVGA (320 x 240) 图像。

  1. 首先,让我们安装 Flask,一个用于 Python 的轻量级网络框架:

    pip3 install flask
    
  2. 让我们创建一个新的 Python 脚本,结合图像捕获和 Web 服务器。我们将它命名为 get_img_data.py

from flask import Flask, Response, render_template_string,
                  request, redirect, url_for
from picamera2 import Picamera2
import io
import threading
import time
import os
import signal

app = Flask(__name__)

# Global variables
base_dir = "dataset"
picam2 = None
frame = None
frame_lock = threading.Lock()
capture_counts = {}
current_label = None
shutdown_event = threading.Event()

def initialize_camera():
    global picam2
    picam2 = Picamera2()
    config = picam2.create_preview_configuration(
             main={"size": (320, 240)}
    )
    picam2.configure(config)
    picam2.start()
    time.sleep(2)  # Wait for camera to warm up

def get_frame():
    global frame
    while not shutdown_event.is_set():
        stream = io.BytesIO()
        picam2.capture_file(stream, format='jpeg')
        with frame_lock:
            frame = stream.getvalue()
        time.sleep(0.1)  # Adjust as needed for smooth preview

def generate_frames():
    while not shutdown_event.is_set():
        with frame_lock:
            if frame is not None:
                yield (b'--frame\r\n'
                       b'Content-Type: image/jpeg\r\n\r\n' +
                                       frame + b'\r\n')
        time.sleep(0.1)  # Adjust as needed for smooth streaming

def shutdown_server():
    shutdown_event.set()
    if picam2:
        picam2.stop()
    # Give some time for other threads to finish
    time.sleep(2)
    # Send SIGINT to the main process
    os.kill(os.getpid(), signal.SIGINT)

@app.route('/', methods=['GET', 'POST'])
def index():
    global current_label
    if request.method == 'POST':
        current_label = request.form['label']
        if current_label not in capture_counts:
            capture_counts[current_label] = 0
        os.makedirs(os.path.join(base_dir, current_label),
                                 exist_ok=True)
        return redirect(url_for('capture_page'))
    return render_template_string('''
 <!DOCTYPE html>
 <html>
 <head>
 <title>Dataset Capture - Label Entry</title>
 </head>
 <body>
 <h1>Enter Label for Dataset</h1>
 <form method="post">
 <input type="text" name="label" required>
 <input type="submit" value="Start Capture">
 </form>
 </body>
 </html>
 ''')

@app.route('/capture')
def capture_page():
    return render_template_string('''
 <!DOCTYPE html>
 <html>
 <head>
 <title>Dataset Capture</title>
 <script>
 var shutdownInitiated = false;
 function checkShutdown() {
 if (!shutdownInitiated) {
 fetch('/check_shutdown')
 .then(response => response.json())
 .then(data => {
 if (data.shutdown) {
 shutdownInitiated = true;
 document.getElementById(
 'video-feed').src = '';
 document.getElementById(
 'shutdown-message')
 .style.display = 'block';
 }
 });
 }
 }
 setInterval(checkShutdown, 1000); // Check
 every second
 </script>
 </head>
 <body>
 <h1>Dataset Capture</h1>
 <p>Current Label: {{ label }}</p>
 <p>Images captured for this label: {{ capture_count
  }}</p>
 <img id="video-feed" src="{{ url_for('video_feed')
  }}" width="640"
 height="480" />
 <div id="shutdown-message" style="display: none;
 color: red;">
 Capture process has been stopped.
 You can close this window.
 </div>
 <form action="/capture_image" method="post">
 <input type="submit" value="Capture Image">
 </form>
 <form action="/stop" method="post">
 <input type="submit" value="Stop Capture"
 style="background-color: #ff6666;">
 </form>
 <form action="/" method="get">
 <input type="submit" value="Change Label"
 style="background-color: #ffff66;">
 </form>
 </body>
 </html>
 ''', label=current_label, capture_count=capture_counts.get(
                                            current_label, 0))

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace;
 boundary=frame')

@app.route('/capture_image', methods=['POST'])
def capture_image():
    global capture_counts
    if current_label and not shutdown_event.is_set():
        capture_counts[current_label] += 1
        timestamp = time.strftime("%Y%m%d-%H%M%S")
        filename = f"image_{timestamp}.jpg"
        full_path = os.path.join(base_dir, current_label,
                                 filename)

        picam2.capture_file(full_path)

    return redirect(url_for('capture_page'))

@app.route('/stop', methods=['POST'])
def stop():
    summary = render_template_string('''
 <!DOCTYPE html>
 <html>
 <head>
 <title>Dataset Capture - Stopped</title>
 </head>
 <body>
 <h1>Dataset Capture Stopped</h1>
 <p>The capture process has been stopped.
 You can close this window.</p>
 <p>Summary of captures:</p>
 <ul>
 {% for label, count in capture_counts.items() %}
 <li>{{ label }}: {{ count }} images</li>
 {% endfor %}
 </ul>
 </body>
 </html>
 ''', capture_counts=capture_counts)

    # Start a new thread to shutdown the server
    threading.Thread(target=shutdown_server).start()

    return summary

@app.route('/check_shutdown')
def check_shutdown():
    return {'shutdown': shutdown_event.is_set()}

if __name__ == '__main__':
    initialize_camera()
    threading.Thread(target=get_frame, daemon=True).start()
    app.run(host='0.0.0.0', port=5000, threaded=True)
  1. 运行此脚本:
    python3 get_img_data.py
  1. 访问网络界面:

    • 在 Raspberry Pi 本身(如果您有 GUI):打开网页浏览器并访问 http://localhost:5000

    • 从同一网络上的另一台设备:打开网页浏览器并访问 http://<raspberry_pi_ip>:5000(将 <raspberry_pi_ip> 替换为您的 Raspberry Pi 的 IP 地址)。例如:http://192.168.4.210:5000/

此 Python 脚本使用 Raspberry Pi 和其摄像头创建了一个基于网络的界面,用于捕获和组织图像数据集。这对于需要标记图像数据的机器学习项目来说非常方便。

关键特性:

  1. Web 界面:可通过与 Raspberry Pi 相同网络上的任何设备访问。

  2. 实时摄像头预览:显示来自摄像头的实时流。

  3. 标签系统:允许用户为不同类别的图像输入标签。

  4. 组织存储:自动将图像保存到特定标签的子目录中。

  5. 按标签计数器:跟踪每个标签捕获了多少图像。

  6. 摘要统计:在停止捕获过程时提供捕获图像的摘要。

主要组件:

  1. Flask Web 应用程序:处理路由并服务网络界面。

  2. Picamera2 集成:控制 Raspberry Pi 摄像头。

  3. 线程化帧捕获:确保实时预览流畅。

  4. 文件管理:将捕获的图像组织到标记的目录中。

关键功能:

  • initialize_camera():设置 Picamera2 实例。

  • get_frame():持续捕获用于实时预览的帧。

  • generate_frames():为实时视频流提供帧。

  • shutdown_server():设置关闭事件,停止摄像头并关闭 Flask 服务器

  • index():处理标签输入页面。

  • capture_page():显示主要捕获界面。

  • video_feed():显示实时预览以定位摄像头。

  • capture_image():保存带有当前标签的图像。

  • stop():停止捕获过程并显示摘要。

使用流程:

  1. 在您的 Raspberry Pi 上启动脚本。

  2. 从浏览器访问网络界面。

  3. 为您想要捕获的图像输入标签并按 开始捕获

  1. 使用实时预览定位摄像头。

  2. 点击 捕获图像 以保存当前标签下的图像。

  1. 根据不同类别更改标签,选择 更改标签

  2. 完成后点击 停止捕获 以查看摘要。

技术说明:

  • 该脚本使用线程处理并发帧捕获和网络服务。

  • 图像以其文件名中的时间戳保存,以确保唯一性。

  • 网络界面是响应式的,可以从移动设备访问。

定制化可能性:

  • initialize_camera() 函数中调整图像分辨率。这里我们使用了 QVGA (320×240)(320\times 240)

  • 修改 HTML 模板以获得不同的外观和感觉。

  • capture_image() 函数中添加额外的图像处理或分析步骤。

数据集上的样本数量:

从每个类别(periquitorobotbackground)获取大约 60 张图像。尽量捕捉不同的角度、背景和光照条件。在 Raspi 上,我们将结束于一个名为 dataset 的文件夹,其中包含 3 个子文件夹 periquitorobotbackground,每个文件夹对应于图像的一个类别。

您可以使用 Filezilla 将创建的数据集传输到您的主计算机。

使用 Edge Impulse Studio 训练模型

我们将使用 Edge Impulse Studio 来训练我们的模型。访问 Edge Impulse 页面,输入您的账户凭据,并创建一个新的项目:

图片

这里,您可以克隆一个类似的项目:Raspi - Img Class

数据集

我们将使用 EI Studio(或 Studio)通过四个主要步骤进行操作。这些步骤对于准备我们的模型在 Raspi 上使用至关重要:数据集、Impulse、测试和部署(在这种情况下,是边缘设备,即 Raspi)。

关于数据集,重要的是指出,我们用 Raspi 捕获的原始数据集将被分成 训练验证测试。测试集将从一开始就分离出来,并在训练后的测试阶段使用。验证集将在训练期间使用。

在 Studio 上,按照步骤上传捕获的数据:

  1. 转到 数据采集 选项卡,在 上传数据 部分,上传您计算机上所选类别的文件。

  2. 将原始数据集的拆分(训练和测试)以及选择标签的工作留给 Studio。

  3. 对所有三个类别重复此过程。最后,您应该在 Studio 中看到您的“原始数据”:

图片

Studio 允许您探索您的数据,展示您项目中所有数据的完整视图。您可以通过点击单个数据项来清除、检查或更改标签。在我们的简单项目中,数据看起来是好的。

图片

Impulse 设计

在这个阶段,我们应该定义如何:

  • 预处理我们的数据,这包括调整单个图像的大小以及确定要使用的 颜色深度(无论是 RGB 还是灰度)和

  • 指定一个模型。在这种情况下,它将是迁移学习(图像),用于在我们的数据上微调预训练的 MobileNet V2 图像分类模型。这种方法即使在相对较小的图像数据集(在我们的案例中约为 180 张图像)中也表现良好。

使用 MobileNet 的迁移学习为模型训练提供了一种简化的方法,这对于资源受限的环境和具有有限标记数据的项目特别有益。MobileNet 以其轻量级架构而闻名,是一个已经从大型数据集(ImageNet)中学习到有价值特征的预训练模型。

图片

通过利用这些学习到的特征,我们可以用更少的数据和计算资源训练一个新的模型来完成您的特定任务,并实现有竞争力的准确率。

图片

这种方法显著减少了训练时间和计算成本,使其非常适合快速原型设计和在嵌入式设备上的部署,在这些设备上效率至关重要。

转到“脉冲设计”标签页,创建一个脉冲,定义图像大小为160×160160\times 160,并将它们压扁(平方形式,不裁剪)。选择图像和迁移学习模块。保存脉冲。

图片

图像预处理

所有输入的 QVGA/RGB565 图像都将转换为 76,800 个特征 (160×160×3)(160\times 160\times 3).

图片

保存参数,然后在下一标签页中选择生成特征

模型设计

MobileNet 是一系列专为移动和嵌入式视觉应用设计的有效卷积神经网络。MobileNet 的关键特性包括:

  1. 轻量级:针对具有有限计算资源的移动设备和嵌入式系统进行了优化。

  2. 速度:快速推理时间,适用于实时应用。

  3. 准确率:尽管体积紧凑,但仍然保持良好的准确率。

MobileNetV2,于 2018 年推出,改进了原始的 MobileNet 架构。关键特性包括:

  1. 反向残差:在薄瓶颈层之间使用快捷连接的反向残差结构。

  2. 线性瓶颈:移除狭窄层中的非线性,以防止信息丢失。

  3. 深度可分离卷积:继续使用从 MobileNetV1 中继承的这种高效操作。

在我们的项目中,我们将使用MobileNetV2 160x160 1.0进行迁移学习,这意味着用于训练(以及未来的推理)的图像应该具有一个输入尺寸160×160160\times 160像素和宽度乘数为 1.0(全宽,未缩减)。这种配置在模型大小、速度和准确性之间取得了平衡。

模型训练

另一种有价值的深度学习技术是数据增强。数据增强通过创建额外的合成数据来提高机器学习模型的准确性。数据增强系统在训练过程中对训练数据进行小的、随机的更改(例如翻转、裁剪或旋转图像)。

查看内部结构,这里你可以看到 Edge Impulse 是如何在你的数据上实现数据增强策略的:

# Implements the data augmentation policy
def augment_image(image, label):
    # Flips the image randomly
    image = tf.image.random_flip_left_right(image)

    # Increase the image size, then randomly crop it down to
    # the original dimensions
    resize_factor = random.uniform(1, 1.2)
    new_height = math.floor(resize_factor * INPUT_SHAPE[0])
    new_width = math.floor(resize_factor * INPUT_SHAPE[1])
    image = tf.image.resize_with_crop_or_pad(
        image, new_height, new_width
    )
    image = tf.image.random_crop(image, size=INPUT_SHAPE)

    # Vary the brightness of the image
    image = tf.image.random_brightness(image, max_delta=0.2)

    return image, label

在训练过程中接触这些变化可以帮助防止你的模型通过“记忆”训练数据中的表面线索来走捷径,这意味着它可能更好地反映数据集中的深层潜在模式。

我们模型的最终密集层将有 0 个神经元,并使用 10%的 dropout 来防止过拟合。以下是训练结果:

结果非常出色,具有合理的 35 毫秒延迟(对于 Raspi-4),在推理期间应达到大约 30 fps(每秒帧数)。Raspi-Zero 应该更慢,而 Raspi-5 应该更快。

速度与准确性的权衡:

如果需要更快的推理,我们应该使用较小的 alpha 值(0.35、0.5 和 0.75)或甚至减少图像输入尺寸,以准确性为代价。然而,减少输入图像尺寸和降低 alpha(宽度乘数)可以加快 MobileNet V2 的推理速度,但它们有不同的权衡。让我们比较一下:

  1. 减少图像输入尺寸:

优点:

  • 显著降低了所有层的计算成本。

  • 减少内存使用。

  • 它通常提供显著的加速。

缺点:

  • 它可能会降低模型检测小特征或细微细节的能力。

  • 它可以显著影响准确性,尤其是在需要精细识别的任务中。

  1. 减少 Alpha(宽度乘数):

优点:

  • 减少了模型中的参数和计算量。

  • 保持原始输入分辨率,可能保留更多细节。

  • 它可以在速度和准确性之间提供良好的平衡。

缺点:

  • 它可能不会像减少输入尺寸那样显著加快推理速度。

  • 它可以减少模型学习复杂特征的能力。

比较:

  1. 速度影响:

    • 减少输入尺寸通常可以提供更显著的加速,因为它将计算量平方减少(宽度和高各减半大约减少 75%的计算量)。

    • 减少 alpha 值可以更线性地减少计算量。

  2. 准确性影响:

    • 减少输入尺寸会严重影响准确性,尤其是在检测小对象或细微细节时。

    • 降低 alpha 值往往对准确性的影响更为渐进。

  3. 模型架构:

    • 改变输入尺寸不会改变模型的架构。

    • 改变 alpha 值会通过减少每层的通道数来修改模型的架构。

建议:

  1. 如果我们的应用程序不需要检测微小细节并且可以容忍一些准确性的损失,那么减少输入尺寸通常是加快推理的最有效方法。

  2. 如果保持检测细微细节的能力至关重要或需要在速度和准确性之间取得更平衡的权衡,降低 alpha 可能更可取。

  3. 为了获得最佳结果,你可能想尝试两者:

    • 尝试使用输入尺寸如160×160160\times 16092×9292\times 92

    • 尝试 alpha 值如 1.0、0.75、0.5 或 0.35。

  4. 总是在你的特定硬件和特定数据集上对不同配置进行基准测试,以找到适合你用例的最佳平衡。

记住,最佳选择取决于你对准确性、速度以及你正在处理的图像性质的具体要求。通常值得尝试组合以找到特定用例的最佳配置。

模型测试

现在,你应该在项目开始时将数据集放在一边,并使用它作为输入运行训练好的模型。结果再次非常出色(92.22%)。

部署模型

正如我们在上一节中所做的那样,我们可以将训练好的模型部署为.tflite 格式,并使用 Raspi 通过 Python 运行它。

在“仪表板”选项卡中,转到迁移学习模型(int8 量化)并点击下载图标:

让我们也下载 float32 版本以进行比较

将模型从你的计算机传输到 Raspi(./models),例如,使用 FileZilla。同时,捕获一些图像进行推理(./images)。

导入所需的库:

import time
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import tflite_runtime.interpreter as tflite

定义路径和标签:

img_path = "./images/robot.jpg"
model_path = "./models/ei-raspi-img-class-int8-quantized-\
 model.tflite"
labels = ["background", "periquito", "robot"]

注意,在 Edge Impulse Studio 上训练的模型将输出索引为 0、1、2 等值,而实际标签将遵循字母顺序。

加载模型,分配张量,并获取输入和输出张量细节:

# Load the TFLite model
interpreter = tflite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

# Get input and output tensors
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

需要注意的一个重要区别是,模型输入细节的dtype现在是int8,这意味着输入值从-128 到+127,而我们的图像中的每个像素值从 0 到 255。这意味着我们应该预处理图像以匹配它。我们可以在以下位置进行检查:

input_dtype = input_details[0]["dtype"]
input_dtype
numpy.int8

因此,让我们打开图像并显示它:

img = Image.open(img_path)
plt.figure(figsize=(4, 4))
plt.imshow(img)
plt.axis("off")
plt.show()

并进行预处理:

scale, zero_point = input_details[0]["quantization"]
img = img.resize(
    (input_details[0]["shape"][1], input_details[0]["shape"][2])
)
img_array = np.array(img, dtype=np.float32) / 255.0
img_array = (
    (img_array / scale + zero_point).clip(-128, 127).astype(np.int8)
)
input_data = np.expand_dims(img_array, axis=0)

检查输入数据,我们可以验证输入张量与模型期望的兼容性:

input_data.shape, input_data.dtype
((1, 160, 160, 3), dtype('int8'))

现在,是时候进行推理了。让我们也计算模型的延迟:

# Inference on Raspi-Zero
start_time = time.time()
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
end_time = time.time()
inference_time = (end_time - start_time) * 1000  # Convert
# to milliseconds
print("Inference time: {:.1f}ms".format(inference_time))

模型将在 Raspi-Zero 上大约需要 125ms 来完成推理,这比 Raspi-5 长 3 到 4 倍。

现在,我们可以获取输出标签和概率。还应注意,在 Edge Impulse Studio 上训练的模型在其输出中有一个 softmax(与原始 Movilenet V2 不同),我们应该使用模型的原始输出作为“概率”。

# Obtain results and map them to the classes
predictions = interpreter.get_tensor(output_details[0]["index"])[0]

# Get indices of the top k results
top_k_results = 3
top_k_indices = np.argsort(predictions)[::-1][:top_k_results]

# Get quantization parameters
scale, zero_point = output_details[0]["quantization"]

# Dequantize the output
dequantized_output = (
    predictions.astype(np.float32) - zero_point
) * scale
probabilities = dequantized_output

print("\n\t[PREDICTION]        [Prob]\n")
for i in range(top_k_results):
    print(
        "\t{:20}: {:.2f}%".format(
            labels[top_k_indices[i]],
            probabilities[top_k_indices[i]] * 100,
        )
    )

让我们修改之前创建的函数,以便我们可以处理不同类型的模型:

def image_classification(
    img_path, model_path, labels, top_k_results=3, apply_softmax=False
):
    # Load the image
    img = Image.open(img_path)
    plt.figure(figsize=(4, 4))
    plt.imshow(img)
    plt.axis("off")

    # Load the TFLite model
    interpreter = tflite.Interpreter(model_path=model_path)
    interpreter.allocate_tensors()

    # Get input and output tensors
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    # Preprocess
    img = img.resize(
        (input_details[0]["shape"][1], input_details[0]["shape"][2])
    )

    input_dtype = input_details[0]["dtype"]

    if input_dtype == np.uint8:
        input_data = np.expand_dims(np.array(img), axis=0)
    elif input_dtype == np.int8:
        scale, zero_point = input_details[0]["quantization"]
        img_array = np.array(img, dtype=np.float32) / 255.0
        img_array = (
            (img_array / scale + zero_point)
            .clip(-128, 127)
            .astype(np.int8)
        )
        input_data = np.expand_dims(img_array, axis=0)
    else:  # float32
        input_data = (
            np.expand_dims(np.array(img, dtype=np.float32), axis=0)
            / 255.0
        )

    # Inference on Raspi-Zero
    start_time = time.time()
    interpreter.set_tensor(input_details[0]["index"], input_data)
    interpreter.invoke()
    end_time = time.time()
    inference_time = (
        end_time - start_time
    ) * 1000  # Convert to milliseconds

    # Obtain results
    predictions = interpreter.get_tensor(output_details[0]["index"])[
        0
    ]

    # Get indices of the top k results
    top_k_indices = np.argsort(predictions)[::-1][:top_k_results]

    # Handle output based on type
    output_dtype = output_details[0]["dtype"]
    if output_dtype in [np.int8, np.uint8]:
        # Dequantize the output
        scale, zero_point = output_details[0]["quantization"]
        predictions = (
            predictions.astype(np.float32) - zero_point
        ) * scale

    if apply_softmax:
        # Apply softmax
        exp_preds = np.exp(predictions - np.max(predictions))
        probabilities = exp_preds / np.sum(exp_preds)
    else:
        probabilities = predictions

    print("\n\t[PREDICTION]        [Prob]\n")
    for i in range(top_k_results):
        print(
            "\t{:20}: {:.1f}%".format(
                labels[top_k_indices[i]],
                probabilities[top_k_indices[i]] * 100,
            )
        )
    print("\n\tInference time: {:.1f}ms".format(inference_time))

并使用不同的图像和 int8 量化模型(160x160 alpha =1.0)进行测试。

让我们下载一个较小的模型,例如为Nicla Vision Lab(int8 量化模型,96x96,alpha = 0.1)训练的模型作为测试。我们可以使用相同的函数:

模型丢失了一些精度,但一旦我们的模型不寻找太多细节,这仍然是可以接受的。关于延迟,我们在 Raspi-Zero 上大约快了十倍。

实时图像分类

让我们开发一个应用,实时捕捉 USB 摄像头的图像,并显示其分类。

使用终端上的 nano 保存以下代码,例如img_class_live_infer.py

from flask import Flask, Response, render_template_string,
                  request, jsonify
from picamera2 import Picamera2
import io
import threading
import time
import numpy as np
from PIL import Image
import tflite_runtime.interpreter as tflite
from queue import Queue

app = Flask(__name__)

# Global variables
picam2 = None
frame = None
frame_lock = threading.Lock()
is_classifying = False
confidence_threshold = 0.8
model_path = "./models/ei-raspi-img-class-int8-quantized-\
 model.tflite"
labels = ['background', 'periquito', 'robot']
interpreter = None
classification_queue = Queue(maxsize=1)

def initialize_camera():
    global picam2
    picam2 = Picamera2()
    config = picam2.create_preview_configuration(
        main={"size": (320, 240)}
    )
    picam2.configure(config)
    picam2.start()
    time.sleep(2)  # Wait for camera to warm up

def get_frame():
    global frame
    while True:
        stream = io.BytesIO()
        picam2.capture_file(stream, format='jpeg')
        with frame_lock:
            frame = stream.getvalue()
        time.sleep(0.1)  # Capture frames more frequently

def generate_frames():
    while True:
        with frame_lock:
            if frame is not None:
                yield (
                   b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n'
                   + frame + b'\r\n'
                )
        time.sleep(0.1)

def load_model():
    global interpreter
    if interpreter is None:
        interpreter = tflite.Interpreter(model_path=model_path)
        interpreter.allocate_tensors()
    return interpreter

def classify_image(img, interpreter):
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    img = img.resize((input_details[0]['shape'][1],
                      input_details[0]['shape'][2]))
    input_data = np.expand_dims(np.array(img), axis=0)\
                             .astype(input_details[0]['dtype'])

    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()

    predictions = interpreter.get_tensor(output_details[0]
                                         ['index'])[0]
    # Handle output based on type
    output_dtype = output_details[0]['dtype']
    if output_dtype in [np.int8, np.uint8]:
        # Dequantize the output
        scale, zero_point = output_details[0]['quantization']
        predictions = (predictions.astype(np.float32) -
                       zero_point) * scale
    return predictions

def classification_worker():
    interpreter = load_model()
    while True:
        if is_classifying:
            with frame_lock:
                if frame is not None:
                    img = Image.open(io.BytesIO(frame))
            predictions = classify_image(img, interpreter)
            max_prob = np.max(predictions)
            if max_prob >= confidence_threshold:
                label = labels[np.argmax(predictions)]
            else:
                label = 'Uncertain'
            classification_queue.put({
                 'label': label,
                 'probability': float(max_prob)
            })
        time.sleep(0.1)  # Adjust based on your needs

@app.route('/')
def index():
   return render_template_string('''
 <!DOCTYPE html>
 <html>
 <head>
 <title>Image Classification</title>
 <script
 src="https://code.jquery.com/jquery-3.6.0.min.js">
 </script>
 <script>
 function startClassification() {
 $.post('/start');
 $('#startBtn').prop('disabled', true);
 $('#stopBtn').prop('disabled', false);
 }
 function stopClassification() {
 $.post('/stop');
 $('#startBtn').prop('disabled', false);
 $('#stopBtn').prop('disabled', true);
 }
 function updateConfidence() {
 var confidence = $('#confidence').val();
 $.post('/update_confidence',
 {confidence: confidence}
 );
 }
 function updateClassification() {
 $.get('/get_classification', function(data) {
 $('#classification').text(data.label + ': '
 + data.probability.toFixed(2));
 });
 }
 $(document).ready(function() {
 setInterval(updateClassification, 100);
 // Update every 100ms
 });
 </script>
 </head>
 <body>
 <h1>Image Classification</h1>
 <img src="{{ url_for('video_feed') }}"
 width="640"
 height="480" />

 <br>
 <button id="startBtn"
 onclick="startClassification()">
 Start Classification
 </button>

 <button id="stopBtn"
 onclick="stopClassification()"
 disabled>
 Stop Classification
 </button>

 <br>
 <label for="confidence">Confidence Threshold:</label>
 <input type="number"
 id="confidence"
 name="confidence"
 min="0" max="1"
 step="0.1"
 value="0.8"
 onchange="updateConfidence()" />

 <br>
 <div id="classification">
 Waiting for classification...
 </div>

 </body>
 </html>
 ''')

@app.route('/video_feed')
def video_feed():
    return Response(
       generate_frames(),
       mimetype='multipart/x-mixed-replace; boundary=frame'
    )

@app.route('/start', methods=['POST'])
def start_classification():
    global is_classifying
    is_classifying = True
    return '', 204

@app.route('/stop', methods=['POST'])
def stop_classification():
    global is_classifying
    is_classifying = False
    return '', 204

@app.route('/update_confidence', methods=['POST'])
def update_confidence():
    global confidence_threshold
    confidence_threshold = float(request.form['confidence'])
    return '', 204

@app.route('/get_classification')
def get_classification():
    if not is_classifying:
        return jsonify({'label': 'Not classifying',
                       'probability': 0})
    try:
        result = classification_queue.get_nowait()
    except Queue.Empty:
        result = {'label': 'Processing', 'probability': 0}
    return jsonify(result)

if __name__ == '__main__':
    initialize_camera()
    threading.Thread(target=get_frame, daemon=True).start()
    threading.Thread(target=classification_worker,
                     daemon=True).start()
    app.run(host='0.0.0.0', port=5000, threaded=True)

在终端上运行:

python3 img_class_live_infer.py

并访问 Web 界面:

  • 在 Raspberry Pi 本身(如果您有 GUI):打开网页浏览器并访问http://localhost:5000

  • 从同一网络上的另一台设备:打开网页浏览器并访问http://<raspberry_pi_ip>:5000(将<raspberry_pi_ip>替换为您的 Raspberry Pi 的 IP 地址)。例如:http://192.168.4.210:5000/

这里有一些应用程序在外部桌面运行时的截图

这里,您可以看到 YouTube 上运行的应用:

www.youtube.com/watch?v=o1QsQrpCMw4

代码创建了一个使用 Raspberry Pi、其摄像头模块和 TensorFlow Lite 模型的实时图像分类的 Web 应用。该应用使用 Flask 提供 Web 界面,可以查看摄像头流和实时分类结果。

关键组件:

  1. Flask Web 应用: 提供用户界面并处理请求。

  2. PiCamera2: 从 Raspberry Pi 摄像头模块捕获图像。

  3. TensorFlow Lite: 运行图像分类模型。

  4. 多线程: 管理并发操作以实现平滑性能。

主要功能:

  • 实时摄像头流显示

  • 实时图像分类

  • 可调节的置信度阈值

  • 按需启动/停止分类

代码结构:

  1. 导入和设置:

    • Flask 用于 Web 应用

    • PiCamera2 用于相机控制

    • TensorFlow Lite 用于推理

    • 多线程和队列用于并发操作

  2. 全局变量:

    • 相机和帧管理

    • 分类控制

    • 模型和标签信息

  3. 相机功能:

    • initialize_camera(): 设置 PiCamera2

    • get_frame(): 持续捕获帧

    • generate_frames(): 为 Web 流生成帧

  4. 模型功能:

    • load_model(): 加载 TFLite 模型

    • classify_image(): 对单个图像进行推理

  5. 分类工作器:

    • 在单独的线程中运行

    • 活跃时持续对帧进行分类

    • 更新队列以包含最新的结果

  6. Flask 路由:

    • /: 提供主 HTML 页面

    • /video_feed: 流式传输相机视频流

    • /start/stop: 控制分类

    • /update_confidence: 调整置信度阈值

    • /get_classification: 返回最新的分类结果

  7. HTML 模板:

    • 显示相机视频流和分类结果

    • 提供启动/停止和调整设置的控件

  8. 主要执行

    • 初始化相机并启动必要的线程

    • 运行 Flask 应用程序

关键概念:

  1. 并发操作: 使用线程分别处理相机捕获和分类,而与 Web 服务器分离。

  2. 实时更新: 无需页面刷新即可频繁更新分类结果。

  3. 模型重用: 一次性加载 TFLite 模型并重复使用以提高效率。

  4. 灵活配置: 允许用户动态调整置信度阈值。

使用方法:

  1. 确保所有依赖项都已安装。

  2. 在带有相机模块的 Raspberry Pi 上运行脚本。

  3. 使用 Raspberry Pi 的 IP 地址通过浏览器访问 Web 界面。

  4. 根据需要启动分类和调整设置。

概述:

图像分类已成为机器学习的一个强大且多用途的应用,对从医疗保健到环境监测的各个领域都有重大影响。本章展示了如何在边缘设备如 Raspi-Zero 和 Raspi-5 上实现稳健的图像分类系统,展示了实时、设备内智能的潜力。

我们已经探讨了图像分类项目整个流程,从使用 Edge Impulse Studio 进行数据收集和模型训练到在 Raspi 上部署和运行推理。该过程强调了几个关键点:

  1. 正确的数据收集和预处理对于训练有效模型的重要性。

  2. 转移学习的力量,使我们能够利用像 MobileNet V2 这样的预训练模型,在数据有限的情况下进行高效训练。

  3. 模型准确性与推理速度之间的权衡,这对于边缘设备尤其重要。

  4. 使用基于 Web 界面的实时分类实现,展示了实际应用。

能够在边缘设备如 Raspi 上运行这些模型,为物联网应用、自主系统和实时监控解决方案开辟了众多可能性。它允许降低延迟、提高隐私性,并在连接性有限的环境中运行。

正如我们所见,即使在边缘设备的计算限制下,我们也能在准确性和速度方面取得令人印象深刻的成果。调整模型参数(如输入大小和 alpha 值)的灵活性允许进行微调以满足特定项目需求。

展望未来,边缘 AI 和图像分类领域正迅速发展。模型压缩技术、硬件加速以及更高效的神经网络架构的进步有望进一步扩展边缘设备在计算机视觉任务中的能力。

该项目作为更复杂计算机视觉应用的基础,并鼓励进一步探索令人兴奋的边缘 AI 和物联网世界。无论是工业自动化、智能家居应用还是环境监测,这里涵盖的技能和概念为各种创新项目提供了一个坚实的起点。

资源

目标检测

图片

DALL·E 提示 - 一张用于树莓派教程中“目标检测”章节的封面图像,设计风格与之前的封面相同,采用 1950 年代电子实验室的风格。场景应突出显示轮子和立方体,类似于用户提供的那些,放置在前景的工作台上。一个连接了摄像头模块的树莓派应该正在捕捉这些对象的图像。周围环绕着经典的实验室工具,如烙铁、电阻和电线。实验室背景应包括示波器和管式收音机等复古设备,保持时代的详细和怀旧感。不应包含任何文本或标志。

概述

在我们探索图像分类的基础上,我们现在将注意力转向一个更高级的计算机视觉任务:目标检测。虽然图像分类将单个标签分配给整个图像,但目标检测通过在单个图像中识别和定位多个对象,更进一步。这种能力为许多新的应用和挑战打开了大门,尤其是在边缘计算和物联网设备(如树莓派)中。

目标检测结合了分类和定位的任务。它不仅确定图像中存在哪些对象,而且通过例如围绕它们绘制边界框等方式,确定它们的位置。这种额外的复杂性使得目标检测成为理解视觉场景的更强大工具,但也需要更复杂的模型和训练技术。

在边缘人工智能领域,我们与受限的计算资源一起工作,实现高效的目标检测模型变得至关重要。我们在图像分类中面临的一些挑战——平衡模型大小、推理速度和准确性——在目标检测中得到了放大。然而,回报也更加显著,因为目标检测能够实现更细致和详细的可视数据分析。

边缘设备上目标检测的一些应用包括:

  1. 监控和安全系统

  2. 自动驾驶汽车和无人机

  3. 工业质量控制

  4. 野生动物监测

  5. 增强现实应用

当我们着手目标检测时,我们将基于我们在图像分类中探索的概念和技术。我们将检查为效率而设计的流行目标检测架构,例如:

  • 单阶段检测器,如 MobileNet 和 EfficientDet,

  • FOMO (更快的目标,更多的目标),以及

  • YOLO (仅看一次)。

要了解更多关于目标检测模型的信息,请遵循教程 使用深度学习轻松入门目标识别

我们将使用

  • TensorFlow Lite 运行时(现在更名为 LiteRT),

  • Edge Impulse Linux Python SDK 和

  • Ultralytics

图片

在整个实验室中,我们将涵盖目标检测的基础知识以及它与图像分类的区别。我们还将学习如何使用从头创建的数据集训练、微调、测试、优化和部署流行的目标检测架构。

目标检测基础知识

目标检测建立在图像分类的基础上,但显著扩展了其功能。要理解目标检测,首先识别它与图像分类的关键区别至关重要:

图像分类与目标检测的比较

图像分类

  • 为整个图像分配一个标签

  • 回答问题:“这张图片的主要物体或场景是什么?”

  • 为整个图像输出一个类别预测

目标检测

  • 在图像中识别和定位多个物体

  • 回答问题:“这张图片中有什么物体,它们在哪里?”

  • 输出多个预测,每个预测包括一个类别标签和一个边界框

为了可视化这种差异,让我们考虑一个例子:

此图说明了关键的区别:图像分类为整个图像提供单个标签,而目标检测识别图像中的多个物体、它们的类别和位置。

目标检测的关键组件

目标检测系统通常由两个主要组件组成:

  1. 物体定位:此组件识别物体在图像中的位置。它通常输出边界框,即包含每个检测到的物体的矩形区域。

  2. 物体分类:此组件确定每个检测到的物体的类别或类别,类似于图像分类,但应用于每个定位区域。

目标检测的挑战

目标检测除了图像分类的挑战之外,还提出了几个挑战:

  • 多个物体:一张图片可能包含多个不同类别、大小和位置的物体。

  • 变化的尺度:物体可以在图像中以不同的尺寸出现。

  • 遮挡:物体可能部分被隐藏或重叠。

  • 背景杂乱:从复杂背景中区分物体可能具有挑战性。

  • 实时性能:许多应用需要快速的推理时间,尤其是在边缘设备上。

目标检测的方法

目标检测主要有两种方法:

  1. 双阶段检测器:这些首先提出感兴趣区域,然后对每个区域进行分类。例如包括 R-CNN 及其变体(Fast R-CNN、Faster R-CNN)。

  2. 单阶段检测器:这些在网络的单一前向传递中预测边界框(或质心)和类别概率。例如包括 YOLO(You Only Look Once)、EfficientDet、SSD(Single Shot Detector)和 FOMO(Faster Objects, More Objects)。这些通常更快,更适合像 Raspberry Pi 这样的边缘设备。

评估指标

与图像分类相比,目标检测使用不同的指标:

  • 交并比 (IoU): 衡量预测框和真实框的重叠程度。

  • 平均精度 (mAP): 结合所有类别和 IoU 阈值的精度和召回率。

  • 每秒帧数 (FPS): 衡量检测速度,对于边缘设备上的实时应用至关重要。

预训练目标检测模型概述

正如我们在引言中看到的,给定一张图片或视频流,目标检测模型可以识别可能存在的已知对象集合中的哪些对象,并提供它们在图像中的位置信息。

你可以通过访问 Object Detection - MediaPipe Studio 在线测试一些常见的模型。

Kaggle,我们可以找到与 Raspi 一起使用的最常用的预训练 tflite 模型,ssd_mobilenet_v1,EfficientDet。这些模型是在 COCO (Common Objects in Context) 数据集上训练的,包含 91 个类别中超过 200,000 张标记的图片。去下载这些模型,并将它们上传到 Raspi 的 ./models 文件夹中。

或者, 你可以在 GitHub 上找到模型和 COCO 标签。

在本实验室的第一部分,我们将专注于一个预训练的 300×300300\times 300 SSD-Mobilenet V1 模型,并将其与 320×320320\times 320 EfficientDet-lite0 进行比较,后者也是使用 COCO 2017 数据集训练的。这两个模型都转换为 TensorFlow Lite 格式(SSD Mobilenet 为 4.2 MB,EfficientDet 为 4.6 MB)。

SSD-Mobilenet V2 或 V3 建议用于迁移学习项目,但一旦 V1 TFLite 模型公开可用,我们将使用它进行此概述。

设置 TFLite 环境

我们应该确认在上一节“动手实验室”中完成的步骤,如下所示:

  • 更新 Raspberry Pi

  • 安装所需库

  • 设置虚拟环境(可选但推荐)

source ~/tflite/bin/activate
  • 安装 TensorFlow Lite 运行时

  • 在环境中安装额外的 Python 库

创建工作目录:

考虑到我们在上一个实验室中创建了 Documents/TFLITE 文件夹,现在让我们为这个目标检测实验室创建特定的文件夹:

cd Documents/TFLITE/
mkdir OBJ_DETECT
cd OBJ_DETECT
mkdir images
mkdir models
cd models

推理和后处理

让我们开始一个新的 notebook,以遵循检测图像上的所有步骤:

导入所需的库:

import time
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import tflite_runtime.interpreter as tflite

加载 TFLite 模型并分配张量:

model_path = "./models/ssd-mobilenet-v1-tflite-default-v1.tflite"
interpreter = tflite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

获取输入和输出张量。

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

输入细节将告诉我们模型应该如何用图像进行喂养。形状为(1, 300, 300, 3),数据类型为uint8告诉我们应该输入一个非归一化(像素值范围从 0 到 255)的图像,其尺寸为(300×300×3)(300\times 300\times 3),逐个输入(批处理维度:1)。

输出细节不仅包括标签(“类别”)和概率(“分数”),还包括边界框(“boxes”)相对于图像中对象位置的相对窗口位置以及检测到的对象数量(“num_detections”)。输出细节还告诉我们模型可以在图像中检测到最多 10 个对象

因此,对于上述示例,使用与Image Classification Lab相同的猫图像来寻找输出,我们有一个76%的概率在由边界框[0.028011084, 0.020121813, 0.9886069, 0.802299]定义的区域中找到了一个类别 ID 为 16的对象。这四个数字与yminxminymaxxmax有关,即框坐标。

考虑到y从顶部(ymin)到底部(ymax),x从左(xmin)到右(xmax),实际上我们有的是顶部/左上角的坐标和底部/右下角的坐标。有了两边和图片的形状,我们可以在对象周围画一个矩形,如图所示:

接下来,我们应该找出类别 ID 等于 16 代表什么。打开文件coco_labels.txt,作为一个列表,每个元素都有一个关联的索引,检查索引 16,我们得到预期的cat。概率是分数返回的值。

现在让我们上传一些带有多个对象的图像进行测试。

img_path = "./images/cat_dog.jpeg"
orig_img = Image.open(img_path)

# Display the image
plt.figure(figsize=(8, 8))
plt.imshow(orig_img)
plt.title("Original Image")
plt.show()

根据输入细节,让我们先对图像进行预处理,改变其形状并扩展其维度:

img = orig_img.resize(
    (input_details[0]["shape"][1], input_details[0]["shape"][2])
)
input_data = np.expand_dims(img, axis=0)
input_data.shape, input_data.dtype

新的input_data形状为(1, 300, 300, 3),数据类型为uint8,这与模型期望的格式兼容。

使用input_data,让我们运行解释器,测量延迟,并获取输出:

start_time = time.time()
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
end_time = time.time()
inference_time = (
    end_time - start_time
) * 1000  # Convert to milliseconds
print("Inference time: {:.1f}ms".format(inference_time))

在大约 800 毫秒的延迟下,我们可以获得 4 个不同的输出:

boxes = interpreter.get_tensor(output_details[0]["index"])[0]
classes = interpreter.get_tensor(output_details[1]["index"])[0]
scores = interpreter.get_tensor(output_details[2]["index"])[0]
num_detections = int(
    interpreter.get_tensor(output_details[3]["index"])[0]
)

快速检查后,我们可以看到模型检测到了 2 个得分超过 0.5 的对象:

for i in range(num_detections):
    if scores[i] > 0.5:  # Confidence threshold
        print(f"Object {i}:")
        print(f"  Bounding Box: {boxes[i]}")
        print(f"  Confidence: {scores[i]}")
        print(f"  Class: {classes[i]}")

我们还可以可视化结果:

plt.figure(figsize=(12, 8))
plt.imshow(orig_img)
for i in range(num_detections):
    if scores[i] > 0.5:  # Adjust threshold as needed
        ymin, xmin, ymax, xmax = boxes[i]
        (left, right, top, bottom) = (
            xmin * orig_img.width,
            xmax * orig_img.width,
            ymin * orig_img.height,
            ymax * orig_img.height,
        )
        rect = plt.Rectangle(
            (left, top),
            right - left,
            bottom - top,
            fill=False,
            color="red",
            linewidth=2,
        )
        plt.gca().add_patch(rect)
        class_id = int(classes[i])
        class_name = labels[class_id]
        plt.text(
            left,
            top - 10,
            f"{class_name}: {scores[i]:.2f}",
            color="red",
            fontsize=12,
            backgroundcolor="white",
        )

EfficientDet

EfficientDet 在技术上不是一个 SSD(单次检测器)模型,但它与 SSD 和其他目标检测架构有一些相似之处,并在此基础上构建了想法:

  1. EfficientDet:

    • 由 Google 研究人员于 2019 年开发

    • 使用 EfficientNet 作为骨干网络

    • 采用新颖的双向特征金字塔网络(BiFPN)

    • 它使用复合缩放有效地缩放主干网络和目标检测组件。

  2. 与 SSD 的相似之处:

    • 它们都是单阶段检测器,这意味着它们在单次前向传递中执行对象定位和分类。

    • 它们都使用多尺度特征图来检测不同尺度的对象。

  3. 关键区别:

    • 主干网络:SSD 通常使用 VGG 或 MobileNet,而 EfficientDet 使用 EfficientNet。

    • 特征融合:SSD 使用简单的特征金字塔,而 EfficientDet 使用更高级的 BiFPN。

    • 缩放方法:EfficientDet 为网络的所有组件引入了复合缩放

  4. EfficientDet 的优势:

    • 通常比 SSD 和许多其他目标检测模型实现更好的精度-效率权衡。

    • 更灵活的缩放允许有一系列具有不同大小-性能权衡的模型。

虽然 EfficientDet 不是一个 SSD 模型,但它可以看作是单阶段检测架构的演变,它结合了更多高级技术以提高效率和准确性。当使用 EfficientDet 时,我们可以期待得到与 SSD 类似的输出结构(例如,边界框和类别分数)。

在 GitHub 上,你可以找到另一个notebook,它探索了我们与 SSD MobileNet 一起使用的 EfficientDet 模型。

目标检测项目

现在,我们将从数据收集到训练和部署开发一个完整的图像分类项目。就像我们处理图像分类项目一样,训练和转换后的模型将被用于推理。

我们将使用相同的训练 3 个模型:SSD-MobileNet V2、FOMO 和 YOLO。

目标

所有机器学习项目都需要从一个目标开始。假设我们在一个工业设施中,必须对轮子和特殊的盒子进行分类和计数。

图片

换句话说,我们应该执行一个多标签分类,其中每张图片可以属于三个类别:

  • 背景(没有对象)

  • 盒子

  • 轮子

原始数据收集

一旦我们定义了我们的机器学习项目目标,下一步也是最重要的一步是收集数据集。我们可以使用手机、树莓派或者它们的组合来创建原始数据集(没有标签)。让我们使用树莓派上的简单 Web 应用在浏览器中查看捕获的QVGA (320 x 240)图像。

从 GitHub 获取 Python 脚本get_img_data.py,并在终端中打开它:

python3 get_img_data.py

访问 Web 界面:

  • 在树莓派本身(如果你有 GUI):打开 Web 浏览器并访问http://localhost:5000

  • 在同一网络上的另一台设备上:打开 Web 浏览器并访问http://<raspberry_pi_ip>:5000(将<raspberry_pi_ip>替换为你的树莓派的 IP 地址)。例如:http://192.168.4.210:5000/

图片

Python 脚本创建了一个基于 Web 的界面,用于使用树莓派及其摄像头捕获和组织图像数据集。这对于需要标注图像数据或不需要的机器学习项目都很有用,就像我们在这里的情况一样。

从浏览器访问 Web 界面,输入您想要捕获的图像的通用标签,然后按下开始捕获

图片

注意,要捕获的图像将具有多个标签,这些标签将在以后定义。

使用实时预览定位摄像头,然后点击捕获图像以保存当前标签下的图像(在这种情况下,box-wheel)。

图片

当我们拥有足够的图像时,我们可以按下停止捕获。捕获的图像将保存在文件夹 dataset/box-wheel 中:

图片

大约获取 60 张图像。尽量捕捉不同的角度、背景和光照条件。Filezilla 可以将创建的原始数据集传输到您的计算机。

标注数据

在对象检测项目中下一步是创建一个标注的数据集。我们应该标注原始数据集图像,在每个图片的对象周围创建边界框(箱和轮)。我们可以使用标注工具如LabelImgCVATRoboflow或甚至Edge Impulse Studio。一旦我们在其他实验室探索了 Edge Impulse 工具,让我们在这里使用 Roboflow。

我们在这里使用 Roboflow(免费版本)有两个主要原因。1) 我们可以拥有自动标注器,2) 标注的数据集以多种格式提供,并且可以在 Edge Impulse Studio(我们将用它来训练 MobileNet V2 和 FOMO)和 CoLab(YOLOv8 训练)上使用,例如。在 Edge Impulse(免费账户)上拥有标注的数据集时,无法在其他平台上用于训练。

我们应该将原始数据集上传到Roboflow。在那里创建一个免费账户并启动一个新项目,例如(“box-versus-wheel”)。

图片

一旦许多教程可用,我们不会深入介绍 Roboflow 的过程。

标注

一旦创建项目并上传数据集,您应该使用“自动标注”工具进行标注。请注意,您还可以上传只有背景的图像,这些图像应保存而不进行任何标注。

图片

一旦所有图像都进行了标注,您应该将它们分成训练、验证和测试集。

图片

数据预处理

数据集的最后一步是预处理,以生成用于训练的最终版本。让我们将所有图像调整大小为320×320320\times 320并生成每个图像的增强版本(增强),以从这些新训练示例中创建我们的模型可以学习的新训练示例。

对于增强,我们将旋转图片(+/-15^o),裁剪,并调整亮度和曝光。

图片

处理结束后,我们将有 153 张图片。

图片

现在,您应该导出 Edge Impulse、Ultralytics 和其他框架/工具可以理解的标注数据集格式,例如YOLOv8。让我们下载数据集的压缩版本到我们的桌面。

图片

在这里,您可以查看数据集是如何构建的。

图片

有 3 个独立的文件夹,每个文件夹对应一个分割(train/test/valid)。对于每个文件夹,都有 2 个子文件夹,imageslabels。图片存储为image_id.jpgimages_id.txt,其中“image_id”对于每张图片都是唯一的。

标签文件格式将是class_id 边界框坐标,在我们的例子中,class_id 将为0表示box,为1表示wheel。数字 ID(o, 1, 2…)将遵循类名的字母顺序。

data.yaml文件包含有关数据集的信息,如类的名称(names: ['box', 'wheel']),遵循 YOLO 格式。

就这样!我们准备好开始使用 Edge Impulse Studio(如我们在下一步中将要做的)进行训练,Ultralytics(如我们在讨论 YOLO 时将要做的),甚至可以在 CoLab 上从头开始训练(就像我们在图像分类实验室中对 Cifar-10 数据集所做的那样)。

预处理后的数据集可以在Roboflow 网站找到。

在 Edge Impulse Studio 上训练 SSD MobileNet 模型

前往Edge Impulse Studio,在登录处输入您的凭据(或创建一个账户),并开始一个新项目。

在这里,您可以克隆为这个动手实验室开发的工程:Raspi - 目标检测

在项目“仪表板”标签页,向下滚动到项目信息,并选择标注方法为“边界框(目标检测)”。

上传标注数据

在 Studio 中,转到“数据采集”标签,然后在“上传数据”部分,从您的电脑上传原始数据集。

我们可以使用选择一个文件夹选项,例如选择您电脑中的train文件夹,它包含两个子文件夹,imageslabels。选择图像标签格式,“YOLO TXT”,将其上传到训练类别,并按上传数据

图片

为测试数据重复此过程(上传 test 和 validation 两个文件夹)。上传过程结束后,您应该得到一个包含 153 张图片的标注数据集,分为训练/测试(84%/16%)。

注意,标签将存储在标签文件01中,它们等同于boxwheel

图片

Impulse 设计

当我们进入“创建脉冲”步骤时,首先要定义的是描述部署的目标设备。将出现一个弹出窗口。我们将选择 Raspberry 4,它是 Raspi-Zero 和 Raspi-5 之间的中间设备。

这个选择不会干扰训练;它只会给我们一个关于模型在该特定目标上的延迟的印象。

在这个阶段,您应该定义如何:

  • 预处理包括调整单个图像的大小。在我们的案例中,图像在 Roboflow 上进行了预处理,调整为320x320,所以让我们保持它。由于图像已经是方形的,所以调整大小在这里不会产生影响。如果您上传的是矩形图像,请将其压扁(方形形式,无需裁剪)。之后,您可以定义图像是否从 RGB 转换为灰度。

  • 设计一个模型,在这种情况下,是“目标检测”。

预处理整个数据集

在“图像”部分,选择颜色深度RGB,然后按“保存参数”。

Studio 会自动移动到下一个部分,“生成特征”,其中所有样本都将进行预处理,结果生成 480 个对象:207 个框和 273 个轮子。

特征探索器显示,在特征生成后,所有样本都表现出良好的分离。

模型设计、训练和测试

对于训练,我们应该选择一个预训练模型。让我们使用MobileNetV2 SSD FPN-Lite (320x320 only)。这是一个预训练的目标检测模型,旨在在图像中定位多达 10 个对象,并为每个检测到的对象输出一个边界框。该模型大小约为 3.7 MB。它支持320×320320\times 320 px 的 RGB 输入。

关于训练超参数,模型将使用以下参数进行训练:

  • 阶段:25

  • 批处理大小:32

  • 学习率:0.15。

在训练期间进行验证时,将保留数据集的 20% (validation_dataset)。

因此,该模型的总体精度得分(基于 COCO mAP)为 88.8%,高于使用测试数据时的结果(83.3%)。

部署模型

我们有两种方式来部署我们的模型:

  • TFLite 模型,它允许将训练好的模型部署为.tflite格式,以便 Raspi 使用 Python 运行。

  • Linux (AARCH64),一个适用于 Linux (AARCH64)的二进制文件,实现了 Edge Impulse Linux 协议,使我们能够在任何基于 Linux 的开发板上运行我们的模型,例如,提供 Python 的 SDK。有关更多信息,请参阅文档和设置说明

让我们部署TFLite 模型。在“仪表板”选项卡中,转到迁移学习模型(int8 量化)并点击下载图标:

将模型从您的计算机传输到 Raspi 文件夹./models,并捕获或获取一些用于推理的图像,并将它们保存在文件夹./images中。

推理和后处理

推理可以按照预训练目标检测模型概述中讨论的方式进行。让我们开始一个新的notebook,以遵循所有步骤在图像上检测立方体和轮子。

导入所需的库:

import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import tflite_runtime.interpreter as tflite

定义模型路径和标签:

model_path = "./models/ei-raspi-object-detection-SSD-\
 MobileNetv2-320x0320-int8.lite"
labels = ["box", "wheel"]

记住,模型将输出类别 ID 作为值(0 和 1),按照类别名称的字母顺序。

加载模型,分配张量,并获取输入和输出张量详情:

# Load the TFLite model
interpreter = tflite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

# Get input and output tensors
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

需要注意的一个关键区别是,模型输入细节的dtype现在是int8,这意味着输入值从-128 到+127,而我们的原始图像的每个像素值从 0 到 256。这意味着我们应该预处理图像以匹配它。我们可以在以下位置进行检查:

input_dtype = input_details[0]["dtype"]
input_dtype
numpy.int8

因此,让我们打开图像并显示它:

# Load the image
img_path = "./images/box_2_wheel_2.jpg"
orig_img = Image.open(img_path)

# Display the image
plt.figure(figsize=(6, 6))
plt.imshow(orig_img)
plt.title("Original Image")
plt.show()

图片

并执行预处理:

scale, zero_point = input_details[0]["quantization"]
img = orig_img.resize(
    (input_details[0]["shape"][1], input_details[0]["shape"][2])
)
img_array = np.array(img, dtype=np.float32) / 255.0
img_array = (
    (img_array / scale + zero_point).clip(-128, 127).astype(np.int8)
)
input_data = np.expand_dims(img_array, axis=0)

检查输入数据,我们可以验证输入张量与模型期望的兼容性:

input_data.shape, input_data.dtype
((1, 320, 320, 3), dtype('int8'))

现在,是时候进行推理了。让我们也计算模型的延迟:

# Inference on Raspi-Zero
start_time = time.time()
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
end_time = time.time()
inference_time = (
    end_time - start_time
) * 1000  # Convert to milliseconds
print("Inference time: {:.1f}ms".format(inference_time))

模型在 Raspi-Zero 上执行推理需要大约 600 毫秒,这大约是 Raspi-5 的五倍。

现在,我们可以获取检测到的对象的输出类别、边界框坐标和概率。

boxes = interpreter.get_tensor(output_details[1]["index"])[0]
classes = interpreter.get_tensor(output_details[3]["index"])[0]
scores = interpreter.get_tensor(output_details[0]["index"])[0]
num_detections = int(
    interpreter.get_tensor(output_details[2]["index"])[0]
)
for i in range(num_detections):
    if scores[i] > 0.5:  # Confidence threshold
        print(f"Object {i}:")
        print(f"  Bounding Box: {boxes[i]}")
        print(f"  Confidence: {scores[i]}")
        print(f"  Class: {classes[i]}")

图片

从结果中,我们可以看到检测到了 4 个对象:两个具有类别 ID 0(box)和两个具有类别 ID 1(wheel),这是正确的!

让我们可视化threshold为 0.5 的结果

threshold = 0.5
plt.figure(figsize=(6, 6))
plt.imshow(orig_img)
for i in range(num_detections):
    if scores[i] > threshold:
        ymin, xmin, ymax, xmax = boxes[i]
        (left, right, top, bottom) = (
            xmin * orig_img.width,
            xmax * orig_img.width,
            ymin * orig_img.height,
            ymax * orig_img.height,
        )
        rect = plt.Rectangle(
            (left, top),
            right - left,
            bottom - top,
            fill=False,
            color="red",
            linewidth=2,
        )
        plt.gca().add_patch(rect)
        class_id = int(classes[i])
        class_name = labels[class_id]
        plt.text(
            left,
            top - 10,
            f"{class_name}: {scores[i]:.2f}",
            color="red",
            fontsize=12,
            backgroundcolor="white",
        )

图片

但如果我们把阈值降低到 0.3,比如呢?

图片

我们开始看到假阳性和多次检测,其中模型以不同的置信度和略微不同的边界框多次检测到相同的对象。

通常,有时我们需要将阈值调整为更小的值以捕获所有对象,避免假阴性,这会导致多次检测。

为了提高检测结果,我们应该实现非极大值抑制(NMS),这有助于消除重叠的边界框,并仅保留最自信的检测。

为了这个目的,让我们创建一个名为non_max_suppression()的通用函数,其作用是通过消除冗余和重叠的边界框来细化目标检测结果。它通过迭代选择置信度分数最高的检测,并根据交并比(IoU)阈值移除其他显著重叠的检测来实现这一点。

def non_max_suppression(boxes, scores, threshold):
    # Convert to corner coordinates
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        inds = np.where(ovr <= threshold)[0]
        order = order[inds + 1]

    return keep

它是如何工作的:

  1. 排序:首先,根据置信度分数对所有检测进行排序,从高到低。

  2. 选择:它选择得分最高的框并将其添加到最终的检测列表中。

  3. 比较:这个选定的框与所有剩余得分较低的框进行比较。

  4. 消除:任何与选定框显著重叠(超过 IoU 阈值)的框将被消除。

  5. 迭代:这个过程会重复进行,直到处理完所有框,使用下一个得分最高的框。

现在,我们可以定义一个更精确的可视化函数,该函数将考虑 IoU 阈值,仅检测由non_max_suppression函数选定的对象:

def visualize_detections(
    image, boxes, classes, scores, labels, threshold, iou_threshold
):
    if isinstance(image, Image.Image):
        image_np = np.array(image)
    else:
        image_np = image
    height, width = image_np.shape[:2]
    # Convert normalized coordinates to pixel coordinates
    boxes_pixel = boxes * np.array([height, width, height, width])
    # Apply NMS
    keep = non_max_suppression(boxes_pixel, scores, iou_threshold)
    # Set the figure size to 12x8 inches
    fig, ax = plt.subplots(1, figsize=(12, 8))
    ax.imshow(image_np)
    for i in keep:
        if scores[i] > threshold:
            ymin, xmin, ymax, xmax = boxes[i]
            rect = patches.Rectangle(
                (xmin * width, ymin * height),
                (xmax - xmin) * width,
                (ymax - ymin) * height,
                linewidth=2,
                edgecolor="r",
                facecolor="none",
            )

            ax.add_patch(rect)
            class_name = labels[int(classes[i])]
            ax.text(
                xmin * width,
                ymin * height - 10,
                f"{class_name}: {scores[i]:.2f}",
                color="red",
                fontsize=12,
                backgroundcolor="white",
            )
    plt.show()

现在,我们可以创建一个函数来调用其他函数,对任何图像进行推理:

def detect_objects(img_path, conf=0.5, iou=0.5):
    orig_img = Image.open(img_path)
    scale, zero_point = input_details[0]["quantization"]
    img = orig_img.resize(
        (input_details[0]["shape"][1], input_details[0]["shape"][2])
    )
    img_array = np.array(img, dtype=np.float32) / 255.0
    img_array = (
        (img_array / scale + zero_point)
        .clip(-128, 127)
        .astype(np.int8)
    )
    input_data = np.expand_dims(img_array, axis=0)

    # Inference on Raspi-Zero
    start_time = time.time()
    interpreter.set_tensor(input_details[0]["index"], input_data)
    interpreter.invoke()
    end_time = time.time()
    inference_time = (
        end_time - start_time
    ) * 1000  # Convert to milliseconds

    print("Inference time: {:.1f}ms".format(inference_time))

    # Extract the outputs
    boxes = interpreter.get_tensor(output_details[1]["index"])[0]
    classes = interpreter.get_tensor(output_details[3]["index"])[0]
    scores = interpreter.get_tensor(output_details[0]["index"])[0]
    num_detections = int(
        interpreter.get_tensor(output_details[2]["index"])[0]
    )

    visualize_detections(
        orig_img,
        boxes,
        classes,
        scores,
        labels,
        threshold=conf,
        iou_threshold=iou,
    )

现在,运行代码,使用相同的图像,但置信度阈值为 0.3,并且有一个小的 IoU:

img_path = "./images/box_2_wheel_2.jpg"
detect_objects(img_path, conf=0.3, iou=0.05)

在 Edge Impulse Studio 中训练 FOMO 模型

使用 SSD MobileNet 模型的推理效果良好,但延迟显著较高。在 Raspi-Zero 上的推理时间从 0.5 到 1.3 秒不等,这意味着大约或低于 1 FPS(每秒 1 帧)。加快处理过程的一个替代方案是使用 FOMO(更快的目标,更多目标)。

这种新颖的机器学习算法使我们能够在使用比 MobileNet SSD 或 YOLO 少至30×30\times的处理能力和内存的情况下,实时地计数多个对象并找到图像中它们的位置。这之所以成为可能,主要原因是其他模型通过围绕对象绘制一个正方形(边界框)来计算对象的大小,而 FOMO 忽略了图像的大小,仅通过其质心坐标提供有关对象在图像中位置的信息。

FOMO 是如何工作的?

在典型的目标检测管道中,第一阶段是从输入图像中提取特征。FOMO 利用 MobileNetV2 来完成这项任务。MobileNetV2 处理输入图像以产生一个特征图,以计算有效的方式捕获诸如纹理、形状和对象边缘等基本特征。

一旦提取了这些特征,FOMO 的更简单架构,专注于中心点检测,将解释特征图以确定图像中对象的位置。输出是一个单元格网格,其中每个单元格表示是否检测到对象中心。该模型为每个单元格输出一个或多个置信度分数,表示对象存在的可能性。

让我们看看它在图像上的工作情况。

FOMO 使用 8 的因子将图像划分为像素块。对于输入的96×9696\times 96,网格将是12×1212\times 12 (96/8=12)(96/8=12)。对于160×160160\times 160,网格将是20×2020\times 20,依此类推。接下来,FOMO 将对每个像素块运行一个分类器来计算其中是否存在一个框或轮子的概率,然后确定具有最高概率包含物体的区域(如果一个像素块没有物体,它将被分类为背景)。从最终区域的重叠部分,FOMO 提供了该区域质心的坐标(与图像尺寸相关)。

图片

速度与精度之间的权衡

  • 网格分辨率:FOMO 使用固定分辨率的网格,这意味着每个单元格可以检测图像该部分是否存在物体。虽然它不提供高定位精度,但它通过快速和计算轻量来做出权衡,这对于边缘设备至关重要。

  • 多目标检测:由于每个单元格是独立的,FOMO 可以通过识别多个中心同时检测图像中的多个物体。

冲击设计,新的训练和测试

返回 Edge Impulse Studio,在“实验”选项卡中创建另一个冲击。现在,输入图像应该是160×160160\times 160(这是 MobilenetV2 预期的输入大小)。

图片

在“图像”选项卡上,生成特征并转到“对象检测”选项卡。

我们应该选择一个预训练的模型进行训练。让我们使用FOMO (Faster Objects, More Objects) MobileNetV2 0.35

图片

关于训练超参数,模型将使用以下参数进行训练:

  • 迭代次数:30

  • 批处理大小:32

  • 学习率:0.001。

在训练期间进行验证时,将保留数据集的 20% (validation_dataset)。对于剩余的 80% (train_dataset),我们不会应用数据增强,因为我们的数据集在 Roboflow 的标注阶段已经进行了增强。

因此,该模型最终的整体 F1 分数为 93.3%,具有令人印象深刻的延迟 8 毫秒(Raspi-4),大约比我们使用 SSD MovileNetV2 得到的延迟低 60×60\times

注意 FOMO 自动为之前定义的两个标签 boxes(0)和 wheels(1)添加了第三个标签背景。

在“模型测试”选项卡中,我们可以看到准确率为 94%。以下是其中一个测试样本的结果:

在目标检测任务中,准确率通常不是主要的评估指标。目标检测涉及对物体进行分类并在其周围提供边界框,这使得它比简单的分类更复杂。问题是我们没有边界框,只有质心。简而言之,使用准确率作为指标可能是误导性的,并且可能无法完全理解模型的表现。

部署模型

如前节所述,我们可以将训练好的模型部署为 TFLite 或 Linux (AARCH64)。现在让我们将其部署为 Linux (AARCH64),这是一个实现 Edge Impulse Linux 协议的二进制文件。

Edge Impulse for Linux 模型以 .eim 格式提供。这个 可执行文件 包含我们在 Edge Impulse Studio 中创建的“完整脉冲”。脉冲由信号处理块(s)和任何我们添加并训练的学习和异常块(s)组成。它是针对我们的处理器或 GPU(例如,ARM 内核上的 NEON 指令)进行优化的,并带有简单的 IPC 层(通过 Unix 套接字)。

在“部署”选项卡中,选择Linux (AARCH64)int8模型并按“构建”。

模型将自动下载到您的计算机上。

在我们的 Raspi 上,让我们创建一个新的工作区域:

cd ~
cd Documents
mkdir EI_Linux
cd EI_Linux
mkdir models
mkdir images

将模型重命名以便于识别:

例如,将 raspi-object-detection-linux-aarch64-FOMO-int8.eim 转移到新的 Raspi 文件夹 ./models 并捕获或获取一些图像进行推理,并将它们保存在文件夹 ./images 中。

推理和后处理

推理将使用 Linux Python SDK 进行。这个库允许我们使用 Python 在 Linux 机器上运行机器学习模型并收集传感器数据。SDK 是开源的,托管在 GitHub 上:edgeimpulse/linux-sdk-python

让我们为使用 Linux Python SDK 设置一个虚拟环境

python3 -m venv ~/eilinux
source ~/eilinux/bin/activate

安装所有需要的库:

sudo apt-get update
sudo apt-get install libatlas-base-dev\
                     libportaudio0 libportaudio2
sudo apt-get installlibportaudiocpp0 portaudio19-dev

pip3 install edge_impulse_linux -i https://pypi.python.org/simple
pip3 install Pillow matplotlib pyaudio opencv-contrib-python

sudo apt-get install portaudio19-dev
pip3 install pyaudio
pip3 install opencv-contrib-python

允许我们的模型可执行。

chmod +x raspi-object-detection-linux-aarch64-FOMO-int8.eim

在新环境中安装 Jupiter Notebook

pip3 install jupyter

在本地运行笔记本(在 Raspi-4 或 5 的桌面上)

jupyter notebook

或者在你的电脑浏览器上:

jupyter notebook --ip=192.168.4.210 --no-browser

让我们按照所有步骤开始一个新的 notebook,使用 FOMO 模型和 Edge Impulse Linux Python SDK 在图像上检测立方体和轮子。

导入所需的库:

import sys, time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import cv2
from edge_impulse_linux.image import ImageImpulseRunner

定义模型路径和标签:

model_file = "raspi-object-detection-linux-aarch64-int8.eim"
model_path = "models/" + model_file  # Trained ML model from
# Edge Impulse
labels = ["box", "wheel"]

记住,模型将以值(0 和 1)的形式输出类别 ID,按照类别名称的字母顺序排列。

加载并初始化模型:

# Load the model file
runner = ImageImpulseRunner(model_path)

# Initialize model
model_info = runner.init()

model_info 将包含关于我们模型的临界信息。然而,与 TFLite 解释器不同,EI Linux Python SDK 库现在将为推理准备模型。

因此,让我们打开图像并显示它(现在,为了兼容性,我们将使用 OpenCV,EI 内部使用的 CV 库。OpenCV 以 BGR 格式读取图像,因此我们需要将其转换为 RGB:

# Load the image
img_path = "./images/1_box_1_wheel.jpg"
orig_img = cv2.imread(img_path)
img_rgb = cv2.cvtColor(orig_img, cv2.COLOR_BGR2RGB)

# Display the image
plt.imshow(img_rgb)
plt.title("Original Image")
plt.show()

现在,我们将使用 runner 获取特征和预处理后的图像(cropped):

features, cropped = (
    runner.get_features_from_image_auto_studio_settings(img_rgb)
)

并执行推理。让我们也计算模型的延迟:

res = runner.classify(features)

让我们获取检测到的对象的输出类别、它们的边界框质心和概率。

print(
    "Found %d bounding boxes (%d ms.)"
    % (
        len(res["result"]["bounding_boxes"]),
        res["timing"]["dsp"] + res["timing"]["classification"],
    )
)
for bb in res["result"]["bounding_boxes"]:
    print(
        "\t%s (%.2f): x=%d y=%d w=%d h=%d"
        % (
            bb["label"],
            bb["value"],
            bb["x"],
            bb["y"],
            bb["width"],
            bb["height"],
        )
    )
Found 2 bounding boxes (29 ms.)
    1 (0.91): x=112 y=40 w=16 h=16
    0 (0.75): x=48 y=56 w=8 h=8

结果显示检测到两个对象:一个类别 ID 为 0(box)和一个类别 ID 为 1(wheel),这是正确的!

让我们可视化结果(阈值 为 0.5,这是在 Edge Impulse Studio 上对模型进行测试时设置的默认值)。

print(
    "\tFound %d bounding boxes (latency: %d ms)"
    % (
        len(res["result"]["bounding_boxes"]),
        res["timing"]["dsp"] + res["timing"]["classification"],
    )
)
plt.figure(figsize=(5, 5))
plt.imshow(cropped)

# Go through each of the returned bounding boxes
bboxes = res["result"]["bounding_boxes"]
for bbox in bboxes:

    # Get the corners of the bounding box
    left = bbox["x"]
    top = bbox["y"]
    width = bbox["width"]
    height = bbox["height"]

    # Draw a circle centered on the detection
    circ = plt.Circle(
        (left + width // 2, top + height // 2),
        5,
        fill=False,
        color="red",
        linewidth=3,
    )
    plt.gca().add_patch(circ)
    class_id = int(bbox["label"])
    class_name = labels[class_id]
    plt.text(
        left,
        top - 10,
        f'{class_name}: {bbox["value"]:.2f}',
        color="red",
        fontsize=12,
        backgroundcolor="white",
    )
plt.show()

使用 Ultralytics 探索 YOLO 模型

对于这个实验,我们将探索 YOLOv8. Ultralytics YOLOv8 是一个著名的实时目标检测和图像分割模型 YOLO 的版本。YOLOv8 建立在深度学习和计算机视觉的尖端进步之上,在速度和准确性方面提供了无与伦比的性能。其简化的设计使其适用于各种应用,并且易于适应不同的硬件平台,从边缘设备到云 API。

讨论 YOLO 模型

YOLO(你只看一次)模型是一个高效且广泛使用的目标检测算法,以其实时处理能力而闻名。与传统的目标检测系统不同,这些系统将分类器或定位器重新用于执行检测,YOLO 将检测问题作为一个单一的回归任务来处理。这种创新的方法使得 YOLO 能够在单个评估中同时预测多个边界框及其类别概率,从而显著提高了其速度。

关键特性:

  1. 单网络架构:

    • YOLO 使用单个神经网络处理整个图像。这个网络将图像划分为一个网格,并为每个网格单元直接预测边界框和相关类别概率。这种端到端训练提高了速度并简化了模型架构。
  2. 实时处理:

    • YOLO 的一个突出特点是其实时进行目标检测的能力。根据版本和硬件,YOLO 可以以每秒高帧数(FPS)处理图像。这使得它非常适合需要快速和准确目标检测的应用,如视频监控、自动驾驶和现场体育分析。
  3. 版本演变

    • 几年来,YOLO 经历了显著的改进,从 YOLOv1 到最新的 YOLOv10。每一代迭代都在准确性、速度和效率方面引入了改进。例如,YOLOv8 结合了网络架构的进步、改进的训练方法和更好的各种硬件支持,确保了更稳健的性能。

    • 尽管 YOLOv10 是该家族的最新成员,其论文基于令人鼓舞的性能,但它刚刚发布(2024 年 5 月),并且尚未完全集成到 Ultralytics 库中。相反,精确度-召回率曲线分析表明,YOLOv8 通常优于 YOLOv9,在捕获更多真实正例的同时,更有效地最小化了误报(更多详情见此文章)。因此,本实验室基于 YOLOv8n。

    图片

  4. 准确性和效率

    • 虽然 YOLO 的早期版本在速度上做出了一些牺牲以换取准确性,但最近版本在平衡两者方面取得了重大进展。新模型速度更快、准确性更高,能够检测小物体(如蜜蜂)并在复杂数据集上表现良好。
  5. 广泛的应用范围

    • YOLO 的通用性使其在众多领域得到应用。它被用于交通监控系统检测和计数车辆,安全应用中识别潜在威胁,以及农业技术中监测作物和牲畜。其应用范围扩展到任何需要高效和准确目标检测的领域。
  6. 社区和开发

    • YOLO 持续发展,并得到了强大的开发者和研究者社区的支持(YOLOv8 尤其强大)。开源实现和广泛的文档使其易于定制和集成到各种项目中。流行的深度学习框架如 Darknet、TensorFlow 和 PyTorch 支持 YOLO,进一步扩大了其适用性。

    • Ultralytics YOLOv8不仅可以检测(我们这里的案例)还可以分割姿态模型,这些模型在COCO数据集上预训练,以及 YOLOv8 在ImageNet数据集上预训练的分类模型。跟踪模式适用于所有检测、分割和姿态模型。

    图片

    Ultralytics YOLO 支持的任务

安装

在我们的 Raspi 上,让我们停用当前环境以创建一个新的工作区域:

deactivate
cd ~
cd Documents/
mkdir YOLO
cd YOLO
mkdir models
mkdir images

让我们为使用 Ultralytics YOLOv8 设置一个虚拟环境

python3 -m venv ~/yolo
source ~/yolo/bin/activate

并且在 Raspi 上安装 Ultralytics 的本地推理包

  1. 更新包列表,安装 pip,并升级到最新版本:
sudo apt update
sudo apt install python3-pip -y
pip install -U pip
  1. 使用可选依赖项安装ultralytics pip 包:
pip install ultralytics[export]
  1. 重启设备:
sudo reboot

测试 YOLO

Raspi-Zero 启动后,让我们激活yolo环境,进入工作目录,

source ~/yolo/bin/activate
cd /Documents/YOLO

并在终端(CLI)上运行从 Ultralytics 网站下载的图像的推理,使用 YOLOV8n 模型(家族中最小的模型):

yolo predict model='yolov8n' \
     source='https://ultralytics.com/images/bus.jpg'

YOLO 模型家族使用 COCO 数据集预训练。

推理结果将在终端中显示。在图像(bus.jpg)中,检测到 4 个persons,1 个bus和 1 个stop signal

图片

此外,我们还收到一条消息,Results saved to runs/detect/predict。检查该目录,我们可以看到一个新图像已保存(bus.jpg)。让我们从 Raspi-Zero 下载到我们的桌面进行检查:

图片

因此,Ultralytics YOLO 已正确安装在我们的 Raspi 上。但是,在 Raspi-Zero 上,这个问题是推理的高延迟,大约 18 秒,即使是最小巧的模型(YOLOv8n)也是如此。

将模型导出为 NCNN 格式

在计算能力有限的边缘设备(如 Raspi-Zero)上部署计算机视觉模型可能会导致延迟问题。一个替代方案是使用优化以获得最佳性能的格式。这确保了即使处理能力有限的设备也能很好地处理高级计算机视觉任务。

在 Ultralytics 支持的所有模型导出格式中,NCNN是一个针对移动平台进行优化的高性能神经网络推理计算框架。从设计之初,NCNN 就深入考虑了在手机上的部署和使用,并且没有第三方依赖。它是跨平台的,运行速度比所有已知的开源框架(如 TFLite)都要快。

NCNN 在处理 Raspberry Pi 设备时提供最佳推理性能。NCNN 针对移动嵌入式平台(如 ARM 架构)进行了高度优化。

因此,让我们转换我们的模型并重新运行推理:

  1. 将 YOLOv8n PyTorch 模型导出为 NCNN 格式,创建:‘/yolov8n_ncnn_model’
yolo export model=yolov8n.pt format=ncnn
  1. 使用导出的模型进行推理(现在源可以是上一次推理下载到当前目录的 bus.jpg 图像):
yolo predict model='./yolov8n_ncnn_model' source='bus.jpg'

当模型加载时,第一次推理通常具有很高的延迟(大约 17 秒),但从第二次开始,可以注意到推理时间下降到大约 2 秒。

使用 Python 探索 YOLO

首先,让我们调用 Python 解释器,这样我们可以逐行探索 YOLO 模型的工作原理:

python3

现在,我们应该从 Ultralytics 调用 YOLO 库并加载模型:

from ultralytics import YOLO

model = YOLO("yolov8n_ncnn_model")

接下来,对图像进行推理(让我们再次使用bus.jpg):

img = "bus.jpg"
result = model.predict(img, save=True, imgsz=640, conf=0.5, iou=0.3)

图片

我们可以验证,结果几乎与我们在终端级别(CLI)运行推理得到的结果相同,只是没有检测到减少的 NCNN 模型中的公交车站。注意,延迟已经减少。

让我们分析“result”内容。

例如,我们可以看到result[0].boxes.data,显示主要推理结果,它是一个形状为(4,6)的张量。每一行是检测到的对象之一,前 4 列是边界框坐标,第 5 列是置信度,第 6 列是类别(在这种情况下,0: person5: bus):

图片

我们可以分别访问几个推理结果,以及推理时间,并以更好的格式打印出来:

inference_time = int(result[0].speed["inference"])
print(f"Inference Time: {inference_time} ms")

或者,我们可以得到检测到的对象总数:

print(f"Number of objects: {len (result[0].boxes.cls)}")

图片

使用 Python,我们可以创建一个详细输出,满足我们的需求(更多详情请参阅使用 Ultralytics YOLO 进行模型预测)。让我们运行一个 Python 脚本,而不是像下面那样逐行手动输入到解释器中。让我们使用nano作为我们的文本编辑器。首先,我们应该创建一个名为,例如,yolov8_tests.py的空 Python 脚本:

nano yolov8_tests.py

输入以下代码行:

from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO("yolov8n_ncnn_model")

# Run inference
img = "bus.jpg"
result = model.predict(img, save=False, imgsz=640, conf=0.5, iou=0.3)

# print the results
inference_time = int(result[0].speed["inference"])
print(f"Inference Time: {inference_time} ms")
print(f"Number of objects: {len (result[0].boxes.cls)}")

图片

并使用以下命令进行输入:[CTRL+O] + [ENTER] + [CTRL+X]来保存 Python 脚本。

运行脚本:

python yolov8_tests.py

结果与在终端级别(CLI)和内置 Python 解释器中运行推理的结果相同。

第一次调用 YOLO 库并加载模型进行推理需要很长时间,但之后的推理将会快得多。例如,第一次单次推理可能需要几秒钟,但之后,推理时间应该减少到不到 1 秒。

在自定义数据集上训练 YOLOv8

返回到我们的“箱体与轮子”数据集,该数据集在Roboflow上标记。在“下载数据集”中,而不是为 Edge Impulse Studio 训练而执行的“下载到计算机的 zip 文件”选项,我们将选择“显示下载代码”。此选项将打开一个弹出窗口,其中包含一个代码片段,应将其粘贴到我们的训练笔记本中。

对于训练,让我们调整 Ultralytics 提供的公共示例之一,并在 Google Colab 上运行它。下面,你可以找到我的示例,你可以将其应用于你的项目:

笔记本中的关键点:

  1. 使用 GPU 运行它(NVidia T4 是免费的)

  2. 使用 PIP 安装 Ultralytics。

  3. 现在,你可以导入 YOLO 并将你的数据集上传到 CoLab,粘贴我们从 Roboflow 获得的下载代码。请注意,我们的数据集将挂载在 /content/datasets/

  1. 验证并更改文件 data.yaml 中的图像正确路径(在每个 images 文件夹中复制路径)是至关重要的。
names:

- box
- wheel
nc: 2
roboflow:
  license: CC BY 4.0
  project: box-versus-wheel-auto-dataset
  url: https://universe.roboflow.com/marcelo-rovai-riila/ \
     box-versus-wheel-auto-dataset/dataset/5
  version: 5
  workspace: marcelo-rovai-riila
test: /content/datasets/Box-versus-Wheel-auto-dataset-5/ \
      test/images
train: /content/datasets/Box-versus-Wheel-auto-dataset-5/ \
       train/images
val: /content/datasets/Box-versus-Wheel-auto-dataset-5/ \
     valid/images
  1. 定义你想要从默认值更改的主要超参数,例如:

    MODEL = 'yolov8n.pt'
    IMG_SIZE = 640
    EPOCHS = 25 # For a final project, you should consider
                # at least 100 epochs
    
  2. 使用 CLI 运行训练:

    !yolo task=detect mode=train model={MODEL} \
      data={dataset.location}/data.yaml \
      epochs={EPOCHS}
      imgsz={IMG_SIZE} plots=True
    

image-20240910111319804

模型训练了几分钟,并取得了优异的结果(mAP50 为 0.995)。训练结束时,所有结果都保存在列出的文件夹中,例如:/runs/detect/train/。在那里,你可以找到,例如,混淆矩阵。

  1. 注意,训练好的模型 (best.pt) 保存在文件夹 /runs/detect/train/weights/ 中。现在,你应该使用 valid/images 验证训练好的模型。
!yolo task=detect mode=val model={HOME}/runs/detect/train/\
       weights/best.pt data={dataset.location}/data.yaml

结果与训练相似。

  1. 现在,我们应该对留出的测试图像进行推理
!yolo task=detect mode=predict model={HOME}/runs/detect/train/\
     weights/best.pt conf=0.25 source={dataset.location}/test/\
     images save=True

推理结果保存在文件夹 runs/detect/predict 中。让我们看看其中的一些:

  1. 建议将训练、验证和测试结果导出到 Google Drive。为此,我们应该挂载驱动器。

    from google.colab import drive
    drive.mount('/content/gdrive')
    

    并将 /runs 文件夹的内容复制到你在 Drive 中创建的文件夹中,例如:

    !scp -r /content/runs '/content/gdrive/MyDrive/\
     10_UNIFEI/Box_vs_Wheel_Project'
    

使用训练的模型,通过 Raspi 进行推理

将训练好的模型 /runs/detect/train/weights/best.pt 下载到你的电脑。使用 FileZilla FTP,让我们将 best.pt 转移到 Raspi 模型文件夹(在传输之前,你可能需要更改模型名称,例如,box_wheel_320_yolo.pt)。

使用 FileZilla FTP,让我们将测试数据集中的几张图像转移到 .\YOLO\images

让我们回到 YOLO 文件夹并使用 Python 解释器:

cd ..
python

如前所述,我们将导入 YOLO 库并定义我们的转换模型以检测蜜蜂:

from ultralytics import YOLO

model = YOLO("./models/box_wheel_320_yolo.pt")

现在,让我们定义一个图像并调用推理(这次我们将保存图像结果以进行外部验证):

img = "./images/1_box_1_wheel.jpg"
result = model.predict(img, save=True, imgsz=320, conf=0.5, iou=0.3)

让我们对多张图像重复操作。推理结果保存在变量 result 中,处理后的图像在 runs/detect/predict8

使用 FileZilla FTP,我们可以将推理结果发送到我们的桌面进行验证:

我们可以看到推理结果非常出色!该模型是基于 YOLOv8 家族的小型基础模型(YOLOv8n)训练的。问题是延迟,大约 1 秒(或 Raspi-Zero 上的 1 FPS)。当然,我们可以减少这个延迟并将模型转换为 TFLite 或 NCNN。

在实时流中进行目标检测

本实验室中探索的所有模型都可以使用摄像头实时检测物体。捕获的图像应该是训练和转换后的模型的输入。对于带有桌面的 Raspi-4 或 5,OpenCV 可以捕获帧并显示推理结果。

然而,使用摄像头创建实时流以检测物体也是可能的。例如,让我们从为图像分类应用程序开发的脚本开始,并对其进行修改以适应使用 TensorFlow Lite 和 Flask 的实时目标检测 Web 应用程序

此应用程序版本适用于所有 TFLite 模型。请验证模型是否位于其正确的文件夹中,例如:

model_path = "./models/ssd-mobilenet-v1-tflite-default-v1.tflite"

GitHub下载 Python 脚本object_detection_app.py

在终端中运行:

python3 object_detection_app.py

然后访问 Web 界面:

  • 在 Raspberry Pi 本身(如果您有 GUI):打开网页浏览器,访问http://localhost:5000

  • 从同一网络中的另一台设备:打开网页浏览器,访问http://<raspberry_pi_ip>:5000(将<raspberry_pi_ip>替换为您的 Raspberry Pi 的 IP 地址)。例如:http://192.168.4.210: 5000/

这里有一些应用程序在外部桌面运行时的截图

图片

让我们看看在目标检测应用程序中使用的关键模块的技术描述:

  1. TensorFlow Lite (tflite_runtime)

    • 目的:在边缘设备上高效推理机器学习模型。

    • 为什么:与完整的 TensorFlow 相比,TFLite 提供了更小的模型大小和优化的性能,这对于资源受限的设备(如 Raspberry Pi)至关重要。它支持硬件加速和量化,进一步提高了效率。

    • 关键功能:用于加载和运行模型的Interpreter,以及用于与模型交互的get_input_details()get_output_details()

  2. Flask

    • 目的:轻量级 Web 框架,用于创建后端服务器。

    • 为什么:Flask 的简单性和灵活性使其成为快速开发和部署 Web 应用程序的理想选择。它比适合边缘设备的较大框架资源消耗更少。

    • 关键组件:用于定义 API 端点的路由装饰器,用于流式传输视频的Response对象,以及用于提供动态 HTML 的render_template_string

  3. Picamera2

    • 目的:与 Raspberry Pi 摄像头模块接口。

    • 为什么:Picamera2 是控制 Raspberry Pi 摄像头的最新库,在性能和功能上优于原始的 Picamera 库。

    • 关键功能:create_preview_configuration()用于设置摄像头,capture_file()用于捕获帧。

  4. PIL (Python Imaging Library)

    • 目的:图像处理和操作。

    • 原因:PIL 提供了广泛的电影处理能力。它在这里用于调整图像大小、绘制边界框和在不同图像格式之间转换。

    • 关键类:Image 用于加载和操作图像,ImageDraw 用于在图像上绘制形状和文本。

  5. NumPy

    • 目的:高效的数组操作和数值计算。

    • 原因:NumPy 的数组操作比纯 Python 列表快得多,这对于高效处理图像数据和模型输入/输出至关重要。

    • 关键函数:array() 用于创建数组,expand_dims() 用于向数组添加维度。

  6. 线程

    • 目的:任务的并发执行。

    • 原因:线程允许同时捕获帧、对象检测和 Web 服务器操作,这对于保持实时性能至关重要。

    • 关键组件:Thread 类创建独立的执行线程,Lock 用于线程同步。

  7. io.BytesIO

    • 目的:内存中的二进制流。

    • 原因:允许在内存中高效处理图像数据,无需临时文件,提高速度并减少 I/O 操作。

  8. 时间

    • 目的:时间相关函数。

    • 原因:用于添加延迟(time.sleep())以控制帧率并进行性能测量。

  9. jQuery(客户端)

    • 目的:简化 DOM 操作和 AJAX 请求。

    • 原因:它使得动态更新网页界面并与服务器通信而不需要页面重新加载变得容易。

    • 关键函数:.get().post() 用于 AJAX 请求,DOM 操作方法用于更新用户界面。

关于主应用程序系统架构:

  1. 主线程:运行 Flask 服务器,处理 HTTP 请求并提供服务端界面。

  2. 相机线程:持续从相机捕获帧。

  3. 检测线程:通过 TFLite 模型处理帧进行对象检测。

  4. 帧缓冲区:共享内存空间(由锁保护),存储最新帧和检测结果。

关于应用程序数据流,我们可以简要描述:

  1. 摄像头捕获帧 → 帧缓冲区

  2. 检测线程从帧缓冲区读取 → 通过 TFLite 模型处理 → 在帧缓冲区更新检测结果

  3. Flask 路由访问帧缓冲区以提供最新帧和检测结果

  4. 网络客户端通过 AJAX 接收更新并更新用户界面

这种架构允许在保持资源受限的边缘设备(如 Raspberry Pi)上运行的响应式 Web 界面的同时,进行高效的实时对象检测。线程和高效的库如 TFLite 和 PIL 使系统能够实时处理视频帧,而 Flask 和 jQuery 提供了一种用户友好的方式来与之交互。

您可以使用另一个预处理的模型测试应用程序,例如 EfficientDet,更改应用程序行:

model_path = "./models/lite-model_efficientdet_lite0_\
 detection_metadata_1.tflite"

如果我们想使用 SSD-MobileNetV2 模型的应用,该模型在 Edge Impulse Studio 上使用“盒子与轮子”数据集进行训练,代码也应根据输入细节进行适配,正如我们在其notebook中探讨的那样。

摘要

本实验室探讨了在 Raspberry Pi 等边缘设备上实现对象检测的实施,展示了在资源受限的硬件上运行高级计算机视觉任务的强大功能和潜力。我们涵盖了几个关键方面:

  1. 模型比较:我们研究了不同的对象检测模型,包括 SSD-MobileNet、EfficientDet、FOMO 和 YOLO,比较了它们在边缘设备上的性能和权衡。

  2. 训练和部署:使用在 Roboflow 上标记的盒子和小轮子(自定义数据集),我们介绍了使用 Edge Impulse Studio 和 Ultralytics 训练模型并在 Raspberry Pi 上部署它们的过程。

  3. 优化技术:为了提高边缘设备上的推理速度,我们探索了各种优化方法,例如模型量化(TFLite int8)和格式转换(例如,转换为 NCNN)。

  4. 实时应用:实验室展示了实时对象检测网络应用,展示了这些模型如何集成到实际、交互式系统中。

  5. 性能考虑:在整个实验室中,我们讨论了模型准确性与推理速度之间的平衡,这是边缘 AI 应用的关键考虑因素。

在边缘设备上执行对象检测的能力为各个领域打开了无数的可能性,从精准农业、工业自动化和质量控制到智能家居应用和环境监测。通过本地处理数据,这些系统可以提供降低延迟、提高隐私性以及在有限连接性的环境中运行的能力。

展望未来,进一步探索的潜在领域包括:

  • 实现多模型管道以处理更复杂的任务

  • 探索 Raspberry Pi 的硬件加速选项

  • 将对象检测与其他传感器集成以构建更全面的边缘 AI 系统

  • 开发利用本地处理和云资源的边缘到云解决方案

在边缘设备上进行对象检测可以创建智能、响应迅速的系统,将 AI 的力量直接带入物理世界,开辟了我们与环境和理解环境的新领域。

资源

小型语言模型(SLM)

图片

DALL·E 提示 - 一幅 1950 年代风格的卡通插图,展示一个 Raspberry Pi 在边缘运行一个小型语言模型。Raspberry Pi 以复古未来主义的方式设计,边缘圆润,铬色装饰,连接到有趣的卡通式传感器和设备。气泡在周围飘浮,代表语言处理,背景是一个奇妙的互联设备景观,有电线和小型小玩意,所有这些都以复古卡通风格绘制。色彩调色板使用柔和的粉彩颜色和典型的 1950 年代卡通的粗轮廓,给场景增添了乐趣和怀旧感。

概述

在人工智能快速增长的领域,边缘计算为将传统上保留给强大、集中式服务器的功能去中心化提供了机会。本实验探讨了将传统大型语言模型(LLMs)的小型版本集成到 Raspberry Pi 5 中的实际应用,将这个边缘设备转变为一个能够实时、现场处理数据的 AI 中心。

随着大型语言模型在规模和复杂性上的增长,小型语言模型(SLMs)为边缘设备提供了一个引人注目的替代方案,在性能和资源效率之间取得了平衡。通过直接在 Raspberry Pi 上运行这些模型,我们可以创建响应式、保护隐私的应用程序,即使在有限或没有互联网连接的环境中也能运行。

本实验将指导您在 Raspberry Pi 上设置、优化和利用 SLMs。我们将探讨Ollama的安装和使用。这个开源框架允许我们在自己的机器上(我们的台式机或边缘设备,如 Raspberry Pi 或 NVidia Jetsons)本地运行 LLMs。Ollama 被设计成高效、可扩展且易于使用,使其成为部署 AI 模型(如 Microsoft Phi、Google Gemma、Meta Llama 和 LLaVa(多模态))的好选择。我们将使用 Python 生态系统将这些模型中的某些集成到项目中,探索它们在现实世界场景中的潜力(或者至少指向这个方向)。

图片

设置

我们可以使用之前实验中的任何 Raspi 型号,但在这里,选择必须是 Raspberry Pi 5(Raspi-5)。这是一个坚固的平台,实质性地升级了上一版本的 4,配备了 Broadcom BCM2712,一个 2.4 GHz 四核 64 位 Arm Cortex-A76 CPU,具有加密扩展和增强的缓存功能。它拥有 VideoCore VII GPU,双 4Kp60 HDMI®输出带 HDR,以及 4Kp60 HEVC 解码器。内存选项包括 4 GB 和 8 GB 的高速 LPDDR4X SDRAM,我们选择 8 GB 来运行 SLMs。它还通过 microSD 卡槽和 PCIe 2.0 接口提供可扩展的存储,用于快速外围设备,如 M.2 SSDs(固态硬盘)。

对于真正的 SSL 应用,SSD 比 SD 卡是更好的选择。

顺便提一下,正如阿拉斯代尔·艾伦所讨论的,直接在 Raspberry Pi 5 CPU 上进行推理——没有 GPU 加速——现在的性能已经与 Coral TPU 相当。

图片

更多信息,请参阅完整文章:在 Raspberry Pi 5 上基准测试 TensorFlow 和 TensorFlow Lite

Raspberry Pi 活性散热器

我们建议为这个实验室安装一个活性散热器,这是为 Raspberry Pi 5(Raspi-5)设计的专用夹具式冷却解决方案。它结合了铝制散热器和温度控制的吹风风扇,以保持 Raspi-5 在重负载下(如运行 SLMs)舒适运行。

图片

活性散热器预先涂有热垫以进行热传递,并使用弹簧加载的推钉直接安装到 Raspberry Pi 5 板上。Raspberry Pi 固件会主动管理它:在 60°C 时,风扇将开启;在 67.5°C 时,风扇速度将提高;最后,在 75°C 时,风扇将全速运转。当温度降至这些限制以下时,风扇将自动减速。

图片

为了防止过热,所有 Raspberry Pi 板在温度达到 80°C 时开始降低处理器速度,当温度达到最大温度 85°C 时进一步降低速度(更多详情这里)。

生成式 AI(GenAI)

生成式 AI 是一种能够在各种媒介如文本、图像、音频和视频中创建新、原创内容的人工智能系统。这些系统从现有数据中学习模式,并利用这些知识生成之前不存在的新颖输出。大型语言模型(LLMs)小型语言模型(SLMs)多模态模型都可以被认为是用于生成任务的生成式 AI 的类型。

生成式 AI 为 AI 驱动的内容创作提供了概念框架,其中 LLMs 作为强大的通用文本生成器。SLMs 将这项技术应用于边缘计算,而多模态模型扩展了生成式 AI 在不同数据类型上的能力。它们共同代表了一组生成式 AI 技术,每种技术都有其优势和用途,共同推动 AI 驱动的创作和理解。

大型语言模型(LLMs)

大型语言模型(LLMs)是高级人工智能系统,能够理解、处理和生成类似人类的文本。这些模型的特点是它们在训练数据量和参数数量上的巨大规模。LLMs 的关键方面包括:

  1. 规模:LLMs 通常包含数十亿个参数。例如,GPT-3 有 1750 亿个参数,而一些较新的模型超过了万亿个参数。

  2. 训练数据:它们在大量的文本数据上训练,通常包括书籍、网站和其他多样化的来源,总计达到数百甚至数千吉字节(GB)或甚至太字节(TB)的文本。

  3. 架构:大多数 LLMs 使用基于transformer 架构,这使得它们能够通过同时关注输入的不同部分来处理和生成文本。

  4. 功能:LLMs 可以在不进行特定微调的情况下执行广泛的语言任务,包括:

    • 文本生成

    • 翻译

    • 摘要

    • 问答

    • 代码生成

    • 逻辑推理

  5. 少样本学习:它们通常可以通过最少的示例或指令来理解和执行新任务。

  6. 资源密集型:由于它们的规模,LLMs 通常需要大量的计算资源来运行,通常需要强大的 GPU 或 TPU。

  7. 持续发展:LLMs 领域正在迅速发展,新的模型和技术不断涌现。

  8. 伦理考量:LLMs 的使用引发了关于偏见、错误信息和训练如此大型模型的环境影响的重大问题。

  9. 应用领域:大型语言模型(LLMs)被应用于各个领域,包括内容创作、客户服务、研究辅助和软件开发。

  10. 局限性:尽管功能强大,LLMs 仍然可能产生错误或带有偏见的信息,并且缺乏真正的理解或推理能力。

我们必须注意,我们使用的是超越文本的大型模型,我们称它们为多模态模型。这些模型能够同时整合和处理来自多种类型输入的信息。它们被设计成能够理解和生成跨各种数据形式的内容,例如文本、图像、音频和视频。

封闭模型与开放模型:

封闭模型,也称为专有模型,是指其内部工作原理、代码和训练数据不公开的 AI 模型。例如:GPT-4(由 OpenAI 开发)、Claude(由 Anthropic 开发)、Gemini(由 Google 开发)。

开放模型,也称为开源模型,是指其底层代码、架构以及通常的训练数据都是公开可用和可访问的 AI 模型。例如:Gemma(由 Google 开发)、LLaMA(由 Meta 开发)和 Phi(由 Microsoft 开发)。

开放模型特别适用于在边缘设备(如 Raspberry Pi)上运行模型,因为它们更容易适应、优化和部署在资源受限的环境中。然而,验证它们的许可证至关重要。开放模型附带各种开源许可证,可能会影响它们在商业应用中的使用,而封闭模型则具有明确、尽管有些限制的服务条款。

修改自 arXiv

小型语言模型(SLMs)

在边缘计算设备如树莓派(Raspberry Pi)的背景下,全规模的大型语言模型(LLMs)通常太大且资源密集,无法直接运行。这种限制推动了更小、更高效的模型的发展,例如小型语言模型(SLMs)。

SLMs 是 LLMs 的紧凑版本,旨在在资源受限的设备上(如智能手机、物联网设备和树莓派等单板计算机)高效运行。这些模型在尺寸和计算需求方面比其大型对应物小得多,同时仍然保留了令人印象深刻的语言理解和生成能力。

SLMs 的关键特性包括:

  1. 参数数量减少:通常从几亿到几十亿参数不等,相比之下,大型模型有两位数的十亿参数。

  2. 更低的内存占用:最多只需要几 GB 的内存,而不是数十或数百 GB。

  3. 更快的推理时间:在边缘设备上可以以毫秒到秒的速度生成响应。

  4. 能源效率:消耗更少的电力,使其适合电池供电的设备。

  5. 隐私保护:允许在设备上处理数据,而无需发送到云端服务器。

  6. 离线功能:无需互联网连接即可运行。

SLMs 通过知识蒸馏、模型剪枝和量化等各种技术实现其紧凑的尺寸。虽然它们可能无法与更大模型的广泛能力相匹配,但 SLMs 在特定任务和领域方面表现出色,使它们非常适合边缘设备上的针对性应用。

我们通常将 SLMs 视为参数量少于 50 亿且量化为 4 位的语言模型。

SLMs 的例子包括 Meta Llama、Microsoft PHI 和 Google Gemma 等模型的压缩版本。这些模型使得在边缘设备上直接执行广泛的自然语言处理任务成为可能,从文本分类和情感分析到问答和有限的文本生成。

关于 SLMs 的更多信息,论文《LLM Pruning and Distillation in Practice: The Minitron Approach》(arxiv.org/pdf/2408.11796)提供了一种将剪枝和蒸馏应用于从 LLMs 获得 SLMs 的方法。而《SMALL LANGUAGE MODELS: SURVEY, MEASUREMENTS, AND INSIGHTS》(arxiv.org/pdf/2409.15790)则对小型语言模型(SLMs)进行了全面的调查和分析,这些模型具有 1 亿到 50 亿参数,旨在为资源受限的设备设计。

Ollama

图片

ollama logo

Ollama 是一个开源框架,允许我们在自己的机器上本地运行语言模型(LMs),无论是大型还是小型。以下是关于 Ollama 的一些关键点:

  1. 本地模型执行:Ollama 使得在个人电脑或边缘设备(如 Raspi-5)上运行 LMs 成为可能,从而消除了对基于云的 API 调用的需求。

  2. 易于使用:它提供了一个简单的命令行界面,用于下载、运行和管理不同的语言模型。

  3. 模型多样性:Ollama 支持各种 LLM,包括 Phi、Gemma、Llama、Mistral 和其他开源模型。

  4. 定制:用户可以创建和分享定制模型,以满足特定需求或领域。

  5. 轻量级:设计为高效且能在消费级硬件上运行。

  6. API 集成:提供 API,允许与其他应用程序和服务集成。

  7. 隐私优先:通过本地运行模型,它解决了与向外部服务器发送数据相关的隐私问题。

  8. 跨平台:适用于 macOS、Windows 和 Linux 系统(我们的案例,在这里)。

  9. 活跃开发:定期更新新功能和模型支持。

  10. 社区驱动:受益于社区贡献和模型共享。

要了解更多关于 Ollama 是什么以及它的工作原理,你应该看看来自Matt Williams,Ollama 创始人之一的这个简短视频:

www.youtube.com/embed/90ozfdsQOKo

Matt 有一个关于 Ollama 的完全免费的课程,我们推荐:youtu.be/9KEUFe4KQAI?si=D_-q3CMbHiT-twuy

安装 Ollama

让我们设置并激活一个用于与 Ollama 一起工作的虚拟环境:

python3 -m venv ~/ollama
source ~/ollama/bin/activate

然后运行以下命令来安装 Ollama:

curl -fsSL https://ollama.com/install.sh | sh

因此,API 将在后台运行在127.0.0.1:11434。从现在起,我们可以通过终端运行 Ollama。首先,让我们验证 Ollama 的版本,这也会告诉我们它是否正确安装:

ollama -v

Ollama 库页面,我们可以找到 Ollama 支持的模型。例如,通过按最受欢迎筛选,我们可以看到 Meta Llama、Google Gemma、Microsoft Phi、LLaVa 等。

Meta Llama 3.2 1B/3B

让我们安装并运行我们的第一个小型语言模型Llama 3.2 1B(和 3B)。Meta Llama 3.2 系列包括一系列可在 1 亿和 30 亿参数大小中使用的多语言生成语言模型。这些模型旨在处理文本输入并生成文本输出。此系列中的指令调整变体专门针对多语言对话应用进行了优化,包括涉及信息检索和摘要的代理方法。与许多现有的开源和专有聊天模型相比,Llama 3.2 指令调整模型在广泛使用的行业基准测试中表现出卓越的性能。

1B 和 3B 模型是从 Llama 8B 中剪枝得到的,然后使用 8B 和 70B 模型的 logits 作为标记级目标(标记级蒸馏)。使用知识蒸馏来恢复性能(它们是用 9 万亿个标记训练的)。1B 模型有 1,24B 个参数,量化为整数(Q8_0),3B 模型有 3.12B 个参数,使用 Q4_0 量化,最终大小分别为 1.3 GB 和 2 GB。其上下文窗口为 131,072 个标记。

安装并运行 模型

ollama run llama3.2:1b

使用之前的命令运行模型,我们应该有 Ollama 提示可用,以便我们输入问题并开始与 LLM 模型聊天;例如,

>>> 法国首都是什么?

几乎立即,我们得到了正确答案:

The capital of France is Paris.

在调用模型时使用 --verbose 选项将生成关于其性能的几个统计数据(模型将在我们第一次运行命令时进行轮询)。

每个指标都能揭示模型处理输入和生成输出的方式。以下是每个指标的含义分解:

  • 总持续时间(2.620170326 秒):这是从命令开始到响应完成所花费的完整时间。它包括加载模型、处理输入提示和生成响应。

  • 加载持续时间(39.947908 毫秒):这个持续时间表示将模型或必要组件加载到内存中的时间。如果这个值很小,可以表明模型是预先加载的,或者只需要最小的设置。

  • 提示评估计数(32 个标记):输入提示中的标记数量。在 NLP 中,标记通常是单词或子词,因此这个计数包括模型评估以理解和响应查询的所有标记。

  • 提示评估持续时间(1.644773 秒):这衡量模型评估或处理输入提示的时间。它占用了总持续时间的大部分,这意味着理解查询和准备响应是整个过程中最耗时的部分。

  • 提示评估速率(19.46 个标记/秒):这个速率表明模型处理输入提示中的标记有多快。它反映了模型在自然语言理解方面的速度。

  • 评估计数(8 个标记):这是模型响应中的标记数量,在这种情况下是,“法国的首都是巴黎。”

  • 评估持续时间(889.941 毫秒):这是根据评估输入生成输出所需的时间。它比提示评估要短得多,这表明生成响应比理解提示更简单或计算密集度更低。

  • 评估速率(8.99 个标记/秒):类似于提示评估速率,这表明模型生成输出标记的速度。这是理解模型在输出生成效率方面的一个关键指标。

这详细的分解可以帮助我们了解在边缘设备(如 Raspberry Pi 5)上运行 SLMs(如 Llama)的计算需求和性能特征。这表明,虽然提示评估耗时更长,但实际生成响应相对较快。这种分析对于优化性能和诊断实时应用中的潜在瓶颈至关重要。

加载并运行 3B 模型,我们可以看到相同提示下的性能差异;

评估率较低,5.3 个 token/s 与较小模型相比为 9 个 token/s。

当提出问题时

>>> 巴黎和智利圣地亚哥之间的距离是多少?

1B 模型回答了 9,841 公里(6,093 英里),这是不准确的,而 3B 模型回答了 7,300 英里(11,700 公里),接近正确答案(11,642 公里)。

让我们询问巴黎的坐标:

>>> 巴黎的经纬度是多少?

The latitude and longitude of Paris are 48.8567° N (48°55'
42" N) and 2.3510° E (2°22' 8" E), respectively.

1B 和 3B 模型都给出了正确答案。

Google Gemma 2 2B

让我们安装 Gemma 2,这是一个高性能且高效的模型,有三种尺寸:2B、9B 和 27B。我们将安装 Gemma 2 2B,这是一个经过 2 万亿 token 训练的轻量级模型,通过蒸馏从更大模型中学习,产生了超出预期的结果。该模型有 26 亿个参数和一个 Q4_0 量化,最终大小为 1.6 GB。其上下文窗口为 8,192 个 token。

安装和运行 模型

ollama run gemma2:2b --verbose

使用之前的命令运行模型,我们应该有 Ollama 提示可用,以便我们输入问题并开始与 LLM 模型聊天;例如,

>>> 法国的首都是什么?

几乎立即,我们得到了正确答案:

法国的首都是**巴黎**。 🗼

以及它的统计数据。

我们可以看到 Gemma 2:2B 的性能与 Llama 3.2:3B 大致相同,但参数更少。

其他示例:

>>> What is the distance between Paris and Santiago, Chile?

The distance between Paris, France and Santiago, Chile is
approximately **7,000 miles (11,267 kilometers)**.

Keep in mind that this is a straight-line distance, and actual
travel distance can vary depending on the chosen routes and any
stops along the way. ✈️`

虽然回答很好,但不如 Llama3.2:3B 准确。

>>> what is the latitude and longitude of Paris?

You got it! Here are the latitudes and longitudes of Paris,
France:

* **Latitude**: 48.8566° N (north)
* **Longitude**: 2.3522° E (east)

Let me know if you'd like to explore more about Paris or its
location! 🗼🇫🇷

一个好且准确的答案(比 Llama 的答案稍微冗长一些)。

微软 Phi3.5 3.8B

让我们拉取一个更大的(但仍然很小)模型,PHI3.5,这是微软的一个 3.8B 轻量级最先进开源模型。该模型属于 Phi-3 模型系列,支持 128K token 的上下文长度,以及以下语言:阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语和乌克兰语。

模型大小(以字节为单位)将取决于所使用的特定量化格式。大小可以从 2 位量化(q2_k)的 1.4 GB(高性能/低质量)到 16 位量化(fp-16)的 7.6 GB(低性能/高质量)不等。

让我们运行 4 位量化(Q4_0),这将需要 2.2GB 的 RAM,在输出质量和性能之间进行中间权衡。

ollama run phi3.5:3.8b --verbose

您可以使用runpull来下载模型。发生的情况是 Ollama 会记录拉取的模型,一旦 PHI3 不存在,在运行之前,Ollama 会拉取它。

让我们使用之前使用的相同提示进入:

>>> What is the capital of France?

The capital of France is Paris. It' extradites significant
historical, cultural, and political importance to the country as
well as being a major European city known for its art, fashion,
gastronomy, and culture. Its influence extends beyond national
borders, with millions of tourists visiting each year from around
the globe. The Seine River flows through Paris before it reaches
the broader English Channel at Le Havre. Moreover, France is one
of Europe's leading economies with its capital playing a key role

...

答案非常“冗长”,让我们指定一个更好的提示:

在这种情况下,答案仍然比我们预期的要长,评估速率为 2.25 个 token/秒,是 Gemma 和 Llama 的两倍多。

选择最合适的提示是与 LLM 一起使用的重要技能之一,无论其大小如何。

当我们询问关于距离和经纬度的相同问题时,我们没有得到关于13,507 公里(8,429 英里)距离的良好答案,但对于坐标来说还可以。再次强调,它可能更加简洁(每个答案超过 200 个 token)。

由于它们的速度相对适中,我们可以使用任何模型作为助手,但截至 2023 年 9 月 24 日,Llama2:3B 是一个更好的选择。您应该根据您的需求尝试其他模型。🤗 Open LLM Leaderboard可以给您一个关于最佳模型在大小、基准、许可等方面的想法。

最好的模型是适合您特定需求的模型。同时,考虑到这个领域每天都在随着新模型的发展而演变。

多模态模型

多模态模型是能够处理和理解来自多个来源的信息的人工智能(AI)系统,如图像、文本、音频和视频。在我们的上下文中,多模态 LLM 可以处理各种输入,包括文本、图像和音频,并将这些提示转换为各种输出,而不仅仅是源类型。

我们将在这里使用LLaVA-Phi-3,这是一个来自 Phi 3 Mini 4k 的微调过的 LLaVA 模型。它具有与原始LLaVA(大型语言和视觉助手)模型相当的性能基准。

LLaVA-Phi-3 是一个端到端训练的大型多模态模型,旨在根据视觉输入(图像)和文本指令理解和生成内容。它结合了视觉编码器和语言模型的能力,以处理和响应用户的多模态输入。

让我们安装模型:

ollama run llava-phi3:3.8b --verbose

让我们从文本输入开始:

>>> You are a helpful AI assistant.
    What is the capital of France?

As an AI language model, I can tell you that the capital of
France is Paris. It's not only the largest city in the country
but also serves as its political and administrative center.
Paris is known for its iconic landmarks such as the Eiffel
Tower, Notre-Dame Cathedral, and the Louvre Museum. The city
has a rich history, beautiful architecture, and is widely
considered to be one of the most romantic cities in the world.

响应大约需要 30 秒,评估速率为 3.93 个 token/秒!还不错!

但让我们知道以图像作为输入进入。为此,让我们创建一个工作目录:

cd Documents/
mkdir OLLAMA
cd OLLAMA

让我们从互联网下载一张 640×320640\times 320 图片,例如(维基百科:法国巴黎):

图片

例如,使用 FileZilla 将图片上传到 Raspi-5 的 OLLAMA 文件夹,并命名为 image_test_1.jpg。我们应该有完整的图片路径(我们可以使用 pwd 来获取它)。

/home/mjrovai/Documents/OLLAMA/image_test_1.jpg

如果你使用的是桌面,可以通过右键点击图片来复制图片路径。

图片

使用以下提示进入:

>>> Describe the image /home/mjrovai/Documents/OLLAMA/\
                        image_test_1.jpg

结果很棒,但整体延迟很大;推理几乎需要 4 分钟。

图片

检查本地资源

使用 htop,我们可以监控设备上运行的资源。

htop

在模型运行期间,我们可以检查资源:

图片

所有四个 CPU 都几乎以 100% 的容量运行,加载模型时使用的内存为 3.24 GB。退出 Ollama 后,内存下降到大约 377 MB(没有桌面)。

监控温度也非常重要。当使用桌面运行 Raspberry 时,你可以在任务栏上看到温度:

图片

如果你处于“无头”状态,可以使用以下命令监控温度:

vcgencmd measure_temp

如果你什么也不做,CPU 在 1% 运行时,温度大约为 50°C。在推理过程中,当 CPU 达到 100% 时,温度可以上升到几乎 70°C。这是正常的,意味着活动散热器正在工作,将温度保持在 80°C / 85°C(其限制)以下。

Ollama Python 库

到目前为止,我们已经使用终端上的命令探索了 SLMs 的聊天功能。然而,我们希望将这些模型集成到我们的项目中,因此 Python 似乎是一条正确的路径。好消息是 Ollama 有这样的库。

Ollama Python 库 简化了与高级 LLM 模型的交互,除了提供将 Python 3.8+ 项目与 Ollama 集成的最简单方式外,还使更复杂的响应和功能成为可能。

为了更好地理解如何使用 Python 和 Ollama 创建应用程序,我们可以参考 Matt Williams 的视频,如下所示:

www.youtube.com/embed/_4K20tOsXK8

安装

在终端中运行以下命令:

pip install ollama

我们需要一个文本编辑器或 IDE 来创建 Python 脚本。如果你在桌面上运行 Raspberry OS,Thonny 和 Geany 等几个选项已经默认安装(通过 [Menu][Programming] 访问)。你可以从 [Menu][Recommended Software] 下载其他 IDE,例如 Visual Studio Code。当窗口弹出时,转到 [Programming],选择你的选项,然后按 [Apply]

如果你更喜欢使用 Jupyter Notebook 进行开发:

pip install jupyter
jupyter notebook --generate-config

要运行 Jupyter Notebook,运行以下命令(更改 IP 地址为你的):

jupyter notebook --ip=192.168.4.209 --no-browser

在终端上,你可以看到打开 notebook 的本地 URL 地址:

我们可以通过在网页浏览器中输入树莓派的 IP 地址和提供的令牌来从另一台计算机访问它(我们应该从终端复制它)。

在 Raspi 的工作目录中,我们将创建一个新的 Python 3 笔记本。

让我们用一个非常简单的脚本来验证已安装的模型:

import ollama

ollama.list()

所有模型都将打印为字典,例如:

  {'name': 'gemma2:2b',
   'model': 'gemma2:2b',
   'modified_at': '2024-09-24T19:30:40.053898094+01:00',
   'size': 1629518495,
   'digest': (
     '8ccf136fdd5298f3ffe2d69862750ea7fb56555fa4d5b18c0'
     '4e3fa4d82ee09d7'
    ),

   'details': {'parent_model': '',
    'format': 'gguf',
    'family': 'gemma2',
    'families': ['gemma2'],
    'parameter_size': '2.6B',
    'quantization_level': 'Q4_0'}}]}

让我们重复之前做的一个问题,但现在使用 Ollama Python 库中的ollama.generate()。这个 API 将为给定的提示生成响应,并使用提供的模型。这是一个流式端点,所以会有一系列的响应。最终的响应对象将包括请求的统计信息和附加数据。

MODEL = "gemma2:2b"
PROMPT = "What is the capital of France?"

res = ollama.generate(model=MODEL, prompt=PROMPT)
print(res)

如果你将代码作为 Python 脚本运行,你应该保存它,例如,test_ollama.py。你可以使用 IDE 运行它或在终端上直接运行。此外,请记住,在运行独立脚本时,你应该始终调用模型并定义它。

python test_ollama.py

因此,我们将以 JSON 格式获得模型响应:

{
  'model': 'gemma2:2b',
  'created_at': '2024-09-25T14:43:31.869633807Z',
  'response': 'The capital of France is **Paris**.\n',
  'done': True,
  'done_reason': 'stop',
  'context': [
      106, 1645, 108, 1841, 603, 573, 6037, 576, 6081, 235336,
      107, 108, 106, 2516, 108, 651, 6037, 576, 6081, 603, 5231,
      29437, 168428, 235248, 244304, 241035, 235248, 108
  ],
  'total_duration': 24259469458,
  'load_duration': 19830013859,
  'prompt_eval_count': 16,
  'prompt_eval_duration': 1908757000,
  'eval_count': 14,
  'eval_duration': 2475410000
}

如我们所见,生成了几条信息,例如:

  • response:模型针对我们的提示生成的文本输出。

    • 法国的首都是**巴黎**。🇫🇷
  • context:表示模型使用的输入和上下文的标记 ID。标记是用于语言模型处理的文本的数值表示。

    • [106, 1645, 108, 1841, 603, 573, 6037, 576, 6081, 235336, 107, 108, 106, 2516, 108, 651, 6037, 576, 6081, 603, 5231, 29437, 168428, 235248, 244304, 241035, 235248, 108]

性能指标:

  • total_duration:操作所需的总时间,以纳秒为单位。在这种情况下,大约 24.26 秒。

  • load_duration:加载模型或组件所需的时间,以纳秒为单位。大约 19.83 秒。

  • prompt_eval_duration:评估提示所需的时间,以纳秒为单位。大约 16 纳秒。

  • eval_count:生成过程中评估的标记数量。这里,14 个标记。

  • eval_duration:模型生成响应所需的时间,以纳秒为单位。大约 2.5 秒。

但是,我们想要的是简单的‘响应’以及,也许为了分析,推理的总时长,所以让我们修改代码从字典中提取它:

print(f"\n{res['response']}")
print(
    f"\n [INFO] Total Duration: "
    f"{res['total_duration']/1e9:.2f} seconds"
)

现在,我们得到了:

The capital of France is **Paris**. 🇫🇷

 [INFO] Total Duration: 24.26 seconds

使用 Ollama.chat()

获取我们响应的另一种方式是使用ollama.chat(),它生成与提供的模型进行的聊天中的下一个消息。这是一个流式端点,因此将发生一系列响应。可以通过将"stream": false禁用来关闭流。最终响应对象还将包括请求的统计信息和附加数据。

PROMPT_1 = "What is the capital of France?"

response = ollama.chat(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": PROMPT_1,
        },
    ],
)
resp_1 = response["message"]["content"]
print(f"\n{resp_1}")
print(
    f"\n [INFO] Total Duration: "
    f"{(res['total_duration']/1e9):.2f} seconds"
)

答案与之前相同。

一个重要的考虑因素是,使用ollama.generate()后,响应从模型的“记忆”中“清除”(仅使用一次),但如果我们想保持对话,我们必须使用ollama.chat()。让我们看看它是如何工作的:

PROMPT_1 = "What is the capital of France?"
response = ollama.chat(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": PROMPT_1,
        },
    ],
)
resp_1 = response["message"]["content"]
print(f"\n{resp_1}")
print(
    f"\n [INFO] Total Duration: "
    f"{(response['total_duration']/1e9):.2f} seconds"
)

PROMPT_2 = "and of Italy?"
response = ollama.chat(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": PROMPT_1,
        },
        {
            "role": "assistant",
            "content": resp_1,
        },
        {
            "role": "user",
            "content": PROMPT_2,
        },
    ],
)
resp_2 = response["message"]["content"]
print(f"\n{resp_2}")
print(
    f"\n [INFO] Total Duration: "
    f"{(response_2['total_duration']/1e9):.2f} seconds"
)

在上述代码中,我们运行了两个查询,第二个提示考虑了第一个查询的结果。

这是模型的响应:

The capital of France is **Paris**. 🇫🇷

 [INFO] Total Duration: 2.82 seconds

The capital of Italy is **Rome**. 🇮🇹

 [INFO] Total Duration: 4.46 seconds

获取图像描述

就像我们使用LlaVa-PHI-3模型通过命令行分析图像一样,这里也可以用 Python 做同样的事情。让我们使用同样的巴黎图像,但现在使用ollama.generate()

MODEL = "llava-phi3:3.8b"
PROMPT = "Describe this picture"

with open("image_test_1.jpg", "rb") as image_file:
    img = image_file.read()

response = ollama.generate(model=MODEL, prompt=PROMPT, images=[img])
print(f"\n{response['response']}")
print(
    f"\n [INFO] Total Duration: "
    f"{(res['total_duration']/1e9):.2f} seconds"
)

这里是结果:

This image captures the iconic cityscape of Paris, France. The
vantage point is high, providing a panoramic view of the Seine
River that meanders through the heart of the city. Several
bridges arch gracefully over the river, connecting different
parts of the city. The Eiffel Tower, an iron lattice structure
with a pointed top and two antennas on its summit, stands
tall in the background, piercing the sky. It is painted in a
light gray color, contrasting against the blue sky speckled
with white clouds.

The buildings that line the river are predominantly white or
beige, their uniform color palette broken occasionally by red
roofs peeking through. The Seine River itself appears calm
and wide, reflecting the city's architectural beauty in its
surface. On either side of the river, trees add a touch of
green to the urban landscape.

The image is taken from an elevated perspective, looking down
on the city. This viewpoint allows for a comprehensive view of
Paris's beautiful architecture and layout. The relative
positions of the buildings, bridges, and other structures
create a harmonious composition that showcases the city's charm.

In summary, this image presents a serene day in Paris, with its
architectural marvels - from the Eiffel Tower to the river-side
buildings - all bathed in soft colors under a clear sky.

 [INFO] Total Duration: 256.45 seconds

模型大约用了 4 分钟(256.45 秒)返回详细的图像描述。

10-Ollama_Python_Library笔记本中,可以找到使用 Ollama Python 库的实验。

函数调用

到目前为止,我们可以观察到,通过将模型的响应放入一个变量中,我们可以有效地将其融入现实世界的项目中。然而,当模型对相同的输入提供不同的响应时,就会出现一个主要问题。例如,假设我们只需要在之前的例子中模型响应的国家首都名称及其坐标,没有任何附加信息,即使使用像微软 Phi 这样的冗长模型。为了确保响应的一致性,我们可以使用“Ollama 函数调用”,它与 OpenAI API 完全兼容。

但“函数调用”到底是什么呢?

在现代人工智能中,使用大型语言模型(LLMs)进行函数调用允许这些模型执行生成文本之外的操作。通过集成外部函数或 API,LLMs 可以访问实时数据,自动化任务,并与各种系统交互。

例如,与其仅仅响应关于天气的查询,一个 LLM 可以调用天气 API 来获取当前条件并提供准确、最新的信息。这种能力增强了模型响应的相关性和准确性,使其成为驱动工作流程和自动化流程的强大工具,使其成为现实世界应用中的积极参与者。

关于函数调用的更多详细信息,请参阅由Marvin Prison制作的此视频:

www.youtube.com/embed/eHfMCtlsb1o

让我们创建一个项目。

我们希望创建一个应用程序,用户输入一个国家的名称,然后得到输出,即该国首都与该应用程序位置(为了简单起见,我们将使用智利的圣地亚哥作为应用程序位置)之间的距离(公里)。

图片

一旦用户输入国家名称,模型将返回该国家的首都名称(作为字符串)以及该城市的纬度和经度(以浮点数表示)。使用这些坐标,我们可以使用一个简单的 Python 库(haversine)来计算这两个点之间的距离。

这个项目的想法是展示语言模型交互、使用 Pydantic 进行结构化数据处理以及使用 Haversine 公式(传统计算)进行地理空间计算的组合。

首先,让我们安装一些库。除了Haversine,主要的一个是OpenAI Python 库,它为任何 Python 3.7+应用程序提供了方便的访问 OpenAI REST API 的方式。另一个是Pydantic(和 instructor),这是一个由 Python 构建的强大数据验证和设置管理库,旨在增强我们代码库的健壮性和可靠性。简而言之,Pydantic将帮助确保我们的模型响应始终一致。

pip install haversine
pip install openai
pip install pydantic
pip install instructor

现在,我们应该创建一个 Python 脚本,用于与我们的模型(LLM)交互,以确定一个国家首都的坐标,并计算从圣地亚哥到该首都的距离。

让我们来看看代码:

1. 导入库

import sys
from haversine import haversine
from openai import OpenAI
from pydantic import BaseModel, Field
import instructor
  • sys:提供对系统特定参数和函数的访问。它用于获取命令行参数。

  • haversine:一个来自 haversine 库的函数,它使用 Haversine 公式计算两个地理点之间的距离。

  • openAI:一个用于与 OpenAI API 交互的模块(尽管它与本地设置(Ollama)一起使用,但这里一切都是离线的)。

  • pydantic:使用 Python 类型注解提供数据验证和设置管理。它用于定义预期响应数据的结构。

  • instructor:一个模块,用于修补 OpenAI 客户端以在特定模式下工作(可能与其结构化数据处理有关)。

2. 定义输入和模型

country = sys.argv[1]  # Get the country from
# command-line arguments
MODEL = "phi3.5:3.8b"  # The name of the model to be used
mylat = -33.33  # Latitude of Santiago de Chile
mylon = -70.51  # Longitude of Santiago de Chile
  • country:在 Python 脚本中,可以从命令行参数中获取国家名称。在 Jupyter 笔记本中,我们可以输入其名称,例如,

    • country = "France"
  • MODEL:指定正在使用的模型,在这个例子中是 phi3.5。

  • mylat mylon:圣地亚哥的坐标,用作距离计算的起点。

3. 定义响应数据结构

class CityCoord(BaseModel):
    city: str = Field(..., description="Name of the city")
    lat: float = Field(
        ..., description="Decimal Latitude of the city"
    )
    lon: float = Field(
        ..., description="Decimal Longitude of the city"
    )
  • CityCoord:一个 Pydantic 模型,用于定义 LLM 响应的预期结构。它期望有三个字段:city(城市名称)、lat(纬度)和 lon(经度)。

4. 设置 OpenAI 客户端

client = instructor.patch(
    OpenAI(
        base_url="http://localhost:11434/v1",  # Local API base
        # URL (Ollama)
        api_key="ollama",  # API key
        # (not used)
    ),
    mode=instructor.Mode.JSON,  # Mode for
    # structured
    # JSON output
)
  • OpenAI: 此设置初始化了一个带有本地基本 URL 和 API 密钥(ollama)的 OpenAI 客户端。它使用本地服务器。

  • instructor.patch: 修补 OpenAI 客户端以在 JSON 模式下工作,启用与 Pydantic 模型匹配的结构化输出。

5. 生成响应

resp = client.chat.completions.create(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": f"return the decimal latitude and \
 decimal longitude of the capital of the {country}.",
        }
    ],
    response_model=CityCoord,
    max_retries=10,
)
  • client.chat.completions.create: 调用 LLM 生成响应。

  • model: 指定要使用的模型(llava-phi3)。

  • messages: 包含对 LLM 的提示,要求提供指定国家首都的纬度和经度。

  • response_model: 指示响应应符合 CityCoord 模型。

  • max_retries: 如果请求失败,最大重试次数。

6. 计算距离

distance = haversine((mylat, mylon), (resp.lat, resp.lon), unit="km")

print(
    f"Santiago de Chile is about {int(round(distance, -1))} "
    f"kilometers away from {resp.city}."
)
  • haversine: 使用各自的坐标计算 LLM 返回的圣地亚哥·德·智利的首都之间的距离。

  • (mylat, mylon): 圣地亚哥·德·智利的坐标。

  • resp.city: 国家的首都名称

  • (resp.lat, resp.lon): 首都的坐标由 LLM 响应提供。

  • unit = ‘km’: 指定距离应以公里计算。

  • print: 输出距离,四舍五入到最接近的 10 公里,并使用千位分隔符以提高可读性。

运行代码

如果我们输入不同的国家,例如,法国、哥伦比亚和美国,我们可以注意到我们总是收到相同结构化的信息:

Santiago de Chile is about 8,060 kilometers away from
    Washington, D.C..
Santiago de Chile is about 4,250 kilometers away from Bogotá.
Santiago de Chile is about 11,630 kilometers away from Paris.

如果您将代码作为脚本运行,结果将在终端上打印:

图片

计算结果相当准确!

图片

20-Ollama_Function_Calling 笔记本中,可以找到所有已安装模型的实验。

添加图片

现在是时候总结到目前为止的内容了!让我们修改脚本,以便用户输入的不是国家名称(作为文本),而是输入一个图像,并且基于 SLM 的应用程序返回图像中的城市及其地理位置。有了这些数据,我们可以像以前一样计算距离。

图片

为了简单起见,我们将分两步实现此新代码。首先,LLM 将分析图像并创建描述(文本)。此文本将被传递到另一个实例,其中模型将提取所需信息以传递。

我们将开始导入库

import sys
import time
from haversine import haversine
import ollama
from openai import OpenAI
from pydantic import BaseModel, Field
import instructor

如果您在 Jupyter Notebook 上运行代码,我们可以看到这张图片。为此,我们还需要导入:

import matplotlib.pyplot as plt
from PIL import Image

如果我们以脚本方式运行代码,则不需要这些库。

现在,我们定义模型和本地坐标:

MODEL = "llava-phi3:3.8b"
mylat = -33.33
mylon = -70.51

我们可以下载一张新图片,例如,来自维基百科的马丘比丘。在笔记本中我们可以看到它:

# Load the image
img_path = "image_test_3.jpg"
img = Image.open(img_path)

# Display the image
plt.figure(figsize=(8, 8))
plt.imshow(img)
plt.axis("off")
# plt.title("Image")
plt.show()

图片

现在,让我们定义一个函数,该函数将接收图像并将返回图像中城市的十进制度量和十进制度,以及该城市的名称和所在国家

def image_description(img_path):
    with open(img_path, "rb") as file:
        response = ollama.chat(
            model=MODEL,
            messages=[
                {
                    "role": "user",
                    "content": """return the decimal latitude and \
 decimal longitude of the city in the image, \
 its name, and what country it is located""",
                    "images": [file.read()],
                },
            ],
            options={
                "temperature": 0,
            },
        )
    # print(response['message']['content'])
    return response["message"]["content"]

我们可以打印整个响应以供调试目的。

为该函数生成的图像描述将再次作为提示传递给模型。

start_time = time.perf_counter()  # Start timing


class CityCoord(BaseModel):
    city: str = Field(
        ..., description="Name of the city in the image"
    )
    country: str = Field(
        ...,
        description=(
            "Name of the country where "
            "the city in the image is located"
        ),
    )
    lat: float = Field(
        ...,
        description=("Decimal latitude of the city in " "the image"),
    )
    lon: float = Field(
        ...,
        description=("Decimal longitude of the city in " "the image"),
    )


# enables `response_model` in create call
client = instructor.patch(
    OpenAI(base_url="http://localhost:11434/v1", api_key="ollama"),
    mode=instructor.Mode.JSON,
)

image_description = image_description(img_path)
# Send this description to the model
resp = client.chat.completions.create(
    model=MODEL,
    messages=[
        {
            "role": "user",
            "content": image_description,
        }
    ],
    response_model=CityCoord,
    max_retries=10,
    temperature=0,
)

如果我们打印图像描述,我们将得到:

The image shows the ancient city of Machu Picchu, located in
Peru. The city is perched on a steep hillside and consists of
various structures made of stone. It is surrounded by lush
greenery and towering mountains. The sky above is blue with
scattered clouds.

Machu Picchu's latitude is approximately 13.5086° S, and its
longitude is around 72.5494° W.

模型的第二个响应(resp)将是:

CityCoord(city='Machu Picchu', country='Peru', lat=-13.5086,
                lon=-72.5494)

现在,我们可以进行“后处理”,计算距离并准备最终答案:

distance = haversine((mylat, mylon), (resp.lat, resp.lon), unit="km")

print(
    (
        f"\nThe image shows {resp.city}, with lat: "
        f"{round(resp.lat, 2)} and long: "
        f"{round(resp.lon, 2)}, located in "
        f"{resp.country} and about "
        f"{int(round(distance, -1)):,} kilometers "
        f"away from Santiago, Chile.\n"
    )
)

end_time = time.perf_counter()  # End timing
elapsed_time = end_time - start_time  # Calculate elapsed time
print(
    f"[INFO] ==> The code (running {MODEL}), "
    f"took {elapsed_time:.1f} seconds to execute.\n"
)

我们将得到:

 The image shows Machu Picchu, with lat:-13.16 and long:
 -72.54, located in Peru  and about 2,250 kilometers away
 from Santiago, Chile.

print(
    f"[INFO] ==> The code (running {MODEL}), "
    f"took {elapsed_time:.1f} seconds "
    f"to execute.\n"
)

30-Function_Calling_with_images笔记本中,可以找到使用多张图像的实验。

现在,让我们从 GitHub 下载脚本calc_distance_image.py并在终端中使用以下命令运行它:

python calc_distance_image.py \
  /home/mjrovai/Documents/OLLAMA/image_test_3.jpg

使用马丘比丘图像完整补丁作为参数。我们将得到相同的前一个结果。

图片

那么,巴黎怎么样?

图片

当然,有许多方法可以优化这里使用的代码。但想法是探索在边缘使用 SLMs 进行函数调用的巨大潜力,使这些模型能够与外部函数或 API 集成。超越文本生成,SLMs 可以访问实时数据,自动化任务,并与各种系统交互。

SLMs:优化技术

大型语言模型(LLMs)已经彻底改变了自然语言处理,但它们的部署和优化带来了独特的挑战。一个重大问题是 LLMs(以及更多的 SLMs)倾向于生成听起来合理但实际上错误的信息,这种现象被称为幻觉。这发生在模型产生看似连贯但缺乏真实或现实世界事实的内容时。

其他挑战包括训练和运行这些模型所需的巨大计算资源、在模型中维护最新知识的难度,以及需要特定领域的适应性。在训练或推理过程中处理敏感数据时,也会出现隐私问题。此外,确保跨不同任务的一致性能以及保持这些强大工具的道德使用也带来了持续挑战。解决这些问题对于在现实世界应用中有效且负责任地部署大型语言模型(LLMs)至关重要。

提高 LLM(和 SLM)性能和效率的基本技术包括微调、提示工程和检索增强生成(RAG)。

  • 微调,虽然资源消耗更大,但为将 LLMs 特定化到特定领域或任务提供了一种方法。这个过程涉及在精心挑选的数据集上进一步训练模型,使其能够将广泛的一般知识适应到特定应用中。微调可以带来性能的显著提升,尤其是在特定领域或独特用例中。

  • 提示工程是 LLM 优化的前沿。通过精心设计输入提示,我们可以引导模型生成更准确和相关的输出。这种技术涉及构建利用模型预先训练的知识和能力的问题结构,通常包括示例或具体指令来塑造期望的响应。

  • 检索增强生成(RAG)代表了一种提高 LLM 性能的强大方法。这种方法结合了预训练模型中嵌入的广泛知识以及访问和整合外部最新信息的能力。通过检索相关数据以补充模型的决策过程,RAG 可以显著提高准确性并减少生成过时或错误信息的可能性。

对于边缘应用,更有益的是关注像 RAG 这样的技术,这些技术可以增强模型性能,而无需在设备上进行微调。让我们来探讨它。

RAG 实现

在用户与语言模型的基本交互中,用户提出一个问题,这个问题作为提示发送给模型。模型根据其预先训练的知识生成一个响应。在 RAG 过程中,用户的问题和模型的响应之间有一个额外的步骤。用户的问题触发从知识库中检索的过程。

一个简单的 RAG 项目

这里是实现基本检索增强生成(RAG)的步骤:

  • 确定你将使用的文档类型:最佳类型是我们可以从中获得干净且未被遮挡的文本的文档。PDF 可能存在问题,因为它们是为打印而设计的,而不是为了提取有意义的文本。为了处理 PDF,我们应该获取源文档或使用工具来处理它。

  • 将文本分块:由于上下文大小限制和混淆的可能性,我们不能将文本存储为一个长流。分块涉及将文本分成更小的部分。分块文本有多种方式,例如字符计数、标记、单词、段落或部分。也可以重叠分块。

  • 创建嵌入:嵌入是捕获语义意义的文本的数值表示。我们通过将每个文本块通过特定的嵌入模型来创建嵌入。模型输出一个向量,其长度取决于所使用的嵌入模型。我们应该从 Ollama 拉取一个(或多个)嵌入模型来执行此任务。以下是 Ollama 可用的嵌入模型的一些示例。

    模型 参数大小 嵌入大小
    mxbai-embed-large 334M 1024
    nomic-embed-text 137M 768
    all-minilm 23M 384

    通常,更大的嵌入大小可以捕获关于输入的更细微的信息。然而,它们也需要更多的计算资源来处理,并且参数数量的增加应该会增加延迟(但也会提高响应的质量)。

  • 将片段和嵌入存储在向量数据库中:我们需要一种方法来高效地找到给定提示中最相关的文本片段,这就是向量数据库的作用。我们将使用Chromadb,这是一个 AI 原生开源向量数据库,通过创建知识、事实和技能插件简化了 RAG 的构建。每个片段的嵌入和源文本都存储在其中。

  • 构建提示:当我们有一个问题时,我们创建一个嵌入并查询向量数据库以找到最相似的片段。然后,我们选择前几个结果并将它们的文本包含在提示中。

RAG 的目标是为模型提供我们文档中最相关的信息,使其能够生成更准确和更有信息量的响应。因此,让我们实现一个简单示例,将关于蜜蜂的特定事实集(“蜜蜂事实”)纳入 SLM 中。

ollama环境中,在终端中输入 Chromadb 安装命令:

pip install ollama chromadb

让我们拉取一个中间嵌入模型,nomic-embed-text

ollama pull nomic-embed-text

并创建一个工作目录:

cd Documents/OLLAMA/
mkdir RAG-simple-bee
cd RAG-simple-bee/

让我们创建一个新的 Jupyter 笔记本,40-RAG-simple-bee来进行一些探索:

导入所需的库:

import ollama
import chromadb
import time

定义 aor 模型:

EMB_MODEL = "nomic-embed-text"
MODEL = "llama3.2:3B"

首先,应该创建一个关于蜜蜂事实的知识库。这涉及到收集相关文档并将它们转换为向量嵌入。然后,这些嵌入存储在向量数据库中,以便以后进行高效的相似性搜索。以“文档”的形式输入“蜜蜂事实”的基础列表:

documents = [
    "Bee-keeping, also known as apiculture, involves the \
 maintenance of bee colonies, typically in hives, by humans.",
    "The most commonly kept species of bees is the European \
 honey bee (Apis  mellifera).",

    ...

    "There are another 20,000 different bee species in \
 the world.",
    "Brazil alone has more than 300 different bee species, and \
 the vast majority, unlike western honey bees, don’t sting.",
    "Reports written in 1577 by Hans Staden, mention three \
 native bees used by indigenous people in Brazil.", \
    "The indigenous people in Brazil used bees for medicine \
 and food purposes",
    "From Hans Staden report: probable species: mandaçaia \
 (Melipona quadrifasciata), mandaguari (Scaptotrigona \
 postica) and jataí-amarela (Tetragonisca angustula)."
]

我们在这里不需要“分块”文档,因为我们将会使用列表中的每个元素和一个片段。

现在,我们将创建我们的向量嵌入数据库bee_facts并将文档存储在其中:

client = chromadb.Client()
collection = client.create_collection(name="bee_facts")

# store each document in a vector embedding database
for i, d in enumerate(documents):
    response = ollama.embeddings(model=EMB_MODEL, prompt=d)
    embedding = response["embedding"]
    collection.add(
        ids=[str(i)], embeddings=[embedding], documents=[d]
    )

现在我们已经创建了“知识库”,我们可以开始进行查询,从其中检索数据:

用户查询:这个过程从用户提出问题开始,例如:“一个蜂群中有多少蜜蜂?谁产卵,有多少?常见的害虫和疾病又是怎样的?”

prompt = "How many bees are in a colony? Who lays eggs and \
 how much? How about common pests and diseases?"

查询嵌入:用户的提问被转换为向量嵌入,使用与知识库相同的嵌入模型。

response = ollama.embeddings(prompt=prompt, model=EMB_MODEL)

相关文档检索:系统使用查询嵌入在知识库中进行搜索,以找到最相关的文档(在这种情况下,5 个最可能的文档)。这是通过相似性搜索完成的,它将查询嵌入与数据库中的文档嵌入进行比较。

results = collection.query(
    query_embeddings=[response["embedding"]], n_results=5
)
data = results["documents"]

提示增强:检索到的相关信息与原始用户查询相结合,以创建增强提示。现在,这个提示包含了用户的问题和知识库中的相关事实。

prompt = (
    f"Using this data: {data}. " f"Respond to this prompt: {prompt}"
)

答案生成:增强后的提示随后被输入到语言模型中,在这种情况下,是llama3.2:3b模型。该模型使用这个丰富的上下文来生成全面的答案。参数如温度、top_k 和 top_p 被设置为控制生成响应的随机性和质量。

output = ollama.generate(
  model=MODEL,
  prompt = (
      f"Using this data: {data}. "
      f"Respond to this prompt: {prompt}"
  )

  options={
    "temperature": 0.0,
    "top_k":10,
    "top_p":0.5                          }
)

响应交付:最后,系统将生成的答案返回给用户。

print(output["response"])
Based on the provided data, here are the answers to your \
questions:

1. How many bees are in a colony?
A typical bee colony can contain between 20,000 and 80,000 bees.

2. Who lays eggs and how much?
The queen bee lays up to 2,000 eggs per day during peak seasons.

3. What about common pests and diseases?
Common pests and diseases that affect bees include varroa \
mites, hive beetles, and foulbrood.

让我们创建一个函数来帮助回答新问题:

def rag_bees(prompt, n_results=5, temp=0.0, top_k=10, top_p=0.5):
    start_time = time.perf_counter()  # Start timing

    # generate an embedding for the prompt and retrieve the data
    response = ollama.embeddings(
      prompt=prompt,
      model=EMB_MODEL
    )

    results = collection.query(
      query_embeddings=[response["embedding"]],
      n_results=n_results
    )
    data = results['documents']

    # generate a response combining the prompt and data retrieved
    output = ollama.generate(
      model=MODEL,
      prompt = (
         f"Using this data: {data}. "
         f"Respond to this prompt: {prompt}"
      )

      options={
        "temperature": temp,
        "top_k": top_k,
        "top_p": top_p                          }
    )

    print(output['response'])

    end_time = time.perf_counter()  # End timing
    elapsed_time = round(
       (end_time - start_time), 1
    )  # Calculate elapsed time

print(
    f"\n[INFO] ==> The code for model: {MODEL}, "
    f"took {elapsed_time}s to generate the answer.\n"
)

    print(
       f"\n[INFO] ==> The code for model: {MODEL}, "
       f"took {elapsed_time}s to generate the answer.\n"
    )

我们现在可以创建查询并调用函数:

prompt = "Are bees in Brazil?"
rag_bees(prompt)
Yes, bees are found in Brazil. According to the data, Brazil \
has more than 300 different bee species, and indigenous people \
in Brazil used bees for medicine and food purposes. \
Additionally, reports from 1577 mention three native bees \
used by indigenous people in Brazil.

 [INFO] ==> The code for model: llama3.2:3b, took 22.7s to \
 generate the answer.

顺便说一句,如果使用的模型支持多种语言,我们可以使用它(例如,葡萄牙语),即使数据集是用英语创建的:

prompt = "Existem abelhas no Brazil?"
rag_bees(prompt)
Sim, existem abelhas no Brasil! De acordo com o relato de Hans \
Staden, há três espécies de abelhas nativas do Brasil que \
foram mencionadas: mandaçaia (Melipona quadrifasciata), \
mandaguari (Scaptotrigona postica) e jataí-amarela \
(Tetragonisca angustula). Além disso, o Brasil é conhecido \
por ter mais de 300 espécies diferentes de abelhas, a \
maioria das quais não é agressiva e não põe veneno.

 [INFO] ==> The code for model: llama3.2:3b, took 54.6s to \
            generate the answer.

进一步探索

测试的小型 LLM 模型在边缘上运行良好,无论是文本还是图像,但当然,在最后一个方面有很高的延迟。结合特定和专用模型可以带来更好的结果;例如,在实际案例中,一个目标检测模型(如 YOLO)可以对图像中的对象进行一般描述和计数,一旦传递给 LLM,就可以帮助提取关键见解和行动。

根据 Hailo 的首席技术官 Avi Baum,

在人工智能(AI)的广阔领域中,最引人入胜的旅程之一就是边缘 AI 的演变。这一旅程带我们从经典的机器视觉领域走向了判别性 AI、增强性 AI,现在,是突破性的生成 AI 前沿。每一步都让我们更接近一个未来,在那里智能系统无缝地融入我们的日常生活,提供不仅在感知上而且在手掌中也能进行创造的沉浸式体验。

摘要

本实验室展示了如何将 Raspberry Pi 5 转变为一个强大的 AI 中心,能够运行大型语言模型(LLMs),利用 Ollama 和 Python 进行实时、现场数据分析和洞察。Raspberry Pi 的多功能和强大性能,加上轻量级 LLMs 如 Llama 3.2 和 LLaVa-Phi-3-mini 的能力,使其成为边缘计算应用的优秀平台。

在边缘运行 LLMs 的潜力远远超出了简单的数据处理,正如本实验室的示例所示。以下是一些创新性的使用这个项目的建议:

1. 智能家居自动化:

  • 集成 SLMs 以解释语音命令或分析传感器数据以实现智能家居自动化。这可能包括对家庭设备、安全系统和能源管理的实时监控和控制,所有这些处理都在本地进行,不依赖云服务。

2. 场地数据收集和分析

  • 在远程或移动设置中在 Raspberry Pi 上部署 SLMs 进行实时数据收集和分析。这可以用于农业监测作物健康,在环境研究中进行野生动物追踪,或在灾害响应中进行态势感知和资源管理。

3. 教育工具:

  • 创建利用 SLMs 提供即时反馈、语言翻译和辅导的交互式教育工具。这在技术先进性和互联网连接有限的发达地区尤其有用。

4. 医疗保健应用:

  • 使用 SLMs 进行医疗诊断和患者监测。它们可以提供症状的实时分析并建议潜在的治疗方法。这可以集成到远程医疗平台或便携式健康设备中。

5. 本地商业智能:

  • 在零售或小型商业环境中实施 SLMs 以分析客户行为、管理库存和优化运营。本地处理数据的能力确保了隐私并减少了对外部服务的依赖。

6. 工业物联网:

  • 将 SLMs 集成到工业物联网系统中,用于预测性维护、质量控制和工作流程优化。树莓派可以作为本地数据处理单元,减少延迟并提高自动化系统的可靠性。

7. 自主车辆:

  • 使用 SLMs 处理来自自主车辆的感官数据,实现实时决策和导航。这可以应用于无人机、机器人和自动驾驶汽车,以增强自主性和安全性。

8. 文化遗产和旅游:

  • 实施 SLMs 以提供互动和富有信息量的文化遗产遗址和博物馆导游。游客可以使用这些系统获取实时信息和见解,增强他们的体验,无需互联网连接。

9. 艺术和创意项目:

  • 使用 SLMs 分析和生成创意内容,如音乐、艺术和文学。这可以促进创意产业中的创新项目,并在展览和表演中提供独特的互动体验。

10. 定制辅助技术:

  • 为残疾人士开发辅助技术,通过实时文本到语音、语言翻译和其他可访问工具提供个性化自适应支持。

资源

视觉语言模型(VLM)

DALL·E 提示 - 一个配备视觉任务的树莓派设置。图中显示了一个连接到摄像头的树莓派,周围以视觉方式显示了各种计算机视觉任务,包括目标检测、图像标题、分割和视觉定位。树莓派放置在桌子上,显示器显示了与这些任务相关的边界框和注释。背景应为一个家庭工作空间,其中包含开发人员和爱好者通常使用的工具和设备。

简介

在这个动手实验中,我们将持续探索边缘的 AI 应用,从 Florence-2 的基本设置,即微软最先进的视觉基础模型,到在树莓派等设备上的高级实现。我们将学习在树莓派上使用视觉语言模型(VLMs)进行标题、目标检测、定位、分割和 OCR 等任务。

为什么在边缘使用 Florence-2?

Florence-2 是微软开源的视觉语言模型,在 MIT 许可证下,通过结合轻量级架构和强大的功能,显著推进了视觉语言模型。得益于其在包含 1.26 亿张图像和 54 亿视觉注释的庞大 FLD-5B 数据集上的训练,它实现了与更大模型相当的性能。这使得 Florence-2 成为边缘部署的理想选择,因为在边缘,电力和计算资源有限。

在本教程中,我们将探讨如何使用 Florence-2 进行实时计算机视觉应用,例如:

  • 图像标题

  • 目标检测

  • 分割

  • 视觉定位

视觉定位涉及将文本描述与图像中的特定区域相关联。这使得模型能够理解在提示中描述的特定对象或实体在图像中的位置。例如,如果提示是“一辆红色的车”,模型将识别并突出显示图像中红色车所在的位置。视觉定位对于需要文本和视觉内容之间精确对齐的应用程序很有帮助,例如人机交互、图像注释和交互式人工智能系统。

在教程中,我们将逐步介绍:

  • 在树莓派上设置 Florence-2

  • 运行推理任务,如目标检测和标题

  • 优化模型以从边缘设备获得最佳性能

  • 通过微调探索实际、现实世界的应用。

Florence-2 模型架构

Florence-2 利用统一的基于提示的表示来处理各种视觉语言任务。模型架构由两个主要组件组成:一个图像编码器和一个多模态 Transformer 编码器-解码器

  • 图像编码器:图像编码器基于 DaViT (双注意力视觉 Transformer) 架构。它将输入图像转换为一系列视觉标记嵌入。这些嵌入作为视觉内容的基元表示,捕捉图像的空间和上下文信息。

  • 多模态 Transformer 编码器-解码器:Florence-2 的核心是多模态 Transformer 编码器-解码器,它将图像编码器中的视觉标记嵌入与类似 BERT 的模型生成的文本嵌入相结合。这种组合使模型能够同时处理视觉和文本输入,实现图像描述、目标检测和分割等任务的统一方法。

该模型在广泛的 FLD-5B 数据集上的训练确保它能够有效处理各种视觉任务,而无需进行特定任务的修改。Florence-2 使用文本提示来激活特定任务,使其非常灵活,并能够实现零样本泛化。对于诸如目标检测或视觉定位等任务,模型采用额外的位置标记来表示图像中的区域,确保对空间关系的精确理解。

Florence-2 的紧凑架构和创新训练方法使其能够在资源受限的设备(如树莓派)上准确执行计算机视觉任务。

技术概述

Florence-2 引入了一些创新特性,使其与众不同:

架构

图片

  • 轻量级设计:提供两种变体

    • Florence-2-Base:2.32 亿个参数

    • Florence-2-Large:7.71 亿个参数

  • 统一表示:通过单个架构处理多个视觉任务

  • DaViT 视觉编码器:将图像转换为视觉标记嵌入

  • 基于 Transformer 的多模态编码器-解码器:处理结合视觉和文本嵌入

训练数据集 (FLD-5B)

图片

  • 1.26 亿个独特图像

  • 54 亿个综合注释,包括:

    • 5 亿个文本注释

    • 13 亿个区域-文本注释

    • 36 亿个文本短语-区域注释

  • 使用专业模型自动化的注释管道

  • 高质量标签的迭代优化过程

关键能力

Florence-2 在多个视觉任务中表现出色:

零样本性能

  • 图像描述:在 COCO 上达到 135.6 CIDEr 分数

  • 视觉定位:在 Flickr30k 上达到 84.4% 的 recall@1

  • 目标检测:在 COCO val2017 上达到 37.5 mAP

  • 指代表达式:在 RefCOCO 上达到 67.0% 的准确率

微调性能

  • 尽管规模较小,但与专业模型具有竞争力

  • 在特定基准测试中优于更大的模型

  • 高效适应新任务

实际应用

Florence-2 可应用于各个领域:

  1. 内容理解

    • 自动图像描述以实现无障碍访问

    • 视觉内容审核

    • 媒体资产管理

  2. 电子商务

    • 产品图像分析

    • 视觉搜索

    • 自动产品标记

  3. 医疗保健

    • 医学图像分析

    • 诊断辅助

    • 研究数据处理

  4. 安全与监控

    • 目标检测与跟踪

    • 异常检测

    • 场景理解

比较 Florence-2 与其他 VLMs(视觉语言模型)

Florence-2 因其令人印象深刻的零样本能力而优于其他视觉语言模型。与像Google PaliGemma这样的模型不同,后者需要广泛的微调来适应各种任务,Florence-2 可以直接使用,正如我们将在本实验中看到的那样。它还可以与 GPT-4V 和 Flamingo 等更大的模型竞争,这些模型通常具有更多的参数,但有时只能匹配 Florence-2 的性能。例如,尽管参数多出两倍以上,Florence-2 在零样本结果上优于 Kosmos-2。

在基准测试中,Florence-2 在 COCO 描述和指代表达理解等任务上表现出色。它在 COCO 数据集(COCO dataset)上的目标检测和分割任务中优于 PolyFormer 和 UNINEXT 等模型。它是一个高度竞争的选择,对于既需要性能又需要资源效率的实际应用来说,这是一个很好的选择。

设置与安装

我们选择的边缘设备是 Raspberry Pi 5(Raspi-5)。其坚固的平台配备了 Broadcom BCM2712,这是一款 2.4 GHz 的四核 64 位 Arm Cortex-A76 CPU,具有加密扩展和增强的缓存能力。它拥有 VideoCore VII GPU,双 4Kp60 HDMI®输出带 HDR,以及 4Kp60 HEVC 解码器。内存选项包括 4 GB 和 8 GB 的高速 LPDDR4X SDRAM,我们选择 8 GB 来运行 Florence-2。它还通过 microSD 卡槽和 PCIe 2.0 接口提供可扩展的存储,用于快速的外设,如 M.2 SSD(固态硬盘)。

对于实际应用来说,SSD(固态硬盘)比 SD 卡是一个更好的选择。

我们建议为这个实验安装一个 Active Cooler,这是为 Raspberry Pi 5(Raspi-5)设计的专用夹式冷却解决方案。它结合了铝制散热器和温度控制的吹风风扇,以保持 Raspi-5 在重负载下(如运行 Florense-2)舒适运行。

环境配置

要在 Raspberry Pi 5 上运行Microsoft Florense-2,我们需要几个库:

  1. Transformers

    • Florence-2 使用 Hugging Face 的transformers库进行模型加载和推理。这个库提供了与预训练视觉语言模型一起工作的架构,使得执行图像描述、目标检测等任务变得容易。本质上,transformers帮助与模型交互,处理输入提示,并获得输出。
  2. PyTorch

    • PyTorch 是一个深度学习框架,它提供了运行 Florence-2 模型所需的基础设施,包括张量操作、GPU 加速(如果可用)以及模型训练/推理功能。Florence-2 模型是在 PyTorch 中训练的,我们需要利用其功能、层和计算能力,在 Raspberry Pi 上执行推理。
  3. Timm (PyTorch Image Models):

    • Florence-2 使用 timm 访问视觉模型的高效实现和预训练权重。具体来说,timm 库被用于 Florence-2 的 图像编码器 部分,特别是用于管理 DaViT 架构。它提供了常见视觉任务的模型定义和优化代码,并允许轻松集成不同类型的轻量级骨干网络,这些网络适合边缘设备。
  4. Einops:

    • Einops 是一个用于灵活和强大的张量操作的库。它使得重塑和操作张量维度变得容易,这对于 Florence-2 中进行的多模态处理尤为重要。像 Florence-2 这样的视觉语言模型通常需要重新排列图像数据、文本嵌入和视觉嵌入,以便正确地对齐 transformer 块,而 einops 简化了这些复杂的操作,使得代码更易于阅读和简洁。

简而言之,这些库使 Florence-2 能够启用不同的基本组件:

  • TransformersPyTorch 用于加载模型和运行推理。

  • Timm 用于访问和高效实现视觉编码器。

  • Einops 帮助重塑数据,便于视觉和文本特征的集成。

所有这些组件协同工作,帮助 Florence-2 在我们的 Raspberry Pi 上无缝运行,使其能够相对快速地执行复杂的视觉语言任务。

考虑到 Raspberry Pi 已经安装了其操作系统,让我们使用 SSH 从另一台计算机访问它:

ssh mjrovai@raspi-5.local

并检查分配给它的 IP:

hostname -I

192.168.4.209

更新 Raspberry Pi

首先,确保您的 Raspberry Pi 已更新:

sudo apt update
sudo apt upgrade -y

使用 PIP 的初始设置:

sudo apt install python3-pip
sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED
pip3 install --upgrade pip

安装依赖项

sudo apt-get install libjpeg-dev libopenblas-dev libopenmpi-dev \
    libomp-dev

让我们设置并激活一个用于与 Florence-2 一起工作的 虚拟环境

python3 -m venv ~/florence
source ~/florence/bin/activate

安装 PyTorch

pip3 install setuptools numpy Cython
pip3 install requests
pip3 install torch torchvision \
    --index-url https://download.pytorch.org/whl/cpu
pip3 install torchaudio \
    --index-url https://download.pytorch.org/whl/cpu

让我们验证 PyTorch 是否正确安装:

安装 Transformers、Timm 和 Einops:

pip3 install transformers
pip3 install timm einops

安装模型:

pip3 install autodistill-florence-2

Jupyter Notebook 和 Python 库

安装 Jupyter Notebook 以运行和测试我们的 Python 脚本是可能的。

pip3 install jupyter
pip3 install numpy Pillow matplotlib
jupyter notebook --generate-config

测试安装

在远程计算机上运行 Jupyter Notebook

jupyter notebook --ip=192.168.4.209 --no-browser

在 SSH 终端运行上述命令,我们可以看到打开笔记本的本地 URL 地址:

在此初始测试中使用的代码笔记本可以在 Lab GitHub 上找到:

我们可以通过在网页浏览器中输入树莓派的 IP 地址和提供的令牌来访问远程计算机(从终端复制整个 URL)。

从主页创建一个新的笔记本[Python 3 (ipykernel)]并将从 Hugging Face Hub 的示例代码复制粘贴过来。

代码旨在在给定的图像上运行 Florence-2 以执行目标检测。它加载模型,处理图像和提示,然后生成响应以识别和描述图像中的对象。

  • 处理器帮助准备文本和图像输入。

  • 模型接收处理后的输入以生成有意义的响应。

  • 后处理步骤将生成的输出细化成更易解释的形式,例如检测到的对象的边界框。

此工作流程利用 Florence-2 的灵活性来处理视觉-语言任务,并使用 PyTorch、Transformers 和相关图像处理工具高效实现。

import requests
from PIL import Image
import torch
from transformers import AutoProcessor, AutoModelForCausalLM

device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = (
    torch.float16 if torch.cuda.is_available() else torch.float32
)

model = AutoModelForCausalLM.from_pretrained(
    "microsoft/Florence-2-base",
    torch_dtype=torch_dtype,
    trust_remote_code=True,
).to(device)
processor = AutoProcessor.from_pretrained(
    "microsoft/Florence-2-base", trust_remote_code=True
)

prompt = "<OD>"

url = (
    "https://huggingface.co/datasets/huggingface/"
    "documentation-images/resolve/main/transformers/"
    "tasks/car.jpg?download=true"
)
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(text=prompt, images=image, return_tensors="pt").to(
    device, torch_dtype
)

generated_ids = model.generate(
    input_ids=inputs["input_ids"],
    pixel_values=inputs["pixel_values"],
    max_new_tokens=1024,
    do_sample=False,
    num_beams=3,
)
generated_text = processor.batch_decode(
    generated_ids, skip_special_tokens=False
)[0]

parsed_answer = processor.post_process_generation(
    generated_text,
    task="<OD>",
    image_size=(image.width, image.height),
)

print(parsed_answer)

让我们逐步分解提供的代码:

导入所需库

import requests
from PIL import Image
import torch
from transformers import AutoProcessor, AutoModelForCausalLM
  • requests:用于发送 HTTP 请求。在这种情况下,它从 URL 下载图像。

  • PIL (Pillow):提供用于操作图像的工具。在这里,它用于打开下载的图像。

  • torch:PyTorch 被导入以处理张量操作并确定硬件可用性(CPU 或 GPU)。

  • transformers:此模块通过使用AutoProcessorAutoModelForCausalLM来加载预训练模型并处理输入,提供对 Florence-2 的简单访问。

确定设备和数据类型

device = "cuda:0" if torch.cuda.is_available() else "cpu"

torch_dtype = (
    torch.float16 if torch.cuda.is_available() else torch.float32
)
  • 设备设置:代码检查是否有可用的 CUDA 启用 GPU(torch.cuda.is_available())。如果有 GPU 可用,设备设置为“cuda:0”。否则,默认为 "cpu"(我们这里的案例)。

  • 数据类型设置:如果可用 GPU,则选择torch.float16,它使用半精度浮点数以加快处理速度并减少内存使用。在 CPU 上,默认为torch.float32以保持兼容性。

加载模型和处理器

model = AutoModelForCausalLM.from_pretrained(
    "microsoft/Florence-2-base",
    torch_dtype=torch_dtype,
    trust_remote_code=True,
).to(device)

processor = AutoProcessor.from_pretrained(
    "microsoft/Florence-2-base", trust_remote_code=True
)
  • 模型初始化

    • AutoModelForCausalLM.from_pretrained() 从 Hugging Face 上微软的存储库加载预训练的 Florence-2 模型。torch_dtype根据可用的硬件(GPU/CPU)设置,trust_remote_code=True允许使用可能与模型一起提供的任何自定义代码。

    • .to(device) 将模型移动到适当的设备(CPU 或 GPU)。在我们的案例中,它将被设置为CPU

  • 处理器初始化

    • AutoProcessor.from_pretrained() 加载 Florence-2 的处理器。处理器负责将文本和图像输入转换为模型可以处理的形式(例如,编码文本、归一化图像等)。

定义提示

prompt = "<OD>"
  • 提示定义:字符串 "<OD>" 被用作提示。这指的是“目标检测”,指示模型在图像上检测对象。

下载和加载图像

url = "https://huggingface.co/datasets/huggingface/"
      "documentation-images/resolve/main/transformers/"
      "tasks/car.jpg?download=true"
image = Image.open(requests.get(url, stream=True).raw)
  • 下载图像requests.get() 函数从指定的 URL 获取图像。stream=True 参数确保图像是流式传输的,而不是一次性完全下载。

  • 打开图像Image.open() 打开图像,以便模型可以处理它。

处理输入

inputs = processor(text=prompt, images=image, return_tensors="pt").to(
    device, torch_dtype
)
  • 处理输入数据processor() 函数处理文本(提示)和图像(图像)。return_tensors="pt" 参数将处理后的数据转换为 PyTorch 张量,这对于将数据输入模型是必要的。

  • 移动输入到设备.to(device, torch_dtype) 将输入移动到正确的设备(CPU 或 GPU)并分配适当的数据类型。

生成输出

generated_ids = model.generate(
    input_ids=inputs["input_ids"],
    pixel_values=inputs["pixel_values"],
    max_new_tokens=1024,
    do_sample=False,
    num_beams=3,
)
  • 模型生成:使用 model.generate() 根据输入数据生成输出。

    • input_ids:表示提示的标记化形式。

    • pixel_values:包含处理后的图像数据。

    • max_new_tokens=1024:指定响应中要生成的最大新标记数。这限制了响应的长度。

    • do_sample=False:禁用采样;相反,生成使用确定性方法(束搜索)。

    • num_beams=3:启用具有三个束的束搜索,通过在生成过程中考虑多个可能性来提高输出质量。

解码生成的文本

generated_text = processor.batch_decode(
    generated_ids, skip_special_tokens=False
)[0]
  • 批量解码processor.batch_decode() 将生成的 ID(标记)解码为可读文本。skip_special_tokens=False 参数意味着输出将包括任何可能是响应一部分的特殊标记。

生成后的后处理

parsed_answer = processor.post_process_generation(
    generated_text,
    task="<OD>",
    image_size=(image.width, image.height),
)
  • 后处理:调用 processor.post_process_generation() 来进一步处理生成的文本,根据任务("<OD>" 用于目标检测)和图像的大小进行解释。

  • 此函数从生成的文本中提取特定信息,例如检测到的对象的边界框,使输出对视觉任务更有用。

打印输出

print(parsed_answer)
  • 最后,print(parsed_answer) 显示输出,这可能包括目标检测结果,例如图像中检测到的对象的边界框坐标和标签。

结果

运行代码,我们得到以下解析答案:

[{'<OD>': {
   'bboxes': [
     [34.23999786376953, 160.0800018310547, 597.4400024414062],
     [371.7599792480469, 272.32000732421875, 241.67999267578125],
     [303.67999267578125, 247.4399871826172, 454.0799865722656],
     [276.7200012207031, 553.9199829101562, 370.79998779296875],
     [96.31999969482422, 280.55999755859375, 198.0800018310547],
     [371.2799987792969]
    ],
    'labels': ['car', 'door handle', 'wheel', 'wheel']
}}]

首先,让我们检查一下图像:

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 8))
plt.imshow(image)
plt.axis("off")
plt.show()

通过目标检测的结果,我们可以看到:

'labels': ['car', 'door handle', 'wheel', 'wheel']

看起来至少检测到了几个对象。我们还可以实现一个代码来在找到的对象中绘制边界框:

def plot_bbox(image, data):
    # Create a figure and axes
    fig, ax = plt.subplots()

    # Display the image
    ax.imshow(image)

    # Plot each bounding box
    for bbox, label in zip(data["bboxes"], data["labels"]):
        # Unpack the bounding box coordinates
        x1, y1, x2, y2 = bbox
        # Create a Rectangle patch
        rect = patches.Rectangle(
            (x1, y1),
            x2 - x1,
            y2 - y1,
            linewidth=1,
            edgecolor="r",
            facecolor="none",
        )
        # Add the rectangle to the Axes
        ax.add_patch(rect)
        # Annotate the label
        plt.text(
            x1,
            y1,
            label,
            color="white",
            fontsize=8,
            bbox=dict(facecolor="red", alpha=0.5),
        )

    # Remove the axis ticks and labels
    ax.axis("off")

    # Show the plot
    plt.show()

框(x0, y0, x1, y1):位置标记对应于框的左上角和右下角。

并运行

plot_bbox(image, parsed_answer['<OD>'])

我们得到:

Florence-2 任务

Florence-2 是通过 prompts 来执行各种计算机视觉和视觉-语言任务的。这些任务可以通过向模型提供特定的文本提示来激活,正如我们通过 <OD> (目标检测) 看到的那样。

Florence-2 的多功能性来自于结合这些提示,使我们能够引导模型的行为以执行特定的视觉任务。改变提示允许我们适应 Florence-2 的不同任务,而无需对架构进行特定任务的修改。这种能力直接源于 Florence-2 的统一模型架构和基于 FLD-5B 数据集的大规模多任务训练。

这里是 Florence-2 可以执行的一些关键任务,以及示例提示:

物体检测(OD)

  • 提示"<OD>"

  • 描述:在图像中识别对象并为每个检测到的对象提供边界框。这项任务对于视觉检查、监控和一般对象识别等应用很有帮助。

图像字幕

  • 提示"<CAPTION>"

  • 描述:为输入图像生成文本描述。这项任务帮助模型描述图像中正在发生的事情,为内容理解提供可读性强的字幕。

详细字幕

  • 提示"<DETAILED_CAPTION>"

  • 描述:生成包含更多细微信息的更详细字幕,例如场景中的对象及其关系。

视觉定位

  • 提示"<CAPTION_TO_PHRASE_GROUNDING>"

  • 描述:将文本描述与图像中的特定区域关联起来。例如,给定一个如“一辆绿色的车”的提示,模型会在图像中突出显示绿色车的位置。这在需要根据文本找到特定对象的人机交互中非常有用。

分割

  • 提示"<REFERRING_EXPRESSION_SEGMENTATION>"

  • 描述:基于指称表达式(如“蓝色的杯子”)进行分割。模型会识别并分割出提示中提到的对象所在的特定区域(所有相关像素)。

密集区域字幕

  • 提示"<DENSE_REGION_CAPTION>"

  • 描述:为图像中的多个区域提供字幕,提供所有可见区域的详细分解,包括不同的对象及其关系。

带区域的 OCR

  • 提示"<OCR_WITH_REGION>"

  • 描述:在图像上执行光学字符识别(OCR),并为检测到的文本提供边界框。这在从图像中提取和定位文本信息(如读取标志、标签或其他形式的文本)时非常有用。

特定表达式的短语定位

  • 提示"<CAPTION_TO_PHRASE_GROUNDING>" 以及特定的表达,例如 "a wine glass"

  • 描述:定位图像中与特定文本短语相对应的区域。这项任务允许在给出一个词或关键词时识别特定的对象或元素。

开放词汇物体检测

  • 提示"<OPEN_VOCABULARY_OD>"

  • 描述:模型可以检测对象,而不受预定义类别列表的限制,这使得它在根据一般视觉理解识别更广泛的物品时非常有用。

探索计算机视觉和视觉语言任务

对于探索,所有代码都可以在 GitHub 上找到:

让我们使用由 Dall-E 创建的几张图片并将它们上传到 Rasp-5(可以使用 FileZilla 来完成)。图片将被保存在名为 images 的子文件夹中:

dogs_cats = Image.open("./images/dogs-cats.jpg")
table = Image.open("./images/table.jpg")

让我们创建一个函数来方便我们的探索,并跟踪模型在不同任务中的延迟:

def run_example(task_prompt, text_input=None, image=None):
    start_time = time.perf_counter()  # Start timing
    if text_input is None:
        prompt = task_prompt
    else:
        prompt = task_prompt + text_input
    inputs = processor(
        text=prompt, images=image, return_tensors="pt"
    ).to(device)
    generated_ids = model.generate(
        input_ids=inputs["input_ids"],
        pixel_values=inputs["pixel_values"],
        max_new_tokens=1024,
        early_stopping=False,
        do_sample=False,
        num_beams=3,
    )
    generated_text = processor.batch_decode(
        generated_ids, skip_special_tokens=False
    )[0]
    parsed_answer = processor.post_process_generation(
        generated_text,
        task=task_prompt,
        image_size=(image.width, image.height),
    )

    end_time = time.perf_counter()  # End timing
    elapsed_time = end_time - start_time  # Calculate elapsed time
    print(
        f" \n[INFO] ==> Florence-2-base ({task_prompt}), \
 took {elapsed_time:.1f} seconds to execute.\n"
    )

    return parsed_answer

标题

1. 狗和猫

run_example(task_prompt="<CAPTION>", image=dogs_cats)
[INFO] ==> Florence-2-base (<CAPTION>), \
took 16.1 seconds to execute.

{'<CAPTION>': 'A group of dogs and cats sitting in a garden.'}

2. 表格

run_example(task_prompt="<CAPTION>", image=table)
[INFO] ==> Florence-2-base (<CAPTION>), \
took 16.5 seconds to execute.

{'<CAPTION>': 'A wooden table topped with a plate of fruit \
and a glass of wine.'}

详细标题

1. 狗和猫

run_example(task_prompt="<DETAILED_CAPTION>", image=dogs_cats)
[INFO] ==> Florence-2-base (<DETAILED_CAPTION>), \
took 25.5 seconds to execute.

{'<DETAILED_CAPTION>': 'The image shows a group of cats and \
dogs sitting on top of a lush green field, surrounded by plants \
with flowers, trees, and a house in the background. The sky is \
visible above them, creating a peaceful atmosphere.'}

2. 表格

run_example(task_prompt="<DETAILED_CAPTION>", image=table)
[INFO] ==> Florence-2-base (<DETAILED_CAPTION>), \
took 26.8 seconds to execute.

{'<DETAILED_CAPTION>': 'The image shows a wooden table with \
a bottle of wine and a glass of wine on it, surrounded by \
a variety of fruits such as apples, oranges, and grapes. \
In the background, there are chairs, plants, trees, and \
a house, all slightly blurred.'}

更详细的标题

1. 狗和猫

run_example(task_prompt="<MORE_DETAILED_CAPTION>", image=dogs_cats)
[INFO] ==> Florence-2-base (<MORE_DETAILED_CAPTION>), \
took 49.8 seconds to execute.

{'<MORE_DETAILED_CAPTION>': 'The image shows a group of four \
cats and a dog in a garden. The garden is filled with colorful \
flowers and plants, and there is a pathway leading up to \
a house in the background. The main focus of the image is \
a large German Shepherd dog standing on the left side of \
the garden, with its tongue hanging out and its mouth open, \
as if it is panting. On the right side, there are \
two smaller cats, one orange and one gray, sitting on the \
grass. In the background, there is another golden retriever \
dog sitting and looking at the camera. The sky is blue and \
the sun is shining, creating a warm and inviting atmosphere.'}

2. 表格

run_example(task_prompt="< MORE_DETAILED_CAPTION>", image=table)
INFO] ==> Florence-2-base (<MORE_DETAILED_CAPTION>), \
took 32.4 seconds to execute.

{'<MORE_DETAILED_CAPTION>': 'The image shows a wooden table \
with a wooden tray on it. On the tray, there are various \
fruits such as grapes, oranges, apples, and grapes. There \
is also a bottle of red wine on the table. The background \
shows a garden with trees and a house. The overall mood \
of the image is peaceful and serene.'}

我们可以注意到,标题任务越详细,延迟越长,出错的可能性也越大(例如,“图像显示了一个花园中的四只猫和一只狗”,而不是两只狗和三只猫)。

目标检测

我们可以使用 <OD> 提示运行之前用于对象检测的相同函数。

task_prompt = "<OD>"
results = run_example(task_prompt, image=dogs_cats)
print(results)

让我们看看结果:

[INFO] ==> Florence-2-base (<OD>), took 20.9 seconds to execute.

{'<OD>': {'bboxes': [
  [737.79, 571.90, 1022.46, 980.48],
  [0.51, 593.40, 211.45, 991.74],
  [445.95, 721.40, 680.44, 850.43],
  [39.42, 91.64, 491.00, 933.37],
  [570.88, 184.83, 974.33, 782.84]
  ],
  'labels': ['cat', 'cat', 'cat', 'dog', 'dog']
}}

只有通过标签 ['cat,' 'cat,' 'cat,' 'dog,' 'dog'] 才能看出图像中的主要对象已被捕捉。让我们应用之前使用的函数来绘制边界框:

plot_bbox(dogs_cats, results["<OD>"])

让我们也用表格图片来做:

task_prompt = "<OD>"
results = run_example(task_prompt, image=table)
plot_bbox(table, results["<OD>"])
[INFO] ==> Florence-2-base (<OD>), took 40.8 seconds to execute.

密集区域标题

在图像的特定子区域中,可以将经典的目标检测与标题任务混合:

task_prompt = "<DENSE_REGION_CAPTION>"

results = run_example(task_prompt, image=dogs_cats)
plot_bbox(dogs_cats, results["<DENSE_REGION_CAPTION>"])

results = run_example(task_prompt, image=table)
plot_bbox(table, results["<DENSE_REGION_CAPTION>"])

标题到短语定位

在这个任务中,我们可以输入一个标题,例如“一个酒杯”,“一个酒瓶”,或者“半个橙子”,Florence-2 将在图像中定位该对象:

task_prompt = "<CAPTION_TO_PHRASE_GROUNDING>"

results = run_example(
    task_prompt, text_input="a wine bottle", image=table
)
plot_bbox(table, results["<CAPTION_TO_PHRASE_GROUNDING>"])

results = run_example(
    task_prompt, text_input="a wine glass", image=table
)
plot_bbox(table, results["<CAPTION_TO_PHRASE_GROUNDING>"])

results = run_example(
    task_prompt, text_input="a half orange", image=table
)
plot_bbox(table, results["<CAPTION_TO_PHRASE_GROUNDING>"])

[INFO] ==> Florence-2-base (<CAPTION_TO_PHRASE_GROUNDING>), \
took 15.7 seconds to execute
each task.

级联任务

我们还可以将图像标题作为输入文本输入,以推动 Florence-2 找到更多对象:

task_prompt = "<CAPTION>"
results = run_example(task_prompt, image=dogs_cats)
text_input = results[task_prompt]
task_prompt = "<CAPTION_TO_PHRASE_GROUNDING>"
results = run_example(task_prompt, text_input, image=dogs_cats)
plot_bbox(dogs_cats, results["<CAPTION_TO_PHRASE_GROUNDING>"])

<CAPTION,> <DETAILED_CAPTION><MORE_DETAILED_CAPTION> 之间更改 task_prompt,我们将在图像中获得更多的对象。

开放词汇检测

<OPEN_VOCABULARY_DETECTION> 允许 Florence-2 在不依赖于预定义类别列表的情况下检测图像中的可识别对象,使其成为识别各种可能未在训练期间明确标记的项目的一种多用途工具。与 <CAPTION_TO_PHRASE_GROUNDING> 不同,后者需要特定的文本短语来定位和突出显示图像中的特定对象,<OPEN_VOCABULARY_DETECTION> 执行广泛的扫描以找到和分类所有存在的对象。

这使得 <OPEN_VOCABULARY_DETECTION> 在需要在没有事先了解预期内容的情况下对图像中的所有内容有一个全面概述的应用中特别有用。输入描述特定未检测对象的文本,从而实现其检测。例如:

task_prompt = "<OPEN_VOCABULARY_DETECTION>"

text = [
    "a house",
    "a tree",
    "a standing cat at the left",
    "a sleeping cat on the ground",
    "a standing cat at the right",
    "a yellow cat",
]

for txt in text:
    results = run_example(
        task_prompt, text_input=txt, image=dogs_cats
    )

    bbox_results = convert_to_od_format(
        results["<OPEN_VOCABULARY_DETECTION>"]
    )

    plot_bbox(dogs_cats, bbox_results)

[INFO] ==> Florence-2-base (<OPEN_VOCABULARY_DETECTION>), \
took 15.1 seconds to execute
each task.

注意:尝试使用 Florence-2 找到未找到的对象可能会导致错误(请参阅笔记本中的示例)。

指示表达式分割

我们还可以在图像中分割特定对象并给出其描述(标题),例如在桌子图像上为“一瓶红酒”或在 dogs_cats 上的“德国牧羊犬”。

指示表达式分割结果格式:{'<REFERRING_EXPRESSION_SEGMENTATION>': {'Polygons': [[[polygon]], ...], 'labels': ['', '', ...]}},一个对象由一系列多边形表示。每个多边形是 [x1, y1, x2, y2, ..., xn, yn]

多边形(x1, y1, …, xn, yn):位置标记表示多边形的顺时针顺序顶点。

因此,让我们首先创建一个函数来绘制分割:

from PIL import Image, ImageDraw, ImageFont
import copy
import random
import numpy as np

colormap = [
    "blue",
    "orange",
    "green",
    "purple",
    "brown",
    "pink",
    "gray",
    "olive",
    "cyan",
    "red",
    "lime",
    "indigo",
    "violet",
    "aqua",
    "magenta",
    "coral",
    "gold",
    "tan",
    "skyblue",
]


def draw_polygons(image, prediction, fill_mask=False):
    """
 Draws segmentation masks with polygons on an image.

 Parameters:
 - image_path: Path to the image file.
 - prediction: Dictionary containing 'polygons' and 'labels'
 keys. 'polygons' is a list of lists, each
 containing vertices of a polygon. 'labels' is
 a list of labels corresponding to each polygon.
 - fill_mask: Boolean indicating whether to fill the polygons
 with color.
 """
    # Load the image

    draw = ImageDraw.Draw(image)

    # Set up scale factor if needed (use 1 if not scaling)
    scale = 1

    # Iterate over polygons and labels
    for polygons, label in zip(
        prediction["polygons"], prediction["labels"]
    ):
        color = random.choice(colormap)
        fill_color = random.choice(colormap) if fill_mask else None

        for _polygon in polygons:
            _polygon = np.array(_polygon).reshape(-1, 2)
            if len(_polygon) < 3:
                print("Invalid polygon:", _polygon)
                continue

            _polygon = (_polygon * scale).reshape(-1).tolist()

            # Draw the polygon
            if fill_mask:
                draw.polygon(_polygon, outline=color, fill=fill_color)
            else:
                draw.polygon(_polygon, outline=color)

            # Draw the label text
            draw.text(
                (_polygon[0] + 8, _polygon[1] + 2), label, fill=color
            )

    # Save or display the image
    # image.show()  # Display the image
    display(image)

现在我们可以运行函数:

task_prompt = "<REFERRING_EXPRESSION_SEGMENTATION>"

results = run_example(
    task_prompt, text_input="a wine bottle", image=table
)
output_image = copy.deepcopy(table)
draw_polygons(
    output_image,
    results["<REFERRING_EXPRESSION_SEGMENTATION>"],
    fill_mask=True,
)

results = run_example(
    task_prompt, text_input="a german sheppard", image=dogs_cats
)
output_image = copy.deepcopy(dogs_cats)
draw_polygons(
    output_image,
    results["<REFERRING_EXPRESSION_SEGMENTATION>"],
    fill_mask=True,
)

[INFO] ==> Florence-2-base
(<REFERRING_EXPRESSION_SEGMENTATION>), took 207.0 seconds
to execute each task.

区域到分割

在这个任务中,也可以给出图像中要分割的对象坐标。输入格式是 '<loc_x1><loc_y1><loc_x2><loc_y2>', [x1, y1, x2, y2] ,这是 [0, 999] 中的量化坐标。

例如,当运行代码时:

task_prompt = "<CAPTION_TO_PHRASE_GROUNDING>"
results = run_example(
    task_prompt, text_input="a half orange", image=table
)
results

结果如下:

{'<CAPTION_TO_PHRASE_GROUNDING>': {'bboxes': [[343.552001953125,
    689.6640625,
    530.9440307617188,
    873.9840698242188]],
  'labels': ['a half']}}

使用四舍五入的边界框坐标:

task_prompt = "<REGION_TO_SEGMENTATION>"
results = run_example(
    task_prompt,
    text_input=("<loc_343><loc_690>" "<loc_531><loc_874>"),
    image=table,
)
output_image = copy.deepcopy(table)
draw_polygons(
    output_image, results["<REGION_TO_SEGMENTATION>"], fill_mask=True
)

我们在这些坐标上获得了对象的分割(延迟:83 秒):

区域到文本

我们还可以给出区域(坐标)并请求一个标题:

task_prompt = "<REGION_TO_CATEGORY>"
results = run_example(
    task_prompt,
    text_input=("<loc_343><loc_690>" "<loc_531><loc_874>"),
    image=table,
)
results
[INFO] ==> Florence-2-base (<REGION_TO_CATEGORY>), \
took 14.3 seconds to execute.

{{
  '<REGION_TO_CATEGORY>':
    'orange<loc_343><loc_690>'
    '<loc_531><loc_874>'
}

模型在那个区域识别出一个橙子。让我们请求一个描述:

task_prompt = "<REGION_TO_DESCRIPTION>"
results = run_example(
    task_prompt,
    text_input=("<loc_343><loc_690>" "<loc_531><loc_874>"),
    image=table,
)
results
[INFO] ==> Florence-2-base (<REGION_TO_CATEGORY>), \
took 14.6 seconds to execute.

{
  '<REGION_TO_CATEGORY>':
    'orange<loc_343><loc_690>'
    '<loc_531><loc_874>'
}

在这种情况下,描述没有提供更多细节,但它可以。尝试另一个例子。

OCR

使用 Florence-2,我们可以在图像上执行光学字符识别(OCR),获取其上所写的内容(task_prompt = '<OCR>')以及检测到的文本的边界框(位置)(ask_prompt = '<OCR_WITH_REGION>')。这些任务可以帮助提取和定位图像中的文本信息,例如阅读标志、标签或其他形式的文本。

让我们从巴西的演讲中上传一张传单到 Raspi。让我们测试另一种语言的工作,这里是用葡萄牙语):

flayer = Image.open("./images/embarcados.jpg")
# Display the image
plt.figure(figsize=(8, 8))
plt.imshow(flayer)
plt.axis("off")
# plt.title("Image")
plt.show()

让我们使用 '<MORE_DETAILED_CAPTION>' 检查图像:

[INFO] ==> Florence-2-base (<MORE_DETAILED_CAPTION>), \
took 85.2 seconds to execute.

{'<MORE_DETAILED_CAPTION>': 'The image is a promotional poster \
for an event called "Machine Learning Embarcados" hosted by \
Marcelo Roval. The poster has a black background with white \
text. On the left side of the poster, there is a logo of a \
coffee cup with the text "Café Com Embarcados" above it. \
Below the logo, it says "25 de Setembro as 17th" which \
translates to "25th of September as 17" in English. \n\nOn \
the right side, there are two smaller text boxes with the names \
of the participants and their names. The first text box reads \
"Democratizando a Inteligência Artificial para Paises em \
Desenvolvimento" and the second text box says "Toda \
quarta-feira" which is Portuguese for "Transmissão via in \
Portuguese".\n\nIn the center of the image, there has a photo \
of Marcelo, a man with a beard and glasses, smiling at the \
camera. He is wearing a white hard hat and a white shirt. \
The text boxes are in orange and yellow colors.'}

描述非常准确。让我们使用 OCR 任务获取更重要的单词:

task_prompt = "<OCR>"
run_example(task_prompt, image=flayer)
[INFO] ==> Florence-2-base (<OCR>), took 37.7 seconds to execute.

{'<OCR>':
 'Machine Learning Café com Embarcado Embarcados '
 'Democratizando a Inteligência Artificial para Paises em '
 '25 de Setembro às 17h Desenvolvimento Toda quarta-feira '
 'Marcelo Roval Professor na UNIFIEI e Transmissão via in '
 'Co-Director do TinyML4D'}

让我们定位传单中的单词:

task_prompt = "<OCR_WITH_REGION>"
results = run_example(task_prompt, image=flayer)

让我们再创建一个函数来绘制检测到的单词周围的边界框:

def draw_ocr_bboxes(image, prediction):
    scale = 1
    draw = ImageDraw.Draw(image)
    bboxes = prediction["quad_boxes"]
    labels = prediction["labels"]
    for box, label in zip(bboxes, labels):
        color = random.choice(colormap)
        new_box = (np.array(box) * scale).tolist()
        draw.polygon(new_box, width=3, outline=color)
        draw.text(
            (new_box[0] + 8, new_box[1] + 2),
            "{}".format(label),
            align="right",
            fill=color,
        )
    display(image)
output_image = copy.deepcopy(flayer)
draw_ocr_bboxes(output_image, results["<OCR_WITH_REGION>"])

我们可以检查检测到的单词:

results["<OCR_WITH_REGION>"]["labels"]
'</s>Machine Learning',
 'Café',
 'com',
 'Embarcado',
 'Embarcados',
 'Democratizando a Inteligência',
 'Artificial para Paises em',
 '25 de Setembro ás 17h',
 'Desenvolvimento',
 'Toda quarta-feira',
 'Marcelo Roval',
 'Professor na UNIFIEI e',
 'Transmissão via',
 'in',
 'Co-Director do TinyML4D']

延迟摘要

在使用 Florence-2 在 Raspberry Pi (Raspi-5) 上执行不同任务时观察到的延迟因任务的复杂度而异:

  • 图像标题:为图像生成标题大约需要 16-17 秒。

  • 详细标题:延迟增加到约 25-27 秒,需要生成更细致的场景描述。

  • 更详细的标题:大约需要 32-50 秒,随着描述变得更加复杂,延迟增加。

  • 对象检测:根据图像的复杂性和检测到的对象数量,大约需要 20-41 秒。

  • 视觉定位:根据文本提示定位特定对象,大约需要 15-16 秒。

  • 光学字符识别(OCR):从图像中提取文本大约需要 37-38 秒。

  • 分割与区域分割:分割任务耗时较长,大约为 83-207 秒,具体取决于复杂性和需要分割的区域数量。

这些延迟时间突出了边缘设备(如 Raspberry Pi)的资源限制,并强调了优化模型和环境以实现实时性能的必要性。

图片

运行复杂任务可能会使用 Raspi-5 的 8 GB 内存。例如,上述截图显示在 Florence OD 任务期间,有 4 个 CPU 全速运行,并使用了超过 5 GB 的内存。考虑将 SWAP 内存增加到 2 GB。

使用vcgencmd measure_temp检查 CPU 温度,显示温度可升至+80°C。

微调

如本实验室所探讨的,Florence 支持许多开箱即用的任务,包括描述、目标检测、OCR 等。然而,与其他预训练的基础模型一样,Florence-2 可能需要特定领域的知识。例如,它可能需要通过医学或卫星图像来改进。在这种情况下,微调与自定义数据集是必要的。Roboflow 教程如何微调 Florence-2 以进行目标检测任务展示了如何在目标检测数据集上微调 Florence-2 以提高模型性能以适应我们的特定用例。

根据上述教程,可以微调 Florence-2 模型以检测之前实验室中使用的箱子和轮子:

图片

需要注意的是,在微调后,模型仍然可以检测到不属于我们自定义数据集的类别,如猫、狗、葡萄等,正如之前所见)。

在 Roboflow 中使用先前标注的数据集并在 CoLab 上执行的全局微调项目可以在以下笔记本中找到:

在另一个例子中,在文章微调 Florence-2 - 微软的尖端视觉语言模型中,作者展示了在DocVQA上微调 Florence 的示例。作者报告称,Florence 2 可以执行视觉问答(VQA),但发布的模型不包括 VQA 功能。

摘要

Florence-2 为边缘的视觉语言任务提供了一种灵活且强大的方法,其性能可与更大的、特定于任务的模型相媲美,例如用于目标检测的 YOLO,用于文本分析的 BERT/RoBERTa,以及专门的 OCR 模型。

多亏了其多模态转换器架构,Florence-2 在处理任务方面比 YOLO 更灵活。这些任务包括目标检测、图像描述和视觉定位。

与仅关注语言的BERT不同,Florence-2 整合了视觉和语言,使其在需要这两种模态的应用中表现出色,例如图像标题和视觉定位。

此外,虽然传统的OCR 模型如 Tesseract 和 EasyOCR 仅设计用于从图像中识别和提取文本,但 Florence-2 的 OCR 能力是更广泛框架的一部分,该框架包括上下文理解和视觉-文本对齐。这使得它在需要读取文本并解释图像中其上下文的场景中特别有用。

总体而言,Florence-2 因其能够将各种视觉-语言任务无缝集成到一个统一模型中而脱颖而出,该模型足够高效,可以在树莓派等边缘设备上运行。这使得它成为探索边缘 AI 应用的开发者和研究人员的一个有吸引力的选择。

Florence-2 的关键优势

  1. 统一架构

    • 单个模型处理多个视觉任务与专用模型(YOLO,BERT,Tesseract)相比

    • 消除了需要多个模型部署和集成的需求

    • 任务间一致的 API 和界面

  2. 性能比较

    • 目标检测:尽管是通用型,但与 YOLOv8 相当(在 COCO 上约为 37.5 mAP,与 YOLOv8 的约 39.7 mAP 相当)

    • 文本识别:有效处理多种语言,如专门的 OCR 模型(Tesseract,EasyOCR)

    • 语言理解:集成类似 BERT 的文本处理能力,同时添加视觉上下文

  3. 资源效率

    • 基础模型(232M 参数)尽管规模较小,但取得了良好的效果

    • 在边缘设备(树莓派)上运行有效

    • 单个模型部署与多个专用模型

权衡

  1. 性能与专用模型比较

    • YOLO 系列可能在纯目标检测方面提供更快的推理

    • 专用 OCR 模型可能更好地处理复杂的文档布局

    • BERT/RoBERTa 为纯文本任务提供更深入的语言理解

  2. 资源需求

    • 边缘设备上的延迟更高(15-200 秒,取决于任务)

    • 需要在树莓派上仔细管理内存

    • 可能需要针对实时应用进行优化

  3. 部署考虑

    • 初始设置比专用模型更复杂

    • 需要理解多种任务类型和提示

    • 优化提示工程的学习曲线

最佳用例

  1. 资源受限环境

    • 需要多种视觉能力的边缘设备

    • 存储或部署容量有限的系统

    • 需要灵活视觉处理的程序

  2. 多模态应用

    • 内容审查系统

    • 无障碍工具

    • 文档分析工作流程

  3. 快速原型设计

    • 快速部署视觉能力

    • 在不使用单独模型的情况下测试多个视觉任务

    • 概念验证开发

未来影响

Florence-2 代表了向统一视觉模型转变的趋势,这些模型最终可能取代许多应用中的特定任务架构。虽然专用模型在特定场景中保持优势,但像 Florence-2 这样的统一模型在便利性和效率方面的优势使它们在现实世界的部署中越来越有吸引力。

实验室展示了 Florence-2 在边缘设备上的可行性,这表明未来在物联网、移动计算和嵌入式系统中部署多个专用模型将是不切实际的。

资源

概述

本节中的实验室涵盖了适用于不同硬件平台的话题和技术。这些实验室设计成独立于特定板卡,让你能够专注于在(小型)机器学习应用中使用的基本概念和算法。

通过探索这些共享实验室,你将更深入地了解嵌入式机器学习中的常见挑战和解决方案。在这里获得的知识和技能,无论你未来使用哪种特定硬件,都将非常有价值。

练习 Nicla Vision XIAO ESP32S3
关键词语音识别特征工程 ✔ 链接 ✔ 链接
DSP 频谱特征模块 ✔ 链接 ✔ 链接

KWS 特征工程

DALL·E 3 Prompt: 1950s style cartoon scene set in an audio research room. Two scientists, one holding a magnifying glass and the other taking notes, examine large charts pinned to the wall. These charts depict FFT graphs and time curves related to audio data analysis. The room has a retro ambiance, with wooden tables, vintage lamps, and classic audio analysis tools.

概述

在这个动手教程中,重点是特征工程在优化应用于音频分类任务(如语音识别)的机器学习模型性能中的关键作用。重要的是要意识到任何机器学习模型的性能在很大程度上依赖于所使用的特征质量,我们将处理特征提取的“内部机制”,主要关注梅尔频率倒谱系数(MFCCs),这是音频信号处理领域的基石。

机器学习模型,尤其是传统算法,不理解音频波形。它们理解以某种有意义方式排列的数字,即特征。这些特征封装了音频信号的特征,使得模型更容易区分不同的声音。

本教程将处理为音频分类生成特定特征。这对于将机器学习应用于各种音频数据特别有趣,无论是用于语音识别、音乐分类、基于翅膀拍打声的昆虫分类,还是其他声音分析任务。

KWS

最常见的 TinyML 应用是关键词识别(KWS),它是更广泛的语音识别领域的一个子集。虽然通用语音识别将所有 spoken words 转录成文本,但关键词识别专注于检测连续音频流中的特定“关键词”或“唤醒词”。系统被训练来识别这些关键词作为预定义的短语或单词,如 yesno。简而言之,KWS 是一种具有自己一套挑战和要求的专门化的语音识别形式。

这里是一个典型的使用梅尔频率倒谱系数(MFCC)特征转换器的 KWS 流程:

KWS 的应用

  • 语音助手: 在亚马逊的 Alexa 或 Google Home 等设备中,KWS 用于检测唤醒词(“Alexa”或“Hey Google”)以激活设备。

  • 语音激活控制: 在汽车或工业环境中,KWS 可以用来启动特定的命令,如“启动引擎”或“关灯”。

  • 安全系统: 语音激活的安全系统可能使用 KWS 根据语音密码短语验证用户。

  • 电信服务: 客户服务线路可能使用关键词识别(KWS)来根据语音关键词路由电话。

与通用语音识别的不同之处

  • 计算效率: KWS 通常设计为比完整的语音识别计算量更小,因为它只需要识别一小组短语。

  • 实时处理:KWS 通常在实时模式下运行,并针对低延迟的关键词检测进行了优化。

  • 资源限制:KWS 模型通常被设计成轻量级,以便在计算资源有限的设备上运行,例如微控制器或手机。

  • 专注任务:虽然通用语音识别模型被训练以处理广泛的词汇和口音,但 KWS 模型经过微调以准确识别特定的关键词,通常在嘈杂环境中也能准确识别。

音频信号概述

理解音频信号的基本特性对于有效的特征提取以及最终在音频分类任务中成功应用机器学习算法至关重要。音频信号是复杂的波形,它捕捉了随时间变化的空气压力波动。这些信号可以通过几个基本属性来描述:采样率、频率和幅度。

  • 频率和幅度频率是指波形在单位时间内经历的振荡次数,也以 Hz 为单位测量。在音频信号的上下文中,不同的频率对应不同的音调。幅度另一方面,测量振荡的幅度,与声音的响度相关。频率和幅度都是捕捉音频信号音调和节奏特性的基本特征。

  • 采样率采样率,通常以赫兹(Hz)表示,定义了在数字化模拟信号时每秒采集的样本数。较高的采样率可以更准确地表示信号,但也需要更多的计算资源来处理。典型的采样率包括 CD 音质的 44.1 kHz,以及用于语音识别任务的 16 kHz 或 8 kHz。理解选择适当采样率的权衡对于平衡准确性和计算效率至关重要。在 TinyML 项目中,我们通常使用 16 kHz。尽管音乐音调可以达到高达 20 kHz 的频率,但人声的最高频率为 8 kHz。传统的电话系统使用 8 kHz 的采样频率。

为了准确表示信号,采样率必须至少是信号中最高频率的两倍。

  • 时域与频域:音频信号可以在时域和频域中进行分析。在时域中,信号以波形的形式表示,振幅随时间变化。这种表示有助于观察时间特征,如起始和持续时间,但信号的音调特征并不明显。相反,频域表示提供了信号组成频率及其相应振幅的视图,通常通过傅里叶变换获得。这对于需要理解信号频谱内容的任务非常有价值,例如识别音符或语音音素(我们的案例)。

下面的图像显示了YESNO这两个词在时域(原始音频)和频域中的典型表示:

图片

为什么不是原始音频?

直接使用原始音频数据用于机器学习任务可能看起来很有吸引力,但这种方法存在一些挑战,使其不太适合构建稳健和高效的模型。

例如,在 TinyML 设备上使用原始音频数据进行关键词检测(KWS)时,由于其高维性(使用 16 kHz 采样率)、捕获时间特征的计算复杂性、对噪声的敏感性以及缺乏语义上有意义的特征,使得 MFCCs 等特征提取技术在资源受限的应用中更为实用。

这里是关于使用原始音频的一些关键问题的附加细节:

  • 高维性:音频信号,尤其是以高采样率采样的信号,会产生大量数据。例如,以 16 kHz 采样率采样的 1 秒音频剪辑将包含 16,000 个独立的数据点。高维数据增加了计算复杂性,导致训练时间更长,计算成本更高,这使得在资源受限的环境中不切实际。此外,音频信号的广泛动态范围需要每个样本大量的比特数,而传达的信息却很少。

  • 时间依赖性:原始音频信号具有时间结构,简单的机器学习模型可能难以捕捉。虽然循环神经网络(如 LSTMs)可以建模这种依赖关系,但它们在小型设备上计算密集且难以训练。

  • 噪声和可变性:原始音频信号通常包含背景噪声和其他非必要元素,这些都会影响模型性能。此外,同一声音可以根据麦克风距离、声音源方向和环境声学特性等因素具有不同的特征,这增加了数据的复杂性。

  • 缺乏语义意义:原始音频本身不包含用于分类任务的语义上有意义的特征。像音高、节奏和频谱特征这样的特征,对于语音识别可能至关重要,但它们不能直接从原始波形数据中获取。

  • 信号冗余:音频信号通常包含冗余信息,信号中的一些部分对当前任务的价值很小或没有价值。这种冗余可能会使学习效率低下,并可能导致过拟合。

由于这些原因,特征提取技术,如梅尔频率倒谱系数(MFCCs)、梅尔频率能量(MFEs)和简单的频谱图,通常被用来将原始音频数据转换为更易于管理和信息丰富的格式。这些特征捕捉了音频信号的基本特征,同时降低了维度和噪声,促进了更有效的机器学习。

MFCCs 概述

什么是 MFCCs?

梅尔频率倒谱系数(MFCCs)是一组从音频信号的频谱内容中派生出来的特征。它们基于人类的听觉感知,通常用于捕捉音频信号的语音特征。MFCCs 通过一个多步骤的过程计算得出,包括预加重、分帧、加窗、应用快速傅里叶变换(FFT)将信号转换为频域,最后应用离散余弦变换(DCT)。结果是原始音频信号频谱特征的紧凑表示。

下面的图像显示了YESNO单词的 MFCC 表示:

视频解释了梅尔频率倒谱系数(MFCC)及其计算方法。

为什么 MFCCs 很重要?

MFCCs 之所以至关重要,有多个原因,尤其是在关键词检测(KWS)和 TinyML 的背景下:

  • 维度降低:MFCCs 在捕捉音频信号的基本频谱特征的同时,显著降低了数据的维度,使其非常适合资源受限的 TinyML 应用。

  • 鲁棒性:MFCCs 对噪声和音高、振幅的变化不太敏感,为音频分类任务提供了更稳定、更鲁棒的特征集。

  • 人类听觉系统建模:MFCCs 中的梅尔尺度近似了人耳对不同频率的响应,使得它们在需要类似人类感知的语音识别中变得实用。

  • 计算效率:计算 MFCCs 的过程计算效率高,非常适合在计算资源有限的硬件上实时应用。

总结来说,MFCCs 在信息丰富性和计算效率之间提供了平衡,因此在音频分类任务中很受欢迎,尤其是在 TinyML 等受限环境中。

计算 MFCCs

梅尔频率倒谱系数 (MFCCs) 的计算涉及几个关键步骤。让我们逐一了解这些步骤,这对于在 TinyML 设备上的关键词检测 (KWS) 任务尤为重要。

  • 预加重: 第一步是预加重,这是为了强调音频信号的高频成分并平衡频谱。这是通过应用一个放大连续样本之间差异的滤波器来实现的。预加重的公式是:y(t)=x(t)αx(t1)y(t)=x(t)-\alpha x(t-1),其中 α\alpha 是预加重因子,通常约为 0.97。

  • 分帧: 音频信号被分成短帧(帧长度),通常为 20 到 40 毫秒。这是基于信号中的频率在短时间内是平稳的假设。分帧有助于在如此小的时隙内分析信号。帧步长(或步进)将移动一个帧及其相邻帧。这些步骤可以是顺序的或重叠的。

  • 窗口化: 每个帧随后被窗口化以最小化帧边界处的间断性。常用的窗口函数是汉明窗口。窗口化通过最小化边缘效应为傅里叶变换准备信号。下面的图像显示了三个帧(10、20 和 30)以及窗口化后的时间样本(注意帧长度和帧步长为 20 ms):

  • 快速傅里叶变换 (FFT) 快速傅里叶变换 (FFT) 被应用于每个窗口化的帧,将其从时域转换为频域。FFT 给出的是一个复数值表示,包括幅度和相位信息。然而,对于梅尔频率倒谱系数 (MFCCs),仅使用幅度来计算功率谱。功率谱是幅度谱的平方,并测量每个频率成分的能量。

信号的功率谱 P(f)P(f) 定义为 P(f)=|X(f)|2P(f)=|X(f)|²,其中 X(f)X(f) 是信号 x(t)x(t) 的傅里叶变换。通过对傅里叶变换的幅度进行平方,我们强调了 更强的 频率相对于 较弱的 频率,从而捕捉到音频信号的更多相关频谱特性。这在音频分类、语音识别和关键词检测(KWS)等应用中非常重要,这些应用的重点是识别不同音频类别或语音音素的不同频率模式。

  • 梅尔滤波器组:然后将频域映射到 梅尔尺度,该尺度近似人类耳朵对不同频率的响应。想法是在低频提取更多特征(更多滤波器组),而在高频提取较少。因此,它在人类耳朵区分的声音上表现良好。通常,20 到 40 个三角滤波器提取梅尔频率能量。然后对这些能量进行对数变换,将乘法因子转换为加法因子,使其更适合进一步处理。

  • 离散余弦变换 (DCT):最后一步是将对数梅尔能量应用离散余弦变换 (DCT)。DCT 有助于去相关能量,有效地压缩数据并仅保留最具判别性的特征。通常,保留前 12-13 个 DCT 系数,形成最终的 MFCC 特征向量。

使用 Python 进行实践

让我们在实际音频样本上工作时应用我们讨论的内容。在 Google CoLab 上打开笔记本,并在您的音频样本上提取 MLCC 特征:[在 Colab 中打开]

摘要

我们应该使用哪种特征提取技术?

梅尔频率倒谱系数(MFCCs)、梅尔频率能量(MFEs)或频谱图是表示音频数据的技术,它们在不同的环境中通常很有帮助。

通常,MFCCs 更专注于捕捉功率谱的包络,这使得它们对细粒度频谱细节不太敏感,但对噪声更鲁棒。这对于语音相关任务通常是希望的。另一方面,频谱图或 MFEs 保留了更多详细的频率信息,这对于需要基于细粒度频谱内容进行区分的任务可能是有利的。

MFCCs 在以下方面特别强大

  1. 语音识别:MFCCs 在识别语音信号中的语音内容方面非常出色。

  2. 说话人识别:它们可以根据声音特征区分不同的说话人。

  3. 情感识别:MFCCs 可以捕捉到表明情绪状态的细微变化。

  4. 关键词检测:特别是在 TinyML 中,低计算复杂度和小特征尺寸至关重要。

频谱图或 MFEs 通常更适合

  1. 音乐分析:频谱图可以捕捉音乐中的和声和音色结构,这对于流派分类、乐器识别或音乐转录等任务至关重要。

  2. 环境声音分类:在识别非语音环境声音(例如,雨、风、交通)时,完整的频谱图可以提供更多区分性特征。

  3. 鸟鸣识别:鸟鸣的复杂细节通常更适合使用频谱图来捕捉。

  4. 生物声信号处理:在像海豚或蝙蝠叫声分析这样的应用中,频谱图中的细粒度频率信息可能是至关重要的。

  5. 音频质量保证:频谱图通常在专业音频分析中用于识别不需要的噪音、点击或其他伪迹。

资源

DSP 频谱特征

图片

DALL·E 3 Prompt:1950 年代风格的拉丁男性和女性科学家在振动研究室的卡通插图。男性正在使用计算尺检查古老的电路。女性坐在电脑前,有复杂的振动图。木质桌子上铺有传感器板,其中最显眼的是加速度计。一台经典的、圆背的电脑显示了 Arduino IDE 中的代码,用于 LED 引脚分配和运动检测的机器学习算法。串行监视器显示 FFT、分类、小波和 DSP。复古的灯具、工具和带有 FFT 和小波图的图表完善了场景

概述

与运动(或振动)相关的 TinyML 项目涉及 IMU(通常是加速度计陀螺仪)的数据。这些时间序列类型的数据集在输入到机器学习模型训练之前应该进行预处理,这对于嵌入式机器学习来说是一个具有挑战性的领域。然而,Edge Impulse 通过其数字信号处理(DSP)预处理步骤以及更具体的频谱特征块来帮助克服这种复杂性。

但它内部是如何工作的呢?让我们深入探究。

特征提取回顾

从使用惯性传感器(如加速度计)捕获的数据集中提取特征涉及处理和分析原始数据。加速度计测量物体沿一个或多个轴的加速度(通常是三个,标记为 X、Y 和 Z)。这些测量可以用来理解物体的运动的各种方面,如运动模式和振动。以下是该过程的概述:

数据收集:首先,我们需要从加速度计收集数据。根据应用的不同,数据可能以不同的采样率收集。确保采样率足够高,以捕捉所研究运动的相关动态(采样率应至少是信号中存在的最大相关频率的两倍)是至关重要的。

数据预处理:原始加速度计数据可能包含噪声、错误或不相关信息。预处理步骤,如滤波和归一化,可以帮助清理和标准化数据,使其更适合特征提取。

工作室不执行归一化或标准化,因此有时在处理传感器融合时,在将数据上传到工作室之前执行此步骤可能是必要的。这在传感器融合项目中尤为重要,如本教程所示,使用 Spresense 和 CommonSense 进行传感器数据融合

分割:根据数据的性质和应用,将数据分割成更小的段或窗口可能是必要的。这有助于关注数据集中的特定事件或活动,使特征提取更易于管理和有意义。窗口大小和重叠(窗口跨度)的选择取决于应用和感兴趣事件的频率。作为一个经验法则,我们应该尝试捕捉几个“数据周期”。

特征提取:一旦数据预处理和分割完成,就可以提取描述运动特性的特征。从加速度计数据中提取的一些典型特征包括:

  • 时域特征描述了每个段内数据的统计属性,如均值、中位数、标准差、偏度、峰度和零交叉率。

  • 频域特征是通过使用如快速傅里叶变换(FFT)等技术将数据转换到频域获得的。一些典型的频域特征包括功率谱、频谱能量、主导频率(幅度和频率)和频谱熵。

  • 时频域特征结合了时间和频率域信息,如短时傅里叶变换(STFT)离散小波变换(DWT)。它们可以提供对信号频率内容随时间变化的更详细理解。

在许多情况下,提取的特征数量可能很大,这可能会导致过拟合或增加计算复杂度。特征选择技术,如互信息、基于相关性的方法或主成分分析(PCA),可以帮助识别给定应用中最相关的特征,并降低数据集的维度。工作室可以帮助进行此类与特征相关的计算。

让我们更详细地探讨本系列动手操作中涵盖的典型 TinyML 运动分类项目。

一个 TinyML 运动分类项目

在动手项目中,“运动分类和异常检测”,我们模拟了运输中的机械应力,我们的问题是分类四种运动类型:

  • 海上(船上的托盘)

  • 地面(卡车或火车上的托盘)

  • 提升(叉车操作的托盘)

  • 空闲(仓库中的托盘)

加速度计提供了有关托盘(或容器)的数据。

下面是 10 秒的样本(原始数据),以 50 Hz 的采样频率捕获:

当使用相同原理的另一个数据集进行此分析时,结果相似,使用不同的采样频率,62.5 Hz 而不是 50 Hz。

数据预处理

加速度计(一种“时间序列”数据)捕获的原始数据应使用上一节中描述的典型特征提取方法之一转换为“表格数据”。

我们应该使用滑动窗口对样本数据进行数据分段,以进行特征提取。项目每 10 秒捕获一次加速度计数据,采样率为 62.5 Hz。2 秒窗口捕获 375 个数据点(3 轴 ×\times 2 秒 ×\times 62.5 个样本)。窗口每 80 毫秒滑动一次,创建一个更大的数据集,其中每个实例都有 375 个“原始特征”。

在 Studio 上,之前版本(V1)的频谱分析块仅提取了时间域特征 RMS,对于频域,使用 FFT 提取峰值和频率以及信号随时间的功率特性(PSD),从而得到一个固定表格数据集,包含 33 个特征(每个轴 11 个),

这 33 个特征是神经网络分类器的输入张量。

在 2022 年,Edge Impulse 发布了频谱分析块的第二个版本,我们将在这里探讨。

Edge Impulse - 频谱分析块 V.2 内部机制

在版本 2 中,每个轴/通道的时间域统计特征如下:

  • 均方根

  • 偏度

  • 偏度

并且每个轴/通道的频域频谱特征如下:

  • 频谱功率

  • 偏度(在下一个版本中)

  • 偏度(在下一个版本中)

在此链接中,我们可以了解更多关于特征提取的细节。

克隆公共项目。您还可以按照说明,使用我的 Google CoLab 笔记本操作代码:Edge Impulse 频谱分析块笔记本

开始导入库:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
from scipy.stats import skew, kurtosis
from scipy import signal
from scipy.signal import welch
from scipy.stats import entropy
from sklearn import preprocessing
import pywt

plt.rcParams['figure.figsize'] = (12, 6)
plt.rcParams['lines.linewidth'] = 3

从研究的项目中,让我们选择以下加速度计的数据样本:

  • 窗口大小为 2 秒:[2,000] ms

  • 采样频率:[62.5] Hz

  • 我们将选择[None]过滤器(为了简单起见)和一个

  • FFT 长度:[16]

f =  62.5 # Hertz
wind_sec = 2 # seconds
FFT_Length = 16
axis = ['accX', 'accY', 'accZ']
n_sensors = len(axis)

在 Studio 频谱分析标签上选择原始特征,我们可以将特定 2 秒窗口的所有 375 个数据点复制到剪贴板。

将数据点粘贴到新的变量 data

data = [
    -5.6330,  0.2376,  9.8701,
    -5.9442,  0.4830,  9.8701,
    -5.4217, ...
]
No_raw_features = len(data)
N = int(No_raw_features/n_sensors)

总原始特征为 375,但我们将逐个轴单独处理,其中 N=125N= 125(每个轴的样本数)。

我们旨在了解 Edge Impulse 如何获取处理后的特征。

因此,您还应该将处理后的特征传递给一个变量(以便比较 Python 中计算的特征与 Studio 提供的特点):

features = [
    2.7322, -0.0978, -0.3813,
    2.3980, 3.8924, 24.6841,
    9.6303, ...
]
N_feat = len(features)
N_feat_axis = int(N_feat/n_sensors)

处理后的特征总数为 39,这意味着 13 个特征/轴。

仔细观察这 13 个特征,我们将找到 3 个时域特征(均方根、偏度和峰度):

  • [均方根] [偏度] [峰度]

以及 10 个频域(我们稍后会回到这一点)。

  • [光谱偏度][光谱峰度][光谱功率 1] ... [光谱功率 8]

按传感器分割原始数据

数据包含所有轴的样本;让我们分别拆分并绘制它们:

def plot_data(sensors, axis, title):
    [plt.plot(x, label=y) for x,y in zip(sensors, axis)]
    plt.legend(loc='lower right')
    plt.title(title)
    plt.xlabel('#Sample')
    plt.ylabel('Value')
    plt.box(False)
    plt.grid()
    plt.show()

accX = data[0::3]
accY = data[1::3]
accZ = data[2::3]
sensors = [accX, accY, accZ]
plot_data(sensors, axis, 'Raw Features')

图片

减去平均值

接下来,我们应该从数据中减去平均值。从数据集中减去平均值是统计学和机器学习中常见的数据预处理步骤。从数据中减去平均值的目的是将数据围绕零居中。这很重要,因为它可以揭示如果数据未居中可能隐藏的模式和关系。

这里有一些具体的原因说明为什么减去平均值可能会有所帮助:

  • 它简化了分析:通过居中数据,平均值变为零,这使得一些计算更简单且易于解释。

  • 它消除了偏差:如果数据有偏差,减去平均值可以消除它,从而允许更准确的分析。

  • 它可以揭示模式:将数据居中可以帮助揭示如果数据未居中可能隐藏的模式。例如,如果分析时间序列数据集,居中数据可以帮助您识别时间趋势。

  • 它可以提高性能:在某些机器学习算法中,居中数据可以通过减少异常值的影响并使数据更容易比较来提高性能。总的来说,减去平均值是一种简单但强大的技术,可用于改进数据分析和解释。

dtmean = [
    (sum(x) / len(x))
    for x in sensors
]

[
    print('mean_' + x + ' =', round(y, 4))
    for x, y in zip(axis, dtmean)
][0]

accX = [(x - dtmean[0]) for x in accX]
accY = [(x - dtmean[1]) for x in accY]
accZ = [(x - dtmean[2]) for x in accZ]
sensors = [accX, accY, accZ]

plot_data(sensors, axis, 'Raw Features - Subtract the Mean')

图片

时域统计特征

均方根计算

一组值(或连续时间波形)的均方根是该值平方的算术平均值的平方根,或定义连续波形的函数的平方。在物理学中,电流的均方根被定义为“在电阻中消耗相同功率的直流电值。”

在一组nn𝑥1,𝑥2,,𝑥𝑛{𝑥_1, 𝑥_2, \ldots, 𝑥_𝑛}的情况下,均方根(RMS)为:xRMS=1n(x12+x22++xn2) x_{\mathrm{RMS}} = \sqrt{\frac{1}{n} \left( x_1² + x_2² + \cdots + x_n² \right)}

注意,原始原始数据与减去平均值后的 RMS 值不同

# Using numpy and standardized data (subtracting mean)
rms = [np.sqrt(np.mean(np.square(x))) for x in sensors]

我们可以将这里计算出的 RMS 值与 Edge Impulse 提供的值进行比较:

[print('rms_'+x+'= ', round(y, 4)) for x,y in zip(axis, rms)][0]
print("\nCompare with Edge Impulse result features")
print(features[0:N_feat:N_feat_axis])

rms_accX= 2.7322

rms_accY= 0.7833

rms_accZ= 0.1383

与 Edge Impulse 的结果特征相比:

[2.7322, 0.7833, 0.1383]

偏度和峰度计算

在统计学中,偏度和峰度是衡量分布形状的两种方式。

这里,我们可以看到传感器值的分布:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(13, 4))
sns.kdeplot(accX, fill=True, ax=axes[0])
sns.kdeplot(accY, fill=True, ax=axes[1])
sns.kdeplot(accZ, fill=True, ax=axes[2])
axes[0].set_title('accX')
axes[1].set_title('accY')
axes[2].set_title('accZ')
plt.suptitle('IMU Sensors distribution', fontsize=16, y=1.02)
plt.show()

图片

偏度是衡量分布不对称性的度量。此值可以是正数或负数。

图片

  • 负偏度表示分布的尾巴在左侧,延伸到更负的值。

  • 正偏度表示分布的尾巴在右侧,延伸到更正的值。

  • 零值表示分布中完全没有偏度,意味着分布是完全对称的。

skew = [skew(x, bias=False) for x in sensors]
[print('skew_'+x+'= ', round(y, 4))
  for x,y in zip(axis, skew)][0]
print("\nCompare with Edge Impulse result features")
features[1:N_feat:N_feat_axis]

skew_accX= -0.099

skew_accY= 0.1756

skew_accZ= 6.9463

与 Edge Impulse 结果特征相比:

[-0.0978, 0.1735, 6.8629]

峰度是衡量分布相对于正态分布是重尾还是轻尾的度量。

图片

  • 正态分布的峰度为零。

  • 如果一个给定的分布具有负的峰度,则称为 playkurtic,这意味着它比正态分布产生更少和更极端的异常值。

  • 如果一个给定的分布具有正的峰度,则称为 leptokurtic,这意味着它比正态分布产生更多的异常值。

kurt = [kurtosis(x, bias=False) for x in sensors]
[print('kurt_'+x+'= ', round(y, 4))
  for x,y in zip(axis, kurt)][0]
print("\nCompare with Edge Impulse result features")
features[2:N_feat:N_feat_axis]

kurt_accX= -0.3475

kurt_accY= 1.2673

kurt_accZ= 68.1123

与 Edge Impulse 结果特征相比:

[-0.3813, 1.1696, 65.3726]

频谱特征

经过滤波的信号被传递到频谱功率部分,该部分计算FFT以生成频谱特征。

由于采样窗口通常大于 FFT 大小,窗口将被分成帧(或“子窗口”),FFT 将在每个帧上计算。

FFT 长度 - FFT 大小。这决定了 FFT 分箱的数量和可以分离的频率峰值的分辨率。数字低意味着更多信号将在同一个 FFT 分箱中平均,但它也减少了特征数量和模型大小。数字高将更多信号分离到单独的分箱中,生成更大的模型。

  • 总的频谱功率特征数量将根据您设置的滤波器和 FFT 参数而变化。没有滤波时,特征数量是 FFT 长度的 1/2。

频谱功率 - 威尔奇方法

我们应该使用威尔奇方法在频域的 bins 中分割信号,并对每个 bin 计算功率谱。这种方法将信号分割成重叠的段,对每个段应用窗口函数,使用 DFT 计算每个段的周期图,并将它们平均以获得功率谱的更平滑的估计。

# Function used by Edge Impulse instead of scipy.signal.welch().
def welch_max_hold(fx, sampling_freq, nfft, n_overlap):
    n_overlap = int(n_overlap)
    spec_powers = [0 for _ in range(nfft//2+1)]
    ix = 0
    while ix <= len(fx):
        # Slicing truncates if end_idx > len,
        # and rfft will auto-zero pad
        fft_out = np.abs(np.fft.rfft(fx[ix:ix+nfft], nfft))
        spec_powers = np.maximum(spec_powers, fft_out**2/nfft)
        ix = ix + (nfft-n_overlap)
    return np.fft.rfftfreq(nfft, 1/sampling_freq), spec_powers

将上述函数应用于 3 个信号:

fax,Pax = welch_max_hold(accX, fs, FFT_Length, 0)
fay,Pay = welch_max_hold(accY, fs, FFT_Length, 0)
faz,Paz = welch_max_hold(accZ, fs, FFT_Length, 0)
specs = [Pax, Pay, Paz ]

我们可以绘制功率谱 P(f):

plt.plot(fax,Pax, label='accX')
plt.plot(fay,Pay, label='accY')
plt.plot(faz,Paz, label='accZ')
plt.legend(loc='upper right')
plt.xlabel('Frequency (Hz)')
#plt.ylabel('PSD [V**2/Hz]')
plt.ylabel('Power')
plt.title('Power spectrum P(f) using Welch's method')
plt.grid()
plt.box(False)
plt.show()

除了功率谱,我们还可以将特征的偏度和峰度包含在频域中(应在新版本中可用):

spec_skew = [skew(x, bias=False) for x in specs]
spec_kurtosis = [kurtosis(x, bias=False) for x in specs]

现在我们列出每个轴的所有频谱特征,并与 EI 进行比较:

print("EI Processed Spectral features (accX): ")
print(features[3:N_feat_axis][0:])
print("\nCalculated features:")
print (round(spec_skew[0],4))
print (round(spec_kurtosis[0],4))
[print(round(x, 4)) for x in Pax[1:]][0]

EI 处理后的频谱特征(accX):

2.398, 3.8924, 24.6841, 9.6303, 8.4867, 7.7793, 2.9963, 5.6242, 3.4198, 4.2735

计算特征:

2.9069 8.5569 24.6844 9.6304 8.4865 7.7794 2.9964 5.6242 3.4198 4.2736

print("EI Processed Spectral features (accY): ")
print(features[16:26][0:]) # 13: 3+N_feat_axis;
                           # 26 = 2x N_feat_axis
print("\nCalculated features:")
print (round(spec_skew[1],4))
print (round(spec_kurtosis[1],4))
[print(round(x, 4)) for x in Pay[1:]][0]

EI 处理后的频谱特征(accY):

0.9426, -0.8039, 5.429, 0.999, 1.0315, 0.9459, 1.8117, 0.9088, 1.3302, 3.112

计算特征:

1.1426 -0.3886 5.4289 0.999 1.0315 0.9458 1.8116 0.9088 1.3301 3.1121

print("EI Processed Spectral features (accZ): ")
print(features[29:][0:]) #29: 3+(2*N_feat_axis);
print("\nCalculated features:")
print (round(spec_skew[2],4))
print (round(spec_kurtosis[2],4))
[print(round(x, 4)) for x in Paz[1:]][0]

EI 处理后的频谱特征(accZ):

0.3117, -1.3812, 0.0606, 0.057, 0.0567, 0.0976, 0.194, 0.2574, 0.2083, 0.166

计算特征:

0.3781 -1.4874 0.0606 0.057 0.0567 0.0976 0.194 0.2574 0.2083 0.166

时频域

小波

小波是一种强大的技术,用于分析具有瞬态特征或突然变化的信号,如尖峰或边缘,这些特征难以用传统的基于傅里叶的方法解释。

小波变换通过将信号分解成不同的频率分量并单独分析它们来实现。这种转换是通过将信号与小波函数卷积来实现的,这是一个以特定时间和频率为中心的小波形。这个过程有效地将信号分解成不同的频率带,每个频率带都可以单独分析。

小波变换的一个关键优点是它们允许进行时间-频率分析,这意味着它们可以揭示信号随时间变化的频率内容。这使得它们特别适用于分析非平稳信号,这些信号随时间变化。

小波有许多实际应用,包括信号和图像压缩、去噪、特征提取和图像处理。

让我们在同一项目中光谱特征块中选择小波:

  • 类型:小波

  • 小波分解级别:1

  • 小波:bior1.3

小波函数

wavelet_name='bior1.3'
num_layer = 1

wavelet = pywt.Wavelet(wavelet_name)
[phi_d,psi_d,phi_r,psi_r,x] = wavelet.wavefun(level=5)
plt.plot(x, psi_d, color='red')
plt.title('Wavelet Function')
plt.ylabel('Value')
plt.xlabel('Time')
plt.grid()
plt.box(False)
plt.show()

如我们之前所做的那样,让我们复制并粘贴处理过的特征:

features = [
    3.6251, 0.0615, 0.0615,
    -7.3517, -2.7641, 2.8462,
    5.0924, ...
]
N_feat = len(features)
N_feat_axis = int(N_feat/n_sensors)

Edge Impulse 对每个选定的波分解级别计算 离散小波变换 (DWT)。之后,将提取特征。

小波 的情况下,提取的特征是 基本统计值交叉值。总共每个层有 14 个特征,如下所示:

  • [11] 统计特征:n5, n25, n75, n95, mean, median,标准差 (std),方差 (var),均方根 (rms),峰度 (kurtosis) 和偏度 (skew)

  • [2] 交叉特征:零交叉率 (zcross) 和平均交叉率 (mcross) 分别是信号通过基线 (y=0)(y = 0) 和平均水平(y = u)的单位时间次数

  • [1] 复杂度特征:是信号复杂性的特征度量

所有的上述 14 个值都是针对每个层(包括 L0,原始信号)计算的

  • 特征的总数取决于你如何设置滤波器和层数。例如,使用 [None] 滤波器和级别[1],每个轴的特征数将是 14×214\times 2(L0 和 L1)= 28。对于三个轴,我们将有总共 84 个特征。

小波分析

小波分析通过一组滤波器将信号(accX, accY, 和 accZ)分解成不同的频率成分,这些滤波器将这些成分分离成低频(信号缓慢变化的部分,包含长期模式),例如 accX_l1, accY_l1, accZ_l1 和高频(信号快速变化的部分,包含短期模式)成分,例如 accX_d1, accY_d1, accZ_d1,允许提取特征以进行进一步分析或分类。

只会使用低频分量(近似系数,或 cA)。在这个例子中,我们假设只有一个级别(单级离散小波变换),函数将返回一个元组。在多级分解中,“多级 1D 离散小波变换”,结果将是一个列表(详情请见:离散小波变换 (DWT)

(accX_l1, accX_d1) = pywt.dwt(accX, wavelet_name)
(accY_l1, accY_d1) = pywt.dwt(accY, wavelet_name)
(accZ_l1, accZ_d1) = pywt.dwt(accZ, wavelet_name)
sensors_l1 = [accX_l1, accY_l1, accZ_l1]

# Plot power spectrum versus frequency
plt.plot(accX_l1, label='accX')
plt.plot(accY_l1, label='accY')
plt.plot(accZ_l1, label='accZ')
plt.legend(loc='lower right')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Wavelet Approximation')
plt.grid()
plt.box(False)
plt.show()

特征提取

让我们从基本的统计特征开始。请注意,我们对原始信号和 DWT 的结果 cA 都应用了该函数:

def calculate_statistics(signal):
    n5 = np.percentile(signal, 5)
    n25 = np.percentile(signal, 25)
    n75 = np.percentile(signal, 75)
    n95 = np.percentile(signal, 95)
    median = np.percentile(signal, 50)
    mean = np.mean(signal)
    std = np.std(signal)
    var = np.var(signal)
    rms = np.sqrt(np.mean(np.square(signal)))
    return [n5, n25, n75, n95, median, mean, std, var, rms]

stat_feat_l0 = [calculate_statistics(x) for x in sensors]
stat_feat_l1 = [calculate_statistics(x) for x in sensors_l1]

Skelness 和 Kurtosis:

skew_l0 = [skew(x, bias=False) for x in sensors]
skew_l1 = [skew(x, bias=False) for x in sensors_l1]
kurtosis_l0 = [kurtosis(x, bias=False) for x in sensors]
kurtosis_l1 = [kurtosis(x, bias=False) for x in sensors_l1]

零穿越(zcross)是小波系数穿越零轴的次数。它可以用来测量信号的频率内容,因为高频信号往往比低频信号有更多的零穿越。

另一方面,均值穿越(mcross)是小波系数穿越信号均值次数。它可以用来测量振幅,因为高振幅信号往往比低振幅信号有更多的均值穿越。

def getZeroCrossingRate(arr):
    my_array = np.array(arr)
    zcross = float(
        "{:.2f}".format(
          (((my_array[:-1] * my_array[1:]) < 0).sum()) / len(arr)
        )
    )
    return zcross

def getMeanCrossingRate(arr):
    mcross = getZeroCrossingRate(np.array(arr) - np.mean(arr))
    return mcross

def calculate_crossings(list):
    zcross=[]
    mcross=[]
    for i in range(len(list)):
        zcross_i = getZeroCrossingRate(list[i])
        zcross.append(zcross_i)
        mcross_i = getMeanCrossingRate(list[i])
        mcross.append(mcross_i)
    return zcross, mcross

cross_l0 = calculate_crossings(sensors)
cross_l1 = calculate_crossings(sensors_l1)

在小波分析中,指的是小波系数分布的无序度或随机度。在这里,我们使用了香农熵,它衡量信号的确定性或随机性。它是通过将信号不同可能结果的概率乘以它们的 2 为底的对数,然后取负和来计算的。在小波分析中,香农熵可以用来衡量信号的复杂性,值越高表示复杂性越大。

def calculate_entropy(signal, base=None):
    value, counts = np.unique(signal, return_counts=True)
    return entropy(counts, base=base)

entropy_l0 = [calculate_entropy(x) for x in sensors]
entropy_l1 = [calculate_entropy(x) for x in sensors_l1]

现在让我们列出所有的小波特征,并按层创建一个列表。

L1_features_names = [
    "L1-n5", "L1-n25", "L1-n75", "L1-n95", "L1-median",
    "L1-mean", "L1-std", "L1-var", "L1-rms", "L1-skew",
    "L1-Kurtosis", "L1-zcross", "L1-mcross", "L1-entropy"
]

L0_features_names = [
    "L0-n5", "L0-n25", "L0-n75", "L0-n95", "L0-median",
    "L0-mean", "L0-std", "L0-var", "L0-rms", "L0-skew",
    "L0-Kurtosis", "L0-zcross", "L0-mcross", "L0-entropy"
]

all_feat_l0 = []
for i in range(len(axis)):
    feat_l0 = (
        stat_feat_l0[i]
        + [skew_l0[i]]
        + [kurtosis_l0[i]]
        + [cross_l0[0][i]]
        + [cross_l0[1][i]]
        + [entropy_l0[i]]
    )
    [print(axis[i] + ' +x+= ', round(y, 4))
       for x, y in zip(LO_features_names, feat_l0)][0]
    all_feat_l0.append(feat_l0)

all_feat_l0 = [
    item
    for sublist in all_feat_l0
    for item in sublist
]
print(f"\nAll L0 Features = {len(all_feat_l0)}")

all_feat_l1 = []
for i in range(len(axis)):
    feat_l1 = (
        stat_feat_l1[i]
        + [skew_l1[i]]
        + [kurtosis_l1[i]]
        + [cross_l1[0][i]]
        + [cross_l1[1][i]]
        + [entropy_l1[i]]
    )
    [print(axis[i]+' '+x+'= ', round(y, 4))
       for x,y in zip(L1_features_names, feat_l1)][0]
    all_feat_l1.append(feat_l1)

all_feat_l1 = [
    item
    for sublist in all_feat_l1
    for item in sublist
]
print(f"\nAll L1 Features = {len(all_feat_l1)}")

概述

Edge Impulse Studio 是一个强大的在线平台,可以为我们处理预处理任务。然而,从我们的工程角度来看,我们想要了解底层发生了什么。这些知识将帮助我们找到最佳选项和超参数来调整我们的项目。

Daniel Situnayake 在他的 博客 中写道:“原始传感器数据高度多维且噪声大。数字信号处理算法帮助我们从噪声中提取信号。DSP 是嵌入式工程的重要组成部分,许多边缘处理器都内置了 DSP 加速。作为一名机器学习工程师,学习基本的 DSP 可以让你在模型中处理高频时间序列数据时拥有超能力。” 我建议您完整地阅读 Dan 的优秀文章:nn to cpp:将深度学习模型移植到边缘需要了解的内容

词汇表

这本综合词汇表包含了 ML 系统教材中使用的关键术语的定义。术语按字母顺序排列,并包括它们出现的章节引用。

使用词汇表

  • 术语按字母顺序排列,便于查阅

  • 章节引用显示术语的引入或讨论位置

  • 交叉引用有助于您探索相关概念

  • 交互式工具提示在您将鼠标悬停在书中的词汇表术语上时出现

3

3dmark

图形性能基准测试套件,评估实时 3D 渲染能力,测量三角形吞吐量、纹理填充率以及现代特性如光线追踪和 DLSS 性能。 出现在:第十二章

A

A/B 测试

一种通过随机将用户分成组来比较系统或模型两个版本的控制实验方法,测量不同版本之间的性能差异 出现在:第十三章,第五章

问责制

个人或组织因 AI 系统结果而承担责任的方式,涉及可追溯性、文档、审计和纠正伤害的能力。 出现在:第十七章

激活检查点

一种内存优化技术,通过选择性地丢弃和重新计算激活而不是存储所有中间结果来减少反向传播期间的内存使用。 出现在:第八章

激活函数

应用到神经网络神经元输入加权总和的数学函数,以引入非线性,使网络能够学习超出简单线性组合的复杂模式。 出现在:第三章,第四章,第七章,第八章

基于激活的剪枝

一种评估神经元或过滤器在数据集上的平均激活值的方法,以识别并移除那些持续产生低激活并很少为网络决策过程提供信息的神经元。 出现在:第十章

主动学习

通过迭代选择最具信息量的样本进行标记,以最大化学习效率,与随机采样策略相比,在 50-90%的标记数据下实现目标性能 出现在:第六章,第九章

adam 优化

一种自适应学习率优化算法,通过保持每个参数的指数衰减平均梯度和平方梯度来结合动量和 RMSprop。 出现在:第八章

适配器模块

在预训练模型冻结层之间插入的小型可训练神经网络组件,以实现无需修改基础架构的轻量级适应。出现在:第十四章

自适应资源模式

一种设计模式,使系统能够根据不同的资源可用性动态调整其操作,通过根据计算负载、网络带宽和存储容量进行扩展或缩减,确保效率和弹性。出现在:第十九章

对抗攻击

一种攻击类型,精心设计的输入旨在使机器学习模型做出错误的预测,同时对于人类来说几乎与合法数据无法区分。出现在:第十五章,第十六章

对抗样本

一种恶意修改的输入,旨在欺骗机器学习模型做出错误的预测,通常通过向合法数据添加微小、难以察觉的扰动来创建。出现在:第十五章,第十七章,第十六章

对抗训练

一种防御技术,涉及在对抗样本上训练模型以提高其鲁棒性和正确分类对抗输入的能力。出现在:第十五章,第十七章,第十六章

AGI

通用人工智能 - 计算系统,在所有知识领域和推理能力上与人类认知能力相匹配或超越,能够在不同的问题领域进行泛化,而无需特定任务的训练。出现在:第二十章

AI for Good

针对解决重要社会和环境挑战、提高人类福祉、促进可持续性和贡献全球发展目标而设计和部署的机器学习系统。出现在:第十九章

警报

当指标超过预定义阈值或在生产机器学习系统中检测到异常时,通知团队的自动通知系统。出现在:第十三章

AlexNet

一种开创性的卷积神经网络架构,赢得了 2012 年 ImageNet 挑战赛,将错误率从 26%降低到 16%,引发了深度学习的复兴。出现在:第十二章,第四章,第一章

算法效率

算法设计和优化,以在给定的资源约束内最大化性能,重点关注模型压缩、架构优化和算法精炼等技术。出现在:第九章

算法公平性

自动化系统不应基于受保护属性(如种族、性别或年龄)不成比例地损害个人或群体的原则。出现在:第十七章

All-reduce

分布式计算中的集体通信操作,其中每个进程贡献数据,所有进程接收组合结果,常用于分布式训练中的梯度聚合。出现在:第八章

AlphaFold

DeepMind 开发的一个里程碑式的 AI 系统,该系统能够根据蛋白质的氨基酸序列预测其三维结构,解决了长达数十年的“蛋白质折叠问题”,并展示了大规模机器学习系统如何加速科学发现。出现在:第一章

异常检测

在数据中识别出不符合预期行为的模式,通常用于检测系统中的异常值、故障或恶意活动。出现在:第十六章

匿名化

从数据集中删除或修改个人可识别信息的过程,以保护个人隐私,尽管通常不足以抵御复杂的再识别攻击。出现在:第十五章

Apache Kafka

一个分布式流平台,使用发布-订阅消息系统处理实时数据流,常用于构建具有高吞吐量和容错性的机器学习数据管道。出现在:第六章

Apache Spark

一个开源的分布式计算框架,它使计算机集群能够进行大规模数据处理,通过内存计算能力革新了 ETL 操作。出现在:第六章

专用集成电路

为特定任务设计的专用芯片,通过放弃通用灵活性来实现最大效率,例如 Cerebras Wafer-Scale Engine 用于机器学习训练。出现在:第八章

专用集成电路(ASIC

为特定计算任务设计的定制芯片,与通用处理器相比,提供卓越的性能和能效,例如谷歌的 TPU 和比特币挖矿 ASIC。出现在:第十二章,第十一章

架构效率

模型优化的维度,专注于在训练和推理过程中通过利用稀疏性、分解大型组件和根据输入复杂性动态调整计算,以高效地执行计算。出现在:第十章

人工通用智能

一种假设的 AI 形式,在所有领域内与人类认知能力相匹配或超过,代表着超越当前窄 AI 系统的 AI 研究的最终目标。出现在:第二十章

人工智能

计算机科学领域,专注于创建能够执行通常需要人类智能的任务的系统,如感知、推理、学习和决策。出现在:第十二章,第二十一章,第三章,第一章,第二章,第十七章,第十八章

人工神经网络

一种受生物神经网络启发的计算模型,由层状组织的相互连接的节点(神经元)组成,可以通过可调整的权重和偏差从数据中学习模式。出现在:第三章

人工神经元

神经网络中的基本计算单元,模仿生物神经元,接受多个输入,应用权重和偏差,并通过激活函数产生输出信号。出现在:第一章

攻击分类法

对针对机器学习系统的网络安全威胁和对抗性攻击的系统分类,按方法、目标和影响组织威胁,以指导防御策略。出现在:第十六章

注意力机制

一种神经网络组件,根据其内容计算加权连接,允许动态关注输入的相关部分而不是固定的架构连接。出现在:第四章

自动编码器

一种神经网络架构,通过最小化重建误差来学习压缩数据表示,常用于异常检测和降维。出现在:第十六章

自动微分

一种计算技术,通过在基本操作级别系统地应用链式法则,自动计算作为计算机程序实现的函数的精确导数,这对于通过基于梯度的优化训练神经网络是必不可少的。出现在:第七章

自动混合精度

一种训练技术,它自动管理不同数值精度(FP16,FP32)的使用,以优化内存使用和计算速度,同时保持模型精度。出现在:第八章

自动化偏差

即使存在明显的错误,人类也过度依赖自动化系统输出的倾向,这可能会损害人类监督。出现在:第十七章

自动化机器学习

使用机器学习来自动化模型设计决策的自动机器学习,包括架构搜索、超参数优化和特征选择,以创建无需人工干预的高效模型。出现在:第九章,第二十章,第十章

自回归

通过根据先前元素预测下一个元素来生成序列的模型类型,例如一次生成一个标记的 GPT 模型。出现在:第九章

自动扩展

根据工作负载需求动态调整计算资源,在高峰使用时自动扩展,在低使用时自动缩减,以优化成本和性能。出现在:第十三章

可用性攻击

一种数据中毒攻击类型,旨在通过在多个类别中引入噪声或损坏训练数据来降低机器学习模型的总体性能。出现在:第十五章

B

后门攻击

一种数据中毒类型,其中隐藏的触发器嵌入在训练数据中,当在推理过程中遇到特定模式时,会导致模型表现出恶意行为。出现在:第十五章,第十六章

反向传播

一种通过在网络层中反向传播误差信号来计算损失函数相对于网络权重的梯度的算法,这使得在训练过程中能够进行系统的权重更新。出现在:第三章,第四章,第七章,第十四章,第十八章,第八章

带宽

在通信通道或内存接口上数据传输的最大速率,通常以每秒字节数衡量,对于优化 AI 加速器中的数据移动至关重要。出现在:第十一章

批量推理

使用训练好的机器学习模型对新、以前未见过的数据进行预测或决策的过程。出现在:第十二章,第二章,第十三章

批量摄取

一种数据处理模式,在预定的时间间隔内以分组或批量方式收集和处理数据,适用于实时处理不是关键的场景。出现在:第六章

批量归一化

一种将每层的输入归一化到具有零均值和单位方差的技术,这有助于稳定训练,并通常允许更高的学习率和更快的收敛速度。出现在:第四章,第七章,第八章

批量处理

同时处理多个数据样本的技术,以分摊计算和内存访问成本,提高神经网络训练和推理的整体吞吐量。出现在:第十二章,第六章,第十一章

批量大小

在神经网络训练的一次迭代中同时处理的训练样本数量,它影响计算效率和梯度估计质量。出现在:第三章

批量吞吐量优化

在处理多个输入的同时,通过利用并行性和批量效率来最大化每单位时间内处理的样本数量。出现在:第十二章

批量操作

矩阵计算同时处理多个输入,将矩阵-向量运算转换为更有效的矩阵-矩阵运算,以提高硬件利用率。出现在:第八章

贝叶斯神经网络

在其权重上包含概率分布的神经网络,使预测中的不确定性量化成为可能,并支持更稳健的决策。出现在:第十六章

基准工程

系统设计和开发性能评估框架,包括测试工具创建、指标选择和结果解释方法。出现在:第十二章

基准测试工具

系统基础设施组件,控制测试执行,管理输入交付,并在受控条件下收集性能测量,以确保可重复的评估。出现在:第十二章

基准测试

对机器学习系统中的计算性能、算法有效性和数据质量进行系统评估,以优化跨不同工作负载的性能并确保可重复性。出现在:第十二章

BERT

来自 Transformer 的双向编码表示,这是一种由谷歌在 2018 年引入的基于 Transformer 的语言模型,它通过掩码语言模型预训练彻底改变了自然语言处理。出现在:第十二章

bfloat16

谷歌大脑开发的一种 16 位浮点格式,与 FP32 具有相同的动态范围,但精度较低,特别适合深度学习训练。出现在:第八章

偏差

添加到每个神经元加权和中可学习的参数,允许激活函数进行偏移,为网络拟合复杂模式提供额外的灵活性。出现在:第三章

偏差检测

在机器学习系统输出中识别不同人口群体间不公平歧视或不同待遇的系统方法。出现在:第十七章

偏差缓解

设计用于减少机器学习系统中不公平歧视的技术和干预措施,在数据收集、模型训练或后处理阶段应用。出现在:第十七章

偏差项

神经网络中可学习的参数,它改变了激活函数,使得神经元即使在所有输入都为零的情况下也能激活,为拟合复杂模式提供了额外的灵活性。出现在:第三章

仅偏差适应

一种轻量级训练策略,冻结所有模型权重,仅更新标量偏差项,极大地减少了设备上学习的内存需求和计算开销。出现在:第十四章

二值化

一种极端的量化技术,将神经网络权重和激活降低到二进制值(通常是-1 和+1),实现最大压缩,但通常需要专门的训练程序和硬件支持。出现在:第十章

生物多样性监测

使用相机陷阱和传感器网络等技术对生物多样性进行系统观察和测量的过程,以追踪物种种群、栖息地变化和 conservation effectiveness。出现在:第十九章

生物神经元

神经系统中的一种细胞,通过电化学信号接收、处理和传输信息,作为人工神经网络的灵感来源。出现在:第三章

位翻转

一种硬件故障,其中内存或寄存器中的一个位意外地从 0 变为 1 或相反,可能会损坏数据或计算。出现在:第十六章

黑盒

一个系统,你可以观察输入和输出,但无法看到或理解其内部工作原理,这在 AI 中尤其成问题,因为系统在没有提供推理解释的情况下做出影响人们生活的重要决策。出现在:第一章

黑盒攻击

一种对抗性攻击,攻击者对模型的内部架构、参数或训练数据一无所知,必须完全依赖查询模型并观察输出。出现在:第十五章

BLAS

基本线性代数子程序,是一种用于执行常见线性代数操作的底层例程规范,如向量加法、标量乘法、点积和矩阵运算,构成了现代机器学习框架的计算基础。出现在:第七章

边界框

通过在感兴趣的每个对象周围绘制一个矩形来识别图像中对象位置的标注,通常用于计算机视觉训练数据集。出现在:第六章

脑机接口

脑与外部设备之间的直接通信路径,通过神经信号控制计算机或假肢,代表了机器学习与神经技术的融合。出现在:第二十章

脆弱性

规则型 AI 系统在遇到其编程场景之外的数据输入时完全失败的趋势,无论这些输入与它们设计处理的内容多么相似。出现在:第一章

内置自检(bist)

允许组件使用专用电路和预定义的测试模式自行测试故障的硬件测试机制。出现在:第十六章

C

缓存时序攻击

一种侧信道攻击,利用内存缓存访问模式的变化来推断程序执行或数据中的敏感信息。出现在:第十五章

缓存

一种技术,用于在高速存储系统中存储频繁访问的数据,以减少检索延迟并提高机器学习管道中的系统性能。出现在:第六章

校准

在训练后量化过程中,分析代表性数据集以确定最佳量化参数的过程,包括比例因子和零点,以最小化从高精度到低精度的转换时的精度损失。出现在:第十章

金丝雀部署

渐进式推出策略,其中新模型版本服务于一小部分流量,在全面部署前监控性能,允许在生产环境中进行安全验证。出现在:第十三章

碳足迹

个人、组织、事件或产品直接和间接产生的温室气体排放总量,通常以二氧化碳当量衡量。出现在:第十八章

碳感知调度

一种基于电网碳强度调度 AI 工作负载的计算方法,在可再生能源最丰富时优先执行。出现在:第十八章

灾难性遗忘

当神经网络适应新任务时,会丢失之前学习到的知识的现象,这是持续设备学习场景中的关键挑战。出现在:第十四章

cerebras 晶圆级引擎

一种革命性的单晶圆处理器,包含 2.6 万亿个晶体管和 850,000 个核心,旨在消除大规模机器学习训练中的设备间通信瓶颈。出现在:第八章

通道量化

一种量化粒度方法,其中层的每个通道使用自己的量化参数集,比层间量化提供更精确的表示,同时保持硬件效率。出现在:第十章

检查点和重启机制

定期保存程序状态的技术,以便在失败后从最后保存的状态恢复,提高系统弹性。出现在:第十六章

CI/CD 管道

持续集成和持续交付自动化工作流程,通过集成测试、验证和部署过程来简化模型开发。出现在:第十三章

cifar10

加拿大高级研究研究所数据集,包含 10 个类别中的 60,000 个 32×32 彩色图像,尽管按现代标准图像尺寸较小,但作为计算机视觉中的标准基准。出现在:第九章

分类标签

简单的类别注释,将特定的标签或类别分配给数据示例,代表监督学习注释的最基本形式。出现在:第六章

客户端调度

基于可用性、数据质量和资源限制选择参与联邦学习轮次的设备过程,以确保代表性的模型更新。出现在:第十四章

云机器学习

利用云计算基础设施提供可扩展计算资源进行训练和推理的机器学习系统,通常提供高带宽连接和强大的处理能力。出现在:第十九章

cloudsuite

在 EPFL 开发的基准测试套件,针对现代数据中心工作负载,包括网络搜索、数据分析和中媒体流,测量网络、存储和计算维度的端到端性能。出现在:第十二章

协同设计

一种整体方法,其中模型架构、硬件平台和数据管道协同设计,以无缝协同工作,通过端到端优化来缓解权衡。出现在:第九章

冷启动性能

系统从空闲状态过渡到活动执行所需的时间,在按需加载模型的无服务器环境中尤为重要。出现在:第十二章

组合逻辑

数字逻辑电路,其输出仅取决于当前输入状态,而不取决于任何过去的状态或存储元件。出现在:第十六章

复合人工智能系统

结合多个专用模型和组件的人工智能架构,而不是依赖于单一的单块模型,从而实现模块化、专业化和改进的可解释性。出现在:第二十一章,第二十章

计算图

数学运算的有向无环图表示,其中节点表示运算或变量,边表示数据流,使自动微分和优化神经网络计算成为可能。出现在:第七章

计算效率

对计算资源的优化,包括硬件和能源利用,以最大化处理速度,同时在训练和部署过程中最小化资源消耗。出现在:第九章

计算最优训练

根据缩放定律,在模型大小和训练计算预算之间进行最优平衡的训练策略,在给定的计算预算下实现最大性能。出现在:第九章

计算机工程

一种在 20 世纪 60 年代末出现的工程学科,旨在解决集成硬件和软件系统日益增长的复杂性,结合电气工程和计算机科学的专业知识来设计和构建复杂的计算系统。出现在:第一章

概念瓶颈模型

神经网络架构,首先预测可解释的中间概念,然后再做出最终预测,将深度学习的能力与透明度相结合。出现在:第十七章

概念漂移

当输入特征与目标结果之间的基本关系随时间变化时发生的性能下降,需要模型重新训练 出现在:第十三章,第十六章

条件计算

一种动态优化技术,根据输入特征选择性地激活神经网络的不同部分,通过跳过特定输入的不必要计算来减少计算负载。出现在:第十章

连接主义

一种强调从简单的互联单元中涌现学习和智能的 AI 建模方法,作为神经网络的理论基础,并与符号 AI 方法形成对比。出现在:第一章

共识标注

一种质量控制方法,通过收集同一数据点的多个标注来识别有争议的案例,并通过标注者之间的协议提高标签可靠性。出现在:第六章

保护技术

设计用于保护和管理野生动物和生态系统的技术解决方案,包括用于跟踪动物行为和检测威胁的相机陷阱、传感器网络和卫星监控系统。出现在:第十九章

宪法 AI

一种训练方法,其中模型通过批判性地对比一组原则来学习改进自己的输出,从而实现迭代自我完善,在减少有害内容的同时保持有用性 出现在:第二十章

容器化

使用 Docker 等工具将应用程序及其依赖项打包到便携、隔离的容器中,以确保在不同环境中的一致执行。出现在:第十三章

容器化微服务

使用轻量级容器来打包单个服务,使 ML 系统在分布式环境中实现可扩展和可维护的部署。出现在:第十三章

持续学习

机器学习系统从数据流中持续学习并保留先前获得的知识的能力,解决神经网络中灾难性遗忘的挑战 出现在:第二十章,第十四章,第十六章

持续集成

一种软件开发实践,其中代码更改每天自动集成、测试和验证多次,以在开发周期早期检测问题。出现在:第五章

卷积

一种基本的数学运算,是卷积神经网络的核心,它将滤波器(核)应用于输入数据以提取边缘、纹理或模式等特征,特别适用于处理图像和空间数据。出现在:第七章

卷积操作

一种数学运算,通过在输入数据上滑动一个滤波器(核)来检测局部特征,形成空间模式识别卷积神经网络的基础。出现在:第四章

卷积神经网络

一种专门为处理网格状数据(如图像)而设计的神经网络架构,使用卷积层应用滤波器以检测局部特征。出现在:第十二章、第三章、第四章

冷却效率

数据中心冷却系统从计算设备中移除热量的效率,通常以移除的热量与冷却所消耗的能量之比来衡量。出现在:第十八章

反事实解释

描述如果修改特定输入特征,模型输出将如何变化的解释,特别有助于理解决策边界。出现在:第十七章

协变量偏移

一种输入分布发生变化,而输入和输出之间的条件关系保持稳定类型的分布偏移。出现在:第十六章

CP 分解

CANDECOMP/PARAFAC 分解,将张量表示为单秩分量的和,用于通过减少参数数量同时保持计算功能来压缩神经网络层。出现在:第十章

crisp-dm

数据挖掘的跨行业标准流程,1996 年开发的一种结构化方法,定义了数据项目的六个阶段:业务理解、数据理解、数据准备、建模、评估和部署。出现在:第五章

交叉熵损失

在分类任务中常用的一种损失函数,衡量预测概率分布与真实类别标签之间的差异,提供强大的梯度以实现有效学习。出现在:第三章

众包

一种协作数据收集方法,通过互联网利用分布式个体执行标注任务,通过像 Amazon Mechanical Turk 这样的平台实现可扩展的数据集创建。出现在:第六章

cublas

NVIDIA 的 CUDA 基本线性代数子程序库,它提供了标准线性代数运算的 GPU 加速实现,使得在 NVIDIA 图形处理单元上能够进行高性能矩阵计算。出现在:第七章

CUDA

NVIDIA 的并行计算平台和编程模型,它使通用计算在图形处理单元(GPU)上成为可能,允许机器学习框架利用大规模并行性来加速张量运算。出现在:第七章

CUDA(计算统一设备架构)

NVIDIA 的并行计算平台和编程模型,它使开发者能够使用 GPU 进行超出图形渲染的通用计算。出现在:第十一章

课程学习

训练策略,其中模型先从简单示例学习,然后再过渡到更难的示例,模仿人类教育,并通过提高收敛速度 25-50%来改进。出现在:第九章

D

达特茅斯会议

1956 年在达特茅斯学院举办的传奇 8 周研讨会,在那里人工智能正式诞生,由约翰·麦卡锡、马文·明斯基、纳撒尼尔·罗切斯特和克劳德·香农组织,在那里首次提出了“人工智能”一词。出现在:第一章

数据增强

通过旋转、裁剪或噪声等变换人工扩展数据集,通过提高模型性能 5-15%并减少当标记数据稀缺时的过度拟合。出现在:第六章,第九章

数据级联

系统性失败,其中数据质量问题随着时间的推移而累积,导致下游负面后果,如模型故障、昂贵的重建或项目终止。出现在:第六章

数据中心

一个容纳计算机系统及其相关组件(如电信和存储系统)的设施,通常包含数千台服务器用于云计算操作。出现在:第二章,第十八章

以数据为中心的 AI

从以模型为中心到以数据为中心的开发范式的转变,该范式侧重于系统地提高数据质量,而不仅仅是模型架构,通常会产生更大的性能提升。出现在:第九章

数据压缩

通过编码、量化或特征提取等技术减少训练数据的大小和复杂性,以在内存受限的设备上实现高效的存储和处理。出现在:第十四章

数据整理

通过去除无关信息、纠正错误并确保数据满足机器学习应用的具体标准,选择、组织和维护高质量数据集的过程。出现在:第五章

数据漂移

输入数据的统计特性随时间变化的现象,即使底层代码保持不变,也会导致机器学习模型性能下降。出现在:第十三章,第五章

数据效率

优化训练机器学习模型所需的数据量和质量,重点关注在最小化所需数据量的同时最大化获得的信息。出现在:第九章

数据治理

确保在整个机器学习流程中数据安全、隐私、合规和道德使用的政策、程序和技术框架。出现在:第六章

数据摄取

从各种来源收集和导入原始数据到系统中,以便存储、处理和为机器学习应用做准备。出现在:第六章,第五章

数据湖

一种存储库,以原生格式存储结构化、半结构化和非结构化数据,使用读取时模式的方法进行灵活的数据分析。出现在:第六章

数据血缘

对数据流通过各种转换和过程的文档化和跟踪,提供对数据来源和修改的可见性,以支持合规性和调试。出现在:第六章,第十三章

数据并行

一种分布式训练策略,将数据集分割到多个设备上,同时每个设备保持模型完整副本,实现梯度的并行计算。出现在:第十二章,第九章,第七章,第八章

数据管道

基础设施和工作流程,自动化数据从来源到处理阶段再到最终存储或消费的移动和转换。出现在:第六章

数据中毒

一种攻击方法,攻击者将精心制作的恶意数据点注入训练数据集中,以针对或系统性地操纵模型行为。出现在:第十五章,第十六章

数据质量

数据满足准确性、完整性、一致性和及时性要求程度的程度,直接影响机器学习模型性能。出现在:第六章

数据清理

故意且永久地从存储在内存设备上的数据中删除或销毁数据,使其无法恢复,以确保数据安全。出现在:第十六章

数据缩放制度

模型训练的不同阶段,其中数据需求根据可预测的模式进行扩展,从而指导关于数据集大小与计算投资决策。出现在:第九章

数据验证

对收集到的数据进行系统验证,以确保其符合质量标准,格式正确,并包含适合机器学习模型训练和评估的准确信息。出现在:第六章,第五章

数据版本控制

跟踪和管理数据集不同版本随时间推移的实践,类似于代码版本控制,以确保可重复性和在需要时回滚到之前的数据状态。出现在:第十三章,第五章

数据仓库

优化用于分析查询(OLAP)的集中式存储库,它以标准模式存储来自多个来源的集成、结构化数据。出现在:第六章

以数据为中心的方法

一种机器学习范式,它优先考虑提高数据质量、多样性和管理,而不是仅仅关注模型架构改进以实现更好的性能。出现在:第二十一章

数据流架构

一种专门的计算架构,其中指令执行由数据可用性而不是程序计数器决定,从而实现神经网络操作的并行处理。出现在:第十一章

数据流挑战

在硬件加速器中管理数据移动和依赖关系的技术困难,包括内存带宽限制和同步要求。出现在:第十一章

死信队列

为处理失败的数据提供单独的存储机制,允许在后续分析和对问题数据的潜在重新处理时,不阻塞主管道。出现在:第六章

深度学习

机器学习的一个子领域,它使用多层人工神经网络自动从数据中学习层次化表示,而不需要显式特征工程。出现在:第十二章,第三章,第四章,第十八章

防御蒸馏

一种技术,通过使用软标签训练学生模型来模仿教师模型的行为,从而降低对对抗性扰动的敏感性。出现在:第十六章

人口统计学平等

一个公平性标准,要求接收积极预测的概率在受保护属性中的群体成员资格之间是独立的。出现在:第十七章

** Dennard 缩放**

历史观察表明,随着晶体管的变小,其功率密度保持大致恒定,这使得在不增加相应功耗的情况下可以增加更多的晶体管。出现在:第十八章

密集层

一个全连接神经网络层,其中每个神经元都从前一层的所有神经元接收输入,从而实现跨特征的综合信息集成。出现在:第三章,第四章

密集矩阵-矩阵乘法

神经网络中的基本计算操作,它决定了训练时间,在典型模型中占计算量的 60-90%。出现在:第八章

部署限制

操作限制,如硬件资源、网络连接、法规要求和集成要求,这些限制影响了机器学习模型在生产环境中的实现。出现在:第五章

深度可分离卷积

一种计算技术,将标准卷积分解为深度和点操作,对于移动优化架构,通过 8-9 倍减少参数和计算。出现在:第十四章

devops

将开发和运维团队结合起来的软件开发实践,以缩短开发周期并通过自动化和协作交付高质量的软件。出现在:第十三章

dhrystone

1984 年引入的基于整数的基准,用于衡量 DMIPS(Dhrystone MIPS)中的整数和字符串操作,旨在通过典型的编程结构补充浮点基准。出现在:第十二章

糖尿病视网膜病变

一种糖尿病并发症,损害视网膜中的血管,是可预防失明的首要原因,也是医疗 AI 筛查系统的主要应用领域。出现在:第五章

差分隐私

一种数学框架,通过向计算中添加校准噪声来提供正式的隐私保证,确保任何个人数据的包含或排除对输出的影响是可证明有限的。出现在:第二十一章,第六章,第十四章,第十五章,第十七章

数字鸿沟

拥有现代信息和通信技术的人与没有的人之间的差距,尤其是影响了弱势社区从数字解决方案中获益的能力。出现在:第十九章

数字孪生

一种使用实时数据和机器学习来模拟、预测和优化其物理对应物行为的物理系统的虚拟表示。出现在:第二十章

灾害响应系统

自动化系统使用机器学习通过卫星图像分析、传感器网络和资源分配优化来检测、预测和响应自然灾害。出现在:第十九章

分布式计算

一种在多台机器或处理器上同时处理数据的方法,通过 Apache Spark 等框架实现可扩展的大数据集处理。出现在:第六章

分布式智能

在多个设备和位置之间分配计算能力,而不是依赖于单一集中式系统,从而实现本地处理和决策。出现在:第二章

分布式知识模式

一种设计模式,解决去中心化节点之间的集体学习和推理,强调对等知识共享和协作模型改进,同时保持操作独立性。出现在:第十九章

分布式训练

一种在多台机器或设备上训练机器学习模型的方法,以处理更大的数据集和超出单设备计算或内存容量的模型。出现在:第十二章,第二十一章,第十八章,第八章

分布偏移

在模型部署期间遇到的数据与训练分布不同,这可能会降低模型性能。出现在:第十七章,第十六章

分布偏移类型

对数据分布变化进行正式分类,包括协变量偏移、标签偏移、概念漂移和领域偏移,每种都需要特定的适应技术。出现在:第十六章

领域自适应

机器学习技术,使在一个领域训练的模型能够在不同但相关的领域表现良好,解决分布不匹配的挑战。 出现在:第十六章

特定领域人工智能应用

定制化的机器学习解决方案,针对特定行业如医疗保健、农业、教育或灾害响应,旨在解决独特的挑战和限制。 出现在:第十九章

特定领域架构

专为优化特定计算工作负载而设计的硬件设计,通过提高性能和能源效率来换取与通用处理器相比的灵活性。 出现在:第十一章

双模冗余 (dmr)

一种容错技术,通过在两个独立的系统中复制计算来识别和纠正错误,通过比较来识别和纠正错误。 出现在:第十六章

dropout

一种正则化技术,在训练过程中随机将一部分输入单元设置为零,以防止过拟合并提高泛化能力。 出现在:第四章

双重用途困境

减缓具有积极和消极潜在应用的技术滥用的挑战,这在人工智能安全中尤其相关。 出现在:第十六章

dying relu 问题

一种现象,其中 ReLU 神经元永久性地不活跃,对所有输入输出为零,当加权输入持续产生负值时,它们无法在学习中做出贡献。 出现在:第八章

动态图

在程序执行过程中构建和修改的计算图,允许灵活的模型架构和更容易的调试,但与静态图相比,可能限制了优化机会。 出现在:第七章

动态剪枝

一种模型优化技术,在保持预测性能的同时从神经网络中移除不必要的参数,通过消除冗余权重、神经元或层来减少模型大小和计算成本。 出现在:第十章

动态量化

通过将高精度权重和激活映射到低比特表示来降低神经网络中的数值精度,这显著减少了内存使用和计算需求 出现在:第十二章,第十章

动态随机存取存储器 (dram)

一种易失性内存,在电容器中存储数据,需要周期性的刷新周期,通常用作计算机系统中的主存储器。 出现在:第十一章

动态电压和频率缩放 (dvfs)

根据工作负载需求调整处理器电压和时钟频率的电源管理技术,以优化能耗同时保持性能。出现在:第十二章

E

急切执行

一种执行模式,其中操作在代码中调用时立即评估,提供直观的调试和开发体验,但可能牺牲一些在基于图的执行中可用的优化机会。出现在:第七章

早期退出架构

包含多个不同深度的预测头的神经网络设计,允许在可以做出自信预测时提前退出样本,从而降低每次推理的平均计算成本。出现在:第十章

边缘人工智能

在智能手机、物联网传感器和嵌入式系统等边缘设备上直接部署人工智能算法,实现无需云连接的实时处理。出现在:第二十章

边缘计算

一种分布式计算范式,将计算和数据存储更靠近数据源,从而降低延迟和带宽使用。出现在:第十九章,第二十一章,第十一章,第二章,第十四章,第十八章

边缘部署

一种部署策略,其中机器学习模型在网络的边缘设备上本地运行,而不是在集中式云服务器上运行,从而降低延迟并允许在没有持续互联网连接的情况下进行操作。出现在:第五章

边缘机器学习

在网络边缘执行推理和有时训练的机器学习系统,通常在智能手机或计算能力有限的嵌入式系统等资源受限的设备上。出现在:第十九章

边缘训练

在边缘设备上直接训练或微调机器学习模型的过程,无需将数据传输到云端服务器即可实现个性化适应。出现在:第十四章

efficientnet

通过神经网络架构搜索发现的一系列神经网络架构,通过使用复合缩放平衡网络深度、宽度和输入分辨率,实现了更好的精度-效率权衡。出现在:第九章,第十章

电迁移

在电场影响下导体中金属原子的移动,可能随着时间的推移导致永久性硬件故障。出现在:第十六章

eliza

1966 年,麻省理工学院约瑟夫·魏岑鲍姆(Joseph Weizenbaum)创建的第一个能够通过模式匹配和替换模拟人类对话的聊天机器人之一,值得注意的是,人们开始对这个简单的程序产生情感依恋。出现在:第一章

elt(提取、加载、转换)

一种数据处理范式,首先将原始数据加载到目标系统中,然后再应用转换,为不断发展的分析需求提供灵活性。出现在:第六章

嵌入式系统

在更大的机械或电气系统中具有专用功能的计算机系统,通常设计用于特定任务,并具有实时计算约束。出现在:第二章

实体碳

在产品开始运行之前,在制造、运输和安装过程中产生的总温室气体排放量。出现在:第十八章

涌现行为

由个别组件的交互产生的意外系统级模式或特征,通常只有在系统以规模或在实际条件下运行时才会变得明显。出现在:第五章

涌现能力

在特定参数阈值时突然出现在神经网络中的能力,例如推理和算术技能,这些能力是突然出现的,而不是随着规模的增加而逐渐提高。出现在:第二十章

编码器-解码器

一种架构模式,其中编码器将输入处理为压缩表示,解码器从该表示生成输出,常用于序列到序列任务。出现在:第四章

端到端基准测试

一种综合评估方法,评估整个 AI 系统管道,包括数据处理、模型执行、后处理和基础设施组件。出现在:第十二章

能源效率

每单位能耗完成的计算工作的度量,通常以每焦耳操作数表示,对于电池供电和数据中心的部署至关重要。出现在:第十二章,第十一章,第十八章

能源之星

美国环保署(EPA)认证计划,为计算设备建立能源效率标准,要求系统在运行和睡眠模式下满足严格的效率要求。出现在:第十二章

集成方法

结合多个模型以提高性能的技术,如随机森林和梯度提升,在深度学习之前主导了机器学习竞赛。出现在:第九章,第十六章

环境影响测量

系统跟踪和量化人工智能系统的生态影响,包括整个系统生命周期内的能源消耗、碳排放和资源耗竭。出现在:第十八章

环境监测

使用传感器网络和机器学习系统地收集和分析环境数据,以跟踪生态系统健康、污染水平和气候变化影响。出现在:第十九章

纪元

神经网络训练过程中对整个训练数据集的一次完整遍历,包括根据数据集大小和批量大小进行的多个批量迭代。出现在:第三章,第七章

机会均等

一个公平性标准,专注于确保组间真正率相等,保证无论组别成员资格如何,合格的个人都受到平等对待。出现在:第十七章

均衡机会

一个公平性定义,要求在不同人口群体中,真正率和假正率相等。出现在:第十七章

纠错码

在数据存储和传输中使用的用于检测和纠正错误的方法,提高系统可靠性和数据完整性。出现在:第十六章

ESP32

一种低成本微控制器单元,广泛应用于物联网应用,具有 240 MHz 的处理器和 520 KB 的 RAM,通常在资源受限的社会影响应用中部署。出现在:第十九章

ETL(提取、转换、加载

一种传统的数据处理范式,在将数据加载到数据仓库之前对其进行转换,从而产生可查询的格式化数据。出现在:第六章

精确模型窃取

一种旨在提取机器学习模型精确内部结构、参数和架构的攻击,允许完全复制原始模型。出现在:第十五章

经验回放

一种基于记忆的技术,将过去的训练示例存储在缓冲区中,以防止灾难性遗忘并稳定流式或持续适应场景中的学习。出现在:第十四章

实验跟踪

系统记录和管理机器学习实验,包括超参数、模型版本、训练数据和性能指标,以实现比较和可重复性。出现在:第十三章,第五章

专家崩溃

在专家混合模型中的一种训练病理,其中只有少数专家接收到显著的训练信号,导致其他专家利用率不足,从而降低模型的有效容量。出现在:第二十章

专家系统

从 20 世纪 70 年代中期开始的人工智能系统,它们在特定领域捕获人类专家知识,例如 MYCIN 用于诊断血液感染,代表了从通用人工智能到特定应用领域的转变。出现在:第一章

可解释性

利益相关者通过事后解释技术理解机器学习模型如何产生其输出的能力。出现在:第十七章

可解释人工智能

设计用于提供其决策和预测的清晰、可解释的解释的人工智能系统,解决复杂机器学习模型的“黑盒”问题。出现在:第二十章

外部内存

允许神经网络访问和操作外部存储系统的机制,将它们的工作内存扩展到参数存储之外,以实现更复杂的推理和信息检索。出现在:第二十章

F

f1 分数

一种将精确度和召回率结合成一个单一指标来衡量模型准确度的度量,计算为它们的调和平均值。出现在:第十六章

公平性约束

为确保机器学习系统中人口统计群体之间公平对待而设计的技术和政策限制。出现在:第十七章

farmbeats

一个微软研究院项目,将机器学习和物联网技术应用于农业,使用边缘计算收集土壤条件和作物健康的实时数据,同时在具有挑战性的现实世界环境中展示分布式人工智能系统。出现在:第一章

快速梯度符号方法(fgsm)

一种基于梯度的对抗攻击,通过在梯度方向添加小的扰动来生成对抗示例。出现在:第十六章

故障注入攻击

一种通过电压操纵或电磁干扰等技术故意破坏硬件操作,以诱导计算错误和损害系统完整性的物理攻击。出现在:第十五章

容错性

系统能够在部分组件失败或遇到错误的情况下继续正确运行的能力。出现在:第十六章

特征工程

从原始数据中手动设计和提取相关特征的过程,以提高机器学习模型性能,在深度学习系统中大部分是自动化的。出现在:第六章,第三章

特征图

卷积层的输出,表示学习到的滤波器对输入中不同空间位置的响应,捕捉在不同位置检测到的特征。出现在:第四章

特征存储

一种专门的数据存储系统,为机器学习提供标准化的、可重用的特征,使多个模型和团队之间能够共享特征。出现在:第六章,第十三章

联邦平均

联邦学习的标准算法,通过基于本地数据集大小的加权平均聚合客户端模型更新,以生成全局模型。出现在:第十四章

联邦学习

一种机器学习方法,在持有本地数据样本的分布式边缘设备或服务器上训练算法,而不交换原始数据。出现在:第十九章,第二十一章,第七章,第二十章,第二章,第十四章,第十五章,第十七章,第十八章,第五章

反馈循环

循环过程,其中机器学习生命周期的后期阶段的输出信息影响早期阶段的决策,从而实现系统的持续改进和适应。出现在:第五章

前馈网络

一种神经网络架构,信息从输入层流向输出层,没有循环,为许多深度学习模型奠定了基础。出现在:第三章,第四章

少样本学习

一种机器学习范式,允许模型仅使用少量标记示例来适应新任务,这对于数据稀疏的设备场景至关重要。出现在:第十四章

现场可编程门阵列

可编程硬件,可用于特定任务,在通用处理器和应用特定集成电路之间提供灵活性,对于定制机器学习加速很有用。出现在:第八章

现场可编程门阵列(FPGA)

一种可重构的集成电路,在制造后可以编程以实现自定义数字电路和专用计算。出现在:第十一章

浮点运算单元 (fpu)

一种专门设计的处理器组件,用于以高精度和效率执行浮点数算术运算。出现在:第十一章

flops

每秒浮点运算次数,这是一种衡量计算吞吐量的度量,它量化了系统可以执行的涉及小数的数学运算的数量。出现在:第十二章,第三章,第九章,第十章,第十八章

前向传递

计算阶段,其中输入数据流经神经网络层以产生输出,涉及矩阵乘法和激活函数的应用。出现在:第八章

前向传播

通过将输入数据通过连续的层进行计算,在每个阶段应用权重、偏置和激活函数的过程来计算神经网络预测。出现在:第三章

基础模型

在广泛数据上训练的大规模机器学习模型,可以适应广泛的下游任务,作为专用应用的基础。出现在:第二章

基础模型

在广泛数据上训练的大规模通用人工智能模型,可以适应许多任务,包括具有数十亿参数的 GPT-3、BERT 和 DALL-E 等模型。出现在:第九章,第二十章

fp16

一种 16 位浮点数数值表示,它减少了内存使用并加速了计算,同时保持了适用于许多机器学习应用的可接受精度。出现在:第十二章

fp16 计算

使用 16 位浮点数进行神经网络操作,以减少内存使用并提高现代硬件加速器的计算速度。出现在:第八章

fp32

32 位浮点数数值表示,为数学计算提供标准精度,但比低精度格式需要更多的内存和计算资源。出现在:第十二章

fp32 到 int8

一种常见的量化转换,将 32 位浮点权重和激活转换为 8 位整数,在保持许多模型可接受精度的同时,实现大约 4 倍的内存减少。出现在:第十章

框架分解

将神经网络框架系统性地分解为可映射到硬件的组件,使操作在处理元素之间高效分布。出现在:第十一章

G

gdpr

欧洲联盟的一项法律,对个人数据处理提出严格的要求,并对保护隐私的机器学习设计产生重大影响。出现在:第十四章,第十七章

gemm

通用矩阵乘法运算,遵循 C = αAB + βC 的模式,代表大多数神经网络操作(包括全连接层和卷积层)背后的基本计算内核。出现在:第七章

gemv

通用矩阵-向量乘法运算,用于计算矩阵和向量的乘积,在神经网络计算中常用,需要仔细优化内存访问模式。出现在:第七章

generalization

机器学习模型在未见过的、与训练集不同的数据上表现良好的能力,通常通过多样化和高质量的训练数据得到改善。出现在:第六章

generative adversarial networks

一类机器学习系统,其中两个神经网络相互竞争,一个生成假数据,另一个试图检测它,从而实现高度逼真的合成数据生成。出现在:第二十章

生成式 AI

一类能够根据训练数据中学习到的模式创建新内容(如文本、图像、音频或视频)的人工智能系统。出现在:第二十一章

glitches

电压、电流或信号的暂时偏差,可能导致数字系统和电路操作错误。出现在:第十六章

governance frameworks

管理负责任 AI 开发的系统化方法,包括政策、程序、监督机制和问责结构。出现在:第十七章

gpt3

OpenAI 于 2020 年发布的 1750 亿参数语言模型,训练成本估计为 460 万美元,消耗约 1287 兆瓦时电力。出现在:第九章

gpt4

截至 2023 年 OpenAI 最先进的语言模型,据报道使用专家混合架构,具有约 180 亿参数,训练成本超过 1 亿美元。出现在:第九章

gpu

图形处理单元,一种专门设计的电子电路,用于快速操纵和改变内存,以加速图像创建和并行处理任务。出现在:第十二章,第二章,第十八章

优雅降级

一种系统设计原则,其中服务在面临部分故障或数据不可用时继续以降低的能力运行。出现在:第六章

梯度累积

一种技术,通过在更新模型参数之前累积来自多个较小批次的梯度来模拟更大的批次大小,从而实现内存受限下的训练。出现在:第八章

梯度裁剪

一种正则化技术,通过在反向传播期间限制梯度的幅度来防止梯度爆炸,通常通过在梯度的范数超过阈值时缩放梯度来实现。出现在:第七章,第八章

梯度压缩

一种在分布式训练中用于通过压缩计算节点之间交换的梯度信息来减少通信开销的技术。出现在:第二十一章

梯度下降

一种优化算法,通过迭代调整神经网络参数,使其朝向最小化损失函数的方向,使用梯度来确定更新方向和幅度。出现在:第三章,第四章,第七章,第十四章,第八章

梯度同步

分布式训练中的过程,其中本地计算的梯度在设备之间聚合,以确保所有设备一致地更新其参数。出现在:第八章

基于梯度的剪枝

一种在训练期间使用梯度信息来识别具有较小梯度幅度的神经元或滤波器(这些对减少损失函数的贡献较小,可以安全地移除)的剪枝方法。出现在:第十章

图形处理单元

一种最初为渲染图形而设计的专用处理器,它提供了对高效神经网络计算和训练至关重要的并行处理能力。出现在:第三章,第八章

图形处理单元 (GPU)

一种最初为图形渲染而设计的专用处理器,它提供了适合神经网络计算的强大并行计算能力。出现在:第十一章

绿色人工智能指标

专门的环境影响指标,用于衡量人工智能系统的环境影响,包括碳足迹、能源效率和整个机器学习生命周期中的资源利用。出现在:第十八章

绿色计算

以环境负责的方式设计、制造、使用和处置计算机和计算机系统的实践。出现在:第十八章

绿色 500

一种基于每瓦特浮点运算数(FLOPS)测量的能源效率来评估世界上最具计算能力的超级计算机的排名系统,而不是原始的计算性能。出现在:第十二章

灰盒攻击

一种对抗攻击,攻击者对模型有部分了解,例如知道架构但不知道具体的参数或训练数据。出现在:第十五章

分组量化

一种量化方法,其中参数被分成组,每组共享量化参数,通过提供比层方法更细粒度的控制,在压缩和精度之间提供平衡。出现在:第十章

GRU

Gated Recurrent Unit,一种简化的 LSTM 变体,使用较少的门控单元,同时保持捕捉序列数据中长期依赖关系的能力。出现在:第四章

H

硬件抽象

在机器学习框架中提供统一接口的层,用于访问各种计算硬件(CPU、GPU、TPU、加速器),同时在幕后处理设备特定的优化和内存管理。出现在:第七章

硬件加速

使用专用计算硬件以比在通用处理器上运行的软件更快、更有效地执行某些操作。出现在:第十一章

硬件加速器

专为高效执行特定类型计算而设计的专用计算硬件,例如用于并行处理的 GPU 或用于机器学习工作负载的 TPU。出现在:第十二章

硬件约束优化

将机器学习算法和模型适应于移动和嵌入式设备内存、计算和功率限制的技术。出现在:第十四章

硬件冗余

通过投票机制复制关键硬件组件以提供备份功能并提高系统可靠性的做法。出现在:第十六章

硬件木马

在制造硬件组件时嵌入的恶意修改,在正常条件下可能保持休眠状态,但在满足特定条件时触发有害行为。出现在:第十五章

硬件感知设计

设计神经网络架构的实践,特别针对目标硬件平台进行优化,考虑因素包括内存层次、计算单元和数据移动模式,以最大化效率。出现在:第十章

软硬件协同设计

一种协同设计方法,其中硬件加速器和软件算法共同优化以达到最大效率和性能。出现在:第九章

hdfs (hadoop 分布式文件系统)

一种分布式文件系统,旨在跨多个商品硬件集群存储大数据集,为大数据应用提供可扩展性和容错性。出现在:第六章

心跳机制

在系统组件之间发送的周期性信号,用于监控健康和检测故障,使及时故障检测和恢复成为可能。出现在:第十六章

隐藏层

神经网络中输入层和输出层之间的一层中间层,通过通过学习权重和激活函数转换数据来学习抽象表示。出现在:第三章

隐藏状态

循环神经网络的内存储器,携带来自先前时间步的信息,使网络能够在顺序输入之间保持上下文。出现在:第四章

分层处理

一种多级系统架构,其中数据和智能在计算堆栈的不同级别之间流动,从传感器到边缘设备再到云系统。出现在:第二章

分层处理模式

一种设计模式,将系统组织成层(边缘、区域、云),这些层根据可用资源和能力共享责任,优化整个计算谱系中的资源使用。出现在:第十九章

高带宽内存 (hbm)

一种先进的内存技术,通过 3D 堆叠和宽接口提供比传统 DRAM 更高的带宽,这对于数据密集型人工智能工作负载至关重要。出现在:第十一章

同态加密

一种密码学技术,允许在加密数据上直接执行计算,而无需先解密它,从而实现隐私保护机器学习推理。出现在:第十五章

水平扩展

通过添加更多机器或实例来增加系统容量,而不是升级现有硬件,提供更好的容错性和负载分配。出现在:第十三章

热备件

备份组件保持就绪,以便在系统操作不受干扰的情况下立即替换故障组件,提供冗余。出现在:第十六章

Huber 损失

在回归中使用的鲁棒损失函数,与平方误差损失相比对异常值更不敏感,从而提高训练稳定性。出现在:第十六章

人工监督

应该由人类判断来监督、纠正或暂停自动化决策的原则,以保持对人工智能系统有意义的控制。出现在:第十七章

人机协作

人类与人工智能系统之间的协同伙伴关系,其中每个人贡献他们独特的优势,以比单独工作更有效地解决复杂问题。出现在:第二十章

混合机器学习

将多个机器学习范式(如云、边缘、移动和微型机器学习)集成,形成利用互补优势的统一分布式系统。出现在:第二章

混合并行性

一种分布式训练方法,结合数据并行性和模型并行性,以利用这两种策略训练非常大的模型的好处。出现在:第八章

超参数

一种控制学习过程但不是从数据中学习的配置设置,例如学习率、批量大小或网络架构选择。出现在:第十二章,第三章,第七章

超参数优化

寻找控制机器学习训练过程的最优超参数配置(学习率、批量大小、网络架构参数)的过程。出现在:第十八章

超参数

控制机器学习算法学习过程但不是从数据中学习的配置设置,例如学习率、批量大小和网络架构参数。出现在:第五章

超大规模数据中心

包含数千台服务器并覆盖大量楼面空间的大型数据中心设施,旨在高效支持大规模计算工作负载。出现在:第二章

I

ImageNet

一个包含超过 1400 万张标记图像的巨大视觉数据库,跨越 20,000 多个类别,由斯坦福大学的李飞飞自 2009 年起创建,其年度挑战成为推动计算机视觉突破性进展的关键因素。出现在:第十二章,第九章,第一章

影响评估框架

评估人工智能在人道主义和发展环境中的潜在社会、经济和环境影响的系统方法。出现在:第十九章

命令式编程

一种编程范式,其中操作在代码中遇到时立即执行,允许自然控制流和更容易的调试,但可能限制了优化机会。出现在:第七章

推理

机器学习的阶段,训练好的模型对新输入数据进行预测,通常比训练需要更低的精度和计算资源。出现在:第十一章,第十八章

基础设施即代码

通过机器可读的配置文件而不是手动过程来管理和配置计算基础设施的实践,这使版本控制和自动化成为可能。出现在:第十三章

指令集架构 (isa)

定义处理器可以执行的一组指令的软件和硬件接口,包括数据类型和寻址模式。出现在:第十一章

int8

在量化神经网络中使用的 8 位整数数值表示,用于减少内存使用并加速推理,同时试图保持模型精度。出现在:第十二章

int8 量化

一种数值精度降低技术,使用 8 位整数而不是 32 位浮点数来表示模型权重和激活,减少内存使用并允许在专用硬件上更快地进行推理。出现在:第十一章,第十章

间歇性故障

隐现且不可预测地发生的硬件故障,出现和消失没有一致的模式,使得诊断变得困难。出现在:第十六章

物联网

一个嵌入传感器、软件和其他技术的物理对象网络,通过互联网与其他设备和系统连接和交换数据。出现在:第二章

可解释性

人类理解机器学习模型预测背后的推理程度,通常指内在透明的模型。出现在:第十七章

物联网传感器

物联网设备,收集和传输环境或行为数据,通常在有限的电源预算下运行,并使用低带宽通信协议。出现在:第十九章

迭代剪枝

一种逐步剪枝策略,通过多个阶段逐步移除参数,并在每个阶段之间进行微调,使模型能够适应降低的容量,并且通常比一次性剪枝实现更好的准确性。出现在:第十章

J

jax

由谷歌研究开发的数值计算库,它将 NumPy 的 API 与函数式编程转换相结合,包括自动微分、即时编译和自动向量化,以实现高性能机器学习研究。出现在:第七章

即时编译

在运行时分析和优化代码的即时编译,使框架能够通过编译常用函数来平衡急切执行的灵活性和图优化的性能优势。出现在:第七章

K

k-匿名性

一种隐私技术,通过泛化准标识符确保数据集中每个记录至少与其他 k-1 个记录不可区分。出现在:第六章

内核

在卷积层中使用的小型可学习权重矩阵,通过卷积操作检测特定特征,也称为过滤器。出现在:第四章

内核融合

一种优化技术,将多个计算操作组合成一个单一内核,以减少内存传输并提高并行处理器上的性能。出现在:第十一章

关键绩效指标

用于评估机器学习系统成功和有效性的具体、可衡量的指标,例如准确性、精确度、召回率、延迟和吞吐量。出现在:第五章

关键字检测(kws)

一种检测音频流中特定唤醒词或短语的检测技术,通常用于对功耗和延迟有限制的语音激活设备。出现在:第六章

知识蒸馏

一种模型压缩技术,其中较小的“学生”网络通过在教师网络的软输出概率上训练来学习模仿较大的“教师”网络的行为,而不是仅仅基于硬标签。出现在:第二十一章,第九章,第十四章,第十章,第十八章

L

l0-norm constraint

一种正则化技术,用于计算模型中非零参数的数量,在结构化剪枝中通过惩罚活动权重的数量来直接控制模型稀疏度。出现在:第十章

label shift

一种分布偏移类型,其中目标标签的分布发生变化,而特征与标签之间的条件关系保持不变。出现在:第十六章

lapack

扩展 BLAS 的线性代数包,包括矩阵分解、特征值问题和线性系统求解等高级线性代数运算,为机器学习计算提供必要的数学基础。出现在:第七章

large language models

在庞大的文本语料库上训练的具有数十亿或数万亿参数的神经网络,能够在多个领域和任务中理解和生成类似人类的文本。出现在:第二十章

latency

请求数据和交付数据之间的时间延迟,在需要即时响应的实时应用中至关重要。出现在:第十二章,第十一章,第二章

latency constraints

限制模型推理最大可接受延迟的实时需求,驱动着在响应时间至关重要的部署场景中的优化决策。出现在:第十章

layer normalization

一种归一化技术,用于对每个样本的特征维度进行归一化,通常用于 transformer 架构中,以稳定训练。出现在:第四章

layerwise quantization

一种量化粒度,其中单个层内的所有参数共享相同的量化参数,提供计算效率,但与更细粒度的方法相比,可能限制了表示精度。出现在:第十章

learning rate

一个超参数,用于确定梯度下降优化过程中权重更新的步长,对训练稳定性和收敛速度有重要影响。出现在:第三章,第七章

learning rate scheduling

在训练过程中对学习率进行系统调整,使用如步长衰减、指数衰减或余弦退火等策略来提高收敛性和最终模型性能。出现在:第八章

生命周期评估

一种对产品或系统在其整个生命周期内(从原材料提取到处置)的环境影响进行评估的系统方法。出现在:第十八章

生命周期一致性

所有 ML 开发阶段都应与整体系统目标保持一致的原则,保持数据处理、模型架构和评估标准的一致性。出现在:第五章

LINPACK

在阿贡国家实验室开发的基准测试,通过解决密集线性方程组来衡量系统性能,因其用于 Top500 超级计算机排名而闻名。出现在:第十二章

负载均衡

混合专家模型中的技术,以确保计算负载和训练信号在专家之间均匀分布,防止专家崩溃并保持模型效率。出现在:第二十章,第十三章

查找表

一种数据结构,通过简单的数组索引操作来替换运行时计算,常用于性能优化。出现在:第十六章

LoRA 技术

一种长距离无线通信协议,使物联网设备能够在 15+公里的范围内以最小的功耗进行通信,非常适合农业和环境监测应用。出现在:第十九章

损失函数

一种数学函数,量化神经网络预测与真实标签之间的差异,为训练算法提供优化目标。出现在:第三章

损失缩放

在混合精度训练中使用的一种技术,在反向传播之前将损失乘以一个大的因子,以防止在降低精度格式中的梯度下溢。出现在:第八章

彩票假设

一种理论,认为大型神经网络包含稀疏子网络,当从适当的初始化中独立训练时,可以与完整网络达到相当的精度,同时体积显著更小。出现在:第十章

低秩自适应

一种参数高效的微调方法,使用低秩矩阵来近似权重更新,减少可训练参数同时保持适应能力。出现在:第十四章

低秩分解

一种矩阵分解技术,通过将大权重矩阵近似为较小矩阵的乘积来减少神经网络层所需的参数和计算操作数量。出现在:第十章

LSTM

长短期记忆,一种循环神经网络架构,通过控制信息流的门控机制来处理长期依赖关系。出现在:第四章

M

机器意识

在人工系统中假设出现意识,代表着探索机器能否发展主观经验的前沿研究领域。出现在:第二十章

机器学习

人工智能的一个子集,它使系统能够通过经验和数据而不是显式编程来自动提高任务性能。出现在:第十二章,第三章,第一章,第二章,第十八章

机器学习加速器 (ML Accelerator)

专门设计的计算硬件,通过优化的矩阵运算、内存层次结构和并行处理单元来高效执行机器学习工作负载。出现在:第十一章

机器学习框架

一个软件平台,提供用于设计、训练和部署机器学习模型的工具和抽象,通过计算图、硬件优化和工作流程编排将用户应用与基础设施连接起来。出现在:第七章

机器学习框架

提供用于开发、训练和部署机器学习模型工具、API 和抽象的软件库和平台,例如 TensorFlow 和 PyTorch。出现在:第二十一章

机器学习生命周期

一个结构化、迭代的过程,涵盖了开发、部署和维护机器学习系统所涉及的所有阶段,从问题定义到持续监控和改进。出现在:第十七章,第五章

机器学习操作

专注于通过自动化、监控和管理整个机器学习管道(从开发到生产)来实施机器学习模型的实践和工具集。出现在:第五章

机器学习操作 (MLOps)

通过自动化管道可靠且高效地部署和维护机器学习模型的实践。出现在:第十六章

机器学习安全

在整个机器学习生命周期中保护数据、模型和基础设施免受未经授权的访问、操纵或中断。出现在:第十五章

机器学习系统工程

专注于在计算平台上构建可靠、高效和可扩展的 AI 系统,涵盖整个 AI 生命周期,从数据采集到部署和运营,强调资源感知和系统级优化。出现在:第一章

机器反学习

从训练模型中去除特定数据点的影响的技术,无需完全重新训练,支持数据删除权。出现在:第十七章

宏观基准

评估方法,评估完整的机器学习模型,以了解架构选择和组件交互如何影响整体系统行为和性能。出现在:第十二章

基于幅度的剪枝

最常见的剪枝方法,基于假设权重幅度较小的对模型输出的贡献较小,移除绝对值最小的参数。出现在:第二十一章,第十章

映射优化

将神经网络操作分配到硬件资源的过程,以最小化通信开销并最大化可用计算单元的利用率。出现在:第十一章

掩码

一种匿名化技术,通过改变或模糊敏感值,使其无法直接追溯到原始数据主体。出现在:第六章

兆瓦时

等于 1 兆瓦功率使用 1 小时的能量单位,常用于测量数据中心等大型设施的电耗。出现在:第十八章

成员推理攻击

通过分析模型的行为和输出,试图确定特定数据点是否包含在模型的训练数据集中的攻击。出现在:第十五章

成员推理攻击

通过分析模型行为,试图确定特定数据点是否包含在模型训练集中的隐私攻击。出现在:第十七章

内存带宽

从内存中读取或写入数据的速率,以每秒字节数衡量,在内存密集型机器学习工作负载中通常成为瓶颈。出现在:第十二章

内存层次结构

具有不同访问速度和容量的内存系统组织,从快速的片上缓存到较慢的片外主存储器。出现在:第十一章

元学习

学习如何学习的过程,其中模型被训练以快速适应新任务,并使用最少的数据,这在设备上系统的个性化中特别有用。出现在:第二十章,第十四章

元数据

关于数据集的描述性信息,包括数据收集的细节、质量指标、验证状态以及其他对数据管理至关重要的上下文信息。出现在:第六章

微基准测试

专门的评价工具,用于评估机器学习系统中的单个组件或特定操作,例如张量操作或神经网络层。出现在:第十二章

微控制器

单个集成电路上的小型计算机,包含处理器核心、内存和可编程输入/输出外围设备,常用于嵌入式系统。出现在:第十九章,第二章

小批量梯度下降

一种训练方法,它同时使用训练示例的小子集来计算梯度和更新权重,平衡计算效率与梯度估计质量。出现在:第三章

小批量处理

一种优化方法,它通过计算小批量的示例梯度,平衡批量处理的计算效率与随机方法的内存约束。出现在:第八章

最小-最大

在博弈论中使用的决策策略,试图最小化对抗场景中可能的最大损失。出现在:第十六章

混合精度训练

一种在神经网络训练的不同部分使用不同数值精度的技术,通常结合 16 位和 32 位浮点运算,以减少内存使用并提高训练速度。出现在:第十八章

混合精度计算

一种在计算的不同阶段使用不同数值精度的技术,例如矩阵乘法使用 FP16,累积使用 FP32。出现在:第十一章

混合精度训练

一种训练方法,结合不同的数值精度(通常是 FP16 和 FP32),以优化内存使用和计算速度,同时保持训练稳定性。出现在:第十二章,第二十一章,第十章,第八章

专家混合

一种架构方法,使用多个专门的子模型(专家)和门控机制将输入路由到最相关的专家,从而实现高效扩展并保持稀疏性。出现在:第二十章

ml 生命周期

指导机器学习系统开发、评估和持续改进的迭代过程,涉及从数据收集到模型监控的各个阶段,包括连续适应的反馈循环。出现在:第一章

ml 系统

集成计算系统,包含三个核心组件:指导算法行为的引导数据,从数据中提取模式的学习算法,以及支持训练和推理过程的计算基础设施。出现在:第一章

ml 系统谱

机器学习系统部署的范围,从资源丰富的基于云的系统到具有严格限制的微型嵌入式设备,每个都需要不同的优化策略和权衡。出现在:第三章

mlcommons

开发和维护机器学习系统行业标准基准的组织,包括用于训练和推理评估的 MLPerf 套件。出现在:第十二章

mlops

管理机器学习系统端到端生命周期的工程学科,将 ML 开发与运营实践相结合,以实现可靠的生产部署。出现在:第二十一章,第十三章

mlperf

提供标准化测试的行业标准基准套件,用于各种深度学习工作负载的训练和推理,使机器学习系统的比较更加公平。出现在:第十二章

mlperf 推理

评估不同部署环境中机器学习推理性能的基准框架,从云端数据中心到移动设备和嵌入式系统。出现在:第十二章

mlperf 移动

专门基准,将 MLPerf 评估扩展到智能手机和移动设备,在严格的电源和内存限制下测量延迟和响应性。出现在:第十二章

mlperf 微型

为嵌入式和超低功耗 AI 系统(如物联网设备、可穿戴设备和具有最小处理能力的微控制器)设计的基准。出现在:第十二章

mlperf 训练

标准化基准,通过测量不同硬件平台上的时间到准确性、吞吐量和资源利用率来评估机器学习训练性能。出现在:第十二章

mnist

改进的美国国家标准与技术研究院手写数字数据库,包含 70,000 个 28×28 像素图像,作为计算机视觉的“Hello World”。出现在:第九章

移动机器学习

在便携式、电池供电的设备(如智能手机和平板电脑)上直接执行机器学习模型,使个性化并响应的应用成为可能。出现在:第二章

移动机器学习

优化用于智能手机和平板电脑等移动设备的机器学习系统,在计算效率和推理准确性之间取得平衡,以实现设备上的处理。出现在:第十九章

移动优化架构

专门为移动部署设计的神经网络设计,强调参数效率、计算速度和节能。出现在:第十四章

MobileNet

使用深度可分离卷积的效率神经网络架构,与传统模型相比参数数量减少约 50 倍,同时实现智能手机部署。出现在:第九章,第十四章

模式坍塌

生成模型中的一种失败模式,其中模型仅产生有限种类的输出,忽略了训练数据中的多样性,未能捕捉到完整的分布。出现在:第二十章

模型卡片

提供有关机器学习模型结构化信息的文档框架,包括预期用途、性能特征和限制。出现在:第十七章

模型压缩

用于减少机器学习模型大小和计算需求的技术,同时保持准确性,使资源受限的设备能够部署。出现在:第十九章,第二十一章,第二章,第十四章,第十三章,第十章,第十八章

模型部署

将训练好的机器学习模型集成到生产系统中,使其能够对新数据进行预测并向最终用户提供价值。出现在:第十三章,第五章

模型漂移

由于数据模式、用户行为或环境条件的变化(与原始训练条件不同)导致机器学习模型性能随时间退化。出现在:第十三章,第五章

模型评估

使用各种指标和验证技术对机器学习模型性能进行系统评估,以确定模型是否符合要求并准备部署。出现在:第五章

模型提取

通过观察其输入输出行为,通常通过系统查询模型 API 来窃取或重新创建机器学习模型的过程。出现在:第十五章

模型反演攻击

一种攻击方式,通过分析模型的输出和置信度分数来重建训练数据或推断数据集的敏感信息。出现在:第十五章

模型优化

对机器学习模型进行系统优化,以提高其效率同时保持有效性,在准确性、计算成本、内存使用、延迟和能效之间平衡折衷。出现在:第十章,第五章

模型并行

一种分布式训练策略,将神经网络模型分割到多个设备上,每个设备负责计算网络的一部分。出现在:第十二章,第二十一章,第九章,第七章,第八章

模型剪枝

从训练好的神经网络中移除不必要的权重、神经元或连接的过程,以减少其大小和计算需求。出现在:第十八章

模型量化

减少机器学习模型中数值表示的精度,通常从 32 位整数减少到 8 位整数,以减小模型大小并提高推理速度。出现在:第十九章,第二章

模型注册

用于存储、版本控制和管理的集中式仓库,用于存储与关联元数据相关的训练机器学习模型,从而促进模型治理和部署。出现在:第十三章

模型服务

基础设施和系统通过 API 公开部署的机器学习模型,以适当的延迟和吞吐量处理大规模预测请求。出现在:第十三章

模型训练

使用机器学习算法从训练数据中学习模式的过程,调整模型参数以最小化预测误差并创建一个功能性的预测系统。出现在:第五章

模型不确定性

机器学习模型无法捕捉到数据生成过程的全部复杂性,导致预测不确定性。出现在:第十六章

模型验证

在独立数据集上测试机器学习模型的过程,以评估其泛化能力并确保它们在未见数据上可靠地执行。出现在:第十三章,第五章

模型版本控制

对机器学习模型的不同版本进行系统跟踪和管理,包括它们的参数、训练数据和性能指标,以实现比较和回滚功能。出现在:第十三章,第五章

模型水印

一种将可验证的所有权签名嵌入到机器学习模型中的技术,可用于检测未经授权的使用或证明知识产权盗窃。出现在:第十五章

动量

一种优化技术,通过迭代累积速度向量,帮助梯度下降在局部最小值之间导航并加速在一致梯度方向上的收敛。出现在:第八章

监控

对机器学习系统性能、数据质量和生产中的操作指标进行持续观察和测量,以检测问题并触发维护操作。出现在:第五章

蒙特卡洛 dropout

一种在推理时使用不同 dropout 掩码进行多次前向传递来估计预测不确定性的技术。出现在:第十六章

摩尔定律

观察到微芯片上晶体管的数量大约每两年翻一番,而计算机的成本减半。这是英特尔联合创始人戈登·摩尔在 1965 年提出的。硬件改进遵循这一趋势,而 AI 算法效率在 7 年内提高了 44 倍。出现在:第十八章 出现在:第九章

多代理方法

系统架构,其中多个 AI 代理协作、协商或竞争以解决复杂问题,实现不同组件之间的劳动分工和专业技能的专门化。出现在:第二十章

多头注意力

一种注意力机制,使用多个并行注意力头,每个头关注输入的不同方面,以同时捕获多种类型的关系。出现在:第四章

多层感知器

一种前馈神经网络,在输入和输出之间有一个或多个隐藏层,能够通过密集连接和激活函数学习非线性映射。出现在:第四章

多校准

一种公平性技术,确保模型预测在交叉子组中保持校准,解决复杂的人口统计相互作用。出现在:第十七章

多层感知器

一个具有一个或多个隐藏层的前馈神经网络,这些隐藏层位于输入层和输出层之间,能够学习数据中的非线性关系。出现在:第三章

多模态人工智能

能够同时处理和理解多种类型的数据的人工智能系统,例如文本、图像、音频和视频,从而实现更全面的理解和交互。出现在:第二十章

mycin

1976 年斯坦福大学开发的第一批大规模专家系统之一,用于诊断血液感染,代表着将捕捉特定领域的人类专家知识转向而不是追求通用人工智能的转变。出现在:第一章

N

窄人工智能

设计用于在特定、定义明确的任务中表现出色,但缺乏在多个问题领域泛化的能力的人工智能系统,与通用人工智能形成对比。出现在:第二十章

NAS 生成的架构

通过自动神经网络架构搜索而不是手动设计发现的神经网络架构,通常通过彻底探索设计空间来实现更好的效率-精度权衡。出现在:第十章

网络结构修改

改进神经网络效率的架构变化,包括深度可分离卷积、瓶颈层和高效的注意力机制等技术,这些技术可以降低计算复杂度。出现在:第十章

神经网络架构搜索

一种自动方法,使用机器学习算法通过搜索可能的层、连接和超参数组合来发现最优的神经网络架构,以满足特定的约束条件。出现在:第九章,第二十章,第十章,第十八章

神经网络引擎

专为机器学习推理和训练设计的专用硬件加速器,例如苹果的神经网络引擎或谷歌的边缘 TPU,针对设备上的 AI 工作负载进行了优化。出现在:第十四章

神经网络

由层状组织并相互连接的节点组成的计算模型,这些节点可以通过可调连接权重学习将输入映射到输出。出现在:第十二章,第三章,第四章,第十八章

神经网络处理器(NPU)

专门设计的处理器,旨在加速神经网络操作和机器学习计算,优化 AI 工作负载的并行处理。出现在:第十二章,第十一章,第二章

神经形态计算

受生物神经网络结构和功能启发的计算架构,旨在比传统数字计算机更有效地处理信息。出现在:第二十一章,第二十章

非独立同分布数据

非独立同分布数据,其中样本在设备或时间上分布不均匀,为联邦学习收敛和泛化带来挑战。出现在:第十四章

nosql

一种数据库系统类别,旨在处理大量非结构化或半结构化数据,具有灵活的模式,常用于大数据应用。出现在:第六章

数值精度优化

模型优化维度,涉及如何表示和处理数值,包括将高精度值映射到低比特表示的量化技术。出现在:第十章

O

可观察性

一种全面的监控方法,通过指标、日志和跟踪提供对系统行为的洞察,使人们能够从外部输出理解内部状态。出现在:第十三章

olap (在线分析处理)

一种针对大型数据集复杂分析查询优化的数据库方法,通常用于商业智能中的数据仓库。出现在:第六章

oltp (在线事务处理)

一种针对频繁、短暂事务和实时处理优化的数据库方法,常用于操作应用。出现在:第六章

片上内存

直接集成到处理器芯片上的快速内存,包括缓存和暂存内存,提供高带宽和低延迟的数据访问。出现在:第十一章

设备上学习

在部署的硬件设备上直接对机器学习模型进行局部适应或训练,而不依赖于与集中式服务器的持续连接。出现在:第二十一章,第十四章

一次性剪枝

一种剪枝策略,在单步中移除大量参数,通常随后进行微调以恢复精度,提供简单性但可能需要更激进的微调。出现在:第十章

在线推理

实时预测服务,以低延迟处理单个请求,适用于需要即时响应的交互式应用。出现在:第十三章

onnx

开放神经网络交换,一种表示机器学习模型的标准化格式,它使得不同框架之间具有互操作性,允许在一个框架中训练的模型使用另一个框架部署。出现在:第七章

onnx 运行时

通过技术如算子融合和内核调整优化机器学习模型,以提高推理速度并减少计算开销的跨平台推理引擎。出现在:第十二章

优化器

在训练过程中调整模型参数以最小化损失函数的算法,常见的例子包括 SGD(随机梯度下降)、Adam 和 RMSprop,它们各自有不同的参数更新策略。出现在:第七章

编排

多个 AI 系统或代理协同工作的协调和管理,确保分布式智能系统中的适当排序、通信和资源分配。出现在:第二十章,第十三章

异常检测

识别与正常模式显著偏离的数据点的过程,这些点可能代表错误、异常或有价值罕见事件。出现在:第六章

过拟合

一种现象,模型对训练数据的特定细节学习得非常好,以至于它无法推广到新的、未见过的例子,通常表现为高训练准确率但验证性能差。出现在:第三章

氧化物击穿

由于过大的电场应力,晶体管中氧化层失效,导致永久性硬件故障。出现在:第十六章

P

填充

卷积网络中的一种技术,通过在输入边界周围添加零或其他值来控制输出特征图的空间维度。出现在:第四章

范式转变

科学方法的基本变化,例如 20 世纪 90 年代从符号推理到人工智能中的统计学习,以及 2010 年代从浅层学习到深度学习的转变,要求研究人员放弃既定方法,采用根本不同的方法。出现在:第一章

并行性

同时执行多个计算任务或操作,这是在神经网络处理中实现高性能的基本要求。出现在:第十一章

参数

神经网络的可学习组件,包括权重和偏差,在训练过程中进行调整以最小化损失函数。出现在:第三章,第十八章

参数高效微调

类似于 LoRA 和 Adapters 的方法,在更新不到 1%的模型参数的同时实现完整的微调性能,将内存需求从千兆字节减少到兆字节。出现在:第九章

分区

一种数据库技术,根据特定标准将大型数据集划分为更小、更易于管理的段,以提高查询性能和系统可扩展性。出现在:第六章

感知器

神经网络的基本构建块,由加权输入、偏差项和一个产生单个输出的激活函数组成。出现在:第三章,第一章

性能洞察

从监控生产机器学习系统中得出的分析观察结果,揭示了在模型准确性、系统效率或用户体验方面的改进机会。出现在:第五章

性能-效率缩放

描述计算效率改进如何转化为不同模型架构和训练制度中性能提升的数学关系。出现在:第九章

永久性故障

持续到修复或组件更换的硬件缺陷,持续影响系统行为。出现在:第十六章

困惑度

衡量语言模型预测文本的能力,计算为 2 的交叉熵损失,值越低表示预测能力越好。出现在:第九章

个性化层

模型组件,通常是最终的分类层,在保持共享骨干层冻结的同时,针对用户特定的数据进行本地调整。出现在:第十四章

物理攻击

直接操作或篡改计算硬件以损害机器学习系统的安全和完整性,绕过传统的软件防御措施。出现在:第十五章

管道丛林

复杂、相互依赖的数据处理管道难以维护、调试和修改的反模式,导致技术债务和运营复杂性。出现在:第十三章

管道并行性

一种模型并行形式,将模型的不同层放置在不同的设备上,数据以管道方式通过它们,允许同时处理多个批次。出现在:第七章,第八章

池化

卷积网络中的下采样操作,在减少空间维度的同时保留重要特征,通常在局部区域使用最大值或平均值操作。出现在:第四章

位置编码

在 transformer 架构中用于注入关于序列中标记位置信息的方法,因为 transformer 缺乏固有的顺序处理能力。出现在:第四章

事后解释

在模型训练后应用的解释方法,将模型视为黑盒,并从输入输出行为中推断推理模式。出现在:第十七章

训练后量化

一种应用于已训练模型的量化方法,不修改训练过程,通常涉及在代表性数据上的校准,以确定最佳量化参数。出现在:第十章

功率使用效率

用于确定数据中心能源效率的指标,计算为总设施能耗与 IT 设备能耗之比。出现在:第十八章

功率使用效率(PUE)

数据中心中用于衡量能源效率的指标,计算为总设施能耗与 IT 设备能耗之比。出现在:第十二章

精度

在数值计算中,用于表示数字的位数,它影响着机器学习系统中计算精度和资源需求。出现在:第十二章

精准农业

使用包括 GPS、传感器和机器学习在内的技术,通过精确监控和管理作物投入(如水、肥料和杀虫剂)来优化农业实践。出现在:第十九章

预取

一种系统优化技术,在需要之前将数据加载到内存中,通过重叠数据加载与计算来减少空闲时间并提高训练吞吐量。出现在:第八章

主成分分析

一种降维技术,识别数据中最重要的变化方向,在保留 90%以上的数据方差的同时降低计算复杂度。出现在:第九章

最小权限原则

一种安全概念,用户被赋予完成其工作职能所需的最小访问级别,从而降低安全风险。出现在:第十六章

隐私预算

差分隐私中的一个概念,表示在所有查询或计算中允许的总隐私损失量,每个操作都消耗这部分有限的预算。出现在:第十五章

隐私保护机器学习

能够在保护用于训练或推理的数据所有者的隐私的同时实现机器学习的技术和方法。出现在:第十五章

隐私保护技术

设计用于在机器学习中保护个人隐私的方法,包括差分隐私、联邦学习和本地处理。出现在:第十七章

隐私与效用权衡

在保护个人隐私和保持数据对机器学习有用性之间存在的根本紧张关系,需要通过差分隐私等技术进行仔细平衡。出现在:第十五章

问题定义

机器学习发展的初始阶段,涉及明确指定目标、约束、成功指标和运营要求,以指导所有后续的开发决策。出现在:第五章

程序逻辑控制器

在制造和物联网环境中使用的工业控制系统,可以与 ML 模型集成,以在运营技术环境中实现自动化决策。出现在:第十三章

渐进增强模式

一种设计模式,在最小资源条件下建立基本功能,并在可用资源增加时逐步引入高级功能。出现在:第十九章

提示工程

设计和优化文本提示以有效地与大型语言模型进行沟通并从 AI 系统中获得期望输出的实践。出现在:第二十章

蛋白质折叠问题

从蛋白质的氨基酸序列预测其三维结构的科学挑战,这是一个困扰科学家数十年的问题,直到像 AlphaFold 这样的系统使用深度学习方法实现了突破性的准确性。出现在:第一章

剪枝

一种模型压缩技术,通过从神经网络中移除不必要的连接或神经元来减少模型大小和计算需求,而不会显著影响性能。出现在:第九章,第十四章

匿名化

一种隐私技术,用人工标识符替换直接标识符,同时保持追踪记录以进行分析的能力。出现在:第六章

pytorch

由 Facebook 的人工智能研究实验室开发的一个深度学习框架,强调动态计算图、即时执行和直观的 Python 集成,特别受研究和小规模实验的欢迎。出现在:第七章

Q

量化

一种模型压缩技术,将模型参数和激活的精度从高精度格式(如 32 位浮点数)降低到低精度(如 8 位整数),显著减少内存使用和计算需求。出现在:第二十一章,第九章,第七章,第十一章,第十四章,第十八章

量化粒度

应用量化参数的水平,范围从每个张量(最粗)到每个通道或每个组(更细),通常更细的粒度可以保留更多的精度,但需要更多的存储空间。出现在:第十章

量化感知训练

一种训练方法,在训练过程中模拟量化效果,使模型能够适应降低的精度,通常比训练后量化达到更好的精度。出现在:第十章

量子机器学习

量子计算和机器学习的交汇点,探索量子算法和量子计算机如何增强或改变机器学习任务。出现在:第二十章

每秒查询次数(qps)

性能指标,衡量系统在一秒内可以处理多少个推理请求,通常用于评估生产部署中的吞吐量。出现在:第十二章

查询键值

注意力机制的三个组成部分,其中查询确定要查找的内容,键代表可用内容,值包含要加权和组合的实际信息。出现在:第四章

R

实时处理

当数据可用时对其进行处理,保证响应时间满足严格的时序约束,以便进行即时决策。出现在:第二章

感受野

输入区域影响特定神经元输出的区域,决定了该神经元可以检测到的模式的空间范围。出现在:第四章

修正线性单元

一种激活函数,如果输入为正则输出输入,否则输出零,在现代神经网络中广泛使用,因其计算简单和避免梯度消失的能力。出现在:第八章

循环神经网络

一种专为序列数据处理设计的神经网络,其连接创建循环,允许信息在时间步之间持续存在。出现在:第四章

正则化

通过添加约束或惩罚来防止神经网络过拟合的技术,包括 dropout、权重衰减和数据增强等方法。出现在:第四章,第十六章

ReLU

定义为 f(x) = max(0,x) 的修正线性单元激活函数,在保持计算效率的同时引入非线性,并避免梯度消失问题。出现在:第三章

可再生能源

来自自然补充的可再生资源的能量,包括太阳能、风能、水力、地热能和生物质能。出现在:第十八章

残差连接

一种跳跃连接,将层的输入添加到其输出中,通过缓解梯度消失问题,使得训练非常深的网络成为可能。出现在:第四章

残差网络

残差网络,一种引入跳跃连接的深度卷积架构,使得训练具有数百层的网络成为可能,并实现了突破性的性能。出现在:第十二章,第四章,第九章

资源悖论

社会影响应用中的挑战,在这些应用中,最需要帮助的地区往往缺乏传统技术部署所需的基本基础设施,需要创新的工程解决方案。出现在:第十九章

资源受限环境

具有限制计算能力、网络带宽或电力可用性的部署环境,通常需要专门的系统设计和优化技术。出现在:第十九章

负责任的人工智能

以道德、公平、透明和有利于社会的方式开发和部署人工智能系统,同时最大限度地减少潜在的危害和偏见。出现在:第二十章,第十七章

视网膜眼底照片

眼睛内部表面的医学图像,包括视网膜、视盘和血管,常用于诊断眼病和训练医疗人工智能系统。出现在:第五章

反向模式求导

一种自动微分技术,通过逆序遍历计算图来计算梯度,对于输入多而输出少的函数非常高效,使其非常适合神经网络训练。出现在:第七章

奖励黑客

AI 系统利用奖励函数的非预期方面来最大化分数,同时违反预期目标的现象。出现在:第十七章

rlhf

从人类反馈中进行强化学习 - 一种使用人类偏好来引导模型行为的训练方法,使 AI 系统能够更好地与人类价值观和意图保持一致。出现在:第二十章

rmsprop

一种自适应学习率优化算法,在训练过程中维护平方梯度的移动平均值,以自动调整每个参数的学习率。出现在:第八章

鲁棒 AI

人工智能系统在内部错误、外部扰动和环境变化的情况下保持性能和可靠性的能力。出现在:第十六章

鲁棒性

模型在输入变化、环境变化或对抗条件下的稳定和一致性能。出现在:第十七章

鲁棒性指标

用于评估模型在各种扰动下稳定性的定量指标,包括对抗准确性、认证鲁棒性界限以及在分布变化下的性能。出现在:第十六章

回滚

当在生产中发现问题时,将模型或系统回滚到先前的稳定版本的过程,以确保服务连续性。出现在:第十三章

屋顶线分析

一种性能建模技术,通过绘制操作强度与峰值性能之间的关系来识别系统是内存受限还是计算受限,从而指导优化工作。出现在:第二十一章

S

可扩展性

机器学习系统处理不断增加的数据、用户或计算需求的能力,而不会在性能或用户体验方面出现显著下降 出现在:第十二章,第五章

缩放定律

量化模型性能与训练资源之间相关性的经验关系,遵循与模型大小、数据集大小和计算预算相关的可预测幂律关系 出现在:第九章,第二十章

扫描链

处理器中的专用测试路径,提供访问内部寄存器和逻辑,以进行全面的硬件测试和故障检测。出现在:第十六章

模式

数据的结构和格式定义,指定数据类型、字段名称和关系,对于数据验证和处理一致性至关重要。出现在:第六章

模式演变

在保持向后兼容性和确保依赖系统和应用程序持续功能的同时,随着时间的推移修改数据模式的过程。出现在:第六章

读取时模式

在数据湖中采用的一种方法,其中数据结构在读取时而不是在存储时定义和强制执行,为不同数据类型提供灵活性。出现在:第六章

范围 1 排放

来自组织拥有或控制的来源的直接温室气体排放,例如现场燃料燃烧和公司车辆。出现在:第十八章

范围 2 排放

来自组织使用的购买的电力、蒸汽、供暖或冷却的间接温室气体排放。出现在:第十八章

范围 3 排放

组织价值链中发生的所有其他间接温室气体排放,包括制造、运输和产品生命周期结束处置。出现在:第十八章

安全聚合

一种加密协议,允许联邦学习服务器在不访问单个客户端贡献的情况下计算聚合模型更新,增强隐私保护。出现在:第十四章,第十五章

安全计算

允许多个当事人共同计算私有输入上的函数,而不向彼此透露这些输入的加密协议。出现在:第十五章

安全多方计算

一种加密方法,允许多个当事人共同计算其私有输入上的函数,而不向彼此透露这些输入。出现在:第十五章

分割图

在像素级别对对象进行分类的详细注释,提供最细粒度的标记信息,但需要显著更多的存储和处理资源。出现在:第六章

选择性计算

根据输入复杂度或当前需求动态分配处理资源的计算策略,通过避免不必要的计算来提高效率。出现在:第二十章

自监督学习

训练方法,其中模型从输入数据结构创建自己的标签,使从数十亿未标记示例中进行学习成为可能,并彻底改变了自然语言处理和计算机视觉。出现在:第九章

自注意力

一种注意力机制,其中查询、键和值都来自同一序列,允许每个位置关注包括自身在内的所有位置。出现在:第四章

自我完善

一种训练方法,模型通过批判和改进其初始响应来迭代地改进自己的输出,从而实现持续改进和更好地与期望行为对齐。出现在:第二十章

自监督学习

一种机器学习范式,模型通过从其他部分预测输入的一部分来从未标记的数据中学习表示,从而减少对人工标记数据集的依赖。出现在:第二十章

半监督学习

一种机器学习方法,使用标记和无标记数据训练,利用结构假设在有限的标记下提高模型性能。出现在:第六章

顺序神经网络

设计用于处理随时间发生的数据序列的神经网络架构,保持对先前输入的一种记忆形式,以提供当前决策的信息,这对于预测行人移动模式等任务至关重要。出现在:第一章

无服务器

云计算模型,其中基础设施由提供商自动管理,允许执行代码而不必担心服务器管理。出现在:第十三章

服务水平协议 (SLA)

规定生产服务最低性能标准和正常运行时间保证的正式合同,对不遵守规定的有处罚。出现在:第十三章

服务水平目标 (SLO)

服务可靠性和性能指标(如延迟、错误率和可用性)的内部目标,这些指标指导操作决策。出现在:第十三章

影子部署

测试策略,其中新模型版本与生产模型并行处理实时流量,而不影响用户界面结果,从而实现安全验证。出现在:第十三章

浅层学习

使用有限复杂性的算法的机器学习方法,例如支持向量机和决策树,这些方法需要精心设计的特征,但不能像深度学习方法那样自动发现层次表示。出现在:第一章

侧信道攻击

利用计算系统的物理实现中泄露的信息进行的攻击,例如功耗、电磁辐射或时间变化。出现在:第十五章

Sigmoid

一种将输入值映射到 0 到 1 之间的范围的激活函数,在历史上很受欢迎,但在深度网络中容易产生梯度消失问题。出现在:第三章,第八章

静默数据损坏(sdc)

在计算或数据传输过程中未检测到的错误,在系统层中传播而不会触发警报,可能损害结果。出现在:第十六章

SIMD(单指令多数据)

一种并行计算架构,它同时对多个数据元素应用相同的操作,对于常规的数据并行计算非常有效。出现在:第十一章

SIMT(单指令多线程)

SIMD(单指令多数据)的扩展,它允许跨多个独立的线程并行执行,每个线程保持自己的状态和程序计数器。出现在:第十一章

单实例吞吐量

性能测量,侧重于单个模型实例处理请求的速度,与批量吞吐量指标形成对比。出现在:第十二章

奇异值分解

一种矩阵分解技术,将矩阵分解为三个矩阵的乘积,常用于低秩近似,通过仅保留最重要的奇异值来压缩神经网络层。出现在:第十章

跳过连接

一种直接连接,绕过一层或多层,使梯度更容易通过深度网络流动,并使非常深的架构的训练更好。出现在:第四章

小农

在小于 2 公顷的耕地上经营,生产了全球粮食供应的重要部分,但通常缺乏接触现代农业技术和信贷。出现在:第十九章

社会影响测量

对人工智能应用如何影响社区和个人的系统性评估,包括可访问性、公平性、有效性和意外后果的指标。出现在:第十九章

softmax

一种将原始分数转换为输出总和为 1 的概率分布的激活函数,这对于多类分类任务至关重要。出现在:第四章,第八章

软件故障

由于缺陷、错误或设计疏忽导致的软件系统中的意外行为,可能会损害性能或危害安全。出现在:第十六章

稀疏训练

在整个训练过程中保持神经网络权重稀疏性的训练方法,减少计算需求和内存使用。出现在:第十八章

稀疏更新

一种训练策略,根据模型参数的重要性或对性能的贡献选择性地更新模型参数的子集,从而减少计算和内存开销。出现在:第十四章

稀疏性

神经网络的一个属性,其中许多权重为零或接近零,可以通过专用硬件支持和为稀疏操作设计的算法来利用,从而提高计算效率。出现在:第十章

spec cpu

由系统性能评估合作组织开发的标准化基准测试套件,使用真实世界应用程序而不是合成测试来衡量处理器性能。出现在:第十二章

spec power

测量服务器在不同工作负载水平上的能源效率的基准方法,使计算系统中的功率性能权衡的直接比较成为可能。出现在:第十二章

规范游戏

当 AI 系统以意外的方式获得高奖励,技术上满足目标函数但违反预期目的时。出现在:第十七章

推测解码

一种自回归语言模型的优化技术,其中较小的模型生成草稿标记,然后由较大的模型验证,从而加速推理同时保持质量。出现在:第二十一章

推测执行

处理器在确认指令需要执行之前执行指令的性能优化,这可能会无意中通过微架构的旁路通道暴露敏感数据。出现在:第十五章

squeezenet

实现与 AlexNet 相当准确率的同时参数数量减少 50 倍的紧凑型 CNN 架构,证明了巧妙的设计架构可以显著减小模型大小而不牺牲性能。出现在:第九章

阶段特定指标

适应个别生命周期阶段的性能指标,例如准备阶段的数据质量指标、建模阶段的训练收敛性和部署阶段的延迟指标。出现在:第五章

状态空间模型

通过维护压缩的内存表示并增量更新来处理序列的神经网络架构,在 transformer 注意力机制上提供线性缩放优势。出现在:第二十章

静态图

在执行开始前完全定义的计算图,允许全面优化和高效部署,但要求预先指定所有操作,限制了运行时灵活性。出现在:第七章

静态图与动态图

在机器学习框架中表示计算的两种基本方法:静态图在执行前定义,允许优化但限制了灵活性,而动态图在执行过程中构建,允许灵活的控制流但可能存在优化限制。出现在:第七章

静态量化

一种量化方法,在校准期间确定量化参数,并在推理期间保持固定,提供计算效率但比动态方法适应性差。出现在:第十章

统计学习

20 世纪 90 年代出现的机器学习时代,将重点从基于规则的符号 AI 转移到能够从数据中学习模式算法,为现代数据驱动的人工智能方法奠定了基础。出现在:第一章

随机计算

使用随机位和概率操作进行算术的计算技术,可能比传统方法提供更好的容错能力。出现在:第十六章

随机梯度下降

梯度下降的一种变体,使用单个训练示例或小批量而不是整个数据集来估计梯度,减少内存需求并实现在线学习。出现在:第九章,第八章

流式摄取

一种数据处理模式,实时处理到达的数据,对于需要即时处理和低延迟响应的应用至关重要。出现在:第六章

流处理

实时数据处理方法,处理连续的数据流,使其到达时立即响应事件和模式检测。出现在:第六章

步长

卷积滤波器在输入上移动的步长,控制输出空间维度和滤波器应用之间的重叠程度。出现在:第四章

结构化剪枝

一种剪枝方法,通过移除整个计算单元,如神经元、通道或层,生成更小、更密集的模型,比无结构剪枝产生的稀疏矩阵更易于硬件实现。出现在:第十章

固定故障

一种永久性硬件故障,其中信号线固定在逻辑 0 或 1,而不管输入如何,导致计算错误。出现在:第十六章

学生系统

1964 年由丹尼尔·鲍勃罗(Daniel Bobrow)编写的一个早期 AI 程序,通过将英语代数文字问题转换为数学方程式来展示自然语言理解,标志着符号 AI 的一个重要里程碑。出现在:第一章

师生学习

知识蒸馏的核心机制,其中较小的学生网络从较大的教师网络中学习,通常使用软目标,这些目标比硬分类标签提供更多信息。出现在:第十章

监督学习

一种机器学习方法,其中模型从标记的训练示例中学习,以对新、未标记的数据进行预测。出现在:第三章

供应链攻击

一种攻击,在制造、分销或集成过程中损害硬件或软件组件,可能影响多个下游系统。出现在:第十五章

支持向量机

使用“核技巧”寻找最优决策边界的机器学习算法,在深度学习获得突出地位之前一直主导着竞赛,直到大约 2010 年神经网络开始受到关注。出现在:第九章

可持续 AI

开发和部署人工智能系统,在保持有效性和可访问性的同时,最大限度地减少环境影响的做法。出现在:第十八章

可持续发展目标

联合国为解决到 2030 年紧迫的社会、经济和环境挑战而采用的 17 个全球目标,为 AI 在公益领域的应用提供了一个框架。出现在:第十九章

群体智能

从去中心化、自我组织的系统中产生的集体智能,通常受生物群的影响,应用于分布式机器学习和机器人系统。出现在:第二十章

符号 AI

早期的人工智能方法,试图通过符号操作和基于规则的系统来实现智能,例如 STUDENT 程序,它只能处理与其预编程模式匹配的输入。出现在:第一章

符号编程

一种编程范式,其中计算表示为抽象符号和表达式,这些符号和表达式首先构建然后执行,允许进行全面的优化,但需要显式的执行阶段。出现在:第七章

合成基准

人工测试程序,用于测量系统性能的特定方面,而不是基于现实世界应用程序和工作负载的基准。出现在:第十二章

合成数据

使用算法、模拟或生成模型创建的人工数据,用于补充现实世界的数据集,解决数据可用性或隐私问题。出现在:第六章

合成数据生成

创建人工数据集,这些数据集近似于真实数据的统计特性,同时降低隐私风险并避免直接暴露敏感信息。出现在:第十五章

系统效率

在算法、计算和数据效率维度上优化机器学习系统,以最小化计算、内存和能源需求,同时保持性能。出现在:第九章

系统级芯片

包含计算机或电子系统大部分或所有组件的集成电路,包括 CPU、GPU、内存和单芯片上的专用处理器。出现在:第二章

系统级芯片(soc

包含计算机系统大部分或所有组件的集成电路,常用于移动设备和嵌入式系统,以提高空间和能源效率。出现在:第十二章

系统级可持续性

对环境责任的整体方法,考虑整个 AI 基础设施生态系统,从数据中心到边缘设备,而不是孤立地优化单个组件。出现在:第十八章

系统集成

将各种组件和子系统组合成一个统一、功能系统的过程,该系统能够作为一个整体高效、可靠地运行。出现在:第二十一章

系统思维

通过考虑单个组件如何相互作用并影响整个系统来理解复杂系统的方法,这在机器学习中尤为重要,因为数据、算法、硬件和部署环境必须有效协作。出现在:第一章,第五章

收缩阵列

一种专门的硬件架构,通过将数据流经处理元素网格来高效执行矩阵运算,最小化数据移动和能耗。出现在:第十一章,第八章

T

尾部延迟

系统中的最坏情况响应时间,通常测量为 95%或 99%的分位数延迟,对于理解在峰值负载条件下的系统可靠性很重要。出现在:第十二章

定制推理基准

为特定部署环境或用例设计的专用性能测试,考虑到独特的约束和优化需求。出现在:第十二章

tanh

一种将输入映射到范围(-1,1)且输出以零为中心的激活函数,与 sigmoid 函数相比,有助于稳定基于梯度的优化。出现在:第八章

针对性攻击

一种旨在造成特定输入或类别误分类的数据中毒攻击,同时保持模型的整体性能基本不变。出现在:第十五章

技术债务

在开发过程中由于便捷的设计决策而积累的长期维护成本,在 ML 系统中尤其成问题,因为数据依赖性和模型复杂性。出现在:第十三章

遥测

从分布式系统中自动收集和传输性能数据和指标,使远程监控和分析成为可能。出现在:第十三章

张量

用于在神经网络中表示数据的多维数组,将标量(0D)、向量(1D)和矩阵(2D)推广到更高维度。出现在:第十二章,第三章,第七章,第十一章

张量分解

将矩阵分解扩展到高阶张量,用于通过将权重张量表示为具有较少参数的较小张量的组合来压缩神经网络层。出现在:第十章

张量并行

一种分布式计算技术,将单个张量和操作分配到多个设备上,通过协调并行执行来保持计算效率,同时降低每个设备的内存需求。出现在:第七章

张量处理单元

谷歌为机器学习工作负载专门设计的定制应用特定集成电路,针对矩阵操作进行优化,并具有脉动阵列架构。出现在:第八章

张量处理单元(tpu

谷歌为神经网络机器学习专门设计的定制应用特定集成电路,针对 TensorFlow 操作进行优化。出现在:第十二章,第十一章,第二章

tensorflow

由谷歌开发的一个全面的机器学习框架,提供从研究到生产的整个 ML 管道的工具,具有急切执行和基于图的计算,并具有广泛的生态系统支持。出现在:第七章

TensorRT

NVIDIA 的推理优化库,应用如算子融合和精度降低等技术,以加速 GPU 硬件上的深度学习推理。出现在:第十二章

三元化

一种极端量化技术,将权重限制为三个值(通常是-1、0、+1),在提供比二进制量化更多表示能力的同时实现显著压缩。出现在:第十章

测试时间计算

推理过程中的动态资源分配,根据任务复杂度或重要性调整计算工作量,实现灵活的性能-准确度权衡。出现在:第九章

热应力

由于反复在高温和低温之间循环造成的硬件退化,导致材料疲劳和潜在的故障。出现在:第十六章

激活阈值

神经元开始产生显著输出的输入水平,由权重、偏差和所选激活函数的组合决定,控制神经元何时对网络的计算做出贡献。出现在:第三章

吞吐量

系统处理数据或完成操作的速率,通常以每秒操作数衡量,对于训练大型模型至关重要。出现在:第十二章、第十一章

达到准确度的时间

训练过程中机器学习模型达到预定义准确度阈值所需的时间,作为训练效率评估的关键指标。出现在:第十二章

微型机器学习

在超约束设备上执行机器学习模型,如微控制器和传感器,在毫瓦到亚瓦特功率范围内运行。出现在:第二章

微型机器学习

设计用于在资源极为受限的设备上运行的机器学习系统,如微控制器,通常模型小于 1MB,功耗小于 150 毫瓦。出现在:第十九章

微型机器学习

在内存小于 1KB-1MB 和功耗小于 1mW 的微控制器和边缘设备上进行的机器学习,使在物联网设备中实现传统部署成为可能。出现在:第二十一章、第九章、第十四章

标记

语言模型处理的文本单元,通常是单词或子词片段,现代模型如 GPT-3 在数千亿个标记上训练。出现在:第九章

TOPS(每秒运算次数

每秒万亿操作,衡量计算性能的指标,表示系统在一秒内可以执行多少万亿次操作。出现在:第十二章

tpu

张量处理单元,谷歌专门为加速机器学习工作负载中的张量操作设计的定制应用特定集成电路(ASIC),与通用处理器相比,提供了显著的性能和能效提升。出现在:第九章,第七章,第十八章

训练

使用标记数据和优化算法调整神经网络参数的过程,以最小化预测误差并提高性能。出现在:第十二章,第三章,第十一章,第二章,第十八章

训练-服务偏差

在模型训练期间与服务期间使用的特征预处理逻辑不一致,导致生产性能下降。出现在:第十三章

迁移学习

一种机器学习技术,它利用从相关任务的预训练模型中获得的知识,通过重用学习到的特征和表示,允许在有限数据的新任务上更快地训练并获得更好的性能。出现在:第二十一章,第六章,第九章,第七章,第二十章,第十四章,第十六章,第十八章,第五章

transformer

一种完全基于注意力机制的神经网络架构,消除了递归和卷积,在许多领域实现了最先进的性能。出现在:第十二章,第四章,第九章,第十八章

transformer 架构

一种基于注意力机制的神经网络架构,它彻底改变了自然语言处理,并越来越多地应用于计算机视觉等其他领域。出现在:第二十章

瞬态故障

临时硬件故障,不会持续或造成永久性损害,但如果处理不当,可能导致计算错误。出现在:第十六章

平移不变性

卷积网络识别模式的能力,无论这些模式在输入中的位置如何,这是通过权重共享和池化操作实现的。见:第四章

透明度

对 AI 系统构建、训练、验证和部署的开放性,包括数据来源、设计假设和局限性的披露。见:第十七章

三模冗余(TMR)

一种容错技术,其中对计算执行三次,通过多数投票确定正确的结果。见:第十六章

可信执行环境

处理器内部的一个安全区域,为代码和数据提供基于硬件的保护,确保即使在特权系统软件下也能保证机密性和完整性。见:第十五章

Tucker 分解

一种张量分解方法,使用核心张量和因子矩阵将奇异值分解推广到高阶张量,通常用于压缩卷积神经网络层。见:第十章

电视白空间

未使用的广播频率,可以重新用于互联网连接,如 FarmBeats 系统所做的那样,以扩展网络访问到远程农业传感器和物联网设备。见:第一章

U

UCI 机器学习仓库

加州大学欧文分校于 1987 年建立,是机器学习数据集最广泛使用的资源之一,包含超过 600 个数据集,这些数据集在数千篇研究论文中被引用。见:第九章

均匀量化

一种量化方法,其中值域被分为等间隔的区间,提供简单的实现,但对于非均匀值分布可能不是最优的。见:第十章

万能逼近定理

一个理论结果,证明具有足够宽度和非线性激活函数的神经网络可以在紧致域上逼近任何连续函数。见:第四章

无结构剪枝

一种剪枝方法,在保留整体网络架构的同时移除单个权重,创建需要专用硬件支持以实现计算优势的稀疏权重矩阵。见:第十章

无结构稀疏性

一种模型稀疏性形式,其中单个权重被设置为零,而不遵循任何特定模式,创建不规则稀疏模式,需要专用硬件支持以实现计算优势。见:第十章

V

验证问题

在模型测试期间发现的问题,表明性能不佳、过拟合、数据质量问题或其他在部署前必须解决的问题。出现在:第五章

价值观对齐

AI 系统应追求与人类意图和伦理规范一致的目标的原则,解决在机器目标中编码人类价值观的挑战。出现在:第十七章

价值观敏感设计

通过系统利益相关者参与和考虑系统影响伦理的方法,将人类价值观融入技术设计。出现在:第十七章

梯度消失

深度神经网络中的一个问题,其中梯度在反向传播通过层时指数级减小,使得早期层难以有效学习。出现在:第三章,第四章

梯度消失问题

在训练深度神经网络时遇到的挑战,其中梯度在反向传播通过层时指数级减小,使得难以有效训练早期层。出现在:第八章

向量运算

同时处理多个数据元素的运算操作,使神经网络中元素级变换的并行执行变得高效。出现在:第十一章

由载体传播的疾病

由昆虫或其他载体传播的疾病,如由蚊子携带的疟疾,可以使用机器学习驱动的检测系统进行监测和控制。出现在:第十九章

版本控制

跟踪数据集、模型和管道随时间变化的实践,使机器学习系统具有可重复性、回滚能力和审计跟踪。出现在:第六章

良性循环

深度学习中的自我强化过程,其中数据可用性、算法和计算能力的改进各自使其他领域的进一步发展成为可能,从而加速整体进步。出现在:第三章

视觉-语言模型

能够同时理解和推理视觉和文本信息的 AI 系统,使图像字幕、视觉问答和多模态理解等任务成为可能。出现在:第二十章

冯·诺依曼瓶颈

传统计算机架构中处理器和内存之间共享总线造成的性能限制,其中数据移动比计算更昂贵。出现在:第十一章

W

看门狗定时器

一种硬件组件,用于监控系统执行情况,并在系统无响应或卡住时触发恢复操作。出现在:第十六章

水使用效率

一个衡量数据中心用水效率的指标,计算为总用水量与 IT 设备能耗的比率。出现在:第十八章

waymo

Alphabet Inc. 的子公司,代表了在自动驾驶技术中机器学习系统最雄心勃勃的应用之一,展示了 ML 系统如何在安全关键环境中从嵌入式系统到云基础设施的跨越。出现在:第一章

弱监督

一种使用通过启发式方法、远程监督或程序性方法更高效获得的低质量标签的方法,而不是手动专家标注。出现在:第六章

网络爬虫

一种自动从网站提取数据以构建自定义数据集的技术,需要仔细考虑法律、伦理和技术限制。出现在:第六章

权重

一个可学习的参数,用于确定不同层之间神经元的连接强度,在训练过程中调整以最小化损失函数。出现在:第三章

权重冻结

一种在训练过程中固定大多数模型参数,同时只允许特定层或组件更新的技术,减少了设备上自适应的计算需求。出现在:第十四章

权重矩阵

在神经网络中连接一个层到另一个层的有序权重集合,通过矩阵运算实现高效计算。出现在:第三章

权重共享

在不同空间位置使用相同参数的实践,如在卷积网络中,减少参数数量同时保持模式检测能力。出现在:第四章

whetstone

1964 年早期引入的基准测试,测量了浮点运算性能(每秒千条指令,KIPS),成为第一个广泛采用的标准化性能测试。出现在:第十二章

白盒攻击

一种对抗攻击,攻击者对模型的架构、参数、训练数据和内部工作方式有完全的了解,从而能够实施高度有效的攻击策略。出现在:第十五章

工作流程编排

自动协调和管理复杂的机器学习管道序列,确保在分布式系统中正确执行顺序、依赖管理和错误处理。出现在:第五章

X

xla

加速线性代数,一个针对线性代数操作的特定领域编译器,通过为包括 CPU、GPU 和 TPU 在内的各种硬件平台生成高效代码来优化 TensorFlow 和 JAX 的计算。出现在:第七章

Z

零日漏洞

在开发者有机会创建和分发补丁之前,攻击者可以利用的软件或硬件中的先前未知的安全漏洞。出现在:第十五章

零样本学习

机器学习模型在训练期间执行从未见过的任务或分类对象的能力,通常通过复杂的表现学习或大规模预训练实现。出现在:第二十章


关于本词汇表

这个词汇表是从教科书中的章节特定词汇表中自动生成的,确保了一致性和完整性。每个术语都在机器学习系统的上下文中定义,并包括参考以帮助您探索相关概念。

覆盖范围:机器学习系统涵盖了从基础概念到前沿应用的完整机器学习系统范围,这个词汇表反映了这种全面的范围。

更新:该词汇表与教科书内容同步维护,以确保定义保持最新和准确。

生成于 2025-10-08 09:10

参考文献

0001, 天奇 陈, Thierry Moreau, 郑志恒, 郑连民, 艾迪·Q·严, 沈海辰, 梅根·考恩, 等人. 2018a. “TVM: 一种用于深度学习的自动端到端优化编译器.” 在 第 13 届 USENIX 操作系统设计与实现研讨会 (OSDI 18), 578–94. www.usenix.org/conference/osdi18/presentation/chen.———, 等人. 2018b. “TVM: 一种用于深度学习的自动端到端优化编译器.” 在 OSDI, 578–94. www.usenix.org/conference/osdi18/presentation/chen.Abadi, Martín, Ashish Agarwal, Paul Barham, 等人. 2015. “TensorFlow: 在异构系统上的大规模机器学习.” Google Brain.Abadi, Martín, Paul Barham, 钟建民, 陈志峰, 安迪·戴维斯, 杰弗里·迪恩, 马蒂厄·迪文, 等人. 2016. “TensorFlow: 一个用于大规模机器学习的系统.” 在 第 12 届 USENIX 操作系统设计与实现研讨会, 265–83.Abadi, Martin, Andy Chu, Ian Goodfellow, H. Brendan McMahan, Ilya Mironov, Kunal Talwar, 和 李章. 2016. “具有差分隐私的深度学习.” 在 2016 年 ACM SIGSAC 计算机与通信安全会议论文集, 308–18. CCS ‘16. 纽约,纽约,美国:ACM. doi.org/10.1145/2976749.2978318.Abdelkhalik, Hamdy, Yehia Arafa, Nandakishore Santhi, 和 Abdel-Hameed A. Badawy. 2022. “通过微基准测试和指令级分析揭开 Nvidia Ampere 架构的神秘面纱.” 在 2022 年 IEEE 高性能极端计算会议 (HPEC). IEEE. doi.org/10.1109/hpec55821.2022.9926299.ABI Research. 2024. “Tiny ML: 科技领域的下一个重大机遇.” 白皮书. ABI Research. go.abiresearch.com/lp-tiny-ml-the-next-big-opportunity-in-tech.Addepalli, Sravanti, B. S. Vivek, Arya Baburaj, Gaurang Sriramanan, 和 R. Venkatesh Babu. 2020. “通过在位平面间强制执行特征一致性来实现对抗鲁棒性.” 在 2020 年 IEEE/CVF 计算机视觉与模式识别会议 (CVPR), 1020–29. IEEE. doi.org/10.1109/cvpr42600.2020.00110.Adi, Yossi, Carsten Baum, Moustapha Cisse, Benny Pinkas, 和 Joseph Keshet. 2018. “将弱点转化为优势:通过后门技术对深度神经网络进行水印.” 在 第 27 届 USENIX 安全研讨会 (USENIX Security 18), 1615–31.Agrawal, Dakshi, Selcuk Baktir, Deniz Karakoyunlu, Pankaj Rohatgi, 和 Berk Sunar. 2007. “使用 IC 指纹进行木马检测.” 在 2007 年 IEEE 安全与隐私研讨会 (SP ‘07), 296–310. Springer; IEEE. doi.org/10.1109/sp.2007.36.Akidau, Tyler, Robert Bradshaw, Craig Chambers, Slava Chernyak, Rafael J. Fernández-Moctezuma, Reuven Lax, Sam McVeety, 等人. 2015. “数据流模型:在无界、乱序大规模数据处理中平衡正确性、延迟和成本的实际方法.” VLDB Endowment 8 (12): 1792–1803. doi.org/10.14778/2824032.2824076.Altayeb, Moez, Marco Zennaro, 和 Marcelo Rovai. 2022. “使用 TinyML 对蚊子翅膀拍打声进行分类.” 在 2022 年 ACM 信息技术与社会公益会议论文集, 132–37. ACM. doi.org/10.1145/3524458.3547258.Alvim, Mário S., Konstantinos Chatzikokolakis, Yusuke Kawamoto, 和 Catuscia Palamidessi. 2022. “信息泄露游戏:将信息作为效用函数进行探索.” ACM Transactions on Privacy and Security 25 (3): 1–36. doi.org/10.1145/3517330.Amershi, Saleema, Andrew Begel, Christian Bird, Robert DeLine, Harald Gall, Ece Kamar, Nachiappan Nagappan, Besmira Nushi, 和 Thomas Zimmermann. 2019. “机器学习软件工程:一个案例研究.” 在 2019 年 IEEE/ACM 第 41 届国际软件工程会议:软件工程实践 (ICSE-SEIP), 291–300. IEEE. doi.org/10.1109/icse-seip.2019.00042.Amiel, Frederic, Christophe Clavier, 和 Michael Tunstall. 2006. “对 DPA 抵抗算法的故障分析.” 在 密码学中的故障诊断与容错, 223–36. Springer; Springer Berlin Heidelberg. doi.org/10.1007/11889700\_20.Amodei, Dario, Danny Hernandez, 等人. 2018. “AI 和计算.” OpenAI 博客. openai.com/research/ai-and-compute.Amodei, Dario, Chris Olah, Jacob Steinhardt, Paul Christiano, John Schulman, 和 Dan Mané. 2016. “人工智能安全中的具体问题.” arXiv 预印本 arXiv:1606.06565, 六月. arxiv.org/abs/1606.06565v2.Angwin, Julia, Jeff Larson, Surya Mattu, 和 Lauren Kirchner. 2022. “机器偏见:全国范围内用于预测未来罪犯的软件。它对黑人存在偏见.” 在 数据与分析伦理, 254–64. Auerbach Publications. doi.org/10.1201/9781003278290-37.Antonakakis, Manos, Tim April, Michael Bailey, Matt Bernhard, Elie Bursztein, Jaime Cochran, Zakir Durumeric, 等人. 2017. “理解 Mirai 僵尸网络.” 在 第 26 届 USENIX 安全研讨会 (USENIX Security 17), 16:1093–1110.Ardila, Rosana, Megan Branson, Kelly Davis, Michael Kohler, Josh Meyer, Michael Henretty, Reuben Morais, Lindsay Saunders, Francis Tyers, 和 Gregor Weber. 2020. “Common Voice:一个大规模多语言语音语料库.” 在 第十二届语言资源与评估会议论文集, 4218–22. 马赛,法国:欧洲语言资源协会. aclanthology.org/2020.lrec-1.520.Arifeen, Tooba, Abdus Sami Hassan, 和 Jeong-A Lee. 2020. “近似三模冗余:综述.” IEEE Access 8: 139851–67. doi.org/10.1109/access.2020.3012673.Arivazhagan, Manoj Ghuhan, Vinay Aggarwal, Aaditya Kumar Singh, 和 Sunav Choudhary. 2019. “具有个性化层的联邦学习.” CoRR abs/1912.00818 (十二月). arxiv.org/abs/1912.00818v1.Arsene, Octavian, Ioan Dumitrache, 和 Ioana Mihu. 2015. “使用软件代理进行医学诊断的专家系统.” 专家系统与应用 42 (4): 1825–34. doi.org/10.1016/j.eswa.2014.10.026.Asonov, D., 和 R. Agrawal. n.d. “键盘声发射.” 在 2004 年 IEEE 安全与隐私研讨会,2004 年会议论文集. 2004. IEEE; IEEE. doi.org/10.1109/secpri.2004.1301311.Ateniese, Giuseppe, Luigi V. Mancini, Angelo Spognardi, Antonio Villani, Domenico Vitali, 和 Giovanni Felici. 2015. “使用更智能的机器来破解智能机器:如何从机器学习分类器中提取有意义的数据.” 国际安全与网络杂志 10 (3): 137. doi.org/10.1504/ijsn.2015.071829.Aygun, Sercan, Ece Olcay Gunes, 和 Christophe De Vleeschouwer. 2021. “二值化神经网络中的高效和鲁棒位流处理.” 电子学快报 57 (5): 219–22. doi.org/10.1049/ell2.12045.Azevedo, Frederico A. C., Ludmila R. B. Carvalho, Lea T. Grinberg, José Marcelo Farfel, Renata E. L. Ferretti, Renata E. P. Leite, Wilson Jacob Filho, Roberto Lent, 和 Suzana Herculano-Houzel. 2009. “神经元和非神经元细胞数量相等使人类大脑成为等比例放大的灵长类动物大脑.” 比较神经学杂志 513 (5): 532–41. doi.org/10.1002/cne.21974.Ba, Jimmy Lei, Jamie Ryan Kiros, 和 Geoffrey E. Hinton. 2016. “层归一化.” arXiv 预印本 arXiv:1607.06450, 七月. arxiv.org/abs/1607.06450v1.Bahdanau, Dzmitry, Kyunghyun Cho, 和 Yoshua Bengio. 2014. “通过联合学习对齐和翻译进行神经机器翻译.” arXiv 预印本 arXiv:1409.0473, 九月. arxiv.org/abs/1409.0473v7.Bai, Tao, Jinqi Luo, Jun Zhao, Bihan Wen, 和 Qian Wang. 2021. “对抗训练在对抗鲁棒性方面的最新进展.” arXiv 预印本 arXiv:2102.01356, 二月. arxiv.org/abs/2102.01356v5.Bai, Yuntao, Saurav Kadavath, Sandipan Kundu, Amanda Askell, Jackson Kernion, Andy Jones, Anna Chen, 等人. 2022. “宪法 AI:从 AI 反馈中获得无害性.” arXiv 预印本 arXiv:2212.08073, 十二月. arxiv.org/abs/2212.08073v1.Baker, Bowen, Ingmar Kanitscheider, Todor Markov, Yi Wu, Glenn Powell, Bob McGrew, 和 Igor Mordatch. 2019. “从多智能体自定课程中涌现的工具使用.” 国际学习表示会议, 九月. arxiv.org/abs/1909.07528v2.Baldé, Cornelis P, Vanessa Forti, Vanessa Gray, Ruediger Kuehr, 和 Paul Stegmann. 2017. “全球电子垃圾监测 2017:数量、流动和资源.” 联合国大学,国际电信联盟,国际固体废弃物协会. www.itu.int/en/ITU-D/Climate-Change/Documents/GEM\%202017/Global-E-waste\%202017\%20.pdf

https://www.itu.int/en/ITU-D/Climate-Change/Documents/GEM\%202017/Global-E-waste\%20Monitor\%202017\%20.pdf

[Fairlearn:用于评估和改进 AI 中公平性的工具包](https://www.microsoft.com/en-us/research/publication/fairlearn-a-toolkit-for-assessing-and-improving-fairness-in-ai/)

Bishop, Christopher M. 2006. 模式识别与机器学习. Springer. Bobrow, Daniel G. 1964. “为计算机问题解决系统提供自然语言输入。” 博士论文,麻省理工学院. dspace.mit.edu/handle/1721.1/12962. Bolchini, Cristiana, Luca Cassano, Antonio Miele, and Alessandro Toschi. 2023. “针对 CNN 的软错误快速且精确的错误模拟。” IEEE 计算机 Transactions 72 (4): 984–97. doi.org/10.1109/tc.2022.3184274. Bommasani, Rishi, Drew A. Hudson, Ehsan Adeli, Russ Altman, Simran Arora, Sydney von Arx, Michael S. Bernstein, et al. 2021. “关于基础模型的机会与风险。” arXiv 预印本 arXiv:2108.07258, 八月. arxiv.org/abs/2108.07258v3. Bonawitz, Keith, Hubert Eichner, Wolfgang Grieskamp, Dzmitry Huba, Alex Ingerman, Vladimir Ivanov, Chloe Kiddon, et al. 2019. “迈向大规模联邦学习:系统设计,” 二月. arxiv.org/abs/1902.01046v2. Borgeaud, Sebastian, Arthur Mensch, Jordan Hoffmann, Trevor Cai, Eliza Rutherford, Katie Millican, George van den Driessche, et al. 2021. “通过检索万亿个标记来改进语言模型。” 第 39 届国际机器学习会议论文集,十二月. arxiv.org/abs/2112.04426v3. Boroumand, Amirali, Saugata Ghose, Youngsok Kim, Rachata Ausavarungnirun, Eric Shiu, Rahul Thakur, Daehyun Kim, et al. 2018. “面向消费设备的 Google 工作负载:缓解数据移动瓶颈。” 在 第 23 届国际架构支持编程语言和操作系统会议论文集,316–31. ASPLOS ‘18. ACM. doi.org/10.1145/3173162.3173177. Bouri, Elie. 2015. “一种扩展的方差因果方法来评估原油价格和约旦股市之间的风险动态。” 能源政策 85 (十月): 271–79. doi.org/10.1016/j.enpol.2015.06.001. Bourtoule, Lucas, Varun Chandrasekaran, Christopher A. Choquette-Choo, Hengrui Jia, Adelin Travers, Baiwu Zhang, David Lie, and Nicolas Papernot. 2021. “机器反学习。” 在 2021 IEEE 安全与隐私研讨会,141–59. IEEE; IEEE. doi.org/10.1109/sp40001.2021.00019. Bradbury, James, Roy Frostig, Peter Hawkins, Matthew James Johnson, Chris Leary, Dougal Maclaurin, George Necula, et al. 2018. “JAX:Python+NumPy 程序的组合转换。” github.com/google/jax. Brain, Google. 2020. “XLA:机器学习的优化编译器。” TensorFlow 博客www.tensorflow.org/xla. ——. 2022. TensorFlow 文档www.tensorflow.org/. Brakerski, Zvika et al. 2022. “联邦学习与边缘智能的兴起:挑战与机遇。” ACM 通讯 65 (8): 54–63. Breck, Eric, Shanqing Cai, Eric Nielsen, Michael Salib, and D. Sculley. 2017b. “ML 测试分数:ML 生产准备和技术债务减少的评分标准。” 在 2017 IEEE 大数据国际会议,6:1123–32. 2. IEEE. doi.org/10.1109/bigdata.2017.8258038. ——. 2017a. “ML 测试分数:ML 生产准备和技术债务减少的评分标准。” 在 2017 IEEE 大数据国际会议,1123–32. IEEE; IEEE. doi.org/10.1109/bigdata.2017.8258038. Breier, Jakub, Xiaolu Hou, Dirmanto Jap, Lei Ma, Shivam Bhasin, and Yang Liu. 2018. “DeepLaser:对深度神经网络的实用故障攻击。” arXiv 预印本 abs/1806.05859 (六月): 619–33. arxiv.org/abs/1806.05859v2. Brohan, Anthony, Noah Brown, Justice Carbajal, Yevgen Chebotar, Xi Chen, Krzysztof Choromanski, Tianli Ding, et al. 2023. “RT-2:将网络知识转移到机器人控制中的视觉-语言-动作模型,” 七月. arxiv.org/abs/2307.15818v1. Brooks, R. 1986. “一种用于移动机器人的鲁棒分层控制系统。” IEEE 机器人与自动化杂志 2 (1): 14–23. doi.org/10.1109/jra.1986.1087032. Brown, Samantha. 2021. “长期软件支持:可持续 AI 硬件的关键因素。” 计算机伦理与可持续性 14 (2): 112–30. Brown, Tom B., Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Saxena, et al. 2020. “语言模型是少样本学习者。” 神经信息处理系统进展 33: 1877–1901. Brown, Tom B., Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, et al. 2020. “语言模型是少样本学习者。” NeurIPS,五月. arxiv.org/abs/2005.14165v4. Brown, Tom, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared D Kaplan, Prafulla Dhariwal, Arvind Neelakantan, et al. 2020. “语言模型是少样本学习者。” 神经信息处理系统进展 33: 1877–1901. Buolamwini, Joy, and Timnit Gebru. 2018. “性别阴影:商业性别分类中的交叉准确性差异。” 在 公平、问责制和透明度会议,77–91. PMLR. proceedings.mlr.press/v81/buolamwini18a.html. Burnet, David, and Richard Thomas. 1989. “间谍克星:真相的商品化。” 法律与社会杂志 16 (2): 210. doi.org/10.2307/1410360. Bursztein, Elie, Luca Invernizzi, Karel Král, Daniel Moghimi, Jean-Michel Picod, and Marina Zhang. 2024b. “使用长距离深度学习对加密硬件进行泛化功率攻击。” IACR 加密硬件与嵌入式系统交易 2024 (3): 472–99. doi.org/10.46586/tches.v2024.i3.472-499. ——. 2024a. “使用长距离深度学习对加密硬件进行泛化功率攻击。” IACR 加密硬件与嵌入式系统交易 2024 (3): 472–99. doi.org/10.46586/tches.v2024.i3.472-499. Bushnell, Michael L, and Vishwani D Agrawal. 2002. “内置自检。” 数字、存储和混合信号 VLSI 电路电子测试基础,489–548. Cai, Carrie J., Emily Reif, Narayan Hegde, Jason Hipp, Been Kim, Daniel Smilkov, Martin Wattenberg, et al. 2019. “在医疗决策过程中应对不完美算法的人性化工具。” 在 2019 CHI 会议关于人机交互系统中的因素,由 Jennifer G. Dy 和 Andreas Krause 编辑,80:1–14. 机器学习研究会议论文集。ACM. doi.org/10.1145/3290605.3300234. Cai, Han, Chuang Gan, and Song Han. 2020. “一次完成:训练一个网络并将其专门用于高效部署。” 在 国际学习表示会议。 Calvo, Rafael A., Dorian Peters, Karina Vold, and Richard M. Ryan. 2020. “支持 AI 系统中人类自主性的框架:伦理探究框架。” 在 数字福祉伦理,31–54. Springer 国际出版。 doi.org/10.1007/978-3-030-50585-1\_2. Campbell, Murray, Jr. Hoane A.Joseph, and Feng-hsiung Hsu. 2002. “Deep Blue。” 人工智能 134 (1-2): 57–83. doi.org/10.1016/s0004-3702(01)00129-1. Carlini, Nicholas, Pratyush Mishra, Tavish Vaidya, Yuankai Zhang 0001, Micah Sherr, Clay Shields, David A. Wagner 0001, and Wenchao Zhou. 2016. “隐藏语音命令。” 在 第 25 届 USENIX 安全研讨会,513–30. www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/carlini. Carlini, Nicholas, Daniel Paleka, Krishnamurthy Dj Dvijotham, Thomas Steinke, Jonathan Hayase, A. Feder Cooper, Katherine Lee, et al. 2024. “窃取生产语言模型的一部分。” arXiv 预印本 arXiv:2403.06634,三月. arxiv.org/abs/2403.06634v2. Carlini, Nicholas, Florian Tramer, Eric Wallace, Matthew Jagielski, Ariel Herbert-Voss, Katherine Lee, Adam Roberts, et al. 2021. “从大型语言模型中提取训练数据。” 在 第 30 届 USENIX 安全研讨会,2633–50. USENIX 协会。 www.usenix.org/conference/usenixsecurity21/presentation/carlini-extracting. Carlini, Nicholas, and David Wagner. 2017. “评估神经网络鲁棒性的方法。” 在 2017 IEEE 安全与隐私研讨会,39–57. IEEE. doi.org/10.1109/sp.2017.49. Center, Pew Research. 2023. “美国人关于 AI、网络安全和大型科技的了解。” www.pewresearch.org/internet/2023/08/17/what-americans-know-about-ai-cybersecurity-and-big-tech/

https://www.pewresearch.org/internet/2023/08/17/what-americans-know-about-ai-cybersecurity-and-big-tech/

) .Centers, Google Data. 2023. “效率:我们是如何做到的。” www.google.com/about/datacenters/efficiency/.Chandola, Varun, Arindam Banerjee, and Vipin Kumar. 2009. “异常检测:综述。” ACM 计算机调查 41 (3): 1–58. doi.org/10.1145/1541880.1541882.Chapelle, O., B. Scholkopf, and A. Zien Eds. 2009. “半监督学习(Chapelle, o. 等,编;2006)[书评]。” IEEE 交易神经网络 20 (3): 542–42. doi.org/10.1109/tnn.2009.2015974.Chapman, Pete, Julian Clinton, Randy Kerber, Thomas Khabaza, Thomas Reinartz, Colin Shearer, and Rudiger Wirth. 2000. “CRISP-DM 1.0:逐步数据挖掘指南。” SPSS Inc,78. www.the-modeling-agency.com/crisp-dm.pdf.Chen, Andrew, Andy Chow, Aaron Davidson, Arjun DCunha, Ali Ghodsi, Sue Ann Hong, Andy Konwinski, et al. 2020. “MLflow 的发展:一个加速机器学习生命周期的系统。” 在 第四国际研讨会数据管理用于端到端机器学习,1–4. ACM。 doi.org/10.1145/3399579.3399867。Chen, Chaofan, Oscar Li, Daniel Tao, Alina Barnett, Cynthia Rudin, and Jonathan Su. 2019. “This Looks Like That:用于可解释图像识别的深度学习。” 在 第 32 届神经信息处理系统年会:2019 年 12 月 8-14 日在加拿大不列颠哥伦比亚省温哥华举行的神经信息处理系统 2019 年年会,NeurIPS 2019,由 Hanna M. Wallach,Hugo Larochelle,Alina Beygelzimer,Florence d’Alché-Buc,Emily B. Fox 和 Roman Garnett 编辑,8928–39. proceedings.neurips.cc/paper/2019/hash/adf7ee2dcf142b0e11888e72b43fcb75-Abstract.html。Chen, Emma, Shvetank Prakash, Vijay Janapa Reddi, David Kim, and Pranav Rajpurkar. 2023. “一个将人工智能临床护理与连续治疗监测集成的框架。” 自然生物医学工程 9 (4): 445–54. doi.org/10.1038/s41551-023-01115-0。Chen, H.-W. 2006. “来自台湾半导体制造区的地下水中的镓、铟和砷污染。” 环境污染与毒理学通报 77 (2): 289–96. doi.org/10.1007/s00128-006-1062-3。Chen, Jonathan H. 和 Steven M. Asch. 2017. “医学中的机器学习和预测——超越膨胀期望的顶峰。” 新英格兰医学杂志 376 (26): 2507–9. doi.org/10.1056/nejmp1702071。Chen, Mark, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Ponde de Oliveira Pinto, Jared Kaplan, Harri Edwards, et al. 2021. “评估在代码上训练的大型语言模型。” arXiv 预印本 arXiv:2107.03374,七月。 arxiv.org/abs/2107.03374v2。Chen, Tianqi, Mu Li, Yutian Li, Min Lin, Naiyan Wang, Minjie Wang, Tianjun Xiao, Bing Xu, Chiyuan Zhang, and Zheng Zhang. 2015. “MXNet:用于异构分布式系统的灵活高效的机器学习库。” arXiv 预印本 arXiv:1512.01274,十二月。 arxiv.org/abs/1512.01274v1。Chen, Tianqi, Bing Xu, Chiyuan Zhang, and Carlos Guestrin. 2016. “以亚线性内存成本训练深度网络。” CoRR abs/1604.06174(四月)。 arxiv.org/abs/1604.06174v2。Chen, Yu-Hsin, Joel Emer, and Vivienne Sze. 2017. “使用数据流优化深度神经网络加速器的能效。” IEEE 微型 37 (3): 12–21. doi.org/10.1109/mm.2017.54。Chen, Yu-Hsin, Tushar Krishna, Joel S. Emer, and Vivienne Sze. 2016. “Eyeriss:用于能量高效数据流的卷积神经网络的空间架构。” IEEE 固态电路杂志 51 (1): 186–98. doi.org/10.1109/JSSC.2015.2488709。Chen, Zitao, Guanpeng Li, Karthik Pattabiraman, and Nathan DeBardeleben. 2019. “BinFI:一个用于关键机器学习系统的有效故障注入器。” 在 高性能计算、网络、存储和分析国际会议论文集,1–23. SC ‘19。纽约,纽约,美国:ACM。 doi.org/10.1145/3295500.3356177。Chen, Zitao, Niranjhana Narayanan, Bo Fang, Guanpeng Li, Karthik Pattabiraman, and Nathan DeBardeleben. 2020. “TensorFI:一个用于 TensorFlow 应用的灵活故障注入框架。” 在 2020 IEEE 第 31 届软件可靠性工程国际研讨会 (ISSRE),426–35. IEEE;IEEE。 doi.org/10.1109/issre5003.2020.00047。Cheng, Eric, Shahrzad Mirkhani, Lukasz G. Szafaryn, Chen-Yong Cher, Hyungmin Cho, Kevin Skadron, Mircea R. Stan, et al. 2016. “CLEAR:c Ross -l Ayer e Xploration for a Rchitecting r Esilience - 结合硬件和软件技术以容忍处理器核心中的软错误。” 在 第 53 届年度设计自动化会议论文集,1–6. ACM。 doi.org/10.1145/2897937.2897996。Cheng, Yu 等人。 2022. “内存高效深度学习:模型压缩和稀疏化方面的进展。” ACM 计算机调查。Cheshire, David. 2021. “循环经济和可持续人工智能:在技术行业中消除浪费。” 在 建立循环经济的指南,48–61. RIBA 出版。 doi.org/10.4324/9781003212775-8。Chetlur, Sharan, Cliff Woolley, Philippe Vandermersch, Jonathan Cohen, John Tran, Bryan Catanzaro, and Evan Shelhamer. 2014. “cuDNN:深度学习的有效原语。” arXiv 预印本 arXiv:1410.0759,十月。 arxiv.org/abs/1410.0759v3。Chin-Purcell, Lia 和 America Chambers. 2021. “调查使用卷积神经网络进行性别分类的准确性差异。” 在 2021 IEEE 国际技术与社会研讨会 (ISTAS),81:1–7. IEEE。 doi.org/10.1109/istas52410.2021.9629153。Cho, Kyunghyun, Bart van Merrienboer, Dzmitry Bahdanau, and Yoshua Bengio. 2014. “关于神经机器翻译的性质:编码器-解码器方法。” 在 第八次统计翻译语法、语义和结构研讨会 (SSST-8),103–11. 计算机语言学协会。Choi, Jungwook, Zhuo Wang, Swagath Venkataramani, Pierce I-Jen Chuang, Vijayalakshmi Srinivasan, and Kailash Gopalakrishnan. 2018. “PACT:参数化剪裁激活用于量化神经网络。” arXiv 预印本,五月。 arxiv.org/abs/1805.06085v2。Choi, Sebin 和 Sungmin Yoon. 2024. “基于 GPT 的数据驱动城市建筑能源建模 (GPT-UBEM):概念、方法和案例研究。” 能源与建筑 325(十二月):115042. doi.org/10.1016/j.enbuild.2024.115042。Chollet, François 等人。 2015. “Keras。” GitHub 仓库github.com/fchollet/keras。Chollet, François。 2019. “关于智能的度量。” arXiv 预印本 arXiv:1911.01547,十一月。 arxiv.org/abs/1911.01547v2。Choquette, Jack。 2023a。 “NVIDIA Hopper H100 GPU:扩展性能。” IEEE 微型 43 (3): 9–17. doi.org/10.1109/mm.2023.3256796。——。 2023b。 “NVIDIA Hopper H100 GPU:扩展性能。” IEEE 微型 43 (3): 9–17. doi.org/10.1109/mm.2023.3256796。Choquette, Jack,Wishwesh Gandhi,Olivier Giroux,Nick Stam 和 Ronny Krashinsky。 2021. “NVIDIA A100 Tensor Core GPU:性能和创新。” IEEE 微型 41 (2): 29–35. doi.org/10.1109/mm.2021.3061394。Choudhary, Tejalal,Vipul Mishra,Anurag Goswami 和 Jagannathan Sarangapani。 2020. “模型压缩和加速的全面调查。” 人工智能评论 53 (7): 5113–55. doi.org/10.1007/s10462-020-09816-7。Chowdhery, Aakanksha,Sharan Narang,Jacob Devlin,Maarten Bosma,Gaurav Mishra,Adam Roberts,Paul Barham,等人。 2022. “PaLM:通过路径扩展语言模型。” arXiv 预印本 arXiv:2204.02311,四月。 arxiv.org/abs/2204.02311v5。Chowdhery, Aakanksha,Anatoli Noy,Gaurav Misra,Zhuyun Dai,Quoc V. Le 和 Jeff Dean。 2021. “Edge TPU:一个用于深度学习的边缘优化推理加速器。” 在 国际计算机架构研讨会。Chowdhury, Badrul H. 和 Chung-Li Tseng。 2007. “分布式能源资源:问题和挑战。” 能源工程杂志 133 (3): 109–10. doi.org/10.1061/(asce)0733-9402(2007)133:3(109)。Christiano, Paul,Jan Leike,Tom

https://software.intel.com/content/www/us/en/develop/download/intel-architecture-instruction-set-extensions-programming-reference.html

) .Corporation, Thinking Machines. 1992. CM-5 技术摘要. Thinking Machines Corporation.Costa, Tiago, Chen Shi, Kevin Tien, and Kenneth L. Shepard. 2019. “一种用于神经调节的 CMOS 2D 发射波束成形器及其集成 PZT 超声波换能器。” 在 2019 IEEE 自定义集成电路会议 (CICC) 中,第 1-4 页。IEEE。 doi.org/10.1109/cicc.2019.8780236.Courbariaux, Matthieu, Yoshua Bengio, and Jean-Pierre David. 2016. “BinaryConnect:在传播过程中使用二进制权重训练深度神经网络。” 神经信息处理系统 (NeurIPS) 28: 3123–31.Courbariaux, Matthieu, Itay Hubara, Daniel Soudry, Ran El-Yaniv, and Yoshua Bengio. 2016. “二值化神经网络:使用权重和激活约束为 +1 或 -1 训练深度神经网络。” arXiv 预印本 arXiv:1602.02830,二月。 arxiv.org/abs/1602.02830v3.Cover, Thomas M. 和 Joy A. Thomas. 2001. 信息论基础. 第 2 版。 Wiley。 doi.org/10.1002/0471200611.Crankshaw, Daniel, Xin Wang, Guilio Zhou, Michael J Franklin, Joseph E Gonzalez, 和 Ion Stoica. 2017. “Clipper:一个 {{低延迟}} 在线预测服务系统。” 在 第 14 届 USENIX 网络系统设计和实现研讨会 (NSDI 17) 中,第 613-27 页。Crankshaw, Daniel, Xin Wang, Guilio Zhou, Michael J Franklin, Joseph E Gonzalez, 和 Ion Stoica. 2017. “Clipper:一个 {{低延迟}} 在线预测服务系统。” 在 第 14 届 USENIX 网络系统设计和实现研讨会 (NSDI 17) 中,第 613-27 页。CrowdFlower. n.d. “补充信息 1:Matlab 分析的源代码,相关矩阵,Crowdflower 调查的 XML 代码。” CrowdFlower Inc。 PeerJ。 doi.org/10.7287/peerj.preprints.1069/supp-1。Cui, Hongyi, Jiajun Li, 和 Peng et al. Xie. 2019. “机器学习编译器综述:分类、挑战和未来方向。” ACM 计算评论 52 (4): 1–39。Cybenko, G. 1989. “使用 Sigmoid 函数的叠加逼近。” 控制、信号和系统数学 2 (4): 303–14。 doi.org/10.1007/bf02551274。Dalal, N. 和 B. Triggs. n.d. “方向梯度直方图用于人类检测。” 在 2005 IEEE 计算机视觉和模式识别会议 (CVPR’05) 中,第 1:886–93。IEEE;IEEE。 doi.org/10.1109/cvpr.2005.177。Dally, William J.,Stephen W. Keckler 和 David B. Kirk. 2021. “图形处理单元 (GPU) 的演变。” IEEE 微型 41 (6):

[《大黑客:中国如何利用微型芯片渗透美国顶级公司》](https://www.bloomberg.com/news/features/2018-10-04/the-big-hack-how-china-used-a-tiny-chip-to-infiltrate-america-s-top-companies)

Rodio, Angelo, 和 Giovanni Neglia. 2024. “FedStale: 利用联邦学习中的过时客户端更新,” 五月. arxiv.org/abs/2405.04171v1. Rolnick, David, Arun Ahuja, Jonathan Schwarz, Timothy Lillicrap, 和 Greg Wayne. 2019. “经验回放用于持续学习.” 在 Advances in Neural Information Processing Systems (NeurIPS). Romero, Francisco, Qian Li 0027, Neeraja J. Yadwadkar, 和 Christos Kozyrakis. 2021. “INFaaS: 自动化无模型推理服务.” 在 2021 USENIX 年度技术会议 (USENIX ATC 21), 397–411. www.usenix.org/conference/atc21/presentation/romero. Rosenblatt, F. 1958. “感知器:大脑中信息存储和组织的一种概率模型.” 心理学评论 65 (6): 386–408. doi.org/10.1037/h0042519. Ross, Stéphane, Geoffrey J. Gordon, 和 Drew Bagnell. 2011. “将模仿学习和结构化预测简化为无后悔在线学习.” 国际人工智能与统计会议 15: 627–35. proceedings.mlr.press/v15/ross11a.html. Royce, W. W. 1987. “管理大型软件系统的发展:概念和技术.” 在 IEEE WESCON 会议论文集, 26:328–39. IEEE. dl.acm.org/citation.cfm?id=41801. Rudin, Cynthia. 2019. “停止解释黑盒机器学习模型用于高风险决策,而应使用可解释模型.” 自然机器智能 1 (5): 206–15. doi.org/10.1038/s42256-019-0048-x. Rumelhart, David E., Geoffrey E. Hinton, 和 Ronald J. Williams. 1986. “通过反向传播错误学习表示.” 自然 323 (6088): 533–36. doi.org/10.1038/323533a0. Russakovsky, Olga, Jia Deng, Hao Su, Jonathan Krause, Sanjeev Satheesh, Sean Ma, Zhiheng Huang, 等人. 2015. “ImageNet 大规模视觉识别挑战.” 国际计算机视觉杂志 115 (3): 211–52. doi.org/10.1007/s11263-015-0816-y. Russell, Mark. 2022. “技术行业趋势:硬件锁定及其可持续性影响.” 可持续计算杂志 10 (1): 34–50. Russell, Stuart. 2021. “人类兼容的人工智能.” 在 类似人类的机器智能,3–23. 牛津大学出版社. doi.org/10.1093/oso/9780198862536.003.0001. Ryan, Richard M., 和 Edward L. Deci. 2000. “自我决定理论及其对内在动机、社会发展和幸福感的促进作用.” 美国心理学家 55 (1): 68–78. doi.org/10.1037/0003-066x.55.1.68. Sabour, Sara, Nicholas Frosst, 和 Geoffrey E Hinton. 2017. “胶囊之间的动态路由.” 在 Advances in Neural Information Processing Systems. 第 30 卷. Sambasivan, Nithya, Shivani Kapania, Hannah Highfill, Diana Akrong, Praveen Paritosh, 和 Lora M

[2022 年神经信息处理系统会议论文摘要](https://proceedings.neurips.cc/paper_files/paper/2022/hash/9d5609613524ecf4f15af0f7b31abca4-Abstract-Conference.html)

) .Weizenbaum, Joseph. 1966. “ELIZA—a Computer Program for the Study of Natural Language Communication Between Man and Machine.” Communications of the ACM 9 (1): 36–45. doi.org/10.1145/365153.365168.Werchniak, Andrew, Roberto Barra Chicote, Yuriy Mishchenko, Jasha Droppo, Jeff Condal, Peng Liu, and Anish Shah. 2021. “Exploring the Application of Synthetic Audio in Training Keyword Spotters.” In ICASSP 2021 - 2021 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 7993–96. IEEE; IEEE. doi.org/10.1109/icassp39728.2021.9413448.Widmer, Gerhard, and Miroslav Kubat. 1996. “Learning in the Presence of Concept Drift and Hidden Contexts.” Machine Learning 23 (1): 69–101. doi.org/10.1023/a:1018046501280.Wiener, Norbert. 1960. “Some Moral and Technical Consequences of Automation: As Machines Learn They May Develop Unforeseen Strategies at Rates That Baffle Their Programmers.” Science 131 (3410): 1355–58. doi.org/10.1126/science.131.3410.1355.Wilkening, Mark, Vilas Sridharan, Si Li, Fritz Previlon, Sudhanva Gurumurthi, and David R. Kaeli. 2014. “Calculating Architectural Vulnerability Factors for Spatial Multi-Bit Transient Faults.” In 2014 47th Annual IEEE/ACM International Symposium on Microarchitecture, 293–305. IEEE; IEEE. doi.org/10.1109/micro.2014.15.Witten, Ian H., and Eibe Frank. 2002. “Data Mining: Practical Machine Learning Tools and Techniques with Java Implementations.” ACM SIGMOD Record 31 (1): 76–77. doi.org/10.1145/507338.507355.Wolfe, Jeremy M., Dennis M. Levi, Lori L. Holt, Linda M. Bartoshuk, Rachel S. Herz, Roberta L. Klatzky, and Daniel M. Merfeld. 2024. “Perceiving and Recognizing Objects.” Technical Report. In Sensation & Perception. 85-460-1. Cornell Aeronautical Laboratory; Oxford University Press. doi.org/10.1093/hesc/9780197663813.003.0005.Wolpert, D. H., and W. G. Macready. 1997. “No Free Lunch Theorems for Optimization.” IEEE Transactions on Evolutionary Computation 1 (1): 67–82. doi.org/10.1109/4235.585893.MIT 未来工作任务小组. 2020. “未来工作:在智能机器时代创造更好的工作。”麻省理工学院。workofthefuture.mit.edu/research-post/the-work-of-the-future-building-better-jobs-in-an-age-of-intelligent-machines/

[未来工作的研究](https://workofthefuture.mit.edu/research-post/the-work-of-the-future-building-better-jobs-in-an-age-of-intelligent-machines/)

Wu, Bichen, Kurt Keutzer, Xiaoliang Dai, Peizhao Zhang, Yanghan Wang, Fei Sun, Yiming Wu, Yuandong Tian, Peter Vajda, and Yangqing Jia. 2019. “FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search.” In 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 10726–34. IEEE. doi.org/10.1109/cvpr.2019.01099. Wu, Carole-Jean, David Brooks, Kevin Chen, Douglas Chen, Sy Choudhury, Marat Dukhan, Kim Hazelwood, et al. 2019. “Machine Learning at Facebook: Understanding Inference at the Edge.” In 2019 IEEE International Symposium on High Performance Computer Architecture (HPCA), 331–44. IEEE; IEEE. doi.org/10.1109/hpca.2019.00048. Wu, Carole-Jean, Ramya Raghavendra, Udit Gupta, Bilge Acun, Newsha Ardalani, Kiwan Maeng, Gloria Chang, et al. 2022. “Sustainable Ai: Environmental Implications, Challenges and Opportunities.” Proceedings of Machine Learning and Systems 4: 795–813. Wu, Hao, Patrick Judd, Xiaojie Zhang, Mikhail Isaev, and Paulius Micikevicius. 2020. “Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation.” arXiv Preprint arXiv:2004.09602 abs/2004.09602 (April). arxiv.org/abs/2004.09602v1. Wu, Jian, Hao Cheng, and Yifan Zhang. 2019. “Fast Neural Networks: Efficient and Adaptive Computation for Inference.” In Advances in Neural Information Processing Systems. Wu, Jiaxiang, Cong Leng, Yuhang Wang, Qinghao Hu, and Jian Cheng. 2016. “Quantized Convolutional Neural Networks for Mobile Devices.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 4820–28. IEEE. doi.org/10.1109/cvpr.2016.521. Xin, Ji, Raphael Tang, Yaoliang Yu, and Jimmy Lin. 2021. “BERxiT: Early Exiting for BERT with Better Fine-Tuning and Extension to Regression.” In Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Main Volume, edited by Paola Merlo, Jorg Tiedemann, and Reut Tsarfaty, 91–104. Online: Association for Computational Linguistics. doi.org/10.18653/v1/2021.eacl-main.8. Xingyu, Huang et al. 2019. “Addressing the Memory Bottleneck in AI Accelerators.” IEEE Micro. Xu, Ruijie, Zengzhi Wang, Run-Ze Fan, and Pengfei Liu. 2024. “Benchmarking Benchmark Leakage in Large Language Models.” arXiv Preprint arXiv:2404.18824, April. arxiv.org/abs/2404.18824v1. Xu, Xiaolong, Fan Li, Wei Zhang, Liang He, and Ruidong Li. 2021. “Edge Intelligence: Architectures, Challenges, and Applications.” IEEE Internet of Things Journal 8 (6): 4229–49. Yang, Le, Yizeng Han, Xi Chen, Shiji Song, Jifeng Dai, and Gao Huang. 2020. “Resolution Adaptive Networks for Efficient Inference.” In 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2366–75. IEEE. doi.org/10.1109/cvpr42600.2020.00244. Yao, Zhewei, Amir Gholami, Sheng Shen, Kurt Keutzer, and Michael W. Mahoney. 2021. “HAWQ-V3: Dyadic Neural Network Quantization.” In Proceedings of the 38th International Conference on Machine Learning (ICML), 11875–86. PMLR. Ye, Zirui, Bei Yao, Haoran Zheng, Li Tao, Ripeng Wang, Yankui Chang, Zhi Chen, Yingming Zhao, Wei Wei, and Xie George Xu. 2025. “Uncertainty Quantification for CT Dosimetry Based on 10 281 Subjects Using Automatic Image Segmentation and Fast Monte Carlo Calculations.” Medical Physics 52 (6): 4910–23. doi.org/10.1002/mp.17796. Yeh, Y. C. n.d. “Triple-Triple Redundant 777 Primary Flight Computer.” In 1996 IEEE Aerospace Applications Conference. Proceedings, 1:293–307. IEEE; IEEE. doi.org/10.1109/aero.1996.495891. Yosinski, Jason, Jeff Clune, Yoshua Bengio, and Hod Lipson. 2014. “How Transferable Are Features in Deep Neural Networks?” Advances in Neural Information Processing Systems 27. You, Jie, Jae-Won Chung, and Mosharaf Chowdhury. 2023. “Zeus: Understanding and Optimizing GPU Energy Consumption of DNN Training.” In 20th USENIX Symposium on Networked Systems Design and Implementation (NSDI 23), 119–39. Boston, MA: USENIX Association. www.usenix.org/conference/nsdi23/presentation/you. You, Yang, Zhao Zhang, Cho-Jui Hsieh, James Demmel, and Kurt Keutzer. 2019. “Scaling SGD Batch Size to 32K for ImageNet Training.” In Proceedings of Machine Learning and Systems. Yu, Jun, Peng Li, and Zhenhua Wang. 2023. “Efficient Early Exiting Strategies for Neural Network Acceleration.” IEEE Transactions on Neural Networks and Learning Systems. Zafrir, Ofir, Guy Boudoukh, Peter Izsak, and Moshe Wasserblat. 2019. “Q8BERT: Quantized 8Bit BERT.” In 2019 Fifth Workshop on Energy Efficient Machine Learning and Cognitive Computing - NeurIPS Edition (EMC2-NIPS), 36–39. IEEE; IEEE. doi.org/10.1109/emc2-nips53020.2019.00016. Zaharia, Matei, Omar Chaudhury, Michael McCann, et al. 2024. “The Shift from Models to Compound AI Systems.” Berkeley Artificial Intelligence Research. bair.berkeley.edu/blog/2024/02/18/compound-ai-systems/. Zhan, Ruiting, Zachary Oldenburg, and Lei Pan. 2018. “Recovery of Active Cathode Materials from Lithium-Ion Batteries Using Froth Flotation.” Sustainable Materials and Technologies 17 (September): e00062. doi.org/10.1016/j.susmat.2018.e00062. Zhang, Chengliang, Minchen Yu, Wei Wang 0030, and Feng Yan 0001. 2019. “MArk: Exploiting Cloud Services for Cost-Effective, SLO-Aware Machine Learning Inference Serving.” In 2019 USENIX Annual Technical Conference (USENIX ATC 19), 1049–62. www.usenix.org/conference/atc19/presentation/zhang-chengliang. Zhang, Jeff Jun, Tianyu Gu, Kanad Basu, and Siddharth Garg. 2018. “Analyzing and Mitigating the Impact of Permanent Faults on a Systolic Array Based Neural Network Accelerator.” In 2018 IEEE 36th VLSI Test Symposium (VTS), 1–6. IEEE; IEEE. doi.org/10.1109/vts.2018.8368656. Zhang, Jeff, Kartheek Rangineni, Zahra Ghodsi, and Siddharth Garg. 2018. “ThUnderVolt: Enabling Aggressive Voltage Underscaling and Timing Error Resilience for Energy Efficient Deep Learning Accelerators.” In 2018 55th ACM/ESDA/IEEE Design Automation Conference (DAC), 1–6. IEEE. doi.org/10.1109/dac.2018.8465918. Zhang, Qingxue, Dian Zhou, and Xuan Zeng. 2017. “Highly Wearable Cuff-Less Blood Pressure and Heart Rate Monitoring with Single-Arm Electrocardiogram and Photoplethysmogram Signals.” BioMedical Engineering OnLine 16 (1): 23. doi.org/10.1186/s12938-017-0317-z. Zhang, Xitong, Jialin Song, and Dacheng Tao. 2020. “Efficient Task-Specific Adaptation for Deep Models.” In International Conference on Learning Representations (ICLR). Zhang, Yi, Jianlei Yang, Linghao Song, Yiyu Shi, Yu Wang, and Yuan Xie. 2021. “Learning-Based Efficient Sparsity and Quantization for Neural Network Compression.” IEEE Transactions on Neural Networks and Learning Systems 32 (9): 3980–94. Zhang, Y., J. Li, and H. Ouyang. 2020. “Optimizing Memory Access for Deep Learning Workloads.” IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems 39 (11): 2345–58. Zhao, Jiawei, Zhenyu Zhang, Beidi Chen, Zhangyang Wang, Anima Anandkumar, and Yuandong Tian. 2024. “GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection,” March. arxiv.org/abs/2403.03507v2. Zhao, Mark, and G. Edward Suh. 2018. “FPGA-Based Remote Power Side-Channel Attacks.” In 2018 IEEE Symposium on Security and Privacy (SP), 229–44. IEEE; IEEE. doi.org/10.1109/sp.2018.00049. Zhao, Yue, Meng Li, Liangzhen Lai, Naveen Suda, Damon Civin, and Vikas Chandra. 2018. “Federated Learning with Non-IID Data.” CoRR abs/1806.00582 (June). arxiv.org/abs/1806.00582v2. Zheng, Lianmin, Ziheng Jia, Yida Gao, Jiacheng Lin, Song Han, Xuehai Geng, Eric Zhao, and Tianqi Wu. 2020. “Ansor: Generating High-Performance Tensor Programs for Deep Learning.” USENIX Symposium on Operating Systems Design and Implementation (OSDI), 863–79. Zhou, Aojun, Yukun Ma, Junnan Zhu, Jianbo Liu, Zhijie Zhang, Kun Yuan, Wenxiu Sun, and Hongsheng Li. 2021. “Learning n:m Fine-Grained Structured Sparse Neural Networks from Scratch,” February. arxiv.org/abs/2102.04010v2. Zhu, Chenzhuo, Song Han, Huizi Mao, and William J. Dally. 2017. “Trained Ternary Quantization.” International Conference on Learning Representations (ICLR). Zimmermann, H. 2007. “Neural Signaling: It’s Jump Time.” Science 317 (5841): 1028–29. doi.org/10.1126/science.1147015. Zoph, Barret, and Quoc V Le. 2017a. “Neural Architecture Search with Reinforcement Learning.” In International Conference on Learning Representations (ICLR). Zoph, Barret, and Quoc V. Le. 2017b. “Neural Architecture Search with Reinforcement Learning.” In International Conference on Learning Representations.

posted @ 2026-03-26 12:31  布客飞龙IV  阅读(4)  评论(0)    收藏  举报