英伟达GPU计算成功的关键因素(定稿)

前几天和一个在英伟达的老同事兼老同学一起吃饭时,聊到了许多老同事,很是感慨;我们这些人各有各的成功,共同的是都是在英伟达GPU计算这个平台上,在HPC的业务上开启了职业第一站。回想起2007年底英伟达第一次发布了CUDA,今天正好是12年,在中国的天干地支计年法中,12年是一个轮回,中国的电视剧中往往在轮回之时回首往事。

我2008年开始使用CUDA做GPU计算方面的工作,2011年加入英伟达,之后也基本一直从事HPC行业工作,经历了英伟达的GPU计算业务几乎从开始到现在的全过程,我想对于这个题目还是有一定发言权的。

我把英伟达GPU计算的成功总结为四个关键要素:战略前瞻、核心能力构建、专注细分市场和重视生态,每个关键要求下面包含四五个小因素。

战略前瞻,领导决定一切

2008年我刚在中科院过程所读硕士,第一次接触到GPU时很是吃惊,在当时4核CPU只有100GFLOPS计算能力的时候,英伟达的Tesla C1060已经过T了,并且推出GPU上的通用计算编程体系CUDA,相比友商的方案,显著降低了编程难度。在那个时候稍早,在GPU上写通用计算程序是要用OpenGL的,找某CPU厂商优化应用程序性能是要另外花钱的。在相近的价格下,能够获得近一个数量级的性能提升,并且硬件还可以用来玩高端游戏,这为GPU计算的扩张奠定了硬件基础。

2008年AMD已经推出了16核的CPU,公众开始意识到再在单板上堆更多的CPU核心有点不太现实,而通过CPU频率提升来进一步提升单核性能这条路也难以为继;在这样的大形势下,英伟达把之前用于图形渲染的流水线GPU架构更新为统一架构,让计算任务和图形渲染任务使用共同的硬件单元运行,对图形渲染来说这虽然浪费了一些GPU资源,但是他开启了GPU通用计算的新时代,而统一架构使得在GPU上面运行通用的任务变得更为容易,可以基于CPU的通用的编译器和工具链技术发展GPU技术,之前的知识和技术可以相对比较容易的迁移到GPU上,扩大了潜在的开发者数量。以后的历史证明了,英伟达领导人的战略眼光。

在大家都意识到摩尔定理难以为继的时候,HPC领域并无太多潜在选择,使用新架构是一个可能性,但是量子计算、生物计算都新架构还远未达到可用水平,当时唯一的选择只能是异构计算。通过把不同特性的计算任务交给不同的硬件执行,异构计算能够获得远高于通用CPU的性能和效率,但是当时对于异构计算有许多选择,比如DSP、FPGA以及各种ASIC,它们之间互不兼容,谁能够最终笑傲江湖,依旧是未定之数。在NVIDIA 推出CUDA之后,一切就已经确定了,CUDA使用C语言扩展并行编程,通过共享存储器来通信,两个层次的并行都方式简化了编程,使得本科生也能够使用CUDA来写大规模高性能计算程序;AMD的brook++一下子就黯然失色,brook是斯坦福一个实验室开发的,Ian Buck当时正在那里实习。brook++是brook的升级版本,而那时Ian Buck已经在开发CUDA了,某种意义上说,CUDA从一个全新的路径上扬弃了brook,而brook++只对brook做了修补,之后的发展大家就都知道了。这段历史告诉我们,抛弃“历史”可能意味着全新的可能和机会,当然这需要时机、领导者的勇气、决心和担当。

2012年一代不世出的天才alex 和 其导师Hinton使用CUDA在NVIDIA GPU上编写了CUDA-CONVNET框架,在ImageNet竞赛中一鸣惊人,开启了深度学习的全新时代,英伟达敏锐的观察到了其潜在的可能性,开始向世界的互联网大企业推销GPU,并且专门设立了互联网行业销售,我也是在那个时候开始关注BP算法,并且在一年后决定离开英伟达加入了当时如日中天的百度IDL。加入百度IDL后,着手开发深度学习基础库,当时在英伟达GPU上开发的深度学习基础计算,性能远超CUDA-CONVNET和Caffe,在此期间和alex在google code上有过讨论,其学术天才气质让我自惭形秽;在一次内部Hi讨论中,我论断:如果英伟达在Deep Learning领域做成功,他在深度领域的成就将会远超在传统HPC领域,当时在那个群中的朋友依旧活跃在各大公司,但各人成就差距渐大,这是后话了。在向互联网公司推销GPU的同时,英伟达就开始了其深度学习基础库CUDNN的开发,并且在不到一年后推向市场。而我在转正时决定离开百度IDL,后来追随汤晓欧教授创立商汤,走向了另外一段旅程。

在CUDA推出的一段时间内,英伟达的HPC业务收入相比其它业务还是小头,但是英伟达还是为了GPU计算开发了一代“热卡”Fermi,Fermi进一步降低了CUDA编程的难度,但是在游戏市场上差点被AMD打败,Fermi引发了是否应该为计算单独设计一个GPU架构的讨论。几年后,当我独自在各种限制和压力下事实上负责一个业务的时候,我意识到“大黄”的聪明睿智,如果当年真的为计算独立设计GPU,今天英伟达的GPU计算业务可能已经失败,离开英伟达的几年里,我渐渐深刻的认识到“大黄”是真正的战略天才,这也渐渐让我和商汤渐行渐远,最终分道扬镳。

因为业务体量小,英伟达的GPU计算还是挂在其它业务下面,这潜在的影响了GPU计算业务的发展,大约在2013年,英伟达成立了相关的BU,并且任命 Ian Buck作为负责人。Ian Buck是一员猛将加福将,在他负责之后,英伟达的GPU计算业务快速发展,很快迎来了深度学习时代。我记得:在潜在负责英伟达的GPU计算业务的候选人中,Ian Buck的职位并不高,但是任命他时,我没有听说有人质疑。这件事教会我不拘一格降人才的重要性,后来在我负责业务时,大力提拔和培养了许多人才,使得我的团队成为商汤最强团队之一,而我在负责的多个领域里也建立了自己的声望。在我离开商汤后,我进一步意识到什么是真正顶尖的人才。

从2008年到2014年,在深度学习工业界大量应用之前,GPU计算给英伟达带来的利润并不高,客户局限在一些知名大国企,但是每年的GTC “大黄”都会花大量的时间介绍GPU计算,出了什么新卡和新库,CUDA新版本有那些特性等等,参会时经常忘记这是一家卖显卡的公司。

核心能力构建,持续学习

当GPU从流水线架构转向统一架构时,这意味着英伟达要开始转型了,因为流水线架构的GPU只是一个图形渲染的“加速器”,而统一架构的GPU已经可以称为处理器了,这标志着英伟达从图形渲染领域进入了HPC领域。

HPC业务需要的核心能力和GPU图形渲染所需要的核心能力有非常大的区别,在英伟达进入HPC领域的时候,面临了非常大的核心能力构建的挑战;一个典型的例子就是:早期cublas和cufft的性能一而再再而三的被 HPC 领域人士吊打,但是英伟达很快就在相关领域建立了自己的核心能力,之后再也很少有人能够提出吊打 cublas 和 cufft 的计算方法了。在被吊打期间,英伟达负责的团队承受了非常大的压力,但是英伟达内部并没有给多的责备,更多的是提出期望,而基础库团队也展现出了良好的风度,邀请相关人员去GTC上做讲座,去交流,然后把学习到的成果更新到基础库中。从这段经历里,我学习到了两个受用至今并一直坚持的核心能力:一个是学习和迭代,另一个是解决问题而非责备。我每年至少读十几本书,找几十个不同的人聊天,从书和他人身上学习好的方面。在带团队之后,在下属没有很好的解决问题时,我经常说:我发怒是因为我觉得你可以做得更好但是你没有,这是一种期望而非责备。

在英伟达核心能力的构建过程中,按时间来看,主要有两个部分:高性能计算能力和AI算法能力,其构建方法基本上是通过调用优秀人才组建初始团队,然后再通过校招和社招补充领域顶尖人才。在具体的对外成果输出上面,通过螺旋式提升来增强竞争力,几个迭代下来,几乎变成了业界最优的实现,cublas、cufft、cudnn和今天的许多新库基本上都是同样的方式完成的。在独自成军后,我也基本上借用了这个逻辑来创建新的团队,调集一位有意向、学习能力、理解能力很强且具有自我成就感和追求的新人来负责,同时给他配备最优秀的新人,通过我的能力和威望让团队很快凝聚起来,形成集体建立共同目标;在产品开发上,第一版专注于应用场景的走通而非数字指标,之后再通过数字指标来引领进展,迭代提升。在解决问题的过程,强调全力追求最好的进展而非完美,在一个挑战性的课题中,设计的越好可能就意味着失败的可能性越大,因为在这个不确定性占主导的时代绝大多数时候没人清楚的知道最终的结果全貌,我们只有一个模糊的形象或认知,而我们需要做的是一头扎进去,在这种情况下维纳斯才是完美。

专注细分市场,攻敌所不守

在CUDA推出时,高性能计算市场英特尔基本上一统天下,英伟达想无论是渠道、生态还是技术都远远落后,在这种情况下要从Intel嘴里抢肉吃,谈何容易,选择合适的细分市场和合作伙伴就很重要。孙子兵法所攻其所不守,“大黄”又一次展示了其战略天赋,很明智的,英伟达从一个英特尔不能竞争的角度出发,英伟达说用上GPU你的程序就快了多少倍,你买的服务器就少了多少,你的维护成本就更低了,这个逻辑本身并不那么吸引人,因为客户没必要冒险从一个已经被无数人证明的平台迁移到另一个平台;但是这个战略聪明的地方在于:英特尔没法反击,因为英特尔不能说我优化一下代码,你用GPU的相对速度就没那么快了,因为一旦客户的程序快了,他买的机器就少了,这相当于断自己的收入。“大黄”真正实现了“攻敌所不守”。

“攻敌所不守”并不能保证人们一定会用GPU计算,因为没有应用,英伟达没有一下子就从工业界出发,而是发现了从学术界出发的这条路,相比工业界,学术界更愿意试用新技术,毕竟那么多学生要发论文毕业。英伟达通过多种方式鼓励高校和研究所从事CUDA相关的研究工作,设立CUDA研发中心,发CUDA大师证书,做CUDA技术认证,让学术界为CUDA背书。通过学术界为工业界做预研,通过学术界为工业界培养人才。

超算是一个国家的核心竞争力之一,世界主要大国在这个领域竞争了几十年,在可见的时间下依旧会竞争下去,这一领域有几个典型的赛场:top500和green500,全球的多个国家都在这些赛场上展示自己的实力,而英伟达GPU超强的计算能力正好适合这个赛场,英伟达为各国的超算中心和国企在此赛场上的竞争提供弹药。由于对国家来说,超算是核心竞争力,而国家并不缺乏“小钱”,更不缺乏人才,而在超算赛场上拿到第一对民众的自豪感有极大的振奋作用,主导这些竞赛的个人也获得了巨大的政治收益,他们千方百计的使用各种技术来提升超算的竞争力,GPU为他们提供了最好的弹药。英伟达通过支持各国的超算中心勇夺第一,既获得了经济收益,又作了很好的宣传。

深度学习大火后,英伟达为互联网大公司提供GPU用于深度学习训练,这一领域基本上已经占据绝对优势,并且为英伟达贡献了大量收入和近十倍的市值提升。当英伟达意识到深度学习是一个潜在的大市场并为之大力投入时,其竞争对手几无察觉。

重视生态,有所为有所不为

在推出CUDA后,如何建立生态,吸引开发者使用CUDA决定了英伟达是否能够生存下去,英伟达推出了一系列的措施来建立生态,其中一些起到决定的性的作用。

在CUDA刚推出的时候,英伟达便宜的Geforce游戏卡就支持 CUDA,这一下子把CUDA的入门设备投入降低到千元级了,基本上那个学校的老师都买得起,完全去掉了设备这个限制,提高了开发者的覆盖面。一些读者可能要问:那英伟达怎么赚钱?答案是英伟达有企业级的Tesla卡,相比Geforce,Tesla为企业计算提供了更多支持,而且价格贵了许多。笔者CUDA开发的第一块GPU卡就是 Geforce 系列,后来在前东家时,决策为集群使用了大量的 Titan 导致英伟达的同事责怪,据称因为 Google 和 facebook听说我们在用 Titan,因此他们也决定用Titan。2017年英伟达GPU驱动协议要求不能在数据中心使用 Titan,这是一个很有意思的举动。

通过支持学生和老师发论文,英伟达为CUDA培养了大量的潜在开发者,而发论文和开发者因为兴趣学习的最大区别是:发论文是必须要学,总不能因为不学习而毕不了业,而要毕业更要让应用的性能足够好。

英伟达通过inception计划支持创业公司采用CUDA做项目,进入Inception计划的项目能够得到英伟达的资金和宣传支持,这对许多创业公司来说还是有一定吸引力的。对于英伟达来说,通过 Inception 项目,他能够了解世界上最领先的创业公司在做什么,同时通过投资等手段把这些创业公司吸引到自己的生态中。

英伟达开源了许多库,如支持常见并行原语的cub,支持多GPU之间通信的NCCL,英伟达优化的nvcaffe等等,这些库降低了各个领域使用英伟达GPU开发应用的难度。但是对于现有行业成功软件和中间件,英伟达基本上没有推出替代品,英伟达没有自己的MPI实现,没有自己的深度学习框架,英伟达通过开发能够优化这些中间件的性能的基础库给这些厂商使能,通过这种“多交朋友”的方式,英伟达扩大了生态触角;又避免了自己去做的潜在失败可能,实际上大企业进入一个新的领域遇到挫折是常见的,一旦失败,既被对方视为敌人又强化了对方的领域影响力。

编辑于 2019-08-03