<jupyter_start><jupyter_text>Distirbuted Training of Mask-RCNN in Amazon SageMaker using S3This notebook is a step-by-step tutorial on distributed tranining of [Mask R-CNN](https://arxiv.org/abs/1703.06870) implemented in [TensorFlow](https://www.tensorflow.org/) framework. Mask R-CNN is also referred to as heavy weight object detection model and it is part of [MLPerf](https://www.mlperf.org/training-results-0-6/).Concretely, we will describe the steps for training [TensorPack Faster-RCNN/Mask-RCNN](https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN) and [AWS Samples Mask R-CNN](https://github.com/aws-samples/mask-rcnn-tensorflow) in [Amazon SageMaker](https://aws.amazon.com/sagemaker/) using [Amazon S3](https://aws.amazon.com/s3/) as data source.The outline of steps is as follows:1. Stage COCO 2017 dataset in [Amazon S3](https://aws.amazon.com/s3/)2. Build SageMaker training image and push it to [Amazon ECR](https://aws.amazon.com/ecr/)3. Configure data input channels4. Configure hyper-prarameters5. Define training metrics6. Define training job and start trainingBefore we get started, let us initialize two python variables ```aws_region``` and ```s3_bucket``` that we will use throughout the notebook:<jupyter_code>aws_region =  "ap-southeast-1"
s3_bucket  =  "smart-invoice"<jupyter_output><empty_output><jupyter_text>Stage COCO 2017 dataset in Amazon S3We use [COCO 2017 dataset](http://cocodataset.org/home) for training. We download COCO 2017 training and validation dataset to this notebook instance, extract the files from the dataset archives, and upload the extracted files to your Amazon [S3 bucket](https://docs.aws.amazon.com/en_pv/AmazonS3/latest/gsg/CreatingABucket.html) with the prefix ```mask-rcnn/sagemaker/input/train```. The ```prepare-s3-bucket.sh``` script executes this step.<jupyter_code>!cat ./prepare-s3-bucket.sh<jupyter_output>#!/bin/bash

set -e

if [ "$#" -ne 1 ]; then
    echo "usage: $0 <s3-bucket-name>"
    exit 1
fi

S3_BUCKET=$1
S3_PREFIX="mask-rcnn/sagemaker/input"

# Stage directory must be on EBS volume with 100 GB available space
STAGE_DIR=$HOME/SageMaker/coco-2017-$(date +"%Y-%m-%d-%H-%M-%S")

echo "Create stage directory: $STAGE_DIR"
mkdir -p $STAGE_DIR

wget -O $STAGE_DIR/train2017.zip http://images.cocodataset.org/zips/train2017.zip
echo "Extracting $STAGE_DIR/train2017.zip"
unzip -o $STAGE_DIR/train2017.zip  -d $STAGE_DIR | awk 'BEGIN {ORS="="} {if(NR%1000==0)print "="}'
echo "Done."
rm $STAGE_DIR/train2017.zip

wget -O $STAGE_DIR/val2017.zip http://images.cocodataset.org/zips/val2017.zip
echo "Extracting $STAGE_DIR/val2017.zip"
unzip -o $STAGE_DIR/val2017.zip -d $STAGE_DIR | awk 'BEGIN {ORS="="} {if(NR%1000==0)print "="}'
echo "Done."
rm $STAGE_DIR/val2017.zip

wget -O $STAGE_DIR/annotations_trainval2017.zip http://images.cocodataset.org/annotations/annotations_[...]<jupyter_text>Using your *Amazon S3 bucket* as argument, run the cell below. If you have already uploaded COCO 2017 dataset to your Amazon S3 bucket *in this AWS region*, you may skip this step. The expected time to execute this step is 20 minutes.<jupyter_code>%%time
!./prepare-s3-bucket.sh {s3_bucket}<jupyter_output>Create stage directory: /home/ec2-user/SageMaker/coco-2017-2020-04-02-07-16-41
--2020-04-02 07:16:41--  http://images.cocodataset.org/zips/train2017.zip
Resolving images.cocodataset.org (images.cocodataset.org)... 172.16.58.3
Connecting to images.cocodataset.org (images.cocodataset.org)|172.16.58.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19336861798 (18G) [application/zip]
Saving to: ‘/home/ec2-user/SageMaker/coco-2017-2020-04-02-07-16-41/train2017.zip’

Maker/coco-2017-202  20%[===>                ]   3.74G  6.90MB/s    eta 36m 30s<jupyter_text>Build and push SageMaker training imagesFor this step, the [IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) attached to this notebook instance needs full access to Amazon ECR service. If you created this notebook instance using the ```./stack-sm.sh``` script in this repository, the IAM Role attached to this notebook instance is already setup with full access to ECR service. Below, we have a choice of two different implementations:1. [TensorPack Faster-RCNN/Mask-RCNN](https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN) implementation supports a maximum per-GPU batch size of 1, and does not support mixed precision. It can be used with mainstream TensorFlow releases.2. [AWS Samples Mask R-CNN](https://github.com/aws-samples/mask-rcnn-tensorflow) is an optimized implementation that supports a maximum batch size of 4 and supports mixed precision. This implementation uses TensorFlow base version 1.13 augmented with custom TensorFlow ops. It is recommended that you build and push both SageMaker training images and use either image for training later.  TensorPack Faster-RCNN/Mask-RCNNUse ```./container/build_tools/build_and_push.sh``` script to build and push the TensorPack Faster-RCNN/Mask-RCNN  training image to Amazon ECR.<jupyter_code>!cat ./container/build_tools/build_and_push.sh<jupyter_output>#!/usr/bin/env bash

# This script shows how to build the Docker image and push it to ECR to be ready for use
# by SageMaker.

# The argument to this script is the image name. This will be used as the image on the local
# machine and combined with the account and region to form the repository name for ECR.

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $DIR/set_env.sh

# set region
region=
if [ "$#" -eq 1 ]; then
    region=$1
else
    echo "usage: $0 <aws-region>"
    exit 1
fi
  

image=$IMAGE_NAME
tag=$IMAGE_TAG

# Get the account number associated with the current IAM credentials
account=$(aws sts get-caller-identity --query Account --output text)

if [ $? -ne 0 ]
then
    exit 255
fi


fullname="${account}.dkr.ecr.${region}.amazonaws.com/${image}:${tag}"

# If the repository doesn't exist in ECR, create it.
aws ecr describe-repositories --region ${region} --repository-names "${image}" > /dev/null 2>&1
if [ $? -ne 0 ]; then
   [...]<jupyter_text>Using your *AWS region* as argument, run the cell below.<jupyter_code>%%time
! ./container/build_tools/build_and_push.sh {aws_region}<jupyter_output>WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
Sending build context to Docker daemon  17.92kB
Step 1/24 : FROM  763104351884.dkr.ecr.us-west-2.amazonaws.com/tensorflow-training:1.13-horovod-gpu-py36-cu100-ubuntu16.04-v2.0
1.13-horovod-gpu-py36-cu100-ubuntu16.04-v2.0: Pulling from tensorflow-training

[1Be2e5f967: Pulling fs layer 
[1B6638ac9f: Pulling fs layer 
[1B7d6d954b: Pulling fs layer 
[1Be5e2a643: Pulling fs layer 
[1B43379044: Pulling fs layer 
[1Bc12a6c3b: Pulling fs layer 
[1B93d9ac61: Pulling fs layer 
[1Ba7b48be6: Pulling fs layer 
[1Beecb5348: Pulling fs layer 
[1B6e6c5b44: Pulling fs layer 
[1Bb7e5eee6: Pulling fs layer 
[1Bf1cf8b04: Pulling fs layer 
[1B2ded661d: Pulling fs layer 
[1B51eff8ef:[...]<jupyter_text>Set ```tensorpack_image``` below to Amazon ECR URI of the image you pushed above.<jupyter_code>tensorpack_image = "393782509758.dkr.ecr.ap-southeast-1.amazonaws.com/mask-rcnn-tensorpack-sagemaker:tf1.13-tp26664c3"<jupyter_output><empty_output><jupyter_text>AWS Samples Mask R-CNNUse ```./container-optimized/build_tools/build_and_push.sh``` script to build and push the AWS Samples Mask R-CNN training image to Amazon ECR.<jupyter_code>!cat ./container-optimized/build_tools/build_and_push.sh<jupyter_output>#!/usr/bin/env bash

# This script shows how to build the Docker image and push it to ECR to be ready for use
# by SageMaker.

# The argument to this script is the image name. This will be used as the image on the local
# machine and combined with the account and region to form the repository name for ECR.

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $DIR/set_env.sh

# set region
region=
if [ "$#" -eq 1 ]; then
    region=$1
else
    echo "usage: $0 <aws-region>"
    exit 1
fi
  

image=$IMAGE_NAME
tag=$IMAGE_TAG

# Get the account number associated with the current IAM credentials
account=$(aws sts get-caller-identity --query Account --output text)

if [ $? -ne 0 ]
then
    exit 255
fi


fullname="${account}.dkr.ecr.${region}.amazonaws.com/${image}:${tag}"

# If the repository doesn't exist in ECR, create it.
aws ecr describe-repositories --region ${region} --repository-names "${image}" > /dev/null 2>&1
if [ $? -ne 0 ]; then
   [...]<jupyter_text>Using your *AWS region* as argument, run the cell below.<jupyter_code>%%time
! ./container-optimized/build_tools/build_and_push.sh {aws_region}<jupyter_output>WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
Sending build context to Docker daemon  18.94kB
Step 1/25 : FROM  tensorflow-base:1.13.1-gpu-py36
 ---> 678566651313
Step 2/25 : ENV HOROVOD_VERSION=0.18.1
 ---> Running in 9ee0d7738a21
Removing intermediate container 9ee0d7738a21
 ---> bf5565ec2297
Step 3/25 : RUN pip install --upgrade pip
 ---> Running in 2d5642321d7d
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages (20.0.2)
Removing intermediate container 2d5642321d7d
 ---> 4622fa702605
Step 4/25 : RUN pip uninstall -y tensorflow tensorboard tensorflow-estimator keras h5py horovod numpy
 ---> Running in da760f26c281
Found existing installation: tensorflow 1.13.1
Uninstalling tensorflow-1.13.1:
 [...]<jupyter_text>Set ```aws_samples_image``` below to Amazon ECR URI of the image you pushed above.<jupyter_code>aws_samples_image = "393782509758.dkr.ecr.ap-southeast-1.amazonaws.com/mask-rcnn-tensorflow-sagemaker:tf1.13-153442b"<jupyter_output><empty_output><jupyter_text>SageMaker Initialization We have staged the data and we have built and pushed the training docker image to Amazon ECR. Now we are ready to start using Amazon SageMaker.<jupyter_code>%%time
import boto3
import sagemaker
from sagemaker import get_execution_role
from sagemaker.estimator import Estimator

role = get_execution_role() # provide a pre-existing role ARN as an alternative to creating a new role
print(f'SageMaker Execution Role:{role}')

client = boto3.client('sts')
account = client.get_caller_identity()['Account']
print(f'AWS account:{account}')

session = boto3.session.Session()
region = session.region_name
print(f'AWS region:{region}')<jupyter_output>SageMaker Execution Role:arn:aws:iam::393782509758:role/service-role/AmazonSageMaker-ExecutionRole-20191115T140457
AWS account:393782509758
AWS region:ap-southeast-1
CPU times: user 831 ms, sys: 103 ms, total: 934 ms
Wall time: 1.9 s<jupyter_text>Next, we set ```training_image``` to the Amazon ECR image URI you saved in a previous step.<jupyter_code>training_image =  aws_samples_image# set to tensorpack_image or aws_samples_image 
print(f'Training image: {training_image}')<jupyter_output>Training image: 393782509758.dkr.ecr.ap-southeast-1.amazonaws.com/mask-rcnn-tensorflow-sagemaker:tf1.13-153442b<jupyter_text>Define SageMaker Data ChannelsIn this step, we define SageMaker *train* data channel.<jupyter_code>prefix = "mask-rcnn/sagemaker" #prefix in your S3 bucket

s3train = f's3://{s3_bucket}/{prefix}/input/train'


train = sagemaker.session.s3_input(s3train, distribution='FullyReplicated', 
                        content_type='application/tfrecord', s3_data_type='S3Prefix')


data_channels = {'train': train}<jupyter_output><empty_output><jupyter_text>Next, we define the model output location in S3 bucket.<jupyter_code>s3_output_location = f's3://{s3_bucket}/{prefix}/output'<jupyter_output><empty_output><jupyter_text>Configure Hyper-parametersNext, we define the hyper-parameters. Note, some hyper-parameters are different between the two implementations. The batch size per GPU in TensorPack Faster-RCNN/Mask-RCNN is fixed at 1, but is configurable in AWS Samples Mask-RCNN. The learning rate schedule is specified in units of steps in TensorPack Faster-RCNN/Mask-RCNN, but in epochs in AWS Samples Mask-RCNN.The detault learning rate schedule values shown below correspond to training for a total of 24 epochs, at 120,000 images per epoch.    TensorPack Faster-RCNN/Mask-RCNN  Hyper-parameters        Hyper-parameter    Description    Default                mode_fpn        Flag to indicate use of Feature Pyramid Network (FPN) in the Mask R-CNN model backbone        "True"                 mode_mask        A value of "False" means Faster-RCNN model, "True" means Mask R-CNN moodel        "True"                 eval_period        Number of epochs period for evaluation during training        1                lr_schedule        Learning rate schedule in training steps        '[240000, 320000, 360000]'                batch_norm        Batch normalization option ('FreezeBN', 'SyncBN', 'GN', 'None')         'FreezeBN'                images_per_epoch        Images per epoch         120000                data_train        Training data under data directory        'coco_train2017'                data_val        Validation data under data directory        'coco_val2017'                resnet_arch        Must be 'resnet50' or 'resnet101'        'resnet50'                backbone_weights        Pre-trained model weights        'ImageNet-R50-AlignPadding.npz'            AWS Samples Mask-RCNN  Hyper-parameters        Hyper-parameter    Description    Default                mode_fpn        Flag to indicate use of Feature Pyramid Network (FPN) in the Mask R-CNN model backbone        "True"                 mode_mask        A value of "False" means Faster-RCNN model, "True" means Mask R-CNN moodel        "True"                 eval_period        Number of epochs period for evaluation during training        1                lr_epoch_schedule        Learning rate schedule in epochs        '[(16, 0.1), (20, 0.01), (24, None)]'                batch_size_per_gpu        Batch size per gpu ( Minimum 1, Maximum 4)        4                batch_norm        Batch normalization option ('FreezeBN', 'SyncBN', 'GN', 'None')         'FreezeBN'                images_per_epoch        Images per epoch         120000                data_train        Training data under data directory        'train2017'                data_val        Validation data under data directory        'val2017'                resnet_arch        Must be 'resnet50' or 'resnet101'        'resnet50'                backbone_weights        Pre-trained model weights        'ImageNet-R50-AlignPadding.npz'<jupyter_code>hyperparameters = {
                    "mode_fpn": "True",
                    "mode_mask": "True",
                    "eval_period": 1,
                    "batch_norm": "FreezeBN",
                    "batch_size_per_gpu": 1,
                  }<jupyter_output><empty_output><jupyter_text>Define Training MetricsNext, we define the regular expressions that SageMaker uses to extract algorithm metrics from training logs and send them to [AWS CloudWatch metrics](https://docs.aws.amazon.com/en_pv/AmazonCloudWatch/latest/monitoring/working_with_metrics.html). These algorithm metrics are visualized in SageMaker console.<jupyter_code>metric_definitions=[
             {
                "Name": "fastrcnn_losses/box_loss",
                "Regex": ".*fastrcnn_losses/box_loss:\\s*(\\S+).*"
            },
            {
                "Name": "fastrcnn_losses/label_loss",
                "Regex": ".*fastrcnn_losses/label_loss:\\s*(\\S+).*"
            },
            {
                "Name": "fastrcnn_losses/label_metrics/accuracy",
                "Regex": ".*fastrcnn_losses/label_metrics/accuracy:\\s*(\\S+).*"
            },
            {
                "Name": "fastrcnn_losses/label_metrics/false_negative",
                "Regex": ".*fastrcnn_losses/label_metrics/false_negative:\\s*(\\S+).*"
            },
            {
                "Name": "fastrcnn_losses/label_metrics/fg_accuracy",
                "Regex": ".*fastrcnn_losses/label_metrics/fg_accuracy:\\s*(\\S+).*"
            },
            {
                "Name": "fastrcnn_losses/num_fg_label",
                "Regex": ".*fastrcnn_losses/num_fg_label:\\s*(\\S+).*"
            },
             {
                "Name": "maskrcnn_loss/accuracy",
                "Regex": ".*maskrcnn_loss/accuracy:\\s*(\\S+).*"
            },
            {
                "Name": "maskrcnn_loss/fg_pixel_ratio",
                "Regex": ".*maskrcnn_loss/fg_pixel_ratio:\\s*(\\S+).*"
            },
            {
                "Name": "maskrcnn_loss/maskrcnn_loss",
                "Regex": ".*maskrcnn_loss/maskrcnn_loss:\\s*(\\S+).*"
            },
            {
                "Name": "maskrcnn_loss/pos_accuracy",
                "Regex": ".*maskrcnn_loss/pos_accuracy:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/IoU=0.5",
                "Regex": ".*mAP\\(bbox\\)/IoU=0\\.5:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/IoU=0.5:0.95",
                "Regex": ".*mAP\\(bbox\\)/IoU=0\\.5:0\\.95:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/IoU=0.75",
                "Regex": ".*mAP\\(bbox\\)/IoU=0\\.75:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/large",
                "Regex": ".*mAP\\(bbox\\)/large:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/medium",
                "Regex": ".*mAP\\(bbox\\)/medium:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(bbox)/small",
                "Regex": ".*mAP\\(bbox\\)/small:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/IoU=0.5",
                "Regex": ".*mAP\\(segm\\)/IoU=0\\.5:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/IoU=0.5:0.95",
                "Regex": ".*mAP\\(segm\\)/IoU=0\\.5:0\\.95:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/IoU=0.75",
                "Regex": ".*mAP\\(segm\\)/IoU=0\\.75:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/large",
                "Regex": ".*mAP\\(segm\\)/large:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/medium",
                "Regex": ".*mAP\\(segm\\)/medium:\\s*(\\S+).*"
            },
            {
                "Name": "mAP(segm)/small",
                "Regex": ".*mAP\\(segm\\)/small:\\s*(\\S+).*"
            }  
            
    ]<jupyter_output><empty_output><jupyter_text>Define SageMaker Training JobNext, we use SageMaker [Estimator](https://sagemaker.readthedocs.io/en/stable/estimators.html) API to define a SageMaker Training Job. We recommned using 32 GPUs, so we set ```train_instance_count=4``` and ```train_instance_type='ml.p3.16xlarge'```, because there are 8 Tesla V100 GPUs per ```ml.p3.16xlarge``` instance. We recommend using 100 GB [Amazon EBS](https://aws.amazon.com/ebs/) storage volume with each training instance, so we set ```train_volume_size = 100```. We want to replicate training data to each training instance, so we set ```input_mode= 'File'```.We run the training job in your private VPC, so we need to set the ```subnets``` and ```security_group_ids``` prior to running the cell below. You may specify multiple subnet ids in the ```subnets``` list. The subnets included in the ```sunbets``` list must be part of the output of  ```./stack-sm.sh``` CloudFormation stack script used to create this notebook instance. Specify only one security group id in ```security_group_ids``` list. The security group id must be part of the output of  ```./stack-sm.sh``` script.For ```train_instance_type``` below, you have the option to use ```ml.p3.16xlarge``` with 16 GB per-GPU memory and 25 Gbs network interconnectivity, or ```ml.p3dn.24xlarge``` with 32 GB per-GPU memory and 100 Gbs network interconnectivity. The ```ml.p3dn.24xlarge``` instance type offers significantly better performance than ```ml.p3.16xlarge``` for Mask R-CNN distributed TensorFlow training.<jupyter_code># security_group_ids =  # ['sg-xxxxxxxx']
# subnets =      # [ 'subnet-xxxxxxx']
sagemaker_session = sagemaker.session.Session(boto_session=session)
mask_rcnn_estimator = Estimator(training_image,
                                         role, 
                                         train_instance_count=1, 
                                         train_instance_type='ml.p2.xlarge',
                                         #train_instance_type='local_gpu',
                                         train_volume_size = 100,
                                         train_max_run = 400000,
                                         input_mode= 'File',
                                         output_path=s3_output_location,
                                         sagemaker_session=sagemaker_session, 
                                         hyperparameters = hyperparameters,
                                         metric_definitions = metric_definitions,
                                         base_job_name="mask-rcnn-s3")<jupyter_output><empty_output><jupyter_text>Finally, we launch the SageMaker training job. The estimated time for downloading data to all the training instances is 20 minutes. The time to complete the training depends on type and number of training instances, and the training image used for training.<jupyter_code>mask_rcnn_estimator.fit(inputs=data_channels, logs="All")<jupyter_output>2020-04-02 09:03:20 Starting - Starting the training job...
2020-04-02 09:03:21 Starting - Launching requested ML instances......
2020-04-02 09:04:23 Starting - Preparing the instances for training......
2020-04-02 09:05:31 Downloading - Downloading input data..............[34m/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:523: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])[0m
[34m/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:524: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])[0m
[34m/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) o[...]
{'fraction_non_alphanumeric': 0.12393755420641804, 'fraction_numerical': 0.039982653946227235, 'mean_word_length': 2.8422192602465843, 'pattern_counts': {'":': 49, '<': 63, '<?xml version=': 0, '>': 74, 'https://': 18, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 28, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '106097', 'license': 'Apache-2.0', 'n_tokens_mistral': 8050, 'n_tokens_neox': 7246, 'n_words': 1940, 'path': 'advanced_functionality/distributed_tensorflow_mask_rcnn/mask-rcnn-s3-copy.ipynb', 'repo_name': 'nikhilarunw/amazon-sagemaker-examples', 'size': '23066'}