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