:py:mod:`airflow.providers.amazon.aws.operators.sagemaker`
==========================================================

.. py:module:: airflow.providers.amazon.aws.operators.sagemaker


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

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.operators.sagemaker.SageMakerBaseOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerProcessingOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerEndpointConfigOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerEndpointOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerTransformOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerTuningOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerModelOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerTrainingOperator
   airflow.providers.amazon.aws.operators.sagemaker.SageMakerDeleteModelOperator



Functions
~~~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.operators.sagemaker.serialize



Attributes
~~~~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.operators.sagemaker.DEFAULT_CONN_ID
   airflow.providers.amazon.aws.operators.sagemaker.CHECK_INTERVAL_SECOND


.. py:data:: DEFAULT_CONN_ID
   :annotation: :str = aws_default

   

.. py:data:: CHECK_INTERVAL_SECOND
   :annotation: :int = 30

   

.. py:function:: serialize(result)


.. py:class:: SageMakerBaseOperator(*, config, **kwargs)

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

   This is the base operator for all SageMaker operators.

   :param config: The configuration necessary to start a training job (templated)

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['config']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = []

      

   .. py:attribute:: template_fields_renderers
      :annotation: :dict

      

   .. py:attribute:: ui_color
      :annotation: :str = #ededed

      

   .. py:attribute:: integer_fields
      :annotation: :list[list[Any]] = []

      

   .. py:method:: parse_integer(config, field)

      Recursive method for parsing string fields holding integer values to integers.


   .. py:method:: parse_config_integers()

      Parse the integer fields to ints in case the config is rendered by Jinja and all fields are str.


   .. py:method:: expand_role()

      Placeholder for calling boto3's `expand_role`, which expands an IAM role name into an ARN.


   .. py:method:: preprocess_config()

      Process the config into a usable form.


   .. py:method:: execute(context)
      :abstractmethod:

      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:: hook()

      Return SageMakerHook.



.. py:class:: SageMakerProcessingOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, wait_for_completion = True, print_log = True, check_interval = CHECK_INTERVAL_SECOND, max_ingestion_time = None, action_if_job_exists = 'increment', **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Use Amazon SageMaker Processing to analyze data and evaluate machine learning
   models on Amazon SageMake. With Processing, you can use a simplified, managed
   experience on SageMaker to run your data processing workloads, such as feature
   engineering, data validation, model evaluation, and model interpretation.

    .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerProcessingOperator`

   :param config: The configuration necessary to start a processing job (templated).
       For details of the configuration parameter see :py:meth:`SageMaker.Client.create_processing_job`
   :param aws_conn_id: The AWS connection ID to use.
   :param wait_for_completion: If wait is set to True, the time interval, in seconds,
       that the operation waits to check the status of the processing job.
   :param print_log: if the operator should print the cloudwatch log during processing
   :param check_interval: if wait is set to be true, this is the time interval
       in seconds which the operator will check the status of the processing job
   :param max_ingestion_time: If wait is set to True, the operation fails if the processing job
       doesn't finish within max_ingestion_time seconds. If you set this parameter to None,
       the operation does not timeout.
   :param action_if_job_exists: Behaviour if the job name already exists. Possible options are "increment"
       (default) and "fail".
   :return Dict: Returns The ARN of the processing job created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerEndpointConfigOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Creates an endpoint configuration that Amazon SageMaker hosting
   services uses to deploy models. In the configuration, you identify
   one or more models, created using the CreateModel API, to deploy and
   the resources that you want Amazon SageMaker to provision.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerEndpointConfigOperator`

   :param config: The configuration necessary to create an endpoint config.

       For details of the configuration parameter see :py:meth:`SageMaker.Client.create_endpoint_config`
   :param aws_conn_id: The AWS connection ID to use.
   :return Dict: Returns The ARN of the endpoint config created in Amazon SageMaker.

   .. 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:: SageMakerEndpointOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, wait_for_completion = True, check_interval = CHECK_INTERVAL_SECOND, max_ingestion_time = None, operation = 'create', **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   When you create a serverless endpoint, SageMaker provisions and manages
   the compute resources for you. Then, you can make inference requests to
   the endpoint and receive model predictions in response. SageMaker scales
   the compute resources up and down as needed to handle your request traffic.

   Requires an Endpoint Config.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerEndpointOperator`

   :param config:
       The configuration necessary to create an endpoint.

       If you need to create a SageMaker endpoint based on an existed
       SageMaker model and an existed SageMaker endpoint config::

           config = endpoint_configuration;

       If you need to create all of SageMaker model, SageMaker endpoint-config and SageMaker endpoint::

           config = {
               'Model': model_configuration,
               'EndpointConfig': endpoint_config_configuration,
               'Endpoint': endpoint_configuration
           }

       For details of the configuration parameter of model_configuration see
       :py:meth:`SageMaker.Client.create_model`

       For details of the configuration parameter of endpoint_config_configuration see
       :py:meth:`SageMaker.Client.create_endpoint_config`

       For details of the configuration parameter of endpoint_configuration see
       :py:meth:`SageMaker.Client.create_endpoint`

   :param wait_for_completion: Whether the operator should wait until the endpoint creation finishes.
   :param check_interval: If wait is set to True, this is the time interval, in seconds, that this operation
       waits before polling the status of the endpoint creation.
   :param max_ingestion_time: If wait is set to True, this operation fails if the endpoint creation doesn't
       finish within max_ingestion_time seconds. If you set this parameter to None it never times out.
   :param operation: Whether to create an endpoint or update an endpoint. Must be either 'create or 'update'.
   :param aws_conn_id: The AWS connection ID to use.
   :return Dict: Returns The ARN of the endpoint created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerTransformOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, wait_for_completion = True, check_interval = CHECK_INTERVAL_SECOND, max_ingestion_time = None, check_if_job_exists = True, action_if_job_exists = 'increment', **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Starts a transform job. A transform job uses a trained model to get inferences
   on a dataset and saves these results to an Amazon S3 location that you specify.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerTransformOperator`

   :param config: The configuration necessary to start a transform job (templated).

       If you need to create a SageMaker transform job based on an existed SageMaker model::

           config = transform_config

       If you need to create both SageMaker model and SageMaker Transform job::

           config = {
               'Model': model_config,
               'Transform': transform_config
           }

       For details of the configuration parameter of transform_config see
       :py:meth:`SageMaker.Client.create_transform_job`

       For details of the configuration parameter of model_config, See:
       :py:meth:`SageMaker.Client.create_model`

   :param aws_conn_id: The AWS connection ID to use.
   :param wait_for_completion: Set to True to wait until the transform job finishes.
   :param check_interval: If wait is set to True, the time interval, in seconds,
       that this operation waits to check the status of the transform job.
   :param max_ingestion_time: If wait is set to True, the operation fails
       if the transform job doesn't finish within max_ingestion_time seconds. If you
       set this parameter to None, the operation does not timeout.
   :param check_if_job_exists: If set to true, then the operator will check whether a transform job
       already exists for the name in the config.
   :param action_if_job_exists: Behaviour if the job name already exists. Possible options are "increment"
       (default) and "fail".
       This is only relevant if check_if_job_exists is True.
   :return Dict: Returns The ARN of the model created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerTuningOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, wait_for_completion = True, check_interval = CHECK_INTERVAL_SECOND, max_ingestion_time = None, **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Starts a hyperparameter tuning job. A hyperparameter tuning job finds the
   best version of a model by running many training jobs on your dataset using
   the algorithm you choose and values for hyperparameters within ranges that
   you specify. It then chooses the hyperparameter values that result in a model
   that performs the best, as measured by an objective metric that you choose.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerTuningOperator`

   :param config: The configuration necessary to start a tuning job (templated).

       For details of the configuration parameter see
       :py:meth:`SageMaker.Client.create_hyper_parameter_tuning_job`
   :param aws_conn_id: The AWS connection ID to use.
   :param wait_for_completion: Set to True to wait until the tuning job finishes.
   :param check_interval: If wait is set to True, the time interval, in seconds,
       that this operation waits to check the status of the tuning job.
   :param max_ingestion_time: If wait is set to True, the operation fails
       if the tuning job doesn't finish within max_ingestion_time seconds. If you
       set this parameter to None, the operation does not timeout.
   :return Dict: Returns The ARN of the tuning job created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerModelOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Creates a model in Amazon SageMaker. In the request, you name the model and
   describe a primary container. For the primary container, you specify the Docker
   image that contains inference code, artifacts (from prior training), and a custom
   environment map that the inference code uses when you deploy the model for predictions.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerModelOperator`

   :param config: The configuration necessary to create a model.

       For details of the configuration parameter see :py:meth:`SageMaker.Client.create_model`
   :param aws_conn_id: The AWS connection ID to use.
   :return Dict: Returns The ARN of the model created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerTrainingOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, wait_for_completion = True, print_log = True, check_interval = CHECK_INTERVAL_SECOND, max_ingestion_time = None, check_if_job_exists = True, action_if_job_exists = 'increment', **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Starts a model training job. After training completes, Amazon SageMaker saves
   the resulting model artifacts to an Amazon S3 location that you specify.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerTrainingOperator`

   :param config: The configuration necessary to start a training job (templated).

       For details of the configuration parameter see :py:meth:`SageMaker.Client.create_training_job`
   :param aws_conn_id: The AWS connection ID to use.
   :param wait_for_completion: If wait is set to True, the time interval, in seconds,
       that the operation waits to check the status of the training job.
   :param print_log: if the operator should print the cloudwatch log during training
   :param check_interval: if wait is set to be true, this is the time interval
       in seconds which the operator will check the status of the training job
   :param max_ingestion_time: If wait is set to True, the operation fails if the training job
       doesn't finish within max_ingestion_time seconds. If you set this parameter to None,
       the operation does not timeout.
   :param check_if_job_exists: If set to true, then the operator will check whether a training job
       already exists for the name in the config.
   :param action_if_job_exists: Behaviour if the job name already exists. Possible options are "increment"
       (default) and "fail".
       This is only relevant if check_if_job_exists is True.
   :return Dict: Returns The ARN of the training job created in Amazon SageMaker.

   .. py:method:: expand_role()

      Expands an IAM role name into an ARN.


   .. 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:: SageMakerDeleteModelOperator(*, config, aws_conn_id = DEFAULT_CONN_ID, **kwargs)

   Bases: :py:obj:`SageMakerBaseOperator`

   Deletes a SageMaker model.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:SageMakerDeleteModelOperator`

   :param config: The configuration necessary to delete the model.
       For details of the configuration parameter see :py:meth:`SageMaker.Client.delete_model`
   :param aws_conn_id: The AWS connection ID to use.

   .. 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.



