责任编辑约5500字,提议写作15两分钟
责任编辑对借助MADlib工程项目来建立两个构架,以满足用户小规模信息量的市场需求。
随着统计数据规模的不断增加,目前,许多原有的预测应用软件系统都难以独当一面小规模信息量的排序各项任务。借助MADlib工程项目来建立两个构架,以满足用户小规模信息量的市场需求,该构架意在借助当代排序资源,提供更多适应环境销售业务市场需求的强悍应用软件系统。
简述
MADlib实现计划源自商业性课堂教学、学术和开放源码合作开发街道社区的各方面不懈努力,它是两个如前所述SQL的资料库内建的可扩充的开放源码机器学习库,由Pivotal与UCBerkeley联合合作开发。MADlib创会于2011年,当时归属于EMC/Greenplum,而后Greenplum变为了pivotal的Greenplum。主要由康奈尔大学的研究者:Joe Hellerstein发动,Stanford, University of Wisconsin-MADISON和University of Florida析网络平台。
MADlib提供更多了多样的预测数学模型,包括重回预测,排序机程序,乱数丛林,可排序性进行分类,矢量机,信用风险数学模型,KMEAN涌进,文档发掘,统计数据奇偶校验等。MADlib全力支持Greenplum,PostgreSQL 以及 Apache HAWQ, In-Database Analytics的优点使其大幅扩充了资料库的预测机能,充分借助MPP构架使其能够加速处置海量集。
责任编辑将为大家如是说MADlib的基本构架,工作基本原理及优点,并为合作开发者提供更多加速进阶手册。
ADlib创会于2011年,2015年7月MADlib正式成为Apache应用软件促进会的创业团队工程项目,经过一年的发展,于2017年8月正式成为Apache世界顶级工程项目。整座工程项目和标识符是在Apache上是开放源码的,已经正式宣布正式发布了MADlib 1.14、MADlib 1.15、MADlib 1.15.1、MADlib 1.16 等数个正式宣布版。
Apache MADlib 构架
MADlib有以下三个主要组件:
Python 驱动函数C++ 实现函数C++ 资料库抽象层Python 驱动函数位于如下子目录中:
https://github.com/apache/incubator-madlib/tree/master/src/ports/postgres/modules
这些机能是用户输入的主要入口点,主要负责算法的流程控制。一般来说,实现包括验证输入参数、执行SQL语句、评估结果和潜在的循环来执行更多的SQL语句,直到达到收敛标准为止。
C++实现函数大多数位于如下子目录中:
https://github.com/apache/incubator-madlib/tree/master/src/modules
这些函数是特定算法所需核心函数和集合的C++定义。由于性能原因,这些都是在C++而不是Python中实现的。
C++ 资料库抽象层大多数位于如下子目录中:
https://github.com/apache/incubator-madlib/tree/master/src/dbal
和:
https://github.com/apache/incubator-madlib/tree/master/src/ports/postgres/dbconnector
这些函数试图提供更多两个编程接口,将所有Postgres内部细节抽象掉,并提供更多一种机制,使MADlib能够全力支持不同的后端网络平台,并专注于内部机能而不是网络平台集成逻辑。
MADlib构架的主要理念:
在本地资料库中操作统计数据。无需在数个运行时环境之间进行不必要的统计数据移动。借助最好的breed资料库引擎,将机器学习逻辑与资料库特定的实现细节相剥离借助MPP共享技术,如Greenplum资料库,提供更多并行性和可伸缩性。开放的实施维护措施,与Apache街道社区和正在进行中的学术保持密切的联系。合作开发者加速进阶指南
准备工作
可以按照MADlib安装手册中的步骤安装MADlib,也可以使用下面的Docker映像指令来安装。
MADlib源标识符的组织方式如下:机器学习或统计模块的核心逻辑位于两个公共位置,资料库端口特定的标识符位于 ports文件夹中。由于当前全力支持的所有资料库都是如前所述Postgres的, 所以Postgres端口包含所有特殊端口的文件,并从中继承 greenplum和 hawq文件。在继续使用本手册之前,提议熟悉一下 MADlib module anatomy 这个文档。
Docker映像
Docker映像提供更多了在PostgreSQL 9.6上编译和测试MADlib所必需的依赖性,可以在 /tool/docker/base/docker file_postgres_9_6中查看到依赖项docker文件,映像位于docker hub上的 madlib/postgres U 9.6:latest,稍后将为Greenplum资料库提供更多两个类似的Docker映像。
使用Docker文件的一些常用命令:
##1)从docker hub下拉“madlib/postgres”U 9.6:latestyin映像: docker Pull madlib/postgres”U 9.6:latest ##2)启动与MADlib映像对应的容器,将源标识符文件夹装入容器:docker run-d-it–name MADlib-v(incubator-madlib目录的路径):/incubator MADlib/MADlib/postgres U9.6 其中incubator-madlib是MADlib源标识符所在的目录。 ##############################################*警告*################################################## #请注意,如上图所示安装时,在“incubator-madlib” Docker容器中的文件夹中所做的任何变动 #将反映在本地磁盘上(反之亦然)。这意味着从Docker容器中删除已装入卷中的统计数据也会导致本地磁盘中统计数据丢失。 ############################################################################################################# ##3)容器启动后,连接到它,并构建MADlib: docker exec-it MADlib bash mkdir/incubator madlib/build docker cd/incubator madlib/build docker cmake.. make doc make install ##4)安装MADlib: src/bin/madpack-p postgres-c postgres/postgres@localhost:5432/postgres install ##5)运行其他几个madpack命令: #对所有模块进行运行安装检查: src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check #在特定模块(比如说svm)上运行install check: src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check -t svm #在所有模块上运行dev check(比install check更全面): src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres dev-check #在特定模块上(比如说svm)运行dev check: src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres dev-check -t svm #重新安装MADlib: src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres reinstall ##6)杀死并移除容器(退出容器后): docker Kill madlib docker rm madlib添加新模块
添加两个名为 “hello_world” 新模块。在这个模块中,实现了两个名为 avg_var的用户自定义的SQL聚合(UDA),它排序表的给定数值列的平均值和方差。在此,将实现两个分布式版的Welfords online algorithm(Welford在线算法)来排序均值和方差。
与PostgreSQL中的普通UDA不同, avg_ar也可以在分布式资料库上运作,并借助底层分布式网络进行并行排序。使用avg_var也十分简单,用户仅需运行如下psql命令:
之后,将在屏幕上打印三个数值:均值、方差和名为bath的表格中的行数。
通过以下几步实现:
注册模块。定义SQL函数。在C++中实现函数。注册C++头文件。此练习的文件的源标识符可以在hello world文件夹 中找到。
1.注册模块
在 /src/config/目录下的名为 Modules.yml的文件中添加以下行
并建立两个文件夹:
/src/ports/postgres/modules/hello-world和 /src/modules/hello-world。这两个文件夹的名称应和Modules.yml 中定义的模块名称相匹配。2.定义SQL函数
在
./src/ports/postgres/modules/hello_world文件夹下建立avg_var.sql_in文件,在这个文件中,定义了用于排序均值和方差的聚合函数和其他辅助函数。这些函数将在单独的C++文件中实现,将在下一节中对其进行描述。在avg_var.sql_in文件的初始部分,必需借助命令行 m4_include(SQLCommon.m4) 运行m4 宏处置器(m4 macro processor)。借助M4在SQL定义中添加网络平台专属的命令,并在将MADlib部署到资料库时运行。
借助内建的PostgreSQL 命令CREATE AGGREGATE 定义聚合函数avg_var。
同时定义传递给CREATE AGGREGATE的参数:
SFUNC为每个输入行调用的状态转换函数命名。在这个例子中,状态转换函数avg_var_transition,与avg_var.sql_in在同两个文件定义,之后在C++中得以实现。
FINALFUNC在遍历所有输入行之后,调用最终函数的名称来排序聚合结果。例如:最终函数, avg_v ar_final, 与avg_var.sql_in在同两个文件定义,之后在C++中得以实现。
PREFUNC在遍历每个统计数据段或分区之后,调用合并函数以合并聚合状态值的名称。Greenplum和HAWQ上的分布式统计数据集需要合并函数。对于PostgreSQL而言,统计数据不是分布式的,合并函数并非必需。为了完整起见,我们在本手册中实现了两个名为 avg_var_merge_states的合并函数。
INITCOND状态值的初始条件。在本例中,借助两个全零双数组,分别对应于平均值、方差和行数。
最终函数的遍历和合并,在与avg_var.sql_in同两个文件中作为聚合函数定义。有关这些函数的更多详细信息可以在 PostgreSQL文档中找到。
在C++中实现函数
在文件夹 /src/modules/hello\u world下建立头文件和源文件 avg_ar.hpp和 avg_ar.cpp。在头文件中借助宏DECLARE_UDF(MODULE, NAME)申明最终函数的遍历和合并。例如,转换函数 avg_var_transi tion声明为 DECLARE_UDF(hello_world,avg_var_transition)。在
./src/ports/postgres/dbconnector 文件夹下的dbconnector.hpp 文件里定义DECLARE_UDF宏。在hood下,三个UDF均申明为 dbconnector::postgres::UDF的子类。这些UDF的行为完全由其成员函数决定。
换句话说,只需要在 avg_ar.cpp文件中实现以下方法:
这里, AnyType类既用于从DBMS传递数据到C++函数,又将返回C++的值。
有关更多详细信息,, 请参阅头文件 TypeTraits _impl.hpp。
转移函数:
avg_var_transition, 有两个参数,在 avg_var.sql_in中进行定义。第两个是SQL double类型的数组,对应于当前遍历的平均值、方差和行数,第二个是表示当前元组值的double类型。
稍后将描述 class AvgVarTransitionState。基本上,它采用了args[0],SQL双精度数组,将统计数据传递给适当的C++类型,并将它们存储在state实例中。
通过在AvgVarTransitionState类中加载+= 操作符来在线排序均值和方差。
合并函数
此外: AnyType& args中包含的参数,在avg_var.sql_in 中进行定义。
详细信息隐含于AvgVarTransitionState 的方法中。
最终函数
AvgVarTransitionState类加载AnyType() 运算符后可以直接返回状态,AvgVarTransition State 的示例返回AnyType.
桥接类
Below are the methods that overload the operator +=for the bridging class AvgVarTransitionState:
通过下述方法为桥接类AvgVarTransitionState: 加载运算符+=
给定两个统计数据集的均值、方差和大小,借助Welford方法排序两个统计数据集组合的均值和方差。
注册C++头文件
在 avg_var.sql_in中定义的SQL函数需要能够从C++文件中找到实际的实现。这只需在 /src/modules/目录下的declarations.hpp文件中添加以下行即可完成
运行新模块
借助新模块运行两个示例。首先,根据 安装手册中的说明重建并重新安装MADLib,并使用MADlib加速进阶手册中的 pati ents统计数据集进行测试。从 psql终端来看,20名患者中有一半在1年内发生过第二次心脏病发作(yes=1):
示例:添加两个迭代UDF
在这里,将演示两个稍微复杂一点的示例,该示例要求迭代调用UDA。这种情况经常出现在许多机器学习模块中,在这些模块中,底层优化算法向目标函数的优化方向迭代。在这个例子中,实现了两个简单的对数重回解算器作为迭代UDF。特别是,用户可以在 psql中键入以下命令来训练逻辑重回进行分类器:
结果如下:
这里的统计数据存储在两个名为 patients的SQL表中。logistic重回的目标是second_attack列,特征是treatment列和trait_anxiety列。数组中的 1项表示数学模型中的附加偏移项。
将解算器添加到上面建立的 hello_world模块中。主要步骤如下:
与上一小节中如是说的步骤相比,这里无须修改 Modules.yml文件,因为我们没有建立新模块。另外一点与上一小节的区别是除.sql_in 文件之外,还建立了两个附加的python文件.py_in.,在此文件中实现绝大多数对数迭代。
此练习的文件可以在源标识符存储库的 hello world文件夹中找到。注意:该文件夹中不包括__init__.py_in文件。
1.简述
整座逻辑分为三个部分。在simple_logistic.sql_in 中定义了全部的UDF 和UDA。转换、 合并和 最终函数在C++中实现。这些函数共同构成了两个称为 logreg_simple_step的UDA,它从当前状态下进一步来逼近对数重回的目标。最后,在 simple_logistic.py_in中,采用 plpy包在python中实现两个名为 logregr_simple_train的UDF,它迭代调用 logregr_simple_step直到收敛。
注意:在simple_logistic.sql_in 文件中,定义了如下名为logregr_simple_train的SQL 函数:
其中, python function(hello_world,simple_logistic,logreg_simple_train)的实际实现由hello_world模块中的simple_logistic文件的python函数 logreg_simple_train提供更多,如下所示:
2.plplply中的迭代过程
迭代逻辑使用 PL/Python过程语言实现。在simple_logistic.py_in文件的开始部分,导入两个名为 plpy的Python 模块,借助它来实现资料库的命令。使用 plpy实现迭代逻辑很简单,如下所示:
logregr_simple_step是在 simple_logistic.sql_in文件中定义的UDA,借助/src/modules/hello_world. 目录下的C++文件实现实现转换合并等机能。
__logregr_simple_step 有三个参数,分别为:目标,特征和先前状态。
.状态初始化为 None,在SQL中通过 plpy解释为 null值。
更为复杂的对数重回迭代计划还将包括最优性验证和收敛保证过程,为了简单起见,这里特意忽略这些过程。
有关对数重回的生产级实现,请参阅regress模块。
3.运行新的迭代模块
下面的示例演示了在前面使用的名为patients表上使用
madlib.logreg_simple_train的方法。经过训练的进行分类数学模型存储在名为 logreg_mdl的表中,可以使用标准SQL查询查看。结语
在本文中,如是说了的基本构架,工作基本原理及优点,并为合作开发者加速进阶提供更多了手册,文中详细描述了添加两个迭代UDF 的详细步骤,希望对大家进阶有所帮助。
作者简介
陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城排序机应用软件与系统公司工程师,大唐微电子公司工程师。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处置(NLP)方面积累有一定的经验。