最近AIGC和LLM的浪潮层层迭起,大有把AI行业过去十年画的饼,一夜之间完全变现的势头。而 AI Infra (构建AI所需的基础设施),也成了讨论的焦点之一。大众对AI Infra的关注点,往往放在AI算力上——比如A100/H100的芯片封锁;比如马斯克又买了一万张GPU,等等。
算力无疑是AI浪潮中至关重要的一环,然而AI Infra并不只与算力相关。冰冻三尺非一日之寒,正如GPT并不是突然的成功一样,AI Infra行业其实也经历了漫长的积累与迭代。笔者最近跟同事、朋友不断地在讨论AI的各种发展,每每聊到AI Infra,心里总会涌出千言万语却又难以言表,于是今天决定动手把想说的都写下来。
如标题所说,整个AI的发展离不开大数据,而大数据的开端,自然是谷歌的三大件:Google File System、MapReduce和BigTable。其中GFS论文发表于2003年,距今刚好整整20年。这20年,也是大数据、AI、互联网发展突飞猛进的20年。
本文试图去梳理这20年间AI Infra的一个个里程碑事件 。因为当我们身处其中时,往往分不清炒作与干货,也看不清局部领先和最终取胜的架构之争。只有当回顾历史,观察长周期的变革时,一些规律才会涌现。话不多说,让我们就此开始!
目录索引
【2003/2004年】【框架】:Google File System & MapReduce
【2005年】【数据】:Amazon Mechanical Turk
【2007年】【算力】:CUDA 1.0
【2012/2014年】【研发工具】:Conda/Jupyter
【小结】
【2012年】【框架】:Spark
【2013/2015/2016年】【框架】:Caffe/Tensorflow/Pytorch
【2014年】【框架/算力/研发工具】:Parameter Server & Production Level Deep learning
【2017年】【算力】:TVM/XLA
【2020年】【数据/算力】:Tesla FSD
【2022年】【数据】:Unreal Engine 5.0
【2022年】【数据/研发工具】:HuggingFace融资1亿美元
【当下】OpenAI有什么AI Infra?
【结语】
【2003/2004年】【框架】:Google File System & MapReduce
2003年谷歌发布的GFS论文,可谓是掀开了这场20年大戏的序幕,宣告人类社会正式进入互联网大数据的时代。一个小插曲是谷歌虽然开放了论文,却没有开源实现,导致后来的Apache Hadoop以「一言难尽」的性能占领了开源生态(也为Spark日后横空出世埋下伏笔),而开源社区爆发式的发展想必也影响了后来谷歌对开源系统的态度。
GFS和MapReduce可以说是开启了分布式计算的时代,同时也在传统单机操作系统、编译器、数据库这些领域之外,让「 Infrastructure 」这个词开始逐步深入人心。关于GFS这里不多说,重点想讨论下 MapReduce的「问题和缺点」 。不知道有没有人在第一次学习MapReduce编程模式后,也跟笔者一样在心里犯嘀咕:这个Map和Reduce是有什么特殊之处嘛?为什么是它们而不是别的接口?为啥一定要用这个范式编程呢?是倒排索引必须用MR才能建么?种种疑问即便是后来通读了Paper也未能完全理解。
而且后来发现,吐槽的还不止笔者一个。2008年,当时还没获得图灵奖的数据库大牛Michael Stonebraker 就撰文狠批《MapReduce: A major step backwards》,还直接点名批评西海岸某学校:“Berkeley has gone so far as to plan on teaching their freshman how to program using the MapReduce framework.” 。而Stonebraker教授主要抨击的点,便是MR缺失了传统数据库的一大堆Feature,尤其是Schema & 高阶SQL语言、Indexing查询加速等等。咱阿里的同学看到这想必心里乐了:“嘿嘿,您老说的这些Feature,咱MaxCompute的湖仓一体/SQL查询/自动加速,现在全都有啦!MR也可以棒棒滴”。
不过这已经是现代了,让我们先回到2004年,看看为什么在没有日后这些高级Feature的情况下,谷歌依然要推出MapReduce并定义了整个开源大数据生态的模式。这里想说是:「 了解成功架构的缺点,才能真正理解其优点到底带来多大的收益,以至于可以抹杀掉所有的不足 」。MapReduce并不见得是一个好的编程范式(后来的发展也证明有各种更好的范式),它让算法实现变得复杂&教条,它只能实现很少一部分算法,它的性能可能比原问题的最优实现差之甚远。但是它在2004年的时候,让普通程序员使用大规模分布式计算变得非常简单!不需要了解Mpi,不需要了解分布式通信同步原理,写完Mapper和Reducer,你就能在上千台服务器的集群上运行程序,关键是还不用担心出现机器故障等等各种异常问题。
归根结底,MapReduce是一个妥协
MR牺牲了灵活性,牺牲了性能,却让用户获得了稳定可靠的分布式计算能力。而各种各样的「妥协」,在后面一代代的AI Infra中,已然就是主旋律。不过我们也能惊喜地看到,随着现代工程技术的发展,在灵活性、性能、稳定性三个维度均得高分的系统比比皆是。当然,新的妥协点依旧会存在,这也是AI Infra或者说Large-Scale Computer System这个领域令人着迷的原因之一。
关于GFS和MR要说的还有最后一点,那便是「 面向Workload的设计 」,谷歌在论文里也说了,整个大数据系统的设计与他们的搜索引擎业务息息相关:文件系统只会Append写而不会删除,读取主要是顺序读而不是随机读,需要MR的任务也以扫库建索引为主。而传统数据库、文件系统对于其他通用需求的支持,必然也导致它们在大数据处理这个任务下,不会是最优解。
好了,读到这有读者可能会问,光一个20年前的GFS你就讲这么多,我关心的GPT在哪里?怎么才能造出GPT?别急,太阳底下无新事,20年前对框架的设计思考,与最新的AI Infra相比未必有什么本质不同。
【2005年】【数据】:Amazon Mechanical Turk
时间来到2005,让我们从系统领域抽出来,看看AMT给世界带来了什么样的惊喜。其实Web1.0刚开始的时候,也是互联网泡沫期嘛,可能跟咱们现在的感觉也差不多,整个社会在一个癫狂的状态。也不知道是谁在亚马逊突发奇想,基于互联网搞了这么个众包平台,但这可乐坏了在学校研究所里依靠学生、人工招募对象来标注数据的老师们。于是乎,Stanford的Fei-Fei Li团队,开始基于AMT来标注了CV有史以来最大的一个Image Classification数据集:ImageNet,并从2010年开始举办比赛,最终在2012年AlexNet技惊四座,引发了第一次深度学习革命。
关于AMT和ImageNet这里想说3个点:
1.事后看关于「数据」方面的历次革命,特点就很明显了,每一次要么是极大地降低了获取数据标注的成本,要么是极大地提高了数据的规模量。正是AMT或者说互联网,让人类第一次可以很方便地,为了研究AI而大规模地获取标注数据。而到了2023年的LLM,大家对这个问题其实也想得很清楚了:『 原来根本不用什么众包平台,每个在互联网上说过话的人,以及之前写过书的古人,其实都是在帮AI标数据 』。
2.很多同学不知道为什么ImageNet有个Net,或者以为ImageNet的Net和AlexNet的Net一样都指神经网络,其实根本不是。这里可以参考ImageNet的原始论文,主要是因为之前有另一个项目WordNet,是类似知识图谱或者大词典的一个工作,将各种范畴和概念都进行了记录和网状关联。ImageNet在WordNet的基础上,选择性地构造了1000类物体类别,对视觉分类任务进行了设计。从现代来看,这叫图文多模态,但其实这是很早就有的一个范式:「 借用NLP的Taxonomy,对CV的分类任务进行定义 」。
3.Fei-Fei Li有很多非常有意思的CV论文,Citation量一般都不高,因为其切入点经常与众不同。另外Fei-Fei Li的高徒Andrej Karpathy想必大家都非常熟悉,虽然AK的论文大家倒是不一定记得(甚至不知道他也在ImageNet的author list里),但AK的博客和Github却是有极高的影响力,从最早的《Hacker's guide to Neural Networks》到最近的nanoGPT,而且AK的博士论文题目就是:《Connecting Images and Natural Language》
【2007年】【算力】:CUDA 1.0
2007年,当游戏玩家们还在纠结买啥显卡能跑孤岛危机时,NVIDIA悄然发布了第一代CUDA。之所以用悄然一词,是因为估计当时没激起什么水花。因为几年后笔者听到做图像处理的师兄对CUDA的评价无一例外都是:「 真难用 」。是啊,毕竟已经被编译器和高级语言惯坏了这么多年了,突然跟你说写个程序还得思考GPU硬件是怎么运行的,还得手动管理高速缓存,稍微一不注意程序反而会变得死慢死慢,谁能喜欢得起来呢?而且更要命的是CUDA的浮点数精度问题。当年笔者第一次用CUDA,兴冲冲写完一个矩阵乘法后,一对比发现,咦?怎么结果差这么多,难道哪里写错了?排查半天无果,毕竟「 用CPU的时候,结果有错从来都是我的错不会是硬件的错 」。后来经同学指点,原来是CUDA的浮点数精度不够,需要用上Kahan Summation.就是下面这段代码:
float kahanSum(vector<float> nums) { float sum = 0.0f; float c = 0.0f; for (auto num : nums) { float y = num - c; float t = sum + y; c = (t - sum) - y; sum = t; } return sum; }
加上后结果就神奇地对了。而如今每天用着V100/A100,然后吐槽NPU/PPU这不好那不能适配的同学可能未必知道,当年CUDA刚推广的时候,也好不到哪里去。尤其在高性能计算领域,由于大客户都是各种跑偏微分方程的科研机构,常年使用科学家们写的上古Fortran代码,而硬件上从来都是CPU双精度浮点数保平安。所以相当长一段时间,CUDA压根不在考虑范围内。Intel在高性能领域也成为绝对的霸主。
另外,在此还要介绍一位曾经被Intel寄予厚望的主角: Xeon Phi。 Xeon Phi芯片最早发布于2010年,就是为了对抗CUDA而研发的众核架构。笔者在13年参加ASC超算比赛时,当年Intel免费赞助了一大批Phi并直接出了一道题让大家试用Phi。大家用完的体感嘛......方便是真方便,毕竟主打的是编译器包办所有事情,原有的高性能分布式代码一行不用改,直接适配众核架构。这也是Intel一直以来做CISC架构CPU和编译器的思路:「 底层实现复杂的指令集,编译器完成所有转译和优化 」,上层用户完全无感,每年付费即可享受摩尔定律的红利(值得一提的是,Intel的Icc高性能编译器和MKL库都是要额外付费的)。可惜的是,Phi的目标和愿景虽然很美好,但它的编译器和众核架构没有做到标称所说的,一键切换后,性能得到极大提升。Phi项目始终没有积累大量用户,也在2020最终关停。
另一方面,CUDA却取得了节节胜利:人们发现,写SIMD模式的高性能应用时,CUDA其实比CPU更好用。原因恰恰是「 编译器做得少 」。写CUDA时,所写即所得,不用再像写CPU高性能应用那样,时常需要编译出汇编码去检查向量化有没有生效、循环展开对不对。由于无法对CPU Cache进行直接管理,更是只能靠经验和实测来了解当前Cache的分配情况。这里也引出一个问题:「 编译器和语言设计一定要满足所有人的需求么? 」想必不是的,找准这个语言的真正用户(高性能工程师)可能才是关键。
而与本文最相关的是,CUDA找到了AI这样一个神奇的客户。说它神奇,因为AI算法真的要让《数值分析》的老师拍案叫绝,让《凸优化》老师吐血。为什么呢?这么大规模的一个数值计算应用,居然说「 精度不重要 」,而且「 全是CUDA最擅长的基本矩阵运算 」。机器学习不需要双精度,直接单精度浮点数搞定,甚至在推理时连单精度都嫌多,半精度、int8、int4都能用。而在优化角度,也是打破了凸优化的所有传统认知:一个非凸优化问题,传统各种算法通通不需要。而且搞全量数据优化反而效果不好,SGD的mini-batch虽然会自带噪音,但噪音反而对训练有益。于是乎,GPU另一个软肋:显存受限,在mini-batch的算法下,也变得不是问题了。
总之,CUDA和GPU似乎就是为AI而生,缺点最终全变成了Feature,也让老黄变成了厨房霸主,核弹之王。而目前集举国之力攻坚自研芯片的我们也不要忘了,CUDA发布这16年以来,除了底层的芯片之外,软件层工具链和用户习惯用户生态是怎样从0到1一步步演进的。GPU未来是不是一定就一家独大?TPU/NPU/PPU会不会弯道超车?让我们静观其变。
【2012/2014年】【研发工具】:Conda/Jupyter
聊完了框架、数据和算力,我们再来看看AI的研发工具是什么情况。而这里不得不讨论的问题便是:为什么AI的主流语言是Python?其实,不只是AI,Python的普及率本来就在逐年上升。开源社区很早就发现为一个项目提供Python接口后,用户使用量会大增,而且大家更倾向于使用Python接口。究其原因,无需编译的动态脚本语言的魅力实在是太大了。在这里无需多言,毕竟大家都知道:
人生苦短,我用Python
而Python的生态本身也在不断的完善,基于Pip的包管理本来就很方便,2012年推出Conda之后,更是让「 虚拟环境管理 」变得极为容易。要知道,对于一个频繁需要复用开源软件包的开发领域,这绝对是一个Killer Feature。
除了包管理,Python的另一大突破便是基于IPython的Jupyter 。它把Python本来就好用的交互功能提升到了新的标杆,并且打造了大家喜闻乐见的Jupyter Notebook。至于说Notebook算不算AI Infra,看看谷歌的Colab,看看目前各种AI开源项目的导引教程、以及咱们自己的PAI-DSW就能知道,Notebook已经是AI研发和知识分享中不可或缺的一环。其隔离后端集群的Web端的研发体验,让用户一站式操控海量算力资源,再也不用只能用Vim或是远程同步代码了。
而对于笔者来说,写Data相关Python实验代码的第一选择也早已不是IDE,而是Jupyter Notebook.原因很简单:处理图像、Dataframe、Json这样的数据,并且需要频繁「 迭代不同的算法策略 」时,「 代码怎么写取决于其内在数据格式和前面的算法结果 」。而数据和算法结果都是在运行时才能看到其具体形式,所以,「 一边运行代码一边写代码 」是数据处理、AI算法工程师的家常便饭。很多不理解这一点的Infra工程师,设计出来的框架或者工具,难免让人一言难尽。后面我们也会看到,在交互性和动态性上开倒车的Tensorflow,用户也在一点点的流失。
【小结】
通过前面这4个板块代表性工作的介绍,我们不难看到AI Infra全貌的雏形:
算力 :需要强大的CPU/GPU为各种数值计算任务提供算力支持,同时编译器需要为高性能工程师提供良好的编程接口。
框架 :针对特定的Workload抽象出一个既有通用性,又满足一定约束的编程范式。使得执行引擎可以一站式提供诸如分布式计算、容灾容错、以及各种运维监控的能力。
研发工具 :AI和数据算法研发期望在代码编写时是能实时交互反馈的;开源社区要求代码和其他生产资料能够被很容易地打包、发布、集成、以及版本管理。
数据 :需要一个提供AI训练所需海量数据的工具或模式。
带着这些思路,其实就很容易能看清后来AI Infra发展的基本脉络了,让我们继续来看看。
【2012年】【框架】:Spark
还是2012年,这一年Berkeley的Matei Zaharia发表了著名的Resilient Distributed Datasets 论文,并且开源了Spark框架。Spark彻底改变了Hadoop生态「慢」和「难用」的问题,借助Scala和Pyspark/Spark SQL的普及,将很多编程语言领域的最新进展引入了大数据开源社区。其实目前来看,RDD是不是In Memory可能都不是最重要的,毕竟大部分Job并不是Iterative的。但是,光是借助Scala interactive shell实现的Spark shell,对于动辄启动任务就要分钟级别的Hadoop,本身就是颠覆性的(想想你告诉一个天天写Java based MR接口的同学,你现在可以在Python命令行里搞大数据计算了是什么感受)。更别提Scala的各种语法糖,以及对海量算子的支持了。
总而言之: Spark 用Scala、Python、SQL语言的极好交互式体验对笨重的Java实现了降维打击,并提供了更优的系统性能。 而人们也看到,只要「 用户体验 」足够好,即便是一个成熟的开源生态也是可以被颠覆的。开源大数据生态也因此进入了百花齐放的阶段。
【2013/2015/2016年】【框架】:Caffe/Tensorflow/Pytorch
2013年,最接近大众认为的AI Infra工作来啦。那就是贾扬清大牛开源的Caffe,自此Deep Learning的门槛被大大降低,通过模型配置文件,就能搭建网络,完成训练,利用GPU的算力。一时间模型创新开启了大爆发时代。其实同一时期开源框架还有Theano,以及基于Lua的Torch,不过使用方式各有差异。随后,大公司纷纷入局,谷歌和FB分别在15和16年发布了Tensorflow和PyTorch,再加上日后Amazon背书的MxNet,以及百度的PaddlePaddle,机器学习框架迎来了百家争鸣的时代。关于机器学习框架可以讨论的点太多了,公开的资料也很多,这里只讨论其中的两个点:
一个是从框架设计方面的「 Symbolic vs. Imperative 」。这个讨论最早可以追溯到MxNet的技术博客 Deep Learning Programming Paradigm 。而MxNet也是最早两种模式均支持的框架,并在博客里点明了:Imperative更灵活易用,Symbolic性能更好。再看看其他框架早期的版本,则专一到其中一种范式:Tensorflow是Symbolic,PyTorch是Imperative。而后面的事情大家也都知道了,Pytorch完整继承了Python语言的优点,一向以灵活、适合科研使用著称;TF则在工程化部署时更友好,但牺牲了交互性。而后经过漫长的迭代,两种范式也基本走向了融合。TF也支持Eager模式,后面还直接推出了新框架Jax;Pytorch也可以把Symbolic Graph进行导出和操作,比如TorchScript、Torch.fx。如同MapReduce是一种妥协,各个机器学习框架也都在「 易用性 」和「 性能 」上做着某种妥协。但整体看,主打Imperative,保持与Python使用习惯吻合的Pytorch还是在用户量上逐渐占据上峰。当然,现在下任何结论都还为时尚早。机器学习框架的发展和迭代远没有结束。
另一个可讨论的点是「 机器学习框架演进和算法演进 」之间的关系,之所以要讨论这个点,是因为很多算法研发团队和工程框架团队习惯于甲方乙方的工作模式。把框架研发和框架升级理解为:算法科学家为了实现某个模型或者想法,发现现有框架无法支持,于是给工程团队提一些关于算子Op实现、新的分布式计算范式、性能优化方面的新需求。这样的模式有很多弊端,比如只能支持局部的小创新,而且创新的周期可能会很长,甚至会出现经常被工程团队吐槽的:「 上一个需求还没实现完,算法侧又换了新想法 」。所以如何打磨好算法团队和工程团队的协作模式,是很重要的课题:比如 Co-Design 的方法论,双方都要换位思考,提前预判技术路径。比如工程团队不能把日常工作变成帮科学家实现功能代码,而是要提供一个灵活的上层接口让科学家自行探索,框架层重点解决卡脖子的工程技术问题。而且最重要的是:双方一定要意识到:「 目前的模型结构和框架实现,可能只是历史演讲过程中的一个偶然 」,而「 模型设计和框架实现,会不断地互相影响着对方的演进路线 」
原因也很简单,在模型创新最前沿,有一个鸡生蛋蛋生鸡的问题:算法科学家只能实现并验证那些现有框架能实现的Idea,而框架支持的功能,往往又都是以往成功过的算法架构或是科学家提出了明确需求的架构。那么 真正的系统级创新如何发生呢 ?可能还真回到了阿里的老话:
因为相信,所以看见
此外,算法与框架的共生关系,近年来也引发了大量的讨论。比如最近讨论比较多的,LLM为什么是Decoder Only架构?还有《The Hardware Lottery》一文里提出的 “ A research idea wins because it is suited to the available software and hardware ”。
总而言之,对于机器学习框架而言,「框架」的意义早已超出了MapReduce/Spark这种大数据框架帮助工程师实现各种Data ETL功能的范畴。因为算法、模型的形态本身就是在变化在革新的,框架如果限制过死,就反而会制约算法的迭代和创新。
【2014年】【框架/算力/研发工具】:Parameter Server & Production Level Deep Learning
开源社区的框架引发了AI的新浪潮,而在互联网大厂的搜推广业务里,大家也开始琢磨,Deep Learning的成功是否能在传统Ctr算法中复现呢?答案是肯定的!基本上所有大厂都开始了相关的研发。这里打个广告,以笔者熟悉的阿里妈妈展示广告业务线为例,从2013年的 MLR ,再到后来的大规模分布式训练框架 XDL ,再到 DIN 和 STAR ,搜推广的同学们应该都非常了解了。开源框架不支持大规模Embedding Table和靠谱的分布式训练,这也让自研的类Parameter Server框架迎来了发展空间。大规模分布式训练的框架也成为了这几年搜推广算法迭代的主要推手。而与上文说的一样,在模型高频迭代,大促提效常态化的背景下,算法创新和框架演进是一个复杂的共生关系,这里也推荐大家看看怀人老师写的 广告推荐技术发展周期 ,完整描述了整个算法架构的演进历程。
另一方面,训练引擎仅仅只是整个搜推广算法工程化的冰山一角。模型推理引擎,实时数据流,ABTest实验平台,容器调度平台等等都需要一整套完整的Infrastrature,这里写得最详细的当然是五福老师的 AI OS综述 。笔者也在下图大致梳理了在工业级机器学习应用中,面临的一些常见问题。
在这里不得不说,搜推广的Ctr模型,由于与互联网业务、营收高度相关,一直是大厂里的技术高地。经过无数人日积月累的不断打磨,可以说是把 y = f(x) 这个学习范式的每个细节都做到了极致,上图的每个小框都值得10+篇技术分享。而在GPT时代LLM、半监督学习范式以及未来前景广阔的AI应用中,阿里在这一块的积累一定可以得到迁移和复用,继续发光发热。
【2017年】【算力】:TVM/XLA
时间到了2017年,TVM和XLA都在这一年发布,而AI编译器这个话题也值得我们单独讨论一下。与机器学习框架主要解决易用性问题不同,AI编译器重点解决的是性能优化、计算芯片最优适配的问题。一般通过对单算子的底层计算代码生成,或是对计算图的重组和融合,来提升模型推理的性能。在芯片断供、自研芯片百花齐放的当下,AI编译器也成了目前AI Infra发展最为迅猛的领域之一。阿里PAI团队的杨军老师也写过关于AI编译器的综述。
既然是编译器,则又会出现我们前文所说的,编译器用户是谁以及接口约定的问题。此外还有通用编译优化 vs. 专有编译优化的问题。比如搜推广业务,由于其模型结构的特殊性,往往就会自建专有编译优化,专门总结出某些优化Pattern以支撑模型迭代带来的海量推理算力需求。而通用的编译优化算法,其实很难将这些特定的Pattern抽象整合到优化规则中去。
另一方面,AI编译器的图优化算法往往对普通算法同学不太友好,原因在于很可能稍微对模型进行一些改动,就会导致原有优化规则无法命中。而无法命中的原因,往往也不会给出提示。这就又回到了前文所说的CPU高性能编译器的问题,虽然编译器看似很强大很通用,可以隐藏硬件细节。但 实际能写出高性能代码的用户,一般还是需要对硬件的底层逻辑有充分的了解 ,并且了解编译器的实现逻辑以进行检查和验证。
所以AI编译器到底是像torch.compile那样帮助小白用户一键提升性能,还是仅作为一个自动化工具,为具备底层认知的高性能模型工程师提高研发效率呢?目前来看两者均有,比如OpenAI也在2021年发布了Triton,可以用Python的语法更加方便地进行类CUDA GPU编程。像Triton这样的工作就是既需要程序员大致了解GPU多线程模型的原理,又大幅降低了入门门槛。而TVM也同样在不断升级,比如可以看看天奇大神写的 《新一代深度学习编译技术变革和展望》 。未来的AI编译器会如何发展,让我们拭目以待!
【2020年】【数据/算力】:Tesla FSD
时间来到21世纪的第三个10年,此时公众感知到的AI领域稍微会有点沉闷。因为上一波AlphaGo带起的RL革命还没有在实际场景中取得大量收益,L4无人驾驶也陷入瓶颈,其他AI之前画的饼都还在纸上。搜推广的工程架构也从3.0做到了4.0再到5.0,6.0,7.0......
正当大家还在思考,AI有什么搞头时,这一年Andrej Karpathy带队的的Tesla突然放了大招,发布了纯视觉架构的Full Self-Driving无人驾驶方案,还直接在随后每年的Tesla AI Day上公布完整的技术方案:BEV感知、数据闭环Data Engine、端上FSD芯片,云端Dojo超大规模训练引擎等。一石激起千层浪,Tesla一下改变了行业的认知,在国内大部分自动驾驶公司的PR稿里,都能看到其影子。
配图来自Tesla AI day
可以说,Tesla把监督学习的工程架构又拔到了一个新高度:大规模的半自动标注引擎、大规模的主动难例数据收集、大规模的分布式训练和模型验证,底层的AI Infra支撑着几十个感知规控模型的持续迭代。
【2022年】【数据】:Unreal Engine 5
时间来到2022年4月,ChatGPT还有8个月到达战场,而这个月UE5正式发布。关注的同学想必都知道,效果那是无比的惊艳:Nanite的超大规模三角面片实时渲染,Lumen的动态全局光照。在官方DEMO《The Matrix Awakens》里我们也能看到现今实时渲染到底能做到什么水平。
配图来自Unreal Engine官网
那UE 5是不是AI Infra呢?答案也是肯定的。首先,基于UE4的各种开源仿真渲染工具比如AirSim,CARLA早就在无人机、无人驾驶上被大规模用来生成训练数据。而在GTA里面训练无人车,在MuJoCo训练小人跑步(MuJoCo已在2021年被Deepmind收购)也都不是新鲜事了。UE5如此革命性的更新,外加整个材质构建、3D模型产线的发展,也必然会让实时渲染仿真的效果一步步逼近真实的物理世界。
恩,DeepMind + MuJoCo + UE5会不会在未来某天放大招?让我们拭目以待。
【2022年】【数据/研发工具】:HuggingFace融资1亿美元
关注AI、GPT的同学最近肯定经常看到这个笑脸,可是Hugging Face到底做了什么,为什么也能成为AI Infra的关键一环并在2022年成功融资一个亿呢?如果你知道OpenCrawl、Pile、Bigscience、Bigcode、PubMed这些项目,那你一定也是在研究LLM训练数据的老兄。而你会惊奇地发现,原来很多语料库数据,都已经被整理好放在Hugging Face上了。他们还整了个Python包,名字就叫Datasets!
不知不觉中,Hugging Face已经成为了AI(至少NLP)领域的Github for Data & Model。看到这里有同学要问了,搞了这么多年AI的人脸识别、搜推广、自动驾驶公司,从来都说数据就是最强壁垒,没听说过谁家会把最珍贵的数据和模型开源放到网上呀。但事情到了LLM、到了GPT这,却发生了本质性的改观。目前多模态大模型使用的这些数据,天然就是存在于互联网上的,本身就是Open的,获取比较容易(版权问题除外)。所以现在的模式变成了大家一点点地帮忙收集、整理数据,最终制作出了大量高质量的原始语料库(比如LAION组织的创始人就是一位 高中老师 )。
其实对于LLM和AGI,未来很可能是这样格局:数据 + 算力 + 算法这个传统AI三要素中,数据由于开源可能反而不是唯一壁垒了,在有芯片硬件的大厂里,最后比拼的就是算法和基于AI Infra打造的迭代速度了!
【当下】:OpenAI有什么AI Infra?
那么,AI Infra对于打造GPT有什么帮助呢?从OpenAI被公开的 架构 来看,上文提到的方方面面基本都有涉及。而在Compute和Software-Engineering两Topic下,也可以看到OpenAI自己发表的大量关于AI Infra的博客。其中很多是在算力-算法Co-Design的方向。比如在2021年初,OpenAI管理的K8S集群达到了7500个节点的规模(4年前是2500节点)。而后在21年7月份开源了前面提到的Trition,一个能用Python语法实现GPU高性能编程的编译器。22年的时候也花很大的篇幅介绍了他们进行大规模分布式训练的技巧。
不难看出,最大限度地让算法研发用上用好海量的算力资源,是OpenAI Infra的头号目的。另一方面,从AI and Compute和AI and Efficiency两篇文章中能看到,OpenAI花了不少精力在分析随着时间的演进,最强模型所需算力的增量曲线,以及由于算法改进而导致的算力效率变化曲线。而类似这样的分析,也在GPT-4的 Predictable scaling 中得到了体现。也就是说,给定训练算法, 所消耗的算力与所能达到的智能程度是可被预测的 。这种「 算力算法Co-Design 」的指标就能很好地去指导算法研发 vs. 工程架构升级的节奏和方向。
除了算力这条线,AI开源社区的进展也是日新月异,想必很多也为GPT的出现做出了贡献。除了Hugging Face,还有很多值得称道的AI创业公司不断涌现,在此笔者还来不及去细细分析各家公司的工作和意义。但变革已然在不断发生,新事物的出现速度已然是以周为单位。
【结语】
最近几个月AI的发展速度,确实远超笔者之前的认知。毫无疑问,AI2.0的时代已经到来,上一代基于纯监督学习的范式已然不够用。AI画的饼大家也都吃进了嘴里,而且真香!作为AI从业者,过去几个月也让笔者心潮澎湃。虽然看完了本文,你还是无法做出GPT,但想必你也看到了AI Infra这20年的发展。无论未来AI算法往哪走, 底层的算力层和底层的系统依然会是算法研发的基石 。
回望这20年的发展,从03年到13年这十年是Web1.0的时代,笔者还是个孩子;13~23年笔者全程目睹了AI1.0和Web2.0的发展浪潮,但更多时候也只是个吃瓜群众。而未来的十年,自然是AI2.0和Web3.0革命性的十年,笔者完全无法想象10年后的今天,世界会是什么样的样子。但唯一确定的是,这一次终于可以完整参与其中,跟志同道合的小伙伴们一起做出能影响行业的事情!
话都说到这里了,不发广告怎么行呢?我们是 高德视觉技术中心的训练工程平台团队 ,负责支持数据闭环、大规模训练、算法服务化等各种算法工程化需求。我们力求在AI2.0时代打造有技术差异性的 端云协同一体AI Infra ,一方面会复用集团和阿里云大量的中间件,一方面会自建很多专用AI工具链。而 高德视觉,目前也成为了集团最大的视觉算法团队之一,支持高精地图、车道级导航、智能出行等多种业务 ,涉及感知识别、视觉定位、三维重建和渲染等多个技术栈。
大家好,又见面了,我是你们的朋友全栈君。一:颜色代码0000000000200000400000600000800000a00000c00000ff0080000080200080400080600080800080a00080c00080ff00ff0000ff2000ff4000ff6000ff8000ffa000ffc000ffffc00000c00020c00040c00060c00080c000a0c000c0c000ffff0000ff0020ff0040ff0060ff0080ff00a0ff00c0ff00ff二:文字加粗倾斜的代码 ◆文字加粗的代码是:<b>你好</b>◆文字倾斜的代码是:<i>你好!</i>◆底线字:<u></u>三: 文字移动的代码是 <marquee>这里写文字</marquee>四:移动图片的代码 <marquee><imgsrc=”http://games.tom.com/images/2002/gamemm/0604/s/36
在前两篇文章中详细给小伙伴们讲解了一下接口自动化需要做哪些准备工作及接口测试场景有哪些,本篇文章是最后一篇,主要分享一下接口自动化测试断言设置思路。如果没有好的断言,自动化用例效果将大大打折扣,甚至是无用的,前期的很多工作都因此浪费。这里我继续结合自身经验,帮助大家梳理一下,希望有所帮助和提升。可以看看这个:https://www.eolink.com/(https://www.eolink.com/?utm_source=w3501tcc)PS:接口自动化测试实践指导(上):接口自动化需要做哪些准备工作接口自动化测试实践指导(中):接口测试场景有哪些1断言设置思路这里总结了我在项目中常用的5种断言方式,基本可能满足90%以上的断言场景,具体参见如下脑图:在这里插入图片描述下面分别解释一下图中的五种思路:1)响应码对于http类接口,有时开发人员只是通过设置接口响应码来反应接口是否成功,这时我们的断言就需要检查接口响应码是否符合预期来判断用例是否执行成功。2)验证关键字段值一般接口中会设有专门的字段来反馈接口成功与否的信息,比如:msg字段,经常好多接口通过该字段反应后台的处理情况,如
MyBatisMyBatis是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它内部封装了JDBC,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建Statement等繁杂的过程。通过XML和注解的方式将要执行的各种Statement配置起来,并通过Java对象和Statement中的动态参数进行映射生成最终执行的Sql语句,最后要MyBatis框架执行SQL并将结果映射为Java对象并返回。MyBatis提供了普通SQL查询、事物、存储过程等功能。复制优点相比于JDBC需要编写的代码更少使用灵活,支持动态SQL提供映射标签,支持对象与数据库的字段关系映射缺点SQL语句依赖数据库,移植性较差SQL语句编写工作量大MyBatis工作流程工作流程旨在要完成MyBatis的初始化工作,具体的做法是第一步要创建一个mybatis-config.xml文件,这个文件中包含了环境配置,全局设置项以及mapper声明这样的核心配置信息,这个mybatis-config.xml文件起到了一个全局配置作用;SqlSe
基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现高内聚低耦合并且高度可配置化,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提供应用管理方便第三方系统接入;同时还集合各种微服务治理功能和监控功能。模块包括:企业级的认证系统、开发平台、应用监控、慢sql监控、统一日志、单点登录、Redis分布式高速缓存、配置中心、分布式任务调度、接口文档、代码生成等等。01—使用方法 02
锚点导航这种功能应该很常见,早之前就分享过移动端移动端导航简单实现,配合起来就很容易实现可移动的锚点导航,而且不是用hash模式。当然,PC端也能直接用。先上效果:为了方便直接用vue语法,首先要给每一个块一个唯一的ref,然后初始化的时候记录每一个块距离顶部的距离和每一个块的高度,并监听滚动:this.$nextTick(()=>{ this.firstOffsetTop=this.$refs[this.currentKey][0].offsetTop; document.addEventListener('scroll',this.onScroll); this.list.forEach((val)=>{ this.itemOffsetTop.push({ key:val.key, num:this.$refs[val.key][0].offsetTop-this.firstOffsetTop, height:this.$refs[val.key][0].clientHeight }); }); });复制最重要的三个方法:onScroll(){ c
什么是LinuxLinux并不是指某一个系统而是指它的“发行版”他与Windows以及MacOS一样是一个习惯性系统,所谓Linux系统仅仅只是所有发行版的统称“Linux系统”在它成千上万种发行版中,至少几百种发行版中所以的发行版都有他的独特性以及差异所在,它与Windows或MacOS相比它所谓得发行版都可以统称为“Linux”系统从技术上讲,Linux只是操作系统的内核。1991年,一个名叫LinusTorvalds的秃头大佬为自己创建了这个内核,然后该项目随着时间的推移变得越来越大。后来(仅几年甚至一年后),人们采用了LinusTorvalds编写的内核,并将其与其他工具结合在一起以创建功能全面的操作系统。如您所知,操作系统不仅仅是内部的内核,这就是我们所说的Linux发行版一个Linux发行版打在了一个完整的Linux内核,它可以为开发人员实现具体目标,如:服务器,电脑系统,移动系统,家庭电子产品等一些了东西!!Linux可以适配Win文件吗Linux可以适配.exe后缀的文件吗?Linux并不能适用.exe后缀的文件,但Linux已经适配了各大厂家的支持软件如:Google
做个小程序需要发送验证码,短信接口是腾讯云的。了解官方的sdk和demo发现对于我这种浅层次的人来说太麻烦了,然后就从网上找了一版.国内短信新购三重礼直达地址:https://cloud.tencent.com/act/cps/redirect?redirect=10541&cps_key=7ec43b056bd01cf6def56afb5da0fabd秒级触达,99%到达率,首次购买短信套餐包限时尊享新人大礼开发准备1.申请SDKAppID以及AppKey: 在开始本教程之前,您需要先获取腾讯云SDKAppID和AppKey,如您尚未申请,请到腾讯云短信控制台 中添加应用。应用添加成功后您将获得SDKAppID以及AppKey。注意: SDKAppID是以14xxxxx开头。2.申请签名: 腾讯云下发短信必须携带签名,您可以在短信控制台 中申请短信签名3.申请模板: 腾讯云下发短信内容必须经过审核,您可以在短信控制台中申请短信模板完成以上三项便可开始代码开发。详情咨询:https://cloud.tencent.com/document/product/382/13613需要
作者:dawu@知道创宇404实验室时间:2019/02/250x00前言这是一篇游戏引发的简单技术文。起因是个人很喜欢玩googleplay上的一些数字类型(角色攻击是线性增长,怪物指数变强,到后期越打不过,通过重生增强属性变强)的小游戏。但是这种游戏仍旧存在一定缺陷,前期资源不多,玩的太慢、玩的时间长了,就感觉没意思,就不想玩了,所以在玩到游戏中期的时候,往往都会去网上搜索XXX破解版/内购版,快速进入后期然后放弃这款游戏。这样的做法其实是很不安全的,因为无法判断XXX破解版/内购版在破解/内购之后还做了什么。所以我最后的解决办法是,逆向这些apk,修改游戏逻辑。让我在玩的时候,可以快速度过缓慢的前期。逆向了几个玩过的游戏,发现这类游戏使用Unity3D开发的居多。因此本文将介绍简单Unity3D类安卓游戏的逆向修改思路。0x01准备工具逆向最简单的Unity3D类安卓游戏建议使用安装好JAVA环境的Windows系统(涉及到dll文件的修改,所以Windows平台更加适合)。1.1安卓APK逆向三件套一般APK逆向,常使用到apktool、dex2jar、jd-gui。在逆向Un
为防止密码泄露与轻易被暴力破解,采用hash等方式已经不再安全,可以采用如彩虹桥类似方式进行破解,推荐采用加盐的方式对密码进行加密机存储packagetest; importjava.security.MessageDigest; importjava.util.UUID; /** *加密 * *@authorxiaochangwei * */ publicclassPasswordEncryptor{ privatefinalstaticString[]hexDigits={"0","1","2","3","4","5", "6","!","#","@","a","b","c","d","*","f","g","F"};
1.简介mv命令用来为文件或目录改名,或将文件或目录移入其它位置。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。mv命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果: (1)如果目标文件是目录,源文件会被移到此目录下,且文件名不变。当目标文件是目录时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标目录中。所有移到该目录下的文件都将保留以前的文件名。 (2)如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv的作用就是改文件名。注意事项:mv与cp的结果不同,mv像是文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。2.命令格式mv[OPTION]...[-T]SOURCEDEST mv[OPTION]...SOURCE...DIRECTORY mv[OPTION]...-tDIRECTORYSOURCE...复制3.选项说明--backup=[备份模式]:若需覆盖文件,则覆盖前先行备份; -b
VR医疗催眠HypnoVR完成70万欧元种子融资 近日,HypnoVR完成了70万欧元的种子轮融资。据悉,HypnoVR是法国斯特拉斯堡的一家VR医疗催眠解决方案开发商,主要面向疼痛管理和压力缓解。此外,HypnoVR将把这笔资金用于产品开发和扩展其销售与营销团队。 VRPinea独家点评:这种VR医疗催眠的原理是什么?并没说清楚。得图8K3D360度摄像机MAX启动Kickstarter众筹日前,得图正式在Kickstarter上启动了众筹项目,为他们最新的360度项目DetuMAX筹集资金。目标金额为2万美元,早鸟价格是2199美元,众筹截至时间是今年7月28日。据悉,得图最新的专业相机DetuMAX可以拍摄12K360度立体视场图片,以及8K立体视场360度视频,同时支持Facebook和YouTube的流式直播。VRPinea独家点评:又多了一款360度专业相机。RichardPlatt推VR平台vSpatial近日,RichardPlatt推出一款VR平台——vSpatial。该平台旨在利用VR技术,使工作人员能够远程交流,以提高工作效率。据悉,RichardPlatt在企业
hiccup(Constant-Current)和Latchoff 限电流保护的两种形式 hiccup:一种是以恒定电流存在,这种一般是可恢复的,当故障解除后自动恢复; Latchoff:一种是锁定关闭,故障解除后也无法恢复,一旦保护后需要重启(比如重置VCC或其他的使能引脚) 一般来讲,日本企业或芯片设计比较喜欢用latch-off Hip-cupmodeprotection 打嗝是个形象化比喻,比如电路遇到间歇性短路故障,电路就要用试探法去看看短路消失没有,于是加一个短输出,一旦短路还在,立即停止输出,过一会再试一次,直到短路消失,其实就是个调制法,比简单的奖品保护要复杂一点,比如自动将保护阈值降低,判断时间缩短,比如前加速保护就是,只要还有以前短路的痕迹,立即取消后面的输出行动,后加速保护就是,一旦感到还是不妥,就在降低一下阈值试探一下,提高灵敏度增强保护,就比如人用较轻的试探冰面是否能走人一样,很复杂,也很实用. Latchoff保护电路设计: https://wenku.baidu.com/view/8f8311727fd5360cba1adb23
干过测试, 有云里雾里的汇编类测试 也有挥洒自如的系统测试 产品进维护期,就转岗了 干过研发: 编码两年,不够成长起来 编码水平维持在零零年代 干过外包: 产品想做好,全靠垒时间 合作方加班也是一把好手 干过SE: 系统化思维弱,做得不深 仅仅是对业务需求做设计 干过产品: 尝试产品设计去牵引功能 尝试数据分析去牵引改进 收效甚微,毕竟体制内嘛 干过蓝军: 对我司产品吐槽并给建议 喜欢在hi上吐槽,有人看 --------------------- 终到缘分的尽头: 要思考未来的路,如何走 看着数百个idea,惆怅啊 除了少数每年写成了专利 其他务虚的就束之高阁了 人嘛,总要有点理想不是 我就挑一个有兴趣的先做 PPT说百遍,不如做个原型 那,就开始为自己编码吧 选中的是idea: 美拍之----玩转猫步 ,http://3ms.huawei.com/km/blogs/details/1204917 “一个点子不值钱,重要的是执行力,但如果点子有问题,那再强的执行力也是徒劳”。 如何判断这个点子靠谱否?就要展开来分析了。 一、产品分析
半年没打开自己的博客了,复赛day1第二题挂了之后信心全崩,感觉整个世界都是黑的,把自己关在家里一个月,每天吃饭睡觉打dota,没出过屋,皮肤都白了,惨白惨白的。 后来慢慢缓过来了,现在正努力地奔向高考的不归路233333(对不起实在忍不住了),不过有些东西,已经成了情怀。 我不知道这会不会是我的最后一篇随笔,或许一个原本一腔热血的青年就这样被生活磨平了棱角,但代码仍在,信念永存。 (谨以上文祭奠吾辈终将逝去,但深刻脑海的青春) 言归正传 划分树,作为一种线段树的变种,在实际应用中——几乎用不到。没错几乎用不到,但是作为线段树的拓展,也作为主席树的基础,在信息学中依然占据了不可或缺的地位。 划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值。 值得注意的是,划分树本身仅支持静态查找而不支持动态修改,想要了解后者的同学们出门右转百度百科主席树,在此不做拓展。 查找整序列的第k大值往往采用。然而此方法会破坏原序列,并且需要O(n)的时间复杂度。抑或使用二叉平衡树进行维护,此方法每次查找时间复杂度仅为O(logn)。然而此方法丢
最小的字符集是ascii字符集,只有128个有效字符,用十六进制表示只是0x00-0x7F.随后由于网络发展,为了跨国家统一使用增大可以表示的字符就用两个字节表示一个字符,有了gb2312范围在[0xA1-0xF7][0xA1-0xFE](中间很多没有填满),它保证所有字节在A0以上,也就在7F以上了。 而另一种编码GBK编码则是完全兼容gb2312(就是说在gb2312字符集中每个字符位置,与gbk字符集里面位置完全一致,而且包含gb2312),但是,它有2万多个字符。从上面看,只能选择往下排序了。就是从A1A0往下排了,我们发现它编码实际范围是:[0x81-0xFE]([0x40-0x7E|0x80-0xFE])(GBK编码),我们发现由2个字节组成,首字节范围在7F之上,而第2个字节,有一部分在0x40-0x7E了。这就是导致bug原因。 而宽字节绕过的前提条件是程序员设置MySQL连接时的错误配置,如下:setcharacter_set_client=gbk,配置会引发编码转换从而导致绕过某些防护实现注入漏洞。具体分析一下原理: 正常情况下GPC开启或者使用addslash
<listBarref="listBar"class="operate-bar":is-show="node.data.isShow":style-obj="listBarStyle"@clickMove="moveOptionsClick($event,data)"@click="listBarClick($event,data,node,'444444444')"/> listBarClick(){ constargus=arguments console.log(argus)复制 返回值, arguments是一个参数集合,里面可以是子组件传过来的参数,也可以是父组件自己的参数复制
嵌入式实时系统的任务设计主要为任务函数的设计、任务优先级的安排、任务的数据结构设计,任务之间的同步与通信设计。 一.任务函数的设计 任务函数按任务结构可分为单次执行任务、周期执行任务和事件触发任务,各任务的主要差异点如下: 单次执行任务:执行完任务后进入休眠状态(一般是从任务调度中删除自己) 周期执行任务:执行完任务后进入等待状态,等待时间为周期时间(当执行周期小于一个时钟节拍或者不是时钟节拍的整数倍时,可设计为定时器中断触发任务) 事件触发任务:等待事件触发后再执行任务 二.任务优先级的安排 任务优先级一般按以下顺序由高到低安排: 中断关联性 紧迫性 关键性 周期性 快捷性 传递性 实际优先级设计应留有余地,以至于将来做功能扩充时不必对原有优先级做大幅度调整。考虑到优先级继承情况,不应将任务的优先级安排得太紧密。 三.任务的数据结构设计 任务的数据结构分为与操作系统有关的数据结构和与操作系统无关的数据结构,与操作系统有关的数据结构可在操作系统配置中进行裁剪,与操作系统无关的数据结构要注意作用域(局部变量还是全局变量) 四.任务之
宝藏 枚举每个点为起点,用一个dfs框架去状态压缩dp #include<bits/stdc++.h> #definefifirst #definesesecond #definepbpush_back #definempmake_pair #defineSZ(x)((int)x.size()) #defineALL(x)x.begin(),x.end() #defineU(i,u)for(registerinti=head[u];i;i=nxt[i]) #definerep(i,a,b)for(registerinti=(a);i<=(b);++i) #defineper(i,a,b)for(registerinti=(a);i>=(b);--i) usingnamespacestd; typedeflongdoubleld; typedeflonglongll; typedefunsignedintui; typedefpair<int,int>PII; typedefvector<int>VI; template<clas
Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手。在Ubuntu中打开终端的快捷键是Ctrl+Alt+T。其他的一些常用的快捷键如下: 快捷键 功能 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ctrl+d 删除当前字符 Ctrl+h 删除当前字符前一个字符 Ctrl+w 删除此处到左边的单词 Ctrl+y 粘贴由Ctrl+u, Ctrl+d, Ctrl+w删除的单词 Ctrl+l 相当于clear,即清屏 Ctrl+r 查找历史命令 Ctrl+b 向回移动光标 Ctrl+f 向前移动光标 Ctrl+t 将光标位置的字符和前一个字符进行位置交换 Ctrl+& 恢复 ctrl+h 或者 ctrl+d 或