Executor Design Doc

Motivation

In the fluid, we encourage user use deep learning programming paradigms to describe training process. When the user-written Python program is executed, it will create a protobuf message ProgramDesc that describes the process and is conceptually like an abstract syntax tree.

The executor runs the ProgramDesc like an interpreter. ProgramDesc contains intrinsics/operators and variables which will be used, executor explicitly execute the stored precompiled code.

Overview

An executor takes a ProgramDesc, a block_id and a Scope. The ProgramDesc is a list of blocks and each block contains the protobuf definition of all the parameters and operators. The block_id specifies the entrance block. And the Scope is the container of all the variable instance, which is persistent throughout different runs.

Executor

Executor explicitly executes all the intrinsics/operators in the block_idth block of a ProgramDesc. Essentially, it instantiates Variables and Operators, then runs all the operators in sequence. It is very similar to push stack frame when entering the block, it will destroy the temporary variables when mini-batch is finished, but it does not have stack frame pop process.

Interface

  Executor(places);

A executor does not own any computing resources, user can only construct an executor with specified places.

  void Run(ProgramDesc, Scope, block_id, create_local_scope);

A executor only provides an unified way to execute ProgramDesc. ProgramDesc is the target will be executed, scope specifies the variable container. block_id indicates the entrance block, create_local_scope means if it will destroy the temporary variables after execution finished.