现在机器学习的趋势是从传统方法中的简单模型+少量数据(人工标注样本)到简单模型+海量数据(如基于逻辑的Regression广告点击率预测),进而发展到现在的复杂模型+海量数据(如深度学习ImageNet图像识别,基于DNN的广告点击率预测)。总结工业专场使用的大规模机器学习场景:本次分享从这三部分开始:1.并行计算编程技术向量化OpenmpGPUmpi2。并行计算模型BSPSSPASPParameterServer3。并行计算案例Xgboost分布式库RabitMxnet的分布式库ps-lite并行计算编程技术首先提到并行编程技术,它是大规模机器学习的工程基础。向量化向量化计算是一种特殊的并行计算方法。与一般程序在同一时间只执行一项操作相比,它可以同时执行多项操作,通常是对不同的数据执行相同的操作。或一批指令,或将指令应用于数组/向量。在X86架构的CPU上,主要的向量化编程技术是SSE和AVX。Intel的StreamingSIMDExtensions(SSE,StreamingSIMDExtensions)技术可以有效增强CPU执行浮点运算的能力。目前主流的编译器GCC和VisualStudio都提供了对SSE指令集的编程支持,用户可以直接在C++代码中使用SSE指令的功能,而无需编写汇编代码。IntelSSE指令集支持的处理器有16个128位寄存器,每个寄存器可以存储4个(32位)单精度浮点数。SSE还提供了一个指令集,允许将浮点数加载到这些128位寄存器中,这些数字可以在这些寄存器中进行算术和逻辑运算,然后将结果返回到内存中。AVX类似于SSE。AVX将16个128位寄存器全部扩展为256位寄存器,支持256位向量计算。理想情况下,AVX的浮点性能可以达到SSE水平的两倍。ARM架构在移动设备上应用广泛,ARM向量指令Neon提供了16个长度位128位的向量寄存器。简单来说:SSE指令集的加速比是4倍,AVX的加速比可以达到8倍。使用起来也非常简单。AVX指令集编程示例:for(i=0;i同步->计算->同步...BSP有以下优点:将处理器和路由器分离,强调计算任务和通信任务的分离,而路由器只完成点对点的报文传输,不提供合并、复制、广播等功能。这样既掩盖了具体的互连网络拓扑结构,又简化了通信协议;硬件以障碍同步的方式实现的全局同步是最好的粗粒度级别的控制,从而提供了一种有效的方式来执行紧耦合的同步并行算法,而不会给程序员带来过多的负担;BSP模型的这些特点使其成为并行计算的主流模型之一,开源的Mahout、ApacheParallelimplementationsofHuma、Sparkmllib、GooglePregel、Graphlab、xgboost等都基于BSP模型。BSP模型每轮得出结论后都需要同步,容易造成木桶效应,因为任务划分中各个任务的计算量并不是完全统一的,而且在复杂的分布式计算环境中,各个硬件条件每台机器的计算速度也不一样,这就导致BSP模型每次迭代的效率都由最慢的计算任务来决定。为了缓解这种现象,SSP模型被提出。SSPSSP模型我们将SSP中的每个任务进程称为worker,SSP模型通过设置一个bound来决定同步的时机。当最快的worker超过最慢的worker的界限时,所有worker将执行参数同步。这个界限可以根据迭代次数或参数更新之间的差异来确定。SSP协议的好处是速度更快的worker会遇到参数版本太陈旧的问题,导致每次迭代步骤都需要进行网络通信,从而达到平衡计算和网络通信时间开销的效果。SSP模型在数学上被证明是收敛的。原因可以这样解释,那就是条条大路通罗马。对于机器学习程序来说,中间结果的误差是可以容忍的,可以收敛到最优的路径有多条,所以少量的误差可以类似于随机噪声,但不影响最终的收敛结果。每次迭代可能会出现误差,但经过多次迭代后,平均误差趋于零。虽然不一定每次都是最优解路径,但最终还是找到了一条通向最优解的整体路径。虽然这条路径不是最快的路径,但由于通信方面的优势,整体求解速度还是比BSP更快,尤其是在数据量和参数量很大的情况下。环境。ASPASP是完全异步的方式,相当于取消了BSP中的同步环节。ASP运行得更快,当然它没有收敛保证。SSP协议可以有效平衡计算和网络通信的开销。对于非凸问题,BSP和SSP可能会收敛到不同的最优解。对于非凸优化问题(如神经网络),存在大量的局部最优解,随机梯度下降(可以跳出局部最优解)优于批量梯度下降。ParameterServer参数服务器是最近分布式机器学习领域非常流行的技术。参数服务器参数服务器中比较重要的是各个计算节点的参数同步。Sequential:这其实是一个同步任务。任务之间有顺序。前一个任务完成后才能开始下一个任务,即同步方式;Eventual:与sequ??ential相反,所有任务之间没有先后顺序,各自独立完成。有界延迟:这是顺序和最终之间的折衷。当最快的计算任务比最慢的计算任务快并等待一定阈值时,也可以作为计算任务的累积梯度。当更新值大于某个阈值时等待。总结一下这四种模式的优缺点:并行计算案例Xgboost的分布式库RabitXgboost是目前非常好的机器学习包,它的分布非常好。我们现在来看看。Xgboost的分布式实现有以下特点:OpenMp支持多核并行CUDA支持GPU加速Rabit支持分布式。它的核心是Rabit。Xgboost抽象了它的分布式核心功能。Rabit基于BSP模型。通过LanguageBroadcast和AllReduce这两个基本原理来实现其分布式功能。Broadcase和AllReduce的功能和MPI中基本一样,设计思路也差不多。为什么不直接使用MPI。原因是Rabit在此基础上提供了更好的容错处理功能,弥补了MPI的不足。为什么传统的MapReduce模型在机器学习的并行化上受限?上图是传统的MR,下图是XGBOOST的并行计算过程。Rabit在两个地方进行了优化。第一,每轮迭代后的计算结果不需要放入存储系统,而是直接保存在内存中;其次,每一轮迭代后没有数据重新分配过程。直接进行下一轮迭代,大大提高了计算效率。Xgboost的Rabit很好地封装了分布式操作,可以很方便的移植到其他系统中。我们可以基于Rabit开发我们的分布式机器学习程序。#includeAllreduce(&a[0],N);rabit::Broadcast(&s,0);Rabit提供了Allreduce、Broadcast两种基本操作,可以很方便的进行程序开发。MXNet的分布式库ps-lite最后提一下mxnet。ps-lite是mxnet分布式现实的核心,它基于参数服务器模型。Ps-lite的使用非常简单,可以很方便的对已有的机器学习程序进行分布式改造。Ps-lite的核心是KVStore,它为数据交换提供分布式key-value存储。它主要有两个功能:推送:将键值对从一个设备推送到存储中,用于计算节点将更新的参数值推送到参数服务器。pull:从存储中拉取某个key上的值,用于计算节点从参数服务器获取相关参数值。在下面的例子中,我们将单机梯度下降算法改为分布式梯度下降。独立梯度下降算法:for(inti=0;i