前幾天和一個(gè)在英偉達(dá)的老同事兼老同學(xué)一起吃飯時(shí),聊到了許多老同事,很是感慨;我們這些人各有各的成功,共同的是都是在英偉達(dá)GPU計(jì)算這個(gè)平臺(tái)上,在HPC的業(yè)務(wù)上開啟了職業(yè)第一站。回想起2007年底英偉達(dá)第一次發(fā)布了CUDA,今天正好是12年,在中國(guó)的天干地支計(jì)年法中,12年是一個(gè)輪回,中國(guó)的電視劇中往往在輪回之時(shí)回首往事。
我2008年開始使用CUDA做GPU計(jì)算方面的工作,2011年加入英偉達(dá),之后也基本一直從事HPC行業(yè)工作,經(jīng)歷了英偉達(dá)的GPU計(jì)算業(yè)務(wù)幾乎從開始到現(xiàn)在的全過程,我想對(duì)于這個(gè)題目還是有一定發(fā)言權(quán)的。
我把英偉達(dá)GPU計(jì)算的成功總結(jié)為四個(gè)關(guān)鍵要素:戰(zhàn)略前瞻、核心能力構(gòu)建、專注細(xì)分市場(chǎng)和重視生態(tài),每個(gè)關(guān)鍵要求下面包含四五個(gè)小因素。
戰(zhàn)略前瞻,領(lǐng)導(dǎo)決定一切
2008年我剛在中科院過程所讀碩士,第一次接觸到GPU時(shí)很是吃驚,在當(dāng)時(shí)4核CPU只有100GFLOPS計(jì)算能力的時(shí)候,英偉達(dá)的Tesla C1060已經(jīng)過T了,并且推出GPU上的通用計(jì)算編程體系CUDA,相比友商的方案,顯著降低了編程難度。在那個(gè)時(shí)候稍早,在GPU上寫通用計(jì)算程序是要用OpenGL的,找某CPU廠商優(yōu)化應(yīng)用程序性能是要另外花錢的。在相近的價(jià)格下,能夠獲得近一個(gè)數(shù)量級(jí)的性能提升,并且硬件還可以用來(lái)玩高端游戲,這為GPU計(jì)算的擴(kuò)張奠定了硬件基礎(chǔ)。
2008年AMD已經(jīng)推出了16核的CPU,公眾開始意識(shí)到再在單板上堆更多的CPU核心有點(diǎn)不太現(xiàn)實(shí),而通過CPU頻率提升來(lái)進(jìn)一步提升單核性能這條路也難以為繼;在這樣的大形勢(shì)下,英偉達(dá)把之前用于圖形渲染的流水線GPU架構(gòu)更新為統(tǒng)一架構(gòu),讓計(jì)算任務(wù)和圖形渲染任務(wù)使用共同的硬件單元運(yùn)行,對(duì)圖形渲染來(lái)說(shuō)這雖然浪費(fèi)了一些GPU資源,但是他開啟了GPU通用計(jì)算的新時(shí)代,而統(tǒng)一架構(gòu)使得在GPU上面運(yùn)行通用的任務(wù)變得更為容易,可以基于CPU的通用的編譯器和工具鏈技術(shù)發(fā)展GPU技術(shù),之前的知識(shí)和技術(shù)可以相對(duì)比較容易的遷移到GPU上,擴(kuò)大了潛在的開發(fā)者數(shù)量。以后的歷史證明了,英偉達(dá)領(lǐng)導(dǎo)人的戰(zhàn)略眼光。
在大家都意識(shí)到摩爾定理難以為繼的時(shí)候,HPC領(lǐng)域并無(wú)太多潛在選擇,使用新架構(gòu)是一個(gè)可能性,但是量子計(jì)算、生物計(jì)算都新架構(gòu)還遠(yuǎn)未達(dá)到可用水平,當(dāng)時(shí)唯一的選擇只能是異構(gòu)計(jì)算。通過把不同特性的計(jì)算任務(wù)交給不同的硬件執(zhí)行,異構(gòu)計(jì)算能夠獲得遠(yuǎn)高于通用CPU的性能和效率,但是當(dāng)時(shí)對(duì)于異構(gòu)計(jì)算有許多選擇,比如DSP、FPGA以及各種ASIC,它們之間互不兼容,誰(shuí)能夠最終笑傲江湖,依舊是未定之?dāng)?shù)。在NVIDIA 推出CUDA之后,一切就已經(jīng)確定了,CUDA使用C語(yǔ)言擴(kuò)展并行編程,通過共享存儲(chǔ)器來(lái)通信,兩個(gè)層次的并行都方式簡(jiǎn)化了編程,使得本科生也能夠使用CUDA來(lái)寫大規(guī)模高性能計(jì)算程序;AMD的brook++一下子就黯然失色,brook是斯坦福一個(gè)實(shí)驗(yàn)室開發(fā)的,Ian Buck當(dāng)時(shí)正在那里實(shí)習(xí)。brook++是brook的升級(jí)版本,而那時(shí)Ian Buck已經(jīng)在開發(fā)CUDA了,某種意義上說(shuō),CUDA從一個(gè)全新的路徑上揚(yáng)棄了brook,而brook++只對(duì)brook做了修補(bǔ),之后的發(fā)展大家就都知道了。這段歷史告訴我們,拋棄“歷史”可能意味著全新的可能和機(jī)會(huì),當(dāng)然這需要時(shí)機(jī)、領(lǐng)導(dǎo)者的勇氣、決心和擔(dān)當(dāng)。
2012年一代不世出的天才alex 和 其導(dǎo)師Hinton使用CUDA在NVIDIA GPU上編寫了CUDA-CONVNET框架,在ImageNet競(jìng)賽中一鳴驚人,開啟了深度學(xué)習(xí)的全新時(shí)代,英偉達(dá)敏銳的觀察到了其潛在的可能性,開始向世界的互聯(lián)網(wǎng)大企業(yè)推銷GPU,并且專門設(shè)立了互聯(lián)網(wǎng)行業(yè)銷售,我也是在那個(gè)時(shí)候開始關(guān)注BP算法,并且在一年后決定離開英偉達(dá)加入了當(dāng)時(shí)如日中天的百度IDL。加入百度IDL后,著手開發(fā)深度學(xué)習(xí)基礎(chǔ)庫(kù),當(dāng)時(shí)在英偉達(dá)GPU上開發(fā)的深度學(xué)習(xí)基礎(chǔ)計(jì)算,性能遠(yuǎn)超CUDA-CONVNET和Caffe,在此期間和alex在google code上有過討論,其學(xué)術(shù)天才氣質(zhì)讓我自慚形穢;在一次內(nèi)部Hi討論中,我論斷:如果英偉達(dá)在Deep Learning領(lǐng)域做成功,他在深度領(lǐng)域的成就將會(huì)遠(yuǎn)超在傳統(tǒng)HPC領(lǐng)域,當(dāng)時(shí)在那個(gè)群中的朋友依舊活躍在各大公司,但各人成就差距漸大,這是后話了。在向互聯(lián)網(wǎng)公司推銷GPU的同時(shí),英偉達(dá)就開始了其深度學(xué)習(xí)基礎(chǔ)庫(kù)CUDNN的開發(fā),并且在不到一年后推向市場(chǎng)。而我在轉(zhuǎn)正時(shí)決定離開百度IDL,后來(lái)追隨湯曉歐教授創(chuàng)立商湯,走向了另外一段旅程。
在CUDA推出的一段時(shí)間內(nèi),英偉達(dá)的HPC業(yè)務(wù)收入相比其它業(yè)務(wù)還是小頭,但是英偉達(dá)還是為了GPU計(jì)算開發(fā)了一代“熱卡”Fermi,F(xiàn)ermi進(jìn)一步降低了CUDA編程的難度,但是在游戲市場(chǎng)上差點(diǎn)被AMD打敗,F(xiàn)ermi引發(fā)了是否應(yīng)該為計(jì)算單獨(dú)設(shè)計(jì)一個(gè)GPU架構(gòu)的討論。幾年后,當(dāng)我獨(dú)自在各種限制和壓力下事實(shí)上負(fù)責(zé)一個(gè)業(yè)務(wù)的時(shí)候,我意識(shí)到“大黃”的聰明睿智,如果當(dāng)年真的為計(jì)算獨(dú)立設(shè)計(jì)GPU,今天英偉達(dá)的GPU計(jì)算業(yè)務(wù)可能已經(jīng)失敗,離開英偉達(dá)的幾年里,我漸漸深刻的認(rèn)識(shí)到“大黃”是真正的戰(zhàn)略天才,這也漸漸讓我和商湯漸行漸遠(yuǎn),最終分道揚(yáng)鑣。
因?yàn)闃I(yè)務(wù)體量小,英偉達(dá)的GPU計(jì)算還是掛在其它業(yè)務(wù)下面,這潛在的影響了GPU計(jì)算業(yè)務(wù)的發(fā)展,大約在2013年,英偉達(dá)成立了相關(guān)的BU,并且任命 Ian Buck作為負(fù)責(zé)人。Ian Buck是一員猛將加福將,在他負(fù)責(zé)之后,英偉達(dá)的GPU計(jì)算業(yè)務(wù)快速發(fā)展,很快迎來(lái)了深度學(xué)習(xí)時(shí)代。我記得:在潛在負(fù)責(zé)英偉達(dá)的GPU計(jì)算業(yè)務(wù)的候選人中,Ian Buck的職位并不高,但是任命他時(shí),我沒有聽說(shuō)有人質(zhì)疑。這件事教會(huì)我不拘一格降人才的重要性,后來(lái)在我負(fù)責(zé)業(yè)務(wù)時(shí),大力提拔和培養(yǎng)了許多人才,使得我的團(tuán)隊(duì)成為商湯最強(qiáng)團(tuán)隊(duì)之一,而我在負(fù)責(zé)的多個(gè)領(lǐng)域里也建立了自己的聲望。在我離開商湯后,我進(jìn)一步意識(shí)到什么是真正頂尖的人才。
從2008年到2014年,在深度學(xué)習(xí)工業(yè)界大量應(yīng)用之前,GPU計(jì)算給英偉達(dá)帶來(lái)的利潤(rùn)并不高,客戶局限在一些知名大國(guó)企,但是每年的GTC “大黃”都會(huì)花大量的時(shí)間介紹GPU計(jì)算,出了什么新卡和新庫(kù),CUDA新版本有那些特性等等,參會(huì)時(shí)經(jīng)常忘記這是一家賣顯卡的公司。
核心能力構(gòu)建,持續(xù)學(xué)習(xí)
當(dāng)GPU從流水線架構(gòu)轉(zhuǎn)向統(tǒng)一架構(gòu)時(shí),這意味著英偉達(dá)要開始轉(zhuǎn)型了,因?yàn)榱魉€架構(gòu)的GPU只是一個(gè)圖形渲染的“加速器”,而統(tǒng)一架構(gòu)的GPU已經(jīng)可以稱為處理器了,這標(biāo)志著英偉達(dá)從圖形渲染領(lǐng)域進(jìn)入了HPC領(lǐng)域。
HPC業(yè)務(wù)需要的核心能力和GPU圖形渲染所需要的核心能力有非常大的區(qū)別,在英偉達(dá)進(jìn)入HPC領(lǐng)域的時(shí)候,面臨了非常大的核心能力構(gòu)建的挑戰(zhàn);一個(gè)典型的例子就是:早期cublas和cufft的性能一而再再而三的被 HPC 領(lǐng)域人士吊打,但是英偉達(dá)很快就在相關(guān)領(lǐng)域建立了自己的核心能力,之后再也很少有人能夠提出吊打 cublas 和 cufft 的計(jì)算方法了。在被吊打期間,英偉達(dá)負(fù)責(zé)的團(tuán)隊(duì)承受了非常大的壓力,但是英偉達(dá)內(nèi)部并沒有給多的責(zé)備,更多的是提出期望,而基礎(chǔ)庫(kù)團(tuán)隊(duì)也展現(xiàn)出了良好的風(fēng)度,邀請(qǐng)相關(guān)人員去GTC上做講座,去交流,然后把學(xué)習(xí)到的成果更新到基礎(chǔ)庫(kù)中。從這段經(jīng)歷里,我學(xué)習(xí)到了兩個(gè)受用至今并一直堅(jiān)持的核心能力:一個(gè)是學(xué)習(xí)和迭代,另一個(gè)是解決問題而非責(zé)備。我每年至少讀十幾本書,找?guī)资畟€(gè)不同的人聊天,從書和他人身上學(xué)習(xí)好的方面。在帶團(tuán)隊(duì)之后,在下屬?zèng)]有很好的解決問題時(shí),我經(jīng)常說(shuō):我發(fā)怒是因?yàn)槲矣X得你可以做得更好但是你沒有,這是一種期望而非責(zé)備。
在英偉達(dá)核心能力的構(gòu)建過程中,按時(shí)間來(lái)看,主要有兩個(gè)部分:高性能計(jì)算能力和AI算法能力,其構(gòu)建方法基本上是通過調(diào)用優(yōu)秀人才組建初始團(tuán)隊(duì),然后再通過校招和社招補(bǔ)充領(lǐng)域頂尖人才。在具體的對(duì)外成果輸出上面,通過螺旋式提升來(lái)增強(qiáng)競(jìng)爭(zhēng)力,幾個(gè)迭代下來(lái),幾乎變成了業(yè)界最優(yōu)的實(shí)現(xiàn),cublas、cufft、cudnn和今天的許多新庫(kù)基本上都是同樣的方式完成的。在獨(dú)自成軍后,我也基本上借用了這個(gè)邏輯來(lái)創(chuàng)建新的團(tuán)隊(duì),調(diào)集一位有意向、學(xué)習(xí)能力、理解能力很強(qiáng)且具有自我成就感和追求的新人來(lái)負(fù)責(zé),同時(shí)給他配備最優(yōu)秀的新人,通過我的能力和威望讓團(tuán)隊(duì)很快凝聚起來(lái),形成集體建立共同目標(biāo);在產(chǎn)品開發(fā)上,第一版專注于應(yīng)用場(chǎng)景的走通而非數(shù)字指標(biāo),之后再通過數(shù)字指標(biāo)來(lái)引領(lǐng)進(jìn)展,迭代提升。在解決問題的過程,強(qiáng)調(diào)全力追求最好的進(jìn)展而非完美,在一個(gè)挑戰(zhàn)性的課題中,設(shè)計(jì)的越好可能就意味著失敗的可能性越大,因?yàn)樵谶@個(gè)不確定性占主導(dǎo)的時(shí)代絕大多數(shù)時(shí)候沒人清楚的知道最終的結(jié)果全貌,我們只有一個(gè)模糊的形象或認(rèn)知,而我們需要做的是一頭扎進(jìn)去,在這種情況下維納斯才是完美。
專注細(xì)分市場(chǎng),攻敵所不守
在CUDA推出時(shí),高性能計(jì)算市場(chǎng)英特爾基本上一統(tǒng)天下,英偉達(dá)想無(wú)論是渠道、生態(tài)還是技術(shù)都遠(yuǎn)遠(yuǎn)落后,在這種情況下要從Intel嘴里搶肉吃,談何容易,選擇合適的細(xì)分市場(chǎng)和合作伙伴就很重要。孫子兵法所攻其所不守,“大黃”又一次展示了其戰(zhàn)略天賦,很明智的,英偉達(dá)從一個(gè)英特爾不能競(jìng)爭(zhēng)的角度出發(fā),英偉達(dá)說(shuō)用上GPU你的程序就快了多少倍,你買的服務(wù)器就少了多少,你的維護(hù)成本就更低了,這個(gè)邏輯本身并不那么吸引人,因?yàn)榭蛻魶]必要冒險(xiǎn)從一個(gè)已經(jīng)被無(wú)數(shù)人證明的平臺(tái)遷移到另一個(gè)平臺(tái);但是這個(gè)戰(zhàn)略聰明的地方在于:英特爾沒法反擊,因?yàn)橛⑻貭柌荒苷f(shuō)我優(yōu)化一下代碼,你用GPU的相對(duì)速度就沒那么快了,因?yàn)橐坏┛蛻舻某绦蚩炝?,他買的機(jī)器就少了,這相當(dāng)于斷自己的收入?!按簏S”真正實(shí)現(xiàn)了“攻敵所不守”。
“攻敵所不守”并不能保證人們一定會(huì)用GPU計(jì)算,因?yàn)闆]有應(yīng)用,英偉達(dá)沒有一下子就從工業(yè)界出發(fā),而是發(fā)現(xiàn)了從學(xué)術(shù)界出發(fā)的這條路,相比工業(yè)界,學(xué)術(shù)界更愿意試用新技術(shù),畢竟那么多學(xué)生要發(fā)論文畢業(yè)。英偉達(dá)通過多種方式鼓勵(lì)高校和研究所從事CUDA相關(guān)的研究工作,設(shè)立CUDA研發(fā)中心,發(fā)CUDA大師證書,做CUDA技術(shù)認(rèn)證,讓學(xué)術(shù)界為CUDA背書。通過學(xué)術(shù)界為工業(yè)界做預(yù)研,通過學(xué)術(shù)界為工業(yè)界培養(yǎng)人才。
超算是一個(gè)國(guó)家的核心競(jìng)爭(zhēng)力之一,世界主要大國(guó)在這個(gè)領(lǐng)域競(jìng)爭(zhēng)了幾十年,在可見的時(shí)間下依舊會(huì)競(jìng)爭(zhēng)下去,這一領(lǐng)域有幾個(gè)典型的賽場(chǎng):top500和green500,全球的多個(gè)國(guó)家都在這些賽場(chǎng)上展示自己的實(shí)力,而英偉達(dá)GPU超強(qiáng)的計(jì)算能力正好適合這個(gè)賽場(chǎng),英偉達(dá)為各國(guó)的超算中心和國(guó)企在此賽場(chǎng)上的競(jìng)爭(zhēng)提供彈藥。由于對(duì)國(guó)家來(lái)說(shuō),超算是核心競(jìng)爭(zhēng)力,而國(guó)家并不缺乏“小錢”,更不缺乏人才,而在超算賽場(chǎng)上拿到第一對(duì)民眾的自豪感有極大的振奮作用,主導(dǎo)這些競(jìng)賽的個(gè)人也獲得了巨大的政治收益,他們千方百計(jì)的使用各種技術(shù)來(lái)提升超算的競(jìng)爭(zhēng)力,GPU為他們提供了最好的彈藥。英偉達(dá)通過支持各國(guó)的超算中心勇奪第一,既獲得了經(jīng)濟(jì)收益,又作了很好的宣傳。
深度學(xué)習(xí)大火后,英偉達(dá)為互聯(lián)網(wǎng)大公司提供GPU用于深度學(xué)習(xí)訓(xùn)練,這一領(lǐng)域基本上已經(jīng)占據(jù)絕對(duì)優(yōu)勢(shì),并且為英偉達(dá)貢獻(xiàn)了大量收入和近十倍的市值提升。當(dāng)英偉達(dá)意識(shí)到深度學(xué)習(xí)是一個(gè)潛在的大市場(chǎng)并為之大力投入時(shí),其競(jìng)爭(zhēng)對(duì)手幾無(wú)察覺。
重視生態(tài),有所為有所不為
在推出CUDA后,如何建立生態(tài),吸引開發(fā)者使用CUDA決定了英偉達(dá)是否能夠生存下去,英偉達(dá)推出了一系列的措施來(lái)建立生態(tài),其中一些起到?jīng)Q定的性的作用。
在CUDA剛推出的時(shí)候,英偉達(dá)便宜的Geforce游戲卡就支持 CUDA,這一下子把CUDA的入門設(shè)備投入降低到千元級(jí)了,基本上那個(gè)學(xué)校的老師都買得起,完全去掉了設(shè)備這個(gè)限制,提高了開發(fā)者的覆蓋面。一些讀者可能要問:那英偉達(dá)怎么賺錢?答案是英偉達(dá)有企業(yè)級(jí)的Tesla卡,相比Geforce,Tesla為企業(yè)計(jì)算提供了更多支持,而且價(jià)格貴了許多。筆者CUDA開發(fā)的第一塊GPU卡就是 Geforce 系列,后來(lái)在前東家時(shí),決策為集群使用了大量的 Titan 導(dǎo)致英偉達(dá)的同事責(zé)怪,據(jù)稱因?yàn)?Google 和 facebook聽說(shuō)我們?cè)谟?Titan,因此他們也決定用Titan。2017年英偉達(dá)GPU驅(qū)動(dòng)協(xié)議要求不能在數(shù)據(jù)中心使用 Titan,這是一個(gè)很有意思的舉動(dòng)。
通過支持學(xué)生和老師發(fā)論文,英偉達(dá)為CUDA培養(yǎng)了大量的潛在開發(fā)者,而發(fā)論文和開發(fā)者因?yàn)榕d趣學(xué)習(xí)的最大區(qū)別是:發(fā)論文是必須要學(xué),總不能因?yàn)椴粚W(xué)習(xí)而畢不了業(yè),而要畢業(yè)更要讓應(yīng)用的性能足夠好。
英偉達(dá)通過inception計(jì)劃支持創(chuàng)業(yè)公司采用CUDA做項(xiàng)目,進(jìn)入Inception計(jì)劃的項(xiàng)目能夠得到英偉達(dá)的資金和宣傳支持,這對(duì)許多創(chuàng)業(yè)公司來(lái)說(shuō)還是有一定吸引力的。對(duì)于英偉達(dá)來(lái)說(shuō),通過 Inception 項(xiàng)目,他能夠了解世界上最領(lǐng)先的創(chuàng)業(yè)公司在做什么,同時(shí)通過投資等手段把這些創(chuàng)業(yè)公司吸引到自己的生態(tài)中。
英偉達(dá)開源了許多庫(kù),如支持常見并行原語(yǔ)的cub,支持多GPU之間通信的NCCL,英偉達(dá)優(yōu)化的nvcaffe等等,這些庫(kù)降低了各個(gè)領(lǐng)域使用英偉達(dá)GPU開發(fā)應(yīng)用的難度。但是對(duì)于現(xiàn)有行業(yè)成功軟件和中間件,英偉達(dá)基本上沒有推出替代品,英偉達(dá)沒有自己的MPI實(shí)現(xiàn),沒有自己的深度學(xué)習(xí)框架,英偉達(dá)通過開發(fā)能夠優(yōu)化這些中間件的性能的基礎(chǔ)庫(kù)給這些廠商使能,通過這種“多交朋友”的方式,英偉達(dá)擴(kuò)大了生態(tài)觸角;又避免了自己去做的潛在失敗可能,實(shí)際上大企業(yè)進(jìn)入一個(gè)新的領(lǐng)域遇到挫折是常見的,一旦失敗,既被對(duì)方視為敵人又強(qiáng)化了對(duì)方的領(lǐng)域影響力。