黑科技:AoE-如何管理好模型?
前言
越來越多的業(yè)務(wù)會用到AI相關(guān)的技術(shù),大多數(shù)的AI模型是部署在云端使用的,畢竟服務(wù)端計算更快,管理也更容易。隨著終端設(shè)備性能提升,在終端使用 AI 模型有了更大的價值,可以更好滿足業(yè)務(wù)對響應(yīng)實(shí)時性、數(shù)據(jù)隱私性的需求。滴滴出行的銀行卡識別功能也打算部署在客戶端,但是遇到的問題也不少:
1.模型升級困難,模型在終端的存在一般都是已應(yīng)用軟件為載體,用戶可以選擇是否對應(yīng)用軟件進(jìn)行更新,導(dǎo)致模型版本會產(chǎn)生分化。
2.硬件適配問題,不同的終端設(shè)備因?yàn)閺S商深度定制因素,會出現(xiàn)一些兼容問題
3.不同模型運(yùn)行框架不同,對于客戶端工程師不夠友好。
針對這些問題滴滴的終端智能團(tuán)隊(duì)推出了AoE作為解決方案,設(shè)計之初就將多模型管理支持可能升級、多框架支持、模型加密等功能定為基礎(chǔ)設(shè)施。
AoE是怎么做好模型管理的
我們針對遇到的問題,主要做了3部分工作:
- 嘗試了多機(jī)型覆蓋測試做好模型的驗(yàn)證
- 利用運(yùn)行環(huán)境配制化來實(shí)現(xiàn)加載模型
- 通過動態(tài)更新來升級模型
下面針對這三項(xiàng)分別進(jìn)行介紹。
運(yùn)行環(huán)境配置化
AoE SDK將推理框架總結(jié)了5個過程,它們分別是初始化、前處理、執(zhí)行推理、后處理、釋放資源。對 AoE 集成運(yùn)行環(huán)境來說,最基本的便是抽象推理操作,通過 依賴倒置 的設(shè)計,使得業(yè)務(wù)只依賴AoE的上層抽象,而不用關(guān)心具體推理框架的接入實(shí)現(xiàn)。這種設(shè)計帶來的最大的好處是開發(fā)者隨時可以添加新的推理框架,而不用修改框架實(shí)現(xiàn),做到了業(yè)務(wù)開發(fā)和 AoE SDK 開發(fā)完全解耦。
用戶只需要簡單的描述json文件即可完成對運(yùn)行環(huán)境的配置,簡化了用戶的使用過程,更為簡潔高效。
簡單的配置如下:
- {
- "version": "1.0.0", // 版本號
- "tag": "tag_mnist", // 區(qū)分業(yè)務(wù)場景
- "runtime": "tensorflow", // runtime類型
- "source": "installed", // 安裝源
- "modelDir": "mnist", // 所在文件夾
- "modelName": "mnist_cnn_keras", // 模型文件名
- "updateURL": "https://www.didiglobal.com" // 升級配置鏈接
- }
機(jī)型覆蓋測試
針對硬件差異的問題,我們在做模型驗(yàn)證期間嘗試了多機(jī)型的覆蓋測試,將模型在不同機(jī)型上的表現(xiàn)都記錄下來反饋給模型生產(chǎn)團(tuán)隊(duì),幫助模型不斷的升級修復(fù)。
截取了部分測試時產(chǎn)生的耗時對比數(shù)據(jù)大致如下:
雖然模型不相同,使用指令可能不同,但是大致也可以了解到機(jī)器的性能,具體數(shù)值僅供參考。在這個過程中,沉淀下來了benchmark工具來幫助驗(yàn)證多機(jī)型的覆蓋測試,將來這個工具也會是開源的一部分來幫助大家驗(yàn)證模型的可用性,以及建立有效的機(jī)型比較。
動態(tài)更新
AoE的模型管理模塊將模型按分發(fā)方式分為兩種:
- 本地模型,意為應(yīng)用軟件自帶的模型
- 遠(yuǎn)程模型,則是通過策略配置,從服務(wù)器下載匹配模型到本地的模型
本地模型與遠(yuǎn)程模型最大的區(qū)別就是本地模型無法更改,只能跟隨應(yīng)用軟件一起更新,而遠(yuǎn)程模型則是通過和本地模型作比較后更新的較新模型,模型與模型之間通過版本做比較。本地模型與遠(yuǎn)程模型二者可以共存,也可以單獨(dú)存在,在最新版的滴滴出行中,為了減少包的大小甚至沒有本地模型,所有的模型都是來自遠(yuǎn)端下載。
之所以將模型分成兩部分,是為了保證模型是可用的且可靠的,為什么這么說?一般本地模型都是經(jīng)過長時間測試后才作為穩(wěn)定版本跟隨APP帶到了線上,既可以作為最新版本,又可以作為后來的穩(wěn)定版本:即使發(fā)現(xiàn)后來下載升級的遠(yuǎn)程模型效果不理想也可以通過灰度測試停止遠(yuǎn)程使用遠(yuǎn)程模型的使用,保證模型的高可用性。
遠(yuǎn)程模型的存在使業(yè)務(wù)模型擁有了動態(tài)更新的能力,方便了產(chǎn)品的迭代,不再依賴客戶端的發(fā)布周期。在動態(tài)開關(guān)的寫協(xié)助下,甚至可以做到精確指定模型版本的加載。
整體模型管理的結(jié)構(gòu)如下圖:
模型加載怎么使用?
模型管理器是AoE的一個基礎(chǔ)組件,以iOS為例,組件實(shí)現(xiàn)在Loader目錄下。默認(rèn)支持的模型配置文件為json格式,運(yùn)行環(huán)境配置化部分的代碼就描述了mnist demo的配置。
模型和模型配置文件名的格式配置以及遠(yuǎn)程版本存放地址,都可以通過繼承AoEModelConfig類來做修改,具體的使用方式可以參照squeezenet的實(shí)例
在已經(jīng)開源的版本中,AoE還為大家提供了單功能多模型的支持,拿銀行卡識別來舉例,整個過程分兩步,一是找到卡片以及卡片上的數(shù)字區(qū)域,二是根據(jù)數(shù)字區(qū)域的圖片識別出卡號,所以整個過程需要兩個模型。開源項(xiàng)目使用的模型配置的tag字段主要用來定義模型所屬功能,結(jié)合dir字段,就可以定位到具體的模型。
寫在最后
通過遠(yuǎn)程加載以及多維度的灰度測試配置是幫助模型穩(wěn)定安全運(yùn)行的保證,雖然模型遠(yuǎn)程加載功能還沒有在開源版本上線,但是已經(jīng)安排在了日程中,預(yù)計在9月底就會上線。如果您對這個項(xiàng)目感興趣,如果您在終端AI運(yùn)行環(huán)境方面有想法,如果您在使用時有疑問,誠摯邀請您加入我們。
項(xiàng)目鏈接:https://github.com/didi/AoE