mirror of
https://github.com/GoogleCloudPlatform/vertex-ai-samples.git
synced 2026-09-26 14:42:04 +00:00
Reduces the max_steps parameter + Textual content updates and fixes (#2168)
* fix: issue 2125 * removes duplicate parameters, reduces max_steps to 100, fixes grammar and updates realted to the writing guidelines * removes f from the string parameter * ran linter test * sets max_steps to 20 and adds lines in the cleanup step to remove the pipeline jobs * ran linter test --------- Co-authored-by: Andrew Ferlitsch <aferlitsch@google.com>
This commit is contained in:
co-authored by
Andrew Ferlitsch
parent
06926f8318
commit
07ec84687e
@@ -53,6 +53,17 @@
|
||||
"<br/><br/><br/>\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "962e636b5cee"
|
||||
},
|
||||
"source": [
|
||||
"**_NOTE_**: This notebook has been tested in the following environment:\n",
|
||||
"\n",
|
||||
"* Python version = 3.9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
@@ -74,7 +85,7 @@
|
||||
"source": [
|
||||
"### Objective\n",
|
||||
"\n",
|
||||
"In this tutorial, you learn how to create two classification models using Vertex AI TabNet Tabular Workflows. Each workflow is a managed instance of [Vertex AI Pipelines](https://cloud.google.com/vertex-ai/docs/pipelines/introduction).\n",
|
||||
"In this tutorial, you learn how to create classification models on tabular data using two of the Vertex AI TabNet Tabular Workflows. Each workflow is a managed instance of [Vertex AI Pipelines](https://cloud.google.com/vertex-ai/docs/pipelines/introduction).\n",
|
||||
"\n",
|
||||
"This tutorial uses the following Google Cloud ML services and resources:\n",
|
||||
"\n",
|
||||
@@ -98,8 +109,10 @@
|
||||
"source": [
|
||||
"### Dataset\n",
|
||||
"\n",
|
||||
"The dataset you will be using is [Bank Marketing](https://archive.ics.uci.edu/ml/datasets/bank+marketing).\n",
|
||||
"The data is for direct marketing campaigns (phone calls) of a Portuguese banking institution. The binary classification goal is to predict if a client subscribe a term deposit. For this notebook, you randomly selected 90% of the rows in the original dataset and saved them in a train.csv file hosted on Cloud Storage. To download the file, click [here](https://storage.googleapis.com/cloud-samples-data-us-central1/vertex-ai/tabular-workflows/datasets/bank-marketing/train.csv)."
|
||||
"The dataset you use in this notebook is the [Bank Marketing](https://archive.ics.uci.edu/ml/datasets/bank+marketing) dataset.\n",
|
||||
"It consists of data related to direct marketing campaigns (phone calls) of a Portuguese banking institution. The objective of the binary classification task in this notebook is to predict if a client subscribes to a term deposit or not. \n",
|
||||
"\n",
|
||||
"For this notebook, a subset of randomly selected rows that makes 90% of the original dataset was saved to `train.csv` file and hosted on Cloud Storage. To download the file, click [here](https://storage.googleapis.com/cloud-samples-data-us-central1/vertex-ai/tabular-workflows/datasets/bank-marketing/train.csv)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -141,7 +154,8 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"! pip3 install --upgrade --quiet google-cloud-aiplatform google-cloud-pipeline-components"
|
||||
"! pip3 install --upgrade --quiet google-cloud-aiplatform \\\n",
|
||||
" google-cloud-pipeline-components"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -239,37 +253,6 @@
|
||||
"REGION = \"us-central1\" # @param {type: \"string\"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "timestamp"
|
||||
},
|
||||
"source": [
|
||||
"#### UUID\n",
|
||||
"\n",
|
||||
"If you are in a live tutorial session, you might be using a shared test account or project. To avoid name collisions between users on resources created, you create a uuid for each instance session, and append it onto the name of resources you create in this tutorial."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "84Vdv7R-QEH6"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import random\n",
|
||||
"import string\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Generate a uuid of a specifed length(default=8)\n",
|
||||
"def generate_uuid(length: int = 8) -> str:\n",
|
||||
" return \"\".join(random.choices(string.ascii_lowercase + string.digits, k=length))\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"UUID = generate_uuid()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
@@ -353,7 +336,7 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"BUCKET_URI = \"gs://your-bucket-name-unique\" # @param {type:\"string\"}"
|
||||
"BUCKET_URI = f\"gs://your-bucket-name-{PROJECT_ID}-unique\" # @param {type:\"string\"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -373,7 +356,7 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"! gsutil mb -l $REGION -p $PROJECT_ID $BUCKET_URI"
|
||||
"! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -382,7 +365,7 @@
|
||||
"id": "zebLBGXOky2A"
|
||||
},
|
||||
"source": [
|
||||
"## Notes about service account and permission\n",
|
||||
"### Notes about service account and permission\n",
|
||||
"\n",
|
||||
"**By default no configuration is required**, if you run into any permission related issue, please make sure the service accounts have the required roles listed in the [Service accounts for Tabular Workflow for TabNet, and Tabular Workflow for Wide & Deep, and Prophet documentation](https://cloud.google.com/vertex-ai/docs/tabular-data/tabular-workflows/service-accounts#fte-workflow)."
|
||||
]
|
||||
@@ -467,7 +450,7 @@
|
||||
"id": "fbbc3479a1da"
|
||||
},
|
||||
"source": [
|
||||
"## Import libraries and define constants"
|
||||
"### Import libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -480,11 +463,10 @@
|
||||
"source": [
|
||||
"# Import required modules\n",
|
||||
"import os\n",
|
||||
"import uuid\n",
|
||||
"from typing import Any, Dict, List\n",
|
||||
"\n",
|
||||
"from google.cloud import aiplatform, storage\n",
|
||||
"from google_cloud_pipeline_components.experimental.automl.tabular import \\\n",
|
||||
"from google_cloud_pipeline_components.preview.automl.tabular import \\\n",
|
||||
" utils as automl_tabular_utils"
|
||||
]
|
||||
},
|
||||
@@ -494,7 +476,7 @@
|
||||
"id": "c0423f260423"
|
||||
},
|
||||
"source": [
|
||||
"## Initialize Vertex AI SDK for Python\n",
|
||||
"### Initialize Vertex AI SDK for Python\n",
|
||||
"\n",
|
||||
"Initialize the Vertex AI SDK for Python for your project."
|
||||
]
|
||||
@@ -516,17 +498,17 @@
|
||||
"id": "3LWH3PRF5o2v"
|
||||
},
|
||||
"source": [
|
||||
"### Define helper functions\n",
|
||||
"## Define helper functions\n",
|
||||
"Define the following helper functions:\n",
|
||||
"\n",
|
||||
"- `get_model_artifacts_path`: Get the model artifacts path from task details.\n",
|
||||
"- `get_model_uri`: Get the model uri from the task details..\n",
|
||||
"- `get_bucket_name_and_path`: Get the bucket name and path.\n",
|
||||
"- `download_from_gcs`: Download the content from the bucket.\n",
|
||||
"- `write_to_gcs`: Upload content into the bucket.\n",
|
||||
"- `get_task_detail`: Get the task details by using task name.\n",
|
||||
"- `get_model_name`: Get the model name from pipeline job ID.\n",
|
||||
"- `get_evaluation_metrics`: Get the evaluation metrics from pipeline task details.\n"
|
||||
"- `get_model_artifacts_path`: Gets the model artifacts path from task details.\n",
|
||||
"- `get_model_uri`: Gets the model uri from the task details.\n",
|
||||
"- `get_bucket_name_and_path`: Gets the bucket name and path.\n",
|
||||
"- `download_from_gcs`: Downloads the content from the bucket.\n",
|
||||
"- `write_to_gcs`: Uploads content into the bucket.\n",
|
||||
"- `get_task_detail`: Gets the task details by using task name.\n",
|
||||
"- `get_model_name`: Gets the model name from pipeline job ID.\n",
|
||||
"- `get_evaluation_metrics`: Gets the evaluation metrics from pipeline task details.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -538,6 +520,8 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Get the model artifacts path from task details.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def get_model_artifacts_path(task_details: List[Dict[str, Any]], task_name: str) -> str:\n",
|
||||
" task = get_task_detail(task_details, task_name)\n",
|
||||
" return task.outputs[\"unmanaged_container_model\"].artifacts[0].uri\n",
|
||||
@@ -604,27 +588,27 @@
|
||||
" )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "gvNFMRmBegZq"
|
||||
},
|
||||
"source": [
|
||||
"## Define the training specification"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "7a7332a3f8e2"
|
||||
},
|
||||
"source": [
|
||||
"## Define training specifications\n",
|
||||
"\n",
|
||||
"Before creating the training job, you create the below steps in this section:\n",
|
||||
"\n",
|
||||
"1. Configure the source dataset.\n",
|
||||
"2. Configure the feature transformation process.\n",
|
||||
"3. Configure the feature selection process.\n",
|
||||
"4. Set up the parameters needed for running the training process.\n",
|
||||
"\n",
|
||||
"### Configure the dataset\n",
|
||||
"\n",
|
||||
"You define either of the following parameters:\n",
|
||||
"\n",
|
||||
"- `data_source_csv_filenames`: The CSV data source.\n",
|
||||
"- `data_source_bigquery_table_path`: The BigQuery data source.\n",
|
||||
"- `data_source_csv_filenames`: The CSV data source. You specify the Cloud Storage path to the `train.csv` file described in the dataset section.\n",
|
||||
"- `data_source_bigquery_table_path`: The BigQuery data source. As you use the Cloud Storage source, this is kept as none.\n",
|
||||
"\n",
|
||||
"***Notes***: Please note that the dataset's location has to be the same as the same as the service location (i.e., `REGION`) set for launching the training pipeline.\n"
|
||||
]
|
||||
@@ -653,18 +637,18 @@
|
||||
"\n",
|
||||
"Transformations can be specified using Feature Transform Engine (FTE) specific configurations. FTE supports both TensorFlow-based row-level and BigQuery-based dataset-level transformations.\n",
|
||||
"\n",
|
||||
"* TensorFlow-based row-level transformations:\n",
|
||||
"* **TensorFlow-based row-level transformations**:\n",
|
||||
" * Full automatic transformations: FTE automatically configures a set of built-in transformations for each input column based on its data statistics. This can be set via `tf_auto_transform_features` in the training pipeline.\n",
|
||||
" * Fully specified transformations: All transformations on input columns are explicitly specified with FTE's built-in transformations. Chaining of multiple transformations on a single column is also supported. These transformations can be saved to JSON configuration file and specified via `tf_transformations_path` argument of the training pipeline.\n",
|
||||
" * Custom transformations: Custom, bring-your-own transform function, where you can define and import your own transform function and use it with other FTE's built-in transformations. You can specify custom transformations as an array of JSON object and pass through the `tf_custom_transformation_definitions` argument of the training pipeline.\n",
|
||||
"\n",
|
||||
"* BigQuery-based dataset-level transformations:\n",
|
||||
"* **BigQuery-based dataset-level transformations**:\n",
|
||||
" * Fully specified transformations: All transformations on input columns are explicitly specified with FTE's built-in transformations. These transformations can be specified as an array of JSON objects via `dataset_level_transformations` argument of the training pipeline.\n",
|
||||
" * Custom transformations: Custom, bring-your-own transform function, where you can define and import your own transform function and use it with other FTE's built-in transformations. You can specify custom transformations as an array of JSON object and pass through the `dataset_level_custom_transformation_definitions` argument of the training pipeline.\n",
|
||||
"\n",
|
||||
"Below, you configure full automatic transformations by specifying a list of input features to pass to the `tf_auto_transform_features` argument of the training pipeline.\n",
|
||||
"\n",
|
||||
"For a complete list of supported feature transformation configurations and examples, please go [here](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.31/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.FeatureTransformEngineOp)."
|
||||
"Learn more about [feature transformation configurations](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.31/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.FeatureTransformEngineOp)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -707,9 +691,9 @@
|
||||
"\n",
|
||||
"To enable it, you need to set `run_feature_selection` to True.\n",
|
||||
"\n",
|
||||
"To configure the algorihtm to use, and number of features to be selected, you need to configure both `feature_selection_algorithm` and `max_selected_features` parameter.\n",
|
||||
"To configure the algorihtm to use, and number of features to be selected, you need to configure both `feature_selection_algorithm` and `max_selected_features` parameters.\n",
|
||||
"\n",
|
||||
"For a complete list of supported feature selection algorithms and configurations, please go [here](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.31/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.FeatureTransformEngineOp)."
|
||||
"Learn more about [feature selection algorithms and configurations](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.31/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.FeatureTransformEngineOp)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -735,7 +719,7 @@
|
||||
"source": [
|
||||
"### Setup training configuration\n",
|
||||
"\n",
|
||||
"You define the following:\n",
|
||||
"Now, you define the following parameters for training:\n",
|
||||
"\n",
|
||||
"- `target_column`: The target column name.\n",
|
||||
"- `prediction_type`: The type of prediction the model is to produce.\n",
|
||||
@@ -769,9 +753,6 @@
|
||||
"\n",
|
||||
"timestamp_split_key = None # timestamp column name when using timestamp split\n",
|
||||
"stratified_split_key = None # target column name when using stratified split\n",
|
||||
"training_fraction = 0.8\n",
|
||||
"validation_fraction = 0.1\n",
|
||||
"test_fraction = 0.1\n",
|
||||
"\n",
|
||||
"predefined_split_key = None\n",
|
||||
"if predefined_split_key:\n",
|
||||
@@ -788,26 +769,26 @@
|
||||
"id": "zyWGg2s09xOk"
|
||||
},
|
||||
"source": [
|
||||
"## VPC related config\n",
|
||||
"## Setup VPC configuration for Dataflow\n",
|
||||
"\n",
|
||||
"You define the following:\n",
|
||||
"In this section, you define the following parameters:\n",
|
||||
"\n",
|
||||
"- `dataflow_subnetwork`: Dataflow's fully qualified subnetwork name, when empty the default subnetwork will be used. Example:\n",
|
||||
"https://cloud.google.com/dataflow/docs/guides/specifying-networks#example_network_and_subnetwork_specifications\n",
|
||||
"- `dataflow_subnetwork`: Dataflow's fully qualified subnetwork name, when empty the default subnetwork is used. See an [example](\n",
|
||||
"https://cloud.google.com/dataflow/docs/guides/specifying-networks#example_network_and_subnetwork_specifications).\n",
|
||||
"- `dataflow_use_public_ips`: Specifies whether Dataflow workers use public IP\n",
|
||||
" addresses.\n",
|
||||
"\n",
|
||||
"If you need to use a custom Dataflow subnetwork, you can set it through the `dataflow_subnetwork` parameter. The requirements are:\n",
|
||||
"1. `dataflow_subnetwork` must be fully qualified subnetwork name.\n",
|
||||
"1. `dataflow_subnetwork` must be a fully qualified subnetwork name.\n",
|
||||
" [[reference](https://cloud.google.com/dataflow/docs/guides/specifying-networks#example_network_and_subnetwork_specifications)]\n",
|
||||
"1. The following service accounts must have [Compute Network User role](https://cloud.google.com/compute/docs/access/iam#compute.networkUser) assigned on the specified dataflow subnetwork [[reference](https://cloud.google.com/dataflow/docs/guides/specifying-networks#shared)]:\n",
|
||||
" 1. Compute Engine default service account: PROJECT_NUMBER-compute@developer.gserviceaccount.com\n",
|
||||
" 1. Dataflow service account: service-PROJECT_NUMBER@dataflow-service-producer-prod.iam.gserviceaccount.com\n",
|
||||
"\n",
|
||||
"If your project has VPC-SC enabled, please make sure:\n",
|
||||
"If your project has VPC-SC enabled, please make sure of the following:\n",
|
||||
"\n",
|
||||
"1. The dataflow subnetwork used in VPC-SC is configured properly for Dataflow.\n",
|
||||
" [[reference](https://cloud.google.com/dataflow/docs/guides/routes-firewall)]\n",
|
||||
" See [reference](https://cloud.google.com/dataflow/docs/guides/routes-firewall).\n",
|
||||
"1. `dataflow_use_public_ips` is set to False.\n"
|
||||
]
|
||||
},
|
||||
@@ -831,17 +812,19 @@
|
||||
"source": [
|
||||
"## Customize TabNet CustomJob configuration and create pipeline\n",
|
||||
"\n",
|
||||
"This is best choice if you know exactly which hyperparameter values to use for model training. It uses fewer training resources than a HyperparameterTuningJob.\n",
|
||||
"Creating a TabNet CustomJob is the best choice if you know exactly which hyperparameter values to use for model training. It uses fewer training resources than a HyperparameterTuningJob.\n",
|
||||
"\n",
|
||||
"In the example below, you configure the following:\n",
|
||||
"In the example below, you configure the following key parameters:\n",
|
||||
"\n",
|
||||
"- `root_dir`: The root GCS directory for the pipeline components.\n",
|
||||
"- `worker_pool_specs_override`: The dictionary for overriding training and evaluation worker pool specs. The dictionary should be of [this format]( https://github.com/googleapis/googleapis/blob/4e836c7c257e3e20b1de14d470993a2b1f4736a8/google/cloud/aiplatform/v1beta1/custom_job.proto#L172). TabNet supports both CPU and GPU training.\n",
|
||||
"- `worker_pool_specs_override`: The dictionary for overriding training and evaluation worker pool specs. The dictionary should follow a [particular format]( https://github.com/googleapis/googleapis/blob/4e836c7c257e3e20b1de14d470993a2b1f4736a8/google/cloud/aiplatform/v1beta1/custom_job.proto#L172). TabNet supports training using both CPUs and GPUs.\n",
|
||||
"- `learning_rate`: The learning rate used by the linear optimizer.\n",
|
||||
"- `max_steps`: Number of steps to run the trainer for.\n",
|
||||
"- `max_train_secs`: Amount of time in seconds to run the trainer for.\n",
|
||||
"\n",
|
||||
"A complete list of pipeline inputs and model hyperparameters is available [here](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_trainer_pipeline_and_parameters)."
|
||||
"Learn more about [pipeline inputs and model hyperparameters](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_trainer_pipeline_and_parameters).\n",
|
||||
"\n",
|
||||
"Learn more about the parameters needed for [creating a pipeline job](https://cloud.google.com/vertex-ai/docs/pipelines/run-pipeline#create_a_pipeline_run)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -852,20 +835,22 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# set a unique display name for your pipeline\n",
|
||||
"pipeline_job_id = \"tabnet-unique\" # @param {type: \"string\"}\n",
|
||||
"# set the root dir\n",
|
||||
"pipeline_job_root_dir = os.path.join(BUCKET_URI, \"tabnet_custom_job\")\n",
|
||||
"\n",
|
||||
"# max_steps and/or max_train_secs must be set. If both are\n",
|
||||
"# specified, training stop after either condition is met.\n",
|
||||
"# By default, max_train_secs is set to -1.\n",
|
||||
"\n",
|
||||
"max_steps = 1000\n",
|
||||
"max_train_secs = -1\n",
|
||||
"\n",
|
||||
"learning_rate = 0.01\n",
|
||||
"\n",
|
||||
"# set the worker pool specs\n",
|
||||
"worker_pool_specs_override = [\n",
|
||||
" {\"machine_spec\": {\"machine_type\": \"c2-standard-16\"}} # Override for TF chief node\n",
|
||||
"]\n",
|
||||
"# set the learning rate\n",
|
||||
"learning_rate = 0.01\n",
|
||||
"# max_steps and/or max_train_secs must be set. If both are\n",
|
||||
"# specified, training stop after either condition is met.\n",
|
||||
"# By default, max_train_secs is set to -1.\n",
|
||||
"max_steps = 20\n",
|
||||
"\n",
|
||||
"max_train_secs = -1\n",
|
||||
"\n",
|
||||
"# To test GPU training, the worker_pool_specs_override can be specified like this.\n",
|
||||
"# worker_pool_specs_override = [\n",
|
||||
@@ -877,6 +862,7 @@
|
||||
"# }\n",
|
||||
"# ]\n",
|
||||
"\n",
|
||||
"# define the pipeline\n",
|
||||
"# If your system does not use Python, you can save the JSON file (`template_path`),\n",
|
||||
"# and use another programming language to submit the pipeline.\n",
|
||||
"(\n",
|
||||
@@ -906,10 +892,8 @@
|
||||
" run_evaluation=run_evaluation,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"pipeline_job_id = f\"tabnet-{uuid.uuid4()}\"\n",
|
||||
"# More info on parameters PipelineJob accepts:\n",
|
||||
"# https://cloud.google.com/vertex-ai/docs/pipelines/run-pipeline#create_a_pipeline_run\n",
|
||||
"pipeline_job = aiplatform.PipelineJob(\n",
|
||||
"# create the pipeline job\n",
|
||||
"training_pipeline_job = aiplatform.PipelineJob(\n",
|
||||
" display_name=pipeline_job_id,\n",
|
||||
" template_path=template_path,\n",
|
||||
" job_id=pipeline_job_id,\n",
|
||||
@@ -918,7 +902,8 @@
|
||||
" enable_caching=False,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"pipeline_job.run(service_account=SERVICE_ACCOUNT)"
|
||||
"# run the pipeline\n",
|
||||
"training_pipeline_job.run(service_account=SERVICE_ACCOUNT)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -928,7 +913,8 @@
|
||||
},
|
||||
"source": [
|
||||
"### Go to the Vertex Model UI\n",
|
||||
"From the link below, you can deploy the model and test online prediction or run batch prediction."
|
||||
"\n",
|
||||
"Through the link generated from the below cell, you can deploy the model and run online prediction or batch prediction."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -958,14 +944,20 @@
|
||||
"source": [
|
||||
"## Customize TabNet HyperparameterTuningJob configuration and create pipeline\n",
|
||||
"\n",
|
||||
"To get the best set of hyperparameters for your dataset, it is recommended to run a HyperparameterTuningJob.\n",
|
||||
"To get the best set of hyperparameters on your dataset, it is recommended to run a HyperparameterTuningJob.\n",
|
||||
"\n",
|
||||
"Hyperparameters that can be tuned are set in the optional `study_spec_parameters_override` parameter. you provide a helper function called `get_tabnet_study_spec_parameters_override` to get these hyperparameters. You provide `dataset_size_bucket` (one of 'small' (< 1M rows), 'medium' (1M - 100M rows), or 'large' (> 100M rows)), `training_budget_bucket` (one of 'small' (< \\\\$600), 'medium' (\\\\$600 - \\\\$2400), or 'large' (> \\\\$2400)), and `prediction_type` and Vertex AI returns a list of hyperparameters and ranges. `study_spec_parameters_override` can be empty or one or more of these hyperparameters can be specified. For hyperparameters not specified in `study_spec_parameters_override`, you set ranges in the pipeline. For a full list of hyperparameters available for tuning, see [here](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_trainer_pipeline_and_parameters).\n",
|
||||
"Hyperparameters that can be tuned are set with the optional `study_spec_parameters_override` parameter. You provide a helper function named `get_tabnet_study_spec_parameters_override` to get these hyperparameters. To this helper function, you provide:\n",
|
||||
"\n",
|
||||
"In addition to hyperparameters, HyperparameterTuningJob takes the following values in the example below:\n",
|
||||
"- `dataset_size_bucket`: one of 'small' (< 1M rows), 'medium' (1M - 100M rows), or 'large' (> 100M rows)).\n",
|
||||
"- `training_budget_bucket`: one of 'small' (< \\\\$600), 'medium' (\\\\$600 - \\\\$2400), or 'large' (> \\\\$2400)).\n",
|
||||
"- `prediction_type`: The type of prediction the model is to produce. “classification” or “regression”.\n",
|
||||
"\n",
|
||||
"Then, you get the list of hyperparameters and ranges. `study_spec_parameters_override` can be empty or one or more of the above hyperparameters can be specified. For hyperparameters not specified, you can set their ranges in the pipeline. Learn more about the [hyperparameters available for tuning](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_trainer_pipeline_and_parameters).\n",
|
||||
"\n",
|
||||
"In addition to hyperparameters, HyperparameterTuningJob takes the following values:\n",
|
||||
"\n",
|
||||
"- `root_dir`: The root GCS directory for the pipeline components.\n",
|
||||
"- `worker_pool_specs_override`: The dictionary for overriding training and evaluation worker pool specs. The dictionary should be of [this format]( https://github.com/googleapis/googleapis/blob/4e836c7c257e3e20b1de14d470993a2b1f4736a8/google/cloud/aiplatform/v1beta1/custom_job.proto#L172). TabNet supports both CPU and GPU training.\n",
|
||||
"- `worker_pool_specs_override`: The dictionary for overriding training and evaluation worker pool specs. The dictionary should follow a [particular format]( https://github.com/googleapis/googleapis/blob/4e836c7c257e3e20b1de14d470993a2b1f4736a8/google/cloud/aiplatform/v1beta1/custom_job.proto#L172). TabNet supports training using both CPUs and GPUs.\n",
|
||||
"- `study_spec_metric_id`: Metric to optimize, possible values: ['loss', 'average_loss', 'rmse', 'mae', 'mql', 'accuracy', 'auc', 'precision', 'recall'].\n",
|
||||
"- `study_spec_metric_goal`: Optimization goal of the metric, possible values: \"MAXIMIZE\", \"MINIMIZE\".\n",
|
||||
"- `max_trial_count`: The desired total number of trials.\n",
|
||||
@@ -974,9 +966,9 @@
|
||||
"- `study_spec_algorithm`: The search algorithm specified for the study. One of\n",
|
||||
"'ALGORITHM_UNSPECIFIED', 'GRID_SEARCH', or 'RANDOM_SEARCH'.\n",
|
||||
"\n",
|
||||
"For a full list of HyperparameterTuningJob parameters, see [here](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_hyperparameter_tuning_job_pipeline_and_parameters).\n",
|
||||
"Learno more about the [HyperparameterTuningJob parameters](https://google-cloud-pipeline-components.readthedocs.io/en/google-cloud-pipeline-components-1.0.23/google_cloud_pipeline_components.experimental.automl.tabular.html#google_cloud_pipeline_components.experimental.automl.tabular.utils.get_tabnet_hyperparameter_tuning_job_pipeline_and_parameters).\n",
|
||||
"\n",
|
||||
"Multiple trials can be configured. The pipeline returns the best trial based on the metric configured in `study_spec_metrics`. In the example below, you return the trial with the lowest loss value."
|
||||
"Multiple trials can be configured. The pipeline returns the best trial based on the metric specified in `study_spec_metrics`. In the example below, you return the trial with the lowest loss value."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -987,11 +979,18 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# set a unique display name for pipeline\n",
|
||||
"pipeline_job_id = \"tabnet-hpt-unique\" # @param {type: \"string\"}\n",
|
||||
"# set the root dir\n",
|
||||
"pipeline_job_root_dir = os.path.join(BUCKET_URI, \"tabnet_hyperparameter_tuning_job\")\n",
|
||||
"\n",
|
||||
"# set the worker pool specs\n",
|
||||
"worker_pool_specs_override = [\n",
|
||||
" {\"machine_spec\": {\"machine_type\": \"c2-standard-16\"}} # Override for TF chief node\n",
|
||||
"]\n",
|
||||
"# set the metric\n",
|
||||
"study_spec_metric_id = \"loss\"\n",
|
||||
"# set the objective for metric\n",
|
||||
"study_spec_metric_goal = \"MINIMIZE\"\n",
|
||||
"\n",
|
||||
"# To test GPU training, the worker_pool_specs_override can be specified like this.\n",
|
||||
"# worker_pool_specs_override = [\n",
|
||||
@@ -1004,9 +1003,8 @@
|
||||
"# }\n",
|
||||
"# ]\n",
|
||||
"\n",
|
||||
"study_spec_metric_id = \"loss\"\n",
|
||||
"study_spec_metric_goal = \"MINIMIZE\"\n",
|
||||
"\n",
|
||||
"# define the component to get the hyperparameters\n",
|
||||
"# max_steps and/or max_train_secs must be set. If both are\n",
|
||||
"# specified, training stop after either condition is met.\n",
|
||||
"# By default, max_train_secs is set to -1 and max_steps is set to\n",
|
||||
@@ -1019,6 +1017,7 @@
|
||||
" )\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"# define the hyperparameter tuning pipeline\n",
|
||||
"# If your system does not use Python, you can save the JSON file (`template_path`),\n",
|
||||
"# and use another programming language to submit the pipeline.\n",
|
||||
"(\n",
|
||||
@@ -1051,10 +1050,8 @@
|
||||
" run_evaluation=True,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"pipeline_job_id = f\"tabnet-hpt-{uuid.uuid4()}\"\n",
|
||||
"# More info on parameters PipelineJob accepts:\n",
|
||||
"# https://cloud.google.com/vertex-ai/docs/pipelines/run-pipeline#create_a_pipeline_run\n",
|
||||
"pipeline_job = aiplatform.PipelineJob(\n",
|
||||
"# create the pipeline job\n",
|
||||
"tuning_pipeline_job = aiplatform.PipelineJob(\n",
|
||||
" display_name=pipeline_job_id,\n",
|
||||
" template_path=template_path,\n",
|
||||
" job_id=pipeline_job_id,\n",
|
||||
@@ -1063,7 +1060,8 @@
|
||||
" enable_caching=False,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"pipeline_job.run(service_account=SERVICE_ACCOUNT)"
|
||||
"# run the pipeline job\n",
|
||||
"tuning_pipeline_job.run(service_account=SERVICE_ACCOUNT)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1073,7 +1071,8 @@
|
||||
},
|
||||
"source": [
|
||||
"### Go to the Vertex Model UI\n",
|
||||
"From the link below, you can deploy the model and test online prediction or run batch prediction."
|
||||
"\n",
|
||||
"Through the link generated from the below cell, you can deploy the model and run online prediction or batch prediction."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1111,9 +1110,11 @@
|
||||
"\n",
|
||||
"Otherwise, you can delete the individual resources you created in this tutorial:\n",
|
||||
"\n",
|
||||
"- Cloud Storage Bucket\n",
|
||||
"- Pipeline from CustomJob pipeline\n",
|
||||
"- Pipeline from HyperparameterTuningJob pipeline\n",
|
||||
"- Model from CustomJob pipeline\n",
|
||||
"- Model from HyperparameterTuningJob pipeline"
|
||||
"- Model from HyperparameterTuningJob pipeline\n",
|
||||
"- Cloud Storage Bucket (set `delete_bucket` to True to delete the bucket)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1124,6 +1125,12 @@
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Delete the training pipeline job\n",
|
||||
"training_pipeline_job.delete()\n",
|
||||
"\n",
|
||||
"# Delete the tuning pipeline job\n",
|
||||
"tuning_pipeline_job.delete()\n",
|
||||
"\n",
|
||||
"# Delete model resources\n",
|
||||
"custom_job_model = aiplatform.Model(CUSTOM_JOB_MODEL)\n",
|
||||
"hpt_job_model = aiplatform.Model(HPT_JOB_MODEL)\n",
|
||||
|
||||
Reference in New Issue
Block a user