:py:mod:`airflow.providers.google.cloud.operators.vertex_ai.custom_job`
=======================================================================

.. py:module:: airflow.providers.google.cloud.operators.vertex_ai.custom_job

.. autoapi-nested-parse::

   This module contains Google Vertex AI operators.



Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.vertex_ai.custom_job.CustomTrainingJobBaseOperator
   airflow.providers.google.cloud.operators.vertex_ai.custom_job.CreateCustomContainerTrainingJobOperator
   airflow.providers.google.cloud.operators.vertex_ai.custom_job.CreateCustomPythonPackageTrainingJobOperator
   airflow.providers.google.cloud.operators.vertex_ai.custom_job.CreateCustomTrainingJobOperator
   airflow.providers.google.cloud.operators.vertex_ai.custom_job.DeleteCustomTrainingJobOperator
   airflow.providers.google.cloud.operators.vertex_ai.custom_job.ListCustomTrainingJobOperator




.. py:class:: CustomTrainingJobBaseOperator(*, project_id, region, display_name, container_uri, model_serving_container_image_uri = None, model_serving_container_predict_route = None, model_serving_container_health_route = None, model_serving_container_command = None, model_serving_container_args = None, model_serving_container_environment_variables = None, model_serving_container_ports = None, model_description = None, model_instance_schema_uri = None, model_parameters_schema_uri = None, model_prediction_schema_uri = None, labels = None, training_encryption_spec_key_name = None, model_encryption_spec_key_name = None, staging_bucket = None, dataset_id = None, annotation_schema_uri = None, model_display_name = None, model_labels = None, base_output_dir = None, service_account = None, network = None, bigquery_destination = None, args = None, environment_variables = None, replica_count = 1, machine_type = 'n1-standard-4', accelerator_type = 'ACCELERATOR_TYPE_UNSPECIFIED', accelerator_count = 0, boot_disk_type = 'pd-ssd', boot_disk_size_gb = 100, training_fraction_split = None, validation_fraction_split = None, test_fraction_split = None, training_filter_split = None, validation_filter_split = None, test_filter_split = None, predefined_split_column_name = None, timestamp_split_column_name = None, tensorboard = None, sync=True, gcp_conn_id = 'google_cloud_default', delegate_to = None, impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   The base class for operators that launch Custom jobs on VertexAI.


.. py:class:: CreateCustomContainerTrainingJobOperator(*, command = [], **kwargs)

   Bases: :py:obj:`CustomTrainingJobBaseOperator`

   Create Custom Container Training job

   :param project_id: Required. The ID of the Google Cloud project that the service belongs to.
   :param region: Required. The ID of the Google Cloud region that the service belongs to.
   :param display_name: Required. The user-defined name of this TrainingPipeline.
   :param command: The command to be invoked when the container is started.
       It overrides the entrypoint instruction in Dockerfile when provided
   :param container_uri: Required: Uri of the training container image in the GCR.
   :param model_serving_container_image_uri: If the training produces a managed Vertex AI Model, the URI
       of the Model serving container suitable for serving the model produced by the
       training script.
   :param model_serving_container_predict_route: If the training produces a managed Vertex AI Model, An
       HTTP path to send prediction requests to the container, and which must be supported
       by it. If not specified a default HTTP path will be used by Vertex AI.
   :param model_serving_container_health_route: If the training produces a managed Vertex AI Model, an
       HTTP path to send health check requests to the container, and which must be supported
       by it. If not specified a standard HTTP path will be used by AI Platform.
   :param model_serving_container_command: The command with which the container is run. Not executed
       within a shell. The Docker image's ENTRYPOINT is used if this is not provided.
       Variable references $(VAR_NAME) are expanded using the container's
       environment. If a variable cannot be resolved, the reference in the
       input string will be unchanged. The $(VAR_NAME) syntax can be escaped
       with a double $$, ie: $$(VAR_NAME). Escaped references will never be
       expanded, regardless of whether the variable exists or not.
   :param model_serving_container_args: The arguments to the command. The Docker image's CMD is used if
       this is not provided. Variable references $(VAR_NAME) are expanded using the
       container's environment. If a variable cannot be resolved, the reference
       in the input string will be unchanged. The $(VAR_NAME) syntax can be
       escaped with a double $$, ie: $$(VAR_NAME). Escaped references will
       never be expanded, regardless of whether the variable exists or not.
   :param model_serving_container_environment_variables: The environment variables that are to be
       present in the container. Should be a dictionary where keys are environment variable names
       and values are environment variable values for those names.
   :param model_serving_container_ports: Declaration of ports that are exposed by the container. This
       field is primarily informational, it gives Vertex AI information about the
       network connections the container uses. Listing or not a port here has
       no impact on whether the port is actually exposed, any port listening on
       the default "0.0.0.0" address inside a container will be accessible from
       the network.
   :param model_description: The description of the Model.
   :param model_instance_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single instance, which
           are used in
           ``PredictRequest.instances``,
           ``ExplainRequest.instances``
           and
           ``BatchPredictionJob.input_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param model_parameters_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the parameters of prediction and
           explanation via
           ``PredictRequest.parameters``,
           ``ExplainRequest.parameters``
           and
           ``BatchPredictionJob.model_parameters``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform, if no parameters are supported it is set to an
           empty string. Note: The URI given on output will be
           immutable and probably different, including the URI scheme,
           than the one given on input. The output URI will point to a
           location where the user only has a read access.
   :param model_prediction_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single prediction
           produced by this Model, which are returned via
           ``PredictResponse.predictions``,
           ``ExplainResponse.explanations``,
           and
           ``BatchPredictionJob.output_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param project_id: Project to run training in.
   :param region: Location to run training in.
   :param labels: Optional. The labels with user-defined metadata to
           organize TrainingPipelines.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param training_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the training pipeline. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, this TrainingPipeline will be secured by this key.

           Note: Model trained by this TrainingPipeline is also secured
           by this key if ``model_to_upload`` is not set separately.
   :param model_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the model. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, the trained Model will be secured by this key.
   :param staging_bucket: Bucket used to stage source and training artifacts.
   :param dataset: Vertex AI to fit this training against.
   :param annotation_schema_uri: Google Cloud Storage URI points to a YAML file describing
       annotation schema. The schema is defined as an OpenAPI 3.0.2
       [Schema Object]
       (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schema-object)

       Only Annotations that both match this schema and belong to
       DataItems not ignored by the split method are used in
       respectively training, validation or test role, depending on
       the role of the DataItem they are on.

       When used in conjunction with
       ``annotations_filter``,
       the Annotations used for training are filtered by both
       ``annotations_filter``
       and
       ``annotation_schema_uri``.
   :param model_display_name: If the script produces a managed Vertex AI Model. The display name of
           the Model. The name can be up to 128 characters long and can be consist
           of any UTF-8 characters.

           If not provided upon creation, the job's display_name is used.
   :param model_labels: Optional. The labels with user-defined metadata to
           organize your Models.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param base_output_dir: GCS output directory of job. If not provided a timestamped directory in the
       staging directory will be used.

       Vertex AI sets the following environment variables when it runs your training code:

       -  AIP_MODEL_DIR: a Cloud Storage URI of a directory intended for saving model artifacts,
           i.e. <base_output_dir>/model/
       -  AIP_CHECKPOINT_DIR: a Cloud Storage URI of a directory intended for saving checkpoints,
           i.e. <base_output_dir>/checkpoints/
       -  AIP_TENSORBOARD_LOG_DIR: a Cloud Storage URI of a directory intended for saving TensorBoard
           logs, i.e. <base_output_dir>/logs/
   :param service_account: Specifies the service account for workload run-as account.
           Users submitting jobs must have act-as permission on this run-as account.
   :param network: The full name of the Compute Engine network to which the job
           should be peered.
           Private services access must already be configured for the network.
           If left unspecified, the job is not peered with any network.
   :param bigquery_destination: Provide this field if `dataset` is a BiqQuery dataset.
           The BigQuery project location where the training data is to
           be written to. In the given project a new dataset is created
           with name
           ``dataset_<dataset-id>_<annotation-type>_<timestamp-of-training-call>``
           where timestamp is in YYYY_MM_DDThh_mm_ss_sssZ format. All
           training input data will be written into that dataset. In
           the dataset three tables will be created, ``training``,
           ``validation`` and ``test``.

           -  AIP_DATA_FORMAT = "bigquery".
           -  AIP_TRAINING_DATA_URI ="bigquery_destination.dataset_*.training"
           -  AIP_VALIDATION_DATA_URI = "bigquery_destination.dataset_*.validation"
           -  AIP_TEST_DATA_URI = "bigquery_destination.dataset_*.test"
   :param args: Command line arguments to be passed to the Python script.
   :param environment_variables: Environment variables to be passed to the container.
           Should be a dictionary where keys are environment variable names
           and values are environment variable values for those names.
           At most 10 environment variables can be specified.
           The Name of the environment variable must be unique.
   :param replica_count: The number of worker replicas. If replica count = 1 then one chief
           replica will be provisioned. If replica_count > 1 the remainder will be
           provisioned as a worker replica pool.
   :param machine_type: The type of machine to use for training.
   :param accelerator_type: Hardware accelerator type. One of ACCELERATOR_TYPE_UNSPECIFIED,
           NVIDIA_TESLA_K80, NVIDIA_TESLA_P100, NVIDIA_TESLA_V100, NVIDIA_TESLA_P4,
           NVIDIA_TESLA_T4
   :param accelerator_count: The number of accelerators to attach to a worker replica.
   :param boot_disk_type: Type of the boot disk, default is `pd-ssd`.
           Valid values: `pd-ssd` (Persistent Disk Solid State Drive) or
           `pd-standard` (Persistent Disk Hard Disk Drive).
   :param boot_disk_size_gb: Size in GB of the boot disk, default is 100GB.
           boot disk size must be within the range of [100, 64000].
   :param training_fraction_split: Optional. The fraction of the input data that is to be used to train
           the Model. This is ignored if Dataset is not provided.
   :param validation_fraction_split: Optional. The fraction of the input data that is to be used to
       validate the Model. This is ignored if Dataset is not provided.
   :param test_fraction_split: Optional. The fraction of the input data that is to be used to evaluate
           the Model. This is ignored if Dataset is not provided.
   :param training_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to train the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param validation_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to validate the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param test_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to test the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param predefined_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key (either the label's value or
           value in the column) must be one of {``training``,
           ``validation``, ``test``}, and it defines to which set the
           given piece of data is assigned. If for a piece of data the
           key is not present or has an invalid value, that piece is
           ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param timestamp_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key values of the key (the values in
           the column) must be in RFC 3339 `date-time` format, where
           `time-offset` = `"Z"` (e.g. 1985-04-12T23:20:50.52Z). If for a
           piece of data the key is not present or has an invalid value,
           that piece is ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param tensorboard: Optional. The name of a Vertex AI resource to which this CustomJob will upload
           logs. Format:
           ``projects/{project}/locations/{location}/tensorboards/{tensorboard}``
           For more information on configuring your service account please visit:
           https://cloud.google.com/vertex-ai/docs/experiments/tensorboard-training
   :param sync: Whether to execute the AI Platform job synchronously. If False, this method
           will be executed in concurrent Future and any downstream object will
           be immediately returned and synced when the Future has completed.
   :param gcp_conn_id: The connection ID to use connecting to Google Cloud.
   :param delegate_to: The account to impersonate using domain-wide delegation of authority,
       if any. For this to work, the service account making the request must have
       domain-wide delegation enabled.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: = ['region', 'command', 'impersonation_chain']

      

   .. py:attribute:: operator_extra_links
      

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.


   .. py:method:: on_kill()

      Callback called when the operator is killed.
      Cancel any running job.



.. py:class:: CreateCustomPythonPackageTrainingJobOperator(*, python_package_gcs_uri, python_module_name, **kwargs)

   Bases: :py:obj:`CustomTrainingJobBaseOperator`

   Create Custom Python Package Training job

   :param project_id: Required. The ID of the Google Cloud project that the service belongs to.
   :param region: Required. The ID of the Google Cloud region that the service belongs to.
   :param display_name: Required. The user-defined name of this TrainingPipeline.
   :param python_package_gcs_uri: Required: GCS location of the training python package.
   :param python_module_name: Required: The module name of the training python package.
   :param container_uri: Required: Uri of the training container image in the GCR.
   :param model_serving_container_image_uri: If the training produces a managed Vertex AI Model, the URI
       of the Model serving container suitable for serving the model produced by the
       training script.
   :param model_serving_container_predict_route: If the training produces a managed Vertex AI Model, An
       HTTP path to send prediction requests to the container, and which must be supported
       by it. If not specified a default HTTP path will be used by Vertex AI.
   :param model_serving_container_health_route: If the training produces a managed Vertex AI Model, an
       HTTP path to send health check requests to the container, and which must be supported
       by it. If not specified a standard HTTP path will be used by AI Platform.
   :param model_serving_container_command: The command with which the container is run. Not executed
       within a shell. The Docker image's ENTRYPOINT is used if this is not provided.
       Variable references $(VAR_NAME) are expanded using the container's
       environment. If a variable cannot be resolved, the reference in the
       input string will be unchanged. The $(VAR_NAME) syntax can be escaped
       with a double $$, ie: $$(VAR_NAME). Escaped references will never be
       expanded, regardless of whether the variable exists or not.
   :param model_serving_container_args: The arguments to the command. The Docker image's CMD is used if
       this is not provided. Variable references $(VAR_NAME) are expanded using the
       container's environment. If a variable cannot be resolved, the reference
       in the input string will be unchanged. The $(VAR_NAME) syntax can be
       escaped with a double $$, ie: $$(VAR_NAME). Escaped references will
       never be expanded, regardless of whether the variable exists or not.
   :param model_serving_container_environment_variables: The environment variables that are to be
       present in the container. Should be a dictionary where keys are environment variable names
       and values are environment variable values for those names.
   :param model_serving_container_ports: Declaration of ports that are exposed by the container. This
       field is primarily informational, it gives Vertex AI information about the
       network connections the container uses. Listing or not a port here has
       no impact on whether the port is actually exposed, any port listening on
       the default "0.0.0.0" address inside a container will be accessible from
       the network.
   :param model_description: The description of the Model.
   :param model_instance_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single instance, which
           are used in
           ``PredictRequest.instances``,
           ``ExplainRequest.instances``
           and
           ``BatchPredictionJob.input_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param model_parameters_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the parameters of prediction and
           explanation via
           ``PredictRequest.parameters``,
           ``ExplainRequest.parameters``
           and
           ``BatchPredictionJob.model_parameters``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform, if no parameters are supported it is set to an
           empty string. Note: The URI given on output will be
           immutable and probably different, including the URI scheme,
           than the one given on input. The output URI will point to a
           location where the user only has a read access.
   :param model_prediction_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single prediction
           produced by this Model, which are returned via
           ``PredictResponse.predictions``,
           ``ExplainResponse.explanations``,
           and
           ``BatchPredictionJob.output_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param project_id: Project to run training in.
   :param region: Location to run training in.
   :param labels: Optional. The labels with user-defined metadata to
           organize TrainingPipelines.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param training_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the training pipeline. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, this TrainingPipeline will be secured by this key.

           Note: Model trained by this TrainingPipeline is also secured
           by this key if ``model_to_upload`` is not set separately.
   :param model_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the model. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, the trained Model will be secured by this key.
   :param staging_bucket: Bucket used to stage source and training artifacts.
   :param dataset: Vertex AI to fit this training against.
   :param annotation_schema_uri: Google Cloud Storage URI points to a YAML file describing
       annotation schema. The schema is defined as an OpenAPI 3.0.2
       [Schema Object]
       (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schema-object)

       Only Annotations that both match this schema and belong to
       DataItems not ignored by the split method are used in
       respectively training, validation or test role, depending on
       the role of the DataItem they are on.

       When used in conjunction with
       ``annotations_filter``,
       the Annotations used for training are filtered by both
       ``annotations_filter``
       and
       ``annotation_schema_uri``.
   :param model_display_name: If the script produces a managed Vertex AI Model. The display name of
           the Model. The name can be up to 128 characters long and can be consist
           of any UTF-8 characters.

           If not provided upon creation, the job's display_name is used.
   :param model_labels: Optional. The labels with user-defined metadata to
           organize your Models.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param base_output_dir: GCS output directory of job. If not provided a timestamped directory in the
       staging directory will be used.

       Vertex AI sets the following environment variables when it runs your training code:

       -  AIP_MODEL_DIR: a Cloud Storage URI of a directory intended for saving model artifacts,
           i.e. <base_output_dir>/model/
       -  AIP_CHECKPOINT_DIR: a Cloud Storage URI of a directory intended for saving checkpoints,
           i.e. <base_output_dir>/checkpoints/
       -  AIP_TENSORBOARD_LOG_DIR: a Cloud Storage URI of a directory intended for saving TensorBoard
           logs, i.e. <base_output_dir>/logs/
   :param service_account: Specifies the service account for workload run-as account.
           Users submitting jobs must have act-as permission on this run-as account.
   :param network: The full name of the Compute Engine network to which the job
           should be peered.
           Private services access must already be configured for the network.
           If left unspecified, the job is not peered with any network.
   :param bigquery_destination: Provide this field if `dataset` is a BiqQuery dataset.
           The BigQuery project location where the training data is to
           be written to. In the given project a new dataset is created
           with name
           ``dataset_<dataset-id>_<annotation-type>_<timestamp-of-training-call>``
           where timestamp is in YYYY_MM_DDThh_mm_ss_sssZ format. All
           training input data will be written into that dataset. In
           the dataset three tables will be created, ``training``,
           ``validation`` and ``test``.

           -  AIP_DATA_FORMAT = "bigquery".
           -  AIP_TRAINING_DATA_URI ="bigquery_destination.dataset_*.training"
           -  AIP_VALIDATION_DATA_URI = "bigquery_destination.dataset_*.validation"
           -  AIP_TEST_DATA_URI = "bigquery_destination.dataset_*.test"
   :param args: Command line arguments to be passed to the Python script.
   :param environment_variables: Environment variables to be passed to the container.
           Should be a dictionary where keys are environment variable names
           and values are environment variable values for those names.
           At most 10 environment variables can be specified.
           The Name of the environment variable must be unique.
   :param replica_count: The number of worker replicas. If replica count = 1 then one chief
           replica will be provisioned. If replica_count > 1 the remainder will be
           provisioned as a worker replica pool.
   :param machine_type: The type of machine to use for training.
   :param accelerator_type: Hardware accelerator type. One of ACCELERATOR_TYPE_UNSPECIFIED,
           NVIDIA_TESLA_K80, NVIDIA_TESLA_P100, NVIDIA_TESLA_V100, NVIDIA_TESLA_P4,
           NVIDIA_TESLA_T4
   :param accelerator_count: The number of accelerators to attach to a worker replica.
   :param boot_disk_type: Type of the boot disk, default is `pd-ssd`.
           Valid values: `pd-ssd` (Persistent Disk Solid State Drive) or
           `pd-standard` (Persistent Disk Hard Disk Drive).
   :param boot_disk_size_gb: Size in GB of the boot disk, default is 100GB.
           boot disk size must be within the range of [100, 64000].
   :param training_fraction_split: Optional. The fraction of the input data that is to be used to train
           the Model. This is ignored if Dataset is not provided.
   :param validation_fraction_split: Optional. The fraction of the input data that is to be used to
       validate the Model. This is ignored if Dataset is not provided.
   :param test_fraction_split: Optional. The fraction of the input data that is to be used to evaluate
           the Model. This is ignored if Dataset is not provided.
   :param training_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to train the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param validation_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to validate the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param test_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to test the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param predefined_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key (either the label's value or
           value in the column) must be one of {``training``,
           ``validation``, ``test``}, and it defines to which set the
           given piece of data is assigned. If for a piece of data the
           key is not present or has an invalid value, that piece is
           ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param timestamp_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key values of the key (the values in
           the column) must be in RFC 3339 `date-time` format, where
           `time-offset` = `"Z"` (e.g. 1985-04-12T23:20:50.52Z). If for a
           piece of data the key is not present or has an invalid value,
           that piece is ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param tensorboard: Optional. The name of a Vertex AI resource to which this CustomJob will upload
           logs. Format:
           ``projects/{project}/locations/{location}/tensorboards/{tensorboard}``
           For more information on configuring your service account please visit:
           https://cloud.google.com/vertex-ai/docs/experiments/tensorboard-training
   :param sync: Whether to execute the AI Platform job synchronously. If False, this method
           will be executed in concurrent Future and any downstream object will
           be immediately returned and synced when the Future has completed.
   :param gcp_conn_id: The connection ID to use connecting to Google Cloud.
   :param delegate_to: The account to impersonate using domain-wide delegation of authority,
       if any. For this to work, the service account making the request must have
       domain-wide delegation enabled.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: = ['region', 'impersonation_chain']

      

   .. py:attribute:: operator_extra_links
      

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.


   .. py:method:: on_kill()

      Callback called when the operator is killed.
      Cancel any running job.



.. py:class:: CreateCustomTrainingJobOperator(*, script_path, requirements = None, **kwargs)

   Bases: :py:obj:`CustomTrainingJobBaseOperator`

   Create Custom Training job

   :param project_id: Required. The ID of the Google Cloud project that the service belongs to.
   :param region: Required. The ID of the Google Cloud region that the service belongs to.
   :param display_name: Required. The user-defined name of this TrainingPipeline.
   :param script_path: Required. Local path to training script.
   :param container_uri: Required: Uri of the training container image in the GCR.
   :param requirements: List of python packages dependencies of script.
   :param model_serving_container_image_uri: If the training produces a managed Vertex AI Model, the URI
       of the Model serving container suitable for serving the model produced by the
       training script.
   :param model_serving_container_predict_route: If the training produces a managed Vertex AI Model, An
       HTTP path to send prediction requests to the container, and which must be supported
       by it. If not specified a default HTTP path will be used by Vertex AI.
   :param model_serving_container_health_route: If the training produces a managed Vertex AI Model, an
       HTTP path to send health check requests to the container, and which must be supported
       by it. If not specified a standard HTTP path will be used by AI Platform.
   :param model_serving_container_command: The command with which the container is run. Not executed
       within a shell. The Docker image's ENTRYPOINT is used if this is not provided.
       Variable references $(VAR_NAME) are expanded using the container's
       environment. If a variable cannot be resolved, the reference in the
       input string will be unchanged. The $(VAR_NAME) syntax can be escaped
       with a double $$, ie: $$(VAR_NAME). Escaped references will never be
       expanded, regardless of whether the variable exists or not.
   :param model_serving_container_args: The arguments to the command. The Docker image's CMD is used if
       this is not provided. Variable references $(VAR_NAME) are expanded using the
       container's environment. If a variable cannot be resolved, the reference
       in the input string will be unchanged. The $(VAR_NAME) syntax can be
       escaped with a double $$, ie: $$(VAR_NAME). Escaped references will
       never be expanded, regardless of whether the variable exists or not.
   :param model_serving_container_environment_variables: The environment variables that are to be
       present in the container. Should be a dictionary where keys are environment variable names
       and values are environment variable values for those names.
   :param model_serving_container_ports: Declaration of ports that are exposed by the container. This
       field is primarily informational, it gives Vertex AI information about the
       network connections the container uses. Listing or not a port here has
       no impact on whether the port is actually exposed, any port listening on
       the default "0.0.0.0" address inside a container will be accessible from
       the network.
   :param model_description: The description of the Model.
   :param model_instance_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single instance, which
           are used in
           ``PredictRequest.instances``,
           ``ExplainRequest.instances``
           and
           ``BatchPredictionJob.input_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param model_parameters_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the parameters of prediction and
           explanation via
           ``PredictRequest.parameters``,
           ``ExplainRequest.parameters``
           and
           ``BatchPredictionJob.model_parameters``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform, if no parameters are supported it is set to an
           empty string. Note: The URI given on output will be
           immutable and probably different, including the URI scheme,
           than the one given on input. The output URI will point to a
           location where the user only has a read access.
   :param model_prediction_schema_uri: Optional. Points to a YAML file stored on Google Cloud
           Storage describing the format of a single prediction
           produced by this Model, which are returned via
           ``PredictResponse.predictions``,
           ``ExplainResponse.explanations``,
           and
           ``BatchPredictionJob.output_config``.
           The schema is defined as an OpenAPI 3.0.2 `Schema
           Object <https://tinyurl.com/y538mdwt#schema-object>`__.
           AutoML Models always have this field populated by AI
           Platform. Note: The URI given on output will be immutable
           and probably different, including the URI scheme, than the
           one given on input. The output URI will point to a location
           where the user only has a read access.
   :param project_id: Project to run training in.
   :param region: Location to run training in.
   :param labels: Optional. The labels with user-defined metadata to
           organize TrainingPipelines.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param training_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the training pipeline. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, this TrainingPipeline will be secured by this key.

           Note: Model trained by this TrainingPipeline is also secured
           by this key if ``model_to_upload`` is not set separately.
   :param model_encryption_spec_key_name: Optional. The Cloud KMS resource identifier of the customer
           managed encryption key used to protect the model. Has the
           form:
           ``projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key``.
           The key needs to be in the same region as where the compute
           resource is created.

           If set, the trained Model will be secured by this key.
   :param staging_bucket: Bucket used to stage source and training artifacts.
   :param dataset: Vertex AI to fit this training against.
   :param annotation_schema_uri: Google Cloud Storage URI points to a YAML file describing
       annotation schema. The schema is defined as an OpenAPI 3.0.2
       [Schema Object]
       (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.2.md#schema-object)

       Only Annotations that both match this schema and belong to
       DataItems not ignored by the split method are used in
       respectively training, validation or test role, depending on
       the role of the DataItem they are on.

       When used in conjunction with
       ``annotations_filter``,
       the Annotations used for training are filtered by both
       ``annotations_filter``
       and
       ``annotation_schema_uri``.
   :param model_display_name: If the script produces a managed Vertex AI Model. The display name of
           the Model. The name can be up to 128 characters long and can be consist
           of any UTF-8 characters.

           If not provided upon creation, the job's display_name is used.
   :param model_labels: Optional. The labels with user-defined metadata to
           organize your Models.
           Label keys and values can be no longer than 64
           characters, can only
           contain lowercase letters, numeric characters,
           underscores and dashes. International characters
           are allowed.
           See https://goo.gl/xmQnxf for more information
           and examples of labels.
   :param base_output_dir: GCS output directory of job. If not provided a timestamped directory in the
       staging directory will be used.

       Vertex AI sets the following environment variables when it runs your training code:

       -  AIP_MODEL_DIR: a Cloud Storage URI of a directory intended for saving model artifacts,
           i.e. <base_output_dir>/model/
       -  AIP_CHECKPOINT_DIR: a Cloud Storage URI of a directory intended for saving checkpoints,
           i.e. <base_output_dir>/checkpoints/
       -  AIP_TENSORBOARD_LOG_DIR: a Cloud Storage URI of a directory intended for saving TensorBoard
           logs, i.e. <base_output_dir>/logs/
   :param service_account: Specifies the service account for workload run-as account.
           Users submitting jobs must have act-as permission on this run-as account.
   :param network: The full name of the Compute Engine network to which the job
           should be peered.
           Private services access must already be configured for the network.
           If left unspecified, the job is not peered with any network.
   :param bigquery_destination: Provide this field if `dataset` is a BiqQuery dataset.
           The BigQuery project location where the training data is to
           be written to. In the given project a new dataset is created
           with name
           ``dataset_<dataset-id>_<annotation-type>_<timestamp-of-training-call>``
           where timestamp is in YYYY_MM_DDThh_mm_ss_sssZ format. All
           training input data will be written into that dataset. In
           the dataset three tables will be created, ``training``,
           ``validation`` and ``test``.

           -  AIP_DATA_FORMAT = "bigquery".
           -  AIP_TRAINING_DATA_URI ="bigquery_destination.dataset_*.training"
           -  AIP_VALIDATION_DATA_URI = "bigquery_destination.dataset_*.validation"
           -  AIP_TEST_DATA_URI = "bigquery_destination.dataset_*.test"
   :param args: Command line arguments to be passed to the Python script.
   :param environment_variables: Environment variables to be passed to the container.
           Should be a dictionary where keys are environment variable names
           and values are environment variable values for those names.
           At most 10 environment variables can be specified.
           The Name of the environment variable must be unique.
   :param replica_count: The number of worker replicas. If replica count = 1 then one chief
           replica will be provisioned. If replica_count > 1 the remainder will be
           provisioned as a worker replica pool.
   :param machine_type: The type of machine to use for training.
   :param accelerator_type: Hardware accelerator type. One of ACCELERATOR_TYPE_UNSPECIFIED,
           NVIDIA_TESLA_K80, NVIDIA_TESLA_P100, NVIDIA_TESLA_V100, NVIDIA_TESLA_P4,
           NVIDIA_TESLA_T4
   :param accelerator_count: The number of accelerators to attach to a worker replica.
   :param boot_disk_type: Type of the boot disk, default is `pd-ssd`.
           Valid values: `pd-ssd` (Persistent Disk Solid State Drive) or
           `pd-standard` (Persistent Disk Hard Disk Drive).
   :param boot_disk_size_gb: Size in GB of the boot disk, default is 100GB.
           boot disk size must be within the range of [100, 64000].
   :param training_fraction_split: Optional. The fraction of the input data that is to be used to train
           the Model. This is ignored if Dataset is not provided.
   :param validation_fraction_split: Optional. The fraction of the input data that is to be used to
       validate the Model. This is ignored if Dataset is not provided.
   :param test_fraction_split: Optional. The fraction of the input data that is to be used to evaluate
           the Model. This is ignored if Dataset is not provided.
   :param training_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to train the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param validation_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to validate the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param test_filter_split: Optional. A filter on DataItems of the Dataset. DataItems that match
           this filter are used to test the Model. A filter with same syntax
           as the one used in DatasetService.ListDataItems may be used. If a
           single DataItem is matched by more than one of the FilterSplit filters,
           then it is assigned to the first set that applies to it in the training,
           validation, test order. This is ignored if Dataset is not provided.
   :param predefined_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key (either the label's value or
           value in the column) must be one of {``training``,
           ``validation``, ``test``}, and it defines to which set the
           given piece of data is assigned. If for a piece of data the
           key is not present or has an invalid value, that piece is
           ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param timestamp_split_column_name: Optional. The key is a name of one of the Dataset's data
           columns. The value of the key values of the key (the values in
           the column) must be in RFC 3339 `date-time` format, where
           `time-offset` = `"Z"` (e.g. 1985-04-12T23:20:50.52Z). If for a
           piece of data the key is not present or has an invalid value,
           that piece is ignored by the pipeline.

           Supported only for tabular and time series Datasets.
   :param tensorboard: Optional. The name of a Vertex AI resource to which this CustomJob will upload
           logs. Format:
           ``projects/{project}/locations/{location}/tensorboards/{tensorboard}``
           For more information on configuring your service account please visit:
           https://cloud.google.com/vertex-ai/docs/experiments/tensorboard-training
   :param sync: Whether to execute the AI Platform job synchronously. If False, this method
           will be executed in concurrent Future and any downstream object will
           be immediately returned and synced when the Future has completed.
   :param gcp_conn_id: The connection ID to use connecting to Google Cloud.
   :param delegate_to: The account to impersonate using domain-wide delegation of authority,
       if any. For this to work, the service account making the request must have
       domain-wide delegation enabled.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: = ['region', 'script_path', 'requirements', 'impersonation_chain']

      

   .. py:attribute:: operator_extra_links
      

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.


   .. py:method:: on_kill()

      Callback called when the operator is killed.
      Cancel any running job.



.. py:class:: DeleteCustomTrainingJobOperator(*, training_pipeline_id, custom_job_id, region, project_id, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', delegate_to = None, impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Deletes a CustomTrainingJob, CustomPythonTrainingJob, or CustomContainerTrainingJob.

   :param training_pipeline_id: Required. The name of the TrainingPipeline resource to be deleted.
   :param custom_job_id: Required. The name of the CustomJob to delete.
   :param project_id: Required. The ID of the Google Cloud project that the service belongs to.
   :param region: Required. The ID of the Google Cloud region that the service belongs to.
   :param retry: Designation of what errors, if any, should be retried.
   :param timeout: The timeout for this request.
   :param metadata: Strings which should be sent along with the request as metadata.
   :param gcp_conn_id: The connection ID to use connecting to Google Cloud.
   :param delegate_to: The account to impersonate using domain-wide delegation of authority,
       if any. For this to work, the service account making the request must have
       domain-wide delegation enabled.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: = ['region', 'project_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: ListCustomTrainingJobOperator(*, region, project_id, page_size = None, page_token = None, filter = None, read_mask = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', delegate_to = None, impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Lists CustomTrainingJob, CustomPythonTrainingJob, or CustomContainerTrainingJob in a Location.

   :param project_id: Required. The ID of the Google Cloud project that the service belongs to.
   :param region: Required. The ID of the Google Cloud region that the service belongs to.
   :param filter: Optional. The standard list filter. Supported fields:

       -  ``display_name`` supports = and !=.

       -  ``state`` supports = and !=.

       Some examples of using the filter are:

       -  ``state="PIPELINE_STATE_SUCCEEDED" AND display_name="my_pipeline"``

       -  ``state="PIPELINE_STATE_RUNNING" OR display_name="my_pipeline"``

       -  ``NOT display_name="my_pipeline"``

       -  ``state="PIPELINE_STATE_FAILED"``
   :param page_size: Optional. The standard list page size.
   :param page_token: Optional. The standard list page token. Typically obtained via
       [ListTrainingPipelinesResponse.next_page_token][google.cloud.aiplatform.v1.ListTrainingPipelinesResponse.next_page_token]
       of the previous
       [PipelineService.ListTrainingPipelines][google.cloud.aiplatform.v1.PipelineService.ListTrainingPipelines]
       call.
   :param read_mask: Optional. Mask specifying which fields to read.
   :param retry: Designation of what errors, if any, should be retried.
   :param timeout: The timeout for this request.
   :param metadata: Strings which should be sent along with the request as metadata.
   :param gcp_conn_id: The connection ID to use connecting to Google Cloud.
   :param delegate_to: The account to impersonate using domain-wide delegation of authority,
       if any. For this to work, the service account making the request must have
       domain-wide delegation enabled.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: = ['region', 'project_id', 'impersonation_chain']

      

   .. py:attribute:: operator_extra_links
      

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



