定制函数(psFunc)


作为标准的参数服务器,正常都会提供基本的参数 获取(pull)更新(push) 功能。但实际应用中,各个算法对参数服务器上的参数获取和更新,却远远不只这么简单,尤其是当算法需要实施一些特定的优化的时候。

举个例子,有时候某些算法,要得到矩阵模型中某一行的最大值,如果PS系统,只有基本的Pull接口,那么PSClient,就只能先将该行的所有列,都从参数服务器上拉取回来,然后在Worker上计算得到最大值,这样会产生很多的网络通信开销,对性能会有影响。而如果我们有一个自定义函数,每个PSServer在远程先计算出n个局部最大值,再交换确认全局最大值,这时只要返回1个数值就可以了,这样的方式,计算开销接近,但通信开销将大大降低。

为了解决类似的问题,Angel引入和实现psFunc的概念,对远程模型的获取和更新的流程进行了封装和抽象。它也是一种用户自定义函数(UDF),但都和PS操作密切相关的,因此被成为psFunc,简称psf,整体架构如下:

定制函数(psFunc) - 图1

随着psFunc的引入,模型的计算,也会发生在PSServer端。PSServer也将有一定的模型计算职责,而不是单纯的模型存储功能。合理的设计psFunc,将大大的加速算法的运行。

值得一提的是,伴随着psFunc的引入和强化,在很多复杂的算法实现中,降低了Worker要把模型完整的拖回来进行整体计算的可能性,从而间接地实现了模型并行

分类

整体上,Angel的psFunc分成两大类,一类是获取型,一类是更新型

PSF从数据交互角度可以分成 Worker-to-PSServerPSServer-to-PSServer 两种类型。

  • Worker-to-PSServer是指Worker的数据和PSServer的数据做运算。如Push、Pull,将Worker本地的Vector Push给PS,或者将PS上的Row Pull到Worker上;

  • PSServer-to-PSServer是指PSServer上的matrix内部row直接发生的运算。如Add、Copy等,Add是将matrix两行的数据相加,将结果保存在另外一行;Copy是将某行的内容拷贝到另外一行。