優Tech分享 | ncnn的設計理念和軟體工程
ncnn是騰訊優圖實驗室第一次對外公開深度學習的研究成果。作為一個為手機端極致優化的高性能神經網路前向計算框架,ncnn於2017年7月正式開源,在設計之初便將手機端的特殊場景融入核心理念,成為業界首個為移動端優化的開源神經網路推斷庫。
1月19日,騰訊優圖舉辦了優Tech線上沙龍,ncnn開源負責人、騰訊優圖實驗室高級研究員nihui圍繞《ncnn的設計理念和軟體工程》進行了直播分享,講述了ncnn項目的設計動機、架構設計以及運作多年所依賴的軟體工程方法。
據nihui介紹,ncnn在設計之初首先考慮的就是可用性(易用性),也就是不僅要讓ncnn項目能使用,還要讓開發者在使用的同時能學習,從而創造新項目。其次考慮的是移植性,基於此,ncnn項目採用了C++03標準,而非當前Android和ios平台使用的C++11,這樣就能保證老的嵌入式平台或其他平台也能同樣適用。另外,ncnn項目使用了Vulkan的API,讓一套程式碼可以在諸如Android、IOS等任意平台上實現。
維護性也是ncnn項目的設計理念之一,為方便開發者閱讀,降低閱讀成本,ncnn中的優化程式碼都是可選的,這就相當於整個框架不依賴於優化程式碼,有利於分離。最後,ncnn作為底層推理框架要考慮兼容性,底層賦能後,開發者就算換程式碼,也能適用最新框架。
數據結構方面,ncnn的Mat只有W、H、C三個維度,沒有其他框架常見的batch維度。其優勢主要表現在兩個方面:一是程式碼數量少,維護性更好;二是在實際應用場景中,像美顏、自拍等可以更快速應用出結果。
據了解,Mat中加了cstep屬性,可以讓每一個channel都做一個數據對齊,訪問、儲存等操作都可以在對齊記憶體上進行,效率更高。舉例來說,如果不加cstep,像armV7就有很多對齊和不對齊的數據,訪問速度會存在差異。
此外,ncnn的數據結構還做了Type-less,起初Mat只能放float數據類型,但int8需要放其他類型的數據,出於兼容性的考慮,Mat在盡量不改變數據結構的基礎上,通過層實現的自我約定來實現數據類型解讀,降低複雜性,按軟體工程中的一句話說就是「約定優於配置」。
ncnn的模型中有兩個文件,對此,開發者可能會有疑問:為什麼成套使用的結構和權重還要放兩個文件?
ncnn模型其中一個文件是Human editable(人類可編輯)。AI推理部署有一個很難的環節叫模型轉換,有很多模型因為缺少某個運算元或轉換器沒寫好等問題無法轉換,ncnn遇到這種情況,轉出的模型也是不可用的,這時就需要用到Human editable。ncnn 主流操作方式是把param文件用編譯器打開,找到不支援的運算元,如Expand,刪掉它或改為支援的運算元,手工去優化模型結構的圖。運算元的參數表示是擴展性比較好的Key =Value。
另一個文件Bin,純粹是放權重的文件,沒有結構化資訊,結構要放在Param中。可以把多個模型的Bin文件直接拼在一起,形成一個大的模型文件,更便於部署。
ncnn在動態推理的設計上比較前瞻,在2017年發布時就已具備三種dynamic。
一是尺寸,ncnn可以任意輸入尺寸,一般其他推理載入模型時會需要指定最大尺寸,但ncnn不需要,開發者給它多少它就能算多少。
二是維度,動態shape分為兩種:知道輸入維度和不確定維度,ncnn的運算元是直接支援不確定維度操作的,比如BinaryOp運行時接受兩維數據,也接受一維和三維數據。
三是推理圖,在ncnn中,可以在同一模型中實現任意節點到節點的推理路徑,像條件判斷和循環也可以通過不同子圖,換來換去,在運行時判斷和調度哪部分需要計算,哪部分不需要計算,這樣的動態推理路徑可以提升效率。
ncnn採用了一個純粹的繼承關係去做的架構設計,精心優化的架構程式碼,比如:x86、arm、vulkan等都是繼承自cpu的一個最基礎實踐的,當遇到沒有優化的參數組合時能方便的回退到cpu基礎實現。ncnn中的運算元kernel和op定義是不分離的,只需要一份程式碼,方便凝聚運算元自身的模組性,減少運算元之間的耦合。此外,kernel和op定義不分離也很好的踐行了最初的設計理念,對於想要學習、自己做優化的開發者來說更加方便。
nihui 表示,ncnn已經做了一個比較完整的程式碼覆蓋率,每次提交都會有程式碼覆蓋率的檢查,從而檢查出許多corner case的bug,對於底層框架來說是非常好的健壯性保證。此外,ncnn項目還會用Swiftshader、QEMU去做GPU和各種架構的測試,進行一個更全面的程式碼健壯性檢查。
作為騰訊下頂級人工智慧實驗室之一,騰訊優圖一直聚焦電腦視覺,專註人臉識別、影像識別、OCR、機器學習、數據挖掘等領域開展技術研發和行業落地。未來騰訊優圖將繼續優化ncnn項目,讓開發者能夠更輕鬆將深度學習演算法移植到手機端,輸出高效的執行,進而產出人工智慧APP,將AI技術帶到用戶指尖。
👇點擊「閱讀原文」即可回看直播影片。