TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

機器學習 人工智能 工程師 Python 雷鋒網 2017-04-25

本週四,雷鋒網 AI 研習社邀請了跨國 IT 巨頭 ThoughtWorks 的資深數據架構師白髮川,主講線上公開課,為大家講解 TensorFlow 在工程項目中的應用

講師

白髮川:自我介紹一下,我是 ThoughtWorks 白髮川,之前一直從事大數據,後來我們開始做人工智能方向的一些嘗試和工作。我們致力於將人工智能、機器學習、大數據結合在一塊。在研究了了很多相關的機器學習框架之後,我們也做了自己的深度學習框架——deeplearning.scala。它由 scala 編寫,目前是開源的,大家可以瞭解下。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

這是公開課的錄製視頻:

公開課文字版

不方便看視頻的童鞋,可閱讀以下雷鋒網對本次公開課的文字轉錄。

由於篇幅較長,本次公開課的文字轉錄被拆為上下兩部分,這是下篇。上篇請見雷鋒網 TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(上) | AI 研習社。

白髮川:上文我們提到了幾種不同的大數據架構,它們和之前提到的數據成熟度評估模型相關——我們首先會評估一個企業的數據到達了怎樣一個級別,才知道在目前哪一種解決方案最為適合。

人工智能與大數據

現在我們來談談人工智能。

其實人工智能這個概念並不是近期才有的,很早、幾十年前大家就已經在提人工智能了。人工智能的核心目標是我們希望機器像人一樣的思考。那機器怎樣才能像人一樣思考?

這裡面發展出了兩個分支:一個是早期的概率論模型,另一個是神經網絡。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

我們常見的 HMM、貝葉斯,都是屬於概率論的。概率論對於數據的處理,你基本上存在一個抽樣或者以概率形式去計算的。所以在很早的時候數據量不是特別大的情況下,概率論會是一個特別好的選擇。

另外,概率論可以處理不太大的數據集,所以說相對來講它會更加常用。比如說我們使用 HMM 去做分詞,這也是個非常要好的一個場景。另外一個分支是神經網絡。神經網絡很早就提出了,但近幾年才是各種深度神經網絡框架逐漸火起來的一個時代。因為在最近我們發現,計算機的計算能力被提高了——神經網絡在數據量越大的情況下,它的效果越好;在神經網絡層次越深的情況下,它的效果更好;而這一切背後依靠的都是計算機的計算能力。神經網絡也有好幾種,比如說深度神經網絡、遞歸神經網絡、卷積等。如果計算機的計算能力沒有發展,我們談的人工智能將繼續的停留在實驗室。所以背後如果沒有數據的支撐,AI 基本上談不上任何效果。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

我們不可能拿十條數據來訓練,如果我們要上生產環境。這樣的數據在本質上達不到生產需求。在很早的時候,數據一直在發展的過程中,其實人工智能也是在發展的,只是它發展的階段不一樣。在很早的時候,人工智能可能只是停留在理論階段,我們知道有算法有論文,但是真正要應用到生產中,讓它商業化、市場化,其實有很大的跨度。在這之後,我們會進入到一個新階段:很多企業會做 AI lab,去開一個實驗室來根據現有數據做嘗試,看有沒有更好的方法。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

再下一個階段,就到了大數據時代。這時,數據的處理性能變得特別的高。我們發現,AI 本來就是依賴於數據的,既然數據的處理能力提高了,AI 一定會迎來非常好的發展。這就是目前我們所面臨的情況。很多企業會藉助於大數據平臺來對數據做處理。有了大數據之後,很多企業也會以人工智能來更好地服務於自身業務。

這裡是一個生產中使用的、比較好的人工智能架構方案。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

正如上篇提到的,數據和人工智能,兩者是可以完全分開,但兩者結合才是最終的解決方案。拿掉人工智能,我們可以把數據作為一個大數據平臺去使用。有了人工智能,我們可以在大數據平臺之上擴充,讓它變成一個更完美的架構,所以這就是為什麼數據架構非常重要——你的人工智能到底能不能很好的接入。圖中可以看到,數據平臺主要負責的是數據處理、數據存儲、數據檢索以及數據探索等一系列數據準備相關的工作。

當數據準備好了之後,對於機器學習這一塊,它只是根據你的數據做特徵提取、做模型訓練,很大的一部分工作都會在數據平臺上。最簡單來講,有的企業可能對數據的隱祕性要求比較高——會有數據加密、各種加密。那在運算過程中會有數據解密,加密這個過程、解密這個動作是沒有辦法讓神經網絡去做的,只能放在數據平臺。所以數據平臺對於數據的處理能力要求非常高,直接決定了後面的效果。

當我們的數據平臺搭建完成了之後,本質上來講就已經有了數據分佈式環境。這是我們要做的,只是說有一個系統可以很好地加在分佈式數據上,訓練出一個模型。目前 TensorFlow 已經支持模型分佈式,這是一個非常好的效果。

在很早的時候,模型訓練是不支持分佈式訓練的,就是你的模型在一臺機器上訓練,就獨立地訓練出來。沒有辦法讓兩臺機器配合去訓練一個模型。而在目前來講 TensorFlow 已經做得非常好,支持模型分佈式訓練,當然這得藉助於它的計算圖概念。

對於 Tensorflow 計算圖這一系列很細的技術問題,後面"TensorFlow & 神經網絡算法高級應用班”課程都會講到—— Tensorflow 怎樣支持模型的分佈式訓練。在這個架構裡邊,我們底層有 GPU、CPU 系統的人工智能集群,在這之上,我們創建的模型分佈式訓練會產生模型。數據平臺還會提供另外一個功能,就是的實時流。

大家看到的這架構裡邊有一個分支,就是實時流。它與人工智能結合起來就是實時預測,實時預測之後,數據展示出來直接以決策的形式反饋給使用者,實際上實時流另外還有一個功能就是模型的持續訓練。而在使用的這個地方,大家還能看到有個箭頭,就是數據又進入了大數據平臺。這是我們目前提倡的一個架構,叫數據驅動架構。就用戶產生數據,數據服務於用戶。如果說你的這個過程是良性的:比如說我用這個系統,系統服務於我,這個過程是良性的,越來越好;當我用的系統越多,它對我的體驗越好,那這個系統就會自我進化,變得越來越好,所以這種架構也是我們目前在所有實施中採用地方案。

TensorFlow 的工程實踐

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

TensorFlow 本身是一個深度神經網絡框架。它的計算模塊,也就是核心 Core 是由 C++ 寫的。它對外提供了很多 API,早期只有 Python,1.0 之後增加了 Java API,但還處於測試階段,不是特別穩定,也不是特別完善。所以對於 TensorFlow 我們還是優先使用 Python。

對於 Python 來講,我們會把機器學習這一塊包裝成一個服務,或者說以其他形式來提供使用。在這一塊,它對外提供的是 Python,它內部是 C++,中間就有一個數據交換,發生在內存中——就是將 Python 需要的計算邏輯轉成 C++ ,由底層計算之後再返回結果。

在一個完整的人工智能系統裡,分佈式存在於兩個地方:數據分佈式和模型分佈式。數據分佈式主要是由數據湖支撐的,我們的數據被分佈式存儲。分佈式數據存儲的好處在於,我可以快速地把數據從不同節點拿過來。這個時候對於系統來講,要擴展的僅僅是帶寬。

在真正的生產裡邊,對於企業來講,做一個專線搭建 GB 級網絡帶寬,在本質上的成本會遠遠低於提高計算機硬件。這也是數據分佈式為什麼會存在、並且做得越來越好的一個原因。

另外,TensorFlow 支持模型分佈式。當我們數據分佈式之後,我們的模型分佈式,兩者結合起來整個訓練的速度會變得特別快。在 Tensorflow 裡,模型計算可以根據你自己寫的訓練模型代碼生成計算圖,然後根據你的計算圖將獨立的每一個計算圖分佈到不同的節點,然後進行訓練,最終產生一個唯一的模型,這也是 TensorFlow 在分佈式訓練方面做得非常好的一點。

但是我們回頭來看,TensorFlow 在本質上、在使用過程中,它就是一個python庫。所以當我們在做一個神經網絡工程項目的時候,我們可以講 TensorFlow 是我們的一個庫,我們用了它。相對來講,它所佔的是我們系統中的一小個模塊。

TensorFlow 是一個深度的神經網絡框架,但是它並不是唯一的,像 Caffe、MXnet、Theano,還有 Java 版的 Deeplearning4j。這類框架早就存在了。那麼為什麼說 TensorFlow 是我們認為一個比較好的選擇?

在開發中來講,大家對它的定義是“工程化做的最好的深度神經網絡框架”,因此傾向於選擇於 TensorFlow。其他的框架在很多場景之下,像實驗室或者高校大家也會用;但對工程師來講,我們希望更友好的方式包 API 使用方式,能讓工程師更容易懂;降低門檻,降低對數學的要求。

一個神經網絡框架,設計得越原始,對數學的要求越高。這對工程師不是特別友好。而 TensorFlow 是介於這兩者中比較一個折中的一個方案。

Python

既然 TensorFlow 說白了就是一個 Python 庫,那麼當我們開發人工智能項目的時候,本質上我們的開發就演變成了如何做好python項目的開發。

目前無論是做機器學習還是做數據分析,Python 有非常好的勢頭,大家都在用它。而更多的平臺提供出來的,其實也是 Python作為api的方式, Python 在佔的比重是非常大的。因此做人工智能項目,學習 Python 是非常重要的。就是說要研究 TensorFlow,之前得打好基礎先學好 Python。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

對於 Python 來講,有 Python2 和 3,我們目前建議用 Python3。在 Python 裡會涉及到非常多的庫,我們需要管理庫,它就和 yum 一樣,我們可以使用 pip 來對我們的庫做一些管理,下面有個 virtualenv。對於 Python 的這種輕量級語言來講,在我們系統裡邊,有時會涉及不同版本的 Python 項目存在,這就需要一個好的隔離環境,讓我們的兩個環境隔離起來,不要相互影響。比如說我一個項目是 Python2,另外一個項目是 Python3,我希望這兩個工程在我係統裡面同時運行,virtualenv 提供了非常好的這樣一個功能:封裝了 Python 的環境,可以讓你不一樣的版本、不一樣的庫在一個系統裡同時存在。對於 virtualenv 來講,它提供的就是一個 Python 虛擬環境,我們在生產過程中會發現,當你的 virtualenv 非常多的時候,管理起來特別困難。於是我們會選擇 virtualenvwrapper,它的作用是管理系統裡邊所有的 virtualenv,包括你的創建你的切換,都可以完整管理起來。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

當我們有開發環境——就是前面提到的幾種工具,都是開發過程中隨時會用的。有了這些工具之後,下一步就是開發代碼。

對於 Python 來講,工具非常多。IPython Notebook 是一個輕量級的一個 Python web IDE,我們可以在網頁上進行 Python 代碼編寫。它分為不同階段,可以局部執行代碼,能很快地把我們的代碼所見即所得。這也是我們在做數據探索或者一些嘗試的時候優先的選擇。我們可以很快分析出,我們的整個操作到底對不對,還需不需要繼續。

所以這裡解釋了我們為什麼要用 virtualenv——我們需要一個獨立的環境來運行我們的工程。這種思想和目前的 Docker 有一點類似。另外,當做一個比較大的項目的時候,我們可能會藉助於集成開發環境地 IDE,像 Pycharm 式目前在開發中非常常用的,基本上百分之百會用到的 IDE。在正式環境之下,特別是一個 team,大家協助開發的時候特別會用到。

CI/CD

對於工程開發來講,我們的一個項目在開發之後,我們需要上線,我們需要測試,我們需要部署;對於非人工智能的項目,我們會有 CI/CD。代碼寫完之後,我們需要部署、需要測試、需要運行,這一系列我們可以自動化,便是 CI/CD。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

我們的代碼提到版本控制器,CI/CD 會自動監聽到代碼發生變化,然後把代碼打包、運型測試。成功之後給你部署,把結果以可視化的形式展示出來。這是我們一般項目開發中常用的 CI/CD 工具,那麼在一個 AI 項目裡,我們會不會做 CI/CD?

其實是會做的。

首先,人工智能的 CI/CD 和一般項目來講流程差不多,但會有一些差異化的地方。前邊還是一樣,代碼邏輯發生更改之後會觸發整個 CI/CD 的 pipeline,還有一個分支:數據 pipeline 觸發。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

數據 pipeline 是什麼?

前面提到人工智能數據,分為兩塊:一個是數據部分,一個是人工智能部分。這就意味著在我們的人工智能項目裡邊,它有邏輯,在數據裡面它有數據。當我有新數據進來,或者說我的模型邏輯代碼發生變更,這兩者都會觸發你的 CI/CD 。

CI/CD 被觸發之後,除了和一般的項目一樣要做基本的單元測試評估之外,我們多了一個功能,就是模型評估。這一部分功能的話,更多的是在 CI/CD 上做改造。

什麼是模型評估?對於一般的系統來講,什麼樣的情況之下,我們認為這個測試是掛的。就是它的真正輸出和我們期望的輸出不一致,我們就可以認為它掛了。

那對於 AI 來講,什麼樣的情況下,我們認為這個這一次的開發是失敗的?那就是模型在變壞,一次一次的變壞。比如我第一次訓練出來的模型準確度 90%,第二次 80%,第三次 70%。從這個角度來講,雖然說代碼運行非常正確,但效果在降低,而這個評估應該被 CI/CD 記錄下來。最後提交代碼、模型訓練出來之後,相比上一次的模型,如果它的效果更差,那你這次的 CI/CD 是掛地,整個 task 是不通過的。

這樣,我們可以保證整個開發的性能是在上升的,就避免了一個 team 悶頭開發代碼不停地換方法,最後發現模型一次比一次差。

TensorFlow 應用場景

本質上講,AI 是為了更好地幫助人來進行思考和輔助人做決策,所以場景相對來講會比較廣泛,也比較通用。但差別點是在於:你要在這個通用場景裡,實現怎樣的需求?

圖像識別

比如一提到人工智能或者深度學習,或者卷積神經網絡,大家都會想到圖像識別,這是一個非常通用的領域。但對於在這個領域之內,要達到怎樣地細化程度,就是需要我們進行評估和實現的。比如在我們之前做的項目裡邊,我們曾經做過一個電商的系統,是用來分析它的圖片的——一個電商賣家可能會上傳特別多的圖片,對於整個電商平臺來講,它希望對圖片做分析,知道上傳地圖片裡邊包含哪些物體,比如說我們在這個圖片裡邊能夠識別出這個是沙發、另外一個是人,等等這一系列的一些物體識別。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

倉儲機器人

這就是利用 TensorFlow 在圖像識別領域細分領域的一個實現。除此之外的話,除了圖像領域、對於 AI 這個概念,很多人提到 AI 大家會想到機器人。而實際上在工業界,機器人應用非常廣泛,特別是在倉庫來講,倉儲機器人以亞馬遜為首開始率先帶領這個行業。目前已經變得非常的常用,至少大家都在對這方面進行投入、研發。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

倉儲機器人的主要功能是搬遷貨物。上圖中大家可以看到,一個倉儲機器人馱了一個貨架。早期倉庫的運作是“人到貨”,人到貨物前邊把要的東西拿過來,這個效果非常差。

有了新型的 AI 配合的倉儲機器人,我們的目標是“貨到人”——我人站著不動,我需要什麼貨由機器人搬過來。那這裡會遇到一個什麼問題?

那就是多個機器人在倉庫裡邊移動的時候,要保證安全性——兩個機器人不撞在一塊。另外它們要找到最短的路徑,這被叫做倉儲機器人路徑規劃:你到底應該按照怎樣的方式去走。這也是 AI 的一個應用場景。那麼這也是用 TensorFlow 做的實現。

智能評卷系統

以前對卷子進行評分,一般是都是人來做,甚至多個人打分。但在人工智能領域,我們發現這種人靠經驗做的東西,其實計算機也可以做。在我們使用 TensorFlow 這個框架的時候,有一個功能叫遞歸神經網絡,它主要是用來處理時間序列訓練。在自然語言這一塊,它也有特別好的優勢,可以用來做這個事兒。所以這個本質上的項目目的,是用機器打分來替換人來給卷子評分。

智能招聘

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

智能招聘的目的是為了讓求職者、應聘者和招聘方,雙方有一個非常好的 match,讓最合適的人去最需要他的地方。這樣的話,我們就需要對雙方做非常多的數據分析,而數據除了來自於個人本身,還會來自於社交或者其他地方,然後根據雙方所有數據做一個 match。

在線廣告投放系統

看起來它和推薦系統有點類似,但是當我們在做這個系統的時候,其實你會發現在線廣告投放系統和推薦系統會有本質上的差別的。

說推薦系統受益者是用戶使用者,而對於一個廣告系統,它的受益者是平臺或廣告主。另外,推薦系統要找出的是符合使用者個體的最優推薦方案;但在線廣告投放系統要達到的是利潤最大化。

其次它有一種規則,比如說我設計好這個廣告,不管它是否合理,我就是要投放。那這裡的話有更多的規則干涉,配合及其學習,共同實現一個在線廣告投放系統。這一塊相對來講比推薦系統複雜很多。

推薦系統

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

推薦系統在很多地方都會用,甚至在任何涉及到對用戶進行服務的時候,其實都是涉及到推薦。比如我們用的很多 APP,會給你推送很多新聞,本質上這些新聞都是經過篩選之後的。在推薦這個領域。已經有很多存在的並且被廣泛應用的方法。比如說基於人或者基於物的協同過濾,已經被廣泛使用了。現在我們更多的嘗試的事,是使用深度神經網絡讓推薦的效果變得更好。這裡邊有模型有算法,其實就是 TensorFlow 應用的一個場景。

最下邊的數據服務我要強調一點:我們做任何一個 AI 系統,重點一定不是建一個模型,而是數據集、數據架構。這一塊才是最重要的。

智能問答

其實我們可以把智能問答理解為常見的聊天機器人。這一塊的話,在實踐來講很早的時候,我們可以直接通過關鍵字搜索,靜態的給你返回,利用搜索引擎給你一個反饋。本質上來講,這個時代算不上智能問答,只能說是一個文獻檢索。後來的話,什麼樣的情況才叫智能問答?

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

智能問答並不是簡單地根據關鍵字,它能夠明白我說的這句話到底是什麼意思。

這樣除了找出結果之外,它有一個很重要的功能,就是理解你說話。這就涉及一個技術:自然語言處理。所以在智能問答裡邊,我們除了要做一個相關的檢討之外,我們還要做自然語言處理。

另外,對於客戶端來講,我們的輸入除了文本,可能還有語音,還有圖片檢索;所以你的思路也會變得特別多。這個領域目前來講,是人工智能發展的還不錯的一個領域。而這一塊我們做的聊天機器人,其實它的模型基本上也是用 TensorFlow 來做的。

用 TensorFlow 給企業構建一個智能問答,它的好處到底在哪?

目前來講,其實我們有很多雲方面的、相關的、通用的一些解決方案。但對於行業來講,垂直的智能問答並不是通用智能問題能解決的問題。比如說一個行業,它有很多行話,而這個行話不是時常被提及的,所以在這種方面對於企業來講,它會構造一個屬於自己的垂直行業的智能問答,可以快速給自己做服務,比如售後服務。當用戶買了產品出了問題需要售後,這個時候機器人就可以派上用場了,而沒有必要百分之百的放很多的客服人員進行問答。

生產中的問題

做一個人工智能項目的開發過程中,TensorFlow 只是你的一個框架。它做了相關的算法的實現,給了你比較友好的API,讓你可以特別好得創建各種神經網絡,進行各種訓練。這方面來講,更多是編程語言方面的熟悉或者說基礎知識的理解。比如說什麼是損失函數,什麼是梯度下降。這種細節的編程級別的知識,在後面的培訓課裡我們會非常詳細的提到。這裡邊提到的問題,更多的是在整個工程來講——因為我們既然把 TensorFlow 應用到工程中,構建一個人工智能項目,肯定不是為了玩一玩,而是希望用它解決生產上的現實問題。

所以這一章要談談我前面提到的數據探索。在很早的時候,我們發現構建的數據湖缺少數據探索功能。一個數據湖放了好幾 PB 的數據都在那兒,但是我連一個快速檢索管理元數據,這種快速查找功能都做不到。後來我們會做一個數據探索服務來解決這個問題,進行各種預覽,給數據科學家提供非常好的支撐。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

文件處理

在下邊的話就是對於小文件。首先,我們的 TensorFlow 所處理的數據一定是前期規整後的。也就是說 TensorFlow 沒有辦法直接接入生產環境,拿到未經處理的數據自己做處理。這一系列功能都發生在大數據架構,所以大數據架構本質上是給人工智能、TensorFlow 這一層提供良好的數據處理。

在這個過程中我們會遇到小文件的問題。比如說我的文件有幾百億個,曾經我們會遇到數據湖裡面放的百億千億的文件。這個時候就面臨文件個數多、文件小這種問題。對於這種文件處理的話,我們一般會有好幾種場景。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

第一種如果是靜態文件,比如我這個數據,一批次導入幾千萬個文件就是這麼多,可能不會再有持續進來,那最簡單的方式就是壓縮。壓縮有多種方式,對不一樣的實踐,比如 Hadoop 有自己 的 sequence file 的方式。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

除了這種方式,還有第二種場景數據處理,會應用在數據實時進入的情況下。比如我數據一直在來,每次來的都是小文件。持續進來,這個時候採用靜態壓縮方式就不合適了,因為數據一直在來。你可能把 10個1kb 壓到 1個10kb,但沒有什麼意義。所以對於這種情況,我們之前在數據湖裡設計了一個系統,叫小文件系統。它用來攔截所有數據請求,把小文件存下來之後,在後臺有一個獨立的後臺線程,專門幹什麼事——做後臺壓縮。當你的文件個數或者說某一個特徵觸發了這個閥值之後,它會觸發一個線程,把小文件進行壓縮。

在這個小文件服務裡邊,它要記錄的是被壓縮之後這個文件裡邊包含哪些文件,分別 index 在哪個地方把它索引起來。這樣,當我們有一個請求要訪問小文件的時候,這個請求首先被小文件服務攔截下來,根據它要查找的文件通過管理系統去看它在哪個位置,然後拿到那個大文件將它解壓出來再把小文件返回去,這樣的話就可以解決掉一個小文件的問題。這種場景對於文件持續不斷的進來,但是文件個數少可以作為一個非常好的解決。

實際上對於小文件,還有另外一種方式,就是我們可以把小文件放在kafka,它對於小文件處理是非常好的。但是卡夫卡有一個問題是處理不了大文件,特別是當文件差異過大,比如小文件一兩 K、大文件幾個 G,那基本卡夫卡就抓瞎了。

前面提到的是我們對少量文件處理。下邊是我們曾經遇到的文件個數多問題——多達百億以上。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

我們知道,對於一個集 Hadoop 作為實施的數據服務系統來講,他的所有元數據是放在 NameNode。而 NameNode 裡有很大的一個 hashtable 用來存儲元數據,記錄了這個元數據在哪個 DataNode 之上。當我們要訪問某一個文件的時候,先找 NameNode ,根據 哈希table 找到這個文件在哪個 DataNode 之上,把這個地址返回客戶端,客戶端拿著這個東西再去請求 DataNode,於是這一個文件請求過程就完成了。

所以瓶頸在哪個地方?

你的 DataNode 如果存放的文件記錄特別多,就會導致你的整個內存爆掉。因為每一個文件進來,原信息要佔一定的內存空間的。雖然說 Hadoop 號稱是以廉價小型機為基礎,但是它強調 NameNode 配置一定要高於其他節點,至少是高配的,這樣才能保證你的整個集群可以運行得很好。早期 NameNode 提供了僅僅是 HA 的功能,你的所有的原信息都在一個 NameNode 裡邊,等你的文件過多,它基本就會產生非常大的問題。

按照生產環境真正來講,一個 NameNode 能夠存放的最大文件個數可能就在 700 萬左右。就他的這個問題並不是因為 哈希table 到達上限,而是因為你每一個源文件進來,你的數據會佔一部分存儲,你的內存沒辦法擴展那麼大,所以這個才是瓶頸。

在這個之後,出了一個 Hadoop 2.0 聯盟。聯盟就是把 NameNode 分攤到不同的節點之上,每一個節點掛載在不同的目錄之下,於是把目錄水平拆分,我一個 NameNode 的只負責一個目錄,那這樣的結構帶來的好處是什麼:它並不是簡單的拆分。

在我們整個IT開發過程中,我們後來產生了一個微服務,這種思想其實它本質上是為了做什麼,是把你的業務獨立拆分開,就我們的一個大系統的問題在哪?當你的系統一宕機之後,你的整個需求全部出問題,都沒法訪問。但是當我們將業務拆分成不同的子系統,我其中一個宕機之後,我剩下的系統可以繼續使用。

在 Hadoop 聯盟之後出來之後,我們會發現,某一個文件夾出問題之後,我剩下的數據還可以繼續使用。那這樣的話,我們在設計數據的時候會怎麼做?不一樣的目錄,我們可能面對的是不一樣的業務場景,或者說不一樣的部門。這樣的話,一個大數據平臺提供給企業之之後,我們有一個非常好的容錯性,就是當某一個企業部門的數據出現問題之後,不會影響到其他地方。很好地直接在這一層做了安全隔離。對於一個企業來講,它不太可能會做幾套大數據平臺,一般會有一套大數據平臺,給整個企業提供一個統一的服務,並且在之上構建人工智能系統,這樣的話對我們底層的數據設施要求非常高。而這一塊 Hadoop 除了處理文件個數多之外,還提供了這種安全隔離,很好地解決這個問題。

集群搭建方式

下面這裡大家看到的是集群搭建方式。

在應用 TensorFlow 和大數據進行整合的時候,我們會有好幾種不同的處理方式,比如說數據平臺和 AI 集群獨立開。我們都知道,TensorFlow 的優勢還是要利用 GPU。當然這並不是 TensorFlow 的問題,而是對於任何數值計算的框架,GPU 是最高效的。因為 GPU 做苦力活、做純粹的數值計算非常擅長;而 CPU 對邏輯計算更擅長,那這樣的話大家會傾向於用 GPU 來做數值計算,而深度神經網絡裡邊本質上就是不同的矩陣,各種純粹的數學運算。所以在企業裡邊我們都會搭建統一的 GPU 集群,專門用來訓練模型。

這樣就面臨一個問題:我們在做一個企業級 AI 系統的時候,我們的數據平臺到底應該怎樣和 AI 系統進行整合,合併在一塊?

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

我們可以完全的獨立,一個數據平臺,一個AI系統。我們也可以把 AI 系統和數據系統部署在一塊。就是我們同一臺服務器裡面部署的 CPU,還有數據服務相關的東西。當我們計算的時候,我們的模型訓練在 GPU 上,數據處理在其他地方,這也就整合成了一套。所以有兩種部署方式,一種是獨立的,一種是一體的,那對哪一種更好?肯定是一體的最好。為什麼?

因為對於獨立的來講,我們如果獨立,意味著雖然說數據是分佈式可以快速獲取到,但是你不可避免的有一個 suffle 的動作,你需要把數據從不同節點拉到一個節點之上,再把這個數據拿出來遞給 AI 系統,讓它在 GPU 裡面進行訓練。看起來在我們目前來講,如果我們有非常高的帶寬以及計算性能這個都不是問題,但在我們用的過程中,我們會發現其實更好的方式還是將它合為一體。

這樣的好處是在於,首先,我們前面提到 Tensorflow 支持模型分佈式。我可以在不同節點上進行訓練。而數據在大數據平臺之上,它有一個數據分佈式,同時 Tensorflow 支持直接從分佈式文件系統例如 hdfs上面直接 load數據。這樣的情況下一個比較好的佈置方式是怎樣的?

我們的模型分佈式進行訓練,在當前節點之上訓練的時候就直接加載當前節點的數據,這樣的話直接省掉了整個網絡帶寬,直接在當前 節點 進行訓練了,這是我們最理想的情況,所以也是把所有集群部署在一體上最好的體驗方式。

當然這個在實施過程中可能會根據不一樣的生產的客觀環境會有一部分調整,所以這種問題一般也只能現場遇到現場解釋。但對於集群搭建來講,我們會有這兩種方法。

TensorFlow On Spark

我前面提到 Tensorflow 有一個模型分佈式。實際上後來 TensorFlow 也可以支持在 Spark 上運行,就是 TensorFlow On Spark。對於這個來講,其實思路也是我前面提到的:我挪的只是計算,根本不用挪數據。我既然要訓練模型,那我把我訓練的模型挪到數據之上就可以了。所以整個 TensorFlow 可以跑在 Spark 集群裡邊。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

之前我們在生產中運行來看的話,這樣的效果其實並不是很好。首先來講,你在 Spark 裡面運行 TensorFlow,它是一個獨立的。因為Spark 本身是分佈式的,如果 TensorFlow 再是分佈式,兩個分佈式一重疊就出問題了。所以說在這個場景裡邊,其實 TensorFlow 是單機獨立地運行在一個 Spark executor面。這樣的話,它產生的是多個模型,最終的話它會運算出一個最好的模型,然後再來使用。只是在這個過程中有一個分佈式的交叉驗證,讓所有的測試訓練驗證的過程更通用,提高我們在整個模型訓練過程中的速度。

調試

在我們開發 TensorFlow 或者說其他的 AI 架構的時候,我們都會面臨一個問題:調試。其實不單單是在AI 裡邊,如果我們做一般的開發,做多線程的時候,調試也是一個非常困難的事情。而我們現在做 AI,TensorFlow 這種可以分佈式訓練,還可以分佈式讀取數據,兩者分佈式疊在一塊調試就變得更加困難。

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

對於 TensorFlow 來講,在開始的時候我們可能只有一個 Tensorboard,我們把計算圖導出來,通過 Tensorboard 來查看整個模型的計算圖是怎樣的,變量是怎樣變化的,這樣變化下去會不會有問題,通過這個方面來監控我們的訓練過程。

另外,在 1.0 之後提出了 TFDBG。這種調試方式其實可以支持我們以斷點的形式去做處理,但是前面我們提到,TensorFlow 支持模型分佈式訓練,那在這個 debug 裡面,分佈式的這種多線程的訓練會變得特別困難。所以一旦我們使用了 DBG,其實它就把你的分佈式訓練給廢掉了,直接把你的分佈式拉成了當前的一個 同步的訓練,否則的話,你在多線程之下並行的訓練之下,其實這種方式調試也會特別困難。而這兩種方式是 TensorFlow 做調試的一些方法。就特別少,而這一塊看起來雖然它有這個功能,實際上還是我們在開發過程中遇到的非常困難的問題,基本上在調試方面會有很多問題,不是那麼順利。

測試

最後是測試。無論是人工智能還是大數據,測試這一塊其實是一個特別頭疼的事。首先來講,我們的大數據和人工智能的測試和傳統測試不一樣。

對於傳統測試來講,我們的輸出是固定的,我們只需要定義好 AC 或者寫好單元測試,就能夠保證這個結果輸出是對的。但是在大數據來講,我們沒有辦法寫一個測試說,這個模型 AC 應該怎麼寫。另外對於大數據來講,我們也沒有辦法預先定義好AC。比如說我們通過大數據配合人工智能訓練了一TB 的數據或者一 PB 的數據,最終計算出來一個值,那我們怎樣去證明計算出的這個值是對的?就我們可以簡單到一個什麼場景,我們對於 TP 的數據求了一個累加,最終計算出來一個值,那我們怎麼證明我們這個值是對的?

我們不太可能人工一條一條計算,所以這也是 AI 系統和大數據相關所面臨到的一個問題,就是我們怎麼去測試我們的 AI 系統。對於這一塊,我們有各種不一樣的嘗試,但目前也沒有一個最終的定好的方法,就是我們可以證明這件事,這個運行測試是對的。

最後一個是驗收。在做這種項目的時候,我們會面臨驗收場景。我們把模型訓練出來了,怎麼去定義這件事?比如說我們訓練出一個模型,說有 90% 的成功率,那我們這個 90% 的成功率怎麼去證明,怎麼去讓別人相信這件事就是 90%?所以前面提到的測試配合驗收,其實是在我們整個開發過程中所面臨的一些問題。應該說目前來講,都沒有一個特別好的一個解決方案能把這個事情很好地證明好。

今就到這裡,謝謝大家的收看,現在大家有什麼問題,相關的東西相關的問題大家都可以提好,今天的課程就到這個地方,謝謝大家就在後面的課程的話,我們還有一系列的一些相關的課程,大家歡迎大家觀看,謝謝!

“TensorFlow & 神經網絡算法高級應用班”要開課啦!

TensorFlow在工程項目中的應用 公開課視頻+文字轉錄(下) | AI 研習社

下週,ThoughtWorks 佟達、白髮川兩位老師主持的 TensorFlow 培訓將上線 mooc.ai,向學員系統性地傳道解惑。

你是否一直希望有個老司機能手把手帶領入門?這就是一次好機會。

ThoughtWorks

授課方 ThoughtWorks 是全球領先的 IT 諮詢公司,聯合國婦女兒童組織、世界衛生組織合作伙伴。總部在芝加哥,42 個辦公室分佈在全球的 15 個國家。

2012年,ThoughtWorks 排在 Google,Facebook 之前,被評為全球最難面試的公司。

2016 年,ThoughtWorks 力壓群雄,獲得全球“最佳女性科技人員僱主”獎項。

培訓課介紹:

從初級到高級,理論+實戰,一站式深度瞭解 TensorFlow!

本課程面向深度學習開發者,講授如何利用 TensorFlow 解決圖像識別、文本分析等具體問題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎實戰技巧開始,一步步教授學員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,並最終掌握一整套基於 TensorFlow 做深度學習開發的專業技能。

兩名授課老師佟達、白髮川身為 ThoughtWorks 的資深技術專家,具有豐富的大數據平臺搭建、深度學習系統開發項目經驗。

開課時間:4 月 25 日(星期二)開課,每週二、四晚 20:00-21:00

開課時長:總學時 20 小時,分 10 周完成,每週 2 次,每節課 1 小時。

授課地址:http://www.mooc.ai/course/82

線上授課,開放預約!

相關推薦

推薦中...