作者:鹿尤
背景
隨著移動網際網路的快速發展,人工智慧在移動端上的應用越來越廣泛,端智慧在影像識別、視訊檢測、資料計算等核心場景發揮著重要作用。眾所周知,Python 是演算法進行端智慧研發的首選語言,目前阿里巴巴內已經建立了端智慧的研發生態,包含 Python 虛擬機器,系列的資料/視覺等執行時 Python 擴充套件庫、Python 任務排程庫,以及配套的任務釋出系統等等。
端智慧的主要場景在資料計算、視覺內容理解這兩個領域,如果演算法研發完全在 PC 端的會簡單的多,因為 PC 環境對於 Python 的研發有官方天然的支援,但在移動端上,進行演算法的部署、除錯、驗證,仍處在“刀耕火種”的時代,目前演算法主要通過兩種途徑:
- 日誌除錯:完全脫離執行時程式碼,通過在程式碼中插入日誌,驗證程式的執行邏輯和結果。
- PC 模型端側環境:為了能夠進行程式碼的斷點除錯,在 PC 側搭建和安裝端側 Python 程式碼依賴的所有庫,讓 Python 程式能獨立地執行和在和除錯在 PC 端通用 IDE(如 PyCharm )上,資料輸入則使用 Mock 的方式。
通過打日誌當然也能驗證結果和定位問題,但一旦工程稍微複雜點,生產效率會非常低;而脫離移動端環境,在 PC 側獨立執行,並不能反應真實的執行環境(實時資料、執行效能等),無法保證 PC 和端側資料的一致性。
上面兩種研發方式的主要問題是脫離了程式碼當前的執行環境,因而會產生除錯資訊的缺失。我們知道,每一種語言在開發者之間的流行都離不開配套的 IDE 除錯工具,就像可以使用 Xcode 除錯手機應用的 OC 程式碼一樣,我們需要一種能真正進行端智慧演算法在端側部署和除錯的工具和方案,來提高 AI 研發生產效率。
MNN 工作臺
MNN 是阿里巴巴開源的一個輕量級深度學習端側推理引擎,核心解決深度神經網路模型在端側推理執行問題,涵蓋深度神經網路模型的優化、轉換和推理。
開源地址:https://github.com/alibaba/MNN
除 MNN 引擎建設外,MNN 團隊還深度參與了阿里內部的端AI應用實踐。AI 應用門檻高、演算法模型部署鏈路長是長期困擾我們的問題。為了解決這兩個問題,我們將上百次實踐中長期積累的方案沉澱為一站式 AI 研發正規化 —— MNN 工作臺。(www.mnn.zone 下載 MNN 工作臺)
MNN 工作臺提供了端 AI 的研發正規化,同時它也是一個對移動端 Python 的通用除錯編輯器,工作臺不僅包含標準的端側 Python 除錯能力,還覆蓋了阿里集團內端智慧演算法常用的研發部署場景,是演算法研發的效率工具。
工作臺提供了 VSCode 風格的 Python 整合開發環境,它的使用過程很簡單,一般分為三步:
- 建立連線:應用通過掃描工作臺上的二維碼,建立區域網內手機和PC的連線
- 程式碼推送:工作臺上的工程通過區域網推送到端側應用中
- 執行:端側應用觸發執行端側 Python 程式碼,如果設定了斷點,就可以進行端側程式碼的除錯了
[]()
端計算研發
MNN 工作臺同樣為阿里內重要的端智慧場景 - 端計算的研發提供了高效的本地除錯部署方案,覆蓋了 Walle/Jarvis、CV 這幾個主要的端計算場景。
研發流程
在此之前,端計算的研發是依賴於平臺釋出的,在開發階段將除錯日誌加到程式碼中,通過預發/beta釋出到平臺,然後再掃碼連線到平臺將日誌輸出,通過日誌來定位和分析問題,以此往復。這種方式相對比較原始,開發除錯周期也比較長,一次修改或驗證就是一輪上傳發布的操作,而且除錯資訊只有日誌,整體開發效率比較低。
上圖為演算法使用工作臺進行端計算研發的一般過程:
- 新建端計算工程,或開啟從平臺 clone 的端計算工程
- 應用掃碼連線工作臺,此時工作臺中會實時輸出演算法的日誌
- 在工作臺 IDE 環境中開發程式碼,修改配置,新增資源
- 執行任務,此時任務會通過本地推送部署到端上。線上/預發環境都可以,任何程式碼都不會影響到線上,無需擔心穩定性問題
- 程式碼斷點除錯、檢視堆疊、變數等
- 工作臺本地測試通過後,提交程式碼,再進行後續的平臺釋出操作
工作臺有效解決了演算法在開發階段的除錯部署問題,它的主要優勢在於:
- 本地部署,開發階段可以完全脫離平臺
- 支援端計算工程的實時 Python 除錯
- 端上部署不受預發/線上環境,或視窗期的限制
- 實時檢視端側演算法的執行效能
持久化除錯
端計算任務的觸發一般都是 UT,也有工程主動呼叫的,不管觸發方式如何,程式碼只要推送一次,後面每次觸發都會執行除錯,除非程式碼有修改才需要重新推送,這就是工作臺的持久化除錯能力。
實時日誌
工作臺支援各種型別日誌的實時列印,在裝置與工作臺連線成功後就可以開始使用,支援的日誌型別包含:
- Current Task:本工程日誌,包含本工程普通 print 日誌和工程的執行日誌
- Python:應用中所有的 Python 日誌
- C:通過端計算提供的 C 介面列印的日誌
- OC/Java:通過端計算中 Java/OC 介面列印的日誌
端檔案瀏覽器
端計算研發中,經常需要檢視或處理裝置的本地檔案,如資料庫檔案、深度學習模型、資源圖片、指令碼等等。工作臺中提供了視覺化的裝置檔案瀏覽器,iOS 裝置上可以檢視應用的沙盒目錄,Android 裝置上的瀏覽和 Android Studio 一樣,同時支援常用的目錄/檔案的本地儲存和路徑拷貝。
依賴二方庫聯調
有時演算法需要去檢視依賴庫程式碼的執行情況,工作臺同樣能支援依賴 Python 二方庫的研發,本地部署時會將演算法指定的依賴庫和工程一起推送到端上,除錯的時候也能斷點到庫程式碼中。
上圖展示了一個 Jarvis 工程依賴 Jarvis 基礎庫中的程式碼進行聯調的過程,log.log 為 Jarvis 基礎庫中的列印方法。依賴二方庫聯調隻影響到本工程,對其他工程不會產生任何影響。
視覺內容理解研發
Walle/Jarvis 都屬於端計算的資料場景,除此之外很大一部分演算法處理的都是視訊、圖片,最常見的是攝像頭/視訊流輸入、記憶體中的圖片,典型的演算法如影像分類、目標檢測等,他們都是演算法在計算機視覺(CV,Computer Vision)場景中的具體應用,簡稱視覺演算法。
CV 部署方式
端計算框架為資料演算法提供了豐富了 Python 執行時擴充套件庫,演算法可以基於這些庫開發各種 Python 計算任務,然後部署在端上執行。而針對視覺場景,圖片和視訊流的處理一般都涉及到計算機視覺庫 OpenCV 以及函式計算庫 Numpy,之前的端側 Python 執行時庫中並不包含,所以演算法在 PC 上使用 Python 開發的視覺演算法並不能直接執行在端上,所以一般都是使用 SDK 整合的部署方式:
演算法使用 Python 在 PC 環境開發,通常都會基於 OpenCV/Numpy 等基礎庫,移植到端上時,雖然端上這些基礎還未支援,但可以通過一些方式轉換為類似的 C/C++ 實現,如格式轉換使用 MNN CV 替換 OpenCV 的實現,同時也要針對端側的執行環境做一些效能優化。後面藍色的部分都需要工程同學深度參與,封裝 Android/iOS 上的 SDK,然後搭建本地的 Demo 應用驗證,再整合到應用中。
其主要缺點在於:
- 視覺演算法需要針對端側部分重新實現和優化,成本較高
- 演算法嚴重依賴工程協作,工程維護SDK的成本也比較大(以演算法為核心的SDK)
- 演算法的測試驗證需要讓工程開發App Demo,且演算法一般不能直接在手淘等應用環境中測試演算法程式碼
- 釋出後一旦出現缺陷,無論是演算法還是工程問題,迭代週期依賴應用的版本計劃,一般超過1周
MNNKit 就是視覺演算法最典型的 SDK 整合方式。
以往視覺演算法的部署只能通過演算法 C/C++ 的形式整合到應用,不過目前端側執行時已經建設完善了CV 執行時能力(OpenCV/Numpy/MNN/MNNRuntime),這樣視覺演算法就可以像一個普通 Walle 任務一樣,通過工作臺或釋出平臺動態地部署到端上,典型的業務如貓客中的白屏檢測,淘寶直播中的智慧看點等,都是通過這種方式部署的。
通過執行時部署 CV 演算法的主要優勢在於:
- 演算法可以自己搭建視覺驗證 Playground Demo(見下文三端一體)
- 和普通端計算任務一樣,CV 演算法使用 Python 開發,動態釋出,迭代週期短
- 可以使用工作臺本地部署,在應用中除錯演算法,預發/線上環境都可以
CV 研發流程
上圖為使用工作臺進行 CV 演算法研發的完整過程,演算法初步產出後,會經歷三個研發測試階段:
- 單元測試:演算法在獨立 Demo 中驗證視覺效果的正確性;
- 預整合測試:演算法在目標應用中和關聯業務一起進行本地測試,因為演算法還未使用平臺部署方式,所以稱為預整合測試;
- 整合測試:演算法通過平臺部署,預發回歸測試,然後線上灰度/正式釋出;
演算法在上線前在平臺進行整合測試,而單元測試和預整合測試都可以在工作臺環境中進行。
三端一體
與端計算資料演算法有所不同的是,新開發的 CV 模型,一般都會先在本地進行效果驗證,它是獨立於整合的應用的,就相當於在 Demo 中的單元測試。比如你開發了一個影像演算法,如目標檢測,你想在端上看一下檢測的結果對不對,定位的座標準不準,那你就需要一個 Android/iOS 的應用,把模型和程式碼整合進去,然後再去開發上層程式碼(典型的如 MNNKit Demo)。作為演算法並不瞭解 Android/iOS 開發,往往需要工程同學協助,協同成本較高。
有沒有一種方式能讓演算法脫離工程,自己去寫一個Android/iOS 上的 Playground 驗證應用呢?
- 跨平臺效果除錯庫 DebugUI
MNN工作臺針對演算法在模型效果驗證中的痛點,提供了“三端一體”的解決方案。簡單來說,我們提供了一套跨平臺效果除錯的 Python 擴充套件庫 - DebugUI,演算法可以使用 DebugUI 的 Python API,快速搭建一個視覺驗證應用,並且能在一端編寫,三端執行。
DebugUI 擴充套件庫抽象和提取了視覺效果驗證的核心鏈路,為演算法提供了了精簡又實用的 Python 介面,覆蓋了目前視覺演算法實際的驗證場景:
- 輸入模式:一般資料來源只有圖片和視訊
- 互動元件:用於簡單的控制,比如可以通過滑塊調整閾值,通過選擇器切換使用的模型,通過開關開啟/關閉某個功能,等等
- 渲染元件:用於展示結果,比如分類得分值可以用文字渲染,人臉點位可以使用關鍵點渲染,人像分割可以用影像渲染,等等
- 資料回撥:攝像頭、相簿選擇,互動元件的事件,均會產生資料回撥交給演算法處理
- 環境變數:演算法可以獲取工程設定的變數,比如某個本地檔案路徑,等等
工作臺模型市場內建了常用的一些開箱即用演算法,如漫畫臉、人臉檢測、OCR、人像分割、卡通風格等等,它們都是演算法使用 DebugUI 搭建的 Playground 示例應用。上圖中展示的就是人臉檢測演算法的Playground示例,在 Mac、Android、iOS 上執行都能得到相同的檢測結果,這就是“一端編寫,三端執行”。
- Playground 程式碼除錯
使用 DebugUI 搭建的 Playground 同樣支援 Python 程式碼的斷點除錯,這對於演算法在模型單元測試階段的開發是很有幫助。
CV 演算法除錯
使用三端一體快速搭建視覺 Playground 應用驗證演算法效果後,接下來就是將演算法模組通過工作臺本地部署到整合應用(如手淘)中,應用環境會包含業務模組的主動呼叫觸發演算法,這樣就可以在整合應用中進行演算法除錯了,這個就是預整合測試的階段。
演算法通過工作臺本地除錯通過後,在平臺進行預發/beta的釋出測試,這個就是走平臺部署的方式了,只不過是在應用的預發環境部署,這就是整合測試階段。整合測試通過之後,演算法正式釋出上線。
如圖示例淘寶直播在預整合測試階段,使用工作臺進行 CV 演算法的本地部署,工程主動呼叫演算法的初始化、攝像頭每隔幾秒執行推理,都會觸發進入到對應方法的除錯斷點,這樣就可以方便的在應用中除錯 CV 演算法了。
效能評測
演算法經常需要評測程式碼的執行效能以針對性的進行優化,尤其是對於 CV 實時演算法。MNN工作臺提供了端上 Python 程式碼執行實時的效能顯示,通過“profile”方式執行 Python 工程,可以看到程式碼的執行路徑,以及路徑中每一行程式碼的執行時間和次數。這對於在實際應用環境中評測演算法的執行效能,分析效能優化的瓶頸很有幫助
[]()
如圖示例了淘寶直播中使用 profile 來評測 CV 演算法的效能,執行時間和次數會實時地顯示在對應的程式碼行。profile 適用於所有能通過工作臺部署的 Python 工程,Walle、Jarvis、CV、Playground 等工程都可以進行效能評測。後續我們會在效能評測中加入更多的端側實時資訊,如記憶體、CPU 佔用等,幫助演算法更好的分析程式碼效能。
結語
端智慧的研發過程中,演算法的開發只是一小部分,大部分工作其實都在演算法之外,MNN 工作臺不僅降低了普通開發者的 AI 研發的門檻,同時也是演算法研發的提效工具,它有效解決了端 Python 的開發部署困難,讓演算法可以脫離工程自己搭建 Demo 應用,也支援了阿里集團內主要的端智慧的研發場景,這樣演算法同學可以更加專注於演算法本身的開發,從而提高 AI 的研發生產效率。
我們招聘啦!
歡迎加入阿里巴巴淘系技術部-端智慧團隊,負責構建行業領先的開源推理引擎 MNN 以及一站式機器學習軟體-MNN 工作臺,在阿里我們負責核心電商的 AR 平臺及新形式的商品導航,同時還有應用規模巨大的端雲協同的搜尋推薦、使用者觸達、直播內容理解等創新應用及系統。
招聘崗位:
演算法類:CV/CG/推薦/搜尋/機器學習/模型壓縮
工程類:iOS/Android/Java服務端/C++/端上高效能運算
簡歷投至方式
關注我們,每週 3 篇移動技術實踐&乾貨給你思考!