Skip to content
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

Paddle Python API demo [Basically Done] #1005

Closed

Conversation

reyoung
Copy link
Collaborator

@reyoung reyoung commented Dec 23, 2016

Blocking Issue #971

* Extract NewGradientMachine, ParamUpdater, DataProvider.
@reyoung reyoung force-pushed the feature/python_trainer_api branch from 23ea25b to 446fccf Compare December 26, 2016 05:47
@reyoung reyoung force-pushed the feature/python_trainer_api branch from 1c85a72 to 704ed1e Compare December 27, 2016 07:21
@reyoung reyoung changed the title Paddle Python API demo [developing] Paddle Python API demo [Basically Done] Dec 27, 2016


def main():
api.initPaddle("-use_gpu=false", "-trainer_count=4") # use 4 cpu cores
Copy link
Member

@jacquesqiao jacquesqiao Dec 28, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没有看到initPaddle的地方?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

在这里了 https://github.com/PaddlePaddle/Paddle/pull/1005/files#diff-ed4a9a57af56fa9b94fd891bdc87f629R101

似乎github会把一些大文件给隐藏掉。。所以,这个文件在files里面默认没显示,得加上load diff

* Extract Network helpers from trainer
* Remove always passed context param.
* Adding comments
@reyoung reyoung force-pushed the feature/python_trainer_api branch from 605b1aa to 3ceee61 Compare December 29, 2016 07:14
@reyoung reyoung force-pushed the feature/python_trainer_api branch from 2642791 to 2fdadf5 Compare December 29, 2016 08:48
@reyoung
Copy link
Collaborator Author

reyoung commented Jan 5, 2017

Paddle Python API

  • 整理需求
  • 目前Paddle的Trainer
  • 可能的一种抽象方式
  • 其他

需求 单机线下训练

  • 需求

    • 配置一个模型
    • 设置训练算法 (Optimizer)
    • 设置训练数据
    • 每隔一个周期存下来训练模型
    • 设置测试数据
    • 强类型的cost, 错误率, pass_id, batch_id
  • 不足

    • 没有强类型的cost,错误率等等

需求 单机多目标训练

  • 需求

    • 配置一个神经网络模型后
      • 针对不同的输入数据,训练神经网络的不同部分。
      • 或者,更新神经网络的不同参数。例如数据1更新左半边,数据2更新右半边。
  • 示例

    • GAN
  • 不足

    • 目前的Paddle不支持,不过如果暴露了PythonAPI,支持起来比较容易

需求 多网络训练

  • 需求

    • 配置多份网络。网络直接可以share一些参数。
    • 多个网络分别训练,或者串行训练,一个网络的输出是另一个网络的输入等等。
  • 不足

    • 目前不支持

需求 OnlineLearning

  • 需求

    • 数据由网络传入。并且,网络操作来控制Paddle的训练进程。启停,模型存储等
  • 不足

    • 虽然Paddle支持数据网络传入,但是不太支持控制启停。

目前Paddle的Trainer逻辑

def train_logic(network_graph, optimize_settings):
	gradient_machine = create_gradient_machine(network_graph)
	parameter_updater = create_parameter_updater(optimize_settings)
	parameter_updater.init(gradient_machine.getParams())
	gradient_machine.start()
	
	for pass_id in range(num_passes):
			gradient_machine.start_pass()
			parameter_updater.start_pass()
			train_data.reset()
			
			for each_batch in train_data():
				gradient_machine.start_batch()
				parameter_updater.start_batch()
				
				gradient_machine.forward_backward(each_batch)
				for each_param in gradient_machine.parameters():
					parameter_updater.update(each_param)
				
				parameter_updater.finish_batch()
				gradient_machine.finish_batch()
			
			
			test_data.reset()
			parameter_updater.catch_up()
			
			for each_batch in test_data():
				gradient_machine.forward(each_batch)
				print gradient_machine.evaluate
			
			parameter_updater.finish_pass()
			gradient_machine.finish_pass()
	gradient_machine.finish()

可见一些操作是成对出现的,比如 gradient_machine.start_pass/finish_pass。并且训练过程是分阶段的。分的阶段包括

  • initialize
  • finalize
  • on_pass_start
  • on_pass_end
  • on_batch_start
  • on_batch_end

比如,对于ParameterUpdater的操作,可以分为

阶段 操作
initialize parameter_updater.init(gradient_machine)
on_pass_start parameter_updater.start_pass()
on_pass_end parameter_updater.finish_pass()
on_batch_start parameter_updater.start_batch()
on_batch_end parameter_updater.end_batch()

而这些操作GradientMachine也有,测试逻辑也有,DataProvider也有。并且,这些逻辑可以任意组合形成一种特殊的Trainer

比如,默认情况下,每个Pass都会做测试。如果改成每隔是个Pass做一个预测呢?那么我们就可以换一个TesterItem。或者,没训练100个Pass做一次预测呢?

可能的一种抽象方式 Runner+RunnerItem

其实这种抽象方式,重点利用的是构件组合的思路,将训练过程中每个阶段不同对象的不同操作分离出来,然后任意组合,形成新的行为。类似的东西类似于golang的中间件或者nodejs的中间件(koa)。

image

整体抽象如上图所示。我们将一个对象的操作变成一个洋葱圈(RunnerItem),整个洋葱便是(Runner)。这个抽象的意义就是将上面繁杂多变的训练逻辑剥离成有意义的子项目。

同时,这个洋葱还可以互相嵌套。比如,训练逻辑是一个洋葱,而测试逻辑是另一个洋葱。测试可能在训练的任何情况下进行。比如,可能的测试周期是训练200个batch之后进行一次测试。那么就写一个训练Runner的RunnerItem,在on_batch_end的时候,调用测试洋葱的全部流程即可。

同时,训练洋葱只要去掉一部分,就可以变成模型预测(inference)的洋葱。

@reyoung reyoung closed this Jun 27, 2017
wangxicoding pushed a commit to wangxicoding/Paddle that referenced this pull request Dec 9, 2021
* use list() instead of tokenize

* use list() instead of tokenize in taskflow

* add max_seq_length in readme

* add dynamic predict in text_correction task

* fix windows predict bug
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants