: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




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: = aws_default

   

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

   

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

      

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

      

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

      

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

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


   .. py:method:: parse_config_integers(self)

      Parse the integer fields of training config to integers in case the config is rendered by Jinja and
      all fields are str


   .. py:method:: expand_role(self)

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


   .. py:method:: preprocess_config(self)

      Process the config into a usable form.


   .. py:method:: execute(self, 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(self)

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

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


   .. 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:: 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:attribute:: integer_fields
      :annotation: = [['ProductionVariants', 'InitialInstanceCount']]

      

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

      Set fields which should be casted to integers.


   .. py:method:: expand_role(self)

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


   .. 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:: SageMakerTransformOperator(*, 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 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.
   :return Dict: Returns The ARN of the model created in Amazon SageMaker.

   .. py:method:: create_integer_fields(self)

      Set fields which should be casted to integers.


   .. py:method:: expand_role(self)

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


   .. 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:: 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:attribute:: integer_fields
      :annotation: = [['HyperParameterTuningJobConfig', 'ResourceLimits', 'MaxNumberOfTrainingJobs'],...

      

   .. py:method:: expand_role(self)

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


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

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


   .. 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:: 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
   :return Dict: Returns The ARN of the training job created in Amazon SageMaker.

   .. py:attribute:: integer_fields
      :annotation: = [['ResourceConfig', 'InstanceCount'], ['ResourceConfig', 'VolumeSizeInGB'],...

      

   .. py:method:: expand_role(self)

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


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



