電腦效能應用與安全研究室 Performance, Applications and Security Lab


我們的研究範圍很廣,從嵌入式系統、手機應用、一直到雲端計算、商務應用、資訊安全都有做。
我們的合作研究夥伴很多,包括聯發科、IBM、中研院、資策會,還有和台大、清大、交大的教授合組研發團隊
,包括高階應用處理器架構研究、虛擬化技術、異質計算、系統軟體等重要技術的研究與創新,我們很關切台灣人才與產業的未來。

顯示具有 research 標籤的文章。 顯示所有文章
顯示具有 research 標籤的文章。 顯示所有文章

2018年3月28日 星期三

以優化Tensorflow作為系統研究的教案

前天在課上用TensorFlow Performance Guide [1]為案例,解說「人工智慧」與「系統研究」的關係,嘗試啟發學生的視野。

很多人會用TensorFlow開發深度學習應用,但我不知道有多少人真正在意TensorFlow應用的優化。如果只是分析「小的大數據」,或是不在乎多等幾天,那麼就不用看接下來的長篇大論了。

“This guide contains a collection of best practices for optimizing TensorFlow code.”

首先要知道什麼是best practices? 根據網路字典,best practices是"commercial or professional procedures that are accepted or prescribed as being correct or most effective”,換句話說,在各種商業或專業考量下,最為眾人所接受的,能夠最有效解決實際問題的招數。

可是,要看懂這裡所提到的best practices,恐怕沒那麼簡單,需要懂得系統軟體與計算機結構的實務。不,資工系的同學們,請不要高興得太早,我講的是「實務」,不是應付考試的那種功夫。

業界在談論best practices的時候,通常是搔到癢處、點到為止,提出大原則,但不解說幕後的學理依據和細節,也不提供完整的實驗數據。其目的在告訴大眾(潛在客戶): 我們有能力做這些別人不大會做的工作,看得懂最好,知道我們很厲害;看不懂也沒關係,反正找我們就對了,只要付了錢我們就幫你 :)

好吧,我們就來看看,為了協助TensorFlow使用者優化應用, Google官網建議了哪些best practices呢?

洋洋灑灑寫了很多,分了三大類:
  1. General best practices covers topics that are common across a variety of model types and hardware. 泛用招數
  2. Optimizing for GPU details tips specifically relevant to GPUs. GPU專屬招數
  3. Optimizing for CPU details CPU specific information.CPU限定招數
第一類提出很多應用和硬體都可以用到的招數,其中又分為五小類:
  • Input pipeline optimizations解決資料取得與前處理管線的瓶頸
  • Data formats降低資料格式轉換的時間
  • Common fused Ops使用融合運算節省運算成本
  • RNN PerformanceRNN專屬的效能因素
  • Building and installing from source編譯與安裝的效能選項
光是講第一小類,就花了我大半小時。各位要知道,一個完整的深度學習系統不是只有類神經網路,還包括了資料的取得和前處理。如果是分散式系統,資料取得和前處理會更加複雜,也可能造成效能的瓶頸,因此這段對實際運作很重要,但是往往被忽略。

剛好前一陣子幫業界朋友分析他們手頭上TensorFlow系統效能問題,瓶頸就出在前端的Input pipeline。各位不要笑,如果您的手頭上有一台裝有16張NVIDIA V100 GPU卡的HGX-1高效能伺服器,前處理的難度會高出許多... 如何將影像檔案有效率地從高速網路或高速磁碟陣列所構成的儲存系統中預先提出來放置在記憶體中?如何有效率地用兩顆CPU晶片上的40個處理機核心來做前處理? 如何有效率地用將CPU處理後的Tensors送到16張GPU卡的記憶體上?

一般缺乏軟硬兼備素養的工程師,往往毫無頭緒。我在當時給了一些best practices的建議,請工程師做一個實驗,把資料送進一個超簡單、超快的model,看看速度會不會變快?如果不變快的話,就表示資料取得和前處理可能是瓶頸。一周之後,工程師回報說只變快一點點,我請他做進一步的測試和估算,跟這個Performance Guide講的幾乎相同:

Determining if the input pipeline is the bottleneck can be complicated. One of the most straightforward methods is to reduce the model to a single operation (trivial model) after the input pipeline and measure the examples per second. If the difference in examples per second for the full model and the trivial model is minimal then the input pipeline is likely a bottleneck. 
  • Check if a GPU is underutilized by running nvidia-smi -l 2. If GPU utilization is not approaching 80-100%, then the input pipeline may be the bottleneck.使用效能監測工具確定GPU忙還是不忙?
  • Generate a timeline and look for large blocks of white space (waiting). An example of generating a timeline exists as part of the XLA JIT tutorial.使用工具畫出事件在時間軸上的分佈圖,是否有空窗期?
  • Check CPU usage. It is possible to have an optimized input pipeline and lack the CPU cycles to process the pipeline.確定CPU忙還是不忙?
  • Estimate the throughput needed and verify the disk used is capable of that level of throughput. Some cloud solutions have network attached disks that start as low as 50 MB/sec, which is slower than spinning disks (150 MB/sec), SATA SSDs (500 MB/sec), and PCIe SSDs (2,000+ MB/sec). 算算網路或磁碟夠不夠快?
以上所述,對於一個受過系統研究訓練的工程師,應該一點都不會很難吧?即使沒看過這篇,也應該可以想出類似的招數,因此不會「卡住」,可能一下子就搞清楚問題所在。反之,一個菜鳥工程師,如果沒有人帶,又不會自己看懂人家寫的招數,那要如何解決問題?加班加到爆肝可能都沒有用。

接下來我又花了一個多小時解說後面列舉的一些招數,其實都只是將我們(系統研究老鳥們)司空見慣的老招數應用在TensorFlow上,看起來沒什麼了不起,但是菜鳥們就是不會。做理論研究的學者可能覺得這些沒學問、沒創新,但要做深度的系統研究,不能沒有這些功夫。

接下來,就是要學生做Lab,練習解決一些小問題。動手做很重要,可以幫助學生把看來得知識內化成經驗和學問。動手做的過程中,不是按表操作,最好是不斷思考為何如此,如果能發現新新問題和發明新招數,那就更好了。

我想再次強調,培育系統架構師並不容易,一流的系統架構師需要會做系統研究,往往具備Ph.D.等級的研究能力,對於前瞻系統研發扮演舉足輕重的角色,不過台灣很少有這樣的人才,因為多數代工產業注重按表操作,給工程師發揮的空間不大。如果想公司想轉型,提升其系統軟硬整合的能力,最好是找到夠格的系統架構師。

這堂課以及後續課程希望讓學生們能體會以下概念:
  1. 如何從「系統研究」的角度改善「人工智慧」效能
  2. 做實務性的系統研究,需要解決的議題很多,需要好方法
  3. Best practices是前人解題的心得,多看會有幫助
  4. 學這些招數,要知其然,更要知其所以然才好
  5. 動手做是知識內化成經驗和學問的方法之一
  6. 寫報告(論文)是進一步整理心得、發想創意的好方法
  7. 要博聞,但不要強記招數,要會活用
講到要會活用招術,我自己有兩個作法:
  • 搞懂之後就把招數忘了吧,就像金庸小說中的「獨孤九劍」和「太極劍」,達到無招勝有招的境界。(其實是我記憶力不好,不得不如此做 :))
  • 不斷挑戰新的問題,看看是否能夠練到「乾坤大挪移」的境界: 看到人家的招術,就能夠瞬間理解,收為己用。(其實是電腦科技日新月異,不得不如此做 :))
多虧了這兩把刷子,我能夠一路從超級電腦、電子商務、嵌入式系統、智慧手機、雲端服務、物聯網、大數據,做到今天的深度學習系統和人工智慧,至少還能跟得上時代的脈動,研究如何將當紅的應用在最新的系統架構上做優化。

[1] Performance Guide | TensorFlow. https://www.tensorflow.org/performance/performance_guide

2017年11月29日 星期三

台灣學界的哥倫布、愛因斯坦

科技部正在推的「哥倫布」「愛因斯坦」計畫[1],注重培育年輕學者固然是件好事,但有點頭痛醫頭、操之過急、規劃不周延。

這讓我想起一些往事。

即使時光倒回至我2005年回台灣教書的12年前,這些「哥倫布」「愛因斯坦」計畫都與我無緣,因為我取得博士學位後在美國工作7年,民國55年次的我,到台大任教時已經快40歲了。

當時台灣各界普遍缺乏危機意識,恣意揮霍著先前多年所謂台灣經濟奇蹟所累積的資產,就算有人呼籲也是紋風不動,學界務虛浮華,產業層次停滯不前,政治社會更是不遑多讓,各種光怪陸離的現象不斷湧現。

我剛回到台大時,是個nobody(現在也還是)。大學念電機系的我,在資訊系沒有人脈;看到學界務虛的現象嚴重,大老們似乎只知道用數期刊論文點數來掌控教授升等的方式,打造出所謂的卓越大學。身為助理教授,只有認真寫論文拼升等的本份,菜鳥的呼籲如同狗吠火車,過去的業界經驗不受大老重視,產學合作被長官認為是搞外務。

這些年來,好幾位同事離職了,一方面是因為有更好的去處,另一方面是因為在台大不僅有志難伸,還必須面對諸多的不合理。

有些人可能可以用平常心看待這些不合理,反正一路讀書考試的成功經驗告訴他們,不要管他合不合理,只要根據遊戲規則力爭上游即可。等到媳婦熬成婆,才能和長官大老平起平坐,分享權力和利益;在熬成婆之前,與遊戲規則無關的事情,不需太在意。

這些人是非常務實看待自己的利益,但對於社會而言,往往就不是那麼務實了。當然,我還是要幫這些教授朋友們說些話,不這樣做,又能如何呢?除了離開教職之外,還有什麼選項呢?

比起某些上市公司的主管,為了個人利益,刻意掏空公司,乃至於政客掏空國庫,許多的教授朋友做了遠超過所得薪水的教學服務工作,還要被逼著熬夜寫論文,學界務虛的問題,不能怪他們。

像我這種拒絕寫期刊論文而評鑑不過,在2010年被通知「留校察看,兩年後檢討是否續聘,評鑑通過前不晉升薪級」的個案,在台大電機資訊學院中如果不是唯一,大概也是極少數的「敗類」。

我想,大多數正常人應該不會選擇走我這種「偏激」的路線來面對制度和文化上的不合理。或許這就是所謂「平庸的邪惡」,不然優秀的日耳曼人民,當年怎會跟隨著希特勒做出自私自利卻傷天害理的事?

但是話說回來,哥倫布、愛因斯坦,哪個是正常人?我們的社會中,有多少奇才異士,被打壓是怪胎異端,受規訓而平凡化?

還好,寫論文並非難事,我在留校察看期間迅速發表先前累積下來的研究成果,在2012升等副教授,接著在四年後的2016年升等正教授,至少證明這樣異端的路線是行得通的,產學可兼顧,與產業相關的研究是可以發表,只是需要與眾不同的經營方式和理念。

相對於哥倫布、愛因斯坦,我選擇走的路和研究成果渺小之極,但也算是走過那麼一遭,這些年做我認為應做的事,說我該說的話,似乎沒有什麼大遺憾。

[1] 【申請人數沒過半】科技部砸50億重金攬才 年齡門檻太高卡死一堆學者
http://www.upmedia.mg/news_info.php?SerialNo=29890%3F

2016年7月25日 星期一

淪落到只能靠削價競爭?


上週拜讀了臉友台大化工系藍崇文教授寫的「慘業」一文,說到台灣四大慘業,應是給台灣一個教訓,走俗又大碗的時代已經過去了,只要中國可以做的東西,在台灣就不值得做了。藍教授的評論深得我心,尤其是他這個極為生動的比喻:「小家碧玉要跟人家比,是得靠清純與氣質,要走妖豔脂粉路線,脫光了也不是人家的對手。」

看到比喻,想起去年我到荷蘭阿姆斯特丹開會,跟著人群到頗負盛名的紅燈區觀光。「性工作」在當地是合法的,工作者當街脫衣展示其傲人身材,有尊嚴而不怕人看。所謂職業無貴賤,我不反對任何合法的職業,包括代工和性工作,但我認為工作要有尊嚴,如果一路淪落到只能靠削價與人競爭,價值越來越低,這樣的社會是否會成為「悲慘世界」[1]的翻版?

上週四(7/21)到資策會新成立的開源軟體技術服務中心給Keynote演講,演講前我跟資策會的長官和朋友說抱歉,上週幫經濟部審查計畫時扮黑臉,今天又要來講點比較刺耳的話,請多包涵。長官說沒問題,有些事情也到了該轉變的時候了。顧及長官的面子,我沒有直白講的是,如果法人和廠商仍舊用降低成本來賺錢、或是靠政府補助營運的概念,只會把原本有機會的產業越做越小,搞成「慘業」。

我在演講中說: 各位推動開源軟體是件好事,但如果只是因為政府沒錢買不起國外的軟體才來做這件事,或是因為想要包攬政府資訊系統預算才來呼籲政府各單位採用開源軟體,那不免把當代開源軟體的意義和未來性看得太小了,實際上開源軟體遠遠不止於此,我們可以以開源軟體為基礎挖掘新資訊時代中的金礦,提升技術競爭力,站上世界舞台。

我長期與業界朋友探究資訊產業的研發方向,由於產業的類別甚多,技術深淺有別,研發的速度又非常快,而每個人的位置不同,目標可能也不同,所以想法和做法差異甚大。然而由於高科技的天性,政府官僚看不懂、追不上,我不認為可以靠政府來大力推動,然而某些政府官員和民眾還停留在三十多年前政府設立工研院和新竹科學園區大力扶植電子產業的成功故事,殊不知今天的大環境和資通訊產業研發策略已經與三十多年前大不同,而近年政府的產業推動策略和研發補助計畫有多少成功的案例?

我如果說政府不要補助產業的話,可能會被那些長期靠政府補助過日子的業界和同行罵。但我們這樣搞下去,這麼多年來淪落到只能靠低廉的勞動成本與國際競爭,難道是有識之士所樂見的嗎? 如果大多數人只是醉心於賺入大把鈔票、滿足自家生活、獲得個人地位、或是鑽研一己的學術領域,那麼要如何避免繼續沉淪下去呢? 其實我自己這些年過得不差,但正如同我這篇網誌 [2] 所說的, 我看見諸多有能力、薪水還不錯的人也深陷此漩渦之中,痛苦不堪。因此,光靠壓低物價,遲早會出大問題。要創造價值,需要的是突破和躍昇,有能力的人或許可以思考如何做點不同的事情。

然而好比停留在上個世代成功的經驗,有些人還在寄望於研發市場大、泛用性高的技術和產品。我想,現在做這個不容易,你沒有夠大的資本,只能為人代工,運氣好賺一票之後,不出幾年,就得再找下一個賺錢的技術和產品,因為無法累積技術,所以只能找技術門檻低的東西來做,老闆要數鈔票,靠的是廉價技術勞工的辛勞,我們暫且稱此為路線A。

台灣有很多公司,說自己有做高科技研發,其實只是買現成的技術和機具來幫人代工,就是標準的路線A,其中不乏一些有品牌的公司,但產品品質或品牌價值不出眾,只能靠低價爭取市場。不過,我們也不要隨便批評某某公司做代工產業不好。舉鴻海和台積電為例,雖然是代工,但他們在代工的技術上長期耕耘,研發了一些獨門技術,所以能在世界舞台上成為一方之霸。但我不諱言,這兩家公司仍然有相當重的代工習氣,談前瞻產學研發案的時候過於算計,還有改進的空間,否則可能在新領域的研發上縛手縛腳。

另一個方向,稱為路線B好了,是市場規模小、需要頗多客製化的專業領域技術和產品,例如醫院用、航空航海用、軍用的設備,必須花很多功夫與專家合作,通過某些規範認證,所以門檻高,但進去之後不會有很多人來惡性削價競爭。然而因為能進來的人不多,同時因為公司需要高水準的技術、行銷人才,所以公司很難大幅擴張。舉最近我使用Garmin智慧運動手錶的例案例報告 [3],以及我與一些以技術為基礎做專門領域事業的中小型科技公司談合作的經驗,我相信這是現階段台灣要走上國際的路線,以技術立身,如以色列、荷蘭、芬蘭等國的例子。

然而政府似乎老是以泱泱大國的思維去談研究發展,以那些大國的名校和大型企業為目標,搞得我們做學術的常常要跟頂尖大學拚排名,發表一大堆世界級的學術論文來證明自己能與先進國家並駕齊驅,但我們的經濟力量、本國市場規模、產業水準其實並不適合走這條我稱之為路線C,去追逐那些市場規模大、高技術門檻的研發項目。以資訊科技來說,除非是像中國那樣用本國市場來保護和扶植自身的公司,像韓國那樣敢拚敢賭把國家力量灌注在Samsung如此大的公司,否則很難與矽谷大公司競爭。

上述三條路線比較起來,如果我是沒技術、不想冒險的老闆,我想我會走市場大、泛用性高、低技術門檻的路線A。當然,走這條路的也有雄才大略的,請勿過度引申。因為市場和技術容易懂,所以當老闆的我在看了幾本書之後,可以滔滔不絕向身邊的人吹噓自己的智慧和眼光,重點在於看準切入的時機以及有辦法找一群願意賣肝的團隊在最短時間把產品做出來,最好是拿政府的補助、藉由金融操作、預支員工的薪資來做這件事,降低自己的風險。所以我們看到台灣的老闆們時常要政府給好處,掏空某家公司來支助私人的公司,給員工非常低的基本薪資但承諾賺一票之後分紅。

由於台灣在上世紀末走路線A的公司大賺其錢,連帶產生許多英明的老闆和科技新貴,於是這些人被捧上天了, 把自己講得像是走路線C的企業,讓一般的民眾以為台灣真的是世界一流的科技島,跟著玩起了金錢遊戲,缺乏居安思危、突破創新的想法。於是一些產業,在技術沒有深耕和累積,加上中國、印度的崛起,自己人削價競爭,逐漸失去競爭力和利潤,成為慘業。

另一方面,如果要做市場規模小、需要頗多客製化的專業領域技術和產品的路線B,老闆自己得真的懂,或是勇於做高風險的投資,同時得提高薪資,僱用具備國際競爭力的高級人才作為領導群和研發團隊,談何容易?而且,在路線A的公司產生許多科技新貴的年代,學生們被洗腦的很厲害,只嚮往去那些分紅多的公司,而這些公司還很拿翹,只收第一流的年輕人,能在最短時間內被訓練成高效率的生財工具,所以即使我這個老闆想走路線B,我也不容易募到資金、找到好人才。

說到人才,我們有多少第一流的人才走在路線A上,而目前深陷於慘業之中,但仍舊企圖苟延殘喘? 別的不說,政府和產業往往是打著要發展新興產業或是產業轉型的口號爭取資源,卻只是將資源導入既有的產業,因為主導者還是那一批人,變不出新把戲。於是檯面上的看起來戰功彪炳,卻難以扭轉頹勢,反而屢屢耽誤國家產業轉型的契機。

國家轉型不成,有許多藉口和假議題,幾年前還抱怨員工分紅費用化讓台灣產業失去競爭力,指責年輕人偷懶不抗壓,說學界訓練不扎實,歸罪於國際金融風暴和政府不補助,實際上是產業長期接收了許多台灣最優秀的一批年輕人,卻讓他們從事低門檻的研發,技術難以累積提升而喪失競爭力。

然而台灣是民主國家,我們有什麼理由去要求這些檯面上的資本家用他們的錢去投資在他們看不懂的高風險的高科技產業上呢?錢是他們的,那些大公司要不要轉型,也是他們的自由,他們有些人覺得把錢投資在炒房和炒股,或是投資國外比較容易賺大錢,只要合法,也是他們的自由。所以我從不指名道姓罵那些慣老闆,因為他們不需要為台灣負責。有句話叫做『商人無祖國』,我們本來就不應該把未來植基於這些商人的良知與資源上,勞工本身要自立自強。

我想,如果想要台灣的高科技業永續發展,我們可透過意見表達和實際行動,讓政府不要再繼續支持這那些無法轉型的企業,個人不要支持炒房和炒股的行為,而多去支持那些能夠提升本國技術競爭力的企業和機構。其實國內有不少致力於走路線B的企業,如果能集結一流人才,是大有可為的。過程中可能會有陣痛,但重要的是去做自己深切認為是對的事情。

有人問,那具體來說該怎麼做呢? 唉呀,我都說自立自強了,在問我之前,是否能自己先多想想呢? 我也不是神,所知和智力有限,只能概述。 大體來說,只要政府不去補助路線A,就幫到路線B的公司了,所以政府決策的思維和機制要重建。然而,重點在於民間和人才的意願,大多數人只看到大公司和消費市場,所以我才要在此幫高調,提倡路線B,讓多些人看到另外的路線。如果輿論不改,那麼民粹政府也只會隨眾去補助路線A的公司吧。另外,政府也不是沒有能幹的人,不過需要一些論述來支持,否則很難對抗既得利益團體的。當然,沉淪到最後總是會觸底反彈的,只是遲早而已。

[1] https://zh.wikipedia.org/wiki/悲惨世界


[2] https://www.facebook.com/notes/洪士灝/這25年來的薪資與生活概觀/1216275755070231


[3] https://www.facebook.com/photo.php?fbid=1228262997216186&set=a.150385068337323.25791.100000974924946&type=3&theater

2016年7月11日 星期一

從資訊教育出發 創新高中教學

我在逢甲大學舉辦的「高中課程創新教育論壇」(2016/07/07)擔任與談人,當場以此為題對現場的高中主管們做10分鐘的意見分享。

首先我發表免責聲明: 
  1. 大學教授未必充分理解高中教育現場,我所提出的想法或建議列入參考就好,各位需要做進一步思辨。就算是中研院院士的話,也不是聖人之言,不要緊抓著不放。 
  2. 台大是研究型大學,而且沒有教育學院,對於高中教育的貢獻是有限的。坦白說,台大只想要最好的學生,而台灣大部分最好的學生都會到台大,所以請不要期待大多數的台大教授會致力於普及教育,他們有很多自身的教學研究工作要忙。 
那我來這裡做甚麼? (笑)

我可能稍微另類一點... 雖然另類的程度遠遠不及葉丙成教授,頭髮也沒有他長,但我們以各自的方式對國民教育提出一些建言。我個人覺得台大對國民教育不能置身事外,因為國教的品質與大學教育息息相關,有些教授抱怨大學生素質每況愈下,或許可以出來為中學教育做點事情。

其實我覺得台大教授雖然不甚瞭解高中教育現場,但應該可以在創新方面注入一些能量。不是教育科班出身的好處是,我們的著眼點和思考比較不會被現有的教育框架所限制住,對於如何翻轉和創新中學教育這件事,或許可以較為天馬行空地做腦力激盪,或許可以因此激盪出一些火花。

如我在免責聲明所說的,各位不要把我們當成教育專家,而我們談創新中學教育,真正需要的是激發在座每一位教育專家的創意和創新的企圖心,才能有自發的改革和創新,而不是一直處於保守的上行下效的框架裡。

有人可能會問,保守有甚麼錯?

現在的教育體制,源於西方工業革命之後對於大量專業人力的需求,因此開辦學校,制定標準教材,舉辦學位或技能檢定考試,讓業界得以有效率的雇用人力。然而,業界已經進化到高度自動化的工業4.0,以及所謂人工智慧的時代,而教育的形式也受到資訊網路和線上學習的影響,許多國家已經在重新檢視標準化教育的意義性。

各位為人師長的,是否知道這社會十年後職場上所需要的能力?很會背書、記公式、考高分的學生,是否能適應未來的社會? 從我教大學生以及與業界合作的經驗,好學生未必懂得自學、團隊合作、求新求變,而這些能力到了大學再練習是否太晚?

很抱歉,各位先進從過去照本宣科、數十年如一日的教學生涯,轉為現在這種需要翻轉和創新的日子,罪魁禍首是我們這些搞資訊科技的,但我們自己也得在這個的潮流中日新又新,而且潮流影響所及,各行各業也都從數位化、網路化,進到自動化、智慧化,不斷有新的挑戰,也不斷有新的機會。

因此,資訊科技和資訊教育實在太重要了,但千頭萬緒,在有限的時間內,我想摘要幾個我所認為的重點與各位分享:
教育如何善用資訊科技?
如何以資訊教育啟發學生新時代所需的能力?
資訊科技是提升數理人文各領域的利器!

首先,教育如何善用資訊科技? 方式很多,以下只是幾個例子:
  1. 翻轉教學、線上學習: 老師不需要重複教同樣的課,學生可以按自己的進度學習,透過網路與世界接軌。 
  2. 蒐集資訊、分析資料、跨領域學習: 各個學門都可以結合資訊科技做資料的蒐集與分析,進行專題研究。 
  3. 數位校園、個人化學習: 根據每位學生的學習狀況,提供適合的課程與進度。 

其次,如何以資訊教育啟發學生新時代所需的能力?

資訊教育不是教工具的使用,不是教用電腦做簡報、也不是教用電腦畫圖…而是讓學生在資訊科技改變人類生活的時刻,理解其幕後的原理和現象,可以巨觀和微觀去看待資訊科技與人類的互動,這是所謂的計算思維。

由寫程式入門去了解計算思維,是一種方法,但不是唯一的方法。好比我們教數學,如果不會列方程式,如何學習用數學解應用問題? 但光會解方程式,並不是學數學的目的,但我們因為要應付考試,往往過度強調解題技巧;同樣的道理,在中學教育中,學習寫程式只是敲門磚,如果我們過度強調程式寫作,也會迷失了焦點。

中學資訊教育絕對不是為了培養資訊專業人才,重點在於具體訓練「語言理解與表達能力」「抽象思考」「解決問題」等能力。我們不要重蹈覆轍,像某些科系以自我本位的想法把過多的材料塞進中學教育裡面,造成學生貪多嚼不爛、因噎廢食的結果。

新時代所需的能力有很多,包括:
  • 自學的能力 
  • 跨學門解決問題的能力 
  • 在開放原始碼的時代同中求異的能力 
  • 在人工智慧時代尋找出路的能力 
最後,除了啟發上述能力之外,資訊科技是提升理工人文各領域的利器,所以現在台大許多科系都希望學生能夠寫程式、做資料分析。例如台大正在成立資料科學(Data Science)學程,而台大也逐步加強計算設備,因為計算模擬和資料分析對學術研究越來越重要。

幾年前,我到台大理學院、到教育部的課綱委員會談中學資訊教育,必須花力氣向與會人士解釋推動中學資訊教育不是資訊系的私心,還好這幾年進步了,我不用多說大家也懂了。剛才有先進提到考招聯動,我想將來不少科系可能採計資訊課程,不會只是資訊系。

舉個現成的例子,來台中的路上,我看到網路上有一則用機器學習技術分析紅樓夢八十回前後的差異的文章。這個例子告訴我們,文學的研究也可以有創新的做法,而使用資訊科技做跨領域研究可以產生很多創新和突破,這也是為何我說資訊科技可以幫助老師和學生在中學階段進行跨領域的教學研究。

最後,我想再次強調,中學資訊課程不是為培養資訊人才而設,不是幫資訊科老師搶飯碗,應該是學校主管和所有科目的老師都需要關心的事。資訊課程的重要性與日俱增,我們在教學場域中,看的應該不僅是現在的需求,我們必須看遠、創新,研究如何為了學生的未來而教。

2016年5月13日 星期五

如何深耕軟體工業基礎技術?

昨天(5/12)被邀請去參加「行政院工業基礎技術第二期次產業投入與深耕項目產官學共識會議-軟體領域」,聽了第一期的執行成果報告,在座的產學人士,包括我在內,都給了一些意見,因為官方希望知道第二期要做些什麼。

在講我的意見之前,先談談第一期的執行面。被派來呈現第一期的成果代表團隊有三個,我特別欣賞中山大學黃英哲教授團隊的報告,他說他早在12年前就開始做軟硬體整合的技術,有與業界合作的產學計畫,也有受科技部補助的前瞻研究計畫,當然我在多個教育部教改計畫中也見到黃教授的貢獻。

我欣賞黃教授的成果,不是因為他報告中所呈現的KPI,而是因為我這些年看過多次他團隊所呈現出來的內容,挑戰困難的實作問題,堅定的態度始終如一,不隨波逐流。因此長久深耕而能累積豐富深刻的技術,進而衍生產學計畫、技轉、專利、論文等等,自然是水到渠成的事,毫不意外。

然而,黃教授也誠實地說,他這12年來深耕軟硬體整合技術,最辛苦的就是做第一期深耕計畫的這四年,因為每隔三個月科技部就要研究團隊填表格提供成果報告,而成果報告表格的項目一大堆,衍生產學計畫、技術轉移、專利申請、論文發表、培育人才、開發課程、辦理推廣活動、邀請業師授課、赴業界演講等等。如果績效不彰,可能就刪減預算,甚至停止計畫。所以光是忙著應付這些關鍵績效指標(KPI),就忙得不可開交。光是這兩週,我就見過他來台北兩次做這個計畫的成果報告。

我發言說我深感認同,因為我們也深為KPI所苦,而且這些年來用數字管理,已經早造成了許多嚴重的問題,應該要換個方式來評鑑執行成效,尤其是這個所謂的深耕工業基礎計畫,如果目的真的是為了好好發展那些「在國際上趨成熟,但台灣過去因產業文化,且未能在短時間看到經濟效益,以致於產業尚未投入深根之技術」(請參考下圖),就應該不是這樣的做法。



這個工業基礎技術發展方案,用「三高一廣」來描述其願景,在三年多前一開始的時候只有幾項質性的KPI,但一路執行下來,為了滿足計畫審查委員和立法院的質詢,不斷加入新的KPI,希望參與的研究團隊能夠提出強而有力的實質證據。

實質證據?如果是前瞻研究或產學計畫,或許可以定義好標竿,但一面說要「深根」和「十年磨一劍」,一面又要執行團隊每年拿出績效,要「三高一廣」,可能嗎?同時,由於這些KPI,反而造成許多「務虛」的事情。填表的事情就不用說了,為了要有經濟效益,研究團隊必須配合廠商,因此也不可能把研發的技術免費方享推廣給大眾,於是立意頗佳的計畫,到頭來只有少數廠商受惠、培養少數研究生而已。

我直接了當說,這些繁瑣的KPI不僅無法評估真正的貢獻,而且還扯後腿,讓研究團隊之間彼此競爭而非合作,成果無法在國內分享推廣。

今天要解決這個問題,關鍵不在於談下一期要做什麼,而是必須基於開放方享的概念,來提昇真正作為工業基礎的生態系(ecosystem)。例如談軟體領域,現代軟體工業的基礎是開放原始碼計畫(open source projects),尤其是那些常見於大型軟體工程以及系統軟體的開放原始碼計畫,包括Linux, Android, Apache, Hadoop, Spark, NoSQL, LLVM, Tensorflow等,國內現在極度缺乏能夠好好使用或修改這些開放原始碼計畫來堆疊出大型軟體應用或是建構先進系統的人才,原因是沒有人好好來經營這個生態系!

坦白說,國內在軟體實務工程架構技術上落後先進國家幾十年。不用說先進技術,各位可以到國外參加討論版,就可以知道人家如何從公開的討論和程式碼的分享中培植軟體人才和厚植軟體的實力。上述的開放原始碼計畫,都是經過許多一流專家們千錘百鍊所打造出來的,如同把秘密和寶藏公開放在我們面前供我們免費取用,正是我們好好利用來迎頭趕上的機會,為什麼不把握機會以國家的力量經營這個開放原始碼計畫生態系?

有人說,前幾年科技部不是砸錢搞過開放原始碼計畫嗎?再次,我必須說KPI不對,在執行面上就會失焦。之前科技部所支持的「自由軟體鑄造場」(https://www.openfoundry.org/),目前有將近1976個開放原始碼計畫,立法委員看到數字每年增加很高興,但究竟有多少是有用的呢?開放原始碼軟體貴精不貴多,各位到國外的網站上,可以看到更多的開放原始碼軟體,例如sourceforge.net 就有21539個程式碼。要知道,既然可以免費使用人家的原始碼,我們何必花時間重新打造類似的東西呢?(如果說這是訓練,那要如何證明程式碼不是抄來的呢?)

務實支持開放原始碼計畫,不是鼓勵參與團隊多多發表全新的開放原始碼計畫,應該是聚焦在現有的重量級開放原始碼計畫,鼓勵學界、業界多分享、研究、改進、貢獻這些開放原始碼的技術。學生藉由研究重量級開放原始碼來學習第一流的軟體、強化自己的軟體實力,藉由使用開放原始碼來堆疊出有創意的作品,藉由改進或創新開放原始碼來展現自己的程度。業界要懂得如何善用開放原始碼,而不是看到開放原始碼就轉彎,因為世界上的開放原始碼計畫越來越多、越來越好,看到開放原始碼就轉彎的公司遲早會無路可走,難道沒看到連微軟、IBM也擁抱開放原始碼嗎?

然而,業界要善用開放原始碼來創造價值,一個健全的開放原始碼生態系,其中包括好的人才參與其中、技術的交流、產業的分工。在這方面,我們落後先進國家很多,但是由於開放原始碼的天性,我們可以從網路上取得大量免費的資源加以研究,所以成功的機會遠比那些需要昂貴研究設備的尖端科技,或是需要長期實務經驗累積而成的工業技術來得高,關鍵在於有沒有辦法聚集足夠的高素質軟體人才和產業的參與。

目前的開放原始碼生態系還不夠蓬勃,缺乏業界的支持,雖然許多人有心耕耘,但大多是以社團、同好會、讀書會的形式在運作。雖然如此,但我樂觀其成。這幾個月來我課上演講的業師們,在國內的網路社群上很活躍,他們樂於分享開放原始碼的研究心得,也透過分享讓世界知道他們的才能,對社會和產業造成貢獻。

因此我對長官說,您問我第二期深耕項目要做些什麼?在座的諸位有各種的意見,我也可以把我有興趣或專精的技術項目加進去,但我認為重點不在於技術研發,而在於生態系的經營。至於要如何經營軟體領域中重點項目的生態系?我想可以利用開放原始碼作為基本載具,在上面想辦法加值,把成果分享給所有人,有產官學積極的參與和持續提供充分的資源,自然能把基礎打穩,大可不必讓KPI造成學界、業界的隔閡和浪費資源。

2016年5月6日 星期五

需要愚公移山的大學文化

最近台大楊校長講了一些鬆綁大學的話,例如讓大學教師開公司(註1)、大學存亡交給市場機制 (註2),讓大家耳目一新。我覺得以校長的高度,願意跳出框架,從事大幅度的改革,是值得讚賞的事。只不過,鬆綁需要有很多配套措施,需要多討論,而且這種事情到了輿論,或許由於閱讀者只看到部分的故事,或許由於各個學校的情況不同,甚至在台大內部因為系所的所謂市場性而有些爭議。

丙成兄剛寫了一篇「我眼中的台大同事們」(註3),描述他所見到台大同仁的努力,也為台大同仁抱屈,他說:『不是台大沒想辦法、沒創意去突破啊!臺灣的政府跟法律就是把所有可以試的路都堵死了,能怎麼辦呢?』我想,這是想做事的人常常會遇到的問題。然而,這問題已經存在許久,能夠讓這樣的問題延宕多時而不解決,說真的,台大人也是責無旁貸。

我去年寫過一篇短文「教育事業的資本論」(註4),說政府吝於投資教育,徒務虛名和急功近利的作法,儘管短期有些成效,但無法長久。然而,虛名和功利充斥在國人的文化中,台大也參與其中,如何置身事外?另一方面,更為根本的問題是,作為國家的頂尖大學,是否在提昇文化上盡心盡力,而非自私自利?教育出來的學生,是否有長遠的視野,能對國家整體有所貢獻?我想社會對此,自有公論,但我個人認為台大在這些方面,還有很大的努力空間。

教育文化事業,並不是短期可成的,即便台大擠身世界百大又如何?我們除了想招收第一流的學生之外,有積極努力讓更多的學子受惠嗎?我們的校友,除了本身在政治經濟界飛黃騰達之外,有設法讓人民更幸福嗎?政治經濟不佳,社會風氣文化不改,第一流的學生在國內無用武之地,不來念博士班,當然排名倒退;更何況世代剝削的情況嚴重,年輕人徬徨若失,求學之心更是消極,台大對此能否多做些事?

丙成兄說路都堵死了,這讓我想起「愚公移山」的故事。我覺得,台大有太多的聰明人,沒有人願意做愚公。我多年前就看到一座山堵在門前,很多聰明人好心告訴我如何他們繞過山的方法,但沒有幾位願意持續努力把山移走的人。我不是偷懶不想爬山,只是覺得這樣繞路走的教育文化不應該存在於頂尖大學之中。放眼看真正的頂尖大師,有很多在未發跡之前,可能都被譏笑為愚公之流。

至於有人不願支持台大,甚至看台大不順眼,我倒是不求什麼「體諒」。身為台大的一員,社會對台大的看法,無論好壞,也會投射在我身上。我們把事情公開講清楚,盡到自己的社會責任,追求個人的理想境界,也就是了。

各位可以到網路上看看,台大有很多的公開分享的課程和相關資源,歡迎大家多多利用。例如在軟體領域上,我們擁抱開源分享的文化,邀請業界來演講,也將演講內容開放分享(註5)。我們樂見社會大眾因為大學樂於分享受惠,但我覺得更重要的是走出學術象牙塔與大眾交流的心,即便需要長期的醞釀和發酵才能有所影響,甚至影響還不被承認,也甘之若飴。仔細看看,台大還真有不少愚公,只是不願居功、不為人知而已。

至於鬆綁大學的問題,需要很多配套措施,改天再論。

(註1)楊泮池:讓大學教師開公司 產學雙贏 http://udn.com/news/story/6885/1666⋯⋯

(註2)楊泮池:大學存亡 交給市場機制 http://udn.com/news/story/6885/1666⋯⋯

(註3)葉丙成,我眼中的台大同事們 https://www.facebook.com/pcyeh.NTU/⋯⋯

(註4)洪士灝,教育事業的資本論 https://www.facebook.com/shihhaohun⋯⋯

(註5)開源系統軟體臉書社團 https://www.facebook.com/groups/159⋯⋯

2016年5月3日 星期二

寫程式之外,傑出軟體工程師所需的六項能力

這篇【會寫程式還不夠,矽谷傑出軟體工程師都有的5種能力】[1] 說得不錯,值得想深耕軟體技術領域、以技術立身的人一讀。這也是我在矽谷工作時的切身經驗,因此我一直希望訓練學生這些高生產力的傑出軟體工程師所具備的能力:

一、不害怕探索陌生程式語言

二、精通Debug

三、開發節省時間的工具

四、優化重複性工作的速度

五、發展系統性思考模式

(請自行閱讀該文)

我前些日子寫過一篇【博士滿座的系統優化團隊】[2],略講了一下我之前在矽谷工作的團隊。我十一年前從矽谷回到台灣教書,原本想把這些工程研發能力的重要性傳達給學生,卻發現號稱電腦王國的台灣,在軟體工程的領域的研發文化竟是意想不到的淺碟。明明是國外重視的工程技術,國內卻乏人問津。學界標榜要世界一流,只好抄捷徑,從理論著手;業界要快速賺錢,沒時間研發,要的是現成的解決方案,所以在軟體界,產學的落差很大。

要知道,產學落差影響最大的是學生和工程師。講難聽點,教授可以一輩子在學術的象牙塔裡優遊自在,不用太在意學生的出路;老闆和主管把握時機賺飽了錢,之後可以把產業當投資遊戲來玩。但如果在學校沒有受到足夠的工程訓練,成為工程師之後又沒有機會做深入的研發案,可能一輩子只能「逐水草而居」,接些門檻不高的專案,難以成為傑出的軟體工程師和系統架構師,結果就是一直為人代工、為人作嫁。

礙於視野,一般學生常常以為解決困難的理論問題、寫出酷炫的應用才了不起,程式設計競賽得獎的是神人,不大明白軟體和系統工程的概念,不大知道高生產力的意義性。如果一直做為人代工、為人作嫁的工程師,或是成為主管、老闆、理論型學者,是您想要過的日子,那麼您大可不必繼續看下去了。

以下是我的個人經驗談,分別對應到以上的五項能力:

1. 我很早就建立起程式設計能力,在高中時自己學了約十種程式語言,學到後來覺得學新的程式語言沒什麼了不起,只是很有趣、很簡單、很有用。所以只要有空、有需要、有機會,就很自然地會學到新的語言。尤其在平行處理、分散式系統和異質計算一直有新的語言出現,需要有不害怕探索陌生程式語言的能力。

2. 然而我必須說我從來就不是很擅長特定的程式語言,也不是很精通程式設計,我很少設計新的演算法,但我看很多人寫的程式碼,而且擅長Debug,這是設計師和工程師的重要差別之一。在解決平行處理和系統效能優化的工程問題時,會遇到很多一般程式所沒有的Bug,而且很難抓,尤其是所謂的Performance Bug,更是需要傷腦筋,有時候還需要一些方法論和工具才行。

3. 因為平行程式的Bug很難抓,複雜系統Performance不好分析,所以需要開發出能幫開發者節省時間的工具。我的博士論文裡面敘述如何以工具蒐集程式的靜態與動態資訊,以工具進行分析和優化,甚至設計工具去將程式和系統建成模型(model)後做進一步的模擬。我在矽谷Sun公司做系統優化工作時,用了非常多的效能分析工具;現在帶領學生開發從晶片設計到超級電腦的輔助工具,都覺得工具特別重要。

4. 除了工具之外,要進一步省下大部分時間(所以日子可以輕鬆點),必須觀察或預判工作中大量重複的部分,設法將之優化。好比優化程式的效能。就是找到關鍵的迴圈,再以各種手段(編譯器選項、改寫程式碼、平行化、GPU、硬體加速器等等)去加速它。同樣的想法也可應用在工作和生活上,要重複同一工作很多次,可不可以寫一個小程式(Script)去自動化工作的執行和結果的分析? 如果每天重複做某些事,能否換個方式讓這些工作變得有效率?

5. 即便是簡單的系統,也有「牽一髮動全身」的問題。很多時候,做了一件所謂優化的工作,未必會得到好處,搞不好先看到壞處。複雜的系統就像人體和社會,出了問題要吃藥、要修法,但藥不能亂吃,法不能亂修,需要有「系統性思考模式」: 了解每個變因可能造成的正面和負面的結果,乃至於變因之間、變因與系統之間的交互影響。對複雜系統來說,做這件事的難度很高,所以我才會一直想研究方法論和發展工具,來提高生產力。

容我再補充第六點:

六、化繁為簡、有條不紊與人溝通

很多工程師很難與人溝通,有些滿嘴都是一般人或老闆聽不懂的術語,有些則是會做不會講。各位到矽谷看,大部分的高級工程師都能言善道,能夠把艱澀難懂的技術,依據對方的程度,用對方能聽懂的語言表達。如果不能表達清楚的話,再怎麼厲害,作為工程師的成就也有限。

擁有高度生產力的工程師,是國家真正的技術力和國際的競爭力,這是瑞士、荷蘭、以色列、芬蘭這些國家走的路線,而不是靠低工資和加班工作。我發現台灣過去的薄利多銷的路線已經不單只是衍生出業界現在必須面對的問題,經濟壓力和普遍過勞的現象也造成不少社會文化的問題,影響健康、降低生活品質、讓文化層次停滯不前。

在我個人能力範圍所能做的,是設法提高我學生的工程素養,有機會就協助某些有志提昇技術能力的業界人士。但大家可能要先有個認識,這些能力往往都不是一般人到研究所和業界學個一年兩年能夠出師的。以我個人的駑鈍之才,到了國外念博班和工作時有緣遇到艱難的工程問題,才得以略窺門徑,然而在台灣要如何才學到這些技能呢?

我沒有簡單的答案,這也不是容易的事,我之前談過多次,包括最近一篇【系統人才的出路】[3]。我只是相信,以目前台灣的環境來說,這是一條值得鼓勵嘗試的路,如果在學校和業界有機會面對艱難、前瞻的工程問題,才有機會練到功夫。網路上很多明師,不一定要拜師才能學藝。

反過來說,如果只在乎速成,在學校不願挑戰艱難的工程問題,到了業界又沒有機會遇到前瞻的工程問題,我想就很難發展上述的能力,這也是當前台灣業界非常缺乏系統架構師、軟體架構師的原因。

但這些原因都不是真正足以阻擋一個能欣賞工程技藝的、願意認真學東西的人,有機會花幾年時間深入做系統研究,自然會學到上述能力,Jim Huang就是一個好例子。如果具備上述能力,還需要擔心工作的問題嗎?如果業界有很多高生產力的人才,還需要這麼擔心競爭力的問題嗎?

[1] http://www.bnext.com.tw/article/vie⋯⋯

[2] 博士滿座的系統優化團隊 http://hungsh-ntucsie.blogspot.tw/2016/04/blog-post.html

[3]系統人才的出路 https://www.facebook.com/notes/洪�⋯⋯

2016年4月1日 星期五

博士滿座的系統優化團隊

今天到Oracle拜訪之前在Sun的老同事。沒想到,兩年不見,之前我工作過的團隊(Performance and Applications Engineering, PAE) 多出了一群生力軍。我在PAE的會議室裡和八位來自台灣的博士聊天,四位是我的學長輩的,四位是這兩年才加入的年輕人。
這四位年輕人,竟然有三位是我密西根大學的學弟妹,其中一位原本在新竹清華大學擔任副教授,幾週前才進來工作。另一位則是我台大電機系的學弟,威斯康辛大學博士... 這真是有緣千里來相會。



PAE擅長的是複雜系統的優化,當Oracle併購Sun之後,PAE的地位和價值更高。今天,Oracle的目標是做出世界最頂尖的Cloud,PAE雖然不直接負責產品開發,但在效能測試與優化上扮演關鍵角色,無論是資料庫系統還是大數據分析系統,PAE必須熟悉各項軟硬體技術,否則怎麼談系統優化?

為什麼需要博士?一位老同事說,因為工作上有很多未知數,沒有受過研究訓練的碩士,看了會怕失敗而不敢做,受過博士訓練的人比較能面對這類問題。他說,他們一天到晚為了解決新的問題,都在學新的東西。(註:在美國,通常碩士不必寫論文,不需接受研究訓練。)

我想起當年,我是PAE少有的博士,但我一開始沒有亮出博士學歷,因為團隊注重經驗多於學位。不過雇用我的老長官總是丟一些新的題目給我,讓我有機會表現,例如當時沒有人碰過的密碼加速卡以及最新的高速網路卡的效能問題,都丟到我手上,我得想辦法自己學。還好,我們圓滿解決問題,幫PAE在公司裡樹立起專業形象。之後,或許是覺得博士好用,新的博士陸續進來,PAE負責解決的問題日益複雜,但始終維持使命必達的好形象。

要知道,這個40多人的團隊,擁有上百櫃的機器,PAE在Oracle內部,是非常燒錢的單位,而且因為PAE沒有直接為公司賺進一毛錢,如果沒有非常良好的形象,如果公司沒有上進心,根本不可能維持這樣的團隊。

我其實很想讓台灣的公司來參觀一下,讓他們看看這個當年SUN能夠在幾年間以效能優化來提升競爭力,讓SUN能以小搏大,力抗IBM、Microsoft、Intel、HP、Dell等強敵的幕後功臣,雖然整個SUN的核心技術團隊已融入Oracle,但Oracle還是把SUN的標誌掛在每一台伺服器上,這說明Oracle對SUN的肯定。

對了,SPARC還在,只用在高檔的商用伺服器上,據說富有的阿拉伯國家很喜歡買...

2016年3月19日 星期六

Linux Kernel與產業發展的故事

下周(3/22)梁文耀博士要來台大講Linux Kernel,我來暖一下場子,提一下Linux Performance Tools,順便說說故事,免得學生覺得這個老師都找業師來上課,自己倒底懂不懂? 而且故事或許可以告訴大家,從以前到現在有甚麼變遷,不要食古不化、學錯重點了。同時大家也可想想,為什麼要學習Linux Kernel? 學了之後有甚麼用? 如何學習? Linux Kernel這麼龐大,要花多少時間來學? 如果學不得法,事倍功半。

早期,很多台灣的學生和工程師學Linux Kernel只是為了寫裝置驅動程式(device drivers)。因為系統代工廠開始採用Linux作業系統,要讓系統能夠在新的硬體上工作,必須找一群人來寫drivers。下游的系統晶片、周邊晶片、周邊設備廠,也得提供幫自家產品寫drivers給客戶用。

這些年有不少資工系的學生畢業後去業界負責寫drivers。例如聯發科技在業界的風評不錯,使用聯發科技的晶片的客戶,只要夠大咖,在driver方面會得到迅速確實的服務,其幕後當然就是那些刻苦耐勞系統的軟體工程師了,一旦有bug,就會在最短時間解決掉。

十多年前,嵌入式系統頗紅,教授只要宣稱有做嵌入式系統,學生就趨之若鶩,就是衝著台灣系統晶片和消費性電子產品的熱潮。那時政府投入到系統晶片的資源多,做嵌入式系統教學研究的人也分到一杯羹,學生畢業後進了像聯發科技這類的公司,也賺了不少錢,好像大家都很開心。

那時很多人學做嵌入式系統,只是看了幾本書,追蹤過Linux Kernel,寫寫驅動程式,讓系統會動、功能正確就好。在學術界做嵌入式系統研究,為了要發表論文,很多人跑去做系統裡面工作的即時排程、節能省電的研究,搞一堆數學模型和heursitics。這些研究成果雖然也很厲害,但是跟當時的業界的技術層級距離頗遙遠。

距離遙遠? 是的,大多數代工廠只需要按照客戶的規格要求把系統做出來,至於系統上面跑甚麼應用就不是他們要擔心的事了。以HTC為例,早期他代工做Windows Mobile手機,最在乎的就是如何選料做出價廉物美的硬體,而整支手機軟體中唯一能改的,就是drivers了 -- 這是2006年我們到HTC訪問時,軟體部門主管回應我的問題所說的話,因為「微軟只讓他們碰這個」。

因為學界被要求要證明自己是世界一流,業界有很多限制,所以學用落差很大,而兩邊又都很忙,很少溝通,但大家似乎不以為意。或許是因為當時的電子業錢太好賺,業界只要學校開一些簡單的實作課程幫學生打基礎就好,反正業界做的也不是甚麼偉大的研發工作,有了基礎到業界就能在短時間上手,那些眉眉角角的know-how,入行久了自然會知道。因此政府出錢,用補助設備和課程開發經費的方式鼓勵學界開一系列強調實作的嵌入式系統課程。

我在2005年回到台大教書,看到這種情況,很不以為然。同樣是做嵌入式系統的教學研究,我特別強調複雜系統的設計、效能分析與優化,我陸續開了一系列課程,包括「輸出裝置與驅動程式設計」「嵌入式處理器設計」「嵌入式多核心系統與軟體」「計算機效能最佳化」「平行計算機系統與應用」「Linux系統核心與應用」,嘗試訓練一些高階系統實務人才,但絕大多數賺錢的業界公司並沒有珍惜這些技能,也沒有想提升他們自己的境界,原因很簡單,因為搶錢都來不及了。

舉例來說,我在2005年去演講的時候,一位技術學院的教授當場嗆我,你講這些對我們沒甚麼用,我們只要能訓練出能寫USB裝置驅動程式的學生,他們就有做不完的工作了。我認為他看到的職場現狀接近現實,當時需要大量的工程師來幫忙做這些做不完的系統軟體開發工作 (註1),但邏輯上的問題是,這兩年有做不完的工作,未必代表未來二十年都有工作,我們不應該只教那些,業界也不應該只做那些。

大家現在都知道了,膚淺技術的代工業已經大不如前。即便代工,也得有高階技術才能生存發展。(補充說明: 不要誤會了,我很尊重那些注重技術研發、能持續精進的代工廠,包括台積電、聯發科、鴻海這些,他們現在也知道要投資做研發,才有出路。)。那些不上不下的公司,要如何生存發展呢? 這是個大問題。

過了十年,現在還是有很多系統廠還無法轉型和升級,仍然以代工製造硬體搭配膚淺的軟體為主。上個月有一家公司找我去諮商,公司大部分的軟體技術都仰賴微軟的供應鏈,自身的軟體研發能力薄弱。說到為何不用Linux呢? 他們一下子說不敢用,一下子說看不懂市場,一下子又說找不到人才。我說,一直這樣的話,你們也只能讓微軟予取予求,果然講到他們的痛點。以前讓微軟予取予求,就當作是繳稅,現在利潤如此微薄,這個微軟稅繳起來就很痛... 我看那個態勢,似乎是要我介紹人給他們,但我猜想,這公司恐怕僱不起Linux人才,也不見得有給人才發揮的空間,所以就謝謝再聯絡了。

昨天有位考上碩士班的學生來找我,他雖然是名校畢業,但非資工系,全是靠自學。他原本在某家高雄軟體園區的公司上班,做月薪22K的軟體開發工作。一開始聊,他完全聽不懂我在講甚麼,他自承是靠補習考上研究所,但對系統有興趣。其實不只一位學生,這幾天來了好幾位考上碩士班的學生,對系統的認識薄弱到令我訝異。所以我花了不少時間告訴他們如何迎頭趕上,包括看看我們在【開源系統軟體】臉書社團(註9)上分享的資訊和課程內容。

言歸正傳,話說Linux Kernel這麼龐大,要花多少時間來學? 這幾位靠補習考上研究所的碩士生,連Linux都沒用過,要怎麼在短時間內學會做系統研究?

第一,如果想做系統,只要能抽出時間,用力學就對了,不要管要花多少時間,Just Do It! 或許,有了一百小時的研習,可以讓你入門;幾百小時,可成為某個部份的高手,接下來就繼續補充不足、與其他高手過招、漸入佳境。如果想快速成為真正的專家,每天10小時,3年一萬小時,應該有機會。不過各位看看Jserv這麼厲害,我猜他一天超過十小時花在作業系統相關的議題上,搞了30年,大概是10萬小時。

第二,利用社群資源。一般學生在考試陰影下,潛意識中某種程度敵視老師和同儕,因為一個逼你念書,一個跟你搶名次。殊不知,到了研究所,老師和同儕都是寶貴的資源,甚至為了有更多資源,還要設法到網路社群上找。國內外有很多開源碼的討論社群,都可以加入。尤其是最新的資訊,不可能等到人家寫書或是開課來教你,一定要懂得上社群網路去搜刮最新資訊和參與討論。

第三,挑戰高階(複雜)的實作問題。我認識很多聰明人,給他抽象、簡化過的難題,他們可以解得不亦樂乎,但是真實世界是複雜多元的,如果不會解析複雜問題、化繁為簡的話,根本無從解起。這是現代高階人才該具備的重點能力之首: Complex Problem Solving (註2)。有些資訊系畢業的學生,連上千行的程式都沒看過幾個,要如何探討軟體架構 ( software architecture)? 如果在學校能看懂Linux Kernel架構,能了解其運作,嘗試解決其中的問題,也算是個開始。

比如找一個大數據分析應用,設法解決其效能問題。由於很多大數據應用是架設在Linux系統上,這時候解析Linux Kernel的能力,對於改進系統在做資料儲存、資料交換上的效能非常重要。當然,處理大數據所用的中介軟體也很重要,所以我們之後也會來看Hadoop、Spark之類的中介軟體,但我希望大家可以舉一反三,否則只是學到皮毛而已。

效能工具(Performance Tools)的使用,是在實務上分析效能的關鍵。要解決問題,先要有資料;要有資料,最好是能自己動手蒐集,不必等人。要知道電腦系統裡面有很多效能監控機制,使用者可以透過效能工具取出這些資料加以分析。但是系統中有那些效能工具? 有哪些效能工具? 如何使用效能工具? 如何分析蒐集到的資料? 常常需要專業的知識,我們在學期稍後會講,但同學們可以先看。例如網誌的圖,上面列出玲瑯滿目的工具,來自於介紹Linux Performance Tools的網頁(註3),作者就是開顧問公司的。我們當年,在SUN的系統上開發了很多效能工具以及分析的方法,後來幾位SUN的工程師出去開了這家顧問公司。

我回到台大之後,也訓練學生做類似的工作,幫業界解決效能問題(註4)。但是因為過去代工業太賺錢了,願意花時間和傷腦筋創新的大公司不多,所以看到一大堆機會沒有被業界把握住,實在可惜。這幾年新創蔚為風氣,但許多贊助新創的機構的思維還是沒變,為了快速回收,只敢投在淺薄的技術研發上。

不過最近一些資金開始關注到某些「務實做有深度研發的項目」,燃起希望的火苗。例如有找我們解決效能問題的公司變多了,題目的素質也提升了;我學生畢業後到VMFive(註5)和Appier(註6)去幫忙解決效能問題;台灣開始有以解決效能問題的新創公司,例如Skymizer (註7); 翟神開的和沛(註8)最近重金禮聘幾位我認識的Linux專家,希望有好的發展。

台灣的競爭力應該是在人才的素質上,而不是人力的數量上。我想,眼前的業界,是朝向「質」的方向發展,這是可喜可賀的事。至於量的方面,關鍵是業界和政府能否把握機會行動,以及學生能否看清現實,而我只能盡人事聽天命,無法預測未來。所以請各位同學、業界朋友、長官不要問我,現在投入系統研發的行列,未來會不會大發。我只能說,學生要做的話就好好做到出師,業界要做的話就卯足全力衝刺,政府學界要做的話就給足資源,不上不下的半吊子,恐怕是難以呈現出價值的。

(註1)嵌入式系統商機大,卻鬧人才荒 (2005/01) http://www.ithome.com.tw/node/27357

(註2)現在和未來新創所需的技能 (2016/03) https://www.facebook.com/notes/洪�⋯⋯

(註3)Linux Performance http://www.brendangregg.com/linuxpe⋯⋯

(註4) https://www.facebook.com/notes/洪�⋯⋯

(註5)http://www.vmfive.com/


(註6)http://www.appier.com/zh/


(註7)http://skymizer.com/


(註8)https://www.hopebaytech.com/


(註9)https://www.facebook.com/groups/159⋯⋯

2016年2月17日 星期三

非絕招的絕招 - 淺談RDMA的小知識與大效用

有些高階網路介面卡支援RDMA (Remote Direct Memory Access),但仍然很多人不知道RDMA是什麼,以及它能用來做哪些好事情呢?

RDMA主要是可以讓某台機器可以透過網路介面卡所提供的API,直接存取在另一台機器上的記憶體,免去透過傳統作業系統與網路協定所增加的負擔。(註1)

這項功能純粹是為了效能而存在的,對於現代已支援各種網路協定的系統而言,RDMA並沒有增加系統的功能性。換言之,RDMA是一項可有可無的、需要硬體特殊支援的系統功能,有了它,可以節省電腦系統在做資料交換時,作業系統所耗損的運算資源和降低延遲(latency)。

因此,RDMA不是人人都需要懂得,也不是到處可見的,近年來RDMA被率先用於高效能計算(HPC)上10Gbps乃至於100Gbps的高速網路,目前它逐漸被利用資料中心和大數據運算時,作為提高資料傳輸效率、降低系統能耗的手段,例如用RDMA加速Hadoop、Spark,以後可能會被用在某些強調效率的物聯網的裝置上。

實際在網卡上使用RDMA的範例,可參考(註2)。如果看懂這份200多頁的文件,應該就很清楚知道RDMA能做哪些事情。

但光是學會RDMA是不夠的,要發揮出RDMA的作用,必須要懂得將RDMA實際用於應用面上,必須要懂得軟體和效能分析的技術,分析效能的瓶頸和資料交換的模式(pattern),才能善用RDMA,否則可能不光是達不到預期的效果,還會減損系統效能,甚至危及系統的安全和穩定度。

首先在效能上,必須考量資料的傳輸模式,包括每次資料傳送的大小、資料的連續性、傳送的時間間隔、傳送的對象等等,來決定如何使用RDMA。我們可以讓傳送端主動把資料放進接收端,或是接收端主動到傳送端提取資料,究竟該用哪種模式?何時該進行傳輸?是否要用高階的gather/scatter功能? 這些都是要根據實際狀況才能回答的問題。

為什麼說RDMA使用不當,可能會危及系統的安全和穩定度? 因為「讓某台機器直接存取在另一台機器上的記憶體」這樣的功能,好比「讓某人直接進入你家存取東西」,如果某台機器被入侵,有可能危及其他機器的安全;也好比「共享記憶體」會造成搶資料的問題,如果兩台機器沒有同步好,可能會造成race condition,系統就會不穩定。

因此RDMA也不是隨隨便便能夠使出來的絕招,必須先精通軟硬體的實務才行。所以,絕招其實並非絕招,招數本身說穿了並不難,只是說使用者沒有足夠的軟硬體功力,練了絕招也沒有用。如果笑傲江湖裡的令狐沖沒有好好練個十多年的武功,突然接收了獨孤九劍的心法也沒有什麼用的。當然,並不是每個花很多時間練功的人,都能領悟獨孤九劍的要旨,學了也不見得會用。

話說RDMA也不是那麼罕見的概念,基本上RDMA是由DMA (Direct Memory Access)轉化而來的技術。說到DMA這個幾十年前就廣泛被使用在各種電腦系統的東西,很多做硬體設計和I/O驅動程式的人都很熟悉, 可以在單一機器中讓CPU節省傳送資料的時間,例如把大量資料送到磁碟機、網卡、顯示卡,甚至軟體想做大規模記憶體複製(memory copy)的時候也可以使用,普遍得不得了。

我原本以為,既然DMA是如此普遍的概念,那麼多加利用DMA和RDMA來改善系統效能的這件工作應該不難,但其實並非如此。看懂別人怎麼利用這些招數,和真正學會如何利用這些招數,並不是同一件事。很多做底層作業系統和驅動程式的人都看過DMA,有些會拿現有的範例照抄,但有多少人會調整DMA的使用方式或是用於解決新問題?

舉例來說,我們十年前玩過當年最紅的多核心處理機之一,IBM Cell (註3),用在超級電腦和Sony PlayStation 3上,所以我們實驗室買了十幾台PS3,用來做教學研究。這個系統晶片有個特點,晶片上多個處理機核心之間資料的傳送,是靠DMA來進行的。雖然DMA很有效率,但是很多程式師不大會用DMA。當年開發Cell的chef architect,Peter Hofstee,後來跟我們一起合作,聊起這件事,他覺得這些程式師暴殄天物。

我讓學生學習如何在Cell上運用DMA,發展效能分析工具,甚至有位學生設計出一個輕薄(lightweight)的message-passing library,使用DMA來加速CPU之間資料的傳送。不只支援Cell,也支援工研院所研發的異質多核心處理機PAC Duo,拿到ACM RACS會議的最佳論文獎 (註4)。事實上,實驗室還有其他幾個作品,也用了DMA來提升效能。

從眾人熟知的DMA延伸到RDMA,只是把單一機器改為多台機器,概念極為類似,所以要理解並不難,但如果要會運用,還是要實際運用才行。因此,我們建置了一套以100Gbps網路連接的小型叢集(cluster),打算來訓練學生使用RDMA,研究如何解決big data系統中資料傳輸的問題。很多開源碼系統軟體還沒有被好好優化,而且優化的方式就像以上所講的,必須根據實際應用的狀況而定,因此這裡有很大的發展空間。

RDMA 只是眾多非絕招的絕招之一例,還有很多這類的招數。我自己對於效能分析與優化特別感興趣,所以一路走來,到處學習、運用、發掘這類招數。但就像以上所描述的,這類招數說穿了一點都不稀奇,所以旁觀者看了覺得好像沒什麼了不起。國外的公司懂這類技術的人多,比較能夠賞識這樣的技能和成果;但某些台灣公司主事者的心態很奇怪,你化繁為簡,講到他能聽懂,他就以為你沒什麼了不起,以為他自己可以找到價美物廉的人在做同樣的工作。關於這點,可參考我兩周前寫的故事(註5)。

的確,這沒什麼偉大,但一般人懂了不見得會用,會用不見得會解決問題,所以「專業」不是一天造成的。以為自己官大學問大,不尊重專業,夜郎自大,自我設限是常見的通病。這篇文章的目的,在分享如何在系統開發上「同中求異」的心得,如果不想老是做跟人家一樣的東西,要如何創新? 基本功夠扎實,加上一些特異功能,例如本文的RDMA或是異質計算,那麼很有機會做出比別人好的系統,這其實不難,也不容易,需要務實培養專業能力。往好處看,台灣現在越來越需要,也比較能賞識這類人才。

(註1) https://en.wikipedia.org/wiki/Remot⋯⋯

(註2) Mellanox, RDMA Aware Networks Programming User Manual, http://www.mellanox.com/related-doc⋯⋯

(註3) https://zh.wikipedia.org/wiki/Cell_⋯⋯

(註4) Building a scalable and portable message-passing library for embedded multicore systems, http://dl.acm.org/citation.cfm?id=2⋯⋯

(註5) https://www.facebook.com/notes/洪�⋯⋯

2016年2月4日 星期四

那一年我們做系統優化的故事: 為什麼我們會做學界業界不(屑)做的研發?

 前天在與某廠商開會時遇到10年前做過產學合作的熟面孔,為了保護他的隱私,這裡稱他為X先生好了。X先生說他還清楚記得當年我們幫他的老東家「廣達的儲存伺服器研發部門」所開發的技術,這點讓我頗感驚訝。

事隔十年,保密協定也早過期了,論文也發表過了,所以應該可以來說說這個故事。

在2006~2007年間,我們與廣達做產學合作,那是我2005年回國後第一個產學計畫,我帶著實驗室草創後的第一批研究生,研究廣達剛剛研發出來的中階儲存伺服器。這個中階儲存伺服器,有兩個大腦 (雙控制器)來提供容錯功能,每個控制器上有一個處理機跑著廣達輾轉向國外某公司買來的複雜軟體,為了要快,雙控制器把從硬碟載入的資料放在一塊特殊的共享記憶體,然而整個系統,跟競爭對手比起來,還是不夠快。

X先生在前天對我說,他覺得我們很厲害,能夠搞定這個困擾他們工程師許久的非常複雜難懂的系統軟體,把這個儲存伺服器的極速提高了將近十倍,對於產品的競爭力有很大的貢獻。

其實這不是我們厲害,我們做效能分析和優化都是有方法論 (methodology)和工具 (tools)為基礎的。沒有這些,只能做些簡單的東西,不能做複雜的工程。國內很多研發單位只重視短期研發,根本不懂這些。(我講的十年前的狀況,廣達研究院現在應該好些了吧?) 我聽過有人說: 「什麼方法論、工具的? 反正就叫工程師拼命加班做,限時完成產品不就好了? 」所以我跟這些人談前瞻系統研發,等於秀才遇到兵,說也說不清,只有等他們遇到解不了的複雜問題,才會知道專業的價值 -- 現在搞雲端、大數據、物聯網、異質計算,這類複雜問題比比皆是,所以很多人毫無頭緒自己該做甚麼,可能也沒能力做甚麼。

首先,為了分析這台儲存伺服器的效能,我們還特別打造了效能分析工具。黃書政同學,做出了一個利用GCC編譯器在產生機器碼時在程式的進入點和離開點處插入追蹤器以產生追蹤資料,用以觀測程式執行流程的方法。這個工具幫助我們精確地分析儲存伺服器上軟體的流程,黃同學也以此作為碩士論文:

【一個針對嵌入式軟體的追蹤和效能分析技術 (Developing new tracing and performance analysis techniques for embedded applications) / 黃書政(Shu-Jheng Huang), 2007】

當年追蹤分析系統最強的工具之一,是SUN的 Solaris kernel team所開發的DTrace,這個技術後來也被IBM拿去做Linux上的SystemTap。在黃書政同學開發新工具之時,林以迪同學研究如何利用DTrace來自動化分析應用軟體的效能,後來他的分析方法幫助到這個廣達的計畫,也以此為題寫了碩士論文:

【利用DTrace在Solaris系統上以自動化方式建立應用軟體的效能模型與分析 (Automating server application performance modeling process on Solaris system via D-trace and trace-driven analysis) / 林以迪(Yi-Di Li), 2007】

要知道,一般的效能分析多半是針對CPU-intensive的應用,探討CPU的使用,然而儲存伺服器的重點不只在CPU上,還包括磁碟和網路這類的I/O動作,這些是一般工具和普通工程師較難對付的部分,所以陳人豪製作了一個量測和模擬的框架,讓我們能評估I/O部分的問題,這也是他的碩士論文題目:

【系統層級的效能量測與評估框架 (System-level performance profiling and simulation framework for I/O-intensive applications) / 陳人豪(Jen-Hao Chen), 2007】

不要忘了, 一個複雜的多工系統不只是一次只做一個工作,還有多個核心來做多項工作,所以張筱薇同學 (實驗室唯一的女生!)選擇做這個最硬的研究工作,利用SystemC做出一個能夠快速分析多執行緒應用程式效能的模擬環境,令我感到非常難能可貴:

【設計與實作一個快速分析多執行緒應用程式效能之多核心系統模擬環境 (A rapid simulation environment for application performance estimation on parameterized multi-core/multi-threading architecture models) / 張筱薇(Hsiao-Wei Chang), 2007】

搞清楚效能的問題所在,接下來就是設法優化(optimize)其效能了。怎麼做呢? 我們實驗室研究效能優化,著重的是那些編譯器做不到的事情,而不是那些編譯器可做的事情,這是跟那些做編譯器研究的實驗室最大的不同。我們認為,天底下有太多編譯器做不到的最佳化工作,厲害的人可以手動搞定。

舉例來說,編譯器往往不知道該怎麼優化程式,所以提供一大堆選項讓開發者來選。當時的GCC有42個可能影響效能的選項,請問要怎麼選? 至少有2的42次方種組合,不可能暴力搜尋。陳奇孟同學在十年前就採用的現在最紅的「機器學習」來幫助編譯器自動找到最佳的選項集合:

【以機器學習快速的搜尋最佳編譯器選項集合 (Finding the best compiler optimization option set rapidly via machine learning) / 陳奇孟(Chi-Meng Chen), 2007】

然而,一般的搜尋方式,只適用於普通的應用程式,為了最佳化這個儲存伺服器的核心,每次編譯過後必須重開機測試效能,所以非常耗費時間,所以林煌森同學針對這個議題設計了一套自動化搜尋機制:

【自動搜尋編譯器選項最佳設定 : 應用於儲存伺服器核心模組效能之提升 (Automatic selection of compiler options for performance optimization on the kernel modules of a storage server) / 林煌森(Huang-Sen Lin), 2007】

適當選用編譯器的選項,的確提供了效能,但真正讓這套儲存伺服器效能起飛的是對於軟體架構的改進。然而,如果沒有蒐集足夠的效能資料和對於系統完整的分析,根本不可能碰觸到軟體架構的改進,所以最佳化的成果還是得歸功於整個團隊的合作。

陳嘉翔同學在這套儲存伺服器中,加入了高效率的快取索引表,大幅改善了原本極為沒效率的搜尋機制。誰知道這套廣達花錢買來的軟體,會寫得這麼沒效率呢? 陳同學的碩士論文:

【磁碟陣列系統之最佳化研究 : 快取索引表之設計與實作 ( Performance optimization on a RAID system ; design and implementation of a fast indexing table for disk caching) / 陳嘉翔(Jia-Siang Chen), 2007】

吳建成同學算是集大成者,他不僅加入了預測使用者未來的需求做預先提取(prefetch)的機制,同時負責整合和評估最終的結果,寫出他的碩士論文:

【評估快取與預先提取在儲存伺服器上的效能 (Performance evaluation of caching and prefetch strategies on a storage server) / 吳建成(Chien-Cheng Wu), 2007】

總合來說,這些研究,讓儲存伺服器的極速提高了將近十倍,而廣達只贊助了我們一百多萬台幣的研究經費 ,這不能怪廣達小氣,這對當時沒有國科會經費、又沒有名氣的我來說,這筆錢讓我能夠購買設備和供養學生;不過這點經費大概只能僱一位菜鳥工程師做一年研發的成本,如果比起當年廣達贊助MIT的研究經費以及給台大的捐款,所以我想廣達的經費應該是大大值回票價了。

但或許廣達不這麼看,這才是當時身為菜鳥助理教授的我,最為感到不值的部分。那個儲存伺服器研發部門,被長官要求要自負盈虧,為了要在短期內謀求利潤,只好開始刪減「不必要」的研發開支,所以在一年的研究期間過後,就沒有下文了。

所以我說國內業界短視近利、不懂軟體研發,這是我親身經歷的第一個實例。X先生應該是站在我們這邊,但他當時也是小咖,即便覺得應該持續贊助我們,也改變不了大長官的旨意。X先生目前在某大公司擔任處長,前天開會中發言強調軟體開發的重要性,支持提早做軟體的開發,我聽了非常窩心,希望業界有更多懂得系統和軟體的人才。

另外,在學術方面,我指導這批第一屆的研究生做實務研究,在2007年產出了八份碩士論文,忙得不亦樂乎,隨後將部分論文改寫投稿,在2008才發表兩篇國際會議論文(註一) (註二),2009年一篇(註二),投資報酬率極低,發實務研究的論文難度高,是其他領域的人所不能夠理解的。

首先,關於這類系統研究,教導學生基本知識和技能、指導學生做研究、解決實作問題、驗證研究結果,原本就可能要比其他領域花更多心力;其次,要寫一篇優質的實務研究論文,必須能言善道、精準犀利,但大多數學生推導數學公式可以,寫程式可以,卻不大會用英文談論設計方法、分析利害得失、探討關鍵議題、展現系統優勢,如果要在國際會議或期刊上發表論文,我們必須在論文寫作上花很多時間。另外,寫論文時還要顧及與廠商的保密協議,必須遮遮掩掩的,當然更不利於發表。

所以我說國內學術界在數SCI論文數量的同時,把很多教授和學生逼上找尋容易發表論文的途徑,像這類我認為很有價值的產學合作,在那個SCI掛帥的年代,因為事倍功半,所以被年輕教授們視為畏途。

業界短視近利,加上學術界SCI掛帥,我對於這個系統優化的產學研究案的積極投入,算是非常吃力不討好,唯二能夠安慰自己的,第一是教出一群能實作的研究生,第二是這個研究案讓我更清楚我們能做出業界需要的前瞻研究,只是時機未到。

至於個人的學術成就,懂的人就懂,對於那些只會算論文數量的人,我也不冀望他們的理解。但上述的情況在這些年嚴重阻礙台灣的產學發展,造成前瞻研發不務實、論文氾濫的現象,甚至影響教育品質和人民生計。然而,產業仍不乏有能人,學界還是有志士,只要堅持走對的方向,我們還是有可能走出困境的。



(註一) Shih-Hao Hung, Chia-Heng Tu, and Chien-Cheng Wu, Optimizing the Embedded Caching and Prefetching Software on a Network-Attached Storage System, in Proc. 2008 IEEE/IFIP International Conference on Embedded and Ubiquitous Computing (EUC) , pp.152-161, Shanghai, China, December 17-20, 2008.

(註二) Shih-Hao Hung, Shu-Jheng Huang, and Chia-Heng Tu, New Tracing and Performance Analysis Techniques for Embedded Applications, in Proc. the 14th IEEE International Conference on Embedded and Real-Time Computing Systems and Applications (RTCSA) , pp.143-152, Kaohsiung, Taiwan, August 25-27, 2008.

(註三) Shih-Hao Hung, Chia-Heng Tu, Huang-Sen Lin and Chi-Meng Chen, An Automatic Compiler Optimizations Selection Framework for Embedded Applications, in Proc. the 6th International Conference on Embedded Software and Systems (ICESS) , pp.381-387, HangZhou, Zhejiang, China, May 2009.

2016年1月10日 星期日

人工智慧太厲害了,我們該怎麼辦? (Part II)

昨天概說了人工智慧過去和未來性 (註1),在技術面上著墨不多,所以今天來談談技術面。

首先是關於「摩爾定律」,我在半年前寫了一篇「後摩爾定律的世界和台灣的產業發展」(註2),有興趣的人可以參考一下。我當時說:

「說白一點,摩爾定律是錢砸出來的。摩爾定律的黃金時代,開始於個人電腦急速成長的時代,但個人電腦的效能在十年前就已經能夠滿足大多數個人,所以「世界」對於摩爾定律的期待逐漸降低,雖然智慧手機和平板的異軍突起,但主要是希望摩爾定律能夠提供更高的性能耗能比(power-performance),然而這幾年手機平板已趨於飽和,也沒看到真正個人所需要的高性能耗能比的應用(killer apps),再加上像Qualcomm、Samsung這樣的公司上在推出新的行動晶片上屢次因為晶片過熱而踢到鐵板,所以在既然沒有消費者的需求,晶片製造商也裹足不前的情況下,自然就會降低對於摩爾定律的挹注。」

「我想,在缺乏資金挹注的情況下,摩爾定律在技術上能延續的機率不高,即便不少研究者熱中於此。除非有真正大眾需要的應用,或是再度出現軍備競賽,否則很難改變摩爾定律的終結。」

但任何事都可能有例外,不能太鐵嘴,還好我最後有加上一個以「除非」開頭的句子。人工智慧是否能成為大眾真正需要的應用,或是用於軍事用途? 我想其可能性還不小,所以我在這幾個月跟一些業界朋友說,不要再搞那些傳統的消費電子產品了,要想想如何將「智慧」加進產品之中。

怎麼把「智慧」加進小型的裝置之中? 基本上,有下列方法:

(1)由小型裝置自己做
(2)藉由網路把工作送到集中式的伺服器去做
(3)藉由網路把計算工作送到周遭多台機器分工合作
(4)上述三種的組合

先說「自己做」行不行? 現在很多人手上的手機,能做多少事情? 其實手機可以做很多事情,只是會遇到過熱和電量不足的問題,但是這兩個問題影響較大的是較長時間使用的應用,如果我們要的是「即時性的智慧」,那麼問題應該比較像是「如果手機在五秒內全速執行,能夠解決那些問題」?

舉例來說,即將出現在手機市場上的Qualcomm旗艦處理機Snapdragon 820有多厲害呢? 據說(註3) 這顆晶片的 4核CPU比前一代S810的8核快35%,省30%的電,支援600Mbps的無線網路,其中的GPU也快了40%、省40%的電,還支援OpenCL 2.0。不只如此,他還有一顆名為Spectra的影像訊號處理機(image signal processor),可以加速影像處理和支援電腦視覺(computer vision)。

要自己做,可以,要想辦法把各種運算能力整合到晶片上。要讓手機晶片有智慧,不能只靠跑在CPU上的純軟體,一定不夠力的。有些應用可藉由GPGPU來加速以資料為主的運算(data-parallel computing),例如做機器學習的開源軟體,Mahout和Caffe,都可以用OpenCL程式碼跑在GPU上。另外,以影像和聲音為主的應用,則最好設法在源頭解決問題,也就是說在感測器紀錄影像或聲音之後馬上送到訊號處理機,使用專門特殊化的(specialized)計算架構來提升效率,其實電腦視覺也可算是初步的人工智慧。

從上述的例子,可以看到「特殊化」處理機的趨勢越來越明顯,因為用CPU跑純軟體太沒有效率。時下很多人討厭寫C程式,喜歡用像是Java, Javascript, Python之類的高階語言來開發應用,但是對於開發與效能息息相關的系統軟體的人來說,光是懂得寫C程式可能還不夠,要懂得multithread、OpenCL、CUDA才會善用多核心的CPU/GPU,要懂得訊號處理機的架構和專用語言才能發揮其能力,甚至要會使用「硬體描述語言」才能用FPGA來加速計算。

我預測未來這十年,是大家各憑本事、各顯神通,想盡辦法來打造智慧系統的黃金年代。我們將會看到百家爭鳴,在計算架構和軟體設計上不斷推陳出新,快速發展。當然,演算法也極為重要 -- 再厲害的運算能力,也挽救不了愚笨的演算法。而且,針對大系統所開發的演算法和軟體,不見得適用於小機器,例如把Google釋出的Tensorflow裝在小機器上,可能會發現它的效率不彰,所以各公司可尋找屬於自己的利基市場(niche)。

當然,如果不限定要帶在身上,智慧型裝置也可能出現在車上、電線桿上的監視錄影機。因為體積和電力供應較大,我們有機會將百倍於手機的運算能力放進這些裝置。所以某些人工智慧的應用,可能會先出現在這類裝置上,例如前幾天的CES 2016,我們看到NVIDIA和Qualcomm都推出車用的處理機(註4)(註5),來搶攻這類市場。

這是新興市場,我希望台灣的業界人士看到以上幾段會頗為振奮,尤其是那些在硬體公司寫系統軟體的朋友們,這是值得把握的機會。如果您能夠針對某個智慧型應用設計出又快又省電的系統,那就有機會逐鹿天下。不過呢,要把握機會,必須先搞清楚這些研發工作將會需要「緊密的垂直整合」,最好有一個人才濟濟的團隊,針對應用的需求規劃系統軟硬體,要有「軟體為主,硬體為輔」的思維,最好要找到軟硬兼備的系統架構師(system architect)來領導研發工作,如我在這篇專訪上談到的(註6) 。

當然,我們也可如第二種方法,「藉由網路把工作送到集中式的伺服器去做」,來提升小型設備的智慧。但首先,網路傳輸需要時間,不利於即時性的應用;其次是隱私性和安全性的問題,我們未必希望讓大公司那麼清楚的知道我們的一舉一動,所以也可能不希望把全部的工作送到集中式的伺服器去做;再來,極為耗費運算資源的工作,除非Google能夠由此獲的廣告利益,否則它未必願意提供免費的伺服器資源來幫大眾做這個,所以並非所有應用都會有免費服務。

同時,在資料中心做人工智慧的運算,更需要高效率的加速技術。因此現今很多大公司都在積極找高手來加速需要大量運算的服務,例如微軟有個專門以FPGA加速資料中心服務的研究團隊Catapult,陸續發表加速搜尋引擎和機器學習的技術(註7)。

第三種方法與第二種方法的差別,在於利用較近的機器做計算來縮短時間,選擇能夠信任的機器來保護隱私,以及以互助會的模式來分享互惠資源。我們做過這類模式的相關研究,也實際建構出系統,例如這篇將Android程式中大量數據處理的工作轉移其他機器的作法(註8)。雖然目前還缺乏需要這種模式的高運算量行動應用,不過我相信在未來身邊需要人工智慧的時候,應該會有這類的需求和做法。

實際的作法,也可能是以上三種方法的排列組合。至於如何排列組合,就考驗系統架構師的能力。台灣現在很缺系統架構師的人才,缺到業界連如何善用系統架構師、去哪裡找這些人、如何培養這種人都不知道。以前做代工不需要這種人才就算了,如果現在還不知道,那就難做了。現在業界有不少地方都說要做人工智慧,但我奉勸想加入這類團隊的朋友,先看看帶頭大哥懂不懂,有沒有兩把刷子再說。

(註1) 人工智慧太厲害了,我們該怎麼辦?
臉書版: https://www.facebook.com/shihhaohung/posts/1072464976129323
部落格: http://hungsh-ntucsie.blogspot.tw/2016/01/blog-post.html

(註2) 後摩爾定律的世界和台灣的產業發展
臉書版: https://www.facebook.com/shihhaohung/posts/968793609829794
部落格: http://hungsh-ntucsie.blogspot.tw/2015/07/blog-post_13.html
轉載於Inside: http://www.inside.com.tw/2015/07/14/post-moores-law-and-the-industry-development-in-taiwan

(註3) Qualcomm's Snapdragon 820 INSANE Specs & Features DETAILED
http://www.knowyourmobile.com/samsung/qualcomm-snapdragon-820/23126/qualcomm-snapdragon-820-release-date-specs-features-android-n-launch

(註4) NVIDIA推出車用人工智慧電腦NVIDIA DRIVE PX 2,號稱性能比 Macbook Pro強150倍http://www.techbang.com/posts/40654-nvidia-at-ces-not-flagship-graphics-card-but-strong-for-a-taxi-containing-artificial-intelligence-supercomputers-nvidia-drive-px-2

(註5)
【CES 2016】高通發表 Snapdragon 820A 車用處理器,具機器智能神經學習系統
http://technews.tw/2016/01/08/qualcomm-snapdragon-820a-automotive-processor/

(註6) 深化產學合作!向沒有能力領導創新的大企業說掰
http://www.bnext.com.tw/article/view/id/38432

(註7) Project Catapult
http://research.microsoft.com/en-us/projects/catapult/

(註8) Shih-Hao Hung, Tien-Tzong Tzeng, Gyun-De Wu, Jeng-Peng Shieh. A Code Offloading Scheme for Big-Data Processing in Android Applications, Software—Practice and Experience, first published online May 2014.
http://onlinelibrary.wiley.com/doi/10.1002/spe.2265/abstract

2016年1月9日 星期六

人工智慧太厲害了,我們該怎麼辦?

我們為什麼要推計算思維呢? 因為未來各行各業都需要與電腦合作,否則有可能被電腦和機器人淘汰,例如這篇【機器人搶工作 律師、藥劑師也遭殃】所談到的(註1)狀況。如果不懂計算思維,很容易就迷惘了。

最近像這樣的文章和書籍很多,研究未來學的人,認為人工智慧是未來的重要趨勢,極盡能事去想像未來,但究竟有多少真實會發生,有多少只是虛無飄渺的幻想? 我想,很少人有能力確定,不過當前許多學生都跑來研究人工智慧相關的議題,則已成為我在台大所看到的事實。

我三十四年前在高中時,就對於人工智慧很感興趣,開始學LISP,後來進到台大念電機系,修了兩門人工智慧的課,還旁聽過神經網路,到密西根大學念書,也修過人工智慧,但我沒有繼續研究人工智慧,因為我覺得當時研究者走偏了,而且當年電腦的運算速度遠遠不足以支持有意義的人工智慧,所以根本做不出東西。

我猜對了,1990年代之後,人工智慧成為票房毒藥,沉寂了近二十年。

我選擇做電腦系統,看著電腦系統的效能持續成長,電腦系統的研究者想出各種方法來收割不斷成長的電腦效能,過去這三十年,最忙碌的研究領域之二,是計算機結構和系統軟體,我有幸能優游於兩者之間,探討一些軟硬體整合的議題。

如今,單一處理機的運算能力,約為30年前人工智慧全盛時期的100萬倍(註2),而且只要願意付些許錢,就可以租用雲端的上百台電腦,運算能力更是30年前的一億倍以上。

要注意到,這一億倍的運算效能,是人工智慧東山再起的關鍵。沒有足夠的效能,電腦很難生出智慧。然而,如今的運算效能,是否足以支持未來學想像中的人工智慧,則是一個大哉問。

大部份未來學專家的預測,都是基於以往的摩爾定律(註3),但這幾年摩爾定律已經放緩,甚至有可能停滯,主要是成本考量。以往這麼多年透過個人電腦、電子商務、行動運算、雲端服務等應用,半導體產業有足夠的利潤做研發來支撐摩爾定律,而大數據分析和人工智慧是否足以繼續支撐摩爾定律的延續? 如果摩爾定律停滯,那該如何是好?

有的人工智慧應用,需要比目前更高百倍的計算能力,有的實驗研究要成為產品之前,需要將龐大的運算能力縮小進到生活周邊,因此我認為我們做計算系統的,在產品化的過程中,還是扮演舉足輕重的角色,將來應該會有做不完的人工智慧系統設計的工作。

要創造出人工智慧的系統,關鍵在於要有能夠密切垂直整合的團隊,必須要有三種專家密切配合:
(1)領域專家,例如找律師、藥劑師來指導或教導電腦該領域的專業技能。
(2)人工智慧專家,綜合運用機器學習、數據分析、資料探勘等方式設計人工智慧演算法與軟體。
(3)系統專家,提供人工智慧所需的系統整合、資料蒐集、處理和計算能力,針對人工智慧應用優化系統軟體、設計晶片。

台灣比諸於其他許多國家,由於有硬體產業的基礎,非常適合發展「(3)系統專家」(這也是我想來培育的,也是目前即欠缺的人才),加上台灣目前很多學生對人工智慧很有興趣,學得很快,所以我不擔心會短缺「(2)人工智慧專家」,台灣在各行各業也有很多領域專家,但是能否聚集人才成為優質研發團隊,是真正的重點。

我想,很多有識之士已經看到這個局面,這是值得台灣去發展的好機會。我希望國家和社會多投入一些資源鼓勵產學界共同組成「對」的團隊,來把握這樣的機會,讓學術界多做些有益於這類幫助國家產業發展的研發工作。

然而,在謀求發展的機會的同時,我們也應該做好教育的工作,讓未來的世代能夠好好面對電腦和機器人。與其教學生背誦記憶一堆電腦瞬間可解的問題,不如教他們如何活用電腦、想辦法與電腦和機器人共榮。

另外,科技的民主化以及財富的合理分配,也將會是越來越重要的課題。我們絕對不希望大家多年努力的成果,被少數資本家收割,讓科技成為資本家搜刮社會資源和剝奪人民權益的打手 -- 這是社會大眾需要慎重看待和避免的議題。

(註1)機器人搶工作 律師、藥劑師也遭殃
http://www.cw.com.tw/article/article.action?id=5073792

(註2)以摩爾定律概算,假定每18個月電腦效能增加一倍。

(註3)https://zh.wikipedia.org/wiki/摩爾定律

2015年11月30日 星期一

Maker - 夢想的自造者

自造者是目前國內對Maker的翻譯,在當前一片鼓勵年輕人自造、新創的風潮中,對於有夢想、想突破現況的人來說,是再好不過的環境。

然而,所謂「多情自古空餘恨,好夢由來最易醒」,如果只是追逐時尚、圖一時之快,沒有真正的熱情,也沒有個人的創見,那麼自造、新創的夢是很容易醒的,或許也因此而留下餘恨。

所以好友蘇文鈺​教授感嘆說,作為一個普通的Maker最怕的就是遇到有人問以下這類問題: 「你這個人家早就做過了啊!而且人家做得比你早又比你好!」

我回他說,或許該先認清楚自我的定位,作為Maker所為何來? 初心是什麼?目標又是什麼?

對我這個自認為是舊時代的老Maker的人來說,回想起當年,Maker的意義很大,對我一生的影響遠比很多事物來得大多了。作為一個Maker,我學會自行創造夢想,有機會與同好們一起築夢,能夠為了追逐夢想而狂野奔放、堅持到底,至少在心靈上沒有被庸俗和邪惡所困苦或同化。

所以我說Maker是夢想的自造者,Maker的能力不斷創造夢想,也讓夢想堅持下去,乃至於讓我成為Problem Solver、Hacker、Innovator、Educator、Promoter...

Maker可以是好玩的,就像我從小到現在,逢年過節有空就會做塑膠模型一樣,有時候只是興趣,沒有要跟誰比高下,只是寓教於樂 - 在自造的過程中,教會自己一些能力,長一些知識,多一份快樂。

如果我小時候不親自做一台F-14飛機模型,我沒辦法充實地欣賞與想像那些我從書中讀到的關於F14的種種頂尖設計和科技結晶;如果我沒有自組一台PG級的機動戰士Z鋼彈,我也沒辦法實際領略其中巧妙的機構設計,以及透過把玩將我從動畫上看到的神奇變形的系統具象化獲得快感。

雖然聽起來頗幼稚的,但這不就是所謂的有夢最美嗎?

人生而有情,因為有情,則有喜、有悲、有樂、有苦。如何燃起熱情追逐夢想而成就自己、離苦得樂,則是大議題。試問時下有多少人無心於尋夢、缺乏熱情、隨波逐流度日? 當然,維持夢想需要相當的付出,夢想的破滅也有相當的代價,這是作為有情眾生之一的覺悟。

我從小喜歡動手做的個性,讓我曾經有過成為科學家、工程師、藝術家的夢想,至今這些夢想還在,熱情也還在,不因沒有成就而苦惱喪志,只是因為興趣太多,無法兼顧而已。

想起當年高中時代在電腦上做的東西,可能今天的Maker會不屑一顧。然而,打從我在Apple II上按照書上的範例輸入程式碼的那一刻起,我製造出一些夢。我夢想有一天,擁有高解析度、色彩繽紛的工作站,電腦可以幫我解決記憶不好的問題,自動化和網路可以幫我解決雙手不夠用、分身乏術的問題,更好奇如何做出令人滿意的人工智慧。

我的腦海中充滿著對未來的憧憬,而這個憧憬讓我求知若渴,讓我竭盡所能。但我知道我正在做的東西只是過程的一部分,我勉強自己背三民主義,為的是進入最好的系去追尋我的夢。

在大學時,我們有一群人在社團學著造小火箭,夢想有朝一日能做出大火箭。我修了六個學習的專題,雖然沒做出甚麼偉大的東西,但我知道我能做東西,而且能從做中學,能從其中得到樂趣。

因為樂趣而做,做了而產生樂趣,這樣就會有源源不斷的熱情。如何啟動這樣的正向循環,就是每個人的課題了。然而,如果因為贏過別人而有樂趣,為了樂趣而不斷想贏過別人,那就麻煩了。這是我們這種注重考試排名的教育文化容易產生的迷思,很多人不認輸,或是輸不起,因為必須以贏過他人來肯定自己、獲得樂趣。

還好,我有足夠的夢想來撐起自己,我不需要盲目與人比成就。我出國留學、去一流公司工作、到學校做研究,為的是學更多的東西。當然,我的些許成就,能讓我在尋夢的過程中獲得生活上和專業上的支持,所以我可以擁有不斷地前進的熱情和動力。對我來說,當電腦工程師和當資工系教授的初衷,從來就不是名和利,只是去園一個夢,一個幼年Maker的夢。

話說,沒有夢想,恐怕在科技的領域上很難走得長遠。

科技的本身往往是冰冷的,越是理性的論述,越是複雜的理論,越是周全的設計,科技的後面充滿的嚴謹但機械式的分析、建構、評估,如果身為一個無法從科技上獲得某種滿足感的科技人,就算以此維生、成名、創業、發財,但從某種人生的意義與從事某種活動的價值層面來看,是極為空虛無聊的。

我不想做冰冷的科技人,我不想過窮到只有名位和財富的日子。骨子裡,我還是狂野奔放的Maker。

當然,我早已不是幼年的那個我,夢想也越築越有個人特色,後來又陸續加入了其他的夢,而這些可以讓我廢寢忘食的夢想,也讓我擁有點燃生命火花的熱情。或許每個人都該從幼年開始築夢,或許該築屬於自己的、複數的夢,而夢與現實相連之處,或許正是感情所寄託之處、身心靈所關照之處。

或許我們可以學習把夢做大一些,學習如何把夢想家的動力帶入現實,學習如何不懼怕夢想的破滅;或許正是因為夢想所帶來此情此景,才好讓我們領略到人生中的因緣際會;或許正是因為懂得觀夢幻泡影,才懂得如何超越一切有為法。

2015年11月18日 星期三

新世代的FPGA

剛剛看到一篇關於IBM剛剛發表在SC15的論文,使用FPGA來加速big data storage和middleware的報導(註),剛好佐證了我們正在做的研究的意義性。

傳統的FPGA的用法,有很多限制,真的要用FPGA加速應用,必須有突破傳統的程式發展典範與框架(programming paradigm and framework)、編譯器技術與runtime support、計算機系統架構、設計與除錯工具等等。

我們也和IBM有些淵源。故事要回到四年前,IBM Austin Research Lab在2011~2013年間與我們合作FPGA加速的技術,那時IBM合作的夥伴是Altera,IBM把FPGA放在Power CPU的旁邊,讓FPGA可以直接存取主記憶體,在當時是很威的設計。全世界沒有幾台原型機,特別運一台到南港給我們做研究。

後來,IBM一連串改組,FPGA加速計畫不知何去何從,南港的伺服器部門大部分轉給聯想。但我們仍舊繼續這方面的研究,沒有金援,就自己湊錢買有點貴而且代理廠商不大懂得支援的FPGA加速卡。

我們在去年發表一篇關於程式發展典範與框架的論文,有興趣者可參考:
MobileFBP: Designing portable reconfigurable applications
for heterogeneous systems, Journal of Systems Architecture (2014).

前幾天才獲得通知,說我們投稿到FPGA 2016 Conference的最新研究成果被接受了,所以明年二月底有機會去北加州(Monterey),現在開始也可以多談談新的研究內容。

論文題目是: A Platform-Oblivious Approach for Heterogeneous Computing: a Case Study with Monte Carlo-based Radiation Simulation, to appear in FPGA 2016.

我們正在做的研究目標類似文中這段所描述的:IBM Systems Group developers will create solution stacks for POWER-based servers, storage and middleware systems with Xilinx FPGA accelerators for data center architectures such as OpenStack, Docker, and Spark.

期許我們的研究能與世界同步,徵求人才中。

 (註)http://www.anandtech.com/show/9790/ibm-xilinx-sc15-collaborating-for-better-powerfpga-system-integration

2015年11月17日 星期二

開源(open source)的大趨勢

今天我們「系統研究專題」課堂上談了開源(open source)的大趨勢。除了開源程式碼已經成為主流之外,資料、硬體也逐漸搭上開源的列車,原因是甚麼呢?

難道開放和分享,是人類的天性嗎? 不要鬧了,果真如此,那我們為什麼有很多東西不願跟他人分享? 為什麼有私人財產、私人企業? 為什麼文章要有著作權,發明要有專利、智財權?

如果有機會請有錢的人、企業家,做點「拔一毛以利天下」的事,看看他們做不做? 我不是批判他們,而是說「開源」這件事,並不是人類的天性,而是基於利益考量下的產物。

坦白說,我喜歡開源的精神和支持開源的做法,但我一直覺得Richard Stallman的Free Software的理念陳義過高、無法落實。就我的觀察,開源多多少少有其利益考量,並不見得是義舉。

首先,貢獻開源程式碼、資料、硬體設計者,以下簡稱「開源者」,往往可以因此展現能力、獲得好名聲、交到好朋友,不必要到處請託,也有機會讓大人物看到長才,一步登天。開源者的知識和能力,對於想使用開放資源的族群和公司,是寶貴的資產。

其次,開放的資源,往往只是起點,好的開源計畫會吸引好人才一起進來開發,讓好的更好。好計畫加上好團隊,再加上有眼光的企業家,大概就成功了一大半。這是為什麼有些開源計畫能夠快速創業、成功吸引投資的原因。

再者,基於開源的產品,比較容易獲得客戶和使用者的支持和信任,所以推廣容易。雖說資源本身是免費,但使用者的支持和信任,以及衍生而出的回饋與品牌形象是無價的,而這些無價的東西往往可以用某些方式創造出價值。

最後,擁有大量使用者的開源技術,由於使用者的回饋和幫助修正,使得開源技術的穩定度和成熟度隨著時間而增加。反過來說,「閉源」(closed source)技術的維護與更新,需要持續投注人力,需要在自家訓練新人,技術可能因為人才流失而無法維護,不穩定的因素較高。

會在課堂上講這些,是因為學生懵懵懂懂,而業界對於開源的觀念也有其侷限性。我被業者嗆過很多次,說技術如果開源,東西都被看光光,怎麼賺錢?

近年來,靠著「閉源」技術賺錢的公司,逐漸踢到了鐵板。有些公司靠著老字號金字招牌,還可以哄騙那些不懂技術的客戶。然而,諸如「買IBM的伺服器就不怕被老闆罵」的思維已逐漸淡化,連IBM都把低階伺服器部門賣給聯想,微軟開始與開源的Linux合作,要不是踢到鐵板,怎會如此?

因為敵不過開源技術的大趨勢,廠商踢到鐵板,只是早晚的問題而已。當然,專利和智財權,是開放資源的敵人,但只要能用開放資源賺錢,負擔合理的專利、智財費用,也還過得去。

相較之下,如果一昧保護,自我設限,可能會搞到產品沒有人理會,技術一文不值。有一些開源技術,來自於失去競爭力的產品,但這類技術本身也日落西山,為時已晚,沒甚麼看頭。

我在課堂上帶著學生看了一些近期的開源計畫的案例,來佐證以上所述。這些案例,包括:

1. Google的Open Source Projects網頁上列出的17個計劃簡介。(https://developers.google.com/open-source/projects)

Google號稱公開了20,000,000行程式碼,900個開源碼計畫,而網頁所列的這17個代表性計畫,都是我所謂「廣義的開源系統軟體」,包括作業系統、程式庫、引擎、程式框架、程式語言編譯器、開發工具,都是提供給應用開發者使用的軟體。由此可見開源系統軟體的重要性。

2. 2014年度最佳十大新鮮開源碼計畫("The top 10 rookie open source projects", http://www.infoworld.com/article/2875439/open-source-software/the-top-10-rookie-open-source-projects.html)

不是只有大公司才能做出好的開源計畫,這裡由媒體選出的十大新人獎,當然不見得一定是最佳的,不過很有參考價值。同學們可以看看程式高手怎麼樣從有系統地解決自己身邊的問題開始,藉由分享和交流成果,獲得贊助,逐漸壯大成為世界級的計畫,有的也成為商業模式。

3. RISC-V所提出的開放式的處理機架構標準 (http://riscv.org/)

Intel和ARM這兩家公司,藉由他們所定義的處理機架構(instruction set architecture),來占據處理機的市場。但這些二十多年前就訂出來的架構,究竟還能風光到幾時?

如果今天有個拋棄一切舊架構包袱、砍掉重練的開放式處理機架構標準,而且有個高品質的社群提供開源的硬體碼和系統軟體,在效能上能夠與ARM和x86並駕齊驅,可以讓我們整個系統的軟硬體都是開源的,不只能夠節省成本,而且在系統設計上將會有無比的彈性以及軟硬體相互優化的空間。

好了,短短三節課,我們沒辦法講太多細節,只能讓各位瞭解整個大趨勢,但我們已經帶各位入門參觀了。這個大觀園裡,有數不清的好東西,還有很多好人,不要因為門票是免費的,就以為沒有看頭,就不進來玩。

我們下周會挑個重點領域來多講些技術,在那之前,各位不妨抽空自己探索一番。如果能好好花時間去看懂以上提到的計畫案例,那應該會有不少收穫。

數學與計算模擬

對我來說,數學是很好玩的東西,小學開始拿著數學百科全書自學,幻想有朝一日能發明某個偉大的定理。但到高中後遇到電腦,到大學後搞懂「混沌」(chaos),瞭解很多東西只是戲論,不需要執著和拘泥於其中。

數學,撇開純粹理論性的研究,在實際應用上,作為科學研究法則之一的「analytical method」,好處是可以推導出公式解(exact solution),但缺點是很難幫複雜系統推出公式解,所以在工程應用上受到相當大的限制,這時往往得靠電腦來輔助。

過度重視數學分析和要求公式解的結果,會忽略了其他的科學研究和工程設計的訓練。科學方法重視:觀察 、解說 、預測 、確認、評估、發表(參考維基百科),而我們的科學教育在資源有限的情況下,只能讓學生被動地去學習科學知識、推導公式、用公式解題。

除了用數學理論和電腦做數值分析之外,實驗(experiment)是第二種科學研究法則,計算模擬(simulation)是第三種,而近年來,資料分析科學(data analytic)成為第四種重要的科學研究法則。學習用其他方式研究科學和工程,不是退步,而是進步。對我而言,與其在公式解上鑽牛角尖,我寧可多去學習多種科學研究方法,或是如何將數學導入實務研究。

我上週與台大數學系和物理系做計算物理研究(computational physics)的兩位教授餐敘,他們認為國內一向不夠重視計算模擬,因為台灣早年根本沒有高效能的計算設備,發展極為緩慢,在教學研究上還是以理論和實驗的流派為主,但現在雖然高效能計算日益普及,應該重新來思考這個問題。

我覺得模擬器的使用,會逐步被放到中小學。與其說是模擬器,不如說是「模型的建構、逼真度的驗證、用以預測結果、解構模擬對象」的科學研究方法的訓練。資料科學,也是如此。真正的科學研究者,探索的是真理,不拘泥於研究方法,沒必要堅持流派。

2015年11月15日 星期日

程式語言

剛剛在臉書上與朋友談論到程式語言。

C/C++對我們做系統研究是很重要的,不過對於某類開發者來說,則強調利用scripting language來使用現成的工具做應用,求新求快。我們應該不能說這些程式語言有高下,但有些人像是入了某個宗派,一昧說自家的好,別家的不好。

說自家的好處,也無可厚非,只不過針對語言的使用情境應該要分辨清楚,而不是以偏概全地說,學某某語言才是王道。我想東西只要有用,都有其重要性,況且程式語言只是個工具,學生要能舉一反三,無論學生先學C、Java還是Python,重點都在於計算思維,如果真的懂了,第二種語言只是一碟小菜。

但教者和學者要知道語言與應用的關聯性,各種語言有其最佳的用途。學生如果不會C的話,進我的實驗室或是到業界從事與系統相關的研發工作時就會有問題。當然,這不代表學生不能先學Python再學C,也不代表他不能花時間學 Python或其他,而這個例子,當然不代表所有資訊產業。

不過,所謂「由奢返簡難」,由scripting language入門者,在遇到較低階的語言時,比較常有適應不良的情況。而設計應用軟體的,用很多友善的圖形介面工具,如果突然來做系統軟體,也常常適應不良。這是習慣問題,並不是改不了,如果當時學習得法,不是硬記的,問題應該不大。如果是硬背的,那當然就麻煩大了。

以下專談系統軟體人才的訓練:

我們發現大多數學生到了研究所,對於系統軟體所需具備的程式能力還欠缺許多,而過去系統廠大多只希望受過訓練的學生去幫系統寫驅動程式,所以學生們也不願積極學。所以我最近在推動的開源系統軟體,也有一部分的原因,是基於這些問題。然而有太多系統商等著要揀現成人才,卻不願贊助人才培育,只會大喊人才不夠。

我人微言輕,平時指導幾位學生,或是跟朋友們分享我認為系統軟體的重要性,而教育的決策,需要更多人一起來影響。例如,廠商若認為系統軟體很重要,不妨多提供一些高級研發的工作機會,或是直接提供資源贊助做系統軟體教學研究的老師。

我隨時歡迎關心人才培育的業界朋友來提供意見和資源,當意見是好的,資源也到位的時候,那麼對的事情就可能發生;但如果沒有直接給予資源,可能意見再好也沒有用。培育菁英系統人才是很耗資源的,需要有先進的設備和足夠的經費,我們才能多做些貢獻。

2015年11月11日 星期三

悅讀程式

我說過寫程式像是寫文章,但仔細想想,我們很多人學習寫程式的方法,和學習寫文章所採用的過程,似乎有很大的差別。(網誌上的圖片,是從書架上找到的,我高中一年級時讀過的兩本原文書,放在這裡紀念我那段學習程式設計的歲月。)
大部分人如何學習寫程式?從寫Hello World!開始,一路學習程式語言的語法、控制結構、資料結構、演算法等等,但即便是資訊系的學生,除了課本中的範例程式、習題解答、程式競賽題庫之外,究竟看過多少別人寫的程式碼?
少得可憐。
學寫文章可就麻煩多了。我們從小先學會聽話、說話,然後才學認字讀文章,過一段時間後才開始學寫文章,這是自然的過程。如果沒有讀過幾篇文章,光是研究文法、修辭學、背成語辭典,可能成為好作家嗎?沒看過小說,可能成為小說家嗎?
不大可能。
很多作家每天還是大量閱讀別人的作品,欣賞和學習別人的才華。日常所讀的文章,多半比自己所寫的多得多。藝術家、建築師也不是整天埋頭苦幹,常常要去看過別人的作品。
但為什麼我們不是這樣學寫程式?為什麼覺得參加程式競賽得獎才是程式高手?
因為「急就章」。想要再最短時間內獲得一項技能的「認證」,最有效率的方式,就是針對認證所考驗的項目做準備,不考的就不準備。因此,學生會先去搞清楚,程式競賽考什麼?程式設計課期末考什麼?碩士班入學考什麼?程式技能檢定考什麼?某公司面試考什麼?
但急就章訓練出來的,問題很大。就拿進到研究所的學生來說,看不懂別人的程式碼,寫出很爛的程式碼的,不會用程式開發工具的,比比皆是。我們為了要做系統研發,不得不花很多時間訓練學生去看別人寫的程式碼,但不少學生視為畏途,甚至會排拒,以為要寫出屬於自己的程式才是神人。
對這類同學,我想我幫不了忙。
我想,急就章的作法很多,不是只有程式設計。國內學英文的方式,也有文章讀得太少的問題,和學程式設計的過程類似。台灣學生學習英文時,偏重於文法、單字、成語,很多學生除了課文之外,沒讀過幾篇文章,於是常常有些成績還不錯的學生用英文所寫出的論文,讓我目瞪口呆,欲哭無淚。
那麼,想扎實地學,學好後證明自己的能力,該怎麼做呢?
這裡有個簡單的方法:從大量「閱讀」開源程式碼開始訓練自己,到達能夠「悅讀」高品質的開源程式碼,進而對重要的開源程式碼計畫做出「貢獻」。
舉例來說,幾週前,大學沒畢業的黃敬群教授(jserv),帶著的一位剛從台大電機系大學部升碩士班的學生,到奧地利發表他們利用這個暑假對Linux/Xenomai開源碼所做的貢獻。沒有期刊論文點數,貢獻不被台灣的學術界承認,但這趟旅程獲得業界的贊助。
在國外,數不清的優秀軟體人才,熱心參與開源碼計畫,匯聚成高品質的社群和人脈;歷經千錘百鍊的開源碼計畫,擁有許多精益求精的程式碼,開再多課也講不完。
既然講不完,學校只是帶領入門而已,修行在個人。
我在2000年離開學校到矽谷的SUN公司工作時,看到身邊很多同事整天盯著螢幕看程式碼,有一天我忍不住問一位資深的同事,為什麼這樣做?他露出不可思議的表情後說,找別人最新釋出的程式碼來看,已經是習慣,也是興趣,沒事就會如此做,而且他們會以程式碼論英雄。說著說著,一邊指著螢幕上的程式碼,開始評論起作者的寫作風格。
此後,我不敢自稱為軟體工程師,因為我知道我看過的軟體程式碼太少。但是因為工作需要,我必須分析幾個大型軟體的效能,想辦法找出瓶頸加以改善,包括當時最精良的作業系統Solaris,網頁伺服器iPlanet Web Server和Apache HTTP Server,以及幫通訊加密的NSS和OpenSSL,也用了開源碼解決不少工作上的需求。
幸好,我廣結善緣,周遭這些同事幫了我很大的忙,公司裡面厲害的人太多,我也從他們身上學到許多。也因此,我始終還是不敢自稱為程式專家,因為和這些同事的程度差太多了,追都追不上,還好我另有專長。
十年前回國後,莫名地接到了要開一門新課「Linux Kernel and Device Drivers」的任務,我這個非程式專家,花了很多時間了解Linux kernel的原理和程式碼。為了教「平行與分散式程式設計」,我也得學Hadoop、CUDA、OpenCL等新出來的東西,但我在教學相長、樂在其中的同時,我發現很多學生是不看程式碼、不懂得自學的。
因此,我想鼓勵想自學的朋友一起來悅讀開源碼系統軟體。
挑選系統軟體,有幾個原因:第一,世界上非常多開源碼計畫,我不想太發散,我們必須先聚焦在特定領域上;第二,系統軟體與台灣的產業高度相關,可培養產業轉型所需的軟實力,又不會距離太遠;第三,這是我個人的研究專長和興趣。
因此,我稍早說我這幾年想推動開源碼系統軟體,除了這些軟體本身的重要性之外,還有其更廣泛的教育意義:希望讓我們的學生和業界朋友,一起來多讀一些高品質的程式碼,研討大型的軟體專案的架構和運作方式,來提升自己的眼界。由此入門,逐漸能充分運用和賞析別人的作品,應該比較有機會成為高段的軟體設計師。
我希望多成立一些愛好開源碼系統軟體的社群,藉由賞析和討論這些重要的開源碼來促進軟體人才的跨國交流和合作,希望大家能一起來提升國內系統軟體研發的水準。不然,我們很難有世界級的軟體人才。
話說,學程式設計和學英文,可能相輔相成,這是我個人經驗談。
我自己因為高一時迷上了電腦,嫌當時中文翻譯的書太少,時常到重慶南路的書店站著原文書,也省吃儉用買了不少書回家看,不知不覺中增進了英文閱讀能力。隨後我發現,學校英文考卷上的閱讀測驗和作文,對我來說都不是甚麼大問題。
延伸上述個人的經驗,我提出幾個臆測:(1)多讀優質的開源碼,有助於英文的學習。(2)程式設計的訓練,有助於英文寫作。(3)英文能力的提升,有助於理解高階的程式碼 (4)英文能力和程式能力的提升,有助於與國外交流以及走上國際舞台。
話已經說在前頭,這只是我一時興起的臆測,是否適合每個人,請自行判斷。但現在隨手可得的電子書、程式碼教學、線上課程這麼多,如果師父帶進門之後,因為不懂得大量閱讀而學藝不精的話,恐怕要怪自己了。

2015年11月6日 星期五

大數據分析與高效率異質運算

在萬物聯網的時代,人機互動頻繁,機器與機器之間以高頻率合縱連橫,大數據分析成為提升智慧和生產力的重要工具。在很多場合中,運算不再只是為了滿足傳統需求或是取代人力,而是為了增進使用者經驗、預測物理世界的行為、建構擬真的電腦世界、探尋未知的知識、賦予人類新的能力。許多以往只存在於科幻電影的情節,可能會隨著運算能力的成長而逐漸出現在我們眼前。

然而,由於數據之大、分析之複雜,要率先開發出上述的應用,必須仰仗高效率的運算能力。在這樣的情況下,史無前例地,異質運算已不再是超級電腦和少數科學家的秘密武器,而是開發者用以挖掘大數據金礦的新銳工具。誰能夠善用多核心處理機、計算叢集、GPU、FPGA、硬體加速器,誰就有可能領先群倫,率先在新領域上建立灘頭堡。以往我們在超級電腦上所鑽研和使用的技術,大量地被用來加速大數據的分析,懂得如何駕馭這些技術與工具的專家,也應運成為炙手可熱的人才。

在這八個小時的課程中,我們將擇要解說大數據分析與高效率異質運算的基本概念,介紹具代表性的軟硬體的架構與技術,最後做若干個案的探討。這是一個進化迅速的領域,我們希望藉由本課程的內容來澄清和增進這個領域所需的運算思維、連通概念與實務,作為入門的階梯。

1. 大數據分析的基本概念
2. Apache Hadoop開源碼計畫
3. 高效率異質運算
4. 連通大數據與異質運算
5. 個案探討

(以上是準備中的短期課程的課綱)