{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Create Amazon SageMaker Autopilot job for pose classification\n", "- Use Python 3 Data Scientist kernel in SageMaker Studio with ml.t3.medium instance\n", "- Create a CSV file with pose keypoints output from PoseKeypointExtractionModel \n", "- Upload CSV file into S3 and run following code to generate an Autopilot job" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import boto3\n", "from sagemaker import get_execution_role\n", "\n", "client = boto3.client('sagemaker')\n", "role = get_execution_role()\n", "#print(role)\n", "\n", "response = client.create_auto_ml_job(\n", " AutoMLJobName='Pose_Classification_Autopilot',\n", " InputDataConfig=[\n", " {\n", " 'DataSource': {\n", " 'S3DataSource': {\n", " 'S3DataType': 'S3Prefix',\n", " 'S3Uri': 's3://S3_BUCKET_NAME/PATH/TO/DATA.csv'\n", " }\n", " },\n", " 'CompressionType': 'None',\n", " 'TargetAttributeName': 'POSE_CLASS'\n", " },\n", " ],\n", " OutputDataConfig={\n", " 'S3OutputPath': 's3://S3_BUCKET_NAME/AutoML_output/'\n", " },\n", " ProblemType='BinaryClassification',\n", " AutoMLJobObjective={\n", " 'MetricName':'F1'\n", " },\n", " AutoMLJobConfig={\n", " 'CompletionCriteria': {\n", " 'MaxCandidates': 250,\n", " 'MaxRuntimePerTrainingJobInSeconds': 86400,\n", " 'MaxAutoMLJobRuntimeInSeconds': 2592000\n", " },\n", " },\n", " RoleArn = role,\n", " ModelDeployConfig={\n", " 'AutoGenerateEndpointName': False,\n", " 'EndpointName': 'Pose_Classification_Endpoint'\n", " }\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "response = client.describe_auto_ml_job(\n", " AutoMLJobName='Pose_Classification_Autopilot'\n", ")\n", "response" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Host the model with pre-trained SageMaker model artifacts\n", "- If you already have the pre-trained SageMaker model artifacts, upload them into S3 and run following cells to host the model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model_name = 'Pose-Classification-Model'\n", "s3_bucket = 'S3_BUCKET_NAME'\n", "model_sklearn = 'MODEL_SKLEARN_KEY_PREFIX'\n", "model_xgboost = 'MODEL_XGBOOST_KEY_PREFIX'\n", "\n", "import boto3\n", "from sagemaker import get_execution_role\n", "\n", "client = boto3.client('sagemaker')\n", "role = get_execution_role()\n", "#print(role)\n", "\n", "response = client.create_model(\n", " ModelName= model_name,\n", " Containers = [\n", " {\n", " \"Image\": \"683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-sklearn-automl:2.2.1-1-cpu-py3\",\n", " \"Mode\": \"SingleModel\",\n", " \"ModelDataUrl\": \"s3://{}/{}/model.tar.gz\".format(s3_bucket, model_sklearn),\n", " \"Environment\": {\n", " \"AUTOML_SPARSE_ENCODE_RECORDIO_PROTOBUF\": \"1\",\n", " \"AUTOML_TRANSFORM_MODE\": \"feature-transform\",\n", " \"SAGEMAKER_DEFAULT_INVOCATIONS_ACCEPT\": \"application/x-recordio-protobuf\",\n", " \"SAGEMAKER_PROGRAM\": \"sagemaker_serve\",\n", " \"SAGEMAKER_SUBMIT_DIRECTORY\": \"/opt/ml/model/code\"\n", " }\n", " },\n", " {\n", " \"Image\": \"683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.2-2-cpu-py3\",\n", " \"Mode\": \"SingleModel\",\n", " \"ModelDataUrl\": \"s3://{}/{}/model.tar.gz\".format(s3_bucket, model_xgboost),\n", " \"Environment\": {\n", " \"MAX_CONTENT_LENGTH\": \"20971520\",\n", " \"SAGEMAKER_DEFAULT_INVOCATIONS_ACCEPT\": \"text/csv\",\n", " \"SAGEMAKER_INFERENCE_INPUT\": \"predicted_label,probability\",\n", " \"SAGEMAKER_INFERENCE_OUTPUT\": \"predicted_label,probability\",\n", " \"SAGEMAKER_INFERENCE_SUPPORTED\": \"predicted_label,probability,probabilities\"\n", " }\n", " },\n", " {\n", " \"Image\": \"683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-sklearn-automl:2.2.1-1-cpu-py3\",\n", " \"Mode\": \"SingleModel\",\n", " \"ModelDataUrl\": \"s3://{}/{}/model.tar.gz\".format(s3_bucket, model_sklearn),\n", " \"Environment\": {\n", " \"AUTOML_TRANSFORM_MODE\": \"inverse-label-transform\",\n", " \"SAGEMAKER_DEFAULT_INVOCATIONS_ACCEPT\": \"text/csv\",\n", " \"SAGEMAKER_INFERENCE_INPUT\": \"predicted_label,probability\",\n", " \"SAGEMAKER_INFERENCE_OUTPUT\": \"predicted_label,probability\",\n", " \"SAGEMAKER_INFERENCE_SUPPORTED\": \"predicted_label,probability,labels,probabilities\",\n", " \"SAGEMAKER_PROGRAM\": \"sagemaker_serve\",\n", " \"SAGEMAKER_SUBMIT_DIRECTORY\": \"/opt/ml/model/code\"\n", " }\n", " }\n", " ],\n", " InferenceExecutionConfig = {\n", " \"Mode\": \"Serial\"\n", " },\n", " ExecutionRoleArn = role, \n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from time import gmtime, strftime\n", "endpoint_config_name = \"Pose-Classification-EndpointConfig-\" + strftime(\"%Y-%m-%d-%H-%M-%S\", gmtime())\n", "print(\"Endpoint config name: \" + endpoint_config_name)\n", "\n", "create_endpoint_config_response = client.create_endpoint_config(\n", " EndpointConfigName=endpoint_config_name,\n", " ProductionVariants=[\n", " {\n", " \"InstanceType\": \"ml.m5.xlarge\",\n", " \"InitialInstanceCount\": 2,\n", " \"ModelName\": model_name,\n", " \"VariantName\": \"AllTraffic\",\n", " }\n", " ],\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "endpoint_name = \"Pose-ClassificationEndpoint-\" + strftime(\"%Y-%m-%d-%H-%M-%S\", gmtime())\n", "print(\"Endpoint name: \" + endpoint_name)\n", "\n", "create_endpoint_response = client.create_endpoint(\n", " EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name\n", ")\n", "print(\"Endpoint Arn: \" + create_endpoint_response[\"EndpointArn\"])\n", "\n", "resp = client.describe_endpoint(EndpointName=endpoint_name)\n", "status = resp[\"EndpointStatus\"]\n", "print(\"Endpoint Status: \" + status)\n", "\n", "print(\"Waiting for {} endpoint to be in service...\".format(endpoint_name))\n", "waiter = client.get_waiter(\"endpoint_in_service\")\n", "waiter.wait(EndpointName=endpoint_name)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Test with SageMaker runtime client\n", "rt_client = boto3.client('sagemaker-runtime')\n", "# class 1\n", "payload = '0.5,0.203,0.458,0.266,0.688,0.281,0.104,0.203,0.708,0.453,0.458,0.516,0.604,0.516,0.292,0.812,0.833,0.812'\n", "# class 0\n", "#payload = '0.562,0.25,0.667,0.328,0.479,0.297,0.771,0.547,0.396,0.516,0.646,0.547,0.5,0.562,0.688,0.75,0.604,0.766'\n", "response = rt_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=payload,\n", " ContentType='text/csv')\n", "\n", "result = response[\"Body\"].read().decode(\"utf-8\")\n", "scene = int(result.split(',')[0])\n", "conf = float(result.split(',')[1])\n", "print(scene,conf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Delete the endpoint after use" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "client.delete_endpoint(EndpointName=endpoint_name)" ] } ], "metadata": { "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.7.10" } }, "nbformat": 4, "nbformat_minor": 4 }