自從5月2日首次亮相以來,Modular公司的Mojo編程語言一直備受開發(fā)人員關(guān)注。已有超過12萬名開發(fā)人員注冊使用Mojo Playground,還有19萬名開發(fā)者積極參與Discord和GitHub的討論。Fast.ai聯(lián)合創(chuàng)始人、數(shù)據(jù)科學(xué)家Jeremy Howard甚至表示:“Mojo可能是近幾十年來最大的編程語言進(jìn)步!
2023年9月7日,Modular公司正式宣布Mojo的發(fā)布,Mojo現(xiàn)在可以在本地下載了,初步支持Linux系統(tǒng),并將很快提供Mac和Windows版本。
Modular公司由LLVM和Swift編程語言的聯(lián)合創(chuàng)始人Chris Lattner創(chuàng)辦,該公司最近剛剛獲得了1億美元(約7億人民幣)的融資。Chris Lattner表示,這一輪融資總額達(dá)到了1.3億美元,這筆資金將用于產(chǎn)品擴(kuò)展、硬件支持以及推動(dòng)自研AI編程語言Mojo的進(jìn)一步發(fā)展。
Mojo Playground提供的僅僅是一套簡單的語言展示,而本地Mojo工具鏈將幫助開發(fā)人員完成更多工作。本地開發(fā)者工具將開放全部Mojo功能,包括一套完整的編譯器功能和IDE工具,使開發(fā)人員能夠輕松構(gòu)建和迭代Mojo應(yīng)用程序。
Mojo是一種面向AI開發(fā)者的新型編程語言。隨著時(shí)間的推移,它將逐步發(fā)展成為Python的超集。Mojo已經(jīng)支持與任何Python代碼的無縫集成,并提供可擴(kuò)展的編程模型以支持各種關(guān)鍵性能系統(tǒng),包括在AI場景中普遍存在的加速器(例如GPU)。
Mojo能夠滿足開發(fā)者的需求,引導(dǎo)他們逐步采用新功能,從而在需要時(shí)獲得高性能的體驗(yàn)。具體來說,Mojo可以為開發(fā)者帶來以下主要收益:
一種語言編寫所有內(nèi)容:Mojo可以隨時(shí)為AI開發(fā)者提供服務(wù),將Python的易用性與以往強(qiáng)制開發(fā)者使用C、C++或CUDA的系統(tǒng)編程功能結(jié)合起來。開發(fā)者可以在公共代碼庫上工作,從而簡化從研究到生產(chǎn)的整個(gè)工作流程。
突破Python性能極限:Python目前已經(jīng)廣泛應(yīng)用,但對(duì)于需要更高性能或特殊硬件的任務(wù),Python的性能往往不盡人意。Mojo能夠充分發(fā)揮CPU的性能潛力,并且很好地支持GPU和ASIC等外部加速器,提供與C++和CUDA相媲美的卓越性能。
與完整的Python生態(tài)系統(tǒng)對(duì)接:Mojo提供與Python生態(tài)系統(tǒng)全面互操作的能力,使其能夠無縫利用Python庫資源,同時(shí)發(fā)揮Mojo自身的功能和性能優(yōu)勢。例如,開發(fā)者可以輕松將NumPy和Matplotlib與自己的Mojo代碼混合使用。
升級(jí)AI工作負(fù)載:Mojo緊密集成了模塊化AI引擎,允許開發(fā)者通過自定義操作輕松擴(kuò)展其AI工作負(fù)載,包括預(yù)處理、后處理操作和高性能數(shù)學(xué)算法。開發(fā)者還可以引入內(nèi)核融合、圖重寫、sharp函數(shù)等。
通過對(duì)現(xiàn)有Python代碼進(jìn)行簡單修改,開發(fā)者可以使用Mojo顯著加速高計(jì)算強(qiáng)度的工作負(fù)載(最高可提速6.8萬倍)。
為什么能比Python快68000倍?
Mojo是Python家族的一員,但它有著遠(yuǎn)大的目標(biāo),即與Python生態(tài)系統(tǒng)完全兼容,以便開發(fā)人員可以繼續(xù)使用他們熟悉的工具。Mojo旨在通過保留Python的動(dòng)態(tài)特性,同時(shí)為系統(tǒng)編程添加新的原語,逐漸演變成為Python的超集。Modular公司的CEO Chris Lattner表示:“我們的目標(biāo)不是使動(dòng)態(tài)Python神奇地變快。雖然我們在動(dòng)態(tài)代碼方面要快得多(因?yàn)槲覀冇芯幾g器而不是解釋器),但這并不是通過‘足夠聰明’的編譯器來消除動(dòng)態(tài)性!
最初,Mojo的目標(biāo)是比Python快35000倍,但最近,Mojo團(tuán)隊(duì)表示,Mojo將動(dòng)態(tài)和靜態(tài)語言的優(yōu)點(diǎn)結(jié)合起來,將性能提高了Python的68000倍。Mojo團(tuán)隊(duì)在一系列博文中介紹了如何將Mojo的性能提高到比Python快68000倍:在第一篇博文中,團(tuán)隊(duì)嘗試將代碼移植為Mojo,獲得了約90倍的性能提升;在第二篇博文中,團(tuán)隊(duì)對(duì)代碼進(jìn)行了矢量化和并行化,進(jìn)一步提高了性能,達(dá)到了2.6萬倍;在第三篇博文中,團(tuán)隊(duì)展示了如何通過新的性能技術(shù)將程序加速目標(biāo)全面超越3.5萬倍。
具體來說,Mojo團(tuán)隊(duì)首先通過簡單的端口將Python程序加速了89倍,然后通過針對(duì)性的優(yōu)化和充分利用現(xiàn)代CPU的算力潛力,將速度提高了2.6萬倍。Mojo團(tuán)隊(duì)提出的并行策略是,每個(gè)CPU核心都應(yīng)負(fù)責(zé)處理同等數(shù)量的代碼行。然而,只有在跨行工作負(fù)載相同時(shí),對(duì)負(fù)載進(jìn)行拆分以確保各個(gè)線程worker獲取其中一組代碼行才具有可行性。但曼德勃羅集并不是這樣。以這種方式進(jìn)行拆分會(huì)引發(fā)負(fù)載不均衡問題,這是因?yàn)槁虏_集中的一個(gè)像素可能在單次迭代后完成,而另一個(gè)像素可能經(jīng)歷多次迭代。也就是說,各個(gè)行的迭代次數(shù)并不相等,會(huì)導(dǎo)致某些線程率先完成計(jì)算的線程處于閑置狀態(tài),不利于充分發(fā)揮性能潛力。
各個(gè)行所執(zhí)行的迭代總數(shù)(以對(duì)數(shù)坐標(biāo)系顯示)并非均勻分布。某些行(例如圖像中央部分的行)可能需要80多萬次迭代,而兩端的行則只需要800次左右迭代。如果硬性為各個(gè)線程分配一定數(shù)量的連續(xù)行,就會(huì)導(dǎo)致全體線程都在等待,直至中間某組代碼行(被分配給某個(gè)核心)完成運(yùn)行。解決這個(gè)問題的方法有很多,但最簡單的當(dāng)然是過度拆分。也就是說,各個(gè)線程所獲得的不是一組平均分配的行,而是建立起一個(gè)工作負(fù)載池,再為每個(gè)行創(chuàng)建相應(yīng)的工作項(xiàng)。各線程則以循環(huán)方式不斷從線程池中拾取這些工作項(xiàng)。
好消息是,Mojo擁有一個(gè)性能出色的并發(fā)運(yùn)行時(shí),所以我們用不著自行創(chuàng)建線程池或者設(shè)計(jì)循環(huán)拾取/執(zhí)行。Mojo的運(yùn)行時(shí)提供了不少高級(jí)功能,可以充分利用這樣的多核心系統(tǒng)。到這里,Mojo團(tuán)隊(duì)獲得了2.3倍于并行版本的加速效果,甚至達(dá)到了矢量化實(shí)現(xiàn)版本的78倍。那么,在每個(gè)行中進(jìn)一步劃分會(huì)不會(huì)讓性能更上一層樓?如果單行很大,那也許可以。但Mojo團(tuán)隊(duì)這個(gè)示例中的最大單行長度也不過4096。另外,同一行內(nèi)的各像素間往往更具相關(guān)性。這時(shí)候更適合采用單指令流多數(shù)據(jù)流(SIMD),避免工作被白白浪費(fèi)在矢量通道中。
回顧整個(gè)旅程,Mojo團(tuán)隊(duì)首先對(duì)Python代碼實(shí)現(xiàn)了2.6萬倍的性能提升,然后使用超額訂閱達(dá)成了提速68847倍的最終成績,并最終實(shí)現(xiàn)了6.8萬倍的Python提速效果。在應(yīng)用超額訂閱之后,性能在之前并行版本的基礎(chǔ)上又提高了1倍。
如何使用Mojo?
目前,開發(fā)者可以將Mojo下載到自己的本地計(jì)算機(jī)上。Modular公司表示,Mojo不僅僅是一個(gè)編譯器,它提供了豐富的工具選項(xiàng),包括:
Mojo驅(qū)動(dòng)程序:提供用于read-eval-print-loop(REPL)的shell,允許開發(fā)者構(gòu)建并運(yùn)行Mojo程序、打包Mojo模塊、生成文檔和格式化代碼。
面向Visual Studio Code(VS Code)的擴(kuò)展:支持各種生產(chǎn)力功能,例如語法高亮顯示、代碼補(bǔ)全等。
Jupyter內(nèi)核:支持構(gòu)建和運(yùn)行Mojo notebook,包括使用Python代碼。
調(diào)試支持(即將推出):進(jìn)入并檢查正在運(yùn)行的Mojo程序,甚至可以將C++與Mojo堆棧幀混合在一起。最初版本的SDK支持x86/Linux系統(tǒng),后續(xù)更新將進(jìn)一步擴(kuò)展到其他操作系統(tǒng)、硬件和工具功能。
Mojo驅(qū)動(dòng)程序允許開發(fā)者像運(yùn)行Python命令一樣在REPL中進(jìn)行編程。此外,Mojo還允許開發(fā)者構(gòu)建靜態(tài)編譯的可執(zhí)行文件,無需任何依賴項(xiàng)即可部署。這個(gè)靜態(tài)編譯的22KB二進(jìn)制文件非常強(qiáng)大,得益于Mojo緊湊的依賴項(xiàng)管理機(jī)制。
對(duì)于全球最流行的IDE之一,Visual Studio Code(VS Code),Mojo已經(jīng)發(fā)布了官方擴(kuò)展,提供語法高亮顯示、診斷和修復(fù)、定義和引用、懸停幫助、格式化、代碼補(bǔ)全等支持。Jupyter內(nèi)核允許開發(fā)者在其中使用Jupyter notebook,提供強(qiáng)大的交互式開發(fā)環(huán)境。此外,Mojo的調(diào)試支持即將推出,將在VS Code中提供交互式調(diào)試體驗(yàn),并能夠混合操作Mojo/C/C++代碼,進(jìn)一步增強(qiáng)開發(fā)者處理高度專業(yè)化代碼的能力。