MxNet系列——how_to——smart_device

博客新址: http://blog.xuezhisd.top
郵箱:[email protected]


將深度學習庫壓縮成一個文件,以便移植到智能設備中

深度學習系統是複雜的,並且常常有些依賴環境。將深度學習庫移植到不同的平臺上,尤其是智能設備上,是一件十分痛苦的事情。 一個簡單的方法是:提供一個輕量級的接口,並以最小依賴將所有需要的代碼放到一個文件中。 本章節,我們描述瞭如何將MXNet源碼合併到一個文件中,並在移動設備上演示圖像分類。

合併:將整個深度學習系統壓縮成一個文件

合併的想法源自SQLite和其它項目(它們將所有源代碼打包成一個源文件)。這樣一來,你只需編譯這一個文件,就能構建深度學習工具。這裏簡化了向不同平臺移植的操作。感謝 Jack Deng,MXNet 提供了一個amalgamation 腳本,它可以基於訓練好的模型將所有用於預測的代碼壓縮成一個 .cc 文件(大約3萬行代碼)。BLAS庫是唯一的依賴環境。

我們已經在去除BLAS依賴的情況下,創建了一個最小版本的單獨文件。你可以使用 emscripten 將這個單獨文件編譯成 JavaScript。

編譯後的庫可以被其它編程語言使用。.h 文件包含一個輕量級的預測接口。可以非常輕鬆地將 C語言 的外來函數接口移植到另一種編程語言。例如,在GitHub上瀏覽下面的例子:

如果你打算合併自己的深度學習系統,構建項目時僅需要遵守幾條指南:

  • 最小化第三方依賴庫;
  • 使用名字空間來 封裝 類型和操作符;
  • 避免在全局作用域內使用 using namespace xyz
  • 避免重複include依賴。

在移動設備上進行圖像識別的例子

有了合併成一個文件的方法,在移動設備(比如安卓和IOS)上部署深度學習系統很簡單了。但需要考慮到以下2點:

  • 模型應該小到能夠適合設備內存。
  • 考慮到移動設備相對較低的計算性能,模型的計算量不能太大。

下面一個圖像分類的例子。首先說明一下如何獲得一個網絡模型,從inception網絡說起。在ImageNet數據集上,使用多個配備了GTX 980的服務器來訓練該網絡。生成的網絡模型適合設備內存,但是計算量太大了。去除一些網絡層之後,結果又變差了。

最後,暫時一個安卓例子,感謝 Leliana,https://github.com/Leliana/WhatsThis 描述瞭如何在安卓上運行。

通過使用合併的方法,我們能夠輕鬆地,幾乎不需要依賴的情況下,將預測庫移植到移動設備上。在智能設備上編譯深度學習工具不再是一件痛苦的事情,最後只需在目標語言(Java/Swift)中調用C-API函數即可。

除了Inception-BatchNorm網絡之外,我們還提供了2個預訓練的模型。

我們在 Nexus 5 上測試了我們的網絡:

Net Top-1 Validation on ILSVRC2012 Time App Size Runtime Temp Memory Req
FastPoorNet around 52%, similar to 2011 winner 1s <10MB <5MB
Sub InceptionBN around 64%, similar to 2013 winner 2.7s <40MB <10MB
InceptionBN around 70% 4s-5s <60MB 10MB

這些模型僅僅用於演示。他們沒有專門爲移動設備進行微調,還有很大的提升空間。我們相信創造一個輕量級,便攜和快速的深度學習庫是一件有趣的事情,希望你喜歡使用MXNet。

源代碼

https://github.com/Leliana/WhatsThis

下載APK例子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章