From afc684a4d4ac41f7b22f7282e213c55f1a73dea2 Mon Sep 17 00:00:00 2001 From: Bobby Lindsey Date: Tue, 18 Jun 2024 16:09:05 -0600 Subject: [PATCH 1/5] Add SageMaker MLflow examples --- .../sagemaker-mlflow-model-registry.png | Bin 0 -> 49164 bytes .../images/sagemaker-model-registry.png | Bin 0 -> 300576 bytes .../sagemaker_deployment_mlflow.ipynb | 471 +++++++ sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb | 1256 +++++++++++++++++ .../sagemaker_pipelines_mlflow.ipynb | 1237 ++++++++++++++++ .../sagemaker_training_mlflow.ipynb | 297 ++++ 6 files changed, 3261 insertions(+) create mode 100644 sagemaker-mlflow/images/sagemaker-mlflow-model-registry.png create mode 100644 sagemaker-mlflow/images/sagemaker-model-registry.png create mode 100644 sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb create mode 100644 sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb create mode 100644 sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb create mode 100644 sagemaker-mlflow/sagemaker_training_mlflow.ipynb diff --git a/sagemaker-mlflow/images/sagemaker-mlflow-model-registry.png b/sagemaker-mlflow/images/sagemaker-mlflow-model-registry.png new file mode 100644 index 0000000000000000000000000000000000000000..78b4491f031cdcbc3b9b04143bab63967e35ea0d GIT binary patch literal 49164 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 literal 0 HcmV?d00001 diff --git a/sagemaker-mlflow/images/sagemaker-model-registry.png b/sagemaker-mlflow/images/sagemaker-model-registry.png new file mode 100644 index 0000000000000000000000000000000000000000..665f61d58cece287ed6ebba3c341ec61b8e65316 GIT binary patch literal 300576 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%0DKU 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 z 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 literal 0 HcmV?d00001 diff --git a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb new file mode 100644 index 0000000000..b4bff07aff --- /dev/null +++ b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb @@ -0,0 +1,471 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy a MLflow Model to SageMaker" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup environment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Install MLflow and AWS MLflow plugin" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install mlflow==2.13.2 sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Import necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.sklearn.estimator import SKLearn\n", + "from sagemaker.serve import SchemaBuilder\n", + "from sagemaker.serve import ModelBuilder\n", + "from sagemaker.serve.mode.function_pointers import Mode\n", + "import mlflow\n", + "from mlflow import MlflowClient\n", + "import boto3\n", + "import numpy as np\n", + "import pandas as pd\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Declare some variables used later" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define session, role, and region so we can\n", + "# perform any SageMaker tasks we need\n", + "sagemaker_session = sagemaker.Session()\n", + "role = get_execution_role()\n", + "region = sagemaker_session.boto_region_name\n", + "\n", + "# S3 prefix for the training dataset to be uploaded to\n", + "prefix = 'DEMO-scikit-iris'\n", + "\n", + "# Provide the ARN of the Tracking Server that you want to track your training job with\n", + "tracking_server_arn = 'your tracking server arn here'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p training_code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get some training data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's download the save the Iris dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(\"./data\", exist_ok=True)\n", + "\n", + "s3_client = boto3.client(\"s3\")\n", + "s3_client.download_file(\n", + " f\"sagemaker-example-files-prod-{region}\", 'datasets/tabular/iris/iris.data', './data/iris.csv'\n", + ")\n", + "\n", + "df_iris = pd.read_csv('./data/iris.csv', header=None)\n", + "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})\n", + "iris = df_iris[[4, 0, 1, 2, 3]].to_numpy()\n", + "np.savetxt('./data/iris.csv', iris, delimiter=',', fmt='%1.1f, %1.3f, %1.3f, %1.3f, %1.3f')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now let's upload that data to S3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "WORK_DIRECTORY = 'data'\n", + "\n", + "train_input = sagemaker_session.upload_data(\n", + " WORK_DIRECTORY, key_prefix='{}/{}'.format(prefix, WORK_DIRECTORY)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Write your training script" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's write the code to train a Decision Tree model using the scikit-learn framework" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/train.py\n", + "\n", + "from __future__ import print_function\n", + "\n", + "import argparse\n", + "import joblib\n", + "import os\n", + "import pandas as pd\n", + "\n", + "from sklearn import tree\n", + "\n", + "import mlflow\n", + "\n", + "if __name__ == '__main__':\n", + " parser = argparse.ArgumentParser()\n", + "\n", + " # Hyperparameters are described here. In this simple example we are just including one hyperparameter.\n", + " parser.add_argument('--max_leaf_nodes', type=int, default=-1)\n", + "\n", + " # Sagemaker specific arguments. Defaults are set in the environment variables.\n", + " parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])\n", + " parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])\n", + " parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])\n", + "\n", + " args = parser.parse_args()\n", + "\n", + " # Take the set of files and read them all into a single pandas dataframe\n", + " input_files = [ os.path.join(args.train, file) for file in os.listdir(args.train) if os.path.isfile(os.path.join(args.train, file))]\n", + " if len(input_files) == 0:\n", + " raise ValueError(('There are no files in {}.\\n' +\n", + " 'This usually indicates that the channel ({}) was incorrectly specified,\\n' +\n", + " 'the data specification in S3 was incorrectly specified or the role specified\\n' +\n", + " 'does not have permission to access the data.').format(args.train, \"train\"))\n", + " raw_data = [ pd.read_csv(file, header=None, engine=\"python\") for file in input_files ]\n", + " train_data = pd.concat(raw_data)\n", + "\n", + " # Set the Tracking Server URI using the ARN of the Tracking Server you created\n", + " mlflow.set_tracking_uri(os.environ['MLFLOW_TRACKING_ARN'])\n", + " \n", + " # Enable autologging in MLflow\n", + " mlflow.autolog()\n", + "\n", + " # labels are in the first column\n", + " train_y = train_data.iloc[:, 0]\n", + " train_X = train_data.iloc[:, 1:]\n", + "\n", + " # Here we support a single hyperparameter, 'max_leaf_nodes'. Note that you can add as many\n", + " # as your training my require in the ArgumentParser above.\n", + " max_leaf_nodes = args.max_leaf_nodes\n", + "\n", + " # Now use scikit-learn's decision tree classifier to train the model.\n", + " clf = tree.DecisionTreeClassifier(max_leaf_nodes=max_leaf_nodes)\n", + " clf = clf.fit(train_X, train_y)\n", + "\n", + " # Print the coefficients of the trained classifier, and save the coefficients\n", + " joblib.dump(clf, os.path.join(args.model_dir, \"model.joblib\"))\n", + " \n", + " # Register the model with MLflow\n", + " run_id = mlflow.last_active_run().info.run_id\n", + " artifact_path = \"model\"\n", + " model_uri = \"runs:/{run_id}/{artifact_path}\".format(run_id=run_id, artifact_path=artifact_path)\n", + " model_details = mlflow.register_model(model_uri=model_uri, name=\"sm-job-experiment-model\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're using MLflow in our training script, let's make sure the container installs `mlflow` along with our MLflow plugin before running our training script. We can do this by creating a `requirements.txt` file and putting it in the same directory as our training script." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/requirements.txt\n", + "mlflow==2.13.2\n", + "sagemaker-mlflow==0.1.0\n", + "cloudpickle==2.2.1 # Required for Sagemaker Python SDK" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SageMaker Training and MLflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Train your Decision tree model by launching a SageMaker Training job." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sklearn = SKLearn(\n", + " entry_point='train.py',\n", + " source_dir='training_code',\n", + " framework_version='1.2-1',\n", + " instance_type='ml.c4.xlarge',\n", + " role=role,\n", + " sagemaker_session=sagemaker_session,\n", + " hyperparameters={'max_leaf_nodes': 30},\n", + " keep_alive_period_in_seconds=3600,\n", + " environment={\n", + " 'MLFLOW_TRACKING_ARN': tracking_server_arn\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sklearn.fit({\"train\": train_input})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Access the model in MLflow UI and SageMaker Studio UI\n", + "\n", + "After the execution completes, you can find the trained model in both the MLflow UI and SageMaker Studio UI.\n", + "\n", + "To view the model in the MLflow UI, select the \"Models\" tab:\n", + "\n", + "![sagemaker-mlflow-model-registry.png](./images/sagemaker-mlflow-model-registry.png)\n", + "\n", + "To view the model in SageMaker Studio UI, you will need to navigate to SageMaker Studio:\n", + "\n", + "1. Choose a domain and launch Studio from one of the user profiles associated with it\n", + "2. Select \"Models\" in the menu to see the SageMaker Model Registry. From here you will see your `sm-job-experiment-model` model\n", + "\n", + "![sagemaker-model-registry.png](./images/sagemaker-model-registry.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploy MLflow Model to SageMaker" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mlflow.set_tracking_uri(tracking_server_arn)\n", + "client = MlflowClient()\n", + "registered_model = client.get_registered_model(name=\"sm-job-experiment-model\")\n", + "source_path = registered_model.latest_versions[0].source" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Artifact URI of the model\n", + "source_path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Define of the Schema of the sklearn model\n", + "\n", + "Model Builder requires the definition of the model schema, this is the input and output of the model.\n", + "In this case it is a [4x1] vector for the input and an integer for the output." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sklearn_input = np.array([1.0, 2.0, 3.0, 4.0]).reshape(1, -1)\n", + "sklearn_output = 1\n", + "sklearn_schema_builder = SchemaBuilder(\n", + " sample_input=sklearn_input,\n", + " sample_output=sklearn_output,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Build and deploy the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create model builder with the schema builder.\n", + "model_builder = ModelBuilder(\n", + " mode=Mode.SAGEMAKER_ENDPOINT,\n", + " schema_builder=sklearn_schema_builder,\n", + " role_arn=role,\n", + " model_metadata={\n", + " \"MLFLOW_MODEL_PATH\": source_path\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "built_model = model_builder.build()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictor = built_model.deploy(\n", + " initial_instance_count=1,\n", + " instance_type=\"ml.m5.large\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inference on Deployed Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictor.predict(sklearn_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cleanup Resources" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sagemaker_session.delete_model(model_name=built_model.name)\n", + "sagemaker_session.delete_endpoint_config(endpoint_config_name=built_model.endpoint_name)\n", + "sagemaker_session.delete_endpoint(endpoint_name=built_model.endpoint_name)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb new file mode 100644 index 0000000000..02018e80f1 --- /dev/null +++ b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb @@ -0,0 +1,1256 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "aba29661-2e0d-4154-bda7-3734e0db929b", + "metadata": {}, + "source": [ + "# SageMaker HPO with MLflow" + ] + }, + { + "cell_type": "markdown", + "id": "ad2f8898-a6d1-4efb-83f9-e73d48401a10", + "metadata": {}, + "source": [ + "Train a PyTorch model using HPO in SageMaker and track with MLflow using nested runs" + ] + }, + { + "cell_type": "markdown", + "id": "ac89ce60-66b1-48e8-a0aa-d2dc7be4c7a0", + "metadata": {}, + "source": [ + "## Setup environment" + ] + }, + { + "cell_type": "markdown", + "id": "f77548cf-8c27-4a48-96e5-15b240d2d3fb", + "metadata": {}, + "source": [ + "Install necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "676cb6d2-be92-4682-9f23-7c1feb8a619d", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install torchvision mlflow==2.13.2 sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "id": "3454d086-3642-4a72-a9fd-f97935e28de7", + "metadata": {}, + "source": [ + "Import necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0308c7a-f89d-4f82-845a-6168ade2cea3", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "from torchvision import transforms\n", + "from torchvision.datasets import MNIST\n", + "\n", + "import mlflow\n", + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.pytorch import PyTorch\n", + "from sagemaker.tuner import (\n", + " CategoricalParameter,\n", + " ContinuousParameter,\n", + " HyperparameterTuner,\n", + " IntegerParameter,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ce6690c7-fdcb-486c-b4e7-4cb0b29ad63e", + "metadata": {}, + "source": [ + "Declare some variables used later" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fa015b1-13b9-41b7-b42c-bf227efdac0a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Define session, role, and region so we can\n", + "# perform any SageMaker tasks we need\n", + "sagemaker_session = sagemaker.Session()\n", + "role = get_execution_role()\n", + "region = sagemaker_session.boto_region_name\n", + "bucket = sagemaker_session.default_bucket()\n", + "\n", + "# S3 prefix for the training dataset to be uploaded to\n", + "prefix = 'DEMO-pytorch-mnist'\n", + "\n", + "# MLflow (replace these values with your own)\n", + "tracking_server_arn = 'your tracking server arn'\n", + "experiment_name = 'MNIST'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e551dbac", + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p training_code" + ] + }, + { + "cell_type": "markdown", + "id": "0afcafe4-2462-4831-94f5-5bc71371a8a0", + "metadata": {}, + "source": [ + "## Get some training data" + ] + }, + { + "cell_type": "markdown", + "id": "fc751432-d2a5-44e4-b1e2-ac0454538f67", + "metadata": {}, + "source": [ + "Download MNIST data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d54a0c8-ec3c-47b7-8f4a-c3a2d45d4236", + "metadata": {}, + "outputs": [], + "source": [ + "local_dir = 'data'\n", + "MNIST.mirrors = [\n", + " f'https://sagemaker-example-files-prod-{region}.s3.amazonaws.com/datasets/image/MNIST/'\n", + "]\n", + "MNIST(\n", + " local_dir,\n", + " download=True,\n", + " transform=transforms.Compose(\n", + " [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ab046942-ef87-4b0b-a0b4-02f194dc370a", + "metadata": {}, + "source": [ + "Upload data to S3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b4c0b01-8532-4184-918e-35904f25fc14", + "metadata": {}, + "outputs": [], + "source": [ + "train_input = sagemaker_session.upload_data(path='data', bucket=bucket, key_prefix=prefix)" + ] + }, + { + "cell_type": "markdown", + "id": "592db81e-089c-4158-a6a0-16ae2a6b94af", + "metadata": {}, + "source": [ + "### Write your training script" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f6b33ed-753e-4b71-b02f-8bdbd414aae1", + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/mnist.py\n", + "\n", + "import argparse\n", + "import json\n", + "import logging\n", + "import os\n", + "import sys\n", + "\n", + "import mlflow\n", + "import torch\n", + "import torch.distributed as dist\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "import torch.utils.data\n", + "import torch.utils.data.distributed\n", + "from torchinfo import summary\n", + "from torchvision import datasets, transforms\n", + "\n", + "logger = logging.getLogger(__name__)\n", + "logger.setLevel(logging.DEBUG)\n", + "logger.addHandler(logging.StreamHandler(sys.stdout))\n", + "\n", + "# Set MLFlow specifics\n", + "parent_run_id = os.environ.get('MLFLOW_PARENT_RUN_ID', None)\n", + "mlflow_experiment_name = os.environ.get('MLFLOW_EXPERIMENT_NAME', None)\n", + "\n", + "# Based on https://github.com/pytorch/examples/blob/master/mnist/main.py\n", + "class Net(nn.Module):\n", + " def __init__(self):\n", + " super(Net, self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n", + " self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n", + " self.conv2_drop = nn.Dropout2d()\n", + " self.fc1 = nn.Linear(320, 50)\n", + " self.fc2 = nn.Linear(50, 10)\n", + "\n", + " def forward(self, x):\n", + " x = F.relu(F.max_pool2d(self.conv1(x), 2))\n", + " x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n", + " x = x.view(-1, 320)\n", + " x = F.relu(self.fc1(x))\n", + " x = F.dropout(x, training=self.training)\n", + " x = self.fc2(x)\n", + " return F.log_softmax(x, dim=1)\n", + "\n", + "\n", + "def _get_train_data_loader(batch_size, training_dir, is_distributed, **kwargs):\n", + " logger.info('Get train data loader')\n", + " dataset = datasets.MNIST(\n", + " training_dir,\n", + " train=True,\n", + " transform=transforms.Compose(\n", + " [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]\n", + " ),\n", + " )\n", + " train_sampler = (\n", + " torch.utils.data.distributed.DistributedSampler(dataset)\n", + " if is_distributed\n", + " else None\n", + " )\n", + " return torch.utils.data.DataLoader(\n", + " dataset,\n", + " batch_size=batch_size,\n", + " shuffle=train_sampler is None,\n", + " sampler=train_sampler,\n", + " **kwargs,\n", + " )\n", + "\n", + "\n", + "def _get_test_data_loader(test_batch_size, training_dir, **kwargs):\n", + " logger.info('Get test data loader')\n", + " return torch.utils.data.DataLoader(\n", + " datasets.MNIST(\n", + " training_dir,\n", + " train=False,\n", + " transform=transforms.Compose(\n", + " [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]\n", + " ),\n", + " ),\n", + " batch_size=test_batch_size,\n", + " shuffle=True,\n", + " **kwargs,\n", + " )\n", + "\n", + "\n", + "def _average_gradients(model):\n", + " # Gradient averaging.\n", + " size = float(dist.get_world_size())\n", + " for param in model.parameters():\n", + " dist.all_reduce(param.grad.data, op=dist.reduce_op.SUM, group=0)\n", + " param.grad.data /= size\n", + "\n", + "\n", + "def train(args):\n", + " is_distributed = len(args.hosts) > 1 and args.backend is not None\n", + " logger.debug('Distributed training - {}'.format(is_distributed))\n", + " use_cuda = args.num_gpus > 0\n", + " logger.debug('Number of gpus available - {}'.format(args.num_gpus))\n", + " kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}\n", + " device = torch.device('cuda' if use_cuda else 'cpu')\n", + "\n", + " region = os.getenv('AWS_REGION')\n", + "\n", + " # if there's a parent_run_id run as nested MLflow_run\n", + " nested = False\n", + "\n", + " if parent_run_id:\n", + " nested = True\n", + "\n", + " if is_distributed:\n", + " # Initialize the distributed environment.\n", + " world_size = len(args.hosts)\n", + " os.environ['WORLD_SIZE'] = str(world_size)\n", + " host_rank = args.hosts.index(args.current_host)\n", + " dist.init_process_group(\n", + " backend=args.backend, rank=host_rank, world_size=world_size\n", + " )\n", + " logger.info(\n", + " \"Initialized the distributed environment: '{}' backend on {} nodes. \".format(\n", + " args.backend, dist.get_world_size()\n", + " )\n", + " + \"Current host rank is {}. Number of gpus: {}\".format(\n", + " dist.get_rank(), args.num_gpus\n", + " )\n", + " )\n", + "\n", + " # set the seed for generating random numbers\n", + " torch.manual_seed(args.seed)\n", + " if use_cuda:\n", + " torch.cuda.manual_seed(args.seed)\n", + "\n", + " train_loader = _get_train_data_loader(\n", + " args.batch_size, args.data_dir, is_distributed, **kwargs\n", + " )\n", + " test_loader = _get_test_data_loader(args.test_batch_size, args.data_dir, **kwargs)\n", + "\n", + " logger.debug(\n", + " \"Processes {}/{} ({:.0f}%) of train data\".format(\n", + " len(train_loader.sampler),\n", + " len(train_loader.dataset),\n", + " 100.0 * len(train_loader.sampler) / len(train_loader.dataset),\n", + " )\n", + " )\n", + "\n", + " logger.debug(\n", + " \"Processes {}/{} ({:.0f}%) of test data\".format(\n", + " len(test_loader.sampler),\n", + " len(test_loader.dataset),\n", + " 100.0 * len(test_loader.sampler) / len(test_loader.dataset),\n", + " )\n", + " )\n", + "\n", + " model = Net().to(device)\n", + " if is_distributed and use_cuda:\n", + " # multi-machine multi-gpu case\n", + " model = torch.nn.parallel.DistributedDataParallel(model)\n", + " else:\n", + " # single-machine multi-gpu case or single-machine or multi-machine cpu case\n", + " model = torch.nn.DataParallel(model)\n", + "\n", + " optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)\n", + " with mlflow.start_run(nested=nested):\n", + " params = {\n", + " k: o\n", + " for k, o in vars(args).items()\n", + " }\n", + " sm_training_env = json.loads(os.environ['SM_TRAINING_ENV'])\n", + " job_name = sm_training_env['job_name']\n", + " job_uri = f'https://{region}.console.aws.amazon.com/sagemaker/home?region={region}#/jobs/{job_name}'\n", + " mlflow.log_params(\n", + " {**params, 'sagemaker_job_name': job_name, 'sagemaker_job_uri': job_uri}\n", + " )\n", + "\n", + " # Log model summary.\n", + " with open('model_summary.txt', 'w') as f:\n", + " f.write(str(summary(model)))\n", + " mlflow.log_artifact('model_summary.txt')\n", + "\n", + " for epoch in range(1, args.epochs + 1):\n", + " model.train()\n", + " for batch_idx, (data, target) in enumerate(train_loader, 1):\n", + " data, target = data.to(device), target.to(device)\n", + " optimizer.zero_grad()\n", + " output = model(data)\n", + " loss = F.nll_loss(output, target)\n", + " loss.backward()\n", + " if is_distributed and not use_cuda:\n", + " # average gradients manually for multi-machine cpu case only\n", + " _average_gradients(model)\n", + " optimizer.step()\n", + " if batch_idx % args.log_interval == 0:\n", + " logger.info(\n", + " 'Train Epoch: {} [{}/{} ({:.0f}%)] Loss: {:.6f}'.format(\n", + " epoch,\n", + " batch_idx * len(data),\n", + " len(train_loader.sampler),\n", + " 100.0 * batch_idx / len(train_loader),\n", + " loss.item(),\n", + " )\n", + " )\n", + " mlflow.log_metric(\n", + " 'loss',\n", + " loss.item(),\n", + " step=(batch_idx // args.log_interval),\n", + " )\n", + "\n", + " test(model, test_loader, device)\n", + " save_model(model, args.model_dir)\n", + "\n", + "\n", + "def test(model, test_loader, device):\n", + " model.eval()\n", + " test_loss = 0\n", + " correct = 0\n", + " with torch.no_grad():\n", + " for data, target in test_loader:\n", + " data, target = data.to(device), target.to(device)\n", + " output = model(data)\n", + " test_loss += F.nll_loss(\n", + " output, target, size_average=False\n", + " ).item() # sum up batch loss\n", + " pred = output.max(1, keepdim=True)[\n", + " 1\n", + " ] # get the index of the max log-probability\n", + " correct += pred.eq(target.view_as(pred)).sum().item()\n", + "\n", + " test_loss /= len(test_loader.dataset)\n", + " logger.info(\n", + " 'Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n", + " test_loss,\n", + " correct,\n", + " len(test_loader.dataset),\n", + " 100.0 * correct / len(test_loader.dataset),\n", + " )\n", + " )\n", + " mlflow.log_metrics(\n", + " {\n", + " 'test_average_loss': test_loss,\n", + " 'test_accuracy': correct / len(test_loader.dataset),\n", + " }\n", + " )\n", + "\n", + "def model_fn(model_dir):\n", + " device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + " model = torch.nn.DataParallel(Net())\n", + " with open(os.path.join(model_dir, 'model.pth'), 'rb') as f:\n", + " model.load_state_dict(torch.load(f))\n", + " return model.to(device)\n", + "\n", + "\n", + "def save_model(model, model_dir):\n", + " logger.info('Saving the model.')\n", + " path = os.path.join(model_dir, 'model.pth')\n", + " # recommended way from http://pytorch.org/docs/master/notes/serialization.html\n", + " torch.save(model.cpu().state_dict(), path)\n", + "\n", + "\n", + "if __name__ == '__main__':\n", + " parser = argparse.ArgumentParser()\n", + "\n", + " # Data and model checkpoints directories\n", + " parser.add_argument(\n", + " '--batch-size',\n", + " type=int,\n", + " default=64,\n", + " metavar='N',\n", + " help='input batch size for training (default: 64)',\n", + " )\n", + " parser.add_argument(\n", + " '--test-batch-size',\n", + " type=int,\n", + " default=1000,\n", + " metavar='N',\n", + " help='input batch size for testing (default: 1000)',\n", + " )\n", + " parser.add_argument(\n", + " '--epochs',\n", + " type=int,\n", + " default=10,\n", + " metavar='N',\n", + " help='number of epochs to train (default: 10)',\n", + " )\n", + " parser.add_argument(\n", + " '--lr',\n", + " type=float,\n", + " default=0.01,\n", + " metavar='LR',\n", + " help='learning rate (default: 0.01)',\n", + " )\n", + " parser.add_argument(\n", + " '--momentum',\n", + " type=float,\n", + " default=0.5,\n", + " metavar='M',\n", + " help='SGD momentum (default: 0.5)',\n", + " )\n", + " parser.add_argument(\n", + " '--seed', type=int, default=1, metavar='S', help='random seed (default: 1)'\n", + " )\n", + " parser.add_argument(\n", + " '--log-interval',\n", + " type=int,\n", + " default=100,\n", + " metavar='N',\n", + " help='how many batches to wait before logging training status',\n", + " )\n", + " parser.add_argument(\n", + " '--backend',\n", + " type=str,\n", + " default=None,\n", + " help='backend for distributed training (tcp, gloo on cpu and gloo, nccl on gpu)',\n", + " )\n", + "\n", + " # Container environment\n", + " parser.add_argument(\n", + " '--hosts', type=list, default=json.loads(os.environ['SM_HOSTS'])\n", + " )\n", + " parser.add_argument(\n", + " '--current-host', type=str, default=os.environ['SM_CURRENT_HOST']\n", + " )\n", + " parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])\n", + " parser.add_argument(\n", + " '--data-dir', type=str, default=os.environ['SM_CHANNEL_TRAINING']\n", + " )\n", + " parser.add_argument('--num-gpus', type=int, default=os.environ['SM_NUM_GPUS'])\n", + "\n", + " args = parser.parse_args()\n", + "\n", + " mlflow.set_experiment(mlflow_experiment_name)\n", + " if parent_run_id:\n", + " with mlflow.start_run(run_id=parent_run_id):\n", + " train(args)\n", + " else:\n", + " train(args)" + ] + }, + { + "cell_type": "markdown", + "id": "6f46e27a-717e-4587-8ec0-71ee28f2ded6", + "metadata": {}, + "source": [ + "Since we're using MLflow in our training script, let's make sure the container installs `mlflow` along with our MLflow AWS plugin before running our training script. We can do this by creating a `requirements.txt` file and putting it in the same directory as our training script." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "183f77d7-0189-4c06-a5ee-e491e17ac172", + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/requirements.txt\n", + "mlflow==2.13.2\n", + "torchinfo\n", + "sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "id": "314a2fd2-4c5c-4aae-9ab5-419e0d7fe9f9", + "metadata": {}, + "source": [ + "## SageMaker HPO and MLflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1fa6668-571c-49a7-ac9f-d6638f39393e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "hyperparameter_ranges = {\n", + " \"lr\": ContinuousParameter(0.001, 0.1),\n", + " \"batch-size\": CategoricalParameter([32, 64, 128, 256, 512]),\n", + "}\n", + "\n", + "objective_metric_name = \"average test loss\"\n", + "objective_type = \"Minimize\"\n", + "metric_definitions = [\n", + " {\"Name\": \"average test loss\",\n", + " \"Regex\": \"Test set: Average loss: ([0-9\\\\.]+)\"}\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "248e3cbc-6835-4d55-94b3-6a3dd873f4d2", + "metadata": {}, + "source": [ + "Create a MLflow experiment called `MNIST`. We'll give this SageMaker HPO job a run name, `HPODemo`. Each training attempt will be its own child run under `HPODemo`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b9129f0-c485-4e22-ab41-55dec0e4672b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mlflow.set_tracking_uri(tracking_server_arn)\n", + "experiment = mlflow.set_experiment(experiment_name)\n", + "\n", + "with mlflow.start_run(run_name=sagemaker.utils.name_from_base(\"HPODemo\")) as run:\n", + " estimator = PyTorch(\n", + " entry_point=\"mnist.py\",\n", + " source_dir=\"training_code\",\n", + " role=role,\n", + " py_version=\"py39\",\n", + " framework_version=\"1.13\",\n", + " instance_count=1,\n", + " instance_type=\"ml.c5.2xlarge\",\n", + " hyperparameters={\n", + " \"epochs\": 5,\n", + " \"backend\": \"gloo\"\n", + " },\n", + " environment={\n", + " 'MLFLOW_TRACKING_URI':tracking_server_arn,\n", + " 'MLFLOW_EXPERIMENT_NAME':experiment.name,\n", + " 'MLFLOW_PARENT_RUN_ID':run.info.run_id\n", + " },\n", + " )\n", + " \n", + " tuner = HyperparameterTuner(\n", + " estimator,\n", + " objective_metric_name,\n", + " hyperparameter_ranges,\n", + " metric_definitions,\n", + " max_jobs=9,\n", + " max_parallel_jobs=3,\n", + " objective_type=objective_type,\n", + " )\n", + " tuner.fit({\"training\": train_input})" + ] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4de.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 57, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.trn1.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 58, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.trn1.32xlarge", + "vcpuNum": 128 + }, + { + "_defaultOrder": 59, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.trn1n.32xlarge", + "vcpuNum": 128 + } + ], + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb new file mode 100644 index 0000000000..a68ed596c4 --- /dev/null +++ b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb @@ -0,0 +1,1237 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "32cbb17e-1967-45c0-a564-385fe2136dc0", + "metadata": {}, + "source": [ + "# SageMaker Pipelines with MLflow" + ] + }, + { + "cell_type": "markdown", + "id": "58a10420-4496-4d45-ba93-c261c3ca2aa8", + "metadata": {}, + "source": [ + "## Setup environment" + ] + }, + { + "cell_type": "markdown", + "id": "cfb5edce-c55d-4cdf-afb0-ed20a31dcba4", + "metadata": {}, + "source": [ + "Import necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e0aab5a-5d0c-48da-a3c2-1488a58d59d3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import sagemaker\n", + "from sagemaker.workflow.execution_variables import ExecutionVariables\n", + "from sagemaker.workflow.function_step import step\n", + "from sagemaker.workflow.parameters import ParameterString\n", + "from sagemaker.workflow.pipeline import Pipeline\n", + "from sagemaker.workflow.condition_step import ConditionStep\n", + "from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo\n", + "from sagemaker.workflow.fail_step import FailStep" + ] + }, + { + "cell_type": "markdown", + "id": "d564fcd3-e7a3-4e0d-97a2-fcd9f4c9df6e", + "metadata": {}, + "source": [ + "Declare some variables used later" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec0f4c80-563b-42c9-8a7c-f101d6eb0385", + "metadata": {}, + "outputs": [], + "source": [ + "sagemaker_session = sagemaker.session.Session()\n", + "role = sagemaker.get_execution_role()\n", + "bucket = sagemaker_session.default_bucket()\n", + "region = sagemaker_session.boto_region_name\n", + "\n", + "pipeline_name = \"breast-cancer-xgb\"\n", + "instance_type = ParameterString(\n", + " name=\"TrainingInstanceType\", default_value=\"ml.m5.xlarge\"\n", + ")\n", + "\n", + "# Mlflow (replace these values with your own)\n", + "tracking_server_arn = 'your tracking server arn'\n", + "experiment_name = \"sm-pipelines-experiment\"" + ] + }, + { + "cell_type": "markdown", + "id": "a2b42762-4725-41bd-92b5-019fa158b22d", + "metadata": { + "tags": [] + }, + "source": [ + "Write `requirements` and `config` files that'll be used by the steps in our SageMaker Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4aebe8c-c500-48c7-9204-34217b3cc424", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%%writefile config.yaml\n", + "SchemaVersion: '1.0'\n", + "SageMaker:\n", + " PythonSDK:\n", + " Modules:\n", + " RemoteFunction:\n", + " # role arn is not required if in SageMaker Notebook instance or SageMaker Studio\n", + " # Uncomment the following line and replace with the right execution role if in a local IDE\n", + " # RoleArn: \n", + " InstanceType: ml.m5.xlarge\n", + " Dependencies: ./requirements.txt\n", + " IncludeLocalWorkDir: true\n", + " CustomFileFilter:\n", + " IgnoreNamePatterns: # files or directories to ignore\n", + " - \"*.ipynb\" # all notebook files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79a2d4d8-6ff5-4e87-afbb-48290f8eebeb", + "metadata": {}, + "outputs": [], + "source": [ + "# Set path to config file\n", + "os.environ['SAGEMAKER_USER_CONFIG_OVERRIDE'] = os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b8ea2db-85b2-4af8-9b6f-82ccbe104738", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%%writefile requirements.txt\n", + "scikit-learn\n", + "xgboost==1.7.6\n", + "s3fs==0.4.2\n", + "sagemaker>=2.199.0,<3\n", + "pandas>=2.0.0\n", + "gevent\n", + "geventhttpclient\n", + "shap\n", + "matplotlib\n", + "fsspec\n", + "mlflow==2.13.2\n", + "sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "id": "11a4daec-3a2d-4538-8e96-a10024755117", + "metadata": {}, + "source": [ + "## Define the SageMaker Pipeline" + ] + }, + { + "cell_type": "markdown", + "id": "072dbf47-2fb2-4b9e-a64d-a22409d1b473", + "metadata": {}, + "source": [ + "### Preprocessing Step" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da930770-7efc-4000-b104-8fc94c7133a5", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of our dataset\n", + "input_path = f\"s3://sagemaker-example-files-prod-{region}/datasets/tabular/breast_cancer/wdbc.csv\"" + ] + }, + { + "cell_type": "markdown", + "id": "802af4a5-1813-4974-81a9-a22518b584a0", + "metadata": {}, + "source": [ + "The breast cancer Wisconsin dataset contains column `id` which we do not use for training. The second column `diagnosis` is class label, and the label is represented using 'M' for Malignant class, and 'B' for Benign class. \n", + "\n", + "In the preprocessing step, we drop the column `id`, then split the dataset into three distinct sets: train, validation, and test set.\n", + "\n", + "Note that `keep_alive_period_in_seconds` parameter in @step decorator indicates how many seconds we want to keep the instance alive, waiting to be reused for the next pipeline step execution. Setting this parameter speeds up the pipeline execution because we reduce the launching of new instances to execute pipeline steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c54f225-f5c4-4766-a8dd-7e6c07554422", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "random_state = 2023\n", + "label_column = 'diagnosis'\n", + "\n", + "feature_names = [\n", + " 'id',\n", + " 'diagnosis',\n", + " 'radius_mean',\n", + " 'texture_mean',\n", + " 'perimeter_mean',\n", + " 'area_mean',\n", + " 'smoothness_mean',\n", + " 'compactness_mean',\n", + " 'concavity_mean',\n", + " 'concave points_mean',\n", + " 'symmetry_mean',\n", + " 'fractal_dimension_mean',\n", + " 'radius_se',\n", + " 'texture_se',\n", + " 'perimeter_se',\n", + " 'area_se',\n", + " 'smoothness_se',\n", + " 'compactness_se',\n", + " 'concavity_se',\n", + " 'concave points_se',\n", + " 'symmetry_se',\n", + " 'fractal_dimension_se',\n", + " 'radius_worst',\n", + " 'texture_worst',\n", + " 'perimeter_worst',\n", + " 'area_worst',\n", + " 'smoothness_worst',\n", + " 'compactness_worst',\n", + " 'concavity_worst',\n", + " 'concave points_worst',\n", + " 'symmetry_worst',\n", + " 'fractal_dimension_worst',\n", + "]\n", + "\n", + "@step(\n", + " name='DataPreprocessing',\n", + " instance_type=instance_type,\n", + ")\n", + "def preprocess(\n", + " raw_data_s3_path: str,\n", + " output_prefix: str,\n", + " experiment_name: str,\n", + " run_name: str,\n", + " test_size: float = 0.2,\n", + ") -> tuple:\n", + " import mlflow\n", + " import pandas as pd\n", + " from sklearn.model_selection import train_test_split\n", + "\n", + " mlflow.set_tracking_uri(tracking_server_arn)\n", + " mlflow.set_experiment(experiment_name)\n", + " with mlflow.start_run(run_name=run_name) as run:\n", + " run_id = run.info.run_id\n", + " with mlflow.start_run(run_name='DataPreprocessing', nested=True):\n", + " df = pd.read_csv(raw_data_s3_path, header=None, names=feature_names)\n", + " df.drop(columns='id', inplace=True)\n", + " mlflow.log_input(\n", + " mlflow.data.from_pandas(df, raw_data_s3_path, targets=label_column),\n", + " context='DataPreprocessing',\n", + " )\n", + " \n", + " train_df, test_df = train_test_split(\n", + " df, test_size=0.2, stratify=df[label_column]\n", + " )\n", + " validation_df, test_df = train_test_split(\n", + " test_df, test_size=0.5, stratify=test_df[label_column]\n", + " )\n", + " train_df.reset_index(inplace=True, drop=True)\n", + " validation_df.reset_index(inplace=True, drop=True)\n", + " test_df.reset_index(inplace=True, drop=True)\n", + " \n", + " train_s3_path = f's3://{bucket}/{output_prefix}/train.csv'\n", + " val_s3_path = f's3://{bucket}/{output_prefix}/val.csv'\n", + " test_s3_path = f's3://{bucket}/{output_prefix}/test.csv'\n", + " \n", + " train_df.to_csv(train_s3_path, index=False)\n", + " validation_df.to_csv(val_s3_path, index=False)\n", + " test_df.to_csv(test_s3_path, index=False)\n", + "\n", + " return train_s3_path, val_s3_path, test_s3_path, experiment_name, run_id" + ] + }, + { + "cell_type": "markdown", + "id": "a6a99152-3495-45fc-abc9-d929bb0066d5", + "metadata": {}, + "source": [ + "### Training Step" + ] + }, + { + "cell_type": "markdown", + "id": "da081365-db2d-492f-b1e0-ab9a4ff8a99f", + "metadata": {}, + "source": [ + "We train a XGBoost model in this training step, using @step-decorated function with the S3 path of training and validation set, along with XGBoost hyperparameters. The S3 paths for both training and validation set is coming from the output of the previous step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb98b312-208a-4327-add7-f80184c4d392", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "use_gpu = False\n", + "param = dict(\n", + " objective='binary:logistic',\n", + " max_depth=5,\n", + " eta=0.2,\n", + " gamma=4,\n", + " min_child_weight=6,\n", + " subsample=0.7,\n", + " tree_method='gpu_hist' if use_gpu else 'hist', # Use GPU accelerated algorithm\n", + ")\n", + "num_round = 50\n", + "\n", + "\n", + "@step(\n", + " name='ModelTraining',\n", + " instance_type=instance_type,\n", + ")\n", + "def train(\n", + " train_s3_path: str,\n", + " validation_s3_path: str,\n", + " experiment_name: str,\n", + " run_id: str,\n", + " param: dict = param,\n", + " num_round: int = num_round,\n", + "):\n", + " import mlflow\n", + " import pandas as pd\n", + " from xgboost import XGBClassifier\n", + "\n", + " mlflow.set_tracking_uri(tracking_server_arn)\n", + " mlflow.set_experiment(experiment_name)\n", + "\n", + " with mlflow.start_run(run_id=run_id):\n", + " with mlflow.start_run(run_name='ModelTraining', nested=True) as training_run:\n", + " training_run_id = training_run.info.run_id\n", + " mlflow.xgboost.autolog(\n", + " log_input_examples=True,\n", + " log_model_signatures=True,\n", + " log_models=True,\n", + " log_datasets=True,\n", + " model_format='xgb',\n", + " )\n", + " \n", + " # read data files from S3\n", + " train_df = pd.read_csv(train_s3_path)\n", + " validation_df = pd.read_csv(validation_s3_path)\n", + " \n", + " # create dataframe and label series\n", + " y_train = (train_df.pop(label_column) == 'M').astype('int')\n", + " y_validation = (validation_df.pop(label_column) == 'M').astype('int')\n", + " \n", + " xgb = XGBClassifier(n_estimators=num_round, **param)\n", + " xgb.fit(\n", + " train_df,\n", + " y_train,\n", + " eval_set=[(validation_df, y_validation)],\n", + " early_stopping_rounds=5,\n", + " )\n", + "\n", + " # return xgb\n", + " return experiment_name, run_id, training_run_id" + ] + }, + { + "cell_type": "markdown", + "id": "add79f19-fa80-45e6-9c5e-3d454954fa63", + "metadata": {}, + "source": [ + "### Evaluation Step" + ] + }, + { + "cell_type": "markdown", + "id": "ffe4709c-106a-4a63-ae49-09d24ab35262", + "metadata": {}, + "source": [ + "In this step, we create a @step-decorated function to evaluate the trained XGBoost model on the test dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e0cae65-6859-433c-9b17-a3c5d1a881a5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "@step(\n", + " name='ModelEvaluation',\n", + " instance_type=instance_type,\n", + ")\n", + "def evaluate(\n", + " test_s3_path: str,\n", + " experiment_name: str,\n", + " run_id: str,\n", + " training_run_id: str,\n", + ") -> dict:\n", + " import mlflow\n", + " import pandas as pd\n", + "\n", + " mlflow.set_tracking_uri(tracking_server_arn)\n", + " mlflow.set_experiment(experiment_name)\n", + "\n", + " with mlflow.start_run(run_id=run_id):\n", + " with mlflow.start_run(run_name='ModelEvaluation', nested=True):\n", + " test_df = pd.read_csv(test_s3_path)\n", + " test_df[label_column] = (test_df[label_column] == 'M').astype('int')\n", + " model = mlflow.pyfunc.load_model(f'runs:/{training_run_id}/model')\n", + " \n", + " results = mlflow.evaluate(\n", + " model=model,\n", + " data=test_df,\n", + " targets=label_column,\n", + " model_type='classifier',\n", + " evaluators=['default'],\n", + " )\n", + " return {'f1_score': results.metrics['f1_score']}" + ] + }, + { + "cell_type": "markdown", + "id": "d47f9415-8edf-49a5-906b-6d112c24d0b3", + "metadata": {}, + "source": [ + "### Model Registration" + ] + }, + { + "cell_type": "markdown", + "id": "ac789be1-e1d9-4102-bbf4-c3284e6dc062", + "metadata": {}, + "source": [ + "In this step, we create a @step-decorated function to register our XGBoost model. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9af124b1-1cae-49da-9854-8d1342af844f", + "metadata": {}, + "outputs": [], + "source": [ + "@step(\n", + " name='ModelRegistration',\n", + " instance_type=instance_type,\n", + ")\n", + "def register(\n", + " pipeline_name: str,\n", + " experiment_name: str,\n", + " run_id: str,\n", + " training_run_id: str,\n", + "):\n", + " import mlflow\n", + "\n", + " mlflow.set_tracking_uri(tracking_server_arn)\n", + " mlflow.set_experiment(experiment_name)\n", + "\n", + " with mlflow.start_run(run_id=run_id):\n", + " with mlflow.start_run(run_name='ModelRegistration', nested=True):\n", + " mlflow.register_model(f'runs:/{training_run_id}/model', pipeline_name)" + ] + }, + { + "cell_type": "markdown", + "id": "b2c736d1-2aa3-4bb5-a235-be56fe07e875", + "metadata": {}, + "source": [ + "## Creating the SageMaker Pipeline\n", + "\n", + "We connect all defined pipeline `@step` functions into a multi-step pipeline. Then, we submit and execute the pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5339f24f-15ec-4a6c-8f98-d8c191fabf4c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "preprocessing_step = preprocess(\n", + " raw_data_s3_path=input_path,\n", + " output_prefix=f'{pipeline_name}/dataset',\n", + " experiment_name=experiment_name,\n", + " run_name=ExecutionVariables.PIPELINE_EXECUTION_ID,\n", + ")\n", + "\n", + "training_step = train(\n", + " train_s3_path=preprocessing_step[0],\n", + " validation_s3_path=preprocessing_step[1],\n", + " experiment_name=preprocessing_step[3],\n", + " run_id=preprocessing_step[4],\n", + ")\n", + "\n", + "conditional_register_step = ConditionStep(\n", + " name='ConditionalRegister',\n", + " conditions=[\n", + " ConditionGreaterThanOrEqualTo(\n", + " left=evaluate(\n", + " test_s3_path=preprocessing_step[2],\n", + " experiment_name=preprocessing_step[3],\n", + " run_id=preprocessing_step[4],\n", + " training_run_id=training_step[2],\n", + " )['f1_score'],\n", + " right=0.8,\n", + " )\n", + " ],\n", + " if_steps=[register(\n", + " pipeline_name=pipeline_name,\n", + " experiment_name=preprocessing_step[3],\n", + " run_id=preprocessing_step[4],\n", + " training_run_id=training_step[2],\n", + " )\n", + " ],\n", + " else_steps=[FailStep(name=\"Fail\", error_message=\"Model performance is not good enough\")],\n", + ")\n", + "\n", + "pipeline = Pipeline(\n", + " name=pipeline_name,\n", + " parameters=[\n", + " instance_type,\n", + " ],\n", + " steps=[\n", + " preprocessing_step,\n", + " training_step,\n", + " conditional_register_step\n", + " ],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7efafac7-5865-4ffa-b410-4d1ad7e3a576", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline.upsert(role_arn=role)" + ] + }, + { + "cell_type": "markdown", + "id": "3668a3ed-207a-4c19-bbe2-61ef778605a0", + "metadata": {}, + "source": [ + "## Execute the SageMaker Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4b7a103-783e-409b-8bc3-583e587610bd", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "execution = pipeline.start()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3350472d-ffd6-41ed-8a1d-ded0318feeae", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "execution.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ef26ee0-c1d2-4a43-9884-cf32032f5b2b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "execution.wait()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "894beeea-37fb-49ec-9627-713c9d9f4040", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "execution.list_steps()" + ] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.p4de.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 57, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.trn1.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 58, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.trn1.32xlarge", + "vcpuNum": 128 + }, + { + "_defaultOrder": 59, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.trn1n.32xlarge", + "vcpuNum": 128 + } + ], + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sagemaker-mlflow/sagemaker_training_mlflow.ipynb b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb new file mode 100644 index 0000000000..dae4dc26a4 --- /dev/null +++ b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageMaker Training with MLflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup environment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Import necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.sklearn.estimator import SKLearn\n", + "\n", + "import boto3\n", + "import numpy as np\n", + "import pandas as pd\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Declare some variables used later" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define session, role, and region so we can\n", + "# perform any SageMaker tasks we need\n", + "sagemaker_session = sagemaker.Session()\n", + "role = get_execution_role()\n", + "region = sagemaker_session.boto_region_name\n", + "\n", + "# S3 prefix for the training dataset to be uploaded to\n", + "prefix = 'DEMO-scikit-iris'\n", + "\n", + "# MLflow (replace these values with your own)\n", + "tracking_server_arn = 'your tracking server arn'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p training_code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get some training data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's download the save the Iris dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(\"./data\", exist_ok=True)\n", + "\n", + "s3_client = boto3.client(\"s3\")\n", + "s3_client.download_file(\n", + " f\"sagemaker-example-files-prod-{region}\", 'datasets/tabular/iris/iris.data', './data/iris.csv'\n", + ")\n", + "\n", + "df_iris = pd.read_csv('./data/iris.csv', header=None)\n", + "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})\n", + "iris = df_iris[[4, 0, 1, 2, 3]].to_numpy()\n", + "np.savetxt('./data/iris.csv', iris, delimiter=',', fmt='%1.1f, %1.3f, %1.3f, %1.3f, %1.3f')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now let's upload that data to S3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "WORK_DIRECTORY = 'data'\n", + "\n", + "train_input = sagemaker_session.upload_data(\n", + " WORK_DIRECTORY, key_prefix='{}/{}'.format(prefix, WORK_DIRECTORY)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Write your training script" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's write the code to train a Decision Tree model using the scikit-learn framework" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/train.py\n", + "\n", + "from __future__ import print_function\n", + "\n", + "import argparse\n", + "import joblib\n", + "import os\n", + "import pandas as pd\n", + "\n", + "from sklearn import tree\n", + "\n", + "import mlflow\n", + "\n", + "if __name__ == '__main__':\n", + " parser = argparse.ArgumentParser()\n", + "\n", + " # Hyperparameters are described here. In this simple example we are just including one hyperparameter.\n", + " parser.add_argument('--max_leaf_nodes', type=int, default=-1)\n", + "\n", + " # Sagemaker specific arguments. Defaults are set in the environment variables.\n", + " parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])\n", + " parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])\n", + " parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])\n", + "\n", + " args = parser.parse_args()\n", + "\n", + " # Take the set of files and read them all into a single pandas dataframe\n", + " input_files = [ os.path.join(args.train, file) for file in os.listdir(args.train) if os.path.isfile(os.path.join(args.train, file))]\n", + " if len(input_files) == 0:\n", + " raise ValueError(('There are no files in {}.\\n' +\n", + " 'This usually indicates that the channel ({}) was incorrectly specified,\\n' +\n", + " 'the data specification in S3 was incorrectly specified or the role specified\\n' +\n", + " 'does not have permission to access the data.').format(args.train, \"train\"))\n", + " raw_data = [ pd.read_csv(file, header=None, engine=\"python\") for file in input_files ]\n", + " train_data = pd.concat(raw_data)\n", + "\n", + " # Set the Tracking Server URI using the ARN of the Tracking Server you created\n", + " mlflow.set_tracking_uri(os.environ['MLFLOW_TRACKING_ARN'])\n", + " \n", + " # Enable autologging in MLflow\n", + " mlflow.autolog()\n", + "\n", + " # labels are in the first column\n", + " train_y = train_data.iloc[:, 0]\n", + " train_X = train_data.iloc[:, 1:]\n", + "\n", + " # Here we support a single hyperparameter, 'max_leaf_nodes'. Note that you can add as many\n", + " # as your training my require in the ArgumentParser above.\n", + " max_leaf_nodes = args.max_leaf_nodes\n", + "\n", + " # Now use scikit-learn's decision tree classifier to train the model.\n", + " clf = tree.DecisionTreeClassifier(max_leaf_nodes=max_leaf_nodes)\n", + " clf = clf.fit(train_X, train_y)\n", + "\n", + " # Print the coefficients of the trained classifier, and save the coefficients\n", + " joblib.dump(clf, os.path.join(args.model_dir, 'model.joblib'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're using MLflow in our training script, let's make sure the container installs `mlflow` along with our MLflow AWS plugin before running our training script. We can do this by creating a `requirements.txt` file and putting it in the same directory as our training script." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile training_code/requirements.txt\n", + "mlflow==2.13.2\n", + "sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SageMaker Training and MLflow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Train your Decision tree model by launching a SageMaker Training job." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sklearn = SKLearn(\n", + " entry_point='train.py',\n", + " source_dir='training_code',\n", + " framework_version='1.2-1',\n", + " instance_type='ml.c4.xlarge',\n", + " role=role,\n", + " sagemaker_session=sagemaker_session,\n", + " hyperparameters={'max_leaf_nodes': 30},\n", + " keep_alive_period_in_seconds=3600,\n", + " environment={\n", + " 'MLFLOW_TRACKING_ARN': tracking_server_arn\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sklearn.fit({\"train\": train_input})" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "vscode": { + "interpreter": { + "hash": "3b41de70bedc0e302a3aeb58a0c77b854f2e56c8930e61a4aaa3340c96b01f1d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From a4ef61ae4fadd38527365c55eab68fb6ec4f900e Mon Sep 17 00:00:00 2001 From: Bobby Lindsey Date: Tue, 18 Jun 2024 17:35:02 -0600 Subject: [PATCH 2/5] Add badges --- .../sagemaker_deployment_mlflow.ipynb | 49 ++++++++++++++++++ sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb | 51 +++++++++++++++++++ .../sagemaker_pipelines_mlflow.ipynb | 51 +++++++++++++++++++ .../sagemaker_training_mlflow.ipynb | 49 ++++++++++++++++++ 4 files changed, 200 insertions(+) diff --git a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb index b4bff07aff..cd866fa3ff 100644 --- a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb @@ -7,6 +7,15 @@ "# Deploy a MLflow Model to SageMaker" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -445,6 +454,46 @@ "sagemaker_session.delete_endpoint_config(endpoint_config_name=built_model.endpoint_name)\n", "sagemaker_session.delete_endpoint(endpoint_name=built_model.endpoint_name)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-mlflow|sagemaker_deployment_mlflow.ipynb)" + ] } ], "metadata": { diff --git a/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb index 02018e80f1..d5d1f03a1f 100644 --- a/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb @@ -8,6 +8,16 @@ "# SageMaker HPO with MLflow" ] }, + { + "cell_type": "markdown", + "id": "78515a73", + "metadata": {}, + "source": [ + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)" + ] + }, { "cell_type": "markdown", "id": "ad2f8898-a6d1-4efb-83f9-e73d48401a10", @@ -624,6 +634,47 @@ " )\n", " tuner.fit({\"training\": train_input})" ] + }, + { + "cell_type": "markdown", + "id": "3ebae82c", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-mlflow|sagemaker_hpo_mlflow.ipynb)" + ] } ], "metadata": { diff --git a/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb index a68ed596c4..9b145f3257 100644 --- a/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb @@ -8,6 +8,16 @@ "# SageMaker Pipelines with MLflow" ] }, + { + "cell_type": "markdown", + "id": "a0908eda", + "metadata": {}, + "source": [ + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)" + ] + }, { "cell_type": "markdown", "id": "58a10420-4496-4d45-ba93-c261c3ca2aa8", @@ -605,6 +615,47 @@ "source": [ "execution.list_steps()" ] + }, + { + "cell_type": "markdown", + "id": "a17b4de5", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-mlflow|sagemaker_pipelines_mlflow.ipynb)" + ] } ], "metadata": { diff --git a/sagemaker-mlflow/sagemaker_training_mlflow.ipynb b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb index dae4dc26a4..a178ffec67 100644 --- a/sagemaker-mlflow/sagemaker_training_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb @@ -7,6 +7,15 @@ "# SageMaker Training with MLflow" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -266,6 +275,46 @@ "source": [ "sklearn.fit({\"train\": train_input})" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-mlflow|sagemaker_training_mlflow.ipynb)" + ] } ], "metadata": { From 2b185959ccbf60df8b49e9f7badbe7423d9760c7 Mon Sep 17 00:00:00 2001 From: Bobby Lindsey Date: Wed, 26 Jun 2024 16:08:22 -0600 Subject: [PATCH 3/5] Add MLflow setup notebook; upgrade SageMaker Python SDK for deployment notebook --- .../sagemaker_deployment_mlflow.ipynb | 16 + sagemaker-mlflow/sagemaker_mlflow_setup.ipynb | 419 ++++++++++++++++++ 2 files changed, 435 insertions(+) create mode 100644 sagemaker-mlflow/sagemaker_mlflow_setup.ipynb diff --git a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb index cd866fa3ff..31f5511cf8 100644 --- a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb @@ -23,6 +23,22 @@ "## Setup environment" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Upgrade SageMaker Python SDK" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --upgrade --quiet sagemaker>=2.215.0" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb b/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb new file mode 100644 index 0000000000..edae00562b --- /dev/null +++ b/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb @@ -0,0 +1,419 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "02127090-ee33-4005-b5af-5f4e386ed1a6", + "metadata": {}, + "source": [ + "# How to Setup Amazon SageMaker with MLflow" + ] + }, + { + "cell_type": "markdown", + "id": "557f10ee-714a-4378-9493-abe2cd010754", + "metadata": {}, + "source": [ + "This notebook's CI test result for us-west-2 is as follows. CI test results in other regions can be found at the end of the notebook.\n", + "\n", + "![This us-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-2/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "9f09f362-71a7-409c-a4c7-0ee5e59c1581", + "metadata": {}, + "source": [ + "## Updates and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd83cc42-fc1e-49cd-88e3-7a685add2404", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -U --quiet boto3" + ] + }, + { + "cell_type": "markdown", + "id": "f932a722-a2cd-4aca-bdc0-d00553439966", + "metadata": {}, + "source": [ + "Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "329cf85a-352c-4f55-8e2a-4771a26fbe70", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import sagemaker\n", + "import boto3" + ] + }, + { + "cell_type": "markdown", + "id": "95c2869e-1845-4534-bf97-d530b5c27c48", + "metadata": {}, + "source": [ + "Session variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ece22344-f747-4fb2-9051-3640dd95dd6b", + "metadata": {}, + "outputs": [], + "source": [ + "sess = sagemaker.Session()\n", + "bucket_name = sess.default_bucket()\n", + "role = sagemaker.get_execution_role()\n", + "region = sess.boto_region_name\n", + "\n", + "iam_client = boto3.client('iam')\n", + "sts_client = boto3.client(\"sts\")\n", + "sm_client = boto3.client('sagemaker')\n", + "account_id = sts_client.get_caller_identity()[\"Account\"]\n", + "tracking_server_name = 'my-setup-test3'\n", + "mlflow_role_name = 'mlflow-test3'" + ] + }, + { + "cell_type": "markdown", + "id": "6c292837-353c-4c3c-91b9-3088e8d5a02b", + "metadata": {}, + "source": [ + "## MLflow Permissions" + ] + }, + { + "cell_type": "markdown", + "id": "e6bae350-030f-4ecf-8380-5b11b73b5806", + "metadata": {}, + "source": [ + "### IAM Role for the MLflow Tracking Server\n", + "\n", + "To run the next cell, make sure the IAM role used while running this notebook has permission to create an IAM Role. \n", + "The `iam:CreateRole`, `iam:CreatePolicy`, `iam:ListPolicies`, and `iam:AttachRolePolicy` action must be allowed by the notebook execution role's policy.\n", + "\n", + "If you are running this notebook from SageMaker Studio, you can update your notebook execution role through the following steps: \n", + "\n", + "1. Navigate to the AWS Console and select the Domain you are using\n", + "2. Under the Domain, select the User Profile you are using. You will see the Execution Role listed there.\n", + "3. Navigate to the IAM Console, search for the Execution Role under \"Roles\", and update your role with a policy that allows the `iam:CreateRole`, `iam:CreatePolicy`, `iam:ListPolicies`, and `iam:AttachRolePolicy` actions. \n", + "\n", + "If you are not using a SageMaker Studio Notebook, confirm that the role you have used to configure your AWS CLI has appropriate permissions to create an IAM role and attach a policy to it. \n", + "\n", + "Here is an example of an inline policy you can add to your role - \n", + "\n", + "```json\n", + "{\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [\n", + " {\n", + " \"Sid\": \"Statement1\",\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": [\n", + " \"iam:ListPolicies\",\n", + " \"iam:CreatePolicy\",\n", + " \"iam:CreateRole\",\n", + " \"iam:AttachRolePolicy\"\n", + " ],\n", + " \"Resource\": [\n", + " \"*\"\n", + " ]\n", + " }\n", + " ]\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96c0ad98-f237-4bfd-b134-40b46ebfa81d", + "metadata": {}, + "outputs": [], + "source": [ + "mlflow_trust_policy = {\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [\n", + " {\n", + " \"Effect\": \"Allow\",\n", + " \"Principal\": {\n", + " \"Service\": [\n", + " \"sagemaker.amazonaws.com\"\n", + " ]\n", + " },\n", + " \"Action\": \"sts:AssumeRole\"\n", + " }\n", + " ]\n", + "}\n", + "\n", + "# Create role for MLflow\n", + "mlflow_role = iam_client.create_role(\n", + " RoleName=mlflow_role_name,\n", + " AssumeRolePolicyDocument=json.dumps(mlflow_trust_policy)\n", + ")\n", + "mlflow_role_arn = mlflow_role['Role']['Arn']\n", + "\n", + "# Create policy for S3 and SageMaker Model Registry\n", + "sm_s3_model_registry_policy = {\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [\n", + " {\n", + " \"Effect\": \"Allow\",\n", + " \"Action\": [\n", + " \"s3:Get*\",\n", + " \"s3:Put*\",\n", + " \"s3:List*\",\n", + " \"sagemaker:AddTags\",\n", + " \"sagemaker:CreateModelPackageGroup\",\n", + " \"sagemaker:CreateModelPackage\",\n", + " \"sagemaker:UpdateModelPackage\",\n", + " \"sagemaker:DescribeModelPackageGroup\"\n", + " ],\n", + " \"Resource\": \"*\"\n", + " }\n", + " ]\n", + "}\n", + "\n", + "mlflow_s3_sm_model_registry_iam_policy = iam_client.create_policy(PolicyName='mlflow-s3-sm-model-registry',\n", + " PolicyDocument=json.dumps(sm_s3_model_registry_policy))\n", + "mlflow_s3_sm_model_registry_iam_policy_arn = mlflow_s3_sm_model_registry_iam_policy['Policy']['Arn']\n", + "\n", + "# Attach the policy to the MLflow role\n", + "iam_client.attach_role_policy(\n", + " RoleName=mlflow_role_name,\n", + " PolicyArn=mlflow_s3_sm_model_registry_iam_policy_arn\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "65e2744c-c1b4-4444-9e8f-fbf1315a71a4", + "metadata": {}, + "source": [ + "Note that your SageMaker execution role should have the following permissions to call Mlflow REST APIs:\n", + "\n", + "```json\n", + "{\n", + " \"Version\": \"2012-10-17\", \n", + " \"Statement\": [ \n", + " { \n", + " \"Effect\": \"Allow\", \n", + " \"Action\": [\n", + " \"sagemaker-mlflow:*\",\n", + " \"sagemaker:CreateMlflowTrackingServer\",\n", + " \"sagemaker:UpdateMlflowTrackingServer\",\n", + " \"sagemaker:DeleteMlflowTrackingServer\",\n", + " \"sagemaker:StartMlflowTrackingServer\",\n", + " \"sagemaker:StopMlflowTrackingServer\",\n", + " \"sagemaker:CreatePresignedMlflowTrackingServerUrl\"\n", + " ], \n", + " \"Resource\": \"*\" \n", + " } \n", + " ]\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "ade88b9a-961a-4ced-9320-e56d7e9cf3eb", + "metadata": {}, + "source": [ + "## Create MLflow Tracking Server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d496f9b-4493-4ab2-9d35-8d4ec0f79620", + "metadata": {}, + "outputs": [], + "source": [ + "sm_client.create_mlflow_tracking_server(\n", + " TrackingServerName=tracking_server_name,\n", + " ArtifactStoreUri=f's3://{bucket_name}/{tracking_server_name}',\n", + " TrackingServerSize='Small',\n", + " MlflowVersion='2.13.2',\n", + " RoleArn=mlflow_role_arn,\n", + " AutomaticModelRegistration=False\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20d535f6-6dd2-4c5c-99e3-8b428c052c70", + "metadata": {}, + "outputs": [], + "source": [ + "tracking_server_arn = f\"arn:aws:sagemaker:{region}:{account_id}:mlflow-tracking-server/{tracking_server_name}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddff09d7-73aa-4f77-b437-1e8c05c59ea2", + "metadata": {}, + "outputs": [], + "source": [ + "sm_client.describe_mlflow_tracking_server(TrackingServerName=tracking_server_name)" + ] + }, + { + "cell_type": "markdown", + "id": "e6c50a30-89e4-4ea9-8fe8-df15a2f7726e", + "metadata": {}, + "source": [ + "Install the MLflow SDK and our MLflow AWS Plugin" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2232f516-f23c-4c0d-ada2-933a45fea6e9", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet mlflow==2.13.2 sagemaker-mlflow==0.1.0" + ] + }, + { + "cell_type": "markdown", + "id": "073d12e9-b91e-4c0c-93d1-8cae66648e49", + "metadata": {}, + "source": [ + "## MLflow tracking test" + ] + }, + { + "cell_type": "markdown", + "id": "ad90cde7-9de2-4df7-80a5-010165edafce", + "metadata": {}, + "source": [ + "Connect to tracking server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7a43ce7-3e9a-4b47-b051-9f59522ee43f", + "metadata": {}, + "outputs": [], + "source": [ + "import mlflow\n", + "mlflow.set_tracking_uri(tracking_server_arn)" + ] + }, + { + "cell_type": "markdown", + "id": "c9197fca-6370-4f91-a52f-440ef5b22484", + "metadata": {}, + "source": [ + "Log a metric" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bab5d5df-c1a8-4a2b-89e1-52d36d630f3d", + "metadata": {}, + "outputs": [], + "source": [ + "with mlflow.start_run():\n", + " mlflow.log_metric(\"foo\", 1)" + ] + }, + { + "cell_type": "markdown", + "id": "d603ef2f-9c42-4ef2-896e-73ab1eaa6ace", + "metadata": {}, + "source": [ + "See results in MLflow UI. You can either launch the MLflow UI from within SageMaker Studio, or generate a pre-signed URL like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0690708f-976c-472e-8e4d-281aa163e9aa", + "metadata": {}, + "outputs": [], + "source": [ + "sm_client.create_presigned_mlflow_tracking_server_url(\n", + " TrackingServerName=tracking_server_name\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0f739f1a-2a97-4cc5-bb6b-bc59e4111d0f", + "metadata": {}, + "source": [ + "## Notebook CI Test Results\n", + "\n", + "This notebook was tested in multiple regions. The test results are as follows, except for us-west-2 which is shown at the top of the notebook.\n", + "\n", + "\n", + "![This us-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This us-east-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-east-2/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This us-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/us-west-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ca-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ca-central-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This sa-east-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/sa-east-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This eu-west-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This eu-west-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-2/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This eu-west-3 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-west-3/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This eu-central-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-central-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This eu-north-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/eu-north-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ap-southeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ap-southeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-southeast-2/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ap-northeast-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ap-northeast-2 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-northeast-2/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)\n", + "\n", + "![This ap-south-1 badge failed to load. Check your device's internet connectivity, otherwise the service is currently unavailable](https://prod.us-west-2.tcx-beacon.docs.aws.dev/sagemaker-nb/ap-south-1/sagemaker-mlflow|sagemaker_mlflow_setup.ipynb)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 4b777dbb25f12b05712adfc7d0e7c2b8ab082031 Mon Sep 17 00:00:00 2001 From: Bobby Lindsey Date: Mon, 1 Jul 2024 15:00:26 -0600 Subject: [PATCH 4/5] Linting --- sagemaker-mlflow/sagemaker_mlflow_setup.ipynb | 66 +++++++++---------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb b/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb index edae00562b..3ee5907980 100644 --- a/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb +++ b/sagemaker-mlflow/sagemaker_mlflow_setup.ipynb @@ -76,12 +76,12 @@ "role = sagemaker.get_execution_role()\n", "region = sess.boto_region_name\n", "\n", - "iam_client = boto3.client('iam')\n", + "iam_client = boto3.client(\"iam\")\n", "sts_client = boto3.client(\"sts\")\n", - "sm_client = boto3.client('sagemaker')\n", + "sm_client = boto3.client(\"sagemaker\")\n", "account_id = sts_client.get_caller_identity()[\"Account\"]\n", - "tracking_server_name = 'my-setup-test3'\n", - "mlflow_role_name = 'mlflow-test3'" + "tracking_server_name = \"my-setup-test3\"\n", + "mlflow_role_name = \"mlflow-test3\"" ] }, { @@ -142,26 +142,21 @@ "outputs": [], "source": [ "mlflow_trust_policy = {\n", - " \"Version\": \"2012-10-17\",\n", - " \"Statement\": [\n", - " {\n", - " \"Effect\": \"Allow\",\n", - " \"Principal\": {\n", - " \"Service\": [\n", - " \"sagemaker.amazonaws.com\"\n", - " ]\n", - " },\n", - " \"Action\": \"sts:AssumeRole\"\n", - " }\n", - " ]\n", + " \"Version\": \"2012-10-17\",\n", + " \"Statement\": [\n", + " {\n", + " \"Effect\": \"Allow\",\n", + " \"Principal\": {\"Service\": [\"sagemaker.amazonaws.com\"]},\n", + " \"Action\": \"sts:AssumeRole\",\n", + " }\n", + " ],\n", "}\n", "\n", "# Create role for MLflow\n", "mlflow_role = iam_client.create_role(\n", - " RoleName=mlflow_role_name,\n", - " AssumeRolePolicyDocument=json.dumps(mlflow_trust_policy)\n", + " RoleName=mlflow_role_name, AssumeRolePolicyDocument=json.dumps(mlflow_trust_policy)\n", ")\n", - "mlflow_role_arn = mlflow_role['Role']['Arn']\n", + "mlflow_role_arn = mlflow_role[\"Role\"][\"Arn\"]\n", "\n", "# Create policy for S3 and SageMaker Model Registry\n", "sm_s3_model_registry_policy = {\n", @@ -177,21 +172,21 @@ " \"sagemaker:CreateModelPackageGroup\",\n", " \"sagemaker:CreateModelPackage\",\n", " \"sagemaker:UpdateModelPackage\",\n", - " \"sagemaker:DescribeModelPackageGroup\"\n", + " \"sagemaker:DescribeModelPackageGroup\",\n", " ],\n", - " \"Resource\": \"*\"\n", + " \"Resource\": \"*\",\n", " }\n", - " ]\n", + " ],\n", "}\n", "\n", - "mlflow_s3_sm_model_registry_iam_policy = iam_client.create_policy(PolicyName='mlflow-s3-sm-model-registry',\n", - " PolicyDocument=json.dumps(sm_s3_model_registry_policy))\n", - "mlflow_s3_sm_model_registry_iam_policy_arn = mlflow_s3_sm_model_registry_iam_policy['Policy']['Arn']\n", + "mlflow_s3_sm_model_registry_iam_policy = iam_client.create_policy(\n", + " PolicyName=\"mlflow-s3-sm-model-registry\", PolicyDocument=json.dumps(sm_s3_model_registry_policy)\n", + ")\n", + "mlflow_s3_sm_model_registry_iam_policy_arn = mlflow_s3_sm_model_registry_iam_policy[\"Policy\"][\"Arn\"]\n", "\n", "# Attach the policy to the MLflow role\n", "iam_client.attach_role_policy(\n", - " RoleName=mlflow_role_name,\n", - " PolicyArn=mlflow_s3_sm_model_registry_iam_policy_arn\n", + " RoleName=mlflow_role_name, PolicyArn=mlflow_s3_sm_model_registry_iam_policy_arn\n", ")" ] }, @@ -241,11 +236,11 @@ "source": [ "sm_client.create_mlflow_tracking_server(\n", " TrackingServerName=tracking_server_name,\n", - " ArtifactStoreUri=f's3://{bucket_name}/{tracking_server_name}',\n", - " TrackingServerSize='Small',\n", - " MlflowVersion='2.13.2',\n", + " ArtifactStoreUri=f\"s3://{bucket_name}/{tracking_server_name}\",\n", + " TrackingServerSize=\"Small\",\n", + " MlflowVersion=\"2.13.2\",\n", " RoleArn=mlflow_role_arn,\n", - " AutomaticModelRegistration=False\n", + " AutomaticModelRegistration=False,\n", ")" ] }, @@ -256,7 +251,9 @@ "metadata": {}, "outputs": [], "source": [ - "tracking_server_arn = f\"arn:aws:sagemaker:{region}:{account_id}:mlflow-tracking-server/{tracking_server_name}\"" + "tracking_server_arn = (\n", + " f\"arn:aws:sagemaker:{region}:{account_id}:mlflow-tracking-server/{tracking_server_name}\"\n", + ")" ] }, { @@ -311,6 +308,7 @@ "outputs": [], "source": [ "import mlflow\n", + "\n", "mlflow.set_tracking_uri(tracking_server_arn)" ] }, @@ -348,9 +346,7 @@ "metadata": {}, "outputs": [], "source": [ - "sm_client.create_presigned_mlflow_tracking_server_url(\n", - " TrackingServerName=tracking_server_name\n", - ")" + "sm_client.create_presigned_mlflow_tracking_server_url(TrackingServerName=tracking_server_name)" ] }, { From a6ad9bb8d8d8034ff5bfc2d4da06393ef4d4e59c Mon Sep 17 00:00:00 2001 From: Bobby Lindsey Date: Mon, 1 Jul 2024 20:38:00 -0600 Subject: [PATCH 5/5] More linting changes --- .../sagemaker_deployment_mlflow.ipynb | 39 ++-- sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb | 30 ++-- .../sagemaker_pipelines_mlflow.ipynb | 166 +++++++++--------- .../sagemaker_training_mlflow.ipynb | 30 ++-- 4 files changed, 122 insertions(+), 143 deletions(-) diff --git a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb index 31f5511cf8..296ab997ea 100644 --- a/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_deployment_mlflow.ipynb @@ -102,10 +102,10 @@ "region = sagemaker_session.boto_region_name\n", "\n", "# S3 prefix for the training dataset to be uploaded to\n", - "prefix = 'DEMO-scikit-iris'\n", + "prefix = \"DEMO-scikit-iris\"\n", "\n", "# Provide the ARN of the Tracking Server that you want to track your training job with\n", - "tracking_server_arn = 'your tracking server arn here'" + "tracking_server_arn = \"your tracking server arn here\"" ] }, { @@ -141,13 +141,13 @@ "\n", "s3_client = boto3.client(\"s3\")\n", "s3_client.download_file(\n", - " f\"sagemaker-example-files-prod-{region}\", 'datasets/tabular/iris/iris.data', './data/iris.csv'\n", + " f\"sagemaker-example-files-prod-{region}\", \"datasets/tabular/iris/iris.data\", \"./data/iris.csv\"\n", ")\n", "\n", - "df_iris = pd.read_csv('./data/iris.csv', header=None)\n", - "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})\n", + "df_iris = pd.read_csv(\"./data/iris.csv\", header=None)\n", + "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, \"Iris-versicolor\": 1, \"Iris-virginica\": 2})\n", "iris = df_iris[[4, 0, 1, 2, 3]].to_numpy()\n", - "np.savetxt('./data/iris.csv', iris, delimiter=',', fmt='%1.1f, %1.3f, %1.3f, %1.3f, %1.3f')" + "np.savetxt(\"./data/iris.csv\", iris, delimiter=\",\", fmt=\"%1.1f, %1.3f, %1.3f, %1.3f, %1.3f\")" ] }, { @@ -163,10 +163,10 @@ "metadata": {}, "outputs": [], "source": [ - "WORK_DIRECTORY = 'data'\n", + "WORK_DIRECTORY = \"data\"\n", "\n", "train_input = sagemaker_session.upload_data(\n", - " WORK_DIRECTORY, key_prefix='{}/{}'.format(prefix, WORK_DIRECTORY)\n", + " WORK_DIRECTORY, key_prefix=\"{}/{}\".format(prefix, WORK_DIRECTORY)\n", ")" ] }, @@ -294,17 +294,15 @@ "outputs": [], "source": [ "sklearn = SKLearn(\n", - " entry_point='train.py',\n", - " source_dir='training_code',\n", - " framework_version='1.2-1',\n", - " instance_type='ml.c4.xlarge',\n", + " entry_point=\"train.py\",\n", + " source_dir=\"training_code\",\n", + " framework_version=\"1.2-1\",\n", + " instance_type=\"ml.c4.xlarge\",\n", " role=role,\n", " sagemaker_session=sagemaker_session,\n", - " hyperparameters={'max_leaf_nodes': 30},\n", + " hyperparameters={\"max_leaf_nodes\": 30},\n", " keep_alive_period_in_seconds=3600,\n", - " environment={\n", - " 'MLFLOW_TRACKING_ARN': tracking_server_arn\n", - " }\n", + " environment={\"MLFLOW_TRACKING_ARN\": tracking_server_arn},\n", ")" ] }, @@ -410,9 +408,7 @@ " mode=Mode.SAGEMAKER_ENDPOINT,\n", " schema_builder=sklearn_schema_builder,\n", " role_arn=role,\n", - " model_metadata={\n", - " \"MLFLOW_MODEL_PATH\": source_path\n", - " }\n", + " model_metadata={\"MLFLOW_MODEL_PATH\": source_path},\n", ")" ] }, @@ -431,10 +427,7 @@ "metadata": {}, "outputs": [], "source": [ - "predictor = built_model.deploy(\n", - " initial_instance_count=1,\n", - " instance_type=\"ml.m5.large\"\n", - ")" + "predictor = built_model.deploy(initial_instance_count=1, instance_type=\"ml.m5.large\")" ] }, { diff --git a/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb index d5d1f03a1f..4b6853403a 100644 --- a/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_hpo_mlflow.ipynb @@ -109,11 +109,11 @@ "bucket = sagemaker_session.default_bucket()\n", "\n", "# S3 prefix for the training dataset to be uploaded to\n", - "prefix = 'DEMO-pytorch-mnist'\n", + "prefix = \"DEMO-pytorch-mnist\"\n", "\n", "# MLflow (replace these values with your own)\n", - "tracking_server_arn = 'your tracking server arn'\n", - "experiment_name = 'MNIST'" + "tracking_server_arn = \"your tracking server arn\"\n", + "experiment_name = \"MNIST\"" ] }, { @@ -149,9 +149,9 @@ "metadata": {}, "outputs": [], "source": [ - "local_dir = 'data'\n", + "local_dir = \"data\"\n", "MNIST.mirrors = [\n", - " f'https://sagemaker-example-files-prod-{region}.s3.amazonaws.com/datasets/image/MNIST/'\n", + " f\"https://sagemaker-example-files-prod-{region}.s3.amazonaws.com/datasets/image/MNIST/\"\n", "]\n", "MNIST(\n", " local_dir,\n", @@ -177,7 +177,7 @@ "metadata": {}, "outputs": [], "source": [ - "train_input = sagemaker_session.upload_data(path='data', bucket=bucket, key_prefix=prefix)" + "train_input = sagemaker_session.upload_data(path=\"data\", bucket=bucket, key_prefix=prefix)" ] }, { @@ -577,10 +577,7 @@ "\n", "objective_metric_name = \"average test loss\"\n", "objective_type = \"Minimize\"\n", - "metric_definitions = [\n", - " {\"Name\": \"average test loss\",\n", - " \"Regex\": \"Test set: Average loss: ([0-9\\\\.]+)\"}\n", - "]" + "metric_definitions = [{\"Name\": \"average test loss\", \"Regex\": \"Test set: Average loss: ([0-9\\\\.]+)\"}]" ] }, { @@ -612,17 +609,14 @@ " framework_version=\"1.13\",\n", " instance_count=1,\n", " instance_type=\"ml.c5.2xlarge\",\n", - " hyperparameters={\n", - " \"epochs\": 5,\n", - " \"backend\": \"gloo\"\n", - " },\n", + " hyperparameters={\"epochs\": 5, \"backend\": \"gloo\"},\n", " environment={\n", - " 'MLFLOW_TRACKING_URI':tracking_server_arn,\n", - " 'MLFLOW_EXPERIMENT_NAME':experiment.name,\n", - " 'MLFLOW_PARENT_RUN_ID':run.info.run_id\n", + " \"MLFLOW_TRACKING_URI\": tracking_server_arn,\n", + " \"MLFLOW_EXPERIMENT_NAME\": experiment.name,\n", + " \"MLFLOW_PARENT_RUN_ID\": run.info.run_id,\n", " },\n", " )\n", - " \n", + "\n", " tuner = HyperparameterTuner(\n", " estimator,\n", " objective_metric_name,\n", diff --git a/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb index 9b145f3257..4ad94a49f3 100644 --- a/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_pipelines_mlflow.ipynb @@ -76,12 +76,10 @@ "region = sagemaker_session.boto_region_name\n", "\n", "pipeline_name = \"breast-cancer-xgb\"\n", - "instance_type = ParameterString(\n", - " name=\"TrainingInstanceType\", default_value=\"ml.m5.xlarge\"\n", - ")\n", + "instance_type = ParameterString(name=\"TrainingInstanceType\", default_value=\"ml.m5.xlarge\")\n", "\n", "# Mlflow (replace these values with your own)\n", - "tracking_server_arn = 'your tracking server arn'\n", + "tracking_server_arn = \"your tracking server arn\"\n", "experiment_name = \"sm-pipelines-experiment\"" ] }, @@ -129,7 +127,7 @@ "outputs": [], "source": [ "# Set path to config file\n", - "os.environ['SAGEMAKER_USER_CONFIG_OVERRIDE'] = os.getcwd()" + "os.environ[\"SAGEMAKER_USER_CONFIG_OVERRIDE\"] = os.getcwd()" ] }, { @@ -205,45 +203,46 @@ "outputs": [], "source": [ "random_state = 2023\n", - "label_column = 'diagnosis'\n", + "label_column = \"diagnosis\"\n", "\n", "feature_names = [\n", - " 'id',\n", - " 'diagnosis',\n", - " 'radius_mean',\n", - " 'texture_mean',\n", - " 'perimeter_mean',\n", - " 'area_mean',\n", - " 'smoothness_mean',\n", - " 'compactness_mean',\n", - " 'concavity_mean',\n", - " 'concave points_mean',\n", - " 'symmetry_mean',\n", - " 'fractal_dimension_mean',\n", - " 'radius_se',\n", - " 'texture_se',\n", - " 'perimeter_se',\n", - " 'area_se',\n", - " 'smoothness_se',\n", - " 'compactness_se',\n", - " 'concavity_se',\n", - " 'concave points_se',\n", - " 'symmetry_se',\n", - " 'fractal_dimension_se',\n", - " 'radius_worst',\n", - " 'texture_worst',\n", - " 'perimeter_worst',\n", - " 'area_worst',\n", - " 'smoothness_worst',\n", - " 'compactness_worst',\n", - " 'concavity_worst',\n", - " 'concave points_worst',\n", - " 'symmetry_worst',\n", - " 'fractal_dimension_worst',\n", + " \"id\",\n", + " \"diagnosis\",\n", + " \"radius_mean\",\n", + " \"texture_mean\",\n", + " \"perimeter_mean\",\n", + " \"area_mean\",\n", + " \"smoothness_mean\",\n", + " \"compactness_mean\",\n", + " \"concavity_mean\",\n", + " \"concave points_mean\",\n", + " \"symmetry_mean\",\n", + " \"fractal_dimension_mean\",\n", + " \"radius_se\",\n", + " \"texture_se\",\n", + " \"perimeter_se\",\n", + " \"area_se\",\n", + " \"smoothness_se\",\n", + " \"compactness_se\",\n", + " \"concavity_se\",\n", + " \"concave points_se\",\n", + " \"symmetry_se\",\n", + " \"fractal_dimension_se\",\n", + " \"radius_worst\",\n", + " \"texture_worst\",\n", + " \"perimeter_worst\",\n", + " \"area_worst\",\n", + " \"smoothness_worst\",\n", + " \"compactness_worst\",\n", + " \"concavity_worst\",\n", + " \"concave points_worst\",\n", + " \"symmetry_worst\",\n", + " \"fractal_dimension_worst\",\n", "]\n", "\n", + "\n", "@step(\n", - " name='DataPreprocessing',\n", + " name=\"DataPreprocessing\",\n", " instance_type=instance_type,\n", ")\n", "def preprocess(\n", @@ -261,28 +260,26 @@ " mlflow.set_experiment(experiment_name)\n", " with mlflow.start_run(run_name=run_name) as run:\n", " run_id = run.info.run_id\n", - " with mlflow.start_run(run_name='DataPreprocessing', nested=True):\n", + " with mlflow.start_run(run_name=\"DataPreprocessing\", nested=True):\n", " df = pd.read_csv(raw_data_s3_path, header=None, names=feature_names)\n", - " df.drop(columns='id', inplace=True)\n", + " df.drop(columns=\"id\", inplace=True)\n", " mlflow.log_input(\n", " mlflow.data.from_pandas(df, raw_data_s3_path, targets=label_column),\n", - " context='DataPreprocessing',\n", - " )\n", - " \n", - " train_df, test_df = train_test_split(\n", - " df, test_size=0.2, stratify=df[label_column]\n", + " context=\"DataPreprocessing\",\n", " )\n", + "\n", + " train_df, test_df = train_test_split(df, test_size=0.2, stratify=df[label_column])\n", " validation_df, test_df = train_test_split(\n", " test_df, test_size=0.5, stratify=test_df[label_column]\n", " )\n", " train_df.reset_index(inplace=True, drop=True)\n", " validation_df.reset_index(inplace=True, drop=True)\n", " test_df.reset_index(inplace=True, drop=True)\n", - " \n", - " train_s3_path = f's3://{bucket}/{output_prefix}/train.csv'\n", - " val_s3_path = f's3://{bucket}/{output_prefix}/val.csv'\n", - " test_s3_path = f's3://{bucket}/{output_prefix}/test.csv'\n", - " \n", + "\n", + " train_s3_path = f\"s3://{bucket}/{output_prefix}/train.csv\"\n", + " val_s3_path = f\"s3://{bucket}/{output_prefix}/val.csv\"\n", + " test_s3_path = f\"s3://{bucket}/{output_prefix}/test.csv\"\n", + "\n", " train_df.to_csv(train_s3_path, index=False)\n", " validation_df.to_csv(val_s3_path, index=False)\n", " test_df.to_csv(test_s3_path, index=False)\n", @@ -317,19 +314,19 @@ "source": [ "use_gpu = False\n", "param = dict(\n", - " objective='binary:logistic',\n", + " objective=\"binary:logistic\",\n", " max_depth=5,\n", " eta=0.2,\n", " gamma=4,\n", " min_child_weight=6,\n", " subsample=0.7,\n", - " tree_method='gpu_hist' if use_gpu else 'hist', # Use GPU accelerated algorithm\n", + " tree_method=\"gpu_hist\" if use_gpu else \"hist\", # Use GPU accelerated algorithm\n", ")\n", "num_round = 50\n", "\n", "\n", "@step(\n", - " name='ModelTraining',\n", + " name=\"ModelTraining\",\n", " instance_type=instance_type,\n", ")\n", "def train(\n", @@ -348,24 +345,24 @@ " mlflow.set_experiment(experiment_name)\n", "\n", " with mlflow.start_run(run_id=run_id):\n", - " with mlflow.start_run(run_name='ModelTraining', nested=True) as training_run:\n", + " with mlflow.start_run(run_name=\"ModelTraining\", nested=True) as training_run:\n", " training_run_id = training_run.info.run_id\n", " mlflow.xgboost.autolog(\n", " log_input_examples=True,\n", " log_model_signatures=True,\n", " log_models=True,\n", " log_datasets=True,\n", - " model_format='xgb',\n", + " model_format=\"xgb\",\n", " )\n", - " \n", + "\n", " # read data files from S3\n", " train_df = pd.read_csv(train_s3_path)\n", " validation_df = pd.read_csv(validation_s3_path)\n", - " \n", + "\n", " # create dataframe and label series\n", - " y_train = (train_df.pop(label_column) == 'M').astype('int')\n", - " y_validation = (validation_df.pop(label_column) == 'M').astype('int')\n", - " \n", + " y_train = (train_df.pop(label_column) == \"M\").astype(\"int\")\n", + " y_validation = (validation_df.pop(label_column) == \"M\").astype(\"int\")\n", + "\n", " xgb = XGBClassifier(n_estimators=num_round, **param)\n", " xgb.fit(\n", " train_df,\n", @@ -404,7 +401,7 @@ "outputs": [], "source": [ "@step(\n", - " name='ModelEvaluation',\n", + " name=\"ModelEvaluation\",\n", " instance_type=instance_type,\n", ")\n", "def evaluate(\n", @@ -420,19 +417,19 @@ " mlflow.set_experiment(experiment_name)\n", "\n", " with mlflow.start_run(run_id=run_id):\n", - " with mlflow.start_run(run_name='ModelEvaluation', nested=True):\n", + " with mlflow.start_run(run_name=\"ModelEvaluation\", nested=True):\n", " test_df = pd.read_csv(test_s3_path)\n", - " test_df[label_column] = (test_df[label_column] == 'M').astype('int')\n", - " model = mlflow.pyfunc.load_model(f'runs:/{training_run_id}/model')\n", - " \n", + " test_df[label_column] = (test_df[label_column] == \"M\").astype(\"int\")\n", + " model = mlflow.pyfunc.load_model(f\"runs:/{training_run_id}/model\")\n", + "\n", " results = mlflow.evaluate(\n", " model=model,\n", " data=test_df,\n", " targets=label_column,\n", - " model_type='classifier',\n", - " evaluators=['default'],\n", + " model_type=\"classifier\",\n", + " evaluators=[\"default\"],\n", " )\n", - " return {'f1_score': results.metrics['f1_score']}" + " return {\"f1_score\": results.metrics[\"f1_score\"]}" ] }, { @@ -459,7 +456,7 @@ "outputs": [], "source": [ "@step(\n", - " name='ModelRegistration',\n", + " name=\"ModelRegistration\",\n", " instance_type=instance_type,\n", ")\n", "def register(\n", @@ -474,8 +471,8 @@ " mlflow.set_experiment(experiment_name)\n", "\n", " with mlflow.start_run(run_id=run_id):\n", - " with mlflow.start_run(run_name='ModelRegistration', nested=True):\n", - " mlflow.register_model(f'runs:/{training_run_id}/model', pipeline_name)" + " with mlflow.start_run(run_name=\"ModelRegistration\", nested=True):\n", + " mlflow.register_model(f\"runs:/{training_run_id}/model\", pipeline_name)" ] }, { @@ -499,7 +496,7 @@ "source": [ "preprocessing_step = preprocess(\n", " raw_data_s3_path=input_path,\n", - " output_prefix=f'{pipeline_name}/dataset',\n", + " output_prefix=f\"{pipeline_name}/dataset\",\n", " experiment_name=experiment_name,\n", " run_name=ExecutionVariables.PIPELINE_EXECUTION_ID,\n", ")\n", @@ -512,7 +509,7 @@ ")\n", "\n", "conditional_register_step = ConditionStep(\n", - " name='ConditionalRegister',\n", + " name=\"ConditionalRegister\",\n", " conditions=[\n", " ConditionGreaterThanOrEqualTo(\n", " left=evaluate(\n", @@ -520,16 +517,17 @@ " experiment_name=preprocessing_step[3],\n", " run_id=preprocessing_step[4],\n", " training_run_id=training_step[2],\n", - " )['f1_score'],\n", + " )[\"f1_score\"],\n", " right=0.8,\n", " )\n", " ],\n", - " if_steps=[register(\n", - " pipeline_name=pipeline_name,\n", - " experiment_name=preprocessing_step[3],\n", - " run_id=preprocessing_step[4],\n", - " training_run_id=training_step[2],\n", - " )\n", + " if_steps=[\n", + " register(\n", + " pipeline_name=pipeline_name,\n", + " experiment_name=preprocessing_step[3],\n", + " run_id=preprocessing_step[4],\n", + " training_run_id=training_step[2],\n", + " )\n", " ],\n", " else_steps=[FailStep(name=\"Fail\", error_message=\"Model performance is not good enough\")],\n", ")\n", @@ -539,11 +537,7 @@ " parameters=[\n", " instance_type,\n", " ],\n", - " steps=[\n", - " preprocessing_step,\n", - " training_step,\n", - " conditional_register_step\n", - " ],\n", + " steps=[preprocessing_step, training_step, conditional_register_step],\n", ")" ] }, diff --git a/sagemaker-mlflow/sagemaker_training_mlflow.ipynb b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb index a178ffec67..21bdcc7d7a 100644 --- a/sagemaker-mlflow/sagemaker_training_mlflow.ipynb +++ b/sagemaker-mlflow/sagemaker_training_mlflow.ipynb @@ -66,10 +66,10 @@ "region = sagemaker_session.boto_region_name\n", "\n", "# S3 prefix for the training dataset to be uploaded to\n", - "prefix = 'DEMO-scikit-iris'\n", + "prefix = \"DEMO-scikit-iris\"\n", "\n", "# MLflow (replace these values with your own)\n", - "tracking_server_arn = 'your tracking server arn'" + "tracking_server_arn = \"your tracking server arn\"" ] }, { @@ -105,13 +105,13 @@ "\n", "s3_client = boto3.client(\"s3\")\n", "s3_client.download_file(\n", - " f\"sagemaker-example-files-prod-{region}\", 'datasets/tabular/iris/iris.data', './data/iris.csv'\n", + " f\"sagemaker-example-files-prod-{region}\", \"datasets/tabular/iris/iris.data\", \"./data/iris.csv\"\n", ")\n", "\n", - "df_iris = pd.read_csv('./data/iris.csv', header=None)\n", - "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})\n", + "df_iris = pd.read_csv(\"./data/iris.csv\", header=None)\n", + "df_iris[4] = df_iris[4].map({\"Iris-setosa\": 0, \"Iris-versicolor\": 1, \"Iris-virginica\": 2})\n", "iris = df_iris[[4, 0, 1, 2, 3]].to_numpy()\n", - "np.savetxt('./data/iris.csv', iris, delimiter=',', fmt='%1.1f, %1.3f, %1.3f, %1.3f, %1.3f')" + "np.savetxt(\"./data/iris.csv\", iris, delimiter=\",\", fmt=\"%1.1f, %1.3f, %1.3f, %1.3f, %1.3f\")" ] }, { @@ -127,10 +127,10 @@ "metadata": {}, "outputs": [], "source": [ - "WORK_DIRECTORY = 'data'\n", + "WORK_DIRECTORY = \"data\"\n", "\n", "train_input = sagemaker_session.upload_data(\n", - " WORK_DIRECTORY, key_prefix='{}/{}'.format(prefix, WORK_DIRECTORY)\n", + " WORK_DIRECTORY, key_prefix=\"{}/{}\".format(prefix, WORK_DIRECTORY)\n", ")" ] }, @@ -251,17 +251,15 @@ "outputs": [], "source": [ "sklearn = SKLearn(\n", - " entry_point='train.py',\n", - " source_dir='training_code',\n", - " framework_version='1.2-1',\n", - " instance_type='ml.c4.xlarge',\n", + " entry_point=\"train.py\",\n", + " source_dir=\"training_code\",\n", + " framework_version=\"1.2-1\",\n", + " instance_type=\"ml.c4.xlarge\",\n", " role=role,\n", " sagemaker_session=sagemaker_session,\n", - " hyperparameters={'max_leaf_nodes': 30},\n", + " hyperparameters={\"max_leaf_nodes\": 30},\n", " keep_alive_period_in_seconds=3600,\n", - " environment={\n", - " 'MLFLOW_TRACKING_ARN': tracking_server_arn\n", - " }\n", + " environment={\"MLFLOW_TRACKING_ARN\": tracking_server_arn},\n", ")" ] },