docs/design/psf_update.md
PS Client(参数服务器客户端)进行请求划分,生成一个请求列表,这个请求列表中的每一个请求都和一个模型参数分区对应。
将请求列表中的所有请求发送给模型参数分区所在的PS实例。PS实例以模型参数分区为单位执行参数获取和更新操作,并返回相应的结果。
等待所有请求完成后返回
Future<VoidResult> update(UpdaterFunc update) throws AngelException;
参数类型是一个UpdaterFunc对象,该对象封装了update psf方法的参数和执行流程:
public abstract class UpdaterFunc {
private final UpdaterParam param;
public UpdaterFunc(UpdaterParam param) {
this.param = param;
}
public UpdaterParam getParam() {return param;}
public abstract void partitionUpdate(PartitionUpdaterParam partParam);
}
UpdateFunc对象的参数类型为UpdateParam
与get psf不同,update psf的执行流程只有一步:
update psf没有具体的返回值,只返回给应用程序一个Future,应用程序可以选择是否等待操作完成。
update型psFunc执行流程需要PS Client和PS共同完成。上述提到的
具体的流程如下图所示,左子图表示Worker处理流程,右子图表示PS Server处理流程:
com.tencent.angel.ml.matrix.psf.update.RandomUniform: 将矩阵某一行设置为指定范围随机数的例子
public class RandomUniform extends MMUpdateFunc {
...
@Override
protected void doUpdate(ServerDenseDoubleRow[] rows, double[] scalars) {
Random rand = new Random(System.currentTimeMillis());
try {
rows[0].getLock().writeLock().lock();
double min = scalars[0];
double max = scalars[1];
double factor = max - min;
DoubleBuffer data = rows[0].getData();
int size = rows[0].size();
for (int i = 0; i < size; i++) {
data.put(i, factor * rand.nextDouble() + min);
}
} finally {
rows[0].getLock().writeLock().unlock();
}
}
}
将代码编译后打成jar包,在提交任务时通过参数angel.lib.jars上传该jar包,然后就可以在应用程序中调用了。调用方式如下:
Random randomFunc = new RandomUniform(new RandomParam(matrixId, rowIndex, 0.0, 1.0));
psModel.update(randomFunc).get();
Abs
Add
AddS
Axpy
Ceil
Copy
Div
DivS
Exp
Expm1
Fill
Floor
Increment
Log
Log10
Log1p
Map
MapWithIndex
MaxA
MaxV
MinA
MinV
Mul
MulS
Pow
Put
RandomNormal
RandomUniform
Round
Scale
Signum
Sqrt
Sub
Zip2Map
Zip2MapWithIndex
Zip3Map
Zip3MapWithIndex