如何用(yòng)Python通(tōng)吃(chī)高(gāo)性能并發、GPU計算(suàn)和(hé)深度學習(xí)

更新: 2016-10-10 作者:admin點擊:

摘要:怎樣實現Python的(de)多(duō)種形式優化(huà)?如何利用(yòng) gpu(opencl) 加速數據分(fēn)析?“行爲式驗證”安全模型是怎樣的(de)?極驗驗證技術架構是怎樣的(de)?用(yòng)到了(le)什(shén)麽技術?本文爲極驗驗證CTO黃(huáng)勝藍在CTO講堂的(de)分(fēn)享整理(lǐ)。

爲了(le)幫助IT從業者職業之路擁有更多(duō)收獲,在諸多(duō)C粉的(de)殷切期待下(xià),由 CTO俱樂(yuè)部打造的(de)CTO線上講堂自登場(chǎng)以來(lái)獲得(de)大(dà)家好評。本期邀請極驗驗證CTO黃(huáng)勝藍帶來(lái)“如何用(yòng)Python一門語言通(tōng)吃(chī)高(gāo)性能并發、GPU計算(suàn)和(hé)深度學習(xí) ”的(de)主題分(fēn)享。

歡迎加入CTO講堂微信群與業界大(dà)咖零距離溝通(tōng),1月(yuè)7日本期講堂報名方式拖至文末查看。

分(fēn)享嘉賓:極驗驗證CTO 黃(huáng)勝藍

嘉賓簡介:黃(huáng)勝藍 ,現任武漢極意網絡科技有限公司CTO。高(gāo)中時(shí)期NOIP一等獎保送至武漢大(dà)學,大(dà)學期間曾指導團隊獲得(de)世界數學建模大(dà)賽金獎,同時(shí)負責武漢大(dà)學學生校園門戶網站的(de)運維工作。于2013年加入武漢極意網絡科技有限公司,帶領團隊實現“行爲式驗證”安全模型,同時(shí)構建了(le)高(gāo)效、穩定的(de)服務架構承載每天數十億請求。對(duì)于技術發展有深刻見解,善于将适合的(de)新技術融入公司技術架構中。

公司簡介:武漢極意網絡科技有限公司是全球首家“行爲式驗證”安全技術服務提供商,開創了(le)驗證安全從1.0時(shí)代到2.0時(shí)代的(de)變革,并始終緻力于爲各大(dà)網站、應用(yòng)、企業提供“更安全、更便捷、更具智慧的(de)驗證”服務及解決方案。

極意擁有業内領先的(de)自主知識産權與技術研發實力,其首創的(de)“行爲式驗證”安全技術,徹底颠覆了(le)傳統“碼式驗證”安全技術的(de)思想,完成了(le)14年以來(lái)驗證安全領域的(de)第一次飛(fēi)躍——安全性提高(gāo)44.78倍以上,平均用(yòng)戶驗證時(shí)長(cháng)僅不到以前的(de)1/3,提高(gāo)用(yòng)戶交互度達20%以上,全面支持移動終端的(de)觸屏驗證體驗。

極意擁有強大(dà)創新能力的(de)核心團隊,裏面有第四屆中國僑界貢獻獎(創新團隊)核心成員(yuán)負責項目整體運營、有獲得(de)世界計算(suàn)機性能大(dà)賽刷新世界紀錄的(de)雅虎黑(hēi)客負責雲服務器構架、有世界數學建模大(dà)賽冠軍負責“多(duō)重行爲判别算(suàn)法”的(de)研究。公司自成立以來(lái),就受到國内外諸多(duō)投資機構的(de)關注與投資,去年公司接受了(le)來(lái)自IDG的(de)數千萬投資。目前我們的(de)客戶包括新浪博客、鬥魚、戰旗、聚美(měi)優品、網金社等數萬家網站,對(duì)于遊戲領域更是實現了(le)全行業覆蓋。

以下(xià)是12月(yuè)31日CTO講堂現場(chǎng)完整速記:

主持人(rén):今天講堂現在開始,歡迎極驗驗證CTO黃(huáng)勝藍,麻煩給大(dà)家介紹下(xià)自己吧。

黃(huáng)勝藍:大(dà)家好,我叫黃(huáng)勝藍,目前擔任武漢極意網絡科技有限公司CTO,在公司主要負責帶領團隊構建高(gāo)性能的(de)服務架構和(hé)行爲式安全模型。

看了(le)我的(de)照(zhào)片應該會有些人(rén)想知道我的(de)年齡。我确實是比之前的(de)嘉賓都會年輕很多(duō),其實我今年上半年才剛剛踏出武漢大(dà)學的(de)大(dà)門^_^。高(gāo)中時(shí)期我通(tōng)過計算(suàn)機競賽一等獎保送到了(le)武漢大(dà)學,這(zhè)個(gè)經曆對(duì)我而言很重要,有了(le)當時(shí)對(duì)于數據結構和(hé)算(suàn)法較爲深刻的(de)學習(xí)使得(de)現在在接觸實際工程中的(de)一些概念時(shí)可(kě)以非常快(kuài)速地了(le)解其中的(de)原理(lǐ)。大(dà)學大(dà)一大(dà)二在學校的(de)自強網做(zuò)運維工作,這(zhè)段經曆也(yě)讓我受益匪淺,對(duì)于互聯網相關技術也(yě)有了(le)更多(duō)的(de)了(le)解。大(dà)二的(de)暑假機緣巧合加入了(le)極驗驗證團隊。

主持人(rén):請介紹一下(xià)目前極驗驗證的(de)情況以及技術團隊構成。

黃(huáng)勝藍:極驗驗證今年已經三歲了(le),目前我們的(de)用(yòng)戶幾乎遍布了(le)互聯網各個(gè)領域,每天處理(lǐ)的(de)驗證突破一億次,每秒數萬的(de)并發對(duì)我們而言已經是常态。典型的(de)客戶包括新浪博客、鬥魚TV、戰旗TV、熊貓TV、寶寶樹、聚美(měi)優品、東方航空等。去年公司收到了(le)來(lái)自IDG的(de)數千萬A輪投資,目前正在進行B輪,也(yě)是一線的(de)投資機構。

比較有意思的(de)有一次我到西電請了(le)一些學生社團的(de)負責人(rén)吃(chī)飯,十多(duō)個(gè)人(rén)中隻有一個(gè)人(rén)沒見到過我們的(de)産品。

 

 

這(zhè)些是我們典型客戶的(de)一個(gè)集中展示,分(fēn)别是web端和(hé)移動端的(de)。

團隊方面,目前員(yuán)工将近五十人(rén),其中技術團隊三十人(rén)多(duō)有,大(dà)部分(fēn)都來(lái)自于武漢這(zhè)邊的(de)幾所高(gāo)校,是一個(gè)非常非常年輕的(de)團隊。雖然團隊在經驗層面相對(duì)欠缺,不過目前從成果來(lái)看,不論是技術的(de)深度還(hái)是廣度都還(hái)算(suàn)是拿得(de)出手的(de)。

主持人(rén):介紹下(xià)極驗驗證如何兼顧安全性與用(yòng)戶體驗?

黃(huáng)勝藍:極驗驗證與傳統驗證碼對(duì)于驗證技術的(de)理(lǐ)解是有著(zhe)本質上的(de)區(qū)别的(de)。傳統驗證碼本質是人(rén)類可(kě)以理(lǐ)解圖片的(de)内容而計算(suàn)機程序沒有辦法理(lǐ)解,這(zhè)樣的(de)想法放在十年前或者五年前還(hái)算(suàn)是靠譜,但是放在現在這(zhè)樣一個(gè)計算(suàn)機程序都可(kě)以實現無人(rén)駕駛汽車的(de)年代指望通(tōng)過幾張模糊不清的(de)圖就想難倒計算(suàn)機程序實在是太天真了(le),同時(shí)傳統驗證對(duì)于正常用(yòng)戶的(de)上網體驗影(yǐng)響極大(dà)。而極驗驗證的(de)“行爲式驗證“的(de)概念,不再出一個(gè)難題作爲門檻來(lái)限制用(yòng)戶,而是跟用(yòng)戶做(zuò)一個(gè)小小的(de)遊戲,在遊戲中通(tōng)過行爲來(lái)判斷用(yòng)戶是正常用(yòng)戶還(hái)是惡意的(de)程序請求。

我們根據收集到的(de)海量行爲數據構建了(le)人(rén)類行爲的(de)邊界,同時(shí)我們還(hái)動态實時(shí)地監控每個(gè)驗證一段時(shí)間的(de)全部驗證行爲,當這(zhè)些行爲的(de)特征分(fēn)布發生變化(huà)時(shí)我們的(de)驗證也(yě)會将分(fēn)布異常集中的(de)驗證行爲擋住。所以極驗驗證可(kě)以在比對(duì)手更加安全的(de)同時(shí)對(duì)于用(yòng)戶也(yě)更加友好,實現安全與用(yòng)戶體驗的(de)雙重提升。

 

這(zhè)個(gè)圖是某一次有個(gè)網站受到了(le)惡意請求,我們将收集到的(de)數據與正常人(rén)的(de)數據從三個(gè)維度用(yòng)tsne畫(huà)出來(lái)圖,很明(míng)顯可(kě)以看出區(qū)别。正是因爲極驗驗證在産品的(de)用(yòng)戶體驗和(hé)安全性上都完勝了(le)傳統的(de)字符驗證碼,所以在市場(chǎng)上也(yě)出現了(le)這(zhè)樣一個(gè)現象,一個(gè)行業中一旦有一家網站上線了(le)我們的(de)産品,馬上就會有很多(duō)相同行業的(de)網站主導找到我們接入産品,這(zhè)也(yě)反映了(le)我們的(de)産品确實解決了(le)驗證碼長(cháng)期的(de)痛點。

我們在後期也(yě)會繼續提升技術實力,優化(huà)體驗,爲業界奉獻更安全、更便捷、更智慧的(de)驗證。

主持人(rén):技術架構是怎樣的(de)?用(yòng)到了(le)哪些技術呢(ne)?

黃(huáng)勝藍:簡單明(míng)了(le)的(de)一張圖,左半邊是提供驗證服務的(de)集群,右半邊是存儲和(hé)分(fēn)析日志的(de)集群。用(yòng)到的(de)技術都是業界主流的(de)方案,但是爲了(le)更加穩定高(gāo)效承載數萬的(de)驗證請求并發,我們在一些地方做(zuò)了(le)修改。

 

主持人(rén):極驗驗證采用(yòng)基于協程的(de)并發方案以及獨特的(de)緩存方案,可(kě)高(gāo)效穩定承載每天數十億次請求,能詳細介紹一下(xià)該方案麽?

黃(huáng)勝藍:我們在不斷優化(huà)優化(huà)服務性能的(de)過程中有三個(gè)最大(dà)的(de)敵人(rén):

 

  • 第一個(gè)就是并發本身所帶來(lái)的(de)開銷即新開處理(lǐ)線程、關閉處理(lǐ)線程、多(duō)個(gè)處理(lǐ)線程時(shí)間片輪轉所帶來(lái)的(de)開銷。

 

實際上對(duì)于一些邏輯不那麽複雜(zá)的(de)場(chǎng)景來(lái)說這(zhè)些開銷甚至比真正的(de)處理(lǐ)邏輯部分(fēn)代碼的(de)開銷更大(dà)。所以我們決定采用(yòng)基于協程的(de)并發方式,即服務進程隻有一個(gè)(單cpu)所有的(de)請求數據都由這(zhè)個(gè)服務進程内部來(lái)維護,同時(shí)服務進程自行調度不同請求的(de)處理(lǐ)順序,這(zhè)樣避免了(le)傳統多(duō)線程并發方式新建、銷毀以及系統調度處理(lǐ)線程的(de)開銷。基于這(zhè)樣的(de)考慮我們選擇了(le)基于Tornado框架實現api服務的(de)開發。Tornado的(de)實現非常簡潔明(míng)了(le),使用(yòng)python的(de)生成器作爲協程,利用(yòng)IOLoop實現了(le)調度隊列。

 

  • 第二個(gè)問題是數據庫的(de)性能,這(zhè)裏說的(de)數據庫包括MongoDB和(hé)Redis,我這(zhè)裏分(fēn)開講。

 

先講MongoDB的(de)問題,MongoDB主要存儲不同的(de)用(yòng)戶對(duì)于驗證的(de)不同設置,比如該顯示什(shén)麽樣的(de)圖片。

一開始每次驗證請求都會查詢MongoDB,當時(shí)我們的(de)MongoDB是純内存的(de),同時(shí)三台機器組成一個(gè)複制集,這(zhè)樣的(de)組合大(dà)概能穩定承載八九千的(de)qps,後來(lái)随著(zhe)我們驗證量越來(lái)越大(dà),這(zhè)個(gè)承載能力逐漸就成爲了(le)我們的(de)瓶頸。

爲了(le)徹底搞定這(zhè)個(gè)問題,我們提出了(le)最極端的(de)解決方案,幹脆直接把數據庫中的(de)數據完全緩存到服務進程裏定期批量更新,這(zhè)樣查詢的(de)開銷将大(dà)大(dà)降低。但是因爲我們用(yòng)的(de)是Python,由于GIL的(de)存在,在8核服務器上會fork出來(lái)8個(gè)服務進程,進程之間不像線程那麽方便,所以我們基于mmap自己寫了(le)一套夥伴算(suàn)法構建了(le)一個(gè)跨進程共享緩存。自從這(zhè)套緩存上線之後,Mongodb的(de)負載幾乎變成了(le)零。

說完了(le)MongoDB再說Redis的(de)問題,Redis代碼簡潔、數據結構豐富、性能強大(dà),唯一的(de)問題是作爲一個(gè)單進程程序,終究性能是有上限的(de)。

雖然今年Redis發布了(le)官方的(de)集群版本,但是經過我們的(de)測試,認爲這(zhè)套分(fēn)布式方案的(de)故障恢複時(shí)間不夠優秀并且運維成本較高(gāo)。在Redis官方集群方案面世之前,開源世界有不少proxy方案,比如Twtter的(de)TwemProxy和(hé)豌豆莢的(de)Codis。這(zhè)兩種方案測試完之後給我們的(de)感覺TwemProxy運維還(hái)是比較麻煩,Codis使用(yòng)起來(lái)讓人(rén)非常心曠神怡,無論是修改配置還(hái)是擴容都可(kě)以在配置頁面上完成,并且性能也(yě)還(hái)算(suàn)不錯,但無奈當時(shí)Codis還(hái)有比較嚴重的(de)BUG隻能放棄之。

幾乎嘗試過各種方案之後,我們還(hái)是下(xià)決心自己實現一套分(fēn)布式方案,目的(de)是高(gāo)度貼合我們的(de)需求并且運維成本要低、擴容要方便、故障切換要快(kuài)最重要的(de)是數據冗餘一定要做(zuò)好。

基于上面的(de)考慮,我們确定基于客戶端的(de)分(fēn)布式方案,通(tōng)過zookeeper來(lái)同步狀态保證高(gāo)可(kě)用(yòng)。具體來(lái)說,我們修改Redis源碼,使其向zookeeper注冊,客戶端由zookeeper上獲取Redis服務器集群信息并根據統一的(de)一緻性哈希算(suàn)法來(lái)計算(suàn)數據應該存儲在哪台Redis上,并在哈希環的(de)下(xià)一台Redis上寫入一份冗餘數據,當讀取原始數據失敗時(shí)可(kě)以立即嘗試讀取冗餘數據而不會造成服務中斷。

 

  • 第三個(gè)問題是Python語言的(de)性能問題,這(zhè)個(gè)後面說。

 

主持人(rén):您帶領團隊構建了(le)“行爲式驗證”安全模型,能談一下(xià)在這(zhè)個(gè)過程中遇到了(le)哪些困難以及大(dà)緻的(de)經曆嗎?(包括團隊管理(lǐ)、技術攻堅等方面)

黃(huáng)勝藍:從産品第一版DEMO開發出來(lái)到現在我們遇到了(le)數不清的(de)問題,現在回頭看可(kě)以大(dà)緻分(fēn)爲三個(gè)階段。

 

  • 第一個(gè)階段是在主要解決性能問題,最早DEMO是用(yòng)PHP和(hé)MYSQL寫出來(lái)的(de),每次驗證的(de)臨時(shí)數據也(yě)會寫入MySQL,可(kě)以說整套服務也(yě)就隻能小範圍玩一玩了(le)。随後的(de)幾個(gè)月(yuè)時(shí)間,我們圍繞著(zhe)提升性能對(duì)整套服務不斷進行優化(huà),最後形成了(le)用(yòng)Python語言,Tornado作爲框架,Redis存儲驗證臨時(shí)數據,MongoDB作爲數據庫的(de)架構。
  • 第二個(gè)階段是解決數據統計與分(fēn)析的(de)問題,搞定了(le)服務的(de)性能問題之後,用(yòng)戶慢(màn)慢(màn)多(duō)了(le)起來(lái),相應産生的(de)日志也(yě)就越來(lái)越多(duō)。根據日志準确快(kuài)速統計相關數據、實時(shí)監控行爲分(fēn)布以及試驗安全模型所需要大(dà)量計算(suàn)能力的(de)問題又出現在我們面前。爲了(le)解決這(zhè)樣的(de)問題,我們用(yòng)建立起自己的(de)運算(suàn)集群,由Flume收集日志,Spark與Storm分(fēn)别進行批處理(lǐ)與流處理(lǐ),HDFS永久存儲,Ceph臨時(shí)存儲,Mesos進行調度。
  • 第三個(gè)階段是我們對(duì)于數據與模型的(de)理(lǐ)解,在提供驗證服務的(de)同時(shí)我們也(yě)在不斷根據收集到的(de)數據來(lái)更新我們的(de)模型使得(de)驗證更加安全,破解更加困難。

 

而在這(zhè)個(gè)過程中最大(dà)的(de)困難在于我們對(duì)于我們對(duì)于模型與特征的(de)理(lǐ)解。機器學習(xí)的(de)算(suàn)法做(zuò)的(de)都是一件事情即根據訓練樣本在特征空間中尋找一個(gè)分(fēn)類面來(lái)分(fēn)割空間,然後利用(yòng)這(zhè)個(gè)分(fēn)類面預測新樣本。不同的(de)方法采用(yòng)不同的(de)數學模型來(lái)構建這(zhè)個(gè)分(fēn)類面,不同數學模型有著(zhe)不同的(de)表達能力,繪制出來(lái)的(de)分(fēn)類面形狀和(hé)特性就會不同,而如何在選擇合适的(de)模型或者合适的(de)模型組合訓練準确、有泛化(huà)性分(fēn)類器就需要對(duì)數據有著(zhe)深入的(de)理(lǐ)解。

團隊的(de)管理(lǐ)方面我們也(yě)在不斷探索如何構建一套科學合理(lǐ)的(de)考核評價體系,從而使得(de)項目按時(shí)完成的(de)同時(shí)保持團隊的(de)激情與探索欲望。這(zhè)方面等會大(dà)家可(kě)以多(duō)多(duō)交流。

主持人(rén):請結合實際情況,談談Python的(de)多(duō)種形式優化(huà)。

黃(huáng)勝藍:Python這(zhè)個(gè)語言确實有點讓人(rén)又愛(ài)又恨,Python的(de)語法、Python無比成熟的(de)生态環境都是Python的(de)優點。可(kě)以說對(duì)于一個(gè)互聯網公司Python幾乎可(kě)以滿足所有的(de)業務需求,從web到自動化(huà)運維工具再到數據分(fēn)析和(hé)機器學習(xí),Python都可(kě)以搞定。但是Python的(de)問題也(yě)很明(míng)顯,也(yě)就是它的(de)性能問題。

好在現在Python世界也(yě)湧現出來(lái)了(le)适用(yòng)各種各樣情況下(xià)的(de)性能優化(huà)手段,我在這(zhè)裏結合我們遇到的(de)實際情況簡單介紹幾個(gè)我們用(yòng)到的(de)。

 

  • 1)使用(yòng)C編寫Python擴展或者使用(yòng)Cython。這(zhè)兩種方式我們都有采用(yòng),也(yě)是業界比較常用(yòng)的(de)優化(huà)Python性能的(de)方式。這(zhè)裏面主要說一下(xià)Cython,優化(huà)程序性能的(de)本質實際上是在平衡程序員(yuán)時(shí)間和(hé)機器運算(suàn)時(shí)間的(de)成本,而利用(yòng)Cython則可(kě)以非常靈活地尋找這(zhè)中間的(de)平衡。Cython可(kě)以使用(yòng)介于Python和(hé)C之間的(de)語法,當語法更接近Python時(shí)獲得(de)的(de)性能提升也(yě)就越少,而語法越接近于C時(shí),性能也(yě)更加接近C。
  • 2)使用(yòng)pypy。這(zhè)是一個(gè)支持jit的(de)Python解釋器,其官方測試結果比較好看,就我們實際測試結果來(lái)看它的(de)性能優勢不是很穩定,大(dà)部分(fēn)項目是領先的(de)但是有的(de)項目又會莫名其妙的(de)很慢(màn)。并且它對(duì)于C的(de)擴展支持不佳。
  • 3)使用(yòng)Numba。對(duì)于數據分(fēn)析、機器學習(xí)有過了(le)解的(de)人(rén)一定會聽(tīng)說過Numpy,Numba就是專門用(yòng)來(lái)優化(huà)基于Numpy程序的(de)工具。利用(yòng)它可(kě)以隻加入一行代碼就将性能提升數倍,而缺點就是這(zhè)種方式不能作爲通(tōng)用(yòng)的(de)優化(huà)手段,并且Numba雖然使用(yòng)起來(lái)比較簡單,但其依賴相對(duì)複雜(zá),部署起來(lái)會有點麻煩。

 

主持人(rén):數據分(fēn)析方面,請您談一談如何利用(yòng)gpu加速數據分(fēn)析。

黃(huáng)勝藍:很多(duō)人(rén)可(kě)能會覺得(de)gpu編程是一件很困難的(de)事情,其實當真正接觸了(le)之後就會了(le)解到讓你的(de)程序在gpu上運行其實并不難,真正的(de)難點在于理(lǐ)解gpu的(de)特性從而将最合适的(de)任務交給gpu來(lái)做(zuò),同時(shí)采用(yòng)合适的(de)優化(huà)手段。

以我們爲例,我們利用(yòng)PyOpenCl将日志中用(yòng)戶的(de)驗證行爲進行特征計算(suàn)。計算(suàn)流程中上下(xià)文的(de)創建、任務隊列的(de)創建以及緩沖區(qū)的(de)控制都通(tōng)過Python來(lái)控制,kernel部分(fēn)由C寫。

這(zhè)裏面相對(duì)麻煩一點的(de)是緩沖區(qū)的(de)問題,因爲cpu和(hé)gpu是兩套獨立的(de)内存,數據要拷貝才能進行計算(suàn),這(zhè)部分(fēn)代碼PyOpenCl封裝的(de)比較好,借用(yòng)了(le)NumPy的(de)數據類型,操作起來(lái)會比用(yòng)C寫方便很多(duō)。

其中最核心部分(fēn)是kernel,也(yě)就是将會運行在GPU上的(de)代碼,其實這(zhè)部分(fēn)代碼的(de)編寫也(yě)不需要掌握什(shén)麽特殊技能,我們的(de)做(zuò)法就是幾乎移植了(le)在CPU上的(de)版本,隻是在GPU上多(duō)條數據同時(shí)一起計算(suàn)而已。

所以就像前面說的(de),找到合适的(de)任務用(yòng)gpu進行計算(suàn)其實并不是一件很困難的(de)事情。那麽什(shén)麽樣的(de)任務比較适合gpu上進行計算(suàn)呢(ne)?我簡單歸納一下(xià)就是任務邏輯相對(duì)簡單(因爲第一kernel要用(yòng)C寫,太複雜(zá)的(de)邏輯寫起來(lái)還(hái)是有點麻煩。第二優化(huà)和(hé)調試起來(lái)相對(duì)麻煩),重複性高(gāo)的(de)任務。比如排序、統計、查找、過濾、簡單的(de)預處理(lǐ)等等。

主持人(rén):深度學習(xí)技術方案的(de)選擇方面,有哪些思考?

黃(huáng)勝藍:深度學習(xí)是目前機器學習(xí)領域最大(dà)的(de)熱(rè)門,也(yě)是互聯網巨頭們争相角逐的(de)戰場(chǎng)。對(duì)于中小企業而言,雖然可(kě)能沒有實力聘請頂尖的(de)研發人(rén)員(yuán)、沒有能力獲取頂尖的(de)運算(suàn)能力但是這(zhè)并不意味著(zhe)一定會無緣深度學習(xí)所帶來(lái)的(de)變革。

目前開源的(de)深度學習(xí)框架非常多(duō),利用(yòng)這(zhè)些開源的(de)深度學習(xí)庫可(kě)以非常方便的(de)構建一個(gè)神經網絡并進行實驗。

Python也(yě)爲我們提供了(le)探索深度學習(xí)世界非常有用(yòng)的(de)工具,我們使用(yòng)了(le)兩個(gè)東西,一個(gè)是Theano,另一個(gè)叫做(zuò)Kares。

Theano是一個(gè)數學表達式編譯器,對(duì)于普通(tōng)程序員(yuán)來(lái)說可(kě)能會對(duì)這(zhè)個(gè)概念很奇怪,實際上很簡單,它可(kě)以把一系列數學表達式以及相應的(de)符号鏈接編譯成可(kě)執行代碼,而這(zhè)個(gè)可(kě)執行代碼還(hái)不僅僅是cpu,它同樣可(kě)以編譯出gpu可(kě)執行代碼。所以基于這(zhè)樣的(de)工具,我們就可(kě)以實現從數學表達式自動編譯成gpu上的(de)可(kě)執行代碼,是不是很爽!

再來(lái)看Kares,它是一個(gè)深度學習(xí)庫,它将大(dà)牛們提出的(de)各種網絡結構、激活函數、Cost Function、以及各種Trick做(zuò)了(le)統一的(de)整理(lǐ)和(hé)封裝,可(kě)以用(yòng)及其簡單的(de)方式将各種方法組合成爲一個(gè)神經網絡進行實驗,這(zhè)個(gè)庫的(de)底層是基于Theano的(de),也(yě)就是利用(yòng)Theano将表達式編譯成了(le)gpu代碼,所以當你真正想去做(zuò)深度學習(xí)的(de)實驗時(shí)你就會發現用(yòng)這(zhè)些工具其實可(kě)以非常非常快(kuài)就構建一個(gè)實驗項目。

當然,不是有了(le)這(zhè)些工具就意味著(zhe)探索深度學習(xí)的(de)道路會一帆風順。理(lǐ)論方面,不僅要透徹了(le)解神經網絡背後的(de)數學模型,更要緊跟業界動态,不斷學習(xí)最新的(de)理(lǐ)論與技巧;實踐方面,訓練出一個(gè)優秀的(de)網絡往往需要大(dà)量的(de)試驗,嘗試不同的(de)網絡結構、trick與超參數,複雜(zá)的(de)網絡往往需要更大(dà)量的(de)數據來(lái)反向傳播更新權值,這(zhè)些意味著(zhe)對(duì)于運算(suàn)能力、數據存儲能力都是極大(dà)的(de)考驗。

探索深度學習(xí)的(de)前提是一定要有一支高(gāo)水(shuǐ)平、全方面的(de)團隊!

主持人(rén):如今互聯網時(shí)代給各行各業帶來(lái)了(le)巨大(dà)的(de)變革,同時(shí)也(yě)加劇了(le)行業從業者浮躁的(de)心态,該如何沉下(xià)心來(lái)做(zuò)事,并不斷提升技術能力?

黃(huáng)勝藍:的(de)确,這(zhè)兩年行情比較火爆,行業對(duì)于技術人(rén)員(yuán)的(de)需求持續高(gāo)漲,待遇也(yě)是水(shuǐ)漲船高(gāo)。帶來(lái)的(de)結果就是很多(duō)技術人(rén)員(yuán)在這(zhè)樣環境下(xià)變得(de)浮躁起來(lái),不再深究代碼的(de)優化(huà)、常常把新技術挂在嘴邊卻不甚了(le)解、哪些技術待遇高(gāo)就學什(shén)麽技術等等。

我認爲作爲技術人(rén)員(yuán)一定要在互聯網浪潮中保持危機感和(hé)廣闊的(de)技術視野。危機感可(kě)以督促自己不迷失在眼前取得(de)的(de)成績而是繼續努力力争上遊。廣闊的(de)技術視野可(kě)以讓你更加清楚認識到業界遇到了(le)哪些問題,又是開發了(le)哪些項目提出了(le)哪些方法來(lái)解決這(zhè)些問題的(de)。看清楚了(le)業界發展的(de)方向就可(kě)以避免在提升技術能力的(de)道路上走彎路。

主持人(rén):請結合你的(de)切身體會談談創業路上您都有哪些收獲和(hé)思考,對(duì)于如今越來(lái)越多(duō)想要投身創業大(dà)海的(de)年輕人(rén),有什(shén)麽建議(yì)?

黃(huáng)勝藍:創業是九死一生的(de)事情,首先也(yě)确定是否有能力承受可(kě)能的(de)失敗,這(zhè)個(gè)是最大(dà)的(de)前提。第二就是選好方向,創業做(zuò)一件事情的(de)時(shí)候一定要保證你是這(zhè)行裏面對(duì)這(zhè)個(gè)行業了(le)解最深的(de),否則做(zuò)出來(lái)的(de)東西一定沒什(shén)麽意義。

主持人(rén):推薦一些覺得(de)非常不錯的(de)資料或者書(shū)籍吧。

黃(huáng)勝藍:推薦一些比較基礎的(de)吧學習(xí)Python建議(yì)可(kě)以看看《Python核心編程》這(zhè)本書(shū),講的(de)比較細緻。有興趣了(le)解深度學習(xí)的(de)話(huà)可(kě)以看看UFLDL,很經典的(de)一個(gè)教程 http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

互動環節:“跟用(yòng)戶做(zuò)一個(gè)小小的(de)遊戲,在遊戲中通(tōng)過行爲來(lái)判斷用(yòng)戶是正常用(yòng)戶還(hái)是惡意的(de)程序請求”這(zhè)裏提的(de)惡意程序的(de)行爲,能說一下(xià)嗎?
黃(huáng)勝藍:我們的(de)驗證是利用(yòng)一個(gè)拼圖遊戲來(lái)收集用(yòng)戶的(de)行爲,正常人(rén)類的(de)行爲由于受到肌肉結構、鼠标等等限制會符合一些特征,而攻擊者在模拟行爲時(shí)則很難完全模拟。我們通(tōng)過這(zhè)樣的(de)原理(lǐ)來(lái)區(qū)分(fēn)正常用(yòng)戶還(hái)是程序。
互動環節:您好,謝謝分(fēn)享。 我想請教一下(xià),Python與PHP這(zhè)兩種語言相比,Python的(de)主要優勢是什(shén)麽?對(duì)電商行業應用(yòng)而言,您對(duì)技術選型的(de)建議(yì)是什(shén)麽?謝謝。
黃(huáng)勝藍:php是世界上最好的(de)語言。 比較這(zhè)兩門語言,我們不談論語言本身的(de)優劣,因爲這(zhè)些仁者見仁智者見智。 
我從另一個(gè)方面講一下(xià)我的(de)理(lǐ)解,Python的(de)社區(qū)整體用(yòng)戶層次相對(duì)較高(gāo),涉及的(de)領域非常全面。而PHP的(de)社區(qū)基本還(hái)局限在web開發方向。對(duì)于電商行業而言,最開始可(kě)能實現web邏輯也(yě)就夠了(le),但是規模起來(lái)之後要做(zuò)推薦系統、反欺詐系統的(de)時(shí)候PHP就完全不能滿足要求了(le)。用(yòng)Python的(de)話(huà)則永遠(yuǎn)跟得(de)上需求,各種問題都能搞定。
互動環節:您好,能說說做(zuò)爲一個(gè)cto,第一公司工作職責,第二如何能像bat這(zhè)樣的(de)大(dà)公司技術看齊,謝謝。
黃(huáng)勝藍:cto這(zhè)個(gè)職位可(kě)能在不同的(de)公司職責都不太一樣,甚至在一家創業公司不同時(shí)期都會發生很大(dà)的(de)變化(huà)。團隊小時(shí)候可(kě)能需要引領技術方向,大(dà)一點之後就要做(zuò)好技術管理(lǐ)。 
第二個(gè)問題,像bat看齊我覺得(de)毫無必要,業務不同規模不同。
互動環節:首先感謝黃(huáng)總的(de)分(fēn)享  看到黃(huáng)總用(yòng)了(le)很多(duō)開源技術 大(dà)家知道現在谷歌(gē)的(de)技術還(hái)有推特的(de)技術可(kě)能要翻牆 黃(huáng)總有沒有好的(de)翻牆工具 可(kě)以推薦。
黃(huáng)勝藍:翻牆工具我們一般用(yòng)shadowsocks。
互動環節:我想請教一下(xià),您用(yòng)python做(zuò)過什(shén)麽有趣的(de)項目來(lái)提高(gāo)對(duì)高(gāo)并發或是python的(de)熟練度?我現在可(kě)以使用(yòng)python實現一些簡單的(de)腳本,不知道現在我應該哪些方面來(lái)提高(gāo)自己對(duì)python的(de)認識和(hé)熟練?
黃(huáng)勝藍:我用(yòng)python做(zuò)的(de)最有趣的(de)項目就是寫了(le)極驗驗證的(de)後台代碼。對(duì)python的(de)理(lǐ)解和(hé)認識其實多(duō)看看書(shū)就行了(le),更重要的(de)是了(le)解python的(de)重量級項目。如果做(zuò)數據挖掘就一定要熟悉numpy、scipy這(zhè)樣的(de)項目。
互動環節:貴公司的(de)産品我好像也(yě)用(yòng)過 尤其是拖拽式模式感覺挺好!想提問下(xià) 驗證一旦出問題玩不了(le)  對(duì)客戶網站的(de)整個(gè)業務流程影(yǐng)響很大(dà)  會終止在那兒(ér) 請問是如何保證高(gāo)可(kě)用(yòng)的(de)?  比如有沒有多(duō)區(qū)域部署。
黃(huáng)勝藍:高(gāo)可(kě)用(yòng)方面我們的(de)有多(duō)區(qū)部署。同時(shí)我們也(yě)考慮到驗證所處的(de)關鍵地位,在我們的(de)sdk中也(yě)包含了(le)服務異常處理(lǐ)流程,會切換成一個(gè)本地版驗證,保證正常用(yòng)戶不受影(yǐng)響。
互動環節:你們的(de)驗證碼能更好的(de)識别機器和(hé)人(rén)嗎?可(kě)以簡單說說你們判斷機器和(hé)人(rén)的(de)機制嗎?
黃(huáng)勝藍:我們的(de)驗證是利用(yòng)一個(gè)拼圖遊戲來(lái)收集用(yòng)戶的(de)行爲,正常人(rén)類的(de)行爲由于受到肌肉結構、鼠标等等限制會符合一些特征,而攻擊者在模拟行爲時(shí)則很難完全模拟。我們通(tōng)過這(zhè)樣的(de)原理(lǐ)來(lái)區(qū)分(fēn)正常用(yòng)戶還(hái)是程序。
互動環節:tornado我們也(yě)有在用(yòng),作爲遊戲的(de)login服務器時(shí),有個(gè)問題,協程這(zhè)種協作式工作流程會使得(de)一次用(yòng)戶請求在yield之後,被其它協程占用(yòng)cpu,最後導緻該請求處理(lǐ)時(shí)間變長(cháng)。這(zhè)種場(chǎng)景你們有處理(lǐ)嗎?
黃(huáng)勝藍:以前遇到過這(zhè)樣的(de)問題。這(zhè)樣的(de)問題一般是代碼邏輯中存在阻塞時(shí)間較長(cháng)的(de)部分(fēn),如果是io或者網絡導緻的(de)阻塞可(kě)以通(tōng)過換成異步驅動搞定。如果是某些代碼長(cháng)期占用(yòng)cpu計算(suàn),可(kě)以考慮把這(zhè)部分(fēn)代碼通(tōng)過celery或者其他(tā)任務隊列扔給其他(tā)機器去處理(lǐ)。 
還(hái)有一種情況是,即使用(yòng)了(le)異步驅動,後端數據庫處理(lǐ)不過來(lái)這(zhè)麽多(duō)請求導緻挂起的(de)協程越來(lái)越多(duō),最後大(dà)量出現超時(shí)或者錯誤。
 

Copyright © 2015-2018 恩施市執行力網絡科技有限公司 版權所有
統計代碼:
技術支持:飛(fēi)星科技
溫馨提示: 有人(rén)冒充飛(fēi)星科技員(yuán)工在市場(chǎng)上接單,請一定要聯系官方人(rén)員(yuán)來(lái)溝通(tōng)需求!

客服電話(huà):17125966669 4000217888
客服 QQ:814517631
投訴電話(huà):
電子郵件:814517631@qq.com
聯系地址:湖北(běi)省武漢市光(guāng)谷軟件園