国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

愛奇藝深度學習平臺對TF Serving毛刺問題的優化

Tensorflowers ? 來源:TensorFlow ? 作者:愛奇藝技術產品團 ? 2020-12-17 16:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在點擊率 CTR(Click Through Rate)預估算法的推薦場景中使用 TensorFlow Serving 熱更新較大模型時會出現短暫的延時毛刺,導致業務側超時,降低算法效果,為了解決這個問題,愛奇藝深度學習平臺團隊經過多個階段的優化實踐,最后對 TF Serving 和 TensorFlow 的源碼進行深入優化,將模型熱更新時的毛刺現象解決,本文將分享 TensorFlow Serving 的優化細節,希望對大家有幫助。

背景介紹

TensorFlow Serving是谷歌開源的用來部署機器學習模型的高性能推理系統。它主要具備如下特點:

同時支持 gRPC 和 HTTP 接口

支持多模型,多版本

支持模型熱更新和版本切換

TensorFlow Serving
https://github.com/tensorflow/serving

愛奇藝深度學習平臺上大量的 CTR 推薦類業務使用 TensorFlow Serving 來部署線上推理服務。

CTR 類業務對線上服務的可持續性要求很高,如果模型升級時要中斷服務是不可接受的,因此 TF Serving 的模型熱更新功能對這樣的業務場景提供了很大的幫助,可以避免重啟容器來做模型升級。

但是,隨著業務對模型更新實時性的要求越來越高,我們發現,模型熱更新時出現的短暫客戶端請求超時現象(稱之為毛刺現象)變成進一步提升實時性的一個比較大的障礙。

模型更新時的毛刺現象

先來看一下,

什么是模型更新時的毛刺現象?

下面這張圖是我們在 TF Serving 代碼中增加了 Bvar(https://github.com/apache/incubator-brpc/blob/master/docs/cn/bvar.md) 來查看內部請求的延遲情況。圖中是延遲的分位比,延遲分位值分別為 [p80, p90, p99, p999],單位是微秒。

745748d6-357a-11eb-a64d-12bb97331649.png

從圖中可以看到,在模型更新前后,p999的延遲都在 30ms以下。但是,在模型更新的瞬間,p999延遲突然抖動到 120ms+,持續了大概 10 秒時間,這就是毛刺現象,反應到客戶端就是會產生請求超時失敗。

為了完全解決這個問題,愛奇藝深度學習平臺經過多個階段的深入優化,最后將模型更新時的毛刺現象解決。

TF Serving 的模型更新過程

工欲善其事必先利其器,我們先來看看 TF Serving 內部的模型更新過程。

如上圖,Source會啟動一個線程來不斷查看模型文件,然后將發現的新模型構建相應的 Servable 數據結構放到 Aspired Versions 的隊列中去。

DynamicManager也會啟動一個線程,來不斷查看 Aspired Versions隊列是否有需要處理的請求,根據配置的 Version Policy 來執行模型更新策略,最后通過 SessionBundle來執行模型的加載和卸載。

Version Policy 默認為 AvailabilityPreservingPolicy,該 policy 的特點是當有新的模型加入時,會保證至少有一個可服務的模型版本,當新版本加載完成后,再卸載舊版本,這樣可以最大程度的保證模型的可服務性。

舉例子來講,如果只支持一個模型版本,當前版本是 2,如果有新的版本 3 加入,那么會先加載版本 3,然后再卸載版本 2。

接下來,詳細看一下 TF Serving 的模型加載過程,主要分成以下幾個步驟:

創建一個 DirectSession

將模型的 Graph 加載到 Session 中

執行 Graph 中的 Restore Op 來將變量從模型中讀取到內存

執行 Graph 中的 Init Op 做相關的模型初始化

如果配置了 Warmup,執行 Warmup 操作,通過定義好的樣本來預熱模型

TensorFlow 的模型執行有個非常顯著的特點是 lazy initialization,也就是如果沒有 Warmup,當 TF Serving 加載完模型,其實只是加載了 Graph 和變量,Graph 中的 OP 其實并沒有做初始化,只有當客戶端第一次發請求過來時,才會開始初始化 OP。

問題的初步優化

從上面的分析來看,可以看到初步的解決方案,那就是做模型的 Warmup,具體方案如下:

配置模型 Warmup,在模型目錄中增加 tf_serving_warmup_requests 文件

使用獨立線程來做模型的加載和卸載操作,配置 num_unload_threads和 num_load_threads

模型如何做 Warmup 詳細請參考 TF 的文檔 SavedModel Warmup。

https://tensorflow.google.cn/tfx/serving/saved_model_warmup

第二項優化主要是參考美團的文章基于 TensorFlow Serving 的深度學習在線預估。

https://tech.meituan.com/2018/10/11/tfserving-improve.html

我們來對比一下優化前后的區別:

7526301a-357a-11eb-a64d-12bb97331649.png

可以看到,使用上面的優化,抖動的延遲減少了幾個數量級,效果很明顯。

問題的進一步優化

雖然上面的優化將模型更新時的毛刺降低到只有 120ms+,但是這個仍然會對客戶端的請求產生超時現象,如果模型更新的頻率不高,比如一天更新一次,那么基本上是可以接受的。

但是,如果業務對模型更新的實時性到一個小時以內,甚至更高,那么就必須進一步解決毛刺問題。我們不得不繼續思考,剩下的這個毛刺是由于什么原因產生的?

TF Serving 是一個計算密集型的服務,對可能產生影響的因素,我們做了如下猜測:

計算原因:是不是新模型的初始化,包括 Warmup 的計算,影響了推理請求?

內存原因:是不是模型更新過程中的內存分配或釋放產生鎖而導致的?

或者兩者都有?

計算原因分析

先來分析一下計算方面的原因,如果模型加載會影響到推理請求,那么能不能將模型的加載也用獨立的線程來做?

經過調研 TF Serving 的源碼,我們發現了這樣的參數,原來 TF 已經考慮到這樣的因素。

// If set, session run calls use a separate threadpool for restore and init // ops as part of loading the session-bundle. The value of this field should // correspond to the index of the tensorflow::ThreadPoolOptionProto defined as // part of session_config.session_inter_op_thread_pool. google.protobuf.Int32Value session_run_load_threadpool_index = 4;

通過配置 session_inter_op_thread_pool并設置 session_run_load_threadpool_index可以將模型的初始化放在獨立的線程。

修改配置后,并做了相關驗證,如下圖。

757b8cae-357a-11eb-a64d-12bb97331649.png

驗證的結論很遺憾,使用獨立的線程來處理模型初始化并不能緩解毛刺問題。

從而,進一步分析了 TF Serving 的線程機制,發現計算部分主要集中在 TF 的 Inter 和 Intra Op 線程,在模型初始化線程獨立出來后,原來的推理請求基本不會被影響到。

另外,經過分析還發現,TF 在執行 Restore Op 的時候會創建額外的線程池來恢復大的變量,于是嘗試將 Restore 時的線程池去掉,發現仍然沒有效果。

內存原因分析

先來看一下 TF 內存的分配機制,TF 的 GPU 顯存是通過 BFC (best-fit with coalescing) 算法來分配的,CPU 內存分配是直接調用底層 glibc ptmalloc2 的 memory allocation。

目前平臺上 CTR 類業務基本都是 CPU 推理,因此內存的分配和釋放都是通過 glibc ptmalloc2 來管理的。

經過調研了解到,Linux glibc 的內存管理也是經過優化的,原來的實現是 dlmalloc,對多線程的支持并不好,現在的 ptmalloc2 是優化后支持了多線程。

如果要深入到 ptmalloc2 優化內存管理就比較麻煩,不過調研發現已經有了開源的優化方案,那就是谷歌的 Tcmalloc和 Facebook 的 Jemalloc。

Tcmalloc
http://goog-perftools.sourceforge.net/doc/tcmalloc.html)

Jemalloc
http://jemalloc.net/

Ptmalloc,Tcmalloc 和 Jemalloc 的優缺點網上有很多分析的文章,都指出 Tcmalloc 和 Jemalloc 在多線程環境下有比較好的性能,大體從原理上來講是區分大小內存塊的分配,各個線程有自己內存分配區域,減少鎖競爭。

對比試驗了三個內存分配器,實驗結果如下圖:

759f37ee-357a-11eb-a64d-12bb97331649.png

75f04a12-357a-11eb-a64d-12bb97331649.jpg

從實驗結果來看,Tcmalloc 和 Jemalloc 對毛刺都有比較好的緩解,但是 Tcmalloc 會增加正常情況下的 p999 延遲;而反觀 Jemalloc 的毛刺 p999 降到了 50ms 以下,正常情況下的 p999 比 Ptmalloc也有所優化。

看起來 Jemalloc 是一個相對比較理想的方案,不過在進一步的試驗中發現,如果同時更新兩個版本,Jemalloc 的 p999 毛刺會達到近 60ms,并且更新后會有一個比較長的延遲抖動期,會持續近一分鐘時間,如下圖:

7630b0ac-357a-11eb-a64d-12bb97331649.jpg

優化到這一步,如果對這樣的延遲變化不敏感的話,基本就可以用 Jemalloc 來做為方案上線了,但對這樣的效果仍覺得不是非常理想,因此進行了更深入的優化。

問題的最終深入優化

上面內存方案的優化效果提供了一個很好的啟示和方向,毛刺的根本原因應該在內存的分配和釋放競爭上,所以來進一步分析 TF 的內存分配。

TF 內存分配和釋放的使用場景主要分成兩個部分:

一部分是模型 Restore 時變量本身 Tensor 的分配,這個是在加載模型時分配的,內存的釋放是在模型被卸載的時候

一部分是 RPC 請求時網絡前向計算時的中間輸出Tensor 內存分配,在請求處理結束后就被釋放

模型更新時,新模型加載時的 Restore OP 有大量的內存被分配,舊模型被卸載時的有很多對象被析構,大量內存被釋放。

而這個過程中,RPC 請求沒有中斷,這個時候兩者的內存分配和釋放會產生沖突和競爭關系。

因此設計了內存分配隔離方案:

將模型本身參數的內存分配和 RPC 請求過程中的內存分配隔離開來,讓它們的分配和釋放在不同的內存空間。

768b8496-357a-11eb-a64d-12bb97331649.jpg

結合模型的更新,線上模型一個容器里面最多就兩個版本的模型文件,給每個模型版本各自分配了獨立的內存池,用來做 AB 切換。

在代碼的編寫上,TF 剛好有一個現成的 BFC 內存分配器,利用 BFC 做模型參數的內存分配器,RPC 請求的內存分配仍然使用 glibc ptmalloc2 來統一分配,因此最后的設計是這樣:

代碼改動主要在 TF 的源碼,主要是對 ProcessState,ThreadPoolDevice和 Allocator做了一些改動。

最后來看一下試驗效果:

771935d4-357a-11eb-a64d-12bb97331649.png

從圖中,可以看到模型更新后,延遲抖動很少,大約在 2ms,在實際的線上測試高峰期大概有 5ms 的抖動,滿足業務需求。

總結

本文介紹了愛奇藝深度學習平臺對 TF Serving 毛刺問題的優化,主要歸納如下:

配置模型 Warmup 文件來初預熱模型

使用 Jemalloc 做內存分配優化

TF 模型參數分配和 RPC 請求內存分配分離

經過實踐,每個方法都有進一步的優化,最后基本解決了模型熱更新過程中的毛刺問題。

— 參考文獻 —

1. TF ServingAarchtecture

https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/architecture.md

2. BVar

https://github.com/apache/incubator-brpc/blob/master/docs/cn/bvar.md

3. TF WarmUp

https://tensorflow.google.cn/tfx/serving/saved_model_warmup

4. 美團基于 TensorFlow Serving 的深度學習在線預估

https://tech.meituan.com/2018/10/11/tfserving-improve.html

5. Google Tcmalloc

http://goog-perftools.sourceforge.net/doc/tcmalloc.html

6. Facebook Jemalloc: http://jemalloc.net/

責任編輯:xj

原文標題:社區分享 | TensorFlow Serving 模型更新毛刺的完全優化實踐

文章出處:【微信公眾號:TensorFlow】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 毛刺
    +關注

    關注

    0

    文章

    30

    瀏覽量

    16026
  • 深度學習
    +關注

    關注

    73

    文章

    5598

    瀏覽量

    124396
  • tensorflow
    +關注

    關注

    13

    文章

    334

    瀏覽量

    62176

原文標題:社區分享 | TensorFlow Serving 模型更新毛刺的完全優化實踐

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    開放平臺平臺功能

    平臺的高效編排方式。開發者可通過該模式基于鴻蒙Agent通信協議快速、便捷地將成熟的第三方智能體對接至小開放平臺,實現分發與調用,提升平臺的場景覆蓋能力。該模式適用于同時具備鴻蒙端應
    發表于 01-30 15:24

    開放平臺快速創建鴻蒙智能體

    1.登錄小開放平臺,進入小智能體平臺頁面,點擊立即體驗,進入創建頁面。 2.點擊左上角【+創建智能體】按鈕,即可進入智能體創建流程。 3.擊【+創建】后,會進入到標準創建頁面,在這
    發表于 01-19 11:00

    穿孔機頂頭檢測儀 機器視覺深度學習

    ,能適用惡劣工況,在粉塵、高溫、氧化皮等惡劣環境中均可正常工作。 測量原理 利用頂頭與周圍的物質(水、空氣、導盤等)紅外輻射能量的差異,用熱成像相機拍攝出清晰的圖片,再通過深度學習短時間內深度
    發表于 12-22 14:33

    【團購】獨家全套珍藏!龍哥LabVIEW視覺深度學習實戰課(11大系列課程,共5000+分鐘)

    (第10系列)、YOLOv8-Tiny工業優化版(第9系列),滿足產線端設備算力限制,模型推理速度提升300%。 LabVIEW生態整合 作為工業自動化領域主流開發環境,LabVIEW與深度學習的集成
    發表于 12-04 09:28

    DAC8560:16位超低毛刺電壓輸出數模轉換器的深度剖析

    ? 在電子設計領域,數模轉換器(DAC)是連接數字世界和模擬世界的關鍵橋梁。今天,我們將深入探討TI公司的DAC8560,這是一款16位、超低毛刺、電壓輸出的數模轉換器,具有諸多出色的特性,適用于
    的頭像 發表于 11-28 13:44 ?574次閱讀
    DAC8560:16位超低<b class='flag-5'>毛刺</b>電壓輸出數模轉換器的<b class='flag-5'>深度</b>剖析

    如何深度學習機器視覺的應用場景

    深度學習視覺應用場景大全 工業制造領域 復雜缺陷檢測:處理傳統算法難以描述的非標準化缺陷模式 非標產品分類:對形狀、顏色、紋理多變的產品進行智能分類 外觀質量評估:基于學習的外觀質量標準判定 精密
    的頭像 發表于 11-27 10:19 ?220次閱讀

    企查平臺企業詳情數據 API 接口使用指南

    ? ?引言 企查作為國內知名的企業信息查詢平臺,匯聚了海量的企業工商信息、經營數據等。對于開發者或數據分析師而言,若能通過其開放的 API 接口獲取這些結構化數據,將極大地提升工作效率和應用開發
    的頭像 發表于 11-20 14:48 ?1037次閱讀
    <b class='flag-5'>愛</b>企查<b class='flag-5'>平臺</b>企業詳情數據 API 接口使用指南

    HarmonyOS 6正式發布,超能小一用就愛!

    景終端設備上帶來真人感對話、小看世界、小幫接、AI修圖、小慧記等行業領先的AI智慧體驗,深受消費者喜愛。升級到HarmonyOS 6后,小再進階超級助理,支持更多華為終端設備,
    的頭像 發表于 10-22 17:43 ?1543次閱讀

    自動駕駛中Transformer大模型會取代深度學習嗎?

    [首發于智駕最前沿微信公眾號]近年來,隨著ChatGPT、Claude、文心一言等大語言模型在生成文本、對話交互等領域的驚艷表現,“Transformer架構是否正在取代傳統深度學習”這一話題一直被
    的頭像 發表于 08-13 09:15 ?4184次閱讀
    自動駕駛中Transformer大模型會取代<b class='flag-5'>深度</b><b class='flag-5'>學習</b>嗎?

    鋰離子電池毛刺控制的要求及檢測

    鋰離子電池在完成裝配封口前最怕金屬粉塵、雜質、水分和毛刺。極片毛刺會引起的內部短路,因此涉及到鋰電池的安全問題,是鋰電池制造過程中非常關鍵的管控項目。毛刺的控制也一直是業內人士關注的焦點。美能光子灣
    的頭像 發表于 08-05 17:54 ?1511次閱讀
    鋰離子電池<b class='flag-5'>毛刺</b>控制的要求及檢測

    奧拓電子亮相CITS 2025影視拍攝技術創新與趨勢論壇

    近日,由奧拓電子和中廣國際聯合主辦的CITS 2025“第二屆影視拍攝技術創新與趨勢論壇”在北京希爾頓酒店舉行,共有來自中影、圖仕、北京電影學院等單位的150余位影視拍攝領域
    的頭像 發表于 07-30 09:07 ?971次閱讀

    鋁鑄件去毛刺加工,用SycoTec浮動去毛刺主軸

    在現代制造業中,鋁鑄件因其質量輕、強度高、耐腐蝕性好等性能,被廣泛應用于航空航天、汽車制造、電子設備等眾多領域。然而,鋁鑄件在生產過程中,不可避免地會產生毛刺。這些毛刺不僅影響鋁鑄件的外觀質量,還可
    的頭像 發表于 07-16 09:40 ?444次閱讀
    鋁鑄件去<b class='flag-5'>毛刺</b>加工,用SycoTec浮動去<b class='flag-5'>毛刺</b>主軸

    存儲示波器的存儲深度對信號分析有什么影響?

    信號(如電源毛刺、EMI干擾) 需求:高采樣率(≥5倍信號頻率) + 大存儲深度(≥10Mpts分段存儲)。 優化:啟用外部觸發或增加分段存儲段數。 2. 使用高級存儲功能 分段存儲
    發表于 05-27 14:39

    行業首創:基于深度學習視覺平臺的AI驅動輪胎檢測自動化

    全球領先的輪胎制造商 NEXEN TIRE 在其輪胎生產檢測過程中使用了基于友思特伙伴Neurocle開發的AI深度學習視覺平臺,實現缺陷檢測率高達99.96%,是該行業首個使用AI平臺
    的頭像 發表于 03-19 16:51 ?1008次閱讀
    行業首創:基于<b class='flag-5'>深度</b><b class='flag-5'>學習</b>視覺<b class='flag-5'>平臺</b>的AI驅動輪胎檢測自動化

    如何排除深度學習工作臺上量化OpenVINO?的特定層?

    無法確定如何排除要在深度學習工作臺上量化OpenVINO?特定層
    發表于 03-06 07:31