scikit-learn 机器学习模型跨平台部署的思路

你是一名数据科学家/算法工程师,在 Python/R/Spark/MATLAB(业界有几个用?)等环境下用最爱的机器学习框架训练好了模型,准确度不错。想就这样交差?公司当初招聘你难道就为了看一个 98% 的数字,或者期待你建立新算法好发表论文?当然是要促进业务。于是问题来了,你并不能保证业务平台上能原封不动部署原本运行在个人电脑上的代码,简单的例子:
非 x86 平台对 Python 的 NumPy 库支持较为有限——移动平台最好不要指望直接运行或调用 Python。
iOS 应用商店禁止模拟器类 app,包括 Python 解释器。
嵌入式市场有 MicroPython,但比起原生 C 资源消耗还是太大,且也有兼容性问题。

另一方面,我们一般不想让之前训练的模型直接报废,而在新平台上分别用其原生工具重新训练(况且还不是所有平台都能这样做——要是一块 Cortex-M 微处理器呢?)。所以,一次训练、跨平台部署是不少算法工程师必须要跨过的坎。
本文将试图简介在移动平台等处部署机器学习模型的方法,并阐述个人体验后所觉之利弊。目前只涉及线下学习线上预测的简单情况,暂不考虑线上学习。虽然讨论 scikit-learn 所生成模型的部署问题,但希望对其他库和其他环境也能有举一反三之效。
如果是 PC 或服务器等以 x86 架构为主的非移动平台,考虑到其本身对 NumPy 支持较好,可以采取直接调用 Python 代码的思路,典型的工具包括 Jython(http://www.jython.org/*
"); background-size: cover; background-position: 0px 2px;">*
)和 Jep(https://github.com/mrj0/jep*
"); background-size: cover; background-position: 0px 2px;">*
)等。
对于移动平台,由前所述直接调用 Python 代码不可行,只能考虑转制,有两种思路可供选择:

  1. 转换成跨平台通用格式,典型如 PMML(http://dmg.org/pmml/v4-3/GeneralStructure.html*
    "); background-size: cover; background-position: 0px 2px;">*
    )。例如在 Java 平台上,Java PMML API(https://github.com/jpmml*
    "); background-size: cover; background-position: 0px 2px;">*
    )提供了各类接口;在 Android 上由于平台对 XML 解析的限制有人提供了 jpmml-android(https://github.com/jpmml/jpmml-android*
    "); background-size: cover; background-position: 0px 2px;">*
    )示例项目,其中包含一个 Maven 插件,将 PMML 文件序列化后编译为一个静态库。简单来说,将任何 scikit-learn 模型用 sklearn2pmml(https://github.com/jpmml/sklearn2pmml*
    "); background-size: cover; background-position: 0px 2px;">*
    )导出为 PMML 文件后,放进 jpmml-android 项目的对应位置,编译后的 .pmml.ser 文件即可在任意 Android 项目中调用,方法可参照模板代码。至于 iOS 则未受支持。目前以上所提及的 PMML 相关项目均已支持该语言最新标准(4.3),如条件限制只能使用旧标准,则需要到 GitHub 相应仓库下载支持旧标准的最后版本。
  2. 转换成原生代码,可以通过 sklearn-porter(https://github.com/nok/sklearn-porter*
    "); background-size: cover; background-position: 0px 2px;">*
    )等实现,尽管支持模型种类有限。将模型用 joblib dump 成 pkl 后(假设其名为 model.pkl,注意模型若为 Pipeline,则所有步骤均需得到 sklearn-porter 支持),命令行中运行
    python -m sklearn_porter -i model.pkl -l <目标语言>

取决于模型大小,等候一段时间后即可见到原生语言的模型实现,文件名可能为 brain.c 或与之类似。自动生成的代码可能需要手动修改后才能编译运行。
以上两种思路各有利弊。通用格式只需处理一次模型(如包括 Android 则为两次),之后在各平台上分别编写代码以调用,支持算法较多,但并非所有平台都受到支持,且解析 PMML 格式效率不算高。原生代码则需要每种语言编译一次,自动化框架所支持算法较少(剩下的则需要设法导出参数后手动编写),但在各自业务平台上基本不存在兼容性问题,效率也较高。为数不多的例外,一是自动生成的代码对嵌入式系统仍不够最优,可能需要较多人工编辑或直接手动编写,当然这种情况下应该在建模时即优先考虑复杂度;二是 Java 单个方法字节码不能超过 64 KB,但机器学习模型稍大就会达到此限制,故 Java 上仍以 jpmml 为佳。
希望能对读者有所帮助。欢迎评论切磋。

转自 https://zhuanlan.zhihu.com/p/27772080

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 1、垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,...
    kiddings阅读 3,144评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,298评论 0 11
  • https://zhuanlan.zhihu.com/p/26395112 使用 VSCode 开发 C项目 使用...
    姑娘请别为难小僧阅读 17,028评论 0 10
  • 《少有人走的路》 推迟满足感,给予并不等同于爱,如何处理冲突。 001.所有重要且紧急的事,都是由重要的事拖延而来...
    明荒阅读 163评论 0 0
  • 墓群 文_灰烬 我收到了我的一位远方亲戚寄来的信件,那是我祖父一脉的子嗣,我鲜少听过他们的名字,只知他们与我一样都...
    Disciple_灰烬阅读 842评论 0 1