將深度學習庫壓縮成一個文件,以便移植到智能設備中
深度學習系統是複雜的,並且常常有些依賴環境。將深度學習庫移植到不同的平臺上,尤其是智能設備上,是一件十分痛苦的事情。 一個簡單的方法是:提供一個輕量級的接口,並以最小依賴將所有需要的代碼放到一個文件中。 本章節,我們描述瞭如何將MXNet源碼合併到一個文件中,並在移動設備上演示圖像分類。
合併:將整個深度學習系統壓縮成一個文件
合併的想法源自SQLite和其它項目(它們將所有源代碼打包成一個源文件)。這樣一來,你只需編譯這一個文件,就能構建深度學習工具。這裏簡化了向不同平臺移植的操作。感謝 Jack Deng,MXNet 提供了一個amalgamation 腳本,它可以基於訓練好的模型將所有用於預測的代碼壓縮成一個 .cc
文件(大約3萬行代碼)。BLAS庫是唯一的依賴環境。
我們已經在去除BLAS依賴的情況下,創建了一個最小版本的單獨文件。你可以使用 emscripten 將這個單獨文件編譯成 JavaScript。
編譯後的庫可以被其它編程語言使用。.h
文件包含一個輕量級的預測接口。可以非常輕鬆地將 C語言 的外來函數接口移植到另一種編程語言。例如,在GitHub上瀏覽下面的例子:
- Go: https://github.com/jdeng/gomxnet
- Java: https://github.com/dmlc/mxnet/tree/master/amalgamation/jni
- Python: https://github.com/dmlc/mxnet/tree/master/amalgamation/python
如果你打算合併自己的深度學習系統,構建項目時僅需要遵守幾條指南:
- 最小化第三方依賴庫;
- 使用名字空間來 封裝 類型和操作符;
- 避免在全局作用域內使用
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