热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scikitlearn机器学习模型跨平台部署的思路

(欢迎分享源网页,禁止未经本人书面许可转载至他处,或进行其他不当使用行为)你是一名数据科学家算法工程师,在PythonRSparkMATLAB(业界有几个用?)等环境下用最爱的机器

(欢迎分享源网页,禁止未经本人书面许可转载至他处,或进行其他不当使用行为)

你是一名数据科学家/算法工程师,在 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/ )和 Jep(https://github.com/mrj0/jep )等。

对于移动平台,由前所述直接调用 Python 代码不可行,只能考虑转制,有两种思路可供选择:

1. 转换成跨平台通用格式,典型如 PMML(http://dmg.org/pmml/v4-3/GeneralStructure.html )。例如在 Java 平台上,Java PMML API(https://github.com/jpmml )提供了各类接口;在 Android 上由于平台对 XML 解析的限制有人提供了 jpmml-android(https://github.com/jpmml/jpmml-android )示例项目,其中包含一个 Maven 插件,将 PMML 文件序列化后编译为一个静态库。简单来说,将任何 scikit-learn 模型用 sklearn2pmml(https://github.com/jpmml/sklearn2pmml )导出为 PMML 文件后,放进 jpmml-android 项目的对应位置,编译后的 .pmml.ser 文件即可在任意 Android 项目中调用,方法可参照模板代码。至于 iOS 则未受支持。目前以上所提及的 PMML 相关项目均已支持该语言最新标准(4.3),如条件限制只能使用旧标准,则需要到 GitHub 相应仓库下载支持旧标准的最后版本。

2. 转换成原生代码,可以通过 sklearn-porter(https://github.com/nok/sklearn-porter )等实现,尽管支持模型种类有限。将模型用 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 为佳。

希望能对读者有所帮助。欢迎评论切磋。


推荐阅读
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
author-avatar
麦芽糖的-寂寞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有