【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

Apache Spark 2.0 预览: 机器学习模型持久化

  • 2016-06-02
  • 本文字数:2224 字

    阅读完需:约 7 分钟

在即将发布的 Apache Spark 2.0 中将会提供机器学习模型持久化能力。机器学习模型持久化(机器学习模型的保存和加载)使得以下三类机器学习场景变得容易:

  • 数据科学家开发 ML 模型并移交给工程师团队在生产环境中发布;
  • 数据工程师把一个 Python 语言开发的机器学习模型训练工作流集成到一个 Java 语言开发的机器学习服务工作流;
  • 数据科学家创建多个训练 ML 模型的作业,稍后需要保存和评估。

Spark MLlib 将提供基于 DataFrame 的 API 来支持 ML 持久化。后面将分三部分介绍:概要、代码实例和 MLlib 持久化 API 一些小细节。

概要

ML 持久化关键特色:

  • 支持 Spark 原有的多种开发语言:Scala、Java 和 Python & R;
  • 基于 DataFrame 的 API 几乎支持所有的 ML 算法;
  • 支持单个 ML 模型和多管道 ML 模型;
  • 使用可转换格式分布式保存机器学习模型

学学 API

在 Apache Spark 2.0 中,机器学习组件 MLlib 提供基于 DataFrame 的 API,可实现类似于 Spark 数据源 API 的保存和载入功能,见以前的文章。

作者使用经典的机器学习例子(手写数字识别,使用 MNIST 数据库,MNIST 数据库包含 0 到 9 的手写数字和标注标记数据)来证实 ML 模型保存和加载功能。作者取其它手写数字并鉴别数字是几,完整例子代码见 notebook:加载数据、训练模型和保存以及加载模型。

保存和加载单模型

首先展示如何使用不同编程语言保存和加载同一单模型。作者使用 Python 训练和保存随机森林分类器模型,然后使用 Scala 来加载同一个 ML 模型回来。

复制代码
training = sqlContext.read...  # data: features, label
rf = RandomForestClassifier(numTrees=20)
model = rf.fit(training)

可以简单的调用 save 方法来保存上面训练好的 ML 模型,然后使用 load 方法再加载回来。

复制代码
model.save("myModelPath")
sameModel = RandomForestClassificationModel.load("myModelPath")

这里也可以加载刚才同一个 ML 模型(使用 Python 保存)进入 Scala 或者 Java 应用。

复制代码
// Load the model in Scala
val sameModel = RandomForestClassificationModel.load("myModelPath")

这个工作既可以对小数据量、局部模型(比如,常见的分类模型 K-Means)适用,也可以对海量数据、分布式模型(比如,常见的推荐模型 ALS)。刚加载的模型都包含有相同的参数设置和训练数据,所以即使在不同的 Spark 部署加载同一个模型也会得到相同的预测结果。

保存和加载多管道模型

前面仅仅描述来保存和加载单个 ML 模型,而实际应用中,ML 工作流包含多阶段:从特征提取和转化到模型拟合和优化。MLlib 会提供 Pipeline 来辅助使用者来构建这些工作流。

MLlib 提供使用者保存和加载整个 Pipeline。下面来看下如何来实现:

  • 特征提取:图像数据二值化为 0 和 1(黑和白);
  • 模型拟合:随即森林分类器读取图像数据并预测数字 0 到 9;
  • 优化结果:交叉验证来优化树的深度。
    看下代码:
复制代码
// Construct the Pipeline: Binarizer + Random Forest
val pipeline = new Pipeline().setStages(Array(binarizer, rf))
 
// Wrap the Pipeline in CrossValidator to do model tuning.
val cv = new CrossValidator().setEstimator(pipeline) ...

在这个管道拟合模型前先来展示我们如何保存整个 ML 工作流。这个工作流将在其它 Spark 集群后续被加载。

复制代码
cv.save("myCVPath")
val sameCV = CrossValidator.load("myCVPath")

最后,我们拟合模型管道,保存管道,并在以后进行加载。下面保存了特征抽取、随机森林模型交叉验证的优化以及模型优化对应的统计数据。

复制代码
val cvModel = cv.fit(training)
cvModel.save("myCVModelPath")
val sameCVModel = CrossValidatorModel.load("myCVModelPath")

细节知识点

Python 优化

在 Spark 2.0 中并没有提供 Python 优化功能,Python 不支持保存和加载 CrossValidator 和 TrainValidationSplit 来做模型超参数优化,这个功能将在 Spark 2.1 中实现(SPARK-13786)。但是 Python 还是可以保存 CrossValidator 和 TrainValidationSplit 的结果。例如,我们可以使用 Cross-Validation 优化随机森林模型并保存调试好的优化模型。

复制代码
# Define the workflow
rf = RandomForestClassifier()
cv = CrossValidator(estimator=rf, ...)
# Fit the model, running Cross-Validation
cvModel = cv.fit(trainingData)
# Extract the results, i.e., the best Random Forest model
bestModel = cvModel.bestModel
# Save the RandomForest model
bestModel.save("rfModelPath")

可转换的存储格式

本质上,我们把模型元数据和参数存储为 JSON,数据集存储成 Parquet。这些存储格式是可转换的,并且也能被其它开发库读取。Parquet 文件允许使用者存储小模型(比如,贝叶斯分类)和分布式模型(比如,ALS)。存储路径可以是任意 Dataset/DataFrame 支持的 URI,比如 S3、本地存储等。

跨语言兼容性

机器学习模型可以在 Scala、Java 和 Python & R 间任意存储和加载。但 R 语言有两个局限性:第一,不是所有 MLlib 模型都支持 R 语言,所以不是所有的使用其它语言训练的模型能被 R 语言加载;第二,使用 R 独有的方式的 R 模型格式存储不易被其它语言使用。

结论

随着 Spark 2.0 的即将发布,基于 DataFrame 的 MLlib API 将会提供几乎完善的模型和机器学习管道持久化。机器学习模型持久化在团队间合作、多编程语言 ML 工作流以及迁移模型到生产环境方面相当重要。基于 DataFrame 的 MLlib API 也将最终会成为 Spark 在机器学习方面主要的 API。

查看英文原文: Apache Spark 2.0 Preview: Machine Learning Model Persistence

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2016-06-02 18:196828
用户头像

发布了 43 篇内容, 共 27.7 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

Java 常用类大讲解!2️⃣(手写 API、源码必备)

XiaoLin_Java

Java 集合 基础 1月月更

无聊的周末用Java写个扫雷小游戏

秦怀杂货店

Java 数据结构 游戏

ONES 收购为知笔记,全面升级企业知识库产品

万事ONES

ONES 知识库

Java中方法重写和方法重载的6个区别?

王磊

C语言-基本数据类型与位运算

DS小龙哥

C语言

C语言-数组

DS小龙哥

C语言

C语言-函数的可变形参(不定形参)

DS小龙哥

C语言

国内外研究多模态的知名团队有哪些?

你?

推荐 研究

hive metastore配置kerberos认证

从大数据到人工智能

hive kerberos hive metastore

2021大厂面试题之redis篇

小麦

面试题 redis' 大厂面经

2022年中科柏诚服务再提升,为银行数字化转型提供精准化助力

联营汇聚

1 月月更|推荐学Java——数据表高级操作

逆锋起笔

MySQL 事务 范式 Java后端 MySQL 数据库

ReactNative进阶(十一):realm 数据库

No Silver Bullet

React Native 1月月更 realm

2021年vivo互联网技术最受欢迎文章TOP25

vivo互联网技术

数据库 前端 服务器 年度总结 Vivo

如果你是加勒比海盗首领,会选择哪种算法来使价值最大化?

博文视点Broadview

C语言-语句(if,for,while,switch,goto,return,break,continue)

DS小龙哥

C语言

新增功能 – Amazon FSx for NetApp ONTAP

亚马逊云科技 (Amazon Web Services)

存储

毕业设计-电商秒杀系统

doublechun

「架构实战营」

二、程序如何执行

喵叔

一个cpp协程库的前世今生(十五)递归互斥量

SkyFire

c++ cocpp

Kafka核心组件之Controller概念介绍(1)

Kafka中文社区

Vue3 企业级网站建设

詹Sir

Vue 建站

Kafka的副本管理器读写副本消息

JavaEdge

1月月更

C语言-函数的定义、声明、传参

DS小龙哥

C语言

详解数据中台的底层架构逻辑

五分钟学大数据

数据中台 数据仓库 1月月更

新型数据中心的必选项:“超融合”的三重价值

脑极体

Amazon Elastic File System新增低成本单区存储类

亚马逊云科技 (Amazon Web Services)

存储

Go 中实现用户的每日限额(比如一天只能领三次福利)

万俊峰Kevin

Go 限流 Go 语言 rate-limit RateLimit

10 Prometheus 之监控应用程序

穿过生命散发芬芳

Prometheus 1月月更

Tableau Day5:空间分析

贾献华

1月月更

基于多源数据画像的失败用例智能分析

华为云开发者联盟

云原生 测试 日志 失败用例 智能分析

Apache Spark 2.0预览: 机器学习模型持久化_开源_Joseph Bradley_InfoQ精选文章