From 5c7c3d7598ad80ab9f90650efcddef47c3f7fec8 Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Mon, 27 May 2024 14:40:59 +0300 Subject: [PATCH 1/7] Add Super pipeline for code transforms. Signed-off-by: Revital Sur --- kfp/doc/multi_transform_pipeline.md | 22 +- .../src/execute_ray_job_multi_s3.py | 2 +- kfp/superworkflows/Makefile | 35 +-- .../{v1 => ray/kfp_v1}/Makefile | 4 +- .../kfp_v1/superworkflow_code_sample_wf.py | 260 ++++++++++++++++++ .../kfp_v1}/superworkflow_dedups_sample_wf.py | 4 +- 6 files changed, 301 insertions(+), 26 deletions(-) rename kfp/superworkflows/{v1 => ray/kfp_v1}/Makefile (91%) create mode 100644 kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py rename kfp/superworkflows/{v1 => ray/kfp_v1}/superworkflow_dedups_sample_wf.py (98%) diff --git a/kfp/doc/multi_transform_pipeline.md b/kfp/doc/multi_transform_pipeline.md index f9b3fe2c4..634b7d972 100644 --- a/kfp/doc/multi_transform_pipeline.md +++ b/kfp/doc/multi_transform_pipeline.md @@ -23,14 +23,34 @@ In the list of its input parameters, we also see `data_s3_config`. Now, we have ![param list](param_list2.png) +### Examples -**Note** An example super pipeline that combines several transforms, `doc_id`, `ededup`, and `fdedup`, can be found in [superworkflow_dedups_sample_wf.py](../superworkflows/v1/superworkflow_dedups_sample_wf.py). +The following sections contains two super pipelines examples: + +1) [dedups super pipelines](#De-dups-super-pipeline) +1) [programming language super pipeline](#programming-language-super-pipeline) + +### De-dups super pipeline + +This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can be found in [superworkflow_dedups_sample_wf.py](../transform_workflows/superworkflows/superworkflow_dedups_sample_wf.py). ![super pipeline](super_pipeline.png) The input parameters of the super pipelines: +The input parameters of the super pipelines are described in this [section](#Super-pipeline-Input-Parameters). + +### Programming languages Super pipeline + +This pipeline combines several programming-languages transforms: `proglang_select`, `code_quality`, and `malware`. It can be found in [superworkflow_code_wf.py](../transform_workflows/superworkflows/superworkflow_code_wf.py). + +![super pipeline](super-code-pipeline.png) + +The input parameters of the super pipelines are described in this [section](#Super-pipeline-Input-Parameters). + +### Super Pipeline Input Parameters + There are several `groups` of input parameters for super pipelines, each group of parameters has a prefix of "p_" string, where is an order number. "p1_" prefix group of parameters: diff --git a/kfp/kfp_ray_components/src/execute_ray_job_multi_s3.py b/kfp/kfp_ray_components/src/execute_ray_job_multi_s3.py index b20286602..1e58a5e66 100644 --- a/kfp/kfp_ray_components/src/execute_ray_job_multi_s3.py +++ b/kfp/kfp_ray_components/src/execute_ray_job_multi_s3.py @@ -62,7 +62,7 @@ # Execute Ray jobs execute_ray_jobs( name=cluster_name, - additional_params=KFPUtils.load_from_json(args.additional_params), + additional_params=KFPUtils.load_from_json(args.additional_params.replace("'", '"')), e_params=exec_params, exec_script_name=args.exec_script_name, server_url=args.server_url, diff --git a/kfp/superworkflows/Makefile b/kfp/superworkflows/Makefile index d4ddf0a3a..950286fcd 100644 --- a/kfp/superworkflows/Makefile +++ b/kfp/superworkflows/Makefile @@ -2,27 +2,22 @@ REPOROOT=../../ # Use make help, to see the available rules include ${REPOROOT}/.make.defaults -clean:: - @# Help: Recursively make $@ all subdirs - $(MAKE) RULE=$@ .recurse +.PHONY: workflow-venv +workflow-venv: + $(MAKE) -C ray/kfp_v1 workflow-venv -workflow-venv:: - @# Help: Recursively make $@ in subdirs - $(MAKE) RULE=$@ .recurse +.PHONY: workflow-build +workflow-build: + $(MAKE) -C ray/kfp_v1 workflow-build -workflow-build:: - @# Help: Recursively make $@ in subdirs - $(MAKE) RULE=$@ .recurse +.PHONY: workflow-test +workflow-test: + $(MAKE) -C ray/kfp_v1 workflow-test -workflow-test:: - @# Help: Recursively make $@ in subdirs - $(MAKE) RULE=$@ .recurse - -workflow-upload:: - @# Help: Recursively make $@ in subdirs - $(MAKE) RULE=$@ .recurse - -workflow-reconcile-requirements:: - @# Help: Recursively make $@ in all subdirs - @$(MAKE) RULE=$@ .recurse +.PHONY: workflow-upload +workflow-upload: + $(MAKE) -C ray/kfp_v1 workflow-upload +.PHONY: workflow-reconcile-requirements +workflow-reconcile-requirements: + $(MAKE) -C ray/kfp_v1 workflow-reconcile-requirements diff --git a/kfp/superworkflows/v1/Makefile b/kfp/superworkflows/ray/kfp_v1/Makefile similarity index 91% rename from kfp/superworkflows/v1/Makefile rename to kfp/superworkflows/ray/kfp_v1/Makefile index 643249760..9a74bce57 100644 --- a/kfp/superworkflows/v1/Makefile +++ b/kfp/superworkflows/ray/kfp_v1/Makefile @@ -1,8 +1,8 @@ -REPOROOT=${CURDIR}/../../.. +REPOROOT=${CURDIR}/../../../.. WORKFLOW_VENV_ACTIVATE=${REPOROOT}/transforms/venv/bin/activate include $(REPOROOT)/transforms/.make.transforms_workflows -PYTHON_WF := $(shell find ./ -name *_wf.py) +PYTHON_WF := $(shell find ./ -name "*_wf.py") YAML_WF=$(patsubst %.py, %.yaml, ${PYTHON_WF}) workflow-venv:: .check_python_version ${WORKFLOW_VENV_ACTIVATE} diff --git a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py new file mode 100644 index 000000000..864ce5347 --- /dev/null +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py @@ -0,0 +1,260 @@ +import kfp.compiler as compiler +import kfp.components as comp +import kfp.dsl as dsl +from kfp_support.workflow_support.utils import ONE_WEEK_SEC + + +# Components +# For every sub workflow we need a separate components, that knows about this subworkflow. +component_spec_path = "../../../kfp_ray_components/" +run_code_quality_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_malware_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_proglang_select_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_doc_id_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_exact_dedup_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_fuzzy_dedup_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_tokenization_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") + +proglang_select_image = "quay.io/dataprep1/data-prep-kit/proglang_select:0.3.0" +code_quality_image = "quay.io/dataprep1/data-prep-kit/code_quality:0.3.0" +malware_image = "quay.io/dataprep1/data-prep-kit/malware:0.4.0" +doc_id_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.1" +ededup_image = "quay.io/dataprep1/data-prep-kit/ededup:0.3.0" +fdedup_image = "quay.io/dataprep1/data-prep-kit/fdedup:0.3.0" +tokenizer_image = "quay.io/dataprep1/data-prep-kit/tokenization:0.2.0" + + +# Pipeline to invoke execution on remote resource +@dsl.pipeline( + name="sample-super-kubeflow-pipeline", + description="Pipeline to show how to run combine several transformer pipelines", +) +def sample_code_ray_orchestrator( + # the super pipeline parameters + p1_orch_code_quality_name: str = "code_quality_wf", + p1_orch_malware_name: str = "malware_wf", + p1_orch_proglang_select_name: str = "proglang_select_wf", + p1_orch_doc_id_name: str = "doc_id_wf", + p1_orch_exact_dedup_name: str = "ededup_wf", + p1_orch_fuzzy_dedup_name: str = "fdedup_wf", + p1_orch_tokenization_wf_name: str = "tokenization_wf", + p2_pipeline_runtime_pipeline_id: str = "pipeline_id", + p2_pipeline_ray_head_options: str = '{"cpu": 1, "memory": 4, "image_pull_secret": ""}', + p2_pipeline_ray_worker_options: str = '{"replicas": 2, "max_replicas": 2, "min_replicas": 2, "cpu": 2, "memory": 4, "image_pull_secret": ""}', + p2_pipeline_server_url: str = "http://kuberay-apiserver-service.kuberay.svc.cluster.local:8888", + p2_pipeline_input_parent_path: str = "test/ingest2parquet/output/", + p2_pipeline_output_parent_path: str = "test/super/output/", + p2_pipeline_parent_path_suffix: str = "", + p2_pipeline_additional_params: str = '{"wait_interval": 2, "wait_cluster_ready_tmout": 400, "wait_cluster_up_tmout": 300, "wait_job_ready_tmout": 400, "wait_print_tmout": 30, "http_retries": 5}', + p2_pipeline_data_s3_access_secret: str = "s3-secret", + p2_pipeline_runtime_code_location: str = '{"github": "github", "commit_hash": "12345", "path": "path"}', + # Exact dedup step parameters + p3_name: str = "ededup", + p3_skip: bool = False, + p3_ededup_doc_column: str = "contents", + p3_ededup_hash_cpu: float = 0.5, + p3_runtime_actor_options: str = '{"num_cpus": 0.8}', + # data access. + p3_data_max_files: int = -1, + p3_data_num_samples: int = -1, + # data sampling + p3_ededup_n_samples: int = 10, + # overriding parameters + p3_overriding_params: str = '{"ray_worker_options": {"image": "' + + ededup_image + + '"}, "ray_head_options": {"image": "' + + ededup_image + + '"}}', + # Document ID step parameters + p4_name: str = "doc_id", + p4_skip: bool = False, + # data access. + p4_data_max_files: int = -1, + p4_data_num_samples: int = -1, + # orchestrator + p4_runtime_actor_options: str = '{"num_cpus": 0.8}', + # doc id parameters + p4_doc_id_doc_column: str = "contents", + p4_doc_id_hash_column: str = "hash_column", + p4_doc_id_int_column: str = "int_id_column", + # overriding parameters + p4_overriding_params: str = '{"ray_worker_options": {"image": "' + + doc_id_image + + '"}, "ray_head_options": {"image": "' + + doc_id_image + + '"}}', + # Fuzzy dedup step parameters + p5_name: str = "fdedup", + p5_skip: bool = False, + # columns used + p5_fdedup_doc_column: str = "contents", + p5_fdedup_id_column: str = "int_id_column", + p5_fdedup_cluster_column: str = "cluster", + # orchestrator + p5_runtime_actor_options: str = '{"num_cpus": 0.8}', + # data access. checkpointing is not supported by dedup + p5_data_num_samples: int = -1, + p5_data_max_files: int = -1, + # infrastructure + p5_fdedup_bucket_cpu: float = 0.5, + p5_fdedup_doc_cpu: float = 0.5, + p5_fdedup_mhash_cpu: float = 0.5, + # fuzzy parameters + p5_fdedup_num_permutations: int = 64, + p5_fdedup_threshold: float = 0.8, + p5_fdedup_shingles_size: int = 5, + p5_fdedup_delimiters: str = " ", + # random delay between reads + p5_fdedup_random_delay_limit: int = 5, + # snapshotting + p5_fdedup_snapshot_delay: int = 1, + p5_fdedup_use_doc_snapshot: bool = False, + p5_fdedup_use_bucket_snapshot: bool = False, + # data sampling + p5_fdedup_n_samples: int = 10, + # overriding parameters + p5_overriding_params: str = '{"ray_worker_options": {"image": "' + + fdedup_image + + '"}, "ray_head_options": {"image": "' + + fdedup_image + + '"}}', + # proglang_select step parameters + p6_name: str = "proglang_select", + p6_skip: bool = False, + p6_proglang_select_allowed_langs_file: str = "test/proglang_select/languages/allowed-code-languages.txt", + p6_proglang_select_language_column: str = "programming_language", + p6_proglang_select_s3_access_secret: str = "s3-secret", + # data access. + p6_data_max_files: int = -1, + p6_data_num_samples: int = -1, + # orchestrator + p6_runtime_actor_options: str = '{"num_cpus": 0.8}', + # overriding parameters + p6_overriding_params: str = '{"ray_worker_options": {"image": "' + + proglang_select_image + + '"}, "ray_head_options": {"image": "' + + proglang_select_image + + '"}}', + # Code quality step parameters + p7_name: str = "code_quality", + p7_skip: bool = False, + p7_cq_contents_column_name: str = "contents", + p7_cq_language_column_name: str = "programming_language", + p7_cq_tokenizer: str = "codeparrot/codeparrot", + p7_cq_hf_token: str = "None", + # data access. + p7_data_max_files: int = -1, + p7_data_num_samples: int = -1, + # orchestrator + p7_runtime_actor_options: str = '{"num_cpus": 0.8}', + # overriding parameters + p7_overriding_params: str = '{"ray_worker_options": {"image": "' + + code_quality_image + + '"}, "ray_head_options": {"image": "' + + code_quality_image + + '"}}', + # malware step parameters + p8_name: str = "malware", + p8_skip: bool = False, + p8_malware_input_column: str = "contents", + p8_malware_output_column: str = "virus_detection", + # orchestrator + p8_runtime_actor_options: str = '{"num_cpus": 0.8}', + # data access. + p8_data_max_files: int = -1, + p8_data_num_samples: int = -1, + # overriding parameters + p8_overriding_params: str = '{"ray_worker_options": {"image": "' + + malware_image + + '"}, "ray_head_options": {"image": "' + + malware_image + + '"}}', + # tokenization parameters + p9_name: str = "tokenization", + p9_skip: bool = False, + p9_tkn_tokenizer: str = "hf-internal-testing/llama-tokenizer", + p9_tkn_doc_id_column: str = "document_id", + p9_tkn_doc_content_column: str = "contents", + p9_tkn_text_lang: str = "en", + p9_tkn_tokenizer_args: str = "cache_dir=/tmp/hf", + p9_tkn_chunk_size: int = 0, + p9_overriding_params: str = '{"ray_worker_options": {"image": "' + + tokenizer_image + + '"}, "ray_head_options": {"image": "' + + tokenizer_image + + '"}}', +): + + # get all arguments + args = locals() + orch_host = "http://ml-pipeline:8888" + + def _set_component(op: dsl.BaseOp, displaied_name: str, prev_op: dsl.BaseOp = None): + # set the sub component UI name + op.set_display_name(displaied_name) + + # Add pod labels + op.add_pod_label("app", "ml-pipeline").add_pod_label("component", "code-pipelines") + # No cashing + op.execution_options.caching_strategy.max_cache_staleness = "P0D" + # image pull policy + op.set_image_pull_policy("Always") + # Set the timeout for each task to one week (in seconds) + op.set_timeout(ONE_WEEK_SEC) + if prev_op is not None: + op.after(prev_op) + + # exact deduplication + exact_dedup = run_exact_dedup_op( + name=p1_orch_exact_dedup_name, + prefix="p3_", + params=args, + host=orch_host, + input_folder=p2_pipeline_input_parent_path, + ) + _set_component(exact_dedup, "exact dedup") + # document ID + doc_id = run_doc_id_op( + name=p1_orch_doc_id_name, prefix="p4_", params=args, host=orch_host, input_folder=exact_dedup.output + ) + _set_component(doc_id, "doc ID", exact_dedup) + # fuzzy deduplication + fuzzy_dedup = run_fuzzy_dedup_op( + name=p1_orch_fuzzy_dedup_name, prefix="p5_", params=args, host=orch_host, input_folder=doc_id.output + ) + _set_component(fuzzy_dedup, "fuzzy dedup", doc_id) + + # proglang_select + proglang_select = run_proglang_select_op( + name=p1_orch_proglang_select_name, + prefix="p6_", + params=args, + host=orch_host, + input_folder=fuzzy_dedup.output, + ) + _set_component(proglang_select, "proglang_select", fuzzy_dedup) + + # code_quality + code_quality = run_code_quality_op( + name=p1_orch_code_quality_name, prefix="p7_", params=args, host=orch_host, input_folder=proglang_select.output + ) + _set_component(code_quality, "code_quality", proglang_select) + + # malware + malware = run_malware_op( + name=p1_orch_malware_name, prefix="p8_", params=args, host=orch_host, input_folder=code_quality.output + ) + _set_component(malware, "malware", code_quality) + # malware + tokenization = run_tokenization_op( + name=p1_orch_tokenization_wf_name, prefix="p9_", params=args, host=orch_host, input_folder=malware.output + ) + _set_component(tokenization, "tokenization", malware) + + # Configure the pipeline level to one week (in seconds) + dsl.get_pipeline_conf().set_timeout(ONE_WEEK_SEC) + + +if __name__ == "__main__": + # Compiling the pipeline + compiler.Compiler().compile(sample_code_ray_orchestrator, __file__.replace(".py", ".yaml")) diff --git a/kfp/superworkflows/v1/superworkflow_dedups_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py similarity index 98% rename from kfp/superworkflows/v1/superworkflow_dedups_sample_wf.py rename to kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py index 2f7c64f00..134890460 100644 --- a/kfp/superworkflows/v1/superworkflow_dedups_sample_wf.py +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py @@ -6,13 +6,13 @@ # Components # path to kfp component specifications files -component_spec_path = "../../kfp_ray_components/" +component_spec_path = "../../../kfp_ray_components/" # For every sub workflow we need a separate components, that knows about this subworkflow. run_doc_id_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") run_exact_dedup_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") run_fuzzy_dedup_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") -doc_id_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.0" +doc_id_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.1" ededup_image = "quay.io/dataprep1/data-prep-kit/ededup:0.3.0" fdedup_image = "quay.io/dataprep1/data-prep-kit/fdedup:0.3.0" From 386864f1fbbf22b47a0e41a37cbcc70ebfdeb40c Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Mon, 27 May 2024 14:57:33 +0300 Subject: [PATCH 2/7] Change TOKENIZER_VERSION to TOKENIZATION_VERSION in .make.versions. Signed-off-by: Revital Sur --- .make.versions | 2 +- kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py | 2 +- transforms/universal/doc_id/kfp_ray/v1/doc_id_wf.py | 2 +- transforms/universal/tokenization/kfp_ray/v1/tokenization_wf.py | 2 +- transforms/universal/tokenization/ray/Makefile | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.make.versions b/.make.versions index 4f1205076..223581e3a 100644 --- a/.make.versions +++ b/.make.versions @@ -16,7 +16,7 @@ FILTER_VERSION=0.3.0 NOOP_VERSION=0.8.0 RESIZE_VERSION=0.3.0 LANG_ID_VERSION=0.3.0 -TOKENIZER_VERSION=0.3.0 +TOKENIZATION_VERSION=0.3.0 MALWARE_VERSION=0.4.0 PROGLANG_SELECT_VERSION=0.3.0 CODE_QUALITY_VERSION=0.3.0 diff --git a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py index 864ce5347..2327e9d1c 100644 --- a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py @@ -21,7 +21,7 @@ doc_id_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.1" ededup_image = "quay.io/dataprep1/data-prep-kit/ededup:0.3.0" fdedup_image = "quay.io/dataprep1/data-prep-kit/fdedup:0.3.0" -tokenizer_image = "quay.io/dataprep1/data-prep-kit/tokenization:0.2.0" +tokenizer_image = "quay.io/dataprep1/data-prep-kit/tokenization:0.3.0" # Pipeline to invoke execution on remote resource diff --git a/transforms/universal/doc_id/kfp_ray/v1/doc_id_wf.py b/transforms/universal/doc_id/kfp_ray/v1/doc_id_wf.py index ce9fd68ef..ece31b63b 100644 --- a/transforms/universal/doc_id/kfp_ray/v1/doc_id_wf.py +++ b/transforms/universal/doc_id/kfp_ray/v1/doc_id_wf.py @@ -20,7 +20,7 @@ ) -task_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.0" +task_image = "quay.io/dataprep1/data-prep-kit/doc_id:0.3.1" # the name of the job script EXEC_SCRIPT_NAME: str = "doc_id_transform.py" diff --git a/transforms/universal/tokenization/kfp_ray/v1/tokenization_wf.py b/transforms/universal/tokenization/kfp_ray/v1/tokenization_wf.py index 1e5a3ae9b..e9e56dc3d 100644 --- a/transforms/universal/tokenization/kfp_ray/v1/tokenization_wf.py +++ b/transforms/universal/tokenization/kfp_ray/v1/tokenization_wf.py @@ -23,7 +23,7 @@ # the name of the job script EXEC_SCRIPT_NAME: str = "tokenization_transform.py" -task_image = "quay.io/dataprep1/data-prep-kit/tokenization:0.2.0" +task_image = "quay.io/dataprep1/data-prep-kit/tokenization:0.3.0" # components base_kfp_image = "quay.io/dataprep1/data-prep-kit/kfp-data-processing:0.1.1" diff --git a/transforms/universal/tokenization/ray/Makefile b/transforms/universal/tokenization/ray/Makefile index bea983ba1..72d7b2790 100644 --- a/transforms/universal/tokenization/ray/Makefile +++ b/transforms/universal/tokenization/ray/Makefile @@ -8,7 +8,7 @@ include $(REPOROOT)/transforms/.make.transforms TRANSFORM_NAME=tokenization # $(REPOROOT)/.make.versions file contains the versions -DOCKER_IMAGE_VERSION=${TOKENIZER_VERSION} +DOCKER_IMAGE_VERSION=${TOKENIZATION_VERSION} venv:: .transforms.ray-venv From f490f55f3899e602eb61e990e53c629ed324433a Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Mon, 27 May 2024 16:13:14 +0300 Subject: [PATCH 3/7] Update kfp/doc/multi_transform_pipeline.md Signed-off-by: Revital Sur --- kfp/doc/multi_transform_pipeline.md | 17 +++++++---------- kfp/doc/super-code-pipeline.png | Bin 0 -> 60792 bytes 2 files changed, 7 insertions(+), 10 deletions(-) create mode 100644 kfp/doc/super-code-pipeline.png diff --git a/kfp/doc/multi_transform_pipeline.md b/kfp/doc/multi_transform_pipeline.md index 634b7d972..df651b123 100644 --- a/kfp/doc/multi_transform_pipeline.md +++ b/kfp/doc/multi_transform_pipeline.md @@ -25,25 +25,22 @@ In the list of its input parameters, we also see `data_s3_config`. Now, we have ### Examples -The following sections contains two super pipelines examples: +The sections that follow display two super pipelines as examples: -1) [dedups super pipelines](#De-dups-super-pipeline) -1) [programming language super pipeline](#programming-language-super-pipeline) +1) [dedups super pipeline](#De-dups-super-pipeline) +1) [programming language super pipeline](#programming-languages-super-pipeline) -### De-dups super pipeline +### Dedups super pipeline -This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can be found in [superworkflow_dedups_sample_wf.py](../transform_workflows/superworkflows/superworkflow_dedups_sample_wf.py). +This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can be found in [superworkflow_dedups_sample_wf.py](../superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py). ![super pipeline](super_pipeline.png) - -The input parameters of the super pipelines: - -The input parameters of the super pipelines are described in this [section](#Super-pipeline-Input-Parameters). +The input parameters of the super pipelines are described in this [section](#super-pipeline-Input-Parameters). ### Programming languages Super pipeline -This pipeline combines several programming-languages transforms: `proglang_select`, `code_quality`, and `malware`. It can be found in [superworkflow_code_wf.py](../transform_workflows/superworkflows/superworkflow_code_wf.py). +This pipeline combines several programming-languages transforms: `ededup`, `doc_id`, `fdedup`, `proglang_select`, `code_quality`, `malware` and `tokenization`. It can be found in [superworkflow_code_wf.py](../superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py). ![super pipeline](super-code-pipeline.png) diff --git a/kfp/doc/super-code-pipeline.png b/kfp/doc/super-code-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..327d799bbd930738c15c273029b0af3e1038dd30 GIT binary patch literal 60792 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
w;*L2krI?1uij8S zWMTe5!5~29LP$!t$O+>2AnV=+F4mD)*K_)(kovg0HF&}_&d{;8V_|HMR%NKShicmL zB9$tI7D_)oxoHCr8`4}xWHDUJFx@i}4J2$<%k17l&Ob}+;CcR_!>m|r2Rc^fs+H!4 zSiP)v&|#G-!qTFaJ9w#2Y$7E$eq&vk8fw7F zwJkmn*IBPdmv~q9eH2ZwfsR+@>H5SzCcB)$9qxGj%!$q7FwRWNuH3u*^2{%e%rp5U zfu&uKbK9j-`kFSF2Hn+lRDZkc;NRO~8`F!ebbT(|KkJs>+v`Pm6p_SOkhxPidQTJ( zcW!;U7rhyKEp?hpS@iVVBdmP|M-FfO?^1IEBcd$Z?Fq7`*v_({n}uo_Geh$tC)NCdS@Ld9NW-~(VCv}eFftzZ9FT|c+Woi zhXn86Gh#z3bKk>n|Fbdacd#=d83Y==H}#2mH>YF@;xs)gmiSg^$b@8(-U_4oYdY3e z*w${!l3D3eu5V+7ZC~Z09WQR!PM5I97n`D{?Y+9;D{SwN&_?~LbW8^$a(6?4z)F{b z`f?bNn6uQK53$QCsb#P2^$6Q1LjN#a4ygB&6Gr9Kt>tGx^D}-Ru6F6munq0YGE(ki zA6;(Qs>O;-mAyq?Wf~AKZWD}pL8$O{U%?<cJ76aTj|@wnypw|gb; zSj~mSFtUY1zHQ}T#T3~gLMQ@`Cm^%c&oq$&-YD3-AH)`>++g%a{ zX{^ylTV1h@OG=tv3W_Txij8twKizVEWjwirY-rT+nb{WXfr7rT`Bzqc zd6Ea(Vs3%e=sD=I=V{KX`e_?0AMC;btJX@`RFzxbd#r3+p8^&pBo;ZiA9)E5vP-om zRuu)kt^#}$tMmS?FKjlp{eIV1_ujVC2Y7K}K7&t)w8nN|EUc&{MLkdgD6bSzMNm%= zT)5WT4j?GQ{d}7)SXI}o`kDqLfyTy*J8_Bs-6zw^%;+|X&=&sn`19|Q&}QPxdH%KD zqQG2>zUFuZ3yp2X9e1wM^AHgDu&mq=``_!;SnEw59+j`v6}JSfF*b8#O|k6+l8A8@ zMR0&-3=ZZzw?a(0gm756W|W_!F7*!-xJ!cUGrdzzSS+oQy&Oy~TF_l3m$28+_V;X?oV&DV8(|m*4X0ua!1*8&!5} zL#v#ZNGpYP5~I+_)p5SVQP>>+YS#`XV7OfVp|##N!oV9HL}D{whEtQPhduAtIN&d; z(V%@N{X@N^ZEFqkpzpll#4c`_25MWE*c$&G;Txy>c~|n`39ANm@zq~iVf0jl375+S zIShVFROlMT1h0WeGWWKn3jxKZY;Igyp_p94DZ0M4yXO*E;E&}R`*}q`Qqu1x7x=>< z-1iH1u1zckzKP)#QHLiAbZ1*ue~}}=633gg{UOk+WVp-i=PQLMM_m(whDps+thjU9 zgEihVjY>e{ku-cu#YXl}@?~jCrMgqPec~;l%D7_u_X-2S;1$WaCr1Ke~Q@zXfQi6YNMC(cknn$Fewi@W4@G1F++ z+GL&qx1O1(-+8(b3N>BSckJ9l5FvIrCoL>1eG0@icCB^0ZIBo2ntK)jq}B37vMM|N6M_xx`$!W>;I@N;PM%CJmX zmL}EMtC?P-=O36<$wvlL80ID%#i8Cm{}x7W+)&fv3X$$@@G*n^VwR{odbY2?*YBy~ z5rge$o%dX%7H5YV2F5#G-PITTYLG&YN3VYdLP}hFe)-R)Rn(>#n{Ea>(eS?DP%@F~ zCA~DdpzS{PYNp;uzdgsmu4G25AMTrvMG87f^v-ZQw=llenl^N(n5l7|nAIR(&Fv$` zs~bHE<0%uQoEc~>ye`~k_wB4>eyQ=8uit6;!#J_3LEcqaxeLl{gf25J6fRMQUW;n| zZF+V=P(uD7$fSm5rwU#Oo^Kg?5ValMxd*#xio5%GM`M>X1I9dEDkWJ6Q(+saFuZAX zXBdFSE#B6)!{7A`F3!FpU?!frEC6wE{^?gK`qoUypnca)^%2u%5W!Lccf5ptO={Sl zc5}0lx%1}i&x~(R$t1c|2!yiu=W#I%3NBXR!%5kmaC_9?Q-vx!yE2I$l&JBK4?fw= zA-y4?M5=|pH(9iQX(9tJNd3uosY-!F2%=p>;hi)UnEtv{$sW{fgSZKpJTvp=l>Jca z)G}#WhTJY-TuKm6>E7jGV^cJyB`J&g`qBU5bPq#ia#GAPT?&L23aQF2J_i7&wiKPPvRq+1j7i-1x|wG8>=$`GdSM8s5ds<+`j{qdVZ`Vq4mCME!70HHRJN zY?HWAY58QqAayaG8Vqk^eQW4i;6*Iz^E0a9kJR4}FCIv-d;|H~XpHmz@qnMDuovM@F9uF)rsOse!9(4_v$} zwq`7sQA=r11Gjg70A@Kyc|!S0w3vvdkxBYq*9MIlU(vK*bSbAAIa$i7WZV3Kn(Eg< zyB@QsNlH`)lXPO7h%c60k@4>1$qP#^*mf%FO|V$nW}Lanh=EJ6i8Y-^Zi84bX{s1O z>~NZ1s2wsfY1Js-E8gR#&gnSXcfxT{yqFc4)OsGDiCmB`^(&q(6d-oHmM;wOOueTf zHl_TsVny<}S$aIqfOjb&GaK*Qx-7r%a<%hkT>9Z*ZlsJ!uY38H@sCi;O@Qi6mx^Xg zPfMz>b=fmpO!5%zc`|Lu(rB2pY;mV%M6~4RYqvYg zM*XiDnnE`*O1|~VUxZhMjkFCAGj$8hA)t|fK zQ%d&xVjY^64_C{~V%>{LnI-Dd*GStFI_<7evTjCmm4C|7Yopkl(K^~!aMb*n?8-6n z=a5%oL<8gP9sZ1X0MOrfW_9rSq`{uA!n{GYo_*OlzA_aHcoedM4IDb|LnQ zFsEqgmy!PV@+H%>yzf~d`Q>?2ODD!Z^Nshp45D2gmy_`?wcS443z^T=d+9HH=1@lA zQl0JwvI{wI3j7>xGZZLT$wrp#%2e)i8R^1*#o8fWn*?{e^yYdcE+stJrTBAlv}EwV z;BA`2tlw4)AKtsPdo6S0L^w9us@I_uLo98MMlNe8%%j?n(_GSS_GBq^=frqwW&pee zMHIO(M3|{nJ9fhVJFce~Pn0@{y4UK<4zCO;;OlSlE)(7Ig-zAmNU+!ubse8#&2|-# zp6L>nc%#K2hb7CTmQVOs{#?wSq+<)O5EEerh2%;BSwqH8xrXqRwa0j~aw}r?SG{P> ze(MY_HECH{*`;rxZH$GJIrY})+f>JpX&f@^`q#C?cwO^jAGBE^o;+A?@`sN zZELqvLLWU_IlcFQCS>6pFY&{g$D=YRyop#ZYVqEaw-u!qZ{v&8^LZs52X_(dNlA!q z4XOdoI-~5U-%dS;U9SpDBe~Afu5%;G6YXW?MHU{!-1SxZnHCL%-ChF70xI<`omqZ z3Hg9hZ^WJIsW8vM)mzw*u`9E*(cNK?*}qB*Yr{pQ%$J*x>_Q&*l)5)DBaOUlzbG@N_x>vB^W$jgZOS-EoeLB)`Q{VUmU+C~pm?eHXT>JT z45FEuo-7eFVDfP@dm4h*YH=tc)qlP-J|ae@TLSf@rCE(CBAefG-C;5t@#svOw#>&< z1D}+Upp4aAh=35!TiSU{H7=nW-ynQCQ0-06IW3pUebG53gP!b>1TDVbs*P*rbN(ssi-epKpsqv7;>Kg6cz zBEvq{Rh~*dS}`wfa)XtA_k+;Hn{-ZOZf{_>7wKs}qW4j(%aV)EMU`nGT;t{N?)%b9 zuNXMC;DkFubUmlF-CrG0(P2QVoRIiW{p?5P>cy(1dm1^HI+xQRW~6Y|hmEGpXG$~e zN#{}~cT6R!8H(4a(KUG8a1r`7B@|*Y9*9qC+KyIgIu`bS>D}o(=BwM+_HxDU;r&Xxc&c3)`m;{?qRtx8c{c!eP(~_aDTG+3J3YkvPQ$)wf2Qlhp2W2^J=8uG@v4Rr3~KB22V5 z+hSLJ1PQ^Q9xwXK0HE;Vq^Xk3pgXgLhR@{GeaOOyGmZY?BHn-6}FOqrJ-4@Ve2rE zyvOj($v0OOg#epNKfN=54Xv>NluS&_@gfHpskUeDh^(Szzt0O9*(!FpkF)Vx8?0Q> z=r&dXNLGc>J>vk{Z-(w@{Hi*{!$J!<3jL!01`Suei-2#zH+tr5M=cKk7US#pigm3w z73fWcSK=)h8WW=nLskqH`tNLjZ^gxrGXQ1+fTr*omT?~*y?;|Ax&ZJk;_{7EuhLg9 z;0~!lzvfS$>tI9%Sh&dPzY_C8fD)3qSGTYAW(K{PJ?Ct8fyUTi{ZFg(3;+TLFkW5! zv)=HPb>5S^29I9LX;aaK%dxvh;HtC8f`%;a^v@Woh6hae6xNZMAASjc_bMWSMhP?4 z9V^E&6YtmOa*=SQAIq$nOAa%EJEV%p6z|4l;778mYWM1F@JGKU+DqO2)#Bz95U14`hwUm~Br>im&Q(1zi)jZy`Uf)OBj)^wH2dFeop zf;a68IDiC4wysg-|6WM28z6*YpJBdL%F!!2$NR;gkC_g{suge-X`t5`pZ>Mcy#Gh+bwYrCuG9n z$|VD^m)*dP-7~h`MZlej#!IGa6O#m3KbDNc{+rOV2+o6BAA%Et_h0xQjANHqa?w1O|l_i^SU0j{$J-H?jc^PxtBsMmT+oT#K z0>wpH`wH#UJ3z$QMzT$vw_F>rOAA2m-p&aRF&}s(c%{UM0jsELOiOb8vv~c3#9r4- zaNF>RukBfS-K)^x<14{rP9NbP+^+qh{g49`^X6WeC;Q`p5ZUutBId#_{3~V{i1^mXLQ$r*wEXZ0EH?Xqh! zq^d@=_G=Ehw5|F;c;$G(XD+t&qVf&3A3j@oGQ`h#1h=NN$AqkD%NsD!^dDFA*AZre zj|-5UCDx7j^9{TPzVge0Bn+n*g_dh8gz){B3T&wyN9tUonDi=7{N7ed8L)f&Di??R{rR+l0 zyqDB#iBI?R*kH&bE$sb+{-S~24Q|dEos&t7uZ3FffDcu5mG24(<85`uKt zvW33wHGr3-^|W|7MSmJXEL!S|5r4fn>8vz2)+|7oC@x|!W-9!p3eOUB;ql_EadtIu$IB!)Dwu$Z6k|5vwzp2wsK zd7!0PH53wmrK%0x9fWf}A9ScYl2oOZi8Bf0&><{{xjJ#cX*%yZ!9Z#lUU3rCED8qk5g6k;{F z0TRKg-AC9^URNj7P9@hHbqbeJ@-wSsNt0aQ8MriwrqX3!!D9xjK9b02egvUKeTIN9 z$ehP~yTsA9aVj@^_E>Rsb`7TiLsfL!gT+U79;Z}gh6X!4W*dx$zr37@ESF~c7u-j0s8%hs8kFZGlv>UNK&26DM9m_1G- zLvRpVi`PlS0m=5pH!@5s&h`E5(rIX&mzcbG+|o4Db7L#2pY30EUa zb9gbo>Wm%(C|%lYPx2ZTi1#>JKpp<<);}}D)#p--FJmj7T8drrR(pApUvsg-YUb;M z`I;I8WyX)>*|8U1i=6e?-BqKVa(Y43b@4A=Y@J7e6b z^7P13YMoRSOMd)@C^Fj+BSS&wjFfP(DZWY5iClgNfC}oXYbXCG4&D=RaAy0M4!H>6 zrb=d2v&lq0$)axCc^Q+cJ(`am?2=62MkcjqyfdRajxt4y(4bl?Evp)5{n`eK*Y7|_ zYczfe0v!qS-sDuHY9*na6WX)N6B#^jLZn{TDfl5G^?yvG?@*fr06=dE}Ki=|tj>B*dlZF59YHgvi~00LBBkhJJtW;*MK`Xlp9t zy}oR!S1(CUBH8yJ(U*r85WGq&_QVZ{FjTS60-@os$@1cK={UgEjm)Wimpy^(9m6=1 z-0^JPotcVeT1ZBj!6zYEi}3F3He{wj5>^YD`?KgUw#QO=$+ErHiiUmU8vt%H0q8OJH96iPDvcR10uR$&vv&UMLGfJuDOykNH`h&8o$5Y!c%!#0J`+E^T z682I@KjllBRhvcIG4mB*kGb@Ewl9n-Aohc)6bR*9CB=H&-Z0`KVmyNdf621XdYk79T(p1SK9puKT%GSx>+Dp zF5~RwI^uIZcjFZ9zO82YRwY6UD}L2xKQ8Wb%pWUmekB$0@N=rP&(uS#u#G9>Gxw#j z@~Wf=-J>CZK)SSrJ(6NTcWN}|Hc5zkktaAzx>_u=D*}ZoPvmbE5Gltw5~_1kqY!B_ zrVGQ--dg3Ju901~O^9ORNWMu(po&<}!X`E4#yE%{zAR8vvos&Nc}bW_&o18-uQcqS z;*Y%q`r$N1mmvkVjwEGq5@CJo4rMR6A2{`k_ee1$bqb+$e;vtBpnSc+*v=z(=Dkah zBeA=8vTdT#YlP^tmBMM#C|T@nv;`1$CfU$UJVWY zdTI5vg0K-Rz1mYCQ)hXT?!|h$vPHABlDd?cR3q|hz76czO=)LP?&SwjV*&Zm;Gk`y z^Q2~k^$&>~TBp2Ko8#JRp6PnyQ#@TA+pJvjJH@rz%5lbx6?o|%;e>CR+t5($ONktT zn;f@u@tu9!r2+4Ry?Y2r!K>uQFT6y!M#c4r&TmmN%mRoy{KbEQm7V`5pK`%@OhZ|8 z5q1hyS;;PNDYMJARw#3Mu}f_e7fWYYaFAPrZF$(Gc+T=vPXs2n-5F6{K#A>h@jkS*%c9{^K74``m_$BE5pZpHN&?OhfK%E#z!V9^1;bT+W`v>=)wz#@49lII@ zmY_n@xm#syyYgu9S;BCfeoIn|rWL;mS$dZHt=0h@ z5K&}nGx$ghU>>afsP2mS#iaNLO%+uFz(uL8X!Y2k4+MNH$RXdVAGBZprW>nqlX5Fj zsp1fXD)we@?;1jt4&M|s3g7sC9@;SMyl`Z#w^Uoer&XbTkKV`{K0 z-VK5h?^fXQReJ6Q0<-WW{0jPey+>EnK9mUnDR_N5Jv#62u;Vqv+YgqzOFzTdng`;GJ^0}2mcQF9{!~?1i3I?F(&sQx?(i$lHbdwc z)u4x79diue|FNd4TQ>u{HYeylTZ8|7;87n;gest>Dy}X^SB`!r3pL=i%t*$>mW>tZ z>g&7@y3jy(_PQ-24U(m|UlNw!2ZDLpr!5<`44rJH7ryeTNTg>krDP9$#z#xGom-_6{kFLn zps!P#i`6Zkpc={{h}cRl)Wm$x+GE_*?PA$??D<-}Y=S2cn;2W#XwLHDgvq5Crylv4 z{>sa-MZ$}<{Kizz`9LTg>#(*UxrEKofQ>WoSsnA|jZ+Q+6u}<1fd+{kqgdCEXQxK_ z=&_E~##(FSQ~`2ANWpsp`omY;PBcnTUx(0Ar^xf2LR%OOa}2i4t-A8$crU|luFXDD zr07$_?S1fA;bhRMAqZo#-+ZMds7{)v!qtHKq54x zuaR=-uhcesX?n2u=&*dkKA)UV__=^EldlQq8lI1@(~RA)QHrZHr~D6JdBIdKTJBLO z-yw5^_W0n4Q8GE^`;WI@Sl6Q5|CXKc)*b&_QilqqAh`v5s=rn%KEOOl^}QD2&a02v z{jcjUQ8zC+7e+%A^6m#)8K-`Yc&u}_Kw6d1bh?N>OGp=8+o!0x>VbBUy z^_^j-WeU^|_#g5FZB;4cJ|bLJ+2hHR=GNX30Z{VsREW&f0%l|iaR#m3uW$y^4}}W0 z;$(_$WyQ)r-Hgj^<7#c$qYo}$7RALCnWd*$Cw_C3-M-jiKO)6mij?#a%ea3X_DmlA z57_grix^wQ!3`@L%;zrH0wc^>k3%6$S2bEprcv7I3eJnfHPcm2m>yRz)LU?u3FV%*=*dAwP)Z34<}bV3711?qYyH^tC$tIHHvpGKHZBM{m?N| zjHIlVm9+hsx5D6m;gioa|w(RrLIWBFY`+q){vu5TV z1T)?feg>#{91M{mZsp3SE|0WV-5oL7>%II5f1=l8_RM6m2BXEDA+cgBsb6gmI3f^2 zU(C>=Jf74SZe+Z8f0Rm-g&RQ=2s-hf2@18nduEm%w@=Vbg~c!5mY&BseJf_$5~*vI zymx&rxV^||tkYEJz({)=_u)G=wlmqGgit%1@(aS*mAhx&gsBC#8^tq|CP}4kP*fXo zZE1M>@}PiLr7!z3hV2nTtGs(Y;Q?c?o?T&KLHll=x>I+54eGw=7KEx3KlV!eik?B2 zlSRsMC%8}C{BRzC4+LW2rpH^gcx{KOJ=Xc9+)#Gl;ui$f!vWy1FK2LOkc>N7hX)wk zXu_`C?Pt@xe0*0?=Y+Kp53^Cv?XZO@*ZHF+Ers|_L7eQ*?+bekNEvvXVJt1L`&#~V z&n}+4I(-D>Sc@q!teUePU=2k7Nd6XXPwEe10l!6tQSmP~1&?ucWzPicq|)fetvswo z)UE=;yjf$+KI_(u7uqE z)Mnbb9h=3CWY@X0v0|i$ewJsC;20mvx%O)CWxPqt8U~e(w6)Z=P|2tqMt*m za$i#XevX!m^GOtd-g>?D99;-v3>b8|y*D{N*Sm&DhQw!8^5j*-pJP5@Kb$c4ohHG7 z*@Xq1egHvTRKp**jz}>w^_=pi2)NIWYcLj@w`F+rEEnsIYhBHqhc`yt$C%+TnAs5Q zL~mg?vXYpeRcyw2z1Ufz*mMy^@Op_ci52#P4d zUvuZaUw!31OVeEs(%X7(zB$|f^OG^D%k^eF&FLrA+gVCXcpvJlUnukA!-F?Qy=5od z=K^T&Ag(;%&&^#V~*sHUUUUMii)I;gHD^@hllC0%wmY*7xpTyr@rXJnhh$2div|SkZT^K-D zPGND_Z2$9yg=U*ll0Qpu0|JOSaF zy2+Hvp~>1>CzOmnYU3=#IrC6S%d@evA`*JjP|H76rf)HS?^*ks9z*rfmD>^0$$Y<^ z$gM~&SqWLq;*=7(_|3)>=>=&B&qBa3Tf=1tiv?I@rZ3U8|Nd-KszJ6vvEdYX9>K&{ zo^L`ft^}uu*Y>yrJi>+7Fb%TbI@Rb*dy`6M3Z*90+IVpvknQty_kM(zar!d!4VBELU5r z*vNT0$UBlq}e6S&Zrumh2alL;*jUTkU zWdqXMi)sy)ssq`%-RsA6eVHSv!z8rbTgf6h(XY}pzn5%~Lo6=WxC=;Zu2-%QCQ|lp zHz#8A>Ea9jjQ-V-2%B3;EVMA7-Mr0bUxg>`MzXw3x2c7sr(C9-C(+~{ypy^>3w8Vy z!_JUfLC3I(SA}qz#OL4lu57j;kf;cb%LDg+->P4zCrI^)sa^ONjQzK4z`wO0ep~JT zzbfGIFBtnT82c|6`~L+P`!4_sX3)O??7sl)|7q_#1Dbl;Jypa4BBBD)6%<4SL^?cNI7;os^ z@<}15?7E)%uS}c2LZt9J@k^Ds7}sa(kp=c2eAS`07BebV!l^SF~}H z6ohPHGOcRHWgl>^b#(yzNWR`K;{HzAEISwkRmT3urbGN+*R_L;myMEsR2$5HrK)}F z;2*GnCDt&U{@6+YC;CKvg0_DUh(pty313|WWKST=AOOx0)=O~NDu6KLu$}4P+h5>V z1p!uVWIJIh@zaMDp%K z8VOl9@-!fuqp)LFhx)Oi@uh6nDYW1cby}RYwI9d;m9Mu6<~5P40nvt1dNtkMb=a5jR}aZ| zxWPGIjJ6D%?biDb3i)dFwE$nBP>_G===Sy>`2l^)|0DSUoO%XIFOab97d_LttH$d5$7suv8t;njq8L-}C0%?4hfT;2kI#?&2PIBa4RYg=qi?=QsfUeX7{n zgC2~LqiTIvavn$lOp#65WH`D8@UfWy`W0es9z%-+|Isi_2^)*i@^IT3m3jroZ2L(a z?|?=wr~;ynC+F5zR9md%2n zkdXJ*zav@?Q8+jyf_8^({{ZkUNG0$>szAkUCK~JL95(Mr&FOPEFCvdmuV!dH7urd{ z6NFd<3T@?hjbcC=25;1Uqfx{Mr?v=Sh#UP=ndrJW=LOn&8h5cr8zXqIHhz%+r0}8b z3&$UCVsixT7baoHc*Hd+5ifd3pzfN4oq9Vzj|pW%7%Q%u=N3SR0Gt>{q*pvHTd<#O z&poIuIodPFC1O}CuUuRl`lHx+gtXEB&lNi}5oRFY7kmHd@3Z6EIA#-H322;<*;{Z{ zg49~x>XfRlhgVi8KiZrypuy0&)uiv3EN)?e4oB&c1JIDvT{JQ;j-&K%nw) z(Xtm+vEC+9b0@;jA1KCF9$`6+%1PpPH`2x0DO6_8&zv7|a+8bJi!P zK8sZ%?w-$vL*HFn*bOeDgz{44tF`Q11~5f{5MM7SWH?D~P2&oQGIoPA}sgMfI$e-86b;Cm8YXk3OGhn55gZ>Cp4Z+&~{#JJzAh3+j@11ZyXkXz+D^y8dY zHx=0*Fnl#wI15xsa>(?WL9)&HN>3I_f?V$^_^F7)YNQI#ibU@t53Gy6J0HIQ2eY%? z<1sew)bOFT{lQ+Wxc zF}n!9N^OCJ!tdiZF5JoQbYHJk^h@8TZJPfRYrkjde~-2Q6Qa2`yM%sL(puUKeN21U z;YoxCC9{yq*4?Mw5_=LQMuO9 zYKJ*tK(HMuG3;7PBBzrVyU9PwgRzmC{9R)ekXTb;E5Z^9RvAaPNBCrBn7mrrh` z94B+}Z#B+;ORD}`QuV*BE-r9r_WAn6OLBR*;#!t&qu~VrbWBr-p?-gk=w6cD3Crg~ zApkl>k0hkYMU!zFxB1nQ>pcQowUC$RpDvl=04)dISbqR0+O$P)onVSg7;u;z{q{%> z2H;1iM2yfqtEGCgtn6i#$LUVEC0319QRmmk>hu{>0K{W?C=Hol`Hp?-)l2@!p(SIN z&4T+kZ~=T03BVE>pVou02FDF2X@E<`15~DoB_GbUx>V}-w?f%=bfbl zs4pOm+4&pRck+u2_(3L6VfB}|X2c%|7YEoMaO9}T0i9ww7mubtU^GE+{IMvRGy03) ze!_YXO|SzW;l3}PPqhHQ81hyBuIHc9u7T37NnbV<0XH8SDxlE)D%vq?fv53 zp8$kJ6K;Y_Z)!BB{z6Zlz$pvk0WQpq69xNK=3fxd-=NIjD9yjHi8$aW#hv=XSa7pF z1M0!=RY&v}_|xrIdw=iyfa*3N7vnToLjX20gf@Qc4>l1;Qm+1Lj`*eGdeWI^wE&G8 zl46>kVu(BEq3{&@y=ggnf$N{wm4M?2qakB^C(n`A0Uhl6ZjSwz{KB8o2*9O;Nkvvo zpzoTxmHz;<1OYa2kTe-ZDeK$WIqsC$h- zY0*S4%1)ls2!=po;B!0)u>4A-Yn?!ZJw##PQdqH?JWi|6(ede@As`DnleIo)RuWvm zaBKPG)m$;bv5kwSzDALO;j8`nO4A>-U`H~j((TY{9ET2)`)2-+)FNQG^BhvlC7c5H zo>GzhO|}Dy6riJ7ub{eSL3?N0~_0+3uL zw*uy*$|`z*M}FjI*DpHKWS--Hp3W(mIgMLQkK3La;i_E!M+^xdO5?zIaBdrvXT5K= z+8_*x+-XG=rdI++bT|Dh$=S2dyeDEp)6XOZ-)Zy{ z*B|L+UMNmObYrS*ZKj8Jo8m=Y?%8`T$7rh_3rr95yJ&p8>?~Kj+&|lp@?zlO!<8eq z;Ly;synhTUfHTrfD&SdR^dza{j>CoYDp!}40_%x}PFtG0&qrL|9ONPCEifE}+5ckR z#R!Z)A|JpM=+&HQOU;^C%L>4J!P=K=fs@~RNv;StA06)S)HZLfJ> z6P0C!LG(;_L0Qi?O@^RWMcxxf5u5?imGhu*KG9@?V-k&WTLg_t(z(q;UOvgc957Fv zrUO;p>qx)!mtppQSXs#fL#oa6+RaHRW@hH#@bIZll8(g~(VGf!kAh=jTAE9&-{ny- zoIKC!%c-$GL%bNd^^A-R>$x6gX3hNMiT3zoi*F->{C-t!Pn?HnU~?ClRnk9~xhB~C z)o*&hlE$f{97MmL@2P(CmaM&d#oN;ZJ+?IxfTvVyJF8LJ#QnEB3?B<9Ayr3heA z#~7jKhA4|ouu~wh(jKDi&qo~yq^!lgk~IFyw5A+b#Lcrh4*-)9Arr2MGQSeLfm2-n znVlstzS-g2boTewMruc{{)?-P&dM{~%X!h2QAQD~w>&M?_p1e3SPh}*^yJWM>lj2`Iefr)DgV&MJ z`C{oIuA4g^opij%iIpZ1&PuaqnVTMZ2-UCq7fYed1mc_jG~I;<^y_MMJ`{UyAf~i+ zt5RunO{v0Bl{u81xjTvfyJ2o9yPj}2cAW693SRLJ11(ci8kiBNf$%*1C{-Fv0n1F> zYTX>4^v(9Ak#aEblzC@rp0J~W@Yl%cUYR)SjYB`^S1Jt@#I<8UNn8S%0&Ur(@1 z?WE=AzRcuL(pO^dO8hTgBme6ay~cTl5v~mFnHkkWG6e@4gfPqDmuUv;hbF~+&|xgd z&?jERGTn@Fua*M4J-sf|1XFU)HXkkj_v*fUOCd*g%PkQI3Gj7f+l!-5dp=u%Jp9Mdm9eWqyPOnJd z>~5RIEkjc=KGaR)AJ_boRa2-YejuKR9}B0q2`R#EL6hjm&it7OZ|~zuB1xdqYxgU0 zU2FXD(5Xe^TJ8PY_=IG^bG^Br)jw9;cHUkJVTz}`?@PuS{9+1eo(ufzgtpSJGb`0x zX6CYXo@gMU;9GgjA7n4~vEq@6e5}A70E|RVu2XPMjQn__l&h=rX0EY51Rf>&~Cy)J@6yidKoVOavmiZSIJ77RV3ri~yQ8WQ1E zL63$ne-<&6MlD3|1WMvqpjFTVYG40ZD+FW8OGV2RvirW!k zpkJ3p9^p;wtd6e*PR9lP^dxNdWxpK8Z!_K4!yIzkVQEP1#<7_&-S+SeX5I2gmz5vl zyW529P49MX+ONPzcj(*?WHc*Zd6tVnvu@wH(-@hzEaR&krQIoHIqWivS{7EuIIFr@z@MR-6?eLHd?#`m=CcIT=!)A;1i) zAlvlel7?FCVmPbzM5z&P)4>}Xiyr0Xk3>|H;bg3ajbr#q`LAVIo^$UB*v(0G70EKq zVv+F`(CIdvuAQhz^NB)^Cc;w#sM(3Pa+AmW$%kl9Q!lOE(P% zx+Ihm#Xs2wp*s`k5?_e zm!1aJz%ugTx1OBShGlk+s%EO469LM#X<3eRk9K5;oxE%!l0KpHs8SpIiRcE{iL)>| zeNlR+uSX@u1by$F7gVokJ#cpxSM%1!mR!aAW8F7^vk*f^F^&fqst&Pf=Bt$2&$C7I zxLvcjePuO<%k*7Oh7OvbN62|wx-(J2u&d@GV+tan!hW{P&{{o>O=&h*w#)9p9d3!E z!(8{ljj5FgMNcW^*x~R4gv`aG^(Vy5eAn`_)fV$#VyeB6cS0E5@9u9e^U`y}ch`+) zVG0hr&3Z@FAtj4Li0BtKat3ck-k$y;P;{7!+?A9JaO8{(e`LHxJ}a!ygO0&i!&`jN z(f3}kzBRUDxTsx|txcAqbMh8Xy#?-IVEqsWpS5|O#fc@T&U;JQ%i>USwn!$BuPZ*w z10A~EYKh?1nJ6}Hr+tV@rm{pA>qz?DfObWOEZStsMd>m%N3iBG*UR527_)DUDw4Fo zva%z&dVI!3JJaWm50=Lt8f^$FA*>De#{tm|jTBjHsOIt9@tG^?s$k`RA#FavqX&%1 zh69rT?=v4%9pfM9ck+?Z8)OX^MjPM%E)ew+!l*CnU@~K zU?d8e^tAYB%S~2nblu|_q_|7z+IxM}IR4Gv1}7X@(Ib=eMeEF&BD;CDwHYj3NN;9e zgW%L1g*#8L!`mz39=&N2exI4q7-j#+^61RIMONhpX3jDD`heK2+UFp?4P}cJOev__ zS-oZvwN_6jSG1X<4c8U0EpL{Dst%cDXlCZPHmZtV_wq%15|R%XfAm7GMsb<-JU5Cq zhAvaBc(~G*Kr!9zL-bII7~Q+1S4x6DWDk0fKYe3$^=tFV=f27d?7(Qbz!I~#Hpwyp zM4o#pJxh$TqaMy-;EPzGoNTI@ZYj%S$q5}S{PbvRTPj5(ue-C~>g`_7$gPLYeHIkl zb2R%?lV8~@?gPfY4lsE$R*LYIu0BUJK{tg^a~)MNssV0H{-1v+h}hI|7PAw%Dw?5k z?zq31u*~lhxA!GuF{3XIo2Ytw9g+O1Hlc(D;+D495%IB6@mg)Ku?rZ6&UNTurs%>c z{oHc1IPzgrH##W)?s%0*LpHql`?&bfksBW0;k}!#arRByoQv8)u>?qhhWFPl==?Ev z6uyI7w)Ht#phA4&rPRh}I^z(%Q(R8_^$3OLIEH-#v%{ZfY9~ZcM?!PCr@NXQzp6Zw zMqK#gJb9B4bd;vYbe}p292&F@Ez9%Prio3xNvyeLrUJIOTb-FL>+PN_HD~c*RM!~U z-hmD4FLzO3QdtMhBF+{Cm0gu(qQ;`-S0k0{lS*OjfgveG^BIl?Qy{rr$pwm$*Det+f%dMP92Aj_x zHT`3*2*lKJ8$2r5{Np6V&}0Gdl3#cjgm&yoX8SW2Pc!|;T*Uvcu$TM)cpLlgrvI@A z{){t^{J;?4{{MXN^562Uf47;I&rrz-o@k9my{|}XhF-x1szWf*rx9$6bseUE+3(); z0v_Q`9UaJnHQ(fv6qyXAl-uq{2ej0ub%ar8hsfXv;<(V{g$#dI3jeqRQ0U+a%LjoCFI^!&vc`N^_B6MA1C5Xf^oQDl{>8tH{A!--zr`HX3xCVIbz1vPB+!Q!vYG$r(=w zbZ0)pTMGuLoxvt%TSPjytn93(xrtW(Pvz4GQ)LFpYj;RfYUNN;le=4y+lJVq_(ePX zHW59xoaeeZ$Sq3d=OYK{SbzH;?dO$V_mmKKeY%9{0E4CJ4k^3OmYts4(dq`f#hhdM zXH33bbl&uCr8IM3{i~zyC83Azok|0F^GuC~9$G`FZ@}YeHBiy_#nt)anUC@v=hHD z2pi*1R%+xno9nP^X*X8&WX)8OVz|&(FGrUp6O|p2LxYwHqHk2(_bT!Ckse$0T3v~q zsj#p7nX%}&!4x#cLwhKwtqXN&H!XL&0{`^gz@F6X%W8CsIJ6+T#6L~0pp@3=BR>i^ zz8WsQwYUYmg|!%1kXj5C%d=ONv0g|a$+_MP=1nt{-#sYR3r%%4lBm;g^X`28_>ww;YBTQ=aPHJx@&YFe7UmA^`EUHcTom7=E-~ZZWC8C7ST^$L$bC zw~A0!<)-A2><4x<;Z>s^XOw3yojP@CUPk<}ie#4_g|N~&q8WpvyLv5O*a43*{9t!2 zdd3bPv09pXm6mAlsGjwq`>2wP(2nnQcC{W|8~smX_I`A(JWqlNu74lrx83>fKZ5N$ zU<9ec1cvt&`&-Q$Uu-6fuW_(zrxq?|O3p;{KuvPhkIaykysk`4@-d%jb(VuYWy72I zEGvsNPe}w5$`+*hr>R=Y#@H`f4k>k4?s14V0-`zv|2ZySN zMqxWzT#(P6xe1!i)${nc&bRU=m$|JKD)?h3L&94vpP`ohr*2NqbSBwbv|5(5`K&*O zMTdto=K4FLsE-OC24TA|5!3P0S4#zi3k#J-UGh9LJGi@v8vls07|6FPGwCn!=BJ)B zsVwW9!bbXMCU<+ubDC}{0P~L+%xA=+i$5@-EBc^2|#3#nFbfwLDw;5qJXt< z9FqdA>CpGe7y5D8>gZXl9hC32OOADl&*O80?3-bWQ*MHGYoVdcI!aKk^J-4)-}7|rOU(uDeKYzw)4#QVVJgk2$QUTGX1Z4dXRAx<7c!@KJxoI73wu*TXU)&qhzN(pVaW8xAa`b3 zCVj^-qd#T8b3=@QOm*fQK8iSY+^8kWd|IF)mp$8JiItOlR_MEJZA3Aqqn^$d(pCMP zD#x5YXi1hy&yQ=`laQN9#J7-5g3@bi5~K{*5EN-`{H2nr6@|g8&2$j0wY9L!*V76j zu^jS;aYh=R6 zDQ|Q)K+Z356N5p#hoG6Q=L;1(jL)f7edD8DKN4rwD)c7xqO^iW9${pv=6veYB%h#~Y-mTK#QQ=v%+2{T_Nx+; ztz#u^-ZQG!mhiHymt92PpmPFtCI;k+n5^`w^4&f2_7deH1qR6qW8OPXr@puPxp(y_ zEKG5z429p*{Q3Iq&?{blt;&J#ifs4vhM{|?oMTC{`?^NNs%ulN=DgfyHj~)zZbD_V z6p)7mT9j|IXRAvi+oRxBJ35>hS}FNiT4lPGTw|HjnAoJY+k@Dzxs|3o*1WPQKICa- zy8B$_OJa!JZK18{(nxdXIbN+{PPebZiC$cz(N3gZyF`L=kiNvj-Ol89=Xr>}5@kO) zW47NG|Ez*{kf)ZZ`0KJagc1GbDz?+j5hz-fbgZuV(kGKFMuq(vT1pe2Qs`4| zv+Sb@m4{Dd`>F%OQ*%on(`^6n>YDk+!itxzP-{xc;8@hcwO$j%Ak`YF-S1w16>+HF ztmaHd&bd7mVRc)+PF+`!AN_cjcYrW_7eW(x}S@=hbV!$8=dHh zxpQhYm6ki3GfrunfvU`cwhfsZ z{p5aZ{RXX%t)2izFKFsf8aK<(HhngEP~BJ8FVNu-SPk{+LgJewDT_apqm{} zCFJ61FD-3y#eaDsEHu+wG#Sai(Osko^gt~O5v(zqw}s_{v>|#Z zjo4gU_k{C~0`d59PXcQ07i`(B^_nbt6@T?hi*i*)38Dw9m2|3sb}rr|9Yo0QbqHQ+ zT<5a;%Xk@7MF8!Y^uvA1cvO22Z7J>C5S^)z?ThC-xBl7un8W5n!?VbmL0;mKO(vEF z!jqHT`tGWCkK{G@y_$1d%cReYRf9UKEbLWcYVJW*rRNJOwYbF6UWwI)kdelhnyLil zxK~;#sh!`L)n~G0y{E$UbN=?&CMPCgzR@lr-MhC^6?u^V(z#TztKo~!3sR2G!QGW4 z1^+5GR&^cCX}@TO%rP~EIn@v6#JzbEqN)5fOpvNW-}*bQ*|Um32N>7M*^69>*-IP2 zUF{1-f>pA|*;ryyI4iVrSTf<^y(s(yG2O+h{XH|yQD-_gc74Mm)2m=q9G$f;hj6Oo z0+LHwT$EYwHs4kXEuLdhx+spY!@IU;k>MuAuz8RAXhT#)+mmey4liLYf$6@yF*A## zmH%KlXE&a0zwD}@-mG6Za6LWYlK2;~{bc42EOaQ8O^bGCNM^xAMVB|~?a>kj-oCS9 zy!GHFC5x-AD6uAGRLdtqHon8Yb-$;QV>~_fW?qGbAwTeUgX=l6fvbM8fx33)`f(74Ijq4_R`e={9?b7!4ldN0JF$*=cw8I`7IIRYLR{ z-*&d6kJcjNd&f+LkrrRr%F!%$o*yTJi2AV)*RjASwBJ;K#*|M7$E;AwSh{=r(hr1Q zZNnSJOsVA`D{rbkNr^t6eUW(HSgS4|{&f<3)JuEs3jw2lVWvlKB70Jo6gijg?5fo7-O-zHg7rL4VxLv z>a@`jOlpOEZAn~(U4<(PAGPG|Yoskj+uyog07jCWnubcBb zj4phwv{vD~$N&y2=`57EHf{k!=5}gsI$&gHDR1->&K`an5P$0`mc03Zl2F*|)LCmr z+#Z>GQ9@b5*-imiFa?$LHfoc9&6I1hOukBqAoBJQ{pRb&4m#K!Z8&4Zss^Llt5YYn zjCw^W4Y}-UB*DwmEgY*azv)hXhDoj|1xm1?IkA$cC`YOl^^xlCy<#p2d4^UkE+?)5 zZ&jh#zSj5QCW|u#?Uai-S}9!=5F?QBjprsHiLy?8R>bPc@r*BiQP6&XYtXsOP9TXr zswu-X1tVa0!7Vk&4I};02Ynd=B}`qI^Nb4K4I_CIwH3pn4vo&ow3TDDx)FBDoJI%Y zET_&$NcgjrmtGJQGPu67OL#DzZ)GNH3y>JiX@CtzyLw~ZRtEJ!jdB{_6_-QJ$vnD&h@T1JYeUr;~ zxnAW^DU#w*NMNh?)3AY%7$lNJu%}MGJ?mrN^lj*q>AnsGLpXxI$DVSs&o5v}N8p@$ zmMa>0?BP#Yx0a<}cr<^&>2UNa8klVHI9WZ)EP4;of)<^R@OLeRua#P z&qa6Q_HKb(Cu3TiQffqW`AB$s@Iqm@Kcg7p8Rr?dYw$h3X0wpfNs6%8V|K1U^_kPw zju-v*D|NSHR>h>{#%Z?dq_5$Z*Gqa9r5~ob3Sg++;^H!YqSjW(`#f`mI{V%}H|pHs z`=lL9#if-o@ZfFYc=waO#JckvEA&?jtaySJ<|i_P1|3R~+|@FWWM|q|`tDGu|CnTy z!CKV&4QZZEjv4A?FOu_0N)~m4aTWWEPD$+A9r7+Mdf#VqD_l!D%ypbk#9l Y$L%Wu%d{=mPk}!f33>4xv6t`u2hKW(r2qf` literal 0 HcmV?d00001 From 6b733d1b3190827df71ee651509fbe591155d412 Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Tue, 28 May 2024 07:07:06 -0500 Subject: [PATCH 4/7] Address review comments. Signed-off-by: Revital Sur --- .../kfp_v1/superworkflow_code_sample_wf.py | 43 +++++-------------- .../kfp_v1/superworkflow_dedups_sample_wf.py | 17 ++------ 2 files changed, 14 insertions(+), 46 deletions(-) diff --git a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py index 2327e9d1c..29368a478 100644 --- a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py @@ -7,13 +7,13 @@ # Components # For every sub workflow we need a separate components, that knows about this subworkflow. component_spec_path = "../../../kfp_ray_components/" -run_code_quality_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_malware_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_proglang_select_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_doc_id_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_exact_dedup_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_fuzzy_dedup_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") -run_tokenization_op = comp.load_component_from_file(component_spec_path+"executeSubWorkflowComponent.yaml") +run_code_quality_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_malware_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_proglang_select_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_doc_id_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_exact_dedup_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_fuzzy_dedup_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") +run_tokenization_op = comp.load_component_from_file(component_spec_path + "executeSubWorkflowComponent.yaml") proglang_select_image = "quay.io/dataprep1/data-prep-kit/proglang_select:0.3.0" code_quality_image = "quay.io/dataprep1/data-prep-kit/code_quality:0.3.0" @@ -48,15 +48,14 @@ def sample_code_ray_orchestrator( p2_pipeline_additional_params: str = '{"wait_interval": 2, "wait_cluster_ready_tmout": 400, "wait_cluster_up_tmout": 300, "wait_job_ready_tmout": 400, "wait_print_tmout": 30, "http_retries": 5}', p2_pipeline_data_s3_access_secret: str = "s3-secret", p2_pipeline_runtime_code_location: str = '{"github": "github", "commit_hash": "12345", "path": "path"}', + p2_pipeline_runtime_actor_options: str = '{"num_cpus": 0.8}', + p2_pipeline_data_max_files: int = -1, + p2_pipeline_data_num_samples: int = -1, # Exact dedup step parameters p3_name: str = "ededup", p3_skip: bool = False, p3_ededup_doc_column: str = "contents", p3_ededup_hash_cpu: float = 0.5, - p3_runtime_actor_options: str = '{"num_cpus": 0.8}', - # data access. - p3_data_max_files: int = -1, - p3_data_num_samples: int = -1, # data sampling p3_ededup_n_samples: int = 10, # overriding parameters @@ -68,11 +67,6 @@ def sample_code_ray_orchestrator( # Document ID step parameters p4_name: str = "doc_id", p4_skip: bool = False, - # data access. - p4_data_max_files: int = -1, - p4_data_num_samples: int = -1, - # orchestrator - p4_runtime_actor_options: str = '{"num_cpus": 0.8}', # doc id parameters p4_doc_id_doc_column: str = "contents", p4_doc_id_hash_column: str = "hash_column", @@ -91,10 +85,6 @@ def sample_code_ray_orchestrator( p5_fdedup_id_column: str = "int_id_column", p5_fdedup_cluster_column: str = "cluster", # orchestrator - p5_runtime_actor_options: str = '{"num_cpus": 0.8}', - # data access. checkpointing is not supported by dedup - p5_data_num_samples: int = -1, - p5_data_max_files: int = -1, # infrastructure p5_fdedup_bucket_cpu: float = 0.5, p5_fdedup_doc_cpu: float = 0.5, @@ -124,11 +114,6 @@ def sample_code_ray_orchestrator( p6_proglang_select_allowed_langs_file: str = "test/proglang_select/languages/allowed-code-languages.txt", p6_proglang_select_language_column: str = "programming_language", p6_proglang_select_s3_access_secret: str = "s3-secret", - # data access. - p6_data_max_files: int = -1, - p6_data_num_samples: int = -1, - # orchestrator - p6_runtime_actor_options: str = '{"num_cpus": 0.8}', # overriding parameters p6_overriding_params: str = '{"ray_worker_options": {"image": "' + proglang_select_image @@ -142,11 +127,7 @@ def sample_code_ray_orchestrator( p7_cq_language_column_name: str = "programming_language", p7_cq_tokenizer: str = "codeparrot/codeparrot", p7_cq_hf_token: str = "None", - # data access. - p7_data_max_files: int = -1, - p7_data_num_samples: int = -1, # orchestrator - p7_runtime_actor_options: str = '{"num_cpus": 0.8}', # overriding parameters p7_overriding_params: str = '{"ray_worker_options": {"image": "' + code_quality_image @@ -159,10 +140,6 @@ def sample_code_ray_orchestrator( p8_malware_input_column: str = "contents", p8_malware_output_column: str = "virus_detection", # orchestrator - p8_runtime_actor_options: str = '{"num_cpus": 0.8}', - # data access. - p8_data_max_files: int = -1, - p8_data_num_samples: int = -1, # overriding parameters p8_overriding_params: str = '{"ray_worker_options": {"image": "' + malware_image diff --git a/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py index 134890460..f63bb0638 100644 --- a/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py @@ -36,14 +36,14 @@ def sample_ray_orchestrator( p2_pipeline_additional_params: str = '{"wait_interval": 2, "wait_cluster_ready_tmout": 400, "wait_cluster_up_tmout": 300, "wait_job_ready_tmout": 400, "wait_print_tmout": 30, "http_retries": 5}', p2_pipeline_data_s3_access_secret: str = "s3-secret", p2_pipeline_runtime_code_location: str = '{"github": "github", "commit_hash": "12345", "path": "path"}', + p2_pipeline_runtime_actor_options: str = '{"num_cpus": 0.8}', + # data access. + p2_pipeline_data_max_files: int = -1, + p2_pipeline_data_num_samples: int = -1, # Document ID step parameters p3_name: str = "doc_id", p3_skip: bool = False, - # data access. - p3_data_max_files: int = -1, - p3_data_num_samples: int = -1, # orchestrator - p3_runtime_actor_options: str = '{"num_cpus": 0.8}', # doc id parameters p3_doc_id_doc_column: str = "contents", p3_doc_id_hash_column: str = "hash_column", @@ -59,10 +59,6 @@ def sample_ray_orchestrator( p4_skip: bool = False, p4_ededup_doc_column: str = "contents", p4_ededup_hash_cpu: float = 0.5, - p4_runtime_actor_options: str = '{"num_cpus": 0.8}', - # data access. - p4_data_max_files: int = -1, - p4_data_num_samples: int = -1, # data sampling p4_ededup_n_samples: int = 10, # overriding parameters @@ -78,11 +74,6 @@ def sample_ray_orchestrator( p5_fdedup_doc_column: str = "contents", p5_fdedup_id_column: str = "int_id_column", p5_fdedup_cluster_column: str = "cluster", - # orchestrator - p5_runtime_actor_options: str = '{"num_cpus": 0.8}', - # data access. checkpointing is not supported by dedup - p5_data_num_samples: int = -1, - p5_data_max_files: int = -1, # infrastructure p5_fdedup_bucket_cpu: float = 0.5, p5_fdedup_doc_cpu: float = 0.5, From 7e821f999a772fe2a20260e156894c4b8bfbab0c Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Wed, 29 May 2024 20:42:17 +0300 Subject: [PATCH 5/7] Address review comments. Signed-off-by: Revital Sur --- kfp/doc/multi_transform_pipeline.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kfp/doc/multi_transform_pipeline.md b/kfp/doc/multi_transform_pipeline.md index df651b123..1fd17ad90 100644 --- a/kfp/doc/multi_transform_pipeline.md +++ b/kfp/doc/multi_transform_pipeline.md @@ -27,10 +27,10 @@ In the list of its input parameters, we also see `data_s3_config`. Now, we have The sections that follow display two super pipelines as examples: -1) [dedups super pipeline](#De-dups-super-pipeline) -1) [programming language super pipeline](#programming-languages-super-pipeline) +1) [dedups super pipeline](#dedups) +1) [programming language super pipeline](#code) -### Dedups super pipeline +### Dedups super pipeline This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can be found in [superworkflow_dedups_sample_wf.py](../superworkflows/ray/kfp_v1/superworkflow_dedups_sample_wf.py). @@ -38,9 +38,9 @@ This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can The input parameters of the super pipelines are described in this [section](#super-pipeline-Input-Parameters). -### Programming languages Super pipeline +### Programming languages Super pipeline -This pipeline combines several programming-languages transforms: `ededup`, `doc_id`, `fdedup`, `proglang_select`, `code_quality`, `malware` and `tokenization`. It can be found in [superworkflow_code_wf.py](../superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py). +This pipeline combines transforms for programming languages data preprocessing: `ededup`, `doc_id`, `fdedup`, `proglang_select`, `code_quality`, `malware` and `tokenization`. It can be found in [superworkflow_code_wf.py](../superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py). ![super pipeline](super-code-pipeline.png) From f88cfa580161a3990404824a82cabd2453fa726a Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Wed, 29 May 2024 20:53:08 +0300 Subject: [PATCH 6/7] More fixes. Signed-off-by: Revital Sur --- kfp/doc/multi_transform_pipeline.md | 2 +- kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kfp/doc/multi_transform_pipeline.md b/kfp/doc/multi_transform_pipeline.md index 1fd17ad90..331e4c411 100644 --- a/kfp/doc/multi_transform_pipeline.md +++ b/kfp/doc/multi_transform_pipeline.md @@ -38,7 +38,7 @@ This pipeline combines several transforms, `doc_id`, `ededup`, and `fdedup`, can The input parameters of the super pipelines are described in this [section](#super-pipeline-Input-Parameters). -### Programming languages Super pipeline +### Programming languages super pipeline This pipeline combines transforms for programming languages data preprocessing: `ededup`, `doc_id`, `fdedup`, `proglang_select`, `code_quality`, `malware` and `tokenization`. It can be found in [superworkflow_code_wf.py](../superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py). diff --git a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py index 29368a478..05a97df92 100644 --- a/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py +++ b/kfp/superworkflows/ray/kfp_v1/superworkflow_code_sample_wf.py @@ -26,8 +26,8 @@ # Pipeline to invoke execution on remote resource @dsl.pipeline( - name="sample-super-kubeflow-pipeline", - description="Pipeline to show how to run combine several transformer pipelines", + name="super-kubeflow-pipeline-code", + description="Super pipeline for programming languages data preprocessing", ) def sample_code_ray_orchestrator( # the super pipeline parameters From 3945dbd9f3daa6683676b4fe48503bca0e19e087 Mon Sep 17 00:00:00 2001 From: Revital Sur Date: Wed, 29 May 2024 20:56:40 +0300 Subject: [PATCH 7/7] Minor fix. Signed-off-by: Revital Sur --- kfp/doc/multi_transform_pipeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfp/doc/multi_transform_pipeline.md b/kfp/doc/multi_transform_pipeline.md index 331e4c411..a9364137b 100644 --- a/kfp/doc/multi_transform_pipeline.md +++ b/kfp/doc/multi_transform_pipeline.md @@ -28,7 +28,7 @@ In the list of its input parameters, we also see `data_s3_config`. Now, we have The sections that follow display two super pipelines as examples: 1) [dedups super pipeline](#dedups) -1) [programming language super pipeline](#code) +1) [programming languages super pipeline](#code) ### Dedups super pipeline