国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

微信 NLP 算法微服務治理

人工智能 算法
本文主題為微信 NLP 算法微服務治理,將分享模型微服務帶來的挑戰,以及應對這些挑戰的解決方案。

一、概述

馬斯克收購了推特,但對其技術表示不滿。認為主頁速度過慢是因為有 1000 多個 RPC。先不評價馬斯克所說的原因是否正確,但可以看出,互聯網上為用戶提供的一個完整的服務,背后會有大量的微服務調用。

圖片

以微信讀書推薦為例,分為召回和排序兩個階段。

圖片

請求到達后,會先從用戶特征微服務拉取特征,把特征組合在一起進行特征篩選,然后調用召回相關的微服務,這一流程還需要乘以一個 N,因為我們是多路召回,會有很多類似的召回流程在同時運行。下面的是排序階段,從多個特征微服務中拉取相關特征,組合后多次調用排序模型服務。獲得最終結果后,一方面將最終結果返回給調用方,另一方面還要將流程的一些日志發送給日志系統留檔。

讀書推薦只是微信讀書整個 APP 中非常小的一部分,由此可見,即便是一個比較小的服務后面也會有大量的微服務調用。管中窺豹,可以意料到整個微信讀書的系統會有巨量的微服務調用。

大量的微服務帶來了什么問題?

圖片

根據日常工作的總結,主要是有以上三方面的挑戰:

① 管理方面:主要是圍繞如何高效地管理、開發以及部署大量的算法微服務。

② 性能方面:要盡量提升微服務,特別是算法微服務的性能。

③ 調度方面:如何在多個同類算法微服務之間實現高效合理的負載均衡。

二、微服務所面臨的管理問題

1、開發和部署:CI/CD 系統提供自動打包和部署

第一點是我們提供了一些自動打包和部署的流水線,減輕算法同學開發算法微服務的壓力,現在算法同學只需要寫一個 Python 函數,流水線會自動拉取預先寫好的一系列微服務模板,并將算法同學開發的函數填入,快速搭建微服務。

2、擴縮容:任務積壓感知自動擴縮容

第二點是關于微服務的自動擴縮容,我們采取的是任務積壓感知的方案。我們會主動去探測某一類任務積壓或空閑的程度,當積壓超過某一閾值后就會自動觸發擴容操作;當空閑達到某一閾值后,也會去觸發縮減微服務的進程數。

3、微服務組織:圖靈完備 DAG / DSL / 自動壓測 / 自動部署

第三點是如何把大量的微服務組織在一起,來構造出完整的上層服務。我們的上層服務是用 DAG 去表示的,DAG 的每一個節點代表一個對微服務的調用,每一條邊代表服務間數據的傳遞。針對 DAG,還專門開發了 DSL(領域特定語言),更好地描述和構造 DAG。并且我們圍繞 DSL 開發了一系列基于網頁的工具,可以直接在瀏覽器里進行上層服務的可視化構建、壓測和部署。

4、性能監控:Trace 系統

第四點性能監控,當上層服務出現問題時要去定位問題,我們構建了一套自己的 Trace 系統。針對每一個外來請求,都有一整套的追蹤,可以查看請求在每一個微服務的耗時,從而發現系統的性能瓶頸。

三、微服務所面臨的性能問題

一般來說,算法的性能耗時都在深度學習模型上,優化算法微服務的性能很大一部分著力點就在優化深度學習模型 infer 性能。可以選擇專用的 infer 框架,或嘗試深度學習編譯器,Kernel 優化等等方法,對于這些方案,我們認為并不是完全有必要。在很多情況下,我們直接用 Python 腳本上線,一樣可以達到比肩 C++ 的性能。

不是完全有必要的原因在于,這些方案確實能帶來比較好的性能,但是性能好不是服務唯一的要求。有一個很著名的二八定律,以人與資源來描述,就是 20% 的人會產生 80% 的資源,換句話說,20% 的人會提供 80% 的貢獻。對于微服務來說,也是適用的。

我們可以把微服務分為兩類,首先,成熟穩定的服務,數量不多,可能只占有 20%,但是承擔了 80% 的流量。另一類是一些實驗性的或者還在開發迭代中的服務,數量很多,占了 80%,但是承擔的流量卻只占用的 20%,很重要的一點是,經常會有變更和迭代,因此對快速開發和上線也會有比較強的需求。

前面提到的方法,比如 Infer 框架,Kernel 優化等,不可避免的需要額外消耗開發成本。成熟穩定的服務還是很適合這類方法,因為變更比較少,做一次優化能持續使用很久。另一方面,這些服務承擔的流量很大,可能一點點的性能提升,就能帶來巨大的影響,所以值得去投入成本。

但這些方法對于實驗性服務就不那么合適了,因為實驗性服務會頻繁更新,我們無法對每一個新模型都去做新的優化。針對實驗性服務,我們針對 GPU 混合部署場景,自研了 Python 解釋器 —— PyInter。實現了不用修改任何代碼,直接用 Python 腳本上線,同時可以獲得接近甚至超過 C++ 的性能。

圖片

我們以 Huggingface 的 bert-base 為標準,上圖的橫軸是并發進程數,表示我們部署的模型副本的數量,可以看出我們的 PyInter 在模型副本數較多的情況下 QPS 甚至超越了 onnxruntime。

圖片

通過上圖,可以看到 PyInter 在模型副本數較多的情況下相對于多進程和 ONNXRuntime 降低了差不多 80% 的顯存占用,而且大家注意,不管模型的副本數是多少,PyInter 的顯存占用數是維持不變的。

我們回到之前比較基礎的問題:Python 真的慢嗎?

沒錯,Python 是真的慢,但是 Python 做科學計算并不慢,因為真正做計算的地方并非 Python,而是調用 MKL 或者 cuBLAS 這種專用的計算庫。

那么 Python 的性能瓶頸主要在哪呢?主要在于多線程下的 GIL(Global Interpreter Lock),導致多線程下同一時間只能有一個線程處于工作狀態。這種形式的多線程對于 IO 密集型任務可能是有幫助的,但對于模型部署這種計算密集型的任務來說是毫無意義的。

圖片

那是不是換成多進程,就能解決問題呢?

圖片

其實不是,多進程確實可以解決 GIL 的問題,但也會帶來其它新的問題。首先,多進程之間很難共享 CUDA Context/model,會造成很大的顯存浪費,這樣的話,在一張顯卡上部署不了幾個模型。第二個是 GPU 的問題,GPU 在同一時間只能執行一個進程的任務,并且 GPU 在多個進程間頻繁切換也會消耗時間。

對于 Python 場景下,比較理想的模式如下圖所示:

圖片


通過多線程部署,并且去掉 GIL 的影響,這也正是 PyInter 的主要設計思路,將多個模型的副本放到多個線程中去執行,同時為每個 Python 任務創建一個單獨的互相隔離的 Python 解釋器,這樣多個任務的 GIL 就不會互相干擾了。這樣做集合了多進程和多線程的優點,一方面 GIL 互相獨立,另一方面本質上還是單進程多線程的模式,所以顯存對象可以共享,也不存在 GPU 的進程切換開銷。

PyInter 實現的關鍵是進程內動態庫的隔離,解釋器的隔離,本質上是動態庫的隔離,這里自研了動態庫加載器,類似 dlopen,但支持“隔離”和“共享”兩種動態庫加載方式。

圖片

以“隔離”方式加載動態庫,會把動態庫加載到不同的虛擬空間,不同的虛擬空間互相之間看不到。以“共享”方式加載動態庫,那么動態庫可以在進程中任何地方看到和使用,包括各個虛擬空間內部。

以“隔離”方式加載 Python 解釋器相關的庫,再以“共享”方式加載 cuda 相關的庫,這樣就實現了在隔離解釋器的同時共享顯存資源。

四、微服務所面臨的調度問題

多個微服務起到同等的重要程度以及同樣的作用,那么如何在多個微服務之間實現動態的負載均衡。動態負載均衡很重要,但幾乎不可能做到完美。

為什么動態負載均衡很重要?原因有以下幾點:

(1)機器硬件差異(CPU / GPU);

(2)Request 長度差異(翻譯 2 個字 / 翻譯 200 個字);

(3)Random 負載均衡下,長尾效應明顯:

① P99/P50 差異可達 10 倍;

② P999/P50 差異可達 20 倍。

(4)對微服務來說,長尾才是決定整體速度的關鍵。

處理一個請求的耗時,變化比較大,算力區別、請求長度等都會影響耗時。微服務數量增多,總會有一些微服務命中長尾部分,會影響整個系統的響應時間。

為什么動態負載均衡難以完美?

方案一:所有機器跑一遍 Benchmark。

這種方案不“動態”,無法應對 Request 長度的差異。并且也不存在一個完美的 Benchmark 能反應性能,對于不同模型來說不同機器的反應都會不同。

方案二:實時獲取每一臺機器的狀態,把任務發給負載最輕的。

這一方案比較直觀,但問題在于在分布式系統中沒有真正的“實時”,信息從一臺機器傳遞到另一臺機器一定會花費時間,而在這一時間中,機器狀態就可以發生了改變。比如在某一瞬間,某一臺 Worker 機器是最空閑的,多臺負責任務分發的 Master 機器都感知到了,于是都把任務分配給這臺最空閑的 Worker,這臺最空閑的 Worker 瞬間變成了最忙的,這就是負載均衡中著名的潮汐效應。

方案三:維護一個全局唯一的任務隊列,所有負責任務分發的 Master 都把任務發送到隊列中,所有 Worker 都從隊列中取任務。

這一方案中,任務隊列本身就可能成為一個單點瓶頸,難以橫向擴展。

動態負載均衡難以完美的根本原因是信息的傳遞需要時間,當一個狀態被觀測到后,這個狀態一定已經“過去”了。Youtube 上有一個視頻,推薦給大家,“Load Balancing is Impossible” https://www.youtube.com/watch?v=kpvbOzHUakA。

關于動態負載均衡算法,Power of 2 Choices 算法是隨機選擇兩個 worker,將任務分配給更空閑的那個。這個算法是我們目前使用的動態均衡算法的基礎。但是 Power of 2 Choices 算法存在兩大問題:首先,每次分配任務之前都需要去查詢下 Worker 的空閑狀態,多了一次 RTT;另外,有可能隨機選擇的兩個 worker 剛好都很忙。為了解決這些問題,我們進行了改進。

圖片

改進后的算法是 Joint-Idle-Queue。

圖片

我們在 Master 機器上增加了兩個部件,Idle-Queue 和 Amnesia。Idle-Queue 用來記錄目前有哪些 Worker 處于空閑狀態。Amnesia 記錄在最近一段時間內有哪些 Worker 給自己發送過心跳包,如果某個 Worker 長期沒有發送過心跳包,那么 Amnesia 就會逐漸將其遺忘掉。每一個 Worker 周期性上報自己是否空閑,空閑的 Worker 選擇一個 Master 上報自己的 IdIeness,并且報告自己可以處理的數量。Worker 在選擇 Master 時也是用到 Power of 2 Choices 算法,對其他的 Master,Worker 上報心跳包。

有新的任務到達時,Master 從 Idle-Queue 里隨機 pick 兩個,選擇歷史 latency 更低的。如果 Idle-Queue 是空的,就會去看 Amnesia。從 Amnesia 中隨機 pick 兩個,選擇歷史 latency 更低的。

在實際的效果上,采用該算法,可以把 P99/P50 壓縮到 1.5 倍,相比 Random 算法有 10 倍的提升。

五、總結

在模型服務化的實踐中,我們遇到了三個方面的挑戰:

首先是對于大量的微服務,如何進行管理,如何優化開發、上線和部署的流程,我們的解決方案是盡量自動化,抽取重復流程,將其做成自動化流水線和程序。

第二是模型性能優化方面,如何讓深度學習模型微服務運行得更加高效,我們的解決方案是從模型的實際需求出發,對于比較穩定、流量較大的服務進行定制化的優化,對于實驗型的服務采用 PyInter,直接用 Python 腳本上線服務,也能達到 C++ 的性能。

第三是任務調度問題,如何實現動態負載均衡,我們的解決方案是在 Power of 2 Choices 的基礎上,開發了 JIQ 算法,大幅緩解了服務耗時的長尾問題。

責任編輯:姜華 來源: DataFunTalk
相關推薦

2020-08-11 07:40:37

數組數據存儲

2020-09-29 07:00:00

微服務API架構

2024-12-10 09:15:39

2021-12-03 10:30:25

WOT技術峰會技術

2018-11-07 10:00:00

微服務Service MesIstio

2024-06-07 14:54:55

2019-09-18 09:05:58

技術SQLDevOps

2020-12-28 11:52:36

微服務數據中臺去中心化

2022-04-20 07:48:09

微服務鏈路服務器

2020-04-20 10:04:56

微服務架構數據

2022-08-16 08:50:40

微服務動態讀寫分離

2023-11-02 17:52:30

架構模式微服務服務治理

2021-03-05 18:05:56

JavaServerless 微服務

2022-10-17 15:21:18

2019-08-16 08:59:33

技術軟件HTML

2020-11-13 10:45:44

微服務架構數據

2022-06-10 08:43:20

攜程小程序Size治理Size檢查

2016-09-22 15:36:15

微服務架構

2020-05-28 22:41:54

微服務架構并發量

2019-02-22 09:12:33

微服務架構服務化
點贊
收藏

51CTO技術棧公眾號

中国字幕a在线看韩国电影| jizz久久精品永久免费| 国产精品国产三级国产aⅴ原创 | 国产米奇在线777精品观看| 国产精成人品localhost| 加勒比久久高清| 亚洲欧美制服中文字幕| 任你弄在线视频免费观看| 欧美最猛性xxxxx直播| 传媒视频在线| 亚洲免费观看高清在线观看| 国产黄色特级片| 成人高清视频在线| 奇米影视亚洲色图| 国产成人精品亚洲日本在线桃色| 丝袜美腿玉足3d专区一区| 亚洲一区欧美二区| 你懂的网址一区二区三区| 国产精品av一区二区| 粉嫩av一区二区三区免费观看| 91青青国产在线观看精品| 国产在线一区二区三区| 欧美日韩高清| 成人在线国产精品| 亚洲特级毛片| 四虎影视永久免费在线观看一区二区三区| 免播放器亚洲| 久久免费视频2| 国产成人精品免费视频网站| 久久男人资源站| 91美女福利视频| 孩娇小videos精品| 亚洲一区二区三区国产| 少妇性bbb搡bbb爽爽爽欧美| 亚洲成人av一区| 免费福利在线观看| 制服丝袜亚洲播放| 日本三级一区| 欧美激情视频给我| 欧美日韩国产在线观看网站| 97视频资源在线观看| 日本中文字幕一区二区视频| www.男人天堂网| 欧美激情一区二区三区不卡| 在线手机福利影院| 在线综合+亚洲+欧美中文字幕| 国产盗摄——sm在线视频| 久久九九有精品国产23| 中文有码一区| 精品一区二区三区视频日产| 久久91精品久久久久久秒播| 成人在线免费播放视频| 亚洲成人激情综合网| 精品国产丝袜高跟鞋| 亚洲一级片在线看| 欧美**字幕| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 懂色av一区二区三区| 毛片av在线| 中文字幕精品—区二区| 精品国产美女| 欧美亚洲丝袜| 久久精品水蜜桃av综合天堂| 四虎精品在永久在线观看 | 亚洲午夜激情免费视频 | 日韩小视频网址| 欧美日韩一区二区三区不卡视频| 亚洲综合在线做性| 久久电影网站中文字幕| 美女网站色免费| 欧美精品欧美精品系列| 日韩在线网址| 日本精品二区| 亚洲视频香蕉人妖| 黄色在线免费观看网站| 国产精品av免费在线观看| 蜜桃精品在线观看| 女人高潮特级毛片| 国产亚洲成av人片在线观看桃| 欧美激情电影| 尤物av无码色av无码| 欧美日免费三级在线| 日韩精品一区二区三区中文字幕| 国产欧美日韩在线播放| 久久影院电视剧免费观看| 成年女人的天堂在线| 久久久久五月天| 免费成人美女在线观看.| 原千岁中文字幕| 国产一区二区三区高清在线观看| 亚洲一本二本| 美女少妇一区二区| 亚洲精品v欧美精品v日韩精品| 精品国产乱码久久久| 少妇性饥渴无码a区免费| 777亚洲妇女| 91综合在线| 高清av影院| 美女啪啪无遮挡免费久久网站| 日韩精品成人一区二区在线| 中文字幕在线二区| 欧美激情精品久久久久久黑人| 日韩不卡一区二区| 色视频免费在线观看| 欧美精品18videos性欧| 韩国v欧美v亚洲v日本v| 黄色成人影院| 99re视频在线| 亚洲18色成人| 国产中文字幕一区二区三区| 中文字幕永久视频| 日韩中文字幕免费视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 成人高清在线视频| 伊人电影在线观看| 91国产丝袜在线放| 亚洲一区二区三区影院| 日韩电影不卡一区| 黄大色黄女片18第一次| 久久精品国亚洲| av在线一区二区三区| 国产传媒在线| 在线国产伦理一区| 欧美成人精品1314www| 亚洲免费网址| 青青草视频在线免费直播| 色姑娘综合网| 精品盗摄一区二区三区| 琪琪一区二区三区| sm捆绑调教国产免费网站在线观看| 日韩激情久久| 日韩精品一区在线| 日韩av网站免费在线| 青春草在线免费视频| 亚洲v国产v| 精品亚洲国产成av人片传媒| 美女视频黄久久| 欧美夫妻性生活xx| 国产精品美女网站| 99热在线播放| 97视频免费看| 综合网日日天干夜夜久久| 亚洲国产成人tv| 久久亚洲国产精品一区二区| 牛牛影视一区二区三区免费看| 亚洲图片小说在线| 亚洲国产精品人人爽夜夜爽| 蜜臀av性久久久久蜜臀aⅴ四虎| 日本免费一区二区六区| 亚洲激情啪啪| 亚洲性夜色噜噜噜7777| 久久精品亚洲精品国产欧美| 日韩福利视频一区| 91网页版在线登录入口| 91视频在线免费观看| 在线成人av网站| 国内精品不卡在线| 欧美1区2区3| 黑人巨大精品欧美一区二区奶水| 国产精品1区2区在线观看 | 亚洲精品aⅴ| 国产不卡视频| 成人h在线播放| 日韩一区二区三区av| 丁香天五香天堂综合| 国产高清亚洲| 亚洲精品视频99| 四虎影视永久免费在线观看一区二区三区| 精品国产伦一区二区三区观看方式 | 日本xxxx高清色视频| 高清免费日韩| 亚洲老头同性xxxxx| 欧美激情资源网| 国内视频精品| 桃子视频成人app| 嫩草影院发布页| 日韩av电影在线观看| 日韩一区二区久久久| 日韩欧美国产一区二区| 国产一区二区按摩在线观看| 亚洲小说图片| 国产美女精品写真福利视频| 丁香婷婷自拍| 中国成人亚色综合网站 | 欧美一区二区三区久久| 国产婷婷视频在线| 国产视频在线视频| 久久国产欧美精品| 欧美精品日韩www.p站| 欧美性20hd另类| 粉嫩欧美一区二区三区高清影视| 精品美女久久| 成人性生交大片免费网站| 中出在线观看| 国产免费一区二区视频| www.成人三级视频| 久久久久在线观看| 日韩电影网在线| 91福利小视频| 1024精品合集|