-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Python wrapper follows tf and pytorch's concept #3566
Conversation
I like Chunwei's idea. Caffe2 has good c++ implementation, but tf has better and more friendly user experience. We can learn from both :) |
非常赞同我们应该更像TF和PyTorch,以及用DAG图自动追溯应该运行哪些OP。 有几点想讨论的:
|
请对模型最熟悉的@lcy-seso 老师review一下这个PR吧! |
现在大家的结论是,v2 是必须要兼容的,一来向后兼容语法;二来正好当成高层的接口用,比如 keras 之于 tf @helinwang |
赞同 |
Var这个概念是不是类似Caffe2的BlobReference了?我们确实需要这样一个概念,才能让 paddle.layer.XXX 函数可以被functional的形式调用:
不过Caffe2的BlobReference只包含 name 和 Net 两个fields,为什么Var里需要这么多内容呢? |
是说 目前 v2 API 设计里 trainer 和拓扑绑定了:
所以不能训练多个子图吗?我支持不绑定trainer和拓扑,不过即使绑定貌似也是可以训练多个子图的——为每个子图创建一个trainer。 |
Caffe2 的一些概念,比如
这里 Var 里的一堆代码,是为了对应 另外,Var 是用来推导拓扑的基础,在这个 design里,Op 对应到编程语言里的 function, Var 对应到数据; 通过 Var 的调用关系来推导拓扑。 |
TF 的语法界面跟一个编程语言很像, tf.Variable 对应变量/数据, op 对应无状态的函数;尽管由于实现机制的束缚无法像 pytorch 那样完全给出一个近python语法的界面,但相比其他平台(mxnet, caffe2)已经很贴近常规编程语言的语法。 TF里用户只需要关注变量:
|
对比 TF minist demo 和 caffe2 minist demo 从一个只懂DL理论和 python 编程语言的小白眼里,TF 的概念基本能从经验推导:
相比于 caffe2,多了一些概念,也比较不直观,除去CNN的几行,参数初始化、SGD等细节上,TF只用了两个函数 for param in model.params:
param_grad = model.param_to_grad[param]
model.WeightedSum([param, ONE, param_grad, LR], param) model.AddGradientOperators([loss])
# do a simple stochastic gradient descent
ITER = brew.iter(model, "iter")
# set the learning rate schedule
LR = model.LearningRate(
ITER, "LR", base_lr=-0.1, policy="step", stepsize=1, gamma=0.999 )
# ONE is a constant value that is used in the gradient update. We only need
# to create it once, so it is explicitly placed in param_init_net.
ONE = model.param_init_net.ConstantFill([], "ONE", shape=[1], value=1.0)
# Now, for each parameter, we do the gradient updates.
for param in model.params:
# Note how we get the gradient of each parameter - ModelHelper keeps
# track of that.
param_grad = model.param_to_grad[param]
# The update is a simple weighted sum: param = param + param_grad * LR
model.WeightedSum([param, ONE, param_grad, LR], param) |
|
一个简单的wrapper实现,但只实现了核心的部分,整理下一些想法:
基于的大前提
cost
自动推导拓扑等,类似 caffe2 显式有个net,感觉并不一定需要具体实现细节:
net.add(op)
或者model.add(op)
typeof(input
应该是Var
而非str
,实现可以是str
但提供给用户的是概念,Var
里面有更多一些逻辑target
自动推断涉及的子图,DFS抽取出对应的最小子图, 动态创建 NetOp 来run,除了支持原始的paddle.trainer.train
之外,提供paddle.trainer.run(targets, ...)
接口来执行类似tf.Session.run
的逻辑,子图的执行更自然paddle
下(类似tf),比如paddle.layer.fc
也可以用模块
var.py
variable 的封装,提供Var
,Var
会统一所有 op, layer 的 inputs 和 outputs 格式op.py
包含所有 op 的实现layer.py
layer实现topology.py
DFS 子图推断相关session.py
提供Session
存储所有创建的 Var 和 Op, 提供类似tf.run
的接口tf.Session
, Session 全局只需要一份,可以用g_session
隐藏掉只增加了
Var
新概念由于所有的
op
和layer
的 inputs 和 outputs 都统一成了Var
MINIST 使用示例
兼容 v2 的方式
v2 的方式貌似很难支持多个sub-model 的执行(不支持子图),必须往
paddle.trainer
里 添加新的接口,这里是此demo核心概念应该支持的另外一种写法infer
最后的想法