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 框架主要应用于学术界,如 Theano、torch 等,随着深度学习的快速发展以及在工业界的不断拓展,不断有新的 AI 框架被提出以满足不同场景的应用。
但是随着 AI 技术应用的全面发展,各厂家根据自身业务场景的需求,在 AI 硬件和算法上不断优化和探索,AI 系统的体系结构越来越复杂,更多新的 AI 加速芯片被提出来,其设计变得更加多样化,AI 框架运行的硬件环境和算法也趋于更多样和复杂,单一 AI 框架已经无法满足和平衡所有特性。所以,为了提供不同框架和硬件体系结构之间的迁移性,ONNX 等中间 IR 被提出,其定义了表示神经网络模型的统一格式,以促进不同 AI 框架之间的模型转换。
为了解决多硬件平台上的性能优化的问题,多种 AI 编译器被提出并得到了普及和应用,比如:TVM ,Glow,XLA 和 Jittor 等。AI 编译器以神经网络模型作为输入,将 AI 计算任务通过一层或多层中间表达 IR 进行翻译和优化,最后转化为目标硬件上可执行的代码,与传统的编译器(LLVM)类似,AI 编译器也采用前端、中间表示和后端分层设计的方式。
目前,业界主流的芯片公司和大型互联网公司等都在 AI 编译器进行了大量的投入来推进相关技术的发展。与传统编译器相比,AI 编译器是一个领域特定的编译器,有四个明显的特征:
多层 IR 设计:多层 IR 设计,为的是满足易用性与高性能这两种类型需求:1)为了让开发者使用方便,AI 框架会尽量对张量的计算进行抽象封装成具体的 API 或者函数,算法开发者只要关注神网络模型定义上的逻辑意义模型和算子;2)在底层算子性能优化时,可以打破算子的边界,从更细粒度的循环调度等维度,结合不同的硬件特点完成优化。
面向神经网络优化:面向神经网络模型特殊的数据类型进行定义。AI 领域,网络模型层的具体计算被抽象成张量的计算,这就意味着 AI 编译器中主要处理的数据类型也是张量。而在反向传播过程中,是深度学习最为具有有代表的特性,基于计算图构建的网络模型,需要具有自动微分功能。
DSA 芯片架构支持:AI 训练和推理对性能和时延都非常敏感,所以大量使用专用的 AI 加速芯片进行计算,而 AI 编译器其实是以 DSA 架构的 AI 加速芯片作为为中心的编译器,这也是区别于通用编译器的一个特征。
AI 编译与计算架构负责 AI 模型在真正运行前的编译和系统运行时的动态调度与优化。当获取的网络模型计算图部署于单卡、多卡甚至是分布式 AI 集群的环境,运行期的框架需要对整体的计算图按照执行顺序调度算子与任务的执行、多路复用资源,做好内存等资源的分配与释放。包括并不限于以下部分:
编译优化:如算子融合等。编译器根据算子的语义或者 IR 定义,对适合进行算子融合(多个算子和并为一个算子)的算子进行合并,降低内核启动与访存代价。同时 AI 编译器还支持循环优化等类似传统编译器的优化策略和面向深度学习的优化策略(如牺牲一定精度的计算图等价代换等)。