Miscellaneous¶
BUGS:¶
Optional fields in embedded models are not handled correctly
https://github.com/art049/odmantic/issues/370 https://github.com/art049/odmantic/issues/484
References¶
The challenge in Simstack II is to exploit the features of Next-JS frontend without forcing the developer to write Next-JS or server components. In Simstack II each user has his/her own MongoDB database, there is an additional database used exclusively for authentication.
Note
Only one instance of a mongodb database server, of the fastapi server and of the next-js frontend is required per installation.
The workflow developer customizes the appearance of workflows for submission, data analysis and data visualization using three main mechanisms:
Customizing Simstack Models¶
Note
General information about Simstack models
Simstack models are built on top of odmantic, which uses pydantic for data validation. By decorating a class with @simstack_model, you enable additional UI-related features. You can customize how a model appears in the GUI by implementing json_schema and ui_schema methods. Refer to Persisting and Visualizing Data for more details.
Running the above code as a workflow we would like to achieve the following:
code can be executed on remote resources (possibly in parallel)
users can inspect the results in a GUI
results can be reused when the workflow failed or in other workflows
the workflow can be run from a GUI
(workflows can be created from existing components in a GUI)
To address the first points, all data must be serializable. This can be achieved by pickling the inputs/outputs but then the data is hidden in the pickled string and not searchable. Here we have chosen odmantic classes to persist the data in a database. See: persisting-results-section. This has the charm that routes to access this data can be automatically generated.
Overall we need four “servers” to run the workflow:
The “workflow server” that manages and executes workflows
The “runners” that execute parts of workflows on remote resources
The “database server” provides an API to the database for the GUI
The webserver that serves the GUI
@node(parameters=Parameters(resource="my_resource", queue="slurm-queue"))
def my_node(arg1: Model1, arg2: Model2, **kwargs) -> SimstackResult:
# do something with inputs
return outputs
Note
Each node has a unique task_id which is the ObjectId of entry in the node_registry table in the database
Before control is passed to a node, the calling function will create a directory as workdir/node_name/node_id which is unique to the node.
all files generated by the node should be written into this directory.
nodes can by synchronous or async functions.
Allowed Arguments
All positional arguments of the wrapped function (my_node) must be registered odmantic Models. These arguments are automatically persisted in the database.
The my_node function must have **kwargs even if they are not used in the function.
**kwargs is used to pass information to process the node, but should not be used to pass arguments that affect the result of the function. Presently, Model-type arguments in the **kwargs are not persisted in the database which precludes the execution of such nodes on resources which are different from the function is called.
Important
Only positional arguments should affect the outcome of the function execution
Return Types
While it is easy to check whether the variables passed to nodes can be persisted in the database, this can be checked for results only in post-processing.