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