滴滴開源了一個(gè)終端側(cè) AI 集成運(yùn)行時(shí)環(huán)境(IRE)—— AoE(AI on Edge)。AoE 以 “穩(wěn)定性、易用性、安全性” 為設(shè)計(jì)原則,可以幫助開發(fā)者將不同框架的深度學(xué)習(xí)算法輕松部署到終端高效執(zhí)行。
滴滴之所以要做這樣一個(gè)運(yùn)行時(shí)框架,原因有兩個(gè):
一是隨著人工智能技術(shù)快速發(fā)展,這兩年涌現(xiàn)出了許多運(yùn)行在終端的推理框架,在給開發(fā)者帶來更多選擇的同時(shí),也增加了將 AI 布署到終端的成本;
二是通過推理框架直接接入 AI 的流程比較繁瑣,涉及到動(dòng)態(tài)庫接入、資源加載、前處理、后處理、資源釋放、模型升級(jí),以及如何保障穩(wěn)定性等問題。
根據(jù)介紹,當(dāng)前有以下 8 種終端運(yùn)行的主流推理框架:
●從本質(zhì)上來說,無論是什么推理框架,都必然包含初使化、前處理、執(zhí)行推理、后處理、釋放資源這 5 個(gè)處理過程,對(duì)這些推理過程進(jìn)行抽象,是 AoE 支持各種推理框架的基礎(chǔ)。目前 AoE 實(shí)現(xiàn)了對(duì)兩種推理框架 NCNN 和 TensorFlow Lite 的支持。
●具體來說,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ā)完全解耦。
在 AoE SDK 中這一個(gè)抽象是:
●InterpreterComponent:用來處理模型的初使化、執(zhí)行推理和釋放資源。
●Convertor:用來處理模型輸入的前處理和模型輸出的后處理。
InterpreterComponent 具體實(shí)現(xiàn)如下:
Convertor 的具體實(shí)現(xiàn)如下:
AoE 還有另一個(gè)特性是具有穩(wěn)定性保障。眾所周知,Android 平臺(tái)開發(fā)的一個(gè)重要的問題是機(jī)型適配,尤其是包含大量 Native 操作的場景,機(jī)型適配的問題尤其重要,一旦應(yīng)用在某款機(jī)型上面崩潰,造成的體驗(yàn)損害是巨大的。
有數(shù)據(jù)表明,因?yàn)樾阅軉栴},移動(dòng) App 每天流失的活躍用戶占比 5%,這些流失的用戶,6 成的用戶選擇了沉默,不再使用應(yīng)用,3 成用戶改投競品,剩下的用戶會(huì)直接卸載應(yīng)用。因此,對(duì)于一個(gè)用戶群龐大的移動(dòng)應(yīng)用來說,保證任何時(shí)候 App 主流程的可用性是一件最基本、最重要的事。
結(jié)合 AI 推理過程來看,不可避免地,會(huì)有大量的操作發(fā)生在 Native 過程中,不僅僅是推理操作,還有一些前處理和資源回收的操作也比較容易出現(xiàn)兼容問題。為此,AoE 運(yùn)行時(shí)環(huán)境 SDK 為 Android 平臺(tái)上開發(fā)了獨(dú)立進(jìn)程的機(jī)制,讓 Native 操作運(yùn)行在獨(dú)立進(jìn)程中,同時(shí)保證了推理的穩(wěn)定性(偶然性的崩潰不會(huì)影響后續(xù)的推理操作)和主進(jìn)程的穩(wěn)定性(主進(jìn)程任何時(shí)候不會(huì)崩潰)。
具體實(shí)現(xiàn)過程主要有三個(gè)部分:注冊獨(dú)立進(jìn)程、異常重新綁定進(jìn)程以及跨進(jìn)程通信優(yōu)化。
第一個(gè)部分,注冊獨(dú)立進(jìn)程,在 Manifest 中增加一個(gè) RemoteService 組件,代碼如下:
第二個(gè)部分,異常重新綁定獨(dú)立進(jìn)程,在推理時(shí),如果發(fā)現(xiàn) RemoteService 終止了,執(zhí)行 “bindService()” 方法,重新啟動(dòng) RemoteService。
第三個(gè)部分,跨進(jìn)程通信優(yōu)化,因?yàn)楠?dú)立進(jìn)程,必然涉及到跨進(jìn)程通信,在跨進(jìn)程通信里最大的問題是耗時(shí)損失,這里,有兩個(gè)因素造成了耗時(shí)損失:
●傳輸耗時(shí)
●序列化/反序列化耗時(shí)
相比較使用 binder 機(jī)制的傳輸耗時(shí),序列化/反序列化占了整個(gè)通信耗時(shí)的 90%。由此可見,對(duì)序列化/反序列化的優(yōu)化是跨進(jìn)程通信優(yōu)化的重點(diǎn)。對(duì)比了當(dāng)下主流的序列化/反序列化工具,最終 AoE 集成運(yùn)行環(huán)境使用了 kryo 庫進(jìn)行序列化/反序列。以下是對(duì)比結(jié)果,數(shù)據(jù)參考《各種 Java 的序列化庫的性能比較測試結(jié)果》。
目前 AoE SDK 已經(jīng)在滴滴銀行卡 OCR 上應(yīng)用使用,想更加清晰地理解 AoE 和推理框架、宿主 App 的關(guān)系,可以通過下面的業(yè)務(wù)集成示意圖來了解它:
已經(jīng)開源的運(yùn)行時(shí)環(huán)境 SDK 包括 Android 和 iOS 平臺(tái),此外 Linux 平臺(tái)運(yùn)行時(shí)環(huán)境 SDK 正在緊鑼密鼓地開發(fā)中,預(yù)計(jì)在 9 月底也會(huì)釋出。