From 33b5e1d251b84a81197f5ff6b5073c5e36b30d91 Mon Sep 17 00:00:00 2001 From: Karlos K <168231563+kknoxrht@users.noreply.github.com> Date: Sat, 7 Sep 2024 19:53:35 -0500 Subject: [PATCH 1/2] added notes for infrastructure folks --- modules/appendix/pages/appendix.adoc | 224 ++++++++++++++++ .../pages/data-science-pipeline-app.adoc | 26 +- modules/chapter2/pages/index.adoc | 4 + modules/chapter2/pages/rhoai-resources.adoc | 4 +- modules/chapter3/pages/elyra-pipelines.adoc | 131 +++++----- .../images/download_pipeline_yaml.png | Bin 0 -> 183038 bytes modules/chapter4/nav.adoc | 3 +- modules/chapter4/pages/kfp-import.adoc | 241 +----------------- 8 files changed, 331 insertions(+), 302 deletions(-) create mode 100644 modules/chapter4/images/download_pipeline_yaml.png diff --git a/modules/appendix/pages/appendix.adoc b/modules/appendix/pages/appendix.adoc index 4affa98..b70e18c 100644 --- a/modules/appendix/pages/appendix.adoc +++ b/modules/appendix/pages/appendix.adoc @@ -16,3 +16,227 @@ You will use an example fraud detection model to complete the following tasks: . Refine and train the model by using automated pipelines. +== Notes of using kfp SDK + +== Pipeline Parameter Passing +As each step of our pipeline is executed in an independent container, input parameters and output values are handled as follows. + +=== Input Parameters + +* Simple parameters - booleans, numbers, strings - are passed by value into the container as command line arguments. +* Complex types or large amounts of data are passed via files. The value of the input parameter is the file path. + +=== Output Parameters + +* Output values are returned via files. + +=== Passing Parameters via Files +To pass an input parameter as a file, the function argument needs to be annotated using the _InputPath_ annotation. +For returning data from a step as a file, the function argument needs to be annotated using the _OutputPath_ annotation. + +*In both cases the actual value of the parameter is the file path and not the actual data. So the pipeline will have to read/write to the file as necessary.* + +// For example, in our sample pipeline we use the _parameter_data_ argument of the _fraud-detection.yaml_ return multiples performance metrics data values as a file. Here's the function definition with the _OutputPath_ annotation + +[TIP] +==== +There are other parameter annotations available to handle specialised file types +such as _InputBinaryFile_, _OutputBinaryFile_. + +The full annotation list is in the https://kubeflow-pipelines.readthedocs.io/en/1.8.22/source/kfp.components.html[KFP component documentation, window=_blank]. + +==== + +=== Returning multiple values from a task +If you return a single small value from your component using the _return_ statement, the output parameter is named *_output_*. +It is, however, possible to return multiple small values using the Python _collection_ library method _namedtuple_. + +From a https://github.com/kubeflow/pipelines/blob/master/samples/tutorials/Data%20passing%20in%20python%20components.ipynb[Kubeflow pipelines example, window=_blank] + +[source,python] +---- +def produce_two_small_outputs() -> NamedTuple('Outputs', [('text', str), ('number', int)]): + return ("data 1", 42) +consume_task3 = consume_two_arguments(produce2_task.outputs['text'], produce2_task.outputs['number']) +---- + +==== +The KFP SDK uses the following rules to define the input and output parameter names in your component’s interface: + + . If the argument name ends with _path and the argument is annotated as an _kfp.components.InputPath_ or _kfp.components.OutputPath_, the parameter name is the argument name with the trailing _path removed. + . If the argument name ends with _file, the parameter name is the argument name with the trailing _file removed. + . If you return a single small value from your component using the return statement, the output parameter is named *output*. + . If you return several small values from your component by returning a _collections.namedtuple_, the SDK uses the tuple’s field names as the output parameter names. + + . Otherwise, the SDK uses the argument name as the parameter name. +==== + +[TIP] +==== +In the Argo Yaml definition you can see the definition of the _input and output artifacts_. This can be useful for debugging purposes. + + +You can also see the locations of data stored into the S3 bucket e.g. _artifacts/$PIPELINERUN/prep-data-train-model-2/parameter_data.tgz_ +==== + +== Execution on OpenShift + +To enable the _pipeline_ to run on OpenShift we need to pass it the associated _kubernetes_ resources + +* _volumes_ +* _environment variables_ +* _node selectors, taints and tolerations_ + +==== Volumes +Our pipeline requires a number of volumes to be created and mounted into the executing pods. The volumes are primarily used for storage and secrets handling but can also be used for passing configuration files into the pods. + +Before mounting the volumes into the pods they need to be created. The following code creates two volumes, one from a pre-existing PVC and another from a pre-existing secret. + +include::example$sample-pipeline-full.py[lines=453..462] + +The volumes are mounted into the containers using the *_add_pvolumes_* method: + +include::example$sample-pipeline-full.py[lines=495..497] + +==== Environment Variables + +Environment variables can be added to the pod using the *_add_env_variable_* method. + +include::example$sample-pipeline-full.py[lines=471..475] + +[NOTE] +==== +The *_env_from_secret_* utility method also enables extracting values from secrets and mounting them as environment variables. In the example above the _AWS_ACCESS_KEY_ID_ value is extracted from the _s3-secret_ secret and added to the container defintion as the _s3_access_key_ environment variable. +==== + +=== Node Selectors, Taints and Tolerations + +Selecting the correct worker node to execute a pipeline step is an important part of pipeline development. Specific nodes may have dedicated hardware such as GPUs; or there may be other constraints such as data locality. + +In our example we're using the nodes with an attached GPU to execute the step. To do this we need to: + + +. Create the requisite toleration: + +include::example$sample-pipeline-full.py[lines=464..467] + +. Add the _toleration_ to the pod and add a _node selector_ constraint. + +include::example$sample-pipeline-full.py[lines=477..480] + + +[TIP] +==== +You could also use this approach to ensure that pods without GPU needs are *not* scheduled to nodes with GPUs. + +For global pipeline pod settings take a look at the *_PipelineConf_* class in the 'https://kubeflow-pipelines.readthedocs.io/en/1.8.22/source/kfp.dsl.html?highlight=add_env_variable#kfp.dsl.PipelineConf'[KFP SDK Documentation, window=_blank]. +==== + + +[NOTE] +==== +We have only covered a _subset_ of what's possible with the _KFP SDK_. + +It is also possible to customize significant parts of the _pod spec_ definition with: + +* Init and Sidecar Pods +* Pod affinity rules +* Annotations and labels +* Retries and Timeouts +* Resource requests and limits + +See the the https://kubeflow-pipelines.readthedocs.io/en/1.8.22/source/kfp.dsl.html[KFP SDK Documentation, window=_blank] for more details. +==== + + + +=== Pipeline Execution + +=== Submitting a Pipeline and Triggering a run + +The following code demonstrates how to submit and trigger a pipeline run from a _Red Hat OpenShift AI WorkBench_. + +[source, python] +if __name__ == '__main__': + kubeflow_endpoint = 'http://ds-pipeline-pipelines-definition:8888' + sa_token_file_path = '/var/run/secrets/kubernetes.io/serviceaccount/token' + with open(sa_token_file_path, 'r') as token_file: + bearer_token = token_file.read() + print(f'Connecting to Data Science Pipelines: {kubeflow_endpoint}') + client = TektonClient( + host=kubeflow_endpoint, + existing_token=bearer_token + ) + result = client.create_run_from_pipeline_func( + offline_scoring_pipeline, + arguments={}, + experiment_name='offline-scoring-kfp' + ) + +=== Externally Triggering a DSP pipeline run + +In our real-world example above the entire pipeline is executed when a file is added to an S3 bucket. Here is the process followed: + +. File added to S3 bucket. +. S3 triggers the send of a webhook payload to an _OCP Serverless_ function. +. The _Serverless_ function parses the payload and invokes the configured _DSP pipeline_. + +We're not going to go through the code and configuration for this, but here is the code to trigger the pipeline. + +[source,python] +include::example$dsp_trigger.py[lines=34..51] + + +The full code is xref:attachment$dsp_trigger.py[here]. + +[NOTE] +==== +The _pipeline_ needs to have already been submitted to the DSP runtime. +==== + + +== Data Handling in Data Science Pipelines +DSP have two sizes of data, conveniently named *_Small Data_* and *_Big Data_*. + +. _Small Data_ is considered anything that can be passed as a _command line argument_ for example _Strings_, _URLS_, _Numbers_. The overall size should not exceed a few _kilobytes_. + +. Unsurprisingly, everything else is considered _Big Data_ and should be passed as files. + +=== Handling large data sets + +DSP support two methods by which to pass large data sets aka _Big Data_ between pipeline steps: + +. *_Argo Workspaces_*. +. *_Volume based data passing method_*. + +[NOTE] +==== +The Data Science Projects *_Data Connection_* S3 storage is used to store _Output Artifacts_ and _Parameters_ of the stages of a pipeline. It is not intended to be used to pass large amounts of data between pipeline steps. +==== + + + +=== Volume-based data passing method +This approach uses a pre-created OpenShift storage volume (aka _PVC_) to pass data between the pipeline steps. +An example of this is in the https://github.com/kubeflow/kfp-tekton/blob/master/sdk/python/tests/compiler/testdata/artifact_passing_using_volume.py[KFP compiler tests, window=_blank] which we will discuss here. + +First create the volume to be used and assign it to a variable: +[source,python] +include::example$artifact_passing_using_volume.py[lines=78..79] + +[source,python] +include::example$artifact_passing_using_volume.py[lines=81..88] + +Then add definition to the _pipeline configuration_: +[source,python] +include::example$artifact_passing_using_volume.py[lines=91..93] + + +[IMPORTANT] +==== +The *_data-volume PVC claim_* needs to exist in the OpenShift namespace while running the pipeline, else the _pipeline execution pod_ fails to deploy and the run terminates. +==== + +To pass big data using cloud provider volumes, it's recommended to use the *_volume-based data passing method_*. + + diff --git a/modules/chapter2/pages/data-science-pipeline-app.adoc b/modules/chapter2/pages/data-science-pipeline-app.adoc index cfbb5b4..d690611 100644 --- a/modules/chapter2/pages/data-science-pipeline-app.adoc +++ b/modules/chapter2/pages/data-science-pipeline-app.adoc @@ -35,9 +35,9 @@ Only one dpsa deployment can exist per data science project. (nampespace) To begin we will use the *Minio* instance created with the lab environment to act as the S3 artifact storage for the *DataSciencePipelineApplication*. -=== Create a Data Science Pipeline Application +=== Create Data Connections in Data Science Project -Next we will create a data connection for the Minio instance, and use that data connection to create a *DataSciencePipelineApplication*. +Next we will create a data connection for the Minio instance, and use that data connection to deploy a *DataSciencePipelineApplication*. image::data_connection_setup.gif[width=600] @@ -51,6 +51,7 @@ Name: pipelines Access key: minio Secret key: minio321! Endpoint: http://minio-service.pipelines-example.svc:9000 +Region: us-east-1 (when using minio this value can be any text but not blank) Bucket: pipelines ``` + @@ -59,15 +60,10 @@ Name: my-storage Access key: minio Secret key: minio321! Endpoint: http://minio-service.pipelines-example.svc:9000 +Region: no-region-minio (when using minio this value can be any text but not blank) Bucket: storage ``` - -[NOTE] -==== -At this point in time, if the minio instance did not contain a bucket called `pipelines`. Once the *DataSciencePipelineApplication* object is created, it will automatically create the bucket for us if it doesn't exist. -==== - [TIP] ==== A `Data Connection` is simply a standard kubernetes secret object that contains the fields required to connect to an S3 compatible solution. This secret can be managed via GitOps just like any other standard kubernetes secret object. However, not all fields in the Data Connection are dynamically consumed by the *DataSciencePipelineApplication* object, so be careful when updating the endpoint url or the bucket values. @@ -76,10 +72,14 @@ A `Data Connection` is simply a standard kubernetes secret object that contains image::pipeline_server_setup.gif[width=600] +=== Create a Data Science Pipeline Application + . A new Data connection should now be listed in the `Data connections` section. //+ //image::create-dspa-verify-data-connection.png[] +. Switch to the pipelines tab in the data science project. + . Click on the `Configure pipeline server` in the `Pipelines` section of the Data Science Project view. //+ //image::create-dspa-create-pipeline-server.png[] @@ -88,12 +88,22 @@ image::pipeline_server_setup.gif[width=600] //+ //image::create-dspa-configure-pipeline-server.png[] +. Select the option to use the default database stored in the cluster + +.. There is an option to specifiy the details of an external database required for the datasciencepipelineapplication. + . Click `Configure pipeline server`. After several seconds, the loading icon should complete and the `Pipelines` section will now show an option to `Import pipeline`. //+ //image::create-dspa-verify-pipeline-server.png[] The *DataSciencePipelineApplication* has now successfully been configured and is ready for use. +[TIP] +You are not required to specify any storage directories when configuring a data connection for your pipeline server. When you import a pipeline, the /pipelines folder is created in the root folder of the bucket, containing a YAML file for the pipeline. If you upload a new version of the same pipeline, a new YAML file with a different ID is added to the /pipelines folder. When you run a pipeline, the artifacts are stored in the /pipeline-name folder in the root folder of the bucket. + +[WARNING] +If you specify incorrect data connection settings, you cannot update these settings on the same pipeline server. Therefore, you must delete the pipeline server and configure another one. + == Managing Permissions to the DataSciencePipelineApplication The *DataSciencePipelineApplication* API endpoint route is protected using an OpenShift OAuth Proxy sidecar. diff --git a/modules/chapter2/pages/index.adoc b/modules/chapter2/pages/index.adoc index d4dc39f..1556734 100644 --- a/modules/chapter2/pages/index.adoc +++ b/modules/chapter2/pages/index.adoc @@ -2,6 +2,10 @@ == Managing Data Science Pipelines 2.0 +[NOTE] +From OpenShift AI version 2.9, data science pipelines are based on KubeFlow Pipelines (KFP) version 2.0. Data science pipelines 2.0 is enabled and deployed by default in OpenShift AI. +https://docs.redhat.com/en/documentation/red_hat_openshift_ai_self-managed/2.12/html/working_with_data_science_pipelines/enabling-data-science-pipelines-2_ds-pipelines#upgrading_to_data_science_pipelines_2_0[Reference the OpenShift AI 2.12 data science pipeline installation documentation, window=blank] + === Configuring a pipeline server Before you can successfully create a pipeline in OpenShift AI, you must configure a pipeline server. This task includes configuring where your pipeline artifacts and data are stored. diff --git a/modules/chapter2/pages/rhoai-resources.adoc b/modules/chapter2/pages/rhoai-resources.adoc index 511b898..db65ea8 100644 --- a/modules/chapter2/pages/rhoai-resources.adoc +++ b/modules/chapter2/pages/rhoai-resources.adoc @@ -68,8 +68,8 @@ https://github.com/rh-aiservices-bu/fraud-detection.git . Copy the URL link above . Click on the Clone a Repo Icon above explorer section window. -+ -image::clone_a_repo.png[width=640] +//+ +//image::clone_a_repo.png[width=640] . Paste the link into the *clone a repo* pop up, make sure the *included submodules are checked*, then click the clone. diff --git a/modules/chapter3/pages/elyra-pipelines.adoc b/modules/chapter3/pages/elyra-pipelines.adoc index 5913e62..91bfdc4 100644 --- a/modules/chapter3/pages/elyra-pipelines.adoc +++ b/modules/chapter3/pages/elyra-pipelines.adoc @@ -32,7 +32,7 @@ If the pipeline server is deployed post workbench creation, the runtime configur Refer to the https://elyra.readthedocs.io/en/latest/user_guide/runtime-conf.html#kubeflow-pipelines-configuration-settings[Elyra documentation, window=_blank] for more information about Elyra and the available runtime configuration options. -== Data Science Pipeline with Elyra +== Creating a Data Science Pipeline with Elyra In order to create Elyra pipelines with the visual pipeline editor: @@ -45,25 +45,21 @@ In order to create Elyra pipelines with the visual pipeline editor: * You can also inject environment variables, secrets, and define output files. * Once the pipeline is complete, you can submit it to the Data Science Pipelines engine. - -== Lab Exercise: Fraud Detection Pipeline - - === Working with Elyra -Let's now use Elyra to package the code into a pipeline and submit it to the Data Science Pipelines backend in order to: +Let's now use Elyra to package the nodes into a pipeline and submit it to the Data Science Pipelines backend in order to: * Rely on the pipeline scheduler to manage the pipeline execution without having to depend on my workbench session. * Keep track of the pipeline execution along with the previous executions. * Be able to control resource usage of individual pipeline tasks in a fine-grained manner. -==== Review opening JupyterLab +=== Review opening JupyterLab Once the `fraud-detection` workbench has successfully started, we will being the process of exploring and building our pipeline. . Ensure that the `fraud-detection` workbench is in `Running` state. Click the `Open` link on the far right of the work bench menu. Log in to the workbench as the `admin` user. If you are running the workbench for the first time, click `Allow selected permissions` in the `Authorize Access` page to open the Jupyter Notebook interface. -=== In Jupyter Clone Repository for Fraud-Detection +==== In Jupyter Clone Repository for Fraud-Detection . If you haven't already, clone the git repository below in the Jupyter notebook: + ``` @@ -79,7 +75,7 @@ image::elyra_pipeline_nodes.gif[width=600] . Click on the `Pipeline Editor` tile in the launcher menu. This opens up Elyra's visual pipeline editor. You will use the visual pipeline editor to drag-and-drop files from the file browser onto the canvas area. These files then define the individual tasks of your pipeline. -. Rename the pipeline file to `fraud-detection-elyra.pipeline` and hit `Save Pipeline` in the top toolbar. +. Rename the pipeline file to `fraud-detection-elyra.pipeline: Right click the untiled pipeline name, choose rename, and then select `Save Pipeline` in the top toolbar. . Drag the `experiment_train.ipynb` notebook onto the empty canvas. This will allow the pipeline to ingest the data we want to classify, pre-process the data, train a model, and run a sample test to validate the model is working as intended. + @@ -97,37 +93,67 @@ You should now see the two nodes connected through a solid line. We have now def + [NOTE] ==== -By visually defining pipeline tasks and connections, we can define _graphs_ spanning many nodes and interconnections. Elyra and Data Science Pipelines support the creation and execution of arbitrary _directed acyclic graphs_ (DAGs), i.e. graphs with a sequential order of nodes and without loops. +By visually defining pipeline tasks and connections, we can define _graphs_ spanning many task nodes and interconnections. Elyra and Data Science Pipelines support the creation and execution of arbitrary _directed acyclic graphs_ (DAGs), i.e. graphs with a sequential order of nodes and without loops. ==== We have now created the final graph representation of the fraud detection pipeline using the two of five available notebooks. With this we have fully defined the pipeline code and its order of execution. -==== Configuring the pipeline +== Configuring the pipeline -Before we can submit our pipeline, we have to configure the pipeline to specify: +Before we can submit our pipeline, we have to configure the pipeline to: -* Set the dependencies for each step, i.e. the corresponding runtime images -* Configure how data is passed between the steps +* Set the dependencies for each task, i.e. the corresponding runtime images +* Configure how data is passed between the tasks * Configure the S3 credentials as environment variables during runtime -* Optionally, configure the available compute resources per step +* Optionally, configure the available compute resources per task === Set the Runtime -. Next we will configure this runtime image to be used by our pipeline. Open the pipeline settings in the Elyra pipeline editor via `Open Panel` in the top right corner of the editor. -.. Select the `PIPELINE PROPERTIES` tab of the settings menu. Configurations in this section apply defaults to all nodes in the pipeline. +NOTE: Do not select any of the nodes in the canvas when you open the panel. You will see the `PIPELINE PROPERTIES` tab only when none of the nodes are selected. Click anywhere on the canvas and then open the panel. + +. Next we will configure this runtime image to be used by our pipeline. Open the pipeline settings in the Elyra pipeline editor via `Open Panel` in the top right corner of the editor. -.. Scroll down to `Generic Node Defaults` and click on the drop down menu of `Runtime Image`. Select the `TensorFlow with Cuda and Python 3.9 (UBI)` runtime image. +. Scroll down to `Generic Node Defaults` and click on the drop down menu of `Runtime Image`. Select the `TensorFlow with Cuda and Python 3.9 (UBI)` runtime image. + image::experiment_node_config.gif[width=600] + +=== Set File Dependencies and Outputs + +. Next we will configure the data to be passed between the nodes. Click on the `experiment_train` node. If you're still in the configuration menu, you should now see the `NODE PROPERTIES` tab. If not, right-click on the node and select `Open Properties`. + -NOTE: Do not select any of the nodes in the canvas when you open the panel. You will see the `PIPELINE PROPERTIES` tab only when none of the nodes are selected. Click anywhere on the canvas and then open the panel. +//image::pipeline-config-4.png[] + +. Under `Runtime Image` and `Kubernetes Secrets`, you can see that the global pipeline settings are used by default. ++ +image::experiment_node_config_2.gif[width=600] + + . In the `File Dependencies` section, you can declare one or more _input files_. These input files are consumed by this pipeline task as the data needed to train to the model. -. Next we will configure the data connection to the `my-storage` bucket as a Kubernetes secret. -.. By default these secrets are created in the environment variable section in pipeline properties -.. They need to be located in the Kubernetes secrets section of pipeline properties. + . Under file dependencies *click add*, next select browse and choose the data/card_transdata.csv file which provides a sampling of credit card to be used. -. In the `PIPELINE PROPERTIES` section, click `Add` beneath the `Kubernetes Secrets` section and add the following five entries: + . In the `Outputs` section, you can declare one or more _output files_. These output files are created by this pipeline task and are made available to all subsequent tasks. + + . Click `Add` in the `Outputs` section and input `models/fraud/1/model.onnx`. This ensures that the downloaded model artifact is available to downstream tasks, including the `save_models` task. ++ +//image::pipeline-config-5.png[] ++ +[NOTE] +==== +By default, all files within a containerized task are removed after its execution, so declaring files explicitly as output files is one way to ensure that they can be reused in downstream tasks. + +Output files are automatically managed by Data Science Pipelines, and stored in the S3 bucket we configured when setting up the *DataSciencePipelineApplication*. +==== + +=== Set Kubernetes Secrets for Storage Access + + . Click on the `save_model` node. Then select open panel to view the "Node Properties" configuration panel. If not, right-click on the node and select `Open Properties`. + + . Next we will configure the data connection to the `my-storage` bucket as a Kubernetes secret. + .. By default these secrets are created in the environment variable section in pipeline properties + .. They need to be located in the Kubernetes secrets section of pipeline properties. + +. In the `NODE PROPERTIES` section, click `Add` beneath the `Kubernetes Secrets` section and add the following five entries: + -- * `AWS_ACCESS_KEY_ID` @@ -152,31 +178,15 @@ image::save_model_storage.gif[width=600] The AWS default region is another parameter in the data connection, which is used for AWS S3-based connections. My experience is that if this field is missing the pipeline will fail to connect regardless of the storage system used. ==== -. Next we will configure the data to be passed between the nodes. Click on the `experiment_train` node. If you're still in the configuration menu, you should now see the `NODE PROPERTIES` tab. If not, right-click on the node and select `Open Properties`. -+ -//image::pipeline-config-4.png[] - -. Under `Runtime Image` and `Kubernetes Secrets`, you can see that the global pipeline settings are used by default. +There should now be 5 entries under kubernetes secrets, each of the entries under environment variables should be removed. -image::experiment_node_config_2.gif[width=600] +=== Set Outputs file for Save_Model task -. In the `File Dependencies` section, you can declare one or more _input files_. These input files are consumed by this pipeline task as the data needed to train to the model. +. Next we will configure the data to be passed between the nodes. If you're still in the configuration menu, scroll to the Outputs section of `NODE PROPERTIES` tab. If not, right-click on the node and select `Open Properties` before performing this step. -.. Under file dependencies *click add*, next select browse and choose the data/card_transdata.csv file which provides a sampling of credit card to be used. - -. In the `Outputs` section, you can declare one or more _output files_. These output files are created by this pipeline task and are made available to all subsequent tasks. - -.. Click `Add` in the `Outputs` section and input `models/fraud/1/model.onnx`. This ensures that the downloaded model artifact is available to downstream tasks, including the `save_models` task. -+ -//image::pipeline-config-5.png[] -+ -[NOTE] -==== -By default, all files within a containerized task are removed after its execution, so declaring files explicitly as output files is one way to ensure that they can be reused in downstream tasks. - -Output files are automatically managed by Data Science Pipelines, and stored in the S3 bucket we configured when setting up the *DataSciencePipelineApplication*. -==== + . Click `Add` in the `Outputs` section and input `models/fraud/1/model.onnx`. This ensures that the model artifact will be saved to the S3 storage location. +. Save the pipeline [NOTE] ==== @@ -193,7 +203,7 @@ We could have declared the data volume as a global pipeline property for simplic ==== -==== Running the pipeline +=== Running the pipeline We have now fully created and configured the pipeline, so let's now see it in action! @@ -201,9 +211,14 @@ We have now fully created and configured the pipeline, so let's now see it in ac image::elyra_pipeline_submit.gif[width=600] +*Before moving on, submit the same pipeline again with the same configuration a second time. This will generate a new version of the pipeline and kick off an additional run.* + +[NOTE] +You can manage incremental changes to pipelines in OpenShift AI by using versioning. This allows you to develop and deploy pipelines iteratively, preserving a record of your changes. You can track and manage your changes on the OpenShift AI dashboard, allowing you to schedule and execute runs against all available versions of your pipeline. + [TIP] ==== -*Data Science Pipelines* should be selected as the default execution environment automatically when starting the pipeline run. OpenShift AI will automatically configure and select the *DataSciencePipelinesApplication* instance we created previously as the default execution environment. This will happen provided the *DataSciencePipelinesApplication* was created before the workbench was started and it is located in the same namespace as the workbench. +*Data Science Pipeline* should be selected as the default execution environment automatically when starting the pipeline run. OpenShift AI will automatically configure and select the *DataSciencePipelinesApplication* instance we created previously as the default execution environment. This will happen provided the *DataSciencePipelinesApplication* was created before the workbench was started and it is located in the same namespace as the workbench. If you wish to use *DataSciencePipelinesApplication* that is located in a different namespace from your workbench you can manually configure an execution environment. ==== @@ -223,25 +238,18 @@ Save your changes. 5. Confirm that the default *Data Science Pipelines* runtime is selected. ==== -. Elyra is now converting your pipeline definition into a YAML representation and sending it to the Data Science Pipelines backend. After a few seconds, you should see confirmation that the pipeline has been successfully submitted. -+ -//image::pipeline-submit.png[] +=== Pipeline execution -. To monitor the pipeline's execution, click on the `_Run_ Details` link, which takes you to the pipeline run view within the RHOAI dashboard. Here you can track in real-time how each pipeline task is processed and whether it fails or resolves successfully. -+ -//image::pipeline-run.png[] +Elyra is now converting your pipeline definition into a YAML representation and sending it to the Data Science Pipelines backend. After a few seconds, you should see confirmation that the pipeline has been successfully submitted. -. To confirm that the pipeline has indeed produced fraud detection scoring results, view the content of the `fraud-detection` bucket. You should now see a new CSV file containing the predicted result of each transaction within the used dataset. -+ -//image::fraud-detection-bucket-2.png[] +To monitor the pipeline's execution, click on the `_Run Details_` link, which takes you to the pipeline run view within the RHOAI dashboard. Here you can track in real-time how each pipeline task is processed and whether it fails or resolves successfully. -. Navigate back to the `Runs` overview in the RHOAI dashboard. Click the `Triggered` tab to see the history of all ongoing and previous pipeline executions and compare their run durations and status. -+ -//image::pipeline-runs.png[] +To confirm that the pipeline has indeed produced fraud detection scoring results, view the content of the pipeline storage bucket. In the folder for the fraud-detection-elyra folder, there will be two html files that show the status of each of the task executions. + +Navigate back to the `Experiment and Runs` overview in the RHOAI dashboard. Click the fraud-detection-elyra experiment to see the history of all ongoing and previous pipeline executions of the same name and compare their run durations and status. + +In the `Scheduled` tab you're able to view runs of the fraud-detection-elyra pipeline according to a predefined schedule such as daily or according to a Cron statement. -. In the `Scheduled` tab you're able to schedule runs of the offline scoring pipeline according to a predefined schedule such as daily or according to a Cron statement. -+ -//image::pipeline-scheduled.png[] [WARNING] ==== @@ -250,6 +258,7 @@ If you change or resumit an Elyra pipeline that you have already submitted befor ==== + ==== Tracking the pipeline artifacts Let's finally peek behind the scenes and inspect the S3 bucket that Elyra and Data Science Pipelines use to store the pipeline artifacts. diff --git a/modules/chapter4/images/download_pipeline_yaml.png b/modules/chapter4/images/download_pipeline_yaml.png new file mode 100644 index 0000000000000000000000000000000000000000..f933893cc7dea035c518167225e99da4c186c04a GIT binary patch literal 183038 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
    XB;yBVCmI+zp*PlsISn&oe#+;Ud&wI0r1+Rwj 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℘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�hzMFi-{ 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 YeaHt2i1dWUp$2`n*58Sw(L52OwS2nv8`FF^(A+ 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�D?D5AwJ5-lgnL+Ij%vek5I;RnfA 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 NamedTuple('Outputs', [('text', str), ('number', int)]): - return ("data 1", 42) -consume_task3 = consume_two_arguments(produce2_task.outputs['text'], produce2_task.outputs['number']) ----- - -==== -The KFP SDK uses the following rules to define the input and output parameter names in your component’s interface: - - . If the argument name ends with _path and the argument is annotated as an _kfp.components.InputPath_ or _kfp.components.OutputPath_, the parameter name is the argument name with the trailing _path removed. - . If the argument name ends with _file, the parameter name is the argument name with the trailing _file removed. - . If you return a single small value from your component using the return statement, the output parameter is named *output*. - . If you return several small values from your component by returning a _collections.namedtuple_, the SDK uses the tuple’s field names as the output parameter names. - - . Otherwise, the SDK uses the argument name as the parameter name. -==== - -[TIP] -==== -In the Argo Yaml definition you can see the definition of the _input and output artifacts_. This can be useful for debugging purposes. - - -You can also see the locations of data stored into the S3 bucket e.g. _artifacts/$PIPELINERUN/prep-data-train-model-2/parameter_data.tgz_ -==== - -=== Execution on OpenShift - -To enable the _pipeline_ to run on OpenShift we need to pass it the associated _kubernetes_ resources - -* _volumes_ -* _environment variables_ -* _node selectors, taints and tolerations_ - -==== Volumes -Our pipeline requires a number of volumes to be created and mounted into the executing pods. The volumes are primarily used for storage and secrets handling but can also be used for passing configuration files into the pods. - -Before mounting the volumes into the pods they need to be created. The following code creates two volumes, one from a pre-existing PVC and another from a pre-existing secret. - -include::example$sample-pipeline-full.py[lines=453..462] - -The volumes are mounted into the containers using the *_add_pvolumes_* method: - -include::example$sample-pipeline-full.py[lines=495..497] - -==== Environment Variables - -Environment variables can be added to the pod using the *_add_env_variable_* method. - -include::example$sample-pipeline-full.py[lines=471..475] - -[NOTE] -==== -The *_env_from_secret_* utility method also enables extracting values from secrets and mounting them as environment variables. In the example above the _AWS_ACCESS_KEY_ID_ value is extracted from the _s3-secret_ secret and added to the container defintion as the _s3_access_key_ environment variable. -==== - -==== Node Selectors, Taints and Tolerations - -Selecting the correct worker node to execute a pipeline step is an important part of pipeline development. Specific nodes may have dedicated hardware such as GPUs; or there may be other constraints such as data locality. - -In our example we're using the nodes with an attached GPU to execute the step. To do this we need to: - - -. Create the requisite toleration: - -include::example$sample-pipeline-full.py[lines=464..467] - -. Add the _toleration_ to the pod and add a _node selector_ constraint. - -include::example$sample-pipeline-full.py[lines=477..480] - - -[TIP] -==== -You could also use this approach to ensure that pods without GPU needs are *not* scheduled to nodes with GPUs. - -For global pipeline pod settings take a look at the *_PipelineConf_* class in the 'https://kubeflow-pipelines.readthedocs.io/en/1.8.22/source/kfp.dsl.html?highlight=add_env_variable#kfp.dsl.PipelineConf'[KFP SDK Documentation, window=_blank]. -==== - - -[NOTE] -==== -We have only covered a _subset_ of what's possible with the _KFP SDK_. - -It is also possible to customize significant parts of the _pod spec_ definition with: - -* Init and Sidecar Pods -* Pod affinity rules -* Annotations and labels -* Retries and Timeouts -* Resource requests and limits - -See the the https://kubeflow-pipelines.readthedocs.io/en/1.8.22/source/kfp.dsl.html[KFP SDK Documentation, window=_blank] for more details. -==== - - - -=== Pipeline Execution - -==== Submitting a Pipeline and Triggering a run - -The following code demonstrates how to submit and trigger a pipeline run from a _Red Hat OpenShift AI WorkBench_. - -[source, python] -if __name__ == '__main__': - kubeflow_endpoint = 'http://ds-pipeline-pipelines-definition:8888' - sa_token_file_path = '/var/run/secrets/kubernetes.io/serviceaccount/token' - with open(sa_token_file_path, 'r') as token_file: - bearer_token = token_file.read() - print(f'Connecting to Data Science Pipelines: {kubeflow_endpoint}') - client = TektonClient( - host=kubeflow_endpoint, - existing_token=bearer_token - ) - result = client.create_run_from_pipeline_func( - offline_scoring_pipeline, - arguments={}, - experiment_name='offline-scoring-kfp' - ) - -==== Externally Triggering a DSP pipeline run - -In our real-world example above the entire pipeline is executed when a file is added to an S3 bucket. Here is the process followed: - -. File added to S3 bucket. -. S3 triggers the send of a webhook payload to an _OCP Serverless_ function. -. The _Serverless_ function parses the payload and invokes the configured _DSP pipeline_. - -We're not going to go through the code and configuration for this, but here is the code to trigger the pipeline. - -[source,python] -include::example$dsp_trigger.py[lines=34..51] - - -The full code is xref:attachment$dsp_trigger.py[here]. - -[NOTE] -==== -The _pipeline_ needs to have already been submitted to the DSP runtime. -==== - - -== Data Handling in Data Science Pipelines -DSP have two sizes of data, conveniently named *_Small Data_* and *_Big Data_*. - -. _Small Data_ is considered anything that can be passed as a _command line argument_ for example _Strings_, _URLS_, _Numbers_. The overall size should not exceed a few _kilobytes_. - -. Unsurprisingly, everything else is considered _Big Data_ and should be passed as files. - -=== Handling large data sets - -DSP support two methods by which to pass large data sets aka _Big Data_ between pipeline steps: - -. *_Argo Workspaces_*. -. *_Volume based data passing method_*. - -[NOTE] -==== -The Data Science Projects *_Data Connection_* S3 storage is used to store _Output Artifacts_ and _Parameters_ of the stages of a pipeline. It is not intended to be used to pass large amounts of data between pipeline steps. -==== - - - -=== Volume-based data passing method -This approach uses a pre-created OpenShift storage volume (aka _PVC_) to pass data between the pipeline steps. -An example of this is in the https://github.com/kubeflow/kfp-tekton/blob/master/sdk/python/tests/compiler/testdata/artifact_passing_using_volume.py[KFP compiler tests, window=_blank] which we will discuss here. - -First create the volume to be used and assign it to a variable: -[source,python] -include::example$artifact_passing_using_volume.py[lines=78..79] - -[source,python] -include::example$artifact_passing_using_volume.py[lines=81..88] - -Then add definition to the _pipeline configuration_: -[source,python] -include::example$artifact_passing_using_volume.py[lines=91..93] - - -[IMPORTANT] -==== -The *_data-volume PVC claim_* needs to exist in the OpenShift namespace while running the pipeline, else the _pipeline execution pod_ fails to deploy and the run terminates. -==== - -To pass big data using cloud provider volumes, it's recommended to use the *_volume-based data passing method_*. - From d88c328962e8eb2281e6f2dafbe13e705c9b1526 Mon Sep 17 00:00:00 2001 From: Karlos K <168231563+kknoxrht@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:40:50 -0500 Subject: [PATCH 2/2] spelling and grammer edits --- modules/LABENV/pages/index.adoc | 72 ------------------- modules/LABENV/pages/minio-install.adoc | 4 +- modules/chapter1/pages/dsp-concepts.adoc | 4 +- modules/chapter1/pages/dsp-intro.adoc | 4 +- .../pages/data-science-pipeline-app.adoc | 13 +--- modules/chapter2/pages/rhoai-resources.adoc | 4 +- modules/chapter3/pages/elyra-pipelines.adoc | 24 +++---- modules/chapter4/pages/kfp-import.adoc | 10 +-- 8 files changed, 26 insertions(+), 109 deletions(-) diff --git a/modules/LABENV/pages/index.adoc b/modules/LABENV/pages/index.adoc index 68d9919..26ae7cb 100644 --- a/modules/LABENV/pages/index.adoc +++ b/modules/LABENV/pages/index.adoc @@ -191,77 +191,5 @@ Navigate to & select the Data Science Projects section. . Select Create. - - - - Once complete, you should be on the landing page of the "fraud-detection" Data Science Project section of the OpenShift AI Console / Dashboard. - - -//image::create_workbench.png[width=640] - -// . Select the WorkBench button, then click create workbench - -// .. Name: `fraud-detection` - -// .. Notebook Image: `standard data science` - -// .. Leave the remaining options default. - -// .. Optionally, scroll to the bottom, check the `Use data connection box`. - -// .. Select *storage* from the dropdown to attach the storage bucket to the workbench. - -// . Select the Create Workbench option. - -//[NOTE] -// Depending on the notebook image selected, it can take between 2-20 minutes for the container image to be fully deployed. The Open Link will be available when our container is fully deployed. - - - -//== Jupyter Notebooks - -// video::llm_jupyter_v3.mp4[width=640] - -//== Open JupyterLab - -//JupyterLab enables you to work with documents and activities such as Jupyter notebooks, text editors, terminals, and custom components in a flexible, integrated, and extensible manner. For a demonstration of JupyterLab and its features, https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html#what-will-happen-to-the-classic-notebook[you can view this video.] - - -//Return to the fraud detection workbench dashboard in the OpenShift AI console. - -// . Select the *Open* link to the right of the status section. - -//image::oai_open_jupyter.png[width=640] - -// . When the new window opens, use the OpenShift admin user & password to login to JupyterLab. - -// . Click the *Allow selected permissions* button to complete login to the notebook. - - -//[NOTE] -//If the *OPEN* link for the notebook is grayed out, the notebook container is still starting. This process can take a few minutes & up to 20+ minutes depending on the notebook image we opted to choose. - - -//== Inside JupyterLab - -//This takes us to the JupyterLab screen where we can select multiple options / tools / to work to begin our data science experimentation. - -//Our first action is to clone a git repository that contains a collection of LLM projects including the notebook we are going to use to interact with the LLM. - -//Clone the github repository to interact with the Ollama Framework from this location: -//https://github.com/rh-aiservices-bu/llm-on-openshift.git - -// . Copy the URL link above - -// . Click on the Clone a Repo Icon above explorer section window. - -//image::clone_a_repo.png[width=640] - -// . Paste the link into the *clone a repo* pop up, make sure the *included submodules are checked*, then click the clone. - - -//image::navigate_ollama_notebook.png[width=640] - -// . Explore the notebook, and then continue. diff --git a/modules/LABENV/pages/minio-install.adoc b/modules/LABENV/pages/minio-install.adoc index 913b871..b1da4d3 100644 --- a/modules/LABENV/pages/minio-install.adoc +++ b/modules/LABENV/pages/minio-install.adoc @@ -202,7 +202,7 @@ From the OCP Dashboard: . Select Networking / Routes from the navigation menu. - . This will display two routes, one for the UI & another for the API. (if the routes are not visible, make sure you have the project selected that matches your data sicence project created earlier) + . This will display two routes, one for the UI & another for the API. (if the routes are not visible, make sure you have the project selected that matches your data science project created earlier) . For the first step, select the UI route and paste it or open in a new browser tab or window. @@ -228,4 +228,4 @@ Once logged into the MinIO Console: .. *models* (optional) -This completes the pre-work to configure the data scicence pipeline lab environment. With our S3 Compatible storage ready to go, let's head to next section of the course and learn more about DSP concepts. \ No newline at end of file +This completes the pre-work to configure the data science pipeline lab environment. With our S3 Compatible storage ready to go, let's head to the next section of the course and learn more about DSP concepts. \ No newline at end of file diff --git a/modules/chapter1/pages/dsp-concepts.adoc b/modules/chapter1/pages/dsp-concepts.adoc index ddc2f78..149fb02 100644 --- a/modules/chapter1/pages/dsp-concepts.adoc +++ b/modules/chapter1/pages/dsp-concepts.adoc @@ -28,9 +28,9 @@ image::pipeline_dag_overview.gif[width=600] A data science pipeline is typically implemented to improve the repeatability of a data science experiment. While the larger experimentation process may include steps such as data exploration, where data scientists seek to create a fundamental understanding of the characteristics of the data, data science pipelines tend to focus on turning a viable experiment into a repeatable solution that can be iterated on. -A data science pipeline, may also fit within the context of a larger pipeline that manages the complete lifecycle of an application, and the data science pipeline is responsible for the process of training the machine learning model. +A data science pipeline may also fit within the context of a larger pipeline that manages the complete lifecycle of an application, and the data science pipeline is responsible for the process of training the machine learning model. -Data science pipelines may consists of several key activities that are performed in a structured sequence to train a machine learning model. These activities may include: +Data science pipelines may consist of several key activities that are performed in a structured sequence to train a machine learning model. These activities may include: * *Data Collection*: Gathering the data from various sources, such as databases, APIs, spreadsheets, or external datasets. diff --git a/modules/chapter1/pages/dsp-intro.adoc b/modules/chapter1/pages/dsp-intro.adoc index e57f991..c560c3c 100644 --- a/modules/chapter1/pages/dsp-intro.adoc +++ b/modules/chapter1/pages/dsp-intro.adoc @@ -18,9 +18,9 @@ Enabling data scientists and data engineers manage the complexity of the end-to- . *Version control and documentation:* You can use version control systems to track changes in your pipeline's code and configuration, ensuring that you can roll back to previous versions if needed. A well-structured pipeline encourages better documentation of each step. -=== Machine learning lifecycles & DevOps +=== Machine learning life cycles & DevOps -Machine learning lifecycles can vary in complexity and may involve additional steps depending on the use case, such as hyperparameter optimization, cross-validation, and feature selection. The goal of a machine learning pipeline is to automate and standardize these processes, making it easier to develop and maintain ML models for various applications. +Machine learning life cycles can vary in complexity and may involve additional steps depending on the use case, such as hyperparameter optimization, cross-validation, and feature selection. The goal of a machine learning pipeline is to automate and standardize these processes, making it easier to develop and maintain ML models for various applications. Machine learning pipelines started to be integrated with DevOps practices to enable continuous integration and deployment (CI/CD) of machine learning models. This integration emphasized the need for reproducibility, version control and monitoring in ML pipelines. This integration is referred to as machine learning operations, or *MLOps*, which helps data science teams effectively manage the complexity of managing ML orchestration. In a real-time deployment, the pipeline replies to a request within milliseconds of the request. diff --git a/modules/chapter2/pages/data-science-pipeline-app.adoc b/modules/chapter2/pages/data-science-pipeline-app.adoc index d690611..f25fe59 100644 --- a/modules/chapter2/pages/data-science-pipeline-app.adoc +++ b/modules/chapter2/pages/data-science-pipeline-app.adoc @@ -28,7 +28,7 @@ This multi-tenancy capability does require that each user or group needs their o While a *DataSciencePipelineApplication* is a namespace scoped object, workbenches and pods running in other namespaces can still interact with the pipeline instance if they have the correct permissions. -Only one dpsa deployment can exist per data science project. (nampespace) +Only one dpsa deployment can exist per data science project. (namespace) == Lab Exercise: Create a Data Science Pipeline Instance @@ -75,26 +75,19 @@ image::pipeline_server_setup.gif[width=600] === Create a Data Science Pipeline Application . A new Data connection should now be listed in the `Data connections` section. -//+ -//image::create-dspa-verify-data-connection.png[] . Switch to the pipelines tab in the data science project. . Click on the `Configure pipeline server` in the `Pipelines` section of the Data Science Project view. -//+ -//image::create-dspa-create-pipeline-server.png[] . Click the key icon in the right side of the `Access Key` field, and select the `pipelines` data connection. The fields in the form are automatically populated. -//+ -//image::create-dspa-configure-pipeline-server.png[] . Select the option to use the default database stored in the cluster -.. There is an option to specifiy the details of an external database required for the datasciencepipelineapplication. +.. There is an option to specify the details of an external database required for the datasciencepipelineapplication. . Click `Configure pipeline server`. After several seconds, the loading icon should complete and the `Pipelines` section will now show an option to `Import pipeline`. -//+ -//image::create-dspa-verify-pipeline-server.png[] + The *DataSciencePipelineApplication* has now successfully been configured and is ready for use. diff --git a/modules/chapter2/pages/rhoai-resources.adoc b/modules/chapter2/pages/rhoai-resources.adoc index db65ea8..e90af11 100644 --- a/modules/chapter2/pages/rhoai-resources.adoc +++ b/modules/chapter2/pages/rhoai-resources.adoc @@ -55,7 +55,7 @@ If the *OPEN* link for the notebook is grayed out, the notebook container is sti This takes us to the JupyterLab screen where we can select multiple options / tools / to work to begin our data science experimentation. -Our first action is to clone a git repository that contains notebooks including an sample notebook to familize yourself with the Jupiter notebook environment. +Our first action is to clone a git repository that contains notebooks including a sample notebook to familiarize yourself with the Jupyter notebook environment. image::clone_repo_jupyter.gif[width=600] @@ -67,7 +67,7 @@ https://github.com/rh-aiservices-bu/fraud-detection.git . Copy the URL link above - . Click on the Clone a Repo Icon above explorer section window. + . Click on the Clone a Repo Icon above the explorer section window. //+ //image::clone_a_repo.png[width=640] diff --git a/modules/chapter3/pages/elyra-pipelines.adoc b/modules/chapter3/pages/elyra-pipelines.adoc index 91bfdc4..a320971 100644 --- a/modules/chapter3/pages/elyra-pipelines.adoc +++ b/modules/chapter3/pages/elyra-pipelines.adoc @@ -21,7 +21,7 @@ If the pipeline server is deployed post workbench creation, the runtime configur .. you will need the following required fields: ... Runtime: *Display Name* - ... Data Science Pipelines API Endpoint: found in tne Network / Routes section of OCP Dashboard + ... Data Science Pipelines API Endpoint: found in the Network / Routes section of OCP Dashboard ... Data Science Pipeline Engine Type: *Argo* (pre-configured) ... Cloud Object Storage Endpoint: S3 compatible storage (same as data connection endpoint) ... Cloud Object Storage Bucket Name: Name of the S3 bucket @@ -55,7 +55,7 @@ Let's now use Elyra to package the nodes into a pipeline and submit it to the Da === Review opening JupyterLab -Once the `fraud-detection` workbench has successfully started, we will being the process of exploring and building our pipeline. +Once the `fraud-detection` workbench has successfully started, we will begin the process of exploring and building our pipeline. . Ensure that the `fraud-detection` workbench is in `Running` state. Click the `Open` link on the far right of the work bench menu. Log in to the workbench as the `admin` user. If you are running the workbench for the first time, click `Allow selected permissions` in the `Authorize Access` page to open the Jupyter Notebook interface. @@ -75,7 +75,7 @@ image::elyra_pipeline_nodes.gif[width=600] . Click on the `Pipeline Editor` tile in the launcher menu. This opens up Elyra's visual pipeline editor. You will use the visual pipeline editor to drag-and-drop files from the file browser onto the canvas area. These files then define the individual tasks of your pipeline. -. Rename the pipeline file to `fraud-detection-elyra.pipeline: Right click the untiled pipeline name, choose rename, and then select `Save Pipeline` in the top toolbar. +. Rename the pipeline file to `fraud-detection-elyra.pipeline: Right click the untitled pipeline name, choose rename, and then select `Save Pipeline` in the top toolbar. . Drag the `experiment_train.ipynb` notebook onto the empty canvas. This will allow the pipeline to ingest the data we want to classify, pre-process the data, train a model, and run a sample test to validate the model is working as intended. + @@ -89,7 +89,7 @@ image::elyra_pipeline_nodes.gif[width=600] + //image::pipeline-3.png[] + -You should now see the two nodes connected through a solid line. We have now defined a simple pipeline with two tasks, which are executed sequentially, first experiment_train to produce a model articfact, then save-model to move the model to workbench S3 storage. +You should now see the two nodes connected through a solid line. We have now defined a simple pipeline with two tasks, which are executed sequentially, first experiment_train to produce a model artifact, then save-model to move the model to workbench S3 storage. + [NOTE] ==== @@ -130,14 +130,13 @@ image::experiment_node_config_2.gif[width=600] . In the `File Dependencies` section, you can declare one or more _input files_. These input files are consumed by this pipeline task as the data needed to train to the model. - . Under file dependencies *click add*, next select browse and choose the data/card_transdata.csv file which provides a sampling of credit card to be used. + . Under file dependencies *click add*, then select browse and choose the data/card_transdata.csv file which provides a sampling of credit card transaction data to be used to train the model. . In the `Outputs` section, you can declare one or more _output files_. These output files are created by this pipeline task and are made available to all subsequent tasks. . Click `Add` in the `Outputs` section and input `models/fraud/1/model.onnx`. This ensures that the downloaded model artifact is available to downstream tasks, including the `save_models` task. -+ -//image::pipeline-config-5.png[] -+ + + [NOTE] ==== By default, all files within a containerized task are removed after its execution, so declaring files explicitly as output files is one way to ensure that they can be reused in downstream tasks. @@ -147,7 +146,7 @@ Output files are automatically managed by Data Science Pipelines, and stored in === Set Kubernetes Secrets for Storage Access - . Click on the `save_model` node. Then select open panel to view the "Node Properties" configuration panel. If not, right-click on the node and select `Open Properties`. + . Click on the `save_model` node. Then select the open panel to view the "Node Properties" configuration panel. If not, right-click on the node and select `Open Properties`. . Next we will configure the data connection to the `my-storage` bucket as a Kubernetes secret. .. By default these secrets are created in the environment variable section in pipeline properties @@ -254,7 +253,7 @@ In the `Scheduled` tab you're able to view runs of the fraud-detection-elyra pip [WARNING] ==== Pipeline versioning implemented in Data Science Pipelines. -If you change or resumit an Elyra pipeline that you have already submitted before, a new version is automatically created and executed. +If you change or sumit an Elyra pipeline that you have already submitted before, a new version is automatically created and executed. ==== @@ -268,7 +267,7 @@ Let's finally peek behind the scenes and inspect the S3 bucket that Elyra and Da -- * `pipelines`: A folder used by Data Science Pipelines to store all pipeline definitions in YAML format. * `artifacts`: A folder used by Data Science Pipelines to store the metadata of each pipeline task for each pipeline run. -* One folder for each pipeline run with name `[pipeline-name]-[timestamp]`. These folders are managed by Elyra and contain all file dependencies, log files, and output files of each task. +* A folder for each pipeline run with name `[pipeline-name]-[timestamp]`. These folders are managed by Elyra and contain all file dependencies, log files, and output files of each task. -- [NOTE] @@ -278,8 +277,5 @@ The logs from the Pipeline submitted from Elyra will show generic task informati To view logs from the execution of our code, you can find the log files from our tasks in the runs in the Data Science Pipelines bucket. ==== -//image::pipelines-bucket.png[title=Data Science Pipeline Bucket contents] - -//image::pipeline-artifacts.png[title=Data Science Pipeline Run Artifacts] Now that we have seen how to work with Data Science Pipelines through Elyra, let's take a closer look at the Kubeflow Pipelines SDK. \ No newline at end of file diff --git a/modules/chapter4/pages/kfp-import.adoc b/modules/chapter4/pages/kfp-import.adoc index d404e68..687d326 100644 --- a/modules/chapter4/pages/kfp-import.adoc +++ b/modules/chapter4/pages/kfp-import.adoc @@ -10,7 +10,7 @@ This course does not delve into the details of how to use the SDK. Instead, it p === Prerequisites -* Continue to use the `fraud-detection` Data Science Project that you created in the previous section. We won't need a workbench in this section, but you should have completed all lab exercises up through Data Science Pipelines / OpenShift AI Resources section of the course in order for the environment to support pipeline creation. +* Continue to use the `fraud-detection` Data Science Project that you created in the previous section. We won't need a workbench in this section, but you should have completed all lab exercises up through the Data Science Pipelines / OpenShift AI Resources section of the course in order for the environment to support pipeline creation. image::import_pipeline_yaml.gif[width=600] @@ -41,7 +41,7 @@ There are three tabs in DSP dashboard: * Graph - the DAG view of the pipeline defined * Summary - shows the pipeline spec and version IDs - * Pipeline spec - is the import yaml file that defined the pipeline. + * Pipeline spec - is the import yaml file that defines the pipeline. The pipeline is now available to be executed, but currently there have been no *one-off or scheduled runs* for this pipeline, it has only been defined in the system. @@ -73,9 +73,9 @@ To create a _run_ for the fraud-detection-example pipeline we just imported. . Select the option to create a new run. -To execute the run, we need to imput some information: +To execute the run, we need to input some information: - . Run Type: Scheduled runs are exectued from different dashboard - skip this step + . Run Type: Scheduled runs are executed from different dashboard - skip this step . Define the project and experiment name: @@ -101,7 +101,7 @@ In this case there are two required parameters, which allow this pipeline to hav . The first parameter is a url location of the data file to be imported during the Run. - . The second paramenter is number of epochs. + . The second parameter is the number of epochs. + [NOTE] This epoch's number is an important hyperparameter for the algorithm. It specifies the number of epochs or complete passes of the entire training dataset passing through the training or learning process of the algorithm.