diff --git a/01Introduction/01present.md b/01Introduction/01present.md index 82271a3c..5d660062 100644 --- a/01Introduction/01present.md +++ b/01Introduction/01present.md @@ -4,7 +4,7 @@ 本节将介绍 AI 的由来、现状和趋势,让大家能够了解 AI 应用的由来与趋势,为后面理解 AI 系统的设计形成初步的基础。在后面章节介绍的人工智能系统(AI System)奠定基础,值得注意的是,这些系统设计原则大部分也适合于机器学习系统(ML System)。 -因为系统本身是随着上层应用的发展而不断演化的,从人工智能本身的发展脉络和趋势可以观察到:目前模型不断由小模型到大模型分布式训练演进,由单一的模型训练方式演化出针对特定应用的深度强化学习的训练方式,企业级人工智能模型生产由独占使用硬件资源到云上多租户共享 AI 集群资源进行模型训练。 +因为系统本身是随着上层应用的发展而不断演化的,从人工智能本身的发展脉络和趋势可以观察到:目前模型不断由小模型到大模型分布式训练演进,由单一的模型训练方式演化出针对特定应用的深度强化学习的训练方式,企业级神经网络模型生产由独占使用硬件资源到云上多租户共享 AI 集群资源进行模型训练。 看 AI 算法模型结构本身的发展,训练与部署需求使得模型结构快速演变;执行与部署流程上,资源管理变得越来越复杂,给 AI 系统的设计和开发带来越来越大的挑战的同时,也充满了新的系统设计,研究与工程实践的机遇。 @@ -80,7 +80,7 @@ ![](images/01Present05.png) -综上所述,可以看到也是这些有应用与部署人工智能技术的公司都会在人工智能基础设施和系统上投入和研发,进而通过提升人工智能模型生产效率,更快的获取效果更好的模型进而获取领先优势,然后再通过业务场景反哺,获取更多的数据和加大研发投入,驱动人工智能系统与工具链的创新与发展。 +综上所述,可以看到也是这些有应用与部署人工智能技术的公司都会在人工智能基础设施和系统上投入和研发,进而通过提升神经网络模型生产效率,更快的获取效果更好的模型进而获取领先优势,然后再通过业务场景反哺,获取更多的数据和加大研发投入,驱动人工智能系统与工具链的创新与发展。 ## AI 基本理论奠定 @@ -147,12 +147,14 @@ ### 大模型带来新机遇(约 2020s) -随着人工智能模型结构向更深的网络结构,更多的参数演进,出现了各种基于预训练模型进行参数微调的特大参数模型。2021 年 8 月份,著名人工智能教授李飞飞和 100 多位学者联名发表一份 200 多页的研究报告《[On the Opportunities and Risk of Foundation Models](https://arxiv.org/pdf/2108.07258)》,深度地综述了当前大规模预训练模型面临的机遇和挑战,文中将这种基于深度神经网络和自监督学习技术,在大规模、广泛来源数据集上训练的 AI 模型称为大模型。 +随着神经网络模型结构向更深的网络结构,更多的参数演进,出现了各种基于预训练模型进行参数微调的特大参数模型。2021 年 8 月份,著名人工智能教授李飞飞和 100 多位学者联名发表一份 200 多页的研究报告《[On the Opportunities and Risk of Foundation Models](https://arxiv.org/pdf/2108.07258)》,深度地综述了当前大规模预训练模型面临的机遇和挑战,文中将这种基于深度神经网络和自监督学习技术,在大规模、广泛来源数据集上训练的 AI 模型称为大模型。 大模型包括多种预训练模型,如 BERT、GPT-3、CLIP、DALL·E 等。目前基础模型所涉及的技术子领域包括:模型的构建、训练、微调、评价、加速、数据、安全、稳健性、对齐(Alignment)、模型理论、可解释等,大模型仍处于快速发展的阶段。 ## 小结与思考 -- 围绕 AI 的历史现状和发展展开对 AI 系统研究,需要要深刻理解上层 AI 计算应用负载特点,历史和趋势,才能将找到系统设计的真实需求问题和优化机会。 +- 本节围绕 AI 的历史现状和发展展开对 AI 系统研究,需要要深刻理解上层 AI 计算应用负载特点,历史和趋势,才能将找到系统设计的真实需求问题和优化机会。 -- 当前 AI 领域不同算法模型之间有何差异,对 AI 系统的要求会有什么新的挑战? +- AI 在CV、NLP、Audio等领域及金融、医疗、教育等行业有广泛应用,其模型结构和部署需求不断演变,带来挑战与机遇。 + +- AI的基本理论神经网络在发展中经历了萌芽兴奋期、蓬勃发展期、突破驱动繁荣期,其发展受硬件算力和模型创新推动。而近年来,大模型出现带来新机遇,包括多种预训练模型,相关技术子领域仍在快速发展。 diff --git a/01Introduction/02Develop.md b/01Introduction/02Develop.md index ffab51a0..ce30180a 100644 --- a/01Introduction/02Develop.md +++ b/01Introduction/02Develop.md @@ -20,23 +20,25 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 1. **确定模型输入输出**:首先需要确认神经网络模型的输入样本学习数据(Sample)、输出标签(Label)。如图中所示,给 AI 模型输入图片(有狗,猫等),输出是图片所对应的类别(是猫还是是狗?)。用户需要提前准备好模型的输入输出数据,进而展开后续的模型训练。 -2. **设计与开发模型**:开发者通过 AI 开发框架提供的 API 开发了图中的模型结构,线段代表权重,圆圈代表输入数据发生计算操作。其中 $w_n$ 代表权重,也就是可以被学习和不断更新的数值。 +2. **设计与开发模型**:开发者通过 AI 框架提供的 API 开发了神经网络模型,在神经网络模型结构的基本表示中,一般线段(连线)代表权重,圆圈代表输入数据发生变化的具体计算操作。其中 $w_n$ 代表权重,也就是可以被学习和不断更新的数值,简称为网络模型的参数。 -3. **训练(Training)过程**:训练的本质上是通过网络中的连接逐层向后传播总误差,计算每个层中每个权重和偏差对总误差的贡献(梯度 $\delta w$),然后使用求解梯度的优化算法(如梯度下降算法)进行优化权重和偏差,并最终最小化神经网络的总误差。如图中上半部分所示,训练过程就是根据用户给定的带有标签(如图中的 Cat,Dog 等输出标签)的数据集,不断通过优化算法进行学,通过下面步骤学习出给定数据集下最优的模型权重 $w_n$ 的取值。 +3. **训练(Training)过程**:训练的本质上是通过网络模型中的连接逐层向后传播总误差,计算每个层中每个权重和偏差对总误差的贡献(梯度 $\delta w$),然后使用求解梯度的优化算法(如下图中的梯度下降算法)去寻找数据的鞍点,从而对网络模型优化权重参数和偏差,并最终最小化神经网络的总误差 Loss。 ![](images/02Develop02.png) -3.1 **前向传播(Forward Propagation)**:由输入到输出完成 AI 模型中各层矩阵计算(例如卷积层,池化层等),产生输出并完成损失函数 LOSS 计算。 + 因此训练过程就是根据用户给定的带有标签(如图中的多张马冬梅的照片,以及马冬梅照片对应的 “马冬梅” 这个确定性的输出标签)的数据集,不断通过优化算法进行训练学习。而训练学习则是通过下面步骤学习出给定数据集下最优的模型权重 $w_n$ 的取值。 -3.2 **反向传播(Back Propagation)**:由输出到输入反向完成 AI 模型中各层的权重和输出对损失函数的梯度求解。 + 3.1 **前向传播(Forward Propagation)**:由输入到输出完成 AI 模型中各层矩阵计算(例如卷积层,池化层等),产生输出并完成损失函数 LOSS 计算。 -3.3 **梯度更新(Weight Update)**:对模型权重通过梯度下降法完成模型权重针对梯度和指定学习率更新。 + 3.2 **反向传播(Back Propagation)**:由输出到输入反向完成 AI 模型中各层的权重和输出对损失函数的梯度求解。 -不断重复以上步骤 3.1 ~ 3.2,直到达到 AI 模型收敛或达到终止条件(例如指定达到一定迭代(Step)次数然后停止执行)。 + 3.3 **梯度更新(Weight Update)**:对模型权重通过梯度下降法完成模型权重针对梯度和指定学习率更新。 -如图所示,当完成了模型训练,意味着在给定的数据集上,模型已经达到最佳或者满足需求的预测效果。在如果开发者对模型预测效果满意,就可以进入模型部署进行推理和使用模型。一句话而言,我们训练 AI 模型的过程,就是通过不断的迭代计算,使用梯度下降的优化算法,使得损失函数越来越小。损失函数越小就表示算法达到数学意义上的最优。 + 不断重复以上步骤 3.1 ~ 3.2,直到达到 AI 模型收敛(即总误差损失 Loss 值降到一个提前设置的阈值)或达到终止条件(例如指定达到一定迭代(Step)次数然后停止训练)。 -![](images/02Develop03.png) + 如图所示,当完成了模型训练,意味着在给定的数据集上,模型已经达到最佳或者满足需求的预测效果。在如果开发者对模型预测效果满意,就可以进入模型部署进行推理和使用模型。**·一句话而言,我们训练 AI 模型的过程,就是通过不断的迭代计算,使用梯度下降的优化算法,使得损失值 Loss 越来越小。损失值越小就表示算法达到数学意义上的最优。** + + ![](images/02Develop03.png) 4. **推理(Inference)过程**:推理只需要执行训练过程中的前向传播过程即可,推理的原理是基于训练好的 AI 模型,通过输入待预测的数据,经过前向传播过程,即通过 AI 模型定义的激活函数和非线性函数处理数据,得到最终的预测结果。 @@ -64,13 +66,13 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 5. **扩散概率模型(Diffusion Probabilistic Models)**:扩散概率模型是一类潜变量模型,是用变分估计训练的马尔可夫链。目标是通过对数据点在潜空间中的扩散方式进行建模,来学习数据集的潜结构。如计算机视觉中,意味着通过学习逆扩散过程训练神经网络,使其能对叠加了高斯噪声的图像进行去噪。 -6. **混合结构网络(Model Ensemble)**:组合卷积神经网络和循环神经网络,进而解决如光学字符识别(OCR)等复杂应用场景的预测任务。 +6. **混合结构网络(Model Ensemble)**:组合以上不同结构类型的网络模型,如结合卷积神经网络和循环神经网络,进而解决如光学字符识别(OCR)等复杂应用场景的预测任务。 -基础模型的典型算子已经被 AI 开发框架和底层 AI 硬件做了较多优化,但是 AI 模型已经不单纯只在算子层面产生变化,其从网络结构,搜索空间等方向演化出如下的新的趋势: +基础模型的典型算子已经被 AI 框架和底层 AI 硬件做了较多优化,但是 AI 模型已经不单纯只在算子层面产生变化,其从网络结构,搜索空间等方向演化出如下的新的趋势: ![](images/02Develop06.png) -1. **更大的模型**:以 Transformer 为基本结构的代表性预训练神经语言模型(Neural Language Model),例如,BERT、GPT-3、LLAMA 等,在自然语言处理和计算机视觉等场景应用越来越广泛。其不断增加的层数和参数量,该模型对底层系统内存管理,分布式训练和硬件设计提出了很大的挑战。 +1. **更大的模型**:以 Transformer 为基本结构的代表性预训练神经语言模型(Neural Language Model),例如,BERT、GPT-3、LLAMA 等,在自然语言处理和计算机视觉等场景应用越来越广泛,到目前为止大语言模型(Large Language Model,LLM)已经成为了深度学习当中非常重要的一个分支结构。Transformer 模型其不断增加的层数和参数量,对底层系统内存管理、分布式训练和 AI 集群硬件设计提出了很大的挑战。 2. **更灵活的结构**:图神经网络模型、深度搜索树网模型等算法不断抽象多样且灵活的数据结构(例如图 Graph,树 Tree 等),应对更为复杂的建模需求。进而衍生了新的算子(例如图卷积等)与计算框架(例如图神经网络框架等)。 @@ -90,7 +92,7 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 互联网和移动互联网公司由于有海量的用户,大规模的数据中心,信息系统完善,所以可以较早沉淀出大规模数据,并应用人工智能技术,投入研发创新人工智能技术。互联网服务和大数据平台给深度学习带来了大量的数据集。随着移动互联网的日益火爆,移动应用的发展可谓日新月异,谷歌 Play、App Store,还有众多的移动应用分发渠道上,已经积累了海量应用。 -互联网公司因为其有海量的用户,这些用户不断使用互联网服务,上传文字、图片、音频等数据,又积累了更为丰富的数据。这些数据随着时间的流逝和新业务功能的推出,数据量越来越大,数据模式越来越丰富。所以互联网公司较早的开发和部署了的大数据管理与处理平台。基于这些海量数据,互联网公司通过数据驱动的方式,训练人工智能模型,进而优化和提升业务用户体验(如点击率预测让用户获取感兴趣的信息),让更多的用户使用服务,进而形成循环。由于天然的随着业务发展遇到更多需要应用人工智能技术的实际场景和需求,相较于学术界,互联网公司作为工业界的代表,较早地将深度学习的发展推到了更加实用,落地的阶段,并不断投入研发推动人工智能算法与系统的不断演进和发展。 +互联网公司因为其有海量的用户,这些用户不断使用互联网服务,上传文字、图片、音频等数据,又积累了更为丰富的数据。这些数据随着时间的流逝和新业务功能的推出,数据量越来越大,数据模式越来越丰富。所以互联网公司较早的开发和部署了的大数据管理与处理平台。基于这些海量数据,互联网公司通过数据驱动的方式,训练神经网络模型,进而优化和提升业务用户体验(如点击率预测让用户获取感兴趣的信息),让更多的用户使用服务,进而形成循环。由于天然的随着业务发展遇到更多需要应用人工智能技术的实际场景和需求,相较于学术界,互联网公司作为工业界的代表,较早地将深度学习的发展推到了更加实用,落地的阶段,并不断投入研发推动人工智能算法与系统的不断演进和发展。 例如,以下几种服务中沉淀和形成了相应领域代表性的数据集: @@ -100,7 +102,7 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 ![](images/02Develop07.png) -同样是图像分类问题,从最开始数据规模较小的 MNIST 手写数字识别数据集其只有 6 万样本,10 个分类,到更大规模的 ImageNet,其有 1600 万样本,1000 个分类,再到互联网 Web 服务中沉淀了数亿量级的图像数据。海量的数据让人工智能问题变得愈发挑战的同时,实质性的促进了人工智能模型效果的提升,因为当前以深度学习为核心的代表性 AI 算法,其本身是数据驱动的方式从数据中学习规律与知识,数据的质与量决定了模型本身的天花板。 +同样是图像分类问题,从最开始数据规模较小的 MNIST 手写数字识别数据集其只有 6 万样本,10 个分类,到更大规模的 ImageNet,其有 1600 万样本,1000 个分类,再到互联网 Web 服务中沉淀了数亿量级的图像数据。海量的数据让人工智能问题变得愈发挑战的同时,实质性的促进了神经网络模型效果的提升,因为当前以深度学习为核心的代表性 AI 算法,其本身是数据驱动的方式从数据中学习规律与知识,数据的质与量决定了模型本身的天花板。 ![](images/02Develop08.png) @@ -112,7 +114,7 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 - 传统的机器学习库不能满足相应的需求,海量的数据集让单机越来越难以完成 AI 模型的训练,进而产生了 AI 系统中分布式训练和 AI 集群的需求。 -- 多样的数据格式和任务,驱动模型结构的复杂性,驱动 AI 开发框架和针对 AI 的编译体系,需要有更灵活的表达能力对 AI 问题进行表达与映射。 +- 多样的数据格式和任务,驱动模型结构的复杂性,驱动 AI 框架和针对 AI 的编译体系,需要有更灵活的表达能力对 AI 问题进行表达与映射。 - 同时伴随着性能等需求得到满足,数据安全与模型安全问题挑战也变的日益突出。 @@ -120,7 +122,7 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 ### AI 算法的进步 -算法研究员和工程师不断设计新的 AI 算法和 AI 模型提升预测效果,其预测效果不断取得突破性进展。但是新的算法和模型结构,需要 AI 开发框架提供便于对 AI 范式的编程表达力和灵活性,对执行性能优化有可能会改变原有假设,进而产生了对 AI 系统对于 AI 开发框架的开发过程和 AI 编译器的执行过程优化提出了新的挑战,因而促进了 AI 系统的发展。 +算法研究员和工程师不断设计新的 AI 算法和 AI 模型提升预测效果,其预测效果不断取得突破性进展。但是新的算法和模型结构,需要 AI 框架提供便于对 AI 范式的编程表达力和灵活性,对执行性能优化有可能会改变原有假设,进而产生了对 AI 系统对于 AI 框架的开发过程和 AI 编译器的执行过程优化提出了新的挑战,因而促进了 AI 系统的发展。 1. **精度超越传统机器学习** @@ -136,7 +138,7 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 新的模型不断在以下方面演化进而提升效果:1)更好的激活函数和层,如 ReLU、Batch Norm 等;2)更深更大的网络结构和更多的模型权重;3)更好的训练技巧: 正则化(Regularization)、初始化(Initialization)、学习方法(Learning Methods),自动化机器学习与模型结构搜索等。 -上述取得更好效果的技巧和设计,驱动算法工程师与研究员不断投入,同时也要求 AI 系统提供新的算子(Operator)支持与优化,进而驱动 AI 开发框架和 AI 编译器对前端、中间表达和系统算法协同设计的演进和发展。 +上述取得更好效果的技巧和设计,驱动算法工程师与研究员不断投入,同时也要求 AI 系统提供新的算子(Operator)支持与优化,进而驱动 AI 框架和 AI 编译器对前端、中间表达和系统算法协同设计的演进和发展。 ### 算力与体系结构进步 @@ -146,14 +148,22 @@ AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 ![](images/02Develop10.png) -为了更高的性能,近年来 AI 芯片也大放光彩。其中一个代表就是谷歌 TPU(Tensor Processing Unit),通过对神经网络模型中的算子进行抽象,转换为矩阵乘法或非线性变换,根据专用负载特点进一步定制流水线化执行的脉动阵列(Systolic Array),进一步减少访存提升计算密度,提高了 AI 模型的执行性能。华为昇腾 NPU(神经网络处理器)针对矩阵运算专门优化设计,可解决传统芯片在神经网络运算时效率低下的问题。此外,华为达芬奇架构面向 AI 计算设计,通过独创 3D Cube 设计,每时钟周期可进行 4096 次 MAC 运算,为 AI 提供强大算力支持。 +为了更高的性能,近年来 AI 芯片也大放光彩。其中一个代表就是谷歌 TPU(Tensor Processing Unit),通过对神经网络模型中的算子进行抽象,转换为矩阵乘法或非线性变换,根据专用负载特点进一步定制流水线化执行的脉动阵列(Systolic Array),进一步减少访存提升计算密度,提高了 AI 模型的执行性能。华为昇腾 NPU(Neural Processing Unit,神经网络处理器)针对矩阵运算专门优化设计,可解决传统芯片在神经网络运算时效率低下的问题。此外,华为昇腾达芬奇架构面向 AI 计算设计,通过独创 3D Cube 设计,每时钟周期可进行 4096 次 MAC 运算,为 AI 提供强大算力支持。 除了算子层面驱动的定制,AI 层面的计算负载本身在算法层常常应用的稀疏性和量化等加速手段也逐渐被硬件厂商,根据通用算子定制到专用加速器中(例如,英伟达推出的 Transformer Engine),在专用计算领域进一步协同优化加速。通过定制化硬件,厂商又将处理器性能提升了大约 $10^5$ 量级。 -然而可惜的是,经过这么多年的发展,虽然处理器性能提升这么多,我们机器的数值运算能力早已是人类望尘莫及了,AI 芯片内部执行的程序代码仍然是人类指定的固定代码,智能程度还远远不及生物大脑。从智力程度来说,大约也就只相当于啮齿动物,距离人类还有一定距离。 +算力的数值运算能力早已是人类望尘莫及了,然而可惜的是,经过这么多年的发展,虽然处理器性能提升这么多,AI 芯片内部执行的程序代码仍然是人类指定的固定代码,智能程度还远远不及生物大脑。从智力程度来说,大约也就只相当于啮齿动物,距离人类还有一定距离。 -可以看到随着硬件的发展,虽然算力逐渐逼近人脑,让 AI 取得了突破。但是我们也看到,算力还是可能在短期内成为瓶颈,那么 AI 系统的性能下一代的出路在哪?我们在后面会看到,除了单独芯片的不断迭代进行性能放大(Scale Up),系统工程师不断设计更好的分布式计算系统将计算并行,来达到向外扩展(Scale Out),同时发掘深度学习的作业特点,如稀疏性等通过算法,系统硬件协同设计,进一步提升计算效率和性能。 +可以看到随着硬件的发展,虽然算力逐渐逼近人脑,让 AI 取得了突破。但是我们也看到,算力还是可能在短期内成为瓶颈,那么 AI 系统的性能下一代的出路在哪?我们在后面会看到,除了单独芯片的不断迭代进行性能放大(Scale Up),系统工程师不断设计更好的分布式计算系统将计算并行,提出了 AI 集群来达到向外扩展(Scale Out),同时发掘深度学习的作业特点,如稀疏性等通过算法,系统硬件协同设计,进一步提升计算效率和性能。 ## 小结与思考 -本节围绕 AI 学习方式和算法现状,并对催生这轮 AI 热潮的三个重要因素:大数据的积累、超大规模的计算能力支撑、机器学习尤其是深度学习算法进行研究,除了理解上层 AI 算法,也需要理解 AI 系统底层体系结构,并利用两者的优化空间进行抽象和权衡取舍选取最优系统解决方法。 \ No newline at end of file +- 人工智能(AI)技术自20世纪50年代以来经历了多次发展高潮,2016年AlphaGo的胜利重新点燃了公众对AI的兴趣,而AI已在互联网行业如搜索引擎、图片检索和广告推荐等领域广泛应用。 + +- 催生这轮 AI 热潮的三个重要因素:大数据的积累、超大规模的计算能力支撑、机器学习尤其是深度学习算法进行研究。 + +- 除了理解上层 AI 算法,也需要理解 AI 系统底层体系结构,并利用两者的优化空间进行抽象和权衡取舍选取最优系统解决方法。 + +- 机器学习是实现AI的方法,深度学习是实现机器学习的技术,神经网络是深度学习的具体实现形态,AI系统设计围绕这些技术进行。 + +- AI系统的发展受到大数据积累、计算能力提升和算法进步的推动,当前AI算法和模型不断演进,算力和体系结构的进步为AI提供了强大的执行性能,同时带来了新的系统设计挑战。 diff --git a/01Introduction/03architecture.md b/01Introduction/03architecture.md index b42cb66f..edd11410 100644 --- a/01Introduction/03architecture.md +++ b/01Introduction/03architecture.md @@ -8,7 +8,7 @@ AI 系统设计本身需要各个环节通盘考量,无论是系统性能, ## AI 系统概述 -### 基本概念 +### AI 系统基本概念 从类比的角度理解 AI 系统:**AI 时代连接硬件和上层应用的中间层软硬件基础设施**。 @@ -20,15 +20,17 @@ AI 系统设计本身需要各个环节通盘考量,无论是系统性能, ![](images/03Architecture01.png) -### 详细定义 +### AI 系统详细定义 -开发者一般通过编程语言 Python 和 AI 开发框架(例如 PyTorch、MindSpore 等)API 编码和描述以上 AI 模型,声明训练作业和部署模型流程。由最开始 AlexNet 是作者直接通过 [CUDA](https://code.谷歌.com/archive/p/cuda-convnet) 实现网络模型,到目前有通过 Python 语言灵活和轻松调用的框架,到大家习惯使用 HuggingFace 进行神经网络语言模型训练,背后是系统工程师贴合实际需求不断研发新的工具,并推动深度学习生产力提升的结果。 +开发者一般通过编程语言 Python 和 AI 框架(例如 PyTorch、MindSpore 等)API 编码和描述以上 AI 模型,声明训练作业和部署模型流程。由最开始 AlexNet 是作者直接通过 [CUDA](https://code.谷歌.com/archive/p/cuda-convnet) 实现网络模型,到目前有通过 Python 语言灵活和轻松调用的 AI 框架,到大家习惯使用 HuggingFace 社区提供的组件进行大语言模型进行微调和推理,背后是系统工程师贴合实际需求不断研发新的工具,并推动深度学习生产力提升的结果。 -但是这些 AI 编程语言和 AI 开发框架应对自动化机器学习、强化学习等多样执行方式,以及细分的应用场景显得越来越低效,不够灵活,需要用户自定义一些特殊优化,没有好的工具和系统的支撑,这些问题一定程度上会拖慢和阻碍算法工程师研发效率,影响算法本身的发展。因此,目前开源社区中也不断涌现针对特定应用领域而设计的框架和工具,例如 [Hugging Face](https://huggingface.co/) 提供语言预训练模型 ModelZoo 和社区,[FairSeq](https://github.com/pytorch/fairseq) 自然语言处理中的序列到序列模型开发套件和[MMDetection](https://github.com/open-mmlab/mmdetection) 物体检测套件,针对自动化机器学习设计的 [NNI](https://github.com/microsoft/nni) 加速库等,进而针对特定领域模型应用负载进行定制化设计和性能优化,并提供更简化的接口和应用体验。 +但是这些 AI 编程语言和 AI 框架应对自动化机器学习、强化学习等多样执行方式,以及细分的应用场景显得越来越低效,不够灵活,需要用户自定义一些特殊优化,没有好的工具和系统的支撑,这些问题一定程度上会拖慢和阻碍算法工程师研发效率,影响算法本身的发展。 + +因此,目前开源社区中也不断涌现针对特定应用领域而设计的框架和工具,例如 [Hugging Face](https://huggingface.co/) 提供语言预训练模型 ModelZoo 和社区,[FairSeq](https://github.com/pytorch/fairseq) 自然语言处理中的序列到序列模型开发套件和[MMDetection](https://github.com/open-mmlab/mmdetection) 物体检测套件,针对自动化机器学习设计的 [NNI](https://github.com/microsoft/nni) 加速库等,进而针对特定领域模型应用负载进行定制化设计和性能优化,并提供更简化的接口和应用体验。 ![](images/03Architecture02.png) -由于不同领域的输入数据格式不同,预测输出结果不同,数据获取方式不同,造成模型结构和训练方式产生非常多样的需求,各家公司和组织不断研发新的针对特定领域的 AI 开发框架或上层应用接口封装,以支持特定领域数据科学家快速验证和实现新的 AI 想法,工程化部署和批量训练成熟的模型。如 Meta 推出的 Caffe 与 Torch 演化到 PyTorch,谷歌 TensorFlow 及新推出的 JAX,基于 PyTorch 构建的 HuggingFace 等。AI 开发工具与 AI 开发框架本身也是随着用户的模型构建与程序编写与部署需求不断演进。 +由于不同领域的输入数据格式不同,预测输出结果不同,数据获取方式不同,造成模型结构和训练方式产生非常多样的需求,各家公司和组织不断研发新的针对特定领域的 AI 框架或上层应用接口封装,以支持特定领域数据科学家快速验证和实现新的 AI 想法,工程化部署和批量训练成熟的模型。如 Meta 推出的 Torch 演化到 PyTorch,谷歌 TensorFlow 及新推出的 JAX,基于 PyTorch 构建的 HuggingFace 等。AI 开发工具与 AI 框架本身也是随着用户的模型构建与程序编写与部署需求不断演进。 这其中快速获取用户的原因,有一些是其提供了针对应用场景非常简化的模型操作,并提供模型中心快速微调相应的模型,有一些是因为其能支持大模型训练或者有特定领域模型结构的系统优化。 @@ -38,19 +40,19 @@ AI 系统自身设计挑战较高(如更大的规模、更大的超参数搜 英伟达(NVIDIA)、华为(HUAWEI)、英特尔(Intel)、谷歌(谷歌)等公司不断根据 AI 模型特点设计新的 AI 加速器芯片和对应的 AI 加速模块,如张量核 Tensor Core、脉动阵列等提供更大算力 AI 加速器。 -上述从顶层的 AI 算法应用、开发框架到底层应用所介绍的 AI 全栈相关内容中则是指 **AI 系统(AI System)**,是围绕深度学习而衍生和设计的系统,因此也叫做**深度学习系统(Deep Learning System)**。 +上述从顶层的 AI 算法应用、AI 框架(包括训练和推理)到底层 AI 编译器,和对 AI 算法应用进行加速的 AI 芯片。所介绍的 AI 全栈相关内容中则是指 **AI 系统(AI System)**,是围绕深度学习而衍生和设计的系统,因此也叫做**深度学习系统(Deep Learning System)**。 ![](images/03Architecture03.png) 但是 AI 系统很多也可以应用于机器学习算法或使用机器学习算法,例如自动化机器学习、集群管理系统等。同时这些系统设计方法具有一定的通用性,有些继承自机器学习系统或者可以借鉴用于机器学习系统。即使作为系统工程师,也需要密切关注算法和应用的演进,才能紧跟潮流设计出贴合应用实际的工具与系统。 -## AI 系统设计目标 +### AI 系统设计目标 深度学习系统的设计目标可以总结为以下几个部分。 1. 高效编程语言、开发框架和工具链 -设计更具表达能力和简洁的神经网络计算原语以及高级编程语言。让用户能够提升 AI 应用程序的开发效率,屏蔽底层硬件计算的细节,更灵活的原语支持。当前神经网络模型除了特定领域模型的算子和流程可以复用(如大语言模型 Transformer 架构在自然语言处理 NLP 领域被广泛作为基础结构),其新结构新算子的设计与开发仍遵循试错(Trial And Error)的方式进行。那么如何灵活表达新的计算算子,算子间的组合以及融合形式,屏蔽经典熟知的算子与基础模型,是算法工程师所需要语言、库与 AI 开发框架层所提供的功能支持。 +设计更具表达能力和简洁的神经网络计算原语以及高级编程语言。让用户能够提升 AI 应用程序的开发效率,屏蔽底层硬件计算的细节,更灵活的原语支持。当前神经网络模型除了特定领域模型的算子和流程可以复用(如大语言模型 Transformer 架构在自然语言处理 NLP 领域被广泛作为基础结构),其新结构新算子的设计与开发仍遵循试错(Trial And Error)的方式进行。那么如何灵活表达新的计算算子,算子间的组合以及融合形式,屏蔽经典熟知的算子与基础模型,是算法工程师所需要语言、库与 AI 框架层所提供的功能支持。 更直观的编辑、调试和实验工具。让用户可以完整的进行神经网络模型的开发、测试、调整诊断与修复和优化程序,提升所开发 AI 应用程序的性能与鲁棒性。训练过程不是一蹴而就,其中伴随着损失函数 LOSS 曲线不收敛、Loss 值出现 NaN 无效值、内存溢出等算法问题与算法设计缺陷(Bug)。AI 工具链与 AI 系统本身如何在设计之初就考虑到这点,提供良好的可观测性、可调试性、允许用户注册自定义扩展等支持,是需要工具链与 AI 系统的设计者,所需要在 AI 系统的设计之初就需要提上日程的,否则之后更多是缝缝补补造成不好的开发体验与不能满足的需求,对用户来说就像使用一个黑盒且单片的工具。 @@ -66,7 +68,7 @@ AI 系统自身设计挑战较高(如更大的规模、更大的超参数搜 **提供更强大和可扩展的计算能力**。让用户的 AI 程序可扩展并部署于可以并行计算的节点或者集群,应对大数据和大模型的挑战。因为当前 AI 模型不断通过大模型,多模态大模型以产生更好的算法效果,促使 AI 系统需要支持更大的模型、更多模态的输入。同时由于企业 IT 基础设施不断完善,能够不断沉淀新的数据,也会伴随着大数据而衍生的问题。大模型与大数据促使存储与计算层面的系统,在摩尔定律失效的大背景下,迫切需要通过并行与分布式计算的方式,扩展算力与存储的支持。 -**自动编译优化算法**。1)对计算图自动推导:尽可能的通过符号执行或即时编译 JIT 技术,获取更多的计算图信息,让 AI 开发框架或者 AI 编译器自动执行定制化的计算优化。2)根据不同体系结构自动并行化:面对部署场景的多样化体系结构,训练阶段异构硬件的趋势,AI 开发框架让用户透明的进行任务配置和并行化,以期以最为优化的方式在 AI 集群配置下,并行化、减少 I/O、充分利用通信带宽,逼近硬件提供的极限性能上限。 +**自动编译优化算法**。1)对计算图自动推导:尽可能的通过符号执行或即时编译 JIT 技术,获取更多的计算图信息,让 AI 框架或者 AI 编译器自动执行定制化的计算优化。2)根据不同体系结构自动并行化:面对部署场景的多样化体系结构,训练阶段异构硬件的趋势,AI 框架让用户透明的进行任务配置和并行化,以期以最为优化的方式在 AI 集群配置下,并行化、减少 I/O、充分利用通信带宽,逼近硬件提供的极限性能上限。 **云原生自动分布式化**。自动分布式并行扩展到多个计算节点,面对云与集群场景,自动将 AI 任务扩展与部署,进而支撑分布式计算、弹性计算,让用户按需使用资源,也是云原生背景下,AI 系统所需要考虑和支持的。 @@ -74,13 +76,13 @@ AI 系统自身设计挑战较高(如更大的规模、更大的超参数搜 在 AI 系统中会随着 AI 算法的发展,出现了对动态图、动态 Shape 的支持需求,利用网络模型结构的稀疏性进行压缩加速优化,为了提升训练指标 TTA 实现混合精度训练与部署,还有混合训练范式(如强化学习)、多任务(如自动化机器学习)等特性支持。 -提供在更大规模的企业级环境的部署需求。如云环境多租环境的训练部署需求:面对多组织,多研究员和工程师共享集群资源,以及大家迫切使用 GPU 资源的日益增长的需求,如何提供公平、稳定、高效的多租环境也是平台系统需要首先考虑的。 +提供在更大规模的企业级环境的部署需求。如云环境、多租环境的训练部署需求:面对多组织,多研究员和工程师共享集群资源,以及大家迫切使用 GPU 资源的日益增长的需求,如何提供公平、稳定、高效的多租环境也是平台系统需要首先考虑的。 跨平台的推理部署需求。面对割裂的边缘侧硬件与软件栈,如何让模型训练一次,跨平台部署到不同软硬件平台,也是推理场景需要解决的重要问题。 最后是安全与隐私的需求。由于网络模型类似传统程序的功能,接受输入,处理后产生输出,但是相比传统程序,其解释性差,造成更容易产生安全问题,容易被攻击。同时模型本身的重要信息为权重,我们也要注意模型本身的隐私保护。同时如果是企业级环境或公有云环境,会有更高的安全和隐私保护要求。 -了解完 AI 系统设计的宏观目标,可以进一步了解,当前在人工智能的大生态环境中 AI 系统的技术栈是如何构成的,整个技术栈中 AI 系统的各=处于哪个抽象层次,互相之间的关系是什么。 +了解完 AI 系统设计的宏观目标,可以进一步了解,当前在人工智能的大生态环境中 AI 系统的技术栈是如何构成的,整个技术栈中 AI 系统的各处于哪个抽象层次,互相之间的关系是什么。 ## AI 系统组成 @@ -88,33 +90,51 @@ AI 系统自身设计挑战较高(如更大的规模、更大的超参数搜 ![](images/03Architecture06.png) -### 应用与开发层 +### AI 训练与推理框架 + +AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。其负责提供用户前端的 AI 编程语言,接口和工具链。负责静态程序分析与计算图构建,编译优化等工作。AI 框架本身通过提供供用户编程的 API 获取用户表达的模型,数据读取等意图,在静态程序分析阶段完成尽可能的自动前向计算图构建,自动求导补全反向传播计算图,计算图整体编译优化,算子内循环编译优化等。 + +这一层尽可能让用户表达目标任务与 AI 算法,尽量少让用户关注底层实现(例如到底 AI 框架的实现是通过声明式编程方式还是命令式编程方式)是提升开发体验的较好的手段,但是过度的抽象会丧失灵活性的表达,在模型发展较快迭代频繁的时期用户还需要体验层兼顾灵活性和可调试性。开发体验层会调用编排底层框架的接口提供更加简洁的用户开发体验。包括并不限于以下领域: -负责提供用户前端的 AI 编程语言,接口和工具链。这一层尽可能让用户表达目标任务与 AI 算法,尽量少让用户关注底层实现(例如到底 AI 框架的实现是通过声明式编程方式还是命令式编程方式)是提升开发体验的较好的手段,但是过度的抽象会丧失灵活性的表达,在模型发展较快迭代频繁的时期用户还需要体验层兼顾灵活性和可调试性。开发体验层会调用,编排底层框架的接口提供更加简洁的用户开发体验。包括并不限于以下领域: +- **网络模型构建**:卷积神经网络 CNN、循环神经网络 RNN、Transformer 结构等,包括 if else 控制流等基本结构和算子支持与实现的 API。语言的基本语法和框架的 API 接口提供基本算子的支持。当前主要以使用 Python 语言内嵌调用 AI 框架的方式进行网络模型的开发,但是也出现控制流在原生语言层与模型中间表达割裂等问题。 + +- **模型算法实现**:算法一般被封装为 AI 框架的配置或 API 供用户选择,有些 AI 框架也提供拦截接口给用户一定程度灵活性定制自定义算法。模型算法实现与网络模型结构构件还是有着明显的区别,例如网络模型构建只提供模型层面的构建,但是 AI 的算法实现流程如到底是训练还是推理,是实现强化学习、监督学习还是无监督学习等,属于模型算法的实现过程,只是其中内部的算法模型结构的构建属于网络模型部分。 + +- **计算图构建**:静态计算图、动态计算图构建等。不同的 AI 框架类型决定了其使用静态还是动态图进行构建,静态图有利于获取更多信息做全图优化,动态图有利于调试,目前实际处于一个融合的状态,如 PyTorch2.X 版本后推出 Dynamo 特性支持原生静态图。 -- **网络模型构建**:卷积神经网络 CNN、循环神经网络 RNN、Transformer 结构等,包括 if else 控制流等基本结构和算子支持与实现的 API。语言的基本语法和框架的 API 接口提供基本算子的支持。当前主要以使用 Python 语言内嵌调用 AI 开发框架的方式进行网络模型的开发,但是也出现控制流在原生语言层与模型中间表达割裂等问题。 +- **自动求导**:高效地对网络模型自动求导等。由于网络模型中大部分算子较为通用,AI 框架提前封装好算子的自动求导函数,待用户触发训练过程自动透明的进行全模型的自动求导,以支持梯度下降等训练算法需要的权重梯度数据的获取。 -- **模型算法实现**:算法一般被封装为 AI 开发框架的配置或 API 供用户选择,有些 AI 开发框架也提供拦截接口给用户一定程度灵活性定制自定义算法。模型算法实现与网络模型结构构件还是有着明显的区别,例如网络模型构建只提供模型层面的构建,但是 AI 的算法实现流程如到底是训练还是推理,是实现强化学习、监督学习还是无监督学习等,属于模型算法的实现过程,只是其中内部的算法模型结构的构建属于网络模型部分。 +- **中间表达构建**:多层次中间表达等。通过构建网络模型的中间表达及多层中间表达,让模型本身可以更好的被下层 AI 编译器编译生成高效的后端代码。 - **流水线和工作流支持**:流水线和工作流是实现模块解耦复用,可视化编程的前提,通过复用与可视化编程可以大幅降低组织内作业书写的门槛,如高性能数据加载器等。 - **工具链**: 如模型在不同硬件的迁移、在不同框架的迁移、模型转换、调试、可视化、类型系统等。就像传统的软件工程中调试器,可视化,类型系统等工具链的支撑,让整个开发过程中,跨平台,跨平台,问题诊断,缺陷验证等得以高效实现,目前 AI 系统领域也不断有类似工具产生,以支持整个 AI 工程化实践。 - **生命周期管理**:数据读取,训练与推理等流程开发与管理。机器学习领域的 DevOps 也就是 MLOps 的基础工具支持。其可以让重复模块被复用,同时让底层工具有精确的信息进行模块间的调度与多任务的优化,同时让各个环节模块化解耦,独立和更为快速的演进。 + +### AI 编译与计算架构 -## AI 框架层 +AI 框架充分赋能深度学习领域,为 AI 算法的开发者提供了极大便利。早期的 AI 框架主要应用于学术界,如 Theano、torch 等,随着深度学习的快速发展以及在工业界的不断拓展,不断有新的 AI 框架被提出以满足不同场景的应用。 -AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。负责静态程序分析与计算图构建,编译优化等工作。AI 框架本身通过提供供用户编程的 API 获取用户表达的模型,数据读取等意图,在静态程序分析阶段完成尽可能的自动前向计算图构建,自动求导补全反向传播计算图,计算图整体编译优化,算子内循环编译优化等。包括并不限于以下领域: +但是随着 AI 技术应用的全面发展,各厂家根据自身业务场景的需求,在 AI 硬件和算法上不断优化和探索,AI 系统的体系结构越来越复杂,更多新的 AI 加速芯片被提出来,其设计变得更加多样化,AI 框架运行的硬件环境和算法也趋于更多样和复杂,单一 AI 框架已经无法满足和平衡所有特性。所以,为了提供不同框架和硬件体系结构之间的迁移性,ONNX 等中间 IR 被提出,其定义了表示神经网络模型的统一格式,以促进不同 AI 框架之间的模型转换。 -- **计算图构建**:静态计算图、动态计算图构建等。不同的 AI 框架类型决定了其使用静态还是动态图进行构建,静态图有利于获取更多信息做全图优化,动态图有利于调试,目前实际处于一个融合的状态,如 PyTorch2.X 版本后推出 Dynamo 特性支持原生静态图。 +为了实现硬件的多样性,需要将神经网络模型计算映射到不同架构的硬件中执行。在通用硬件上,高度优化的线性代数库为神经网络模型计算提供了基础加速库。此外,大多数硬件供应商还发布了专属的神经网络模型计算优化库,如:MKL-DNN 和 cuDNN 等,但基于基础加速库的优化往往落后于深度学习算法模型的更新,且大多数情况下需要针对不同的平台进行定制化的开发。 -- **自动求导**:高效地对网络模型自动求导等。由于网络模型中大部分算子较为通用,AI 框架提前封装好算子的自动求导函数,待用户触发训练过程自动透明的进行全模型的自动求导,以支持梯度下降等训练算法需要的权重梯度数据的获取。 +为了解决多硬件平台上的性能优化的问题,多种 AI 编译器被提出并得到了普及和应用,比如:TVM ,Glow,XLA 和 Jittor 等。AI 编译器以神经网络模型作为输入,将 AI 计算任务通过一层或多层中间表达 IR 进行翻译和优化,最后转化为目标硬件上可执行的代码,与传统的编译器(LLVM)类似,AI 编译器也采用前端、中间表示和后端分层设计的方式。 -- **中间表达构建**:多层次中间表达等。通过构建网络模型的中间表达及多层中间表达,让模型本身可以更好的被下层 AI 编译器编译生成高效的后端代码。 - -### 编译与运行时 +![](images/04Sample06.png) + +目前,业界主流的芯片公司和大型互联网公司等都在 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 编译与计算架构负责 AI 模型在真正运行前的编译和系统运行时的动态调度与优化。当获取的网络模型计算图部署于单卡、多卡甚至是分布式 AI 集群的环境,运行期的框架需要对整体的计算图按照执行顺序调度算子与任务的执行、多路复用资源,做好内存等资源的分配与释放。包括并不限于以下部分: - **编译优化**:如算子融合等。编译器根据算子的语义或者 IR 定义,对适合进行算子融合(多个算子和并为一个算子)的算子进行合并,降低内核启动与访存代价。同时 AI 编译器还支持循环优化等类似传统编译器的优化策略和面向深度学习的优化策略(如牺牲一定精度的计算图等价代换等)。 @@ -124,7 +144,7 @@ AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。 - **硬件接口抽象**:GPU、NPU、TPU、CPU、FPGA 和 ASIC 等硬件的接口抽象。统一的硬件接口抽象可以复用编译优化策略,让优化方案与具体底层的 AI 硬件设备和 AI 体系结构适当解耦。 -### 硬件体系结构与 AI 芯片 +### AI 硬件与体系结构 负责程序的真正执行、互联与加速。在更广的层面,作业与作业间需要平台提供调度,运行期资源分配与环境隔离。包括并不限于以下部分: @@ -136,10 +156,10 @@ AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。 ## AI 系统生态 -![](images/03Architecture07.png) - 除了以上重要的 AI 系统构成之外,随着人工智能应用越来越广泛,我们还可以看到更广泛的 AI 系统生态的构成。其中包含以下领域: +![](images/03Architecture07.png) + ### 核心系统软硬件 通过核心系统软硬件,底层的基础架构已经可以给上层提供算力,存储,网络等资源池,可以按需给需要执行的深度学习作业隔离出指定规格的资源,执行深度学习作业,类似传统操作系统已经完成底层硬件的抽象与资源隔离,只需要用户的应用提交到系统中被执行和管理。 @@ -160,7 +180,7 @@ AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。 - **神经网络编译架构及优化**:在编译期,通过静态分析与优化的方法,提供更优化的编译支持,提升模型的性能,正确性等。类似传统编译器,网络模型的计算图可以通过融合等手段优化,算子内可以应用大量循环优化。同时面向网络模型本身的特点,也逐渐有工作利用一些等价和非等价计算图转换进行优化。 -### 更广泛的 AI 系统生态 +### 更广泛生态 随着深度学习高速发展,更大的搜索空间,运行时才能获取的数据,模型安全与隐私,部署推理的多样化需求变得日益迫切,我们需要考虑除训练以外更多的 AI 系统问题。 @@ -168,11 +188,16 @@ AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。 - **自动机器学习(如自动化机器学习)**:当用户想试错(Trial And Error)的搜索空间达到一定量级,用户通过自动化机器学习工具与算法可以更高效的进行模型的探索与训练。自动化机器学习系统可以提供多任务的高效管理与调度支持,支持搜索空间定义的程序语言等。 -- **安全(Security)与隐私(Privacy)**:数据与模型,类似传统的信息安全要保护的数据与程序,除了数据本身,模型类似传统程序本身的安全与隐私问题提出了新的挑战。我们需要思考人工智能模型与应用的安全与隐私保护支持。 +- **安全(Security)与隐私(Privacy)**:数据与模型,类似传统的信息安全要保护的数据与程序,除了数据本身,模型类似传统程序本身的安全与隐私问题提出了新的挑战。我们需要思考神经网络模型与应用的安全与隐私保护支持。 - **模型推理、压缩与优化**:如果不需要训练,只需要执行前向传播过程,则是用户开始使用模型进行推理,基于深度学习特有性质进行高效的模型部署推理是除训练外很重要的系统问题。模型推理相比训练有更低的延迟要求,更严苛的资源供给,不需要求解梯度和训练,有更低的精度要求等,如何设计面向推理的系统提出了新的机会。同时网络模型本身可以通过模型压缩,量化等手段精简计算量与内存消耗,加速模型的部署。 ## 小结与思考 -本节围绕 AI 系统的组成和生态进行介绍,在初学 AI 系统我们可能会只关注 AI 开发框架(如 MindSpore),但当我们把系统放眼到整个基础软硬件架构体系中,会发现当前 AI 系统涉及很多方面,类似传统的操作系统(异构资源管理系统)、编译器(AI 编译优化)、Web 服务(推理系统)、软件云化(AI 集群调度)等问题在 AI 系统的场景中仍然会遇到,一些经典的理论与系统设计在今天仍然对 AI 系统发挥着重要的影响。 +- AI 系统是连接硬件和上层应用的软硬件基础设施,包括编程语言、开发框架等,其设计面临诸多挑战。 + +- AI 系统的设计目标包括高效的编程语言与工具链、对多种AI任务的系统级支持以及解决新挑战下的系统设计与演化问题。 + +- AI 系统大致分为AI训练与推理框架、AI编译与计算架构、AI硬件与体系结构,还包括更广泛的系统生态,涵盖核心系统软硬件、AI算法和框架以及更广泛的相关领域。 +- 当前 AI 系统涉及很多方面,类似传统的操作系统(异构资源管理系统)、编译器(AI 编译优化)、Web 服务(推理系统)、软件云化(AI 集群调度)等问题在 AI 系统的场景中仍然会遇到,经典理论与系统设计在今天仍然对 AI 系统发挥着重要的影响。 diff --git a/01Introduction/05Ascend.md b/01Introduction/05Ascend.md new file mode 100644 index 00000000..1e02969f --- /dev/null +++ b/01Introduction/05Ascend.md @@ -0,0 +1,15 @@ + + +# 昇腾 AI 全栈架构介绍 + +昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,包括昇腾系列处理器、系列硬件、CANN(Compute Architecture for Neural Networks,异构计算架构)、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链。 + +其生态包括围绕着昇腾计算技术和产品体系所开展的学术、技术、公益及商业活动,产生的知识和产品以及各种合作伙伴,主要包括原始设备制造商OEM、原始设计制造商ODM、 独立硬件开发商IHV、咨询与解决方案集成商C&SI、独立软件开发商ISV、云服务提供商XaaS等。 + +同时,昇腾的合作伙伴体系当中还包含围绕昇腾相关产品对外提供服务交付的服务类伙伴,提供培训服务的人才联盟伙伴,提供投融资和运营服务的投融资运营伙伴等。昇腾高度重视高校的人才培养和昇腾开发者的发展,让高校和开发者成为整个昇腾生态的重要组成部分。 + +## 小结与讨论 + +- 由于系统的多层抽象造成 AI 实践和算法创新的过程中已经无法感知底层系统的运行机制。 + +- AI 系统底层的作用和复杂性,从而指导上层 AI 作业、算法、代码更加高效的执行和编写。 diff --git a/01Introduction/04sample.md b/01Introduction/05Sample.md similarity index 70% rename from 01Introduction/04sample.md rename to 01Introduction/05Sample.md index d367c864..7732acb4 100644 --- a/01Introduction/04sample.md +++ b/01Introduction/05Sample.md @@ -2,7 +2,7 @@ # AI 系统与程序代码关系 -模型算法的开发者一般会通过使用 AI 框架提供 Python 等高级语言的 API,来编写对应的人工智能程序,而人工智能程序的底层系统问题被当前层抽象隐藏。到底在每个代码部分具体底层发生了什么?有哪些有意思的系统设计问题? +模型算法的开发者一般会通过使用 AI 框架提供 Python 等高级语言的 API,来编写对应的 AI 算法,而AI 算法的底层系统问题被当前层抽象隐藏。到底在代码背后 AI 系统的每一层发生和执行了什么?有哪些有意思的系统设计问题? 本节我们将从一个具体的 PyTorch 实现一个 LeNet5 神经网络模型作为实例开始,启发读者和后面 AI 系统的每一层和各个章节构建起桥梁与联系。 @@ -31,9 +31,7 @@ $$\theta = \theta - \alpha \delta_{\theta}Loss(\theta)$$ 其中,$\alpha$ 也称为学习率(Learning Rate)。当神经网络模型训练完成,就可以通过 $\hat{y} = f_\theta(x)$ 进行推理,使用和部署已经训练好的网络模型。 -如图所示,左上角展示输入为手写数字图像,输出为分类向量,中间矩形为各层输出的特征图(Feature Map),我们将其映射为具体的实现代码,其结构通过图右侧定义出来。 - -可以看到神经网络模型就是通过各个层,将输入图像通过多个层的算子进行计算,得到为类别输出概率向量。 +如图所示,左上角展示输入为手写数字图像,输出为分类向量,中间矩形为各层输出的特征图(Feature Map),我们将其映射为具体的实现代码,其结构通过 AI 框架提供的 API来定义和构建。神经网络模型就是通过各个层,将输入图像通过多个隐藏层的算子进行计算,得到为类别输出概率向量。 > 算子:深度学习算法由一个个计算单元组成,称这些计算单元为算子(Operator,Op)。AI 框架中对张量计算的种类有很多,比如加法、乘法、矩阵相乘、矩阵转置等,这些计算被称为算子(Operator)。 > @@ -168,11 +166,11 @@ class LeNet(nn.Module): ... ``` -首先一次沿着行进行滑动一定的步长 Step,再进行下次矩阵内积计算,直到滑到边界后再沿着一定步长跳到下一列重复刚才的滑动窗口。最终把每一步的结果组合成输出矩阵,即产生特征图(Feature Map)。 +原始的卷积操作首先一次沿着行进行滑动一定的步长 Step,再进行下次矩阵内积计算,直到滑到边界后再沿着一定步长跳到下一列重复刚才的滑动窗口。最终把每一步的结果组合成输出矩阵,即产生特征图(Feature Map)。 -![](images/04Sample04.png) +如图中所示,输入张量形状(Tensor Shape)为 $3 \times 32 \times 32$(3 代表通道数,32 代表张量高度和宽度),经过 $2 \times 3 \times 5 \times 5$ 的卷积(2 代表输出通道数,3 代表输入通道数,5 代表卷积核高度和宽度)后,输出张量形状为 $2 \times 28 \times 28$(2 代表通道,28 代表高度和宽度)。 -图中输入张量形状(Tensor Shape)为 $3 \times 32 \times 32$(3 代表通道数,32 代表张量高度和宽度),经过 $2 \times 3 \times 5 \times 5$ 的卷积(2 代表输出通道数,3 代表输入通道数,5 代表卷积核高度和宽度)后,输出张量形状为 $2 \times 28 \times 28$(2 代表通道,28 代表高度和宽度)。 +![](images/04Sample04.png) ### 卷积执行样例 @@ -202,9 +200,9 @@ for n in range(batch_size): 在实际 Kernel 的计算过程中有很多有趣的问题: -- **硬件加速**:通用矩阵乘是计算机视觉和自然语言处理模型中的主要的计算方式,同时 NPU/GPU,如 TPU 脉动阵列的矩阵乘单元等其他专用人工智能芯片 ASIC 是否会针对矩阵乘作为底层支持?(第二章 AI 芯片体系结构相关内容) +- **硬件加速**:通用矩阵乘是计算机视觉和自然语言处理模型中的主要的计算方式,同时 NPU、GPU,又或者如 TPU 脉动阵列的矩阵乘单元等其他专用人工智能芯片 ASIC 是否会针对矩阵乘作为底层支持?(第二章 AI 芯片体系结构相关内容) -- **片上内存**:其中参与计算的输入、权重和输出张量能否完全放入 NPU/GPU 缓存(L1、L2、Cache)?如果不能放入则需要通过循环块(Loop Tile)编译优化进行切片。(第二章 AI 芯片体系结构相关内容) +- **片上内存**:其中参与计算的输入、权重和输出张量能否完全放入 NPU/GPU 片内缓存(L1、L2、Cache)?如果不能放入则需要通过循环块(Loop Tile)编译优化进行切片。(第二章 AI 芯片体系结构相关内容) - **局部性**:循环执行的主要计算语句是否有局部性可以利用?空间局部性(缓存线内相邻的空间是否会被连续访问)以及时间局部性(同一块内存多久后还会被继续访问),这样我们可以通过预估后,尽可能的通过编译调度循环执行。(第三章 AI 编译器相关内容) @@ -222,17 +220,15 @@ for n in range(batch_size): 在上面的知识中,开发者已经学会使用 Python 去编写 AI 程序,以及深度学习代码中的一个算子(如卷积)是如何翻译成底层 for 循环从而进行实际的计算,这类 for 循环计算通常可以被 NPU/GPU 计算芯片厂商提供的运行时算子库进行抽象,不需要开发者不断编写 for 循环执行各种算子操作(如 cuDNN、cuBLAS 等提供卷积、GEMM 等 Kernel 的实现和对应的 API)。 -目前已经直接抽象到 Kernel 对具体算子进行执行这一层所提供的高级 API,似乎已经提升了很多开发效率,那么有几个问题: +目前在编译以及计算架构层已经直接抽象到 Kernel 对具体算子进行执行这一层所提供的高级 API,似乎已经提升了很多开发效率,那么有几个问题: - 为什么还需要 AI 框架(如 PyTorch、MindSpore 等)? - AI 框架在 AI System 中扮演什么角色和提供什么内容? - 用户编写的 Python 代码如何翻译给硬件去执行? -我们继续以上面的例子作为介绍。 +我们继续以上面的例子作为介绍。如果没有 AI 框架,只将算子 for 循环抽象提供算子库(例如,cuDNN)的调用,算法工程师只能通过 NPU/GPU 厂商提供的底层 API 编写神经网络模型。例如,通过 CUDA + cuDNN 库书写卷积神经网络, -### AI 框架层 - -如果没有 AI 框架,只将算子 for 循环抽象提供算子库(例如,cuDNN)的调用,算法工程师只能通过 NPU/GPU 厂商提供的底层 API 编写神经网络模型。例如,通过 CUDA + cuDNN 库书写卷积神经网络,如 [cuDNN 书写的卷积神经网络 LeNet 实例](https://github.com/tbennun/cudnn-training)。因此如图分为不同的步骤和处理流程。 +因此如图自底向上分为不同的步骤和处理流程。后面以 [cuDNN 书写的卷积神经网络 LeNet 实例](https://github.com/tbennun/cudnn-training) 作为简单示例。 ![](images/04Sample05.png) @@ -316,42 +312,11 @@ class LeNet(nn.Module): 4. 调用或生成运行时优化代码,调度算子在指定 NPU 的执行; 6. 并在运行期应用并行算子,提升 NPU 利用率等优化(动态优化)。 -AI 框架帮助开发者解决了很多 AI System 底层问题,隐藏了很多工程的实现细节,但是这些细节和底层实现又是 AI System 工程师比较关注的点。 - -### 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 编译器也采用前端、中间表示和后端分层设计的方式。 - -![](images/04Sample06.png) - -目前,业界主流的芯片公司和大型互联网公司等都在 AI 编译器进行了大量的投入来推进相关技术的发展。与传统编译器相比,AI 编译器是一个领域特定的编译器,有四个明显的特征: - -1. Python 为主前端语言 - -与传统编译器不同,AI 编译器通常不需要 Lexer/Parser,而是基于前端高级编程语言(如 Python)的 AST 将神经网络模型解析并构造为计算图 IR,侧重于保留 shape、layout 等张量计算特征信息,当然部分编译器还能保留控制流的信息。其中 Python 主要是以动态解释器为执行方式。 - -2. 多层 IR 设计 - -多层 IR 设计,为的是满足易用性与高性能这两种类型需求:1)为了让开发者使用方便,AI 框架会尽量对张量的计算进行抽象封装成具体的 API 或者函数,算法开发者只要关注神网络模型定义上的逻辑意义模型和算子;2)在底层算子性能优化时,可以打破算子的边界,从更细粒度的循环调度等维度,结合不同的硬件特点完成优化。 - -3. 面向神经网络优化 - -面向神经网络模型特殊的数据类型进行定义。AI 领域,网络模型层的具体计算被抽象成张量的计算,这就意味着 AI 编译器中主要处理的数据类型也是张量。而在反向传播过程中,是深度学习最为具有有代表的特性,基于计算图构建的网络模型,需要具有自动微分功能。 - -4. DSA 芯片架构支持 - -AI 训练和推理对性能和时延都非常敏感,所以大量使用专用的 AI 加速芯片进行计算,而 AI 编译器其实是以 DSA 架构的 AI 加速芯片作为为中心的编译器,这也是区别于通用编译器的一个特征。 +AI 框架帮助开发者解决了很多 AI System 底层问题,隐藏了很多工程的实现细节,但是这些细节和底层实现又是 AI System 工程师比较关注的点。如果没有 AI 框架、AI 编译器和算子库的支持,算法工程师进行简单的神经网络模型设计与开发都会举步维艰,所以应该看到 AI 算法本身飞速发展的同时,也要看到底层系统对提升整个算法研发的生产力起到了不可或缺的作用。 -如果没有 AI 框架、AI 编译器和算子库的支持,算法工程师进行简单的神经网络模型设计与开发都会举步维艰,所以应该看到 AI 算法本身飞速发展的同时,也要看到底层系统对提升整个算法研发的生产力起到了不可或缺的作用。 ## 小结与讨论 -本节通过 PyTorch 的实例启发大家建立 AI 系统各个章节之间的联系,由于系统的多层抽象造成 AI 实践和算法创新的过程中已经无法感知底层系统的运行机制。希望能够结合后面章节的学习后,看到 AI System 底层的作用和复杂性,从而指导上层 AI 作业、算法、代码更加高效的执行和编写。 +- 由于系统的多层抽象造成 AI 实践和算法创新的过程中已经无法感知底层系统的运行机制。 -请读完后面章节后再回看当前章节,并重新思考当前开发使能层下面的每一层的 AI System 底层发生了什么变化?执行了哪些操作和计算? \ No newline at end of file +- AI 系统底层的作用和复杂性,从而指导上层 AI 作业、算法、代码更加高效的执行和编写。 diff --git a/01Introduction/05Foundation.md b/01Introduction/06Foundation.md similarity index 100% rename from 01Introduction/05Foundation.md rename to 01Introduction/06Foundation.md diff --git a/01Introduction/images/04Sample05.png b/01Introduction/images/04Sample05.png index f0aed3f9..8b8053c9 100644 Binary files a/01Introduction/images/04Sample05.png and b/01Introduction/images/04Sample05.png differ diff --git a/02Hardware/04NVIDIA/05DeepNvlink.md b/02Hardware/04NVIDIA/05DeepNvlink.md index 81d46c38..54f2ed20 100644 --- a/02Hardware/04NVIDIA/05DeepNvlink.md +++ b/02Hardware/04NVIDIA/05DeepNvlink.md @@ -150,7 +150,7 @@ NVLink 协议通过 25 位 CRC 实现了错误检测,确保了数据传输的 ## 小结与思考 -- NVLink 技术的重要性:随着人工智能模型参数量的激增,传统的 PCIe 总线已无法满足 GPU 间及 GPU 与 CPU 间的高速数据传输需求,NVLink 技术通过提供远超 PCIe 的传输速度和低延迟,有效解决了这一瓶颈问题。 +- NVLink 技术的重要性:随着神经网络模型参数量的激增,传统的 PCIe 总线已无法满足 GPU 间及 GPU 与 CPU 间的高速数据传输需求,NVLink 技术通过提供远超 PCIe 的传输速度和低延迟,有效解决了这一瓶颈问题。 - NVLink 的技术细节:NVLink 通过创新的通道设计和高效的数据包结构,实现了高带宽利用率和错误检测能力,其灵活的拓扑结构和对等通信支持,为大规模 GPU 集群的高效协作计算提供了可能。 diff --git a/02Hardware/05Abroad/04TPUIntrol.md b/02Hardware/05Abroad/04TPUIntrol.md index 1777165f..6dac0d63 100644 --- a/02Hardware/05Abroad/04TPUIntrol.md +++ b/02Hardware/05Abroad/04TPUIntrol.md @@ -66,7 +66,7 @@ 在这个 AI 爆发的大时代,谷歌在移动端的 AI 掷下豪赌,对于最新发布的 Tensor G3,谷歌 Silicon 的高级总监 Monika Gupta 是这样评价的:“我们的合作与 Tensor 一直不仅仅局限于追求速度和性能这样的传统评价标准。我们的目标是推动移动计算体验的进步。 -在最新的 Tensor G3 芯片中,我们对每个关键的系统组件都进行了升级,以便更好地支持设备上的生成式人工智能技术。这包括最新型号的 ARM 中央处理器、性能更强的图形处理器、全新的图像信号处理器和图像数字信号处理器,以及我们最新研发的,专门为运行谷歌的人工智能模型而量身打造的 TPU。” +在最新的 Tensor G3 芯片中,我们对每个关键的系统组件都进行了升级,以便更好地支持设备上的生成式人工智能技术。这包括最新型号的 ARM 中央处理器、性能更强的图形处理器、全新的图像信号处理器和图像数字信号处理器,以及我们最新研发的,专门为运行谷歌的神经网络模型而量身打造的 TPU。” ![Alt text](images/04TPUIntro03.png) diff --git a/04Inference/01Inference/01Introduction.md b/04Inference/01Inference/01Introduction.md index 07b9c8d4..ec55e196 100644 --- a/04Inference/01Inference/01Introduction.md +++ b/04Inference/01Inference/01Introduction.md @@ -10,7 +10,7 @@ 在深入探讨推理系统与推理引擎之前,首先需要明确“推理”这一概念。推理,简单来说,就是在利用大量数据训练好模型的结构和参数后,使用小批量数据进行一次前向传播,从而得到模型输出的过程。在此过程中,并不涉及模型梯度和损失的优化。推理的最终目标,便是将训练好的模型部署到实际的生产环境中,使 AI 真正运行起来,服务于日常生活。 -**推理系统**,是一个专门用于部署人工智能模型,执行推理预测任务的人工智能系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。推理系统会加载模型到内存,并进行版本管理,确保新版本能够顺利上线,旧版本能够安全回滚。此外,它还会对输入数据进行批量尺寸(Batch Size)的动态优化,以提高处理效率。通过提供服务接口(如 HTTP、gRPC 等),推理系统使得客户端能够方便地调用模型进行推理预测。同时,推理系统还可以作为一个微服务,在数据中心中与其他微服务协同工作,共同完成复杂的请求处理任务。 +**推理系统**,是一个专门用于部署神经网络模型,执行推理预测任务的人工智能系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。推理系统会加载模型到内存,并进行版本管理,确保新版本能够顺利上线,旧版本能够安全回滚。此外,它还会对输入数据进行批量尺寸(Batch Size)的动态优化,以提高处理效率。通过提供服务接口(如 HTTP、gRPC 等),推理系统使得客户端能够方便地调用模型进行推理预测。同时,推理系统还可以作为一个微服务,在数据中心中与其他微服务协同工作,共同完成复杂的请求处理任务。 **推理引擎**,则是推理系统中的重要组成部分,它主要负责 AI 模型的加载与执行。推理引擎可分为调度与执行两层,聚焦于 Runtime 执行部分和 Kernel 算子内核层,为不同的硬件提供更加高效、快捷的执行引擎。它可以看作是一个基础软件,提供了一组 API,使得开发者能够在特定的加速器平台(如 CPU、GPU 和 TPU)上轻松地进行推理任务。目前市场上已有多种推理引擎,如字节跳动的 LightSeq、Meta AI 的 AITemplate、英伟达的 TensorRT,以及华为的 MindSpore Lite 和腾讯的 NCNN 等。 diff --git a/04Inference/01Inference/02Constraints.md b/04Inference/01Inference/02Constraints.md index 833dc07e..86edfebc 100644 --- a/04Inference/01Inference/02Constraints.md +++ b/04Inference/01Inference/02Constraints.md @@ -2,7 +2,7 @@ # 推理系统介绍 -推理系统是一个专门用于部署人工智能模型,执行推理预测任务的人工智能系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。通过推理系统,可以将神经网络模型部署到云端或者边缘端,并服务和处理用户的请求。因此,推理系统也需要应对模型部署和服务生命周期中遇到的挑战和问题。 +推理系统是一个专门用于部署神经网络模型,执行推理预测任务的人工智能系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。通过推理系统,可以将神经网络模型部署到云端或者边缘端,并服务和处理用户的请求。因此,推理系统也需要应对模型部署和服务生命周期中遇到的挑战和问题。 在本节中,将首先概述训练和推理的基本流程,随后深入分析训练阶段与推理阶段之间的差异。接着,将深入探讨推理系统的优化目标以及面临的挑战。最后,通过比较推理系统与推理引擎的流程结构,将进一步揭示两者在设计和实施时需考虑的关键要素。 @@ -10,7 +10,7 @@ 在日常生活中,深度学习的相关方法已经广泛的部署到各类的应用当中。例如上一节所描述的人脸检测与手势检测应用,它们是通过实时输入摄像头获取的画面,对人脸或人手上的关键点进行检测,然后返回对应关键点位置和类别等相关信息,并通过诸如 OpenCV 等计算机视觉库工具根据返回的关键点位置信息在画面中绘制展示的效果。其中,对于关键点的检测可以通过如 Faster R-CNN、YOLO 等 AI 模型进行输入到输出的映射与转换。 -生活中所接触到的应用人工智能模型的应用,其神经网络模型可以部署在数据中心,接受用户的应用程序或者网页服务的请求,也可以部署在边缘侧移动端的 APP 上或者 IoT(Internet of Things, 物联网)设备中实时响应请求。在后面介绍的推理系统的介绍中,以数据中心的服务端推理系统为主,兼顾边缘侧移动端推理的场景,但是这些策略本身大部分是数据中心与边缘侧都适用的。 +生活中所接触到的应用神经网络模型的应用,其神经网络模型可以部署在数据中心,接受用户的应用程序或者网页服务的请求,也可以部署在边缘侧移动端的 APP 上或者 IoT(Internet of Things, 物联网)设备中实时响应请求。在后面介绍的推理系统的介绍中,以数据中心的服务端推理系统为主,兼顾边缘侧移动端推理的场景,但是这些策略本身大部分是数据中心与边缘侧都适用的。 接下来,先从深度学习训练过程和推理过程对比两者的相同点和不同点,以及在生命周期所处的环节,进而便于理解深度学习推理系统所侧重的目标。 diff --git a/04Inference/01Inference/03Workflow.md b/04Inference/01Inference/03Workflow.md index 661e901b..88d43c7a 100644 --- a/04Inference/01Inference/03Workflow.md +++ b/04Inference/01Inference/03Workflow.md @@ -33,7 +33,7 @@ ### 云侧部署特点与挑战 -云端部署推理系统,即在云端(如云服务器、云平台)上运行的人工智能模型推理服务,相比边缘侧可以达到更高的推理吞吐量。以下详述云端部署态的特点及其带来的挑战: +云端部署推理系统,即在云端(如云服务器、云平台)上运行的神经网络模型推理服务,相比边缘侧可以达到更高的推理吞吐量。以下详述云端部署态的特点及其带来的挑战: 首先来看一下云端部署态的特点: diff --git a/04Inference/02Mobilenet/02CNN.md b/04Inference/02Mobilenet/02CNN.md index b6359bb8..ed3a2741 100644 --- a/04Inference/02Mobilenet/02CNN.md +++ b/04Inference/02Mobilenet/02CNN.md @@ -1,15 +1,215 @@ - + -# CNN 小型化 +# CNN 模型小型化(上) -本节将介绍 xxxx +深度神经网络模型被广泛的应用于工业领域,并取得了巨大成功。然而,由于存储空间以及算力的限制,大而复杂的神经网络模型是难以被应用的。首先由于模型过于庞大,计算参数多(如下图所示),面临内存不足的问题。其次某些场景要求低延迟,或者响应要快。所以,研究小而高效的 CNN 模型至关重要。 + +本章将介绍一些常见的 CNN 小型化结构,如:SqueezeNet 系列(2016),ShuffleNet 系列(2017),MobileNet 系列(2017),ESPNet 系列(2018),FBNet 系列(2018),EfficientNet 系列(2019),GhostNet 系列(2019)。 + +![CNN](./images/02Cnn01.png) + +## SqueezeNet 系列 + +### SqueezeNet + +**SqueezeNet**:是轻量化主干网络中比较著名的,它发表于 ICLR 2017,在达到了 AlexNet 相同的精度的同时,只用了 AlexNet 1/50 的参数量。SqueezeNet 核心贡献在于使用 **Fire Module**(如下图所示),即使用 $1\times 1$ 卷积降低通道数目(squeeze),然后用 $1 \times 1$ 和 $3 \times 3$卷积提升通道数(expand)。 + +![Cnn](./images/02Cnn02.png) + +SqueezeNet 算法的主要目标是构建轻量参数的 CNN 架构,同时不损失精度。为了实现这一目标,作者总共采用了三种策略来设计 CNN 架构,具体如下: + +- **将 $3 \times 3$卷积替换成 $1 \times 1$ 卷积,可以使参数量减少 9 倍**。 + +- **减少 $3\times 3 $卷积的通道数,一个 $3 \times 3 $卷积的计算量是 $3 \times 3 \times M \times N$ ,通过将 M 和 N 减少以降低参数数量**。 + +- **将下采样操作延后,这样卷积层就有了大的激活图,保留更多信息**。 + +在**Fire Module**的基础上搭建 SqueezeNet 神经网络,构如下图所示。它以卷积层开始,后面是 8 个 Fire Module,最后以卷积层结束,每个 Fire Module 中的通道数目逐渐增加,另外网络在 conv1、fire4、fire8、conv10 的后面使用了 最大池化。 + +![Cnn](./images/02cnn/02Cnn03.png) + +### SqueezeNext + +**SqueezeNext**:设计基于残差结构并使用了分离卷积,采用了降低参数的策略: + +- 采用 **two-stage bottleneck modules**来减少权值参数,即采用两个 $1 \times 1$ 的 Conv,使得参数显著减少。 + +- **Low Rank Filters** 低秩分解的核心思想就是将大矩阵分解成多个小矩阵,这里使用 Canonical Polyadic Decomposition,将 KxK 卷积,参数量能从$k^2$降为 2K,在 SqueezeNext 中也加入了 Shortut Connection。 + +![Cnn](./images/02Cnn04.png) + +SqueezeNext 的 block,下图所示 + +- **两个 $1\times 1$ 的 Conv 以减少参数**。 + +- **$3\times 3 $卷积变成 $1\times 3$ 卷积与 $3\times 1$ 卷积的组合**。 + +![Cnn](./images/02Cnn05.png) + +## ShuffleNet 系列 + +### ShuffleNet + +**ShuffleNet**: 发表于 CVPR2018,针对极小的网络上的计算效率依然不高,$1\times 1 $卷积又特别消耗计算资源。它的贡献在于,使用 Point-Wise 分组卷积和 Channel Shuffle 两个操作,在降低计算量同时保持准确率。网络使用更多的通道来帮助编码阶段提取更多的信息,同时又针对小网络提出了 ShuffleNet Unit,要策略如下: + +- **使用 Pointwise Group Convolution 卷积来降低 $1\times 1 $卷积的计算量**。 + +- **使用 Channel Shuffle 让不同通道的进行信息交互**。 + +- **使用 ShuffleNet Unit 来构建小模型**。 + +#### Pointwise Group Convolution 与 Channel Shuffle + +一般采用更稀疏的通道策略来解决 $1\times1$ 卷积带来的计算量问题,比如在 $1\times 1$ 卷积内部也使用分组卷积。但由于 $1\times1$ 卷积的输出会是下一层 block 的输入,当在 $1\times1$ 卷积中使用分组策略,则 $1\times1$ 瓶颈层的输出特征的每个通道并没有接收其他前面的所有输入(如图 a)。为了解决图 a 中的问题,将每个组再细分,细分后放入不同的组内(图 b),这个过程可以叫做 Channel Shuffle,打乱后如图 c 所示。 + +![Cnn](./images/02Cnn06.png) + +#### ShuffleNet单元 + +基于残差块(residual block)和 通道洗牌(channel shuffle)设计的 `ShuffleNet Unit` : + +- **深度卷积 **。 + +- **逐点分组卷积**。 + +- **逐点分组卷积 ( stride=2 )**。 + +![Cnn](./images/02Cnn07.png) + +### ShuffleNet V2 + +**ShuffleNet V2**:在 V1 的 Channel Shuffle 的基础上,又提出了 Channel Split,增强特征的重用性的同时也减少了计算量,并提出了 4 条设计高效网络的方法: + +- **G1:输入输出通道相同的时候,MAC 最小,模型最快**。 + +- **G2:当分组卷积的分组数增大时(保持 FLOPs 不变时),MAC 也会增大,所以建议针对不同的硬件和需求,更好的设计对应的分组数,而非盲目的增加**。 + +- **G3:网络设计的碎片化程度越高,速度越慢**。 + +- **G4:不要过多的使用逐点运算**。 + +ShuffleNet V2 中提出了 Channel Split,如图 c、d 所示。在每个单元的开始将通道拆分为 2 个分支,一个分支做恒等映射,另一个分支经过多层卷积保证输入通道数与输出通道数相同。不同于 ShuffleNet V1 ,ShuffleNet V2 的 1×1 没有再使用分组卷积,两条分支最后使用通道级联 concatenate 操作,没有使用 TensorAdd。 + +![Cnn](./images/02Cnn08.png) + +## MobileNet 系列 + +**MobileNet**系列:主要是为了在保持模型性能的前提下降低模型大小,同时可以提升模型速度,主要有 V1,V2,V3 版本。 + +### MobileNet v1 + +**MobileNet V1**:主要贡献在于提出了 Depthwise Separable Convolutions(深度可分离卷积),深度可分离卷积主要包括两种卷积变体,逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。 + +#### 逐通道卷积(Depthwise Convolution) + +Depthwise Convolution 的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的 feature map 通道数和输入的通道数完全一样,如下图所示: + +![Cnn](./images/02Cnn09.png) + +#### 逐点卷积(Pointwise Convolution) + +Pointwise Convolution 的本质就是 1X1 的卷积,它的卷积核的尺寸为 1×1×M,M 为上一层输出信息的通道数。所以这里 Pointwise Convolution 的每个卷积核会将上一步的特征图在通道方向上进行加权组合,生成新的特征图,如下图所示: +![Cnn](./images/02Cnn10.png) + +#### MBconv模块 + +MBconv 由 Depthwise Convolution,BN,ReLU 组成,基本结构如下图右面所示: + +![Cnn](./images/02Cnn11.png) + +整体网络就是通过不断堆叠 MBconv 组件,这种深度可分离卷积的操作方式在减少计算量的同时保持了模型的表达能力。 + +#### 分别是宽度乘子(α)和分辨率乘子(ρ) + +宽度和分辨率调整系数用于调整模型的大小和计算复杂性。 +- **宽度系数(α):宽度系数是一个介于 0 和 1 之间的比例因子。通过降低每个卷积层的通道数,可以减少模型中的参数数量和计算量,从而使模型更轻量化**。 +- **分辨率系数(ρ):分辨率系数是一个介于 0 和 1 之间的比例因子。通过降低输入图像的分辨率,可以减少卷积操作的计算量和内存消耗**。 + +### MobileNet V2 + +**MobileNet V2**:2018 年在 MobileNet V1 的基础上又提出了改进版本 MobileNet V2,V2 中主要用到了 Inverted Residuals 和 Linear Bottlnecks。 + +#### Inverted Residuals + +在 Inverted Residual block 中,$3 \times 3 $卷积变成 Depthwise 了,计算量更少了,通过 $1\times 1 $卷积先提升通道数,再 Depthwise 3x3 卷积,最后用 1x1 卷积降低通道数。两端的通道数都很小,所以整体计算量并不大。 + +![Cnn](./images/02Cnn12.png) + +#### Linear Bottleneck + +Linear Bottlnecks 上面的 Inverted Residuals block 中的 bottleneck 处的 ReLU 去掉。整体的网络模型就是由堆叠下图右图的 Bottlenecks 搭建成的。 + +![Cnn](./images/02Cnn13.png) + +#### 关于 ReLU6 + +卷积之后通常会接一个 ReLU 非线性激活,在 MobileNet 中使用 ReLU6。ReLU6 在普通的 ReLU 基础上限制最大输出为 6,这是为了在移动端设备 float16/int8 的低精度的时候也能有很好的数值分辨率。如果对 ReLU 的激活范围不加限制,输出范围为 0 到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的 float16/int8 无法很好地精确描述如此大范围的数值,带来精度损失。 + +### MobileNet V3 + +**MobileNetV3**: 整体架构基本沿用了 MobileNetV2 的设计,采用了轻量级的深度可分离卷积和残差块等结构,依然是由多个模块组成,但是每个模块得到了优化和升级。主要贡献点在于: + +- **神经网络搜索技术:由资源受限的 NAS 执行模块级搜索,NetAdapt 执行局部搜索**。 + +- **网络结构改进:将最后一步的平均池化层前移并移除最后一个卷积层,引入 h-swish 激活函数**。 + +#### SE 结构 + +首先使用一个全局池化层将每个通道变成一个具体的数值,然后接两个全连接层,最后通过一个 H-Sigmoid 函数获取最终的权重,赋值给最初的特征图。 + +![Cnn](./images/02Cnn14.png) + +#### 重新设计耗时层结构 + +首先,减少网络第一个卷积层的卷积核个数,从 32 减到 16,然后精简了最后的 Stage,将原来搜索到的最后阶段的人工精简,删除了多余的卷积层,将延迟较少了 7 毫秒,将近全部运行时间的 11%,并减少了 3000 万的乘加操作次数,几乎没有损失准确性。 + +![Cnn](./images/02Cnn15.png) + +#### 重新设计激活函数 + +引入新的非线性激活函数:h-swish。swish 公式: + +$$ +Swish x = x*α(x) +$$ + +这里σ(x)是 sigmoid 函数。swish 虽然提高了精度,但 sigmoid 函数计算是极为昂贵的,在嵌入式移动端不适合它的存在,因此,MobileNet_V3 提出了计算更为简便的 h-swish 函数,其定义如下: + +$$ +h-swish[x] = x\frac{ReLU6(x+3)}{6} +$$ + +#### NAS 搜索全局结构(Block-wise Search) + +采用 NSA 方法来搜寻全局网络结构,另外需要针对轻量模型进行优化,用一个多目标奖励。 + +$$ +{ACC(m)x[LAT(m)/TAR]}^{w} +$$ + +来近似 pareto 最优解,根据目标延迟 TAR 为每个模型 m 平衡模型精度 ACC(m)和延迟 LAT(m)。用较小的权重因子 w =-0.15 来弥补不同的延迟的更大精度变化。从头训练了一个新的架构搜索,找到了初始的 seed 模型,然后应用 NetAdapt 和其他优化来获得最终的 MobilenetV3-Small 模型。 + +#### NetAdapt 搜索层结构(Layer-wise Search) + +$$ +\frac{ΔACC}{ΔLatency} +$$ + +给定一个 K conv and FC layers 的网络 Net,在每一步的结构更改中,需要减少一个给定个值 deltaR,然后调整每层的卷积核数,生成一个 Net_simp 集合,从中找到目标延时的网络。保持循环,直到满足给定条件后 finetune 网络。V3 用了两种减少延迟的方法来产生网络: + +- **减少 expansion layer 的 size**。 + +- **减少所有共享相同 bottleneck size 模块的瓶颈**。 ## 小结与思考 -- XXXX +- SqueezeNet系列,ShuffleNet系列是从人工去设计网络中的重要模块去轻量化模型; -## 本节视频 +- MobileNet系列除了一些轻量化的模块设计,还结合了流行的Nas搜索技术去设计去更轻量化,准确率更高的模型; + - \ No newline at end of file + + +