然后在通讯方面,通信效率是分布式机器学习系统中至关重要的部分。首先, 相比于 ETL 任务, 很多机器学习算法在计算过程中会频繁使用到全局或者其他节点的信息, 对网络吞吐和通讯延迟的要求都很高。其次, 一些机器学习算法在通信时可能有很多可以合并处理的通讯需求。再次, 很多机器学习算法并不要 求在所有环节保证强一致性。最后, 对于不同的网络拓扑, 最优的通讯方式也会不一样。因为存在可能的合并处理、非强一致性需求、网络拓扑敏感等, 就会存在有别于传统通讯框架的优化。先知的 GDBT 计算框架内部, 针对机器学习计算任务单独开发了一套通信框架, 为机器学习任务提供了更高效、更易用的支持点对点异步、点对点同步、深入优化的组通讯 (比如类 MPI 的 Broadcast、 AllReduce、Gather、Scatter 等等) 的通信框架, 同时为应用层提供了简便易用的合并、本地缓存 等等功能。 然后介绍下我们在参数服务器(Parameter Server)方面的工作,很多机器学习算法的学习过程都是在「学习」一组参数, 对于分布式机器学习任务, 不同的节点需要对「全局」的这组参数进行读取和更新, 由于是分布式并行的计算任务, 因此存在着一致性的问题, 不同的机器学习算法或者同一个机器学习算法的不同实现对一致性的要求会不尽相同, 不同的 一致性策略对整体算法的效率会产生很大的影响。参数服务器就是为了解决分布式并行机器学习任务中多机协同读取、更新同一组参数设计的, 设计上需要提供简单易操作的访问接口方便机器学习专家开发算法, 同时也需要提供可选择的一致性策略、灾备等等。 另外,由于是为机器学习任务设计,参数服务器的设计目标是高吞吐、低延迟。GDBT 中的参数服务器针对不同的应用场景做了更 加深入的优化, 结合高效缓存、智能合并等优化策略以及基于 GDBT 自带的高效异步通讯框架, 同 时, 还针对稀疏、稠密等不同的参数场景进行了针对性优化;内置提供了丰富的一致性策略可供用户选择或自定义一致性策略;GDBT 将参数服务器看成一种特殊的 Key-Value 存储系统, 对其进行了独立的灾备设计, 同时提供不同粒度的灾备选项, 便于在实际的部署中选择合适的灾备策略提升效率。 这次我主要讲计算框架方面的工作,以后有机会可以再详细分享我们在机器学习算法框架以及机器学习算法方面的设计工作。针对机器学习算法计算,GDBT 框架做了进一步的抽象,比如数据流、优化算子、多模型框架等等,这里简单介绍下数据流的设计。对于研究并实现机器学习算法的专家而言,算法的核心就是数据的各种变换和计算。GDBT 框架为了让机器学习专家更容易、更快速地开发出不同的机器学习算法提供了数据流的抽象,使得机器学习专家通过描述数据流 DAG 图的方式编写机器学习算法。机器学习专家只需要关注数据的核心变换和计算逻辑,GDBT 计算框架将机器学习专家描述的数据流图进行高效的分布式计算。 数据流计算框架的抽象一方面有助于降低机器学习专家的开发门槛、提升开发速度(他们不需要关注底层分布式、并行细节),另一方面也为 GDBT 框架提供了更大的空间去进行数据流执行优化,能够进一步提升执行效率(如果 GDBT 框架只在底层模块进行优化,将会非常乏力;但是数据流的抽象使得 GDBT 框架能够更全面地了解计算任务的 pattern,可以做更多的优化工作)。 在存储、灾备设计等方面,GDBT 也做了深入的优化,比如多级缓存的设计、框架层面对存储读取写入、网络访问、计算过程等等的灾备设计,对不同计算规模采取不同的灾备粒度等等,这里时间有限,就不做过多介绍了。机器学习算法部分的工作以后有机会可以再一起交流。 GDBT 定制的通信框架、算法框架以及参数服务器,为进行大规模机器学习训练提供了基石。当然 GDBT 还有一个很大的特性是算法开发者友好,对于算法开发来说,学术研究和工业应用之间存在一定的取舍。一些其他的算法框架比如 Tensorflow,比较注重研究上的易用性,从而在效率上有所舍弃,而一些注重于生产应用的算法框架特别是分布式框架,在算法二次开发和扩展上则捉襟见绌。GDBT 提供的是工业级的开发者易用性,从语言级别,GDBT 整体基于 C++ 14 标准,为算法的开发提供了更大的自由。从功能抽象上,GDBT 提供了对参数服务器和算子的良好包装,在 GDBT 上,只需要数百行代码就可以实现像逻辑回归、矩阵分解等算法的分布式版本。 机器学习算法框架的语言选择问题 (责任编辑:本港台直播) |