时隔16年JeffBarr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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

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

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

关注

评论

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

杜绝开源依赖风险,许可证扫描让高效&合规「两不误」

极狐GitLab

DevOps DevSecOps 开源许可证 极狐GitLab 安全合规

基于openfaas托管脚本的实践

百度Geek说

数据库 百度 企业号 5 月 PK 榜

官宣!时序数据库 TDengine 与天翼云完成产品兼容性认证

爱倒腾的程序员

涛思数据 时序数据库 ​TDengine

TiDB x Flink 数据集成实践

TiDB 社区干货传送门

实践案例 大数据场景实践 数据中台场景实践 OLAP 场景实践

【5.19-5.26】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

揭秘百度IM消息中台的全量用户消息推送技术改造实践

JackJiang

消息推送 即时通讯IM im开发

深度解析 slab 内存池回收内存以及销毁全流程

bin的技术小屋

Linux 内存管理 Linux Kenel 内存池 slab

C4D 常用 14 款插件

Finovy Cloud

C4D 3D软件

面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?

Java你猿哥

Java JVM ssm Java性能优化

微服务是不是金科玉律?基于Spring Cloud如何构建分布式系统?

Java 架构 微服务 Spring Cloud

阿里全新推出:微服务突击手册,把所有操作都写出来了|超清PDF

Java你猿哥

Java spring Spring Cloud ssm Ribbon

属实不赖!Alibaba开源GitHub星标114K微服务架构全彩进阶手册

Java你猿哥

Java 架构 微服务 微服务架构 ssm

网闸、防火墙、堡垒机三大定义说明

行云管家

防火墙 堡垒机 网闸

阻抗板是否高可靠,华秋有话说

华秋电子

数据可视化:相关类可视化图表大全

2D3D前端可视化开发

数据可视化控件 数据可视化工具 可视化数据 可视化图表 数据可视化设计

TiDB x Flink x Iceberg 实时 ODS 实践

TiDB 社区干货传送门

实践案例 大数据场景实践 实时数仓场景实践 数据中台场景实践 OLAP 场景实践

GitHub上标星75k+超牛的《Java面试突击离线版》够你润进去了

程序知音

Java java面试 Java进阶 Java面试题 Java面试八股文

软件测试/测试开发丨Web自动化测试中显式等待的高级使用

测试人

程序员 软件测试 自动化测试 测试开发

手机一开,说办就办!指尖上的“数字江西”

OceanBase 数据库

数据库 oceanbase

7个工程应用中数据库性能优化经验分享

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

生态伙伴 | 携手深圳科创学院,持续推动项目落地与成长

华秋电子

堡垒机免费版有哪些功能啊?后面需要过等保怎么办?

行云管家

安全运维 运维软件 免费运维

深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详细讲解

汀丶人工智能

自然语言处理 深度学习 预训练模型 Transformer GPT

Github上星标55.9k的微服务神仙笔记真的太香了

Java 架构 微服务 Spring Cloud 设计模式

3D LED显示屏选购指南

Dylan

3D LED显示屏 避坑指南

AI 换脸技术:你的照片可能被滥用了!

郑州埃文科技

AI 数据治理

Github标星78k,Alibaba最新发布的Spring Boot项目实战文档!太强了

Java你猿哥

Java 面试 Spring Boot ssm Spring MVC

JVM——解析运行期优化与JIT编译器

Java你猿哥

JVM ssm 虚拟机 编译器 JIT编译器

TiDBv6.5离线部署

TiDB 社区干货传送门

6.x 实践

TiDB 使用国内公有云和私有部署的 S3 存储备份指南

TiDB 社区干货传送门

数据库架构设计 6.x 实践

SpringBoot 实现启动项目后立即执行方法的几种方式

Java你猿哥

源码 jdk Spring Boot ssm

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