MXNet的iOS版本編譯

前言

依據(jù)mxnet的官方文檔,將其整體移植到移動平臺上是非常困難的冠胯,只有預測部分可以整合成單文件的形式應用到移動平臺上火诸。但網(wǎng)上有關(guān)這部分的資料極其稀少,而且已經(jīng)是很多年以前的了荠察,按照官方文檔編譯的時候也出現(xiàn)了很多錯誤置蜀,故有此文,將自己這幾天踩過的坑記錄一下悉盆,同時也為想在iOS上使用mxnet的同學們提供一點幫助盯荤。

環(huán)境

Xcode 9.3
iOS >= 10.0, macOS 10.13.4
mxnet 1.2.1

安裝OpenBLAS

mxnet的本地編譯需要OpenBLAS作為基礎(chǔ),可以通過Homebrew安裝:

brew install openblas 

一般情況下焕盟,openblas的安裝路徑是/usr/local/opt/openblas

下載mxnet及其第三方依賴庫

下載mxnet源碼秋秤,定位到3rdParty目錄,查看它所有第三方依賴庫的目錄下面是否有內(nèi)容,如果沒有灼卢,需要繼續(xù)下載那些第三方庫绍哎。
在這里推薦使用Github Desktop直接clone到本地,這樣會順便把那些第三方依賴庫也同時下好鞋真。
如果您把OpenBLAS安裝在了其他位置崇堰,請相應調(diào)整amalgamation/Makefile中的OPENBLAS_ROOT,將其指向OpenBLAS的真實安裝位置涩咖。

修改dmlc-minimum0.cc

打開amalgamation/dmlc-minimum0.cc海诲,找到

#include "../3rdparty/dmlc-core/src/io/local_filesys.cc"

在下方增加

#include "../3rdparty/dmlc-core/src/io/filesys.cc"

修改mxnet_predict0.cc

打開amalgamation/mxnet_predict0.cc,找到

#include "src/ndarray/ndarray_function.cc"

在其上方增加(注意抠藕!這個是上方6龇巍)

#include "src/common/utils.cc"

找到

#include "src/imperative/cached_op.cc"

在其下方增加

#include "src/imperative/imperative.cc"

找到

#include "src/engine/naive_engine.cc"

在其下方增加

#include "src/engine/openmp.cc"

找到

#include "src/profiler/profiler.cc"

在其下方增加

#include "src/profiler/aggregate_stats.cc"

找到

#include "src/executor/inplace_addto_detect_pass.cc"

在其下方增加

#include "src/executor/infer_graph_attr_pass.cc"

找到

#include "src/c_api/c_api_error.cc"

在其下方增加

#include "src/c_api/c_api_profile.cc"

編譯mxnet_predict-all.cc

定位到amalgamation目錄蒋困,在命令行里面輸入

make

并等待一段時間盾似,如果一切順利,最終會輸出:

ar rcs libmxnet_predict.a mxnet_predict-all.o

如果在這個過程中出現(xiàn)任何error信息(包括在ar命令執(zhí)行過程中出現(xiàn)任何erorr信息)雪标,需要檢查mxnet_predict0.cc和dmlc-minimum0.cc兩個文件是否修改正確零院。
在amalgamation目錄下會多出一些文件,我們需要mxnet_predict-all.cc村刨,這就是mxnet預測部分的單文件版本告抄。

修改mxnet_predict-all.cc

打開mxnet_predict-all.cc,找到

#include <cblas.h>

改為

#include <Accelerate/Accelerate.h>

增加

#include <execinfo.h>
#include <shared_mutex>

刪除以下兩個頭文件的引用

#include <emmintrin.h>
#include <x86intrin.h>

找到

#ifndef MSHADOW_USE_SSE
  #define MSHADOW_USE_SSE 1
#endif

改為

#ifndef MSHADOW_USE_SSE
  #define MSHADOW_USE_SSE 0
#endif

找到

#if defined(_MSC_VER) || defined(__CUDACC__)
  #define MSHADOW_USE_F16C 0
#elif defined(__clang__) && \
        ((__clang_major__ < 8) || ((__clang_major__ == 8) && (__clang_minor__ < 1)))
  #define MSHADOW_USE_F16C 0
#else
  #define MSHADOW_USE_F16C 1
#endif

改為

#define MSHADOW_USE_F16C 0

注釋掉以下部分:

#if MSHADOW_USE_MKL == 0
//中間的代碼段全部注釋掉
#endif  // MSHADOW_USE_MKL == 0

將mxnet_predict-all.cc以及../include/mxnet/c_predict_api.h拷出來備用嵌牺。

建立iOS工程

新建一個iOS工程打洼,不管是APP也好,靜態(tài)庫也好逆粹,還是動態(tài)庫也好募疮,都可以。
將剛才的mxnet_predict-all.cc以及c_predict_api.h加入工程僻弹。
在Build Phases的Link Binary with Libraries中阿浓,加入Accelerate.framework,然后編譯蹋绽。

一些資源

mxnet_predict-all生成原理

從amalgamation/Makefile文件可以看出卸耘,mxnet_predict-all.cc主要依靠dmlc-minimum0.cc退敦、nnvm.cc和mxnet_predict0.cc等若干個模板文件,依據(jù)amalgamation.py這個腳本文件解析模板文件蚣抗,將其展開侈百、合并到一個大的文件中。
所以如果最后生成的文件中存在什么問題,直接到模板文件里面找原因就行了设哗。

常見問題

1 Undefined Symbol for archetecture xxx
檢查mxnet_predict-all.cc里面有沒有對應的實現(xiàn)唱捣,如果沒有,繼續(xù)檢查mxnet_predict0.cc以及dmlc-minimum0.cc兩個文件是否有正確修改网梢。
2 mxnet_predict-all.cc里面include文件未找到
仔細對比mxnet_predict-all.cc是否有按前述過程修改震缭,我遇到的很多種情況是因為某些其他平臺的宏未關(guān)閉(例如MSHADOW_USE_SSE未置0)引起的
3 其他問題請在評論區(qū)留言,我將及時更新這份文檔战虏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拣宰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烦感,更是在濱河造成了極大的恐慌巡社,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件手趣,死亡現(xiàn)場離奇詭異晌该,居然都是意外死亡,警方通過查閱死者的電腦和手機绿渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門朝群,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人中符,你說我怎么就攤上這事姜胖。” “怎么了淀散?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵右莱,是天一觀的道長。 經(jīng)常有香客問我档插,道長慢蜓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任阀捅,我火速辦了婚禮胀瞪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饲鄙。我一直安慰自己凄诞,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布忍级。 她就那樣靜靜地躺著帆谍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轴咱。 梳的紋絲不亂的頭發(fā)上汛蝙,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天烈涮,我揣著相機與錄音,去河邊找鬼窖剑。 笑死坚洽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的西土。 我是一名探鬼主播讶舰,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼需了!你這毒婦竟也來了跳昼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肋乍,失蹤者是張志新(化名)和其女友劉穎鹅颊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓造,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡堪伍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滔岳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠娱。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡挽牢,死狀恐怖谱煤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禽拔,我是刑警寧澤刘离,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站睹栖,受9級特大地震影響硫惕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野来,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一恼除、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曼氛,春花似錦豁辉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聊浅,卻和暖如春餐抢,著一層夾襖步出監(jiān)牢的瞬間现使,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工旷痕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碳锈,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓欺抗,卻偏偏與公主長得像殴胧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佩迟,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容