近年來,隨著移動端設備軟硬件能力的進步,移動端的算力有了很大提升,同時面向移動端的機器學習框架和模型輕量化技術越來越成熟,端上的AI能力逐漸進入大眾視野,端智能在電商領域也開始逐步走向規模化應用。通過持續探索,京東零售技數中心團隊創新突破了端側高性能推理引擎、端側模型分發、異構環境及復雜任務兼容等技術卡點,完成了多個業務應用和落地,并獲得信通院邊緣計算產業全景圖行業認證。目前,京東眾多業務已集成至端智能SDK,流量分發、圖像識別等算法場景運行情況良好,日推理計算量已經達數億次,為用戶帶來了更好的購物體驗。
1、什么是端智能
目前,大多數的模型服務主要基于云服務端進行計算。模型的訓練和推理都在云端,使用時移動端用戶通過向云服務器發送請求,包含用戶的原始數據。云服務器在接收到請求后,進行數據預處理和推理計算等操作,并將結果返回給移動端用戶。云服務器承擔了幾乎所有的計算負載,而移動端僅作為用戶交互的界面。所以云端智能面臨著一些瓶頸,包括高延遲、高成本,以及隱私安全風險。
為了打破云端智能的瓶頸,端智能應運而生。端智能技術是將模型推理計算過程遷移至移動端,供移動端直接調用。使用時用戶在端上觸發推理計算,將原始數據給到模型進行特征加工和推理計算,最后將結果返回給用戶。相比云端智能,端智能有三大優勢:
?實時性高:端上實時響應用戶請求,為用戶提供實時AI反饋,提升用戶體驗;
?隱私合規性強:端上數據端上消費,無需上傳云端,隱私合規性強;
?具備離線服務能力:推理服務無需請求云端,在無網或者弱網環境下也可以使用;
2、問題與挑戰
受限于移動端設備的性能和多樣性,在移動端設備上部署端智能并非易事,在端智能開發過程中,遇到了各種挑戰,這些挑戰會一直伴隨著端智能開發過程,需要一直去優化解決,才能將端智能的體驗做到極致。
- 計算性能
由于使用移動設備的計算資源有限,要兼顧用戶體驗與計算效率的平衡,需要針對移動端設備 的CPU/GPU使用率、內存使用率、耗電量、數據獲取、任務調度等影響推理耗時的問題進行持續優化。
- 靈活性
業務算法模型確定后,其輸入輸出就得遵循固定的格式。不同端智能應用場景需要的模型和特征數據處理格式存在著較大的差異,如果想調整就需要改客戶端邏輯,功能驗證和迭代效率受到極大的限制。如何在不發版的情況下解決不同業務場景需求,也是需要優先解決的問題。
- 穩定性
端智能需要在客戶端進行數據的收集、存儲、處理,推理任務的管理與調度,推理引擎和操作系統的兼容等處理,這些環節均可能引起APP的崩潰。作為一家客戶為先的公司,因為端智能的不穩定性導致影響用戶體驗,這是不被允許的,如何在復雜的端上環境做到零崩潰是非常大的挑戰。
- 安全性
端上存在大量的數據,端智能的數據處理邏輯和推理邏輯都是在端上進行,防止數據泄露、數據篡改、保證數據的隱私合規是非常重要的。
3、京東端智能系統架構
京東零售端智能系統整體系統架構設計如下:
京東端智能系統架構遵循通用性和可規模化應用的設計原則,主要為云-邊-端三層,分別對應著算法模型的生產、部署和執行三個環節。
云對應的是由京東零售-技術研發與數據中心研發的九數算法中臺,負責模型訓練、模型編譯、模型調試。端智能模型生產和訓練在云端進行,在九數算法中臺訓練好模型后,需要對模型進行裁剪和壓縮,實現模型的輕量化,再對輕量化的模型進行編譯轉換,以生成在端上可執行的模型文件。
邊對應的是由京東零售-技術研發與數據中心研發的端智能平臺,負責模型的管理和模型部署分發。端智能管理平臺提供了業務接入、模型管理、配置管理、模型部署、模型分發等一系列的框架能力。端智能平臺模型支持A/B Test,以驗證算法策略的效果;同時支持分級部署,針對不同機型部署不同的算法模型。
端對應端智能SDK,負責端上用戶行為感知、數據加工,以及推理任務的調度和計算。端智能SDK包含數據管道和基礎容器兩部分,數據管道負責端上用戶行為感知、數據加工、數據存儲和數據上報,為端智能推理提供原始數據和特征數據,基礎容器為端智能算法模型提供了端上的運行環境,支持不同推理任務并行處理,讓端上推理計算高效地運轉起來。
4、主要工作
4.1超實時端數據流處理
數據存儲
端上的數據存儲高性能移動端數據庫,支持數據加密,支持并發數據讀寫,滿足端上數據的安全要求和高頻數據讀寫。
端上數據的存儲和獲取作為推理計算的前置環節,如果耗時偏高必然會增加整個端智能推理的耗時。為了最大提升數據庫的性能,前置了數據庫路由,根據數據類型,需要加密的數據會存儲到加密數據庫,不需要加密的數據會存儲到非加密數據庫,數據庫設計上采用單庫單表的設計模型,可以減少單個數據庫文件的大小,降低文件鎖的競爭概率,提高并發性能。同時引入了數據庫的自管理機制,長時間不被使用的舊數據會被刪除,降低數據庫存儲量,提升數據庫的讀寫性能。
數據處理
端上用戶的原始行為通常不能直接作為模型輸入進行計算,京東搭建了一套數據流框架,用來進行模型特征生產和特征計算。端側模型用到的數據源大致可分為3類:云端下發、端側批量存儲數據、端側實時行為感知。云端下發是通過請求后端服務獲取到的,通常會在云端處理好,APP內無需額外的處理,可以直接使用。端側批量存儲數據指對不會實時發生變化的數據進行定期存儲更新,端側實時行為感知指用戶在使用APP過程中的實時行為,經過加工處理后再進入模型計算。
端側批量存儲數據采用非實時批量處理模式,使用數據庫SQL能力進行粗粒度加工,也可以在Python腳本中執行個性化處理邏輯。端側實時行為感知采用實時計算的模式,實時對用戶行為進行過濾、規則匹配、關聯聚合等操作,生產為模型輸入需要的特征數據。生產好的特征會再進一步經過特征計算,包括離散特征編碼、連續特征歸一化等操作,計算好的特征即可輸入模型進行推理計算。
4.2高效端事件觸發和調度
基礎容器為端智能提供輕量化、高性能的執行環境,同時支持模型頻繁的實驗和部署,支持端智能在不同設備上高效運行。當算法模型下發到移動端設備后,觸發推理計算有兩種方式:API觸發和事件觸發。
API觸發: 算法工程師通過調用端智能提供的推理觸發API進行觸發,調用方式如代碼示例如下。API使用Router協議,使用時傳入systemCode和businessCode業務標識,支持自定義輸入數據,在回調方法中獲取推理計算結果。
JDRouter.to("JDEdgeAI", "infer").putString("systemCode", "xxx").putString("businessCode", "xxx").extraObject("extData",HashMap).callBackListener(new CallBackWithReturnListener() {@Overridepublic void onComplete(Object value) {android.util.Log.d(TAG, "onCompleteWithValue " + value.toString());}@Overridepublic void onComplete() {android.util.Log.d(TAG, "onComplete");}@Overridepublic void onError(int errorCode) {android.util.Log.d(TAG, "onError errorCode = " + errorCode);}}).jump(this.getContext());
事件觸發: 算法工程師可以在算法模型資源包中配置需要觸發推理計算的埋點事件ID,當基礎容器監測到有對應的埋點事件時,則會觸發推理計算執行。基礎容器中的功能均已任務化,事件觸發的方式不僅可以觸發模型推理,也可以觸發特征數據計算、模型預加載等操作。觸發配置如下所示,taskName是任務類型,events是任務觸發的事件。
{"triggers": [{"taskName": "InferTask","events": [{"type": "mta","pageId": "JD_XXXX","needPv": false,"clickIds": ["JD_XXXX",]}]},{"taskName": "CalcTask","events": [{"type": "mta","pageId": "JD_XXXX","needPv": false,"clickIds": ["JD_XXXX","JD_XXXX"]}]}]
}
觸發器每觸發一次即創建一個任務,基礎容器內部的任務調度模塊會對任務進行統一的編排與處理。一次推理過程會產生多個任務,每個任務都包含唯一ID、前置依賴、任務優先級、后置依賴等屬性。
為了高效執行任務,降低推理計算耗時,京東采用多任務隊列,按任務優先級并行執行的策略。基礎容器內部預置了三個任務隊列,分別核心任務隊列、常規任務隊列、低優任務隊列,按照任務類型分別放入對應的任務隊列中,每個任務隊列都有自己的執行線程,執行線程會輪詢執行任務隊列中的任務,直到產生推理計算結果,本次推理任務鏈路結束。
為了使任務調度執行頻率更高,執行速度更快,京東支持了多種能力:
?高并發: 支持多任務并發、多線程調度的任務管理模式;
?優先調度: 支持設置任務優先級,保證高優任務優先執行;
?熔斷保護: 對于連續 N 次運行失敗或者崩潰,會暫時阻止其運行;
?防卡死: 推理鏈路某環節超時,會立即停止當前任務。
基礎容器為每一個任務提供獨立的運行環境,并通過對外提供API來進行模型推理等。基礎容器還對推理流程和任務鏈路進行了高度的抽象,最大程度上的滿足了不同算法場景的使用需求。
4.3高兼容性PythonVM端計算容器
為了在端側APP滿足算法模型快速迭代的需求,同時降低算法工程師參與APP移動端開發的門檻,我們上線了Python VM的計算容器。Python VM容器提供了一定的動態執行的能力,在不依賴APP發版的情況下,可以隨時更新由Python編寫的AI算法服務邏輯,調整業務策略,優化業務效果。
選用Python語言主要考量其與AI技術棧的契合,Python是算法工程師最熟悉和熟練使用的語言。算法工程師在訓練好模型以后,將整個模型服務邏輯通過Python腳本部署在APP中,無需使用JAVA、Object-C等APP開發語言,顯著提升算法開發效率。此外,Python VM與原生APP開發環境解耦的方式,使得我們可以在安卓、iOS雙端使用同一套方案,無需分別兼容和適配。將Python VM集成至APP中,我們針對性地解決了以下3個問題:
?包體積縮減:只保留了Python核心執行器功能,非核心的三方庫也做了裁剪,編譯功能前置至云端完成,移動端直接執行字節碼;
?字節碼加密:對動態下發的字節碼采用自定義加密,防止下發過程中被篡改,保障安全;
?線程級并行:移除GIL鎖的限制,在APP單進程環境內,使用多個線程并行執行多個任務。
4.4高性能端推理引擎
AI模型對計算和存儲資源都有較高的要求,因此,高性能推理引擎是AI模型能在手機側運行的核心要素。端側推理引擎的架構與云側推理框架整體類似,包括計算圖、算子的抽象等。但由于移動端資源受限,一方面對引擎包體積有一定約束,端側推理引擎的算子種類需要盡量收斂,實現原子算子,通過原子算子組合出高階功能算子。另一方面,移動端設備硬件差異性較大,CPU、GPU、NPU都包含多種型號,推理引擎需要兼容各類設備。在這些通用能力之外,為了保障復雜模型性能,我們重點優化了以下2個維度:
?算子內核:針對熱點算子及部分算子的低精度實現,定向分析性能瓶頸,利用向量化指令優化內核實現,提升算子性能。
?多硬件混合調度:將模型計算圖拆分為多個子圖,不同子圖可拆分至CPU、GPU、NPU多種硬件分別執行,建模尋優最佳拆圖方案,充分挖掘利用所有硬件的算力;
此外,為了支持原生APP之外的場景,例如H5頁面、小程序等場景,我們還拓展了JavaScript版本的推理引擎。JavaScript引擎提供與原生APP一致的計算接口,在JS環境中自閉環使用,是一套更為輕量和靈活的解決方案。
5、業務實踐
端智能技術目前已經在京東流量分發、圖像識別等多種算法業務場景落地。
流量分發:通過用戶實時瀏覽行為,理解用戶意圖,增強實時商品分發效果,提升用戶購物體驗。
圖像識別:端上實時識別用戶拍攝圖片的合規性,降低算法計算延時,提升實時識別效果。
由于數據與模型的計算均發生在端上,不依賴網絡,沒有網絡延遲。因此端智能相比云端智能的耗時有顯著的降低,推理效率有數十倍的提升。通過實踐發現對于實時性要求高,計算相對簡單的場景適合端上執行。
6、總結與展望
端智能建設過程圍繞計算性能、靈活性、穩定性、安全性展開,動態預加載、任務調度、高性能數據存取提升了推理鏈路性能,模型動態下發、策略配置、數據動態處理為端智能業務開發帶來充足的靈活性,異常監控、控制開關、兼容處理保證了端智能在線上運行的穩定性,加密傳輸,隱私合規為端智能提供了安全性保障。目前,京東眾多業務已集成至端智能SDK,流量分發、圖像識別等算法場景運行情況良好,日推理計算量已經達數億次,為用戶帶來了更好的購物體驗。
端智能的出現,彌補了云端智能在網絡延時、數據豐富、隱私安全、算力成本方面的不足,但是端智能與云智能本身就不是割裂的技術體系,而是相輔相成的,未來端上模型可以作為云端模型的子模型進行前置推理,端上運行小模型,云端運行大模型,更好地提升推理效果和速度。
端智能未來的建設方向:
?平臺能力建設: 隨著算法場景復雜性的增加,開發效率將受到影響。端智能團隊將通過平臺能力建設,提供開發、調試工具,提升算法工程師的模型開發、上線效率。
?多端場景覆蓋: 京東中存在大量的H5、小程序等場景,端智能后續將在多端進行落地,算法能力將覆蓋移動端全場景。
?算法場景擴展: 端智能團隊致力于在端上覆蓋流量分發、CV、NLP等多算法場景,將更多云端算法模型遷移至移動端前置計算。
作者:京東零售技數中心
來源:京東零售技術 轉載請注明來源
更多年度盤點文章
亞洲唯一!京東榮獲2024年度Gartner供應鏈技術創新獎背后的創新探索
萬字干貨-京東零售數據資產能力升級與實踐
2023京東零售技術年度盤點