上一篇文章提到了模型不環保這個話題。這篇文章就這個問題展開唠叨一下。
自從BERT, GPT此類的大型模型誕生以來,小作坊們除了把pre-trained的模型拿過來微調一下,就束手無策了,因為成本實在是太高,實在不宜重制。而大型網絡繼續擴大,似乎并沒有停下腳步,模型計算量的增加速度大大超過了摩爾定律。我們驚歎于AlphaGo的能力的時候,可能不知道它一小時的cost是一千美刀,訓練cost更是高達幾千萬美刀,這是根據tpu, gpu的租用成本算出來的,與人力研究成本無關。有學者指出,訓練出一個大型深度模型的二氧化碳排放,可相當于五輛汽車的終生二氧化碳排放量。
可實際上,人的大腦在處理事情的時候,是以高效節能著稱。大腦在處理一件比較複雜的事情,在不太熟悉的時候,大腦需要消耗比較大的能量,之後處理類似事情所需要的能量越來越少,甚至最後無意識下就已經處理好了。
對于人工智能, 擴大網絡,增加計算複雜度,真的是AI的方向嗎?很多學者提出了質疑。
近幾年對于AI的綠色環保問題也越來越多的引起關注。
根據資料統計,在雲端,關于機器學習計算負載,20%是訓練,而80%的是模型的使用(預測,歸類,推斷。。。)。
從這個資料來說,對于AI的環保節能,提高模型使用效率似乎潛在的貢獻更大。當然模型使用效率對于商業需求來說,更加的緊迫。模型的計算量大,意味着延時大,硬體要求高,成本大。環保節能和商業需求一緻,也算是一個好消息。
很多企業也積極公布自己的節能預測good practice。之前提到過的Roblox的一篇blog,談論如何在cpu上每天做1b個基于預測。https://blog.roblox.com/2020/05/scaled-bert-serve-1-billion-daily-requests-cpus/ 其中用到了distillBert(壓縮的模型), 緩存等方法來提高預測吞吐量。
很多企業,由于軟體基礎架構的限制,使得模型訓練平台不适用于産品平台,是以必須引入适合于産品平台的模型預測架構。對于采用什麼預測平台,對于最終的預測效率會有很大的影響。如何給模型feed資料? batch怎麼設計? 為了避免頻繁padding浪費資源,可能需要把大小差不多的資料放在一個batch裡。細節可能決定成敗。
之前做一個項目,在實驗室裡對于第一版的模型進行調試的時候,發現資料預處理和後處理所需要的時間居然和深度模型本身的計算時間差不多,真是大大吃了一驚。很多的Data Scientist們往往隻注重模型的架構和模型最終的準确度,而資料處理往往跟着感覺走,對了就行,但到最後,常常就是這些細節阻止了模型上線。當很多的pre-trained的模型可以使用時,資料處理慢慢成為機器學習工程師們的主要工作部分。pre-trained的模型往往是經過優化的,複雜的計算是用c實作的,而用python做的資料處理如果不注意,用錯資料類型,就會掉進之前提到的陷阱。之前quora上有人提到,機器學習模型,合理的代碼量和運作時間配置設定比例是,90%以上的代碼是python寫的,而90%以上的時間是跑在c上面的。推薦一篇文章,關于深度模型部署的good practice: https://towardsdatascience.com/an-empirical-approach-to-speedup-your-bert-inference-with-onnx-torchscript-91da336b3a41
那麼對于模型訓練的環保節能,有什麼好的實踐可以借鑒呢,或者好的方向可以深入研究呢?我覺得,transfer learning, meta learning和模型壓縮,都可以說對機器學習的環保節能做了很大貢獻。
transfer learning充分使用了已經訓練過的模型,不管是模型的整體微調,或者疊加簡單層再訓練,都可謂站在巨人的肩膀上,在保證品質的同時,大大減少了訓練時間和成本。很多企業和研究機構共享了成功模型,使得這個方向越來越普及。