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

Assign new id when we restart a task? #2752

Closed
gongweibao opened this issue Jul 6, 2017 · 8 comments
Closed

Assign new id when we restart a task? #2752

gongweibao opened this issue Jul 6, 2017 · 8 comments
Assignees

Comments

@gongweibao
Copy link
Contributor

Task分发给Trainer的一个要做的事情,Trainer貌似不需要知道这是第几个Epoch。
我大概明白为什么需要Epoch,为的是唯一标示一个Task,不然多个机器可能会有同一个Task的不同Epoch
这样看来的话,是不是考虑每个Task分发出去的时候就给一个新的ID就好?

#2719 (comment)

@gongweibao gongweibao changed the title Assign new id when we start a new task? Assign new id when we restart a task? Jul 6, 2017
@gongweibao
Copy link
Contributor Author

我也曾经想过这个问题,只是一个task的多个副本都在运行的时候,任何一个副本finish了都代表这个task finish了。如果每个task是一个uniq id,这种情况该如何解决?

@typhoonzero
Copy link
Contributor

每个task 对应唯一的id时符合情理的,而且这个task被重放之后id不应该变化,这样可以在job结束之后知道每个task运行了几次,哪些没有被运行。

生成唯一id的方法可以参考uuid的RFC

https://stackoverflow.com/questions/1785503/when-should-i-use-uuid-uuid1-vs-uuid-uuid4-in-python

http://www.sohamkamani.com/blog/2016/10/05/uuid1-vs-uuid4/

@gongweibao
Copy link
Contributor Author

有冲突。有的汇报成功,有的汇报失败,次序还有变化,该如何处理?

@Yancey1989
Copy link
Contributor

Yancey1989 commented Jul 7, 2017

同意 @typhoonzero

From @gongweibao

有冲突。有的汇报成功,有的汇报失败,次序还有变化,该如何处理?

这里的冲突是说:Task-a被一个Trainer获取并训练失败,在汇报时因为网络原因一直失败,master等待超时后又将Task-a加入到TODO队列里并被其他Trainer获取并训练, 这时第一个Trainer又可以正常的汇报task状态,导致Task-a会出现在Pending和Failed两个队列里面么?

如果是这样的话,感觉唯一的ID更是必要的了吧,Trainer汇报时检查一下是不是在Pending队列里,如果在的话就舍弃掉,再获取一个新的task来训练就好了?

@typhoonzero
Copy link
Contributor

有冲突。有的汇报成功,有的汇报失败,次序还有变化,该如何处理?

TaskEntry中加上对应的历史信息即可。

@gongweibao
Copy link
Contributor Author

gongweibao commented Jul 10, 2017

我考虑了一下task的问题,并且线下和 @typhoonzero 聊了一下,我的思路是这样的:

首先要明确tasktask在不同的trainer上执行的实例:可以称为副本。一个tasktaskID标识,一个副本的ID需要包含taskID和副本的标识值。副本不能简单地使用新的taskID

The life cycle of a single task is illustrated below这个图严格来说是有问题的,他只能说明master 记录的tasklife cycle信息。实际执行里边,task的状态主要通过timeout(不可知问题)和task fail(task 感知且汇报)。taskX其实是可以有多个副本在同时执行(taskX-0 timeout之后,启动taskX-1taskX-1超时,再启动taskX-2)。而且,任何一个副本报告执行成功,task执行成功;一个副本报告失败或者timeout,task未必失败--因为可以重试或者其他副本有可能报告成功。多个副本汇报任务状态是完全异步的。

  1. 一个副本成功的时候,task可以在master记录的各种队列中todo,done,fail,pending。所以只检查在pending中是否存在是不严谨的: https://github.com/PaddlePaddle/Paddle/blob/develop/go/master/service.go#L366。
    taskfinish应该是把task信息从其他的任何队列中删除,放到done队列中。

  2. 一个副本报告failed的时候,failed状态需要被finish状态覆盖;如没有则检查pending,而且需要检查epochtodofail队列都不需要检查。

  3. task不应该由下标标记,而应该由uuid标记,这样可以区分不同的passtask。原有epoch的意思等同副本。

如果做简化:

  1. 多做几次也无所谓或者task的执行信息统计稍微有些偏差也可以容忍,TaskFinish可以不检查pending以外的队列。
  2. 同理,TaskFail也不检查其他的队列,需要处理现在的Epoch
  3. 不区分不同passtask,可以不用uuid,继续用下标。

TaskFinish是让task尽量不要重复的做,TaskFail是让出错的Job尽量早点结束。

@typhoonzero
Copy link
Contributor

先考虑实现简单的版本吧。

@helinwang
Copy link
Contributor

赞讨论!倾向于"如果做简化"提出的几点。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants