From 020f8698252152562c1acbcb51eff4b0046ad221 Mon Sep 17 00:00:00 2001 From: chrislitianxin Date: Tue, 8 Feb 2022 12:49:47 -0500 Subject: [PATCH 1/8] :arrow_up: Upgraded lab3 containers used from python2 to python3 --- scikit_bring_your_own.zip | Bin 56550 -> 41967 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scikit_bring_your_own.zip b/scikit_bring_your_own.zip index a4336f09b920d395d0cc2798d0e6fa4ae6ed2b4e..9f52d698b95ce5d502069eea57edc301d081d80e 100644 GIT binary patch delta 19008 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 delta 30760 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 z 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 z Date: Tue, 8 Feb 2022 15:48:12 -0500 Subject: [PATCH 2/8] :wastebasket: removed .ds_store os files --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + 2 files changed, 1 insertion(+) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f27dd7b05482a60ee086a896ebc70a0ddbd7e888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr<=6g|-*q9R@DZWb=w*i!HVMyY}zB2?XKr!8&iW2Dpi*v+5oxi?X)wRYhH zk$WLI$$ciLOws^whm&RnC<0hz6D+K;`#{7lZAO-YW`*c9#~5`ypo8A;Oicjz4v$)%FayrSzBl_&4#@rb*w=h5%S4h#v zgyR;qWmI`$NYyefId5U4+Kzf>=+M$puN3!OWuMV?G}Y&Tz71NtxTAM@!FtZZdNxr( zG;hDmv4aa%kTdLs>)A~wM|VD3?m4tDwkAQq@r;aJ`h5)%cC1LhuS zp*SB(^r0?1F`N&lJ_>$uz}%w`hYODn7b?5(LUCH1`6G3Qi#=Lz3>X8`3@rO;QSSev z`S1VfAe$Kj#=yT~z!j>s>LIrj?$(*j$z2<<-LQ#>U+z&u*oEs@2XYl}v8m7&$$%IK T%so;=u|EPzgLTHhuQKoqzCf_+ diff --git a/.gitignore b/.gitignore index a35f1db..2cd2914 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ data/ container/ *.npy .ipynb_checkpoints +.DS_Store From be2964b1dfdc31b9452d2e571c0f86837a146350 Mon Sep 17 00:00:00 2001 From: chrislitianxin Date: Tue, 8 Feb 2022 16:02:07 -0500 Subject: [PATCH 3/8] :wastebasket: removed os related jibberish in zip --- scikit_bring_your_own.zip | Bin 41967 -> 41257 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scikit_bring_your_own.zip b/scikit_bring_your_own.zip index 9f52d698b95ce5d502069eea57edc301d081d80e..3012fef390b20fa89d7595edcfd30967a1090401 100644 GIT binary patch delta 2889 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 Date: Tue, 8 Feb 2022 23:48:35 -0500 Subject: [PATCH 4/8] :memo: Added explaination of the BYOC lab. Fixed dependency errors and python version update. --- bring-custom-container.ipynb | 253 +++++++++++++++++++++++++---------- 1 file changed, 179 insertions(+), 74 deletions(-) diff --git a/bring-custom-container.ipynb b/bring-custom-container.ipynb index 3b196c9..e52acf4 100644 --- a/bring-custom-container.ipynb +++ b/bring-custom-container.ipynb @@ -12,13 +12,43 @@ "metadata": {}, "source": [ "## Overview\n", - "Here, we’ll show how to package a simple Python example which showcases the decision tree algorithm from the widely used scikit-learn machine learning package. The example is purposefully fairly trivial since the point is to show the surrounding structure that you’ll want to add to your own code so you can train and host it in Amazon SageMaker.\n", + "\n", + "### Background\n", + "Here, we'll show how to package a simple Python example which showcases the [decision tree](http://scikit-learn.org/stable/modules/tree.html) algorithm from the widely used [scikit-learn](http://scikit-learn.org/stable/) machine learning package. The example is purposefully fairly trivial since the point is to show the surrounding structure that you'll want to add to your own code so you can train and host it in Amazon SageMaker.\n", "\n", "The ideas shown here will work in any language or environment. You’ll need to choose the right tools for your environment to serve HTTP requests for inference, but good HTTP environments are available in every language these days.\n", "\n", - "In this example, we use a single image to support training and hosting. This is easy because it means that we only need to manage one image and we can set it up to do everything. Sometimes you’ll want separate images for training and hosting because they have different requirements. Just separate the parts discussed below into separate Dockerfiles and build two images. Choosing whether to have a single image or two images is really a matter of which is more convenient for you to develop and manage.\n", "\n", - "If you’re only using Amazon SageMaker for training or hosting, but not both, there is no need to build the unused functionality into your container.\n", + "### High-level overview\n", + "\n", + "The following diagram shows how you typically train and deploy a model with Amazon SageMaker:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The area labeled SageMaker highlights the two components of SageMaker: model training and model deployment. The area labeled [EC2 container registry](https://aws.amazon.com/ecr/) is where we store, manage, and deploy our Docker container images. The training data and model artifacts are stored in S3 bucket. \n", + "\n", + "In this lab, we use a single image to support both model training and hosting for simplicity. Sometimes you’ll want separate images for training and hosting because they have different requirements. \n", + "\n", + "The high-level steps include:\n", + "1. **Building the container** - We walk through the different components of the containers and inspect the docker file. Then we build and upload the container to ECR. \n", + "2. **Setup & Upload Data** - Once our container is built and uploaded. We ready sagemaker and upload the data to S3. \n", + "3. **Model Training** - Create a training job using SageMaker SDK. It will pull data from S3 and use the container we built. \n", + "4. **Model Deployment** - Once training is complete, deploy our model to a HTTP endpoint using SageMaker SDK. \n", + "5. **Run Inferences** - Run predictions to test our model.\n", + "6. **Cleanup**\n", "\n" ] }, @@ -27,17 +57,20 @@ "metadata": {}, "source": [ "## Building the container\n", - "Docker provides a simple way to package arbitrary code into an image that is totally self-contained. Once you have an image, you can use Docker to run a container based on that image. Running a container is just like running a program on the machine except that the container creates a fully self-contained environment for the program to run. Containers are isolated from each other and from the host environment, so the way you set up your program is the way it runs, no matter where you run it.\n", + "[Docker](https://aws.amazon.com/docker/#:~:text=Docker%20is%20a%20software%20platform,test%2C%20and%20deploy%20applications%20quickly.&text=Running%20Docker%20on%20AWS%20provides,distributed%20applications%20at%20any%20scale.) packages software into standardized units called [containers](https://aws.amazon.com/containers/) that have everything the software needs to run including libraries, system tools, code, and runtime. Using Docker, you can quickly deploy and scale applications into any environment and know your code will run.\n", + "\n", "\n", - "Amazon SageMaker uses Docker to allow users to train and deploy arbitrary algorithms." + "Amazon SageMaker uses Docker to allow users to train and deploy arbitrary algorithms. More details on [how to use docker containers with sagemaker](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Parts of the container\n", - "In the container directory are all the components you need to package the sample algorithm for Amazon SageMager:" + "### Walkthrough of the container directory\n", + "You can find the source code of the sample container we are using in [this GitHub repository](https://github.com/aws/amazon-sagemaker-examples/tree/main/advanced_functionality/scikit_bring_your_own). \n", + "\n", + "The container directory contains all the components you need to package for SageMaker:" ] }, { @@ -48,6 +81,7 @@ ".\n", "|-- Dockerfile\n", "|-- build_and_push.sh\n", + "|-- local_test\n", "`-- decision_trees\n", " |-- nginx.conf\n", " |-- predictor.py\n", @@ -63,32 +97,32 @@ "source": [ "Let’s discuss each of these in turn:\n", "\n", - "- Dockerfile describes how to build your Docker container image. More details below:\n", - "- build_and_push.sh is a script that uses the Dockerfile to build your container images and then pushes it to ECR. We’ll invoke the commands directly later in this notebook, but you can just copy and run the script for your own algorithms.\n", - "- decision_trees is the directory which contains the files that will be installed in the container.\n", - "- local_test is a directory that shows how to test your new container on any computer that can run Docker, including an Amazon SageMaker notebook instance. Using this method, you can quickly iterate using small datasets to eliminate any structural bugs before you use the container with Amazon SageMaker. We’ll walk through local testing later in this notebook.\n", + "- `Dockerfile` describes how to build your Docker container image. More details below.\n", + "- `build_and_push.sh` is a script that uses the Dockerfile to build your container images and then pushes it to ECR. We’ll invoke the commands directly later in this notebook, but you can just copy and run the script for your own algorithms.\n", + "- `local_test` is a directory that shows how to test your new container on any computer that can run Docker, including an Amazon SageMaker notebook instance. Using this method, you can quickly iterate using small datasets to eliminate any structural bugs before you use the container with Amazon SageMaker. Testing is not the focus of this lab, but feel free to checkout the example at your own time. \n", + "- `decision_trees` is the directory which contains the files that will be installed in the container.\n", "\n", - "In this simple application, we only install five files in the container.\n", + "In this simple application, we only install five files in the container. These five show the standard structure of our Python containers, although you are free to choose a different toolset or programming language and therefore could have a different layout.\n", "\n", "The files that we’ll put in the container are:\n", "\n", - "- nginx.conf is the configuration file for the nginx front-end. Generally, you should be able to take this file as-is.\n", - "- predictor.py is the program that actually implements the Flask web server and the decision tree predictions for this app. You’ll want to customize the actual prediction parts to your application. Since this algorithm is simple, we do all the processing here in this file, but you may choose to have separate files for implementing your custom logic.\n", - "- serve is the program started when the container is started for hosting. It simply launches the gunicorn server which runs multiple instances of the Flask app defined in predictor.py. You should be able to take this file as-is.\n", - "- train is the program that is invoked when the container is run for training. You will modify this program to implement your training algorithm.\n", - "- wsgi.py is a small wrapper used to invoke the Flask app. You should be able to take this file as-is.\n", + "- `nginx.conf` is the configuration file for the nginx front-end. Generally, you should be able to take this file as-is.\n", + "- `predictor.py` is the program that actually implements the Flask web server and the decision tree predictions for this app. You’ll want to customize the actual prediction parts to your application. Since this algorithm is simple, we do all the processing here in this file, but you may choose to have separate files for implementing your custom logic.\n", + "- `serve` is the program started when the container is started for hosting. It simply launches the gunicorn server which runs multiple instances of the Flask app defined in predictor.py. You should be able to take this file as-is.\n", + "- `train` is the program that is invoked when the container is run for training. You will modify this program to implement your training algorithm.\n", + "- `wsgi.py` is a small wrapper used to invoke the Flask app. You should be able to take this file as-is.\n", "\n", - "In summary, the two files you will probably want to change for your application are train and predictor.py" + "In summary, the two files you will probably want to change for your application are `train` and `predictor.py`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### The Dockerfile\n", - "The Dockerfile describes the image that we want to build. You can think of it as describing the complete operating system installation of the system that you want to run. A Docker container running is quite a bit lighter than a full operating system, however, because it takes advantage of Linux on the host machine for the basic operations.\n", - "\n", - "For the Python science stack, we will start from a standard Ubuntu installation and run the normal tools to install the things needed by scikit-learn. Finally, we add the code that implements our specific algorithm to the container and set up the right environment to run under." + "### Install packages\n", + "We will first install the prerequisite packages:\n", + "- [**aiobotocore**](https://aiobotocore.readthedocs.io/en/latest/): adds async support for AWS services with [botocore](https://github.com/boto/botocore).\n", + "- [**sagemaker-studio-image-build**](https://pypi.org/project/sagemaker-studio-image-build/): CLI for building Docker images in SageMaker Studio using [AWS CodeBuild](https://aws.amazon.com/codebuild/)" ] }, { @@ -98,7 +132,17 @@ "outputs": [], "source": [ "# cell 00\n", - "!pip install --upgrade aiobotocore" + "!pip install -q --upgrade aiobotocore\n", + "!pip install -q sagemaker-studio-image-build" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will then unzip and copy over the files we need:\n", + "- `scikit_bring_your_own/container` → `lab03_container`\n", + "- `scikit_bring_your_own/data` → `lab03_data` " ] }, { @@ -108,19 +152,27 @@ "outputs": [], "source": [ "# cell 01\n", - "\n", - "!unzip scikit_bring_your_own.zip\n", + "!unzip -q scikit_bring_your_own.zip\n", "!mv scikit_bring_your_own/data/ ./lab03_data/\n", "!mv scikit_bring_your_own/container/ ./lab03_container/\n", - "!rm -rf scikit_bring_your_own\n", - "!cat lab03_container/Dockerfile" + "!rm -rf scikit_bring_your_own" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Building and registering the container" + "### The Dockerfile\n", + "The `Dockerfile` describes the image that we want to build. You can think of it as describing the complete operating system installation of the system that you want to run. A Docker container running is quite a bit lighter than a full operating system, however, because it takes advantage of Linux on the host machine for the basic operations.\n", + "\n", + "For the Python science stack, we will start from a standard Ubuntu installation and run the normal tools to install the things needed by `scikit-learn`. Finally, we add the code that implements our specific algorithm to the container and set up the right environment to run under." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's take a look of what's inside our `Dockerfile`:" ] }, { @@ -129,15 +181,21 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 02\n", - "!pip install sagemaker-studio-image-build" + "!pygmentize lab03_container/Dockerfile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "> *In the next cell, if you run into IAM permission issue related to CodeBuild, make sure that you follow the steps outlined in the immersion day lab instructions*" + "### Building and registering the container" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **NOTE** *In the next cell, if you run into IAM permission issue related to CodeBuild, make sure that you follow the Prerequisites steps outlined in the [immersion day lab instructions](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/63069e26-921c-4ce1-9cc7-dd882ff62575/en-US/lab3/option2#prerequisites)*" ] }, { @@ -147,8 +205,7 @@ "outputs": [], "source": [ "%%sh\n", - "# cell 03\n", - "\n", + "# cell 02\n", "\n", "cd lab03_container\n", "\n", @@ -162,8 +219,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Using the container\n", - "Here we specify a bucket to use and the role that will be used for working with SageMaker." + "## Setup & Upload Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup the Environment \n", + "Here we specify a bucket to use and the role that will be used for working with SageMaker.\n", + "\n" ] }, { @@ -172,10 +237,9 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 04\n", + "# cell 03\n", "\n", - "# S3 prefix\n", - "prefix = 'DEMO-scikit-byo-iris'\n", + "S3_prefix = 'DEMO-scikit-byo-iris'\n", "\n", "# Define IAM role\n", "import boto3\n", @@ -202,7 +266,7 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 05\n", + "# cell 04\n", "\n", "import sagemaker as sage\n", "from time import gmtime, strftime\n", @@ -214,9 +278,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "When training large models with huge amounts of data, you’ll typically use big data tools, like Amazon Athena, AWS Glue, or Amazon EMR, to create your data in S3. For the purposes of this example, we’re using some the classic Iris dataset, which we have included.\n", + "### Upload data to S3 Bucket" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When training large models with huge amounts of data, you’ll typically use big data tools, like Amazon Athena, AWS Glue, or Amazon EMR, to create your data in S3. For the purposes of this example, we’re using some the [classic Iris dataset](https://en.wikipedia.org/wiki/Iris_flower_data_set) in the `lab03_data` directory. \n", "\n", - "We can use use the tools provided by the SageMaker Python SDK to upload the data to a default bucket." + "We can use use the tools provided by the [SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/) to upload the data to a default bucket." ] }, { @@ -225,27 +296,42 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 06\n", + "# cell 05\n", "\n", "WORK_DIRECTORY = 'lab03_data'\n", "\n", - "data_location = sess.upload_data(WORK_DIRECTORY, key_prefix=prefix)" + "data_location = sess.upload_data(WORK_DIRECTORY, \n", + " key_prefix=S3_prefix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In order to use SageMaker to fit our algorithm, we’ll create an Estimator that defines how to use the container to train. This includes the configuration we need to invoke SageMaker training:\n", - "\n", - "- The container name. This is constructed as in the shell commands above.\n", - "- The role. As defined above.\n", - "- The instance count which is the number of machines to use for training.\n", - "- The instance type which is the type of machine to use for training.\n", - "- The output path determines where the model artifact will be written.\n", - "- The session is the SageMaker session object that we defined above.\n", + "## Model Training" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to use SageMaker to fit our algorithm, we create an [`estimator`](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html) that defines how to use the container to train. This includes the configuration we need to invoke SageMaker training:\n", "\n", - "Then we use `fit()` on the estimator to train against the data that we uploaded above." + "- `image_uri (str)` - The [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/) path where the training code is stored. This is constructed in the shell commands in *cell 06*.\n", + "- `role (str)` - As defined above in *cell 03*.\n", + "- `instance_count (int)` - number of machines to use for training.\n", + "- `instance_type (str)` - the type of machine to use for training.\n", + "- `output_path (str)` - where the model artifact will be written.\n", + "- `sagemaker_session (sagemaker.session.Session)` - the SageMaker session object that we defined in *cell 04*.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we use `estimator.fit()` method to train against the data that we uploaded.\n", + "The API calls the Amazon SageMaker `CreateTrainingJob` API to start model training. The API uses configuration you provided to create the `estimator` and the specified input training data to send the `CreatingTrainingJob` request to Amazon SageMaker." ] }, { @@ -254,16 +340,19 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 07\n", + "# cell 06\n", "\n", "account = sess.boto_session.client('sts').get_caller_identity()['Account']\n", "region = sess.boto_session.region_name\n", - "image = '{}.dkr.ecr.{}.amazonaws.com/sagemaker-decision-trees:latest'.format(account, region)\n", + "image_uri = '{}.dkr.ecr.{}.amazonaws.com/sagemaker-decision-trees:latest'.format(account, region)\n", + "\n", + "tree = sage.estimator.Estimator(image_uri,\n", + " role, \n", + " instance_count=1, \n", + " instance_type='ml.c4.2xlarge',\n", + " output_path=\"s3://{}/output\".format(sess.default_bucket()),\n", + " sagemaker_session=sess)\n", "\n", - "tree = sage.estimator.Estimator(image,\n", - " role, instance_count=1, instance_type='ml.c4.2xlarge',\n", - " output_path=\"s3://{}/output\".format(sess.default_bucket()),\n", - " sagemaker_session=sess)\n", "file_location = data_location + '/iris.csv'\n", "tree.fit(file_location)" ] @@ -272,10 +361,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Hosting your model\n", + "## Model Deployment\n", "You can use a trained model to get real time predictions using HTTP endpoint. Follow these steps to walk you through the process.\n", "\n", - "Deploying the model to SageMaker hosting just requires a deploy call on the fitted model. This call takes an instance count, instance type, and optionally serializer and deserializer functions. These are used when the resulting predictor is created on the endpoint." + "After the model training successfully completes, you can call the [`estimator.deploy()` method](https://sagemaker.readthedocs.io/en/stable/estimators.html#sagemaker.estimator.Estimator.deploy). The `deploy()` method creates a deployable model, configures the SageMaker hosting services endpoint, and launches the endpoint to host the model. \n", + "\n", + "The method uses the following configurations:\n", + "- `initial_instance_count (int)` – The number of instances to deploy the model.\n", + "- `instance_type (str)` – The type of instances that you want to operate your deployed model.\n", + "- `serializer (int)` – Serialize input data of various formats (a NumPy array, list, file, or buffer) to a CSV-formatted string. \n" ] }, { @@ -284,22 +378,26 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 08\n", + "# cell 07\n", + "\n", "from sagemaker.serializers import CSVSerializer\n", - "predictor = tree.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge', serializer=CSVSerializer())" + "predictor = tree.deploy(initial_instance_count=1, \n", + " instance_type='ml.m4.xlarge', \n", + " serializer=CSVSerializer())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Preparing test data to run inferences" + "## Run Inferences\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "### Preparing test data\n", "In order to do some predictions, we’ll extract some of the data we used for training and do predictions against it. This is, of course, bad statistical practice, but a good way to see how the mechanism works." ] }, @@ -309,7 +407,7 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 09\n", + "# cell 08\n", "\n", "shape=pd.read_csv(file_location, header=None)\n", "shape.sample(3)" @@ -321,7 +419,7 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 10\n", + "# cell 09\n", "\n", "# drop the label column in the training set\n", "shape.drop(shape.columns[[0]],axis=1,inplace=True)\n", @@ -334,7 +432,7 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 11\n", + "# cell 10\n", "\n", "import itertools\n", "\n", @@ -349,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Run predictions\n", + "### Predictions\n", "\n", "Prediction is as easy as calling predict with the predictor we got back from deploy and the data we want to do predictions with. The serializers take care of doing the data conversions for us." ] @@ -360,7 +458,7 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 12\n", + "# cell 11\n", "\n", "print(predictor.predict(test_data.values).decode('utf-8'))" ] @@ -370,7 +468,7 @@ "metadata": {}, "source": [ "## Cleanup\n", - "After completing the lab, use these steps to [delete the endpoint](https://docs.aws.amazon.com/sagemaker/latest/dg/ex1-cleanup.html) or run the following code\n" + "After completing the lab, use these steps to [delete the endpoint through AWS Console](https://docs.aws.amazon.com/sagemaker/latest/dg/ex1-cleanup.html) or simply run the following code\n" ] }, { @@ -379,17 +477,24 @@ "metadata": {}, "outputs": [], "source": [ - "# cell 13\n", + "# cell 12\n", "sess.delete_endpoint(predictor.endpoint_name)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove the container artifacts and data we downloaded." + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "# cell 14\n", + "# cell 13\n", "!rm -rf lab03_container lab03_data" ] } @@ -397,9 +502,9 @@ "metadata": { "instance_type": "ml.t3.medium", "kernelspec": { - "display_name": "Python 3 (Data Science)", + "display_name": "Python 3", "language": "python", - "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:eu-west-1:470317259841:image/datascience-1.0" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -411,7 +516,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.8.3" } }, "nbformat": 4, From 14413240a4904003080a3bc6632683443ae75ff3 Mon Sep 17 00:00:00 2001 From: Sherry Ding Date: Mon, 14 Feb 2022 22:36:13 +0000 Subject: [PATCH 5/8] Update info for kernel selection --- bring-custom-script.ipynb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bring-custom-script.ipynb b/bring-custom-script.ipynb index e37b04f..5513225 100644 --- a/bring-custom-script.ipynb +++ b/bring-custom-script.ipynb @@ -14,7 +14,9 @@ "## TensorFlow script mode training and serving\n", "Script mode is a training script format for TensorFlow that lets you execute any TensorFlow training script in SageMaker with minimal modification. The [SageMaker Python SDK](https://github.com/aws/sagemaker-python-sdk) handles transferring your script to a SageMaker training instance. On the training instance, SageMaker's native TensorFlow support sets up training-related environment variables and executes your training script. In this tutorial, we use the SageMaker Python SDK to launch a training job and deploy the trained model.\n", "\n", - "Script mode supports training with a Python script, a Python module, or a shell script. In this example, we use a Python script to train a classification model on the [MNIST dataset](http://yann.lecun.com/exdb/mnist/). In this example, we will show how easily you can train a SageMaker using TensorFlow 1.x and TensorFlow 2.0 scripts with SageMaker Python SDK. In addition, this notebook demonstrates how to perform real time inference with the [SageMaker TensorFlow Serving container](https://github.com/aws/sagemaker-tensorflow-serving-container). The TensorFlow Serving container is the default inference method for script mode. For full documentation on the TensorFlow Serving container, please visit [here](https://github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/tensorflow/deploying_tensorflow_serving.rst)." + "Script mode supports training with a Python script, a Python module, or a shell script. In this example, we use a Python script to train a classification model on the [MNIST dataset](http://yann.lecun.com/exdb/mnist/). In this example, we will show how easily you can train a SageMaker using TensorFlow 1.x and TensorFlow 2.0 scripts with SageMaker Python SDK. In addition, this notebook demonstrates how to perform real time inference with the [SageMaker TensorFlow Serving container](https://github.com/aws/sagemaker-tensorflow-serving-container). The TensorFlow Serving container is the default inference method for script mode. For full documentation on the TensorFlow Serving container, please visit [here](https://github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/tensorflow/deploying_tensorflow_serving.rst).\n", + "\n", + "Since TensorFlow package is not called in this notebook, please select `Python 3 (Data Science)` kernel to proceed." ] }, { @@ -332,9 +334,9 @@ "metadata": { "instance_type": "ml.m5.large", "kernelspec": { - "display_name": "Python 3 (TensorFlow 2.1 Python 3.6 CPU Optimized)", + "display_name": "Python 3 (Data Science)", "language": "python", - "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-west-2:236514542706:image/tensorflow-2.1-cpu-py36" + "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" }, "language_info": { "codemirror_mode": { @@ -346,7 +348,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.13" + "version": "3.7.10" } }, "nbformat": 4, From 0c309bccfa58895b158110d6b865340d7e386a39 Mon Sep 17 00:00:00 2001 From: Sherry Ding Date: Tue, 15 Feb 2022 02:54:23 +0000 Subject: [PATCH 6/8] Refine some description in markdown --- bring-custom-container.ipynb | 971 +++++++++++++++++++++++++++++++++-- 1 file changed, 932 insertions(+), 39 deletions(-) diff --git a/bring-custom-container.ipynb b/bring-custom-container.ipynb index e52acf4..5e031cd 100644 --- a/bring-custom-container.ipynb +++ b/bring-custom-container.ipynb @@ -14,9 +14,7 @@ "## Overview\n", "\n", "### Background\n", - "Here, we'll show how to package a simple Python example which showcases the [decision tree](http://scikit-learn.org/stable/modules/tree.html) algorithm from the widely used [scikit-learn](http://scikit-learn.org/stable/) machine learning package. The example is purposefully fairly trivial since the point is to show the surrounding structure that you'll want to add to your own code so you can train and host it in Amazon SageMaker.\n", - "\n", - "The ideas shown here will work in any language or environment. You’ll need to choose the right tools for your environment to serve HTTP requests for inference, but good HTTP environments are available in every language these days.\n", + "Here, we'll show how to bring your docker cotainer that packages your environment and code. We showcase the [decision tree](http://scikit-learn.org/stable/modules/tree.html) algorithm from the widely used [scikit-learn](http://scikit-learn.org/stable/) machine learning package. The example is purposefully fairly trivial since the point is to show the surrounding structure that you'll want to add to your own container so you can bring it to Amazon SageMaker for training and hosting.\n", "\n", "\n", "### High-level overview\n", @@ -25,7 +23,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -43,10 +40,10 @@ "In this lab, we use a single image to support both model training and hosting for simplicity. Sometimes you’ll want separate images for training and hosting because they have different requirements. \n", "\n", "The high-level steps include:\n", - "1. **Building the container** - We walk through the different components of the containers and inspect the docker file. Then we build and upload the container to ECR. \n", - "2. **Setup & Upload Data** - Once our container is built and uploaded. We ready sagemaker and upload the data to S3. \n", - "3. **Model Training** - Create a training job using SageMaker SDK. It will pull data from S3 and use the container we built. \n", - "4. **Model Deployment** - Once training is complete, deploy our model to a HTTP endpoint using SageMaker SDK. \n", + "1. **Building the container** - We walk through the different components of the containers and inspect the docker file. Then we build and push the container to ECR. \n", + "2. **Setup & Upload Data** - Once our container is built and registered. We ready sagemaker and upload the data to S3. \n", + "3. **Model Training** - Create a training job using SageMaker Python SDK. It will pull data from S3 and use the container we built. \n", + "4. **Model Deployment** - Once training is complete, deploy our model to a HTTP endpoint using SageMaker Python SDK. \n", "5. **Run Inferences** - Run predictions to test our model.\n", "6. **Cleanup**\n", "\n" @@ -120,6 +117,8 @@ "metadata": {}, "source": [ "### Install packages\n", + "Please choose `Python 3 (Data Science)` kernel to proceed.\n", + "\n", "We will first install the prerequisite packages:\n", "- [**aiobotocore**](https://aiobotocore.readthedocs.io/en/latest/): adds async support for AWS services with [botocore](https://github.com/boto/botocore).\n", "- [**sagemaker-studio-image-build**](https://pypi.org/project/sagemaker-studio-image-build/): CLI for building Docker images in SageMaker Studio using [AWS CodeBuild](https://aws.amazon.com/codebuild/)" @@ -127,9 +126,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.7/site-packages/secretstorage/dhcrypto.py:16: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", + " from cryptography.utils import int_from_bytes\n", + "/opt/conda/lib/python3.7/site-packages/secretstorage/util.py:25: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", + " from cryptography.utils import int_from_bytes\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m/opt/conda/lib/python3.7/site-packages/secretstorage/dhcrypto.py:16: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", + " from cryptography.utils import int_from_bytes\n", + "/opt/conda/lib/python3.7/site-packages/secretstorage/util.py:25: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", + " from cryptography.utils import int_from_bytes\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], "source": [ "# cell 00\n", "!pip install -q --upgrade aiobotocore\n", @@ -147,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -177,9 +194,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[37m# Build an image that can do training and inference in SageMaker\u001b[39;49;00m\n", + "\u001b[37m# This is a Python 3 image that uses the nginx, gunicorn, flask stack\u001b[39;49;00m\n", + "\u001b[37m# for serving inferences in a stable way.\u001b[39;49;00m\n", + "\n", + "\u001b[34mFROM\u001b[39;49;00m \u001b[33mubuntu:18.04\u001b[39;49;00m\n", + "\n", + "\u001b[34mMAINTAINER\u001b[39;49;00m\u001b[33m Amazon AI \u001b[39;49;00m\n", + "\n", + "\n", + "\u001b[34mRUN\u001b[39;49;00m apt-get -y update && apt-get install -y --no-install-recommends \u001b[33m\\\u001b[39;49;00m\n", + " wget \u001b[33m\\\u001b[39;49;00m\n", + " python3-pip \u001b[33m\\\u001b[39;49;00m\n", + " python3-setuptools \u001b[33m\\\u001b[39;49;00m\n", + " nginx \u001b[33m\\\u001b[39;49;00m\n", + " ca-certificates \u001b[33m\\\u001b[39;49;00m\n", + " && rm -rf /var/lib/apt/lists/*\n", + "\n", + "\u001b[34mRUN\u001b[39;49;00m ln -s /usr/bin/python3 /usr/bin/python\n", + "\u001b[34mRUN\u001b[39;49;00m ln -s /usr/bin/pip3 /usr/bin/pip\n", + "\n", + "\u001b[37m# Here we get all python packages.\u001b[39;49;00m\n", + "\u001b[37m# There's substantial overlap between scipy and numpy that we eliminate by\u001b[39;49;00m\n", + "\u001b[37m# linking them together. Likewise, pip leaves the install caches populated which uses\u001b[39;49;00m\n", + "\u001b[37m# a significant amount of space. These optimizations save a fair amount of space in the\u001b[39;49;00m\n", + "\u001b[37m# image, which reduces start up time.\u001b[39;49;00m\n", + "\u001b[34mRUN\u001b[39;49;00m pip --no-cache-dir install \u001b[31mnumpy\u001b[39;49;00m==\u001b[34m1\u001b[39;49;00m.16.2 \u001b[31mscipy\u001b[39;49;00m==\u001b[34m1\u001b[39;49;00m.2.1 scikit-learn==\u001b[34m0\u001b[39;49;00m.20.2 pandas flask gunicorn\n", + "\n", + "\u001b[37m# Set some environment variables. PYTHONUNBUFFERED keeps Python from buffering our standard\u001b[39;49;00m\n", + "\u001b[37m# output stream, which means that logs can be delivered to the user quickly. PYTHONDONTWRITEBYTECODE\u001b[39;49;00m\n", + "\u001b[37m# keeps Python from writing the .pyc files which are unnecessary in this case. We also update\u001b[39;49;00m\n", + "\u001b[37m# PATH so that the train and serve programs are found when the container is invoked.\u001b[39;49;00m\n", + "\n", + "\u001b[34mENV\u001b[39;49;00m \u001b[31mPYTHONUNBUFFERED\u001b[39;49;00m=TRUE\n", + "\u001b[34mENV\u001b[39;49;00m \u001b[31mPYTHONDONTWRITEBYTECODE\u001b[39;49;00m=TRUE\n", + "\u001b[34mENV\u001b[39;49;00m \u001b[31mPATH\u001b[39;49;00m=\u001b[33m\"\u001b[39;49;00m\u001b[33m/opt/program:\u001b[39;49;00m\u001b[33m${\u001b[39;49;00m\u001b[31mPATH\u001b[39;49;00m\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\n", + "\n", + "\u001b[37m# Set up the program in the image\u001b[39;49;00m\n", + "\u001b[34mCOPY\u001b[39;49;00m decision_trees /opt/program\n", + "\u001b[34mWORKDIR\u001b[39;49;00m\u001b[33m /opt/program\u001b[39;49;00m\n" + ] + } + ], "source": [ "!pygmentize lab03_container/Dockerfile" ] @@ -200,9 +263,634 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created ECR repository sagemaker-decision-trees\n", + "....[Container] 2022/02/15 01:46:06 Waiting for agent ping\n", + "\n", + "[Container] 2022/02/15 01:46:07 Waiting for DOWNLOAD_SOURCE\n", + "[Container] 2022/02/15 01:46:09 Phase is DOWNLOAD_SOURCE\n", + "[Container] 2022/02/15 01:46:09 CODEBUILD_SRC_DIR=/codebuild/output/src379485610/src\n", + "[Container] 2022/02/15 01:46:09 YAML location is /codebuild/output/src379485610/src/buildspec.yml\n", + "[Container] 2022/02/15 01:46:09 Setting HTTP client timeout to higher timeout for S3 source\n", + "[Container] 2022/02/15 01:46:09 Processing environment variables\n", + "[Container] 2022/02/15 01:46:09 No runtime version selected in buildspec.\n", + "[Container] 2022/02/15 01:46:09 Moving to directory /codebuild/output/src379485610/src\n", + "[Container] 2022/02/15 01:46:09 Configuring ssm agent with target id: codebuild:7ee311b6-ebb0-4b2c-928f-fee3b9ec29cd\n", + "[Container] 2022/02/15 01:46:09 Successfully updated ssm agent configuration\n", + "[Container] 2022/02/15 01:46:09 Registering with agent\n", + "[Container] 2022/02/15 01:46:09 Phases found in YAML: 3\n", + "[Container] 2022/02/15 01:46:09 PRE_BUILD: 9 commands\n", + "[Container] 2022/02/15 01:46:09 BUILD: 4 commands\n", + "[Container] 2022/02/15 01:46:09 POST_BUILD: 3 commands\n", + "[Container] 2022/02/15 01:46:09 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED\n", + "[Container] 2022/02/15 01:46:09 Phase context status code: Message:\n", + "[Container] 2022/02/15 01:46:09 Entering phase INSTALL\n", + "[Container] 2022/02/15 01:46:09 Phase complete: INSTALL State: SUCCEEDED\n", + "[Container] 2022/02/15 01:46:09 Phase context status code: Message:\n", + "[Container] 2022/02/15 01:46:09 Entering phase PRE_BUILD\n", + "[Container] 2022/02/15 01:46:09 Running command echo Logging in to Amazon ECR...\n", + "Logging in to Amazon ECR...\n", + "\n", + "[Container] 2022/02/15 01:46:09 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:15 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 763104351884)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:15 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 217643126080)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:16 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 727897471807)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:16 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 626614931356)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:17 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 683313688378)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:17 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 520713654638)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:18 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 462105765813)\n", + "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", + "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n", + "\n", + "[Container] 2022/02/15 01:46:18 Phase complete: PRE_BUILD State: SUCCEEDED\n", + "[Container] 2022/02/15 01:46:18 Phase context status code: Message:\n", + "[Container] 2022/02/15 01:46:18 Entering phase BUILD\n", + "[Container] 2022/02/15 01:46:18 Running command echo Build started on `date`\n", + "Build started on Tue Feb 15 01:46:18 UTC 2022\n", + "\n", + "[Container] 2022/02/15 01:46:18 Running command echo Building the Docker image...\n", + "Building the Docker image...\n", + "\n", + "[Container] 2022/02/15 01:46:18 Running command docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .\n", + "Sending build context to Docker daemon 103.9kB\n", + "Step 1/11 : FROM ubuntu:18.04\n", + "18.04: Pulling from library/ubuntu\n", + "68e7bb398b9f: Pulling fs layer\n", + "68e7bb398b9f: Verifying Checksum\n", + "68e7bb398b9f: Download complete\n", + "68e7bb398b9f: Pull complete\n", + "Digest: sha256:c2aa13782650aa7ade424b12008128b60034c795f25456e8eb552d0a0f447cad\n", + "Status: Downloaded newer image for ubuntu:18.04\n", + " ---> dcf4d4bef137\n", + "Step 2/11 : MAINTAINER Amazon AI \n", + " ---> Running in 9158bd4be24c\n", + "Removing intermediate container 9158bd4be24c\n", + " ---> 18f88ea5d5a5\n", + "Step 3/11 : RUN apt-get -y update && apt-get install -y --no-install-recommends wget python3-pip python3-setuptools nginx ca-certificates && rm -rf /var/lib/apt/lists/*\n", + " ---> Running in a090988a9802\n", + "Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]\n", + "Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]\n", + "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]\n", + "Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]\n", + "Get:5 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [21.1 kB]\n", + "Get:6 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2565 kB]\n", + "Get:7 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]\n", + "Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]\n", + "Get:9 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [783 kB]\n", + "Get:10 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]\n", + "Get:11 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1470 kB]\n", + "Get:12 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]\n", + "Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [816 kB]\n", + "Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [29.0 kB]\n", + "Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2248 kB]\n", + "Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3004 kB]\n", + "Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [12.6 kB]\n", + "Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [11.6 kB]\n", + "Fetched 24.3 MB in 2s (13.1 MB/s)\n", + "Reading package lists...\n", + "Reading package lists...\n", + "Building dependency tree...\n", + "Reading state information...\n", + "The following additional packages will be installed:\n", + " fontconfig-config fonts-dejavu-core iproute2 libbsd0 libelf1 libexpat1\n", + " libfontconfig1 libfreetype6 libgd3 libgeoip1 libicu60 libjbig0\n", + " libjpeg-turbo8 libjpeg8 libmnl0 libmpdec2 libnginx-mod-http-geoip\n", + " libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter\n", + " libnginx-mod-mail libnginx-mod-stream libpng16-16 libpsl5 libpython3-stdlib\n", + " libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0 libssl1.1\n", + " libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2\n", + " libxpm4 libxslt1.1 mime-support multiarch-support nginx-common nginx-core\n", + " openssl python-pip-whl python3 python3-distutils python3-lib2to3\n", + " python3-minimal python3-pkg-resources python3.6 python3.6-minimal\n", + " readline-common ucf\n", + "Suggested packages:\n", + " iproute2-doc libgd-tools geoip-bin fcgiwrap nginx-doc ssl-cert python3-doc\n", + " python3-tk python3-venv python-setuptools-doc python3.6-venv python3.6-doc\n", + " binutils binfmt-support readline-doc\n", + "Recommended packages:\n", + " libatm1 libxtables12 geoip-database publicsuffix file xz-utils\n", + " build-essential python3-dev python3-wheel\n", + "The following NEW packages will be installed:\n", + " ca-certificates fontconfig-config fonts-dejavu-core iproute2 libbsd0 libelf1\n", + " libexpat1 libfontconfig1 libfreetype6 libgd3 libgeoip1 libicu60 libjbig0\n", + " libjpeg-turbo8 libjpeg8 libmnl0 libmpdec2 libnginx-mod-http-geoip\n", + " libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter\n", + " libnginx-mod-mail libnginx-mod-stream libpng16-16 libpsl5 libpython3-stdlib\n", + " libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0 libssl1.1\n", + " libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2\n", + " libxpm4 libxslt1.1 mime-support multiarch-support nginx nginx-common\n", + " nginx-core openssl python-pip-whl python3 python3-distutils python3-lib2to3\n", + " python3-minimal python3-pip python3-pkg-resources python3-setuptools\n", + " python3.6 python3.6-minimal readline-common ucf wget\n", + "0 upgraded, 59 newly installed, 0 to remove and 0 not upgraded.\n", + "Need to get 23.3 MB of archives.\n", + "After this operation, 88.7 MB of additional disk space will be used.\n", + "Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.14 [1302 kB]\n", + "Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3.6-minimal amd64 3.6.9-1~18.04ubuntu1.6 [534 kB]\n", + "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libexpat1 amd64 2.2.5-3ubuntu0.2 [80.5 kB]\n", + "Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3.6-minimal amd64 3.6.9-1~18.04ubuntu1.6 [1609 kB]\n", + "Get:5 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-minimal amd64 3.6.7-1~18.04 [23.7 kB]\n", + "Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 mime-support all 3.60ubuntu1 [30.1 kB]\n", + "Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 libmpdec2 amd64 2.4.2-1ubuntu1 [84.1 kB]\n", + "Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 readline-common all 7.0-3 [52.9 kB]\n", + "Get:9 http://archive.ubuntu.com/ubuntu bionic/main amd64 libreadline7 amd64 7.0-3 [124 kB]\n", + "Get:10 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsqlite3-0 amd64 3.22.0-1ubuntu0.4 [499 kB]\n", + "Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3.6-stdlib amd64 3.6.9-1~18.04ubuntu1.6 [1712 kB]\n", + "Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3.6 amd64 3.6.9-1~18.04ubuntu1.6 [203 kB]\n", + "Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3-stdlib amd64 3.6.7-1~18.04 [7240 B]\n", + "Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3 amd64 3.6.7-1~18.04 [47.2 kB]\n", + "Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 multiarch-support amd64 2.27-3ubuntu1.4 [6944 B]\n", + "Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libjpeg-turbo8 amd64 1.5.2-0ubuntu5.18.04.4 [110 kB]\n", + "Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 openssl amd64 1.1.1-1ubuntu2.1~18.04.14 [613 kB]\n", + "Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 ca-certificates all 20210119~18.04.2 [145 kB]\n", + "Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libelf1 amd64 0.170-0.4ubuntu0.1 [44.8 kB]\n", + "Get:20 http://archive.ubuntu.com/ubuntu bionic/main amd64 libmnl0 amd64 1.0.4-2 [12.3 kB]\n", + "Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 iproute2 amd64 4.15.0-2ubuntu1.3 [721 kB]\n", + "Get:22 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libbsd0 amd64 0.8.7-1ubuntu0.1 [41.6 kB]\n", + "Get:23 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libicu60 amd64 60.2-3ubuntu3.2 [8050 kB]\n", + "Get:24 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxml2 amd64 2.9.4+dfsg1-6.1ubuntu1.4 [664 kB]\n", + "Get:25 http://archive.ubuntu.com/ubuntu bionic/main amd64 ucf all 3.0038 [50.5 kB]\n", + "Get:26 http://archive.ubuntu.com/ubuntu bionic/main amd64 libgeoip1 amd64 1.6.12-1 [71.8 kB]\n", + "Get:27 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpng16-16 amd64 1.6.34-1ubuntu0.18.04.2 [176 kB]\n", + "Get:28 http://archive.ubuntu.com/ubuntu bionic/main amd64 libpsl5 amd64 0.19.1-5build1 [41.8 kB]\n", + "Get:29 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxau6 amd64 1:1.0.8-1ubuntu1 [7556 B]\n", + "Get:30 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxdmcp6 amd64 1:1.1.2-3 [10.7 kB]\n", + "Get:31 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxcb1 amd64 1.13-2~ubuntu18.04 [45.5 kB]\n", + "Get:32 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libx11-data all 2:1.6.4-3ubuntu0.4 [114 kB]\n", + "Get:33 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libx11-6 amd64 2:1.6.4-3ubuntu0.4 [572 kB]\n", + "Get:34 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 wget amd64 1.19.4-1ubuntu2.2 [316 kB]\n", + "Get:35 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-dejavu-core all 2.37-1 [1041 kB]\n", + "Get:36 http://archive.ubuntu.com/ubuntu bionic/main amd64 fontconfig-config all 2.12.6-0ubuntu2 [55.8 kB]\n", + "Get:37 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libfreetype6 amd64 2.8.1-2ubuntu2.1 [335 kB]\n", + "Get:38 http://archive.ubuntu.com/ubuntu bionic/main amd64 libfontconfig1 amd64 2.12.6-0ubuntu2 [137 kB]\n", + "Get:39 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjpeg8 amd64 8c-2ubuntu8 [2194 B]\n", + "Get:40 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjbig0 amd64 2.1-3.1build1 [26.7 kB]\n", + "Get:41 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libtiff5 amd64 4.0.9-5ubuntu0.4 [153 kB]\n", + "Get:42 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libwebp6 amd64 0.6.1-2ubuntu0.18.04.1 [186 kB]\n", + "Get:43 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxpm4 amd64 1:3.5.12-1 [34.0 kB]\n", + "Get:44 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgd3 amd64 2.2.5-4ubuntu0.5 [119 kB]\n", + "Get:45 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-common all 1.14.0-0ubuntu1.9 [37.2 kB]\n", + "Get:46 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-geoip amd64 1.14.0-0ubuntu1.9 [11.0 kB]\n", + "Get:47 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-image-filter amd64 1.14.0-0ubuntu1.9 [14.3 kB]\n", + "Get:48 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxslt1.1 amd64 1.1.29-5ubuntu0.2 [150 kB]\n", + "Get:49 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-xslt-filter amd64 1.14.0-0ubuntu1.9 [12.7 kB]\n", + "Get:50 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-mail amd64 1.14.0-0ubuntu1.9 [41.6 kB]\n", + "Get:51 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-stream amd64 1.14.0-0ubuntu1.9 [63.5 kB]\n", + "Get:52 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-core amd64 1.14.0-0ubuntu1.9 [413 kB]\n", + "Get:53 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx all 1.14.0-0ubuntu1.9 [3596 B]\n", + "Get:54 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 python-pip-whl all 9.0.1-2.3~ubuntu1.18.04.5 [1653 kB]\n", + "Get:55 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-lib2to3 all 3.6.9-1~18.04 [77.4 kB]\n", + "Get:56 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-distutils all 3.6.9-1~18.04 [144 kB]\n", + "Get:57 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 python3-pip all 9.0.1-2.3~ubuntu1.18.04.5 [114 kB]\n", + "Get:58 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-pkg-resources all 39.0.1-2 [98.8 kB]\n", + "Get:59 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-setuptools all 39.0.1-2 [248 kB]\n", + "\u001b[91mdebconf: delaying package configuration, since apt-utils is not installed\n", + "\u001b[0mFetched 23.3 MB in 0s (47.4 MB/s)\n", + "Selecting previously unselected package libssl1.1:amd64.\n", + "(Reading database ... 4051 files and directories currently installed.)\n", + "Preparing to unpack .../libssl1.1_1.1.1-1ubuntu2.1~18.04.14_amd64.deb ...\n", + "Unpacking libssl1.1:amd64 (1.1.1-1ubuntu2.1~18.04.14) ...\n", + "Selecting previously unselected package libpython3.6-minimal:amd64.\n", + "Preparing to unpack .../libpython3.6-minimal_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", + "Unpacking libpython3.6-minimal:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Selecting previously unselected package libexpat1:amd64.\n", + "Preparing to unpack .../libexpat1_2.2.5-3ubuntu0.2_amd64.deb ...\n", + "Unpacking libexpat1:amd64 (2.2.5-3ubuntu0.2) ...\n", + "Selecting previously unselected package python3.6-minimal.\n", + "Preparing to unpack .../python3.6-minimal_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", + "Unpacking python3.6-minimal (3.6.9-1~18.04ubuntu1.6) ...\n", + "Setting up libssl1.1:amd64 (1.1.1-1ubuntu2.1~18.04.14) ...\n", + "debconf: unable to initialize frontend: Dialog\n", + "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", + "debconf: falling back to frontend: Readline\n", + "debconf: unable to initialize frontend: Readline\n", + "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", + "debconf: falling back to frontend: Teletype\n", + "Setting up libpython3.6-minimal:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Setting up libexpat1:amd64 (2.2.5-3ubuntu0.2) ...\n", + "Setting up python3.6-minimal (3.6.9-1~18.04ubuntu1.6) ...\n", + "Selecting previously unselected package python3-minimal.\n", + "(Reading database ... 4308 files and directories currently installed.)\n", + "Preparing to unpack .../0-python3-minimal_3.6.7-1~18.04_amd64.deb ...\n", + "Unpacking python3-minimal (3.6.7-1~18.04) ...\n", + "Selecting previously unselected package mime-support.\n", + "Preparing to unpack .../1-mime-support_3.60ubuntu1_all.deb ...\n", + "Unpacking mime-support (3.60ubuntu1) ...\n", + "Selecting previously unselected package libmpdec2:amd64.\n", + "Preparing to unpack .../2-libmpdec2_2.4.2-1ubuntu1_amd64.deb ...\n", + "Unpacking libmpdec2:amd64 (2.4.2-1ubuntu1) ...\n", + "Selecting previously unselected package readline-common.\n", + "Preparing to unpack .../3-readline-common_7.0-3_all.deb ...\n", + "Unpacking readline-common (7.0-3) ...\n", + "Selecting previously unselected package libreadline7:amd64.\n", + "Preparing to unpack .../4-libreadline7_7.0-3_amd64.deb ...\n", + "Unpacking libreadline7:amd64 (7.0-3) ...\n", + "Selecting previously unselected package libsqlite3-0:amd64.\n", + "Preparing to unpack .../5-libsqlite3-0_3.22.0-1ubuntu0.4_amd64.deb ...\n", + "Unpacking libsqlite3-0:amd64 (3.22.0-1ubuntu0.4) ...\n", + "Selecting previously unselected package libpython3.6-stdlib:amd64.\n", + "Preparing to unpack .../6-libpython3.6-stdlib_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", + "Unpacking libpython3.6-stdlib:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Selecting previously unselected package python3.6.\n", + "Preparing to unpack .../7-python3.6_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", + "Unpacking python3.6 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Selecting previously unselected package libpython3-stdlib:amd64.\n", + "Preparing to unpack .../8-libpython3-stdlib_3.6.7-1~18.04_amd64.deb ...\n", + "Unpacking libpython3-stdlib:amd64 (3.6.7-1~18.04) ...\n", + "Setting up python3-minimal (3.6.7-1~18.04) ...\n", + "Selecting previously unselected package python3.\n", + "(Reading database ... 4766 files and directories currently installed.)\n", + "Preparing to unpack .../python3_3.6.7-1~18.04_amd64.deb ...\n", + "Unpacking python3 (3.6.7-1~18.04) ...\n", + "Selecting previously unselected package multiarch-support.\n", + "Preparing to unpack .../multiarch-support_2.27-3ubuntu1.4_amd64.deb ...\n", + "Unpacking multiarch-support (2.27-3ubuntu1.4) ...\n", + "Setting up multiarch-support (2.27-3ubuntu1.4) ...\n", + "Selecting previously unselected package libjpeg-turbo8:amd64.\n", + "(Reading database ... 4803 files and directories currently installed.)\n", + "Preparing to unpack .../00-libjpeg-turbo8_1.5.2-0ubuntu5.18.04.4_amd64.deb ...\n", + "Unpacking libjpeg-turbo8:amd64 (1.5.2-0ubuntu5.18.04.4) ...\n", + "Selecting previously unselected package openssl.\n", + "Preparing to unpack .../01-openssl_1.1.1-1ubuntu2.1~18.04.14_amd64.deb ...\n", + "Unpacking openssl (1.1.1-1ubuntu2.1~18.04.14) ...\n", + "Selecting previously unselected package ca-certificates.\n", + "Preparing to unpack .../02-ca-certificates_20210119~18.04.2_all.deb ...\n", + "Unpacking ca-certificates (20210119~18.04.2) ...\n", + "Selecting previously unselected package libelf1:amd64.\n", + "Preparing to unpack .../03-libelf1_0.170-0.4ubuntu0.1_amd64.deb ...\n", + "Unpacking libelf1:amd64 (0.170-0.4ubuntu0.1) ...\n", + "Selecting previously unselected package libmnl0:amd64.\n", + "Preparing to unpack .../04-libmnl0_1.0.4-2_amd64.deb ...\n", + "Unpacking libmnl0:amd64 (1.0.4-2) ...\n", + "Selecting previously unselected package iproute2.\n", + "Preparing to unpack .../05-iproute2_4.15.0-2ubuntu1.3_amd64.deb ...\n", + "Unpacking iproute2 (4.15.0-2ubuntu1.3) ...\n", + "Selecting previously unselected package libbsd0:amd64.\n", + "Preparing to unpack .../06-libbsd0_0.8.7-1ubuntu0.1_amd64.deb ...\n", + "Unpacking libbsd0:amd64 (0.8.7-1ubuntu0.1) ...\n", + "Selecting previously unselected package libicu60:amd64.\n", + "Preparing to unpack .../07-libicu60_60.2-3ubuntu3.2_amd64.deb ...\n", + "Unpacking libicu60:amd64 (60.2-3ubuntu3.2) ...\n", + "Selecting previously unselected package libxml2:amd64.\n", + "Preparing to unpack .../08-libxml2_2.9.4+dfsg1-6.1ubuntu1.4_amd64.deb ...\n", + "Unpacking libxml2:amd64 (2.9.4+dfsg1-6.1ubuntu1.4) ...\n", + "Selecting previously unselected package ucf.\n", + "Preparing to unpack .../09-ucf_3.0038_all.deb ...\n", + "Moving old data out of the way\n", + "Unpacking ucf (3.0038) ...\n", + "Selecting previously unselected package libgeoip1:amd64.\n", + "Preparing to unpack .../10-libgeoip1_1.6.12-1_amd64.deb ...\n", + "Unpacking libgeoip1:amd64 (1.6.12-1) ...\n", + "Selecting previously unselected package libpng16-16:amd64.\n", + "Preparing to unpack .../11-libpng16-16_1.6.34-1ubuntu0.18.04.2_amd64.deb ...\n", + "Unpacking libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n", + "Selecting previously unselected package libpsl5:amd64.\n", + "Preparing to unpack .../12-libpsl5_0.19.1-5build1_amd64.deb ...\n", + "Unpacking libpsl5:amd64 (0.19.1-5build1) ...\n", + "Selecting previously unselected package libxau6:amd64.\n", + "Preparing to unpack .../13-libxau6_1%3a1.0.8-1ubuntu1_amd64.deb ...\n", + "Unpacking libxau6:amd64 (1:1.0.8-1ubuntu1) ...\n", + "Selecting previously unselected package libxdmcp6:amd64.\n", + "Preparing to unpack .../14-libxdmcp6_1%3a1.1.2-3_amd64.deb ...\n", + "Unpacking libxdmcp6:amd64 (1:1.1.2-3) ...\n", + "Selecting previously unselected package libxcb1:amd64.\n", + "Preparing to unpack .../15-libxcb1_1.13-2~ubuntu18.04_amd64.deb ...\n", + "Unpacking libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n", + "Selecting previously unselected package libx11-data.\n", + "Preparing to unpack .../16-libx11-data_2%3a1.6.4-3ubuntu0.4_all.deb ...\n", + "Unpacking libx11-data (2:1.6.4-3ubuntu0.4) ...\n", + "Selecting previously unselected package libx11-6:amd64.\n", + "Preparing to unpack .../17-libx11-6_2%3a1.6.4-3ubuntu0.4_amd64.deb ...\n", + "Unpacking libx11-6:amd64 (2:1.6.4-3ubuntu0.4) ...\n", + "Selecting previously unselected package wget.\n", + "Preparing to unpack .../18-wget_1.19.4-1ubuntu2.2_amd64.deb ...\n", + "Unpacking wget (1.19.4-1ubuntu2.2) ...\n", + "Selecting previously unselected package fonts-dejavu-core.\n", + "Preparing to unpack .../19-fonts-dejavu-core_2.37-1_all.deb ...\n", + "Unpacking fonts-dejavu-core (2.37-1) ...\n", + "Selecting previously unselected package fontconfig-config.\n", + "Preparing to unpack .../20-fontconfig-config_2.12.6-0ubuntu2_all.deb ...\n", + "Unpacking fontconfig-config (2.12.6-0ubuntu2) ...\n", + "Selecting previously unselected package libfreetype6:amd64.\n", + "Preparing to unpack .../21-libfreetype6_2.8.1-2ubuntu2.1_amd64.deb ...\n", + "Unpacking libfreetype6:amd64 (2.8.1-2ubuntu2.1) ...\n", + "Selecting previously unselected package libfontconfig1:amd64.\n", + "Preparing to unpack .../22-libfontconfig1_2.12.6-0ubuntu2_amd64.deb ...\n", + "Unpacking libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n", + "Selecting previously unselected package libjpeg8:amd64.\n", + "Preparing to unpack .../23-libjpeg8_8c-2ubuntu8_amd64.deb ...\n", + "Unpacking libjpeg8:amd64 (8c-2ubuntu8) ...\n", + "Selecting previously unselected package libjbig0:amd64.\n", + "Preparing to unpack .../24-libjbig0_2.1-3.1build1_amd64.deb ...\n", + "Unpacking libjbig0:amd64 (2.1-3.1build1) ...\n", + "Selecting previously unselected package libtiff5:amd64.\n", + "Preparing to unpack .../25-libtiff5_4.0.9-5ubuntu0.4_amd64.deb ...\n", + "Unpacking libtiff5:amd64 (4.0.9-5ubuntu0.4) ...\n", + "Selecting previously unselected package libwebp6:amd64.\n", + "Preparing to unpack .../26-libwebp6_0.6.1-2ubuntu0.18.04.1_amd64.deb ...\n", + "Unpacking libwebp6:amd64 (0.6.1-2ubuntu0.18.04.1) ...\n", + "Selecting previously unselected package libxpm4:amd64.\n", + "Preparing to unpack .../27-libxpm4_1%3a3.5.12-1_amd64.deb ...\n", + "Unpacking libxpm4:amd64 (1:3.5.12-1) ...\n", + "Selecting previously unselected package libgd3:amd64.\n", + "Preparing to unpack .../28-libgd3_2.2.5-4ubuntu0.5_amd64.deb ...\n", + "Unpacking libgd3:amd64 (2.2.5-4ubuntu0.5) ...\n", + "Selecting previously unselected package nginx-common.\n", + "Preparing to unpack .../29-nginx-common_1.14.0-0ubuntu1.9_all.deb ...\n", + "Unpacking nginx-common (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package libnginx-mod-http-geoip.\n", + "Preparing to unpack .../30-libnginx-mod-http-geoip_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking libnginx-mod-http-geoip (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package libnginx-mod-http-image-filter.\n", + "Preparing to unpack .../31-libnginx-mod-http-image-filter_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking libnginx-mod-http-image-filter (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package libxslt1.1:amd64.\n", + "Preparing to unpack .../32-libxslt1.1_1.1.29-5ubuntu0.2_amd64.deb ...\n", + "Unpacking libxslt1.1:amd64 (1.1.29-5ubuntu0.2) ...\n", + "Selecting previously unselected package libnginx-mod-http-xslt-filter.\n", + "Preparing to unpack .../33-libnginx-mod-http-xslt-filter_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking libnginx-mod-http-xslt-filter (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package libnginx-mod-mail.\n", + "Preparing to unpack .../34-libnginx-mod-mail_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking libnginx-mod-mail (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package libnginx-mod-stream.\n", + "Preparing to unpack .../35-libnginx-mod-stream_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking libnginx-mod-stream (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package nginx-core.\n", + "Preparing to unpack .../36-nginx-core_1.14.0-0ubuntu1.9_amd64.deb ...\n", + "Unpacking nginx-core (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package nginx.\n", + "Preparing to unpack .../37-nginx_1.14.0-0ubuntu1.9_all.deb ...\n", + "Unpacking nginx (1.14.0-0ubuntu1.9) ...\n", + "Selecting previously unselected package python-pip-whl.\n", + "Preparing to unpack .../38-python-pip-whl_9.0.1-2.3~ubuntu1.18.04.5_all.deb ...\n", + "Unpacking python-pip-whl (9.0.1-2.3~ubuntu1.18.04.5) ...\n", + "Selecting previously unselected package python3-lib2to3.\n", + "Preparing to unpack .../39-python3-lib2to3_3.6.9-1~18.04_all.deb ...\n", + "Unpacking python3-lib2to3 (3.6.9-1~18.04) ...\n", + "Selecting previously unselected package python3-distutils.\n", + "Preparing to unpack .../40-python3-distutils_3.6.9-1~18.04_all.deb ...\n", + "Unpacking python3-distutils (3.6.9-1~18.04) ...\n", + "Selecting previously unselected package python3-pip.\n", + "Preparing to unpack .../41-python3-pip_9.0.1-2.3~ubuntu1.18.04.5_all.deb ...\n", + "Unpacking python3-pip (9.0.1-2.3~ubuntu1.18.04.5) ...\n", + "Selecting previously unselected package python3-pkg-resources.\n", + "Preparing to unpack .../42-python3-pkg-resources_39.0.1-2_all.deb ...\n", + "Unpacking python3-pkg-resources (39.0.1-2) ...\n", + "Selecting previously unselected package python3-setuptools.\n", + "Preparing to unpack .../43-python3-setuptools_39.0.1-2_all.deb ...\n", + "Unpacking python3-setuptools (39.0.1-2) ...\n", + "Setting up readline-common (7.0-3) ...\n", + "Setting up libicu60:amd64 (60.2-3ubuntu3.2) ...\n", + "Setting up mime-support (3.60ubuntu1) ...\n", + "Setting up libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n", + "Setting up libjbig0:amd64 (2.1-3.1build1) ...\n", + "Setting up fonts-dejavu-core (2.37-1) ...\n", + "Setting up libreadline7:amd64 (7.0-3) ...\n", + "Setting up libpsl5:amd64 (0.19.1-5build1) ...\n", + "Setting up libelf1:amd64 (0.170-0.4ubuntu0.1) ...\n", + "Setting up nginx-common (1.14.0-0ubuntu1.9) ...\n", + "debconf: unable to initialize frontend: Dialog\n", + "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", + "debconf: falling back to frontend: Readline\n", + "debconf: unable to initialize frontend: Readline\n", + "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", + "debconf: falling back to frontend: Teletype\n", + "Setting up libjpeg-turbo8:amd64 (1.5.2-0ubuntu5.18.04.4) ...\n", + "Setting up libgeoip1:amd64 (1.6.12-1) ...\n", + "Setting up libbsd0:amd64 (0.8.7-1ubuntu0.1) ...\n", + "Setting up ucf (3.0038) ...\n", + "debconf: unable to initialize frontend: Dialog\n", + "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", + "debconf: falling back to frontend: Readline\n", + "debconf: unable to initialize frontend: Readline\n", + "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", + "debconf: falling back to frontend: Teletype\n", + "Setting up libxml2:amd64 (2.9.4+dfsg1-6.1ubuntu1.4) ...\n", + "Setting up libfreetype6:amd64 (2.8.1-2ubuntu2.1) ...\n", + "Setting up libxslt1.1:amd64 (1.1.29-5ubuntu0.2) ...\n", + "Setting up openssl (1.1.1-1ubuntu2.1~18.04.14) ...\n", + "Setting up wget (1.19.4-1ubuntu2.2) ...\n", + "Setting up libsqlite3-0:amd64 (3.22.0-1ubuntu0.4) ...\n", + "Setting up libnginx-mod-mail (1.14.0-0ubuntu1.9) ...\n", + "Setting up libnginx-mod-http-xslt-filter (1.14.0-0ubuntu1.9) ...\n", + "Setting up libxdmcp6:amd64 (1:1.1.2-3) ...\n", + "Setting up ca-certificates (20210119~18.04.2) ...\n", + "debconf: unable to initialize frontend: Dialog\n", + "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", + "debconf: falling back to frontend: Readline\n", + "debconf: unable to initialize frontend: Readline\n", + "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", + "debconf: falling back to frontend: Teletype\n", + "Updating certificates in /etc/ssl/certs...\n", + "128 added, 0 removed; done.\n", + "Setting up libmnl0:amd64 (1.0.4-2) ...\n", + "Setting up libnginx-mod-http-geoip (1.14.0-0ubuntu1.9) ...\n", + "Setting up libx11-data (2:1.6.4-3ubuntu0.4) ...\n", + "Setting up libxau6:amd64 (1:1.0.8-1ubuntu1) ...\n", + "Setting up libmpdec2:amd64 (2.4.2-1ubuntu1) ...\n", + "Setting up libwebp6:amd64 (0.6.1-2ubuntu0.18.04.1) ...\n", + "Setting up libjpeg8:amd64 (8c-2ubuntu8) ...\n", + "Setting up python-pip-whl (9.0.1-2.3~ubuntu1.18.04.5) ...\n", + "Setting up libpython3.6-stdlib:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Setting up fontconfig-config (2.12.6-0ubuntu2) ...\n", + "Setting up python3.6 (3.6.9-1~18.04ubuntu1.6) ...\n", + "Setting up libnginx-mod-stream (1.14.0-0ubuntu1.9) ...\n", + "Setting up libtiff5:amd64 (4.0.9-5ubuntu0.4) ...\n", + "Setting up iproute2 (4.15.0-2ubuntu1.3) ...\n", + "Setting up libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n", + "Setting up libpython3-stdlib:amd64 (3.6.7-1~18.04) ...\n", + "Setting up libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n", + "Setting up python3 (3.6.7-1~18.04) ...\n", + "running python rtupdate hooks for python3.6...\n", + "running python post-rtupdate hooks for python3.6...\n", + "Setting up libx11-6:amd64 (2:1.6.4-3ubuntu0.4) ...\n", + "Setting up python3-pkg-resources (39.0.1-2) ...\n", + "Setting up libxpm4:amd64 (1:3.5.12-1) ...\n", + "Setting up python3-lib2to3 (3.6.9-1~18.04) ...\n", + "Setting up python3-distutils (3.6.9-1~18.04) ...\n", + "Setting up libgd3:amd64 (2.2.5-4ubuntu0.5) ...\n", + "Setting up python3-pip (9.0.1-2.3~ubuntu1.18.04.5) ...\n", + "Setting up python3-setuptools (39.0.1-2) ...\n", + "Setting up libnginx-mod-http-image-filter (1.14.0-0ubuntu1.9) ...\n", + "Setting up nginx-core (1.14.0-0ubuntu1.9) ...\n", + "invoke-rc.d: could not determine current runlevel\n", + "invoke-rc.d: policy-rc.d denied execution of start.\n", + "Setting up nginx (1.14.0-0ubuntu1.9) ...\n", + "Processing triggers for libc-bin (2.27-3ubuntu1.4) ...\n", + "Processing triggers for ca-certificates (20210119~18.04.2) ...\n", + "Updating certificates in /etc/ssl/certs...\n", + "0 added, 0 removed; done.\n", + "Running hooks in /etc/ca-certificates/update.d...\n", + "done.\n", + "Removing intermediate container a090988a9802\n", + " ---> a7192dfdaf3b\n", + "Step 4/11 : RUN ln -s /usr/bin/python3 /usr/bin/python\n", + " ---> Running in 25e4f0e88ba2\n", + "Removing intermediate container 25e4f0e88ba2\n", + " ---> 4cea2db68da7\n", + "Step 5/11 : RUN ln -s /usr/bin/pip3 /usr/bin/pip\n", + " ---> Running in 064542e0b716\n", + "Removing intermediate container 064542e0b716\n", + " ---> 07b09e94c060\n", + "Step 6/11 : RUN pip --no-cache-dir install numpy==1.16.2 scipy==1.2.1 scikit-learn==0.20.2 pandas flask gunicorn\n", + " ---> Running in 44ef081a1c09\n", + "Collecting numpy==1.16.2\n", + " Downloading https://files.pythonhosted.org/packages/35/d5/4f8410ac303e690144f0a0603c4b8fd3b986feb2749c435f7cdbb288f17e/numpy-1.16.2-cp36-cp36m-manylinux1_x86_64.whl (17.3MB)\n", + "Collecting scipy==1.2.1\n", + " Downloading https://files.pythonhosted.org/packages/7f/5f/c48860704092933bf1c4c1574a8de1ffd16bf4fde8bab190d747598844b2/scipy-1.2.1-cp36-cp36m-manylinux1_x86_64.whl (24.8MB)\n", + "Collecting scikit-learn==0.20.2\n", + " Downloading https://files.pythonhosted.org/packages/0d/3a/b92670f5c368c20329ecc4c255993fae7934564d485c3ed7ea7b8da7f741/scikit_learn-0.20.2-cp36-cp36m-manylinux1_x86_64.whl (5.4MB)\n", + "Collecting pandas\n", + " Downloading https://files.pythonhosted.org/packages/c3/e2/00cacecafbab071c787019f00ad84ca3185952f6bb9bca9550ed83870d4d/pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5MB)\n", + "Collecting flask\n", + " Downloading https://files.pythonhosted.org/packages/cd/77/59df23681f4fd19b7cbbb5e92484d46ad587554f5d490f33ef907e456132/Flask-2.0.3-py3-none-any.whl (95kB)\n", + "Collecting gunicorn\n", + " Downloading https://files.pythonhosted.org/packages/e4/dd/5b190393e6066286773a67dfcc2f9492058e9b57c4867a95f1ba5caf0a83/gunicorn-20.1.0-py3-none-any.whl (79kB)\n", + "Collecting python-dateutil>=2.7.3 (from pandas)\n", + " Downloading https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl (247kB)\n", + "Collecting pytz>=2017.2 (from pandas)\n", + " Downloading https://files.pythonhosted.org/packages/d3/e3/d9f046b5d1c94a3aeab15f1f867aa414f8ee9d196fae6865f1d6a0ee1a0b/pytz-2021.3-py2.py3-none-any.whl (503kB)\n", + "Collecting click>=7.1.2 (from flask)\n", + " Downloading https://files.pythonhosted.org/packages/48/58/c8aa6a8e62cc75f39fee1092c45d6b6ba684122697d7ce7d53f64f98a129/click-8.0.3-py3-none-any.whl (97kB)\n", + "Collecting itsdangerous>=2.0 (from flask)\n", + " Downloading https://files.pythonhosted.org/packages/9c/96/26f935afba9cd6140216da5add223a0c465b99d0f112b68a4ca426441019/itsdangerous-2.0.1-py3-none-any.whl\n", + "Collecting Werkzeug>=2.0 (from flask)\n", + " Downloading https://files.pythonhosted.org/packages/f4/f3/22afbdb20cc4654b10c98043414a14057cd27fdba9d4ae61cea596000ba2/Werkzeug-2.0.3-py3-none-any.whl (289kB)\n", + "Collecting Jinja2>=3.0 (from flask)\n", + " Downloading https://files.pythonhosted.org/packages/20/9a/e5d9ec41927401e41aea8af6d16e78b5e612bca4699d417f646a9610a076/Jinja2-3.0.3-py3-none-any.whl (133kB)\n", + "Requirement already satisfied: setuptools>=3.0 in /usr/lib/python3/dist-packages (from gunicorn)\n", + "Collecting six>=1.5 (from python-dateutil>=2.7.3->pandas)\n", + " Downloading https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl\n", + "Collecting importlib-metadata; python_version < \"3.8\" (from click>=7.1.2->flask)\n", + " Downloading https://files.pythonhosted.org/packages/a0/a1/b153a0a4caf7a7e3f15c2cd56c7702e2cf3d89b1b359d1f1c5e59d68f4ce/importlib_metadata-4.8.3-py3-none-any.whl\n", + "Collecting dataclasses; python_version < \"3.7\" (from Werkzeug>=2.0->flask)\n", + " Downloading https://files.pythonhosted.org/packages/fe/ca/75fac5856ab5cfa51bbbcefa250182e50441074fdc3f803f6e76451fab43/dataclasses-0.8-py3-none-any.whl\n", + "Collecting MarkupSafe>=2.0 (from Jinja2>=3.0->flask)\n", + " Downloading https://files.pythonhosted.org/packages/fc/d6/57f9a97e56447a1e340f8574836d3b636e2c14de304943836bd645fa9c7e/MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl\n", + "Collecting zipp>=0.5 (from importlib-metadata; python_version < \"3.8\"->click>=7.1.2->flask)\n", + " Downloading https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl\n", + "Collecting typing-extensions>=3.6.4; python_version < \"3.8\" (from importlib-metadata; python_version < \"3.8\"->click>=7.1.2->flask)\n", + " Downloading https://files.pythonhosted.org/packages/45/6b/44f7f8f1e110027cf88956b59f2fad776cca7e1704396d043f89effd3a0e/typing_extensions-4.1.1-py3-none-any.whl\n", + "Installing collected packages: numpy, scipy, scikit-learn, six, python-dateutil, pytz, pandas, zipp, typing-extensions, importlib-metadata, click, itsdangerous, dataclasses, Werkzeug, MarkupSafe, Jinja2, flask, gunicorn\n", + "Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.3 click-8.0.3 dataclasses-0.8 flask-2.0.3 gunicorn-20.1.0 importlib-metadata-4.8.3 itsdangerous-2.0.1 numpy-1.16.2 pandas-1.1.5 python-dateutil-2.8.2 pytz-2021.3 scikit-learn-0.20.2 scipy-1.2.1 six-1.16.0 typing-extensions-4.1.1 zipp-3.6.0\n", + "Removing intermediate container 44ef081a1c09\n", + " ---> dcc26fd3b056\n", + "Step 7/11 : ENV PYTHONUNBUFFERED=TRUE\n", + " ---> Running in a27fc63c3198\n", + "Removing intermediate container a27fc63c3198\n", + " ---> 1841d430f0bd\n", + "Step 8/11 : ENV PYTHONDONTWRITEBYTECODE=TRUE\n", + " ---> Running in 0ce0828a1366\n", + "Removing intermediate container 0ce0828a1366\n", + " ---> 532fdb4f7f52\n", + "Step 9/11 : ENV PATH=\"/opt/program:${PATH}\"\n", + " ---> Running in 3b2f98bb98d6\n", + "Removing intermediate container 3b2f98bb98d6\n", + " ---> 4095f4b26cbf\n", + "Step 10/11 : COPY decision_trees /opt/program\n", + " ---> 9c82acedfe89\n", + "Step 11/11 : WORKDIR /opt/program\n", + " ---> Running in b0943ee7e5d0\n", + "Removing intermediate container b0943ee7e5d0\n", + " ---> 91fe39d736a5\n", + "Successfully built 91fe39d736a5\n", + "Successfully tagged sagemaker-decision-trees:latest\n", + "\n", + "[Container] 2022/02/15 01:47:04 Running command docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG\n", + "\n", + "[Container] 2022/02/15 01:47:04 Phase complete: BUILD State: SUCCEEDED\n", + "[Container] 2022/02/15 01:47:04 Phase context status code: Message:\n", + "[Container] 2022/02/15 01:47:04 Entering phase POST_BUILD\n", + "[Container] 2022/02/15 01:47:04 Running command echo Build completed on `date`\n", + "Build completed on Tue Feb 15 01:47:04 UTC 2022\n", + "\n", + "[Container] 2022/02/15 01:47:04 Running command echo Pushing the Docker image...\n", + "Pushing the Docker image...\n", + "\n", + "[Container] 2022/02/15 01:47:04 Running command docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG\n", + "The push refers to repository [240487350066.dkr.ecr.us-east-1.amazonaws.com/sagemaker-decision-trees]\n", + "49672cebbb4f: Preparing\n", + "fe9b0cc9d771: Preparing\n", + "73ecb653edc2: Preparing\n", + "99b7ec0bc589: Preparing\n", + "6fc0a72852b3: Preparing\n", + "1dc52a6b4de8: Preparing\n", + "1dc52a6b4de8: Waiting\n", + "49672cebbb4f: Pushed\n", + "99b7ec0bc589: Pushed\n", + "73ecb653edc2: Pushed\n", + "6fc0a72852b3: Pushed\n", + "1dc52a6b4de8: Pushed\n", + "fe9b0cc9d771: Pushed\n", + "latest: digest: sha256:adc5e78414c2b2257974df50a4fd87386e8530fb5fce6484ea5be2e5f5674ce3 size: 1575\n", + "\n", + "[Container] 2022/02/15 01:47:18 Phase complete: POST_BUILD State: SUCCEEDED\n", + "[Container] 2022/02/15 01:47:18 Phase context status code: Message:\n", + "\n", + "Image URI: 240487350066.dkr.ecr.us-east-1.amazonaws.com/sagemaker-decision-trees:latest\n" + ] + } + ], "source": [ "%%sh\n", "# cell 02\n", @@ -233,7 +921,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +950,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -292,7 +980,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -317,8 +1005,8 @@ "source": [ "In order to use SageMaker to fit our algorithm, we create an [`estimator`](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html) that defines how to use the container to train. This includes the configuration we need to invoke SageMaker training:\n", "\n", - "- `image_uri (str)` - The [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/) path where the training code is stored. This is constructed in the shell commands in *cell 06*.\n", - "- `role (str)` - As defined above in *cell 03*.\n", + "- `image_uri (str)` - The [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/) path where the docker image is registered. This is constructed in the shell commands in *cell 06*.\n", + "- `role (str)` - SageMaker IAM role as obtained above in *cell 03*.\n", "- `instance_count (int)` - number of machines to use for training.\n", "- `instance_type (str)` - the type of machine to use for training.\n", "- `output_path (str)` - where the model artifact will be written.\n", @@ -336,9 +1024,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-02-15 02:11:50 Starting - Starting the training job...\n", + "2022-02-15 02:12:14 Starting - Launching requested ML instancesProfilerReport-1644891110: InProgress\n", + "......\n", + "2022-02-15 02:13:20 Starting - Preparing the instances for training......\n", + "2022-02-15 02:14:15 Downloading - Downloading input data...\n", + "2022-02-15 02:14:50 Training - Training image download completed. Training in progress..\u001b[34mStarting the training.\u001b[0m\n", + "\u001b[34mTraining complete.\u001b[0m\n", + "\n", + "2022-02-15 02:15:15 Uploading - Uploading generated training model\n", + "2022-02-15 02:15:15 Completed - Training job completed\n", + "Training seconds: 55\n", + "Billable seconds: 55\n" + ] + } + ], "source": [ "# cell 06\n", "\n", @@ -369,14 +1076,22 @@ "The method uses the following configurations:\n", "- `initial_instance_count (int)` – The number of instances to deploy the model.\n", "- `instance_type (str)` – The type of instances that you want to operate your deployed model.\n", - "- `serializer (int)` – Serialize input data of various formats (a NumPy array, list, file, or buffer) to a CSV-formatted string. \n" + "- `serializer (int)` – Serialize input data of various formats (a NumPy array, list, file, or buffer) to a CSV-formatted string in this example. \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------!" + ] + } + ], "source": [ "# cell 07\n", "\n", @@ -398,14 +1113,83 @@ "metadata": {}, "source": [ "### Preparing test data\n", - "In order to do some predictions, we’ll extract some of the data we used for training and do predictions against it. This is, of course, bad statistical practice, but a good way to see how the mechanism works." + "In order to do some predictions, we’ll extract some of the data we used for training and do predictions against it. This is, of course, bad statistical practice, but an easy way to see how the mechanism works." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01234
109virginica7.23.66.12.5
74versicolor6.42.94.31.3
122virginica7.72.86.72.0
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4\n", + "109 virginica 7.2 3.6 6.1 2.5\n", + "74 versicolor 6.4 2.9 4.3 1.3\n", + "122 virginica 7.7 2.8 6.7 2.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# cell 08\n", "\n", @@ -415,9 +1199,74 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + "
1234
1215.62.84.92.0
1436.83.25.92.3
526.93.14.91.5
\n", + "
" + ], + "text/plain": [ + " 1 2 3 4\n", + "121 5.6 2.8 4.9 2.0\n", + "143 6.8 3.2 5.9 2.3\n", + "52 6.9 3.1 4.9 1.5" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# cell 09\n", "\n", @@ -428,7 +1277,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -449,14 +1298,51 @@ "source": [ "### Predictions\n", "\n", - "Prediction is as easy as calling predict with the predictor we got back from deploy and the data we want to do predictions with. The serializers take care of doing the data conversions for us." + "Prediction is as easy as calling `predict` with the `predictor` we got back from `deploy` and the data we want to do predictions with. The serializers take care of doing the data conversions for us." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "setosa\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "versicolor\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "virginica\n", + "\n" + ] + } + ], "source": [ "# cell 11\n", "\n", @@ -473,7 +1359,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -490,21 +1376,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# cell 13\n", "!rm -rf lab03_container lab03_data" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "instance_type": "ml.t3.medium", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (Data Science)", "language": "python", - "name": "python3" + "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" }, "language_info": { "codemirror_mode": { @@ -516,7 +1409,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.3" + "version": "3.7.10" } }, "nbformat": 4, From 63c89037036522e7c47fd2962ddd08fcc1935997 Mon Sep 17 00:00:00 2001 From: chrislitianxin Date: Thu, 17 Feb 2022 10:07:25 -0500 Subject: [PATCH 7/8] :recycle: cleaned notebook cell output --- bring-custom-container.ipynb | 939 +---------------------------------- bring-custom-script.ipynb | 6 +- 2 files changed, 29 insertions(+), 916 deletions(-) diff --git a/bring-custom-container.ipynb b/bring-custom-container.ipynb index 5e031cd..74ad617 100644 --- a/bring-custom-container.ipynb +++ b/bring-custom-container.ipynb @@ -126,27 +126,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/opt/conda/lib/python3.7/site-packages/secretstorage/dhcrypto.py:16: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", - " from cryptography.utils import int_from_bytes\n", - "/opt/conda/lib/python3.7/site-packages/secretstorage/util.py:25: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", - " from cryptography.utils import int_from_bytes\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m/opt/conda/lib/python3.7/site-packages/secretstorage/dhcrypto.py:16: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", - " from cryptography.utils import int_from_bytes\n", - "/opt/conda/lib/python3.7/site-packages/secretstorage/util.py:25: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n", - " from cryptography.utils import int_from_bytes\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ "# cell 00\n", "!pip install -q --upgrade aiobotocore\n", @@ -164,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -194,55 +176,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[37m# Build an image that can do training and inference in SageMaker\u001b[39;49;00m\n", - "\u001b[37m# This is a Python 3 image that uses the nginx, gunicorn, flask stack\u001b[39;49;00m\n", - "\u001b[37m# for serving inferences in a stable way.\u001b[39;49;00m\n", - "\n", - "\u001b[34mFROM\u001b[39;49;00m \u001b[33mubuntu:18.04\u001b[39;49;00m\n", - "\n", - "\u001b[34mMAINTAINER\u001b[39;49;00m\u001b[33m Amazon AI \u001b[39;49;00m\n", - "\n", - "\n", - "\u001b[34mRUN\u001b[39;49;00m apt-get -y update && apt-get install -y --no-install-recommends \u001b[33m\\\u001b[39;49;00m\n", - " wget \u001b[33m\\\u001b[39;49;00m\n", - " python3-pip \u001b[33m\\\u001b[39;49;00m\n", - " python3-setuptools \u001b[33m\\\u001b[39;49;00m\n", - " nginx \u001b[33m\\\u001b[39;49;00m\n", - " ca-certificates \u001b[33m\\\u001b[39;49;00m\n", - " && rm -rf /var/lib/apt/lists/*\n", - "\n", - "\u001b[34mRUN\u001b[39;49;00m ln -s /usr/bin/python3 /usr/bin/python\n", - "\u001b[34mRUN\u001b[39;49;00m ln -s /usr/bin/pip3 /usr/bin/pip\n", - "\n", - "\u001b[37m# Here we get all python packages.\u001b[39;49;00m\n", - "\u001b[37m# There's substantial overlap between scipy and numpy that we eliminate by\u001b[39;49;00m\n", - "\u001b[37m# linking them together. Likewise, pip leaves the install caches populated which uses\u001b[39;49;00m\n", - "\u001b[37m# a significant amount of space. These optimizations save a fair amount of space in the\u001b[39;49;00m\n", - "\u001b[37m# image, which reduces start up time.\u001b[39;49;00m\n", - "\u001b[34mRUN\u001b[39;49;00m pip --no-cache-dir install \u001b[31mnumpy\u001b[39;49;00m==\u001b[34m1\u001b[39;49;00m.16.2 \u001b[31mscipy\u001b[39;49;00m==\u001b[34m1\u001b[39;49;00m.2.1 scikit-learn==\u001b[34m0\u001b[39;49;00m.20.2 pandas flask gunicorn\n", - "\n", - "\u001b[37m# Set some environment variables. PYTHONUNBUFFERED keeps Python from buffering our standard\u001b[39;49;00m\n", - "\u001b[37m# output stream, which means that logs can be delivered to the user quickly. PYTHONDONTWRITEBYTECODE\u001b[39;49;00m\n", - "\u001b[37m# keeps Python from writing the .pyc files which are unnecessary in this case. We also update\u001b[39;49;00m\n", - "\u001b[37m# PATH so that the train and serve programs are found when the container is invoked.\u001b[39;49;00m\n", - "\n", - "\u001b[34mENV\u001b[39;49;00m \u001b[31mPYTHONUNBUFFERED\u001b[39;49;00m=TRUE\n", - "\u001b[34mENV\u001b[39;49;00m \u001b[31mPYTHONDONTWRITEBYTECODE\u001b[39;49;00m=TRUE\n", - "\u001b[34mENV\u001b[39;49;00m \u001b[31mPATH\u001b[39;49;00m=\u001b[33m\"\u001b[39;49;00m\u001b[33m/opt/program:\u001b[39;49;00m\u001b[33m${\u001b[39;49;00m\u001b[31mPATH\u001b[39;49;00m\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\n", - "\n", - "\u001b[37m# Set up the program in the image\u001b[39;49;00m\n", - "\u001b[34mCOPY\u001b[39;49;00m decision_trees /opt/program\n", - "\u001b[34mWORKDIR\u001b[39;49;00m\u001b[33m /opt/program\u001b[39;49;00m\n" - ] - } - ], + "outputs": [], "source": [ "!pygmentize lab03_container/Dockerfile" ] @@ -263,634 +199,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created ECR repository sagemaker-decision-trees\n", - "....[Container] 2022/02/15 01:46:06 Waiting for agent ping\n", - "\n", - "[Container] 2022/02/15 01:46:07 Waiting for DOWNLOAD_SOURCE\n", - "[Container] 2022/02/15 01:46:09 Phase is DOWNLOAD_SOURCE\n", - "[Container] 2022/02/15 01:46:09 CODEBUILD_SRC_DIR=/codebuild/output/src379485610/src\n", - "[Container] 2022/02/15 01:46:09 YAML location is /codebuild/output/src379485610/src/buildspec.yml\n", - "[Container] 2022/02/15 01:46:09 Setting HTTP client timeout to higher timeout for S3 source\n", - "[Container] 2022/02/15 01:46:09 Processing environment variables\n", - "[Container] 2022/02/15 01:46:09 No runtime version selected in buildspec.\n", - "[Container] 2022/02/15 01:46:09 Moving to directory /codebuild/output/src379485610/src\n", - "[Container] 2022/02/15 01:46:09 Configuring ssm agent with target id: codebuild:7ee311b6-ebb0-4b2c-928f-fee3b9ec29cd\n", - "[Container] 2022/02/15 01:46:09 Successfully updated ssm agent configuration\n", - "[Container] 2022/02/15 01:46:09 Registering with agent\n", - "[Container] 2022/02/15 01:46:09 Phases found in YAML: 3\n", - "[Container] 2022/02/15 01:46:09 PRE_BUILD: 9 commands\n", - "[Container] 2022/02/15 01:46:09 BUILD: 4 commands\n", - "[Container] 2022/02/15 01:46:09 POST_BUILD: 3 commands\n", - "[Container] 2022/02/15 01:46:09 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED\n", - "[Container] 2022/02/15 01:46:09 Phase context status code: Message:\n", - "[Container] 2022/02/15 01:46:09 Entering phase INSTALL\n", - "[Container] 2022/02/15 01:46:09 Phase complete: INSTALL State: SUCCEEDED\n", - "[Container] 2022/02/15 01:46:09 Phase context status code: Message:\n", - "[Container] 2022/02/15 01:46:09 Entering phase PRE_BUILD\n", - "[Container] 2022/02/15 01:46:09 Running command echo Logging in to Amazon ECR...\n", - "Logging in to Amazon ECR...\n", - "\n", - "[Container] 2022/02/15 01:46:09 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:15 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 763104351884)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:15 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 217643126080)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:16 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 727897471807)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:16 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 626614931356)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:17 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 683313688378)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:17 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 520713654638)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:18 Running command $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --registry-ids 462105765813)\n", - "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\n", - "WARNING! Your password will be stored unencrypted in /root/.docker/config.json.\n", - "Configure a credential helper to remove this warning. See\n", - "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", - "\n", - "Login Succeeded\n", - "\n", - "[Container] 2022/02/15 01:46:18 Phase complete: PRE_BUILD State: SUCCEEDED\n", - "[Container] 2022/02/15 01:46:18 Phase context status code: Message:\n", - "[Container] 2022/02/15 01:46:18 Entering phase BUILD\n", - "[Container] 2022/02/15 01:46:18 Running command echo Build started on `date`\n", - "Build started on Tue Feb 15 01:46:18 UTC 2022\n", - "\n", - "[Container] 2022/02/15 01:46:18 Running command echo Building the Docker image...\n", - "Building the Docker image...\n", - "\n", - "[Container] 2022/02/15 01:46:18 Running command docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .\n", - "Sending build context to Docker daemon 103.9kB\n", - "Step 1/11 : FROM ubuntu:18.04\n", - "18.04: Pulling from library/ubuntu\n", - "68e7bb398b9f: Pulling fs layer\n", - "68e7bb398b9f: Verifying Checksum\n", - "68e7bb398b9f: Download complete\n", - "68e7bb398b9f: Pull complete\n", - "Digest: sha256:c2aa13782650aa7ade424b12008128b60034c795f25456e8eb552d0a0f447cad\n", - "Status: Downloaded newer image for ubuntu:18.04\n", - " ---> dcf4d4bef137\n", - "Step 2/11 : MAINTAINER Amazon AI \n", - " ---> Running in 9158bd4be24c\n", - "Removing intermediate container 9158bd4be24c\n", - " ---> 18f88ea5d5a5\n", - "Step 3/11 : RUN apt-get -y update && apt-get install -y --no-install-recommends wget python3-pip python3-setuptools nginx ca-certificates && rm -rf /var/lib/apt/lists/*\n", - " ---> Running in a090988a9802\n", - "Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]\n", - "Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]\n", - "Get:5 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [21.1 kB]\n", - "Get:6 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2565 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]\n", - "Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]\n", - "Get:9 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [783 kB]\n", - "Get:10 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]\n", - "Get:11 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1470 kB]\n", - "Get:12 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]\n", - "Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [816 kB]\n", - "Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [29.0 kB]\n", - "Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2248 kB]\n", - "Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3004 kB]\n", - "Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [12.6 kB]\n", - "Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [11.6 kB]\n", - "Fetched 24.3 MB in 2s (13.1 MB/s)\n", - "Reading package lists...\n", - "Reading package lists...\n", - "Building dependency tree...\n", - "Reading state information...\n", - "The following additional packages will be installed:\n", - " fontconfig-config fonts-dejavu-core iproute2 libbsd0 libelf1 libexpat1\n", - " libfontconfig1 libfreetype6 libgd3 libgeoip1 libicu60 libjbig0\n", - " libjpeg-turbo8 libjpeg8 libmnl0 libmpdec2 libnginx-mod-http-geoip\n", - " libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter\n", - " libnginx-mod-mail libnginx-mod-stream libpng16-16 libpsl5 libpython3-stdlib\n", - " libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0 libssl1.1\n", - " libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2\n", - " libxpm4 libxslt1.1 mime-support multiarch-support nginx-common nginx-core\n", - " openssl python-pip-whl python3 python3-distutils python3-lib2to3\n", - " python3-minimal python3-pkg-resources python3.6 python3.6-minimal\n", - " readline-common ucf\n", - "Suggested packages:\n", - " iproute2-doc libgd-tools geoip-bin fcgiwrap nginx-doc ssl-cert python3-doc\n", - " python3-tk python3-venv python-setuptools-doc python3.6-venv python3.6-doc\n", - " binutils binfmt-support readline-doc\n", - "Recommended packages:\n", - " libatm1 libxtables12 geoip-database publicsuffix file xz-utils\n", - " build-essential python3-dev python3-wheel\n", - "The following NEW packages will be installed:\n", - " ca-certificates fontconfig-config fonts-dejavu-core iproute2 libbsd0 libelf1\n", - " libexpat1 libfontconfig1 libfreetype6 libgd3 libgeoip1 libicu60 libjbig0\n", - " libjpeg-turbo8 libjpeg8 libmnl0 libmpdec2 libnginx-mod-http-geoip\n", - " libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter\n", - " libnginx-mod-mail libnginx-mod-stream libpng16-16 libpsl5 libpython3-stdlib\n", - " libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0 libssl1.1\n", - " libtiff5 libwebp6 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2\n", - " libxpm4 libxslt1.1 mime-support multiarch-support nginx nginx-common\n", - " nginx-core openssl python-pip-whl python3 python3-distutils python3-lib2to3\n", - " python3-minimal python3-pip python3-pkg-resources python3-setuptools\n", - " python3.6 python3.6-minimal readline-common ucf wget\n", - "0 upgraded, 59 newly installed, 0 to remove and 0 not upgraded.\n", - "Need to get 23.3 MB of archives.\n", - "After this operation, 88.7 MB of additional disk space will be used.\n", - "Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.14 [1302 kB]\n", - "Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3.6-minimal amd64 3.6.9-1~18.04ubuntu1.6 [534 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libexpat1 amd64 2.2.5-3ubuntu0.2 [80.5 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3.6-minimal amd64 3.6.9-1~18.04ubuntu1.6 [1609 kB]\n", - "Get:5 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-minimal amd64 3.6.7-1~18.04 [23.7 kB]\n", - "Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 mime-support all 3.60ubuntu1 [30.1 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 libmpdec2 amd64 2.4.2-1ubuntu1 [84.1 kB]\n", - "Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 readline-common all 7.0-3 [52.9 kB]\n", - "Get:9 http://archive.ubuntu.com/ubuntu bionic/main amd64 libreadline7 amd64 7.0-3 [124 kB]\n", - "Get:10 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsqlite3-0 amd64 3.22.0-1ubuntu0.4 [499 kB]\n", - "Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3.6-stdlib amd64 3.6.9-1~18.04ubuntu1.6 [1712 kB]\n", - "Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3.6 amd64 3.6.9-1~18.04ubuntu1.6 [203 kB]\n", - "Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3-stdlib amd64 3.6.7-1~18.04 [7240 B]\n", - "Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3 amd64 3.6.7-1~18.04 [47.2 kB]\n", - "Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 multiarch-support amd64 2.27-3ubuntu1.4 [6944 B]\n", - "Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libjpeg-turbo8 amd64 1.5.2-0ubuntu5.18.04.4 [110 kB]\n", - "Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 openssl amd64 1.1.1-1ubuntu2.1~18.04.14 [613 kB]\n", - "Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 ca-certificates all 20210119~18.04.2 [145 kB]\n", - "Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libelf1 amd64 0.170-0.4ubuntu0.1 [44.8 kB]\n", - "Get:20 http://archive.ubuntu.com/ubuntu bionic/main amd64 libmnl0 amd64 1.0.4-2 [12.3 kB]\n", - "Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 iproute2 amd64 4.15.0-2ubuntu1.3 [721 kB]\n", - "Get:22 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libbsd0 amd64 0.8.7-1ubuntu0.1 [41.6 kB]\n", - "Get:23 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libicu60 amd64 60.2-3ubuntu3.2 [8050 kB]\n", - "Get:24 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxml2 amd64 2.9.4+dfsg1-6.1ubuntu1.4 [664 kB]\n", - "Get:25 http://archive.ubuntu.com/ubuntu bionic/main amd64 ucf all 3.0038 [50.5 kB]\n", - "Get:26 http://archive.ubuntu.com/ubuntu bionic/main amd64 libgeoip1 amd64 1.6.12-1 [71.8 kB]\n", - "Get:27 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpng16-16 amd64 1.6.34-1ubuntu0.18.04.2 [176 kB]\n", - "Get:28 http://archive.ubuntu.com/ubuntu bionic/main amd64 libpsl5 amd64 0.19.1-5build1 [41.8 kB]\n", - "Get:29 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxau6 amd64 1:1.0.8-1ubuntu1 [7556 B]\n", - "Get:30 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxdmcp6 amd64 1:1.1.2-3 [10.7 kB]\n", - "Get:31 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxcb1 amd64 1.13-2~ubuntu18.04 [45.5 kB]\n", - "Get:32 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libx11-data all 2:1.6.4-3ubuntu0.4 [114 kB]\n", - "Get:33 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libx11-6 amd64 2:1.6.4-3ubuntu0.4 [572 kB]\n", - "Get:34 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 wget amd64 1.19.4-1ubuntu2.2 [316 kB]\n", - "Get:35 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-dejavu-core all 2.37-1 [1041 kB]\n", - "Get:36 http://archive.ubuntu.com/ubuntu bionic/main amd64 fontconfig-config all 2.12.6-0ubuntu2 [55.8 kB]\n", - "Get:37 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libfreetype6 amd64 2.8.1-2ubuntu2.1 [335 kB]\n", - "Get:38 http://archive.ubuntu.com/ubuntu bionic/main amd64 libfontconfig1 amd64 2.12.6-0ubuntu2 [137 kB]\n", - "Get:39 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjpeg8 amd64 8c-2ubuntu8 [2194 B]\n", - "Get:40 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjbig0 amd64 2.1-3.1build1 [26.7 kB]\n", - "Get:41 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libtiff5 amd64 4.0.9-5ubuntu0.4 [153 kB]\n", - "Get:42 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libwebp6 amd64 0.6.1-2ubuntu0.18.04.1 [186 kB]\n", - "Get:43 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxpm4 amd64 1:3.5.12-1 [34.0 kB]\n", - "Get:44 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgd3 amd64 2.2.5-4ubuntu0.5 [119 kB]\n", - "Get:45 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-common all 1.14.0-0ubuntu1.9 [37.2 kB]\n", - "Get:46 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-geoip amd64 1.14.0-0ubuntu1.9 [11.0 kB]\n", - "Get:47 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-image-filter amd64 1.14.0-0ubuntu1.9 [14.3 kB]\n", - "Get:48 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libxslt1.1 amd64 1.1.29-5ubuntu0.2 [150 kB]\n", - "Get:49 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-http-xslt-filter amd64 1.14.0-0ubuntu1.9 [12.7 kB]\n", - "Get:50 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-mail amd64 1.14.0-0ubuntu1.9 [41.6 kB]\n", - "Get:51 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnginx-mod-stream amd64 1.14.0-0ubuntu1.9 [63.5 kB]\n", - "Get:52 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx-core amd64 1.14.0-0ubuntu1.9 [413 kB]\n", - "Get:53 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 nginx all 1.14.0-0ubuntu1.9 [3596 B]\n", - "Get:54 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 python-pip-whl all 9.0.1-2.3~ubuntu1.18.04.5 [1653 kB]\n", - "Get:55 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-lib2to3 all 3.6.9-1~18.04 [77.4 kB]\n", - "Get:56 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-distutils all 3.6.9-1~18.04 [144 kB]\n", - "Get:57 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 python3-pip all 9.0.1-2.3~ubuntu1.18.04.5 [114 kB]\n", - "Get:58 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-pkg-resources all 39.0.1-2 [98.8 kB]\n", - "Get:59 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-setuptools all 39.0.1-2 [248 kB]\n", - "\u001b[91mdebconf: delaying package configuration, since apt-utils is not installed\n", - "\u001b[0mFetched 23.3 MB in 0s (47.4 MB/s)\n", - "Selecting previously unselected package libssl1.1:amd64.\n", - "(Reading database ... 4051 files and directories currently installed.)\n", - "Preparing to unpack .../libssl1.1_1.1.1-1ubuntu2.1~18.04.14_amd64.deb ...\n", - "Unpacking libssl1.1:amd64 (1.1.1-1ubuntu2.1~18.04.14) ...\n", - "Selecting previously unselected package libpython3.6-minimal:amd64.\n", - "Preparing to unpack .../libpython3.6-minimal_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", - "Unpacking libpython3.6-minimal:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Selecting previously unselected package libexpat1:amd64.\n", - "Preparing to unpack .../libexpat1_2.2.5-3ubuntu0.2_amd64.deb ...\n", - "Unpacking libexpat1:amd64 (2.2.5-3ubuntu0.2) ...\n", - "Selecting previously unselected package python3.6-minimal.\n", - "Preparing to unpack .../python3.6-minimal_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", - "Unpacking python3.6-minimal (3.6.9-1~18.04ubuntu1.6) ...\n", - "Setting up libssl1.1:amd64 (1.1.1-1ubuntu2.1~18.04.14) ...\n", - "debconf: unable to initialize frontend: Dialog\n", - "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", - "debconf: falling back to frontend: Readline\n", - "debconf: unable to initialize frontend: Readline\n", - "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", - "debconf: falling back to frontend: Teletype\n", - "Setting up libpython3.6-minimal:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Setting up libexpat1:amd64 (2.2.5-3ubuntu0.2) ...\n", - "Setting up python3.6-minimal (3.6.9-1~18.04ubuntu1.6) ...\n", - "Selecting previously unselected package python3-minimal.\n", - "(Reading database ... 4308 files and directories currently installed.)\n", - "Preparing to unpack .../0-python3-minimal_3.6.7-1~18.04_amd64.deb ...\n", - "Unpacking python3-minimal (3.6.7-1~18.04) ...\n", - "Selecting previously unselected package mime-support.\n", - "Preparing to unpack .../1-mime-support_3.60ubuntu1_all.deb ...\n", - "Unpacking mime-support (3.60ubuntu1) ...\n", - "Selecting previously unselected package libmpdec2:amd64.\n", - "Preparing to unpack .../2-libmpdec2_2.4.2-1ubuntu1_amd64.deb ...\n", - "Unpacking libmpdec2:amd64 (2.4.2-1ubuntu1) ...\n", - "Selecting previously unselected package readline-common.\n", - "Preparing to unpack .../3-readline-common_7.0-3_all.deb ...\n", - "Unpacking readline-common (7.0-3) ...\n", - "Selecting previously unselected package libreadline7:amd64.\n", - "Preparing to unpack .../4-libreadline7_7.0-3_amd64.deb ...\n", - "Unpacking libreadline7:amd64 (7.0-3) ...\n", - "Selecting previously unselected package libsqlite3-0:amd64.\n", - "Preparing to unpack .../5-libsqlite3-0_3.22.0-1ubuntu0.4_amd64.deb ...\n", - "Unpacking libsqlite3-0:amd64 (3.22.0-1ubuntu0.4) ...\n", - "Selecting previously unselected package libpython3.6-stdlib:amd64.\n", - "Preparing to unpack .../6-libpython3.6-stdlib_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", - "Unpacking libpython3.6-stdlib:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Selecting previously unselected package python3.6.\n", - "Preparing to unpack .../7-python3.6_3.6.9-1~18.04ubuntu1.6_amd64.deb ...\n", - "Unpacking python3.6 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Selecting previously unselected package libpython3-stdlib:amd64.\n", - "Preparing to unpack .../8-libpython3-stdlib_3.6.7-1~18.04_amd64.deb ...\n", - "Unpacking libpython3-stdlib:amd64 (3.6.7-1~18.04) ...\n", - "Setting up python3-minimal (3.6.7-1~18.04) ...\n", - "Selecting previously unselected package python3.\n", - "(Reading database ... 4766 files and directories currently installed.)\n", - "Preparing to unpack .../python3_3.6.7-1~18.04_amd64.deb ...\n", - "Unpacking python3 (3.6.7-1~18.04) ...\n", - "Selecting previously unselected package multiarch-support.\n", - "Preparing to unpack .../multiarch-support_2.27-3ubuntu1.4_amd64.deb ...\n", - "Unpacking multiarch-support (2.27-3ubuntu1.4) ...\n", - "Setting up multiarch-support (2.27-3ubuntu1.4) ...\n", - "Selecting previously unselected package libjpeg-turbo8:amd64.\n", - "(Reading database ... 4803 files and directories currently installed.)\n", - "Preparing to unpack .../00-libjpeg-turbo8_1.5.2-0ubuntu5.18.04.4_amd64.deb ...\n", - "Unpacking libjpeg-turbo8:amd64 (1.5.2-0ubuntu5.18.04.4) ...\n", - "Selecting previously unselected package openssl.\n", - "Preparing to unpack .../01-openssl_1.1.1-1ubuntu2.1~18.04.14_amd64.deb ...\n", - "Unpacking openssl (1.1.1-1ubuntu2.1~18.04.14) ...\n", - "Selecting previously unselected package ca-certificates.\n", - "Preparing to unpack .../02-ca-certificates_20210119~18.04.2_all.deb ...\n", - "Unpacking ca-certificates (20210119~18.04.2) ...\n", - "Selecting previously unselected package libelf1:amd64.\n", - "Preparing to unpack .../03-libelf1_0.170-0.4ubuntu0.1_amd64.deb ...\n", - "Unpacking libelf1:amd64 (0.170-0.4ubuntu0.1) ...\n", - "Selecting previously unselected package libmnl0:amd64.\n", - "Preparing to unpack .../04-libmnl0_1.0.4-2_amd64.deb ...\n", - "Unpacking libmnl0:amd64 (1.0.4-2) ...\n", - "Selecting previously unselected package iproute2.\n", - "Preparing to unpack .../05-iproute2_4.15.0-2ubuntu1.3_amd64.deb ...\n", - "Unpacking iproute2 (4.15.0-2ubuntu1.3) ...\n", - "Selecting previously unselected package libbsd0:amd64.\n", - "Preparing to unpack .../06-libbsd0_0.8.7-1ubuntu0.1_amd64.deb ...\n", - "Unpacking libbsd0:amd64 (0.8.7-1ubuntu0.1) ...\n", - "Selecting previously unselected package libicu60:amd64.\n", - "Preparing to unpack .../07-libicu60_60.2-3ubuntu3.2_amd64.deb ...\n", - "Unpacking libicu60:amd64 (60.2-3ubuntu3.2) ...\n", - "Selecting previously unselected package libxml2:amd64.\n", - "Preparing to unpack .../08-libxml2_2.9.4+dfsg1-6.1ubuntu1.4_amd64.deb ...\n", - "Unpacking libxml2:amd64 (2.9.4+dfsg1-6.1ubuntu1.4) ...\n", - "Selecting previously unselected package ucf.\n", - "Preparing to unpack .../09-ucf_3.0038_all.deb ...\n", - "Moving old data out of the way\n", - "Unpacking ucf (3.0038) ...\n", - "Selecting previously unselected package libgeoip1:amd64.\n", - "Preparing to unpack .../10-libgeoip1_1.6.12-1_amd64.deb ...\n", - "Unpacking libgeoip1:amd64 (1.6.12-1) ...\n", - "Selecting previously unselected package libpng16-16:amd64.\n", - "Preparing to unpack .../11-libpng16-16_1.6.34-1ubuntu0.18.04.2_amd64.deb ...\n", - "Unpacking libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n", - "Selecting previously unselected package libpsl5:amd64.\n", - "Preparing to unpack .../12-libpsl5_0.19.1-5build1_amd64.deb ...\n", - "Unpacking libpsl5:amd64 (0.19.1-5build1) ...\n", - "Selecting previously unselected package libxau6:amd64.\n", - "Preparing to unpack .../13-libxau6_1%3a1.0.8-1ubuntu1_amd64.deb ...\n", - "Unpacking libxau6:amd64 (1:1.0.8-1ubuntu1) ...\n", - "Selecting previously unselected package libxdmcp6:amd64.\n", - "Preparing to unpack .../14-libxdmcp6_1%3a1.1.2-3_amd64.deb ...\n", - "Unpacking libxdmcp6:amd64 (1:1.1.2-3) ...\n", - "Selecting previously unselected package libxcb1:amd64.\n", - "Preparing to unpack .../15-libxcb1_1.13-2~ubuntu18.04_amd64.deb ...\n", - "Unpacking libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n", - "Selecting previously unselected package libx11-data.\n", - "Preparing to unpack .../16-libx11-data_2%3a1.6.4-3ubuntu0.4_all.deb ...\n", - "Unpacking libx11-data (2:1.6.4-3ubuntu0.4) ...\n", - "Selecting previously unselected package libx11-6:amd64.\n", - "Preparing to unpack .../17-libx11-6_2%3a1.6.4-3ubuntu0.4_amd64.deb ...\n", - "Unpacking libx11-6:amd64 (2:1.6.4-3ubuntu0.4) ...\n", - "Selecting previously unselected package wget.\n", - "Preparing to unpack .../18-wget_1.19.4-1ubuntu2.2_amd64.deb ...\n", - "Unpacking wget (1.19.4-1ubuntu2.2) ...\n", - "Selecting previously unselected package fonts-dejavu-core.\n", - "Preparing to unpack .../19-fonts-dejavu-core_2.37-1_all.deb ...\n", - "Unpacking fonts-dejavu-core (2.37-1) ...\n", - "Selecting previously unselected package fontconfig-config.\n", - "Preparing to unpack .../20-fontconfig-config_2.12.6-0ubuntu2_all.deb ...\n", - "Unpacking fontconfig-config (2.12.6-0ubuntu2) ...\n", - "Selecting previously unselected package libfreetype6:amd64.\n", - "Preparing to unpack .../21-libfreetype6_2.8.1-2ubuntu2.1_amd64.deb ...\n", - "Unpacking libfreetype6:amd64 (2.8.1-2ubuntu2.1) ...\n", - "Selecting previously unselected package libfontconfig1:amd64.\n", - "Preparing to unpack .../22-libfontconfig1_2.12.6-0ubuntu2_amd64.deb ...\n", - "Unpacking libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n", - "Selecting previously unselected package libjpeg8:amd64.\n", - "Preparing to unpack .../23-libjpeg8_8c-2ubuntu8_amd64.deb ...\n", - "Unpacking libjpeg8:amd64 (8c-2ubuntu8) ...\n", - "Selecting previously unselected package libjbig0:amd64.\n", - "Preparing to unpack .../24-libjbig0_2.1-3.1build1_amd64.deb ...\n", - "Unpacking libjbig0:amd64 (2.1-3.1build1) ...\n", - "Selecting previously unselected package libtiff5:amd64.\n", - "Preparing to unpack .../25-libtiff5_4.0.9-5ubuntu0.4_amd64.deb ...\n", - "Unpacking libtiff5:amd64 (4.0.9-5ubuntu0.4) ...\n", - "Selecting previously unselected package libwebp6:amd64.\n", - "Preparing to unpack .../26-libwebp6_0.6.1-2ubuntu0.18.04.1_amd64.deb ...\n", - "Unpacking libwebp6:amd64 (0.6.1-2ubuntu0.18.04.1) ...\n", - "Selecting previously unselected package libxpm4:amd64.\n", - "Preparing to unpack .../27-libxpm4_1%3a3.5.12-1_amd64.deb ...\n", - "Unpacking libxpm4:amd64 (1:3.5.12-1) ...\n", - "Selecting previously unselected package libgd3:amd64.\n", - "Preparing to unpack .../28-libgd3_2.2.5-4ubuntu0.5_amd64.deb ...\n", - "Unpacking libgd3:amd64 (2.2.5-4ubuntu0.5) ...\n", - "Selecting previously unselected package nginx-common.\n", - "Preparing to unpack .../29-nginx-common_1.14.0-0ubuntu1.9_all.deb ...\n", - "Unpacking nginx-common (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package libnginx-mod-http-geoip.\n", - "Preparing to unpack .../30-libnginx-mod-http-geoip_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking libnginx-mod-http-geoip (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package libnginx-mod-http-image-filter.\n", - "Preparing to unpack .../31-libnginx-mod-http-image-filter_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking libnginx-mod-http-image-filter (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package libxslt1.1:amd64.\n", - "Preparing to unpack .../32-libxslt1.1_1.1.29-5ubuntu0.2_amd64.deb ...\n", - "Unpacking libxslt1.1:amd64 (1.1.29-5ubuntu0.2) ...\n", - "Selecting previously unselected package libnginx-mod-http-xslt-filter.\n", - "Preparing to unpack .../33-libnginx-mod-http-xslt-filter_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking libnginx-mod-http-xslt-filter (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package libnginx-mod-mail.\n", - "Preparing to unpack .../34-libnginx-mod-mail_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking libnginx-mod-mail (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package libnginx-mod-stream.\n", - "Preparing to unpack .../35-libnginx-mod-stream_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking libnginx-mod-stream (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package nginx-core.\n", - "Preparing to unpack .../36-nginx-core_1.14.0-0ubuntu1.9_amd64.deb ...\n", - "Unpacking nginx-core (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package nginx.\n", - "Preparing to unpack .../37-nginx_1.14.0-0ubuntu1.9_all.deb ...\n", - "Unpacking nginx (1.14.0-0ubuntu1.9) ...\n", - "Selecting previously unselected package python-pip-whl.\n", - "Preparing to unpack .../38-python-pip-whl_9.0.1-2.3~ubuntu1.18.04.5_all.deb ...\n", - "Unpacking python-pip-whl (9.0.1-2.3~ubuntu1.18.04.5) ...\n", - "Selecting previously unselected package python3-lib2to3.\n", - "Preparing to unpack .../39-python3-lib2to3_3.6.9-1~18.04_all.deb ...\n", - "Unpacking python3-lib2to3 (3.6.9-1~18.04) ...\n", - "Selecting previously unselected package python3-distutils.\n", - "Preparing to unpack .../40-python3-distutils_3.6.9-1~18.04_all.deb ...\n", - "Unpacking python3-distutils (3.6.9-1~18.04) ...\n", - "Selecting previously unselected package python3-pip.\n", - "Preparing to unpack .../41-python3-pip_9.0.1-2.3~ubuntu1.18.04.5_all.deb ...\n", - "Unpacking python3-pip (9.0.1-2.3~ubuntu1.18.04.5) ...\n", - "Selecting previously unselected package python3-pkg-resources.\n", - "Preparing to unpack .../42-python3-pkg-resources_39.0.1-2_all.deb ...\n", - "Unpacking python3-pkg-resources (39.0.1-2) ...\n", - "Selecting previously unselected package python3-setuptools.\n", - "Preparing to unpack .../43-python3-setuptools_39.0.1-2_all.deb ...\n", - "Unpacking python3-setuptools (39.0.1-2) ...\n", - "Setting up readline-common (7.0-3) ...\n", - "Setting up libicu60:amd64 (60.2-3ubuntu3.2) ...\n", - "Setting up mime-support (3.60ubuntu1) ...\n", - "Setting up libpng16-16:amd64 (1.6.34-1ubuntu0.18.04.2) ...\n", - "Setting up libjbig0:amd64 (2.1-3.1build1) ...\n", - "Setting up fonts-dejavu-core (2.37-1) ...\n", - "Setting up libreadline7:amd64 (7.0-3) ...\n", - "Setting up libpsl5:amd64 (0.19.1-5build1) ...\n", - "Setting up libelf1:amd64 (0.170-0.4ubuntu0.1) ...\n", - "Setting up nginx-common (1.14.0-0ubuntu1.9) ...\n", - "debconf: unable to initialize frontend: Dialog\n", - "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", - "debconf: falling back to frontend: Readline\n", - "debconf: unable to initialize frontend: Readline\n", - "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", - "debconf: falling back to frontend: Teletype\n", - "Setting up libjpeg-turbo8:amd64 (1.5.2-0ubuntu5.18.04.4) ...\n", - "Setting up libgeoip1:amd64 (1.6.12-1) ...\n", - "Setting up libbsd0:amd64 (0.8.7-1ubuntu0.1) ...\n", - "Setting up ucf (3.0038) ...\n", - "debconf: unable to initialize frontend: Dialog\n", - "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", - "debconf: falling back to frontend: Readline\n", - "debconf: unable to initialize frontend: Readline\n", - "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", - "debconf: falling back to frontend: Teletype\n", - "Setting up libxml2:amd64 (2.9.4+dfsg1-6.1ubuntu1.4) ...\n", - "Setting up libfreetype6:amd64 (2.8.1-2ubuntu2.1) ...\n", - "Setting up libxslt1.1:amd64 (1.1.29-5ubuntu0.2) ...\n", - "Setting up openssl (1.1.1-1ubuntu2.1~18.04.14) ...\n", - "Setting up wget (1.19.4-1ubuntu2.2) ...\n", - "Setting up libsqlite3-0:amd64 (3.22.0-1ubuntu0.4) ...\n", - "Setting up libnginx-mod-mail (1.14.0-0ubuntu1.9) ...\n", - "Setting up libnginx-mod-http-xslt-filter (1.14.0-0ubuntu1.9) ...\n", - "Setting up libxdmcp6:amd64 (1:1.1.2-3) ...\n", - "Setting up ca-certificates (20210119~18.04.2) ...\n", - "debconf: unable to initialize frontend: Dialog\n", - "debconf: (TERM is not set, so the dialog frontend is not usable.)\n", - "debconf: falling back to frontend: Readline\n", - "debconf: unable to initialize frontend: Readline\n", - "debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)\n", - "debconf: falling back to frontend: Teletype\n", - "Updating certificates in /etc/ssl/certs...\n", - "128 added, 0 removed; done.\n", - "Setting up libmnl0:amd64 (1.0.4-2) ...\n", - "Setting up libnginx-mod-http-geoip (1.14.0-0ubuntu1.9) ...\n", - "Setting up libx11-data (2:1.6.4-3ubuntu0.4) ...\n", - "Setting up libxau6:amd64 (1:1.0.8-1ubuntu1) ...\n", - "Setting up libmpdec2:amd64 (2.4.2-1ubuntu1) ...\n", - "Setting up libwebp6:amd64 (0.6.1-2ubuntu0.18.04.1) ...\n", - "Setting up libjpeg8:amd64 (8c-2ubuntu8) ...\n", - "Setting up python-pip-whl (9.0.1-2.3~ubuntu1.18.04.5) ...\n", - "Setting up libpython3.6-stdlib:amd64 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Setting up fontconfig-config (2.12.6-0ubuntu2) ...\n", - "Setting up python3.6 (3.6.9-1~18.04ubuntu1.6) ...\n", - "Setting up libnginx-mod-stream (1.14.0-0ubuntu1.9) ...\n", - "Setting up libtiff5:amd64 (4.0.9-5ubuntu0.4) ...\n", - "Setting up iproute2 (4.15.0-2ubuntu1.3) ...\n", - "Setting up libxcb1:amd64 (1.13-2~ubuntu18.04) ...\n", - "Setting up libpython3-stdlib:amd64 (3.6.7-1~18.04) ...\n", - "Setting up libfontconfig1:amd64 (2.12.6-0ubuntu2) ...\n", - "Setting up python3 (3.6.7-1~18.04) ...\n", - "running python rtupdate hooks for python3.6...\n", - "running python post-rtupdate hooks for python3.6...\n", - "Setting up libx11-6:amd64 (2:1.6.4-3ubuntu0.4) ...\n", - "Setting up python3-pkg-resources (39.0.1-2) ...\n", - "Setting up libxpm4:amd64 (1:3.5.12-1) ...\n", - "Setting up python3-lib2to3 (3.6.9-1~18.04) ...\n", - "Setting up python3-distutils (3.6.9-1~18.04) ...\n", - "Setting up libgd3:amd64 (2.2.5-4ubuntu0.5) ...\n", - "Setting up python3-pip (9.0.1-2.3~ubuntu1.18.04.5) ...\n", - "Setting up python3-setuptools (39.0.1-2) ...\n", - "Setting up libnginx-mod-http-image-filter (1.14.0-0ubuntu1.9) ...\n", - "Setting up nginx-core (1.14.0-0ubuntu1.9) ...\n", - "invoke-rc.d: could not determine current runlevel\n", - "invoke-rc.d: policy-rc.d denied execution of start.\n", - "Setting up nginx (1.14.0-0ubuntu1.9) ...\n", - "Processing triggers for libc-bin (2.27-3ubuntu1.4) ...\n", - "Processing triggers for ca-certificates (20210119~18.04.2) ...\n", - "Updating certificates in /etc/ssl/certs...\n", - "0 added, 0 removed; done.\n", - "Running hooks in /etc/ca-certificates/update.d...\n", - "done.\n", - "Removing intermediate container a090988a9802\n", - " ---> a7192dfdaf3b\n", - "Step 4/11 : RUN ln -s /usr/bin/python3 /usr/bin/python\n", - " ---> Running in 25e4f0e88ba2\n", - "Removing intermediate container 25e4f0e88ba2\n", - " ---> 4cea2db68da7\n", - "Step 5/11 : RUN ln -s /usr/bin/pip3 /usr/bin/pip\n", - " ---> Running in 064542e0b716\n", - "Removing intermediate container 064542e0b716\n", - " ---> 07b09e94c060\n", - "Step 6/11 : RUN pip --no-cache-dir install numpy==1.16.2 scipy==1.2.1 scikit-learn==0.20.2 pandas flask gunicorn\n", - " ---> Running in 44ef081a1c09\n", - "Collecting numpy==1.16.2\n", - " Downloading https://files.pythonhosted.org/packages/35/d5/4f8410ac303e690144f0a0603c4b8fd3b986feb2749c435f7cdbb288f17e/numpy-1.16.2-cp36-cp36m-manylinux1_x86_64.whl (17.3MB)\n", - "Collecting scipy==1.2.1\n", - " Downloading https://files.pythonhosted.org/packages/7f/5f/c48860704092933bf1c4c1574a8de1ffd16bf4fde8bab190d747598844b2/scipy-1.2.1-cp36-cp36m-manylinux1_x86_64.whl (24.8MB)\n", - "Collecting scikit-learn==0.20.2\n", - " Downloading https://files.pythonhosted.org/packages/0d/3a/b92670f5c368c20329ecc4c255993fae7934564d485c3ed7ea7b8da7f741/scikit_learn-0.20.2-cp36-cp36m-manylinux1_x86_64.whl (5.4MB)\n", - "Collecting pandas\n", - " Downloading https://files.pythonhosted.org/packages/c3/e2/00cacecafbab071c787019f00ad84ca3185952f6bb9bca9550ed83870d4d/pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5MB)\n", - "Collecting flask\n", - " Downloading https://files.pythonhosted.org/packages/cd/77/59df23681f4fd19b7cbbb5e92484d46ad587554f5d490f33ef907e456132/Flask-2.0.3-py3-none-any.whl (95kB)\n", - "Collecting gunicorn\n", - " Downloading https://files.pythonhosted.org/packages/e4/dd/5b190393e6066286773a67dfcc2f9492058e9b57c4867a95f1ba5caf0a83/gunicorn-20.1.0-py3-none-any.whl (79kB)\n", - "Collecting python-dateutil>=2.7.3 (from pandas)\n", - " Downloading https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl (247kB)\n", - "Collecting pytz>=2017.2 (from pandas)\n", - " Downloading https://files.pythonhosted.org/packages/d3/e3/d9f046b5d1c94a3aeab15f1f867aa414f8ee9d196fae6865f1d6a0ee1a0b/pytz-2021.3-py2.py3-none-any.whl (503kB)\n", - "Collecting click>=7.1.2 (from flask)\n", - " Downloading https://files.pythonhosted.org/packages/48/58/c8aa6a8e62cc75f39fee1092c45d6b6ba684122697d7ce7d53f64f98a129/click-8.0.3-py3-none-any.whl (97kB)\n", - "Collecting itsdangerous>=2.0 (from flask)\n", - " Downloading https://files.pythonhosted.org/packages/9c/96/26f935afba9cd6140216da5add223a0c465b99d0f112b68a4ca426441019/itsdangerous-2.0.1-py3-none-any.whl\n", - "Collecting Werkzeug>=2.0 (from flask)\n", - " Downloading https://files.pythonhosted.org/packages/f4/f3/22afbdb20cc4654b10c98043414a14057cd27fdba9d4ae61cea596000ba2/Werkzeug-2.0.3-py3-none-any.whl (289kB)\n", - "Collecting Jinja2>=3.0 (from flask)\n", - " Downloading https://files.pythonhosted.org/packages/20/9a/e5d9ec41927401e41aea8af6d16e78b5e612bca4699d417f646a9610a076/Jinja2-3.0.3-py3-none-any.whl (133kB)\n", - "Requirement already satisfied: setuptools>=3.0 in /usr/lib/python3/dist-packages (from gunicorn)\n", - "Collecting six>=1.5 (from python-dateutil>=2.7.3->pandas)\n", - " Downloading https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl\n", - "Collecting importlib-metadata; python_version < \"3.8\" (from click>=7.1.2->flask)\n", - " Downloading https://files.pythonhosted.org/packages/a0/a1/b153a0a4caf7a7e3f15c2cd56c7702e2cf3d89b1b359d1f1c5e59d68f4ce/importlib_metadata-4.8.3-py3-none-any.whl\n", - "Collecting dataclasses; python_version < \"3.7\" (from Werkzeug>=2.0->flask)\n", - " Downloading https://files.pythonhosted.org/packages/fe/ca/75fac5856ab5cfa51bbbcefa250182e50441074fdc3f803f6e76451fab43/dataclasses-0.8-py3-none-any.whl\n", - "Collecting MarkupSafe>=2.0 (from Jinja2>=3.0->flask)\n", - " Downloading https://files.pythonhosted.org/packages/fc/d6/57f9a97e56447a1e340f8574836d3b636e2c14de304943836bd645fa9c7e/MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl\n", - "Collecting zipp>=0.5 (from importlib-metadata; python_version < \"3.8\"->click>=7.1.2->flask)\n", - " Downloading https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl\n", - "Collecting typing-extensions>=3.6.4; python_version < \"3.8\" (from importlib-metadata; python_version < \"3.8\"->click>=7.1.2->flask)\n", - " Downloading https://files.pythonhosted.org/packages/45/6b/44f7f8f1e110027cf88956b59f2fad776cca7e1704396d043f89effd3a0e/typing_extensions-4.1.1-py3-none-any.whl\n", - "Installing collected packages: numpy, scipy, scikit-learn, six, python-dateutil, pytz, pandas, zipp, typing-extensions, importlib-metadata, click, itsdangerous, dataclasses, Werkzeug, MarkupSafe, Jinja2, flask, gunicorn\n", - "Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.3 click-8.0.3 dataclasses-0.8 flask-2.0.3 gunicorn-20.1.0 importlib-metadata-4.8.3 itsdangerous-2.0.1 numpy-1.16.2 pandas-1.1.5 python-dateutil-2.8.2 pytz-2021.3 scikit-learn-0.20.2 scipy-1.2.1 six-1.16.0 typing-extensions-4.1.1 zipp-3.6.0\n", - "Removing intermediate container 44ef081a1c09\n", - " ---> dcc26fd3b056\n", - "Step 7/11 : ENV PYTHONUNBUFFERED=TRUE\n", - " ---> Running in a27fc63c3198\n", - "Removing intermediate container a27fc63c3198\n", - " ---> 1841d430f0bd\n", - "Step 8/11 : ENV PYTHONDONTWRITEBYTECODE=TRUE\n", - " ---> Running in 0ce0828a1366\n", - "Removing intermediate container 0ce0828a1366\n", - " ---> 532fdb4f7f52\n", - "Step 9/11 : ENV PATH=\"/opt/program:${PATH}\"\n", - " ---> Running in 3b2f98bb98d6\n", - "Removing intermediate container 3b2f98bb98d6\n", - " ---> 4095f4b26cbf\n", - "Step 10/11 : COPY decision_trees /opt/program\n", - " ---> 9c82acedfe89\n", - "Step 11/11 : WORKDIR /opt/program\n", - " ---> Running in b0943ee7e5d0\n", - "Removing intermediate container b0943ee7e5d0\n", - " ---> 91fe39d736a5\n", - "Successfully built 91fe39d736a5\n", - "Successfully tagged sagemaker-decision-trees:latest\n", - "\n", - "[Container] 2022/02/15 01:47:04 Running command docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG\n", - "\n", - "[Container] 2022/02/15 01:47:04 Phase complete: BUILD State: SUCCEEDED\n", - "[Container] 2022/02/15 01:47:04 Phase context status code: Message:\n", - "[Container] 2022/02/15 01:47:04 Entering phase POST_BUILD\n", - "[Container] 2022/02/15 01:47:04 Running command echo Build completed on `date`\n", - "Build completed on Tue Feb 15 01:47:04 UTC 2022\n", - "\n", - "[Container] 2022/02/15 01:47:04 Running command echo Pushing the Docker image...\n", - "Pushing the Docker image...\n", - "\n", - "[Container] 2022/02/15 01:47:04 Running command docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG\n", - "The push refers to repository [240487350066.dkr.ecr.us-east-1.amazonaws.com/sagemaker-decision-trees]\n", - "49672cebbb4f: Preparing\n", - "fe9b0cc9d771: Preparing\n", - "73ecb653edc2: Preparing\n", - "99b7ec0bc589: Preparing\n", - "6fc0a72852b3: Preparing\n", - "1dc52a6b4de8: Preparing\n", - "1dc52a6b4de8: Waiting\n", - "49672cebbb4f: Pushed\n", - "99b7ec0bc589: Pushed\n", - "73ecb653edc2: Pushed\n", - "6fc0a72852b3: Pushed\n", - "1dc52a6b4de8: Pushed\n", - "fe9b0cc9d771: Pushed\n", - "latest: digest: sha256:adc5e78414c2b2257974df50a4fd87386e8530fb5fce6484ea5be2e5f5674ce3 size: 1575\n", - "\n", - "[Container] 2022/02/15 01:47:18 Phase complete: POST_BUILD State: SUCCEEDED\n", - "[Container] 2022/02/15 01:47:18 Phase context status code: Message:\n", - "\n", - "Image URI: 240487350066.dkr.ecr.us-east-1.amazonaws.com/sagemaker-decision-trees:latest\n" - ] - } - ], + "outputs": [], "source": [ "%%sh\n", "# cell 02\n", @@ -921,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -950,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -980,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1024,28 +335,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2022-02-15 02:11:50 Starting - Starting the training job...\n", - "2022-02-15 02:12:14 Starting - Launching requested ML instancesProfilerReport-1644891110: InProgress\n", - "......\n", - "2022-02-15 02:13:20 Starting - Preparing the instances for training......\n", - "2022-02-15 02:14:15 Downloading - Downloading input data...\n", - "2022-02-15 02:14:50 Training - Training image download completed. Training in progress..\u001b[34mStarting the training.\u001b[0m\n", - "\u001b[34mTraining complete.\u001b[0m\n", - "\n", - "2022-02-15 02:15:15 Uploading - Uploading generated training model\n", - "2022-02-15 02:15:15 Completed - Training job completed\n", - "Training seconds: 55\n", - "Billable seconds: 55\n" - ] - } - ], + "outputs": [], "source": [ "# cell 06\n", "\n", @@ -1081,17 +373,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------!" - ] - } - ], + "outputs": [], "source": [ "# cell 07\n", "\n", @@ -1118,78 +402,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
01234
109virginica7.23.66.12.5
74versicolor6.42.94.31.3
122virginica7.72.86.72.0
\n", - "
" - ], - "text/plain": [ - " 0 1 2 3 4\n", - "109 virginica 7.2 3.6 6.1 2.5\n", - "74 versicolor 6.4 2.9 4.3 1.3\n", - "122 virginica 7.7 2.8 6.7 2.0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# cell 08\n", "\n", @@ -1199,74 +414,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - "
1234
1215.62.84.92.0
1436.83.25.92.3
526.93.14.91.5
\n", - "
" - ], - "text/plain": [ - " 1 2 3 4\n", - "121 5.6 2.8 4.9 2.0\n", - "143 6.8 3.2 5.9 2.3\n", - "52 6.9 3.1 4.9 1.5" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# cell 09\n", "\n", @@ -1277,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1303,46 +453,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "setosa\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "versicolor\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "virginica\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# cell 11\n", "\n", @@ -1359,7 +472,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1376,7 +489,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1395,9 +508,9 @@ "metadata": { "instance_type": "ml.t3.medium", "kernelspec": { - "display_name": "Python 3 (Data Science)", + "display_name": "Python 3", "language": "python", - "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1409,7 +522,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/bring-custom-script.ipynb b/bring-custom-script.ipynb index 5513225..0da6282 100644 --- a/bring-custom-script.ipynb +++ b/bring-custom-script.ipynb @@ -334,9 +334,9 @@ "metadata": { "instance_type": "ml.m5.large", "kernelspec": { - "display_name": "Python 3 (Data Science)", + "display_name": "Python 3", "language": "python", - "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -348,7 +348,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.8.3" } }, "nbformat": 4, From 0b0c138ed1fe29b94626e6e7872136f030721f7c Mon Sep 17 00:00:00 2001 From: chrislitianxin Date: Tue, 22 Feb 2022 01:11:42 -0500 Subject: [PATCH 8/8] :wrench: changed to G4dn instances for training and added explaination for G4dn and spot instances --- bring-custom-script.ipynb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/bring-custom-script.ipynb b/bring-custom-script.ipynb index 0da6282..6c50ce8 100644 --- a/bring-custom-script.ipynb +++ b/bring-custom-script.ipynb @@ -102,7 +102,11 @@ "\n", "`py_version` is set to `'py3'` to indicate that we are using script mode since legacy mode supports only Python 2. Though Python 2 will be deprecated soon, you can use script mode with Python 2 by setting py_version to `py2` and `script_mode` to True.\n", "\n", - "`distribution` is used to configure the distributed training setup. It's required only if you are doing distributed training either across a cluster of instances or across multiple GPUs. Here we are using parameter servers as the distributed training schema. SageMaker training jobs run on homogeneous clusters. To make parameter server more performant in the SageMaker setup, we run a parameter server on every instance in the cluster, so there is no need to specify the number of parameter servers to launch. Script mode also supports distributed training with [Horovod](https://github.com/horovod/horovod). You can find the full documentation on how to configure distributions [here](https://github.com/aws/sagemaker-python-sdk/tree/master/src/sagemaker/tensorflow#distributed-training)." + "`distribution` is used to configure the distributed training setup. It's required only if you are doing distributed training either across a cluster of instances or across multiple GPUs. Here we are using parameter servers as the distributed training schema. SageMaker training jobs run on homogeneous clusters. To make parameter server more performant in the SageMaker setup, we run a parameter server on every instance in the cluster, so there is no need to specify the number of parameter servers to launch. Script mode also supports distributed training with [Horovod](https://github.com/horovod/horovod). You can find the full documentation on how to configure distributions [here](https://github.com/aws/sagemaker-python-sdk/tree/master/src/sagemaker/tensorflow#distributed-training).\n", + "\n", + "`instance_type` specify the EC2 instance used for training. You should right-size your training instance based on the size of your data, algorithm and tasks. Here we choose [G4dn](https://aws.amazon.com/ec2/instance-types/g4/) instances, which feature NVIDIA T4 GPUs and custom Intel Cascade Lake CPUs, and are optimized for machine learning inference and small scale training. [Read more](https://aws.amazon.com/sagemaker/pricing/) on available instance types and pricing. \n", + "\n", + "`use_spot_instances`(Optional): For further cost optimization, you can leverage [managed Amazon EC2 Spot instances](https://docs.aws.amazon.com/sagemaker/latest/dg/model-managed-spot-training.html) by setting this parameter to `True`. Managed spot training can optimize the cost of training models up to 90% over on-demand instances. SageMaker manages the Spot interruptions on your behalf. You can specify which training jobs use spot instances and a stopping condition that specifies how long Amazon SageMaker waits for a job to run using Amazon EC2 Spot instances. Full documentation [here](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-python-sdk/managed_spot_training_tensorflow_estimator/managed_spot_training_tensorflow_estimator.html). " ] }, { @@ -118,7 +122,7 @@ "mnist_estimator = TensorFlow(entry_point='mnist.py',\n", " role=role,\n", " instance_count=2,\n", - " instance_type='ml.p3.2xlarge',\n", + " instance_type='ml.g4dn.xlarge',\n", " framework_version='1.15.2',\n", " py_version='py3',\n", " distribution={'parameter_server': {'enabled': True}})" @@ -141,7 +145,7 @@ "mnist_estimator2 = TensorFlow(entry_point='mnist-2.py',\n", " role=role,\n", " instance_count=2,\n", - " instance_type='ml.p3.2xlarge',\n", + " instance_type='ml.g4dn.xlarge',\n", " framework_version='2.1.0',\n", " py_version='py3',\n", " distribution={'parameter_server': {'enabled': True}})" @@ -334,7 +338,7 @@ "metadata": { "instance_type": "ml.m5.large", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -348,7 +352,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.3" + "version": "3.10.1" } }, "nbformat": 4,