当前位置: 首页 > 编程日记 > 正文

异类框架BigDL,TensorFlow的潜在杀器!

640?wx_fmt=jpeg


作者 | Nandita Dwivedi

译者 | 风车云马

责编 | Jane

出品 | AI 科技大本营(id:rgznai100)


【导读】你能利用现有的 Spark 集群构建深度学习模型吗?如何分析存储在 HDFS、Hive 和 HBase 中 tb 级的数据吗?企业想用深度学习模型,可是要考虑的问题又很多,怎么破?这篇文章中,我们将给大家讲讲大数据+深度学习下,BigDL 框架的利弊与应用教程,为什么有了 TF、PyTorch,还是会考虑用 BigDL?

 

为什么要讲 BigDL?

 

这几年,曾被称为 “3S”,因其简单、快速并支持深度学习的 Apache Spark 非常流行。许多公司利用 Hadoop 和 Spark 环境来构建强大的数据处理 pipeline,对分布式集群上的大量数据进行预处理,并从中挖掘出业务提升的新观点。现在许多公司都希望能利用深度学习的模型帮助自己进一步改善业务。虽然深度学习模型的性能在不断提高,但是想要在现有的平台上部署新技术也还有很多问题需要权衡,比如:

 

(1)如果用深度学习的方法,还可以利用原有的 pipeline 吗?

(2)当深度学习遇到大规模数据集时,“大规模深度学习”如何能保证其有效性?

(3)基于现有的 Spark / Hadoop 集群是否可以用?

 

为什么要权衡这些问题其实不难理解,我们需要保持一致的环境,避免大型数据集跨不同集群之间的传递。此外,从现有的基础设施中移动专有数据集也有安全风险与隐患。早期时解决这些问题的方法是在 Spark 上直接加入深度学习框架,但并不能保证保持它们之间的一致性,因此,后来产生了基于 Spark 的 BigDL 平台,其继承了 3S 的主要特点:简单、快速、支持深度学学习。


640?wx_fmt=jpeg


提到 BigDL 框架,也许大家对他的熟悉度不高,下面我们就先为大家简单的介绍一下什么是 BigDL 框架。

 

BigDL 是一个分布式的深度学习框架,在大数据分析领域发展迅速,并且也是一个开源的框架。BigDL 有很多特点,比如:与 Spark 和 Hadoop 生态系统进行了完整集成,具有可拓展性等很多重要的功能。可根据数据大小在任意集群中训练模型、支持构建端到端的大数据分析与深度学习等 pipeline、可执行数据并行分布式训练,实现高可扩展性。BigDL 用户可在 Spark 和大数据平台上构建了大量数据分析与深度学习的应用,如视觉相似性、参数同步、比例缩放等。

      640?wx_fmt=png       

深度学习应用程序可以编写为标准的 spark 库。这些 Spark 框架中统一的库可以读取大量数据。此外,它还支持 Numpy、Scipy、NLTK、Pandas 等 Python 库;与 TensorBoard 集成用于可视化分析;支持加载现有的 Torch 模型。企业客户使用 BigDL 和Spark 还有一个重要的原因,相比 TensorFlow,BigDL 不仅更快,通过并行计算它能够更快地重新训练模型。


分享一位网友对 BigDL 的总结:

BigDL相对于其他主流的深度学习框架(TensorFlow/Caffe/PyTorch),算是一个异类。其异有二:(1)CPU、(2)纯分布式(Spark)


虽然业界普遍不看好CPU跑深度学习,但实际上还是有需求的。比如,现有Hadoop集群的公司,复用现有集群来跑深度学习是最经济的方案。

并且,充分优化后的CPU集群的性能还是挺可观的。拿BigDL来说,MKL + 多线程 + Spark,充分发挥了分布式集群的优势 。尤其是在Inference方面,堆CPU的方案在性价比上很可能是优于GPU的,毕竟Nivdia的计算卡是很昂贵的。


另外,数据挖掘以及Information Retrieval等领域中常用的神经网络结构一般都比较浅,多为稀疏网络,也很少用到卷积层。GPU并不十分擅长处理这样的网络结构。

考虑到实际的生产环境,跑在Spark上的BigDL背后有整个Spark/Hadoop大生态的支持。配合近期很火的SMACK技术栈,可以很轻松愉快的构建端到端的生产级别的分布式机器学习流水线。由于没有异构集群数据传输的开销,从端到端这个层面来看,CPU方案的性能反而可能占优。
最后,谈谈可用性,BigDL项目正在快速的迭代中。语言层面支持Scala/Python。API方面有torch.nn风格的Sequenial API,也有TensorFlow风格的Graph API,以及正在开发的keras API。Layer库也很齐全,自定义Layer也很方便。兼容性方面,BigDL兼容了Caffe/Torch/Keras,以及部分TensorFlow模型。换言之,你可以把用TF/Caffe训练的模型,导入BigDL做Inference。反之,亦可。这是一个非常有用的Feature。

综上,BigDL虽然并不主流,但在很多场景下是有成为"大杀器"潜质的,包括但不限于:

  • 已有大规模分布式集群的(如: Hadoop集群)

  • 需要大规模Inference的,比如:推荐系统、搜索系统、广告系统

  • (上下游)依赖Spark/Hadoop生态的

  • 轻度深度学习使用者,如:数据研发工程师/数据挖掘工程师

  • Scala/JVM爱好者


作者:AlfredXXfiTTs
https://www.zhihu.com/question/54604301/answer/338630738


Analytics Zoo 分析库

 

和 Python 生态系统中庞大的标准或三方库相比,Spark 明显还处于起步阶段。Keras、TensorFlow 和 PyTorch 等大多数库都还不能与 Spark 兼容,因为它们不支持Spark 分布式计算的底层核心框架。那要如何弥补这一不足呢?这里为大家介绍一个英特尔开发的分析工具——Analytics Zoo,它提供了一组丰富的高级 API 可以将BigDL、Keras 和 TensorFlow 程序无缝集成到 Spark 的 pipeline 中;还有几个内置的深度学习模型,可用于对象检测、图像分类、文本分类等。该库还提供端到端的参考用例,如异常检测、欺诈检测和图像增强,以将机器学习应用于实际问题。

 

为了帮助大家能更具体、实际的理解这个工具的一些功能与用法,下面分享一个关于 BigDL 和 Analytics Zoo 的简短教程,向大家展示如何使用预先训练好的模型实现迁移学习,并在 Spark 集群上进行训练。

 

教程实践

 

数据集:ResNet-50,包含蚂蚁和蜜蜂图像的小数据集来实现迁移学习。

预训练模型:可以将给定的图像在 1000 个标签中进行分类;

模型训练与预测:特定用例通过迁移学习重新训练模型,对包含蚂蚁和蜜蜂的训练集进行预测。BigDL 和 Analytics Zoo 支持在 Spark 的分布式框架上进行训练。(注意,最初的 ResNet-50 标签中没有“蚂蚁”和“蜜蜂”。)

       640?wx_fmt=png       

使用 pip 即可安装 BigDL 和 Analytics Zoo,如下所示:


#for Python3	
pip3 install BigDL	
pip3 install analytics-zoo

 

安装之后,在开始之前先下载 ResNet 50 的预训练模型、训练与测试数据集。数据包需要解压缩。使用 Analytics Zoo 中的 init_nncontext 函数导入并初始化 Spark,然后定义预训练模型、训练与测试数据集的路径。

 

import os	from bigdl.nn.criterion import *	from bigdl.nn.layer import *	from bigdl.optim.optimizer import Adam	from pyspark.ml import Pipeline	from pyspark.ml.evaluation import MulticlassClassificationEvaluator	from pyspark.sql.functions import col, udf	from pyspark.sql.types import DoubleType, StringType	from zoo.common.nncontext import *	from zoo.feature.image import *	from zoo.pipeline.nnframes import *	sc = init_nncontext("TransferLearningBlog")


接下来,创建 Spark UDF 来提取文件名称。标签是通过检查文件名称是否包含关键字“ants”或“bees”来分配的。使用这两个 udf,构造训练和测试数据集。

 

# Define udfs to extract filename and generate labels in floats	getFileName = udf(lambda row: os.path.basename(row[0]), StringType())	getLabel = udf(lambda row: 1.0 if 'ants' in row[0] else 2.0, DoubleType())	# Construct training dataframe	trainingDF = NNImageReader.readImages(train_path, sc, resizeH=300, resizeW=300, image_codec=1)	trainingDF = trainingDF.withColumn('filename', getFileName('image')).withColumn('label', getLabel('image'))	# Construct validation dataframe	validationDF = NNImageReader.readImages(val_path, sc, resizeH=300, resizeW=300, image_codec=1)	validationDF = validationDF.withColumn('filename', getFileName('image')).withColumn('label', getLabel('image'))


为了正确构建模型,需要对所有图像进行标准化。Analytics Zoo 有 API 来操作转换、链接等,使后面可以按顺序进行处理。

 

如下所示,加载预训练 ResNet-50 模型

 

# Create a chained transformer that resizes, crops and normalizes each image in the dataframe	transformer = ChainedPreprocessing(	[RowToImageFeature(), ImageResize(256, 256), ImageCenterCrop(224, 224),	ImageChannelNormalize(123.0, 117.0, 104.0), ImageMatToTensor(), ImageFeatureToTensor()])	# Load pre-trained Resnet-50 that was downloaded earlier and give the column to pick features from	preTrainedNNModel = NNModel(Model.loadModel(model_path), transformer) \	.setFeaturesCol("image") \	.setPredictionCol("embedding")	# Print all layers in Resnet-50	for layer in preTrainedNNModel.model.layers:	print(layer.name())


ResNet-50 的最后 5 层是:

 

res5c_relu	
pool5	
Viewf42780f5	
fc1000	
prob


模型的最后一层的输出是 2 个类(蚂蚁、蜜蜂),而不是ResNet-50训练的1000个类。该模型的输入维数为 1000,输出维数为 2。通过迁移学习,该模型可以在 25 步内完成这两个新类的训练!这一点也说明了迁移学习的实用性。

 

# Create a last layer with input dimension of 1000 that outputs 2 classes of ants and bees	# Epochs are set to 25 and the optimizer is SGD	lrModel = Sequential().add(Linear(1000, 2)).add(LogSoftMax())	classifier = NNClassifier(lrModel, ClassNLLCriterion(), SeqToTensor([1000])) \	.setOptimMethod(SGD(learningrate=0.001, momentum=0.9)) \	.setBatchSize(4) \	.setMaxEpoch(25) \	.setFeaturesCol("embedding") \	.setCachingSample(False)	# Change the last layer in the pipeline	pipeline = Pipeline(stages=[preTrainedNNModel, classifier])

 

现在,开始训练和测试模型。Spark 允许跨多个集群进行更快的训练。

 

# Train the model and get predictions on the validation set	antbeeModel = pipeline.fit(trainingDF)	predictionDF = antbeeModel.transform(validationDF).cache()	predictionDF.sample(False, 0.1).show()	# Evaluate predictions	evaluator = MulticlassClassificationEvaluator(	labelCol="label", predictionCol="prediction", metricName="accuracy")	accuracy = evaluator.evaluate(predictionDF)	# expected error should be less than 10%	print("The Test Error is = %g " % (1.0 - accuracy))


最后,对测试数据进行分类,显示图像。

 

# Test dataframe	testDF = NNImageReader.readImages(test_path, sc, resizeH=300, resizeW=300, image_codec=1)	testDF = testDF.withColumn('filename', getFileName('image')).withColumn('label', getLabel('image'))	testPredDF = antbeeModel.transform(testDF).cache()	row = testPredDF.first().asDict()	# showImage function	def showImage(row):	# Open file	plt.imshow(Image.open(row['image'][0][5:]))	# Map prediction to class	title = 'ants' if row['prediction'] == 1.0 else 'bees'	plt.title(title)	showImage(row)


测试数据分类结果的图像显示:

       640?wx_fmt=png


如果数据集比较大,恰好存储在 HDFS 中,也可以使用相同的方法,将其扩展到更大的集群上。正是 BigDL让这些大数据集的数据分析更加快速和高效。除此之外,它还可与 Spark SQL 和结构化数据紧密耦合。例如,Kafka 数据可以直接传递给 BigDL UDF,进行实时预测和分类。


原文链接:

https://medium.com/sfu-big-data/when-deep-learning-got-big-a833a69be460


(*本文为 AI科技大本营编译文章,转载请微信联系 1092722531


精彩推荐



大会开幕倒计时6天!


2019以太坊技术及应用大会特邀以太坊创始人V神与众多海内外知名技术专家齐聚北京,聚焦区块链技术,把握时代机遇,深耕行业应用,共话以太坊2.0新生态。即刻扫码,享优惠票价。


640?wx_fmt=png

推荐阅读

  • 华为最强自研NPU问世,麒麟810“抛弃”寒武纪

  • 真正的博士是如何参加AAAI, ICML, ICLR等AI顶会的?

  • Python最抢手、Java最流行、Go最有前途,7000位程序员揭秘2019软件开发现状

  • 程序员学Python编程或许不知的十大提升工具

  • 不要让 Chrome 成为下一个 IE!

  • 这位博士跑赢“地震波”:提前 10 秒预警宜宾地震!

  • 一张图告诉你到底学Python还是Java!

  • 鸿蒙将至,安卓安否?

  • 25岁创立加密城堡, 曾经独角兽创始人社会名流天才黑客是这里的沙发客, 如今却无人问津……

  • 352万帧标注图片,1400个视频,亮风台推最大单目标跟踪数据集


640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

相关文章:

对IsUnderPostmaster变量初步学习

开始 在postmaster.c 中的 BackendStartup 中,有如下的代码: 其中定义了 IsUnderPostmastertrue。 而bgwriter 作为 postmaster 的子进程,它的 IsUnderPostmaster 也是为真。 * BackendStartup -- start backend process** returns: STATUS_…

C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

转自&#xff1a;http://hi.baidu.com/andywangcn/blog/item/10ba730f48160eeb37d122e9.html 配置文件中经常用到ini文件&#xff0c;在VC中其函数分别为&#xff1a; #include <Windows.h> //wince,WMobile.ppc不支持这几个函数 写入.ini文件&#xff1a;bool WritePriv…

地图下载2之天超图瓦片格式

接上一篇《地图下载1之天地图瓦片解析》&#xff0c;我们已经知道了天地图的瓦片格式&#xff0c;现在来分析一下超图中瓦片的存储结构。 其实&#xff0c;在GIS领域&#xff0c;只有像ESRI这样强大公司的SHP文件等能通用外&#xff0c;很多数据、格式等都不通用&#xff0c;都…

server 2003登录界面黑屏的解决办法

1、备份注册表&#xff08;为了安全起见&#xff09;具体办法&#xff1a;开始-> 运行窗口输入“regedit.exe”->回车->找到注册表->文件->导出->完成&#xff1b; 2、复制下面的文件内容到记事本然后另存为格式为.reg注册表扩展名导入注册表&#xff1b; Wi…

“学了半年后,我要揭开Python 3宗罪!”

有人曾说&#xff0c;未来只有2种人&#xff0c;会Python的人和....不懂Python的小学生&#xff0c;虽有夸张&#xff0c;这也意味着Python越来越重要了&#xff0c;究竟这门语言厉害在哪里&#xff1f;以下为你总结了Python3宗“罪”&#xff01;Python凭啥这么优秀&#xff1…

连表/子查询/计算的sql

看不懂的sql语句 1.select om.*,money,cus.c_type,cus.c_weixin_name,isnull(cus.c_discount,0) c_discount,isnull(om.o_money-om.o_money*cus.c_discount,0) money1,isnull(money*(i_year_pointi_month_potinti_piece_point),0) money2,isnull((om.o_money-om.o_money*cus.c_…

vc6静态库的生成和调用

1、静态库的生成&#xff1a; 在vc6.0中CtrlN选择Projects下的Win32 Static Library&#xff0c;Project name:SumLib,点击OK&#xff0c;下一页中的两项可选可不选&#xff0c;点击Finish完成。 在此工程中新建lib.h和lib.cpp两个文件&#xff0c;源码如下&#xff1a; //lib.…

实例变量的访问及数据封装

你已经看到处理分数的方法如何通过名称直接访问两个实例变量numerator和denominator。事实上&#xff0c;实例方法总是可以直接访问它的实例变量的。然而&#xff0c;类方法则不能&#xff0c;因为它只处理本身&#xff0c;并不处理任何类实例&#xff08;仔细想想&#xff09;…

清华成立视觉智能研究中心,邓志东任中心主任

整理 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;6月21日&#xff0c;清华大学人工智能研究院视觉智能研究中心正式成立&#xff0c;清华大学副校长、清华大学人工智能研究院管委会主任尤政院士&#xff0c;清华大学人工智能研究院院长张钹院士出席成…

Java并发编程(一)Thread详解

一、概述 在开始学习Thread之前&#xff0c;我们先来了解一下 线程和进程之间的关系&#xff1a; 线程(Thread)是进程的一个实体&#xff0c;是CPU调度和分派的基本单位。 线程不能够独立执行&#xff0c;必须依存在应用程序中&#xff0c;由应用程序提供多个线程执行控制。 线…

MFC如何打开文件路径

转自&#xff1a;http://linyangmumu.blog.163.com/blog/static/6903134920101024419380/ 1.void OpenFile&#xff08;&#xff09; { CString m_FileDir; BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner m_hWnd; bi.ulFlags BIF_RETURNONL…

HDOJ_ACM_数塔

Problem Description在讲述DP算法的时候&#xff0c;一个经典的例子就是数塔问题&#xff0c;它是这样描述的&#xff1a;有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f;已经…

会数据分析的人别再低调了,我怕你会因此错失100万奖金

大家好我是一般周一不冒头一冒头就不一般的柚柚今天我给大家带来了一个好消息那就是“易观方舟Argo杯数据创客大赛”开始接受报名了&#xff01;请不要怀疑就是那个国内领先的大数据公司——『易观』联合20家创新企业筹备了整整两个月的大赛正规、专业、含金量极高&#xff01;…

CxImage类库的简介

转自&#xff1a;http://www.sudu.cn/info/html/edu/20080403/259688.html CxImage类库是个优秀的图像操作类库。他能快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图像库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;他们可谓是功能…

MySQL 5.5 服务器变量详解(二)

innodb_adaptive_flushing{ON|OFF} 设定是否允许MySQL服务器根据工作负载动态调整刷写InnoDB buffer pool中的脏页的速率。动态调整刷写速率的目的在于避免出现IO活动尖峰。默认值为ON。作用范围为全局级别&#xff0c;可用于选项文件&#xff0c;属动态变量。innodb_adaptive_…

一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

票据自动处理系统著名研究团队

国际上对票据自动处理系统的研究始于上世纪80年代&#xff0c;俄罗斯、美国、加拿大、日本、巴西等国在这个领域的研究工作开展得比较深入&#xff0c;著名的研究团体如加拿大Concordia大学的CENPARMI中心、MIT的PROFIT实验室、俄罗斯ABBYY软件公司、Mitek Systems公司CheckQue…

iOS开发之AVKit框架使用

2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一、引言 在iOS开发框架中&#xff0c;AVKit是一个非常上层&#xff0c;偏应用的框架&#xff0c;它是基于AVFoundation的一层视图层封装。其中相关文件和类都十分简单&#xff0c;本篇博客主要整…

DirectX10 学习笔记2:在多文档框架中初始化DirectX 10

显示功能是在视图类中完成的&#xff0c;所以DX10的初始化及绘制工作都是视图类中完成。 首先建立一个多文档工程&#xff0c;工程名为02_01&#xff0c;在视图类头文件中加载相关的库&#xff0c;并包含头文件&#xff1a; 在视图类的头文件中添加DX10相关的成员&#xff1a; …

碾压Bert?“屠榜”的XLnet对NLP任务意味着什么

作者张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前担任新浪微博机器学习团队 AI Lab 负责人。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。他是技术书籍…

ORACLE中通过DBMS_CRYPTO包对表敏感字段进行加密

http://doc.primeton.com/pages/viewpage.action?pageId4917998

02 使用百度地图获得当前位置的经纬度

O 需求 通过百度地图&#xff0c;获取用户当前位置的经纬度 一 准备 确保你已按照上篇《01 如何将百度地图加入IOS应用程序&#xff1f;》完成了相关功能。本篇将在上一篇的基础上进行修改。 二 编码 (New标示本次新添加的代码&#xff1b;Delete表示本次需要删除的代码&#x…

中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019

作者| Yuxian Meng、Xiaoya Li、Xiaofei Sun、Qinghong Han、Arianna Yuan、 Jiwei Li译者 | Rachel责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】通常&#xff0c;中文文本处理的第一步称为分词&#xff0c;这好像已经成为一种“共识”&#…

Netty 粘包 拆包 编码 解码 序列化 介绍

目录&#xff1a; 粘包 & 拆包及解决方案 ByteToMessageDecoder基于长度编解码器基于分割符的编解码器google 的 Protobuf 序列化介绍其他的前言 Netty 作为一个网络框架&#xff0c;对 TCP 连接中的问题都做了全面的考虑&#xff0c;比如粘包拆包导致的半包问题&#xff0…

matlab 全局变量

转自&#xff1a;http://matlab.net.cn/matlabjichu/2010/201005/265.html 如果你要多于一个函数共用一个简单的变量&#xff0c;简单的处理方法就是把这个变量在所有函数中定义为global全局变量。在命令行做同样的事情&#xff0c;如果你要工作空间访问上述变量。这个全局变量…

java 解决Html table的rowspan问题(osc处女作)

2019独角兽企业重金招聘Python工程师标准>>> 假如有如下html代码需要解析 <table border"1"><tr><td rowspan"3">1</td><td>1</td><td>1</td><td>1</td></tr><tr>&l…

基于C++的OpenCV常用函数

C版本的好处&#xff1a; 1、在于可以尽量避免使用指针这种危险的东西&#xff1b; 2、不用费心去release资源了&#xff0c;因为在其destructor里面&#xff0c;系统会自动帮你搞定。 3、在某些情况下会比C版本运行速度快。 在文件中包含 using namespace cv; 1. i…

基于GAN的图像水印去除器,效果堪比PS高手

作者 | 李翔转载自视说AI&#xff08;ID:techtalkai&#xff09;简介&#xff1a;李翔&#xff0c;国内某互联网大厂AI民工&#xff0c;前携程酒店图像技术负责人&#xff0c;计算机视觉和深度学习重度爱好者&#xff0c;在ICCV和CVPR等会议上发表论文十余篇。写在前面当前互联…

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

作者 | 机智的王知无转载自大数据技术与架构&#xff08;ID: import_bigdata&#xff09;一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型&#xff0c;降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015 年开始&#xff0c;阿里巴巴开始…

SQL SERVER中ROLLUP的用法

cube操作符 要使用cube&#xff0c;首先要了解group by 其实cube和rollup区别不太大&#xff0c;只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别&#xff0c; cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话&#xff0c; s…