端邊云全場景統一的AI框架的挑戰和解決思路
2020年的最后一天,MindSpore發布了1.1版本,1.1中很重要的特性是構建了端邊云全場景統一的基礎架構:

https://gitee.com/mindspore/mindspore
所以本文重點是剖析全場景統一的AI框架的挑戰和MindSpore的解決思路。
全場景統一AI框架的挑戰
所謂全場景AI,是指可以將深度學習技術快速應用在云邊端不同場景下的硬件設備上,包括云服務器、移動終端以及IoT設備等等,高效運行并能有效協同。
對于框架而言,涉及三大挑戰:快速部署、高效運行、端云協同。
快速部署
如何將訓練好的模型快速地部署到云服務器、移動終端以及各種IoT設備上進行推理甚至增量訓練?
云服務器上推理通常以Service的方式進行部署,訓練好的模型直接通過遠程接口調用(gRPC/REST)推送到云服務器上,用戶調用云推理服務接口進行推理。
對于移動終端和IoT設備,由于硬件資源限制,云側的模型和推理運行框架體積太大,無法直接部署,因此模型的壓縮和運行框架的輕量化成為移動終端和IoT設備上部署的關鍵。
面向移動終端和IoT設備輕量化的挑戰,提供獨立的輕量化的端側AI框架是比較好的解決方案,同時這樣的輕量化框架可能還不止一種形態,比如類似于智能手機這些富終端和類似耳環這些瘦終端面臨的挑戰就不一樣,富終端一般存儲空間還是比較充裕的,有一定的算力;瘦終端的條件則要苛刻的多,底噪要求控制在百K級別,這樣你就不能放一個運行時進去,同時還要考慮給AI開發者一個通用的解決方案。
有了輕量化的端側框架以及好的模型壓縮轉換技術是否就可以實現快速部署的目的?其實還有問題,因為如果我們端側的架構與云側的架構是分離的、實現是不一致的,如模型的IR不同、算子的定義不同、推理的API接口不同,那很可能導致云側訓練的模型無法順利的轉換到端側去執行,云側的推理代碼無法在端側重用。
一般框架的從云側訓練模型到端側部署的流程如下:
這種方式目前存在一些問題:
第一個問題:兩套模型定義很難保持一致,比如云側和端側的算子經常會出現一方缺失的問題,導致模型轉換失敗。
第二個問題:云和端都需要的功能會重復開發,并可能有不一致,比如為了提升推理性能而進行的fusion優化需要端云兩邊都做一遍,數據處理的不一致導致精度問題等。
第三個問題:云側訓練好的模型在端側進行在線訓練需要相對復雜的轉換。
對于分離的端云框架的不一致問題,是否可以通過如ONNX這樣的標準去解決?很難,原因在于,AI產業的快速發展,新的算子類型快速涌現,標準實際上很難跟得上,所以解決的途徑還是應該著落在AI框架上。
高效運行
全場景的高效運行,分解下來就是高效的算子、高效的運行時以及高效的模型,實現異構硬件的最大算力,提升AI算法的運行性能和能效比。
算子的性能,需要從算法和底層指令優化多個層面進行優化。比如卷積,Winograd算法相比于Im2Col+GEMM,在很多經典卷積神經網絡上性能就有很好的性能提升。
但是,并不是所有的場景下Winograd的算法都優于Im2Col+GEMM。在下面的圖中,當shape為224x224x3x64時,Winograd的性能反而有所惡化。因此,在不同條件下選擇最優的算法對性能至關重要。
算法層面的優化,更多的是通過減少運行時的計算次數(乘法)來提升性能,而指令層面的優化則是為了更充分的利用硬件的算力。對于CPU硬件,影響指令執行速度的關鍵因素包括了L1/L2緩存的命中率以及指令的流水,通用的優化方法有:
選擇合理數據排布,如NHWC、NC4HW4等等
寄存器的合理分配,將寄存器按照用途,可以劃分為feature map寄存器、權重寄存器和輸出寄存器,寄存器的合理分配可以減少數據加載的次數。
數據的預存取,通過prefetch/preload等指令,可以提前將數據讀到cache中。
指令重排,盡量減少指令的pipeline stall。
向量化計算,使用SIMD指令,如ARM NEON指令,X86 SSE/AVX指令等。
這些優化需要對硬件架構有深入的了解。
端側運行時的性能主要面臨異構和異步并行的挑戰,從模型角度看,大部分模型在推理的時候看上去是串行執行的,不過如果把算子內部打開,變成細粒度的kernel,整體執行流還是一個dataflow的圖,存在不少異步并行的機會,同時端側存在大量的異構設備,如果一個模型在執行的時候使用多種類型的設備,中間也存在不同的流水線。
模型的性能,主要還是靠離線的優化和tuning,這一塊業界也已經許多實踐了,總的思路主要是規則化的融合pass和離線的算子tuning結合。
端云協同
端云協同主要涉及三塊:云側訓練-端側推理、云側訓練-端側增量訓練-端側推理、云/端的聯邦學習
云側訓練-端側推理,重點需要解決怎么生成最適合端側的模型,包括模型壓縮和自適應模型生成。模型壓縮技術我們前面已經做了介紹。對于神經網絡自動搜索(NAS),通常被用來生成滿足一定限制條件(例如,微控制器上極致的內存限制)的模型,NAS技術最大的問題在于如何縮短搜索模型的時間。
云側訓練-端側增量訓練,重點需要解決云和端的模型高效轉換的問題,這個前面章節已經介紹。
聯邦學習,目前業界主要有兩個技術流派,一個是橫向聯邦學習,數據上進行聚合,典型的應用場景是,移動設備上的隱私保護問題,像廣告等場景需要建立數百萬移動設備之間的聯邦模型,避免用戶隱私數據上傳到數據中心。第二個是縱向聯邦學習,維度上進行聚合,比較看重跨機構跨組織大數據合作場景,尤其是銀行金融場景的數據安全和隱私保護問題。
跨機構跨組織大數據合作架構
聯邦學習在技術上還有許多挑戰,比如跨設備的系統異構以及算法迭代過程中的通信,將會影響最終聯邦聚合的效率和精度;聯邦學習的過程中的模型加密方法,因為即使通過權重也可以推測出部分隱私信息,以及客戶端的投毒攻擊、對抗樣本等;另外一個挑戰主要是架構上的,目前聯邦學習還沒有一個統一的架構,同時支持橫向聯邦學習和縱向聯邦學習。
MindSpore全場景統一架構的解決方案
端云統一內核
MindSpore在框架的設計上進行了分層設計,將端云共用的數據結構和模塊解耦出來,在滿足端側輕量化的同時,保持了端云架構的一致性,真正實現一次訓練無縫部署、端云訓練共模型。
【統一IR】
MindSpore core的統一IR,保證了端云模型/算子定義的一致性,使得云側訓練的模型可以無縫的部署在端側。同時,對于端側訓練,可以和云側使用一致的IR進行模型的重訓。
統一IR定義了模型的邏輯結構和算子的屬性,并且與模型的持久化是解耦的。開源項目中用于持久化數據的方式,使用最為廣泛的,就是protobuffer和flatbuffer。兩者相比,protobuffer功能更為強大,使用也更加的靈活,但是相應的,也更加的重量級。flatbuffer更加的輕,反序列化的速度也更快。MindSpore將統一IR的邏輯數據持久化成不同的物理形式,云側持久化成protobuffer格式,端側持久化成flatbuffer,兼顧了數據的一致性與部署的輕量化。
【公共pass】
為了提升性能,訓練好的模型在執行推理前,需要提前做一些優化手段,這些優化包括了融合、常量折疊、數據排布的調整等等。對于端云共享的優化,同樣也是包含在MindSpore core模塊中,只不過對于云側推理,這些優化是在線推理時去執行的,而對于移動終端這些優化在執行推理前離線完成。
【統一接口】
MindSpore設計了提供端云統一的C++接口。統一的C++接口的用法盡量與Python接口保持了一致,降低了學習成本。通過統一接口,用戶可以使用一套代碼在不同的硬件上進行推理。
輕量化技術
【MindSpore for micro】
相比于移動終端,IoT設備MCU芯片資源更加的有限,因此,如何在IoT設備上部署深度學習模型將更具有挑戰。
上面的表中,左邊表示了云、手機、MCU上內存和存儲的大小,右邊表示了ResNet-50、MobileNet-V2、int8量化的MobileNetV2占用的存儲和內存。
針對IoT設備,MindSpore設計了MindSpore for micro的方案。
部署在云服務器和移動終端上的推理框架,通過模型解釋的方式來進行推理,這樣的方式可以支持多個模型以及跨硬件平臺,但是需要額外的運行時內存(MCU中最昂貴的資源)來存儲元信息(例如模型結構參數)。MindSpore for micro的CodeGen方式,將模型中的算子序列從運行時卸載到編譯時,并且僅生成將模型執行的代碼。它不僅避免了運行時解釋的時間,而且還釋放了內存使用量,以允許更大的模型運行。這樣生成的二進制大小很輕,因此具有很高的存儲效率。
MindSpore for micro的特性將會在1.2的版本中開源。
【量化】
MindSpore自適應混合低比特量化技術:根據模型結構和目標壓縮率自動搜索出對應層量化bit數,無需量化專家深度參與。量化因子可訓練,在低比特量化場景下可極大提升訓練效率和減少量化損失。在圖像分類/目標檢測模型上驗證壓縮8~10倍場景下,精度優于當前業界量化算法。
MindSpore訓練后量化技術:訓練后量化相較于量化重訓具有兩個明顯優勢,一是無需大量訓練數據集,二是無需重新訓練,離線快速轉換。MindSpore采用pipeline組合量化方法,一階段采用常規線性量化手段對權重和激活值進行量化,二階段對量化誤差進行分析,利用統計學方法對量化模型進行校正,補償因量化帶來的精度損失。
Pipeline 組合量化
高效運行時
【端云統一運行時】
為了能夠為端云的訓練、推理提供統一的并行運行框架,MindSpore設計了基于Actor模型的端云統一運行時。
AI訓練或者推理,最終都是執行一個DAG計算圖,圖中每個節點都是一個op,每條邊都是一個(或一組)tensor。下面的圖中,左邊是actor模型的示意圖,右邊是一個AI計算任務示意圖。
我們將一個op定義為一個actor,actor之間傳遞tensor。在actor模型中,message是無狀態的且不復用的,但在AI計算任務中,為了提高效率,tensor通常會被復用。為了解決這個問題,MindRT中引入了tensor manager來統一管理tensor,所有op通過tensor manager獲取tensor。
Tensor Manager支持tensor的引用計數和內存管理。
端云統一運行時將在MindSpore 1.2/1.3版本中開源。
【軟硬協同】
MindSpore原生與端側的NPU芯片深度結合,最大程度的發揮了專有芯片的性能優勢。
【算子優化】
在手機CPU上,MindSpore支持了多種卷積算法:Sliding Window、Im2Col+GEMM、Strassen、Winograd、Indirect Convolution、FFT等。如何在不同的條件下選擇最優的卷積算法,通常有3中做法:
基于經驗的人工設置
通過數學建模的Cost Model
通過機器學習算法模型,使用已有數據集對其進行離線訓練,最終得到一個可靠的卷積算子選擇器
目前,MindSpore支持了2和3兩種方式來進行最優卷積算法的選擇。
算法的選擇,除了考慮性能,還需要考慮特定場景下的內存限制。例如,對于IoT場景的硬件設備,如果選擇最為常見的Im2Col+GEMM算法,計算過程需要將輸入和卷積核在內存中拉平,占內存較大。MindSpore針對這種場景,選擇占用內存較少的Indirect Convolution算法。
聯邦學習
MindSpore的聯邦學習方法,同時支持cross-device(ToC)和cross-silo(ToB)兩種場景,在數據不出域的條件下,實現多方聯合建模,以幫助企業應用提效降本,助力不同行業智慧升級。在安全性方面,MindSpore提供多種模型加密方式,可以適用于大規模無狀態的終端設備,包括差分隱私、秘密共享、安全聚合等,用戶可自定義安全等級。
AI 機器學習 深度學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。