当前主流的深度学习库,一般使用C/C++来实现,为了让它们能使用Angel作为参数服务器,Angel需要提供C/C++接口,让深度学习框架,可以从它们内部,启动Angel并调用相应接口,实现深度学习的参数服务器。

Angel目前基于Java实现,目前已经实现了一个基本的可以启动PSAgent,并可以发送更新以及获取参数。

  • 用C来调用,需要借助JNI
  • 支持多线程环境,JNI的JavaVM对象可以在线程之间共享,但JNIEnv不可以。
  • 抽象出C版本的PSAgent和MatrixClient类或接口
  • PSAgent确保每个进程只启动一个实例

具体接口如下:

C/C++接口

PSAgent初始化和启动

  1. 初始化

    1. PSAgent psAgent = new PSAgent(conf, masterIp, masterPort, clientIndex);
    2. conf:Configuration //Angel系统配置
    3. masterIp:String //Angel app master IP地址
    4. masterPort:int //Angel app master 端口
    5. clientIndex:int //client 编号(全局唯一)
  2. 启动

    1. psAgent.initAndStart();

Matrix操作

  1. 获取矩阵客户端

    1. MatrixClient matrixClient = psAgent.getMatrixClient(matrixName, taskIndex);
    2. matrixName:String //矩阵的名字
    3. taskIndex:int task //编号(全局唯一)任务执行单元编号,用作同步控制(BSP,SSP)之用
  2. Matrix接口说明

    1. //将矩阵每一个元素置为随机数
    2. public void random(int range) throws Exception;
    3. //将矩阵每一个元素置为0
    4. public void zero() throws Exception;
    5. //更新矩阵
    6. public void increment(double[] delta) throws Exception;
    7. //按索引更新矩阵
    8. public void increment(int[] indexes, double[] delta) throws Exception;
    9. //按索引获取矩阵
    10. public double[] get(int[] indexes) throws Exception;
    11. //获取矩阵
    12. public double[] get() throws Exception;
    13. //将PSAgent本地缓存的矩阵更新刷新到PS
    14. public Future<VoidResult> flush() throws Exception;
    15. //将PSAgent本地缓存的矩阵更新刷新到PS,同时更新clock值
    16. public Future<VoidResult> clock() throws Exception;
    17. //聚合UDF,例如sum,max等
    18. public AggrResult aggr(AggrFunc func) throws Exception;
    19. //矩阵更新UDF,例如scalar,increment等
    20. public Future<VoidResult> update(UpdaterFunc func) throws Exception;