欢迎重视我的大众号 [极智视界],获取我的更多经验共享

我们好,我是极智视界,本文来谈谈 AI练习结构的开展,是谈谈AI开展系列的第一篇。

时光斗转星移,AI 飞速开展。

满打满算,我真实进入到 AI 这个职业差不多五年的样子,这段时刻其实是正处于 AI结构 和 AI算法自身快速开展的黄金阶段。也很有幸见证了一些 “古早” 的结构、算法,以及从 “古早” 到 “现代” 快速进化的进程,感慨良多。我决定在这几篇文章中谈谈我这个阶段关于 AI 的一些基础设施,如结构、算力、算法等的考虑、感触 和 主意,作为一种输出,也作为一种记载,或许几年后回过头再来看,会别有一番滋味。

关于练习结构来说,记得我最开端是用 caffe、用 darknet、用 mxnet、用 keras 来进行练习,后面慢慢地仍是和大多的 炼丹师 相同,逐渐收敛到了 pytorch。

把深度学习练习戏称为炼丹,把深度学习算法工程师戏称为炼丹师,其实是十分的形象。我们知道,炼丹术,是我国古代的一种传统技艺,是一种将许多灵材妙药运用丹炉火炼成丹的技能。而深度学习的练习也是一个相似的进程,需求喂许多高质量的数据 (灵丹妙药)、高算力的核算设备 (好的炼丹炉),经过不断调整模型超参 (不同药材的调配),使模型更好地收敛。

不同结构的意图其实都是相同的,都是为了炼出一个在某一范畴/乃至是通用范畴具有很强才能的模型,所以这也导致了同一种算法或许会有多种结构的完成,这从全体的社会资源来说,必定是归于浪费,归于重复造轮子了。比方拿 yolov7 算法来说,我接触过的就有 darknet版的、pytorch版的、tensorflow版的,这仅仅我接触过的,当然必定还会有其他版本的,比方 paddle版的。这看起来就让人比较烦,不论是关于练习的人仍是关于算法布置的人来说,应该都会觉得麻烦。关于练习的人来说,或许你自身现已完成了 pytorch 版本的 yolov7 了,那么你或许哪天还会想,是不是 darknet 对 yolo 的支撑愈加好,或许传闻 paddle 性能不错,要不再试试 paddle 版的 … 而关于做算法布置的人,特别的拿做推理结构的人来说,一个很难的问题便是模型的前端解析,专业点或许叫 Parser。推理结构的前端或许像万花筒那样多,可是不论怎么样,你一般都得支撑吧,那就必需求开发好几个途径的模型转化。尽管早就有了 onnx 这个 “夸姣的理想“,但 onnx 并不是特别的牢靠。而愈加可怕的是,由于有了 onnx,你或许还需求多出来一个履行 onnx 到你的 IR 之间的模型转化。并且往往这是一个多级道路,中心或许会经过多次的模型转化,比方 pytorch -> onnx -> IR、darknet -> onnx -> IR、paddle -> onnx -> IR 等。别的,有些状况下,你或许还会遇到像这种的模型转化:pytorch -> caffe、darknet -> caffe,乃至是 pytorch -> onnx -> caffe 等等。这儿都转到 caffe,是由于 caffe 关于算法布置友好,比方像海思、像昇腾这种,就优先支撑 caffe,意味着你需求从其他结构转到 caffe 来。而说到底,这一切的锅,或许都是来自于练习结构太多了。

那么练习结构为什么这么多呢,为什么就不能一致呢 (用户应该都希望一致吧),来说说我的理解。 AI 结构许多时候其实便是一个公司的产品,乃至是中心产品。拿一流科技来说,他们最中心的产品便是他们的 AI 结构 –oneflow,那么他们必定会不遗余力地去推行他们的产品。所以自身有 AI 结构的公司,或许说专门做 AI 结构的公司,自身必定首要是用他们自己的结构,并且必定也会自带一个生态圈。这部分人中的,觉得自研结构更牛、支撑国产、情怀等,都是表层原因,更多的仍是会回归到商业利益。这种现象便是导致 AI 结构众多的首要原因。

幸亏,现在 AI 练习结构其实也有收敛的大趋势,现在大部分新的算法其实都现已是在用 pytorch 来完成。而现在来说,pytorch 其完成已成为了真实意义上最干流的练习结构了。而这要过去,要说干流的练习结构,必定仍是会提到 tensorflow 和 pytorch,并且 tensorflow 一般都放在前面。

说了这么多,再来一览一下 AI 练习结构的开展历程,我画了个图展现。

极智AI | 谈谈AI发展第一篇:AI训练框架

估量用过 13 年曾经结构的人都 35 了吧,用过 caffe、darknet 的也都 30 多了吧。深度学习练习结构之所以从 2012 年开端开展这么快速,很大的原因来自于 2012 年诞生了 AlexNet,它是第一个在 ImageNet 上取得优异成绩的卷积神经网络,而后的练习结构的规划初衷都是围绕卷积核算。

2020 年其实很有意思,众多的国产练习结构百家争鸣,跟国产芯片热遥相呼应。国产练习结构其实真的还算能够,特别是经过了几年的沉积后。而这其间最有代表性的应该是百度的飞桨 和 一流的 oneflow 了,飞桨的算法仓十分丰厚,特别像 ocr、姿态之类的算法做的很好。而 oneflow 在分布式练习方面优势显着,而这关于 AIGC 大模型来说便是刚需。而关于 mindspore,或许是归于那种华为奋力在推、奋力在建生态,可是不温不火的类型,这跟华为的一系列 AI 产品相似,如 昇腾卡、CANN 东西链 (后面我会专门说说卡 以及 推理相关的)。

练习结构的规划必定是和算法的核算办法休戚相关的。前几年我们都在 “卷” 卷积神经网络 (我们说的卷,或许就来自于卷积神经网络),而现在的 AI 现已变了天,Transformer 现已不仅仅是 “大一统” 了,更有主导 AI 开展的趋势。而从算法自身的核算办法来说,现在盛行的 Transformer 跟 “之前” 盛行的卷积,不同很大。来看看卷积的核算办法,直观来说他便是一个滑窗的操作,然后实践核算会转化为卷积乘进行。

极智AI | 谈谈AI发展第一篇:AI训练框架

在传统的卷积神经网络,卷积的核算量会占网络全体核算量的大部分,一般这个占比会到达 90% 以上,乃至会到达 98% 以上,比方咱们熟知的 ResNet50,它的卷积核算量就占总核算量的 98% 左右;而关于别的一个常用的 backbone 网络 VGG16,则愈加离谱,它的占比到达 99%。根据这种 “数据科学”,只需你对卷积核算优化的足够好,那么你的结构就不至于太差,一直以来都是如此。换句话说,由于卷积实践中会转化为矩阵乘,所以也能够说,只需你对稠密的矩阵乘优化的足够好,那么你的结构就不至于太差。这个理论既适用于练习结构也适用于推理结构,别的关于AI算力芯片亦是如此,并且关于芯片来说,这个遗留病会愈加苦楚 (后面文章再说)。

毫无疑问,这种理论契合一切以卷积神经网络为基础的 AI 时代,但问题是,现在的 AI 仍是 卷积神经网络的 AI 吗,这儿或许需求打个问号。有同学或许会疑问,难道 Transformer 就没有许多矩阵乘了吗。Transformer 的确仍是存在许多的矩阵核算,比方注意力机制中 Q、K、V 之间的矩阵乘、比方 Transformer block 中 mlp 中的矩阵乘等。有数据统计,在 Transformer 中,输入序列长度为 128 时,矩阵核算的占比约为 75%。能够看到,矩阵核算的占比尽管比较卷积神经网络的状况有些下降,但仍然仍是首要的。那么问题在哪呢?问题就在于卷积神经网络是稠密的矩阵核算,而 Transformer 中穿插着许多的访存算子,让稠密不再稠密,如 reshape 之类的,或许做的工作从头排布一下数据 Layout,并没有真实需求履行核算。这就会导致在 Transformer 中,尽管矩阵核算的核算量仍是占首要的,可是又由于自身对矩阵乘现已优化的足够好了,导致矩阵核算的实践履行开支或许还不如核算量占少部分的访存型算子的核算开支,这便是一个很大的问题。

从这个视点来说,当卷积神经网络不再是主导,当 Transformer 展露头角的状况下,AI 结构必定需求做出一些相应的调整,这种调整在当下最直接来说便是关于 Transformer 的核算优化。从只需求 “照顾好” 核算密集型网络到要 “兼顾好” 访存密集型网络的过渡,必定是个苦楚的进程。这个进程要是没做好,必定就会加快被时代筛选。能够预见的是,比方不再保护的 caffe、比方 darknet,在练习范畴应该会首先就被筛选了。关于caffe 来说,不保护必定是首要原因了。别的还有一个重要的原因是,caffe 的规划关于 AIGC 大模型存在天然的缺陷,caffe 选用 google 的 protobuf 作为其模型 IR 的技能栈,而 protobuf 有一个约束是不能超过 2G,这是由于 protobuf 中有许多完成选用 32 位有符号数据表达。这个状况相同能够扩展到 onnx,onnx 的架构最初是由 caffe 的作者贾扬清规划,相同沿用了 caffe 的技能,也便是也用了 protobuf 来规划 onnx 的 IR,尽管现在有办法能够让 onnx 绕开 2 GB 的约束,可是天然生成的缺陷始终是存在的。关于 darknet 来说,darknet 的盛行首要是由于 yolo,如果未来 transformer-base 的目标检测算法能够在精度、速度上完胜 yolo 系列,那么 darknet 就没有存在的必要了,更何况现在许多的新 yolo 算法其实都现已是根据 pytorch 来进行开放了。

从只需求 “照顾好” 核算密集型网络到要 “兼顾好” 访存密集型网络的过渡,关于经营了几年的成熟的练习结构来说,不太或许从架构上推倒重来。那么要去习惯这种时代开展,或许会有几种做法,基本便是在原有大结构的基础上做一些针对性的优化,当然很显着,这些优化必定意图在减少访存的开支。

  • 算子转化 => 比方视觉 Transformer 中的图片打 patch,从数学上来说 或许 说从python单纯的核算视点来说,便是一个索引切片的进程。而咱们一般用结构去做的话,就会把这个进程用一个卷积核和步长持平的卷积来做,这样简单、明晰 又 高效;
  • 算子交融 => 把访存型算子和核算型算子经过数学核算先交融在一起,转化为矩阵核算。这个技巧在英伟达供给的 FasterTransformer 中,还有如 地平线的开工开物东西链中 广泛运用;
  • KV Cache 优化 => 经过空间换时刻思维,进步推理性能。KV Cache 优化的思维便是缓存当前轮可重复使用的核算结果,下一轮核算时直接读取缓存结果。这个技能现已在 pytorch 中运用;
  • 等等;

能够看到,仍是有挺多的办法能够让现代的练习结构来习惯 Transformer 的核算特性。但这种 “习惯” 和 当年专门为卷积神经网络来打造,待遇方面不可同日而语。没办法,前史原因让你没办法推倒重建,在原始大结构的基础上去习惯新特性、去增加新特性是目前不得已 却又 现实的方案。能够预见的未来,练习结构会由于 “新” 的网络,而变得越来越臃肿。就跟 C++ 相同 …

好了,以上共享了 谈谈AI开展第一篇:AI练习结构。希望我的共享能对你的学习有一点帮助。


后面几篇的预告:

  • 谈谈AI开展第二篇:AI推理结构
  • 谈谈AI开展第三篇:AI练习算力
  • 谈谈AI开展第四篇:AI推理算力
  • 谈谈AI开展第五篇:AI编译结构


极智AI | 谈谈AI发展第一篇:AI训练框架