不知道大家看沒看《冰雪奇緣2》,反正我看完之後的感覺,就是看兩個公主玩了一百分鐘的塞爾達...沒有任何別的想法...
但有一位清華姚班畢業的大佬 —— 胡淵鳴,在看完之後,試著用 99 行代碼實現了冰雪奇緣裡的特效場景:
是不是很炫酷?
代碼雖然很短,但背後的故事卻很長。今天我們就來看一下,這 99 行代碼背後,橫跨了 20 多年的故事。
胡淵鳴其人
胡淵鳴是一個不折不扣的少年天才,讀高一的時候就已經被保送了清華。
胡淵鳴第一次嘗試編程,大概是小學三年級。當時他的一個堂姐喜歡在家玩《仙劍奇俠傳》,覺得特別有意思。當時他就想,也要做出一個這樣的遊戲來。然後就開始有意識地接觸這方面的書籍。剛好他的父親就是大學信息學教師,幫我買了不少計算機方面的書。
小時候他的父母經常要上課,就把年幼的小胡一個人放在大學研究生工作室裡,裡面都是計算機,一放就是大半天,他就跟著那些研究生一起,看著他們寫程序,一開始看不懂,就是玩。
至於快不快樂,他自己也說不上來。
2013 年胡淵鳴保送進入清華姚班。本科期間,胡淵鳴先後前往東京大學、史丹福大學訪學,並曾於微軟亞洲研究院實習,從事深度學習和計算機圖形學研究。本科便有多篇論文中選 CVPR、SIGGRAPH 等國際頂會。
2017 年,胡淵鳴進入 MIT 讀博。入學 13 個月後,完成碩士論文 ChainQueen,拿到 MIT 碩士學位。博一期間,共發表 6 篇頂會論文。
技術向:99 行代碼的《冰雪奇緣》
做CG 特效一直都是一個燒錢的事情,不然我們看動畫片時也不會總是刷「五毛特效」、「經費在燃燒」這些關鍵詞。
背後的原因一是門檻高,二是對性能有著極高的要求。自己渲染過視頻的人都知道,隨便一個小視頻,哪怕是高配筆記本也要渲染半天。
然而,胡淵鳴開發的這種新的 CG 特效程式語言 Taichi(太極),大大降低了門檻。就像開頭我們提到的,在我們的筆記本上,僅需幾分鐘就能渲染完成一個簡單的物理場景。
Taichi 中的可微分編程,可以通過蠻力的梯度下降有效地優化神經網絡控制器,而不必使用強化學習。10 種可微分模擬器中的大多數模型可以在 2-3 小時內實現,而且大部分不需要 GPU。這些示例中,彈性體、剛體、流體、光線的折射、彈性碰撞,常見物理環境應有盡有。
雖然語法看起來是 Python,其計算部分卻會被一整套編譯系統接管,最後輸出可執行的x86_64或者PTX instructions,能夠在 CPU/GPU 上高效運行。
這麼說大家可能對這個項目的優秀程度沒概念,作者的論文裡幫我們做一個比較:藉助 Taichi 的渲染速度,比 TensorFlow 快 100 多倍、比 PyTorch 快 10 倍。
代碼背後的故事
據胡淵鳴說,他是為了解決計算機圖形學研究對性能的追求以及生產力低下的問題,才決定重新設計程式語言。
本來胡淵鳴想把 Taichi 做成一種單獨的程式語言,但是為了方便大家使用,他用了一句 import taichi as ti 把 Taichi 語言假裝成了 Python。這樣做不僅能使用很多現成的 Python IDE,與 Numpy、MatPlotlib 等工具庫無縫銜接,還降低了學習的門檻。
在他的概念裡,計算機圖形學,和其他科學一樣,應該把"簡單性"作為追求之一。就像如果 MLS-MPM 不能被 88 行代碼實現,求它的導數可能也就不能「只」用120個公式完成,可能也就不會有ChainQueen(可微物理引擎),更不會有ChainQueen啟發的工作(比如DiffTaichi)。
而化繁為簡本身就是科研的意義之一。
但做這件事對胡淵鳴來說,也是一個大膽的決定,因為雖然他之前花了很多時間做 low-level performance engineering,但是真動手寫個編譯器還從沒幹過。
從 2019 年 1 月起,他便一直在做 Taichi programming language,這個結果最終發表在 SIGGRAPH Asia 2019 上。
毫無疑問,Taichi 程式語言的工作量是非常大的。這是一個全新的系統,項目早期要做的設計決策非常多。這給他帶來一正一反兩個結果:
1.設計決策可以只在腦子裡進行,而不需要盯著屏幕。這意味著這個項目總體還是比較「健康」的:代碼寫累了就可以閉眼甚至躺床上想想別的地方怎麼設計。
據胡淵鳴在知乎裡說的,Taichi programming language 的 1/3 是在床上、公交車上完成的。這樣的時間分配一定程度上避免了 Taichi 編譯器的開發損傷他的頸椎和視力。
2.早期設計決策需要隨機應變,決策的交流是非常低效的。人與人之間同語言交流的帶寬比腦內帶寬低好幾個數量級,就像 network bandwidth 和 L1-d$ bandwidth 的差異一樣,於是他只好一路從底層的代碼生成(codegen),到中間表示(IR)和優化(opt),到前端語法,最後到圖標設計,都自己幹了。
但面對這麼大的工作量,有時會「累覺不愛」,但胡淵鳴只要睡一覺起來之後就又會重燃鬥志。這可能就是我們和大之間的差距了 —— 我睡一覺之後,只想再睡個回籠覺...
我們只看到了牛逼閃閃的結果,但背後的艱辛可能只有這些所謂的「天才」自己才知道了。
據胡淵鳴自己說,他有一次連續在家寫了 5 天代碼沒出門,學長都說他身上「長蘑菇」了。
彩蛋花絮
再牛的人,也逃不過真香定律。不知道胡淵鳴還記不記得高一參加完競賽後揚州晚報對他的採訪:
揚州晚報記者:對自己的未來有什麼想法?大學會學什麼專業?胡淵鳴:我父母和我交流過,大學肯定會學計算機相關專業。擺在我面前的其實有兩條路,要麼做研究,要麼做管理。雖然我對編程感興趣,但我不甘心一輩子就做一個程式設計師,包括想在做班長的經理,其實還是想做管理。不過現在當務之急還是把眼前的事情做好。
不知道胡淵鳴老師在體驗到技術的「創世」魅力後,現在還這麼想麼?
胡淵鳴知乎原文:https://zhuanlan.zhihu.com/p/97700605論文地址:https://arxiv.org/abs/1910.00935太極項目地址:https://github.com/yuanming-hu/taichitaichi_mpm項目地址:https://github.com/yuanming-hu/taichi_mpm揚州晚報採訪胡淵鳴:http://news.163.com/10/1206/15/6N7SBAKB00014AED.html