清華畢業生開發新特效程式語言:99 行代碼背後 20 多年的故事……

2020-12-11 SegmentFault思否

不知道大家看沒看《冰雪奇緣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

相關焦點

  • 高一保送清華,博一6篇Paper!用99行代碼實現《冰雪奇緣》
    說到這裡小夥伴們應該反應過來了,嗷~就是那位開發了新的特效程式語言,用99行代碼來實現魔法世界的學霸吧?沒錯~這位學霸就是畢業於清華大學姚班,目前是麻省理工學院CSAIL( 計算機科學與人工智慧實驗室)博士生的胡淵鳴,愛好圖形設計、動畫電影,在基於物理的模擬器中創建和銷毀一切東西。你們感受到那種撲面而來的霸道真氣了嗎?
  • 用文言文來編程?99行代碼就可以實現冰雪魔法?
    而就是這樣令人頭疼的文言文,一位華人計算機人才Huang Lingdong將文言文和編程結合起來,開發了基於文言文的程式語言。他利用NLP的一些技術,將文言文程序語法轉換到 JavaScript 或 Python 運行,讓程序語言遵循文言文的語法。項目問世幾日即獲贊 2.2K,還得到了很多人的微博轉發。
  • 他高一被保送清華,因開發物理程式語言,獲北大教授陳寶權怒贊
    原因是他開發了物理模擬程式語言Taichi,用99行代碼實現了介質模擬器,從而實現了《冰雪奇緣》的特效。要知道,當初《冰雪奇緣》電影中的特效每一秒都需要耗費大量時間和金錢。據悉,當時艾莎施展魔法的特效鏡頭,儘管只呈現一秒鐘,但卻需要高性能計算機運算一周的時間,花費也相當驚人。雖然沒有真人出演,但是這部動畫電影仍花費了約10億人民幣。
  • 百行代碼變十行,蘋果SwiftUI可視化編程讓開發者驚嘆完美
    而對於開發者來說,新發布的 SwiftUI 可能是最吸引人的特性,在 Craig Federighi 的演示中,我們可以輕鬆地把一百行的前端代碼縮減到十幾行。Swift 是蘋果於 2014 年發布的全新開發語言,可與 Objective-C* 共同運行於 macOS 和 iOS 平臺,用於搭建基於蘋果平臺的應用程式。
  • 沒有代碼的程式語言:Folders
    之前我們介紹過「Whitespace」程式語言,這是一種很奇葩的程式語言,在「Whitespace」程式語言中,任何
  • 少兒編程是剛需還是噱頭?每次課399元學完一年寫六七百行代碼
    2017年9月20日訊,「在中小學階段設置人工智慧相關課程,逐步推廣編程教育,鼓勵社會力量參與寓教於樂的編程教學軟體、遊戲的開發和推廣。」日前,國務院印發《新一代人工智慧發展規劃》,讓少兒編程走入公眾視野。面對培訓機構打出的「不懂編程就是新時代文盲」「編程即將成為下一個奧數」等口號,許多身為「門外漢」的父母又多了幾分迷茫和焦慮。
  • 程式語言入門書推薦 [ NEW!]
    根據TIOBE 程式語言排行榜前20的語言分享相關圖書
  • 效率提升30倍 無代碼開發讓「小白」也能編程
    一般認為,程序就是軟體代碼,它是由常被戲稱為「程序猿」的編程人員,利用開發工具所支持的語言,編寫出來的源文件。軟體代碼通常是一組有序的數字或字母,它們是代表客觀實體及其屬性的符號。一個軟體的生成,首先要從軟體的設計需求出發,然後進行軟體功能設計,制定軟體系統整體架構、劃分功能模塊、確定各模塊的實現算法,再通過編寫具體的代碼,最終形成相應的軟體。
  • 為什麼 Facebook 發明新語言「Hack」
    這篇文章將會告訴背後的故事。By Steven Melendez這個故事來自Facebook工程師Julien Verlaguet和Ed Smith的一次訪談。2004年2月,扎克伯格(Mark Zuckerberg)的哈佛同學們第一次登陸Facebook,伺服器裡運行著PHP。那個時候PHP擊敗了Perl成為最炙手可熱的Web開發語言。
  • 程式語言:開發人員需要掌握哪幾種?
    計算機語言通天塔現在已經有數百種程式語言,而且越來越多的語言正在不斷湧現。許多應用程式設計用於相對狹窄的應用程式,並且許多應用程式永遠不會超越一小組編碼器。同樣,大型科技公司一直在開發新語言,大約已有大型科技公司。
  • 程式語言中分號「;」的簡明歷史
    我們將看到分號有兩種用途:作為語句分隔符和作為語句終止符,並且我們將了解在過去60多年的程式語言歷史中分號的使用發生了怎樣的變化。為什麼程式語言使用分號分號在程式語言中用於兩件事:語句分隔符和語句終止符。
  • 百行代碼縮成十行,蘋果開發者大會上亮相的Swift UI成了入門碼農禮物
    在熟悉的庫克開場白中,蘋果公司開了一場歷史上最長,也是內容最多的一次開發者大會,兩個半小時更新了五大系統,還推出了兩款新硬體。不過,最令碼農開心的是蘋果發布了Swift UI程式語言,可以將一百行代碼簡化為大約十幾行,大大降低了碼農入門的門檻。
  • 初學編程,學哪種語言比較好
    現在,隨著技術不斷擴展,單純的會一種程式語言已經不能滿足企業的需要,很多IT人都是身懷多種絕技,但是好在,程式語言是相通的,比如你學會了C,再學C++或Python就相對容易很多。所以,初學編程,還是要選擇一種注重基礎的語言,比如說Java,這樣對以後其它程式語言的學習幫助很大。
  • 程式語言前20名vs開發者最討厭的程式語言排行榜
    本文分兩部分:TIOBE 10月份程式語言排行榜,和Stack Overflow的開發者最討厭的程式語言排行榜。
  • C語言擊敗強敵Python勇奪「2019年度程式語言」冠軍
    「福利:1月16日,騰訊微信人工智慧高級研究員錢橋手把手教你「推薦系統與數據思維」,戳右邊連結上 新智元We站公開課 了解更多!」近日,TIOBE 公布了 2019 年度程式語言的評選結果。古老又低調的 C 語言憑藉2.44%的年增長率獲「2019年度程式語言」冠軍,排名第二的是 C# (+2.1%),Python (+1.4%) 和 Swift (+0.6%)緊隨其後。Top 20榜單如下:新智元C語言獲「2019年度程式語言」冠軍你怎麼看?
  • 哪種程式語言適合後端開發,Java和PHP的區別在哪
    IT行業程序人員使用哪種程式語言一直都是大家討論的熱點,尤其是程式設計師們在面試的過程中還會被面試官們問到Java和PHP語言的區別是什麼? 如果從技術上看在web開發上,Java和PHP哪個更好呢?一位從多年PHP開發轉Java的技術人員說,應是各有千秋吧,各有各的好處,這是最實際的答案。關於這一說法,你會有怎樣的見解。
  • 關於程式語言 Julia,開發團隊有這些想告訴你
    Julia 可以看作是一門集眾家之所長的程式語言,在首次公開時開發團隊就已明確其需求:我們想要一種擁有自由許可的開源語言,同時擁有 C 的速度和 Ruby 的靈活。我們想要一種同像性語言,有像 Lisp 這樣真正的宏,也有像 Matlab 這樣的淺顯熟悉的數學符號。
  • 現代程式語言哪家強?2020年你或許應該了解這7門程式語言
    但同時,他們認為 Java 是一種古老的程式語言。事實上,它們都出現在同一時間:1995 年。大多數主流的程式語言是在上個世紀發展起來的,主要是在 20 世紀 70 年代(例如 C)、20 世紀 80 年代(例如 C++)、20 世紀 90 年代(例如 Java、Python、JavaScript)。這些語言不是為了利用現代軟體開發生態系統而設計的。
  • 2013年7月程式語言排行榜:PHP強勢回歸
    本月,TIOBE程式語言排行榜如期發布,前三甲無明顯變化,它們是C、Java、Objective-C,其中Objective-C依然呈現上升趨勢。值得關注的是,與2013年1月份相比,PHP發展的最為迅速,同比增長了+1.64%。
  • 科學家發現:對大腦而言,代碼編程與語言學習不同
    神經科學家發現解釋計算機代碼可以激活通用的大腦網絡,但不能激活語言處理中心。在某些方面,學習計算機程式語言與學習一門新語言(自然語言)相似。它需要學習新的符號和術語,必須正確組織這些符號和術語以指導計算機執行操作。編寫的計算機代碼還必須足夠清晰,以便其他程式設計師可以閱讀和理解。