## PSF简介

---

作为标准的参数服务器系统，一般会提供基本的参数**获取（pull）和更新（push）**功能。

但实际应用中，各个算法对参数服务器上的参数获取和更新，却远远不只这么简单，尤其是当算法需要实施一些特定的优化的时候。

举个例子，有时候要得到`矩阵中某一行的最大值`，如果只有基本的参数获取的Pull接口，那么Client只能先将该行的**所有列**，都从参数服务器上拉取回来，然后在Worker上计算得到最大值，这样会产生很多的网络通信开销，对性能会有影响。

为了解决类似的问题，Angel对参数获取和更新的流程进行了抽像，提出了`PSF`的概念。


## 1. 步骤

Angel参数的获取和更新都是有固定的步骤，具体如下：

* **参数获取**

	1. **请求划分**
		
		参数服务器的接口，操作的是**整个模型参数**。而模型参数是被划分成多个分区存储在不同的PS实例中的，因此在请求阶段，就要进行划分了
		
		* PS Client（参数服务器客户端）进行请求划分，生成一个请求列表，这个请求列表中，**每一个请求都和一个模型参数分区对应**
	
	2. **请求发送** 
		* Angel将请求列表中的所有请求，发送给模型参数分区所在的PS实例。
		* PS实例以模型参数分区为单位执行参数获取和更新操作，并返回相应的结果。

	3. **结果合并**
		*  合并所有的模型分区级结果，得到最终的结果并返回

*  **参数更新**

	1. PS Client（参数服务器客户端）进行请求划分，生成一个请求列表，这个请求列表中的每一个请求都和一个模型参数分区对应。

	2. 将请求列表中的所有请求发送给模型参数分区所在的PS实例。PS实例以模型参数分区为单位执行参数获取和更新操作，并返回相应的结果。

	3. 等待所有请求完成后返回

## 2. 接口

根据这两个共有流程Angel实现了两个通用的接口

* **get**
* **update**

而一些与具体流程相关的部分：

* **参数划分方式，分区获取和更新和分区结果合并**

等部分都可以交给应用程序实现。从而在不更改PS的前提下，用户可以方便的实现了对PS功能进行扩展。