EP 3812023-06-023:34:03 ROUND 2
Mojo:向 AI 軟體複雜度宣戰
Chris Lattner
Mojo 語言創造者 Chris Lattner 談為什麼要做一個相容 Python、效能逼近 C 的新語言,想解掉 AI 軟硬體太複雜的問題。
Chris Lattner: Future of Programming and AI | Lex Fridman Podcast #381在 YouTube 看 ↗
重點6 條
- 一個能跑得比 C 快的 Python:Mojo 是 Python 的超集,語法相容既有程式碼,卻可以漸進式加入型別,透過編譯、向量化等技巧拿到比原生 Python 快上數萬倍的效能。
- 把複雜度留給函式庫,不留給編譯器:Mojo 刻意不把整數、浮點數這些型別寫死在語言裡,而是讓專家在函式庫層級實作,讓一般使用者和硬體專家都能各自擴充系統。
- 值語意與所有權,資料不會被偷改:借鏡 Rust、Swift 的所有權設計,Mojo 讓陣列、字典這些集合型別在傳遞時表現得像獨立的值,卻不用真的複製資料,減少常見的資料共享錯誤。
- AI 真正的敵人是複雜度,不是哪家晶片:Lattner 認為 AI 產業的問題不在硬體本身,而是模型、框架、晶片三邊各自演化出的複雜生態,讓部署一個模型動輒要花上幾十人、好幾個月。
- 從 Swift 的教訓學會慢慢來:Lattner 談到當年 Swift 倉促上線造成的壓力,這次刻意把 Mojo 定位成剛起步的 0.1 版,寧可晚一點也要把地基打穩。
- 比起末日論,更擔心 AI 能力被壟斷:Lattner 對 AGI 風險保持樂觀,但更在意訓練模型的天價成本會把 AI 能力集中在極少數大公司手上。
時間軸26 段
兩人兩年沒見,Lattner 說 Mojo 的目標是打造一個能跟著硬體一起變形的通用運算平台,讓人不用每次換裝置就重寫程式。
Lattner 認為大括號語言最後也得靠自動排版工具維持一致,既然如此不如直接用縮排定義區塊,少一種語法可以出錯。
Mojo 把 Python 那種執行期才決定行為的動態特性搬到編譯期跑,讓你能寫出動態、好用的 API,卻不用付執行期的效能代價。
與其要工程師背下快取大小、向量長度這些硬體細節,Mojo 讓程式自己試哪種切法最快,找到答案後直接快取起來重複用。
先把直譯器換成編譯器拿到幾倍效能,再拿掉物件標頭與參照計數、改用暫存器與向量指令,一路疊加起來就是巨大的加速。
Mojo 的型別是選配的,可以完全不管它,也可以加了才拿到編譯器的效能與安全檢查,不像 Python 現有型別系統只是提示。
Discord 上一萬多人各自想要不同東西,Lattner 說解法是先公開路線圖、把重心放在修 bug,再照順序把功能一項一項放出來。
傳統做法是每次都做防禦性複製,Mojo 改用參照計數延遲複製,資料真的被改的那一刻才複製,既安全又減少不必要的複製。
像 atomic number、資料庫控制代碼這種不能隨便複製或搬移的型別,Mojo 讓你明確表示要借用還是要拿走所有權。
模型大到塞不進一台機器時,過去得手動把 Python 重寫成 C++ 再切給多台機器跑,這正是 Modular 想幫忙處理的部分。
Lattner 說硬體、模型、部署三個環節各自演化出的複雜生態,像魚看不見水一樣無所不在,讓部署一個模型要花好幾週甚至好幾個月。
過去每出一種新加速器,全世界就得重寫一輪核心運算;現代手機裡好幾種 CPU、GPU、專用晶片要同時運作,也得算出搬資料與運算本身的代價,才能決定丟給哪顆晶片做。
現在的加速器算力足夠,真正拖慢速度的是資料在不同層級記憶體之間搬來搬去,所以 kernel fusion 這類技巧才這麼關鍵。
既有 Python 程式碼原封不動搬進 Mojo 就能拿到十幾倍加速,比起把 CPython 做快 20%,Lattner 說這是完全不同量級的目標。
Lattner 說公開前就先找 Guido 聊過,Guido 最在意的是別重演 Python 2 到 3 那種社群分裂,Mojo 也借用了不少 Swift 過渡 Objective-C 的經驗。
在 Google 做的 Swift for TensorFlow 研究計畫最後沒有成功,最大教訓是機器學習的人都習慣用 Python,逼大家換語言門檻太高。
除了效能帶來的爽感,Lattner 認為真正會推動採用的是它解決了實際痛點,而且可以照自己的步調,從已知的 Python 慢慢加新功能。
Mojo 目前只開放雲端的 playground 給人玩,Lattner 說這是吸取 Swift 當年匆促上線、社群被一堆 bug 搞得又累又氣的教訓。
Python 加 C 混合套件的打包一直是業界痛點,Lattner 認為 Mojo 把兩種語言合而為一,有機會直接解掉這個問題。
def 保留 Python 原本寫法,fn 則要求先宣告變數才能用,多一層編譯器檢查,適合在意可預測性的人。
C++ 的例外處理平時零成本、拋出時卻貴到嚇人,Mojo 把拋錯做得跟正常回傳一樣快,這樣才有辦法在 GPU 這種地方使用。
多數語言等到離開作用域才清掉變數,Mojo 選擇在最後一次用到它之後立刻銷毀,換來更好的記憶體使用與尾端呼叫最佳化。
想挖的人才手上都已經有工作,Lattner 說靠的是先把文化立好、付業界頂尖薪水,再靠遠端優先加上定期實體聚會把團隊黏在一起。
Lattner 說 LLM 擅長把重複、有前例可循的工作自動化掉,但建語言、建產品這種要跟人溝通、理解問題本質的事,還是得靠人。
Lattner 對 AGI 明年就出現不樂觀,也坦言不花時間擔心天網接管一切這種事,真的發生的話他也已經死了。
他更擔心訓練模型的天價成本會把 AI 能力集中在極少數公司手上,也建議年輕人別急著跟主流,去碰別人還沒碰的問題。