AI 系统组成
如图所示,大致可以将 AI 系统分为以下几个具体的方向:
AI 训练与推理框架
AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。其负责提供用户前端的 AI 编程语言,接口和工具链。负责静态程序分析与计算图构建,编译优化等工作。AI 框架本身通过提供供用户编程的 API 获取用户表达的模型,数据读取等意图,在静态程序分析阶段完成尽可能的自动前向计算图构建,自动求导补全反向传播计算图,计算图整体编译优化,算子内循环编译优化等。
这一层尽可能让用户表达目标任务与 AI 算法,尽量少让用户关注底层实现(例如到底 AI 框架的实现是通过声明式编程方式还是命令式编程方式)是提升开发体验的较好的手段,但是过度的抽象会丧失灵活性的表达,在模型发展较快迭代频繁的时期用户还需要体验层兼顾灵活性和可调试性。开发体验层会调用编排底层框架的接口提供更加简洁的用户开发体验。包括并不限于以下领域:
- 网络模型构建:卷积神经网络 CNN、循环神经网络 RNN、Transformer 结构等,包括 if else 控制流等基本结构和算子支持与实现的 API。语言的基本语法和框架的 API 接口提供基本算子的支持。当前主要以使用 Python 语言内嵌调用 AI 框架的方式进行网络模型的开发,但是也出现控制流在原生语言层与模型中间表达割裂等问题。
- 模型算法实现:算法一般被封装为 AI 框架的配置或 API 供用户选择,有些 AI 框架也提供拦截接口给用户一定程度灵活性定制自定义算法。模型算法实现与网络模型结构构件还是有着明显的区别,例如网络模型构建只提供模型层面的构建,但是 AI 的算法实现流程如到底是训练还是推理,是实现强化学习、监督学习还是无监督学习等,属于模型算法的实现过程,只是其中内部的算法模型结构的构建属于网络模型部分。
- 计算图构建:静态计算图、动态计算图构建等。不同的 AI 框架类型决定了其使用静态还是动态图进行构建,静态图有利于获取更多信息做全图优化,动态图有利于调试,目前实际处于一个融合的状态,如 PyTorch2.X 版本后推出 Dynamo 特性支持原生静态图。
- 自动求导:高效地对网络模型自动求导等。由于网络模型中大部分算子较为通用,AI 框架提前封装好算子的自动求导函数,待用户触发训练过程自动透明的进行全模型的自动求导,以支持梯度下降等训练算法需要的权重梯度数据的获取。
- 中间表达构建:多层次中间表达等。通过构建网络模型的中间表达及多层中间表达,让模型本身可以更好的被下层 AI 编译器编译生成高效的后端代码。
- 流水线和工作流支持:流水线和工作流是实现模块解耦复用,可视化编程的前提,通过复用与可视化编程可以大幅降低组织内作业书写的门槛,如高性能数据加载器等。
- 工具链: 如模型在不同硬件的迁移、在不同框架的迁移、模型转换、调试、可视化、类型系统等。就像传统的软件工程中调试器,可视化,类型系统等工具链的支撑,让整个开发过程中,跨平台,跨平台,问题诊断,缺陷验证等得以高效实现,目前 AI 系统领域也不断有类似工具产生,以支持整个 AI 工程化实践。
- 生命周期管理:数据读取,训练与推理等流程开发与管理。机器学习领域的 DevOps 也就是 MLOps 的基础工具支持。其可以让重复模块被复用,同时让底层工具有精确的信息进行模块间的调度与多任务的优化,同时让各个环节模块化解耦,独立和更为快速的演进。
AI 编译与计算架构
AI 框架充分赋能深度学习领域,为 AI 算法的开发者提供了极大便利。早期的 AI 框架主要应用于学术界,如 Theano、torch 等,随着深度学习的快速发展以及在工业界的不断拓展,不断有新的 AI 框架被提出以满足不同场景的应用。
但是随着 AI 技术应用的全面发展,各厂家根据自身业务场景的需求,在 AI 硬件和算法上不断优化和探索,AI 系统的体系结构越来越复杂,更多新的 AI 加速芯片被提出来,其设计变得更加多样化,AI 框架运行的硬件环境和算法也趋于更多样和复杂,单一 AI 框架已经无法满足和平衡所有特性。所以,为了提供不同框架和硬件体系结构之间的迁移性,ONNX 等中间 IR 被提出,其定义了表示神经网络模型的统一格式,以促进不同 AI 框架之间的模型转换。
为了实现硬件的多样性,需要将神经网络模型计算映射到不同架构的硬件中执行。在通用硬件上,高度优化的线性代数库为神经网络模型计算提供了基础加速库。此外,大多数硬件供应商还发布了专属的神经网络模型计算优化库,如:MKL-DNN 和 cuDNN 等,但基于基础加速库的优化往往落后于深度学习算法模型的更新,且大多数情况下需要针对不同的平台进行定制化的开发。
为了解决多硬件平台上的性能优化的问题,多种 AI 编译器被提出并得到了普及和应用,比如:TVM ,Glow,XLA 和 Jittor 等。AI 编译器以神经网络模型作为输入,将 AI 计算任务通过一层或多层中间表达 IR 进行翻译和优化,最后转化为目标硬件上可执行的代码,与传统的编译器(LLVM)类似,AI 编译器也采用前端、中间表示和后端分层设计的方式。
目前,业界主流的芯片公司和大型互联网公司等都在 AI 编译器进行了大量的投入来推进相关技术的发展。与传统编译器相比,AI 编译器是一个领域特定的编译器,有四个明显的特征:
- 主前端语言:与传统编译器不同,AI 编译器通常不需要 Lexer/Parser,而是基于前端高级编程语言(如 Python)的 AST 将神经网络模型解析并构造为计算图 IR,侧重于保留 shape、layout 等张量计算特征信息,当然部分编译器还能保留控制流的信息。其中 Python 主要是以动态解释器为执行方式。
- 多层 IR 设计:多层 IR 设计,为的是满足易用性与高性能这两种类型需求:1)为了让开发者使用方便,AI 框架会尽量对张量的计算进行抽象封装成具体的 API 或者函数,算法开发者只要关注神网络模型定义上的逻辑意义模型和算子;2)在底层算子性能优化时,可以打破算子的边界,从更细粒度的循环调度等维度,结合不同的硬件特点完成优化。
- 面向神经网络优化:面向神经网络模型特殊的数据类型进行定义。AI 领域,网络模型层的具体计算被抽象成张量的计算,这就意味着 AI 编译器中主要处理的数据类型也是张量。而在反向传播过程中,是深度学习最为具有有代表的特性,基于计算图构建的网络模型,需要具有自动微分功能。
- DSA 芯片架构支持:AI 训练和推理对性能和时延都非常敏感,所以大量使用专用的 AI 加速芯片进行计算,而 AI 编译器其实是以 DSA 架构的 AI 加速芯片作为为中心的编译器,这也是区别于通用编译器的一个特征。
AI 编译与计算架构负责 AI 模型在真正运行前的编译和系统运行时的动态调度与优化。当获取的网络模型计算图部署于单卡、多卡甚至是分布式 AI 集群的环境,运行期的框架需要对整体的计算图按照执行顺序调度算子与任务的执行、多路复用资源,做好内存等资源的分配与释放。包括并不限于以下部分:
- 编译优化:如算子融合等。编译器根据算子的语义或者 IR 定义,对适合进行算子融合(多个算子和并为一个算子)的算子进行合并,降低内核启动与访存代价。同时 AI 编译器还支持循环优化等类似传统编译器的优化策略和面向深度学习的优化策略(如牺牲一定精度的计算图等价代换等)。
- 优化器:运行时即时(Just-in-Time)优化,内省(Introspective)优化等。运行时根据硬件,隐藏的软件栈信息,数据分布等只能运行时所获取的信息,进一步对模型进行优化。
- 调度与执行:调度优算子并行与调度,执行有单线程和多线程执行等。调度方面根据 NPU 提供的软件栈和硬件调度策略,以及模型的算子间并行机会,进行类装箱的并行调度。另外再算子执行过程中,如果特定 NPU 没有做过多的运行时调度与干预,框架可以设计高效的运行时算子内的线程调度策略。
- 硬件接口抽象:GPU、NPU、TPU、CPU、FPGA 和 ASIC 等硬件的接口抽象。统一的硬件接口抽象可以复用编译优化策略,让优化方案与具体底层的 AI 硬件设备和 AI 体系结构适当解耦。
AI 硬件与体系结构
负责程序的真正执行、互联与加速。在更广的层面,作业与作业间需要平台提供调度,运行期资源分配与环境隔离。包括并不限于以下部分:
- 资源池化管理与调度:异构资源集群管理等。将服务器资源池化,通过高效的调度器结合深度学习作业特点和异构硬件拓扑进行高效调度,这方面在对于云资源管理和云化较为重要。
- 可扩展的网络栈:RDMA,InifiBand,NVLink 等。提供更高效的加速器到加速器的互联(例如 NVLink、NVSwitch 等)提供更高的网络带宽,更灵活的通信原语与高效的通信聚合算法(例如 AllReduce 算法)。
虽然 AI 系统在总的方向上分为开发体验层、框架层、编译与运行时和硬件体系结构和 AI 芯片 4 层结构。但是我们将在后续章节中,将会围绕核心系统软硬件,如 AI 训练和推理框架,AI 编译器,AI 芯片,部分涉及更广泛的 AI 系统生态中的重要内容如算法等展开介绍。
AI 系统生态
除了以上重要的 AI 系统构成之外,随着人工智能应用越来越广泛,我们还可以看到更广泛的 AI 系统生态的构成。其中包含以下领域:
核心系统软硬件
通过核心系统软硬件,底层的基础架构已经可以给上层提供算力,存储,网络等资源池,可以按需给需要执行的深度学习作业隔离出指定规格的资源,执行深度学习作业,类似传统操作系统已经完成底层硬件的抽象与资源隔离,只需要用户的应用提交到系统中被执行和管理。
- 深度学习任务运行和优化环境:提供更高的运行时性能,资源隔离与调度。当深度学习作业启动,AI 框架或运行时提供更好的算子与任务调度,内存管理,I/O 管理,甚至未来随着作业愈发复杂,提供作业的多路复用(Multiplexing)等支持,打破设备商运行时库封装的局限性。
- 通用资源管理和调度系统:提供更公平,高效率和稳定的平台支持。性能并不是系统设计本身的唯一考虑因素,在多租环境,还要兼顾公平,效率和稳定性,为用户提供更加可靠好用的平台。
- 新型硬件及相关高性能网络和计算栈:随着加速器技术不断发展,网络互连技术提供更高的带宽,硬件层提供更高的算力与带宽支持模型训练与推理。系统需要更加灵活的支持在不同的硬件和规格假设下,不同作业如何静态与动态结合的自动优化与高性能执行。同时由于硬件的发展趋势不同,潜在可能会让性能瓶颈产生变化,系统设计较早判断并对应设计会产生新的系统设计机会。
AI 算法和框架
通过深度学习算法与框架,用户可以表达模型设计和训练配置等需求,就像给提供了一套特定领域的“编程语言”,并且提供了相应的编译器及工具链可以翻译成运行时软硬件环境可以执行的指令。
- 广泛用途的高效新型通用 AI 算法:提供更多样的模型支持,推进和支持模型效果的提升。支持新的算子(例如,控制流等),更加灵活的模型结构(例如,图模型等),模型的融合(例如,多专家系统等)支持。
- 多种 AI 框架的支持与进化:由于多种框架与工具的存在,如何为用户提供更多样的框架的统一支持与优化对提升用户体验,复用已有代码有很强的实用价值。
- 神经网络编译架构及优化:在编译期,通过静态分析与优化的方法,提供更优化的编译支持,提升模型的性能,正确性等。类似传统编译器,网络模型的计算图可以通过融合等手段优化,算子内可以应用大量循环优化。同时面向网络模型本身的特点,也逐渐有工作利用一些等价和非等价计算图转换进行优化。
更广泛生态
随着深度学习高速发展,更大的搜索空间,运行时才能获取的数据,模型安全与隐私,部署推理的多样化需求变得日益迫切,我们需要考虑除训练以外更多的 AI 系统问题。
- 机器学习新模式(如强化学习):提供新训练范式的灵活执行,部署与同步支持等。由于训练数据可能需要以与环境交互的过程中才能获取,造成需要通过强化学习等新的训练范式进行模型训练,需要设计新的系统以支持灵活的训练范式。
- 自动机器学习(如自动化机器学习):当用户想试错(Trial And Error)的搜索空间达到一定量级,用户通过自动化机器学习工具与算法可以更高效的进行模型的探索与训练。自动化机器学习系统可以提供多任务的高效管理与调度支持,支持搜索空间定义的程序语言等。
- 安全(Security)与隐私(Privacy):数据与模型,类似传统的信息安全要保护的数据与程序,除了数据本身,模型类似传统程序本身的安全与隐私问题提出了新的挑战。我们需要思考神经网络模型与应用的安全与隐私保护支持。
- 模型推理、压缩与优化:如果不需要训练,只需要执行前向传播过程,则是用户开始使用模型进行推理,基于深度学习特有性质进行高效的模型部署推理是除训练外很重要的系统问题。模型推理相比训练有更低的延迟要求,更严苛的资源供给,不需要求解梯度和训练,有更低的精度要求等,如何设计面向推理的系统提出了新的机会。同时网络模型本身可以通过模型压缩,量化等手段精简计算量与内存消耗,加速模型的部署。
如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~