当前主流的深度学习库,一般使用C/C++来实现,为了让它们能使用Angel作为参数服务器,Angel需要提供C/C++接口,让深度学习框架,可以从它们内部,启动Angel并调用相应接口,实现深度学习的参数服务器。
Angel目前基于Java实现,目前已经实现了一个基本的可以启动PSAgent,并可以发送更新以及获取参数。
- 用C来调用,需要借助JNI
- 支持多线程环境,JNI的JavaVM对象可以在线程之间共享,但JNIEnv不可以。
- 抽象出C版本的PSAgent和MatrixClient类或接口
- PSAgent确保每个进程只启动一个实例
具体接口如下:
C/C++接口
PSAgent初始化和启动
初始化
PSAgent psAgent = new PSAgent(conf, masterIp, masterPort, clientIndex);
conf:Configuration //Angel系统配置
masterIp:String //Angel app master IP地址
masterPort:int //Angel app master 端口
clientIndex:int //client 编号(全局唯一)
启动
psAgent.initAndStart();
Matrix操作
获取矩阵客户端
MatrixClient matrixClient = psAgent.getMatrixClient(matrixName, taskIndex);
matrixName:String //矩阵的名字
taskIndex:int task //编号(全局唯一)任务执行单元编号,用作同步控制(BSP,SSP)之用
Matrix接口说明
//将矩阵每一个元素置为随机数
public void random(int range) throws Exception;
//将矩阵每一个元素置为0
public void zero() throws Exception;
//更新矩阵
public void increment(double[] delta) throws Exception;
//按索引更新矩阵
public void increment(int[] indexes, double[] delta) throws Exception;
//按索引获取矩阵
public double[] get(int[] indexes) throws Exception;
//获取矩阵
public double[] get() throws Exception;
//将PSAgent本地缓存的矩阵更新刷新到PS
public Future<VoidResult> flush() throws Exception;
//将PSAgent本地缓存的矩阵更新刷新到PS,同时更新clock值
public Future<VoidResult> clock() throws Exception;
//聚合UDF,例如sum,max等
public AggrResult aggr(AggrFunc func) throws Exception;
//矩阵更新UDF,例如scalar,increment等
public Future<VoidResult> update(UpdaterFunc func) throws Exception;