-
Notifications
You must be signed in to change notification settings - Fork 106
Description
A common pattern is enqueuing multiple SCRIPTRUN and MODELRUN commands. Setting input tensors, storing intermediates of *RUN commands and storing outputs all in keyspace means that all written keys will be AOF'd and replicated even if they will be disposed of shortly after.
DAGRUN
A general solution to this problem is to have a DAGRUN (or PIPERUN, we'll see about the name - it is a DAG rather than a pipe, so it should probably be named correctly) command that allows to run a sequence of AI.* commands, e.g.:
AI.DAGRUN TENSORSET ~a~ FLOAT 2 VALUES 2 3 => \
TENSORSET ~b~ FLOAT 2 VALUES 2 3 => \
MODELRUN foo INPUTS ~a~ ~b~ OUTPUTS ~c~ => \
SCRIPTRUN bar baz INPUTS ~c~ OUTPUTS dNote the key names between ~ ~: these are volatile keys (~a~ is volatile because it has small wings :-) ). A volatile key is not set into keyspace, but it just lives in-memory for the duration of the command, after which is deallocated. In the command above, ~a~, ~b~, ~c~ are volatile, so they don't touch keyspace (and are not replicated). Only the output key d is stored in keyspace, for later retrieval.
Relationship to MODELRUN that returns results
This design supersedes #85, which proposed a MODELRUN variant that returns the output. This can be now obtained by:
AI.DAGRUN MODELRUN foo INPUTS a b OUTPUTS ~c~ => TENSORGET ~c~or, without touching keyspace at all
AI.DAGRUN TENSORSET ~a~ FLOAT 2 VALUES 2 3 => \
TENSORSET ~b~ FLOAT 2 VALUES 2 3 => \
MODELRUN foo INPUTS ~a~ ~b~ OUTPUTS ~c~ => \
TENSORGET ~c~Advantages
Apart from the obvious convenience, there are several advantages with this design:
- once a
DAGRUNcommand is sent, we can apply DAG optimization strategies; for instance, in case of ensambles, we can execute differentMODELRUNsubcalls in parallel (this was not possible before because each call was blocking on the client) and then join on the results to execute a furtherSCRIPTRUNthat computes the ensembled outputs; - when a
DAGRUNcall executes or if it fails, all volatile keys are deallocated at once; volatile keys are never seen by other clients, they only exist in the context of the call; therefore, we just need a small hash object in the call context that gets naturally deallocated
Additional commands
DAGRUNRO: read-only variant that is amenable for execution on replicas; if a non volatile key is attempted to be written, it errors outDAGRUNASYNC: fully async variant, that just returnsOK, or, probably better, an id (for eventually querying the status of the run or cancel it, as future commands). The user can then listen to keyspace notifications on the output keys (or check that the key has been written, or in the future query the status of the computation). This is relevant for use in webservices in which handlers shouldn't block.