當前位置:
首頁 > 最新 > AI演算法實現與雲平台應用

AI演算法實現與雲平台應用

陳迪豪,第四範式先知平台架構師。個人興趣廣泛,在開源社區比較活躍,維護了1600+ star的容器Web管理平台Seagull。大二加入了小米做Android移動端開發,然後有幸學習到後端基礎架構技術,參與了HBase、ZooKeeper等社區開發,並且開源了NewSQL依賴的全局嚴格遞增timestamp服務chronos,對分散式存儲有一定了解。後來加入雲服務創業公司UnitedStack,負責存儲、容器、大數據業務,參與了OpenStack、Docker、Ceph等開源項目,在Austin OpenStack Summit上分享了Cinder多後端存儲相關的技術,期間也獲得了AWS Solution Architect認證。目前從事雲深度學習方向,負責深度學習平台的架構和實現,對容器調度系統Kubernetes和深度學習框架TensorFlow有一定了解。

我是第四範式的架構師陳迪豪,我們從14年就開始做機器學習,現在機器學習特別火,讓我們也感到很困惑,因為大家把跟計算機有關的都說成是智能,或者是AI。根據我的經驗,標題里有AI的分享,10個可能超過8個都有點忽悠人。但是昨天於老師的「小詩機」和洪強寧教授的chatbots都講得特別好,根據8/10原則我是有點壓力的。今天給大家介紹一下AI相關演算法實現,希望大家理解它的實現,對真正的人工智慧或者機器學習有一些新的理解。

我是ECUG的新人,首先自我介紹一下。我在13到14年參與了HBase和Hadoop的開發,之後去做OpenStack,也是社區的貢獻者,大家看得出來我前兩年做的是Infrastructure。我最近在做TensorFlow和機器學習相關的東西。我也是一個開源項目Seagull的作者,現在在第四範式做先知平台的架構師。今天的議題有三個:

人工智慧與機器學介紹

機器學習演算法原理與實現

雲機器學習平台架構實踐

人工智慧與機器學習介紹

圖 1 這些是人工智慧嗎

機械自動化。昨天洪教授講到了第一工業革命就是蒸汽機,第二次是流水線。其實很早以前我們就有機械自動化,我們就用電控制舵機做一些重複的操作。但是最近我們看到了更多是把機械自動化描述成人工智慧工廠。然而很多工廠只是用到了機械,但是卻被描述成智能工廠。

字元串生成。前一陣子還發生一個笑話,Facebook他們生成字元串的應用有個bug,導致生成亂碼,卻被媒體宣稱為機器人自己發明的一種語言,它們在交流。其實並不是,在那種模型裡面他們用機器學習生成字元串,但生成字元串並不需要人工智慧,還有很多別的方法。

驗證碼識別。還有比較可笑的驗證碼識別,這也是很多年前的技術了,但被某電視台的新聞欄目,宣稱他們抓獲了全球第一例人工智慧黑客技術犯罪,其實是有人提供驗證碼自動識別的服務而已。

作為我們行業內的人來看,這些都不是人工智慧,只是滿足PR或者行業投資的需求,從技術實現的角度,這些絕大部分都不是人工智慧。

圖1的右邊是我生成的一個Numpy數組,可以用表示一個AlphaGo的模型。有人以為AlphaGo會自己跟自己下棋,並且自學了圍棋的規則,甚至開玩笑說自己悄悄地用網路對戰平台和別人下棋。但從專業的角度來看,AlphaGo只是這樣一個多維數組,裡面有很多浮點數代表了模型的權重。如果把AlphaGo列印出來,它就是一個數組,它的輸入就是一個表示棋盤的Tensor,輸出是下子的概率和贏棋的概率。而且AlphaGo圍棋的規則是程序員編碼硬實現的,包括怎麼判斷遊戲的輸贏。這些都是目前人工智慧或者說機器學習不可能解決的。

圖2 機器學習定義

我們來看一下人智能它比較經典的定義,這是一本機器學習教材,作者Mitchell被公認是機器學習之父。它對機器學習的定義:一個計算機程序,它在某一個task裡面,根據以前的經驗experience,可以通過計算來提高performance。總結一下就是:在一定的場景裡面,我們定義一個指標,如果我們有標記好的數據,也就是樣本,然後通過計算得到一個模型。模型的輸入是樣本,輸出是預測的概率。所謂的機器學習就是一個計算的過程,無論是訓練還是預測。

圖3 機器學習應用

圖3是一些典型的機器學習應用。給我1000張標記為貓的照片,得到一個識別貓的模型,並且正確率越高越好。給我1000萬盤圍棋的棋局,得到一個AlphoGo模型。給我信用卡的歷史操作記錄,得到一個反欺詐模型。

怎麼得到這個模型其實是最複雜的。數據往往是非結構化的,有各種類型,我們沒有一個得到模型的統一方式。而且有些是分類模型(識別貓),有些是生成的模型(GAN),它們的應用場景都不一樣。

圖4 得到機器學習應用1

模型的訓練過程很複雜。我們都知道給我1000張貓的圖片,能得到一個識別貓的模型。問題是能不能訓練出一個比GoogleNet或者ResNet效果更好的模型。真正做機器學習應用的,都需要做到圖4中的過程,並不是說給我貓的圖片就可以得到很好的模型。一般的過程,包括這幾個部分:

定義模型的使用場景,也就是業務邏輯。場景定義有很多種,包括二分類,多分類。很多時候我們在做一些銀行的業務,目標是提高利潤。但這並不是機器學習業務能理解的東西。假設這是一個營銷的業務,系統會給用戶發送理財產品推薦的簡訊。我們把場景定義成二分類,即推薦什麼樣的理財產品用戶的購買概率更高,對這個理財產品可以做模型預測,即買或是不買的概率。

數據清洗。數據清洗跟傳統的大數據處理其實沒什麼區別,有些特徵可能需要補全或者去掉。用到的技術就是,MR(MapReduce)或者Spark,還會用到Knowledge Graph的領域知識。

特徵抽取。我們要從數據里生成一些特徵,特徵其實也是數據的欄位,但只是用於機器學習。例如數據里可能有人的性別和年齡,但生成的特徵可能是幾十萬維甚至幾百萬維的。例如對於線性模型,我們不能將原始數據直接放進去。怎麼做特徵抽取呢?這跟後面使用的模型框架有關,我們必須生成框架支持的格式。在真正做的時候我么會定義一個特徵抽取的DSL,用戶通過簡單的描述就可以將生成Spark任務。對DSL我們做了一個AST的parser,可以支持像libsvm或者TensorFlow的TFRecord格式。

模型訓練。在訓練的時候選擇就很多了,業界已經證明的一些機器學習演算法有LR、GBDT、DNN、NB(Naive Bayes)等。還有我們自研的將離散值轉連續值的演算法HETreeNet,因為樹模型對連續值支持更好。我們可以使用不同的框架,例如TensorFlow就是一個很好的DNN框架。

模型上線。模型上線以後就是一個服務,我們可以部成一個微服務或者單機起的一個進程。我們目前用Thrift server。上線以後同樣要解決例如負載均衡和高可用的問題,還有認證授權,我們使用AKSK的加密方法。

自學習。跟普通的應用不一樣,大部分機器學習模型都是有時效性的。例如頭條裡面的推薦,最近一個月大家都在關注娛樂,那麼娛樂特徵可能是重要的,那我們就要拿增量的數據來繼續訓練模型。這裡我們就需要一些SDK的功能,還要支持不同的數據源。模型訓練可能是離線的,我們從Database里取出數據就可以了,在自學習時可能就要接Kafka或者一些Streaming的數據。我們模型的框架還支持online learning,也就是在線更新模型權重。

今天會花比較多時間給大家介紹兩部分,第一個是機器學習的演算法,第二是怎麼搭建一個機器學習的平台。

機器學習演算法

圖5 邏輯回歸1

機器學習的演算法很多,這裡不能一一介紹。主要給大家介紹邏輯回歸的實現。現在DNN很火,大家都在聊DNN、CNN、LSTM。做圖像、自然語言還有語音處理這些非結構化的數據裡面會用到CNN或者LSTM。但在我的工作場景裡面,大部分都是銀行的業務,我們用的最多的模型是LR(邏輯回歸),包括我同事在百度鳳巢做的CTR預估。不同的機器學習演算法都可以解決像二分類或者回歸的問題,但實現原理和針對的數據是不一樣的。如果大家有看AlphaZero論文,就知道它的演算法並不是用邏輯回歸,而是用ResNet,等一下會介紹AlphaZero的實現。但是這裡面有一個問題,我們可不可以用邏輯回歸來代替ResNet?答案是可以的,其實AlphaGo是一個蒙特卡洛搜索和一個NN神經網路,之所以不用邏輯回歸是由於邏輯回歸是一個線性模型,沒有很強的表達能力,如果我們的特徵做的足夠複雜,也可以訓練一下模型LR-based的AlphaZero模型,但肯定達不到DeepMind的效果了。

這裡介紹一下邏輯回歸的實現。LR是一個監督模型,也就是必須要有訓練樣本。LR也是一個線性模型,就是說你給的特徵是有線性關係的,例如我們訓練一個模型,可以根據年齡來預測收入。我們通常認為年齡越高收入越高,其實並不是這樣的,例如超過了60歲,年齡跟收入是成反比的,這裡就不能只用年齡了作為特徵。它是高性能的,等一下會介紹,只需要做一個加法就可以了。LR是高性能的,因為一次預測只需一次加法運算,這跟神經網路要做矩陣的乘法和加法是不一樣的。LR的可解析性強,它的每個權重都是人可以理解的,有一定的含義。LR的擴拓展性強,很容易實現一個分散式的LR,支持億萬維的特徵。即使是TensorFlow也無法支持這麼高維度的模型。

圖6 邏輯回歸2

圖6是一個例子。邏輯回歸需要的樣本是用數字編碼好的,我們原始的輸入可能是字元串,男和女,或者是一個英文,這就需要特徵抽取進行編碼。像年齡,剛才提到了,因為邏輯回歸是一個線性的模型,因此並不會把年齡作為特徵,這裡簡單做了一個分桶。這裡有一個隱藏的含義,假設年齡0到30,預測它的收入是大於50萬,兩者是線性相關的。如果是成正比的話,這個權重就會大於0,年齡越大這個權重得到的越大,實際上並不是這樣的,做機器學習裡面有很對trick,比如說這個分桶不一定有效的,我們把它做成多分桶的,甚至每一歲做一個特徵,這裡可能就有80個特徵。這是一個簡單的例子,如果我們可以收集到這樣一些樣本,把它進行0-1編碼,我們就可以訓練一個LR的模型。實際上模型是什麼?DNN的模型是一個矩陣,而LR的模型就是一維的數組,數組的長度跟特徵的維度一樣多的,每個特徵都對應一個權重。

圖7 邏輯回歸3

當我們來一個新的樣本,知道他的性別男,年齡27歲。怎麼預測他的收入是不是大於50呢?邏輯回歸的演算法很簡單了,數據維度跟特徵維度是一樣,乘以樣本,把對應維度裡面的值相加。如果場景是二分類,經過激活函數得到一個值,大於1的我們就認為是1;如果它是一個回歸的問題,就不需要激活函數了,得到的就是一個預測值。

LR是很簡單的,前面我們看到圖象分類,AlphaGo的下棋都可以用這個簡單的模型。包括我們做的信用卡的反欺詐,可以把用戶信息、消費記錄,包括消費的時間地點進行編碼。更複雜的情況,我們把年齡和性別做一個組合,會生成新的特徵,即男30到60歲,女30到60歲等。我們可能會發現只有在特定的性別和年齡的組合上,權重才是更高的。我們如果把原始特徵這樣編碼,LR學不出這種非線性的變換,這個時候需要有更強大的特徵工程能力,可以對這種特徵做任意的組合,或者根據我們的業務經驗生成更好的特徵。以前在鳳巢的時候就是不斷地做特徵,不斷地加,最後發現效果特別好的特徵,最後準確率就提高了。現在大家都說DNN可以自動調參,但在真實場景下這個過程是不可避免的。即使用很複雜的模型,我們的特徵不做分桶交叉,也很難得到很好的模型。

如果是做圖像處理,我們就在每一維里記錄圖像的像素值,然後把像素值最為一個特徵。如果做圖象分類,肯定不會用邏輯回歸,因為圖象的特徵,它並不是跟你的目標線性相關的,我們只能用更複雜的模型如CNN和DNN來表達這種能力。

圖8 邏輯回歸3

怎麼實現邏輯的回歸?如果用TensorFlow實現就很簡單,圖8就是一個完整的實現邏輯回歸模型,可以把圖片載入進來進行多分類。標出來的部分(第一個紅框)定義了一些Variable,這裡面就是我們的所謂的模型,這裡定義了一個矩陣,維度是784×10。為什麼784?因為我們用的數據集是手寫的數據識別的數據集,大小是28×28,它的象素就有784個,它的模型也是784,因為它是10分類,它的模型其實就是784×10,把這個分類模型列印出來,得到的是一個矩陣,有784行,每一行有10列。

下面(第二個紅框所示)定義的是我們模型訓練的方法,我們可以定義不同的損失函數。 給一個模型,不同的權重乘以圖片的輸入,再跟真實的Label來比,它們相差多少,不同模型可以用不同的指標。圖像分類我們經常會用這種交叉商;如果是一個回歸的問題,例如相乘以後得到一個預測收入(前文的例子),這邊是實際的收入,我們怎麼描述它們的差別,我們可以做一個相減,然後求平方或者絕對值。這裡是為了讓TesnorFlow知道你怎麼描述loss,tenserflow有一個自己求梯度的系統,會給你求函數的梯度,讓模型往梯度最低的地方走,然後讓loss降低,loss越低表示預測值和真實值相差越小。實際上我們可以自己實現一個自動求梯度的框架。

圖9 邏輯回歸4

總結一下,邏輯回歸是一個簡單而強大的機器學習演算法,廣泛用於推薦系統,CTR等場景。LR是一個線性模型,所以使用前需要一些特徵工程的步驟。LR的模型是一維數組,數組裡面的權重可以用浮點數或者雙精度浮點數來表示,數組的長度和特徵的維度相同。LR要定義loss函數作為指標,如CrossEntropy。LR訓練時要優化loss,流行的方法是梯度下降演算法,它有很多優化器,比如Adagrad優化器。LR特別容易訓練,預測的性能特別高,也很容易實現分散式訓練。怎麼實現分散式訓練呢?一般我們會有一個Parameter server,存它的模型,它的模型就是數組,我們把這個存起來,這個模型可以很大。Parameter server在工程上就是一個KV資料庫,可以用HBase,如果單機放得下也會用Redis,甚至在內存裡面也可以實現Parameter server。一般不會用NoSQL去實現, 昨天洪教授也提到了權重更新可能很頻繁,並不需要每訓練一次就把真實的值寫到NoSQL裡面,寫到NoSQL裡面會落盤,但我們並沒有一致性的要求。實際上我們很多Parameter server都是基於內存實現的,它掛了會有丟數據的情況,但我們可以定期做snapshot,保證只有最新數據就可以了,哪怕掛了通過重新訓練也可以達到類似的效果。

圖10 AlphaZero

AlphaZero是AlphaGo最近的升級版。大家看pr稿上說AlphaGo用了一些人類的知識,而AlphaZero則摒棄了人類的知識,通過自我博弈得到更好的效果。其實AlphaZero只是把棋局預測輸贏的部分用一個神經網路替代了。AlphaGo每下一步棋該怎麼評判這一步棋好不好?AlphaGo裡面有一個快速走子網路,輸入一個棋局,預測一下這個點,看贏的概率是多少?這個快速走子網路是用一些人工的規則,例如以前根據人類的棋局得到一個公式,不一定是神經網路。輸入棋局然後輸出一個結果,這一部分以前是依賴於人類的一些歷史棋局。而AlphaZero變化的部分是把規則給去掉,不用以前人類的數據,而是用神經網路,讓神經網路學習。如果我們只給一個棋局,我們正在比賽,下一個下棋,不管用CNN還是什麼,不可能知道這個棋贏的概率多少。所以在AlphaZero裡面,每個樣本產生出來,不可能每下一步棋就生成一個樣本,然後告訴你下這步棋贏的概率,而是必須把整盤棋下完,這裡面有700步棋,一直讓它自動下,下完以後,最後贏了,那麼這700步棋裡面贏的概率會加1,最後是用統計的方法。

AlphaZero裡面的演算法最重要的是蒙特卡羅樹搜索,把它列印出來是神經網路。其實也可以用簡單的模型來替代。AlphaZero使用蒙特卡羅樹定義圍棋規則,例如機器人不知道我已經下子的地方不能再下,這是在寫代碼的時候寫死的。

AlphaZero是有監督的學習,並不是無師自通,或者自我博弈。其實自我博弈一開始隨便下,下了一些棋局,根據這些棋局來學習的,但它比其他監督學習好的地方是不需要人類去標數據。它這個學習相當於模仿前面的棋局,用神經網路很容易做,把AlphaGo以前訓練好的棋局,然後寫一個DNN,得到一個跟以前棋局下法擬合地最好的模型。

AlphaZero用到了增強學習,自己跟自己下,把贏棋的那部分拿出來,認為這部分是好的樣本。然後去學好的樣本,得到一個新的模型,新的模型與舊的模型對比,贏出來的就作為一個新的好樣本。它其實是用了一個增強學習,生成更好的樣本,而且是用有監督學習的方法生成這個樣本。大家不要覺得它很神奇,它並不是真的掌握了圍棋的規則,其實都是計算出來的。但計算很有技巧,樣本不是隨便給的,也不是人類最頂尖的棋局給他,而是自己跟自己比,把贏的棋局作為樣本。其實訓練了很多的模型,有的模型訓練完了以後效果不如前一個模型,到後面直接扔了。

最後怎麼表達這個模型呢?給一個棋局要怎麼告訴我贏棋的概率是多少?裡面是用一個ResNet,它的好處是層數可以做得特別多。這個模型就是一個function,輸入特徵,也就是當前棋局的形勢,輸出概率。這個效果比我們用專家規則好。

AlphaGo只適用於Combination game。零和,即一定會有輸贏,沒有合作的機制;完全信息,即雙方都可以看到棋局;無隨機,即每一個操作都是確定的。它不能遷移到德州撲克,麻將之類的遊戲。

圖11 MinMax

這裡介紹博弈論裡面比較簡單的演算法,通過簡單的MinMax演算法,然後過渡到AlphaGo的蒙特卡羅樹搜索。每個圓圈表示你的下法,可以選擇左邊或者右邊。當你選擇到左邊或者右邊以後,對手也可以選擇左邊到右邊。這個棋局很小,我們可以枚舉所有可能的情況。我們的目標是讓最終得分最高。顯然正無窮是最高分,但是上一局是對手的回合,對手看到正無窮肯定只會選10,下一回合我會在10和5中選擇10,但到再下一句對手會選擇-10。

這種博弈的遊戲並不是自己找一個最優解就可以了,你得考慮對方。對方有可能很傻,直接讓你贏,也有可能跟你一樣聰明。在這個遊戲裡面我們既可以枚舉所有情況,也可以用一個MinMax的演算法找最優解。這個演算法很好理解,在某個階段是對手的回合,我們假設對手很聰明的,總會選擇最低分(min)。我們的回合裡面就在可以選擇的範圍裡面選擇一個最高分(max)。假設對手是很聰明的,就會選擇一個更低分的給我。如果我們玩這個遊戲,我們一開始應該選擇右邊,這裡就達到了博弈論裡面的納什均衡點。我們做出決策,對手也做出決策,當雙方不能通過改變決策拿到一個更優解的時候,我們就達到了一個均衡點。這是解決博弈論裡面的演算法,你要遍歷所有的情況才能找到最優解。大家聽到過alpha-beta剪枝,其實就是優化MinMax的演算法,不需要每個值都算一遍。

圖12 蒙特卡洛搜索樹

圍棋可以這樣做嗎?剛才說了基於蒙特卡羅樹,也是一個數的結構。這是一個棋盤,有361種可能,當我下某一個子時候,對方有360種可能,這樣我們可以得到一個維度超高的樹結構。假設計算能力足夠,我們知道最後一個回合是輸還是贏,我們假設對方讓我輸,就不選擇這種方法了,每次都選擇自己最優的,假設對手也讓我選擇輸的,理論上可以用MinMax演算法解決AlphaGo的問題。這個演算法很簡單,但是不能用在AlphaGo裡面,因為它的維度很大,每個點都有300多個選擇,300多層,幾乎不可能遍歷,即使有alpha-beta剪枝也解決不了。

圖12就是一個蒙特卡羅搜索樹。我們要在一定的computation budget裡面,找到效果比較好的分支,我們可以自己模擬下棋,下完發現這一個分支贏了,那就認為這個可能是好的分支,但對方改變一下策略你可能就輸了。蒙特卡羅樹要解決的問題是怎麼樣找到一個好的分支,你可以嘗試很多次,但是你不能無限次的嘗試。換言之就是怎麼權衡Exploration和Exploitation的問題。Exploration就是有的棋沒有下過,所以會儘可能探索一下,但是卻不可能窮盡。如果我們只有探索的策略,就是一個隨機的策略,哪兒沒有探索過就去探索一下,這種演算法效率很低的,沒有啟發式的,就是盲目的探索,得到的有效的樣本是很少的。Exploitation就是當我發現走這邊可以贏,我儘可能前面都走這邊,下面不斷的稍微調整一下,把這一塊都搞清楚了,以後如果繼續都這樣下,後面就會贏,探索空間很小,有些是沒有探索過的。怎麼解決這兩個問題呢?比較簡單的就是給一個權重,比如說0.01,我們每次生成一個隨機數,1%的機會會去探索新的節點,否則就會利用舊的節點。

圖13 蒙特卡洛搜索樹

MCTS是一種啟發式的搜索演算法,在有限的計算空間裡面可以找到相對好的結果。它這裡並不一定能夠給你找到絕對值。能不能證明AlphaGo一定是最好的下法?肯定不能,因為它並沒有探索完。但是通過這種方法,找到了一種勝率又高,探索過的地方又比較多的演算法。圖13是原生的MCTS的四個階段。包含了幾個函數:

選擇(selection),上面有一些數字,左邊是贏的次數,右邊是被訪問的次數,父節點是子節點的和。例如最右邊的節點是0/3,表示這個節點已經探討過3次,但一次都沒贏。例如圍棋的第一步就下在邊角,真正測試過邊角的情況,測了幾次,每次都輸,這個時候下在邊角的概率其實很低的,但是它的概率又不能低為0。MCTS會選擇贏的概率大但訪問次數不是很多的節點。例如這裡選擇了3/3節點。找贏的概率最大,並且訪問次數不是很多的節點,

擴展(expansion),在剛才選節點裡面增加一個新的節點,然後初始化為0/0。

模擬(simulation),用這個節點跑一次,相當於圍棋裡面真正下這一步了。我們這裡用的是快速走子網路,下到這兒以後,我用一些專家規則讓它跑,最後發現很可能到這兒是輸的

反饋(Backpropagation)反饋到上面,這條路多訪問一次,贏棋的次數並沒有增加。

這是一種啟發式的演算法,訪問次數也是一個參考的因素,若發現訪問次數太低,會先忽略勝率,我去試一下看會不會贏。這就是數搜索裡面的一種啟發式演算法,現在的計算能力很強,這種演算法就很好的。

圖14 AlphaZero

圖14是從AlphaZero論文裡面截取出來的,它也有四個階段,名字與前文中的類似,因為它用的就是MCTS。一開始的神經網路的預測是很不準的,初始化會隨機生成一些浮點數,乘起來發現贏棋概率和真實概率並不一樣,我們就要訓練這個模型,就需要生成樣本。模型裡面有一個值但不知道這個值好不好,就需要把整個棋局下完,如果贏概率就設為1,否則設為0。最後是loss函數的實現,這裡用了兩個神經網路,有兩個權重,所以loss會有兩部分。

圖15 AlphaZero

圖15中有一些公式和定義,這裡不一一介紹了,大家可以感受一下。圍棋是一棵樹,怎麼選節點考慮到兩個因素,一是節點贏棋的概率,比如說70%的贏棋,贏棋概率越大,下次多選這個;C是一個常亮參數;P和V都是神經網路生成的參數。標準的UCB裡面有一個權重(1/C),訪問次數越大,UCB值越小;你的訪問次數越小,這個值越大,大到一定的程度可能就不會考慮這個因素了,讓他去多探索。除了這些還有一些優化,讓它儘可能的早期的時候多探索。

圖16 自動求導

用戶在寫tenserflow代碼的時候只是把loss函數寫上去了,但在訓練的時候要讓loss變低,需要求導。tenserflow其實做了這個事情,我們自己也可以做。這是很簡單的數學問題,運算元的求導在數學上已經有一個公式了(變數的加減乘除求導公式)。使用tenserflow時會定義很多的op(加減乘除),在op的實現裡面就給你實現了求導的規則。把所有數學上可能用到的一些操作,把它的演算法寫出來,可能用到數學上面的鏈式法則。我們其實也可實現自動求導。梯度下降的方式其實就是求導完以後讓所有權重加上梯度乘以learning rate。

圖17 自動求導

我們自己做了求導的實現,發現用純Python的實現會比tensorflow快很多,做10萬次加法大概是12秒,用Miniflow大概是0.16秒。包括跑減法還有邏輯回歸的訓練,這是特定場景下的測試,沒有考慮分散式和GPU。tenserflow後端是C++實現的,它的主要開銷在python和C++的交互,這一步非常耗時,比純python實現的op性能還要低很多。

雲機器學習平台架構實現

圖18 架構設計

只用tensorflow就可以搭建雲機器學習平台了嗎?tensorflow實現LR可以在單機上訓練10億維稀疏模型。大家知道10億維的模型大小是一個十億維的浮點數數組,如果內存夠大我們可以支持更多,但是單機不可能支持10萬億維,因為10萬億維就是400T的量級,即使用分散式的訓練也很難找到400T的內存。解決方案是考慮到定義模型時會初始化,沒有出現過的值都用0表示,我們自己實現的框架樣本格式可以很靈活。開源框架與自研框架的集成。

我們自己的平台架構設計裡面要考慮的是支持開源的tenserflow,因為它很流行,我們可以在上面實現很多模型。另外我們自研的C++機器學習框架也要支持。

對異構計算集群的支持,比如DNN需要GPU。我們需要支持異構計算集群(CPU、GPU、虛擬機、雲平台)。

最後一個是機器學習工作流的支持。機器學習的工作流是確定的,應該有更好的工具來支持。

圖18 架構設計2

機器學習平台分類有:

IaaS只提供虛擬機服務;

PaaS可以解決什麼問題呢?你把代碼寫好提交到這個平台上面,它會給你起相應的運行環境,把模型訓練出來。但並沒有解決前面做數據清洗,特徵抽取,包括自學習這些都沒有包括。

MLaaS是介於PaSS和IaaS之間的,它有一個工作流的引擎。可以把整個機器學習工作流實現。

圖19 機器學習平台

圖19是我們自己實現的平台。上層是我們的業務,有非結構化的數據,有傳統的推薦系統。底層是我們的計算資源,包括公有雲、私有雲、GPU。我們底層最依賴的是兩個調度框架:Kubernetes Executor和Hadoop Executor。在調度框架上面實現我們的模型訓練、模型服務、數據管理、特徵抽取、模型評估、自學習服務,對外提供API。

如果我們只是要實現Google CloudML的功能,其實很簡單。我們都知道Kubernete是一個通用的任務調度服務。對於tenserflow的運行環境我們打包成一個Docker鏡像,並不直接用Kubernete的API,我們可以對API做一定的封裝。

圖20 工作流

我們真正做一個業務,除了做訓練,我們還需要做數據引入、特徵抽取、模型評估。模型訓練只是簡單的部分。其實這一部分在小米的時候,我們讓用戶自己做的,自己做一些需求。在第四範式我們希望用戶通過拖拽的方法定義一個工作流。工作流的運算元應該是可拓展的。

圖21 工作流2

這是工作流的截圖,沒有做動畫。這邊有數據引入、數據拆分、特徵工程、訓練演算法、模型預測,有幾個模塊,用戶可以通過這個模塊把運算元拖出來。只要你懂這機器學習業務,不需要自己去寫spark,不需要寫LR演算法的實現,你只要拖一個運算元過來,把這個線連起來,單機跑一下,就可以完成機器學習的業務了。

圖22 運算元

我們設計上,希望運算元通用的,可以解決任意的問題。機器學習其實是一種計算的方式,數據拆分特徵抽取也是。我們定義了最簡單的抽象介面,用戶要實現自己的運算元,只需要實現execute的方法就可以了。 我們現在大約提供了十種數據處理運算元,十多種機器學習運算元,以及三種autoML的運算元。

圖23 高可用

我們在做平台的時候一定會考慮高可用和多租戶。一個系統的高可用肯定是它各個組件的高可用。我們知道k8s依賴etcd,etcd本身有一個Raft協議,所以通過部署多個節點,它本身就是高可用的。用戶實現的是一個API server,目前是一個java應用,依賴於Zookeeper或者是etcd實現的一個主從集群。DB我們用的是MySQL的高可用方案。

圖24 多租戶

平台是給企業或者其他雲平台用戶用的,所以要實現多租戶。有兩個概念:認證和授權。認證我們支持多種方式:用戶名/密碼,AK/SK,後者是一種更高的認證方式。LDAP是滿足企業用戶的需要。授權使我們自己實現的RBAC的方法。

圖25 多租戶2

為什麼要用RBAC呢?我們把用戶和許可權分開了,沒有在資料庫寫死哪個用戶有什麼許可權,而是在數據插入用戶跟role的關係,role裡面維護role和permission的關係。

圖26 多租戶3

我們並沒有把組和許可權有糅合在一起,組是一個單獨的概念。我們有一個Group表,有一個user和group的relation表。組和user其實都是一個entity,我們可以對entity進行授權。所以組跟permission是一個解耦的關係。

最後總結一下,搭建完整的雲深度學習平台需要有良好的架構,還需要實現高性能、高可用、授權認證等功能組件,希望大家對底層基礎架構和演算法原理有進一步的了解,看完這次分享也有一定的收穫,謝謝。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Go中國 的精彩文章:

Go語言中那些你未曾聽說過的驚人優點
一周 Go World 新鮮事-祝大家新年快樂!

TAG:Go中國 |