级别: 中级 Elad Yom-Tov (yomtov@il.ibm.com), 资深研究员, IBM India Software Lab Services and Solutions
2007 年 5 月 16 日 IBM Parallel Machine Learning(PML)Toolbox 可以从 IBM® alphaWorks 下载获得,它使您能够在并行平台上运行机器学习算法。它可以在合理的计算时间内在大型数据集上对这种算法进行训练。这个工具包包括了几个算法,以及用来添加自己的算法的 API。PML Toolbox 是 IBM Haifa Research Lab 的 Machine Learning 小组与 IBM T.J. Watson Research Lab 的 Data Analytics 部门之间的合作成果。PML Toolbox 开发小组的成员在本文中将解释它们开发这个工具包的动机,介绍其中包含的算法,并展示如何添加自己的算法。
开发 IBM Parallel Machine Learning Toolbox 的缘由
>
如今,大型的数据集在应用程序中非常常见,例如 Web、生物信息学、语音和图像处理。大部分机器学习算法都无法在单个节点上处理如此大量的数据。另外,由于单个节点处理能力逐渐趋于恒定,开始出现大量的多节点机器。
PML Toolbox 使我们可以通过将学习过程分布到节点之间来利用多核机器、计算节点集群甚至超级计算机的计算能力。它使用了流行的 MPI 库作为操作的基础,并且是使用 C++ 编写的。PML Toolbox 包含了很多常用的机器学习算法,还包含了一个集成其他算法的 API。它可以从 IBM alphaWorks(请参看 参考资料)下载,可免费用于研究目的。
PML Toolbox 体系结构概述
PML Toolbox 通过一个迭代框架实现了机器学习算法。计算节点(在标准机器上,是处理器或处理器内核)可以分为主节点和一些工作节点。
除了核心算法之外,算法流程是这样的:主节点通过生成种子信息来开始计算。信息被传递给所有的工作节点,每个工作节点根据主节点和数据集所提供的信息执行计算。在执行这些计算之后,每个工作节点都将计算结果返回主节点,这个过程会反复执行,直到收敛为止。这个过程如下所示。
图 1. PML Toolbox 中的算法流程
在核心算法中,工作节点首先会计算核心矩阵。计算完成后,每个工作节点都在内存中持有整个算法执行的一部分 —— 核心矩阵的几行或几列。
查看该过程的另一个方法是利用时序图,如下所示。
图 2. PML 算法的时序图
在初始化时,主节点会分配参数,工作节点可以计算一个分布式核心矩阵,其中每个工作节点都保留了核心矩阵的几列数据。随后该算法会反复执行,这样工作节点就可以根据这部分数据计算一个更新,并将其发送给主节点,主节点又会对整个更新进行计算。然后将这个更新发送给工作节点,这个过程会一直重复下去,直到主节点确定收敛为止。
例如,以众所周知的 k-means 算法 为例。此时主节点执行的第一个步骤是随机生成 k 矩心。然后将矩心发送给工作节点。每个工作节点都会读取部分数据矩阵(几个示例),然后计算矩心与示例之间的距离。随后,各工作节点要从分配给各矩心的样本中计算新的矩心,并将它们传送回主节点。主节点根据从工作节点上发来的矩心加权和来计算新的矩心。这个过程会一直重复下去,直到矩心收敛为止。
使用内置算法
PML Toolbox 包括 7 个流行的学习算法。在本节中我们将逐一列出这些算法,并提供使用这些算法的示例。
内置算法
这个工具包中包含的算法如下:
- 分类
- 支持向量机(SVM)
- 线性回归
- 转换回归
- 集群
- Fuzzy k-means
- k-Means
- 特性约减
- KPCA(Kernel Principal Component Analysis)
- PCA(Principal Component Analysis)
运行内置算法
要运行内置算法,需要安装 MPICH2,这是一个消息传递接口(Message-Passing Interface,MPI)的实现。下一个步骤是使用所提供的数据转换工具将数据集转换成 PML Toolkit 使用的二进制格式。这个工具目前可以接受以下 3 种类型的文件:
- 使用逗号分隔开的值,没有标签(CSVU) —— 这是文本文件,其中只对每行提供了一种模式,数据之间用逗号分隔,比如,这类文件中的一行是 3.4, 5.6, 1.2
- 使用逗号分隔开的值,有标签(CSVL) —— 这与上面提到的格式类似,惟一的不同是每行中最后的数字都会作为数据的标签。标签应该是 +1 或 -1。
- 属性关系文件格式(ARFF) —— WEKA 工具箱 使用的文件格式。目前尚不支持数据属性。
要对数据进行转换,请运行转换工具数据转换器,可以给出输入文件格式(CSVU、CSVL 或 ARFF)、输入文件名和输出文件名:
dataconverter <file format> <input file name> <output file name>
|
这个数据转换工具也可以在多个节点上运行。详细指令请参考 PML User Guide。
所生成的输出包含两个文件,一个使用指定的名称,另外一个使用的名称相同,不过最后以 .info 结尾。这两个文件对于运行 PML Toolbox 来说都是必需的。
一旦数据被转换之后,您就可以运行 PML Toolbox 了。在一台机器上,请使用:
pmlexec <algorithm parameter file> <input file name> <model file name>
|
其中 <algorithm parameter file>; 指定了算法参数文件名,<input file name> 是数据文件的名称,<model file name> 是保存结果模型的文件名。
在集群机器上,请使用:
mpiexec -np <number of nodes> pmlexec <algorithm \
parameter file> <input file name> <model file name> |
其中 <number of nodes> 指定了要使用的计算节点的数量。文件应该使用完整路径名来指定。
算法参数文件列出了算法名和这个算法所需要的参数。参数文件的示例是在 PML Toolbox 发行文件中提供的。需要将算法的所有参数全部输入到输入文件中。因此,我们建议使用所包含的参数文件,并根据需要对这些文件进行修改。
PML Toolbox 的输出结果保存在一个文件中。这个文件包含了这个算法的很多内部变量值,以及结果模型。
使用 PML Toolbox 的加速比
正如前面介绍的一样,使用 PML Toolbox 的主要原因是能够利用多节点的能力来处理可用数据。这样做的成功程度通常通过加速比来衡量,它是在单个节点上训练这个算法所需时间除以在多个节点上训练这个算法所需时间的结果。随着节点数目的增加,加速比如预期一样会增大。实际上,这种规律只是在达到某一点之前是正确的,过了这个点再增加节点反而会由于通信负载而造成加速比的降低。
下图展示了 PML Toolbox 在几个数据集和算法中所获得的加速比,它们是在 Blue Gene 和一个 Linux® 机器集群上获得的。正如这些图显示的一样,通过使用大量的处理节点可以实现很好的加速比:
应用程序编程接口
PML Toolbox API 是作为一系列要实现某种算法必须要编写的函数实现的。这些函数让您可以了解使用如 图 1 所示的流程图的算法。这是一个迭代算法,其中主节点会将模型发送给工作节点,后者会使用这个模型以及部分数据来计算一个模型的更新,并将其返回给主节点。主节点会根据从工作节点返回的所有更新计算一个新模型,并且这个过程会反复进行,直到收敛为止。
数据在主节点和工作节点之间是通过 STL 向量传递的。表 1 给出了使用这个 API 编写的一个算法的时间图,将它划分为由主节点执行和由工作节点执行的方法。
表 1. PML Toolbox API 的时序图
| 时间 | 主节点 | 工作节点 |
|---|
| 迭代开始 |
beginDataScan (只在第一次迭代中使用),InitIteration
|
beginDataScan (只在第一次迭代中使用),InitIteration
|
|---|
| 处理 | |
Update (用于读取每个数据记录) |
|---|
| 迭代结束 |
Merge、EndDataScan、FinishIteration
|
FinishIteration
|
|---|
下面是对表 1 中使用的函数的说明,以及在编写新算法时在 API 中需要实现的几个通用函数的介绍。这些文件都是作为全局 C++ 函数实现的。一旦这些函数实现之后,就可以对 PML Toolbox 重新进行编译,以便包含您自己的算法。然后可以使用 UserAlg 参数文件来调用这个算法:
-
open
—— 在对算法进行初始化时所调用该函数。
-
beginDataScan
—— 在执行第一次迭代之前由工作节点调用该函数。
-
InitIteration
—— 在每次执行迭代之前由工作节点调用该函数。
-
FinishIteration
—— 在每次执行迭代后由工作节点调用该函数。
-
endDataScan
—— 在主节点接收到来自工作节点的所有更新之后由主节点调用该函数。它通常用来计算模型的全部更新。
-
update
—— 在对每个记录扫描之后由工作节点调用该函数。它通常被工作节点用来实现对模型的更新。
-
merge
—— 这个函数将两个对象合并成一个对象。这两个对象包含了扫描的结果。在合并之后,这个对象就包含了合并之后的结果。
-
isConverged
—— 返回这个算法是否已经收敛。
-
getWorkerDataRequirements
—— 这个函数告诉主节点每个工作节点是否应该接收一部分数据或完整的数据集(对于计算核心来说非常有用)。
-
print
—— 用于调试打印输出。
PML Toolbox 的发行版本中包括了一个使用这些函数来实现 k-means 集群算法的示例。
结束语
IBM Parallel Machine Learning(PML)让您可以在并行平台上运行机器学习算法。它可以在合理的计算时间内在大型数据集上训练这种算法。这个工具包包括了一些算法,以及用来添加自己算法的 API。在本文中您已经了解了开发人员的动机,并了解了其中包含的算法,还学习了如何添加自己的算法。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Elad Yom-Tov 博士是 IBM Haifa Research Laboratory 的 Machine Learning 小组的一名资深研究员,他在这里从事机器学习应用的工作,包括搜索技术、自主计算、生物信息学和硬件验证以及其他项目。Yom-Tov 是一位作家,与 David Stork 一起合著了 Computer Manual to Accompany Pattern Classification,这是有关模式分类的一本书和 Matlaba 工具包。 |
对本文的评价
|