From 55ba4ec8dd16d642498cbb4c0ec35f8fe62d0862 Mon Sep 17 00:00:00 2001 From: pollfly <75068813+pollfly@users.noreply.github.com> Date: Tue, 26 Apr 2022 13:42:55 +0300 Subject: [PATCH] Reformat pipeline docs (#239) --- docs/fundamentals/pipelines.md | 454 ------------------ docs/getting_started/ds/best_practices.md | 2 +- docs/getting_started/ds/ds_second_steps.md | 2 +- .../mlops/mlops_best_practices.md | 2 +- .../mlops/mlops_first_steps.md | 2 +- .../mlops/mlops_second_steps.md | 2 +- docs/guides/pipeline/pipeline_decorator.md | 2 +- docs/img/pipelines_DAG.png | Bin 0 -> 142415 bytes docs/img/pipelines_new_run.png | Bin 0 -> 26112 bytes docs/pipelines/pipelines.md | 94 ++++ .../pipelines_sdk_function_decorators.md | 195 ++++++++ docs/pipelines/pipelines_sdk_tasks.md | 227 +++++++++ docs/webapp/pipelines/webapp_pipeline_page.md | 2 +- sidebars.js | 8 +- 14 files changed, 530 insertions(+), 462 deletions(-) delete mode 100644 docs/fundamentals/pipelines.md create mode 100644 docs/img/pipelines_DAG.png create mode 100644 docs/img/pipelines_new_run.png create mode 100644 docs/pipelines/pipelines.md create mode 100644 docs/pipelines/pipelines_sdk_function_decorators.md create mode 100644 docs/pipelines/pipelines_sdk_tasks.md diff --git a/docs/fundamentals/pipelines.md b/docs/fundamentals/pipelines.md deleted file mode 100644 index d28314f4..00000000 --- a/docs/fundamentals/pipelines.md +++ /dev/null @@ -1,454 +0,0 @@ ---- -title: Pipelines ---- - -Pipelines are a way to streamline and connect multiple processes, plugging the output of one process as the input of another. - -Pipelines are controlled by a *Controller Task* that holds the logic of the pipeline execution steps (i.e. the python-code -control logic, configuring and launching the pipeline steps / components). Like any other [Task](task.md) in ClearML, -the Controller Task can be cloned, modified and relaunched. - -The pipeline logic can be executed on any machine, while the pipeline steps themselves are launched on remote machines -using the `clearml-agent`. The pipeline logic itself can also be executed on a remote machine, by default it will be -executed on the `services` queue machine. See [queues](agents_and_queues.md), [remote-executions](task.md#advanced-remote-execution), -and [services queues](../clearml_agent.md#services-mode). - -ClearML supports two types of Pipelines, both logic driven, fully customizable, and not limited to a simple DAG: -* Pipelines from [pre-existing Tasks](#pipelines-from-tasks) -* Pipeline from [function decorators](#pipeline-from-function-decorator) - -## Pipelines from Tasks -This type of pipeline is a DAG-like pipeline where each node / step on the DAG is a pre-existing Task in ClearML. The DAG -specification tells the pipeline which node to launch based on parent nodes completing their execution. DAG -specification can also modify the inputs of each Task, thus enabling you to point the output of one Task as the input of -another Task. - -### How Do Pipelines Work? - -Users can automate [Tasks](task.md) to run consecutively or according to some logic by putting the tasks into a pipeline. -Tasks in a pipeline can leverage other tasks' work products such as artifacts and parameters. - -Before running a pipeline, we need to configure a Controller Task, in which the pipeline is defined. Pipelines are made -up of steps. Each step consists of a task that already exists in the ClearML Server and is used as a template. The -user decides the controlling logic of the step interactions, whether it be simple ([DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph)) -or more complex. - -Once the pipeline is running, it starts sequentially launching the steps configured in the Controller. In each step, the template task -is cloned, and the cloned task is sent for execution. Depending on the specifications laid out in the Controller Task, a -step's parameters can be overridden, and / or a step can use a previous step's work products. - -Callbacks can be utilized to control pipeline execution flow. A callback can be defined -to be called before and / or after the execution of every task in a pipeline. Additionally, there is an option to -create customized, step-specific callbacks. - -![Pipeline chart](../img/fundamentals_pipeline.png) - - -### Simple DAG Pipelines - -For a simple, DAG based logic, use the off-the-shelf [`PipelineController`](../references/sdk/automation_controller_pipelinecontroller.md) class to define the DAG (see an example -[here](../guides/pipeline/pipeline_controller.md)). Once the `PipelineController` object is populated and configured, -we can start the pipeline, which will begin executing the steps in succession, then it waits until the pipeline is completed. -The pipeline control logic is processed in a background thread. - -:::note -We recommend enqueuing Pipeline Controller Tasks into a -[services](../clearml_agent.md#services-mode) queue. -::: - -Callback functions can be specified to be called in the steps of a `PipelineController` object. -There is an option to define a callback to be called before and / or after every step in the pipeline, -using the `step_task_created_callback` or the `step_task_completed_callback` parameters of the [`start`](../references/sdk/automation_controller_pipelinecontroller.md#start) -method. Alternatively, step-specific callback functions can be specified with the `pre_execute_callback` and / or -`post_execute_callback` parameters of the [`add_step`](../references/sdk/automation_controller_pipelinecontroller.md#add_step) -method. - -### Advanced Pipelines - -Since a pipeline *Controller Task* is itself a ClearML Task, it can be used as a pipeline step and can be used to create -more complicated workflows, such as pipelines running other pipelines, or a pipeline running multiple tasks concurrently. - -For example, it could be useful to have one pipeline for data preparation, which triggers a second pipeline that trains -networks. - -It could also be useful to run a pipeline that runs tasks concurrently, training multiple networks with different hyperparameter -values simultaneously. See the [Tabular training pipeline](../guides/frameworks/pytorch/notebooks/table/tabular_training_pipeline.md) -example of a pipeline with concurrent steps. - -### Custom Pipelines - -In cases where a DAG is insufficient (for example, when needing to launch one pipeline, then, if performance is inadequate, -rerun pipeline again), users can apply custom logic, using generic methods to enqueue tasks, implemented in python code. -The custom logic of the pipeline sits in the *Controller Task*'s script. - -Custom pipelines usually involve cloning template tasks, modifying their parameters, and manually enqueuing -them to queues (for execution by [agents](../clearml_agent.md)). It's possible to create custom logic that controls inputs -(e.g. overriding hyperparameters and artifacts) and acts upon task outputs. - -See [Manual Random Parameter Search](../guides/automation/manual_random_param_search_example.md) example of a custom pipeline. - -## Pipeline from Function Decorator - -This pipeline type is a pipeline fully created from code. This means each step in the pipeline is a function that will -be launched as an independent job on a remote machine. The function input arguments are converted into Task -hyperparameters with the section name `kwargs`. The function return value is stored as an artifact (or artifacts when -multiple objects are returned), on the component Task. Both inputs / outputs are handled automatically and are transparent to the -user, see details below. - -We will demonstrate how to build a pipeline using the function decorator method. The pipeline will include the following -four steps: -1. Get data into the system (e.g. download data from DB, internet address etc) -1. Pre-process Data (e.g. fix missing values, or conform time zone etc.) -1. Train Model based on Data -1. Verify model against blind static dataset - -The example pipeline is a 4-step pipeline, or in other words, four functions that will be called one after the other. -We start with a simple python code, four functions, and one main control function actually making the calls moving -inputs / outputs between the steps: - -```python -from clearml.automation.controller import PipelineDecorator -from clearml import TaskTypes - -def step_one(pickle_data_url: str, extra: int = 43): - import sklearn # noqa - import pickle - import pandas as pd - from clearml import StorageManager - local_iris_pkl = StorageManager.get_local_copy(remote_url=pickle_data_url) - with open(local_iris_pkl, 'rb') as f: - iris = pickle.load(f) - data_frame = pd.DataFrame(iris['data'], columns=iris['feature_names']) - data_frame.columns += ['target'] - data_frame['target'] = iris['target'] - return data_frame - -def step_two(data_frame, test_size=0.21, random_state=421): - import pandas as pd # noqa - from sklearn.model_selection import train_test_split - y = data_frame['target'] - X = data_frame[(c for c in data_frame.columns if c != 'target')] - X_train, X_test, y_train, y_test = train_test_split( - X, y, test_size=test_size, random_state=random_state) - return X_train, X_test, y_train, y_test - -def step_three(X_train, y_train): - print('step_three') - # make sure we have pandas for this step, we need it to use the data_frame - import pandas as pd # noqa - from sklearn.linear_model import LogisticRegression - model = LogisticRegression(solver='liblinear', multi_class='auto') - model.fit(X_train, y_train) - return model - -def step_four(model, X_data, Y_data): - from sklearn.linear_model import LogisticRegression # noqa - from sklearn.metrics import accuracy_score - Y_pred = model.predict(X_data) - return accuracy_score(Y_data, Y_pred, normalize=True) - -def main(pickle_url, mock_parameter='mock'): - data_frame = step_one(pickle_url) - X_train, X_test, y_train, y_test = step_two(data_frame) - model = step_three(X_train, y_train) - accuracy = 100 * step_four(model, X_data=X_test, Y_data=y_test) - print(f"Accuracy={accuracy}%") -``` - -Notice that the driver is the `main` function, calling ("launching") the different steps. Next we add the decorators over -all the steps, and the main pipeline decorator over the main function. From this point onwards, any -call for one of the decorated steps will actually create a ClearML Task from the code, and launch -the Task (see `queue` argument of the decorator function). - -Notice, the returned object is a "proxy object" that returns immediately, even if the associated pipeline step Task is -still running. Only when the code tries to use the returned "proxy object" in the logic, we stop and wait for the Task -to complete the execution. This is the equivalent of using python coroutines where a function call is `async` , -`await` is called before using the return value. - -Now we can add the "@ decorators" and create the pipeline from the functions: - -```python -from clearml.automation.controller import PipelineDecorator -from clearml import TaskTypes - -@PipelineDecorator.component(return_values=['data_frame'], cache=True, task_type=TaskTypes.data_processing) -def step_one(pickle_data_url: str, extra: int = 43): - import sklearn # noqa - import pickle - import pandas as pd - from clearml import StorageManager - local_iris_pkl = StorageManager.get_local_copy(remote_url=pickle_data_url) - with open(local_iris_pkl, 'rb') as f: - iris = pickle.load(f) - data_frame = pd.DataFrame(iris['data'], columns=iris['feature_names']) - data_frame.columns += ['target'] - data_frame['target'] = iris['target'] - return data_frame - -@PipelineDecorator.component( - return_values=['X_train, X_test, y_train, y_test'], cache=True, task_type=TaskTypes.data_processing) -def step_two(data_frame, test_size=0.21, random_state=421): - import pandas as pd # noqa - from sklearn.model_selection import train_test_split - y = data_frame['target'] - X = data_frame[(c for c in data_frame.columns if c != 'target')] - X_train, X_test, y_train, y_test = train_test_split( - X, y, test_size=test_size, random_state=random_state) - return X_train, X_test, y_train, y_test - -@PipelineDecorator.component(return_values=['model'], cache=True, task_type=TaskTypes.training) -def step_three(X_train, y_train): - print('step_three') - # make sure we have pandas for this step, we need it to use the data_frame - import pandas as pd # noqa - from sklearn.linear_model import LogisticRegression - model = LogisticRegression(solver='liblinear', multi_class='auto') - model.fit(X_train, y_train) - return model - -@PipelineDecorator.component(return_values=['accuracy'], cache=True, task_type=TaskTypes.qc) -def step_four(model, X_data, Y_data): - from sklearn.linear_model import LogisticRegression # noqa - from sklearn.metrics import accuracy_score - Y_pred = model.predict(X_data) - return accuracy_score(Y_data, Y_pred, normalize=True) - -@PipelineDecorator.pipeline(name='pipeline', project='examples', version='0.1') -def main(pickle_url, mock_parameter='mock'): - data_frame = step_one(pickle_url) - X_train, X_test, y_train, y_test = step_two(data_frame) - model = step_three(X_train, y_train) - accuracy = 100 * step_four(model, X_data=X_test, Y_data=y_test) - print(f"Accuracy={accuracy}%") -``` - -We wrap each pipeline component with `@PipelineDecorator.component`, and the main pipeline logic with -`@PipelineDecorator.pipeline` - -### @PipelineDecorator.component - -Wrapping a function with the `PipelineDecorator.component` decorator will make the function a pipeline component that can -be called from the main pipeline logic function. - -Important arguments: -* `return_values` - Name the return values of the function. This argument is used to hint to the system how many objects - are returned, as well as give them meaningful names. - * Examples: - * `["data"]` => means single object returned (it will be stored as an artifact named `data`) - * `["x", "y"]` => means two objects returned (stored as artifacts named `x`, `y` respectfully) - -* `name` (Optional) - set the name of the pipeline component task. If not provided, the wrapped function name is used as - the pipeline component name - -* `cache` - If `True`, before launching the new step, after updating with the latest configuration, check if an exact - Task (step) with the same parameter / code was already executed. If found, use it instead of launching a new Task. - -* `packages` - Manually specify a list of required packages or a local `requirements.txt` file. Example: - `["tqdm>=2.1", "scikit-learn"]` or `"./requirements.txt"`. - If not provided, packages are automatically added based on the imports used inside the function. - -* `execution_queue` (Optional) - the queue to use for executing this specific step. If not provided, the task will be - sent to the pipeline’s default execution queue - -* `continue_on_fail` - If `True`, a failed step will not cause the pipeline to stop (or marked as failed). Notice, that - steps that are connected (or indirectly connected) to the failed step will be skipped (default `False`) - -* `docker` - Specify the Docker image to be used when executing the pipeline step remotely - -* `docker_args` - Add Docker execution arguments for the remote execution (use single string for all docker arguments). - -* `docker_bash_setup_script` - Add a bash script to be executed inside the docker before setting up the Task's environment - -* `task_type` (Optional) - The [task type](task.md#task-types) to be created - -* `repo` (Optional) - Specify a repository to attach to the function, when remotely executing. Allow users to execute - the function inside the specified repository, enabling them to load modules / script from the repository. Notice the - execution work directory will be the repository root folder. Supports both git repo url link, and local repository path - (automatically converted into the remote git / commit as is currently checkout). - * Examples: - * remote url: `"https://github.com/user/repo.git"` - * local repo copy: `"./repo"` -> will automatically store the remote repo url and commit ID based on the locally - cloned copy - -* `repo_branch` (Optional) - Specify the remote repository branch (Ignored, if local repo path is used) -* `repo_commit` (Optional) - Specify the repository commit ID (Ignored, if local repo path is used) - -* `helper_functions` (Optional) - A list of helper functions to make available for the standalone pipeline step function - Task. By default, the pipeline step function has no access to any of the other functions, by specifying additional - functions here, the remote pipeline step could call the additional functions. - Example, assuming we have two functions, `parse_data()` and `load_data()`: `[parse_data, load_data]` - -* `monitor_metrics` (Optional) - Automatically log the step's reported metrics also on the pipeline Task. - The expected format is one of the following: - * List of pairs metric (title, series) to log: `[(step_metric_title, step_metric_series), ]`. - Example: `[('test', 'accuracy'), ]` - * List of tuple pairs, to specify a different target metric to use on the pipeline Task: `[((step_metric_title, step_metric_series), (target_metric_title, target_metric_series)), ]`. - Example: `[[('test', 'accuracy'), ('model', 'accuracy')], ]` -* `monitor_artifacts` (Optional) - Automatically log the step's artifacts on the pipeline Task. - * Provided a list of artifact names created by the step function, these artifacts will be logged automatically also - on the Pipeline Task itself. - Example: `['processed_data', ]` (target artifact name on the Pipeline Task will have the same name as the original artifact). - * Alternatively, provide a list of pairs `(source_artifact_name, target_artifact_name)`, where the first string is the - artifact name as it appears on the component Task, and the second is the target artifact name to put on the Pipeline - Task. - Example: `[('processed_data', 'final_processed_data'), ]` -* `monitor_models` (Optional) - Automatically log the step's output models on the pipeline Task. - * Provided a list of model names created by the step's Task, they will also appear on the Pipeline itself. - Example: `['model_weights', ]` - * To select the latest (lexicographic) model use `model_*`, or the last created model with just `*`. - Example: `['model_weights_*', ]` - * Alternatively, provide a list of pairs `(source_model_name, target_model_name)`, - where the first string is the model name as it appears on the component Task, - and the second is the target model name to put on the Pipeline Task. - Example: `[('model_weights', 'final_model_weights'), ]` - - - -:::tip Importing Packages -Notice that each component is treated as a standalone script, this also means that global imports (i.e. outside the -function) are not transferred into the standalone Task. This means that any packages used inside the component function -should be imported inside the function itself. - -All imports are automatically logged, and will appear as required packages for the remote Task. This means the -`clearml-agent` will install the requested environment automatically. - -For local imports (e.g. `from my_helper_functions import foo`) you need to make sure these local files are available to -the standalone script at runtime. The only way to do this for now is to use the `repo`, `repo_branch` and `repo_commit` -arguments detailed above. This does mean the helper functions should be committed to that repository at runtime. -::: - -### @PipelineDecorator.pipeline - -Wrapping a function with the `PipelineDecorator.pipeline` decorator will make the function the main pipeline logic -function (`pipeline` Task), The pipeline components are called from the main function, like any python function, with -arguments and return values, these in turn are converted into Tasks running on remote-machines (or background sub-processes). - -Notice that the pipeline logic function’s argument (i.e. the arguments of the function being decorated), will be -automatically logged as the pipeline arguments, and will appear in the pipeline Task CONFIGURATION tab, `Args` section. -These parameters can later be overridden when cloning the pipeline and relaunching it (see Pipeline Cloning and Reusing) - -Important arguments for the pipeline decorator: - -* `name` - Provide pipeline name (if main Task exists it overrides its name). -* `project` - Provide project storing the pipeline (if main Task exists it overrides its project). -* `version` - Must provide pipeline version. This version allows us to uniquely identify the pipeline template execution. -Examples for semantic versions: `version='1.0.1'` , `version='23'`, `version='1.2'`. -* `default_queue` - default queue to launch pipeline components on (unless otherwise specified on the pipeline component - itself). -* `pool_frequency` - The pooling frequency (in minutes) for monitoring experiments / states. -* `add_pipeline_tags` - If `True`, add `pipe: ` tag to all steps (Tasks) created by this pipeline. - (this is useful to create better visibility into projects with multiple pipelines, and for easy selection) (default: `False`). -* `target_project` - If provided, all pipeline steps are cloned into the target project. If not provided pipeline steps - are stored on the same project as the pipeline itself. Target sub-folder allows for easier organization of pipeline - execution logic (Pipeline Task) and component execution Tasks. Example: `"pipeline/component_execution"`. -* `abort_on_failure` - If `False` (default), failed pipeline steps will not cause the pipeline to stop immediately, - instead any step that is not connected (or indirectly connected) to the failed step, will still be executed. Nonetheless, - the pipeline itself will be marked failed (unless the failed step was specifically defined with `continue_on_fail=True`). - If `True`, any failed step will cause the pipeline to immediately abort, stopping all running steps, and marking the - pipeline as failed. -* `pipeline_execution_queue` - remote pipeline execution queue (default `services` queue). By default, the pipeline logic - function (i.e. the function we are wrapping), is designed to be executed on a remote machine, by default the `services` - queue is running control logic Tasks. To execute the pipeline logic locally, pass `None`, Notice the pipeline steps are - still executed remotely. - -### Pipeline Controller Execution Options - -Now that we understand how the pipeline control logic works, we need to review the execution options of the Pipeline Controller. - -#### Remote Mode -The remote mode is the pipeline controller's default mode. In this mode, the pipeline controller logic is executed on the -`services` queue, and all the pipeline components are launched remotely on their respective queues. - -Example: -```python -if __name__ == '__main__': - executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') - print('pipeline completed') -``` - -:::tip Run Pipeline Controller Locally -It is possible to run the pipeline logic itself locally, while keeping the pipeline components execution remotely -(enqueued and executed by the `clearml-agent`). Pass `pipeline_execution_queue=None` to the decorator -`@PipelineDecorator.pipeline`. - -```python -@PipelineDecorator.pipeline( - name='custom pipeline logic', project='examples', version='0.0.5', pipeline_execution_queue=None -) -``` -::: - -#### Debugging Mode -In debugging mode, the pipeline controller and all components are treated as regular python functions, with components -called synchronously. This mode is great to debug the components and design the pipeline as the entire pipeline is -executed on the developer machine with full ability to debug each function call. -Call `PipelineDecorator.debug_pipeline()` before the main pipeline logic function call. - -Example: -```python -if __name__ == '__main__': - PipelineDecorator.debug_pipeline() - executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') - print('pipeline completed') -``` - - -#### Local Mode -In local mode, the pipeline controller creates Tasks for each component, and component functions calls are translated -into sub-processes running on the same machine. Notice that the data is passed between the components and the logic with -the exact same mechanism as in the remote mode (i.e. hyperparameters / artifacts), with the exception that the execution -itself is local. Notice that each subprocess is using the exact same python environment as the main pipeline logic. -Call `PipelineDecorator.run_locally()` before the main pipeline logic function. - -Example: -```python -if __name__ == '__main__': - PipelineDecorator.run_locally() - executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') - print('pipeline completed') -``` - - -### Artifacts and Metrics -Each pipeline component can log additional artifacts and metrics on the component task with the usual flows -(TB, Matplotlib, or with ClearML Logger). To get the instance of the component’s Task in runtime, use the class method -[`Task.current_task()`](../references/sdk/task.md#taskcurrent_task). - -Additionally, a pipeline components can directly report metrics or upload artifacts / models to the pipeline using the -Pipeline class methods: [`PipelineController.get_logger`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinecontrollerget_logger), -`PipelineController.upload_model`, [`PipelineController.upload_artifact`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinecontrollerupload_artifact). - -The pipeline controller also offers automation for logging the component metrics / artifacts / models on the pipeline task -itself. Each pipeline component can specify metrics / artifacts / models to also be automatically logged on the pipeline -Task. The idea is the pipeline components are reporting metrics internally while the pipeline automatically collects them -into a unified view on the pipeline Task. To enable the automatic logging, use the `monitor_metrics`, `monitor_artifacts`, -`monitor_models` arguments of the `PipelineDecorator.component` decorator function. - - -### Pipeline Component Caching -The Pipeline controller also offers component caching, meaning, reusing previously executed outputs of pipeline components, -assuming the exact same component code, and the same component input values. By default, pipeline components are not cached. -To enable caching, pass `cache=True` to the `PipelineDecorator.component` decorator function. - -When a component is cached, the component function code is hashed, alongside the component arguments -(as passed in runtime), into a single representing hash string. The pipeline logic first checks if a cached component -Task exists in the system (archived Tasks are ignored, i.e. archived Task will not be used as cached instance). If the -pipeline logic find an existing fully executed instance of the component, it will plug its output directly, allowing the -pipeline logic to reuse the component outputs. - -## Pipeline DAG Representation - -The pipeline execution graph is built directly when executing the logic, during runtime, based on the inferred connections -between the pipeline components. The execution graph and details are visible under the pipeline Task’s **RESULTS > PLOTS** - - - -## Pipeline Cloning and Reusing -Pipelines, like any Task in the system, can be cloned, modified, enqueued and scheduled. - -The main pipeline logic function's arguments are stored in the Pipeline Task **CONFIGURATIONS > Args** section. -Using the UI or programmatically, users can clone the pipeline Task, modify the pipeline arguments, and send the -pipeline for execution by enqueuing the pipeline on the `services` queue. - - - diff --git a/docs/getting_started/ds/best_practices.md b/docs/getting_started/ds/best_practices.md index 787fe0d6..772a718a 100644 --- a/docs/getting_started/ds/best_practices.md +++ b/docs/getting_started/ds/best_practices.md @@ -48,7 +48,7 @@ that we need. - [ClearML Agent](../../clearml_agent.md) does the heavy lifting. It reproduces the execution environment, clones your code, applies code patches, manages parameters (Including overriding them on the fly), executes the code and queues multiple tasks It can even [build](../../clearml_agent.md#exporting-a-task-into-a-standalone-docker-container) the docker container for you! -- [ClearML Pipelines](../../fundamentals/pipelines.md) ensure that steps run in the same order, +- [ClearML Pipelines](../../pipelines/pipelines.md) ensure that steps run in the same order, programmatically chaining tasks together, while giving an overview of the execution pipeline's status. **Your entire environment should magically be able to run on any machine, without you working hard.** diff --git a/docs/getting_started/ds/ds_second_steps.md b/docs/getting_started/ds/ds_second_steps.md index 0198d00b..8f917f84 100644 --- a/docs/getting_started/ds/ds_second_steps.md +++ b/docs/getting_started/ds/ds_second_steps.md @@ -176,7 +176,7 @@ or check these pages out: - Scale you work and deploy [ClearML Agents](../../clearml_agent.md) - Develop on remote machines with [ClearML Session](../../apps/clearml_session.md) -- Structure your work and put it into [Pipelines](../../fundamentals/pipelines.md) +- Structure your work and put it into [Pipelines](../../pipelines/pipelines.md) - Improve your experiments with [HyperParameter Optimization](../../fundamentals/hpo.md) - Check out ClearML's integrations to [external libraries](../../integrations/libraries.md). diff --git a/docs/getting_started/mlops/mlops_best_practices.md b/docs/getting_started/mlops/mlops_best_practices.md index dfc6dad3..bb037cd2 100644 --- a/docs/getting_started/mlops/mlops_best_practices.md +++ b/docs/getting_started/mlops/mlops_best_practices.md @@ -26,7 +26,7 @@ Once we have a Task in ClearML, we can clone and edit its definitions in the UI, ## Advanced Automation - Create daily / weekly cron jobs for retraining best performing models on. - Create data monitoring & scheduling and launch inference jobs to test performance on any new coming dataset. -- Once there are two or more experiments that run after another, group them together into a [pipeline](../../fundamentals/pipelines.md). +- Once there are two or more experiments that run after another, group them together into a [pipeline](../../pipelines/pipelines.md). ## Manage Your Data Use [ClearML Data](../../clearml_data/clearml_data.md) to version your data, then link it to running experiments for easy reproduction. diff --git a/docs/getting_started/mlops/mlops_first_steps.md b/docs/getting_started/mlops/mlops_first_steps.md index e96a32f9..58c6cdee 100644 --- a/docs/getting_started/mlops/mlops_first_steps.md +++ b/docs/getting_started/mlops/mlops_first_steps.md @@ -154,7 +154,7 @@ a_numpy = executed_task.artifacts['numpy'].get() ``` By facilitating the communication of complex objects between tasks, artifacts serve as the foundation of ClearML's [Data Management](../../clearml_data/clearml_data.md) -and [pipeline](../../fundamentals/pipelines.md) solutions. +and [pipeline](../../pipelines/pipelines.md) solutions. #### Log Models Logging models into the model repository is the easiest way to integrate the development process directly with production. diff --git a/docs/getting_started/mlops/mlops_second_steps.md b/docs/getting_started/mlops/mlops_second_steps.md index fdebefa0..ad53d2d6 100644 --- a/docs/getting_started/mlops/mlops_second_steps.md +++ b/docs/getting_started/mlops/mlops_second_steps.md @@ -113,4 +113,4 @@ pipe.add_step( We could also pass the parameters from one step to the other (for example `Task.id`). In addition to pipelines made up of Task steps, ClearML also supports pipelines consisting of function steps. See more in the -full pipeline documentation [here](../../fundamentals/pipelines.md). \ No newline at end of file +full pipeline documentation [here](../../pipelines/pipelines.md). \ No newline at end of file diff --git a/docs/guides/pipeline/pipeline_decorator.md b/docs/guides/pipeline/pipeline_decorator.md index cca16709..76e16f26 100644 --- a/docs/guides/pipeline/pipeline_decorator.md +++ b/docs/guides/pipeline/pipeline_decorator.md @@ -62,7 +62,7 @@ decorator overrides the default queue value for the specific step for which it w :::note Execution Modes ClearML provides different pipeline execution modes to accommodate development and production use cases. For additional -details, see [Execution Modes](../../fundamentals/pipelines.md#pipeline-controller-execution-options). +details, see [Execution Modes](../../pipelines/pipelines.md#pipeline-controller-execution-options). ::: To run the pipeline, call the pipeline controller function. diff --git a/docs/img/pipelines_DAG.png b/docs/img/pipelines_DAG.png new file mode 100644 index 0000000000000000000000000000000000000000..74122becbbebe95452ae24e4072b9dbc5828eda1 GIT binary patch literal 142415 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%0DdSggt?XltAkr^w#AHe5{5=bJ+%aN-08 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
  • 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 literal 0 HcmV?d00001 diff --git a/docs/img/pipelines_new_run.png b/docs/img/pipelines_new_run.png new file mode 100644 index 0000000000000000000000000000000000000000..67b40acf49b70c8bb1656cded515b1ee6807d352 GIT binary patch literal 26112 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 Args** section. You can clone the pipeline +Task using the UI or programmatically, modify the pipeline arguments, and send the pipeline for execution by enqueuing +the pipeline on the `services` queue. + +### Pipeline Versions +Each pipeline must be assigned a version number to help track the evolution of your pipeline structure and parameters. + +If you pass `auto_version_bump=True` when instantiating a PipelineController, the pipeline’s version automatically bumps up +if there is a change in the pipeline code. If there is no change, the pipeline retains its version number. + + +## Examples + +See examples of building ClearML pipelines: +* [PipelineDecorator](../guides/pipeline/pipeline_decorator.md) +* PipelineController + * [Pipeline from tasks](../guides/pipeline/pipeline_controller.md) + * [Pipeline from functions](../guides/pipeline/pipeline_functions.md) + \ No newline at end of file diff --git a/docs/pipelines/pipelines_sdk_function_decorators.md b/docs/pipelines/pipelines_sdk_function_decorators.md new file mode 100644 index 00000000..516d0e5e --- /dev/null +++ b/docs/pipelines/pipelines_sdk_function_decorators.md @@ -0,0 +1,195 @@ +--- +title: PipelineDecorator +--- + +## Creating Pipelines Using Function Decorators + +Use the [PipelineDecorator](../references/sdk/automation_controller_pipelinecontroller.md#class-automationcontrollerpipelinedecorator) +class to create pipelines from your existing functions. Use [`@PipelineDecorator.component`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorcomponent) +to denote functions that comprise the steps of your pipeline, and [`@PipelineDecorator.pipeline`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorpipeline) +for your main pipeline execution logic function. + +## @PipelineDecorator.pipeline + +Using the [`@PipelineDecorator.pipeline`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorpipeline) +decorator transforms the function which implements your pipeline's execution logic to a ClearML pipeline controller + +```python +@PipelineDecorator.pipeline(name='pipeline', project='examples', version='0.1') +def main(pickle_url, mock_parameter='mock'): + data_frame = step_one(pickle_url) + X_train, X_test, y_train, y_test = step_two(data_frame) + model = step_three(X_train, y_train) + accuracy = 100 * step_four(model, X_data=X_test, Y_data=y_test) + print(f"Accuracy={accuracy}%") +``` + +### Arguments + +* `name` - The name for the pipeline controller task +* `project` - The ClearML project where the pipeline controller task is stored +* `version` - Numbered version string (e.g. 1.2.3). If `auto_version_bump` is set to `True`, the version number is + automatically bumped if the same version already exists and the pipeline code has changed +* `default_queue` - The default [ClearML Queue](../fundamentals/agents_and_queues.md#what-is-a-queue) in which to enqueue all pipeline steps (unless otherwise specified in the pipeline step). +* `pool_frequency` - The pooling frequency (in minutes) for monitoring experiments / states. +* `add_pipeline_tags` - If `True`, add `pipe: ` tag to all steps (Tasks) created by this pipeline + (this is useful to create better visibility in projects with multiple pipelines, and for easy selection) (default: + `False`). +* `target_project` - If provided, all pipeline steps are cloned into the target project. If not provided, pipeline steps + are stored on the same project as the pipeline itself. Target sub-folder allows for easier organization of pipeline + execution logic (Pipeline Task) and step execution Tasks. Example: "pipeline/component_execution". +* `abort_on_failure` - If `False` (default), failed pipeline steps will not cause the pipeline to stop immediately. + Instead, any step that is not connected (or indirectly connected) to the failed step, will still be executed. + Nonetheless, the pipeline itself will be marked failed (unless the failed step was specifically defined with + `continue_on_fail=True`). If `True`, any failed step will cause the pipeline to immediately abort, stopping all running + steps, and marking the pipeline as failed. +* `pipeline_execution_queue` - The queue in which to enqueue the pipeline controller task. The default value is the + `services` queue. To run the pipeline logic locally while the components are executed remotely, pass + `pipeline_execution_queue=None` + +When the function is called, a corresponding ClearML Controller Task is created: its arguments are logged as the task’s +parameters. When launching a new pipeline run from the [UI](../webapp/pipelines/webapp_pipeline_page.md), you can modify their values for the new run. + +![Pipeline new run](../img/pipelines_new_run.png) + +## @PipelineDecorator.component +Using the [`@PipelineDecorator.component`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorcomponent) +decorator transforms a function into a ClearML pipeline step when called from a pipeline controller. + +When the pipeline controller calls a pipeline step, a corresponding ClearML task is created. For this reason, each +function which makes up a pipeline step needs to be self-contained. All package imports inside the function are automatically +logged as required packages for the pipeline execution step. + +```python +from clearml.automation.controller import PipelineDecorator + +@PipelineDecorator.component(return_values=['data_frame'], cache=True) +def step_one(pickle_data_url: str, extra: int = 43): + import sklearn # noqa + import pickle + import pandas as pd + from clearml import StorageManager + local_iris_pkl = StorageManager.get_local_copy(remote_url=pickle_data_url) + with open(local_iris_pkl, 'rb') as f: + iris = pickle.load(f) + data_frame = pd.DataFrame(iris['data'], columns=iris['feature_names']) + data_frame.columns += ['target'] + data_frame['target'] = iris['target'] + return data_frame +``` +### Arguments +* `return_values` - The artifact names for the step’s corresponding ClearML task to store the step’s returned objects. + In the example above, a single object is returned and stored as an artifact named `data_frame` +* `name` (Optional) - The name for the pipeline step. If not provided, the function name is used +* `cache` - If `True`, the pipeline controller checks if an identical step with the same parameters was already executed. + If found, its outputs are used instead of rerunning the step. +* `packages` - A list of required packages or a local requirements.txt file. Example: `["tqdm>=2.1", "scikit-learn"]` or + `"./requirements.txt"`. If not provided, packages are automatically added based on the imports used inside the function. +* `execution_queue` (Optional) - Queue in which to enqueue the specific step. This overrides the queue set with the + [PipelineDecorator.set_default_execution_queue method](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorset_default_execution_queue) + method. +* `continue_on_fail` - If `True`, a failed step does not cause the pipeline to stop (or marked as failed). Notice, that + steps that are connected (or indirectly connected) to the failed step are skipped (default `False`) +* `docker` - Specify the Docker image to be used when executing the pipeline step remotely +* `docker_args` - Add Docker execution arguments for the remote execution (use single string for all docker arguments). +* `docker_bash_setup_script` - Add a bash script to be executed inside the docker before setting up the Task's environment +* `task_type` (Optional) - The [task type](../fundamentals/task.md#task-types) to be created +* `repo` (Optional) - Specify a repository to attach to the function when remotely executing. Allow users to execute the function inside the specified repository, enabling them to load modules / script from the repository. Notice the execution work directory will be the repository root folder. Supports both git repo url link, and local repository path (automatically converted into the remote git / commit as is currently checkout). + * Examples: + * remote url: `"https://github.com/user/repo.git"` + * local repo copy: `"./repo"` -> will automatically store the remote repo url and commit ID based on the locally cloned copy +* `repo_branch` (Optional) - Specify the remote repository branch (Ignored, if local repo path is used) +* `repo_commit` (Optional) - Specify the repository commit ID (Ignored, if local repo path is used) +* `helper_functions` (Optional) - A list of helper functions to make available for the standalone pipeline step. By default, the pipeline step function has no access to any of the other functions, by specifying additional functions here, the remote pipeline step could call the additional functions. + Example, assuming we have two functions, `parse_data()` and `load_data()`: `[parse_data, load_data]` +* `parents` – Optional list of parent steps in the pipeline. The current step in the pipeline will be sent for execution only after all the parent steps have been executed successfully. + +Additionally, you can enable automatic logging of a step’s metrics / artifacts / models to the pipeline task using the +following arguments: +* `monitor_metrics` (Optional) - Automatically log the step's reported metrics also on the pipeline Task. The expected + format is one of the following: + * List of pairs metric (title, series) to log: [(step_metric_title, step_metric_series), ]. Example: `[('test', 'accuracy'), ]` + * List of tuple pairs, to specify a different target metric to use on the pipeline Task: [((step_metric_title, step_metric_series), (target_metric_title, target_metric_series)), ]. + Example: `[[('test', 'accuracy'), ('model', 'accuracy')], ]` +* `monitor_artifacts` (Optional) - Automatically log the step's artifacts on the pipeline Task. + * Provided a list of + artifact names created by the step function, these artifacts will be logged automatically also on the Pipeline Task + itself. Example: `['processed_data', ]` (target artifact name on the Pipeline Task will have the same name as the original + artifact). + * Alternatively, provide a list of pairs (source_artifact_name, target_artifact_name), where the first string is the + artifact name as it appears on the component Task, and the second is the target artifact name to put on the Pipeline + Task. Example: [('processed_data', 'final_processed_data'), ] +* `monitor_models` (Optional) - Automatically log the step's output models on the pipeline Task. + * Provided a list of model names created by the step's Task, they will also appear on the Pipeline itself. Example: `['model_weights', ]` + * To select the latest (lexicographic) model use `model_*`, or the last created model with just `*`. Example: `['model_weights_*', ]` + * Alternatively, provide a list of pairs (source_model_name, target_model_name), where the first string is the model + name as it appears on the component Task, and the second is the target model name to put on the Pipeline Task. + Example: `[('model_weights', 'final_model_weights'), ]` + +You can also directly upload a model or an artifact from the step to the pipeline controller, using the +[PipelineDecorator.upload_model](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorupload_model) +and [PipelineDecorator.upload_artifact](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorupload_artifact) +methods respectively. + + +## Controlling Pipeline Execution +### Default Execution Queue +The [PipelineDecorator.set_default_execution_queue](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorset_default_execution_queue) +method lets you set a default queue through which all pipeline steps +will be executed. Once set, step-specific overrides can be specified through the `@PipelineDecorator.component` decorator. + +### Running the Pipeline +To run the pipeline, call the pipeline controller function. + +ClearML pipelines can be run in one of the following modes: + +#### Remote Mode +The remote mode is the pipeline controller's default mode. In this mode, the pipeline controller logic is executed on the +services queue, and all the pipeline steps are launched remotely on their respective queues. + +Example: +```python +if __name__ == '__main__': + executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') + print('pipeline completed') +``` + +:::tip RUN PIPELINE CONTROLLER LOCALLY +It is possible to run the pipeline logic itself locally, while keeping the pipeline components execution remote +(enqueued and executed by the clearml-agent). Pass `pipeline_execution_queue=None` to the `@PipelineDecorator.pipeline` decorator. +```python +@PipelineDecorator.pipeline( + name='custom pipeline logic', project='examples', version='0.0.5', pipeline_execution_queue=None +) +``` +::: + +#### Debugging Mode +In debugging mode, the pipeline controller and all components are treated as regular python functions, with components +called synchronously. This mode is great to debug the components and design the pipeline as the entire pipeline is +executed on the developer machine with full ability to debug each function call. Call [PipelineDecorator.debug_pipeline](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratordebug_pipeline) +before the main pipeline logic function call. + +Example: +```python +if __name__ == '__main__': + PipelineDecorator.debug_pipeline() + executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') + print('pipeline completed') +``` + +#### Local Mode +In local mode, the pipeline controller creates Tasks for each component, and component functions calls are translated +into sub-processes running on the same machine. Notice that the data is passed between the components and the logic with +the exact same mechanism as in the remote mode (i.e. hyperparameters / artifacts), with the exception that the execution +itself is local. Notice that each subprocess is using the exact same python environment as the main pipeline logic. Call +[PipelineDecorator.run_locally](../references/sdk/automation_controller_pipelinecontroller.md#pipelinedecoratorrun_locally) +before the main pipeline logic function. + +Example: +```python +if __name__ == '__main__': + PipelineDecorator.run_locally() + executing_pipeline(pickle_url='https://example.com/iris_dataset.pkl') + print('pipeline completed') +``` diff --git a/docs/pipelines/pipelines_sdk_tasks.md b/docs/pipelines/pipelines_sdk_tasks.md new file mode 100644 index 00000000..6daf30aa --- /dev/null +++ b/docs/pipelines/pipelines_sdk_tasks.md @@ -0,0 +1,227 @@ +--- +title: PipelineController +--- + +## The PipelineController Class + +Create the [PipelineController](../references/sdk/automation_controller_pipelinecontroller.md), where you will define +the pipeline's execution logic: +```python +from clearml import PipelineController +pipe = PipelineController( + name="Pipeline Controller", project="Pipeline example", version="1.0.0" +) +``` + +* `name` - The name for the pipeline controller task +* `project` - The ClearML project where the pipeline tasks will be created. +* `version` - Numbered version string (`e.g. 1.2.3`). When `auto_version_bump` is set to `True`, the version number will + be automatically bumped if the same version already exists and the code has changed + +See [PipelineController](../references/sdk/automation_controller_pipelinecontroller.md) for all arguments. + + +### Pipeline Parameters +You can define parameters for controlling different pipeline runs: + +```python +pipe.add_parameter( + name='pickle_url', + description='url to pickle file', + default='https://github.com/allegroai/events/raw/master/odsc20-east/generic/iris_dataset.pkl' +) +``` + +* `name` - Parameter name +* `default` - Parameter’s default value (this value can later be changed in the UI) +* `description` - String description of the parameter and its usage in the pipeline + +These parameters can be programmatically injected into a step’s configuration using the following format: `"${pipeline.}"`. + +When launching a new pipeline run from the [UI](../webapp/pipelines/webapp_pipeline_table.md), you can modify their +values for the new run. + +![Pipeline new run](../img/pipelines_new_run.png) + + +## Pipeline Steps +Once you have a PipelineController object, add steps to it. These steps can be [existing ClearML tasks](#steps-from-tasks) +or [functions in your code](#steps-from-functions). When the pipeline runs, the controller will launch the steps according +to the specified structure. + +### Steps from Tasks +Creating a pipeline step from an existing ClearML task means that when the step is run, the task will be cloned, and a +new task will be launched through the configured execution queue (the original task is unmodified). The new task’s +parameters can be [specified](#parameter_override). + +Task steps are added using the [PipelineController.add_step](../references/sdk/automation_controller_pipelinecontroller.md#add_step) +method: + +```python +pipe.add_step( + name='stage_process', + parents=['stage_data', ], + base_task_project='examples', + base_task_name='pipeline step 2 process dataset', + parameter_override={ + 'General/dataset_url': '${stage_data.artifacts.dataset.url}', + 'General/test_size': 0.25}, + pre_execute_callback=pre_execute_callback_example, + post_execute_callback=post_execute_callback_example +) +``` + +* `name` - Unique name for the step. This step can be referenced by any proceeding steps in the pipeline using its name. +* One of the following: + * `base_task_project` and `base_task_name` - Project and name of the base task to clone + * `base_task_id` - ID of the base task to clone +* `cache_executed_step` – If `True`, the controller will check if an identical task with the same parameters was already executed. If it was found, its outputs will be used instead of launching a new task. +* `execution_queue` (Optional) - the queue to use for executing this specific step. If not provided, the task will be sent to the default execution queue, as defined on the class +* `parents` – Optional list of parent steps in the pipeline. The current step in the pipeline will be sent for execution only after all the parent steps have been executed successfully. +* `parameter_override` - Dictionary of parameters and values to override in the current step. See [parameter_override](#parameter_override). +* `configuration_overrides` - Dictionary of configuration objects and values to override in the current step. See [configuration_overrides](#configuration_overrides) +* `monitor_models`, `monitor_metrics`, `monitor_artifacts` - see [here](#models-artifacts-and-metrics). + +See [add_step](../references/sdk/automation_controller_pipelinecontroller.md#add_step) for all arguments. + +#### parameter_override +Use the `parameter_override` argument to modify the step’s parameter values. The `parameter_override` dictionary key is +the task parameter’s full path, which includes the parameter section's name and the parameter name separated by a slash +(e.g. `'General/dataset_url'`). Passing `"${}"` in the argument value allows you to reference input/output configurations +from other pipeline steps. For example: `"${.id}"` will be converted to the Task ID of the referenced pipeline +step. + +Examples: +* Artifact URL access: `'${.artifacts..url}'` +* Model access URL access: `'${.models.output.-1.url}'` +* Different step parameter access: `'${.parameters.Args/input_file}'` +* Pipeline parameters (see adding pipeline parameters): `'${pipeline.}'` + +#### configuration_overrides +You can override a step’s configuration object by passing either a string representation of the content of the configuration +object, or a configuration dictionary. + +Examples: +* Configuration dictionary: `configuration_overrides={"my_config": {"key": "value"}}` +* Configuration file: `configuration_overrides={"my_config": open("config.txt", "rt").read()}` + +### Steps from Functions +Creating a pipeline step from a function means that when the function is called, it will be transformed into a ClearML task, +translating its arguments into parameters, and returning values into artifacts. + +Function steps are added using the [`PipelineController.add_function_step`](../references/sdk/automation_controller_pipelinecontroller.md#add_function_step) +method: + +```python +pipe.add_function_step( + name='step_one', + function=step_one, + function_kwargs=dict(pickle_data_url='${pipeline.url}'), + function_return=['data_frame'], + cache_executed_step=True, +) + +pipe.add_function_step( + name='step_two', + # parents=['step_one'], # the pipeline will automatically detect the dependencies based on the kwargs inputs + function=step_two, + function_kwargs=dict(data_frame='${step_one.data_frame}'), + function_return=['processed_data'], + cache_executed_step=True, +) +``` + +* `name` - The pipeline step’s name. This name can be referenced in subsequent steps +* `function` - A global function to be used as a pipeline step, which will be converted into a standalone task +* `function_kwargs` (optional) - A dictionary of function arguments and default values which are translated into task + hyperparameters. If not provided, all function arguments are translated into hyperparameters. +* `function_return` - The names for storing the pipeline step’s returned objects as artifacts in its ClearML task. +* `cache_executed_step` - If `True`, the controller checks if an identical task with the same parameters was already + executed. If it was found, its outputs are used instead of launching a new task. +* `parents` – Optional list of parent steps in the pipeline. The current step in the pipeline will be sent for execution + only after all the parent steps have been executed successfully. +* `pre_execute_callback` & `post_execute_callback` - Control pipeline flow with callback functions that can be called + before and/or after a step’s execution. See [here](#pre_execute_callback--post_execute_callback). +* `monitor_models`, `monitor_metrics`, `monitor_artifacts` - see [here](#models-artifacts-and-metrics). + +See [add_function_step](../references/sdk/automation_controller_pipelinecontroller.md#add_function_step) for all +arguments. + +### Important Arguments + +#### pre_execute_callback & post_execute_callback +Callbacks can be utilized to control pipeline execution flow. + +A `pre_execute_callback` function is called when the step is created and before it is sent for execution. This allows a +user to modify the task before launch. Use node.job to access the [ClearmlJob](../references/sdk/automation_job_clearmljob.md) +object, or node.job.task to directly access the Task object. Parameters are the configuration arguments passed to the +ClearmlJob. + +If the callback returned value is False, the step is skipped and so is any step in the pipeline that relies on this step. + +Notice the parameters are already parsed (e.g. `${step1.parameters.Args/param}` is replaced with relevant value). + +```python +def step_created_callback( + pipeline, # type: PipelineController, + node, # type: PipelineController.Node, + parameters, # type: dict + ): + pass +``` + +A `post_execute_callback` function is called when a step is completed. It allows you to modify the step’s status after completion. + +```python +def step_completed_callback( + pipeline, # type: PipelineController, + node, # type: PipelineController.Node, +): + pass +``` + +#### Models, Artifacts, and Metrics + +You can enable automatic logging of a step’s metrics /artifacts / models to the pipeline task using the following arguments: + +* `monitor_metrics` (Optional) - Automatically log the step's reported metrics also on the pipeline Task. The expected + format is one of the following: + * List of pairs metric (title, series) to log: [(step_metric_title, step_metric_series), ]. Example: `[('test', 'accuracy'), ]` + * List of tuple pairs, to specify a different target metric to use on the pipeline Task: [((step_metric_title, step_metric_series), (target_metric_title, target_metric_series)), ]. + Example: `[[('test', 'accuracy'), ('model', 'accuracy')], ]` +* `monitor_artifacts` (Optional) - Automatically log the step's artifacts on the pipeline Task. + * Provided a list of artifact names created by the step function, these artifacts will be logged automatically also + on the Pipeline Task itself. Example: `['processed_data', ]` (target artifact name on the Pipeline Task will have + the same name as the original artifact). + * Alternatively, provide a list of pairs (source_artifact_name, target_artifact_name), where the first string is the + artifact name as it appears on the step Task, and the second is the target artifact name to put on the Pipeline + Task. Example: `[('processed_data', 'final_processed_data'), ]` +* `monitor_models` (Optional) - Automatically log the step's output models on the pipeline Task. + * Provided a list of model names created by the step's Task, they will also appear on the Pipeline itself. Example: `['model_weights', ]` + * To select the latest (lexicographic) model, use `model_*`, or the last created model with just `*`. Example: `['model_weights_*', ]` + * Alternatively, provide a list of pairs (source_model_name, target_model_name), where the first string is the model + name as it appears on the step Task, and the second is the target model name to put on the Pipeline Task. + Example: `[('model_weights', 'final_model_weights'), ]` + +You can also directly upload a model or an artifact from the step to the pipeline controller, using the +[`PipelineController.upload_model`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinecontrollerupload_model) +and [`PipelineController.upload_artifact`](../references/sdk/automation_controller_pipelinecontroller.md#pipelinecontrollerupload_artifact) +methods respectively. + +## Controlling Pipeline Execution +### Default Execution Queue + +The [`PipelineController.set_default_execution_queue`](../references/sdk/automation_controller_pipelinecontroller.md#set_default_execution_queue) +method lets you set a default queue through which all pipeline steps will be executed. Once set, step-specific overrides +can be specified through `execution_queue` of the [PipelineController.add_step](../references/sdk/automation_controller_pipelinecontroller.md#add_step) +or [PipelineController.add_function_step](../references/sdk/automation_controller_pipelinecontroller.md#add_function_step) +methods. + +### Running the Pipeline +Run the pipeline by using one of the following methods: + +* [`PipelineController.start`](../references/sdk/automation_controller_pipelinecontroller.md#start) - launches the + pipeline controller through the `services` queue, unless otherwise specified. The pipeline steps are enqueued to their + respective queues or in the default execution queue. +* [`PipelineController.start_locally`](../references/sdk/automation_controller_pipelinecontroller.md#start_locally) - launches + the pipeline controller locally. To run the pipeline steps locally as well, pass `run_pipeline_steps_locally=True`. diff --git a/docs/webapp/pipelines/webapp_pipeline_page.md b/docs/webapp/pipelines/webapp_pipeline_page.md index 59941138..efeae70c 100644 --- a/docs/webapp/pipelines/webapp_pipeline_page.md +++ b/docs/webapp/pipelines/webapp_pipeline_page.md @@ -3,7 +3,7 @@ title: Pipelines Page --- Use the **Pipelines** Page to navigate between and manage pipelines. The page shows execution summaries for all -[ClearML Pipelines](../../fundamentals/pipelines.md). +[ClearML Pipelines](../../pipelines/pipelines.md). Click on a pipeline card to navigate to its [Pipeline Runs Table](webapp_pipeline_table.md), where you can view the pipeline structure, configuration and outputs for all of the pipeline’s runs, as well as create new runs. diff --git a/sidebars.js b/sidebars.js index 374a701d..ddd698a7 100644 --- a/sidebars.js +++ b/sidebars.js @@ -14,9 +14,15 @@ module.exports = { {'MLOps': ['getting_started/mlops/mlops_first_steps','getting_started/mlops/mlops_second_steps','getting_started/mlops/mlops_best_practices']}] }, 'getting_started/architecture']}, {'ClearML Fundamentals': ['fundamentals/projects', 'fundamentals/task', 'fundamentals/hyperparameters', 'fundamentals/artifacts', 'fundamentals/logger', 'fundamentals/agents_and_queues', - 'fundamentals/hpo', 'fundamentals/pipelines']}, + 'fundamentals/hpo']}, 'clearml_sdk', 'clearml_agent', + {'ClearML Pipelines':['pipelines/pipelines', + {"Building Pipelines": + ['pipelines/pipelines_sdk_tasks', 'pipelines/pipelines_sdk_function_decorators'] + } + ] + }, {'ClearML Data': ['clearml_data/clearml_data', 'clearml_data/clearml_data_cli', 'clearml_data/clearml_data_sdk', 'clearml_data/best_practices', {'Workflows': ['clearml_data/data_management_examples/workflows', 'clearml_data/data_management_examples/data_man_simple', 'clearml_data/data_management_examples/data_man_folder_sync', 'clearml_data/data_management_examples/data_man_cifar_classification', 'clearml_data/data_management_examples/data_man_python']},]}, {'ClearML Serving':['clearml_serving/clearml_serving', 'clearml_serving/clearml_serving_cli', 'clearml_serving/clearml_serving_tutorial']},