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


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

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

沒有留言:

張貼留言