From 2d8ae7f1dc7378c66ce66440beef5ba2ef51646e Mon Sep 17 00:00:00 2001 From: jluethi Date: Fri, 20 Dec 2024 16:04:09 +0100 Subject: [PATCH 1/4] Update deployment instructions for the Fractal framework --- docs/run_fractal.md | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/docs/run_fractal.md b/docs/run_fractal.md index 0e4107a..440d682 100644 --- a/docs/run_fractal.md +++ b/docs/run_fractal.md @@ -1,21 +1,14 @@ -# Deploy Fractal Server & Fractal Web +# Deploy Fractal -Fractal runs locally on a laptop (tested both Linux, macOS and Windows with subsystem Linux) or on a Linux server that submits jobs to a SLURM cluster. The [`fractal-server` documentation](https://fractal-analytics-platform.github.io/fractal-server/) describes the preconditions and the different configurations that can be changed. +Fractal is meant to be deployed to manage workflows on large cluster and currently has support for different modes of running on slurm clusters. It is deployed on Linux servers and also runs on macOS or Windows (by using Windows Subsystem Linux). +You can run a fully containerized local example that is useful for demos and testing purposes by following the instructions in the [fractal containers repository](https://github.com/fractal-analytics-platform/fractal-containers/tree/main/examples/full-stack) or by following along this walkthrough: -Fractal can be used via a command line client, as well as via a web client. To get started with Fractal, you can follow the setup in the [fractal-demos repository](https://github.com/fractal-analytics-platform/fractal-demos). - -Here is a video walk-through for how to set up a local Fractal server: - - +
-Once you have a Fractal server running, you can also access it via Fractal web. To do so, set up a Fractal web server as shown here: +More detailed documentation about the configuration of the different Fractal components can be found in the [`fractal-server` documentation](https://fractal-analytics-platform.github.io/fractal-server/) and the [`fractal web` documentation](https://fractal-analytics-platform.github.io/fractal-web/). - +----- -
- -If you prefer to follow a written guide, follow the instructions in the [server folder](https://github.com/fractal-analytics-platform/fractal-demos/tree/main/examples/server) to set up Fractal server. Once you have successfully installed and started the Fractal server, you can [install a fractal-client environment](https://github.com/fractal-analytics-platform/fractal-demos/tree/main/examples/00_user_setup) and interact with the Fractal server from there. To do so, follow the [instructions for the 01_cardio_tiny_dataset example](https://github.com/fractal-analytics-platform/fractal-demos/tree/main/examples/01_cardio_tiny_dataset). This also includes a link to a tiny dataset and instructions on how to run a full Fractal workflow on this dataset (which should run in under a minute). -To set up Fractal web, follow the instructions in the [Fractal web README](https://github.com/fractal-analytics-platform/fractal-web). -
+Fractal can also be deployed by manually setting up the server in a Python environment, configuring your own postgres database & setting up Fractal web from source. You can find some helpful material for this in the [fractal-demos repository](https://github.com/fractal-analytics-platform/fractal-demos) (especially the examples/server section). We also have older video walkthroughs on manual setups available for both the [fractal-server](https://www.youtube.com/watch?v=mEDHh9Kkdmk) as well as [fractal-web](https://www.youtube.com/watch?v=f_HaiOVH-ig). From f10ede142b2eb682321d8dbe9f6bb066b54eff22 Mon Sep 17 00:00:00 2001 From: jluethi Date: Fri, 20 Dec 2024 17:16:08 +0100 Subject: [PATCH 2/4] Restructure documentation: Remove V2 section, expand Fractal task spec --- docs/assets/fractal_tasks_model.png | Bin 0 -> 121672 bytes docs/{version_2 => }/image_list.md | 24 ++--- docs/tasks_spec.md | 160 ++++++++++++++++++++++++++++ docs/version_2/index.md | 10 -- docs/version_2/tasks.md | 109 ------------------- 5 files changed, 172 insertions(+), 131 deletions(-) create mode 100644 docs/assets/fractal_tasks_model.png rename docs/{version_2 => }/image_list.md (77%) create mode 100644 docs/tasks_spec.md delete mode 100644 docs/version_2/index.md delete mode 100644 docs/version_2/tasks.md diff --git a/docs/assets/fractal_tasks_model.png b/docs/assets/fractal_tasks_model.png new file mode 100644 index 0000000000000000000000000000000000000000..f72e70b3fdbf0298a2d6b524ad11dad8bf4191d7 GIT binary patch literal 121672 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%0Dle{51_p>yE##1V*Oxz)Vk4Bs| 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

    f3@I=+ao0C4 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 K#+BzhuKfq{q+kO8 literal 0 HcmV?d00001 diff --git a/docs/version_2/image_list.md b/docs/image_list.md similarity index 77% rename from docs/version_2/image_list.md rename to docs/image_list.md index 3cbce0d..120cca8 100644 --- a/docs/version_2/image_list.md +++ b/docs/image_list.md @@ -2,7 +2,9 @@ layout: default --- -While applying a processing workflow to a given dataset, Fractal keeps a list of all the OME-Zarr images it is processing. In this page we describe the concepts of [images](#images) and [filters](#filters) - see also the [examples section](#examples). +# Image List + +While applying a processing workflow to a given dataset, Fractal keeps a list of all the OME-Zarr images it is processing and their metadata. In this page we describe the concepts of [images](#images) and [filters](#filters) - see also the [examples section](#examples). ## Images @@ -10,9 +12,9 @@ Each entry in the image list is defined by a unique `zarr_url` property (the ful ### Image types -Image types are boolean properties that allow to split the image list into different sub-lists (e.g. the `is_3D` type for 3D/2D images, or the `illumination_corrected` type for raw/corrected images when illumination correction was not run in-place). Types can be set both by the task manifest (e.g. after an MIP task, the resulting images always have the type `is_3D` set to `False` - see [task-manifest section](#dataset-filters)) as well as from within an individual task (see [task-API/output section](./tasks.md#output-api)). +Image types are boolean properties that allow to split the image list into different sub-lists (e.g. the `is_3D` type for 3D/2D images, or the `illumination_corrected` type for raw/corrected images when illumination correction was not run in-place). Types can be set both by the task manifest (e.g. after an MIP task, the resulting images always have the type `is_3D` set to `False` - see [task-manifest section](#dataset-filters)) as well as from within an individual task (see [task-API/output section](./tasks_spec.md#output-api)). -Note: whenever applying filters to the image list, the absence of a type corresponds to false by default. +Note: when applying filters to the image list, the absence of a type corresponds to false by default. ### Image attributes @@ -23,7 +25,7 @@ Fractal server uses the image list combined with filters (see [below](#dataset-f ## Filters -Before running a given task, Fractal prepares an appropriate image list by extracting the images that match with a given set of filters (that is, a set of specific values assigned to image types and/or image attributes). Filters can be defined for a dataset and/or for a workflow task. If a specific filter is set both for the dataset and for the workflow task, the workflow-task one takes priority. +Before running a given task, Fractal prepares an appropriate image list by extracting the images that match with a given set of filters (that is, a set of specific values assigned to image types and/or image attributes). Filters can be defined for a dataset and/or for a workflow task. If a specific filter is set both for the dataset and for the workflow task, the workflow-task filter takes priority. ### Dataset filters @@ -33,9 +35,9 @@ There are multiple ways a dataset may have a given filter set: 1. I manually set it, by modifying the dataset `filters` property. 2. While writing the Fractal manifest for a task package, I include the `output_types` attribute for a given task. These types are automatically included in the dataset filters after the task is run. Examples: - * An MIP task would have `output_types = {"is_3D": False}`: from this task onwards, the 2D images are processed (not the raw 3D images). - * An illumination-correction task would have `output_types = {"illumination_corrected": True}`: from this task onwards, the registered images are processed (not the raw images). -4. When writing the code for a specific task, the task output, I can include a `filters` property, for either image attributes and/or types - see the [section on task outputs](./tasks.md#output-api). + * An MIP task would set `output_types = {"is_3D": False}` in its output arguments: from this task onwards, the 2D images are processed (not the raw 3D images). + * An illumination-correction task would set `output_types = {"illumination_corrected": True}`: from this task onwards, the registered images are processed (not the raw images). +3. When writing the code for a specific task, the task output can include a `filters` property, for either image attributes and/or types - see the [section on task outputs](./tasks_spec.md#output-api). Examples: @@ -62,22 +64,20 @@ Examples: * The Apply Registration to Image task has `input_types={"registered": False}`, which means it cannot run on images with type `registered=True`. -> Note: as part of an [upcoming `fractal-web` update](https://github.com/fractal-analytics-platform/fractal-web/issues/442), it may become possible to see/edit the current filters upon job submission. - ## Examples After running a converter task, I may have an OME-Zarr HCS plate with 2 wells that contain one image each. In this case, the image list has 2 entries and each image has attributes for plate and well, as well as a true/fals `is_3D` type. -![Image List 1](../assets/image_list_x_1_two_wells_two_images.png) +![Image List 1](assets/image_list_x_1_two_wells_two_images.png) If I then run an illumination-correction task that does not overwrite its input images, the image list includes the two original images (without the `illumination_corrected` type) and two new ones (with `illumination_corrected` type set to true). Note that this task also sets the dataset type filters to `{"illumination_correction": True}`. -![Image List 2](../assets/image_list_x_2_two_wells_four_images.png) +![Image List 2](assets/image_list_x_2_two_wells_four_images.png) If I then run an MIP task, this will act on the two images with `illumination_corrected` set to true, due to the dataset filters. After the task has run, two new images are added to the list (with type `is_3D` set to false). -![Image list 3](../assets/image_list_x_3_two_wells_six_images.png) +![Image list 3](assets/image_list_x_3_two_wells_six_images.png) Another example is that if I have an OME-Zarr HCS plate with 3 wells and each well has 3 multiplexing acquisition, then the image list includes 9 OME-Zarr images (and those entries should have the acquisition attribute set). diff --git a/docs/tasks_spec.md b/docs/tasks_spec.md new file mode 100644 index 0000000..95b7634 --- /dev/null +++ b/docs/tasks_spec.md @@ -0,0 +1,160 @@ +--- +layout: default +--- + +# Tasks + +Fractal tasks are modular and interoperable processing units that handle data in OME-Zarr containers. Each task is an executable that runs on a single OME-Zarr image or a collection of OME-Zarr images. In Fractal, we the OME-Zarrs to be processed by giving the tasks the zarr_urls(s), the paths to a given OME-Zarr image on disk or in the cloud. All tasks load data from an OME-Zarr on disk and store their processing results in an OME-Zarr (the same or a new one) on disk again. The parameters and metadata of tasks are described in a [Fractal manifest in json form](#task-list-and-manifest). This page contains an overview of the Fractal task specification, the [types of Fractal tasks](#task-types), the [manifest](#task-list-and-manifest) that specifies task metadata as well as their [input](#input-api) & [output](#output-api) API. + +![Fractal task model](assets/fractal_tasks_model.png) + +## Task Types + +There are three types of tasks in Fractal V2: parallel tasks, non-parallel tasks & compound tasks. + +1. A **parallel task** is written to process a single OME-Zarr image and meant to be run in parallel across many OME-Zarr images. + - Parallel tasks are the typical scenario for compute tasks that don't need special input handling or subset parallelization. + - Parallel tasks can typically be run on any collection of OME-Zarrs. +2. A **non-parallel task** processes a list of images, and it only runs as a single job. + - Non-parallel tasks are useful to aggregate information across many OME-Zarrs or to create image-list updates (see [the Fractal image list](./image_list.md)). + - Non-parallel tasks can often be specific to given collection types like OME-Zarr HCS plates. +3. A **compound task** consists of an *initialization* (non-parallel) task and a (parallel) *compute* task. + - The initialization task runs in the same way as a non-parallel task and generates a custom parallelization list of zarr_urls & parameters to be used in the compute task. + - The compute tasks are run in parallel for each entry of the parallelization list and use the `init_args` dictionary as an extra input from the initialization task. + - Compound tasks can often be specific to given collection types like OME-Zarr HCS plates. A typical example are multiplexing-related tasks that use `acquisition` metadata on the well level to decide which pairs of images need to be processed. + + +## Task list and manifest + +A package that provides Fractal tasks must contain a manifest (stored as a `__FRACTAL_MANIFEST__.json` file within the package), that describes the parameters, executables and metadata of the tasks. `fractal-tasks-core` and `fractal-tasks-template` offer a simplified way to generate this manifest, based on a task list written in Python. + +### Task list +If the task package `my-pkg` was created based on the template, the task list is in `src/my-pkg/dev/task_list.py` and includes entries like +```python +TASK_LIST = [ + NonParallelTask( + name="My non-parallel task", + executable="my_non_parallel_task.py", + meta={"cpus_per_task": 1, "mem": 4000}, + category="Conversion", + docs_info="file:task_info/task_description.md", + tags=["tag1", "Microscope name"] + ), + ParallelTask( + name="My parallel task", + executable="my_parallel_task.py", + meta={"cpus_per_task": 1, "mem": 4000}, + category="Segmentation", + ), + CompoundTask( + name="My compound task", + executable_init="my_task_init.py", + executable="my_actual_task.py", + meta_init={"cpus_per_task": 1, "mem": 4000}, + meta={"cpus_per_task": 2, "mem": 12000}, + category="Registration", + ), +] +``` +where the different task models refer to the [different task types](#task-types). Given such task list, running the following command +```bash +python src/my-pkg/dev/create_manifest.py +``` +generates a JSON file with the up-to-date manifest. Note that advanced usage may require minor customizations of the create-manifest script. + +### Manifest metadata +The task manifest can contain additional metadata that makes it easier for people to browse tasks on the [Fractal task page](#./fractal_tasks.md) and the tasks available on a given server. The [Fractal task template](https://github.com/fractal-analytics-platform/fractal-tasks-template) provides good defaults for how all this metadata can be set. This metadata is also used to make tasks searchable. + +#### Docs info +Tasks can provide a structured summary of their functionality. If the image list does not contain a docs_info property for a given task, the docstring of the task function is used. A developer can provide a more structured markdown file by specifying the relative path to the markdown file with the task description (for example: `file:task_info/task_description.md`). The convention for these task descriptions is to contain a section on the purpose of the task as well as its limitations in a bullet-point list. + +#### Categories +Tasks can belong to a single category, which allows users to filter for the kind of task they are looking for. The standard categories are: `Conversion`, `Image Processing`, `Segmentation`, `Registration`, `Measurement`. + +#### Modalities +Tasks can have a single modality metadata. If a task works on all types of OME-Zarrs, no modality should be set. If a task is specifically designed to work on one modality (for example, a task that required OME-Zarr HCS plates), the modality should be specified. The standard modalities are: `HCS`, `lightsheet`, `EM`. + +#### Tags +Tasks can have arbitrary lists of string tags that describe their functionality. These are particularly helpful to increase the findability of a task using search. + +#### Authors +Task packages can specify an authors list. This metadata is configured in the create_manifest.py script for the whole task package. + +### How to get your task package on the Fractal tasks page +If you have a task package that you would like to see listed on the [Fractal task page](#./fractal_tasks.md) page, ping one of the Fractal maintainers about it or [make a PR to have your task included in the list of task sources here](https://github.com/fractal-analytics-platform/fractal-analytics-platform.github.io/blob/main/tasks_data_retrieval/sources.txt). For a task package to be listable on the Fractal tasks page, the package needs to contain a Fractal manifest and be available either via PyPI or via a whl in Github releases. The [Fractal task template](https://github.com/fractal-analytics-platform/fractal-tasks-template) provides examples for how to do both. +Future work will add support for adding additional task configurations (likely a specification for how to provide packages that are installable via Pixi). + + +## Input API + +### Parallel tasks + +The input arguments of a Fractal parallel tasks must include a `zarr_url` string argument. The `zarr_url` contains the full path to the zarr file to be processed. Only filesystem paths are currently supported, not S3 urls. +`zarr_url` is a reserved keyword argument: when running tasks through Fractal server, the server takes care to pass the correct `zarr_url` argument to the parallel task (based on filtering the image list). +Tasks can also take an arbitrary list of additional arguments that are specific to the task function and that the user can set. + +### Non-parallel tasks + +The input arguments of a Fractal non-parallel task must include a `zarr_urls` arguments (a list of strings) and `zarr_dir` argument (a single string). `zarr_urls` contains the full paths to the OME-Zarr images to be processed. We currently just support paths on filesystems, not S3 urls. `zarr_dir` is typically the base directory into which OME-Zarr files will be written by tasks and it is mostly used by converters. +Both `zarr_urls` and `zarr_dir` are reserved keyword arguments: when running tasks through Fractal server, the server takes care to pass the correct filtered list `zarr_urls` and the correct `zarr_dir` to the non-parallel task. +Tasks can also take an arbitrary list of additional arguments that are specific to the task function and that the user can set. + +### Compound tasks + +Compound tasks consist of an init part (similar to the non-parallel task) and a compute part (similar to the parallel task). +The init part has the same Input API as the non-parallel task (`zarr_urls` and `zarr_dir`), but it provides the parallelization list for the compute part as an output. +The compute part takes the `zarr_url` argument and an extra `init_args` dictionary argument (which is coming from the `parallelization_list` provided by the init task). + +## Output API + +Tasks can optionally return updates to the image list and/or [new dataset filters](./image_list.md#dataset-filters) (this is true for all tasks except the init phase of a compound tasks) or a parallelization list (just the init phase of a compound task). The output of a task is always a `task_output` dictionary. Note that this dictionary must be JSON-serializable, since it will be written to disk so that `fractal-server` can access it. + +For tasks that create new images or edit relevant image properties, `task_output` must include an `image_list_updates` property so the server can update its metadata about that image. + +> NOTE: if new filters are set, but both `image_list_updates` and `image_list_removals` are empty, in the task output, then `fractal-server` includes all the filtered image list in `image_list_updates`, so that they are updated with the appropriate `types` (see also [the image-list page](./image_list.md#image-types)). + +Task outputs with image list updates are returned as a dictionary that contains the `image_list_updates` key and a list containing the updates to individual images. The updates need to be for unique `zarr_url`s and each update needs to contain the `zarr_url` of the image it’s providing an update for. Additionally, they can provide an `origin` key, an `attributes` key and a `types` key. The `origin` key describes the `zarr_url` of another image already in the image list and will take the existing attributes and types from that image. Attributes and types can also be directly set by a task. + +Here's an example of `task_output`: +```python +{ + "image_list_updates" = [ + { + "zarr_url": "/path/to/my_zarr.zarr/B/03/0_processed", + "origin": "/path/to/origin_zarr.zarr/B/03/0", + "attributes": { + "plate": "plate_name", + "well": "B03" + }, + "types": { + "is_3D": True + } + } + ] +} +``` + +Here is an example of a task that provides new filter updates without changing the image list. This task sets the `is_3D` filter to True: +```python +{ + "filters" ={ + "types": { + "is_3D": True + } + } +} +``` + +The init part of a compound task must produe a parallelization lists, with elements having the `zarr_url` property as well as additional arbitrary arguments as an `init_args` dictionary. +Parallelization lists are provided in the following structure: +```python +{ + "parallelization_list": [ + { + "zarr_url": "/path/to/my_zarr.zarr/B/03/0", + "init_args": {"some_arg": "some_value"}, + } + ] +} +``` + diff --git a/docs/version_2/index.md b/docs/version_2/index.md deleted file mode 100644 index 1acfe5f..0000000 --- a/docs/version_2/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: default ---- - -# Fractal V2 - -This section describes the main concepts introduced with the new Fractal version (version 2 of the `fractal-server` backend): - -1. The [new dataset image list](./image_list.md); -2. The [new definition of tasks](./tasks.md). diff --git a/docs/version_2/tasks.md b/docs/version_2/tasks.md deleted file mode 100644 index 0a63fdc..0000000 --- a/docs/version_2/tasks.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -layout: default ---- - -# Tasks - -Fractal v2 brings a large refactor to the task architecture to make tasks more flexible and allow for building more complex workflows, while also simplifying the task API. This page gives an overview over the different types of Fractal tasks, their input and output API and the elements that go into the Fractal task list. - -## Task Types - -There are three types of tasks in Fractal V2: parallel tasks, non-parallel tasks & compound tasks. - -1. A **parallel task** is written to process a single OME-Zarr image and meant to be run in parallel across many OME-Zarr images. This is the typical scenario for compute tasks that don't need special input handling or subset parallelization -2. A **non-parallel task** processes a list of images, and it only runs as a single job. It is useful to handle image-list updates and validation of Zarr collections (like Import OME-Zarr). -3. A **compound task** consists of an initialization (non-parallel) task, that provides a custom parallelization list to a subsequent (parallel) compute task. An example are registration tasks that need to run across multiple Zarr images, but parallelize over wells of a multi-well plate. The init task is like a non-parallel task, but it provides the parallelization list as output. The compute task is like a parallel task, but it takes an extra `init_args` dictionary as input from the init task. - -## Input API - -### Parallel tasks - -The input arguments of a Fractal parallel tasks must include a `zarr_url` string argument. The `zarr_url` contains the full path to the zarr file to be processed. Only filesystem paths are currently supported, not S3 urls. -`zarr_url` is a reserved keyword argument: when running tasks through Fractal server, the server takes care to pass the correct `zarr_url` argument to the parallel task (based on filtering the image list). -Tasks can also take an arbitrary list of additional arguments that are specific to the task function and that the user can set. - -### Non-parallel tasks - -The input arguments of a Fractal non-parallel task must include a `zarr_urls` arguments (a list of strings) and `zarr_dir` argument (a single string). `zarr_urls` contains the full paths to the OME-Zarr images to be processed. We currently just support paths on filesystems, not S3 urls. `zarr_dir` is typically the base directory into which OME-Zarr files will be written by tasks and it is mostly used by converters. -Both `zarr_urls` and `zarr_dir` are reserved keyword arguments: when running tasks through Fractal server, the server takes care to pass the correct filtered list `zarr_urls` and the correct `zarr_dir` to the non-parallel task. -Tasks can also take an arbitrary list of additional arguments that are specific to the task function and that the user can set. - -### Compound tasks - -Compound tasks consist of an init part (similar to the non-parallel task) and a compute part (similar to the parallel task). -The init part has the same Input API as the non-parallel task (`zarr_urls` and `zarr_dir`), but it provides the parallelization list for the compute part as an output. -The compute part takes the `zarr_url` argument and an extra `init_args` dictionary argument (which is coming from the `parallelization_list` provided by the init task). - -## Output API - -Tasks can optionally return updates to the image list and/or [new dataset filters](./image_list.md#dataset-filters) (this is true for all tasks except the init phase of a compound tasks) or a parallelization list (just the init phase of a compound task). The output of a task is always a `task_output` dictionary. Note that this dictionary must be JSON-serializable, since it will be written to disk so that `fractal-server` can access it. - -For tasks that create new images or edit relevant image properties, `task_output` must include an `image_list_updates` property so the server can update its metadata about that image. - -> NOTE: if both `image_list_updates` and `image_list_removals` are empty, in the task output, then `fractal-server` includes all the filtered image list in `image_list_updates`, so that they are updated with the appropriate `types` (see also [the image-list page](./image_list.md#image-types)). - -Task outputs with image list updates are returned as a dictionary that contains the `image_list_updates` key and a list containing the updates to individual images. The updates need to be for unique `zarr_url`s and each update needs to contain the `zarr_url` of the image it’s providing an update for. Additionally, they can provide an `origin` key, an `attributes` key and a `types` key. The `origin` key describes the `zarr_url` of another image already in the image list and will take the existing attributes and types from that image. Attributes and types can also be directly set by a task. - -Here's an example of `task_output`: -```python -{ - "image_list_updates" = [ - { - "zarr_url": "/path/to/my_zarr.zarr/B/03/0_processed", - "origin": "/path/to/origin_zarr.zarr/B/03/0", - "attributes": { - "plate": "plate_name", - "well": "B03" - }, - "types": { - "is_3D": True - } - } - ] -} -``` - -The init part of a compound task must produe a parallelization lists, with elements having the `zarr_url` property as well as additional arbitrary arguments as an `init_args` dictionary. -Parallelization lists are provided in the following structure: -```python -{ - "parallelization_list": [ - { - "zarr_url": "/path/to/my_zarr.zarr/B/03/0", - "init_args": {"some_arg": "some_value"}, - } - ] -} -``` - -## Task list and manifest - -A package that provides Fractal tasks must contain a manifest (stored as a `__FRACTAL_MANIFEST__.json` file within the package), that describes the metadata of these tasks. `fractal-tasks-core` and `fractal-tasks-template` offer a simplified way to generate this manifest, based on a task list written in Python. - -For instance if the task package `my-pkg` was created based on the template, the task list is in `src/my-pkg/dev/task_list.py` and includes entries like -```python -TASK_LIST = [ - NonParallelTask( - name="My non-parallel task", - executable="my_non_parallel_task.py", - meta={"cpus_per_task": 1, "mem": 4000}, - ), - ParallelTask( - name="My parallel task", - executable="my_parallel_task.py", - meta={"cpus_per_task": 1, "mem": 4000}, - ), - CompoundTask( - name="My compound task", - executable_init="my_task_init.py", - executable="my_actual_task.py", - meta_init={"cpus_per_task": 1, "mem": 4000}, - meta={"cpus_per_task": 2, "mem": 12000}, - ), -] -``` -where the different task models refer to the [different task types](#task-types). Given such task list, running the following command -```bash -python src/my-pkg/dev/create_manifest.py -``` -generates a JSON file with the up-to-date manifest. Note that advanced usage may require minor customizations of the create-manifest script. From 2a3e89e2221908154fcf40346ed18ab630c6331e Mon Sep 17 00:00:00 2001 From: jluethi Date: Fri, 20 Dec 2024 17:23:21 +0100 Subject: [PATCH 3/4] Fix navigation --- docs/build_your_own_fractal_task.md | 2 +- mkdocs.yml | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/build_your_own_fractal_task.md b/docs/build_your_own_fractal_task.md index 33cc552..5c3eae9 100644 --- a/docs/build_your_own_fractal_task.md +++ b/docs/build_your_own_fractal_task.md @@ -1,4 +1,4 @@ -# Build a Fractal task +# Create a Fractal task Fractal tasks are the core processing units of to build your workflows. Each Fractal task loads the data from one (or many) OME-Zarr(s) and applies processing to them. Fractal tasks are Linux command line executables. For the purpose of this demo, we will look at the Python implementation. You can think of a Fractal task as a Python function that knows how to process an OME-Zarr image and save the results back into that OME-Zarr image. With a bit of syntax sugar, this becomes a Fractal task you can then run from the web interface. To understand the types of tasks, their API & how they provide information to Fractal server, check out the [V2 Tasks page](https://fractal-analytics-platform.github.io/version_2/tasks/). diff --git a/mkdocs.yml b/mkdocs.yml index 79cd484..02eb7cf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -43,10 +43,12 @@ plugins: nav: - Fractal: index.md - - Fractal V2 Changes: version_2/ - - Build Your Own Fractal Task: build_your_own_fractal_task.md - - Deploy Fractal Server & Web: run_fractal.md - Fractal tasks: fractal_tasks.md + - Fractal task spec: task_spec.md + - Create a Fractal Task: build_your_own_fractal_task.md + - Fractal Image List: image_list.md + - Deploy Fractal Server & Web: run_fractal.md + # Include some page, without including them in the ToC # not_in_nav: something.md From 45f23eec819887f55b59860ab53ff803104162bd Mon Sep 17 00:00:00 2001 From: jluethi Date: Fri, 20 Dec 2024 17:24:16 +0100 Subject: [PATCH 4/4] Fix navigation --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 02eb7cf..4108e9c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -44,7 +44,7 @@ plugins: nav: - Fractal: index.md - Fractal tasks: fractal_tasks.md - - Fractal task spec: task_spec.md + - Fractal task spec: tasks_spec.md - Create a Fractal Task: build_your_own_fractal_task.md - Fractal Image List: image_list.md - Deploy Fractal Server & Web: run_fractal.md