: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(self, 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(self)

      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(self, 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(self)

      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(self, 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(self)

      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(self, 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(self, 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.



