香儂科技Service Streamer:加速深度學習Web服務、極大提高GPU利用率。| 百萬人學AI評選

2020 無疑是特殊的一年,而 AI 在開年的這場”戰疫“中表現出了驚人的力量。站在“新十年”的起點上,CSDN【百萬人學AI】評選活動正式啓動。本屆評選活動在前兩屆的基礎上再度升級,設立了「AI優秀案例獎Top 30」、「AI新銳公司獎Top 10」、「AI開源貢獻獎Top 5」三大獎項。我們相信,榜樣的力量將成爲促進AI行業不斷髮展的重要基石,而CSDN將與這些榜樣一起,助力AI時代的”新基建“。

活動官網:https://bss.csdn.net/m/topic/ai_selection/index

申報地址:http://csdnprogrammer.mikecrm.com/WpA03hJ

一、公司簡介

北京香儂慧語科技有限責任公司(以下簡稱“香儂科技”),專注於人工智能、深度學習、機器學習等技術的研發,從成立之日起,就希望發展成爲具有中國文化特色、立足於中國本土的全球技術領先人工智能公司,所以香儂科技是全球第一家專門針對中文提出基於中文的自然語言處理模型的公司。此外,香儂科技一直以來都非常重視基礎科學和技術創新性的研究,累積在自然語言處理頂級會議發表文章50餘篇。

除了重視基礎研究外,香儂科技也同樣重視技術的落地,目前主要將人工智能技術應用於金融領域,提供全球資本市場信息智能服務以及智能投研輿情項目服務,致力於爲金融行業從業者提高信息獲取能力、基礎數據支持及智能技術服務,以便讓相關從業者可以及時掌握、瞭解行業、企業動態,爲金融資產管理、風控評級、行業研究、投資決策等各類金融業務賦能。目前已與60餘家機構展開了合作,包括戰略支援部隊、軍事科學院、上交所、證監會、中信建投證券、招商銀行等機構。

公司於2017年12月成立,2018年1月獲紅杉中國數千萬人民幣融資,於2018年9月完成紅杉中國領投的過億元人民幣A輪融資,累計融資額近2億元人民幣。

 

二、開源項目簡介

時間

2019年7月22日

背景

深度學習模型在訓練和測試時,通常使用小批量(mini-batch)的方式將樣本組裝在一起,這樣能充分利用GPU的並行計算特性,加快運算速度。 但在將使用了深度學習模型的服務部署上線的時候,由於用戶請求通常是離散和單次的,若採取傳統的循環服務器或多線程服務器, 會造成GPU計算資源浪費,用戶等待時間線性增加。更嚴重的是在大量併發請求時,會造成CUDA out-of-memory error,導致服務宕機。

基於以上現實問題,我們開源了ServiceStreamer,用於加速深度學習Web服務。ServiceStreamer是一箇中間件,將服務請求排隊組成一個完整的batch,再送進GPU運算。犧牲最小的時延(默認最大0.1s),提升整體性能,極大提高GPU利用率。

技術創新性

Service Streamer有以下特點:

  1. 簡單易用: 只需添加兩三行代碼即可讓模型提速上十倍。
  2. 處理速度快: 低延遲,專門針對速度做了優化。
  3. 可擴展性好: 可輕鬆擴展到多GPU場景,處理大量請求。
  4. 適用性強: 中間件,適用於所有深度學習框架和web框架。

主要應用領域:深度學習

開源地址:https://github.com/ShannonAI/service-streamer/blob/master/README_zh.md

 

三、開源影響力介紹

ServiceStreamer可以極大提高深度學習模型在Web服務器上的運行速度。通過service_streamer封裝用戶的模型函數,僅需要三行代碼,就可以使得BERT(一個大規模深度學習模型)服務的預測速度達到每秒200+句,在原來的基礎上提高了15倍的QPS。同時,利用Streamer封裝模型,啓動多個GPU Worker,充分利用多卡性能,能夠實現每秒1000+句,是原來的80倍QPS,極大地加速了深度學習模型在Web端上的運行。

最小實現

在技術上,用service_streamer中間件封裝predict函數,將request排隊成一個完整的batch,再送進GPU。 犧牲一定的時延(默認最大0.1s),提升整體性能,極大提高GPU利用率。然後web server需要開啓多線程(或協程)即可。

分佈式GPU Worker

實際項目中web server的性能(QPS)遠高於GPU模型的性能,所以我們支持一個web server搭配多個GPU worker進程。Streamer默認採用spawn子進程運行gpu worker,利用進程間隊列進行通信和排隊,將大量的請求分配到多個worker中處理。 再將模型batch predict的結果傳回到對應的web server,並且返回到對應的http response。上述方法簡單,但是主進程初始化模型,多佔了一份顯存,並且模型只能運行在同一塊GPU上。 所以我們提供了ManagedModel類,方便模型lazy初始化和遷移,以支持多GPU卡。

分佈式Web Server

有時候, web server中需要進行一些cpu密集型計算,比如圖像、文本預處理,再分配到gpu worker進入模型。 cpu資源往往會成爲性能瓶頸,於是我們也提供了多web server搭配(單個或多個)gpu worker的模式。

使用RedisStreamer指定所有web server和gpu worker公用的唯一的redis地址。然後跟任意python web server的部署一樣,用gunicorn或uwsgi實現反向代理和負載均衡。這樣每個請求會負載均衡到每個web server中進行cpu預處理,然後均勻的分佈到gpu worker中進行模型predict。

本項目目前已經在github上有564個Star,88個Fork,數十個Pull Request,推動了深度學習模型Web加速社區的交流與發展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章