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