在 Ibotta,我们训练了许多机器学习模型。这些模型为我们的推荐系统、搜索引擎、定价优化引擎、数据质量等提供动力。它们在与我们的移动应用程序交互时为数百万用户做出预测。

当我们使用 Spark 进行数据处理时,我们首选的机器学习框架是 scikit-learn。随着计算机变得越来越便宜,机器学习解决方案的上市时间变得越来越关键,我们探索了加快模型训练的各种方法。其中一个解决方案是将 Spark 和 scikit-learn 中的元素组合到我们自己的混合解决方案中。

sk-dist 的介绍

我们很高兴地宣布我们的开源项目 sk-dist 的启动。该项目的目标是为使用 Spark 分发 scikit 学习元估计器提供一个通用框架。元估计器的例子有决策树集合(随机林和额外随机树)、超参数调解器(网格搜索和随机搜索)和多分类技术(一对多和多对一)。

我们的主要动机是填补传统机器学习模型空间的空白。在神经网络和深度学习的空间之外,我们发现我们的训练模型的大部分计算时间并没有花在训练单个数据集的单个模型上。相反,大部分时间都花在使用元估计器在数据集上训练模型的多次迭代上。

例子

让我们谈谈手写数字数据集。在这里,我们对手写数字的图像进行了适当的编码、分类。我们可以很快在一台机器上训练 1797 条记录的支持向量机,花费的时间不到一秒钟。但超参数调整需要在训练数据的不同子集上进行大量的训练。

如下图所示,我们已经构建了一个总计需要 1050 个训练的参数网格。在拥有 100 多个核的 Spark 上使用 sk dist 只需 3.4 秒。这项工作的总时间是 7.2 分钟,意思是在没有并行化的单机上训练要花这么长时间。import timefrom sklearn import datasets, svm

from skdist.distribute.search import DistGridSearchCV

from pyspark.sql import SparkSession # instantiate spark session

spark = (

SparkSession

.builder

.getOrCreate()

)

sc = spark.sparkContext # the digits dataset

digits = datasets.load_digits()

X = digits["data"]

y = digits["target"] # create a classifier: a support vector classifier

classifier = svm.SVC()

param_grid = {

"C": [0.01, 0.01, 0.1, 1.0, 10.0, 20.0, 50.0],

"gamma": ["scale", "auto", 0.001, 0.01, 0.1],

"kernel": ["rbf", "poly", "sigmoid"]

}

scoring = "f1_weighted"

cv = 10# hyperparameter optimization

start = time.time()

model = DistGridSearchCV(

classifier, param_grid,

sc=sc, cv=cv, scoring=scoring,

verbose=True

)

model.fit(X,y)

print("Train time: {0}".format(time.time() - start))

print("Best score: {0}".format(model.best_score_))------------------------------

Spark context found; running with spark

Fitting 10 folds for each of 105 candidates, totalling 1050 fits

Train time: 3.380601406097412

Best score: 0.981450024203508

这个例子演示了一个常见的场景,在这个场景中,将数据拟合到内存中并训练单个分类器是很简单的,但是适合超参数优化所需的匹配数量会迅速增加。下面是一个运行网格搜索问题的例子,和上面的 sk dist 示例类似:

带sk-dist的网格搜索

对于 ibotta 传统机器学习的实际应用,我们经常发现自己处于类似这样的情况中:中小型数据(10k 到 1M 的记录)和许多简单分类器迭代以适应超参数调整、集成和多分类解决方案。

现有解决方案

传统的机器学习元估计器训练方法已经存在。第一个是最简单的:scikit-learn 使用 joblib 内置的元估计器并行化。这与 sk-dist 的操作非常相似,但是它有一个主要的限制:性能受限于任何机器的资源。即使与理论上拥有数百个内核的单机相比,Spark 仍然具有一些优势,如执行器的微调内存规范、容错,以及成本控制选项,如对工作节点使用 spot 实例。

另一个现有的解决方案是 Spark ML,它是 Spark 的一个本地机器学习库,支持许多与 scikit-learn 相同的算法来解决分类和回归问题。它还具有诸如树集合和网格搜索之类的元估计器,以及对多分类问题的支持。

分布在不同的维度上

如上所示,Spark ML 将针对分布在多个执行器上的数据来训练单个模型。当数据量很大,以至于无法存入一台机器上的内存时,这种方法可以很好地工作。然而,当数据量很小时,在单台机器上这可能会比 scikit-learn 的学习效果差。此外,例如,当训练一个随机森林时,Spark ML 按顺序训练每个决策树。此项工作的时间将与决策树的数量成线性比例,和分配给该任务的资源无关。

对于网格搜索,Spark ML 实现了一个并行参数,该参数将并行地训练各个模型。然而,每个单独的模型仍在对分布在执行器之间的数据进行训练。这项任务的总并行度只是纯粹按照模型维度来的,而不是数据分布的维度。

最后,我们希望将我们的训练分布在与 Spark ML 不同的维度上。当使用中小型数据时,将数据拟合到内存中不是问题。对于随机森林的例子,我们希望将训练数据完整地广播给每个执行器,在每个执行者身上拟合一个独立的决策树,并将这些拟合的决策树带回给驱动器,以集合成一个随机森林。这个维度比串行分布数据和训练决策树快几个数量级。

特征

考虑到这些现有解决方案在我们的问题空间中的局限性,我们内部决定开发 sk-dist。归根结底,我们希望发布的是模型,而不是数据。

虽然 sk-dist 主要关注元估计器的分布式训练,但它也包括很多其它模块,如 Spark 的 scikit-learn 模型的分布式预测模块等。分布式训练——使用 Spark 进行分布式元估计训练,支持以下算法:带网格搜索和随机搜索的超参数优化、带随机林的树集合、额外树和随机树嵌入,以及一对一和一对多的多分类策略。

分布预测——具有 Spark 数据帧的拟合 scikit-learn 估计器的预测方法。这使得带有 scikit-learn 的大规模分布式预测可以在没有 Spark 的情况下进行。

特征编码——分布特征编码使用被称为编码器的灵活特征变换器来完成。不管有没有 Spark,它都可以起作用。它将推断数据类型,自动应用默认的特征变换器作为标准特征编码技术的最佳实现。它还可以作为一个完全可定制的功能联合,如编码器,它的附加优势是与 Spark 匹配的分布式 transformer。

用例

以下是判断 sk-dist 是否适合解决你的机器学习问题的一些准则:传统的机器学习方法,如广义线性模型、随机梯度下降、最近邻、决策树和朴素贝叶斯等,都能很好地应用于 sk-dist,这些方法都可以在 scikit-learn 中实现,并且可以直接应用于 sk-dist 元估计。

中小型数据、大数据不能很好地在 sk-dist 中起作用。记住,分布式训练的维度是沿着模型的轴,而不是数据。数据不仅需要放在每个执行器的内存中,而且要小到可以传播。根据 Spark 配置,最大传播大小可能会受到限制。

Spark 定向和访问——sk-dist 的核心功能需要运行 Spark。对于个人或小型数据科学团队来说,这并不总是可行的。

这里一个重要的注意事项是,虽然神经网络和深度学习在技术上可以用于 sk-dist,但这些技术需要大量的训练数据,有时需要专门的基础设施才能有效。深度学习不是 sk-dist 的最佳用例,因为它违反了上面的(1)和(2)。

开始

要开始使用 sk-dist,请查看安装指南。代码库还包含一个示例库,用于说明 sk-dist 的一些用例。欢迎所有人提交问题并为项目做出贡献。

雷锋网(公众号:雷锋网)雷锋网雷锋网

雷锋网版权文章,未经授权禁止转载。详情见转载须知。

spark写出分布式的训练算法_利用 Spark 和 scikit-learn 将你的模型训练加快 100 倍...相关推荐

  1. spark写出分布式的训练算法_Spark0.9分布式运行MLlib的线性回归算法

    1 什么是线性回归 线性回归是另一个传统的有监督机器学习算法.在这个问题中,每个实体与一个实数值的标签 (而不是一个像在二元分类的0,1标签),和我们想要预测标签尽可能给出数值代表实体特征.MLlib ...

  2. java 不用if_Java 不用for不用if写出九九乘法表算法

    Java 不用for不用if写出九九乘法表算法代码如下: public class ss { public static void main(String[] args) { row(); } sta ...

  3. python卷积神经网络cnn的训练算法_【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理...

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  4. Spark 写出MySQL报错,java.sql.BatchUpdateException

    spark DataFrame 写出到MySQL时报如下错误: java.sql.BatchUpdateException: Column 'name' specified twice at sun. ...

  5. 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式...

    序言 本文以经典的二分查找为例,介绍如何使用循环不变式来理解算法并利用循环不变式在原始算法的基础上根据需要产生算法的变体.谨以本文献给在理解算法思路时没有头绪而又不甘心于死记硬背的人. 二分查找究竟有 ...

  6. plt保存图片_人工智能Keras CNN卷积神经网络的图片识别模型训练

    CNN卷积神经网络是人工智能的开端,CNN卷积神经网络让计算机能够认识图片,文字,甚至音频与视频.CNN卷积神经网络的基础知识,可以参考:CNN卷积神经网络 LetNet体系结构是卷积神经网络的&qu ...

  7. 我的spark学习之路(三):利用spark做回归分析

    spark的机器学习库(MLlib)下有简单的回归分析方法,今天只说最简单的线性回归,spark提供有两个回归分析库(mllib和ml),我学习的时候在网上也查了不少资料,有一个奇怪的现象是网上关于s ...

  8. AI模型训练无需购买设备啦!Tesar超算网络让AI模型训练更便捷!

    现代科技的发展可以用日新月异来形容,新技术的出现也是层出不穷.一个眨眼的功夫,一门足以改变世界的应用可能就被发明出来了,当然也有可能一个遥遥领先的企业瞬间被超越.处在风云变化时代,最重要的就是时间,就 ...

  9. python速度提高了吗_这一行代码,能让你的 Python运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. "一行代码让python的运行速度提高100倍" ...

最新文章

  1. R语言ggplot2可视化在lines线图的尾端添加线图标签、并且去除图例实战
  2. 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承...
  3. js验证身份证号,超准确
  4. Squid概述及相关配置说明
  5. 智能家居迈向体验型市场,Aqara如何做到先行一步?
  6. mysql 终端操作
  7. 【LOJ】#2887. 「APIO2015」雅加达的摩天楼 Jakarta Skyscrapers
  8. android手机游戏开发从入门到精通_unity3d游戏开发如何从入门到精通?
  9. python中a%b_Python中的a+=b和a=a+b之间的区别是什么?
  10. 华为AI战略完整披露!2款AI芯片首次曝光,拳打TPU,争锋英伟达
  11. 多线程(9)-JUC集合
  12. 一级计算机考试中的DBF,2017年计算机等考一级WPS2000辅导:使用DBF格式内容的方法...
  13. 高等数学 第七版 上册 下册 答案
  14. 使用miniSipServer为中小企业搭建VOIP服务器
  15. C6000 DSP技术深度探索---链接命令文件(cmd)
  16. 【排序】图解冒泡排序
  17. spring中创建excl表的几种方式并导出
  18. vscode文件名颜色含义与右侧字母含义
  19. 植物DNA甲基化专题 | nature:油棕Karma转座子表观遗传重要发现
  20. 推荐一些学习类APP

热门文章

  1. struts2 kindeditor teatarea拿不到值问题。
  2. IA-32系统编程指南 - 第三章 保护模式的内存管理【2】
  3. AutoRest - 具有 C# 和 Razor 模板的 Swagger 规范代码生成器。
  4. 在 WASI 上运行 .NET 7 应用程序
  5. 浅谈.Net异步编程的前世今生----异步函数篇(完结)
  6. ASP.NET Core 中的规约模式(Specification Pattern )——增强泛型仓储模式
  7. 墙裂推荐:这可能是CAP理论的最好解释
  8. .Net5 WPF快速入门系列教程
  9. 系统蓝屏的几种姿势,确定不了解下么?
  10. 程序员应对浏览器同源策略的姿势