{ "displayName": "img-classification", "labels": { "tfx_py_version": "3-8", "tfx_runner": "kubeflow_v2", "tfx_version": "1-9-0", }, "pipelineSpec": { "components": { "Evaluator": { "executorLabel": "Evaluator_executor", "inputDefinitions": { "artifacts": { "baseline_model": { "artifactType": { "instanceSchema": "title: tfx.Model\ntype: object\n" } }, "examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "model": { "artifactType": { "instanceSchema": "title: tfx.Model\ntype: object\n" } }, }, "parameters": { "eval_config": {"type": "STRING"}, "example_splits": {"type": "STRING"}, "fairness_indicator_thresholds": {"type": "STRING"}, }, }, "outputDefinitions": { "artifacts": { "blessing": { "artifactType": { "instanceSchema": "title: tfx.ModelBlessing\ntype: object\n" } }, "evaluation": { "artifactType": { "instanceSchema": "title: tfx.ModelEvaluation\ntype: object\n" } }, } }, }, "ImportExampleGen": { "executorLabel": "ImportExampleGen_executor", "inputDefinitions": { "parameters": { "input_base": {"type": "STRING"}, "input_config": {"type": "STRING"}, "output_config": {"type": "STRING"}, "output_data_format": {"type": "INT"}, "output_file_format": {"type": "INT"}, } }, "outputDefinitions": { "artifacts": { "examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } } } }, }, "Pusher": { "executorLabel": "Pusher_executor", "inputDefinitions": { "artifacts": { "model": { "artifactType": { "instanceSchema": "title: tfx.Model\ntype: object\n" } }, "model_blessing": { "artifactType": { "instanceSchema": "title: tfx.ModelBlessing\ntype: object\n" } }, }, "parameters": { "custom_config": {"type": "STRING"}, "push_destination": {"type": "STRING"}, }, }, "outputDefinitions": { "artifacts": { "pushed_model": { "artifactType": { "instanceSchema": "title: tfx.PushedModel\ntype: object\n" } } } }, }, "SchemaGen": { "executorLabel": "SchemaGen_executor", "inputDefinitions": { "artifacts": { "statistics": { "artifactType": { "instanceSchema": "title: tfx.ExampleStatistics\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } } }, "parameters": { "exclude_splits": {"type": "STRING"}, "infer_feature_shape": {"type": "INT"}, }, }, "outputDefinitions": { "artifacts": { "schema": { "artifactType": { "instanceSchema": "title: tfx.Schema\ntype: object\n" } } } }, }, "StatisticsGen": { "executorLabel": "StatisticsGen_executor", "inputDefinitions": { "artifacts": { "examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } } }, "parameters": {"exclude_splits": {"type": "STRING"}}, }, "outputDefinitions": { "artifacts": { "statistics": { "artifactType": { "instanceSchema": "title: tfx.ExampleStatistics\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } } } }, }, "Trainer": { "executorLabel": "Trainer_executor", "inputDefinitions": { "artifacts": { "examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "schema": { "artifactType": { "instanceSchema": "title: tfx.Schema\ntype: object\n" } }, "transform_graph": { "artifactType": { "instanceSchema": "title: tfx.TransformGraph\ntype: object\n" } }, }, "parameters": { "custom_config": {"type": "STRING"}, "eval_args": {"type": "STRING"}, "run_fn": {"type": "STRING"}, "train_args": {"type": "STRING"}, }, }, "outputDefinitions": { "artifacts": { "model": { "artifactType": { "instanceSchema": "title: tfx.Model\ntype: object\n" } }, "model_run": { "artifactType": { "instanceSchema": "title: tfx.ModelRun\ntype: object\n" } }, } }, }, "Transform": { "executorLabel": "Transform_executor", "inputDefinitions": { "artifacts": { "examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "schema": { "artifactType": { "instanceSchema": "title: tfx.Schema\ntype: object\n" } }, }, "parameters": { "custom_config": {"type": "STRING"}, "disable_statistics": {"type": "INT"}, "force_tf_compat_v1": {"type": "INT"}, "preprocessing_fn": {"type": "STRING"}, }, }, "outputDefinitions": { "artifacts": { "post_transform_anomalies": { "artifactType": { "instanceSchema": "title: tfx.ExampleAnomalies\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "post_transform_schema": { "artifactType": { "instanceSchema": "title: tfx.Schema\ntype: object\n" } }, "post_transform_stats": { "artifactType": { "instanceSchema": "title: tfx.ExampleStatistics\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "pre_transform_schema": { "artifactType": { "instanceSchema": "title: tfx.Schema\ntype: object\n" } }, "pre_transform_stats": { "artifactType": { "instanceSchema": "title: tfx.ExampleStatistics\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "transform_graph": { "artifactType": { "instanceSchema": "title: tfx.TransformGraph\ntype: object\n" } }, "transformed_examples": { "artifactType": { "instanceSchema": "title: tfx.Examples\ntype: object\nproperties:\n span:\n type: integer\n description: Span for an artifact.\n version:\n type: integer\n description: Version for an artifact.\n split_names:\n type: string\n description: JSON-encoded list of splits for an artifact. Empty string means artifact has no split.\n" } }, "updated_analyzer_cache": { "artifactType": { "instanceSchema": "title: tfx.TransformCache\ntype: object\n" } }, } }, }, "latest_blessed_model_resolver-model-blessing-resolver": { "executorLabel": "latest_blessed_model_resolver-model-blessing-resolver_executor", "outputDefinitions": { "artifacts": { "model_blessing": { "artifactType": { "instanceSchema": "title: tfx.ModelBlessing\ntype: object\n" } } } }, }, "latest_blessed_model_resolver-model-resolver": { "executorLabel": "latest_blessed_model_resolver-model-resolver_executor", "inputDefinitions": { "artifacts": { "input": { "artifactType": { "instanceSchema": "title: tfx.ModelBlessing\ntype: object\n" } } } }, "outputDefinitions": { "artifacts": { "model": { "artifactType": { "instanceSchema": "title: tfx.Model\ntype: object\n" } } } }, }, }, "deploymentSpec": { "executors": { "Evaluator_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.evaluator.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "ImportExampleGen_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.example_gen.import_example_gen.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", "lifecycle": { "preCacheCheck": { "args": ["--json_serialized_invocation_args", "{{$}}"], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.file_based_example_gen.driver", ], } }, } }, "Pusher_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.pusher.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "SchemaGen_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.schema_gen.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "StatisticsGen_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.statistics_gen.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "Trainer_executor": { "container": { "args": [ "--executor_class_path", "tfx.extensions.google_cloud_ai_platform.trainer.executor.GenericExecutor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "Transform_executor": { "container": { "args": [ "--executor_class_path", "tfx.components.transform.executor.Executor", "--json_serialized_invocation_args", "{{$}}", ], "command": [ "python", "-m", "tfx.orchestration.kubeflow.v2.container.kubeflow_v2_run_executor", ], "image": "gcr.io/gcp-ml-172005/img-classification", } }, "latest_blessed_model_resolver-model-blessing-resolver_executor": { "resolver": { "outputArtifactQueries": { "model_blessing": { "filter": 'schema_title="tfx.ModelBlessing" AND state=LIVE AND metadata.blessed.number_value=1' } } } }, "latest_blessed_model_resolver-model-resolver_executor": { "resolver": { "outputArtifactQueries": { "model": { "filter": "schema_title=\"tfx.Model\" AND state=LIVE AND name=\"{{$.inputs.artifacts['input'].metadata['current_model_id']}}\"" } } } }, } }, "pipelineInfo": {"name": "img-classification"}, "root": { "dag": { "tasks": { "Evaluator": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "Evaluator"}, "dependentTasks": [ "Trainer", "Transform", "latest_blessed_model_resolver-model-resolver", ], "inputs": { "artifacts": { "baseline_model": { "taskOutputArtifact": { "outputArtifactKey": "model", "producerTask": "latest_blessed_model_resolver-model-resolver", } }, "examples": { "taskOutputArtifact": { "outputArtifactKey": "transformed_examples", "producerTask": "Transform", } }, "model": { "taskOutputArtifact": { "outputArtifactKey": "model", "producerTask": "Trainer", } }, }, "parameters": { "eval_config": { "runtimeValue": { "constantValue": { "stringValue": '{\n "metrics_specs": [\n {\n "metrics": [\n {\n "class_name": "SparseCategoricalAccuracy",\n "threshold": {\n "change_threshold": {\n "absolute": -0.001,\n "direction": "HIGHER_IS_BETTER"\n },\n "value_threshold": {\n "lower_bound": 0.55\n }\n }\n }\n ]\n }\n ],\n "model_specs": [\n {\n "label_key": "label_xf"\n }\n ],\n "slicing_specs": [\n {}\n ]\n}' } } }, "example_splits": { "runtimeValue": { "constantValue": {"stringValue": "null"} } }, "fairness_indicator_thresholds": { "runtimeValue": { "constantValue": {"stringValue": "null"} } }, }, }, "taskInfo": {"name": "Evaluator"}, }, "ImportExampleGen": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "ImportExampleGen"}, "inputs": { "parameters": { "input_base": { "runtimeValue": { "constantValue": { "stringValue": "gs://gcp-ml-172005-complete-mlops/data/" } } }, "input_config": { "runtimeValue": { "constantValue": { "stringValue": '{\n "splits": [\n {\n "name": "train",\n "pattern": "train/*"\n },\n {\n "name": "eval",\n "pattern": "test/*"\n }\n ]\n}' } } }, "output_config": { "runtimeValue": { "constantValue": {"stringValue": "{}"} } }, "output_data_format": { "runtimeValue": {"constantValue": {"intValue": "6"}} }, "output_file_format": { "runtimeValue": {"constantValue": {"intValue": "5"}} }, } }, "taskInfo": {"name": "ImportExampleGen"}, }, "Pusher": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "Pusher"}, "dependentTasks": ["Evaluator", "Trainer"], "inputs": { "artifacts": { "model": { "taskOutputArtifact": { "outputArtifactKey": "model", "producerTask": "Trainer", } }, "model_blessing": { "taskOutputArtifact": { "outputArtifactKey": "blessing", "producerTask": "Evaluator", } }, }, "parameters": { "custom_config": { "runtimeValue": { "constantValue": {"stringValue": "null"} } }, "push_destination": { "runtimeValue": { "constantValue": { "stringValue": '{\n "filesystem": {\n "base_directory": "gs://gcp-ml-172005-complete-mlops/tfx_pipeline_output/img-classification/serving_model"\n }\n}' } } }, }, }, "taskInfo": {"name": "Pusher"}, }, "SchemaGen": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "SchemaGen"}, "dependentTasks": ["StatisticsGen"], "inputs": { "artifacts": { "statistics": { "taskOutputArtifact": { "outputArtifactKey": "statistics", "producerTask": "StatisticsGen", } } }, "parameters": { "exclude_splits": { "runtimeValue": { "constantValue": {"stringValue": "[]"} } }, "infer_feature_shape": { "runtimeValue": {"constantValue": {"intValue": "1"}} }, }, }, "taskInfo": {"name": "SchemaGen"}, }, "StatisticsGen": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "StatisticsGen"}, "dependentTasks": ["ImportExampleGen"], "inputs": { "artifacts": { "examples": { "taskOutputArtifact": { "outputArtifactKey": "examples", "producerTask": "ImportExampleGen", } } }, "parameters": { "exclude_splits": { "runtimeValue": { "constantValue": {"stringValue": "[]"} } } }, }, "taskInfo": {"name": "StatisticsGen"}, }, "Trainer": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "Trainer"}, "dependentTasks": ["SchemaGen", "Transform"], "inputs": { "artifacts": { "examples": { "taskOutputArtifact": { "outputArtifactKey": "transformed_examples", "producerTask": "Transform", } }, "schema": { "taskOutputArtifact": { "outputArtifactKey": "schema", "producerTask": "SchemaGen", } }, "transform_graph": { "taskOutputArtifact": { "outputArtifactKey": "transform_graph", "producerTask": "Transform", } }, }, "parameters": { "custom_config": { "runtimeValue": { "constantValue": { "stringValue": '{"ai_platform_enable_vertex": true, "ai_platform_training_args": {"project": "gcp-ml-172005", "worker_pool_specs": [{"container_spec": {"image_uri": "gcr.io/tfx-oss-public/tfx:1.9.0"}, "machine_spec": {"accelerator_count": 1, "accelerator_type": "NVIDIA_TESLA_K80", "machine_type": "n1-standard-4"}, "replica_count": 1}]}, "ai_platform_vertex_region": "us-central1-a", "use_gpu": true}' } } }, "eval_args": { "runtimeValue": { "constantValue": { "stringValue": '{\n "num_steps": 4\n}' } } }, "run_fn": { "runtimeValue": { "constantValue": { "stringValue": "models.model.run_fn" } } }, "train_args": { "runtimeValue": { "constantValue": { "stringValue": '{\n "num_steps": 160\n}' } } }, }, }, "taskInfo": {"name": "Trainer"}, }, "Transform": { "cachingOptions": {"enableCache": true}, "componentRef": {"name": "Transform"}, "dependentTasks": ["ImportExampleGen", "SchemaGen"], "inputs": { "artifacts": { "examples": { "taskOutputArtifact": { "outputArtifactKey": "examples", "producerTask": "ImportExampleGen", } }, "schema": { "taskOutputArtifact": { "outputArtifactKey": "schema", "producerTask": "SchemaGen", } }, }, "parameters": { "custom_config": { "runtimeValue": { "constantValue": {"stringValue": "null"} } }, "disable_statistics": { "runtimeValue": {"constantValue": {"intValue": "0"}} }, "force_tf_compat_v1": { "runtimeValue": {"constantValue": {"intValue": "0"}} }, "preprocessing_fn": { "runtimeValue": { "constantValue": { "stringValue": "models.preprocessing.preprocessing_fn" } } }, }, }, "taskInfo": {"name": "Transform"}, }, "latest_blessed_model_resolver-model-blessing-resolver": { "componentRef": { "name": "latest_blessed_model_resolver-model-blessing-resolver" }, "taskInfo": { "name": "latest_blessed_model_resolver-model-blessing-resolver" }, }, "latest_blessed_model_resolver-model-resolver": { "componentRef": { "name": "latest_blessed_model_resolver-model-resolver" }, "inputs": { "artifacts": { "input": { "taskOutputArtifact": { "outputArtifactKey": "model_blessing", "producerTask": "latest_blessed_model_resolver-model-blessing-resolver", } } } }, "taskInfo": { "name": "latest_blessed_model_resolver-model-resolver" }, }, } } }, "schemaVersion": "2.0.0", "sdkVersion": "tfx-1.9.0", }, "runtimeConfig": { "gcsOutputDirectory": "gs://gcp-ml-172005-complete-mlops/tfx_pipeline_output/img-classification" }, }