{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Recommendation Engine for E-Commerce Sales - Pipeline Mode\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "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", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "This notebook gives an overview of techniques and services offer by SageMaker to build and deploy a personalized recommendation engine.\n", "\n", "## Dataset\n", "\n", "The dataset for this demo comes from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/Online+Retail). It contains all the transactions occurring between 01/12/2010 and 09/12/2011 for a UK-based and registered non-store online retail. The company mainly sells unique all-occasion gifts. The following attributes are included in our dataset:\n", "+ InvoiceNo: Invoice number. Nominal, a 6-digit integral number uniquely assigned to each transaction. If this code starts with letter 'c', it indicates a cancellation.\n", "+ StockCode: Product (item) code. Nominal, a 5-digit integral number uniquely assigned to each distinct product.\n", "+ Description: Product (item) name. Nominal.\n", "+ Quantity: The quantities of each product (item) per transaction. Numeric.\n", "+ InvoiceDate: Invice Date and time. Numeric, the day and time when each transaction was generated.\n", "+ UnitPrice: Unit price. Numeric, Product price per unit in sterling.\n", "+ CustomerID: Customer number. Nominal, a 5-digit integral number uniquely assigned to each customer.\n", "+ Country: Country name. Nominal, the name of the country where each customer resides. \n", "\n", "Citation: Daqing Chen, Sai Liang Sain, and Kun Guo, Data mining for the online retail industry: A case study of RFM model-based customer segmentation using data mining, Journal of Database Marketing and Customer Strategy Management, Vol. 19, No. 3, pp. 197–208, 2012 (Published online before print: 27 August 2012. doi: 10.1057/dbm.2012.17)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution Architecture\n", "----\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "!pip install -U sagemaker==2.139.0 --quiet" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sagemaker\n", "from sagemaker.workflow.pipeline import Pipeline\n", "from sagemaker.workflow.steps import CreateModelStep, ProcessingStep, TrainingStep\n", "from sagemaker.workflow.step_collections import RegisterModel\n", "from sagemaker.sklearn.processing import SKLearnProcessor\n", "from sagemaker.workflow.parameters import ParameterInteger, ParameterFloat, ParameterString\n", "import datetime\n", "import boto3\n", "import time\n", "import pandas as pd\n", "from preprocessing import loadDataset" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "assert sagemaker.__version__ >= \"2.139.0\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "region = boto3.Session().region_name\n", "boto3.setup_default_session(region_name=region)\n", "boto_session = boto3.Session(region_name=region)\n", "\n", "s3_client = boto3.client(\"s3\", region_name=region)\n", "\n", "sagemaker_boto_client = boto_session.client(\"sagemaker\")\n", "sagemaker_session = sagemaker.session.Session(\n", " boto_session=boto_session, sagemaker_client=sagemaker_boto_client\n", ")\n", "sagemaker_role = sagemaker.get_execution_role()\n", "\n", "bucket = sagemaker_session.default_bucket()\n", "\n", "prefix = \"personalization\"\n", "\n", "output_prefix = f\"s3://{bucket}/{prefix}/output\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define Estimator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, the number of feature dimensions must be calculated as it is a hyperparameter of the estimator. The feature dimensions are calculated by looking at the dataset, cleaning and preprocessing it as defined in the first part of [Recommendation Engine for E-Commerce Sales](retail_recommend.ipynb), and then counting the number of feature dimensions are in the processed dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"data/Online Retail.csv\")\n", "df.dropna(subset=[\"CustomerID\"], inplace=True)\n", "df[\"Description\"] = df[\"Description\"].apply(lambda x: x.strip())\n", "df = df.groupby([\"StockCode\", \"Description\", \"CustomerID\", \"Country\", \"UnitPrice\"])[\n", " \"Quantity\"\n", "].sum()\n", "df = df.loc[df > 0].reset_index()\n", "X, y = loadDataset(df)\n", "input_dims = X.shape[1]\n", "input_dims" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After calculating all the hyperparameters that are needed, the estimator is created." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "container = sagemaker.image_uris.retrieve(\"factorization-machines\", region=boto_session.region_name)\n", "\n", "fm = sagemaker.estimator.Estimator(\n", " container,\n", " sagemaker_role,\n", " instance_count=1,\n", " instance_type=\"ml.c5.xlarge\",\n", " output_path=output_prefix,\n", " sagemaker_session=sagemaker_session,\n", ")\n", "\n", "fm.set_hyperparameters(\n", " feature_dim=input_dims,\n", " predictor_type=\"regressor\",\n", " mini_batch_size=1000,\n", " num_factors=64,\n", " epochs=20,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build Pipeline\n", "\n", "Now that we are comfotable with the model that we built." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "base_uri = f\"s3://{bucket}/data\"\n", "input_data_uri = sagemaker.s3.S3Uploader.upload(\n", " local_path=\"data/Online Retail.csv\", desired_s3_uri=base_uri\n", ")\n", "\n", "input_data = ParameterString(name=\"InputData\", default_value=input_data_uri)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model_approval_status = ParameterString(\n", " name=\"ModelApprovalStatus\", default_value=\"PendingManualApproval\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "create_dataset_script_uri = f\"s3://{bucket}/{prefix}/code/preprocessing.py\"\n", "s3_client.upload_file(\n", " Filename=\"preprocessing.py\", Bucket=bucket, Key=f\"{prefix}/code/preprocessing.py\"\n", ")\n", "\n", "sklearn_processor = SKLearnProcessor(\n", " framework_version=\"1.2-1\",\n", " instance_type=\"ml.m5.xlarge\",\n", " instance_count=1,\n", " base_job_name=\"sklearn-retail-sales-process\",\n", " role=sagemaker_role,\n", ")\n", "\n", "create_dataset_step = ProcessingStep(\n", " name=\"PreprocessData\",\n", " processor=sklearn_processor,\n", " inputs=[\n", " sagemaker.processing.ProcessingInput(\n", " source=input_data, destination=\"/opt/ml/processing/input\"\n", " ),\n", " ],\n", " outputs=[\n", " sagemaker.processing.ProcessingOutput(\n", " output_name=\"train_data\", source=\"/opt/ml/processing/output/train\"\n", " ),\n", " sagemaker.processing.ProcessingOutput(\n", " output_name=\"test_data\", source=\"/opt/ml/processing/output/test\"\n", " ),\n", " ],\n", " code=create_dataset_script_uri,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_step = TrainingStep(\n", " name=\"TrainingStep\",\n", " estimator=fm,\n", " inputs={\n", " \"train\": sagemaker.inputs.TrainingInput(\n", " s3_data=create_dataset_step.properties.ProcessingOutputConfig.Outputs[\n", " \"train_data\"\n", " ].S3Output.S3Uri\n", " ),\n", " \"test\": sagemaker.inputs.TrainingInput(\n", " s3_data=create_dataset_step.properties.ProcessingOutputConfig.Outputs[\n", " \"test_data\"\n", " ].S3Output.S3Uri\n", " ),\n", " },\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = sagemaker.model.Model(\n", " name=\"retail-personalization-factorization-machine\",\n", " image_uri=container,\n", " model_data=train_step.properties.ModelArtifacts.S3ModelArtifacts,\n", " sagemaker_session=sagemaker_session,\n", " role=sagemaker_role,\n", ")\n", "\n", "inputs = sagemaker.inputs.CreateModelInput(instance_type=\"ml.m4.xlarge\")\n", "\n", "create_model_step = CreateModelStep(name=\"CreateModel\", model=model, inputs=inputs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "timestamp = datetime.datetime.now().strftime(\"%Y-%m-%d-%H-%M\")\n", "mpg_name = f\"retail-recommendation-{timestamp}\"\n", "\n", "register_step = RegisterModel(\n", " name=\"RegisterModel\",\n", " estimator=fm,\n", " model_data=train_step.properties.ModelArtifacts.S3ModelArtifacts,\n", " content_types=[\"application/x-recordio-protobuf\", \"application/json\"],\n", " response_types=[\"text/csv\"],\n", " inference_instances=[\"ml.t2.medium\", \"ml.m5.xlarge\"],\n", " transform_instances=[\"ml.m5.xlarge\"],\n", " model_package_group_name=mpg_name,\n", " approval_status=model_approval_status,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "s3_client.upload_file(Filename=\"deploy.py\", Bucket=bucket, Key=f\"{prefix}/code/deploy.py\")\n", "deploy_script_uri = f\"s3://{bucket}/{prefix}/code/deploy.py\"\n", "\n", "deployment_processor = SKLearnProcessor(\n", " framework_version=\"1.2-1\",\n", " role=sagemaker_role,\n", " instance_type=\"ml.t3.medium\",\n", " instance_count=1,\n", " base_job_name=f\"{prefix}-deploy\",\n", " sagemaker_session=sagemaker_session,\n", ")\n", "\n", "deploy_step = ProcessingStep(\n", " name=\"DeployModel\",\n", " processor=deployment_processor,\n", " job_arguments=[\n", " \"--model-name\",\n", " create_model_step.properties.ModelName,\n", " \"--region\",\n", " region,\n", " \"--endpoint-instance-type\",\n", " \"ml.m4.xlarge\",\n", " \"--endpoint-name\",\n", " \"retail-recommendation-endpoint\",\n", " ],\n", " code=deploy_script_uri,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pipeline_name = f\"PersonalizationDemo\"\n", "\n", "pipeline = Pipeline(\n", " name=pipeline_name,\n", " parameters=[input_data, model_approval_status],\n", " steps=[create_dataset_step, train_step, create_model_step, register_step, deploy_step],\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pipeline.upsert(role_arn=sagemaker_role)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "start_response = pipeline.start()\n", "start_response.wait()\n", "start_response.describe()" ] }, { "attachments": { "image.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sagemaker.lineage.visualizer import LineageTableVisualizer\n", "from pprint import pprint\n", "\n", "\n", "viz = LineageTableVisualizer(sagemaker_session)\n", "for execution_step in reversed(start_response.list_steps()):\n", " pprint(execution_step)\n", " display(viz.show(pipeline_execution_step=execution_step))\n", " time.sleep(5)" ] }, { "attachments": {}, "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", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (Data Science 2.0)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-west-2:236514542706:image/sagemaker-data-science-38" }, "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.8.13" } }, "nbformat": 4, "nbformat_minor": 4 }