自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從算法實現(xiàn)到MiniFlow實現(xiàn),打造機器學習的基礎(chǔ)架構(gòu)平臺

人工智能 機器學習 算法
機器學習的基礎(chǔ)架構(gòu)包含了機器學習算法、機器學習類庫以及機器學習平臺等多個層次的內(nèi)容。根據(jù)業(yè)務的需求,我們可以選擇特定的領(lǐng)域進行深入研究和二次開發(fā),利用輪子和根據(jù)需求改造輪子同樣重要。

從算法實現(xiàn)到MiniFlow實現(xiàn),打造機器學習的基礎(chǔ)架構(gòu)平臺

基礎(chǔ)架構(gòu)(Infrastructure)相比于大數(shù)據(jù)、云計算、深度學習,并不是一個很火的概念,甚至很多程序員就業(yè)開始就在用 MySQL、Django、Spring、Hadoop 來開發(fā)業(yè)務邏輯,而沒有真正參與過基礎(chǔ)架構(gòu)項目的開發(fā)。在機器學習領(lǐng)域也是類似的,借助開源的 Caffe、TensorFlow 或者 AWS、Google CloudML 就可以實現(xiàn)諸多業(yè)務應用,但框架或平臺可能因行業(yè)的發(fā)展而流行或者衰退,而追求高可用、高性能、靈活易用的基礎(chǔ)架構(gòu)卻幾乎是永恒不變的。

Google 的王詠剛老師在《為什么 AI 工程師要懂一點架構(gòu)》提到,研究院并不能只懂算法,算法實現(xiàn)不等于問題解決,問題解決不等于現(xiàn)場問題解決,架構(gòu)知識是工程師進行高效團隊協(xié)作的共同語言。Google 依靠強大的基礎(chǔ)架構(gòu)能力讓 AI 研究領(lǐng)先于業(yè)界,工業(yè)界的發(fā)展也讓深度學習、Auto Machine Learning 成為可能,未來將有更多人關(guān)注底層的架構(gòu)與設(shè)計。

因此,今天的主題就是介紹機器學習的基礎(chǔ)架構(gòu),包括以下的幾個方面:

  1. 基礎(chǔ)架構(gòu)的分層設(shè)計;
  2. 機器學習的數(shù)值計算;
  3. TensorFlow 的重新實現(xiàn);
  4. 分布式機器學習平臺的設(shè)計。

***部分,基礎(chǔ)架構(gòu)的分層設(shè)計

大家想象一下,如果我們在 AWS 上使用編寫一個 TensorFlow 應用,究竟經(jīng)過了多少層應用抽象?首先,物理服務器和網(wǎng)絡(luò)寬帶就不必說了,通過 TCP/IP 等協(xié)議的抽象,我們直接在 AWS 虛擬機上操作就和本地操作沒有區(qū)別。其次,操作系統(tǒng)和編程語言的抽象,讓我們可以不感知底層內(nèi)存物理地址和讀寫磁盤的 System call,而只需要遵循 Python 規(guī)范編寫代碼即可。然后,我們使用了 TensorFlow 計算庫,實際上我們只需調(diào)用最上層的 Python API,底層是經(jīng)過了 Protobuf 序列化和 swig 進行跨語言調(diào)研,然后通過 gRPC 或者 RDMA 進行通信,而***層這是調(diào)用 Eigen 或者 CUDA 庫進行矩陣運算。

因此,為了實現(xiàn)軟件間的解耦和抽象,系統(tǒng)架構(gòu)常常采用分層架構(gòu),通過分層來屏蔽底層實現(xiàn)細節(jié),而每一個底層都相當于上層應用的基礎(chǔ)架構(gòu)。

那么我們?nèi)绾卧谝粋€分層的世界中夾縫生存?

有人可能認為,既然有人實現(xiàn)了操作系統(tǒng)和編程語言,那么我們還需要關(guān)注底層的實現(xiàn)細節(jié)嗎?這個問題沒有標準答案,不同的人在不同的時期會有不同的感受,下面我舉兩個例子。

在《為了 1% 情形,犧牲 99% 情形下的性能:蝸牛般的 Python 深拷貝》這篇文章中,作者介紹了 Python 標準庫中 copy.deep_copy() 的實現(xiàn),1% 的情況是指在深拷貝時對象內(nèi)部有可能存在引用自身的對象,因此需要在拷貝時記錄所有拷貝過的對象信息,而 99% 的場景下對象并不會直接應用自身,為了兼容 100% 的情況這個庫損失了 6 倍以上的性能。在深入了解 Python 源碼后,我們可以通過實現(xiàn)深拷貝算法來解決上述性能問題,從而優(yōu)化我們的業(yè)務邏輯。

另一個例子是阿里的楊軍老師在 Strata Data Conference 分享的《Pluto: 一款分布式異構(gòu)深度學習框架》,里面介紹到基于 TensorFlow 的 control_dependencies 來實現(xiàn)冷熱數(shù)據(jù)在 GPU 顯存上的置入置出,從而在用戶幾乎不感知的情況下極大降低了顯存的使用量。了解源碼的人可能發(fā)現(xiàn)了,TensorFlow 的 Dynamic computation graph,也就是 tensorflow/fold 項目,也是基于 control_dependencies 實現(xiàn)的,能在聲明式機器學習框架中實現(xiàn)動態(tài)計算圖也是不太容易。這兩種實現(xiàn)都不存在 TensorFlow 的官方文檔中,只有對源碼有足夠深入的了解才可能在功能和性能上有巨大的突破,因此如果你是企業(yè)內(nèi) TensorFlow 框架的基礎(chǔ)架構(gòu)維護者,突破 TensorFlow 的 Python API 抽象層是非常有必要的。

大家在應用機器學習時,不知不覺已經(jīng)使用了很多基礎(chǔ)架構(gòu)的抽象,其中最重要的莫過于機器學習算法本身的實現(xiàn),接下來我們將突破抽象,深入了解底層的實現(xiàn)原理。

第二部分,機器學習的數(shù)值計算

機器學習,本質(zhì)上是一系列的數(shù)值計算,因此 TensorFlow 定位也不是一個深度學習庫,而是一個數(shù)值計算庫。當我們聽到了香農(nóng)熵、貝葉斯、反向傳播這些概念時,并不需要擔心,這些都是數(shù)學,而且可以通過計算機編程實現(xiàn)的。

接觸過機器學習的都知道 LR,一般是指邏輯回歸(Logistic regression),也可以指線性回歸(Linear regression),而前者屬于分類算法,后者屬于回歸算法。兩種 LR 都有一些可以調(diào)優(yōu)的超參數(shù),例如訓練輪數(shù)(Epoch number)、學習率(Learning rate)、優(yōu)化器(Optimizer)等,通過實現(xiàn)這個算法可以幫忙我們理解其原理和調(diào)優(yōu)技巧。

下面是一個最簡單的線性回歸 Python 實現(xiàn),模型是簡單的 y = w * x + b。

 

從這個例子大家可以看到,實現(xiàn)一個機器學習算法并不依賴于 Scikit-learn 或者 TensorFlow 等類庫,本質(zhì)上都是數(shù)值運算,不同語言實現(xiàn)會有性能差異而已。細心的朋友可能發(fā)現(xiàn),為什么這里 w 的梯度(Gradient)是 -2 * x * (y – x * x –b),而 b 的梯度這是 -2 * (y – w * x – b),如何保證經(jīng)過計算后 Loss 下降而準確率上升?這就是數(shù)學上保證了,我們定義了 Loss 函數(shù)(Mean square error)為 y – w * x – b 的平方,也就是說預測值越接近 y 的話 Loss 越小,目標變成求 Loss 函數(shù)在 w 和 b 的任意取值下的最小值,因此對 w 和 b 求偏導后就得到上面兩條公式。

如果感興趣,不妨看一下線性回歸下 MSE 求偏導的數(shù)學公式證明。

 

邏輯回歸與線性回歸類似,當由于是分類問題,因此需要對 w * x + b 的預測結(jié)果進行歸一化(Normalization),一般使用 Sigmoid 方法,在 Python 中可以通過 1.0 / (1 + numpy.exp(-x)) 這種方式實現(xiàn)。由于預測值不同,Loss 函數(shù)的定義也不同,求偏導得到的數(shù)值計算公式也不同,感興趣也可以看看我的公式推導。 

 

 

大家可以看到最終求得的偏導是非常簡單的,用任何編程語言都可以輕易實現(xiàn)。但我們自己的實現(xiàn)未必是***效的,為什么不直接用 Scikit-learn、MXNet 這些開源庫已經(jīng)實現(xiàn)好的算法呢?

我們對這個算法的理解,其實是在工程上使用它的一個很重要的基礎(chǔ)。例如在真實的業(yè)務場景下,一個樣本的特征可能有百億甚至千億維,而通過前面的算法我們了解到,LR 模型的大小和樣本特征的維度是相同的,也就是說一個接受百億維特征的模型,本身參數(shù)就有百億個,如果使用標準的雙精度浮點數(shù)保存模型參數(shù),那么百億維的模型參數(shù)部分至少要超過 40G,那么千億維的特征更是單機所無法加載的。

因此,雖然 Scikit-learn 通過 native 接口實現(xiàn)了高性能的 LR 算法,但只能滿足在單機上訓練,而 MXNet 由于原生沒有支持 SpareTensor,對于超高維度的稀疏數(shù)據(jù)訓練效率是非常低的,TensorFlow 本身支持 SpareTensor 也支持模型并行,可以支持百億維特征的模型訓練,但沒有針對 LR 優(yōu)化效率也不是很高。在這種場景下,第四范式基于 Parameter server 實現(xiàn)了支持模型并行和數(shù)據(jù)并行的超高維度、高性能機器學習庫,在此基礎(chǔ)上的大規(guī)模 LR、GBDT 等算法訓練效率才能滿足工程上的需求。

機器學習還有很多有意思的算法,例如決策樹、SVM、神經(jīng)網(wǎng)絡(luò)、樸素貝葉斯等等,只需要部分數(shù)學理論基礎(chǔ)就可以輕易在工程上實現(xiàn),由于篇幅關(guān)系這里就不在贅述了。前面我們介紹的其實是機器學習中的命令式(Imperative)編程接口,我們把求偏導的公式提前推導出來,然后像其他編程腳本一樣根據(jù)代碼那順序執(zhí)行,而我們知道 TensorFlow 提供的是一種聲明式(Declarative)的編程接口,通過描述計算圖的方式來延后和優(yōu)化執(zhí)行過程,接下來我們就介紹這方面的內(nèi)容。

第三部分,TensorFlow 的重新實現(xiàn)

首先大家可能有疑問,我們需要需要重新實現(xiàn) TensorFlow?TensorFlow 靈活的編程接口、基于 Eigen 和 CUDA 的高性能計算、支持分布式和 Hadoop HDFS 集成,這些都是個人甚至企業(yè)很難完全追趕實現(xiàn)的,而且即使需要命令式編程接口我們也可以使用 MXNet,并沒有強需求需要一個新的 TensorFlow 框架。

事實上,我個人在學習 TensorFlow 過程中,通過實現(xiàn)一個 TensorFlow-like 的項目,不僅驚嘆與其源碼和接口的設(shè)計精巧,也加深了對聲明式編程、DAG 實現(xiàn)、自動求偏導、反向傳播等概念的理解。甚至在 Benchmark 測試中發(fā)現(xiàn),純 Python 實現(xiàn)的項目在線性回歸模型訓練中比 TensorFlow 快 22 倍,當然這是在特定場景下壓測得到的結(jié)果,主要原因是 TensorFlow 中存在 Python 與 C++ 跨語言的切換開銷。

這個項目就是 MiniFlow,一個實現(xiàn)了鏈式法則、自動求導、支持命令式編程和聲明式編程的數(shù)值計算庫,并且兼容 TensorFlow Python API。感興趣可以在這個地址參與開發(fā),下面是兩者 API 對比圖。

 

了解 TensorFlow 和 MXNet(或者 NNVM)源碼的朋友可能知道,兩者都抽象了 Op、Graph、Placeholer、Variable 等概念,通過 DAG 的方式描述模型的計算流圖,因此我們也需要實現(xiàn)類似的功能接口。

與前面的 LR 代碼不同,基于 Graph 的模型允許用戶自定義 Loss 函數(shù),也就是用戶可以使用傳統(tǒng)的 Mean square error,也可以自定義一個任意的數(shù)學公式作為 Loss 函數(shù),這要求框架本身能夠?qū)崿F(xiàn)自動求導的功能,而不是我們根據(jù) Loss 函數(shù)預先實現(xiàn)了導數(shù)的計算方式。

那么用戶可以定義的最小操作,也就是 Op,需要平臺實現(xiàn)基本的算子,例如 ConstantOp、AddOp、MultipleOp 等,而且用戶實現(xiàn)自定義算子時可以加入自動求導的流程中,并不影響框架本身的訓練流程。參考 TensorFlow 的 Python 源碼,下面我們定義了 Op 的基類,所有的 Op 都應該實現(xiàn) forward() 和 grad() 以便于模型訓練時自動求導,而且通過重載 Python 操作符可以為開發(fā)者提供更便利的使用接口。 

 

那么對于常量(ConstantOp)和變量(VariableOp),他們的正向運算就是得到的是本身的值,而求導時常量的導數(shù)為 0,求偏導的變量導數(shù)為 1,其他變量也為 0,具體代碼如下。 

 

其實更重要的是,我們需要實現(xiàn)加(AddOp)、減(MinusOp)、乘(MultipleOp)、除(DivideOp)、平方(PowerOp)等算子的正向運算和反向運算邏輯,然后根據(jù)鏈式法則,任何復雜的數(shù)學公式求導都可以簡化成這些基本算子的求導。

例如加法和減法,我們知道兩個數(shù)加法的導數(shù)等于導數(shù)的加法,因此根據(jù)此數(shù)學原理,我們可以很容易實現(xiàn) AddOp,而 MinusOp 實現(xiàn)類似就不贅述了。 

 

而乘法和除法相對復雜,顯然兩個數(shù)乘法的導數(shù)不等于導數(shù)的乘法,例如 x 和 x 的平方,先導數(shù)后相乘得到 2x,先相乘后導數(shù)得到 3 倍 x 的平方。因此這是需要使用乘數(shù)法則,基本公式是,而代碼實現(xiàn)如下。

 

除法和平方的求導方式也是類似的,因為數(shù)學上已經(jīng)證明,所以只需要編碼實現(xiàn)基本的正向和反向運算即可。由于篇幅有限,這里不再細致介紹 MiniFlow 的源碼實現(xiàn)了,感興趣可以通過上面的 Github 鏈接找到完整的源碼實現(xiàn),下面再提供使用相同 API 接口實現(xiàn)的模型性能測試結(jié)果,對于小批量數(shù)據(jù)處理、需要頻繁切換 Python/C++ 運行環(huán)境的場景下 MiniFlow 會有更好的性能表現(xiàn)。

 

前面介紹了機器學習算法和深度學習類庫的實現(xiàn),并不是所有人都有能力去重寫或者優(yōu)化這部分基礎(chǔ)架構(gòu)的,很多時候我們都只是這些算法的使用者,但從另一個角度,我們就需要維護一個高可用的計算平臺來做機器學習的訓練和預測,下面將從這方面介紹如何打造分布式機器學習平臺。

第四部分,分布式機器學習平臺的設(shè)計

隨著大數(shù)據(jù)和云計算的發(fā)展,實現(xiàn)一個高可用、分布式的機器學習平臺成為一個基本需求。無論是 Caffe、TensorFlow,還是我們自研的高性能機器學習庫,都只是解決數(shù)值計算、算法實現(xiàn)以及模型訓練的問題,對于任務的隔離、調(diào)度、Failover 都需要上層平臺實現(xiàn)。

那么設(shè)計一個針對機器學習全流程的基礎(chǔ)架構(gòu)平臺,需要涵蓋哪些功能呢?

首先,必須實現(xiàn)資源隔離。在一個共享底層計算資源的集群中,用戶提交的訓練任務不應該受到其他任務的影響,盡可能保證 CPU、內(nèi)存、GPU 等資源隔離。如果使用 Hadoop 或 Spark 集群,默認就會在任務進程上掛載 cgroups,保證 CPU 和內(nèi)存的隔離,而隨著 Docker 等容器技術(shù)的成熟,我們也可以使用 Kubernetes、Mesos 等項目來啟動和管理用戶實現(xiàn)的模型訓練任務。

其次,實現(xiàn)資源調(diào)度和共享。隨著通用計算的 GPU 流行,目前支持 GPU 調(diào)度的編排工具也越來越多,而部分企業(yè)內(nèi)還存在著 GPU 專卡專用的情況,無法實現(xiàn)資源的動態(tài)調(diào)度和共享,這必然導致計算資源的嚴重浪費。在設(shè)計機器學習平臺時,需要盡可能考慮通用的集群共享場景,例如同時支持模型訓練、模型存儲以及模型服務等功能,可以對標的典例就是 Google Borg 系統(tǒng)。

然后,平臺需要有靈活的兼容性。目前機器學習業(yè)務發(fā)展迅速,針對不同場景的機器學習框架也越來越多,靈活的平臺架構(gòu)可以兼容幾乎所有主流的應用框架,避免基礎(chǔ)架構(gòu)因為業(yè)務的發(fā)展而頻繁變化。目前 Docker 是一種非常合適的容器格式規(guī)范,通過編寫 Dockerfile 就可以描述框架的運行環(huán)境和系統(tǒng)依賴,在此基礎(chǔ)上我們可以在平臺上實現(xiàn)了 TensorFlow、MXNet、Theano、CNTK、Torch、Caffe、Keras、Scikit-learn、XGBoost、PaddlePaddle、Gym、Neon、Chainer、PyTorch、Deeplearning4j、Lasagne、Dsstne、H2O、GraphLab 以及 MiniFlow 等框架的集成。

***,需要實現(xiàn)機器學習場景下的 API 服務。針對機器學習的模型開發(fā)、模型訓練和模型服務三個主要流程,我們可以定義提交訓練任務、創(chuàng)建開發(fā)環(huán)境、啟動模型服務、提交離線預測任務等 API,用熟悉的編程語言來實現(xiàn) Web service 接口。要實現(xiàn)一個 Google-like 的云深度學習平臺,大家可以參考下面這三個步驟。

 

當然,要實現(xiàn)一個涵蓋數(shù)據(jù)引入、數(shù)據(jù)處理、特征工程以及模型評估功能的機器學習平臺,我們還需要集成 HDFS、Spark、Hive 等大數(shù)據(jù)處理工具,實現(xiàn)類似 Azkaban、Oozie 的工作流管理工具,在易用性、低門檻方面做更多的工作。

總結(jié)

***總結(jié)一下,機器學習的基礎(chǔ)架構(gòu)包含了機器學習算法、機器學習類庫以及機器學習平臺等多個層次的內(nèi)容。根據(jù)業(yè)務的需求,我們可以選擇特定的領(lǐng)域進行深入研究和二次開發(fā),利用輪子和根據(jù)需求改造輪子同樣重要。

在機器學習與人工智能非常流行的今天,希望大家也可以重視底層基礎(chǔ)架構(gòu),算法研究員可以 理解更多工程的設(shè)計與實現(xiàn),而研發(fā)工程師可以了解更多的算法原理與優(yōu)化,在合適的基礎(chǔ)架構(gòu)平臺上讓機器學習發(fā)揮更大的效益,真正應用的實際場景中。 

責任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2018-11-14 07:41:58

機器學習算法感知器

2021-09-24 16:30:28

無代碼低代碼機器學習

2016-11-28 14:53:08

數(shù)據(jù)分析IBM大數(shù)據(jù)

2017-05-09 08:48:44

機器學習

2017-07-11 10:19:24

淺層模型機器學習優(yōu)化算法

2017-03-10 12:16:46

機器學習

2014-06-17 09:55:24

機器學習

2022-02-15 23:38:22

Python機器學習算法

2024-10-14 16:37:25

2017-09-12 16:57:43

機器學習K-means算法Python

2017-06-22 09:53:01

機器學習Python樸素貝葉斯

2023-09-11 10:55:59

人工智能機器學習

2020-05-21 14:50:37

算法深度學習人工智能

2024-08-14 08:16:53

2017-09-05 15:29:51

機器學習人工智能AI

2017-12-07 08:14:49

2011-12-02 10:58:06

數(shù)據(jù)結(jié)構(gòu)Java

2016-01-05 13:22:42

技術(shù)架構(gòu)SaaS客服平臺

2022-10-20 07:14:20

人工智能機器學習算法
點贊
收藏

51CTO技術(shù)棧公眾號