Open biaoma-ty opened 6 years ago
这个一直没有进展
Angel的Python版本用户较少,这个issue提出后,也没有多少关注和讨论,暂时挂起,有必要的时候会继续
Angel的Python版本用户较少,这个issue提出后,也没有多少关注和讨论,暂时挂起,有必要的时候会继续
实际python 需求是最大的,spark 官方也意识到spark mlib 太过工程化,不太适合算法人员使用,我们大部分任务都是写python,实际数据分析或者算法人员也只会sql+python,这也是这几年python 又火起来的原因。
我理解的这个issues没有什么人关注,是因为算法+分析人员不关注这个项目,因为是scala 写的,他们只关注python 的算法库,算法+分析人员他们不关注算法是否为分布式,在公司推广angel,他们基本不会关注,因为他们不会用。会写scala对python 研究也不深,他们更愿意写scala,对python 需求也不大。
(job 类型只scala/java 写的任务)
当前PyAngel的功能还非常有限,有许多工作要做,另外,API也不是很友好,这里开启一个关于PyAngel讨论,如果您对PyAngel感兴趣,请联系我或者在社区中反馈,谢谢。
当前PyAngel的API主要还是源自于Java版本,相当于Java版本的简单封装,在易用性上还有很多不足,同时也过多暴露了一些不必要的细节,增加了用户上手以及维护的难度,PyAngel由于在Phase-2阶段将会实现用户所需的全部API实现,用户可以完全通过Python接口实现自定义的算法模型。
编程模型
以近几年的情况而言,大多数的计算框架都有一个显示的程序入口,来封装上下文环境以及变量创建,函数调用,比如:-
dtype = torch.FloatTensor
dtype = torch.cuda.FloatTensor # Uncomment this to run on GPU
N is batch size; D_in is input dimension;
H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 64, 1000, 100, 10
Create random input and output data
x = torch.randn(N, D_in).type(dtype) y = torch.randn(N, D_out).type(dtype)
Randomly initialize weights
w1 = torch.randn(D_in, H).type(dtype) w2 = torch.randn(H, D_out).type(dtype)
可以看出,这些框架都有一个显式的入口,用户通过这个入口可以导入相关的包,直接创建变量,计算等,将实现逻辑单一化,我们可以提供angel作为对应的成员,Angel封装MLConf,AngelConf等环境变量,持有Learner这一算法模型的抽象,用户通过angel来完成绝大多数的操作。
当前问题
目前的Angel的API还是命令式为主,和Java本身有一定的关系,有些复杂,对用户暴露的接口略多,尤其是Task。大多数场景下,Task这一层完全可以对用户透明,除非用户需要深度定制,完成特定计算单元上的操作,比如FPGA上的操作(这部分其实也属于后续需要做的事情,我们同样需要简洁易扩展的资源封装模块) 但目前,这些问题会将用户的精力无谓的分摊在语言的细节上面,阻止了新来用户尽快的将Angel部署搭建起来,算法框架应该让用户只关心算法的表达,Python之所以成为AI领域使用最广泛的语言也是基于此,比如NumPy,SciPy等将工业界发展成熟的C,Fortran的数值计算,统计建模库引入,上层通过很直观的操作就可以使用这些高性能库,比如下面的例子[^4]:
如果我们在PSModel这层的API能达到这样的水准,无疑可能会成为很好的机器学习框架的API了,将上面的numpy替换为angel就可以直接操作PSModel,就可以处理超大规模的矩阵,这是PyAngel Phase-2的目标,这里PyAngel也会将angel作为程序的上下文,用户在这里创建模型,加载数据,训练以及预测。
API Demo
上述三个类将会作为PyAngel编程的核心概念,无论是调用现有算法型或者用户自定义模型,均可通过对上述三个类的操作来实现,下面举例说明:
如图所示,上面是一个 GBDT 的python版本的demo,调用model对模型进行训练并且预测数据的典型步骤如下:
create
方法中指定model的名字,包括用户自定义的modelfit
方法,并且在fit
方法的参数列表中输入样本数据路径和模型输出路径,以及算法参数,完成对模型的训练, 其中params的各项参数意义如下表所示predict
方法,并且在predict
方法的参数列表中输入训练好的模型的路径以及数据输入输出路径,完成对数据的预测上面的Demo是用户去调用一个已经实现好的算法模型需要编写的代码,如果用户需要自定义算法模型,就需要自己实现相应的PS_Model的操作以及Learner来对算法做封装,同时需要在Angel中注册,先讨论下PS_Model的封装,PS_Model当前的功能如下:
首先,可以改造的更加pythonic一些的地方是row相关的获取的方法,可以通过重写python中的magic method以及支持切片来实现直接操作matrix的方式,比如获取从第4行开始,连续的5组向量
可以改写为
对于matrix的扩展,可以用
来代替:
或者使用:
其他类型的setter,getter等非matrix值直接操作的方法可以用字典操作来代替,如:
改为:
上面是对PS_Model的修改的讨论,下面介绍下Learner的修改,这里的Learner专指com.tencent.angel.ml.MLLearner,而非Spark on Angel的Learner,目前MLLearner共有12个子类,每个子类对应一个算法实现,有 逻辑回归,线性回归,支持向量机,主题模型,K-Means,矩阵分解,梯度提升决策树,以及比较新的 MLR 等等,并且还在增加中,这些特定算法模型的Learner都需要实现一个train方法,在train方法中实现模型的训练过程,但是实现中并不是很优雅,比如LDALearner中,train方法并没有实现,而是自己写了一个train方法,感觉不是很优雅,python版本的实现需要考虑这些问题,因为一旦API确定,以后如果轻易修改会是灾难。Learner的实现这里,如果比较完备的实现,需要将Learner用python几乎重写一遍,工作量还是有一些的。 下面对用户自定义的算法模型做一个demo, 假设用户自定义了一个GBDT算法模块: 首先需要定义Model完成对底层matrix的封装:
之后需要在angel上下文中注册
定义完毕Model之后,还需要进一步定义Learner
然后像自定义的model一样,也需要在Angel中注册,这里其实也可以只注册Learner,而Model的注册步骤下放到Learner中,也即: