為了幫助IT從業者職業之路擁有更多收穫,在諸多C粉的殷切期待下,由 CTO俱樂部打造的CTO線上講堂自登場以來獲得大家好評。本期邀請極驗驗證CTO黃勝藍帶來「如何用Python一門語言通吃高性能並發、GPU計算和深度學習 」的主題分享。
歡迎加入CTO講堂微信群與業界大咖零距離溝通,1月7日本期講堂報名方式拖至文末查看。
分享嘉賓:極驗驗證CTO 黃勝藍
嘉賓簡介:黃勝藍 ,現任武漢極意網絡科技有限公司CTO。高中時期NOIP一等獎保送至武漢大學,大學期間曾指導團隊獲得世界數學建模大賽金獎,同時負責武漢大學學生校園門戶網站的運維工作。於2013年加入武漢極意網絡科技有限公司,帶領團隊實現「行為式驗證」安全模型,同時構建了高效、穩定的服務架構承載每天數十億請求。對於技術發展有深刻見解,善於將適合的新技術融入公司技術架構中。
公司簡介:武漢極意網絡科技有限公司是全球首家「行為式驗證」安全技術服務提供商,開創了驗證安全從1.0時代到2.0時代的變革,並始終致力於為各大網站、應用、企業提供「更安全、更便捷、更具智慧的驗證」服務及解決方案。
極意擁有業內領先的自主智慧財產權與技術研發實力,其首創的「行為式驗證」安全技術,徹底顛覆了傳統「碼式驗證」安全技術的思想,完成了14年以來驗證安全領域的第一次飛躍——安全性提高44.78倍以上,平均用戶驗證時長僅不到以前的1/3,提高用戶交互度達20%以上,全面支持移動終端的觸屏驗證體驗。
極意擁有強大創新能力的核心團隊,裡面有第四屆中國僑界貢獻獎(創新團隊)核心成員負責項目整體運營、有獲得世界計算機性能大賽刷新世界紀錄的雅虎黑客負責雲伺服器構架、有世界數學建模大賽冠軍負責「多重行為判別算法」的研究。公司自成立以來,就受到國內外諸多投資機構的關注與投資,去年公司接受了來自IDG的數千萬投資。目前我們的客戶包括新浪博客、鬥魚、戰旗、聚美優品、網金社等數萬家網站,對於遊戲領域更是實現了全行業覆蓋。
以下是12月31日CTO講堂現場完整速記:
主持人:今天講堂現在開始,歡迎極驗驗證CTO黃勝藍,麻煩給大家介紹下自己吧。
黃勝藍:大家好,我叫黃勝藍,目前擔任武漢極意網絡科技有限公司CTO,在公司主要負責帶領團隊構建高性能的服務架構和行為式安全模型。
看了我的照片應該會有些人想知道我的年齡。我確實是比之前的嘉賓都會年輕很多,其實我今年上半年才剛剛踏出武漢大學的大門^_^。高中時期我通過計算機競賽一等獎保送到了武漢大學,這個經歷對我而言很重要,有了當時對於數據結構和算法較為深刻的學習使得現在在接觸實際工程中的一些概念時可以非常快速地了解其中的原理。大學大一大二在學校的自強網做運維工作,這段經歷也讓我受益匪淺,對於網際網路相關技術也有了更多的了解。大二的暑假機緣巧合加入了極驗驗證團隊。
主持人:請介紹一下目前極驗驗證的情況以及技術團隊構成。
黃勝藍:極驗驗證今年已經三歲了,目前我們的用戶幾乎遍布了網際網路各個領域,每天處理的驗證突破一億次,每秒數萬的並發對我們而言已經是常態。典型的客戶包括新浪博客、鬥魚TV、戰旗TV、熊貓TV、寶寶樹、聚美優品、東方航空等。去年公司收到了來自IDG的數千萬A輪投資,目前正在進行B輪,也是一線的投資機構。
比較有意思的有一次我到西電請了一些學生社團的負責人吃飯,十多個人中只有一個人沒見到過我們的產品。
這些是我們典型客戶的一個集中展示,分別是web端和移動端的。
團隊方面,目前員工將近五十人,其中技術團隊三十人多有,大部分都來自於武漢這邊的幾所高校,是一個非常非常年輕的團隊。雖然團隊在經驗層面相對欠缺,不過目前從成果來看,不論是技術的深度還是廣度都還算是拿得出手的。
主持人:介紹下極驗驗證如何兼顧安全性與用戶體驗?
黃勝藍:極驗驗證與傳統驗證碼對於驗證技術的理解是有著本質上的區別的。傳統驗證碼本質是人類可以理解圖片的內容而電腦程式沒有辦法理解,這樣的想法放在十年前或者五年前還算是靠譜,但是放在現在這樣一個電腦程式都可以實現無人駕駛汽車的年代指望通過幾張模糊不清的圖就想難倒電腦程式實在是太天真了,同時傳統驗證對於正常用戶的上網體驗影響極大。而極驗驗證的「行為式驗證「的概念,不再出一個難題作為門檻來限制用戶,而是跟用戶做一個小小的遊戲,在遊戲中通過行為來判斷用戶是正常用戶還是惡意的程序請求。
我們根據收集到的海量行為數據構建了人類行為的邊界,同時我們還動態實時地監控每個驗證一段時間的全部驗證行為,當這些行為的特徵分布發生變化時我們的驗證也會將分布異常集中的驗證行為擋住。所以極驗驗證可以在比對手更加安全的同時對於用戶也更加友好,實現安全與用戶體驗的雙重提升。
這個圖是某一次有個網站受到了惡意請求,我們將收集到的數據與正常人的數據從三個維度用tsne畫出來圖,很明顯可以看出區別。正是因為極驗驗證在產品的用戶體驗和安全性上都完勝了傳統的字符驗證碼,所以在市場上也出現了這樣一個現象,一個行業中一旦有一家網站上線了我們的產品,馬上就會有很多相同行業的網站主導找到我們接入產品,這也反映了我們的產品確實解決了驗證碼長期的痛點。
我們在後期也會繼續提升技術實力,優化體驗,為業界奉獻更安全、更便捷、更智慧的驗證。
主持人:技術架構是怎樣的?用到了哪些技術呢?
黃勝藍:簡單明了的一張圖,左半邊是提供驗證服務的集群,右半邊是存儲和分析日誌的集群。用到的技術都是業界主流的方案,但是為了更加穩定高效承載數萬的驗證請求並發,我們在一些地方做了修改。
主持人:極驗驗證採用基於協程的並發方案以及獨特的緩存方案,可高效穩定承載每天數十億次請求,能詳細介紹一下該方案麼?
黃勝藍:我們在不斷優化優化服務性能的過程中有三個最大的敵人:
第一個就是並發本身所帶來的開銷即新開處理線程、關閉處理線程、多個處理線程時間片輪轉所帶來的開銷。實際上對於一些邏輯不那麼複雜的場景來說這些開銷甚至比真正的處理邏輯部分代碼的開銷更大。所以我們決定採用基於協程的並發方式,即服務進程只有一個(單cpu)所有的請求數據都由這個服務進程內部來維護,同時服務進程自行調度不同請求的處理順序,這樣避免了傳統多線程並發方式新建、銷毀以及系統調度處理線程的開銷。基於這樣的考慮我們選擇了基於Tornado框架實現api服務的開發。Tornado的實現非常簡潔明了,使用python的生成器作為協程,利用IOLoop實現了調度隊列。
第二個問題是資料庫的性能,這裡說的資料庫包括MongoDB和Redis,我這裡分開講。先講MongoDB的問題,MongoDB主要存儲不同的用戶對於驗證的不同設置,比如該顯示什麼樣的圖片。
一開始每次驗證請求都會查詢MongoDB,當時我們的MongoDB是純內存的,同時三臺機器組成一個複製集,這樣的組合大概能穩定承載八九千的qps,後來隨著我們驗證量越來越大,這個承載能力逐漸就成為了我們的瓶頸。
為了徹底搞定這個問題,我們提出了最極端的解決方案,乾脆直接把資料庫中的數據完全緩存到服務進程裡定期批量更新,這樣查詢的開銷將大大降低。但是因為我們用的是Python,由於GIL的存在,在8核伺服器上會fork出來8個服務進程,進程之間不像線程那麼方便,所以我們基於mmap自己寫了一套夥伴算法構建了一個跨進程共享緩存。自從這套緩存上線之後,Mongodb的負載幾乎變成了零。
說完了MongoDB再說Redis的問題,Redis代碼簡潔、數據結構豐富、性能強大,唯一的問題是作為一個單進程程序,終究性能是有上限的。
雖然今年Redis發布了官方的集群版本,但是經過我們的測試,認為這套分布式方案的故障恢復時間不夠優秀並且運維成本較高。在Redis官方集群方案面世之前,開源世界有不少proxy方案,比如Twtter的TwemProxy和豌豆莢的Codis。這兩種方案測試完之後給我們的感覺TwemProxy運維還是比較麻煩,Codis使用起來讓人非常心曠神怡,無論是修改配置還是擴容都可以在配置頁面上完成,並且性能也還算不錯,但無奈當時Codis還有比較嚴重的BUG只能放棄之。
幾乎嘗試過各種方案之後,我們還是下決心自己實現一套分布式方案,目的是高度貼合我們的需求並且運維成本要低、擴容要方便、故障切換要快最重要的是數據冗餘一定要做好。
基於上面的考慮,我們確定基於客戶端的分布式方案,通過zookeeper來同步狀態保證高可用。具體來說,我們修改Redis源碼,使其向zookeeper註冊,客戶端由zookeeper上獲取Redis伺服器集群信息並根據統一的一致性哈希算法來計算數據應該存儲在哪臺Redis上,並在哈希環的下一臺Redis上寫入一份冗餘數據,當讀取原始數據失敗時可以立即嘗試讀取冗餘數據而不會造成服務中斷。
第三個問題是Python語言的性能問題,這個後面說。主持人:您帶領團隊構建了「行為式驗證」安全模型,能談一下在這個過程中遇到了哪些困難以及大致的經歷嗎?(包括團隊管理、技術攻堅等方面)
黃勝藍:從產品第一版DEMO開發出來到現在我們遇到了數不清的問題,現在回頭看可以大致分為三個階段。
第一個階段是在主要解決性能問題,最早DEMO是用PHP和MYSQL寫出來的,每次驗證的臨時數據也會寫入MySQL,可以說整套服務也就只能小範圍玩一玩了。隨後的幾個月時間,我們圍繞著提升性能對整套服務不斷進行優化,最後形成了用Python語言,Tornado作為框架,Redis存儲驗證臨時數據,MongoDB作為資料庫的架構。 第二個階段是解決數據統計與分析的問題,搞定了服務的性能問題之後,用戶慢慢多了起來,相應產生的日誌也就越來越多。根據日誌準確快速統計相關數據、實時監控行為分布以及試驗安全模型所需要大量計算能力的問題又出現在我們面前。為了解決這樣的問題,我們用建立起自己的運算集群,由Flume收集日誌,Spark與Storm分別進行批處理與流處理,HDFS永久存儲,Ceph臨時存儲,Mesos進行調度。 第三個階段是我們對於數據與模型的理解,在提供驗證服務的同時我們也在不斷根據收集到的數據來更新我們的模型使得驗證更加安全,破解更加困難。而在這個過程中最大的困難在於我們對於我們對於模型與特徵的理解。機器學習的算法做的都是一件事情即根據訓練樣本在特徵空間中尋找一個分類面來分割空間,然後利用這個分類面預測新樣本。不同的方法採用不同的數學模型來構建這個分類面,不同數學模型有著不同的表達能力,繪製出來的分類面形狀和特性就會不同,而如何在選擇合適的模型或者合適的模型組合訓練準確、有泛化性分類器就需要對數據有著深入的理解。
團隊的管理方面我們也在不斷探索如何構建一套科學合理的考核評價體系,從而使得項目按時完成的同時保持團隊的激情與探索欲望。這方面等會大家可以多多交流。
主持人:請結合實際情況,談談Python的多種形式優化。
黃勝藍:Python這個語言確實有點讓人又愛又恨,Python的語法、Python無比成熟的生態環境都是Python的優點。可以說對於一個網際網路公司Python幾乎可以滿足所有的業務需求,從web到自動化運維工具再到數據分析和機器學習,Python都可以搞定。但是Python的問題也很明顯,也就是它的性能問題。
好在現在Python世界也湧現出來了適用各種各樣情況下的性能優化手段,我在這裡結合我們遇到的實際情況簡單介紹幾個我們用到的。
1)使用C編寫Python擴展或者使用Cython。這兩種方式我們都有採用,也是業界比較常用的優化Python性能的方式。這裡面主要說一下Cython,優化程序性能的本質實際上是在平衡程式設計師時間和機器運算時間的成本,而利用Cython則可以非常靈活地尋找這中間的平衡。Cython可以使用介於Python和C之間的語法,當語法更接近Python時獲得的性能提升也就越少,而語法越接近於C時,性能也更加接近C。 2)使用pypy。這是一個支持jit的Python解釋器,其官方測試結果比較好看,就我們實際測試結果來看它的性能優勢不是很穩定,大部分項目是領先的但是有的項目又會莫名其妙的很慢。並且它對於C的擴展支持不佳。 3)使用Numba。對於數據分析、機器學習有過了解的人一定會聽說過Numpy,Numba就是專門用來優化基於Numpy程序的工具。利用它可以只加入一行代碼就將性能提升數倍,而缺點就是這種方式不能作為通用的優化手段,並且Numba雖然使用起來比較簡單,但其依賴相對複雜,部署起來會有點麻煩。主持人:數據分析方面,請您談一談如何利用gpu加速數據分析。
黃勝藍:很多人可能會覺得gpu編程是一件很困難的事情,其實當真正接觸了之後就會了解到讓你的程序在gpu上運行其實並不難,真正的難點在於理解gpu的特性從而將最合適的任務交給gpu來做,同時採用合適的優化手段。
以我們為例,我們利用PyOpenCl將日誌中用戶的驗證行為進行特徵計算。計算流程中上下文的創建、任務隊列的創建以及緩衝區的控制都通過Python來控制,kernel部分由C寫。
這裡面相對麻煩一點的是緩衝區的問題,因為cpu和gpu是兩套獨立的內存,數據要拷貝才能進行計算,這部分代碼PyOpenCl封裝的比較好,借用了NumPy的數據類型,操作起來會比用C寫方便很多。
其中最核心部分是kernel,也就是將會運行在GPU上的代碼,其實這部分代碼的編寫也不需要掌握什麼特殊技能,我們的做法就是幾乎移植了在CPU上的版本,只是在GPU上多條數據同時一起計算而已。
所以就像前面說的,找到合適的任務用gpu進行計算其實並不是一件很困難的事情。那麼什麼樣的任務比較適合gpu上進行計算呢?我簡單歸納一下就是任務邏輯相對簡單(因為第一kernel要用C寫,太複雜的邏輯寫起來還是有點麻煩。第二優化和調試起來相對麻煩),重複性高的任務。比如排序、統計、查找、過濾、簡單的預處理等等。
主持人:深度學習技術方案的選擇方面,有哪些思考?
黃勝藍:深度學習是目前機器學習領域最大的熱門,也是網際網路巨頭們爭相角逐的戰場。對於中小企業而言,雖然可能沒有實力聘請頂尖的研發人員、沒有能力獲取頂尖的運算能力但是這並不意味著一定會無緣深度學習所帶來的變革。
目前開源的深度學習框架非常多,利用這些開源的深度學習庫可以非常方便的構建一個神經網絡並進行實驗。
Python也為我們提供了探索深度學習世界非常有用的工具,我們使用了兩個東西,一個是Theano,另一個叫做Kares。
Theano是一個數學表達式編譯器,對於普通程式設計師來說可能會對這個概念很奇怪,實際上很簡單,它可以把一系列數學表達式以及相應的符號連結編譯成可執行代碼,而這個可執行代碼還不僅僅是cpu,它同樣可以編譯出gpu可執行代碼。所以基於這樣的工具,我們就可以實現從數學表達式自動編譯成gpu上的可執行代碼,是不是很爽!
再來看Kares,它是一個深度學習庫,它將大牛們提出的各種網絡結構、激活函數、Cost Function、以及各種Trick做了統一的整理和封裝,可以用及其簡單的方式將各種方法組合成為一個神經網絡進行實驗,這個庫的底層是基於Theano的,也就是利用Theano將表達式編譯成了gpu代碼,所以當你真正想去做深度學習的實驗時你就會發現用這些工具其實可以非常非常快就構建一個實驗項目。
當然,不是有了這些工具就意味著探索深度學習的道路會一帆風順。理論方面,不僅要透徹了解神經網絡背後的數學模型,更要緊跟業界動態,不斷學習最新的理論與技巧;實踐方面,訓練出一個優秀的網絡往往需要大量的試驗,嘗試不同的網絡結構、trick與超參數,複雜的網絡往往需要更大量的數據來反向傳播更新權值,這些意味著對於運算能力、數據存儲能力都是極大的考驗。
探索深度學習的前提是一定要有一支高水平、全方面的團隊!
主持人:如今網際網路時代給各行各業帶來了巨大的變革,同時也加劇了行業從業者浮躁的心態,該如何沉下心來做事,並不斷提升技術能力?
黃勝藍:的確,這兩年行情比較火爆,行業對於技術人員的需求持續高漲,待遇也是水漲船高。帶來的結果就是很多技術人員在這樣環境下變得浮躁起來,不再深究代碼的優化、常常把新技術掛在嘴邊卻不甚了解、哪些技術待遇高就學什麼技術等等。
我認為作為技術人員一定要在網際網路浪潮中保持危機感和廣闊的技術視野。危機感可以督促自己不迷失在眼前取得的成績而是繼續努力力爭上遊。廣闊的技術視野可以讓你更加清楚認識到業界遇到了哪些問題,又是開發了哪些項目提出了哪些方法來解決這些問題的。看清楚了業界發展的方向就可以避免在提升技術能力的道路上走彎路。
主持人:請結合你的切身體會談談創業路上您都有哪些收穫和思考,對於如今越來越多想要投身創業大海的年輕人,有什麼建議?
黃勝藍:創業是九死一生的事情,首先也確定是否有能力承受可能的失敗,這個是最大的前提。第二就是選好方向,創業做一件事情的時候一定要保證你是這行裡面對這個行業了解最深的,否則做出來的東西一定沒什麼意義。
主持人:推薦一些覺得非常不錯的資料或者書籍吧。
黃勝藍:推薦一些比較基礎的吧學習Python建議可以看看《Python核心編程》這本書,講的比較細緻。有興趣了解深度學習的話可以看看UFLDL,很經典的一個教程 http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial
互動環節:「跟用戶做一個小小的遊戲,在遊戲中通過行為來判斷用戶是正常用戶還是惡意的程序請求」這裡提的惡意程序的行為,能說一下嗎?想與業界大咖零距離溝通,歡迎加入CTO講堂微信群,參與CTO講堂!
【CTO講堂第31期預告】分享主題:SaaS雲端語音通信架構詳解
分享嘉賓:容聯七陌CTO 張楊
嘉賓簡介:張楊,現任容聯七陌CTO。2007年畢業於北京理工大學計算機專業,同年加入合力億捷歷任研發工程師、項目經理、研發主管、研發經理、研發總監。2014年與上司合力億捷CTO蔡質彬離開合力,創立容聯七陌任職CTO。主要負責基於Asterisk 和Freeswitch 開發容聯七陌的核心軟體交換平臺,研發軟交換平臺核心BOSS計費系統、後臺運營管理系統。
公司簡介:容聯七陌是一家專注在企業通訊領域的SAAS雲服務提供商,公司不僅為企業提供專業的雲端通訊產品服務,更有平臺層通訊能力集成服務。公司憑藉在中國呼叫中心領域十年的積累,自主研發了基於雲端的呼叫中心通訊平臺,同時結合客戶的使用場景提供:雲客服、雲電銷、雲總機、雲會議等企業通訊產品,平臺用戶涵蓋客服坐席、銷售坐席、企業總機等客戶,公司企業客戶涵蓋金融、教育、網際網路、O2O、汽車、醫療等多個行業。
分享時間地點:1月7日(本周四)10:30 , CTO講堂群加入方式:掃描二維碼加「C粉兒小助手」好友,申請入群。
還不是CTO俱樂部成員的各公司技術負責人,歡迎立即加入俱樂部:cto.csdn.net 。
更多俱樂部動態,歡迎掃碼關注微信號:
本文為CSDN原創文章,未經允許不得轉載,如需轉載請聯繫market#csdn.net(#換成@)