Mercurial > pylearn
view doc/v2_planning/plugin.txt @ 1134:0653a85ff2e8
coding_style: Moved url about Numpy conversion to Python 3 to the url list
author | Olivier Delalleau <delallea@iro> |
---|---|
date | Wed, 15 Sep 2010 15:38:45 -0400 |
parents | 81ea57c6716d |
children | a1957faecc9b |
line wrap: on
line source
====================================== Plugin system for iterative algorithms ====================================== I would like to propose a plugin system for iterative algorithms in Pylearn. Basically, it would be useful to be able to sandwich arbitrary behavior in-between two training iterations of an algorithm (whenever applicable). I believe many mechanisms are best implemented this way: early stopping, saving checkpoints, tracking statistics, real time visualization, remote control of the process, or even interlacing the training of several models and making them interact with each other. So here is the proposal: essentially, a plugin would be a (schedule, timeline, function) tuple. Schedule ======== The schedule is some function that takes two "times", t1 and t2, and returns True if the plugin should be run in-between these times. The indices refer to a "timeline" unit described below (e.g. "real time" or "iterations"). The reason why we check a time range [t1, t2] rather than some discrete time t is that we do not necessarily want to schedule plugins on iteration numbers. For instance, we could want to run a plugin every second, or every minute, and then [t1, t2] would be the start time and end time of the last iteration - and then we run the plugin whenever a new second started in that range (but still on training iteration boundaries). Alternatively, we could want to run a plugin every n examples seen - but if we use mini-batches, the nth example might be square in the middle of a batch. I've implemented a somewhat elaborate schedule system. `each(10)` produces a schedule that returns true whenever a multiple of 10 is in the time range. `at(17, 153)` produces one that returns true when 17 or 143 is in the time range. Schedules can be combined and negated, e.g. `each(10) & ~at(20, 30)` (execute at each 10, except at 20 and 30). So that gives a lot of flexibility as to when you want to do things. Timeline ======== This would be a string indicating on what "timeline" the schedule is supposed to operate. For instance, there could be a "real time" timeline, an "algorithm time" timeline, an "iterations" timeline, a "number of examples" timeline, and so on. This means you can schedule some action to be executed every actual second, or every second of training time (ignoring time spent executing plugins), or every discrete iteration, or every n examples processed. This might be a bloat feature (it was an afterthought to my original design, anyway), but I think that there are circumstances where each of these options is the best one. Function ======== The plugin function would receive some object containing the time range, a flag indicating whether the training has started, a flag indicating whether the training is done (which they can set in order to stop training), as well as anything pertinent about the model. Implementation ============== I have implemented the feature in plugin.py, in this directory. Simply run python plugin.py to test it.