0
本文作者: 三川 | 2017-04-23 19:26 |
本周四,雷鋒網(wǎng) AI 研習(xí)社邀請了跨國 IT 巨頭 ThoughtWorks 的資深數(shù)據(jù)架構(gòu)師白發(fā)川,主講線上公開課,為大家講解 TensorFlow 在工程項目中的應(yīng)用。
白發(fā)川:自我介紹一下,我是 ThoughtWorks 白發(fā)川,之前一直從事大數(shù)據(jù),后來我們開始做人工智能方向的一些嘗試和工作。我們致力于將人工智能、機器學(xué)習(xí)、大數(shù)據(jù)結(jié)合在一塊。在研究了了很多相關(guān)的機器學(xué)習(xí)框架之后,我們也做了自己的深度學(xué)習(xí)框架——deeplearning.scala。它由 scala 編寫,目前是開源的,大家可以了解下。
這是公開課的錄制視頻:
不方便看視頻的童鞋,可閱讀以下雷鋒網(wǎng)對本次公開課的文字轉(zhuǎn)錄。
由于篇幅較長,本次公開課的文字轉(zhuǎn)錄被拆為上下兩部分,這是下篇。上篇請見雷鋒網(wǎng) TensorFlow在工程項目中的應(yīng)用 公開課視頻+文字轉(zhuǎn)錄(上) | AI 研習(xí)社。
白發(fā)川:上文我們提到了幾種不同的大數(shù)據(jù)架構(gòu),它們和之前提到的數(shù)據(jù)成熟度評估模型相關(guān)——我們首先會評估一個企業(yè)的數(shù)據(jù)到達了怎樣一個級別,才知道在目前哪一種解決方案最為適合。
現(xiàn)在我們來談?wù)勅斯ぶ悄堋?/p>
其實人工智能這個概念并不是近期才有的,很早、幾十年前大家就已經(jīng)在提人工智能了。人工智能的核心目標(biāo)是我們希望機器像人一樣的思考。那機器怎樣才能像人一樣思考?
這里面發(fā)展出了兩個分支:一個是早期的概率論模型,另一個是神經(jīng)網(wǎng)絡(luò)。
我們常見的 HMM、貝葉斯,都是屬于概率論的。概率論對于數(shù)據(jù)的處理,你基本上存在一個抽樣或者以概率形式去計算的。所以在很早的時候數(shù)據(jù)量不是特別大的情況下,概率論會是一個特別好的選擇。
另外,概率論可以處理不太大的數(shù)據(jù)集,所以說相對來講它會更加常用。比如說我們使用 HMM 去做分詞,這也是個非常要好的一個場景。另外一個分支是神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)很早就提出了,但近幾年才是各種深度神經(jīng)網(wǎng)絡(luò)框架逐漸火起來的一個時代。因為在最近我們發(fā)現(xiàn),計算機的計算能力被提高了——神經(jīng)網(wǎng)絡(luò)在數(shù)據(jù)量越大的情況下,它的效果越好;在神經(jīng)網(wǎng)絡(luò)層次越深的情況下,它的效果更好;而這一切背后依靠的都是計算機的計算能力。神經(jīng)網(wǎng)絡(luò)也有好幾種,比如說深度神經(jīng)網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)、卷積等。如果計算機的計算能力沒有發(fā)展,我們談的人工智能將繼續(xù)的停留在實驗室。所以背后如果沒有數(shù)據(jù)的支撐,AI 基本上談不上任何效果。
我們不可能拿十條數(shù)據(jù)來訓(xùn)練,如果我們要上生產(chǎn)環(huán)境。這樣的數(shù)據(jù)在本質(zhì)上達不到生產(chǎn)需求。在很早的時候,數(shù)據(jù)一直在發(fā)展的過程中,其實人工智能也是在發(fā)展的,只是它發(fā)展的階段不一樣。在很早的時候,人工智能可能只是停留在理論階段,我們知道有算法有論文,但是真正要應(yīng)用到生產(chǎn)中,讓它商業(yè)化、市場化,其實有很大的跨度。在這之后,我們會進入到一個新階段:很多企業(yè)會做 AI lab,去開一個實驗室來根據(jù)現(xiàn)有數(shù)據(jù)做嘗試,看有沒有更好的方法。
再下一個階段,就到了大數(shù)據(jù)時代。這時,數(shù)據(jù)的處理性能變得特別的高。我們發(fā)現(xiàn),AI 本來就是依賴于數(shù)據(jù)的,既然數(shù)據(jù)的處理能力提高了,AI 一定會迎來非常好的發(fā)展。這就是目前我們所面臨的情況。很多企業(yè)會借助于大數(shù)據(jù)平臺來對數(shù)據(jù)做處理。有了大數(shù)據(jù)之后,很多企業(yè)也會以人工智能來更好地服務(wù)于自身業(yè)務(wù)。
這里是一個生產(chǎn)中使用的、比較好的人工智能架構(gòu)方案。
正如上篇提到的,數(shù)據(jù)和人工智能,兩者是可以完全分開,但兩者結(jié)合才是最終的解決方案。拿掉人工智能,我們可以把數(shù)據(jù)作為一個大數(shù)據(jù)平臺去使用。有了人工智能,我們可以在大數(shù)據(jù)平臺之上擴充,讓它變成一個更完美的架構(gòu),所以這就是為什么數(shù)據(jù)架構(gòu)非常重要——你的人工智能到底能不能很好的接入。圖中可以看到,數(shù)據(jù)平臺主要負(fù)責(zé)的是數(shù)據(jù)處理、數(shù)據(jù)存儲、數(shù)據(jù)檢索以及數(shù)據(jù)探索等一系列數(shù)據(jù)準(zhǔn)備相關(guān)的工作。
當(dāng)數(shù)據(jù)準(zhǔn)備好了之后,對于機器學(xué)習(xí)這一塊,它只是根據(jù)你的數(shù)據(jù)做特征提取、做模型訓(xùn)練,很大的一部分工作都會在數(shù)據(jù)平臺上。最簡單來講,有的企業(yè)可能對數(shù)據(jù)的隱秘性要求比較高——會有數(shù)據(jù)加密、各種加密。那在運算過程中會有數(shù)據(jù)解密,加密這個過程、解密這個動作是沒有辦法讓神經(jīng)網(wǎng)絡(luò)去做的,只能放在數(shù)據(jù)平臺。所以數(shù)據(jù)平臺對于數(shù)據(jù)的處理能力要求非常高,直接決定了后面的效果。
當(dāng)我們的數(shù)據(jù)平臺搭建完成了之后,本質(zhì)上來講就已經(jīng)有了數(shù)據(jù)分布式環(huán)境。這是我們要做的,只是說有一個系統(tǒng)可以很好地加在分布式數(shù)據(jù)上,訓(xùn)練出一個模型。目前 TensorFlow 已經(jīng)支持模型分布式,這是一個非常好的效果。
在很早的時候,模型訓(xùn)練是不支持分布式訓(xùn)練的,就是你的模型在一臺機器上訓(xùn)練,就獨立地訓(xùn)練出來。沒有辦法讓兩臺機器配合去訓(xùn)練一個模型。而在目前來講 TensorFlow 已經(jīng)做得非常好,支持模型分布式訓(xùn)練,當(dāng)然這得借助于它的計算圖概念。
對于 Tensorflow 計算圖這一系列很細的技術(shù)問題,后面"TensorFlow & 神經(jīng)網(wǎng)絡(luò)算法高級應(yīng)用班”課程都會講到—— Tensorflow 怎樣支持模型的分布式訓(xùn)練。在這個架構(gòu)里邊,我們底層有 GPU、CPU 系統(tǒng)的人工智能集群,在這之上,我們創(chuàng)建的模型分布式訓(xùn)練會產(chǎn)生模型。數(shù)據(jù)平臺還會提供另外一個功能,就是的實時流。
大家看到的這架構(gòu)里邊有一個分支,就是實時流。它與人工智能結(jié)合起來就是實時預(yù)測,實時預(yù)測之后,數(shù)據(jù)展示出來直接以決策的形式反饋給使用者,實際上實時流另外還有一個功能就是模型的持續(xù)訓(xùn)練。而在使用的這個地方,大家還能看到有個箭頭,就是數(shù)據(jù)又進入了大數(shù)據(jù)平臺。這是我們目前提倡的一個架構(gòu),叫數(shù)據(jù)驅(qū)動架構(gòu)。就用戶產(chǎn)生數(shù)據(jù),數(shù)據(jù)服務(wù)于用戶。如果說你的這個過程是良性的:比如說我用這個系統(tǒng),系統(tǒng)服務(wù)于我,這個過程是良性的,越來越好;當(dāng)我用的系統(tǒng)越多,它對我的體驗越好,那這個系統(tǒng)就會自我進化,變得越來越好,所以這種架構(gòu)也是我們目前在所有實施中采用地方案。
TensorFlow 本身是一個深度神經(jīng)網(wǎng)絡(luò)框架。它的計算模塊,也就是核心 Core 是由 C++ 寫的。它對外提供了很多 API,早期只有 Python,1.0 之后增加了 Java API,但還處于測試階段,不是特別穩(wěn)定,也不是特別完善。所以對于 TensorFlow 我們還是優(yōu)先使用 Python。
對于 Python 來講,我們會把機器學(xué)習(xí)這一塊包裝成一個服務(wù),或者說以其他形式來提供使用。在這一塊,它對外提供的是 Python,它內(nèi)部是 C++,中間就有一個數(shù)據(jù)交換,發(fā)生在內(nèi)存中——就是將 Python 需要的計算邏輯轉(zhuǎn)成 C++ ,由底層計算之后再返回結(jié)果。
在一個完整的人工智能系統(tǒng)里,分布式存在于兩個地方:數(shù)據(jù)分布式和模型分布式。數(shù)據(jù)分布式主要是由數(shù)據(jù)湖支撐的,我們的數(shù)據(jù)被分布式存儲。分布式數(shù)據(jù)存儲的好處在于,我可以快速地把數(shù)據(jù)從不同節(jié)點拿過來。這個時候?qū)τ谙到y(tǒng)來講,要擴展的僅僅是帶寬。
在真正的生產(chǎn)里邊,對于企業(yè)來講,做一個專線搭建 GB 級網(wǎng)絡(luò)帶寬,在本質(zhì)上的成本會遠遠低于提高計算機硬件。這也是數(shù)據(jù)分布式為什么會存在、并且做得越來越好的一個原因。
另外,TensorFlow 支持模型分布式。當(dāng)我們數(shù)據(jù)分布式之后,我們的模型分布式,兩者結(jié)合起來整個訓(xùn)練的速度會變得特別快。在 Tensorflow 里,模型計算可以根據(jù)你自己寫的訓(xùn)練模型代碼生成計算圖,然后根據(jù)你的計算圖將獨立的每一個計算圖分布到不同的節(jié)點,然后進行訓(xùn)練,最終產(chǎn)生一個唯一的模型,這也是 TensorFlow 在分布式訓(xùn)練方面做得非常好的一點。
但是我們回頭來看,TensorFlow 在本質(zhì)上、在使用過程中,它就是一個python庫。所以當(dāng)我們在做一個神經(jīng)網(wǎng)絡(luò)工程項目的時候,我們可以講 TensorFlow 是我們的一個庫,我們用了它。相對來講,它所占的是我們系統(tǒng)中的一小個模塊。
TensorFlow 是一個深度的神經(jīng)網(wǎng)絡(luò)框架,但是它并不是唯一的,像 Caffe、MXnet、Theano,還有 Java 版的 Deeplearning4j。這類框架早就存在了。那么為什么說 TensorFlow 是我們認(rèn)為一個比較好的選擇?
在開發(fā)中來講,大家對它的定義是“工程化做的最好的深度神經(jīng)網(wǎng)絡(luò)框架”,因此傾向于選擇于 TensorFlow。其他的框架在很多場景之下,像實驗室或者高校大家也會用;但對工程師來講,我們希望更友好的方式包 API 使用方式,能讓工程師更容易懂;降低門檻,降低對數(shù)學(xué)的要求。
一個神經(jīng)網(wǎng)絡(luò)框架,設(shè)計得越原始,對數(shù)學(xué)的要求越高。這對工程師不是特別友好。而 TensorFlow 是介于這兩者中比較一個折中的一個方案。
既然 TensorFlow 說白了就是一個 Python 庫,那么當(dāng)我們開發(fā)人工智能項目的時候,本質(zhì)上我們的開發(fā)就演變成了如何做好python項目的開發(fā)。
目前無論是做機器學(xué)習(xí)還是做數(shù)據(jù)分析,Python 有非常好的勢頭,大家都在用它。而更多的平臺提供出來的,其實也是 Python作為api的方式, Python 在占的比重是非常大的。因此做人工智能項目,學(xué)習(xí) Python 是非常重要的。就是說要研究 TensorFlow,之前得打好基礎(chǔ)先學(xué)好 Python。
對于 Python 來講,有 Python2 和 3,我們目前建議用 Python3。在 Python 里會涉及到非常多的庫,我們需要管理庫,它就和 yum 一樣,我們可以使用 pip 來對我們的庫做一些管理,下面有個 virtualenv。對于 Python 的這種輕量級語言來講,在我們系統(tǒng)里邊,有時會涉及不同版本的 Python 項目存在,這就需要一個好的隔離環(huán)境,讓我們的兩個環(huán)境隔離起來,不要相互影響。比如說我一個項目是 Python2,另外一個項目是 Python3,我希望這兩個工程在我系統(tǒng)里面同時運行,virtualenv 提供了非常好的這樣一個功能:封裝了 Python 的環(huán)境,可以讓你不一樣的版本、不一樣的庫在一個系統(tǒng)里同時存在。對于 virtualenv 來講,它提供的就是一個 Python 虛擬環(huán)境,我們在生產(chǎn)過程中會發(fā)現(xiàn),當(dāng)你的 virtualenv 非常多的時候,管理起來特別困難。于是我們會選擇 virtualenvwrapper,它的作用是管理系統(tǒng)里邊所有的 virtualenv,包括你的創(chuàng)建你的切換,都可以完整管理起來。
當(dāng)我們有開發(fā)環(huán)境——就是前面提到的幾種工具,都是開發(fā)過程中隨時會用的。有了這些工具之后,下一步就是開發(fā)代碼。
對于 Python 來講,工具非常多。IPython Notebook 是一個輕量級的一個 Python web IDE,我們可以在網(wǎng)頁上進行 Python 代碼編寫。它分為不同階段,可以局部執(zhí)行代碼,能很快地把我們的代碼所見即所得。這也是我們在做數(shù)據(jù)探索或者一些嘗試的時候優(yōu)先的選擇。我們可以很快分析出,我們的整個操作到底對不對,還需不需要繼續(xù)。
所以這里解釋了我們?yōu)槭裁匆?virtualenv——我們需要一個獨立的環(huán)境來運行我們的工程。這種思想和目前的 Docker 有一點類似。另外,當(dāng)做一個比較大的項目的時候,我們可能會借助于集成開發(fā)環(huán)境地 IDE,像 Pycharm 式目前在開發(fā)中非常常用的,基本上百分之百會用到的 IDE。在正式環(huán)境之下,特別是一個 team,大家協(xié)助開發(fā)的時候特別會用到。
對于工程開發(fā)來講,我們的一個項目在開發(fā)之后,我們需要上線,我們需要測試,我們需要部署;對于非人工智能的項目,我們會有 CI/CD。代碼寫完之后,我們需要部署、需要測試、需要運行,這一系列我們可以自動化,便是 CI/CD。
我們的代碼提到版本控制器,CI/CD 會自動監(jiān)聽到代碼發(fā)生變化,然后把代碼打包、運型測試。成功之后給你部署,把結(jié)果以可視化的形式展示出來。這是我們一般項目開發(fā)中常用的 CI/CD 工具,那么在一個 AI 項目里,我們會不會做 CI/CD?
其實是會做的。
首先,人工智能的 CI/CD 和一般項目來講流程差不多,但會有一些差異化的地方。前邊還是一樣,代碼邏輯發(fā)生更改之后會觸發(fā)整個 CI/CD 的 pipeline,還有一個分支:數(shù)據(jù) pipeline 觸發(fā)。
數(shù)據(jù) pipeline 是什么?
前面提到人工智能數(shù)據(jù),分為兩塊:一個是數(shù)據(jù)部分,一個是人工智能部分。這就意味著在我們的人工智能項目里邊,它有邏輯,在數(shù)據(jù)里面它有數(shù)據(jù)。當(dāng)我有新數(shù)據(jù)進來,或者說我的模型邏輯代碼發(fā)生變更,這兩者都會觸發(fā)你的 CI/CD 。
CI/CD 被觸發(fā)之后,除了和一般的項目一樣要做基本的單元測試評估之外,我們多了一個功能,就是模型評估。這一部分功能的話,更多的是在 CI/CD 上做改造。
什么是模型評估?對于一般的系統(tǒng)來講,什么樣的情況之下,我們認(rèn)為這個測試是掛的。就是它的真正輸出和我們期望的輸出不一致,我們就可以認(rèn)為它掛了。
那對于 AI 來講,什么樣的情況下,我們認(rèn)為這個這一次的開發(fā)是失敗的?那就是模型在變壞,一次一次的變壞。比如我第一次訓(xùn)練出來的模型準(zhǔn)確度 90%,第二次 80%,第三次 70%。從這個角度來講,雖然說代碼運行非常正確,但效果在降低,而這個評估應(yīng)該被 CI/CD 記錄下來。最后提交代碼、模型訓(xùn)練出來之后,相比上一次的模型,如果它的效果更差,那你這次的 CI/CD 是掛地,整個 task 是不通過的。
這樣,我們可以保證整個開發(fā)的性能是在上升的,就避免了一個 team 悶頭開發(fā)代碼不停地?fù)Q方法,最后發(fā)現(xiàn)模型一次比一次差。
本質(zhì)上講,AI 是為了更好地幫助人來進行思考和輔助人做決策,所以場景相對來講會比較廣泛,也比較通用。但差別點是在于:你要在這個通用場景里,實現(xiàn)怎樣的需求?
比如一提到人工智能或者深度學(xué)習(xí),或者卷積神經(jīng)網(wǎng)絡(luò),大家都會想到圖像識別,這是一個非常通用的領(lǐng)域。但對于在這個領(lǐng)域之內(nèi),要達到怎樣地細化程度,就是需要我們進行評估和實現(xiàn)的。比如在我們之前做的項目里邊,我們曾經(jīng)做過一個電商的系統(tǒng),是用來分析它的圖片的——一個電商賣家可能會上傳特別多的圖片,對于整個電商平臺來講,它希望對圖片做分析,知道上傳地圖片里邊包含哪些物體,比如說我們在這個圖片里邊能夠識別出這個是沙發(fā)、另外一個是人,等等這一系列的一些物體識別。
這就是利用 TensorFlow 在圖像識別領(lǐng)域細分領(lǐng)域的一個實現(xiàn)。除此之外的話,除了圖像領(lǐng)域、對于 AI 這個概念,很多人提到 AI 大家會想到機器人。而實際上在工業(yè)界,機器人應(yīng)用非常廣泛,特別是在倉庫來講,倉儲機器人以亞馬遜為首開始率先帶領(lǐng)這個行業(yè)。目前已經(jīng)變得非常的常用,至少大家都在對這方面進行投入、研發(fā)。
倉儲機器人的主要功能是搬遷貨物。上圖中大家可以看到,一個倉儲機器人馱了一個貨架。早期倉庫的運作是“人到貨”,人到貨物前邊把要的東西拿過來,這個效果非常差。
有了新型的 AI 配合的倉儲機器人,我們的目標(biāo)是“貨到人”——我人站著不動,我需要什么貨由機器人搬過來。那這里會遇到一個什么問題?
那就是多個機器人在倉庫里邊移動的時候,要保證安全性——兩個機器人不撞在一塊。另外它們要找到最短的路徑,這被叫做倉儲機器人路徑規(guī)劃:你到底應(yīng)該按照怎樣的方式去走。這也是 AI 的一個應(yīng)用場景。那么這也是用 TensorFlow 做的實現(xiàn)。
以前對卷子進行評分,一般是都是人來做,甚至多個人打分。但在人工智能領(lǐng)域,我們發(fā)現(xiàn)這種人靠經(jīng)驗做的東西,其實計算機也可以做。在我們使用 TensorFlow 這個框架的時候,有一個功能叫遞歸神經(jīng)網(wǎng)絡(luò),它主要是用來處理時間序列訓(xùn)練。在自然語言這一塊,它也有特別好的優(yōu)勢,可以用來做這個事兒。所以這個本質(zhì)上的項目目的,是用機器打分來替換人來給卷子評分。
智能招聘的目的是為了讓求職者、應(yīng)聘者和招聘方,雙方有一個非常好的 match,讓最合適的人去最需要他的地方。這樣的話,我們就需要對雙方做非常多的數(shù)據(jù)分析,而數(shù)據(jù)除了來自于個人本身,還會來自于社交或者其他地方,然后根據(jù)雙方所有數(shù)據(jù)做一個 match。
看起來它和推薦系統(tǒng)有點類似,但是當(dāng)我們在做這個系統(tǒng)的時候,其實你會發(fā)現(xiàn)在線廣告投放系統(tǒng)和推薦系統(tǒng)會有本質(zhì)上的差別的。
說推薦系統(tǒng)受益者是用戶使用者,而對于一個廣告系統(tǒng),它的受益者是平臺或廣告主。另外,推薦系統(tǒng)要找出的是符合使用者個體的最優(yōu)推薦方案;但在線廣告投放系統(tǒng)要達到的是利潤最大化。
其次它有一種規(guī)則,比如說我設(shè)計好這個廣告,不管它是否合理,我就是要投放。那這里的話有更多的規(guī)則干涉,配合及其學(xué)習(xí),共同實現(xiàn)一個在線廣告投放系統(tǒng)。這一塊相對來講比推薦系統(tǒng)復(fù)雜很多。
推薦系統(tǒng)在很多地方都會用,甚至在任何涉及到對用戶進行服務(wù)的時候,其實都是涉及到推薦。比如我們用的很多 APP,會給你推送很多新聞,本質(zhì)上這些新聞都是經(jīng)過篩選之后的。在推薦這個領(lǐng)域。已經(jīng)有很多存在的并且被廣泛應(yīng)用的方法。比如說基于人或者基于物的協(xié)同過濾,已經(jīng)被廣泛使用了?,F(xiàn)在我們更多的嘗試的事,是使用深度神經(jīng)網(wǎng)絡(luò)讓推薦的效果變得更好。這里邊有模型有算法,其實就是 TensorFlow 應(yīng)用的一個場景。
最下邊的數(shù)據(jù)服務(wù)我要強調(diào)一點:我們做任何一個 AI 系統(tǒng),重點一定不是建一個模型,而是數(shù)據(jù)集、數(shù)據(jù)架構(gòu)。這一塊才是最重要的。
其實我們可以把智能問答理解為常見的聊天機器人。這一塊的話,在實踐來講很早的時候,我們可以直接通過關(guān)鍵字搜索,靜態(tài)的給你返回,利用搜索引擎給你一個反饋。本質(zhì)上來講,這個時代算不上智能問答,只能說是一個文獻檢索。后來的話,什么樣的情況才叫智能問答?
智能問答并不是簡單地根據(jù)關(guān)鍵字,它能夠明白我說的這句話到底是什么意思。
這樣除了找出結(jié)果之外,它有一個很重要的功能,就是理解你說話。這就涉及一個技術(shù):自然語言處理。所以在智能問答里邊,我們除了要做一個相關(guān)的檢討之外,我們還要做自然語言處理。
另外,對于客戶端來講,我們的輸入除了文本,可能還有語音,還有圖片檢索;所以你的思路也會變得特別多。這個領(lǐng)域目前來講,是人工智能發(fā)展的還不錯的一個領(lǐng)域。而這一塊我們做的聊天機器人,其實它的模型基本上也是用 TensorFlow 來做的。
用 TensorFlow 給企業(yè)構(gòu)建一個智能問答,它的好處到底在哪?
目前來講,其實我們有很多云方面的、相關(guān)的、通用的一些解決方案。但對于行業(yè)來講,垂直的智能問答并不是通用智能問題能解決的問題。比如說一個行業(yè),它有很多行話,而這個行話不是時常被提及的,所以在這種方面對于企業(yè)來講,它會構(gòu)造一個屬于自己的垂直行業(yè)的智能問答,可以快速給自己做服務(wù),比如售后服務(wù)。當(dāng)用戶買了產(chǎn)品出了問題需要售后,這個時候機器人就可以派上用場了,而沒有必要百分之百的放很多的客服人員進行問答。
做一個人工智能項目的開發(fā)過程中,TensorFlow 只是你的一個框架。它做了相關(guān)的算法的實現(xiàn),給了你比較友好的API,讓你可以特別好得創(chuàng)建各種神經(jīng)網(wǎng)絡(luò),進行各種訓(xùn)練。這方面來講,更多是編程語言方面的熟悉或者說基礎(chǔ)知識的理解。比如說什么是損失函數(shù),什么是梯度下降。這種細節(jié)的編程級別的知識,在后面的培訓(xùn)課里我們會非常詳細的提到。這里邊提到的問題,更多的是在整個工程來講——因為我們既然把 TensorFlow 應(yīng)用到工程中,構(gòu)建一個人工智能項目,肯定不是為了玩一玩,而是希望用它解決生產(chǎn)上的現(xiàn)實問題。
所以這一章要談?wù)勎仪懊嫣岬降臄?shù)據(jù)探索。在很早的時候,我們發(fā)現(xiàn)構(gòu)建的數(shù)據(jù)湖缺少數(shù)據(jù)探索功能。一個數(shù)據(jù)湖放了好幾 PB 的數(shù)據(jù)都在那兒,但是我連一個快速檢索管理元數(shù)據(jù),這種快速查找功能都做不到。后來我們會做一個數(shù)據(jù)探索服務(wù)來解決這個問題,進行各種預(yù)覽,給數(shù)據(jù)科學(xué)家提供非常好的支撐。
在下邊的話就是對于小文件。首先,我們的 TensorFlow 所處理的數(shù)據(jù)一定是前期規(guī)整后的。也就是說 TensorFlow 沒有辦法直接接入生產(chǎn)環(huán)境,拿到未經(jīng)處理的數(shù)據(jù)自己做處理。這一系列功能都發(fā)生在大數(shù)據(jù)架構(gòu),所以大數(shù)據(jù)架構(gòu)本質(zhì)上是給人工智能、TensorFlow 這一層提供良好的數(shù)據(jù)處理。
在這個過程中我們會遇到小文件的問題。比如說我的文件有幾百億個,曾經(jīng)我們會遇到數(shù)據(jù)湖里面放的百億千億的文件。這個時候就面臨文件個數(shù)多、文件小這種問題。對于這種文件處理的話,我們一般會有好幾種場景。
第一種如果是靜態(tài)文件,比如我這個數(shù)據(jù),一批次導(dǎo)入幾千萬個文件就是這么多,可能不會再有持續(xù)進來,那最簡單的方式就是壓縮。壓縮有多種方式,對不一樣的實踐,比如 Hadoop 有自己 的 sequence file 的方式。
除了這種方式,還有第二種場景數(shù)據(jù)處理,會應(yīng)用在數(shù)據(jù)實時進入的情況下。比如我數(shù)據(jù)一直在來,每次來的都是小文件。持續(xù)進來,這個時候采用靜態(tài)壓縮方式就不合適了,因為數(shù)據(jù)一直在來。你可能把 10個1kb 壓到 1個10kb,但沒有什么意義。所以對于這種情況,我們之前在數(shù)據(jù)湖里設(shè)計了一個系統(tǒng),叫小文件系統(tǒng)。它用來攔截所有數(shù)據(jù)請求,把小文件存下來之后,在后臺有一個獨立的后臺線程,專門干什么事——做后臺壓縮。當(dāng)你的文件個數(shù)或者說某一個特征觸發(fā)了這個閥值之后,它會觸發(fā)一個線程,把小文件進行壓縮。
在這個小文件服務(wù)里邊,它要記錄的是被壓縮之后這個文件里邊包含哪些文件,分別 index 在哪個地方把它索引起來。這樣,當(dāng)我們有一個請求要訪問小文件的時候,這個請求首先被小文件服務(wù)攔截下來,根據(jù)它要查找的文件通過管理系統(tǒng)去看它在哪個位置,然后拿到那個大文件將它解壓出來再把小文件返回去,這樣的話就可以解決掉一個小文件的問題。這種場景對于文件持續(xù)不斷的進來,但是文件個數(shù)少可以作為一個非常好的解決。
實際上對于小文件,還有另外一種方式,就是我們可以把小文件放在kafka,它對于小文件處理是非常好的。但是卡夫卡有一個問題是處理不了大文件,特別是當(dāng)文件差異過大,比如小文件一兩 K、大文件幾個 G,那基本卡夫卡就抓瞎了。
前面提到的是我們對少量文件處理。下邊是我們曾經(jīng)遇到的文件個數(shù)多問題——多達百億以上。
我們知道,對于一個集 Hadoop 作為實施的數(shù)據(jù)服務(wù)系統(tǒng)來講,他的所有元數(shù)據(jù)是放在 NameNode。而 NameNode 里有很大的一個 hashtable 用來存儲元數(shù)據(jù),記錄了這個元數(shù)據(jù)在哪個 DataNode 之上。當(dāng)我們要訪問某一個文件的時候,先找 NameNode ,根據(jù) 哈希table 找到這個文件在哪個 DataNode 之上,把這個地址返回客戶端,客戶端拿著這個東西再去請求 DataNode,于是這一個文件請求過程就完成了。
所以瓶頸在哪個地方?
你的 DataNode 如果存放的文件記錄特別多,就會導(dǎo)致你的整個內(nèi)存爆掉。因為每一個文件進來,原信息要占一定的內(nèi)存空間的。雖然說 Hadoop 號稱是以廉價小型機為基礎(chǔ),但是它強調(diào) NameNode 配置一定要高于其他節(jié)點,至少是高配的,這樣才能保證你的整個集群可以運行得很好。早期 NameNode 提供了僅僅是 HA 的功能,你的所有的原信息都在一個 NameNode 里邊,等你的文件過多,它基本就會產(chǎn)生非常大的問題。
按照生產(chǎn)環(huán)境真正來講,一個 NameNode 能夠存放的最大文件個數(shù)可能就在 700 萬左右。就他的這個問題并不是因為 哈希table 到達上限,而是因為你每一個源文件進來,你的數(shù)據(jù)會占一部分存儲,你的內(nèi)存沒辦法擴展那么大,所以這個才是瓶頸。
在這個之后,出了一個 Hadoop 2.0 聯(lián)盟。聯(lián)盟就是把 NameNode 分?jǐn)偟讲煌墓?jié)點之上,每一個節(jié)點掛載在不同的目錄之下,于是把目錄水平拆分,我一個 NameNode 的只負(fù)責(zé)一個目錄,那這樣的結(jié)構(gòu)帶來的好處是什么:它并不是簡單的拆分。
在我們整個IT開發(fā)過程中,我們后來產(chǎn)生了一個微服務(wù),這種思想其實它本質(zhì)上是為了做什么,是把你的業(yè)務(wù)獨立拆分開,就我們的一個大系統(tǒng)的問題在哪?當(dāng)你的系統(tǒng)一宕機之后,你的整個需求全部出問題,都沒法訪問。但是當(dāng)我們將業(yè)務(wù)拆分成不同的子系統(tǒng),我其中一個宕機之后,我剩下的系統(tǒng)可以繼續(xù)使用。
在 Hadoop 聯(lián)盟之后出來之后,我們會發(fā)現(xiàn),某一個文件夾出問題之后,我剩下的數(shù)據(jù)還可以繼續(xù)使用。那這樣的話,我們在設(shè)計數(shù)據(jù)的時候會怎么做?不一樣的目錄,我們可能面對的是不一樣的業(yè)務(wù)場景,或者說不一樣的部門。這樣的話,一個大數(shù)據(jù)平臺提供給企業(yè)之之后,我們有一個非常好的容錯性,就是當(dāng)某一個企業(yè)部門的數(shù)據(jù)出現(xiàn)問題之后,不會影響到其他地方。很好地直接在這一層做了安全隔離。對于一個企業(yè)來講,它不太可能會做幾套大數(shù)據(jù)平臺,一般會有一套大數(shù)據(jù)平臺,給整個企業(yè)提供一個統(tǒng)一的服務(wù),并且在之上構(gòu)建人工智能系統(tǒng),這樣的話對我們底層的數(shù)據(jù)設(shè)施要求非常高。而這一塊 Hadoop 除了處理文件個數(shù)多之外,還提供了這種安全隔離,很好地解決這個問題。
下面這里大家看到的是集群搭建方式。
在應(yīng)用 TensorFlow 和大數(shù)據(jù)進行整合的時候,我們會有好幾種不同的處理方式,比如說數(shù)據(jù)平臺和 AI 集群獨立開。我們都知道,TensorFlow 的優(yōu)勢還是要利用 GPU。當(dāng)然這并不是 TensorFlow 的問題,而是對于任何數(shù)值計算的框架,GPU 是最高效的。因為 GPU 做苦力活、做純粹的數(shù)值計算非常擅長;而 CPU 對邏輯計算更擅長,那這樣的話大家會傾向于用 GPU 來做數(shù)值計算,而深度神經(jīng)網(wǎng)絡(luò)里邊本質(zhì)上就是不同的矩陣,各種純粹的數(shù)學(xué)運算。所以在企業(yè)里邊我們都會搭建統(tǒng)一的 GPU 集群,專門用來訓(xùn)練模型。
這樣就面臨一個問題:我們在做一個企業(yè)級 AI 系統(tǒng)的時候,我們的數(shù)據(jù)平臺到底應(yīng)該怎樣和 AI 系統(tǒng)進行整合,合并在一塊?
我們可以完全的獨立,一個數(shù)據(jù)平臺,一個AI系統(tǒng)。我們也可以把 AI 系統(tǒng)和數(shù)據(jù)系統(tǒng)部署在一塊。就是我們同一臺服務(wù)器里面部署的 CPU,還有數(shù)據(jù)服務(wù)相關(guān)的東西。當(dāng)我們計算的時候,我們的模型訓(xùn)練在 GPU 上,數(shù)據(jù)處理在其他地方,這也就整合成了一套。所以有兩種部署方式,一種是獨立的,一種是一體的,那對哪一種更好?肯定是一體的最好。為什么?
因為對于獨立的來講,我們?nèi)绻毩ⅲ馕吨m然說數(shù)據(jù)是分布式可以快速獲取到,但是你不可避免的有一個 suffle 的動作,你需要把數(shù)據(jù)從不同節(jié)點拉到一個節(jié)點之上,再把這個數(shù)據(jù)拿出來遞給 AI 系統(tǒng),讓它在 GPU 里面進行訓(xùn)練。看起來在我們目前來講,如果我們有非常高的帶寬以及計算性能這個都不是問題,但在我們用的過程中,我們會發(fā)現(xiàn)其實更好的方式還是將它合為一體。
這樣的好處是在于,首先,我們前面提到 Tensorflow 支持模型分布式。我可以在不同節(jié)點上進行訓(xùn)練。而數(shù)據(jù)在大數(shù)據(jù)平臺之上,它有一個數(shù)據(jù)分布式,同時 Tensorflow 支持直接從分布式文件系統(tǒng)例如 hdfs上面直接 load數(shù)據(jù)。這樣的情況下一個比較好的布置方式是怎樣的?
我們的模型分布式進行訓(xùn)練,在當(dāng)前節(jié)點之上訓(xùn)練的時候就直接加載當(dāng)前節(jié)點的數(shù)據(jù),這樣的話直接省掉了整個網(wǎng)絡(luò)帶寬,直接在當(dāng)前 節(jié)點 進行訓(xùn)練了,這是我們最理想的情況,所以也是把所有集群部署在一體上最好的體驗方式。
當(dāng)然這個在實施過程中可能會根據(jù)不一樣的生產(chǎn)的客觀環(huán)境會有一部分調(diào)整,所以這種問題一般也只能現(xiàn)場遇到現(xiàn)場解釋。但對于集群搭建來講,我們會有這兩種方法。
我前面提到 Tensorflow 有一個模型分布式。實際上后來 TensorFlow 也可以支持在 Spark 上運行,就是 TensorFlow On Spark。對于這個來講,其實思路也是我前面提到的:我挪的只是計算,根本不用挪數(shù)據(jù)。我既然要訓(xùn)練模型,那我把我訓(xùn)練的模型挪到數(shù)據(jù)之上就可以了。所以整個 TensorFlow 可以跑在 Spark 集群里邊。
之前我們在生產(chǎn)中運行來看的話,這樣的效果其實并不是很好。首先來講,你在 Spark 里面運行 TensorFlow,它是一個獨立的。因為Spark 本身是分布式的,如果 TensorFlow 再是分布式,兩個分布式一重疊就出問題了。所以說在這個場景里邊,其實 TensorFlow 是單機獨立地運行在一個 Spark executor面。這樣的話,它產(chǎn)生的是多個模型,最終的話它會運算出一個最好的模型,然后再來使用。只是在這個過程中有一個分布式的交叉驗證,讓所有的測試訓(xùn)練驗證的過程更通用,提高我們在整個模型訓(xùn)練過程中的速度。
在我們開發(fā) TensorFlow 或者說其他的 AI 架構(gòu)的時候,我們都會面臨一個問題:調(diào)試。其實不單單是在AI 里邊,如果我們做一般的開發(fā),做多線程的時候,調(diào)試也是一個非常困難的事情。而我們現(xiàn)在做 AI,TensorFlow 這種可以分布式訓(xùn)練,還可以分布式讀取數(shù)據(jù),兩者分布式疊在一塊調(diào)試就變得更加困難。
對于 TensorFlow 來講,在開始的時候我們可能只有一個 Tensorboard,我們把計算圖導(dǎo)出來,通過 Tensorboard 來查看整個模型的計算圖是怎樣的,變量是怎樣變化的,這樣變化下去會不會有問題,通過這個方面來監(jiān)控我們的訓(xùn)練過程。
另外,在 1.0 之后提出了 TFDBG。這種調(diào)試方式其實可以支持我們以斷點的形式去做處理,但是前面我們提到,TensorFlow 支持模型分布式訓(xùn)練,那在這個 debug 里面,分布式的這種多線程的訓(xùn)練會變得特別困難。所以一旦我們使用了 DBG,其實它就把你的分布式訓(xùn)練給廢掉了,直接把你的分布式拉成了當(dāng)前的一個 同步的訓(xùn)練,否則的話,你在多線程之下并行的訓(xùn)練之下,其實這種方式調(diào)試也會特別困難。而這兩種方式是 TensorFlow 做調(diào)試的一些方法。就特別少,而這一塊看起來雖然它有這個功能,實際上還是我們在開發(fā)過程中遇到的非常困難的問題,基本上在調(diào)試方面會有很多問題,不是那么順利。
最后是測試。無論是人工智能還是大數(shù)據(jù),測試這一塊其實是一個特別頭疼的事。首先來講,我們的大數(shù)據(jù)和人工智能的測試和傳統(tǒng)測試不一樣。
對于傳統(tǒng)測試來講,我們的輸出是固定的,我們只需要定義好 AC 或者寫好單元測試,就能夠保證這個結(jié)果輸出是對的。但是在大數(shù)據(jù)來講,我們沒有辦法寫一個測試說,這個模型 AC 應(yīng)該怎么寫。另外對于大數(shù)據(jù)來講,我們也沒有辦法預(yù)先定義好AC。比如說我們通過大數(shù)據(jù)配合人工智能訓(xùn)練了一TB 的數(shù)據(jù)或者一 PB 的數(shù)據(jù),最終計算出來一個值,那我們怎樣去證明計算出的這個值是對的?就我們可以簡單到一個什么場景,我們對于 TP 的數(shù)據(jù)求了一個累加,最終計算出來一個值,那我們怎么證明我們這個值是對的?
我們不太可能人工一條一條計算,所以這也是 AI 系統(tǒng)和大數(shù)據(jù)相關(guān)所面臨到的一個問題,就是我們怎么去測試我們的 AI 系統(tǒng)。對于這一塊,我們有各種不一樣的嘗試,但目前也沒有一個最終的定好的方法,就是我們可以證明這件事,這個運行測試是對的。
最后一個是驗收。在做這種項目的時候,我們會面臨驗收場景。我們把模型訓(xùn)練出來了,怎么去定義這件事?比如說我們訓(xùn)練出一個模型,說有 90% 的成功率,那我們這個 90% 的成功率怎么去證明,怎么去讓別人相信這件事就是 90%?所以前面提到的測試配合驗收,其實是在我們整個開發(fā)過程中所面臨的一些問題。應(yīng)該說目前來講,都沒有一個特別好的一個解決方案能把這個事情很好地證明好。
今就到這里,謝謝大家的收看,現(xiàn)在大家有什么問題,相關(guān)的東西相關(guān)的問題大家都可以提好,今天的課程就到這個地方,謝謝大家就在后面的課程的話,我們還有一系列的一些相關(guān)的課程,大家歡迎大家觀看,謝謝!
下周,ThoughtWorks 佟達、白發(fā)川兩位老師主持的 TensorFlow 培訓(xùn)將上線 mooc.ai,向?qū)W員系統(tǒng)性地傳道解惑。
你是否一直希望有個老司機能手把手帶領(lǐng)入門?這就是一次好機會。
授課方 ThoughtWorks 是全球領(lǐng)先的 IT 咨詢公司,聯(lián)合國婦女兒童組織、世界衛(wèi)生組織合作伙伴??偛吭谥ゼ痈?,42 個辦公室分布在全球的 15 個國家。
2012年,ThoughtWorks 排在 Google,F(xiàn)acebook 之前,被評為全球最難面試的公司。
2016 年,ThoughtWorks 力壓群雄,獲得全球“最佳女性科技人員雇主”獎項。
從初級到高級,理論+實戰(zhàn),一站式深度了解 TensorFlow!
本課程面向深度學(xué)習(xí)開發(fā)者,講授如何利用 TensorFlow 解決圖像識別、文本分析等具體問題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎(chǔ)實戰(zhàn)技巧開始,一步步教授學(xué)員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,并最終掌握一整套基于 TensorFlow 做深度學(xué)習(xí)開發(fā)的專業(yè)技能。
兩名授課老師佟達、白發(fā)川身為 ThoughtWorks 的資深技術(shù)專家,具有豐富的大數(shù)據(jù)平臺搭建、深度學(xué)習(xí)系統(tǒng)開發(fā)項目經(jīng)驗。
開課時間:4 月 25 日(星期二)開課,每周二、四晚 20:00-21:00
開課時長:總學(xué)時 20 小時,分 10 周完成,每周 2 次,每節(jié)課 1 小時。
授課地址:http://www.mooc.ai/course/82
線上授課,開放預(yù)約!
相關(guān)文章:
TensorFlow在工程項目中的應(yīng)用 公開課視頻+文字轉(zhuǎn)錄(上) | AI 研習(xí)社
萬事開頭難!入門TensorFlow,這9個問題TF Boys 必須要搞清楚
TensorFlow 與 Apache Spark 結(jié)合:雅虎開源“TensorFlowOnSpark”
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。