From 6b031e6835f979cf68855b68f344caab6607bb58 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 13 Sep 2022 23:39:44 +0300 Subject: [PATCH 01/15] initial commit --- training/heterogeneous-clusters/.gitignore | 9 + training/heterogeneous-clusters/README.md | 32 + .../hello.world.sagemaker/README.md | 18 + .../hello.world.sagemaker/source_dir/train.py | 38 + .../hello.world.sagemaker/start_job.py | 32 + .../pt.grpc.local/README.md | 106 ++ .../pt.grpc.local/dataset_feed.proto | 14 + .../pt.grpc.local/dataset_feed_pb2.py | 47 + .../pt.grpc.local/dataset_feed_pb2_grpc.py | 99 ++ .../pt.grpc.local/generate_proto.bash | 2 + .../pt.grpc.local/main.py | 97 ++ .../pt.grpc.local/main_grpc_client.py | 169 +++ .../pt.grpc.local/main_grpc_server.py | 170 +++ .../pt.grpc.local/requirements.txt | 5 + .../pt.grpc.sagemaker/README.md | 6 + .../pt.grpc.sagemaker/code/dataset_feed.proto | 14 + .../code/dataset_feed_pb2.py | 47 + .../code/dataset_feed_pb2_grpc.py | 99 ++ .../pt.grpc.sagemaker/code/launcher.py | 101 ++ .../pt.grpc.sagemaker/code/requirements.txt | 2 + .../pt.grpc.sagemaker/code/train.py | 127 +++ .../pt.grpc.sagemaker/code/train_data.py | 170 +++ .../pt.grpc.sagemaker/code/train_dnn.py | 179 +++ .../hetero-pytorch-mnist.ipynb | 600 ++++++++++ .../images/heterogeneous-cluster-diagram.png | Bin 0 -> 31604 bytes .../images/heterogeneous-instance-metrics.png | Bin 0 -> 55343 bytes .../images/homogeneous-cluster-diagram.png | Bin 0 -> 18353 bytes .../images/pytorch-heterogeneous-workflow.png | Bin 0 -> 64269 bytes .../pt.grpc.sagemaker/start_job.py | 91 ++ .../tf.data.service.local/README.md | 53 + .../generate_cifar10_tfrecords.py | 132 +++ .../tf.data.service.local/requirements.txt | 3 + .../run-dispatcher-and-worker.py | 68 ++ .../tf.data.service.local/train.py | 122 ++ .../code/launcher.py | 123 ++ .../code/requirements.txt | 2 + .../code/train_data.py | 68 ++ .../code/train_dnn.py | 158 +++ .../generate_cifar10_tfrecords.py | 132 +++ .../hetero-tensorflow-restnet50.ipynb | 1016 +++++++++++++++++ .../TensorFlow-Hetero-Instance-Metrics.png | Bin 0 -> 130144 bytes .../images/basic-heterogeneous-job.png | Bin 0 -> 30377 bytes .../images/basic-homogeneous-job.png | Bin 0 -> 18547 bytes .../heterogenous cluster diagrams (5).xml | 1 + ...geneous-vs-heterogeneous-results-table.png | Bin 0 -> 28521 bytes ...etrics Heterogeneous cpu and gpu usage.png | Bin 0 -> 98510 bytes .../metrics homogenous cpu and gpu usage.png | Bin 0 -> 41369 bytes .../images/tf.data.service-diagram.png | Bin 0 -> 352969 bytes .../tf.data.service.sagemaker/readme.md | 32 + .../requirements.txt | 1 + .../tf.data.service.sagemaker/start_job.py | 94 ++ 51 files changed, 4279 insertions(+) create mode 100644 training/heterogeneous-clusters/.gitignore create mode 100644 training/heterogeneous-clusters/README.md create mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/README.md create mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/source_dir/train.py create mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/start_job.py create mode 100644 training/heterogeneous-clusters/pt.grpc.local/README.md create mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto create mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py create mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py create mode 100755 training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash create mode 100644 training/heterogeneous-clusters/pt.grpc.local/main.py create mode 100644 training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py create mode 100644 training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py create mode 100644 training/heterogeneous-clusters/pt.grpc.local/requirements.txt create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/README.md create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed.proto create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2_grpc.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/launcher.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/requirements.txt create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/train.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_dnn.py create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-cluster-diagram.png create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-instance-metrics.png create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/images/homogeneous-cluster-diagram.png create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/images/pytorch-heterogeneous-workflow.png create mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py create mode 100644 training/heterogeneous-clusters/tf.data.service.local/README.md create mode 100755 training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py create mode 100644 training/heterogeneous-clusters/tf.data.service.local/requirements.txt create mode 100644 training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py create mode 100755 training/heterogeneous-clusters/tf.data.service.local/train.py create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/code/launcher.py create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/code/requirements.txt create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_data.py create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py create mode 100755 training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/TensorFlow-Hetero-Instance-Metrics.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/basic-heterogeneous-job.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/basic-homogeneous-job.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/homogeneous-vs-heterogeneous-results-table.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics Heterogeneous cpu and gpu usage.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogenous cpu and gpu usage.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/tf.data.service-diagram.png create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/requirements.txt create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py diff --git a/training/heterogeneous-clusters/.gitignore b/training/heterogeneous-clusters/.gitignore new file mode 100644 index 0000000000..bc0d0e9a8d --- /dev/null +++ b/training/heterogeneous-clusters/.gitignore @@ -0,0 +1,9 @@ +.venv/ +.DS_Store +data/MyMNIST +pt.grpc.local/data/* +pt.grpc.local/__pycache__ +pt.grpc.local/profile +tf.data.service.sagemaker/data +tf.data.service.sagemaker/code/__pycache__ +tf.data.service.local/data \ No newline at end of file diff --git a/training/heterogeneous-clusters/README.md b/training/heterogeneous-clusters/README.md new file mode 100644 index 0000000000..f2bfa90d01 --- /dev/null +++ b/training/heterogeneous-clusters/README.md @@ -0,0 +1,32 @@ +# SageMaker Heterogeneous Clusters Training +SageMaker Training Heterogeneous Clusters allows you to run one training job that includes instances of different types (for example a GPU instance like ml.p4d.24xlarge and a CPU instance like c5.18xlarge). One primary use case is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the expensive GPUs, and arrive at an improved time and cost to train. + +You'll find TensorFlow (tf.data.service) and PyTorch (a customer gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. + +![Hetero job diagram](tf.data.service.sagemaker/images/basic-heterogeneous-job.png) + +## Examples: + + +### TensorFlow examples +- [**TensorFlow's tf.data.service running locally**](tf.data.service.local/README.md): +This example runs the tf.data.service locally on your machine (not on SageMaker). It's helpful in order to get familiar with tf.data.service and to run small scale quick experimentation. + +- [**TensorFlow's tf.data.service with Amazon SageMaker Training Heterogeneous Clusters**](tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb): +This TensorFlow example runs a Homogenous trainign job and compares its results with a Heterogeneous Clusters SageMaker training job that runs with two instance groups: + - `data_group` - this group has two ml.c5.18xlarge instances to which data augmentation is offloaded. + - `dnn_group` - Running one ml.p4d.24xlarge instance (8GPUs) in a horovod/MPI distribution. + +### PyTorch examples +- [**PyTorch with gRPC distributed dataloader running locally**](pt.grpc.local/README.md): +This Pytorch example runs a training job split into two processes locally on your machine (not on SageMaker). It's helpful in order to get familiar with the GRPC distributed data loader and to run small scale quick experimentation. + +- [**PyTorch with gRPC distributed dataloader Heterogeneous Clusters training job example**](pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb): +This PyTorch example runs a Hetero SageMaker training job that uses gRPC to offload data augmentation to a CPU based server. + + +### Hello world example +- [**Hetero Training Job - Hello world**](hello.world.sagemaker/README.md): +This basic example run a heterogeneous training job consisting of two instance groups. Each group includes a different instance_type. +Each instance prints its instance group information and exits. +Note: This example only shows how to orchastrate the training job with instance type, for actual code to help with a distributed data loader, see the TF or PT examples below. \ No newline at end of file diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/README.md b/training/heterogeneous-clusters/hello.world.sagemaker/README.md new file mode 100644 index 0000000000..b88b6e8269 --- /dev/null +++ b/training/heterogeneous-clusters/hello.world.sagemaker/README.md @@ -0,0 +1,18 @@ +# Hetero Training Job - Hello world +This basic example on how to run a Heterogeneous Clusters training job consisting of two instance groups. Each instance group includes a different instance type. +Each instance prints its environmental information including its instance group and exits. +This demo doesn't include applying a distribution to one of the instance groups (e.g., for distributed training) + +Environment information can be obtained in two ways: + - `Option-1`: Read instance group information using the convinient sagemaker_training.environment.Environment class. + - `Option-2`: Read instance group information from `/opt/ml/input/config/resourceconfig.json`. + +## Running the example: +Start a SageMaker training job: +```bash +cd ./hello.world.sagemaker/ +python3 ./start_job.py +``` +Wait for the training job to finish and review its logs in the AWS Console. You'll find two logs: Algo1, Algo2. Examine the printouts on each node on how to retrieve instance group environment infomation. + +Next, See the TensorFlow or PyTorch examples. \ No newline at end of file diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/source_dir/train.py b/training/heterogeneous-clusters/hello.world.sagemaker/source_dir/train.py new file mode 100644 index 0000000000..1884e20fab --- /dev/null +++ b/training/heterogeneous-clusters/hello.world.sagemaker/source_dir/train.py @@ -0,0 +1,38 @@ +import json +import os +import sys +from sagemaker_training import environment # This module is present on the DLC images, or you can install it with pip install sagemaker_training + +if __name__ == "__main__": + + print("Option-1: Read instance group information from the sagemaker_training.environment.Environment class") + env = environment.Environment() + print(f"env.is_hetero: {env.is_hetero}") + print(f"env.current_host: {env.current_host}") + print(f"env.current_instance_type: {env.current_instance_type}") + print(f"env.current_instance_group: {env.current_instance_group}") + print(f"env.current_instance_group_hosts: {env.current_instance_group_hosts}") + print(f"env.instance_groups: {env.instance_groups}") + print(f"env.instance_groups_dict: {env.instance_groups_dict}") + print(f"env.distribution_hosts: {env.distribution_hosts}") + print(f"env.distribution_instance_groups: {env.distribution_instance_groups}") + + + file_path = '/opt/ml/input/config/resourceconfig.json' + print("Option-2: Read instance group information from {file_path}.\ + You'll need to parse the json yourself. This doesn't require an additional library.\n") + + with open(file_path, 'r') as f: + config = json.load(f) + + print(f'{file_path} dump = {json.dumps(config, indent=4, sort_keys=True)}') + + print(f"env.is_hetero: {'instance_groups' in config}") + print(f"current_host={config['current_host']}") + print(f"current_instance_type={config['current_instance_type']}") + print(f"env.current_instance_group: {config['current_group_name']}") + print(f"env.current_instance_group_hosts: TODO") + print(f"env.instance_groups: TODO") + print(f"env.instance_groups_dict: {config['instance_groups']}") + print(f"env.distribution_hosts: TODO") + print(f"env.distribution_instance_groups: TODO") diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py b/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py new file mode 100644 index 0000000000..7b2d772648 --- /dev/null +++ b/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py @@ -0,0 +1,32 @@ +import datetime +from sagemaker.tensorflow import TensorFlow +from sagemaker.instance_group import InstanceGroup +import os + +REGION = 'us-east-1' +os.environ["AWS_DEFAULT_REGION"] = REGION + +# https://aws.amazon.com/sagemaker/pricing/ +data_group = InstanceGroup("data_group", "ml.c5.xlarge", 1) +dnn_group = InstanceGroup("dnn_group", "ml.m4.xlarge", 1) + +estimator = TensorFlow( + entry_point='train.py', + source_dir='./source_dir', + #instance_type='ml.m4.xlarge', + #instance_count=1, + instance_groups = [data_group, dnn_group,], + framework_version='2.9.1', + py_version='py39', + role=os.environ.get('SAGEMAKER_ROLE'), + volume_size=10, + max_run=3600, + max_wait=3600, + disable_profiler=True, + #use_spot_instances=True, +) + +estimator.fit( + job_name='hello-world-heterogenous' + + '-' + datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ"), +) diff --git a/training/heterogeneous-clusters/pt.grpc.local/README.md b/training/heterogeneous-clusters/pt.grpc.local/README.md new file mode 100644 index 0000000000..a1cadfd9b7 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/README.md @@ -0,0 +1,106 @@ +### Local Training using gRPC Client-Server + +The example here provides a conceptual idea of how to separate data preprocessing and training processes, and establish a gRPC client server communication between these components. We re-use the same client-server communication implementation in our Heterocluster SageMaker training example . To demonstrate this we first run baseline testing where both the components (data preprocessing and training) run in a set of processes (see section A). In Section B, we split data processing run on gRPC Server set of processes whereas training run on a different set of processes. + +Important: +Use a GPU based (preferably g4dn.xlarge) based SageMaker Notebook Instance, and use terminal window (File > New > Terminal). Tested on python 3.8 and Pytorch 1.10. +Note: This example does not support SageMaker "Studio" Notebook Instance. + +**Prerequsites** +Pre-requisite +Install dependent packages like pytorch, tensorboard, grpc. And, switch to working directory where all the scripts are stored. +``` +pip install -r ~/SageMaker/hetro-training/pt.grpc.local/requirements.txt +cd ~/SageMaker/hetro-training/pt.grpc.local/ +``` +A. Baseline Testing +--- + +**Step 1**: Run basic mnist training script (no gRPC implementation). +Modify the `main.py` to set: + +`BATCH_SIZE = 8192` +`ITERATIONS = 100` # No. of iterations in an epoc - must be multiple of 10s +`DATALOADER_WORKERS = 2` #equals no. of CPUs of your local instance + +And, run the following commmand line: +``` +python main.py +``` + +**Step 2**: Observe the `avg step time`. The steps/second starts printing on the console. And, stops after predefined iterations. +``` +sh-4.2$ python main.py +Training job started... +10: avg step time: 2.4617617287999565 +20: avg step time: 2.4338118159999795 +30: avg step time: 2.4230862849000006 +40: avg step time: 2.42389511962499 +50: avg step time: 2.4670148023599903 +60: avg step time: 2.494912311566668 +70: avg step time: 2.5143303409714335 +80: avg step time: 2.530583710625001 +90: avg step time: 2.5414934969444403 +100: avg step time: 2.5489751799700024 +Training completed! +``` + + +B. Split data pre-processing and training testing using gRPC Client-Server inter-process communication +--- +In this example, we are decoupling the data pre-processing component of our training job, and the deep neural network (DNN) code. This way the data processing can run on CPU instance, and DNN on GPU instance. Here by introducing concept of heterogenous instances, but demonstrated both these processes running locally. The inter-process communucation is implemented by gRPC Client-Server communication. + +**Step 1**: Run gRPC Server in a new terminal session. The set of processes wait for client to request data. On request, it read the data from `data` folder, preprocess the data, and send it to the client for training. + +``` +python main_grpc_server.py --batch-size 8192 --num-data-workers 4 --iterations 100 --grpc-workers 2 +``` +where, +`batch-size` any integer +`num-workers` based on no. of cpu per of your data pre-processing instance +`iterations` no. of iterations in an epoch - must be multiple of 10s` +`grpc-workers` no. of workers fetching the pre-processed data to DNN process (gRPC client) + +**Step 2**: Run gRPC Client in a new terminal session (File > New > Terminal) . The set of process spawend by this script fetches pre-processed data from server and runs training. Make sure you change your working directory to where code exist (..\..\pt.grpc.local). +``` +cd ~/SageMaker/hetro-training/pt.grpc.local/ +python main_grpc_client.py --batch-size 8192 --num-dnn-workers 2 --iterations 100 --model-dir ./ +``` +where, +`batch-size` any integer, must match to the size mentioned in the gRPC server process launch +`num-workers` no. of dataloader workers, it is based on no. of cpu of the dnn instance +`iterations` no. of iterations in an epoch - must be multiple of 10s, must match to the no. mentioned in the gRPC server process launch +`model-dir` location of the model to be saved + +**Step 3**: Observe the `avg step time`. The steps/second starts printing to the console. And, stops after predefined iterations. +``` +sh-4.2$ python main_grpc_client.py +Training job started... +10: avg step time: 0.43338242229997376 +20: avg step time: 0.3908786807500064 +30: avg step time: 0.3767881167999955 +40: avg step time: 0.3698345946000018 +50: avg step time: 0.3657775266399949 +60: avg step time: 0.5407461890666657 +70: avg step time: 0.6490721581571441 +80: avg step time: 0.7544923407874989 +90: avg step time: 0.8115056776666633 +100: avg step time: 0.8806567812599997 +Saving the model +Training job completed! +Shutting down data service via port 16000 +``` + +**Step 4**: Optionally, in a new terminal window, you can validate whether the gRPC client-server communication is taking place. + +``` +sh-4.2$ netstat -an | grep 6000 +tcp6 0 0 :::6000 :::* LISTEN +tcp6 0 0 ::1:47888 ::1:6000 ESTABLISHED +tcp6 0 0 ::1:47890 ::1:6000 ESTABLISHED +tcp6 0 0 ::1:6000 ::1:47890 ESTABLISHED +tcp6 0 0 ::1:6000 ::1:47888 ESTABLISHED +``` +C. Conclusion +--- +In this example, we demonstrated concepts behind Heterogeneous cluster training. First, we ran a simple all-in one training script,(contains both data preprocessing and deep neural network(DNN) components), then we separated data pre-processing and dnn components to run as two different set of processes. We expand on these concepts in our next example [**PyTorch with gRPC distributed dataloader Heterogeneous Clusters training job example**](../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb). \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto new file mode 100644 index 0000000000..94de2cd212 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +service DatasetFeed { + rpc get_examples(Dummy) returns (stream Example) {} + rpc shutdown(Dummy) returns (Dummy) {} +} + +message Dummy { +} + +message Example { + bytes image = 1; + bytes label = 2; +} \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py new file mode 100644 index 0000000000..78575b8888 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: dataset_feed.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64\x61taset_feed.proto\"\x07\n\x05\x44ummy\"\'\n\x07\x45xample\x12\r\n\x05image\x18\x01 \x01(\x0c\x12\r\n\x05label\x18\x02 \x01(\x0c\x32Q\n\x0b\x44\x61tasetFeed\x12$\n\x0cget_examples\x12\x06.Dummy\x1a\x08.Example\"\x00\x30\x01\x12\x1c\n\x08shutdown\x12\x06.Dummy\x1a\x06.Dummy\"\x00\x62\x06proto3') + + + +_DUMMY = DESCRIPTOR.message_types_by_name['Dummy'] +_EXAMPLE = DESCRIPTOR.message_types_by_name['Example'] +Dummy = _reflection.GeneratedProtocolMessageType('Dummy', (_message.Message,), { + 'DESCRIPTOR' : _DUMMY, + '__module__' : 'dataset_feed_pb2' + # @@protoc_insertion_point(class_scope:Dummy) + }) +_sym_db.RegisterMessage(Dummy) + +Example = _reflection.GeneratedProtocolMessageType('Example', (_message.Message,), { + 'DESCRIPTOR' : _EXAMPLE, + '__module__' : 'dataset_feed_pb2' + # @@protoc_insertion_point(class_scope:Example) + }) +_sym_db.RegisterMessage(Example) + +_DATASETFEED = DESCRIPTOR.services_by_name['DatasetFeed'] +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _DUMMY._serialized_start=22 + _DUMMY._serialized_end=29 + _EXAMPLE._serialized_start=31 + _EXAMPLE._serialized_end=70 + _DATASETFEED._serialized_start=72 + _DATASETFEED._serialized_end=153 +# @@protoc_insertion_point(module_scope) diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py new file mode 100644 index 0000000000..b37fe7aad6 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py @@ -0,0 +1,99 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +import dataset_feed_pb2 as dataset__feed__pb2 + + +class DatasetFeedStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.get_examples = channel.unary_stream( + '/DatasetFeed/get_examples', + request_serializer=dataset__feed__pb2.Dummy.SerializeToString, + response_deserializer=dataset__feed__pb2.Example.FromString, + ) + self.shutdown = channel.unary_unary( + '/DatasetFeed/shutdown', + request_serializer=dataset__feed__pb2.Dummy.SerializeToString, + response_deserializer=dataset__feed__pb2.Dummy.FromString, + ) + + +class DatasetFeedServicer(object): + """Missing associated documentation comment in .proto file.""" + + def get_examples(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def shutdown(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_DatasetFeedServicer_to_server(servicer, server): + rpc_method_handlers = { + 'get_examples': grpc.unary_stream_rpc_method_handler( + servicer.get_examples, + request_deserializer=dataset__feed__pb2.Dummy.FromString, + response_serializer=dataset__feed__pb2.Example.SerializeToString, + ), + 'shutdown': grpc.unary_unary_rpc_method_handler( + servicer.shutdown, + request_deserializer=dataset__feed__pb2.Dummy.FromString, + response_serializer=dataset__feed__pb2.Dummy.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'DatasetFeed', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class DatasetFeed(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def get_examples(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/DatasetFeed/get_examples', + dataset__feed__pb2.Dummy.SerializeToString, + dataset__feed__pb2.Example.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def shutdown(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/DatasetFeed/shutdown', + dataset__feed__pb2.Dummy.SerializeToString, + dataset__feed__pb2.Dummy.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash b/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash new file mode 100755 index 0000000000..0f0dbd5838 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash @@ -0,0 +1,2 @@ +#!/bin/bash +python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. dataset_feed.proto \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/main.py b/training/heterogeneous-clusters/pt.grpc.local/main.py new file mode 100644 index 0000000000..13b6c86c53 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/main.py @@ -0,0 +1,97 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torchvision import datasets, transforms +import time +import logging +import sys +import os + +BATCH_SIZE = 8192 # Integer +ITERATIONS = 100 # No. of iterations in an epoc, must be multiple of 10s +DATALOADER_WORKERS = 4 # No. of workers, equals no. of CPUs of your local instance +MODEL_DIR = './' + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(1, 32, 3, 1) + self.conv2 = nn.Conv2d(32, 64, 3, 1) + self.dropout1 = nn.Dropout(0.25) + self.dropout2 = nn.Dropout(0.5) + self.fc1 = nn.Linear(9216, 128) + self.fc2 = nn.Linear(128, 10) + def forward(self, x): + x = self.conv1(x) + x = F.relu(x) + x = self.conv2(x) + x = F.relu(x) + x = F.max_pool2d(x, 2) + x = self.dropout1(x) + x = torch.flatten(x, 1) + x = self.fc1(x) + x = F.relu(x) + x = self.fc2(x) + output = F.log_softmax(x, dim=1) + return output + +class MyMNIST(datasets.MNIST): + ''' + A personalized extension of the MNIST class in which we + modify the __len__ operation to return the maximum value + of int32 so that we do not run out of data. + ''' + def __len__(self) -> int: + import numpy as np + size = BATCH_SIZE * ITERATIONS + return size + def __getitem__(self, index: int): + return super(MyMNIST,self).__getitem__(index%len(self.data)) + +def main(): + use_cuda = torch.cuda.is_available() + device = torch.device("cuda" if use_cuda else "cpu") + train_kwargs = {'batch_size': BATCH_SIZE, + 'num_workers': DATALOADER_WORKERS, + 'pin_memory': True + } + print ('Training job started...') + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)), + transforms.GaussianBlur(11) + ]) + dataset = MyMNIST('./data', train=True, download=True, + transform=transform) + train_loader = torch.utils.data.DataLoader(dataset, + **train_kwargs) + model = Net().to(device) + optimizer = optim.Adadelta(model.parameters()) + model.train() + t = time.perf_counter() + for idx, (data, target) in enumerate(train_loader, start=1): + data, target = data.to(device), target.to(device) + optimizer.zero_grad() + output = model(data) + loss = F.nll_loss(output, target) + loss.backward() + optimizer.step() + if device=='cpu' or idx % 10 == 0: + print( + f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') + print('Training completed!') + save_model(model, MODEL_DIR) + +def save_model(model, model_dir): + logger.info("Saving the model") + path = os.path.join(model_dir, "model.pth") + torch.save(model.cpu().state_dict(), path) + return + +if __name__ == '__main__': + main() diff --git a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py new file mode 100644 index 0000000000..5af7680c02 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py @@ -0,0 +1,169 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torchvision import datasets, transforms +import time +import grpc +import dataset_feed_pb2_grpc +import dataset_feed_pb2 +import logging +import sys +import json +import os + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(1, 32, 3, 1) + self.conv2 = nn.Conv2d(32, 64, 3, 1) + self.dropout1 = nn.Dropout(0.25) + self.dropout2 = nn.Dropout(0.5) + self.fc1 = nn.Linear(9216, 128) + self.fc2 = nn.Linear(128, 10) + def forward(self, x): + x = self.conv1(x) + x = F.relu(x) + x = self.conv2(x) + x = F.relu(x) + x = F.max_pool2d(x, 2) + x = self.dropout1(x) + x = torch.flatten(x, 1) + x = self.fc1(x) + x = F.relu(x) + x = self.fc2(x) + output = F.log_softmax(x, dim=1) + return output + + +# Decode binary data from SM_CHANNEL_TRAINING +# Decode and preprocess data +# Create map dataset +class RemoteDataset(torch.utils.data.IterableDataset): + ''' + An iterable PyTorch dataset that opens a connection to the + gRPC server and reads from a stream of data batches + ''' + + def __init__(self, batch_size, iterations): + self.batch_size = batch_size + self.iterations = iterations + + + def __len__(self) -> int: + size = self.batch_size * self.iterations + return size + + def get_stub(self): + host = 'localhost' + channel = grpc.insecure_channel(f'{host}:6000', + # overwrite the default max message length + options=[('grpc.max_receive_message_length', + 200 * 1024 * 1024)]) + + try: + # print('Waiting for gRPC data server to be ready...') + grpc.channel_ready_future(channel).result(timeout=30) + except grpc.FutureTimeoutError: + print('ERROR: Timeout connecting to gRPC data server. Check that it is running.') + raise + #print('Connected to gRPC data server.') + + return dataset_feed_pb2_grpc.DatasetFeedStub(channel,) + + + def __iter__(self): + import numpy as np + + examples = self.get_stub().get_examples(dataset_feed_pb2.Dummy()) + for s in examples: + image = torch.tensor(np.frombuffer(s.image, + dtype=np.float32)).reshape( + [self.batch_size, 1, 28, 28]) + label = torch.tensor(np.frombuffer(s.label, + dtype=np.int8)).reshape( + [self.batch_size]).type(torch.int64) + yield image, label + + + # def shutdown_remote(self): + # print('Calling remote server to shutdown') + # self.get_stub().shutdown(dataset_feed_pb2.Dummy()) + +def shutdown_data_service(): + SHUTDOWN_PORT = 16000 + print('Shutting down data service via port {}'.format(SHUTDOWN_PORT)) + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect(('localhost', SHUTDOWN_PORT)) + s.close() + +def main(args): + print ('Training job started...') + use_cuda = torch.cuda.is_available() + device = torch.device("cuda" if use_cuda else "cpu") + + torch.manual_seed(args.seed) + if use_cuda: + torch.cuda.manual_seed(args.seed) + + train_kwargs = {'batch_size': None, #the data is already batched + 'num_workers': args.num_dnn_workers, #no. of cpus in dnn instance type + 'pin_memory': args.pin_memory, + } + dataset = RemoteDataset(args.batch_size, args.iterations) + train_loader = torch.utils.data.DataLoader(dataset, + **train_kwargs) + model = Net().to(device) + optimizer = optim.Adadelta(model.parameters()) + model.train() + t = time.perf_counter() + for idx, (data, target) in enumerate(train_loader, start=1): + data, target = data.to(device), target.to(device) + optimizer.zero_grad() + output = model(data) + loss = F.nll_loss(output, target) + loss.backward() + optimizer.step() + if device.type == 'cpu'or idx % 10 == 0: + logger.info( + f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') + + # TODO: exit the loop through the iterator stopping by itself + if idx*args.batch_size==(dataset.__len__()): + break + save_model(model, args.model_dir) + print ('Training job completed!') + shutdown_data_service() + +def save_model(model, model_dir): + logger.info("Saving the model") + path = os.path.join(model_dir, "model.pth") + torch.save(model.cpu().state_dict(), path) + return + +"This function read mode command line argument" +def read_args(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--batch-size", type=int, default=4, metavar="N", + help="Input batch size for training",) + parser.add_argument("--num-dnn-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance",) + parser.add_argument("--pin-memory", type=bool, default=1, metavar="N", + help="Pin to GPU memory (default: True)",) + parser.add_argument("--seed", type=int, default=1, metavar="S", + help="random seed (default: 1)",) + parser.add_argument("--model-dir", type=str) + parser.add_argument("--iterations", type=int, default=10, metavar="N", + help="The number of iterations per epoch (multiples of 10)",) + parser.add_argument("--first_data_host", type=str) + args, unknown = parser.parse_known_args() + return args + +if __name__ == '__main__': + main(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py new file mode 100644 index 0000000000..905edcd075 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py @@ -0,0 +1,170 @@ +import multiprocessing as mp +from concurrent import futures + +import grpc +import torch +from torchvision import datasets, transforms + +import dataset_feed_pb2 +import dataset_feed_pb2_grpc +import logging +import sys + +# Logging initialization +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +# The following class implements the data feeding service +class DatasetFeedService(dataset_feed_pb2_grpc.DatasetFeedServicer): + def __init__(self, q, kill_event): + ''' + param q: A shared queue containing data batches + param kill: Kill event for graceful shutdown + ''' + self.q = q + self.kill_event = kill_event + + + def get_examples(self, request, context): + while True: + #print('DEBUG: get_examples') + example = self.q.get() + yield dataset_feed_pb2.Example(image=example[0], + label=example[1]) + + + def shutdown(self, request, context): + print("Received shutdown request - Not implemented") + # from main_grpc_client import shutdown_data_service + # shutdown_data_service() + context.set_code(grpc.StatusCode.OK) + context.set_details('Shutting down') + return dataset_feed_pb2.Dummy() + + +# The data loading and preprocessing logic. +# We chose to keep the existing logic unchanged, just instead +# of feeding the model, the dataloader feeds a shared queue +class MyMNIST(datasets.MNIST): + ''' + A personalized extension of the MNIST class in which we + modify the __len__ operation to return the maximum value + of int32 so that we do not run out of data. + ''' + + def __init__(self, batch_size : int, iterations : int, **kwargs): + + super().__init__(**kwargs) + self.batch_size = batch_size + self.iterations = iterations + + def __len__(self) -> int: + size = self.batch_size * self.iterations + return size + + def __getitem__(self, index: int): + return super(MyMNIST, self).__getitem__(index % len(self.data)) + + +def fill_queue(q,kill, args): + train_kwargs = {'batch_size': args.batch_size, + 'num_workers': args.num_data_workers} + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)), + transforms.GaussianBlur(11) + ]) + dataset = MyMNIST(batch_size=args.batch_size, iterations=args.iterations, root='./data', train=True, + transform=transform, download=True) + loader = torch.utils.data.DataLoader(dataset, **train_kwargs) + for batch_idx, (data, target) in enumerate(loader): + if kill.is_set(): + print('kill signal received, exiting fill_queue') + break + added = False + while not added and not kill.is_set(): + try: + # convert the data to bytestrings and add to queue + q.put((data.numpy().tobytes(), + target.type(torch.int8).numpy().tobytes()), + timeout=1) + #print(f'DEBUG: Added example to queue') + added = True + except: + continue + print('Finished filling queue with dataset.') + + +def start(kill_event, args): + q = mp.Queue(maxsize=32) + queuing_process = mp.Process(target=fill_queue, args=(q, kill_event, args)) + queuing_process.start() + print('Started queuing process.') + + server = grpc.server(futures.ThreadPoolExecutor(max_workers=args.grpc_workers)) + dataset_feed_pb2_grpc.add_DatasetFeedServicer_to_server( + DatasetFeedService(q, kill_event), server) + server.add_insecure_port('[::]:6000') + server.start() + print('gRPC Data Server started at port 6000.') + return queuing_process,server + + +def shutdown(queuing_process, grpc_server): + print('Shutting down...') + print('Stopping gRPC server...') + grpc_server.stop(2).wait() + print('Stopping queuing process...') + queuing_process.join(1) + queuing_process.terminate() + print('Shutdown done.') + import os, time + os.system('kill %d' % os.getpid()) + time.sleep(2) + os.system('kill -9 %d' % os.getpid()) + + +def wait_for_shutdown_signal(): + SHUTDOWN_PORT = 16000 + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', SHUTDOWN_PORT)) + s.listen(1) + print('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) + conn, addr = s.accept() + print('Received shutdown signal from: ', addr) + try: + conn.close() + s.close() + except Exception as e: + print(e) + + +def serve(args): + kill_event = mp.Event() # an mp.Event for graceful shutdown + queue_data_loader_process, grpc_server = start(kill_event, args) + wait_for_shutdown_signal() + kill_event.set() + shutdown(queue_data_loader_process, grpc_server) + + +"This function read mode command line argument" +def read_args(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--batch-size", type=int, default=4, metavar="N", + help="Input batch size for training",) + parser.add_argument("--num-data-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance",) + parser.add_argument("--iterations", type=int, default=10, metavar="N", + help="The number of iterations per epoch (multiples of 10)",) + parser.add_argument("--grpc-workers", type=int, default=1, metavar="N", + help="No. of gRPC server workers",) + parser.add_argument("--first_data_host", type=str) + args, unknown = parser.parse_known_args() + return args + + +if __name__ == "__main__": + serve(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.local/requirements.txt b/training/heterogeneous-clusters/pt.grpc.local/requirements.txt new file mode 100644 index 0000000000..2da5553f42 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.local/requirements.txt @@ -0,0 +1,5 @@ +torch +torchvision +grpcio-tools +tensorboard +torch-tb-profiler \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md b/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md new file mode 100644 index 0000000000..6387aec480 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md @@ -0,0 +1,6 @@ +# SageMaker heterogeneous Training ("Hetero") - Pytorch example (MNIST Dataset) +This example demonstrates a more general way of offloading pre-processing to auxiliary devices using gRPC, the same protocol underlying the TensorFlow data service. We use here pytorch 1.11 framework. The job is submitted to SageMaker using Hetero feature that allows you to run one training job that includes instances of different types (for example a GPU instance like ml.g5.2xlarge and a CPU instance like c5n.9xlarge). The primary use case here is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the exensive GPU, and arrive at an improved time and cost to train. + + +## Instructions +Follow steps in [notebook](./hetero-pytorch-mnist.ipynb) \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed.proto b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed.proto new file mode 100644 index 0000000000..94de2cd212 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +service DatasetFeed { + rpc get_examples(Dummy) returns (stream Example) {} + rpc shutdown(Dummy) returns (Dummy) {} +} + +message Dummy { +} + +message Example { + bytes image = 1; + bytes label = 2; +} \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2.py new file mode 100644 index 0000000000..78575b8888 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: dataset_feed.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64\x61taset_feed.proto\"\x07\n\x05\x44ummy\"\'\n\x07\x45xample\x12\r\n\x05image\x18\x01 \x01(\x0c\x12\r\n\x05label\x18\x02 \x01(\x0c\x32Q\n\x0b\x44\x61tasetFeed\x12$\n\x0cget_examples\x12\x06.Dummy\x1a\x08.Example\"\x00\x30\x01\x12\x1c\n\x08shutdown\x12\x06.Dummy\x1a\x06.Dummy\"\x00\x62\x06proto3') + + + +_DUMMY = DESCRIPTOR.message_types_by_name['Dummy'] +_EXAMPLE = DESCRIPTOR.message_types_by_name['Example'] +Dummy = _reflection.GeneratedProtocolMessageType('Dummy', (_message.Message,), { + 'DESCRIPTOR' : _DUMMY, + '__module__' : 'dataset_feed_pb2' + # @@protoc_insertion_point(class_scope:Dummy) + }) +_sym_db.RegisterMessage(Dummy) + +Example = _reflection.GeneratedProtocolMessageType('Example', (_message.Message,), { + 'DESCRIPTOR' : _EXAMPLE, + '__module__' : 'dataset_feed_pb2' + # @@protoc_insertion_point(class_scope:Example) + }) +_sym_db.RegisterMessage(Example) + +_DATASETFEED = DESCRIPTOR.services_by_name['DatasetFeed'] +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _DUMMY._serialized_start=22 + _DUMMY._serialized_end=29 + _EXAMPLE._serialized_start=31 + _EXAMPLE._serialized_end=70 + _DATASETFEED._serialized_start=72 + _DATASETFEED._serialized_end=153 +# @@protoc_insertion_point(module_scope) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2_grpc.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2_grpc.py new file mode 100644 index 0000000000..b37fe7aad6 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/dataset_feed_pb2_grpc.py @@ -0,0 +1,99 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +import dataset_feed_pb2 as dataset__feed__pb2 + + +class DatasetFeedStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.get_examples = channel.unary_stream( + '/DatasetFeed/get_examples', + request_serializer=dataset__feed__pb2.Dummy.SerializeToString, + response_deserializer=dataset__feed__pb2.Example.FromString, + ) + self.shutdown = channel.unary_unary( + '/DatasetFeed/shutdown', + request_serializer=dataset__feed__pb2.Dummy.SerializeToString, + response_deserializer=dataset__feed__pb2.Dummy.FromString, + ) + + +class DatasetFeedServicer(object): + """Missing associated documentation comment in .proto file.""" + + def get_examples(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def shutdown(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_DatasetFeedServicer_to_server(servicer, server): + rpc_method_handlers = { + 'get_examples': grpc.unary_stream_rpc_method_handler( + servicer.get_examples, + request_deserializer=dataset__feed__pb2.Dummy.FromString, + response_serializer=dataset__feed__pb2.Example.SerializeToString, + ), + 'shutdown': grpc.unary_unary_rpc_method_handler( + servicer.shutdown, + request_deserializer=dataset__feed__pb2.Dummy.FromString, + response_serializer=dataset__feed__pb2.Dummy.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'DatasetFeed', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class DatasetFeed(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def get_examples(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/DatasetFeed/get_examples', + dataset__feed__pb2.Dummy.SerializeToString, + dataset__feed__pb2.Example.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def shutdown(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/DatasetFeed/shutdown', + dataset__feed__pb2.Dummy.SerializeToString, + dataset__feed__pb2.Dummy.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/launcher.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/launcher.py new file mode 100644 index 0000000000..371663f461 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/launcher.py @@ -0,0 +1,101 @@ +import sys +import time +from typing import Optional + +# instance group names +DATA_GROUP = 'data_group' +DNN_GROUP = 'dnn_group' + +def start_child_process(name : str, additional_args=[]) -> int: + import subprocess + params = ["python", f"./{name}"] + sys.argv[1:] + additional_args + print(f'Opening process: {params}') + p = subprocess.run(params) + print(f'Process {name} closed with returncode={p.returncode}') + if p.returncode == -15 or p.returncode == -9: + print(f'Received SIGTERM|SIGKILL which is normal termination for pytorch data service to avoid hanging process') + return 0 + return p.returncode + + +def start_data_group(dispatcher_host : str) -> int: + return start_child_process('train_data.py', ["--dispatcher_host", dispatcher_host]) + + +def start_dnn_group(dispatcher_host : Optional[str]) -> int: + additional_args = [] if dispatcher_host is None else ["--dispatcher_host", dispatcher_host] + return start_child_process('train_dnn.py', additional_args) + + +def get_group_first_host(instance_groups, target_group_name): + return instance_groups[target_group_name]['hosts'][0] + +def shutdown_pt_data_service_with_retries(dispatcher_host : str): + for i in range(0,12): + try: + if i>0: + sleeptime = 10 + print(f'Will attempt {i} time to shutdown in {sleeptime} seconds') + time.sleep(sleeptime) + _shutdown_data_service(dispatcher_host) + break + except Exception as e: + print(f'Failed to shutdown dispatcher in {dispatcher_host} due to: {e}') + + +def _shutdown_data_service(dispatcher_host : str): + SHUTDOWN_PORT = 16000 + print(f'Shutting down data service dispatcher via: [{dispatcher_host}:{SHUTDOWN_PORT}]') + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((dispatcher_host, SHUTDOWN_PORT)) + print(f'Shutdown request sent to {dispatcher_host}:{SHUTDOWN_PORT}') + + +def split_to_instance_group_train_script() -> int: + from sagemaker_training import environment + env = environment.Environment() + # try: + # from sagemaker_training import environment + # env = environment.Environment() + # except ImportError: + # class Object(object): + # pass + + # env = Object() + # env.is_hetero = True + # env.current_host = 'dummyhost' + # env.instance_groups_dict = {DATA_GROUP : {'hosts': ['dummyhost']}} + # env.current_instance_group = DNN_GROUP + # env.current_instance_type = 'dummyinstance' + + print(f'env.is_hetero={env.is_hetero}') + print(f'current_host={env.current_host}') + + if env.is_hetero: + dispatcher_host = get_group_first_host(env.instance_groups_dict, DATA_GROUP) + first_host_in_dnn_group = get_group_first_host(env.instance_groups_dict, DNN_GROUP) + print(f'current_instance_type={env.current_instance_type}') + print(f'current_group_name={env.current_instance_group}') + print(f'dispatcher_host={dispatcher_host}') + if env.current_instance_group == DATA_GROUP: + return start_data_group(dispatcher_host) + elif env.current_instance_group == DNN_GROUP: + returncode = start_dnn_group(dispatcher_host) + # first host in DNN group takes care of shutting down the dispatcher + if env.current_host == first_host_in_dnn_group: + shutdown_pt_data_service_with_retries(dispatcher_host) + return returncode + else: + raise Exception(f'Unknown instance group: {env.current_instance_group}') + + else: # not hetero + return start_dnn_group(dispatcher_host=None) + +if __name__ == "__main__": + try: + returncode = split_to_instance_group_train_script() + exit(returncode) + except Exception as e: + print(f'Failed due to {e}. exiting with returncode=1') + sys.exit(1) \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/requirements.txt b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/requirements.txt new file mode 100644 index 0000000000..5d406f6b34 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/requirements.txt @@ -0,0 +1,2 @@ +torchvision +grpcio-tools diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train.py new file mode 100644 index 0000000000..1963d940bf --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train.py @@ -0,0 +1,127 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torchvision import datasets, transforms +import time +import logging +import sys +import os +import json + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(1, 32, 3, 1) + self.conv2 = nn.Conv2d(32, 64, 3, 1) + self.dropout1 = nn.Dropout(0.25) + self.dropout2 = nn.Dropout(0.5) + self.fc1 = nn.Linear(9216, 128) + self.fc2 = nn.Linear(128, 10) + def forward(self, x): + x = self.conv1(x) + x = F.relu(x) + x = self.conv2(x) + x = F.relu(x) + x = F.max_pool2d(x, 2) + x = self.dropout1(x) + x = torch.flatten(x, 1) + x = self.fc1(x) + x = F.relu(x) + x = self.fc2(x) + output = F.log_softmax(x, dim=1) + return output + +class MyMNIST(datasets.MNIST): + ''' + A personalized extension of the MNIST class in which we + modify the __len__ operation to return the maximum value + of int32 so that we do not run out of data. + ''' + + def __init__(self, batch_size : int, iterations : int, **kwargs): + + super().__init__(**kwargs) + self.batch_size = batch_size + self.iterations = iterations + + def __len__(self) -> int: + size = self.batch_size * self.iterations + return size + + def __getitem__(self, index: int): + return super(MyMNIST, self).__getitem__(index % len(self.data)) + +def main(args): + use_cuda = torch.cuda.is_available() + device = torch.device("cuda" if use_cuda else "cpu") + train_kwargs = {'batch_size': args.batch_size, + 'num_workers': args.num_data_workers, + 'pin_memory': args.pin_memory + } + logger.info ('Training job started...') + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)), + transforms.GaussianBlur(11) + ]) + dataset = MyMNIST(batch_size=args.batch_size, iterations=args.iterations, root='./data', train=True, + transform=transform, download=True) + train_loader = torch.utils.data.DataLoader(dataset, + **train_kwargs) + model = Net().to(device) + optimizer = optim.Adadelta(model.parameters()) + model.train() + t = time.perf_counter() + for idx, (data, target) in enumerate(train_loader, start=1): + data, target = data.to(device), target.to(device) + optimizer.zero_grad() + output = model(data) + loss = F.nll_loss(output, target) + loss.backward() + optimizer.step() + if device=='cpu' or idx % 10 == 0: + logger.info( + f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') + logger.info('Training completed!') + save_model(model, args.model_dir) + +def save_model(model, model_dir): + logger.info("Saving the model") + path = os.path.join(model_dir, "model.pth") + torch.save(model.cpu().state_dict(), path) + return + +def read_args(): + import argparse + parser = argparse.ArgumentParser() + + parser.add_argument("--batch-size", type=int, default=4, + help="Input batch size for training",) + parser.add_argument("--iterations", type=int, default=10, + help="Based on no. of cpu per training instance",) + parser.add_argument("--num-data-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance type in data group",) + parser.add_argument("--num-dnn-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance type in dnn group, ideally should match to grpc-workers",) + parser.add_argument("--grpc-workers", type=int, default=1, metavar="N", + help="No. of grpc server workers to start",) + parser.add_argument("--pin-memory", type=bool, default=1, + help="pin to GPU memory (default: True)",) + parser.add_argument("--seed", type=int, default=1, + help="random seed (default: 1)",) + parser.add_argument("--hosts", type=list, default=json.loads(os.environ["SM_HOSTS"])) + parser.add_argument("--current-host", type=str, default=os.environ["SM_CURRENT_HOST"]) + parser.add_argument("--model-dir", type=str, default=os.environ["SM_MODEL_DIR"]) + parser.add_argument("--train", type=str, default=os.environ["SM_CHANNEL_TRAINING"]) + #parser.add_argument("--test", type=str, default=os.environ["SM_CHANNEL_TESTING"]) + parser.add_argument("--num-gpus", type=int, default=os.environ["SM_NUM_GPUS"]) + parser.add_argument("--dispatcher_host", type=str) + return parser.parse_args() + +if __name__ == '__main__': + main(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py new file mode 100644 index 0000000000..9aac87586e --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py @@ -0,0 +1,170 @@ +import multiprocessing as mp +from concurrent import futures + +import grpc +import torch +from torchvision import datasets, transforms + +import dataset_feed_pb2 +import dataset_feed_pb2_grpc +import logging +import sys + +# Logging initialization +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +# The following class implements the data feeding service +class DatasetFeedService(dataset_feed_pb2_grpc.DatasetFeedServicer): + def __init__(self, q, kill_event): + ''' + param q: A shared queue containing data batches + param kill: Kill event for graceful shutdown + ''' + self.q = q + self.kill_event = kill_event + + + def get_examples(self, request, context): + while True: + #print('DEBUG: get_examples') + example = self.q.get() + yield dataset_feed_pb2.Example(image=example[0], + label=example[1]) + + + def shutdown(self, request, context): + logger.info("Received shutdown request - Not implemented") + # from main_grpc_client import shutdown_data_service + # shutdown_data_service() + context.set_code(grpc.StatusCode.OK) + context.set_details('Shutting down') + return dataset_feed_pb2.Dummy() + + +# The data loading and preprocessing logic. +# We chose to keep the existing logic unchanged, just instead +# of feeding the model, the dataloader feeds a shared queue +class MyMNIST(datasets.MNIST): + ''' + A personalized extension of the MNIST class in which we + modify the __len__ operation to return the maximum value + of int32 so that we do not run out of data. + ''' + + def __init__(self, batch_size : int, iterations : int, **kwargs): + + super().__init__(**kwargs) + self.batch_size = batch_size + self.iterations = iterations + + def __len__(self) -> int: + size = self.batch_size * self.iterations + return size + + def __getitem__(self, index: int): + return super(MyMNIST, self).__getitem__(index % len(self.data)) + + +def fill_queue(q,kill, args): + train_kwargs = {'batch_size': args.batch_size, + 'num_workers': args.num_data_workers} + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)), + transforms.GaussianBlur(11) + ]) + dataset = MyMNIST(batch_size=args.batch_size, iterations=args.iterations, root='./data', train=True, + transform=transform, download=True) + loader = torch.utils.data.DataLoader(dataset, **train_kwargs) + for batch_idx, (data, target) in enumerate(loader): + if kill.is_set(): + logger.info('kill signal received, exiting fill_queue') + break + added = False + while not added and not kill.is_set(): + try: + # convert the data to bytestrings and add to queue + q.put((data.numpy().tobytes(), + target.type(torch.int8).numpy().tobytes()), + timeout=1) + #print(f'DEBUG: Added example to queue') + added = True + except: + continue + logger.info('Finished filling queue with dataset.') + + +def start(kill_event, args): + q = mp.Queue(maxsize=32) + queuing_process = mp.Process(target=fill_queue, args=(q, kill_event, args)) + queuing_process.start() + logger.info('Started queuing process.') + + server = grpc.server(futures.ThreadPoolExecutor(max_workers=args.grpc_workers)) + dataset_feed_pb2_grpc.add_DatasetFeedServicer_to_server( + DatasetFeedService(q, kill_event), server) + server.add_insecure_port('[::]:6000') + server.start() + logger.info('gRPC Data Server started at port 6000.') + return queuing_process,server + + +def shutdown(queuing_process, grpc_server): + logger.info('Shutting down...') + logger.info('Stopping gRPC server...') + grpc_server.stop(2).wait() + logger.info('Stopping queuing process...') + queuing_process.join(1) + queuing_process.terminate() + logger.info('Shutdown done.') + import os, time + os.system('kill -9 %d' % os.getpid()) + + +def wait_for_shutdown_signal(): + SHUTDOWN_PORT = 16000 + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', SHUTDOWN_PORT)) + s.listen(1) + logger.info('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) + conn, addr = s.accept() + print('Received shutdown signal from: ', addr) + try: + conn.close() + s.close() + except Exception as e: + logger.info(e) + + +def serve(args): + kill_event = mp.Event() # an mp.Event for graceful shutdown + queue_data_loader_process, grpc_server = start(kill_event, args) + wait_for_shutdown_signal() + kill_event.set() + shutdown(queue_data_loader_process, grpc_server) + +def read_args(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--batch-size", type=int, default=4, metavar="N", + help="input batch size for training",) + parser.add_argument("--num-data-workers", type=int, default=1, metavar="N", + help="based on no. of cpu per training instance",) + parser.add_argument("--num-dnn-workers", type=int, default=1, + help="based on no. of cpu per training instance",) + parser.add_argument("--iterations", type=int, default=10, metavar="N", + help="The number of iterations per epoch (multiply of 10)",) + parser.add_argument("--grpc-workers", type=int, default=1, metavar="N", + help="No. of gRPC server workers",) + parser.add_argument("--pin-memory", type=bool, default=1, + help="pin to GPU memory (default: True)",) + parser.add_argument("--first_data_host", type=str) + args, unknown = parser.parse_known_args() + return args + + +if __name__ == "__main__": + serve(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_dnn.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_dnn.py new file mode 100644 index 0000000000..6dfa6f59f7 --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_dnn.py @@ -0,0 +1,179 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torchvision import datasets, transforms +import time +import grpc +import dataset_feed_pb2_grpc +import dataset_feed_pb2 +import logging +import sys +import json +import os + +#Pass environment variables to detect heterogenous host names +from sagemaker_training import environment + + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + +# Based on https://github.com/pytorch/examples/blob/master/mnist/main.py +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(1, 32, 3, 1) + self.conv2 = nn.Conv2d(32, 64, 3, 1) + self.dropout1 = nn.Dropout(0.25) + self.dropout2 = nn.Dropout(0.5) + self.fc1 = nn.Linear(9216, 128) + self.fc2 = nn.Linear(128, 10) + def forward(self, x): + x = self.conv1(x) + x = F.relu(x) + x = self.conv2(x) + x = F.relu(x) + x = F.max_pool2d(x, 2) + x = self.dropout1(x) + x = torch.flatten(x, 1) + x = self.fc1(x) + x = F.relu(x) + x = self.fc2(x) + output = F.log_softmax(x, dim=1) + return output + + +# Decode binary data from SM_CHANNEL_TRAINING +# Decode and preprocess data +# Create map dataset +class RemoteDataset(torch.utils.data.IterableDataset): + ''' + An iterable PyTorch dataset that opens a connection to the + gRPC server and reads from a stream of data batches + ''' + + def __init__(self, data_host, batch_size, iterations): + self.data_host = data_host + self.batch_size = batch_size + self.iterations = iterations + + + def __len__(self) -> int: + size = self.batch_size * self.iterations + return size + + def get_stub(self): + channel = grpc.insecure_channel(f'{self.data_host}:6000', + # overwrite the default max message length + options=[('grpc.max_receive_message_length', + 200 * 1024 * 1024)]) + + try: + # print('Waiting for gRPC data server to be ready...') + grpc.channel_ready_future(channel).result(timeout=30) + except grpc.FutureTimeoutError: + logger.error('ERROR: Timeout connecting to gRPC data server. Check that it is running.') + raise + #print('Connected to gRPC data server.') + + return dataset_feed_pb2_grpc.DatasetFeedStub(channel,) + + + def __iter__(self): + import numpy as np + + examples = self.get_stub().get_examples(dataset_feed_pb2.Dummy()) + for s in examples: + image = torch.tensor(np.frombuffer(s.image, + dtype=np.float32)).reshape( + [self.batch_size, 1, 28, 28]) + label = torch.tensor(np.frombuffer(s.label, + dtype=np.int8)).reshape( + [self.batch_size]).type(torch.int64) + yield image, label + + + # def shutdown_remote(self): + # print('Calling remote server to shutdown') + # self.get_stub().shutdown(dataset_feed_pb2.Dummy()) + + +def main(args): + logger.info ('Training job started...') + use_cuda = args.num_gpus > 0 + device = torch.device("cuda" if use_cuda > 0 else "cpu") + + torch.manual_seed(args.seed) + if use_cuda: + torch.cuda.manual_seed(args.seed) + + train_kwargs = {'batch_size': None, #the data is already batched + 'num_workers': args.num_dnn_workers, + 'pin_memory': args.pin_memory + } + + dataset = RemoteDataset(args.dispatcher_host, args.batch_size, args.iterations) + train_loader = torch.utils.data.DataLoader(dataset, + **train_kwargs) + model = Net().to(device) + optimizer = optim.Adadelta(model.parameters()) + model.train() + t = time.perf_counter() + for idx, (data, target) in enumerate(train_loader, start=1): + data, target = data.to(device), target.to(device) + optimizer.zero_grad() + output = model(data) + loss = F.nll_loss(output, target) + loss.backward() + optimizer.step() + if device.type == 'cpu' or idx % 10 == 0: + logger.info( + f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') + + # TODO: exit the loop through the iterator stopping by itself + if idx*args.batch_size==(dataset.__len__()): + break + + save_model(model, args.model_dir) + logger.info ('Training job completed!') + + +def save_model(model, model_dir): + logger.info("Saving the model") + path = os.path.join(model_dir, "model.pth") + torch.save(model.cpu().state_dict(), path) + return + + +def read_args(): + import argparse + parser = argparse.ArgumentParser() + + parser.add_argument("--batch-size", type=int, default=4, + help="Input batch size for training",) + parser.add_argument("--iterations", type=int, default=10, + help="Based on no. of cpu per training instance",) + parser.add_argument("--num-data-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance type in data group",) + parser.add_argument("--num-dnn-workers", type=int, default=1, metavar="N", + help="Based on no. of cpu per training instance type in dnn group, ideally should match to grpc-workers",) + parser.add_argument("--grpc-workers", type=int, default=1, metavar="N", + help="No. of grpc server workers to start",) + parser.add_argument("--pin-memory", type=bool, default=1, + help="pin to GPU memory (default: True)",) + parser.add_argument("--seed", type=int, default=1, + help="random seed (default: 1)",) + parser.add_argument("--hosts", type=list, default=json.loads(os.environ["SM_HOSTS"])) + parser.add_argument("--current-host", type=str, default=os.environ["SM_CURRENT_HOST"]) + parser.add_argument("--model-dir", type=str, default=os.environ["SM_MODEL_DIR"]) + parser.add_argument("--train", type=str, default=os.environ["SM_CHANNEL_TRAINING"]) + #parser.add_argument("--test", type=str, default=os.environ["SM_CHANNEL_TESTING"]) + parser.add_argument("--num-gpus", type=int, default=os.environ["SM_NUM_GPUS"]) + parser.add_argument("--dispatcher_host", type=str) + return parser.parse_args() + + +if __name__ == '__main__': + main(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb new file mode 100644 index 0000000000..7eeeeb82ea --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -0,0 +1,600 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d1aa7aed", + "metadata": {}, + "source": [ + "## PyTorch example to demonstrate Amazon SageMaker Heterogeneous Cluster for model training\n", + "\n", + "---\n", + "### Description\n", + "Heterogeneous clusters enables launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottlnecked on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters allows you to add more CPU resources to fully utilize GPUs increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", + "\n", + "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch 1.10. The notebook works on Python 3 (_Pytorch 1.10 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", + "\n", + "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/mnist). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Homogeneous training job
\n", + " We first run the homogeneous training job to get baseline performance number, and observe that it is unable to fully utilize GPU of ml.p3.2xlarge instance due to a CPU being the bottleneck.
Heterogeneous training job
\n", + " Then we'll switch to a heterogeneous training job where we'll add ml.c5.9xlarge instance for extra CPU cores, to allow increased GPU usage of ml.p3.2xlarge instance, and improve cost-efficiency. Both the jobs runs the training code, train data set, pre-processing, and other relevant parameters.\n", + "
\"homogeneous-training \"heterogeneous-training
\n", + "\n", + "In homogeneous cluster training job, the data pre-processing and Deep Neural Network (DNN) training code runs on the same instance. However, in heterogeneous cluster training job, the data pre-processing code runs on the CPU nodes (here by referred as **data_group or data group**), whereas the Deep Neural Network (DNN) training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). The inter-node communication between the data and dnn groups is handled by generic implementation of [gRPC client-server interface](https://grpc.io/docs/languages/python/basics/).  \n", + "\n", + "The script (`launcher.py`) has the logic to detect (using SageMaker environment variables) whether the node it is running on belongs to data_group or dnn_group. If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs grpc-server service for extracting processed training batches using [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview). The gRPC server running on the data_group listens on a specific port (ex. 6000). In the code (`train_data.py`) documentation, we have chosen an implementation that keeps the data loading logic intact  where data batches are entered into a shared queue. The `get_samples` function of the `DataFeedService` pulls batches from the same queue and sends them to the client in the form of a continuous data stream. While fetching the data, the main entrypoint script `launcher.py` listens on port 16000 for a shutdown request coming from gRPC client i.e data group. The `train_data.py` waits for shutdown action from the parent process. \n", + "\n", + "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. The script runs gRPC client code and DNN component of the training job. It consumes the processed training data from the gRPC server. We have defined an iterable PyTorch dataset, RemoteDataset, that opens a connection to the gRPC server, and reads from a stream of data batches. Once the model is trained with all the batches of training data, the gRPC client exits, and the parent process`launcher.py` sends a shutdown request on port 16000. This indicates the gRPC server to shutdown, and signals ends of the training job. \n", + "\n", + "Here is how the workflow looks like:\n", + "\n", + "\n", + "\n", + "This example notebook runs a training job on 2 instances, 1 in each node group. The data_group uses ml.c5.9xlarge whereas dnn_group uses ml.p3.2xlarge.\n", + "\n", + "This notebook refers following files and folders:\n", + "\n", + "- Folders: \n", + "  - `code`: this has the training (data pre-processing and dnn) scripts, and grpc client-server start and shutdown scripts\n", + "  - `images`: contains images referred in notebook\n", + "- Files: \n", + "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. This is a parent process that makes a decision on where to spawn a data pre-processing or dnn component of the training job. The script runs on all the nodes as entrypoint. It also handles the shutdown logic for gRPC server. \n", + "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shutdown.\n", + "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shutdown request after all the iterations on the preprocessed training data set. \n", + "  - `requirement.txt`: defines package required for gRPC \n", + "  - `train.py`: this script is the entrypoint script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. \n", + "\n", + "At a high level, the notebook covers:\n", + "-  Setting up SageMaker Studio Notebook \n", + "-  Setting up the Training environment \n", + "-  Submit a Training job\n", + "-  Monitor and visualize the CloudWatch metrics\n", + "-  Comparing time-to-train and cost-to-train\n", + "-  Conclusion \n", + "---\n" + ] + }, + { + "cell_type": "markdown", + "id": "2ee8683b", + "metadata": {}, + "source": [ + "### A. Setting up SageMaker Studio notebook\n", + "\n", + "#### Step 1 - Upgrade SageMaker SDK and dependent packages \n", + "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. As a first step, ensure you have updated SageMaker SDK, PyTorch, and Boto3 client that enables this feature." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f2ea0231", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (1.24.57)\n", + "Collecting boto3\n", + " Downloading boto3-1.24.67-py3-none-any.whl (132 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 KB 2.6 MB/s eta 0:00:00\n", + "Requirement already satisfied: botocore in /opt/conda/lib/python3.8/site-packages (1.27.57)\n", + "Collecting botocore\n", + " Downloading botocore-1.27.67-py3-none-any.whl (9.1 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 43.4 MB/s eta 0:00:00\n", + "Requirement already satisfied: awscli in /opt/conda/lib/python3.8/site-packages (1.25.58)\n", + "Collecting awscli\n", + " Downloading awscli-1.25.68-py3-none-any.whl (3.9 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 29.5 MB/s eta 0:00:00\n", + "Requirement already satisfied: sagemaker in /opt/conda/lib/python3.8/site-packages (2.105.0)\n", + "Collecting sagemaker\n", + " Downloading sagemaker-2.108.0.tar.gz (570 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 570.8/570.8 KB 10.2 MB/s eta 0:00:00\n", + " Preparing metadata (setup.py): started\n", + " Preparing metadata (setup.py): finished with status 'done'\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3) (0.10.0)\n", + "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from boto3) (0.6.0)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /opt/conda/lib/python3.8/site-packages (from botocore) (2.8.2)\n", + "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /opt/conda/lib/python3.8/site-packages (from botocore) (1.26.8)\n", + "Requirement already satisfied: PyYAML<5.5,>=3.10 in /opt/conda/lib/python3.8/site-packages (from awscli) (5.4.1)\n", + "Requirement already satisfied: docutils<0.17,>=0.10 in /opt/conda/lib/python3.8/site-packages (from awscli) (0.15.2)\n", + "Requirement already satisfied: rsa<4.8,>=3.1.2 in /opt/conda/lib/python3.8/site-packages (from awscli) (4.7.2)\n", + "Requirement already satisfied: colorama<0.4.5,>=0.2.5 in /opt/conda/lib/python3.8/site-packages (from awscli) (0.4.3)\n", + "Requirement already satisfied: attrs<22,>=20.3.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (20.3.0)\n", + "Requirement already satisfied: google-pasta in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.2.0)\n", + "Requirement already satisfied: numpy<2.0,>=1.9.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.22.2)\n", + "Requirement already satisfied: protobuf<4.0,>=3.1 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (3.19.4)\n", + "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.1.5)\n", + "Requirement already satisfied: smdebug_rulesconfig==1.0.1 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.0.1)\n", + "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (4.11.2)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (21.3)\n", + "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.4.1)\n", + "Requirement already satisfied: pathos in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.2.8)\n", + "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.8/site-packages (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.7.0)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->sagemaker) (3.0.7)\n", + "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.16.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.8/site-packages (from pandas->sagemaker) (2021.3)\n", + "Requirement already satisfied: ppft>=1.6.6.4 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (1.6.6.4)\n", + "Requirement already satisfied: dill>=0.3.4 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.4)\n", + "Requirement already satisfied: multiprocess>=0.70.12 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.70.12.2)\n", + "Requirement already satisfied: pox>=0.3.0 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.0)\n", + "Building wheels for collected packages: sagemaker\n", + " Building wheel for sagemaker (setup.py): started\n", + " Building wheel for sagemaker (setup.py): finished with status 'done'\n", + " Created wheel for sagemaker: filename=sagemaker-2.108.0-py2.py3-none-any.whl size=786331 sha256=fe95ef1e4aab67aea5034a83a74adaa6f6747bc8164fc38b4e6d9990ebce1d32\n", + " Stored in directory: /root/.cache/pip/wheels/bb/75/06/f38724fada04c5134e60627d70b76061fda548bab05ce6711a\n", + "Successfully built sagemaker\n", + "Installing collected packages: botocore, boto3, awscli, sagemaker\n", + " Attempting uninstall: botocore\n", + " Found existing installation: botocore 1.27.57\n", + " Uninstalling botocore-1.27.57:\n", + " Successfully uninstalled botocore-1.27.57\n", + " Attempting uninstall: boto3\n", + " Found existing installation: boto3 1.24.57\n", + " Uninstalling boto3-1.24.57:\n", + " Successfully uninstalled boto3-1.24.57\n", + " Attempting uninstall: awscli\n", + " Found existing installation: awscli 1.25.58\n", + " Uninstalling awscli-1.25.58:\n", + " Successfully uninstalled awscli-1.25.58\n", + " Attempting uninstall: sagemaker\n", + " Found existing installation: sagemaker 2.105.0\n", + " Uninstalling sagemaker-2.105.0:\n", + " Successfully uninstalled sagemaker-2.105.0\n", + "Successfully installed awscli-1.25.68 boto3-1.24.67 botocore-1.27.67 sagemaker-2.108.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: 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\n" + ] + } + ], + "source": [ + "%%bash\n", + "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" + ] + }, + { + "cell_type": "markdown", + "id": "80c24d24", + "metadata": {}, + "source": [ + "#### Step 2 - Restart the notebook kernel \n", + "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + ] + }, + { + "cell_type": "markdown", + "id": "e28916a3", + "metadata": {}, + "source": [ + "#### Step 3 - Valdiate SageMaker Python SDK and PyTorch versions\n", + "Ensure the output of the cell below reflects:\n", + "\n", + "- SageMaker Python SDK version 2.98.0 or above, \n", + "- boto3 1.24 or above \n", + "- botocore 1.27 or above \n", + "- PyTorch 1.10 or above " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "115cf0b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: sagemaker\n", + "Version: 2.108.0\n", + "---\n", + "Name: torch\n", + "Version: 1.10.2+cpu\n", + "---\n", + "Name: boto3\n", + "Version: 1.24.67\n", + "---\n", + "Name: botocore\n", + "Version: 1.27.67\n" + ] + } + ], + "source": [ + "!pip show sagemaker torch boto3 botocore |egrep 'Name|Version|---'" + ] + }, + { + "cell_type": "markdown", + "id": "2a1d9f4e", + "metadata": {}, + "source": [ + "--------------\n", + "### B. Setting up the Training environment\n", + "\n", + "#### Step 1 - Import SageMaker components and setup the IAM role and Amazon S3 bucket" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e51da09f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "arn:aws:iam::776941257690:role/service-role/AmazonSageMakerServiceCatalogProductsUseRole\n", + "s3://sagemaker-us-east-1-776941257690/DEMO-mnist\n" + ] + } + ], + "source": [ + "import os\n", + "import json\n", + "import datetime\n", + "import os\n", + "\n", + "import sagemaker\n", + "from sagemaker.pytorch import PyTorch\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.instance_group import InstanceGroup\n", + "\n", + "\n", + "sess = sagemaker.Session()\n", + "\n", + "role = get_execution_role()\n", + "\n", + "output_path = \"s3://\" + sess.default_bucket() + \"/DEMO-mnist\"\n", + "print(role)\n", + "print(output_path)" + ] + }, + { + "cell_type": "markdown", + "id": "14b05e37", + "metadata": {}, + "source": [ + "#### Step 2 - Configure environment variables \n", + "This step defines whether you want to run training job in heterogenous cluster mode or not. Also, defines instance groups, multiple nodes in group, and hyperparameter values. For baselining, if you want to run both the data pre-processing and DNN on the same node set `IS_HETERO = False`. \n", + "\n", + "\n", + "Test configuration (if running training on p3.2xl or g5.2xl as dnn_group instance type, and c5.2xl as data_group instance type: (training duration: 7-8 mins) \n", + "`num-data-workers: 4` \n", + "`grpc-workers: 4` \n", + "`num-dnn-workers: 4` \n", + "`pin-memory\": True` \n", + "`iterations : 100` \n", + "\n", + "Perf configuration (if running training on p3.2xl as dnn_group instance type, and c5.9xl as data_group instance type OR training in homogeneous cluster mode i.e. g5.8xl): (training duration - 30 mins) \n", + "`num-data-workers: 32` \n", + "`grpc-workers: 2` \n", + "`num-dnn-workers: 2` \n", + "`pin-memory\": True` \n", + "`iterations : 4800`\n", + "\n", + "Perf configuration (if running training on p3.2xl in homogeneous cluster mode): \n", + "`num-data-workers: 8` \n", + "`grpc-workers: 2` \n", + "`num-dnn-workers: 2` \n", + "`pin-memory\": True` \n", + "`iterations : 2400`\n", + "\n", + "Note: This PyTorch example has not been tested with multiple instances in an instance group. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b964a650", + "metadata": {}, + "outputs": [], + "source": [ + "IS_CLOUD_JOB = True\n", + "IS_HETERO = True # if set to false, uses homogeneous cluster\n", + "PT_DATA_MODE = \"service\" if IS_HETERO else \"local\" # local | service\n", + "IS_DNN_DISTRIBUTION = False # Distributed Training with DNN nodes not tested, set it to False\n", + "\n", + "data_group = InstanceGroup(\n", + " \"data_group\", \"ml.c5.9xlarge\", 1\n", + ") # 36 vCPU #change the instance type if IS_HETERO=True\n", + "dnn_group = InstanceGroup(\n", + " \"dnn_group\", \"ml.p3.2xlarge\", 1\n", + ") # 8 vCPU #change the instance type if IS_HETERO=True\n", + "\n", + "kwargs = dict()\n", + "kwargs[\"hyperparameters\"] = {\n", + " \"batch-size\": 8192,\n", + " \"num-data-workers\": 4, # This number drives the avg. step time. More workers help parallel pre-processing of data. Recommendation: Total no. of cpu 'n' = 'num-data-wokers'+'grpc-workers'+ 2 (reserved)\n", + " \"grpc-workers\": 4, # No. of workers serving pre-processed data to DNN group (gRPC client). see above formula.\n", + " \"num-dnn-workers\": 4, # Modify this no. to be less than the cpu core of your training instances in dnn group\n", + " \"pin-memory\": True, # Pin to GPU memory\n", + " \"iterations\": 100, # No. of iterations in an epoch (must be multiple of 10).\n", + "}\n", + "\n", + "if IS_HETERO:\n", + " kwargs[\"instance_groups\"] = [data_group, dnn_group]\n", + " entry_point = \"launcher.py\"\n", + "else:\n", + " kwargs[\"instance_type\"] = (\n", + " \"ml.p3.2xlarge\" if IS_CLOUD_JOB else \"local\"\n", + " ) # change the instance type if IS_HETERO=False\n", + " kwargs[\"instance_count\"] = 1\n", + " entry_point = \"train.py\"\n", + "\n", + "if IS_DNN_DISTRIBUTION:\n", + " processes_per_host_dict = {\n", + " \"ml.g5.xlarge\": 1,\n", + " \"ml.g5.12xlarge\": 4,\n", + " \"ml.p3.8xlarge\": 4,\n", + " \"ml.p4d.24xlarge\": 8,\n", + " }\n", + " kwargs[\"distribution\"] = {\n", + " \"mpi\": {\n", + " \"enabled\": True,\n", + " \"processes_per_host\": processes_per_host_dict[dnn_instance_type],\n", + " \"custom_mpi_options\": \"--NCCL_DEBUG INFO\",\n", + " },\n", + " }\n", + " if IS_HETERO:\n", + " kwargs[\"distribution\"][\"instance_groups\"] = [dnn_group]\n", + "\n", + " print(f\"distribution={kwargs['distribution']}\")" + ] + }, + { + "cell_type": "markdown", + "id": "485679d2", + "metadata": {}, + "source": [ + "#### Step 3: Set up the Estimator\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "be4246c0", + "metadata": {}, + "outputs": [], + "source": [ + "estimator = PyTorch(\n", + " framework_version=\"1.11.0\", # 1.10.0 or later\n", + " py_version=\"py38\", # Python v3.8\n", + " role=role,\n", + " entry_point=entry_point,\n", + " source_dir=\"code\",\n", + " volume_size=10,\n", + " max_run=4800,\n", + " disable_profiler=True,\n", + " debugger_hook_config=False,\n", + " **kwargs,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "e38626e9", + "metadata": {}, + "source": [ + "#### Step 4: Download the MNIST Data and Upload it to S3 bucket\n", + "\n", + "This is an optional step for now. The training job downloads the data on its run directly from MNIST website to the data_group node (grpc server). " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "729a0f0f", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import boto3\n", + "from botocore.exceptions import ClientError\n", + "\n", + "# Download training and testing data from a public S3 bucket\n", + "\n", + "\n", + "def download_from_s3(data_dir=\"./data\", train=True):\n", + " \"\"\"Download MNIST dataset and convert it to numpy array\n", + "\n", + " Args:\n", + " data_dir (str): directory to save the data\n", + " train (bool): download training set\n", + "\n", + " Returns:\n", + " None\n", + " \"\"\"\n", + "\n", + " if not os.path.exists(data_dir):\n", + " os.makedirs(data_dir)\n", + "\n", + " if train:\n", + " images_file = \"train-images-idx3-ubyte.gz\"\n", + " labels_file = \"train-labels-idx1-ubyte.gz\"\n", + " else:\n", + " images_file = \"t10k-images-idx3-ubyte.gz\"\n", + " labels_file = \"t10k-labels-idx1-ubyte.gz\"\n", + "\n", + " # download objects\n", + " s3 = boto3.client(\"s3\")\n", + " bucket = f\"sagemaker-sample-files\"\n", + " for obj in [images_file, labels_file]:\n", + " key = os.path.join(\"datasets/image/MNIST\", obj)\n", + " dest = os.path.join(data_dir, obj)\n", + " if not os.path.exists(dest):\n", + " s3.download_file(bucket, key, dest)\n", + " return\n", + "\n", + "\n", + "download_from_s3(\"./data\", True)\n", + "download_from_s3(\"./data\", False)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e90ea016", + "metadata": {}, + "outputs": [], + "source": [ + "# Upload to the default bucket\n", + "\n", + "prefix = \"DEMO-mnist\"\n", + "bucket = sess.default_bucket()\n", + "loc = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", + "\n", + "channels = {\"training\": loc, \"testing\": loc}" + ] + }, + { + "cell_type": "markdown", + "id": "b4b01926", + "metadata": {}, + "source": [ + "## C. Submit the training job\n", + "\n", + "The job runs for the predefined iterations. DNN instance group sends a shutdown request to data group after done with the training. You can see the following entries in the cloudwatch logs of dnn instance. A job with 4800 iterations finishes in 29 mins in a Heterogeneous cluster composed of 1x ml.c5.9xlarge as data node and 1x ml.p3.2xlarge as DNN node.\n", + "\n", + "Note: The console output of billing seconds can be ignored. See the AWS console > SageMaker > Training Job for the exact billing seconds.\n", + "\n", + "Log excerpt from algo-1 (DNN instance)\n", + "```\n", + "4780: avg step time: 0.19709917231025106\n", + "INFO:__main__:4780: avg step time: 0.19709917231025106\n", + "4790: avg step time: 0.19694106239373696\n", + "INFO:__main__:4790: avg step time: 0.19694106239373696\n", + "4800: avg step time: 0.196784295383125\n", + "Saving the model\n", + "INFO:__main__:4800: avg step time: 0.196784295383125\n", + "INFO:__main__:Saving the model\n", + "Training job completed!\n", + "INFO:__main__:Training job completed!\n", + "Process train_dnn.py closed with returncode=0\n", + "Shutting down data service dispatcher via: [algo-2:16000]\n", + "Shutdown request sent to algo-2:16000\n", + "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-08-16 01:15:05,556 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ce424c23", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-07 08:20:50 Starting - Starting the training job...\n", + "2022-09-07 08:21:20 Starting - Preparing the instances for training..........................................................................................\n", + "2022-09-07 08:35:54 Downloading - Downloading input data...\n", + "2022-09-07 08:36:29 Training - Downloading the training image.....................\n", + "2022-09-07 08:40:06 Training - Training image download completed. Training in progress.......\n", + "2022-09-07 08:41:16 Uploading - Uploading generated training model...\n", + "2022-09-07 08:41:27 Completed - Training job completed\n", + "..Training seconds: 0\n", + "Billable seconds: 0\n" + ] + } + ], + "source": [ + "estimator.fit(\n", + " inputs=channels,\n", + " job_name=\"pt-hetero\"\n", + " + \"-\"\n", + " + \"H-\"\n", + " + str(IS_HETERO)[0]\n", + " + \"-\"\n", + " + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "be2bd225", + "metadata": {}, + "source": [ + "## D. Monitoring Instance Metrics for GPU and CPU utilization\n", + "\n", + "Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. In the run above, all 30 vCPU of Data node (algo-1) is approx. 100% utilized, and the GPU utilization is at 100% at frequent intervals in the DNN node (algo-2). To rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of cores on those instance types.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "16ef4995", + "metadata": {}, + "source": [ + "## E. Comparing time-to-train and cost-to-train\n", + "\n", + "Let's continue with the above example i.e. train a heavy data pre-processing (CPU intensive) model (mnist) requiring only 1 GPU. We start with ml.p3.2xlarge (1xV100 GPU, 8x vCPU) in homogeneous cluster mode to get the baseline perf numbers. Due to the no. of CPU cores, we could not go beyond 8 data loader/workers for data pre-processing. The avg. step cost was `7.6 cents` and avg. step time is `1.19 seconds`. \n", + "\n", + "Our objective is to reduce the cost and speed up the model training time. The first choice here is to scale up the instance type in the same family. If we leverage the next instance type (4 GPU) in the P3 family, the GPUs would have gone underutilized. In this case, we needed more vCPU to GPU ratio. Assuming we haven't had any instance type in another instance family or the model is incompatible with the CPU/GPU architectures of other instance families, we are constrained to use ml.p3.2xlarge. The only way then to have more vCPUs to GPU ratio is to use SageMaker feature, Heterogeneous Cluster, which enables customers to offload data pre-processing logic to CPU only instance types example ml.c5. In the next test, we offloaded CPU intensive work i.e data preprocessing to ml.c5.9xlarge (36 vCPU) and continued using ml.p3.2xlarge for DNN. The avg. step cost was `1.9 cents` and avg. step time is `0.18 seconds`. \n", + "\n", + "In summary, we reduced the training cost by 4.75 times, and the avg. step reduced by 6.5 times. This was possible because with higher cpu count, we could use 32 data loader workers (compared to 8 with p3.2xl) to preprocess the data, and kept GPU close to 100% utilized at frequent intervals. Note: These numbers are just taken as a sample, you have to do benchmarking with your own model and dataset to come up with the exact price-performance benefits. \n", + "\n", + "## F. Conclusion\n", + "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training to achieve better price performance. This feature best fits for scenario where: 1/ your training job is CPU intensive and getting bottlenecked by the fixed vCPU count of an accelerated computing instance type, 2/ your training script can be decoupled - data preprocessing and deep neural network components. 3/ scaling up to next instance type within the same family is not price-performant due to underutilized GPUs, 4/ if cannot scale up, scaling out to a same instance type leads to underutlized GPUs\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7eee5027", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3.9.7 ('.venv': venv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "vscode": { + "interpreter": { + "hash": "77c0de85c2cb739aa5100af7b92fb9d2075368f0e653f4148499a56c989df5f7" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-cluster-diagram.png b/training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-cluster-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c84c185d31391b8c7db2d0236dee6f50bea526c3 GIT binary patch literal 31604 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 JT-f02{{wO;rP}}i literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-instance-metrics.png b/training/heterogeneous-clusters/pt.grpc.sagemaker/images/heterogeneous-instance-metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..d812e2f46b5c3495ae98daa48d5acd33150426d6 GIT binary patch literal 55343 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/images/homogeneous-cluster-diagram.png b/training/heterogeneous-clusters/pt.grpc.sagemaker/images/homogeneous-cluster-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3119d4b62034144e9fc4b2b8e6a31773f8d98e GIT binary patch literal 18353 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/images/pytorch-heterogeneous-workflow.png b/training/heterogeneous-clusters/pt.grpc.sagemaker/images/pytorch-heterogeneous-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..c40b09aeed955e8eeda6d3ccad5348481a5f2d67 GIT binary patch literal 64269 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py new file mode 100644 index 0000000000..fd723c891e --- /dev/null +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py @@ -0,0 +1,91 @@ +import os +import json +import datetime +import os + +import sagemaker +from sagemaker.pytorch import PyTorch +from sagemaker.instance_group import InstanceGroup +from sagemaker.inputs import TrainingInput + +S3_BUCKET_DATASET='sagemaker-us-east-1-776941257690' + +IS_CLOUD_JOB = True +IS_HETRO = True +TF_DATA_MODE = 'service' if IS_HETRO else 'local' # local | service +IS_DNN_DISTRIBUTION = False + +REGION = 'us-east-1' +os.environ["AWS_DEFAULT_REGION"] = REGION + +IS_CLOUD_JOB = True +IS_HETERO = True # if set to false, uses homogenous cluster +PT_DATA_MODE = 'service' if IS_HETERO else 'local' # local | service +IS_DNN_DISTRIBUTION = False # Distributed Training with DNN nodes not tested, set it to False + +data_group = InstanceGroup("data_group", "ml.c5.9xlarge", 1) #36 vCPU #change the instance type if IS_HETERO=True +dnn_group = InstanceGroup("dnn_group", "ml.p3.2xlarge", 1) #8 vCPU #change the instance type if IS_HETERO=True + +kwargs = dict() +kwargs['hyperparameters'] = { + "batch-size": 8192, + "num-data-workers": 32, # This number drives the avg. step time. More workers help parallel pre-processing of data. Recommendation: Total no. of cpu 'n' = 'num-data-wokers'+'grpc-workers'+ 2 (reserved) + "grpc-workers": 2, # No. of workers serving pre-processed data to DNN group (gRPC client). see above formula. + "num-dnn-workers": 2, # Modify this no. to be less than the cpu core of your training instances in dnn group + "pin-memory": True, # Pin to GPU memory + 'iterations' : 100 # No. of iterations in an epoch (must be multiple of 10). +} + +if IS_HETERO: + kwargs['instance_groups'] = [data_group, dnn_group] + entry_point='launcher.py' +else: + kwargs['instance_type'] = 'ml.p3.2xlarge' if IS_CLOUD_JOB else 'local' #change the instance type if IS_HETERO=False + kwargs['instance_count'] = 1 + entry_point='train.py' + +if IS_DNN_DISTRIBUTION: + processes_per_host_dict = { + 'ml.g5.xlarge' : 1, + 'ml.g5.12xlarge' : 4, + 'ml.p3.8xlarge' : 4, + 'ml.p4d.24xlarge' : 8, + } + kwargs['distribution'] = { + 'mpi': { + 'enabled': True, + 'processes_per_host': processes_per_host_dict[dnn_instance_type], + 'custom_mpi_options': '--NCCL_DEBUG INFO' + }, + } + if IS_HETERO: + kwargs['distribution']['instance_groups'] = [dnn_group] + + print(f"distribution={kwargs['distribution']}") + +estimator = PyTorch( + framework_version='1.11.0', # 1.10.0 or later + py_version='py38', # Python v3.8 + role='arn:aws:iam::776941257690:role/service-role/AmazonSageMakerServiceCatalogProductsUseRole', + entry_point=entry_point, + source_dir='code', + volume_size=10, + max_run=4800, + disable_profiler=True, + debugger_hook_config=False, + **kwargs, +) + +s3_input = TrainingInput( + 's3://'+S3_BUCKET_DATASET+'/cifar10-tfrecord/', + #instance_groups=['data_group'], # this training channel is created only in data_group instances (i.e., not in dnn_group instance) + input_mode='FastFile', + ) + +data_uri = s3_input if IS_CLOUD_JOB else 'file://./data/' +estimator.fit( + inputs=data_uri, + job_name='pt-heterogenous' + + '-' + 'H-' + str(IS_HETRO)[0] + + '-' + datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ"), +) diff --git a/training/heterogeneous-clusters/tf.data.service.local/README.md b/training/heterogeneous-clusters/tf.data.service.local/README.md new file mode 100644 index 0000000000..0834ef9121 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.local/README.md @@ -0,0 +1,53 @@ +# tf.data.service - running locally +This example runs the tf.data.service locally on your machine (not on SageMaker). This will help you understand how tf.data.service dispatcher, worker and client work. + +## setup +Open bash and navigate to `./tf.data.service.local` +```bash +cd ./tf.data.service.local +``` + +Install requirements: +```bash +pip install -r requirements.txt +``` + +Let's generate some data to train over: +```bash +python3 ./generate_cifar10_tfrecords.py --data-dir ./data +rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.1.tfrecords ./data/ && cp data.old/train/train.2.tfrecords ./data/ && mv data.old /tmp +``` +## Running without tf.data.service +First lets run a single training process that handles both data augmentation and NN optimization: +```bash +python3 ./train.py --mode local --sm-model-dir /tmp +``` +Expected output: +``` +Running in local mode +1/1 [==============================] - 33s 33s/step - loss: 3.9110 +``` +## Running with tf.data.service +Now let's run the same trianing job in two process utilizing tf.data.service. + +We first run the tf.data.service dispatcher and worker processes which will handle some of the heavy data augmentation tasks: +```bash +python3 ./run-dispatcher-and-worker.py +``` +Expected output: +``` +2022-06-28 18:10:50.337939: I tensorflow/core/data/service/server_lib.cc:64] Started tf.data DispatchServer running at 0.0.0.0:6000 +2022-06-28 18:10:50.350973: I tensorflow/core/data/service/worker_impl.cc:148] Worker registered with dispatcher running at localhost:6000 +2022-06-28 18:10:50.351535: I tensorflow/core/data/service/server_lib.cc:64] Started tf.data WorkerServer running at 0.0.0.0:6001 +``` +Now let's launch the NN training script which will connect to the dispatcher to consume its data.source +```bash +python3 ./train.py --mode service --sm-model-dir /tmp +``` +Expected output: +``` +Running in service mode +1/1 [==============================] - 34s 34s/step - loss: 3.9806 +``` +Done. +Next see [**TensorFlow's tf.data.service with Amazon SageMaker Training Heterogeneous Clusters**](../tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py b/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py new file mode 100755 index 0000000000..a7c78ecc37 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py @@ -0,0 +1,132 @@ +# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# A copy of the License is located at +# +# https://aws.amazon.com/apache-2-0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +import argparse +import os +import sys +import tarfile + +import tensorflow as tf +from six.moves import cPickle as pickle +from six.moves import xrange # pylint: disable=redefined-builtin + +# import tensorflow_datasets as tfds + +CIFAR_FILENAME = "cifar-10-python.tar.gz" +CIFAR_DOWNLOAD_URL = "https://www.cs.toronto.edu/~kriz/" + CIFAR_FILENAME +CIFAR_LOCAL_FOLDER = "cifar-10-batches-py" + + +def download_and_extract(data_dir): + import tensorflow_datasets as tfds + + dm = tfds.download.DownloadManager(download_dir=data_dir + "/tmp") + extract_dir = dm.download_and_extract(CIFAR_DOWNLOAD_URL) + + return extract_dir + + +def _int64_feature(value): + return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) + + +def _bytes_feature(value): + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) + + +def _get_file_names(): + """Returns the file names expected to exist in the input_dir.""" + file_names = {} + file_names["train"] = ["data_batch_%d" % i for i in xrange(1, 5)] + file_names["validation"] = ["data_batch_5"] + file_names["eval"] = ["test_batch"] + return file_names + + +def read_pickle_from_file(filename): + # with open(filename, 'rb') as f: + with tf.io.gfile.GFile(filename, "rb") as f: + if sys.version_info >= (3, 0): + data_dict = pickle.load(f, encoding="bytes") + else: + data_dict = pickle.load(f) + return data_dict + + +def convert_to_tfrecord(input_files, output_file): + """Converts a file to TFRecords.""" + print("Generating %s" % output_file) + with tf.io.TFRecordWriter(output_file) as record_writer: + for input_file in input_files: + data_dict = read_pickle_from_file(input_file) + data = data_dict[b"data"] + labels = data_dict[b"labels"] + + num_entries_in_batch = len(labels) + for i in range(num_entries_in_batch): + example = tf.train.Example( + features=tf.train.Features( + feature={ + "image": _bytes_feature(data[i].tobytes()), + "label": _int64_feature(labels[i]), + } + ) + ) + record_writer.write(example.SerializeToString()) + + +def install_dependencies(): + from subprocess import call + + call(["pip", "install", "--upgrade", "pip"]) + call(["pip", "install", "tensorflow_datasets==4.1.0"]) + + +def main(data_dir): + print("Download from {} and extract.".format(CIFAR_DOWNLOAD_URL)) + + extract_dir = download_and_extract(data_dir) + file_names = _get_file_names() + input_dir = os.path.join(extract_dir, CIFAR_LOCAL_FOLDER) + + for mode, files in file_names.items(): + input_files = [os.path.join(input_dir, f) for f in files] + output_file = os.path.join(data_dir + "/" + mode, mode + ".tfrecords") + if not os.path.exists(data_dir + "/" + mode): + os.makedirs(data_dir + "/" + mode) + try: + os.remove(output_file) + except OSError: + pass + # Convert to tf.train.Example and write the to TFRecords. + convert_to_tfrecord(input_files, output_file) + print("Done!") + import shutil + + shutil.rmtree(data_dir + "/tmp") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--data-dir", + type=str, + default="./data", + help="Directory to download and extract CIFAR-10 to.", + ) + + args = parser.parse_args() + + install_dependencies() + + main(args.data_dir) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/requirements.txt b/training/heterogeneous-clusters/tf.data.service.local/requirements.txt new file mode 100644 index 0000000000..a28cb240dd --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.local/requirements.txt @@ -0,0 +1,3 @@ +tensorflow==2.8.0 +protobuf==3.20.1 +tensorflow-addons==0.17.0 \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py b/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py new file mode 100644 index 0000000000..a1edf291bf --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py @@ -0,0 +1,68 @@ +from tensorflow.data.experimental.service import DispatchServer, WorkerServer, DispatcherConfig, WorkerConfig + +def wait_for_shutdown_signal(dispatcher, workers): + SHUTDOWN_PORT = 16000 + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', SHUTDOWN_PORT)) + s.listen(1) + print('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) + conn, addr = s.accept() + print('Received shutdown signal from: ', addr) + try: + conn.close() + s.close() + except Exception as e: + print(e) + + if dispatcher is not None: + print('Stopping dispatcher.') + dispatcher._stop() + print('Joining dispatcher') + dispatcher.join() + + for i,worker in enumerate(workers, start=0): + print(f'Stopping worker {i}') + worker._stop() + print(f'Joining worker {i}') + worker.join() + +def create_worker(workerIndex : int, dispatcher_host : str, current_host : str) -> WorkerServer: + port = 6001 + workerIndex + w_config = WorkerConfig(port=port, + dispatcher_address=f'{dispatcher_host}:6000', + worker_address=f'{current_host}:{port}') + print(f'Starting tf.data.service WorkerServer {w_config}') + worker = WorkerServer(w_config) + return worker + +def start_dispatcher_and_worker(dispatcher_host : str, current_host : str, num_of_data_workers : int): + assert(dispatcher_host is not None) + + if current_host == dispatcher_host: + print(f'starting Dispatcher (dispatcher_host={dispatcher_host})') + d_config = DispatcherConfig(port=6000) + dispatcher = DispatchServer(d_config) + else: + dispatcher = None + + workers = [ create_worker(i, dispatcher_host, current_host) for i in range(num_of_data_workers) ] + print(f'Finished starting dispatcher and {num_of_data_workers} workers') + + wait_for_shutdown_signal(dispatcher, workers) + + +"This function read mode command line argument" +def read_args(): + import argparse, os + parser = argparse.ArgumentParser() + parser.add_argument("--dispatcher_host", type=str, default='localhost') + parser.add_argument("--current_host", type=str, default='localhost') + parser.add_argument("--num_of_data_workers", type=int, default=1) + args, unknown = parser.parse_known_args() + return args + + +if __name__ == "__main__": + args = read_args() + start_dispatcher_and_worker(args.dispatcher_host, args.current_host, args.num_of_data_workers) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/train.py b/training/heterogeneous-clusters/tf.data.service.local/train.py new file mode 100755 index 0000000000..a1759fdfc0 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.local/train.py @@ -0,0 +1,122 @@ +import os +import tensorflow as tf +import tensorflow_addons as tfa +from tensorflow.keras.applications.resnet50 import ResNet50 +from tensorflow.keras.layers.experimental import preprocessing + +DISPATCHER_HOST='localhost' + +# parse TFRecord+ +def parse_image_function(example_proto): + image_feature_description = {'image': tf.io.FixedLenFeature([], tf.string), + 'label': tf.io.FixedLenFeature([], tf.int64)} + features = tf.io.parse_single_example( + example_proto, image_feature_description) + image = tf.io.decode_raw(features['image'], tf.uint8) + image.set_shape([3 * 32 * 32]) + image = tf.reshape(image, [32, 32, 3]) + label = tf.cast(features['label'], tf.int32) + return image, label +# dilation filter +def dilate(image, label): + dilateFilter = tf.zeros([3, 3, 3], tf.uint8) + image = tf.expand_dims(image, 0) + image = tf.nn.dilation2d( + image, dilateFilter, strides=[1, 1, 1, 1], + dilations=[1, 1, 1, 1], + padding='SAME', + data_format='NHWC') + image = tf.squeeze(image) + return image, label +# blur filter +def blur(image, label): + image = tfa.image.gaussian_filter2d(image=image, + filter_shape=(11, 11), sigma=0.8) + return image, label +# rescale filter +def rescale(image, label): + image = preprocessing.Rescaling(1.0 / 255)(image) + return image, label +# augmentation filters +def augment(image, label): + data_augmentation = tf.keras.Sequential( + [preprocessing.RandomFlip("horizontal"), + preprocessing.RandomRotation(0.1), + preprocessing.RandomZoom(0.1)]) + image = data_augmentation(image) + return image, label + +'this function loads mnist as tf.data.Dataset' +def load_mnist(): + import numpy as np + (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() + x_train = x_train.astype(np.float32) / 255.0 + x_train = np.expand_dims(x_train, -1) + train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) + return train_dataset + +def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool, dispatcher_host : str): + autotune = tf.data.experimental.AUTOTUNE + options = tf.data.Options() + options.experimental_deterministic = False + records = tf.data.Dataset.list_files( + training_dir+'/*', shuffle=True).with_options(options) + ds = tf.data.TFRecordDataset(records, num_parallel_reads=autotune).repeat() + + ds = ds.map(parse_image_function, num_parallel_calls=autotune) + ds = ds.map(dilate, num_parallel_calls=autotune) + ds = ds.map(blur, num_parallel_calls=autotune) + ds = ds.map(rescale,num_parallel_calls=autotune) + + ds = ds.map(augment, num_parallel_calls=autotune) + ds = ds.batch(batch_size) + + if use_tf_data_service: + ds = ds.apply(tf.data.experimental.service.distribute( + processing_mode="parallel_epochs", + service=f'grpc://{dispatcher_host}:6000',), + ) + + ds = ds.prefetch(autotune) + return ds + +"This function read mode command line argument" +def read_args(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--mode', type=str, default='local', + help='Mode to run the script: local or service') + parser.add_argument("--training_dir", type=str, default='data') + parser.add_argument('--batch_size', type=int, default = 2048) + parser.add_argument('--model-dir', type=str, default=os.environ.get('SM_MODEL_DIR')) + args = parser.parse_args() + return args + +def shutdown_tf_data_service(): + SHUTDOWN_PORT = 16000 + print('Shutting down tf.data.service dispatcher via port {}'.format(SHUTDOWN_PORT)) + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect(('localhost', SHUTDOWN_PORT)) + s.close() + +if __name__ == "__main__": + args = read_args() + mode = args.mode + model = ResNet50(weights=None, + input_shape=(32, 32, 3), + classes=10) + model.compile(loss=tf.losses.SparseCategoricalCrossentropy(), + optimizer=tf.optimizers.Adam()) + + assert(mode == 'local' or mode == 'service') + print(f'Running in {mode} mode.') + + dataset = get_dataset(args.training_dir, batch_size = 1024, use_tf_data_service=(mode == 'service'), dispatcher_host = DISPATCHER_HOST) + + model.fit(dataset, steps_per_epoch=1, epochs=2, verbose=2) + + model.save(os.path.join(args.model_dir, '000000001'), 'my_model.h5') + + if mode == 'service': + shutdown_tf_data_service() \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/launcher.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/launcher.py new file mode 100644 index 0000000000..d67b27af7d --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/launcher.py @@ -0,0 +1,123 @@ +import sys +import os +import time +from typing import Optional +import subprocess + +# instance group names +DATA_GROUP = 'data_group' +DNN_GROUP = 'dnn_group' + + +def start_child_process_async(name : str, additional_args=[]) -> int: + #TODO: Find a way to stream stdout and stderr to the parent process + params = ["python", f"./{name}"] + sys.argv[1:] + additional_args + print(f'Opening process async: {params}') + p = subprocess.Popen(params) + print(f'Process {name} started') + return p.pid + + +def start_child_process(name : str, additional_args=[]) -> int: + params = ["python", f"./{name}"] + sys.argv[1:] + additional_args + print(f'Opening process: {params}') + p = subprocess.run(params) + print(f'Process {name} closed with returncode={p.returncode}') + return p.returncode + + +def start_data_group(dispatcher_host : str) -> int: + return start_child_process('train_data.py', ["--dispatcher_host", dispatcher_host]) + + +def not_mpi_or_rank_0() -> bool: + return 'OMPI_COMM_WORLD_LOCAL_RANK' not in os.environ or os.environ['OMPI_COMM_WORLD_LOCAL_RANK'] == '0' + + +def start_dnn_group(dispatcher_host : Optional[str]) -> int: + if dispatcher_host is not None: + args = ["--dispatcher_host", dispatcher_host] + # Start a tf.data.service worker processes for each host in the DNN group + # to take advantage of its CPU resources. + # Start once per instance, not per MPI process + if not_mpi_or_rank_0(): + start_child_process_async('train_data.py', args) + else: + args = [] + return start_child_process('train_dnn.py', args) + + +def get_group_first_host(instance_groups, target_group_name): + return instance_groups[target_group_name]['hosts'][0] + + +def is_not_mpi_or_world_rank_0() -> bool: + return 'OMPI_COMM_WORLD_RANK' in os.environ and os.environ['OMPI_COMM_WORLD_RANK'] != '0' + + +def shutdown_tf_data_service_with_retries(hosts : list): + # only world rank 0 process should shutdown the dispatcher + if is_not_mpi_or_world_rank_0(): + return + + completed_hosts = [] + for host in hosts: + for i in range(0,12): + try: + if i>0: + sleeptime = 10 + print(f'Will attempt {i} time to shutdown in {sleeptime} seconds') + time.sleep(sleeptime) + + if host not in completed_hosts: + _shutdown_data_service(host) + completed_hosts.append(host) + break + except Exception as e: + print(f'Failed to shutdown dispatcher in {host} due to: {e}') + + +def _shutdown_data_service(dispatcher_host : str): + SHUTDOWN_PORT = 16000 + print(f'Shutting down tf.data.service dispatcher via: [{dispatcher_host}:{SHUTDOWN_PORT}]') + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((dispatcher_host, SHUTDOWN_PORT)) + print(f'Shutdown request sent to {dispatcher_host}:{SHUTDOWN_PORT}') + + +def split_to_instance_group_train_script() -> int: + from sagemaker_training import environment + env = environment.Environment() + + print(f'env.is_hetero={env.is_hetero}') + print(f'current_host={env.current_host}') + + if env.is_hetero: + dispatcher_host = get_group_first_host(env.instance_groups_dict, DATA_GROUP) + first_host_in_dnn_group = get_group_first_host(env.instance_groups_dict, DNN_GROUP) + print(f'current_instance_type={env.current_instance_type}') + print(f'current_group_name={env.current_instance_group}') + print(f'dispatcher_host={dispatcher_host}') + if env.current_instance_group == DATA_GROUP: + return start_data_group(dispatcher_host) + elif env.current_instance_group == DNN_GROUP: + returncode = start_dnn_group(dispatcher_host) + # first host in DNN group will take care of shutting down the dispatcher + if env.current_host == first_host_in_dnn_group: + hosts = env.instance_groups_dict[DATA_GROUP]['hosts'] + env.instance_groups_dict[DNN_GROUP]['hosts'] + shutdown_tf_data_service_with_retries(hosts) + return returncode + else: + raise Exception(f'Unknown instance group: {env.current_instance_group}') + + else: # not heterogenous + return start_dnn_group(dispatcher_host=None) + +if __name__ == "__main__": + try: + returncode = split_to_instance_group_train_script() + exit(returncode) + except Exception as e: + print(f'Failed due to {e}. exiting with returncode=1') + sys.exit(1) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/requirements.txt b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/requirements.txt new file mode 100644 index 0000000000..64b956a22e --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/requirements.txt @@ -0,0 +1,2 @@ +protobuf==3.20.1 +tensorflow-addons==0.17.0 \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_data.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_data.py new file mode 100644 index 0000000000..62248d1e68 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_data.py @@ -0,0 +1,68 @@ +from tensorflow.data.experimental.service import DispatchServer, WorkerServer, DispatcherConfig, WorkerConfig + +def wait_for_shutdown_signal(dispatcher, workers): + SHUTDOWN_PORT = 16000 + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', SHUTDOWN_PORT)) + s.listen(1) + print('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) + conn, addr = s.accept() + print('Received shutdown signal from: ', addr) + try: + conn.close() + s.close() + except Exception as e: + print(e) + + if dispatcher is not None: # dispatcher runs only on the 1st data instance + print('Stopping dispatcher.') + dispatcher._stop() + print('Joining dispatcher') + dispatcher.join() + + for i,worker in enumerate(workers, start=0): + print(f'Stopping worker {i}') + worker._stop() + print(f'Joining worker {i}') + worker.join() + +def create_worker(workerIndex : int, dispatcher_host : str, current_host : str) -> WorkerServer: + port = 6001 + workerIndex + w_config = WorkerConfig(port=port, + dispatcher_address=f'{dispatcher_host}:6000', + worker_address=f'{current_host}:{port}') + print(f'Starting tf.data.service WorkerServer {w_config}') + worker = WorkerServer(w_config) + return worker + +def start_dispatcher_and_worker(dispatcher_host : str, current_host : str, num_of_data_workers : int): + assert(dispatcher_host is not None) + + if current_host == dispatcher_host: + print(f'starting Dispatcher (dispatcher_host={dispatcher_host})') + d_config = DispatcherConfig(port=6000) + dispatcher = DispatchServer(d_config) + else: + dispatcher = None + + workers = [ create_worker(i, dispatcher_host, current_host) for i in range(num_of_data_workers) ] + print(f'Finished starting dispatcher and {num_of_data_workers} workers') + + wait_for_shutdown_signal(dispatcher, workers) + + +"This function read mode command line argument" +def read_args(): + import argparse, os + parser = argparse.ArgumentParser() + parser.add_argument("--dispatcher_host", type=str) + parser.add_argument("--current_host", type=str, default=os.environ["SM_CURRENT_HOST"]) + parser.add_argument("--num_of_data_workers", type=int) + args, unknown = parser.parse_known_args() + return args + + +if __name__ == "__main__": + args = read_args() + start_dispatcher_and_worker(args.dispatcher_host, args.current_host, args.num_of_data_workers) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py new file mode 100644 index 0000000000..a976d59ea2 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py @@ -0,0 +1,158 @@ +from tensorflow.keras.layers.experimental import preprocessing +from tensorflow.keras.applications.resnet50 import ResNet50 +import tensorflow_addons as tfa +import tensorflow as tf +import os +import horovod.tensorflow.keras as hvd + +# parse TFRecord +def parse_image_function(example_proto): + image_feature_description = {'image': tf.io.FixedLenFeature([], tf.string), + 'label': tf.io.FixedLenFeature([], tf.int64)} + features = tf.io.parse_single_example( + example_proto, image_feature_description) + image = tf.io.decode_raw(features['image'], tf.uint8) + image.set_shape([3 * 32 * 32]) + image = tf.reshape(image, [32, 32, 3]) + label = tf.cast(features['label'], tf.int32) + return image, label + + +# dilation filter +def dilate(image, label): + dilateFilter = tf.zeros([3, 3, 3], tf.uint8) + image = tf.expand_dims(image, 0) + image = tf.nn.dilation2d( + image, dilateFilter, strides=[1, 1, 1, 1], + dilations=[1, 1, 1, 1], + padding='SAME', + data_format='NHWC') + image = tf.squeeze(image) + return image, label +# blur filter + + +def blur(image, label): + image = tfa.image.gaussian_filter2d(image=image, + filter_shape=(11, 11), sigma=0.8) + return image, label + +# rescale filter +def rescale(image, label): + image = preprocessing.Rescaling(1.0 / 255)(image) + return image, label + + +# augmentation filters +def augment(image, label): + data_augmentation = tf.keras.Sequential( + [preprocessing.RandomFlip("horizontal"), + preprocessing.RandomRotation(0.1), + preprocessing.RandomZoom(0.1)]) + image = data_augmentation(image) + return image, label + + +def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool, dispatcher_host : str): + autotune = tf.data.experimental.AUTOTUNE + options = tf.data.Options() + options.experimental_deterministic = False + records = tf.data.Dataset.list_files( + training_dir+'/*', shuffle=True).with_options(options) + ds = tf.data.TFRecordDataset(records, num_parallel_reads=autotune).repeat() + + ds = ds.map(parse_image_function, num_parallel_calls=autotune) + ds = ds.map(dilate, num_parallel_calls=autotune) + ds = ds.map(blur, num_parallel_calls=autotune) + ds = ds.map(rescale,num_parallel_calls=autotune) + + ds = ds.map(augment, num_parallel_calls=autotune) + ds = ds.batch(batch_size) + + if use_tf_data_service: + ds = ds.apply(tf.data.experimental.service.distribute( + processing_mode="parallel_epochs", + service=f'grpc://{dispatcher_host}:6000',), + ) + + #ds = ds.take(1).cache().repeat() + ds = ds.prefetch(autotune) + return ds + + +"This function read mode command line argument" +def read_args(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--tf_data_mode', type=str, default='local', + help="'service' distributed dataset using tf.data.service. 'local' use standard tf.data") + parser.add_argument('--steps_per_epoch', type=int, default=1) + parser.add_argument('--batch_size', type=int) + parser.add_argument('--epochs', type=int, default=1) + parser.add_argument("--n_gpus", type=str, + default=os.environ.get("SM_NUM_GPUS")) + parser.add_argument("--training_dir", type=str, + default=os.environ.get("SM_CHANNEL_TRAINING")) + parser.add_argument("--dispatcher_host", type=str) + parser.add_argument("--num_of_data_workers", type=int, default=1) + parser.add_argument("--output_data_dir", type=str, + default=os.environ.get("SM_OUTPUT_DATA_DIR")) + parser.add_argument("--model_dir", type=str, + default=os.environ.get("SM_MODEL_DIR")) + parser.add_argument("--checkpoint-path",type=str,default="/opt/ml/checkpoints",help="Path where checkpoints are saved.") + args = parser.parse_args() + return args + +if __name__ == "__main__": + args = read_args() + hvd.init() + # Horovod: pin GPU to be used to process local rank (one GPU per process) + gpus = tf.config.experimental.list_physical_devices('GPU') + print(str(gpus)) + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + if gpus: + print(f'hvd.local_rank() {hvd.local_rank()}') + tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU') + + model = ResNet50(weights=None, + input_shape=(32, 32, 3), + classes=10) + + model.compile(loss=tf.losses.SparseCategoricalCrossentropy(), + optimizer=tf.optimizers.Adam()) + # Horovod: adjust learning rate based on number of GPUs. + scaled_lr = 0.001 * hvd.size() + opt = tf.optimizers.Adam(scaled_lr) + opt = hvd.DistributedOptimizer( + opt, backward_passes_per_step=1, average_aggregated_gradients=True) + + model.compile(loss=tf.losses.SparseCategoricalCrossentropy(), + optimizer=opt, + experimental_run_tf_function=False) + + callbacks = [ + hvd.callbacks.BroadcastGlobalVariablesCallback(0), + hvd.callbacks.MetricAverageCallback(), + hvd.callbacks.LearningRateWarmupCallback(initial_lr=scaled_lr, warmup_epochs=3, verbose=1), + ] + # Horovod: save checkpoints only on worker 0 to prevent other workers from corrupting them. + if hvd.rank() == 0: + path = os.path.join(args.checkpoint_path, './checkpoint-{epoch}.h5') + callbacks.append(tf.keras.callbacks.ModelCheckpoint(path)) + + # Horovod: write logs on worker 0. + verbose = 1 if hvd.rank() == 0 else 0 + + assert(args.tf_data_mode == 'local' or args.tf_data_mode == 'service') + print(f'Running in {args.tf_data_mode} tf_data_mode.') + dataset = get_dataset(args.training_dir, batch_size = args.batch_size, use_tf_data_service=(args.tf_data_mode == 'service'), dispatcher_host = args.dispatcher_host) + + model.fit( dataset, + steps_per_epoch=args.steps_per_epoch, + callbacks=callbacks, + epochs=args.epochs, + verbose=2,) + + if hvd.rank() == 0: + model.save(os.path.join(args.model_dir, '000000001'), 'my_model.h5') \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py new file mode 100755 index 0000000000..a7c78ecc37 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py @@ -0,0 +1,132 @@ +# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# A copy of the License is located at +# +# https://aws.amazon.com/apache-2-0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +import argparse +import os +import sys +import tarfile + +import tensorflow as tf +from six.moves import cPickle as pickle +from six.moves import xrange # pylint: disable=redefined-builtin + +# import tensorflow_datasets as tfds + +CIFAR_FILENAME = "cifar-10-python.tar.gz" +CIFAR_DOWNLOAD_URL = "https://www.cs.toronto.edu/~kriz/" + CIFAR_FILENAME +CIFAR_LOCAL_FOLDER = "cifar-10-batches-py" + + +def download_and_extract(data_dir): + import tensorflow_datasets as tfds + + dm = tfds.download.DownloadManager(download_dir=data_dir + "/tmp") + extract_dir = dm.download_and_extract(CIFAR_DOWNLOAD_URL) + + return extract_dir + + +def _int64_feature(value): + return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) + + +def _bytes_feature(value): + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) + + +def _get_file_names(): + """Returns the file names expected to exist in the input_dir.""" + file_names = {} + file_names["train"] = ["data_batch_%d" % i for i in xrange(1, 5)] + file_names["validation"] = ["data_batch_5"] + file_names["eval"] = ["test_batch"] + return file_names + + +def read_pickle_from_file(filename): + # with open(filename, 'rb') as f: + with tf.io.gfile.GFile(filename, "rb") as f: + if sys.version_info >= (3, 0): + data_dict = pickle.load(f, encoding="bytes") + else: + data_dict = pickle.load(f) + return data_dict + + +def convert_to_tfrecord(input_files, output_file): + """Converts a file to TFRecords.""" + print("Generating %s" % output_file) + with tf.io.TFRecordWriter(output_file) as record_writer: + for input_file in input_files: + data_dict = read_pickle_from_file(input_file) + data = data_dict[b"data"] + labels = data_dict[b"labels"] + + num_entries_in_batch = len(labels) + for i in range(num_entries_in_batch): + example = tf.train.Example( + features=tf.train.Features( + feature={ + "image": _bytes_feature(data[i].tobytes()), + "label": _int64_feature(labels[i]), + } + ) + ) + record_writer.write(example.SerializeToString()) + + +def install_dependencies(): + from subprocess import call + + call(["pip", "install", "--upgrade", "pip"]) + call(["pip", "install", "tensorflow_datasets==4.1.0"]) + + +def main(data_dir): + print("Download from {} and extract.".format(CIFAR_DOWNLOAD_URL)) + + extract_dir = download_and_extract(data_dir) + file_names = _get_file_names() + input_dir = os.path.join(extract_dir, CIFAR_LOCAL_FOLDER) + + for mode, files in file_names.items(): + input_files = [os.path.join(input_dir, f) for f in files] + output_file = os.path.join(data_dir + "/" + mode, mode + ".tfrecords") + if not os.path.exists(data_dir + "/" + mode): + os.makedirs(data_dir + "/" + mode) + try: + os.remove(output_file) + except OSError: + pass + # Convert to tf.train.Example and write the to TFRecords. + convert_to_tfrecord(input_files, output_file) + print("Done!") + import shutil + + shutil.rmtree(data_dir + "/tmp") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--data-dir", + type=str, + default="./data", + help="Directory to download and extract CIFAR-10 to.", + ) + + args = parser.parse_args() + + install_dependencies() + + main(args.data_dir) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb new file mode 100644 index 0000000000..e89e01db69 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -0,0 +1,1016 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TensorFlow's tf.data.service with Amazon SageMaker Training Heterogeneous Clusters\n", + "\n", + "---\n", + "### Intro\n", + "\n", + "Heterogeneous clusters enables launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottlnecked on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters allows you to add more CPU resources to fully utilize GPUs to increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", + "\n", + "This notebook demonstrates how to use Heterogeneous Clusters feature of SageMaker Training with TensorFlow's [tf.data.service](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service).\n", + "\n", + "In this sample notebook, we'll be training a CPU intensive Deep Learning computer vision workload. We'll be comparing between a homogeneous and a heterogeneous training configurations. Both jobs we'll run train with the same data, pre-processing, and other relevant parameters:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Homogeneous Training Job
\n", + " In a Homogeneous training job the ml.p4d.24xlarge instance GPUs are under-utilized due to a CPU bottleneck.
Heterogeneous Training Job
\n", + " In a Heterogeneous training job, we add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and drive up GPU usage, to improve training speed cost-efficiency.\n", + "
\"homogeneous\"Heterogeneous
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Workload Details\n", + "Training data is stored in TFRecord files in `data` folder, and generated from [CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html) dataset using `generate_cifar10_tfrecords.py` script. The data pre-processing pipeline includes: parsing images, dilation, blur filtering, and a number of [TensorFlow preprocessing layers](https://www.tensorflow.org/guide/keras/preprocessing_layers). We'll use a [Resnet50](https://www.tensorflow.org/api_docs/python/tf/keras/applications/ResNet50) architecture. The job runs on an 8 GPUs instance, p4d.24xlarge, and uses Horovod for data parallelizaion. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting up Heterogeneous clusters Training\n", + "We then define `instance_groups` in the TensorFlow estimator to enable training jobs to leverage Heterogeneous Cluster features. \n", + "The data pre-processing code runs on the CPU nodes (here referred as **data_group or data group**), whereas the Deep Neural Network training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). In this example, the inter-node communication between CPU and GPU instance_groups is implemented using [TensorFlow data service feature](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service). This feature was introduced in TensorFlow version 2.3 which provides APIs for defining dedicated worker machines for performing data preprocessing. Note that SageMaker's Heterogeneous cluster does not provide out-of-the-box support for inter-instance_group communication. \n", + "\n", + "\n", + "The training script (`launcher.py`) runs on all the nodes regardless of which instance_group it belongs to. However, it has the logic to detect (using SageMaker's `instance_group` environment variables) whether the node it is running on belongs to data_group or dnn_group. \n", + "\n", + "If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs a dispatcher server service on the first node of the instance group. And, on all the nodes in the same instance_group, it runs the worker server service. A dispatch server is responsible for distributing preprocessing tasks to one, or more, worker servers, each of which load the raw data directly from storage, and send the processed data to the GPU device. A dispatcher server listens on port 6000, whereas the worker server listens on port 6001. By applying `tf.data.experimental.service.distribute` to your dataset, you can program the dataset to run all preprocessing operations up to the point of application, on the workers. TFRecord files are copied over to instances in this group, as the workers load the raw data from those files. In this example, we are using 2 instances of ml.c5.18xlarge in the data_group. While dispatching the data to the dnn_group, the main entrypoint script `launcher.py` listens on port 16000 for a shutdown request coming from the data group. The train_data.py waits for shutdown action from the parent process.\n", + "\n", + "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. This script contains a deep neural network algorithm/code. And, in some cases, can host additional data-preprocessing components to maximize the use of CPUs on dnn nodes. The set of processes running DNN training consumes a stream of processed dataset from the Dispatcher server (the first node in the data_group at port 6000), and runs model training. The dnn_group can also run distributed training on multiple nodes defined by parameter instance_count (see details under **Setting up the training environment** section of this notebook). Once the model is trained on the dataset, the dnn_group establishes a connection back to the dispatcher server on port 16000 to signal shutdown request. \n", + "\n", + "\n", + "A graphical view of how the data flows is shown below in Heterogeneous Cluster training with tf.data.service:\n", + "\n", + "**NEED TO BE UPDATED**\n", + "\n", + "\n", + "\n", + "\n", + "This notebook refers following files and folders:\n", + "\n", + "- Folders: \n", + "  - `code`: this has the training scripts, grpc client-server code, \n", + "  - `images`: contains images referred in notebook\n", + "- Files: \n", + "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. Explained above. \n", + "  - `train_data.py`: this script runs on the data_group nodes and responsible for setting up dispatcher and worker servers\n", + "  - `train_dnn.py`: this script runs on the dnn_group nodes, and responsible for DNN training code/algorithm. \n", + "  - `requirements.txt`: defines package required for tensorflow-addon and protobuf \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "**NOTE**\n", + "\n", + "As an alternative to following this notebook, you follow (readme.md)[./readme.md] which allows you to setup and launch the training job from an IDE or command line. \n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "At a high level, the notebook covers:\n", + "-  A Setting up Amazon SageMaker Studio Notebook \n", + "-  Preparing Training dataset and uploading to Amazon S3\n", + "-  Setting up the Training environment\n", + "-  Submitting the Training job\n", + "-  Monitor and visualize the CloudWatch metrics\n", + "-  Comparing time-to-train and cost-to-train\n", + "-  Conclusion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A. Setting up SageMaker Studio notebook\n", + "#### Before you start\n", + "Ensure you have selected Python 3 (_TensorFlow 2.6 Python 3.8 CPU Optimized_) image for your SageMaker Studio Notebook instance, and running on _ml.t3.medium_ instance type.\n", + "\n", + "#### Step 1 - Upgrade SageMaker SDK and dependent packages \n", + "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. As a first step, ensure you have updated SageMaker SDK, PyTorch, and Boto3 client that enables this feature." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 2 - Restart the notebook kernel \n", + "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 3 - Valdiate SageMaker Python SDK and Tensorflow versions\n", + "Ensure the output of the cell below reflects:\n", + "\n", + "- SageMaker Python SDK version 2.98.0 or above, \n", + "- boto3 1.24 or above \n", + "- botocore 1.27 or above \n", + "- TensorFlow 2.6 or above " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: sagemaker\n", + "Version: 2.99.0\n", + "---\n", + "Name: boto3\n", + "Version: 1.21.32\n", + "---\n", + "Name: botocore\n", + "Version: 1.24.32\n", + "---\n", + "Name: tensorflow\n", + "Version: 2.8.0\n", + "---\n", + "Name: protobuf\n", + "Version: 3.20.1\n" + ] + } + ], + "source": [ + "!pip show sagemaker boto3 botocore tensorflow protobuf |egrep 'Name|Version|---'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### B. Preparing Training Dataset and Uploading to S3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 1: Download cifar10 dataset and convert them into tfrecord\n", + "The training data set is stored in TFRecord files in `data` folder, and generated from CIFAR-10 dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "python3 ./generate_cifar10_tfrecords.py --data-dir ./data\n", + "rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.1.tfrecords ./data/ && cp data.old/train/train.2.tfrecords ./data/ && mv data.old /tmp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 2: Upload the tfrecord training data to S3 bucket" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "prefix = \"cifar10-tfrecord\"\n", + "bucket = sess.default_bucket()\n", + "print(f\"Uploading data from ./data to s3://{bucket}/{prefix}/\")\n", + "s3path = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", + "\n", + "data_uri = TrainingInput(\n", + " s3path,\n", + " # instance_groups=['data_group'], # we don't need to restrict training channel to a specific group as we have data workers in both groups\n", + " input_mode=\"FastFile\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### C. Setting up training environment\n", + "#### Step 1: Import SageMaker components and setup the IAM role and S3 bucket\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "output_path=s3://sagemaker-us-east-1-331113010199/cifar10-tfrecord\n" + ] + } + ], + "source": [ + "import os\n", + "import json\n", + "import datetime\n", + "import os\n", + "\n", + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.instance_group import InstanceGroup\n", + "\n", + "sess = sagemaker.Session()\n", + "role = get_execution_role()\n", + "output_path = \"s3://\" + sess.default_bucket() + \"/cifar10-tfrecord\"\n", + "print(f\"role={role}\")\n", + "print(f\"output_path={output_path}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 2 - Running a Homogenous training job\n", + "In this step we define and submit a homogenous training job. It use a single instance type (p4d.24xlarge) with 8 GPUs, and analysis will show its CPU bound causing its GPUs to be underutilized." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime\n", + "from sagemaker.tensorflow import TensorFlow\n", + "from sagemaker.instance_group import InstanceGroup\n", + "from sagemaker.inputs import TrainingInput\n", + "import os\n", + "\n", + "hyperparameters = {\n", + " \"epochs\": 3,\n", + " \"steps_per_epoch\": 500,\n", + " \"batch_size\": 1024,\n", + " \"tf_data_mode\": \"local\", # We won't be using tf.data.service ('service') for this homogenous job\n", + " \"num_of_data_workers\": 0, # We won't be using tf.data.service ('service') for this homogenous job\n", + "}\n", + "\n", + "estimator = TensorFlow(\n", + " entry_point=\"launcher.py\",\n", + " source_dir=\"code\",\n", + " framework_version=\"2.9.1\",\n", + " py_version=\"py39\",\n", + " role=role,\n", + " volume_size=10,\n", + " max_run=1800, # 30 minutes\n", + " disable_profiler=True,\n", + " instance_type=\"ml.p4d.24xlarge\",\n", + " instance_count=1,\n", + " hyperparameters=hyperparameters,\n", + " distribution={\n", + " \"mpi\": {\n", + " \"enabled\": True,\n", + " \"processes_per_host\": 8, # 8 GPUs per host\n", + " \"custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", + " },\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### D. Submit the training job\n", + "\n", + "Note: For the logs, click on **View logs** from the **Training Jobs** node in **Amazon SageMaker Console**. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-09 14:00:51 Starting - Starting the training job......\n", + "2022-09-09 14:01:29 Starting - Preparing the instances for training.............................................\n", + "2022-09-09 14:10:05 Downloading - Downloading input data\n", + "2022-09-09 14:10:05 Training - Downloading the training image.....................\n", + "2022-09-09 14:13:36 Training - Training image download completed. Training in progress.2022-09-09 14:13:42.807713: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-09 14:13:42.818598: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "2022-09-09 14:13:43.564275: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-09 14:13:53,522 sagemaker-training-toolkit INFO Imported framework sagemaker_tensorflow_container.training\n", + "2022-09-09 14:13:54,624 sagemaker-training-toolkit INFO Installing dependencies from requirements.txt:\n", + "/usr/local/bin/python3.9 -m pip install -r requirements.txt\n", + "Collecting protobuf==3.20.1\n", + "Downloading protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 49.8 MB/s eta 0:00:00\n", + "Collecting tensorflow-addons==0.17.0\n", + "Downloading tensorflow_addons-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 65.8 MB/s eta 0:00:00\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (21.3)\n", + "Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (2.13.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.9/site-packages (from packaging->tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (3.0.9)\n", + "Installing collected packages: protobuf, tensorflow-addons\n", + "Attempting uninstall: protobuf\n", + "Found existing installation: protobuf 3.19.4\n", + "Uninstalling protobuf-3.19.4:\n", + "Successfully uninstalled protobuf-3.19.4\n", + "Attempting uninstall: tensorflow-addons\n", + "Found existing installation: tensorflow-addons 0.17.1\n", + "Uninstalling tensorflow-addons-0.17.1:\n", + "Successfully uninstalled tensorflow-addons-0.17.1\n", + "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "tf-models-official 2.9.1 requires tensorflow~=2.9.0, which is not installed.\n", + "tensorflow-gpu 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "tensorboard 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "sagemaker-training 4.1.4.dev0 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "Successfully installed protobuf-3.20.1 tensorflow-addons-0.17.0\n", + "WARNING: 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\n", + "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", + "[notice] To update, run: pip install --upgrade pip\n", + "2022-09-09 14:14:07,337 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-09 14:14:07,337 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-09 14:14:07,515 sagemaker-training-toolkit INFO Starting MPI run as worker node.\n", + "2022-09-09 14:14:07,515 sagemaker-training-toolkit INFO Creating SSH daemon.\n", + "2022-09-09 14:14:07,540 sagemaker-training-toolkit INFO Waiting for MPI workers to establish their SSH connections\n", + "2022-09-09 14:14:07,541 sagemaker-training-toolkit INFO Env Hosts: ['algo-1'] Hosts: ['algo-1:8'] process_per_hosts: 8 num_processes: 8\n", + "2022-09-09 14:14:07,542 sagemaker-training-toolkit INFO Network interface name: eth0\n", + "2022-09-09 14:14:07,627 sagemaker-training-toolkit INFO Invoking user script\n", + "Training Env:\n", + "{\n", + " \"additional_framework_parameters\": {\n", + " \"sagemaker_mpi_custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", + " \"sagemaker_mpi_enabled\": true,\n", + " \"sagemaker_mpi_num_of_processes_per_host\": 8\n", + " },\n", + " \"channel_input_dirs\": {\n", + " \"training\": \"/opt/ml/input/data/training\"\n", + " },\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_group\": \"homogeneousCluster\",\n", + " \"current_instance_group_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"distribution_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"distribution_instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"framework_module\": \"sagemaker_tensorflow_container.training:main\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"hyperparameters\": {\n", + " \"batch_size\": 1024,\n", + " \"epochs\": 3,\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"num_of_data_workers\": 0,\n", + " \"steps_per_epoch\": 500,\n", + " \"tf_data_mode\": \"local\"\n", + " },\n", + " \"input_config_dir\": \"/opt/ml/input/config\",\n", + " \"input_data_config\": {\n", + " \"training\": {\n", + " \"TrainingInputMode\": \"File\",\n", + " \"S3DistributionType\": \"FullyReplicated\",\n", + " \"RecordWrapperType\": \"None\"\n", + " }\n", + " },\n", + " \"input_dir\": \"/opt/ml/input\",\n", + " \"instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"instance_groups_dict\": {\n", + " \"homogeneousCluster\": {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " },\n", + " \"is_hetero\": false,\n", + " \"is_master\": true,\n", + " \"job_name\": \"homogenous-20220909T140047Z\",\n", + " \"log_level\": 20,\n", + " \"master_hostname\": \"algo-1\",\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"module_dir\": \"s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\",\n", + " \"module_name\": \"launcher\",\n", + " \"network_interface_name\": \"eth0\",\n", + " \"num_cpus\": 96,\n", + " \"num_gpus\": 8,\n", + " \"output_data_dir\": \"/opt/ml/output/data\",\n", + " \"output_dir\": \"/opt/ml/output\",\n", + " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", + " \"resource_config\": {\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"current_group_name\": \"homogeneousCluster\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"instance_groups\": [\n", + " {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " ],\n", + " \"network_interface_name\": \"eth0\"\n", + " },\n", + " \"user_entry_point\": \"launcher.py\"\n", + "}\n", + "Environment variables:\n", + "SM_HOSTS=[\"algo-1\"]\n", + "SM_NETWORK_INTERFACE_NAME=eth0\n", + "SM_HPS={\"batch_size\":1024,\"epochs\":3,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"}\n", + "SM_USER_ENTRY_POINT=launcher.py\n", + "SM_FRAMEWORK_PARAMS={\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8}\n", + "SM_RESOURCE_CONFIG={\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"}\n", + "SM_INPUT_DATA_CONFIG={\"training\":{\"RecordWrapperType\":\"None\",\"S3DistributionType\":\"FullyReplicated\",\"TrainingInputMode\":\"File\"}}\n", + "SM_OUTPUT_DATA_DIR=/opt/ml/output/data\n", + "SM_CHANNELS=[\"training\"]\n", + "SM_CURRENT_HOST=algo-1\n", + "SM_CURRENT_INSTANCE_TYPE=ml.p4d.24xlarge\n", + "SM_CURRENT_INSTANCE_GROUP=homogeneousCluster\n", + "SM_CURRENT_INSTANCE_GROUP_HOSTS=[\"algo-1\"]\n", + "SM_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_INSTANCE_GROUPS_DICT={\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}}\n", + "SM_DISTRIBUTION_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_IS_HETERO=false\n", + "SM_MODULE_NAME=launcher\n", + "SM_LOG_LEVEL=20\n", + "SM_FRAMEWORK_MODULE=sagemaker_tensorflow_container.training:main\n", + "SM_INPUT_DIR=/opt/ml/input\n", + "SM_INPUT_CONFIG_DIR=/opt/ml/input/config\n", + "SM_OUTPUT_DIR=/opt/ml/output\n", + "SM_NUM_CPUS=96\n", + "SM_NUM_GPUS=8\n", + "SM_MODEL_DIR=/opt/ml/model\n", + "SM_MODULE_DIR=s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\n", + "SM_TRAINING_ENV={\"additional_framework_parameters\":{\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8},\"channel_input_dirs\":{\"training\":\"/opt/ml/input/data/training\"},\"current_host\":\"algo-1\",\"current_instance_group\":\"homogeneousCluster\",\"current_instance_group_hosts\":[\"algo-1\"],\"current_instance_type\":\"ml.p4d.24xlarge\",\"distribution_hosts\":[\"algo-1\"],\"distribution_instance_groups\":[\"homogeneousCluster\"],\"framework_module\":\"sagemaker_tensorflow_container.training:main\",\"hosts\":[\"algo-1\"],\"hyperparameters\":{\"batch_size\":1024,\"epochs\":3,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"},\"input_config_dir\":\"/opt/ml/input/config\",\"input_data_config\":{\"training\":{\"RecordWrapperType\":\"None\",\"S3DistributionType\":\"FullyReplicated\",\"TrainingInputMode\":\"File\"}},\"input_dir\":\"/opt/ml/input\",\"instance_groups\":[\"homogeneousCluster\"],\"instance_groups_dict\":{\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}},\"is_hetero\":false,\"is_master\":true,\"job_name\":\"homogenous-20220909T140047Z\",\"log_level\":20,\"master_hostname\":\"algo-1\",\"model_dir\":\"/opt/ml/model\",\"module_dir\":\"s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\",\"module_name\":\"launcher\",\"network_interface_name\":\"eth0\",\"num_cpus\":96,\"num_gpus\":8,\"output_data_dir\":\"/opt/ml/output/data\",\"output_dir\":\"/opt/ml/output\",\"output_intermediate_dir\":\"/opt/ml/output/intermediate\",\"resource_config\":{\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"},\"user_entry_point\":\"launcher.py\"}\n", + "SM_USER_ARGS=[\"--batch_size\",\"1024\",\"--epochs\",\"3\",\"--model_dir\",\"/opt/ml/model\",\"--num_of_data_workers\",\"0\",\"--steps_per_epoch\",\"500\",\"--tf_data_mode\",\"local\"]\n", + "SM_OUTPUT_INTERMEDIATE_DIR=/opt/ml/output/intermediate\n", + "SM_CHANNEL_TRAINING=/opt/ml/input/data/training\n", + "SM_HP_BATCH_SIZE=1024\n", + "SM_HP_EPOCHS=3\n", + "SM_HP_MODEL_DIR=/opt/ml/model\n", + "SM_HP_NUM_OF_DATA_WORKERS=0\n", + "SM_HP_STEPS_PER_EPOCH=500\n", + "SM_HP_TF_DATA_MODE=local\n", + "PYTHONPATH=/opt/ml/code:/usr/local/bin:/usr/local/lib/python39.zip:/usr/local/lib/python3.9:/usr/local/lib/python3.9/lib-dynload:/usr/local/lib/python3.9/site-packages:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument-3.4.2-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument_cext-0.2.4-py3.9-linux-x86_64.egg\n", + "Invoking script with the following command:\n", + "mpirun --host algo-1:8 -np 8 --allow-run-as-root --display-map --tag-output -mca btl_tcp_if_include eth0 -mca oob_tcp_if_include eth0 -mca plm_rsh_no_tree_spawn 1 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_abort_on_non_zero_status 1 -mca btl_vader_single_copy_mechanism none -x NCCL_MIN_NRINGS=4 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_DEBUG=WARN -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD=/usr/local/lib/python3.9/site-packages/gethostname.cpython-39-x86_64-linux-gnu.so -x SM_HOSTS -x SM_NETWORK_INTERFACE_NAME -x SM_HPS -x SM_USER_ENTRY_POINT -x SM_FRAMEWORK_PARAMS -x SM_RESOURCE_CONFIG -x SM_INPUT_DATA_CONFIG -x SM_OUTPUT_DATA_DIR -x SM_CHANNELS -x SM_CURRENT_HOST -x SM_CURRENT_INSTANCE_TYPE -x SM_CURRENT_INSTANCE_GROUP -x SM_CURRENT_INSTANCE_GROUP_HOSTS -x SM_INSTANCE_GROUPS -x SM_INSTANCE_GROUPS_DICT -x SM_DISTRIBUTION_INSTANCE_GROUPS -x SM_IS_HETERO -x SM_MODULE_NAME -x SM_LOG_LEVEL -x SM_FRAMEWORK_MODULE -x SM_INPUT_DIR -x SM_INPUT_CONFIG_DIR -x SM_OUTPUT_DIR -x SM_NUM_CPUS -x SM_NUM_GPUS -x SM_MODEL_DIR -x SM_MODULE_DIR -x SM_TRAINING_ENV -x SM_USER_ARGS -x SM_OUTPUT_INTERMEDIATE_DIR -x SM_CHANNEL_TRAINING -x SM_HP_BATCH_SIZE -x SM_HP_EPOCHS -x SM_HP_MODEL_DIR -x SM_HP_NUM_OF_DATA_WORKERS -x SM_HP_STEPS_PER_EPOCH -x SM_HP_TF_DATA_MODE -x PYTHONPATH /usr/local/bin/python3.9 -m mpi4py launcher.py --batch_size 1024 --epochs 3 --model_dir /opt/ml/model --num_of_data_workers 0 --steps_per_epoch 500 --tf_data_mode local\n", + "Data for JOB [47713,1] offset 0 Total slots allocated 8\n", + " ======================== JOB MAP ========================\n", + " Data for node: ip-10-0-222-41#011Num slots: 8#011Max slots: 0#011Num procs: 8\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 0 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 1 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 2 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 3 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 4 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 5 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 6 Bound: N/A\n", + " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 7 Bound: N/A\n", + " =============================================================\n", + "[1,mpirank:1,algo-1]:env.is_hetero=False\n", + "[1,mpirank:1,algo-1]:current_host=algo-1\n", + "[1,mpirank:1,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:4,algo-1]:env.is_hetero=False\n", + "[1,mpirank:4,algo-1]:current_host=algo-1\n", + "[1,mpirank:4,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:3,algo-1]:env.is_hetero=False\n", + "[1,mpirank:3,algo-1]:current_host=algo-1\n", + "[1,mpirank:3,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:2,algo-1]:env.is_hetero=False\n", + "[1,mpirank:2,algo-1]:current_host=algo-1\n", + "[1,mpirank:2,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:5,algo-1]:env.is_hetero=False\n", + "[1,mpirank:5,algo-1]:current_host=algo-1[1,mpirank:5,algo-1]:\n", + "[1,mpirank:5,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:6,algo-1]:env.is_hetero=False\n", + "[1,mpirank:6,algo-1]:current_host=algo-1\n", + "[1,mpirank:6,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:0,algo-1]:env.is_hetero=False\n", + "[1,mpirank:0,algo-1]:current_host=algo-1\n", + "[1,mpirank:0,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:7,algo-1]:env.is_hetero=False\n", + "[1,mpirank:7,algo-1]:current_host=algo-1\n", + "[1,mpirank:7,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.584464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.584609: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.584611: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.584609: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.584612: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.597322: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.597321: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.597325: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.597325: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.597462: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.597464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.597464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.597466: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.619435: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.632297: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:3,algo-1]:hvd.local_rank() 3\n", + "[1,mpirank:6,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:4,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:1,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:4,algo-1]:hvd.local_rank() 4\n", + "[1,mpirank:1,algo-1]:hvd.local_rank() 1\n", + "[1,mpirank:6,algo-1]:hvd.local_rank() 6\n", + "[1,mpirank:7,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:7,algo-1]:hvd.local_rank() 7\n", + "[1,mpirank:0,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:0,algo-1]:hvd.local_rank() 0\n", + "[1,mpirank:2,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:5,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:2,algo-1]:hvd.local_rank() 2\n", + "[1,mpirank:5,algo-1]:hvd.local_rank() 5\n", + "[1,mpirank:6,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:2,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:0,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:7,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:5,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:1,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:4,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:3,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:0,algo-1]:Epoch 1/3\n", + "[1,mpirank:7,algo-1]:Epoch 1/3\n", + "[1,mpirank:5,algo-1]:Epoch 1/3\n", + "[1,mpirank:4,algo-1]:Epoch 1/3\n", + "[1,mpirank:2,algo-1]:Epoch 1/3\n", + "[1,mpirank:3,algo-1]:Epoch 1/3\n", + "[1,mpirank:1,algo-1]:Epoch 1/3\n", + "[1,mpirank:6,algo-1]:Epoch 1/3\n", + "[1,mpirank:5,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:5,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:5,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:0,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:0,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:0,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:7,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:7,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:7,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:2,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:2,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:2,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:6,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:6,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:6,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:3,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:3,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:3,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:4,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:4,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:4,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:1,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:1,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:1,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.179 algo-1:180 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.179 algo-1:183 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.179 algo-1:184 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.179 algo-1:181 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.179 algo-1:179 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.179 algo-1:182 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.179 algo-1:178 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.180 algo-1:177 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.472 algo-1:183 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.472 algo-1:181 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.472 algo-1:180 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.472 algo-1:179 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.472 algo-1:184 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.472 algo-1:178 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.472 algo-1:177 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.473 algo-1:182 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.540 algo-1:184 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.540 algo-1:180 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.540 algo-1:183 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.540 algo-1:181 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.540 algo-1:179 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.540 algo-1:178 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.541 algo-1:182 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.541 algo-1:177 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.541 algo-1:179 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.541 algo-1:178 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.541 algo-1:177 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.541 algo-1:182 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.541 algo-1:179 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.541 algo-1:178 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.542 algo-1:179 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.542 algo-1:183 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.542 algo-1:178 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.542 algo-1:180 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", + "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.542 algo-1:184 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", + "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.542 algo-1:181 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", + "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.542 algo-1:179 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", + "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.542 algo-1:178 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", + "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", + "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", + "[1,mpirank:0,algo-1]:NCCL version 2.10.3+cuda11.2\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2445s vs `on_train_batch_end` time: 0.6226s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2445s vs `on_train_batch_end` time: 0.6226s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2465s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2465s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2474s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2474s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2478s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2478s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2489s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2489s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2503s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2503s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 2/3\n", + "[1,mpirank:3,algo-1]:Epoch 2/3\n", + "[1,mpirank:5,algo-1]:Epoch 2/3\n", + "[1,mpirank:4,algo-1]:Epoch 2/3\n", + "[1,mpirank:1,algo-1]:Epoch 2/3\n", + "[1,mpirank:2,algo-1]:Epoch 2/3\n", + "[1,mpirank:7,algo-1]:Epoch 2/3\n", + "[1,mpirank:0,algo-1]:500/500 - 132s - loss: 1.9972 - lr: 0.0033 - 132s/epoch - 263ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 2/3\n", + "[1,mpirank:3,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 3/3\n", + "[1,mpirank:7,algo-1]:Epoch 3/3\n", + "[1,mpirank:2,algo-1]:Epoch 3/3\n", + "[1,mpirank:1,algo-1]:Epoch 3/3\n", + "[1,mpirank:6,algo-1]:Epoch 3/3\n", + "[1,mpirank:4,algo-1]:Epoch 3/3\n", + "[1,mpirank:5,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", + "[1,mpirank:5,algo-1]:Epoch 3/3\n", + "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8961 - lr: 0.0057 - 105s/epoch - 209ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 3/3\n", + "[1,mpirank:6,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:0,algo-1]:\n", + "[1,mpirank:0,algo-1]:Epoch 3: finished gradual learning rate warmup to 0.008.\n", + "[1,mpirank:5,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8536 - lr: 0.0080 - 105s/epoch - 211ms/step\n", + "[1,mpirank:7,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:5,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:4,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:2,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:3,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:6,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:1,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:0,algo-1]:WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:Process train_dnn.py closed with returncode=0\n", + "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", + "\n", + "2022-09-09 14:20:24 Uploading - Uploading generated training model\n", + "2022-09-09 14:21:00 Completed - Training job completed\n", + "Training seconds: 674\n", + "Billable seconds: 674\n" + ] + } + ], + "source": [ + "estimator.fit(\n", + " inputs=data_uri,\n", + " job_name=\"homogenous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### E. Analyzing the homogenous training job throughput and resource usage\n", + "We'll examine: CPU and GPU usage. Epoch time and step time\n", + "\n", + "#### CPU and GPU usage analysis\n", + "In the screenshot below we observe that close to all the 96 vCPU of the instance is utilized. While GPU utilization is only ~40%. Clearly if we had more vCPUs we could increase GPU usage signifiantly to increase job throughput\n", + "\n", + "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Epoch time and step time analysis\n", + "For 2nd and 3rd epochs the below should printout: 105s/epoch - 209ms/step." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture homogenous_logs\n", + "estimator.sagemaker_session.logs_for_job(estimator.latest_training_job.name)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Printing step time for epochs and steps for homogenous-20220909T140047Z\n", + "[1,mpirank:0,algo-1]:500/500 - 132s - loss: 1.9972 - lr: 0.0033 - 132s/epoch - 263ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8961 - lr: 0.0057 - 105s/epoch - 209ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8536 - lr: 0.0080 - 105s/epoch - 211ms/step\n" + ] + } + ], + "source": [ + "print(f\"Printing step time for epochs and steps for {estimator.latest_training_job.name}\")\n", + "for line in homogenous_logs.stdout.split(\"\\n\"):\n", + " if \"mpirank:0\" in line and \"/epoch\" in line:\n", + " print(line)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 3 - Running a Heterogeneous Training Job\n", + "We'll now run a training job in heterogeneous clusters mode. \n", + "Note the changes from the homogenous cluster job: \n", + "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogenous paramters `instance_type` and `instance_count`.\n", + "- In the `distribution` parameter for Horovod we added a new parameter `instance_groups` that is used to limit the MPI cluster to run in the `dnn_group`. The MPI cluster should include only the GPU nodes that run Horovod (which needs MPI). The `data_group` instances should not be part of the MPI cluster, as they set up their on `tf.data.service` cluster.\n", + "\n", + "More on the two instance groups config we use:\n", + "- `data_group` - two ml.c5.18xlarge instances, each with 72 vCPUs to handle data preprocessing. Reading data from S3, preprocessing it, and forwarding it to the `dnn_group`.\n", + "- `dnn_group` - a single p4d.24xlarge instance, with 8 GPUs and 96 vCPUs. to handle deep neural network optimization (forward backword passes) releing on 8 GPUs and some of the 96 vPCUs. To fully utilize 96 vCPUs in the `dnn_group`, we'll be starting data workers on all instances in both groups, therefore we have 240 vCPUs (96+72+72) in total available for preprocessing (minus vCPUs used for the neural network optimization process).\n", + "\n", + "There are three Python scripts to know about:\n", + "The 1st is `train_dnn.py` - This is your training script for the neural network, you should edit it to match your own use case. Note how this script isn't aware of the Heterogeneous clusters setup, except when it initializes the tf.data dataset calling this line: `ds = ds.apply(tf.data.experimental.service.distribute(...)`. \n", + "The 2nd and 3rd scripts, which you're not suppose to edit when adapting to your own use case, do the heavy lifting required for using tf.data.service over the Heterogeneous clusters feature. \n", + "`train_data.py` include functions to start/stop tf.service.data process like a dispatcher and WorkerServer. \n", + "`launcher.py` has several responsibilities: \n", + "- a single entrypoint script for all instances in all instance groups (SageMaker will start the same script on all instances).\n", + "- Identify which instance group the node belong to, and start the relevant script accordingly (`train_dnn.py` or `train_data.py` or sometimes both).\n", + "- Takes measures to ensure that tf.data.sevice processes shutdown when training completes, as the training job completes only when all instances exit. Remember that training job.\n", + "- Allow to start more than one process (for example, on the dnn_gruop instances we'll run both the `train_dnn.py` and a tf.data.service worker to utilize the instance CPUs)." + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime\n", + "from sagemaker.tensorflow import TensorFlow\n", + "from sagemaker.instance_group import InstanceGroup\n", + "from sagemaker.inputs import TrainingInput\n", + "import os\n", + "\n", + "hyperparameters = {\n", + " \"epochs\": 10,\n", + " \"steps_per_epoch\": 500,\n", + " \"batch_size\": 1024,\n", + " \"tf_data_mode\": \"service\", # We'll be using tf.data.service for this Heterogeneous clusters job\n", + " \"num_of_data_workers\": 2, # We won't be using tf.data.service for this Heterogeneous clusters job\n", + "}\n", + "\n", + "# Group for CPU instances to run tf.data.service dispatcher/workers processes.\n", + "data_group = InstanceGroup(\"data_group\", \"ml.c5.18xlarge\", 3)\n", + "# Group for deep neural network (dnn) with accleartors (e.g., GPU, FPGA, etc.)\n", + "dnn_group = InstanceGroup(\"dnn_group\", \"ml.p4d.24xlarge\", 1)\n", + "\n", + "estimator2 = TensorFlow(\n", + " entry_point=\"launcher.py\",\n", + " source_dir=\"code\",\n", + " framework_version=\"2.9.1\",\n", + " py_version=\"py39\",\n", + " role=role,\n", + " volume_size=10,\n", + " max_run=1800, # 30 minutes\n", + " disable_profiler=True,\n", + " # instance_type='ml.p4d.24xlarge',\n", + " # instance_count=1,\n", + " instance_groups=[data_group, dnn_group],\n", + " hyperparameters=hyperparameters,\n", + " distribution={\n", + " \"mpi\": {\n", + " \"enabled\": True,\n", + " \"processes_per_host\": 8, # 8 GPUs per host\n", + " \"custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", + " },\n", + " \"instance_groups\": [dnn_group],\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### D. Submit the training job\n", + "\n", + "Note1: For the logs, click on **View logs** from the **Training Jobs** node in **Amazon SageMaker Console**. \n", + "Note2: Ignore the 0 billable seconds shown below. See actual billable seconds in the AWS web console > SageMaker > Training Jobs > this job." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-11 09:50:28 Starting - Starting the training job......\n", + "2022-09-11 09:51:17 Starting - Preparing the instances for training.................................................\n", + "2022-09-11 09:59:42 Downloading - Downloading input data...\n", + "2022-09-11 09:59:52 Training - Downloading the training image..................\n", + "2022-09-11 10:03:24 Training - Training image download completed. Training in progress..........................................................\n", + "2022-09-11 10:12:43 Uploading - Uploading generated training model...\n", + "2022-09-11 10:13:19 Completed - Training job completed\n", + "..Training seconds: 0\n", + "Billable seconds: 0\n" + ] + } + ], + "source": [ + "estimator2.fit(\n", + " inputs=data_uri,\n", + " job_name=\"heterogenous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### E. Analyzing the Heterogeneous training job throughput and resource usage\n", + "We'll examine: CPU and GPU usage. Epoch time and step time.\n", + "\n", + "#### CPU and GPU usage analysis\n", + " In the screenshot below we observe that GPU usage has increase to 73% (compared to ~40% in the homogenous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 90% CPU uage. \n", + " \n", + "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", + "\n", + "\n", + "#### Epoch time and step time analysis\n", + "For 2nd epoch onwards you should see this printout in the logs of the dnn_gruop instance (p4d.24xlarge): 45s/epoch - 89ms/step.\n", + "Note that the instances are named: Algo1, Algo2, Algo3 randomly on each execution, so you'll need to open all instances logs to find the dnn_group instance." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## E. Comparing time-to-train and cost-to-train\n", + "The table below summarizes both jobs. We can see that:\n", + "- The Heterogeneous job is 2.4x faster to train (86ms/step) than the homogeneous job (208ms/step).\n", + "- The Heterogeneous job is 50% cheaper to train than the homogenous job. This is despite the heterogenous costs more per hour ($45/hour vs $37/hour), due to the two extra c5.18xlarge instances included in the heterogenous job `($45 = $37.7 + 2 * $3.67` \n", + "The cost-to-train formula we used: change in houly price `($45/$37.7) ` times `reduction-in-time-to-train (86ms/208ms)` = 50% = `($45/$37.7) * (86ms/208ms)`. \n", + "\n", + "\"results\n", + "\n", + "## F. Conclusion\n", + "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training, with TensorFlow to achieve better price performance and increase training speed. To get started you can copy this example project and only change the `train_dnn.py` script. To run the job, you could use this notebook, or the `start_job.py`." + ] + } + ], + "metadata": { + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3.9.7 ('.venv': venv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "vscode": { + "interpreter": { + "hash": "77c0de85c2cb739aa5100af7b92fb9d2075368f0e653f4148499a56c989df5f7" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/TensorFlow-Hetero-Instance-Metrics.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/TensorFlow-Hetero-Instance-Metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..21c27a3528fdaaad3c03c86aa8e259ded67ad553 GIT binary patch literal 130144 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%0A&s8 zGuyXADoVIJJQ~mKvm6^V$`G?x*50jrCf8u>e0kkJGG3j8H8GzSR1mJxzlk%g#Ss)q zLGz+C*5Fv&CvS-z>xy0N*<>SF(!9LjLRM3hu+iXjD&BdXrMHQK=!CoX(v5~LYkr*Z zH`#u7Ba$D`%qqU`&?7Wvk$dA3ot_AW-Q9S2z{+Eq$nLXx4XV>h&h9mhzty(%LRM*` zY;NhKOI06VH27TE5HQWzylix?LyK?tN6DB$(q@`ZWI@+g`7#8(k@SYq)DX|R@a%_E zkS;`m#&9E!e>A(uC|_~81o{2j!2PdX#X|{-I%R>nW1WvL?!L%hw((y^GkFRe-y2J9 zAKWM(#5S$vUnsB|j7YkwWAUpP8g_;``&63yZ47D=@^6HD*C~K;#kVK#?$+C_=KvaU z|Jw4%XdPYcthDnkYj7vU=qXQi%17^(`X_78H!ZBrKx1r^uV8X?i4js&J))Q@MfO~fcJ#s)Fi)Um%|)8X;+?e*h8xYx}D%onkf3T|2_7!J3v`tvW$c{dt=Xc5^M z67#Bd`zr_o!c)oPirJ216)?xNX3Z*byMRgmb87SKM*oIp5)fPyD;F602oVL%*p~}I zID`|&);WmP(S z&y^swMDB{tj+8$;mL_I7$@ce?0mP&)F`(v;KZQ zzB`ruyc+ro;qPYh$7a{52~B+TGs05o$%Ds;4S!s_RtZXKjU}u4)XPg5)074HazY^<=)ymMyWcdF0sqc|mXHf>;M|Tm zsjAI{a0q^SC{!+&&DsxZ?d}2+$sD(`MXqU&SGp2Vz!~Dz&Nk+H#LNFRpYN1rbCn?48&#S_JMd{YNlpbS9sT7>T zI!o87iwQR~+Xo-)+VbD~8VncpuRs8zp%MFeis$IaDd%VY#ewB+Vp9xEtseC}%jI2TkUfkKa-$BUZpTT(*nX0S0ZP0g?NEFZ(eQAmv#=~G(sRf3w2SErnI0a3OP z*k5s7!FlKp5rJT^w4g?}O=Hv+B{uN$ z6?gFqxCJx$t7Vi2`f_%8ivLOx|MkSl8L$J|*7ZlhsDEQ<5Vja1XJh1+Hn56N{U1<8 z?bsyv@-pXqSVEwdv4)#8Y&2Ntaf7M&VqfGlQ!B7=je`TTqutZL(Xl@-2{{_8aC zlyYMHR{V>r$4AmIRz~3OD9=z$9_{y@A-KnQVFNEc+#i$e?3^g6<9+F2&%Zt0FoAm0 zz47_d>T0*6b5j4#(HN;Q{-b!|zMs)((O|Es-GUcm|FXgrUQ)z{bz1%9=}3?mjUg%V z8M2F~(lNu$G0ss=7H31DjpD{_jrId3w~AzThwIm@(a2uPrRK7I`Q#ZM?1u|lff?y( z54@=qK00>W{?TW-T93k5>3yBBbqdB2mIERp+-CE!D|y#urSQKfG8?q1Oxh?VW8a3o zc_lJtsLCx5ipRTI#MTJ-gz!xLz^2LY++1#hd2z+<>>E3&ODZoRZRFvdT6LQ38y zd&#_JKu9W>Z17j|`UDGHZmEw;vZ)`EVoMjd1=W1%UG-;g`H1PRLEt>ze_7VwZUFtv zSa*0JAvbO~kuZYg5Er}|-!Ck5Ml7IMeVl!kNC_$1)mR|^9Yo6YJ=6AquGjDpfmdsoKP@*#knvKgCSg{ z8af=98rGj3E$D09-xL)nvK=Cl=Mn{7KIwx(yH3ZgRrzM#_XecGb+yvDD^s7m8~ayo z$Aq15{+B{1Kp9095y2d%juKj}aESZ(;-u>+Izy@GR|Q}+eD&u0ij^Nu>$V!f$e8YH zll;rMEGMtu{O}Xn`2fpnk{V$*y=r0ZmkL#Bqs*LA7>=a#m$$nkt7cVTXCTyTo2dMb zzysA$6vU;L_+p%qK|7F^YrH~y521-a;^H?4v-&qGspb=eh4NF+=S}F8N&)4Fw+6Al z_>Kjbkeq`v<@cS-e}XrP7R#9S?Oc*S@>6^Q=&PRC>$9L4gq*du@wq0KWpvsAD&qsW8OwuP>16>;Ku#!oxU@XycenG9_-ywqU#}S!@(?yH1=^{`~DQ zRjWCA`rUN@5nFNva-pakdOj|gjLp1gkbxtZX$8Ths&yiLXi<^7A$8T(<1?;jq z5U4MKX-F!FYItsbk^GRcPedFs`j}Gn7l7G5vpCiKW+`o~{1ksx>K#?LdwKl|mahP{ z@g*s`x$m$oH29zWu|ZR=ygJuFL4=jg*E;G5%TeS<@A`8OWH<6(DM5wrYgpMKY)*Rg z-O0CemA;mrfLhAsO4JYK|KGss(@&ONd1L1L@q#-{tMVkb(4M!SGzBR}mlYWzmT0-w zO)w01>=zTgMHIhr&v;2(IJF$#_l?iN1RrZZ@TTd$jyH$3$l!VxmBIR}d$m(PoZK_J zO^If%A!J9)SBH@7qOR!;pOFb&cTVw~W(C}GCe~>)QPC2AA}iT&PKlG~Gv3v+ziXH_ zQ{Y5!j!^Q&M|`Jxz6KAvxY733fXzDofmZ;(eATX=%!$uSy|uDgj>eY zi5Qcz+3&5yMEi=sT~AT;y64t$O%u3io}TN<7x*qIu;v!TUPw-{{Y{LT)dcteic3 zGaPe@{E#;L@Vn`P1N6Rvl1J~)25>6sLIBvO2A8UWlC79P^`9q8u5b6Ce9EOE z?q}1?;#1>xKB>;mA^YS7v`#xK(yDwsI{vupFODH2@D>SixxT zX`vp26A|c&rLf@l2Y=2YL-}gSM)$Ql(}d);#~{D$6-S5&?)s(}yG z>KQn+E9|R??D0vm8l3ReZ<5E<;7ilY!drSWH(pJ2gKvv{vy6)89UQaD#@Q#9&zR1& zW(&#b$5MxoO;$>$Ffzr&4D%c3Zho77UnX{&=!M4=&u#d*=lGXiHb8WmcPV6&Gl!gW z;7w^|EftxhJ6x?S6e~M)85C1nI~TE^<`4Pbis6A}i{#DDR5bwVt2fd0`ge*_{|4>1 zp11G+WS)mxU^(g`fD|b{qt8h43Ay{gJH{UMiR?j|8)y6bq<6s#b;UCA=z8Ng^O*ps za5VaqQ}8osn!+s{^wCt)*<|vQAg-RNm!-OZgYxD5{19mHfJn>4)T(sW@szCrdycr} zG}X7K1pG&a?;gNVz$&^OMNjY1NvIByI)3SJ13#PfqwGu-T_R;l);atFhDx_r*kS$~ ztvkNZ;UnCApE2GNPJ!Vo)R*J3E>F!gU&m%I$9j1!WXz}Cw_LR`Pod9q%0QetL^MWal{ZBSr(ig?SM2kgI%lhr6u#qnyUU8#_3tUL;b_ zo|fUuWp;|(XT_gA6B>MY{X*^!F$u9=2*(K@K72y>!oH3#Z9G(mfuf@Y!UJ8A$E}Oy zJYAT*&@2?#Fd(jr^aa#xG9(oeL}_DcXz^v<)2fYZBfQtN%s4u49C90Av^nv*`Hlm7 zAuz}Oc!r<9kyba1msc^fSwa^4w%=au%XXTRIf*)^5AgFqLZ_l+I}Up}Hyuex`z9Xr3-$ho+P6$C_Rw_dz&&R(o#IC%9rH&YpGYqV>+s5Umh&*+Ud1M|1`H>cwG4+>>(G` z1<4hg2YwWX&%zu4rkH!eCD2xd&~tyQckh~QuK%OV^NncbeK5Wf1I9tul}SSN>9Qk} zCa{>y<8{zj2-LXd^Me}KpBzATv*l{VL#!83X|Jiz79rS&wUzpTq|E!xL@0&yBZS7@I5+48G zIy_*9$}RTrsS7+i8=q>Q8EbHr7wT-MV(XfulWY{Yb=a12-;dnZC#3-VZmOHijl$`1 zG}*fS2!7?4N;cDJICeMnnv>fZ<|C7bV9vgwy#8xk7X?iuhO`fAm9%Qk&#a%HF8V!-unT&?!7%e-StH4{dB z>1i##Ap#jc_|j{oS}FzOi;DxKl+!M{!Og*C=1xMkX%9RVM>1fS;`*1y@$8^=^X1mZvI-MbBpOT(Q>YEKH{vXicKA6<-B z;sM6mV9d`rtpS?F`{{{|gbSHViMo$SD@ zmwfs2HV+?C^cEj0rhSc8W(EgOyD1fKM;RInul2qGL_KAgX-T&UTf2}ZQ?s{z8Rerc z_G^%m(r_A#Tx<;Sh-cu4q46XcXT%s7D7vPz0J>8UrYn3Bfayn!HB zm|*?7tp5cW>gDr1&JaHDHk{*;o`bHO)=89pQ1yku3up@cvStuQ|MQ(2)2>%_R~nyM z|0023J^ChWbZ~{Uaq{zz1S^)W1(B43A@h14a74Ze120E|H`=Z%v!WLSrUnn2FTK4| z>v9Age0p&(I&d^3voF!P?PcZrZ!SZ#=SxlI7QdjC4Zt;r-EgIKk&5~6ORh_unf#+O zmT^HUDthJ&T{Daqrtl)0wfEogw2n~>W@V;F>srt&(JpZENWJB6%zCe8+We4GO1ruo zp5>gLV^3pb+SW|{Jt4c-uPaSk&mwmqxH>sg(9@gHlPPS8x$nVeXaHYtrXI&rj};Lr zymsXU|KH2*zP1}R+VXPgQY;Ww{MKrNT_5yrOK@p?CFcmjD%fh|Ba%rkxQuUWLQ*ni zPoPvun&86JoGbf)K$*pIO507!;Dj@w(FXHTV{vqZacPuE*ydtiC>Z9re?ap12~!mi zmZR5R8NJO7$jK_+9zM~*c!Z5t8!#tfD7sblkAPp}8ZL$=s%){91O6*7kU4qP)DzUKwa84nIwI|R7U z=3y^+b=+*^C zE=NBpeTaMXPnDo-S#?*x=vYzH^U>k@tuDQCFhb<1y&ZZ@v+^s*t7tNXJZ~mBk$N6} zJ6rsu;+8miKfP*lG1&~iS{gk0aDSl7Ui9iQX|J4XOu79$VAPF}dUvYs65yvEekL7+ zrmp~<4731d_#4Zn4^FmsGbj`$MvQaQGxXHi z?&7ik<(>cWQ;>tfb+!Tu!Wx||0!qCkG!osNI&jKU)4L8NRCEo6iE8Dl{*dn8%7%)8 zAX-M%**&^mqF0egGi=I4+?DqwJtDBAIeEU8+#cQoAsB83xaw`&m;K`6aHsg#8v|d2 zV19u1YjIXGW*QgDTLJj*D3Krpy023qb+b3S4Wzsv9%EC>;?w*HG&yM$4Z0)))rK+8q-A#Bk2MuUY#|~2CgbJ znBjm`PSmcV8+l4bD*TbcL8nrkX))m|tG=3nu@EmgNOt7nI z*TxideMM2YdkxQ6vDeE7DKfHM69g;Lid)<-)k?`n2^}mOf<@J%wW5a^j}lK!<)Usb)}EDr6h|6JLPwv+Q2VT{J}` z9wFqb+=pp``9}ePu;Uj6>{x>daH%^6L;CqdczFk+(Yqf@D6->8k1Hz5V$8wlwrNo= zO|N9kS;HU6|M^X^3_WpGjSpAFmasZpRprZ%8PQ+A~^DFp$kPtgFGf`}K1gtcy?cEAfUbZI;d$#iWp zmz5vml}ITk-*+z}X9;>{nm0K3#l3G*fWa!z52$C}c|3Nu7>FFKHs$#sThNrXfGtq8yo{?FptE@bAJcMXbbz@NDdtv+WcOCQ zeBu!&Nq^;^ule(>ZIz(L5&%7*6_l-Z>N5SyjZ}H=Pa~ob|2V8dX(B`T@(v^y5PN^% zf(D!0guXb&IjHz-)k?`mJwI6ZxO#QpqosD$n0#JLwZ{e__qZUbSsfzYlEp#Lo%x!? z;p(izg}IX}UjS&e1O@w=7jtq(+pabKQqqYuAdD#6Fi3mn8%AYjJA-SPvOaR?m;1PJ z>RxxgrtTOg(x`j4GPS{U-v?PCw+RNUxNp#whXHFAcQWE3bw@^~yR4qU1}0@Ofo>wh z;rk({2P{hm|93zC-d=x(ItAaWQI2M(%sI>)5PelI$_<>@h`A8YRroNVyri|<-6<-w zGEK!NXkO*5-*!rI6F!m@Uq&{&ZK81vjpAxOg|5o#<@ev@`Xs5(EC5u3YBDoXYzN&u z0K=28#c+GuokAQDU|zfvtvLGxR{(_O-IWeA>6PkFPwZE^)zn?eh@? zNXf_i4T)}6qLqSljfnFbIl;PQOmS9!u5L_c}iHeZDZdf7OrN5A^? z+|U)uW`l@2h{+=0Jxa(=09`|4qa<|q$d91P5a@zfWmV?W!nqN}UDowtaQMRKm}Tr# zFlVR6xRzR!#+6gg(q0$xxfz(}z&gqnl)Az}QEiHfLVcVTKbzq|_ZlK4Mi5luo;j-boTlr(VdIM%izeTvu|n zU(`{GZu@{sK4$7GnlO!`Rk@qOOEIYbrmTWQh2gn&MR*uwPrm{@hDw|x)0n|T4f z?&@pyb(NJO(WpSDi^C9k<oLY=$U#yLHl6thwXe|D4?Ozg=+T>3G>nghY8+nAVAZs zRUbBAu>QSaReunpLzqy%43yPnT@T)Xf-No?4abwXz40t62Vg_`!&|v@^{>auM>|Vn zl^#4jchhAD;Q8;bD~DFG74-iJt`b0a+S@E@e(kyYjH;*+SH}&J;-3sp6S#xM9S^W8 zqQ1=CKf7|8bk)ksm9yJrgq@BmogrNpQ8V4(p}0j0FJm}R<=gJUx!)7w@_zqn!vw0^ z97ABR$SSet<^b2Jyf`p5f3x&fodncEDhv#mS!60e=Ft6sC-w|Y9)peSk3)jnLrb@6 z&O>4J{AI2My{EfFJUe4235!s#{UQ)N3wd%FVt-|U;tno&E#qvOHPxnX?a(M*(?5UE zbzzjV5lmeF%#F%L0co%G1ee9$Eg7bkv@o7GrpzTP%>6K)rV4XSbh((MthyOXK3?0e$E-7mu!tL?&Ch`vl7 zpy;>JeljR&U@(ZO0~=)$bPRiN+FEcSW^u6E?e3+|SWx5KnP6@uj41BhOl4Craunv{ z6T37Y7s=PH_4Y)@qmOEVK)$&9q!JS!UJo6K8j4oR@@+WbH}k4|H0rt2?rteFGcA^A zo^5e=G{9r1rxX>o%oVBx=N zYDclQ>t6DAt^ZT)0fARjZHuODM!piyX`hs$wQYqPquT;Xp`aC?1=?4W2VprE<1iml zGhY&t@RJcR6#Wq!^)kze49*lGs6jSGALu*36vGw&=C$p2SrsFk`RU zJdrXnV9(dhrArdF%06s{^F5;Jz1lSkGs12MfXgL5OI9N8BvVaK<(b{ORx)?uPbXX; zd!6)#1!}XOO~Eyl&LE#x`EKrW8K^@*{M_Ve*!=5}*SkqhP>)eD!|^TI>`wY*1M0#) zqCpwOL(=T&MhlJv<>BQQmP_ANW5V3C>SB?GPju%KA_b+iS#2TYrwUXRyRR!!jklda zv)5u@h_1I-4?Oq)7!of^L2y~p9kX|ti4!*nglVMHyLS9rN-*3V zS^ZFt>IJ(Y|I4(C_kuI2?}0SlzE#-HRgu^Uyp+lEukgEDzwef61b(FA)BDxGRx1|HDT z>*+SvSa>9z2b!aKZZIDTlDtj1+W~UEzN%No{HEtGPc0^@9&A_Zn=zLlrKaEBGqS++8|%(d}lZx!dMUT8C> z`N1zJus1m5^2p`ZQ4rnWxV~Ea$VNS_?v2}qL-R$VZGVJnP+fTjElQso31}d-`Iw9P z=8pH`!C1_bU&p(YRhe4xB)2hzXzB$o%mN%}Z3PUUg)&~|oa?@imM7R6DJd%ZJXOrd zw#BpZZtWlMfT@MSm<$)f*hR?J|9-_d;g|mNC7D^p%Bzg&)xom+ztDw0DoBjXv%tP^ zl;m?(PTogd(lQ=r?lxiRyoj7=WZ%8fAbERI(`>4uOZ^BT}gk0mI-$O9Z zEbWW}dx&&yW~h3nZ1=@$ojA>Zn-D76#O|%i2PJi8=9op{g*pP@g%v2>4!67$9EVQ} zBk|FSq@Y ze;EsdUfedb8pYxqJDk`!mp>@R?e{`nnmBYyF*5{e3MZ&l`|@c&BIywo;OG{;q2={u zQxrRS;;|OvAkB$aIh9~4Zs`MBxv0AP0L@qn=R#EO>KK^21;nyCiqxc40O4<8P&5|3 zlWZyDLfdq2M*G|yW^fHzOg;$BQ?eYFTe&}9A9qAK8A$<^P9G}dov&&;yA$4i`W8|B z`CIBOGxsrh)oWFJxFXzs#^|!!Q)EYmF1fpXmA(rPKj8FqM2%8It~%yU{V@4MPK4eP z%+oS#W1f@kc{k`2EL^bbdJEzQu$oEW&!A1gOh7)xu z*W!KCE4xqYGncJ(Ym-2ppPuLhlNr;{WX3))leu;Qw`;CK&~EZJxr$sJUMIHH2bS+R z4U9aE(Qdr#%V!AjI?4N}(ueNcjmh)^rJv$Xs&l-r4d-ORyKI>Si8_)?prR+Hy=puA}Y0`lf*gU9ag(99~hTmeju@a|v-L^h3m zli>k`Q)l9@KS8&uV40>nCZ?!D7e%!xB%i;KMu?e+M1&Qi2~eDz6dw> zW6NGeqAI4fXBHp}uVO6x|JZxaxF)l$ZG1#gfe}yyR0KtuQbl@48AYV2G!Y0=1SugP zHH0Ecu>lIwn}yz+2_*rBDjn$%2%XSEfIvd$-Eq$IoO9mij6T2rhySPdlT4VK+NaSz#uvy{z9~bJ_r%5B%^l#>@o-KRP3a$Z79pylwj)kk8--76V6r-8=x~AwK>d z5_jM9p@m4XziFzXvwOUjre-1VDS=}Qj%B(irRq@t2xW2?_-q_oRHkU{zc)?te({6L z03q(;iz32sI{ z+gZQIf^&VGCu6W#Kjq{MKQwx&A@06`FYIG>75ll-@du)tDK*?*P2%&Bl+}Jy?4;Yt z=n&A=xsW-78h;cK0d7Ou&2sZMbUwwD!&`g92gqg0=$qva#IW+ZADB8%Xk0l;&p=Ms zpj{yyi87c_)HQaAF9?3gK*fiqvVf5qQAL+A5YNkXM0>jU~L5?_U5h}7LDBM@#Ft=-2y7h!WE>t17zqZ z`KJ;lD1T>q;+DWC|Kzi&&k@({8AfaBPlkrgd_Fk7OUhAOt9`9?<+9*cw!TV4W?Q9q zSzB3V0aZ!;bD75-71!fH+RP_?Z}d*Pd6M@RfPN>~%4K9g@kIp{WTZb$);vaPLn09k zdiV7NG0O_}-ZZt|FC|>c=w{$T__Wu{qyZ}s2e(F;S%R?_EwXQZg8@#S9=+5=l^ZY^6Wp5&tfk zagi@`!TV=89Qf6zzNy66Qq$NTJWl8rVILJmg_XBbxz+qj<1M&H$j%MJu~s{`p@3|! zS2EPwc>)IFTnYux_T^UITzGsZY*-Yv{gRO>8V-s;I#LhynV~OrU83f<1-?%x{Q$a~ z7-tvbXyhJF?=jpvFl=IxNU_htx?VU^k@zfQ$yEEQZpga6Y^U$`lb-W5H1%#2n|4q~0xV(9MZ(`@ebt{JR9HVe|i% zFM)SuIcz}Nxl_c+;pmrBjaed3FGNC4VyM||So*G4;~Tk}_@@zboT{>@m0wLt2t)wm0N)GCiJ^%W>`g2JD3_3-x;L zol6**rfg5u9Bz7JJzsH{Ki3H13-Zcfwcctw9tFOy{-)FKUu*2LpanT~mNyVP3?3$~ zZ;yw4K=fRA52|*4C`cg&eQU%E1gr64gYN=IHgV%DH;85N*RyB(HMUG#pfO)+iHuRf zi6FwgJcE04=;`P`?11Df6H%_Y3vaAh34%cTm~FwmzN*IM=qEqi2y~Py{_eIBcKcnB zVD5mzwIc811)zJHW)1!9d<$GK(a8AY{r%CxUK80`n*p z_c|btZ>4to;QdTxj4{gJXIAf8dgmY1TvIdc8sD{do|-0@yu5wEZ*02rL;T{hm!^0N ziI)we#0-3U@S`~Ci_*B&WWGWCCRTPgu5-|^6= zGD~t!33Jex6YqBl?)-q<;sB6_&O7HB(BfLX^!9gWh^&h2Z*U)>p7SKHJ`tgShX3o@zzANLd}WOH3ML|fDX~| zD~?~H=Sb$c_z@@W_G2#a-<{ii(RZHYOyPTdWH+x)$|i2Ga%T3s z$_il;q6qje#tc6GN&>HaRZPa*pk3lmMc8FA zBZKd*IT1bDa+8R_xR1CK_B+@vW?Ma6?U}z7D)jk9-v}rB zdw#f_@dD$by?vD4{&L`K95$EUo_)3wo4o?5kk#J66jEhMppDK`xhR(V?ZfAYr;8IH z)pX`hhg;v)C+MhN*(PV8}X zvJ{--Fv7J7bjx$c_buB(s6IcZM+E_&{dsEjJM>uBfip6|bpxwj^X0i`6?SmpQ8MH7 zyggjLaA1VzlH~1(UKw>?E1q75K)S_^m&fgvp=ZMX6$kv^YH1TwL*_}C1_5;5O6P*F z{h9BcP}BZ+eQWrrFMiSa5X}Oj440Ld~N_k~5^+jC=G z)DQ{IOfzFZ~e&5b_VVEf{poShB* z?3<5zEa3BBv_NtMzaBG3pSA&(LsX)P_v`)IiZoe4YM+yt6#rZL=LbFV zx#smK5#)EWX=vOm+6d#ubOZibB{Frn`G>5#p3^wRcrKcn`RW=>xTZ8atj|`&z6GFy z`9dG%T$+8~8}E#=1|iBfP?}Jxgs0}Lf0E<5NzGZmSlE;jV90*CKp4d7MBV{fw7q2V z(xkxyBIwVp<+x!>`t8U$5Ij=0d=3{a$;$)k*Y*wG^txIdbng)N#N_#_f9khMfOP=l z#4({~o;q^FfUm&gvhLULB*9hA{!|k11LbG;hlVu-7f`uDT=p6Dm;yB+hJ9o%7WLm$dWt{=*~hO(1clIm)%4O0+8nvr#NiuJ zGIqu#dnK81mA3H&HH*(g=VNB-Uyy%SvDKpoWZ$i=B%ZVpki*iRGoz-U#%yI`Z9j=Y zH$!(NNSuok2Xa#bU~(rf)g+6EjLZ2yH1*arDaj*n>B)8at~p0u_|kgh7_bk|;qo8x zFJHsf5PR<9^OM(_o5iFj6k!*2p;kG=>hzt>TWc*gV%SRGyx|I@;5(zyFyhJnCB*8{ zpWJ2;14goMUfN+{8EF;Er=#0=wJZR-YshF2l(Go|^(-gnCTXH*hXCmC-WgF#IM;Xl z<-(jWPr4%7>WP7C5L8L<41&jeq48@3vU8Y4O=V^5R{nU5*f5 z&N3o?UD=;A6_wL|58FS>=2ZvpV!;Fwzs#<`xivP3Iaap1tutreFpoeg!3go@W)V8gj);+&?OC3t+cR6d3++0QeE8 zJJA*`0=njyEN+3squcq~mCXQHs+Q2|YnZdNwd(be);tng;M=Gp^#-_96FJLcna()b zoTm_AxwO4gs!wERx*KwWWTo`3GP5t9LZV?e1v{C!LxcE}L+m?PJZ=h@%Y zng8V$f!bdjZa?N!L}a6NjWx z@-^(#EGSG>dqevUN!u9)GSCSGO52?%(9QyM9h;~Imw1;_0!2mT4OQRpBW;Q0;>Q%X zJ+=VSq1FOR-c$`)Gi~z7a!$@qjNx-)?I3+%m6^$#e5u21d$4*cHkMxp@JcW!wl9o| zw!SKIej^31>GvrbC=tIkTgqkROHppWrHk>iXTVlr^rO&&$4P0ZV(qsU9N5{1*M3aI z{5!3^A`_5T&H=(L$8;YXYcAqMZp~`%W&L;U->^~5lpu={61AP2UyGO9InhVi&iO10 zmHd5@o!`Uv>6-~%w1ja1!PYG${HycA0b%9#JJkox`z>X0CHj`Y3^fRZ zxx$ZTm%M7WXR2KGebsc=Cg81_0PrF=D#Niy4_Y6;m1f~14y1rVczC>n+Q0s6wwQBUoS|8dXJM-=uY*x+V zH@ycGI7eJTyP2XZoQ_gS4)QP`q&Z~svfiCmp}bcDlrT``&CmD>RJ*NS0RGcH$r!nK z=c&#GNeiXD?C|fera(osZJXS|9F<8_gv}_XIDJNtNg7tUdCyD_q|3JXlUy%QRKq6#U^pfx56L0df`~77YSmNo9;MsN3hT zOdNk1yFTz2jfPnZ?#0@ej`%OV6^4|n_b(ON3OXf5SUyJp(tci=&O?O#0aaT6vZ}QP^{UemCtm^BmSh5qF@Aq{*q6*2 z#Y$}gW3AUAFA)Qoz<{N5XX{pWhSHTL1Ew)CI}z0ij`nbOe^LPwDe~=o0SxgI07u9toXz2jkVy_+(*gu z^Fc=y5)cZF|8YL)Kgq`~ewq{;UtwyZ4FJQ7aE;Mp-*)Z7o8Lj~{z9GbBZA??zu3p1 zO^_RRE~$)19+G%PuZ>)O9i$n#tdIz|{_JfSd2VUE+w8RE>>3801Myudd&PH6@>{>| z7ZOlsi#{pFA@Qp)<(;71=7$!uz3oHofg79Y*=oLjuq&R$==!GNx(#X91p&k?mQOUg z7dh*+#0|<90QiI?zT(lILDxJuxYN1#+N)gfgAwPqo&xoCBa2sacf8w`DngF6USw_S z2~cEd0d5Lx20e>=^9wC@-0eufNKXi8JyP(re>mN>DR65o=_Kk$CrnlRDNs8`F&vWs zEz>qIwYS(Gfn@CQ$WG8du&Bgvz#+kcw2TY=DCZ4=mbE}^#%F2Au& zx8%MMUf?Tmum&2eQ9G~juaeFlh)iwkAcqs(Zh&ZQARt4iZnM9^4BBz^Lo&46a$Oq9 zpE%%IN{>%_m7j_iYXacQKt$J|EhjrVL(N-VCpz;HPVS1RyA&esmH5Q9%iMRiAF`5a z+YOOL_eSG=#c=-=>VNzR1d>4`5=*%6VhU6*3DnPn6wefm2hM?1FYvgV&LKVD0{fkj zmPA6RXzj_QM<6hAxTlY;0^|Zd`Z85H*|7WhzA^eK3SBwz5xNxhB0ZBU1A-*VzBLb>wI1YBW6svXw3fmwI?OA_ z4(Y;Q0sB0xjJgrDS#>3RTr2s>bA7ADcf9=0Dvc(b*vM7&!CP~(} z%8p<8%ewjV7dx4cAf~BV5w^$@gHNC?aboiL@s+d9SAIrlQqMr5;1x-e>3neC>dOAL z)9bT?3m`GWi=v3K1nD zv80bdfDCtr{solzh~=}NP9 zZ$R(Mzs;!9x~dzrc3B*2s_`o=c5!V#9|b_gT1$M&XsFg19#V!fzsq|%X6|RtE--kt zyaAz=C<6oEf@%FPIqv+r*FX@^H=ifn!D!5+dZ%oNUuMcVG_LOCMQVXm-iJlDCN(yopBJ>j#fkLu+6K= zkLf<^GI>gOgVwZU3p#JJbh!Qj8h)9`kGPw$768;`CQf|0FF$_*A7!L3ji@@TpQgy! zrg;tY#J$>C83q00$=woS!!P_t5NxmrXq!?1x@%Ox&rdh7yV* z`LrKa6F*+es0&;>$_I{juIJ7}&aNJOfFQi%XPIk1Za0+Y?yR6h6nQ^xD~u3O5@IF> zr~_&$0w`z}8^59;kiJGOAxVzt2^AfVyEb%$YOJ@Vx0xD?suHW51oo;uDz7-Z8A9Q+wU(p>Rivm z6^|asZd#uXkO^Z-T9uG^uB@(3yPNs;HG?QRqtnIoS;o{$;m^+GoX(;f@qS>t% z*A)C_%*|MW?Q33({vgs0(FqUde+3tp6Wh`ZMx8K`F)--NH^XmG5>aE~pAZExLHVO5 zUo;0#n0VKAvv0GkSr))uZewNN64s_+ecK`ieHgDaV?BY4S8xV${Co0;m=ljH@wsNN zjYx^V9ilmMocW^av;XizfD2pM>gvI51Qub}la1yjd77M2Ua1HVJnX3=n}Vl1M3cnV zwX;-bVG@t_TwK8r2^G5jM1)2sA~J$&Q~vRG$B8$!GW(>7F09eF9G^Mml3LmfuCoxo zn&mA;-FP+CT8L|@T2J()s*|tl#+BE1F?MH}ZsUG8+f8q+TW^+#N4AL=7gpgU~bE@A{<*nqE4K6ZiO z!oy;D0+i^_?8f<*O1)n9^P$#9tM74jpFYu80W4 z#Fh;tt)peGXiPf{%pXH3o~&AJRj&C zpO4lJ;ov%eKkR5`5y)uv4rzPuV&YJ@k?(U&qXWT9kQ3v_H{eLy{fZ`|P8AiA)99%P z94U-}1<$T1d&)`{l8hW_y{`>O<)$2!8AkJ^gjWY9V<7J>V;g_E~lT2Nzry zW?K4$0sdx$1`z?SZZ$()sC_K|G9R5!WWQoR#S157Mo_t_4`Kf8 zhbC&RV@EVb8mi82;zr4!O;duDP5V06aeR1L9sMNBy# zTgoF*Iedd4?ixdQ1(%2nL}%?a!!;~%ZCULxA09xHa>4w&{}%ZF_(65=h@sPilleLk zWIxR2c0^M0>g#Iyj0=0q5pW356(1jb^xS#@7LEn0og&@Q8*nP3Uhq4BqW5)1g#tsx6HFDMsrYp@fKuFsM$c^6*%p2M78sksdAd$SoXeot)OG4FM%19{i_0d^`9 zoPTZa4h3Pi_A>|Ke_BnBO3X7O7keP2;z0D~=Ey>*L0^tnT2jRFeWrK?iLC@y%jdW% z4PChS71*+q-kV>j`$IH5r@U6m5#6bnn_`L|U@DKhdsp^ZMCk?2uQd833jl?AMh8g# zFp#_*Sg!Kzv@8eI-Zo+ktiOWE%OK4l!Fxz-*^i%-UuO2TwchzdtGg)9la_1Ac1uTq z!b@`Rxp2jUdv_~A<$VlEEX>#Y6u+4L4dE~hF^|K$gwD)v4dS`vD>ffg;9%%*LTJbGnxxYbl-Pt)Hoo5^ ztGFE0e6`#)V&bWGDEqs@0k5fO+1gP}{|m~VQ%$wA$=Y^sUAgJbTJvhMn#eu!J=S7R zlVMj#{D+v|ZLyWb{!g%jUm#LFfmbT|>xQ{v){{L=V`Yh%S6#ws`yBh z7DZrNZ#W`9ISzzqn;;yNXVIe>PDF8-%^)n?PQwz?Z3S6Fk#vHK^3L`g{i(6*H5fN~ z;}^}poHtrLRXG||!lWJYZPb5Ybq9yck1Ca*InsFZqwUZhH)8@vNEZQI%h!+RhJ6qA zag>N@%<^G~vCF8>g+W!%J_AQ5^d#7aGXv4X4ojl4 z{EK-bg_lGq4)~Na`*;p9yDWKqlR>Xbz^KiSktd)Gi;zqwQj&)T3yG@smwm$-St#6{%O2@SAN&Fv$WA-du&V&oe3$W3|^kKY9pp7@)w zL{4J{0+)H=u>041oX&qLip$tYK&7co`yC8~$DAhhg)E&FmECw*=zneDbCx*GDe}3g z;cE!9s@XV6VT!h#fSm&^c@l9UO_|pG~V9Yz#yTi;KZcD0_`L?Ff>` zdLl}89kZ$5w*e0Ox2sox_5TE=_!-9*_I$`jakjq}-xB4YQ7UHiFC|Dg>&K0e}vSeQ*kVT9^R7Nch$ z;~cg}fVQur$jko#w?`KE?hcm86W}nDZW2Vdo59?oHTaWf5-(E**bOD3_8sr>#rX1p zuEnsrh-6&VN}l!05t!M*ljiT{0OD%E5bD8dlsJQHV{g9G-5%sfGH-PnHJUq-q8+i} zcd#yE$LWz$tR9i;X&fu#TAf~?H#UsFK_rFqVP?V7BkR%AV#-Xuz6MdglgY`)-{q5tlZm`KUPyPw7~LD9TVk34N!z3ar}hQtxX2L$D28kOecsM`&t{|;u~FPipI9G zR&T|u(^ns#FE*bbzdgiB35R+WDi!H8KtBeJy|3j7=Yt=ohBC0|&wU*Oy6*^|BhkoEp^ zNnG&e4%e+($PSY5PHKnDd2r5eyXK%h#(!N`nKcYc`MR~Z>V1C@EjlkJrqN*%w;oHW zWx*mkOwLd4+NbBwyLL~bWpkmFD)o?jV^a1|?yS3E!B_;K6C3)UH^uiF5+NoPKwVV*`xmK#M0E5`45lo z_}eH|i@G-e(4(A)0Yp!3$GofdRumnLHJn3tGNmH2X?4z*IOa$CqikVYy>2*ELB42M ztl6`CyqBlWfsyk7_gho;=mPva9b%)`am|+sC+LiD-f&2Z=LLVrW(m)}!+wQ@F1_!b z5}ta)Q_;AnJq&&$&$p^Vjb9*TnO7W`l~U-E5)52-Ba|7dLqonoiblj*bR%vp;tzCg z6FT+-yZL~8!${?e2*?^^JXYl`;W;Kf#5aPAG}|_k_AAd0NPpqtN~?N-HVdU6HY#3$ z<#r9b?Ty`W9<-g^cb9!`2EhHJX&R+YU}lIv@Qz4!*_V7JMy-&}qz}KRU@-?ptOI%Y zT7eXk1TvD6gNTV*B3GlgpYgg7UtR?!KVl1_&jzmiPzE%5-)6O-_OXn=VnHX+B|^J1 zMZ|XV0g}dnGg2XfWElY&TSzmwa4Gq2w*}PdIc_ACp`Fgm0H)CUTD+AKCwWDT9E%d) zGD#tSU{9$ob0XbMI3cIPXoLkiPU3tb?_B#>iHbOETQsWDqKR^l5)rYtdL5<#M1Q+kQ4Bb=UBA;PY3{${CpPd_ z;aI~BguCnI7}U;7%kZzd6Fs#W+|^5*x3W)6m^3q&t5mvbG&||Y*^D_`T+>=^%TkDH zqgWOKbN?qlR0?0j&czsmb8~r6v|nBdDHu99G4VOlW4+W!^YIRF=C7qfwL0Etcz;4w z{89Ew1C=<64f#sIQCKZ%J9-@Ce5#ya=G@vXCKbMe!;YK7Znv@45L3van`*ZjWc4m` zXIWfoNzUO;US*N;zi6}ngl{FwYlz8can4H=P%$;jmjsNgq#d!#I@6Q|JQ;uQBW#ZW z;2Nd(>s2x9HS9>}*^1am{tP8z8gT4^FSo7~4Dk%q+$S-0roKXGLLQ_Lxx=*J*CR?P z(NpABJp9@N)mq%6NMsyoX*kWU(_1%xp|eoQvfxWy1FS;P%|N`~amlho>}(6tbB6p0 zic(=R@pQ8@rptC1fCDW+@b_8s(u%$6PPvm4V}`UKA>GbkBLdO9nt=CV^~^K&n7St6 zd8e_p1E~CP21@cta*~orTkNG0)bBCI|7pell>ZZx0DQlQW&}C^ca*Zbo(AVZ^%U;H ze(QVNe>gVnm%B=)m)!+Jf`}& zQ5^Pv=J)W&@Xm@1=79Ts-*ez@LhR3-xI;9Ymsh^*?0c4N=L>1t?`Q8pQpiXd=-Rhi zp+ZA(R19PvP(u+^9mi$~!Knrs6Tn)|(^wb|va&wdN{?iW(yb zN#Tb`{xPGr9=QXkdY~uT<2s-%{0`9}pl9fUZkWgCdM@_JWPHU!Tb7)g6GRzEHp>_2 zHJISO@B;Xr+Ax`)&O0bo9b=zP7nuQ2DZpq`-PNy3m@;ij+>&e!^Dn&nfD#wR;;eA} zP>calz{DkGG$Z)MET7U0A7+MA(bF(i#nyWeArn^~7q0$u-Nt+dGM@a{GgWQc=F32X zh|MzEA->deq^jVo-?4rG`&1+8)`iQ3v_}>-f;$Pm6R%#UC6wW>?skITKQ#CP4+?-cpkD{1fDfiXX6)9Sg3(p!-g6?H1- zpWb>w7mU>H26)O0-22*`xP2+O9l89UFbKbK$D6l@}@7HS{ zToR^)`U|K&;R^tO#j+F8Y!0yMT-Md$8J)`1WB|sT1OJ1$*WeiMq&zez zChUwo_1bJ@VG@iR$P(jS`g*UG0{BNCnfYu={7iMLgZsn+bYf1VZv(x2=X(lV>Adi$7&>AQ6#rP$X~Bze@OlW*zklSoP)B;LdLEa1h>j2bPV z1*2uWyF2TgbWZr(AvOpq%cmH!BqGK!>;V|{z^g?*;qFC7Xhm+ZvsKdk(~k>e_|1&_ z<=f-FYR1QUI$wJWJ>TLnfs?31TR$Y>%956B&OuJ(dPj~0J{n>DoVWz0R z$Rxt0E>bV&d||l@5GSv0R=1=}fm%19P`k=Ucg`Ew^*L{7hx5Hcga@_*L!sz#xBI&h zpp{||+Zv4^IoUlNYjF#GIdvEIS3(M1rW&2w#G3-kUGdVsJ8VeD;|`(?5~mzJv+p99w!Fh~Dzp*&dTOh~2?Xi8;Q z^1eoBah`C#vBqL#MJ2w$&NxXkiMU zts#}wb7g^;JQGwfsY5}`XNqI&vK^L1N0xhcvq^;!u~ekqylaCfB0JblpUo97yAX%E z>SH(cx$u*x=EL4dCO;FerjvMlvsZ)KVB-;tdxD^wncN?bL7HTvkPhfrLrIbFefhPW z|5t7jfv3=?UBa##M~oS{e?Q9=0>AEso$$Z+m(x(1quQy5%BY)d16gA53l-i*0^)kXMM6Jy7 zCVr(mdfz2EBZ%k5Shk98Q_ZTmD42n8*o}j040RuDlvM3gw{C z<;0+Q0&f^KOzOm5<<@RgD0^}l8`Mm?5?LwaWXt_4l{DuTP#J@ZUPpR9_VV6fk!x7i zBj1iBhb2>5{$jc3cmt9JB7x_dOquK|_Z3q%D_URyR8)K!U<3E9hTa0ctGthc1hvFl zvL||5Z%)N@w&K5HBg5_tA}Ez(oK<@SSjb=rj>&K3MFbMPyVhDawoe#K$1EwW)`u}T zG~b!pwXB;>c5YEIW3S+MVwAw|RbRDRh$#I7W8$G3v9W*Ytf04g<9?|b{|sjOaorGC z*+AR7>BYF8>RKwr6L69qU25lEwhf|J)bLs}myXKzl5?X_$CWrdE!Y})?T^H?89;7y z0={8P=y#<%bAd@2LCL-lR;Pz3^UcOD5_QA1qH+T%RhDB^x2|xpw0R5d0q?#?hX^_U z^!9_&C-*kNIc33ZZc*7X47YT}j$! zJTN>^DV-4a7gdoY+(nuu_9Rol*~c>u?BMiR$aE;D_zTM;9*?|AZJlB(Ts_OK&O?cL zO~f(7K+dQ__K+8$Js>p4jN5FKiI$uOa|G+!;v{4)5#1P>6C8u@eekBOirsIkglL0^}h9p5!z9`_Xk5S`+5LJ1qvc_OIxo$w;PLP%uIUpRn=WcO_()(BJ?^z9F zfCh*8@znyv)a$DNw{SAFC?bkr-h*fo7oVo`_Q043d{j_Op5FpCTH$Wd`1Y(_q1d@4O zt0$uGwucqRuk5bs#||1wL6uN_m{O_t5kcj~;oY@rA&!Bu zh3qVpmW_`_BZtSR2bWQ9`du+WI++epq$+M#Q0Z{rtDQ?AN+c!j*BiA7W?k(1lueW` z)>=7SIG;izD@eUxw?SG1gCuz(IU?|MQ!hpTw@#OZ%sjyie z7aSZP1nL1=CwldCPYjs4YHM(-?9JJ$fxsB;B!9C*7%#MiPD;y zm(}?WxjfWpDz-TZ9`8QYa!*4w@#l{Zi|8oW-yS)}<#q8qeEPlJ&OVsKNtco2@o-y_ zF<_^~sOlQ0C?#QR*Jd-PdOPQi_*JLYVUf+o6WswEf){l-S{(51rq~Qj>0b5( ze;;PyRW6@c1oDi|?oFb~-0|(U3!D={I*~@I|VnZ-N=Xd$K4DhOpTDS1$lnPOy)h%!JPq z;GHMx8Sfqg?|kf!$|q&uon?y-_g)8o>d<#l@TYYC!=L(>#|dm1oH2z10|V@$< zV1_H2_W^FJ!!vlW5?5;1b7xkj=ZyzLl})ih^fuVAZR24*E82Q{D_;Ue8GN~N7`gia z5bgtWL_zp7*}U*C7)e7Q-2MUFBF{yg#i=J^p{&dqp&MT*+sDDU?u#Qndc&WHmbm()suOn*Q;o%cnj;Lp{oUAFKO?Opu!?=-Z zp$}9O!(uyvtu9~GX=28Hx+Q#3M_tRdP8LuYW4;ym^PkPD38Tyw!;`JVxC&9j+ z>=|FOYrZ@c}Lk`nn}0ci#YA;!N2ux(&yEF2vmEJqb@cJ`w1MTg`-yL z+I$yv60+q^r$2x8An%#gy&kZ*bUS+5tcw?QgvKBAN`k$yi@$MQ5PVKA%O({H1QVZr z_Z>a>oF?q1HrShl^ed-RpMyR7>Eop)iFXEbx(3^knWN7OhJ2zj{%hO44iyc1S*f4F zfNj8hQj&y#ZO09syd?&f4ST{A$_}<&#v|}MSmt+*VYMl+?Ngzg7VBVH>%rtMFCev_ zKK=wH8&x>42^M|w|1J9eM@h3$b@M-S3x0xZ0=z*)FefH;?-$nipMNZX9>kLc#~=Lh zzxx94-3xpdEeaqJWVQeG6N1OVOFgqX`I8s__g`hk0M^%AW0>jRKmN%sWL^X>1+LLA z&Fg=y{38Ucdx6hR<$wRgbMR8&=Keon{7NeSUxgv}NCnJZXQYhz`#&hQ){vci$y0m% z80TpKMUUo6ZO&vH~RZfGn5x=um;7f(>t{ zVZN#HTE%9=hbwwFb|u_{pUD#5dN^%7ly*(DL7JePPEY~47no^Y2j;u8F)FQhU4`M$ zjzvw3%yR_7i8pK_^h`?YcL)6s_UhiNbDibaO;&VlZ^wp+Fx2Q%DJ z7B}&~JU>avDALL?D&Vs3^YQah;Xp}zt*&{{VCUmsm*Q3~%Ndbn z#V%=;$R=}3S66o%=e9c8V1ZBa)FG-1o0b)Nv34q`swR4<@}RD>CMfCftV(n$vMi%X z9fcGeB7@?Up`FlwbS?XCPEB{3<`2^5s_*u?^ZIx75aSY?6P0h4Tp>rait8ibbwhrhTe1Kc}%3ET6oUCv-JJ7PQ{N;_@D@ zt-kF6v$=yejeHJD6RlP;*}%e!$0I(~+M~ z^+_<_TQGV&z$r@_CHi?*wbxiR4p5O>Gk^23jMt0)3wkMn#$#{D051@*NP>O|_{O>O zonxzLjKOeVpjGgB|0NCSTKb ziP!LYOVfTX!+3GT0}BlTh{N%&PZQ#BrxL{!8Q&xg>?ssi1HF&23GeZ`;0ZXD7abWf z5O2GL(r5PifZ^F%t6gonpmLe9L*-!iMns~%2RqN+d4txSo~4>e$;i2-ruX&p3}WcJ zWz!LwYdgjQ02RJG8F}H=^nrTSN|4y^!=1NVWS$7vl%i{HPpT#&eM(TKw2cZnk&NE- zP3K*;ymdG?_xyt6cnjGkDU1z7JsIfm2NCk%A(}kqj4xY^xrgHmd9nwWT+R{IKkOv3 zkFltLN#s_;w=A^6`wtzf1QY^^NkIG%5u7if^FAwoZlMD-5CdkOW`3*fRqx)0_wg_J zu0^H@qxUxo#J1i9d>|~gNpuR|)AfVKh;fvGnKmyj?0&TN6&uzAuV-5cdN#x>>3pG- z->-06t4?5IZEc^9}J{ zg!zQSw||o$V!2#E#j}yLurqeBzpnm$XeaPsqk7*cp)}B5|CHBi13SacQi<+%`Q`mH z2TDY^?gS^%OMPE%e!WLmY{;kd$DKRJB&?&ksX)G&=Mw+6N`G_wm`ZGuiwA_mt`?$Y zDzdL^|ELy{H?uex>_~b&aPHV-Y5U>N8aXmJmvhF-+uy@y@%R8bgof^R&}Ndck8VU# zWr;c+Li?QliOYs1O?J6!PpS_){FY!AR-{_eG~c7El9Zxu#Whd~NRtSkyiJV0B0j8- z*P8wX&i1Qye0KT7X%4k6a8%xvb`E|qsH7wvw^YtdvZzVXkj zjO2&6gA>~+=ls*oPx1IY3nLybw#zNp0Y{s-)bwylvQqAJb>eotfbx5R4ugb3Bc00b zot~$QP4KZD9Hsj}eO2?mOmgsj`;@JA=8V-Q&7rS*GSyq!24$0_g6T-(tf48%{ksb+j=ul%+ffQrC9mg>>79%KnYJH%3-@SRu?NKeR z!hLaV#>E(In~>x`Dg&LY$#(q?Zh@6M$13N8q_c$lKWW;zGBl%wHCWc2(5sE7UQLDt zHm>bw1!5v>&Wyepq=lko8xy1(WSXWRM8I0^)@}h$d*;~of>HIu%lnTmph9;p#}u+h z5+;v*ymM#`IAw~X%DCGvhdv$7SYppzjoC==08UNP&~l#PqT$OP∋V{FXF1(`G>{ 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

CodZGJK#y>X} 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/basic-heterogeneous-job.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/basic-heterogeneous-job.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbcdb04ea522bb49f2bedf5ef19a8cdbf789915 GIT binary patch literal 30377 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml new file mode 100644 index 0000000000..ee0dcb5f4b --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/homogeneous-vs-heterogeneous-results-table.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/homogeneous-vs-heterogeneous-results-table.png new file mode 100644 index 0000000000000000000000000000000000000000..18019150761a1dad9f608bc9e445a2d14500a691 GIT binary patch literal 28521 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

@Agsb0q0QBcq`r!y|C?DadE^6 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/tf.data.service-diagram.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/tf.data.service-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8678c3f106580c0702c8291771433e1195574ec6 GIT binary patch literal 352969 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

vK|Cfeq=N}@?;bzHN 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 M4{ Date: Wed, 14 Sep 2022 00:32:11 +0300 Subject: [PATCH 02/15] notebook fix and misspelling --- training/heterogeneous-clusters/.gitignore | 3 +- .../hetero-pytorch-mnist.ipynb | 186 +++--- .../pt.grpc.sagemaker/start_job.py | 2 +- .../hetero-tensorflow-restnet50.ipynb | 575 ++---------------- ...=> heterogeneous cluster diagrams (5).xml} | 0 ...metrics homogeneous cpu and gpu usage.png} | Bin .../tf.data.service.sagemaker/readme.md | 4 +- .../tf.data.service.sagemaker/start_job.py | 2 +- 8 files changed, 162 insertions(+), 610 deletions(-) rename training/heterogeneous-clusters/tf.data.service.sagemaker/images/{heterogenous cluster diagrams (5).xml => heterogeneous cluster diagrams (5).xml} (100%) rename training/heterogeneous-clusters/tf.data.service.sagemaker/images/{metrics homogenous cpu and gpu usage.png => metrics homogeneous cpu and gpu usage.png} (100%) diff --git a/training/heterogeneous-clusters/.gitignore b/training/heterogeneous-clusters/.gitignore index bc0d0e9a8d..18b4ec6a68 100644 --- a/training/heterogeneous-clusters/.gitignore +++ b/training/heterogeneous-clusters/.gitignore @@ -6,4 +6,5 @@ pt.grpc.local/__pycache__ pt.grpc.local/profile tf.data.service.sagemaker/data tf.data.service.sagemaker/code/__pycache__ -tf.data.service.local/data \ No newline at end of file +tf.data.service.local/data +pt.grpc.sagemaker/data diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 7eeeeb82ea..5399184a65 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -78,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "f2ea0231", "metadata": {}, "outputs": [ @@ -86,82 +86,105 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: boto3 in /opt/conda/lib/python3.8/site-packages (1.24.57)\n", + "Requirement already satisfied: boto3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/boto3-1.21.32-py3.9.egg (1.21.32)\n", "Collecting boto3\n", - " Downloading boto3-1.24.67-py3-none-any.whl (132 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 KB 2.6 MB/s eta 0:00:00\n", - "Requirement already satisfied: botocore in /opt/conda/lib/python3.8/site-packages (1.27.57)\n", + " Downloading boto3-1.24.72-py3-none-any.whl (132 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 kB 862.7 kB/s eta 0:00:00\n", + "Requirement already satisfied: botocore in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/botocore-1.24.32-py3.9.egg (1.24.32)\n", "Collecting botocore\n", - " Downloading botocore-1.27.67-py3-none-any.whl (9.1 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 43.4 MB/s eta 0:00:00\n", - "Requirement already satisfied: awscli in /opt/conda/lib/python3.8/site-packages (1.25.58)\n", + " Downloading botocore-1.27.72-py3-none-any.whl (9.1 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 16.2 MB/s eta 0:00:00\n", "Collecting awscli\n", - " Downloading awscli-1.25.68-py3-none-any.whl (3.9 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 29.5 MB/s eta 0:00:00\n", - "Requirement already satisfied: sagemaker in /opt/conda/lib/python3.8/site-packages (2.105.0)\n", + " Downloading awscli-1.25.73-py3-none-any.whl (3.9 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 36.6 MB/s eta 0:00:00\n", + "Requirement already satisfied: sagemaker in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (2.99.0)\n", "Collecting sagemaker\n", - " Downloading sagemaker-2.108.0.tar.gz (570 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 570.8/570.8 KB 10.2 MB/s eta 0:00:00\n", + " Downloading sagemaker-2.109.0.tar.gz (571 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 571.8/571.8 kB 13.7 MB/s eta 0:00:00\n", " Preparing metadata (setup.py): started\n", " Preparing metadata (setup.py): finished with status 'done'\n", - "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.8/site-packages (from boto3) (0.10.0)\n", - "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /opt/conda/lib/python3.8/site-packages (from boto3) (0.6.0)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /opt/conda/lib/python3.8/site-packages (from botocore) (2.8.2)\n", - "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /opt/conda/lib/python3.8/site-packages (from botocore) (1.26.8)\n", - "Requirement already satisfied: PyYAML<5.5,>=3.10 in /opt/conda/lib/python3.8/site-packages (from awscli) (5.4.1)\n", - "Requirement already satisfied: docutils<0.17,>=0.10 in /opt/conda/lib/python3.8/site-packages (from awscli) (0.15.2)\n", - "Requirement already satisfied: rsa<4.8,>=3.1.2 in /opt/conda/lib/python3.8/site-packages (from awscli) (4.7.2)\n", - "Requirement already satisfied: colorama<0.4.5,>=0.2.5 in /opt/conda/lib/python3.8/site-packages (from awscli) (0.4.3)\n", - "Requirement already satisfied: attrs<22,>=20.3.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (20.3.0)\n", - "Requirement already satisfied: google-pasta in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.2.0)\n", - "Requirement already satisfied: numpy<2.0,>=1.9.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.22.2)\n", - "Requirement already satisfied: protobuf<4.0,>=3.1 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (3.19.4)\n", - "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.1.5)\n", - "Requirement already satisfied: smdebug_rulesconfig==1.0.1 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.0.1)\n", - "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (4.11.2)\n", - "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.8/site-packages (from sagemaker) (21.3)\n", - "Requirement already satisfied: pandas in /opt/conda/lib/python3.8/site-packages (from sagemaker) (1.4.1)\n", - "Requirement already satisfied: pathos in /opt/conda/lib/python3.8/site-packages (from sagemaker) (0.2.8)\n", - "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.8/site-packages (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.7.0)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.8/site-packages (from packaging>=20.0->sagemaker) (3.0.7)\n", - "Requirement already satisfied: six in /opt/conda/lib/python3.8/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.16.0)\n", - "Requirement already satisfied: pyasn1>=0.1.3 in /opt/conda/lib/python3.8/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", - "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.8/site-packages (from pandas->sagemaker) (2021.3)\n", - "Requirement already satisfied: ppft>=1.6.6.4 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (1.6.6.4)\n", - "Requirement already satisfied: dill>=0.3.4 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.4)\n", - "Requirement already satisfied: multiprocess>=0.70.12 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.70.12.2)\n", - "Requirement already satisfied: pox>=0.3.0 in /opt/conda/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.0)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/jmespath-1.0.0-py3.9.egg (from boto3) (1.0.0)\n", + "Collecting s3transfer<0.7.0,>=0.6.0\n", + " Using cached s3transfer-0.6.0-py3-none-any.whl (79 kB)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/python_dateutil-2.8.2-py3.9.egg (from botocore) (2.8.2)\n", + "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/urllib3-1.26.9-py3.9.egg (from botocore) (1.26.9)\n", + "Collecting colorama<0.4.5,>=0.2.5\n", + " Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)\n", + "Collecting docutils<0.17,>=0.10\n", + " Downloading docutils-0.16-py2.py3-none-any.whl (548 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 548.2/548.2 kB 11.9 MB/s eta 0:00:00\n", + "Collecting PyYAML<5.5,>=3.10\n", + " Using cached PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl (259 kB)\n", + "Collecting rsa<4.8,>=3.1.2\n", + " Downloading rsa-4.7.2-py3-none-any.whl (34 kB)\n", + "Requirement already satisfied: attrs<22,>=20.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/attrs-20.3.0-py3.9.egg (from sagemaker) (20.3.0)\n", + "Requirement already satisfied: google-pasta in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/google_pasta-0.2.0-py3.9.egg (from sagemaker) (0.2.0)\n", + "Requirement already satisfied: numpy<2.0,>=1.9.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (1.22.4)\n", + "Requirement already satisfied: protobuf<4.0,>=3.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (3.20.1)\n", + "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/protobuf3_to_dict-0.1.5-py3.9.egg (from sagemaker) (0.1.5)\n", + "Requirement already satisfied: smdebug_rulesconfig==1.0.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/smdebug_rulesconfig-1.0.1-py3.9.egg (from sagemaker) (1.0.1)\n", + "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/importlib_metadata-4.11.3-py3.9.egg (from sagemaker) (4.11.3)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/packaging-21.3-py3.9.egg (from sagemaker) (21.3)\n", + "Requirement already satisfied: pandas in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pandas-1.4.2-py3.9-macosx-10.9-x86_64.egg (from sagemaker) (1.4.2)\n", + "Requirement already satisfied: pathos in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pathos-0.2.8-py3.9.egg (from sagemaker) (0.2.8)\n", + "Requirement already satisfied: zipp>=0.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/zipp-3.7.0-py3.9.egg (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.7.0)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pyparsing-3.0.7-py3.9.egg (from packaging>=20.0->sagemaker) (3.0.7)\n", + "Requirement already satisfied: six in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.15.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pytz-2022.1-py3.9.egg (from pandas->sagemaker) (2022.1)\n", + "Requirement already satisfied: dill>=0.3.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/dill-0.3.4-py3.9.egg (from pathos->sagemaker) (0.3.4)\n", + "Requirement already satisfied: multiprocess>=0.70.12 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/multiprocess-0.70.12.2-py3.9.egg (from pathos->sagemaker) (0.70.12.2)\n", + "Requirement already satisfied: pox>=0.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pox-0.3.0-py3.9.egg (from pathos->sagemaker) (0.3.0)\n", + "Requirement already satisfied: ppft>=1.6.6.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/ppft-1.6.6.4-py3.9.egg (from pathos->sagemaker) (1.6.6.4)\n", "Building wheels for collected packages: sagemaker\n", " Building wheel for sagemaker (setup.py): started\n", " Building wheel for sagemaker (setup.py): finished with status 'done'\n", - " Created wheel for sagemaker: filename=sagemaker-2.108.0-py2.py3-none-any.whl size=786331 sha256=fe95ef1e4aab67aea5034a83a74adaa6f6747bc8164fc38b4e6d9990ebce1d32\n", - " Stored in directory: /root/.cache/pip/wheels/bb/75/06/f38724fada04c5134e60627d70b76061fda548bab05ce6711a\n", + " Created wheel for sagemaker: filename=sagemaker-2.109.0-py2.py3-none-any.whl size=787707 sha256=6cb0a501a87ebb0ba16cd2f28b80f15c63c91f9fa56a40c1c76462ade3d6f14e\n", + " Stored in directory: /Users/gili/Library/Caches/pip/wheels/a7/c1/fa/eab3ed7597f624fbf6a9588a98288e7acf04eaa2c99c4af3d3\n", "Successfully built sagemaker\n", - "Installing collected packages: botocore, boto3, awscli, sagemaker\n", + "Installing collected packages: rsa, PyYAML, docutils, colorama, botocore, s3transfer, boto3, awscli, sagemaker\n", + " Attempting uninstall: rsa\n", + " Found existing installation: rsa 4.8\n", + " Uninstalling rsa-4.8:\n", + " Successfully uninstalled rsa-4.8\n", + " Attempting uninstall: PyYAML\n", + " Found existing installation: PyYAML 6.0\n", + " Uninstalling PyYAML-6.0:\n", + " Successfully uninstalled PyYAML-6.0\n", " Attempting uninstall: botocore\n", - " Found existing installation: botocore 1.27.57\n", - " Uninstalling botocore-1.27.57:\n", - " Successfully uninstalled botocore-1.27.57\n", + " Found existing installation: botocore 1.24.32\n", + " Uninstalling botocore-1.24.32:\n", + " Successfully uninstalled botocore-1.24.32\n", + " Attempting uninstall: s3transfer\n", + " Found existing installation: s3transfer 0.5.2\n", + " Uninstalling s3transfer-0.5.2:\n", + " Successfully uninstalled s3transfer-0.5.2\n", " Attempting uninstall: boto3\n", - " Found existing installation: boto3 1.24.57\n", - " Uninstalling boto3-1.24.57:\n", - " Successfully uninstalled boto3-1.24.57\n", - " Attempting uninstall: awscli\n", - " Found existing installation: awscli 1.25.58\n", - " Uninstalling awscli-1.25.58:\n", - " Successfully uninstalled awscli-1.25.58\n", + " Found existing installation: boto3 1.21.32\n", + " Uninstalling boto3-1.21.32:\n", + " Successfully uninstalled boto3-1.21.32\n", " Attempting uninstall: sagemaker\n", - " Found existing installation: sagemaker 2.105.0\n", - " Uninstalling sagemaker-2.105.0:\n", - " Successfully uninstalled sagemaker-2.105.0\n", - "Successfully installed awscli-1.25.68 boto3-1.24.67 botocore-1.27.67 sagemaker-2.108.0\n" + " Found existing installation: sagemaker 2.99.0\n", + " Uninstalling sagemaker-2.99.0:\n", + " Successfully uninstalled sagemaker-2.99.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "WARNING: 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\n" + "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "sagemaker-training 4.2.2 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully installed PyYAML-5.4.1 awscli-1.25.73 boto3-1.24.72 botocore-1.27.72 colorama-0.4.4 docutils-0.16 rsa-4.7.2 s3transfer-0.6.0 sagemaker-2.109.0\n", + "\n", + "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", + "[notice] To update, run: pip install --upgrade pip\n" ] } ], @@ -195,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 2, "id": "115cf0b2", "metadata": {}, "outputs": [ @@ -204,16 +227,16 @@ "output_type": "stream", "text": [ "Name: sagemaker\n", - "Version: 2.108.0\n", + "Version: 2.109.0\n", "---\n", "Name: torch\n", - "Version: 1.10.2+cpu\n", + "Version: 1.11.0\n", "---\n", "Name: boto3\n", - "Version: 1.24.67\n", + "Version: 1.24.72\n", "---\n", "Name: botocore\n", - "Version: 1.27.67\n" + "Version: 1.27.72\n" ] } ], @@ -234,19 +257,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "id": "e51da09f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "arn:aws:iam::776941257690:role/service-role/AmazonSageMakerServiceCatalogProductsUseRole\n", - "s3://sagemaker-us-east-1-776941257690/DEMO-mnist\n" - ] - } - ], + "outputs": [], "source": [ "import os\n", "import json\n", @@ -303,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "b964a650", "metadata": {}, "outputs": [], @@ -371,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "be4246c0", "metadata": {}, "outputs": [], @@ -402,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "729a0f0f", "metadata": {}, "outputs": [], @@ -452,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "e90ea016", "metadata": {}, "outputs": [], @@ -500,7 +514,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "ce424c23", "metadata": {}, "outputs": [ @@ -508,13 +522,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "2022-09-07 08:20:50 Starting - Starting the training job...\n", - "2022-09-07 08:21:20 Starting - Preparing the instances for training..........................................................................................\n", - "2022-09-07 08:35:54 Downloading - Downloading input data...\n", - "2022-09-07 08:36:29 Training - Downloading the training image.....................\n", - "2022-09-07 08:40:06 Training - Training image download completed. Training in progress.......\n", - "2022-09-07 08:41:16 Uploading - Uploading generated training model...\n", - "2022-09-07 08:41:27 Completed - Training job completed\n", + "2022-09-13 20:39:57 Starting - Starting the training job......\n", + "2022-09-13 20:40:46 Starting - Preparing the instances for training.........\n", + "2022-09-13 20:42:12 Downloading - Downloading input data...\n", + "2022-09-13 20:42:31 Training - Downloading the training image........................\n", + "2022-09-13 20:46:43 Training - Training image download completed. Training in progress.............\n", + "2022-09-13 20:49:00 Uploading - Uploading generated training model\n", + "2022-09-13 20:49:00 Completed - Training job completed\n", "..Training seconds: 0\n", "Billable seconds: 0\n" ] diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py index fd723c891e..499601afa1 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py @@ -19,7 +19,7 @@ os.environ["AWS_DEFAULT_REGION"] = REGION IS_CLOUD_JOB = True -IS_HETERO = True # if set to false, uses homogenous cluster +IS_HETERO = True # if set to false, uses homogeneous cluster PT_DATA_MODE = 'service' if IS_HETERO else 'local' # local | service IS_DNN_DISTRIBUTION = False # Distributed Training with DNN nodes not tested, set it to False diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index e89e01db69..6441236850 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -148,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -156,13 +156,13 @@ "output_type": "stream", "text": [ "Name: sagemaker\n", - "Version: 2.99.0\n", + "Version: 2.109.0\n", "---\n", "Name: boto3\n", - "Version: 1.21.32\n", + "Version: 1.24.72\n", "---\n", "Name: botocore\n", - "Version: 1.24.32\n", + "Version: 1.27.72\n", "---\n", "Name: tensorflow\n", "Version: 2.8.0\n", @@ -180,51 +180,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### B. Preparing Training Dataset and Uploading to S3" + "### B. Preparing Training Dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 1: Download cifar10 dataset and convert them into tfrecord\n", + "#### Download cifar10 dataset and convert them into tfrecord\n", "The training data set is stored in TFRecord files in `data` folder, and generated from CIFAR-10 dataset." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "%%bash\n", "python3 ./generate_cifar10_tfrecords.py --data-dir ./data\n", - "rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.1.tfrecords ./data/ && cp data.old/train/train.2.tfrecords ./data/ && mv data.old /tmp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Step 2: Upload the tfrecord training data to S3 bucket" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "prefix = \"cifar10-tfrecord\"\n", - "bucket = sess.default_bucket()\n", - "print(f\"Uploading data from ./data to s3://{bucket}/{prefix}/\")\n", - "s3path = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", - "\n", - "data_uri = TrainingInput(\n", - " s3path,\n", - " # instance_groups=['data_group'], # we don't need to restrict training channel to a specific group as we have data workers in both groups\n", - " input_mode=\"FastFile\",\n", - ")" + "rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.tfrecords ./data/train.1.tfrecords && cp data.old/train/train.tfrecords ./data/train.2.tfrecords && mv data.old /tmp" ] }, { @@ -237,17 +212,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output_path=s3://sagemaker-us-east-1-331113010199/cifar10-tfrecord\n" - ] - } - ], + "outputs": [], "source": [ "import os\n", "import json\n", @@ -269,13 +236,39 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 2 - Running a Homogenous training job\n", - "In this step we define and submit a homogenous training job. It use a single instance type (p4d.24xlarge) with 8 GPUs, and analysis will show its CPU bound causing its GPUs to be underutilized." + "#### Step 2: Upload the tfrecord training data to S3 bucket and define training input" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "prefix = \"cifar10-tfrecord\"\n", + "bucket = sess.default_bucket()\n", + "print(f\"Uploading data from ./data to s3://{bucket}/{prefix}/\")\n", + "s3path = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", + "\n", + "from sagemaker import TrainingInput\n", + "data_uri = TrainingInput(\n", + " s3path,\n", + " # instance_groups=['data_group'], # we don't need to restrict training channel to a specific group as we have data workers in both groups\n", + " input_mode=\"FastFile\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 3 - Running a homogeneous training job\n", + "In this step we define and submit a homogeneous training job. It use a single instance type (p4d.24xlarge) with 8 GPUs, and analysis will show its CPU bound causing its GPUs to be underutilized." + ] + }, + { + "cell_type": "code", + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -286,11 +279,11 @@ "import os\n", "\n", "hyperparameters = {\n", - " \"epochs\": 3,\n", + " \"epochs\": 10,\n", " \"steps_per_epoch\": 500,\n", " \"batch_size\": 1024,\n", - " \"tf_data_mode\": \"local\", # We won't be using tf.data.service ('service') for this homogenous job\n", - " \"num_of_data_workers\": 0, # We won't be using tf.data.service ('service') for this homogenous job\n", + " \"tf_data_mode\": \"local\", # We won't be using tf.data.service ('service') for this homogeneous job\n", + " \"num_of_data_workers\": 0, # We won't be using tf.data.service ('service') for this homogeneous job\n", "}\n", "\n", "estimator = TensorFlow(\n", @@ -326,461 +319,13 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 18, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2022-09-09 14:00:51 Starting - Starting the training job......\n", - "2022-09-09 14:01:29 Starting - Preparing the instances for training.............................................\n", - "2022-09-09 14:10:05 Downloading - Downloading input data\n", - "2022-09-09 14:10:05 Training - Downloading the training image.....................\n", - "2022-09-09 14:13:36 Training - Training image download completed. Training in progress.2022-09-09 14:13:42.807713: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "2022-09-09 14:13:42.818598: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "2022-09-09 14:13:43.564275: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "2022-09-09 14:13:53,522 sagemaker-training-toolkit INFO Imported framework sagemaker_tensorflow_container.training\n", - "2022-09-09 14:13:54,624 sagemaker-training-toolkit INFO Installing dependencies from requirements.txt:\n", - "/usr/local/bin/python3.9 -m pip install -r requirements.txt\n", - "Collecting protobuf==3.20.1\n", - "Downloading protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 49.8 MB/s eta 0:00:00\n", - "Collecting tensorflow-addons==0.17.0\n", - "Downloading tensorflow_addons-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 65.8 MB/s eta 0:00:00\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (21.3)\n", - "Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (2.13.3)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.9/site-packages (from packaging->tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (3.0.9)\n", - "Installing collected packages: protobuf, tensorflow-addons\n", - "Attempting uninstall: protobuf\n", - "Found existing installation: protobuf 3.19.4\n", - "Uninstalling protobuf-3.19.4:\n", - "Successfully uninstalled protobuf-3.19.4\n", - "Attempting uninstall: tensorflow-addons\n", - "Found existing installation: tensorflow-addons 0.17.1\n", - "Uninstalling tensorflow-addons-0.17.1:\n", - "Successfully uninstalled tensorflow-addons-0.17.1\n", - "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "tf-models-official 2.9.1 requires tensorflow~=2.9.0, which is not installed.\n", - "tensorflow-gpu 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "tensorboard 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "sagemaker-training 4.1.4.dev0 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "Successfully installed protobuf-3.20.1 tensorflow-addons-0.17.0\n", - "WARNING: 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\n", - "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", - "[notice] To update, run: pip install --upgrade pip\n", - "2022-09-09 14:14:07,337 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", - "2022-09-09 14:14:07,337 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", - "2022-09-09 14:14:07,515 sagemaker-training-toolkit INFO Starting MPI run as worker node.\n", - "2022-09-09 14:14:07,515 sagemaker-training-toolkit INFO Creating SSH daemon.\n", - "2022-09-09 14:14:07,540 sagemaker-training-toolkit INFO Waiting for MPI workers to establish their SSH connections\n", - "2022-09-09 14:14:07,541 sagemaker-training-toolkit INFO Env Hosts: ['algo-1'] Hosts: ['algo-1:8'] process_per_hosts: 8 num_processes: 8\n", - "2022-09-09 14:14:07,542 sagemaker-training-toolkit INFO Network interface name: eth0\n", - "2022-09-09 14:14:07,627 sagemaker-training-toolkit INFO Invoking user script\n", - "Training Env:\n", - "{\n", - " \"additional_framework_parameters\": {\n", - " \"sagemaker_mpi_custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", - " \"sagemaker_mpi_enabled\": true,\n", - " \"sagemaker_mpi_num_of_processes_per_host\": 8\n", - " },\n", - " \"channel_input_dirs\": {\n", - " \"training\": \"/opt/ml/input/data/training\"\n", - " },\n", - " \"current_host\": \"algo-1\",\n", - " \"current_instance_group\": \"homogeneousCluster\",\n", - " \"current_instance_group_hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", - " \"distribution_hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"distribution_instance_groups\": [\n", - " \"homogeneousCluster\"\n", - " ],\n", - " \"framework_module\": \"sagemaker_tensorflow_container.training:main\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"hyperparameters\": {\n", - " \"batch_size\": 1024,\n", - " \"epochs\": 3,\n", - " \"model_dir\": \"/opt/ml/model\",\n", - " \"num_of_data_workers\": 0,\n", - " \"steps_per_epoch\": 500,\n", - " \"tf_data_mode\": \"local\"\n", - " },\n", - " \"input_config_dir\": \"/opt/ml/input/config\",\n", - " \"input_data_config\": {\n", - " \"training\": {\n", - " \"TrainingInputMode\": \"File\",\n", - " \"S3DistributionType\": \"FullyReplicated\",\n", - " \"RecordWrapperType\": \"None\"\n", - " }\n", - " },\n", - " \"input_dir\": \"/opt/ml/input\",\n", - " \"instance_groups\": [\n", - " \"homogeneousCluster\"\n", - " ],\n", - " \"instance_groups_dict\": {\n", - " \"homogeneousCluster\": {\n", - " \"instance_group_name\": \"homogeneousCluster\",\n", - " \"instance_type\": \"ml.p4d.24xlarge\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ]\n", - " }\n", - " },\n", - " \"is_hetero\": false,\n", - " \"is_master\": true,\n", - " \"job_name\": \"homogenous-20220909T140047Z\",\n", - " \"log_level\": 20,\n", - " \"master_hostname\": \"algo-1\",\n", - " \"model_dir\": \"/opt/ml/model\",\n", - " \"module_dir\": \"s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\",\n", - " \"module_name\": \"launcher\",\n", - " \"network_interface_name\": \"eth0\",\n", - " \"num_cpus\": 96,\n", - " \"num_gpus\": 8,\n", - " \"output_data_dir\": \"/opt/ml/output/data\",\n", - " \"output_dir\": \"/opt/ml/output\",\n", - " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", - " \"resource_config\": {\n", - " \"current_host\": \"algo-1\",\n", - " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", - " \"current_group_name\": \"homogeneousCluster\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"instance_groups\": [\n", - " {\n", - " \"instance_group_name\": \"homogeneousCluster\",\n", - " \"instance_type\": \"ml.p4d.24xlarge\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ]\n", - " }\n", - " ],\n", - " \"network_interface_name\": \"eth0\"\n", - " },\n", - " \"user_entry_point\": \"launcher.py\"\n", - "}\n", - "Environment variables:\n", - "SM_HOSTS=[\"algo-1\"]\n", - "SM_NETWORK_INTERFACE_NAME=eth0\n", - "SM_HPS={\"batch_size\":1024,\"epochs\":3,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"}\n", - "SM_USER_ENTRY_POINT=launcher.py\n", - "SM_FRAMEWORK_PARAMS={\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8}\n", - "SM_RESOURCE_CONFIG={\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"}\n", - "SM_INPUT_DATA_CONFIG={\"training\":{\"RecordWrapperType\":\"None\",\"S3DistributionType\":\"FullyReplicated\",\"TrainingInputMode\":\"File\"}}\n", - "SM_OUTPUT_DATA_DIR=/opt/ml/output/data\n", - "SM_CHANNELS=[\"training\"]\n", - "SM_CURRENT_HOST=algo-1\n", - "SM_CURRENT_INSTANCE_TYPE=ml.p4d.24xlarge\n", - "SM_CURRENT_INSTANCE_GROUP=homogeneousCluster\n", - "SM_CURRENT_INSTANCE_GROUP_HOSTS=[\"algo-1\"]\n", - "SM_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", - "SM_INSTANCE_GROUPS_DICT={\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}}\n", - "SM_DISTRIBUTION_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", - "SM_IS_HETERO=false\n", - "SM_MODULE_NAME=launcher\n", - "SM_LOG_LEVEL=20\n", - "SM_FRAMEWORK_MODULE=sagemaker_tensorflow_container.training:main\n", - "SM_INPUT_DIR=/opt/ml/input\n", - "SM_INPUT_CONFIG_DIR=/opt/ml/input/config\n", - "SM_OUTPUT_DIR=/opt/ml/output\n", - "SM_NUM_CPUS=96\n", - "SM_NUM_GPUS=8\n", - "SM_MODEL_DIR=/opt/ml/model\n", - "SM_MODULE_DIR=s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\n", - "SM_TRAINING_ENV={\"additional_framework_parameters\":{\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8},\"channel_input_dirs\":{\"training\":\"/opt/ml/input/data/training\"},\"current_host\":\"algo-1\",\"current_instance_group\":\"homogeneousCluster\",\"current_instance_group_hosts\":[\"algo-1\"],\"current_instance_type\":\"ml.p4d.24xlarge\",\"distribution_hosts\":[\"algo-1\"],\"distribution_instance_groups\":[\"homogeneousCluster\"],\"framework_module\":\"sagemaker_tensorflow_container.training:main\",\"hosts\":[\"algo-1\"],\"hyperparameters\":{\"batch_size\":1024,\"epochs\":3,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"},\"input_config_dir\":\"/opt/ml/input/config\",\"input_data_config\":{\"training\":{\"RecordWrapperType\":\"None\",\"S3DistributionType\":\"FullyReplicated\",\"TrainingInputMode\":\"File\"}},\"input_dir\":\"/opt/ml/input\",\"instance_groups\":[\"homogeneousCluster\"],\"instance_groups_dict\":{\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}},\"is_hetero\":false,\"is_master\":true,\"job_name\":\"homogenous-20220909T140047Z\",\"log_level\":20,\"master_hostname\":\"algo-1\",\"model_dir\":\"/opt/ml/model\",\"module_dir\":\"s3://sagemaker-us-east-1-331113010199/homogenous-20220909T140047Z/source/sourcedir.tar.gz\",\"module_name\":\"launcher\",\"network_interface_name\":\"eth0\",\"num_cpus\":96,\"num_gpus\":8,\"output_data_dir\":\"/opt/ml/output/data\",\"output_dir\":\"/opt/ml/output\",\"output_intermediate_dir\":\"/opt/ml/output/intermediate\",\"resource_config\":{\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"},\"user_entry_point\":\"launcher.py\"}\n", - "SM_USER_ARGS=[\"--batch_size\",\"1024\",\"--epochs\",\"3\",\"--model_dir\",\"/opt/ml/model\",\"--num_of_data_workers\",\"0\",\"--steps_per_epoch\",\"500\",\"--tf_data_mode\",\"local\"]\n", - "SM_OUTPUT_INTERMEDIATE_DIR=/opt/ml/output/intermediate\n", - "SM_CHANNEL_TRAINING=/opt/ml/input/data/training\n", - "SM_HP_BATCH_SIZE=1024\n", - "SM_HP_EPOCHS=3\n", - "SM_HP_MODEL_DIR=/opt/ml/model\n", - "SM_HP_NUM_OF_DATA_WORKERS=0\n", - "SM_HP_STEPS_PER_EPOCH=500\n", - "SM_HP_TF_DATA_MODE=local\n", - "PYTHONPATH=/opt/ml/code:/usr/local/bin:/usr/local/lib/python39.zip:/usr/local/lib/python3.9:/usr/local/lib/python3.9/lib-dynload:/usr/local/lib/python3.9/site-packages:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument-3.4.2-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument_cext-0.2.4-py3.9-linux-x86_64.egg\n", - "Invoking script with the following command:\n", - "mpirun --host algo-1:8 -np 8 --allow-run-as-root --display-map --tag-output -mca btl_tcp_if_include eth0 -mca oob_tcp_if_include eth0 -mca plm_rsh_no_tree_spawn 1 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_abort_on_non_zero_status 1 -mca btl_vader_single_copy_mechanism none -x NCCL_MIN_NRINGS=4 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_DEBUG=WARN -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD=/usr/local/lib/python3.9/site-packages/gethostname.cpython-39-x86_64-linux-gnu.so -x SM_HOSTS -x SM_NETWORK_INTERFACE_NAME -x SM_HPS -x SM_USER_ENTRY_POINT -x SM_FRAMEWORK_PARAMS -x SM_RESOURCE_CONFIG -x SM_INPUT_DATA_CONFIG -x SM_OUTPUT_DATA_DIR -x SM_CHANNELS -x SM_CURRENT_HOST -x SM_CURRENT_INSTANCE_TYPE -x SM_CURRENT_INSTANCE_GROUP -x SM_CURRENT_INSTANCE_GROUP_HOSTS -x SM_INSTANCE_GROUPS -x SM_INSTANCE_GROUPS_DICT -x SM_DISTRIBUTION_INSTANCE_GROUPS -x SM_IS_HETERO -x SM_MODULE_NAME -x SM_LOG_LEVEL -x SM_FRAMEWORK_MODULE -x SM_INPUT_DIR -x SM_INPUT_CONFIG_DIR -x SM_OUTPUT_DIR -x SM_NUM_CPUS -x SM_NUM_GPUS -x SM_MODEL_DIR -x SM_MODULE_DIR -x SM_TRAINING_ENV -x SM_USER_ARGS -x SM_OUTPUT_INTERMEDIATE_DIR -x SM_CHANNEL_TRAINING -x SM_HP_BATCH_SIZE -x SM_HP_EPOCHS -x SM_HP_MODEL_DIR -x SM_HP_NUM_OF_DATA_WORKERS -x SM_HP_STEPS_PER_EPOCH -x SM_HP_TF_DATA_MODE -x PYTHONPATH /usr/local/bin/python3.9 -m mpi4py launcher.py --batch_size 1024 --epochs 3 --model_dir /opt/ml/model --num_of_data_workers 0 --steps_per_epoch 500 --tf_data_mode local\n", - "Data for JOB [47713,1] offset 0 Total slots allocated 8\n", - " ======================== JOB MAP ========================\n", - " Data for node: ip-10-0-222-41#011Num slots: 8#011Max slots: 0#011Num procs: 8\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 0 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 1 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 2 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 3 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 4 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 5 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 6 Bound: N/A\n", - " #011Process OMPI jobid: [47713,1] App: 0 Process rank: 7 Bound: N/A\n", - " =============================================================\n", - "[1,mpirank:1,algo-1]:env.is_hetero=False\n", - "[1,mpirank:1,algo-1]:current_host=algo-1\n", - "[1,mpirank:1,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:4,algo-1]:env.is_hetero=False\n", - "[1,mpirank:4,algo-1]:current_host=algo-1\n", - "[1,mpirank:4,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:3,algo-1]:env.is_hetero=False\n", - "[1,mpirank:3,algo-1]:current_host=algo-1\n", - "[1,mpirank:3,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:2,algo-1]:env.is_hetero=False\n", - "[1,mpirank:2,algo-1]:current_host=algo-1\n", - "[1,mpirank:2,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:5,algo-1]:env.is_hetero=False\n", - "[1,mpirank:5,algo-1]:current_host=algo-1[1,mpirank:5,algo-1]:\n", - "[1,mpirank:5,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:6,algo-1]:env.is_hetero=False\n", - "[1,mpirank:6,algo-1]:current_host=algo-1\n", - "[1,mpirank:6,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:0,algo-1]:env.is_hetero=False\n", - "[1,mpirank:0,algo-1]:current_host=algo-1\n", - "[1,mpirank:0,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:7,algo-1]:env.is_hetero=False\n", - "[1,mpirank:7,algo-1]:current_host=algo-1\n", - "[1,mpirank:7,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '3', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.584464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.584460: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.584609: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.584611: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.584609: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.584612: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.597322: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.597321: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.597325: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.597325: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.597462: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.597464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.597464: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.597466: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:6,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:4,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:1,algo-1]:2022-09-09 14:14:08.619434: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:3,algo-1]:2022-09-09 14:14:08.619435: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:5,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:2,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:0,algo-1]:2022-09-09 14:14:08.632294: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:7,algo-1]:2022-09-09 14:14:08.632297: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:3,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:3,algo-1]:hvd.local_rank() 3\n", - "[1,mpirank:6,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:4,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:1,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:4,algo-1]:hvd.local_rank() 4\n", - "[1,mpirank:1,algo-1]:hvd.local_rank() 1\n", - "[1,mpirank:6,algo-1]:hvd.local_rank() 6\n", - "[1,mpirank:7,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:7,algo-1]:hvd.local_rank() 7\n", - "[1,mpirank:0,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:0,algo-1]:hvd.local_rank() 0\n", - "[1,mpirank:2,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:5,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:2,algo-1]:hvd.local_rank() 2\n", - "[1,mpirank:5,algo-1]:hvd.local_rank() 5\n", - "[1,mpirank:6,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:2,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:0,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:7,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:5,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:1,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:4,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:3,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:0,algo-1]:Epoch 1/3\n", - "[1,mpirank:7,algo-1]:Epoch 1/3\n", - "[1,mpirank:5,algo-1]:Epoch 1/3\n", - "[1,mpirank:4,algo-1]:Epoch 1/3\n", - "[1,mpirank:2,algo-1]:Epoch 1/3\n", - "[1,mpirank:3,algo-1]:Epoch 1/3\n", - "[1,mpirank:1,algo-1]:Epoch 1/3\n", - "[1,mpirank:6,algo-1]:Epoch 1/3\n", - "[1,mpirank:5,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:5,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:5,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:0,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:0,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:0,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:7,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:7,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:7,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:2,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:2,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:2,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:6,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:6,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:6,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:3,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:3,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:3,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:4,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:4,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:4,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:1,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:1,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:1,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.179 algo-1:180 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.179 algo-1:183 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.179 algo-1:184 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.179 algo-1:181 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.179 algo-1:179 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.179 algo-1:182 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.179 algo-1:178 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.180 algo-1:177 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.472 algo-1:183 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.472 algo-1:181 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.472 algo-1:180 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.472 algo-1:179 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.472 algo-1:184 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.472 algo-1:178 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.472 algo-1:177 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.473 algo-1:182 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.540 algo-1:184 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.540 algo-1:180 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.540 algo-1:183 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.540 algo-1:181 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.540 algo-1:179 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.540 algo-1:178 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.541 algo-1:182 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.541 algo-1:177 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.541 algo-1:179 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.541 algo-1:178 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.541 algo-1:177 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.541 algo-1:182 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.541 algo-1:183 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.541 algo-1:180 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.541 algo-1:181 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.541 algo-1:184 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.541 algo-1:179 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.541 algo-1:178 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.542 algo-1:179 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:0,algo-1]:[2022-09-09 14:14:18.542 algo-1:183 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.542 algo-1:178 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:2,algo-1]:[2022-09-09 14:14:18.542 algo-1:180 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", - "[1,mpirank:7,algo-1]:[2022-09-09 14:14:18.542 algo-1:184 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", - "[1,mpirank:5,algo-1]:[2022-09-09 14:14:18.542 algo-1:181 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", - "[1,mpirank:3,algo-1]:[2022-09-09 14:14:18.542 algo-1:179 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", - "[1,mpirank:4,algo-1]:[2022-09-09 14:14:18.542 algo-1:178 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", - "[1,mpirank:6,algo-1]:[2022-09-09 14:14:18.542 algo-1:182 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", - "[1,mpirank:1,algo-1]:[2022-09-09 14:14:18.542 algo-1:177 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", - "[1,mpirank:0,algo-1]:NCCL version 2.10.3+cuda11.2\n", - "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", - "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", - "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2464s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2445s vs `on_train_batch_end` time: 0.6226s). Check your callbacks.\n", - "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2445s vs `on_train_batch_end` time: 0.6226s). Check your callbacks.\n", - "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2465s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", - "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2465s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", - "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2474s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", - "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2474s vs `on_train_batch_end` time: 0.6225s). Check your callbacks.\n", - "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2478s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2478s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2489s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2489s vs `on_train_batch_end` time: 0.6224s). Check your callbacks.\n", - "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2503s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", - "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2503s vs `on_train_batch_end` time: 0.6223s). Check your callbacks.\n", - "[1,mpirank:6,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 131s - loss: 1.9972 - lr: 0.0033 - 131s/epoch - 261ms/step\n", - "[1,mpirank:6,algo-1]:Epoch 2/3\n", - "[1,mpirank:3,algo-1]:Epoch 2/3\n", - "[1,mpirank:5,algo-1]:Epoch 2/3\n", - "[1,mpirank:4,algo-1]:Epoch 2/3\n", - "[1,mpirank:1,algo-1]:Epoch 2/3\n", - "[1,mpirank:2,algo-1]:Epoch 2/3\n", - "[1,mpirank:7,algo-1]:Epoch 2/3\n", - "[1,mpirank:0,algo-1]:500/500 - 132s - loss: 1.9972 - lr: 0.0033 - 132s/epoch - 263ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 2/3\n", - "[1,mpirank:3,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:3,algo-1]:Epoch 3/3\n", - "[1,mpirank:7,algo-1]:Epoch 3/3\n", - "[1,mpirank:2,algo-1]:Epoch 3/3\n", - "[1,mpirank:1,algo-1]:Epoch 3/3\n", - "[1,mpirank:6,algo-1]:Epoch 3/3\n", - "[1,mpirank:4,algo-1]:Epoch 3/3\n", - "[1,mpirank:5,algo-1]:500/500 - 104s - loss: 1.8961 - lr: 0.0057 - 104s/epoch - 208ms/step\n", - "[1,mpirank:5,algo-1]:Epoch 3/3\n", - "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8961 - lr: 0.0057 - 105s/epoch - 209ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 3/3\n", - "[1,mpirank:6,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:0,algo-1]:\n", - "[1,mpirank:0,algo-1]:Epoch 3: finished gradual learning rate warmup to 0.008.\n", - "[1,mpirank:5,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 106s - loss: 1.8536 - lr: 0.0080 - 106s/epoch - 211ms/step\n", - "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8536 - lr: 0.0080 - 105s/epoch - 211ms/step\n", - "[1,mpirank:7,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:5,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:4,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:2,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:3,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:6,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:1,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:0,algo-1]:WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n", - "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", - "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", - "[1,mpirank:0,algo-1]:Process train_dnn.py closed with returncode=0\n", - "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", - "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", - "2022-09-09 14:20:18,708 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", - "\n", - "2022-09-09 14:20:24 Uploading - Uploading generated training model\n", - "2022-09-09 14:21:00 Completed - Training job completed\n", - "Training seconds: 674\n", - "Billable seconds: 674\n" - ] - } - ], + "outputs": [], "source": [ "estimator.fit(\n", " inputs=data_uri,\n", - " job_name=\"homogenous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + " job_name=\"homogeneous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", ")" ] }, @@ -788,14 +333,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### E. Analyzing the homogenous training job throughput and resource usage\n", + "### E. Analyzing the homogeneous training job throughput and resource usage\n", "We'll examine: CPU and GPU usage. Epoch time and step time\n", "\n", "#### CPU and GPU usage analysis\n", "In the screenshot below we observe that close to all the 96 vCPU of the instance is utilized. While GPU utilization is only ~40%. Clearly if we had more vCPUs we could increase GPU usage signifiantly to increase job throughput\n", "\n", "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", - "" + "" ] }, { @@ -812,7 +357,7 @@ "metadata": {}, "outputs": [], "source": [ - "%%capture homogenous_logs\n", + "%%capture homogeneous_logs\n", "estimator.sagemaker_session.logs_for_job(estimator.latest_training_job.name)" ] }, @@ -834,7 +379,7 @@ ], "source": [ "print(f\"Printing step time for epochs and steps for {estimator.latest_training_job.name}\")\n", - "for line in homogenous_logs.stdout.split(\"\\n\"):\n", + "for line in homogeneous_logs.stdout.split(\"\\n\"):\n", " if \"mpirank:0\" in line and \"/epoch\" in line:\n", " print(line)" ] @@ -845,8 +390,8 @@ "source": [ "#### Step 3 - Running a Heterogeneous Training Job\n", "We'll now run a training job in heterogeneous clusters mode. \n", - "Note the changes from the homogenous cluster job: \n", - "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogenous paramters `instance_type` and `instance_count`.\n", + "Note the changes from the homogeneous cluster job: \n", + "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogeneous paramters `instance_type` and `instance_count`.\n", "- In the `distribution` parameter for Horovod we added a new parameter `instance_groups` that is used to limit the MPI cluster to run in the `dnn_group`. The MPI cluster should include only the GPU nodes that run Horovod (which needs MPI). The `data_group` instances should not be part of the MPI cluster, as they set up their on `tf.data.service` cluster.\n", "\n", "More on the two instance groups config we use:\n", @@ -866,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -925,22 +470,14 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-11 09:50:28 Starting - Starting the training job......\n", - "2022-09-11 09:51:17 Starting - Preparing the instances for training.................................................\n", - "2022-09-11 09:59:42 Downloading - Downloading input data...\n", - "2022-09-11 09:59:52 Training - Downloading the training image..................\n", - "2022-09-11 10:03:24 Training - Training image download completed. Training in progress..........................................................\n", - "2022-09-11 10:12:43 Uploading - Uploading generated training model...\n", - "2022-09-11 10:13:19 Completed - Training job completed\n", - "..Training seconds: 0\n", - "Billable seconds: 0\n" + "2022-09-13 21:29:25 Starting - Starting the training job." ] } ], @@ -959,7 +496,7 @@ "We'll examine: CPU and GPU usage. Epoch time and step time.\n", "\n", "#### CPU and GPU usage analysis\n", - " In the screenshot below we observe that GPU usage has increase to 73% (compared to ~40% in the homogenous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 90% CPU uage. \n", + " In the screenshot below we observe that GPU usage has increase to 73% (compared to ~40% in the homogeneous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 90% CPU uage. \n", " \n", "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", "\n", @@ -976,7 +513,7 @@ "## E. Comparing time-to-train and cost-to-train\n", "The table below summarizes both jobs. We can see that:\n", "- The Heterogeneous job is 2.4x faster to train (86ms/step) than the homogeneous job (208ms/step).\n", - "- The Heterogeneous job is 50% cheaper to train than the homogenous job. This is despite the heterogenous costs more per hour ($45/hour vs $37/hour), due to the two extra c5.18xlarge instances included in the heterogenous job `($45 = $37.7 + 2 * $3.67` \n", + "- The Heterogeneous job is 50% cheaper to train than the homogeneous job. This is despite the heterogenous costs more per hour ($45/hour vs $37/hour), due to the two extra c5.18xlarge instances included in the heterogenous job `($45 = $37.7 + 2 * $3.67` \n", "The cost-to-train formula we used: change in houly price `($45/$37.7) ` times `reduction-in-time-to-train (86ms/208ms)` = 50% = `($45/$37.7) * (86ms/208ms)`. \n", "\n", "\"results\n", diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5).xml similarity index 100% rename from training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogenous cluster diagrams (5).xml rename to training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5).xml diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogenous cpu and gpu usage.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogeneous cpu and gpu usage.png similarity index 100% rename from training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogenous cpu and gpu usage.png rename to training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogeneous cpu and gpu usage.png diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md b/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md index 7c9cae1734..8f87590905 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md @@ -21,12 +21,12 @@ Set your SageMaker IAM role as an environment varaible. For example: export SAGEMAKER_ROLE="arn:aws:iam::1234567890123:role/service-role/AmazonSageMaker-ExecutionRole-20171221T130536" ``` -Start a homogenous training job +Start a homogeneous training job ``` python '/Users/gili/dev/hetro-training/tf.data.service.sagemaker/start_job.py' --tf_data_mode local --is_cloud_job --no-is_hetero --num_of_data_workers 0 --num_of_data_instances 0 --batch_size 1024 ``` -Start a heterogenous training job +Start a heterogeneous training job ``` python '/Users/gili/dev/hetro-training/tf.data.service.sagemaker/start_job.py' --tf_data_mode service --is_cloud_job --is_hetero --num_of_data_workers 2 --num_of_data_instances 2 --batch_size 1024 ``` \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py index c4dc76f3c2..b86e7adb86 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py @@ -20,7 +20,7 @@ args = parser.parse_args() assert args.is_cloud_job or not args.is_hetero, 'Heterogeneous cluster is not supported in sagemaker local mode' -assert args.is_hetero or args.tf_data_mode == 'local', 'TODO: tf.data.service not implemented in homogenous cluster yet' +assert args.is_hetero or args.tf_data_mode == 'local', 'TODO: tf.data.service not implemented in homogeneous cluster yet' REGION = 'us-east-1' os.environ["AWS_DEFAULT_REGION"] = REGION From 06da2ce645af25160daba9a97feba38aff1e074e Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Wed, 14 Sep 2022 00:45:36 +0300 Subject: [PATCH 03/15] add link from root readme.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ff96af648a..6fdb360139 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,7 @@ These examples showcase unique functionality available in Amazon SageMaker. They - [Host Multiple Models with SKLearn](advanced_functionality/multi_model_sklearn_home_value) shows how to deploy multiple models to a realtime hosted endpoint using a multi-model enabled SKLearn container. - [SageMaker Training and Inference with Script Mode](sagemaker-script-mode) shows how to use custom training and inference scripts, similar to those you would use outside of SageMaker, with SageMaker's prebuilt containers for various frameworks like Scikit-learn, PyTorch, and XGBoost. - [Host Models with NVidia Triton Server](sagemaker-triton) shows how to deploy models to a realtime hosted endpoint using [Triton](https://developer.nvidia.com/nvidia-triton-inference-server) as the model inference server. +- [Heterogenous Clusters Training in TensorFlow or PyTorch ](training/heterogeneous-clusters/README.md) shows how to train using TensorFlow tf.data.service (distributed data pipeline) or Pytorch (with gRPC) on top of Amazon SageMaker Heterogenous clusters to overcome CPU bottlenecks by including different instance types (GPU/CPU) in the same training job. ### Amazon SageMaker Neo Compilation Jobs From bd479c691a6d8bf2184c8d3228073a14006a672d Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Sat, 24 Sep 2022 03:24:36 +0300 Subject: [PATCH 04/15] switching cifar-10 to artificial dataset for TF --- training/heterogeneous-clusters/README.md | 3 +- .../pt.grpc.sagemaker/README.md | 2 +- .../pt.grpc.sagemaker/code/train_data.py | 2 + .../hetero-pytorch-mnist.ipynb | 233 ++--- .../tf.data.service.local/README.md | 10 +- .../generate_cifar10_tfrecords.py | 132 --- .../tf.data.service.local/train.py | 31 +- .../heterogenenous-workload.json | 30 + .../homogenous-workload copy.json | 26 + .../code/train_dnn.py | 39 +- .../hetero-tensorflow-restnet50.ipynb | 909 ++++++++++++++---- ...heterogeneous cluster diagrams (5) (1).xml | 1 + ...geneous-vs-heterogeneous-results-table.png | Bin 28521 -> 29695 bytes ...cs Heterogeneous cpu and gpu usage.png.png | Bin 0 -> 73268 bytes .../metrics homogeneous cpu and gpu usage.png | Bin 41369 -> 47674 bytes .../images/tf.data.service-diagram.png | Bin 352969 -> 56335 bytes .../tf.data.service.sagemaker/start_job.py | 11 - 17 files changed, 902 insertions(+), 527 deletions(-) delete mode 100755 training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/heterogenenous-workload.json create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/homogenous-workload copy.json create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5) (1).xml create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics Heterogeneous cpu and gpu usage.png.png diff --git a/training/heterogeneous-clusters/README.md b/training/heterogeneous-clusters/README.md index f2bfa90d01..409ba699f3 100644 --- a/training/heterogeneous-clusters/README.md +++ b/training/heterogeneous-clusters/README.md @@ -1,13 +1,12 @@ # SageMaker Heterogeneous Clusters Training SageMaker Training Heterogeneous Clusters allows you to run one training job that includes instances of different types (for example a GPU instance like ml.p4d.24xlarge and a CPU instance like c5.18xlarge). One primary use case is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the expensive GPUs, and arrive at an improved time and cost to train. -You'll find TensorFlow (tf.data.service) and PyTorch (a customer gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. +You'll find TensorFlow (tf.data.service) and PyTorch (a customer gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. You can reuse these examples when enabling your own training workload to use heterogeneous clusters. ![Hetero job diagram](tf.data.service.sagemaker/images/basic-heterogeneous-job.png) ## Examples: - ### TensorFlow examples - [**TensorFlow's tf.data.service running locally**](tf.data.service.local/README.md): This example runs the tf.data.service locally on your machine (not on SageMaker). It's helpful in order to get familiar with tf.data.service and to run small scale quick experimentation. diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md b/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md index 6387aec480..b9461bacd6 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md @@ -1,5 +1,5 @@ # SageMaker heterogeneous Training ("Hetero") - Pytorch example (MNIST Dataset) -This example demonstrates a more general way of offloading pre-processing to auxiliary devices using gRPC, the same protocol underlying the TensorFlow data service. We use here pytorch 1.11 framework. The job is submitted to SageMaker using Hetero feature that allows you to run one training job that includes instances of different types (for example a GPU instance like ml.g5.2xlarge and a CPU instance like c5n.9xlarge). The primary use case here is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the exensive GPU, and arrive at an improved time and cost to train. +This example demonstrates a more general way of offloading pre-processing to auxiliary devices using gRPC, the same protocol underlying the TensorFlow data service. We use here pytorch 1.11 framework. The job is submitted to SageMaker using Hetero feature that allows you to run one training job that includes instances of different types (for example a GPU instance like ml.p3.2xlarge and a CPU instance like c5.9xlarge). The primary use case here is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the exensive GPU, and arrive at an improved time and cost to train. ## Instructions diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py index 9aac87586e..2d35ba4b26 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/code/train_data.py @@ -68,6 +68,8 @@ def __getitem__(self, index: int): def fill_queue(q,kill, args): + + MyMNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"] train_kwargs = {'batch_size': args.batch_size, 'num_workers': args.num_data_workers} transform=transforms.Compose([ diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 5399184a65..c109134505 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -2,18 +2,18 @@ "cells": [ { "cell_type": "markdown", - "id": "d1aa7aed", + "id": "85da9619", "metadata": {}, "source": [ - "## PyTorch example to demonstrate Amazon SageMaker Heterogeneous Cluster for model training\n", + "## PyTorch's example to demonstrate Amazon SageMaker Heterogeneous Cluster for model training\n", "\n", "---\n", "### Description\n", - "Heterogeneous clusters enables launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottlnecked on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters allows you to add more CPU resources to fully utilize GPUs increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", + "Heterogeneous clusters enable launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottleneck on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters enable you to add more CPU resources to fully utilize GPUs, thus increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", "\n", - "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch 1.10. The notebook works on Python 3 (_Pytorch 1.10 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", + "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch 1.10. The notebook works on Python 3 (_PyTorch 1.10 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", "\n", - "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/mnist). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", + "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/MNIST). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", "\n", "\n", " \n", @@ -33,9 +33,9 @@ "\n", "In homogeneous cluster training job, the data pre-processing and Deep Neural Network (DNN) training code runs on the same instance. However, in heterogeneous cluster training job, the data pre-processing code runs on the CPU nodes (here by referred as **data_group or data group**), whereas the Deep Neural Network (DNN) training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). The inter-node communication between the data and dnn groups is handled by generic implementation of [gRPC client-server interface](https://grpc.io/docs/languages/python/basics/).  \n", "\n", - "The script (`launcher.py`) has the logic to detect (using SageMaker environment variables) whether the node it is running on belongs to data_group or dnn_group. If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs grpc-server service for extracting processed training batches using [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview). The gRPC server running on the data_group listens on a specific port (ex. 6000). In the code (`train_data.py`) documentation, we have chosen an implementation that keeps the data loading logic intact  where data batches are entered into a shared queue. The `get_samples` function of the `DataFeedService` pulls batches from the same queue and sends them to the client in the form of a continuous data stream. While fetching the data, the main entrypoint script `launcher.py` listens on port 16000 for a shutdown request coming from gRPC client i.e data group. The `train_data.py` waits for shutdown action from the parent process. \n", + "The script (`launcher.py`) has the logic to detect (using SageMaker environment variables) whether the node it is running on belongs to data_group or dnn_group. If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs grpc-server service for extracting processed training batches using [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview). The gRPC server running on the data_group listens on a specific port (ex. 6000). In the code (`train_data.py`) documentation, we have chosen an implementation that keeps the data loading logic intact  where data batches are entered into a shared queue. The `get_samples` function of the `DataFeedService` pulls batches from the same queue and sends them to the client in the form of a continuous data stream. While fetching the data, the main entrypoint script `launcher.py` listens on port 16000 for a shut down request coming from gRPC client i.e. data group. The `train_data.py` waits for shut down action from the parent process. \n", "\n", - "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. The script runs gRPC client code and DNN component of the training job. It consumes the processed training data from the gRPC server. We have defined an iterable PyTorch dataset, RemoteDataset, that opens a connection to the gRPC server, and reads from a stream of data batches. Once the model is trained with all the batches of training data, the gRPC client exits, and the parent process`launcher.py` sends a shutdown request on port 16000. This indicates the gRPC server to shutdown, and signals ends of the training job. \n", + "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. The script runs gRPC client code and DNN component of the training job. It consumes the processed training data from the gRPC server. We have defined an iterable PyTorch dataset, RemoteDataset, that opens a connection to the gRPC server, and reads from a stream of data batches. Once the model is trained with all the batches of training data, the gRPC client exits, and the parent process`launcher.py` sends a shut down request on port 16000. This indicates the gRPC server to shut down, and signals ends of the training job. \n", "\n", "Here is how the workflow looks like:\n", "\n", @@ -46,12 +46,12 @@ "This notebook refers following files and folders:\n", "\n", "- Folders: \n", - "  - `code`: this has the training (data pre-processing and dnn) scripts, and grpc client-server start and shutdown scripts\n", + "  - `code`: this has the training (data pre-processing and dnn) scripts, and grpc client-server start and shut down scripts\n", "  - `images`: contains images referred in notebook\n", "- Files: \n", - "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. This is a parent process that makes a decision on where to spawn a data pre-processing or dnn component of the training job. The script runs on all the nodes as entrypoint. It also handles the shutdown logic for gRPC server. \n", - "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shutdown.\n", - "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shutdown request after all the iterations on the preprocessed training data set. \n", + "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. This is a parent process that makes a decision on where to spawn a data pre-processing or dnn component of the training job. The script runs on all the nodes as entrypoint. It also handles the shut down logic for gRPC server. \n", + "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shut down.\n", + "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shut down request after all the iterations on the preprocessed training data set. \n", "  - `requirement.txt`: defines package required for gRPC \n", "  - `train.py`: this script is the entrypoint script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. \n", "\n", @@ -67,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "2ee8683b", + "id": "fd1e5aca", "metadata": {}, "source": [ "### A. Setting up SageMaker Studio notebook\n", @@ -78,124 +78,18 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "f2ea0231", + "execution_count": 51, + "id": "54ff1687", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: boto3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/boto3-1.21.32-py3.9.egg (1.21.32)\n", - "Collecting boto3\n", - " Downloading boto3-1.24.72-py3-none-any.whl (132 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 kB 862.7 kB/s eta 0:00:00\n", - "Requirement already satisfied: botocore in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/botocore-1.24.32-py3.9.egg (1.24.32)\n", - "Collecting botocore\n", - " Downloading botocore-1.27.72-py3-none-any.whl (9.1 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 16.2 MB/s eta 0:00:00\n", - "Collecting awscli\n", - " Downloading awscli-1.25.73-py3-none-any.whl (3.9 MB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 36.6 MB/s eta 0:00:00\n", - "Requirement already satisfied: sagemaker in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (2.99.0)\n", - "Collecting sagemaker\n", - " Downloading sagemaker-2.109.0.tar.gz (571 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 571.8/571.8 kB 13.7 MB/s eta 0:00:00\n", - " Preparing metadata (setup.py): started\n", - " Preparing metadata (setup.py): finished with status 'done'\n", - "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/jmespath-1.0.0-py3.9.egg (from boto3) (1.0.0)\n", - "Collecting s3transfer<0.7.0,>=0.6.0\n", - " Using cached s3transfer-0.6.0-py3-none-any.whl (79 kB)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/python_dateutil-2.8.2-py3.9.egg (from botocore) (2.8.2)\n", - "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/urllib3-1.26.9-py3.9.egg (from botocore) (1.26.9)\n", - "Collecting colorama<0.4.5,>=0.2.5\n", - " Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)\n", - "Collecting docutils<0.17,>=0.10\n", - " Downloading docutils-0.16-py2.py3-none-any.whl (548 kB)\n", - " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 548.2/548.2 kB 11.9 MB/s eta 0:00:00\n", - "Collecting PyYAML<5.5,>=3.10\n", - " Using cached PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl (259 kB)\n", - "Collecting rsa<4.8,>=3.1.2\n", - " Downloading rsa-4.7.2-py3-none-any.whl (34 kB)\n", - "Requirement already satisfied: attrs<22,>=20.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/attrs-20.3.0-py3.9.egg (from sagemaker) (20.3.0)\n", - "Requirement already satisfied: google-pasta in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/google_pasta-0.2.0-py3.9.egg (from sagemaker) (0.2.0)\n", - "Requirement already satisfied: numpy<2.0,>=1.9.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (1.22.4)\n", - "Requirement already satisfied: protobuf<4.0,>=3.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (3.20.1)\n", - "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/protobuf3_to_dict-0.1.5-py3.9.egg (from sagemaker) (0.1.5)\n", - "Requirement already satisfied: smdebug_rulesconfig==1.0.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/smdebug_rulesconfig-1.0.1-py3.9.egg (from sagemaker) (1.0.1)\n", - "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/importlib_metadata-4.11.3-py3.9.egg (from sagemaker) (4.11.3)\n", - "Requirement already satisfied: packaging>=20.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/packaging-21.3-py3.9.egg (from sagemaker) (21.3)\n", - "Requirement already satisfied: pandas in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pandas-1.4.2-py3.9-macosx-10.9-x86_64.egg (from sagemaker) (1.4.2)\n", - "Requirement already satisfied: pathos in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pathos-0.2.8-py3.9.egg (from sagemaker) (0.2.8)\n", - "Requirement already satisfied: zipp>=0.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/zipp-3.7.0-py3.9.egg (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.7.0)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pyparsing-3.0.7-py3.9.egg (from packaging>=20.0->sagemaker) (3.0.7)\n", - "Requirement already satisfied: six in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.15.0)\n", - "Requirement already satisfied: pyasn1>=0.1.3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", - "Requirement already satisfied: pytz>=2020.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pytz-2022.1-py3.9.egg (from pandas->sagemaker) (2022.1)\n", - "Requirement already satisfied: dill>=0.3.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/dill-0.3.4-py3.9.egg (from pathos->sagemaker) (0.3.4)\n", - "Requirement already satisfied: multiprocess>=0.70.12 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/multiprocess-0.70.12.2-py3.9.egg (from pathos->sagemaker) (0.70.12.2)\n", - "Requirement already satisfied: pox>=0.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pox-0.3.0-py3.9.egg (from pathos->sagemaker) (0.3.0)\n", - "Requirement already satisfied: ppft>=1.6.6.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/ppft-1.6.6.4-py3.9.egg (from pathos->sagemaker) (1.6.6.4)\n", - "Building wheels for collected packages: sagemaker\n", - " Building wheel for sagemaker (setup.py): started\n", - " Building wheel for sagemaker (setup.py): finished with status 'done'\n", - " Created wheel for sagemaker: filename=sagemaker-2.109.0-py2.py3-none-any.whl size=787707 sha256=6cb0a501a87ebb0ba16cd2f28b80f15c63c91f9fa56a40c1c76462ade3d6f14e\n", - " Stored in directory: /Users/gili/Library/Caches/pip/wheels/a7/c1/fa/eab3ed7597f624fbf6a9588a98288e7acf04eaa2c99c4af3d3\n", - "Successfully built sagemaker\n", - "Installing collected packages: rsa, PyYAML, docutils, colorama, botocore, s3transfer, boto3, awscli, sagemaker\n", - " Attempting uninstall: rsa\n", - " Found existing installation: rsa 4.8\n", - " Uninstalling rsa-4.8:\n", - " Successfully uninstalled rsa-4.8\n", - " Attempting uninstall: PyYAML\n", - " Found existing installation: PyYAML 6.0\n", - " Uninstalling PyYAML-6.0:\n", - " Successfully uninstalled PyYAML-6.0\n", - " Attempting uninstall: botocore\n", - " Found existing installation: botocore 1.24.32\n", - " Uninstalling botocore-1.24.32:\n", - " Successfully uninstalled botocore-1.24.32\n", - " Attempting uninstall: s3transfer\n", - " Found existing installation: s3transfer 0.5.2\n", - " Uninstalling s3transfer-0.5.2:\n", - " Successfully uninstalled s3transfer-0.5.2\n", - " Attempting uninstall: boto3\n", - " Found existing installation: boto3 1.21.32\n", - " Uninstalling boto3-1.21.32:\n", - " Successfully uninstalled boto3-1.21.32\n", - " Attempting uninstall: sagemaker\n", - " Found existing installation: sagemaker 2.99.0\n", - " Uninstalling sagemaker-2.99.0:\n", - " Successfully uninstalled sagemaker-2.99.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "sagemaker-training 4.2.2 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Successfully installed PyYAML-5.4.1 awscli-1.25.73 boto3-1.24.72 botocore-1.27.72 colorama-0.4.4 docutils-0.16 rsa-4.7.2 s3transfer-0.6.0 sagemaker-2.109.0\n", - "\n", - "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", - "[notice] To update, run: pip install --upgrade pip\n" - ] - } - ], + "outputs": [], "source": [ - "%%bash\n", - "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" + "#%%bash\n", + "#python3 -m pip install --upgrade boto3 botocore awscli sagemaker" ] }, { "cell_type": "markdown", - "id": "80c24d24", + "id": "0d20b2f3", "metadata": {}, "source": [ "#### Step 2 - Restart the notebook kernel \n", @@ -204,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "e28916a3", + "id": "a9592cda", "metadata": {}, "source": [ "#### Step 3 - Valdiate SageMaker Python SDK and PyTorch versions\n", @@ -218,8 +112,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "115cf0b2", + "execution_count": 52, + "id": "0b0e3202", "metadata": {}, "outputs": [ { @@ -230,7 +124,7 @@ "Version: 2.109.0\n", "---\n", "Name: torch\n", - "Version: 1.11.0\n", + "Version: 1.10.2+cpu\n", "---\n", "Name: boto3\n", "Version: 1.24.72\n", @@ -246,21 +140,30 @@ }, { "cell_type": "markdown", - "id": "2a1d9f4e", + "id": "9176d868", "metadata": {}, "source": [ "--------------\n", "### B. Setting up the Training environment\n", "\n", - "#### Step 1 - Import SageMaker components and setup the IAM role and Amazon S3 bucket" + "#### Step 1 - Import SageMaker components and set up the IAM role and Amazon S3 bucket" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "e51da09f", + "execution_count": 53, + "id": "594fce53", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "arn:aws:iam::776941257690:role/service-role/AmazonSageMakerServiceCatalogProductsUseRole\n", + "s3://sagemaker-us-east-1-776941257690/DEMO-MNIST\n" + ] + } + ], "source": [ "import os\n", "import json\n", @@ -277,18 +180,18 @@ "\n", "role = get_execution_role()\n", "\n", - "output_path = \"s3://\" + sess.default_bucket() + \"/DEMO-mnist\"\n", + "output_path = \"s3://\" + sess.default_bucket() + \"/DEMO-MNIST\"\n", "print(role)\n", "print(output_path)" ] }, { "cell_type": "markdown", - "id": "14b05e37", + "id": "165bca04", "metadata": {}, "source": [ "#### Step 2 - Configure environment variables \n", - "This step defines whether you want to run training job in heterogenous cluster mode or not. Also, defines instance groups, multiple nodes in group, and hyperparameter values. For baselining, if you want to run both the data pre-processing and DNN on the same node set `IS_HETERO = False`. \n", + "This step defines whether you want to run training job in heterogeneous cluster mode or not. Also, defines instance groups, multiple nodes in group, and hyperparameter values. For baselining, run a homoegeneous cluster training job by setting `IS_HETERO = False`. This will let both the data pre-processing and DNN code run on the same node i.e. `ml.p3.2xlarge`. \n", "\n", "\n", "Test configuration (if running training on p3.2xl or g5.2xl as dnn_group instance type, and c5.2xl as data_group instance type: (training duration: 7-8 mins) \n", @@ -317,8 +220,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "b964a650", + "execution_count": 54, + "id": "0d65707b", "metadata": {}, "outputs": [], "source": [ @@ -376,17 +279,17 @@ }, { "cell_type": "markdown", - "id": "485679d2", + "id": "4ff19e24", "metadata": {}, "source": [ "#### Step 3: Set up the Estimator\n", - "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." + "In order to use SageMaker to fit our algorithm, we'll create `Estimator` that defines how to use the container to train. This includes the configuration we need to invoke SageMaker training." ] }, { "cell_type": "code", - "execution_count": 6, - "id": "be4246c0", + "execution_count": 55, + "id": "94f4c8ce", "metadata": {}, "outputs": [], "source": [ @@ -406,7 +309,7 @@ }, { "cell_type": "markdown", - "id": "e38626e9", + "id": "a81dcab6", "metadata": {}, "source": [ "#### Step 4: Download the MNIST Data and Upload it to S3 bucket\n", @@ -416,8 +319,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "729a0f0f", + "execution_count": 56, + "id": "d0534973", "metadata": {}, "outputs": [], "source": [ @@ -466,14 +369,14 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "e90ea016", + "execution_count": 57, + "id": "2d699654", "metadata": {}, "outputs": [], "source": [ "# Upload to the default bucket\n", "\n", - "prefix = \"DEMO-mnist\"\n", + "prefix = \"DEMO-MNIST\"\n", "bucket = sess.default_bucket()\n", "loc = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", "\n", @@ -482,12 +385,12 @@ }, { "cell_type": "markdown", - "id": "b4b01926", + "id": "48352f04", "metadata": {}, "source": [ "## C. Submit the training job\n", "\n", - "The job runs for the predefined iterations. DNN instance group sends a shutdown request to data group after done with the training. You can see the following entries in the cloudwatch logs of dnn instance. A job with 4800 iterations finishes in 29 mins in a Heterogeneous cluster composed of 1x ml.c5.9xlarge as data node and 1x ml.p3.2xlarge as DNN node.\n", + "The job runs for the predefined iterations. DNN instance group sends a shut down request to data group after done with the training. You can see the following entries in the CloudWatch logs of dnn instance. A job with 4800 iterations finishes in 29 mins in a Heterogeneous cluster composed of 1x ml.c5.9xlarge as data node and 1x ml.p3.2xlarge as DNN node.\n", "\n", "Note: The console output of billing seconds can be ignored. See the AWS console > SageMaker > Training Job for the exact billing seconds.\n", "\n", @@ -505,7 +408,7 @@ "INFO:__main__:Training job completed!\n", "Process train_dnn.py closed with returncode=0\n", "Shutting down data service dispatcher via: [algo-2:16000]\n", - "Shutdown request sent to algo-2:16000\n", + "shut down request sent to algo-2:16000\n", "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", "2022-08-16 01:15:05,556 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", @@ -514,23 +417,17 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "ce424c23", + "execution_count": null, + "id": "31cb6cae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-13 20:39:57 Starting - Starting the training job......\n", - "2022-09-13 20:40:46 Starting - Preparing the instances for training.........\n", - "2022-09-13 20:42:12 Downloading - Downloading input data...\n", - "2022-09-13 20:42:31 Training - Downloading the training image........................\n", - "2022-09-13 20:46:43 Training - Training image download completed. Training in progress.............\n", - "2022-09-13 20:49:00 Uploading - Uploading generated training model\n", - "2022-09-13 20:49:00 Completed - Training job completed\n", - "..Training seconds: 0\n", - "Billable seconds: 0\n" + "2022-09-15 00:55:22 Starting - Starting the training job...\n", + "2022-09-15 00:55:50 Starting - Preparing the instances for training.........\n", + "2022-09-15 00:57:10 Downloading - Downloading input data.." ] } ], @@ -548,7 +445,7 @@ }, { "cell_type": "markdown", - "id": "be2bd225", + "id": "3ea2e092", "metadata": {}, "source": [ "## D. Monitoring Instance Metrics for GPU and CPU utilization\n", @@ -560,32 +457,30 @@ }, { "cell_type": "markdown", - "id": "16ef4995", + "id": "430fb45e", "metadata": {}, "source": [ "## E. Comparing time-to-train and cost-to-train\n", "\n", - "Let's continue with the above example i.e. train a heavy data pre-processing (CPU intensive) model (mnist) requiring only 1 GPU. We start with ml.p3.2xlarge (1xV100 GPU, 8x vCPU) in homogeneous cluster mode to get the baseline perf numbers. Due to the no. of CPU cores, we could not go beyond 8 data loader/workers for data pre-processing. The avg. step cost was `7.6 cents` and avg. step time is `1.19 seconds`. \n", + "Let's continue with the above example i.e. train a heavy data pre-processing (CPU intensive) model (MNIST) requiring only 1 GPU. We start with ml.p3.2xlarge (1xV100 GPU, 8x vCPU) in homogeneous cluster mode to get the baseline perf numbers. Due to the no. of CPU cores, we could not go beyond 8 data loader/workers for data pre-processing. The avg. step cost was `7.6 cents` and avg. step time is `1.19 seconds`. \n", "\n", - "Our objective is to reduce the cost and speed up the model training time. The first choice here is to scale up the instance type in the same family. If we leverage the next instance type (4 GPU) in the P3 family, the GPUs would have gone underutilized. In this case, we needed more vCPU to GPU ratio. Assuming we haven't had any instance type in another instance family or the model is incompatible with the CPU/GPU architectures of other instance families, we are constrained to use ml.p3.2xlarge. The only way then to have more vCPUs to GPU ratio is to use SageMaker feature, Heterogeneous Cluster, which enables customers to offload data pre-processing logic to CPU only instance types example ml.c5. In the next test, we offloaded CPU intensive work i.e data preprocessing to ml.c5.9xlarge (36 vCPU) and continued using ml.p3.2xlarge for DNN. The avg. step cost was `1.9 cents` and avg. step time is `0.18 seconds`. \n", + "Our objective is to reduce the cost and speed up the model training time. The first choice here is to scale up the instance type in the same family. If we leverage the next instance type (4 GPU) in the P3 family, the GPUs would have gone underutilized. In this case, we needed more vCPU to GPU ratio. Assuming we haven't had any instance type in another instance family or the model is incompatible with the CPU/GPU architectures of other instance families, we are constrained to use ml.p3.2xlarge. The only way then to have more vCPUs to GPU ratio is to use SageMaker feature, Heterogeneous Cluster, which enables customers to offload data pre-processing logic to CPU only instance types example ml.c5. In the next test, we offloaded CPU intensive work i.e. data preprocessing to ml.c5.9xlarge (36 vCPU) and continued using ml.p3.2xlarge for DNN. The avg. step cost was `1.9 cents` and avg. step time is `0.18 seconds`. \n", "\n", "In summary, we reduced the training cost by 4.75 times, and the avg. step reduced by 6.5 times. This was possible because with higher cpu count, we could use 32 data loader workers (compared to 8 with p3.2xl) to preprocess the data, and kept GPU close to 100% utilized at frequent intervals. Note: These numbers are just taken as a sample, you have to do benchmarking with your own model and dataset to come up with the exact price-performance benefits. \n", "\n", "## F. Conclusion\n", - "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training to achieve better price performance. This feature best fits for scenario where: 1/ your training job is CPU intensive and getting bottlenecked by the fixed vCPU count of an accelerated computing instance type, 2/ your training script can be decoupled - data preprocessing and deep neural network components. 3/ scaling up to next instance type within the same family is not price-performant due to underutilized GPUs, 4/ if cannot scale up, scaling out to a same instance type leads to underutlized GPUs\n" + "In this notebook, we demonstrated how to leverage heterogeneous cluster feature of SageMaker Training to achieve better price performance. To get started you can copy this example project, and only change the `train_dnn.py` script. To run the job, you could use this notebook, or the start_job.py.\n" ] }, { "cell_type": "code", "execution_count": null, - "id": "7eee5027", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { - "instance_type": "ml.t3.medium", "kernelspec": { "display_name": "Python 3.9.7 ('.venv': venv)", "language": "python", diff --git a/training/heterogeneous-clusters/tf.data.service.local/README.md b/training/heterogeneous-clusters/tf.data.service.local/README.md index 0834ef9121..148558dc89 100644 --- a/training/heterogeneous-clusters/tf.data.service.local/README.md +++ b/training/heterogeneous-clusters/tf.data.service.local/README.md @@ -11,16 +11,10 @@ Install requirements: ```bash pip install -r requirements.txt ``` - -Let's generate some data to train over: -```bash -python3 ./generate_cifar10_tfrecords.py --data-dir ./data -rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.1.tfrecords ./data/ && cp data.old/train/train.2.tfrecords ./data/ && mv data.old /tmp -``` ## Running without tf.data.service First lets run a single training process that handles both data augmentation and NN optimization: ```bash -python3 ./train.py --mode local --sm-model-dir /tmp +python3 ./train.py --mode local --model-dir /tmp ``` Expected output: ``` @@ -42,7 +36,7 @@ Expected output: ``` Now let's launch the NN training script which will connect to the dispatcher to consume its data.source ```bash -python3 ./train.py --mode service --sm-model-dir /tmp +python3 ./train.py --mode service --model-dir /tmp ``` Expected output: ``` diff --git a/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py b/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py deleted file mode 100755 index a7c78ecc37..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.local/generate_cifar10_tfrecords.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"). -# You may not use this file except in compliance with the License. -# A copy of the License is located at -# -# https://aws.amazon.com/apache-2-0/ -# -# or in the "license" file accompanying this file. This file is distributed -# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -# express or implied. See the License for the specific language governing -# permissions and limitations under the License. - -import argparse -import os -import sys -import tarfile - -import tensorflow as tf -from six.moves import cPickle as pickle -from six.moves import xrange # pylint: disable=redefined-builtin - -# import tensorflow_datasets as tfds - -CIFAR_FILENAME = "cifar-10-python.tar.gz" -CIFAR_DOWNLOAD_URL = "https://www.cs.toronto.edu/~kriz/" + CIFAR_FILENAME -CIFAR_LOCAL_FOLDER = "cifar-10-batches-py" - - -def download_and_extract(data_dir): - import tensorflow_datasets as tfds - - dm = tfds.download.DownloadManager(download_dir=data_dir + "/tmp") - extract_dir = dm.download_and_extract(CIFAR_DOWNLOAD_URL) - - return extract_dir - - -def _int64_feature(value): - return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) - - -def _bytes_feature(value): - return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) - - -def _get_file_names(): - """Returns the file names expected to exist in the input_dir.""" - file_names = {} - file_names["train"] = ["data_batch_%d" % i for i in xrange(1, 5)] - file_names["validation"] = ["data_batch_5"] - file_names["eval"] = ["test_batch"] - return file_names - - -def read_pickle_from_file(filename): - # with open(filename, 'rb') as f: - with tf.io.gfile.GFile(filename, "rb") as f: - if sys.version_info >= (3, 0): - data_dict = pickle.load(f, encoding="bytes") - else: - data_dict = pickle.load(f) - return data_dict - - -def convert_to_tfrecord(input_files, output_file): - """Converts a file to TFRecords.""" - print("Generating %s" % output_file) - with tf.io.TFRecordWriter(output_file) as record_writer: - for input_file in input_files: - data_dict = read_pickle_from_file(input_file) - data = data_dict[b"data"] - labels = data_dict[b"labels"] - - num_entries_in_batch = len(labels) - for i in range(num_entries_in_batch): - example = tf.train.Example( - features=tf.train.Features( - feature={ - "image": _bytes_feature(data[i].tobytes()), - "label": _int64_feature(labels[i]), - } - ) - ) - record_writer.write(example.SerializeToString()) - - -def install_dependencies(): - from subprocess import call - - call(["pip", "install", "--upgrade", "pip"]) - call(["pip", "install", "tensorflow_datasets==4.1.0"]) - - -def main(data_dir): - print("Download from {} and extract.".format(CIFAR_DOWNLOAD_URL)) - - extract_dir = download_and_extract(data_dir) - file_names = _get_file_names() - input_dir = os.path.join(extract_dir, CIFAR_LOCAL_FOLDER) - - for mode, files in file_names.items(): - input_files = [os.path.join(input_dir, f) for f in files] - output_file = os.path.join(data_dir + "/" + mode, mode + ".tfrecords") - if not os.path.exists(data_dir + "/" + mode): - os.makedirs(data_dir + "/" + mode) - try: - os.remove(output_file) - except OSError: - pass - # Convert to tf.train.Example and write the to TFRecords. - convert_to_tfrecord(input_files, output_file) - print("Done!") - import shutil - - shutil.rmtree(data_dir + "/tmp") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--data-dir", - type=str, - default="./data", - help="Directory to download and extract CIFAR-10 to.", - ) - - args = parser.parse_args() - - install_dependencies() - - main(args.data_dir) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/train.py b/training/heterogeneous-clusters/tf.data.service.local/train.py index a1759fdfc0..08a9368a6c 100755 --- a/training/heterogeneous-clusters/tf.data.service.local/train.py +++ b/training/heterogeneous-clusters/tf.data.service.local/train.py @@ -6,17 +6,6 @@ DISPATCHER_HOST='localhost' -# parse TFRecord+ -def parse_image_function(example_proto): - image_feature_description = {'image': tf.io.FixedLenFeature([], tf.string), - 'label': tf.io.FixedLenFeature([], tf.int64)} - features = tf.io.parse_single_example( - example_proto, image_feature_description) - image = tf.io.decode_raw(features['image'], tf.uint8) - image.set_shape([3 * 32 * 32]) - image = tf.reshape(image, [32, 32, 3]) - label = tf.cast(features['label'], tf.int32) - return image, label # dilation filter def dilate(image, label): dilateFilter = tf.zeros([3, 3, 3], tf.uint8) @@ -46,12 +35,15 @@ def augment(image, label): image = data_augmentation(image) return image, label -'this function loads mnist as tf.data.Dataset' -def load_mnist(): +# This function generates a dataset consisting 32x32x3 random images +# And a corresponding random label representing 10 different classes. +# As this dataset is randomly generated, you should not expect the model +# to converge in a meaningful way, it doesn't matter as our intent is +# only to measure data pipeline and DNN optimization throughput +def generate_artificial_dataset(): import numpy as np - (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() - x_train = x_train.astype(np.float32) / 255.0 - x_train = np.expand_dims(x_train, -1) + x_train = np.random.randint(0, 255, size=(32000, 32, 32, 3), dtype=np.uint8) + y_train = np.random.randint(0, 10, size=(32000,1)) train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) return train_dataset @@ -59,15 +51,12 @@ def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool autotune = tf.data.experimental.AUTOTUNE options = tf.data.Options() options.experimental_deterministic = False - records = tf.data.Dataset.list_files( - training_dir+'/*', shuffle=True).with_options(options) - ds = tf.data.TFRecordDataset(records, num_parallel_reads=autotune).repeat() - ds = ds.map(parse_image_function, num_parallel_calls=autotune) + ds = generate_artificial_dataset().shuffle(10000).repeat() + ds = ds.map(dilate, num_parallel_calls=autotune) ds = ds.map(blur, num_parallel_calls=autotune) ds = ds.map(rescale,num_parallel_calls=autotune) - ds = ds.map(augment, num_parallel_calls=autotune) ds = ds.batch(batch_size) diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/heterogenenous-workload.json b/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/heterogenenous-workload.json new file mode 100644 index 0000000000..5b3736fc35 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/heterogenenous-workload.json @@ -0,0 +1,30 @@ +{ + "metrics": [ + [ { "expression": "100*(m1/9600)", "label": "DNN1 CPU/100%", "id": "e1" } ], + [ { "expression": "100*(m2/800)", "label": "DNN1 GPU/100%", "id": "e2" } ], + [ { "expression": "100*(m3/7200)", "label": "DATA1 CPU/100%", "id": "e3" } ], + [ { "expression": "100*(m4/7200)", "label": "DATA2 CPU/100%", "id": "e4" } ], + [ "/aws/sagemaker/TrainingJobs", "CPUUtilization", "Host", "hetero-tf-data-service-Dnode2-wrkrs-1-20220922T214326Z/algo-1", { "id": "m1", "yAxis": "left", "visible": false } ], + [ ".", "GPUUtilization", ".", ".", { "id": "m2", "visible": false } ], + [ ".", "CPUUtilization", ".", "hetero-tf-data-service-Dnode2-wrkrs-1-20220922T214326Z/algo-2", { "id": "m3", "visible": false } ], + [ "...", "hetero-tf-data-service-Dnode2-wrkrs-1-20220922T214326Z/algo-3", { "id": "m4", "visible": false } ] + ], + "sparkline": true, + "view": "timeSeries", + "stacked": false, + "region": "us-east-1", + "stat": "Average", + "period": 60, + "setPeriodToTimeRange": true, + "yAxis": { + "left": { + "min": 0, + "max": 100, + "label": "% Utilization", + "showUnits": false + } + }, + "legend": { + "position": "bottom" + } +} \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/homogenous-workload copy.json b/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/homogenous-workload copy.json new file mode 100644 index 0000000000..c514eced5a --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/cloudwatch-metric-definitions/homogenous-workload copy.json @@ -0,0 +1,26 @@ +{ + "sparkline": true, + "metrics": [ + [ { "expression": "100*(m1/9600)", "label": "CPU/100%", "id": "e1" } ], + [ { "expression": "100*(m2/800)", "label": "GPU/100%", "id": "e2" } ], + [ "/aws/sagemaker/TrainingJobs", "CPUUtilization", "Host", "hetero-tf-data-local-Dnode1-wrkrs-1-20220921T213920Z/algo-1", { "id": "m1", "visible": false } ], + [ ".", "GPUUtilization", ".", ".", { "id": "m2", "visible": false } ] + ], + "view": "timeSeries", + "stacked": false, + "region": "us-east-1", + "stat": "Average", + "period": 60, + "setPeriodToTimeRange": true, + "yAxis": { + "left": { + "min": 0, + "max": 100, + "label": "% Utilization", + "showUnits": false + } + }, + "legend": { + "position": "bottom" + } +} \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py index a976d59ea2..cd938b46c7 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/code/train_dnn.py @@ -5,18 +5,6 @@ import os import horovod.tensorflow.keras as hvd -# parse TFRecord -def parse_image_function(example_proto): - image_feature_description = {'image': tf.io.FixedLenFeature([], tf.string), - 'label': tf.io.FixedLenFeature([], tf.int64)} - features = tf.io.parse_single_example( - example_proto, image_feature_description) - image = tf.io.decode_raw(features['image'], tf.uint8) - image.set_shape([3 * 32 * 32]) - image = tf.reshape(image, [32, 32, 3]) - label = tf.cast(features['label'], tf.int32) - return image, label - # dilation filter def dilate(image, label): @@ -53,19 +41,29 @@ def augment(image, label): return image, label -def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool, dispatcher_host : str): +# This function generates a dataset consisting 32x32x3 random images +# And a corresponding random label representing 10 different classes. +# As this dataset is randomly generated, you should not expect the model +# to converge in a meaningful way, it doesn't matter as our intent is +# only to measure data pipeline and DNN optimization throughput +def generate_artificial_dataset(): + import numpy as np + x_train = np.random.randint(0, 255, size=(32000, 32, 32, 3), dtype=np.uint8) + y_train = np.random.randint(0, 10, size=(32000,1)) + train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) + return train_dataset + + +def get_dataset(batch_size : int, use_tf_data_service : bool, dispatcher_host : str): autotune = tf.data.experimental.AUTOTUNE options = tf.data.Options() options.experimental_deterministic = False - records = tf.data.Dataset.list_files( - training_dir+'/*', shuffle=True).with_options(options) - ds = tf.data.TFRecordDataset(records, num_parallel_reads=autotune).repeat() - ds = ds.map(parse_image_function, num_parallel_calls=autotune) + ds = generate_artificial_dataset().shuffle(10000).repeat() + ds = ds.map(dilate, num_parallel_calls=autotune) ds = ds.map(blur, num_parallel_calls=autotune) ds = ds.map(rescale,num_parallel_calls=autotune) - ds = ds.map(augment, num_parallel_calls=autotune) ds = ds.batch(batch_size) @@ -79,7 +77,6 @@ def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool ds = ds.prefetch(autotune) return ds - "This function read mode command line argument" def read_args(): import argparse @@ -91,8 +88,6 @@ def read_args(): parser.add_argument('--epochs', type=int, default=1) parser.add_argument("--n_gpus", type=str, default=os.environ.get("SM_NUM_GPUS")) - parser.add_argument("--training_dir", type=str, - default=os.environ.get("SM_CHANNEL_TRAINING")) parser.add_argument("--dispatcher_host", type=str) parser.add_argument("--num_of_data_workers", type=int, default=1) parser.add_argument("--output_data_dir", type=str, @@ -146,7 +141,7 @@ def read_args(): assert(args.tf_data_mode == 'local' or args.tf_data_mode == 'service') print(f'Running in {args.tf_data_mode} tf_data_mode.') - dataset = get_dataset(args.training_dir, batch_size = args.batch_size, use_tf_data_service=(args.tf_data_mode == 'service'), dispatcher_host = args.dispatcher_host) + dataset = get_dataset(batch_size = args.batch_size, use_tf_data_service=(args.tf_data_mode == 'service'), dispatcher_host = args.dispatcher_host) model.fit( dataset, steps_per_epoch=args.steps_per_epoch, diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 6441236850..9c443c8ff9 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -7,13 +7,15 @@ "# TensorFlow's tf.data.service with Amazon SageMaker Training Heterogeneous Clusters\n", "\n", "---\n", - "### Intro\n", + "### Introduction\n", "\n", - "Heterogeneous clusters enables launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottlnecked on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters allows you to add more CPU resources to fully utilize GPUs to increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", + "Heterogeneous clusters enable launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision (CV) deep learning (DL) training, where training is bottleneck on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters enable you to add more CPU resources to fully utilize GPUs to increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", + "\n", + "This notebook demonstrates how to use Heterogeneous Clusters with TensorFlow's [tf.data.service](https://www.TensorFlow.org/api_docs/python/tf/data/experimental/service). It includes training a CPU intensive DL CV workload. Comparing cost and performance between homogeneous and heterogeneous training configurations. \n", + "\n", + "💡To get started quickly with heterogenous clusters, we suggest you'll reuse the provided code as a quick way to migrate your workload from a local tf.data pipeline to a distributed tf.data.service pipeline. You'll need to change [code/train_dnn.py](./code/train_dnn.py), while keeping [code/train_data.py](./code/train_data.py) and [code/launcher.py](code/launcher.py) intact. This is explained below in the [Workload Details] section.\n", "\n", - "This notebook demonstrates how to use Heterogeneous Clusters feature of SageMaker Training with TensorFlow's [tf.data.service](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service).\n", "\n", - "In this sample notebook, we'll be training a CPU intensive Deep Learning computer vision workload. We'll be comparing between a homogeneous and a heterogeneous training configurations. Both jobs we'll run train with the same data, pre-processing, and other relevant parameters:\n", "\n", "
\n", " \n", @@ -37,43 +39,40 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Workload Details\n", - "Training data is stored in TFRecord files in `data` folder, and generated from [CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html) dataset using `generate_cifar10_tfrecords.py` script. The data pre-processing pipeline includes: parsing images, dilation, blur filtering, and a number of [TensorFlow preprocessing layers](https://www.tensorflow.org/guide/keras/preprocessing_layers). We'll use a [Resnet50](https://www.tensorflow.org/api_docs/python/tf/keras/applications/ResNet50) architecture. The job runs on an 8 GPUs instance, p4d.24xlarge, and uses Horovod for data parallelizaion. " + "### Workload Details\n", + "Training data is an arteficially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neaural network optimization throughput expressd in epoch/step time. \n", + "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The job runs on an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Setting up Heterogeneous clusters Training\n", - "We then define `instance_groups` in the TensorFlow estimator to enable training jobs to leverage Heterogeneous Cluster features. \n", - "The data pre-processing code runs on the CPU nodes (here referred as **data_group or data group**), whereas the Deep Neural Network training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). In this example, the inter-node communication between CPU and GPU instance_groups is implemented using [TensorFlow data service feature](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service). This feature was introduced in TensorFlow version 2.3 which provides APIs for defining dedicated worker machines for performing data preprocessing. Note that SageMaker's Heterogeneous cluster does not provide out-of-the-box support for inter-instance_group communication. \n", - "\n", - "\n", - "The training script (`launcher.py`) runs on all the nodes regardless of which instance_group it belongs to. However, it has the logic to detect (using SageMaker's `instance_group` environment variables) whether the node it is running on belongs to data_group or dnn_group. \n", - "\n", - "If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs a dispatcher server service on the first node of the instance group. And, on all the nodes in the same instance_group, it runs the worker server service. A dispatch server is responsible for distributing preprocessing tasks to one, or more, worker servers, each of which load the raw data directly from storage, and send the processed data to the GPU device. A dispatcher server listens on port 6000, whereas the worker server listens on port 6001. By applying `tf.data.experimental.service.distribute` to your dataset, you can program the dataset to run all preprocessing operations up to the point of application, on the workers. TFRecord files are copied over to instances in this group, as the workers load the raw data from those files. In this example, we are using 2 instances of ml.c5.18xlarge in the data_group. While dispatching the data to the dnn_group, the main entrypoint script `launcher.py` listens on port 16000 for a shutdown request coming from the data group. The train_data.py waits for shutdown action from the parent process.\n", - "\n", - "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. This script contains a deep neural network algorithm/code. And, in some cases, can host additional data-preprocessing components to maximize the use of CPUs on dnn nodes. The set of processes running DNN training consumes a stream of processed dataset from the Dispatcher server (the first node in the data_group at port 6000), and runs model training. The dnn_group can also run distributed training on multiple nodes defined by parameter instance_count (see details under **Setting up the training environment** section of this notebook). Once the model is trained on the dataset, the dnn_group establishes a connection back to the dispatcher server on port 16000 to signal shutdown request. \n", + "### Setting up heterogeneous clusters training\n", + "To switch to heterogenous clusters, we'll define two `instance_groups`:\n", + "- **data_group** - A group of CPU instances that will run data pre-processing code.\n", + "- **dnn_group** - A group of GPU instances that will run Deep Neural Network training code.\n", "\n", + "In this example, the inter-node communication between CPU and GPU instance groups is implemented using [TensorFlow data service feature](https://www.TensorFlow.org/api_docs/python/tf/data/experimental/service). This feature allows to offload a configurable amount of preprocessing work to worker machines. Note that SageMaker's Heterogeneous cluster does not provide out-of-the-box support for inter-instance_group communication and it is up to the user to implement (we provide reference implementation here).\n", "\n", - "A graphical view of how the data flows is shown below in Heterogeneous Cluster training with tf.data.service:\n", - "\n", - "**NEED TO BE UPDATED**\n", + "This notebook refers following files and folders:\n", + "- [code/train_dnn.py](./code/train_dnn.py) - this is standard TF training script, it has a single reference to tf.data.service when setting up the tf.data pipeline. This script will be executed on GPU instances belonging to the dnn_group.\n", + "- [code/train_data.py](./code/train_data.py) - this script starts tf.data.service services like a tf.data.service Dispatcher and tf.data.service Worker processes. You shouldn't edit this script when adjusting to your workload.\n", + "- [code/launcher.py](./code/launcher.py) - Entry point training script. This is the script that SageMaker Training will start on all instances (all instances groups must share the same entrypoint script in heterogeneous clusters). `launcher.py` is responsible for detecting the instance group the instance belong to, and start `train_dnn.py` and `train_data.py` accordingly. It is also responsible for shutting down tf.data.services the training script completes (`train_dnn.py`) so all instances exit allowing the SageMaker training job to complete. \n", + "In every instance `luncher.py` will use `train_data.py` to start a tf.data.service worker server (As all instance types have CPUs that could be used for preprocessing). `luncher.py` will start a single tf.data.service dispatcher server (on the first instance of the `data_group`). \n", + "`luncher.py` will start the `train_dnn.py` script in all GPU instances (`dnn_group` instances).\n", "\n", - "\n", + "#### Learn more about tf.data.service processes\n", + "`tf.data.service Dispatcher` - The dispatcher server acts as the control plain for tf.data.service; Being responsible for registering worker servers and assinging preprocessing tasks to them. Each training job has a single Dispatcher running in the first instance of the `data_group` and listens on port 6000.\n", + "`tf.data.service Workers` - Worker servers carry out the data processing. Each instance could have one or more workers (listen on port 6001/6002/...).\n", "\n", + "#### Defining what part of your pipeline runs in which instance\n", + " Applying `tf.data.experimental.service.distribute` to your dataset, you can program the dataset to run all preprocessing operations up to the point of application, on the workers. \n", + " As all instances will run a tf.data.service Worker, all instances will need access to a dataset you'll make available through a SageMaker training data channel. You do have the option of limiting which instance group will see which training data channel.\n", "\n", - "This notebook refers following files and folders:\n", + "Thie below figutre shows sequence of events of setting up and running in a tf.data.service based heterogeneous cluster training job.\n", "\n", - "- Folders: \n", - "  - `code`: this has the training scripts, grpc client-server code, \n", - "  - `images`: contains images referred in notebook\n", - "- Files: \n", - "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. Explained above. \n", - "  - `train_data.py`: this script runs on the data_group nodes and responsible for setting up dispatcher and worker servers\n", - "  - `train_dnn.py`: this script runs on the dnn_group nodes, and responsible for DNN training code/algorithm. \n", - "  - `requirements.txt`: defines package required for tensorflow-addon and protobuf \n" + "" ] }, { @@ -83,7 +82,7 @@ "---\n", "**NOTE**\n", "\n", - "As an alternative to following this notebook, you follow (readme.md)[./readme.md] which allows you to setup and launch the training job from an IDE or command line. \n", + "As an alternative to this notebook, you can follow (readme.md)[./readme.md] which allows you to set up and launch the training job from an IDE or command line. \n", "\n", "---" ] @@ -94,32 +93,113 @@ "source": [ "\n", "At a high level, the notebook covers:\n", - "-  A Setting up Amazon SageMaker Studio Notebook \n", - "-  Preparing Training dataset and uploading to Amazon S3\n", - "-  Setting up the Training environment\n", - "-  Submitting the Training job\n", - "-  Monitor and visualize the CloudWatch metrics\n", - "-  Comparing time-to-train and cost-to-train\n", - "-  Conclusion" + "-  Set up Amazon SageMaker Studio Notebook \n", + "- Run homogeneous cluster training job \n", + " -  Setting up the Training environment\n", + " -  Submitting the Training job\n", + " -  Monitor and visualize the CloudWatch metrics\n", + "- Run heterogeneous cluster training job \n", + " -  Setting up the Training environment\n", + " -  Submitting the Training job\n", + " -  Monitor and visualize the CloudWatch metrics\n", + "-  Compare time-to-train and cost-to-train\n", + "-  Conclusion\n", + "\n", + "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### A. Setting up SageMaker Studio notebook\n", + "### A. Set up SageMaker Studio notebook\n", "#### Before you start\n", "Ensure you have selected Python 3 (_TensorFlow 2.6 Python 3.8 CPU Optimized_) image for your SageMaker Studio Notebook instance, and running on _ml.t3.medium_ instance type.\n", "\n", "#### Step 1 - Upgrade SageMaker SDK and dependent packages \n", - "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. As a first step, ensure you have updated SageMaker SDK, PyTorch, and Boto3 client that enables this feature." + "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. This feature release requires you to have updated SageMaker SDK, PyTorch, and Boto3 client." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: boto3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (1.24.72)\n", + "Collecting boto3\n", + " Downloading boto3-1.24.80-py3-none-any.whl (132 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 kB 925.9 kB/s eta 0:00:00\n", + "Requirement already satisfied: botocore in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (1.27.72)\n", + "Collecting botocore\n", + " Downloading botocore-1.27.80-py3-none-any.whl (9.1 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 16.4 MB/s eta 0:00:00\n", + "Requirement already satisfied: awscli in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (1.25.73)\n", + "Collecting awscli\n", + " Downloading awscli-1.25.81-py3-none-any.whl (3.9 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 38.4 MB/s eta 0:00:00\n", + "Requirement already satisfied: sagemaker in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (2.109.0)\n", + "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from boto3) (0.6.0)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/jmespath-1.0.0-py3.9.egg (from boto3) (1.0.0)\n", + "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/urllib3-1.26.9-py3.9.egg (from botocore) (1.26.9)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/python_dateutil-2.8.2-py3.9.egg (from botocore) (2.8.2)\n", + "Requirement already satisfied: PyYAML<5.5,>=3.10 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from awscli) (5.4.1)\n", + "Requirement already satisfied: docutils<0.17,>=0.10 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from awscli) (0.16)\n", + "Requirement already satisfied: colorama<0.4.5,>=0.2.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from awscli) (0.4.4)\n", + "Requirement already satisfied: rsa<4.8,>=3.1.2 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from awscli) (4.7.2)\n", + "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/importlib_metadata-4.11.3-py3.9.egg (from sagemaker) (4.11.3)\n", + "Requirement already satisfied: pathos in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pathos-0.2.8-py3.9.egg (from sagemaker) (0.2.8)\n", + "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/protobuf3_to_dict-0.1.5-py3.9.egg (from sagemaker) (0.1.5)\n", + "Requirement already satisfied: pandas in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pandas-1.4.2-py3.9-macosx-10.9-x86_64.egg (from sagemaker) (1.4.2)\n", + "Requirement already satisfied: numpy<2.0,>=1.9.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (1.22.4)\n", + "Requirement already satisfied: attrs<22,>=20.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/attrs-20.3.0-py3.9.egg (from sagemaker) (20.3.0)\n", + "Requirement already satisfied: smdebug-rulesconfig==1.0.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/smdebug_rulesconfig-1.0.1-py3.9.egg (from sagemaker) (1.0.1)\n", + "Requirement already satisfied: google-pasta in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/google_pasta-0.2.0-py3.9.egg (from sagemaker) (0.2.0)\n", + "Requirement already satisfied: protobuf<4.0,>=3.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from sagemaker) (3.20.1)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/packaging-21.3-py3.9.egg (from sagemaker) (21.3)\n", + "Requirement already satisfied: zipp>=0.5 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/zipp-3.7.0-py3.9.egg (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.7.0)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pyparsing-3.0.7-py3.9.egg (from packaging>=20.0->sagemaker) (3.0.7)\n", + "Requirement already satisfied: six in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.15.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pytz-2022.1-py3.9.egg (from pandas->sagemaker) (2022.1)\n", + "Requirement already satisfied: dill>=0.3.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/dill-0.3.4-py3.9.egg (from pathos->sagemaker) (0.3.4)\n", + "Requirement already satisfied: multiprocess>=0.70.12 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/multiprocess-0.70.12.2-py3.9.egg (from pathos->sagemaker) (0.70.12.2)\n", + "Requirement already satisfied: pox>=0.3.0 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/pox-0.3.0-py3.9.egg (from pathos->sagemaker) (0.3.0)\n", + "Requirement already satisfied: ppft>=1.6.6.4 in /Users/gili/dev/hetro-training/.venv/lib/python3.9/site-packages/ppft-1.6.6.4-py3.9.egg (from pathos->sagemaker) (1.6.6.4)\n", + "Installing collected packages: botocore, boto3, awscli\n", + " Attempting uninstall: botocore\n", + " Found existing installation: botocore 1.27.72\n", + " Uninstalling botocore-1.27.72:\n", + " Successfully uninstalled botocore-1.27.72\n", + " Attempting uninstall: boto3\n", + " Found existing installation: boto3 1.24.72\n", + " Uninstalling boto3-1.24.72:\n", + " Successfully uninstalled boto3-1.24.72\n", + " Attempting uninstall: awscli\n", + " Found existing installation: awscli 1.25.73\n", + " Uninstalling awscli-1.25.73:\n", + " Successfully uninstalled awscli-1.25.73\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "sagemaker-training 4.2.2 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully installed awscli-1.25.81 boto3-1.24.80 botocore-1.27.80\n" + ] + } + ], "source": [ "%%bash\n", "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" @@ -137,7 +217,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 3 - Valdiate SageMaker Python SDK and Tensorflow versions\n", + "#### Step 3 - Valdiate SageMaker Python SDK and TensorFlow versions\n", "Ensure the output of the cell below reflects:\n", "\n", "- SageMaker Python SDK version 2.98.0 or above, \n", @@ -148,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -159,10 +239,10 @@ "Version: 2.109.0\n", "---\n", "Name: boto3\n", - "Version: 1.24.72\n", + "Version: 1.24.80\n", "---\n", "Name: botocore\n", - "Version: 1.27.72\n", + "Version: 1.27.80\n", "---\n", "Name: tensorflow\n", "Version: 2.8.0\n", @@ -176,43 +256,9 @@ "!pip show sagemaker boto3 botocore tensorflow protobuf |egrep 'Name|Version|---'" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### B. Preparing Training Dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Download cifar10 dataset and convert them into tfrecord\n", - "The training data set is stored in TFRecord files in `data` folder, and generated from CIFAR-10 dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "%%bash\n", - "python3 ./generate_cifar10_tfrecords.py --data-dir ./data\n", - "rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.tfrecords ./data/train.1.tfrecords && cp data.old/train/train.tfrecords ./data/train.2.tfrecords && mv data.old /tmp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### C. Setting up training environment\n", - "#### Step 1: Import SageMaker components and setup the IAM role and S3 bucket\n" - ] - }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -226,56 +272,27 @@ "from sagemaker.instance_group import InstanceGroup\n", "\n", "sess = sagemaker.Session()\n", - "role = get_execution_role()\n", - "output_path = \"s3://\" + sess.default_bucket() + \"/cifar10-tfrecord\"\n", - "print(f\"role={role}\")\n", - "print(f\"output_path={output_path}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Step 2: Upload the tfrecord training data to S3 bucket and define training input" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "prefix = \"cifar10-tfrecord\"\n", - "bucket = sess.default_bucket()\n", - "print(f\"Uploading data from ./data to s3://{bucket}/{prefix}/\")\n", - "s3path = sess.upload_data(path=\"./data\", bucket=bucket, key_prefix=prefix)\n", - "\n", - "from sagemaker import TrainingInput\n", - "data_uri = TrainingInput(\n", - " s3path,\n", - " # instance_groups=['data_group'], # we don't need to restrict training channel to a specific group as we have data workers in both groups\n", - " input_mode=\"FastFile\",\n", - ")" + "role = get_execution_role()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 3 - Running a homogeneous training job\n", - "In this step we define and submit a homogeneous training job. It use a single instance type (p4d.24xlarge) with 8 GPUs, and analysis will show its CPU bound causing its GPUs to be underutilized." + "### C. Run a homogeneous training job\n", + "#### Step 1: Set up the training environment\n", + "In this step, we define and submit a homogeneous training job. It uses a single instance type (p4d.24xlarge) with 8 GPUs, and analysis shows that is CPU bound causing its GPUs being underutilized." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "from sagemaker.tensorflow import TensorFlow\n", "from sagemaker.instance_group import InstanceGroup\n", - "from sagemaker.inputs import TrainingInput\n", "import os\n", "\n", "hyperparameters = {\n", @@ -312,19 +329,569 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### D. Submit the training job\n", + "#### Step 2: Submit the training job\n", "\n", "Note: For the logs, click on **View logs** from the **Training Jobs** node in **Amazon SageMaker Console**. \n" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-23 23:18:04 Starting - Starting the training job......\n", + "2022-09-23 23:18:42 Starting - Preparing the instances for training.....................\n", + "2022-09-23 23:22:58 Downloading - Downloading input data\n", + "2022-09-23 23:22:58 Training - Downloading the training image.....................\n", + "2022-09-23 23:26:24 Training - Training image download completed. Training in progress.2022-09-23 23:26:28.318648: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-23 23:26:28.324773: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "2022-09-23 23:26:28.664172: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-23 23:26:33,877 sagemaker-training-toolkit INFO Imported framework sagemaker_tensorflow_container.training\n", + "2022-09-23 23:26:34,441 sagemaker-training-toolkit INFO Installing dependencies from requirements.txt:\n", + "/usr/local/bin/python3.9 -m pip install -r requirements.txt\n", + "Collecting protobuf==3.20.1\n", + "Downloading protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 36.8 MB/s eta 0:00:00\n", + "Collecting tensorflow-addons==0.17.0\n", + "Downloading tensorflow_addons-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 51.9 MB/s eta 0:00:00\n", + "Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (2.13.3)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (21.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.9/site-packages (from packaging->tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (3.0.9)\n", + "Installing collected packages: protobuf, tensorflow-addons\n", + "Attempting uninstall: protobuf\n", + "Found existing installation: protobuf 3.19.4\n", + "Uninstalling protobuf-3.19.4:\n", + "Successfully uninstalled protobuf-3.19.4\n", + "Attempting uninstall: tensorflow-addons\n", + "Found existing installation: tensorflow-addons 0.17.1\n", + "Uninstalling tensorflow-addons-0.17.1:\n", + "Successfully uninstalled tensorflow-addons-0.17.1\n", + "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "tf-models-official 2.9.1 requires tensorflow~=2.9.0, which is not installed.\n", + "tensorflow-gpu 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "tensorboard 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "sagemaker-training 4.1.4.dev0 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "Successfully installed protobuf-3.20.1 tensorflow-addons-0.17.0\n", + "WARNING: 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\n", + "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", + "[notice] To update, run: pip install --upgrade pip\n", + "2022-09-23 23:26:42,488 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-23 23:26:42,488 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-23 23:26:42,661 sagemaker-training-toolkit INFO Starting MPI run as worker node.\n", + "2022-09-23 23:26:42,661 sagemaker-training-toolkit INFO Creating SSH daemon.\n", + "2022-09-23 23:26:42,671 sagemaker-training-toolkit INFO Waiting for MPI workers to establish their SSH connections\n", + "2022-09-23 23:26:42,671 sagemaker-training-toolkit INFO Env Hosts: ['algo-1'] Hosts: ['algo-1:8'] process_per_hosts: 8 num_processes: 8\n", + "2022-09-23 23:26:42,672 sagemaker-training-toolkit INFO Network interface name: eth0\n", + "2022-09-23 23:26:42,755 sagemaker-training-toolkit INFO Invoking user script\n", + "Training Env:\n", + "{\n", + " \"additional_framework_parameters\": {\n", + " \"sagemaker_mpi_custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", + " \"sagemaker_mpi_enabled\": true,\n", + " \"sagemaker_mpi_num_of_processes_per_host\": 8\n", + " },\n", + " \"channel_input_dirs\": {},\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_group\": \"homogeneousCluster\",\n", + " \"current_instance_group_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"distribution_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"distribution_instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"framework_module\": \"sagemaker_tensorflow_container.training:main\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"hyperparameters\": {\n", + " \"batch_size\": 1024,\n", + " \"epochs\": 10,\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"num_of_data_workers\": 0,\n", + " \"steps_per_epoch\": 500,\n", + " \"tf_data_mode\": \"local\"\n", + " },\n", + " \"input_config_dir\": \"/opt/ml/input/config\",\n", + " \"input_data_config\": {},\n", + " \"input_dir\": \"/opt/ml/input\",\n", + " \"instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"instance_groups_dict\": {\n", + " \"homogeneousCluster\": {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " },\n", + " \"is_hetero\": false,\n", + " \"is_master\": true,\n", + " \"job_name\": \"homogeneous-20220923T231801Z\",\n", + " \"log_level\": 20,\n", + " \"master_hostname\": \"algo-1\",\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"module_dir\": \"s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\",\n", + " \"module_name\": \"launcher\",\n", + " \"network_interface_name\": \"eth0\",\n", + " \"num_cpus\": 96,\n", + " \"num_gpus\": 8,\n", + " \"output_data_dir\": \"/opt/ml/output/data\",\n", + " \"output_dir\": \"/opt/ml/output\",\n", + " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", + " \"resource_config\": {\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"current_group_name\": \"homogeneousCluster\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"instance_groups\": [\n", + " {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " ],\n", + " \"network_interface_name\": \"eth0\"\n", + " },\n", + " \"user_entry_point\": \"launcher.py\"\n", + "}\n", + "Environment variables:\n", + "SM_HOSTS=[\"algo-1\"]\n", + "SM_NETWORK_INTERFACE_NAME=eth0\n", + "SM_HPS={\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"}\n", + "SM_USER_ENTRY_POINT=launcher.py\n", + "SM_FRAMEWORK_PARAMS={\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8}\n", + "SM_RESOURCE_CONFIG={\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"}\n", + "SM_INPUT_DATA_CONFIG={}\n", + "SM_OUTPUT_DATA_DIR=/opt/ml/output/data\n", + "SM_CHANNELS=[]\n", + "SM_CURRENT_HOST=algo-1\n", + "SM_CURRENT_INSTANCE_TYPE=ml.p4d.24xlarge\n", + "SM_CURRENT_INSTANCE_GROUP=homogeneousCluster\n", + "SM_CURRENT_INSTANCE_GROUP_HOSTS=[\"algo-1\"]\n", + "SM_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_INSTANCE_GROUPS_DICT={\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}}\n", + "SM_DISTRIBUTION_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_IS_HETERO=false\n", + "SM_MODULE_NAME=launcher\n", + "SM_LOG_LEVEL=20\n", + "SM_FRAMEWORK_MODULE=sagemaker_tensorflow_container.training:main\n", + "SM_INPUT_DIR=/opt/ml/input\n", + "SM_INPUT_CONFIG_DIR=/opt/ml/input/config\n", + "SM_OUTPUT_DIR=/opt/ml/output\n", + "SM_NUM_CPUS=96\n", + "SM_NUM_GPUS=8\n", + "SM_MODEL_DIR=/opt/ml/model\n", + "SM_MODULE_DIR=s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\n", + "SM_TRAINING_ENV={\"additional_framework_parameters\":{\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8},\"channel_input_dirs\":{},\"current_host\":\"algo-1\",\"current_instance_group\":\"homogeneousCluster\",\"current_instance_group_hosts\":[\"algo-1\"],\"current_instance_type\":\"ml.p4d.24xlarge\",\"distribution_hosts\":[\"algo-1\"],\"distribution_instance_groups\":[\"homogeneousCluster\"],\"framework_module\":\"sagemaker_tensorflow_container.training:main\",\"hosts\":[\"algo-1\"],\"hyperparameters\":{\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"},\"input_config_dir\":\"/opt/ml/input/config\",\"input_data_config\":{},\"input_dir\":\"/opt/ml/input\",\"instance_groups\":[\"homogeneousCluster\"],\"instance_groups_dict\":{\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}},\"is_hetero\":false,\"is_master\":true,\"job_name\":\"homogeneous-20220923T231801Z\",\"log_level\":20,\"master_hostname\":\"algo-1\",\"model_dir\":\"/opt/ml/model\",\"module_dir\":\"s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\",\"module_name\":\"launcher\",\"network_interface_name\":\"eth0\",\"num_cpus\":96,\"num_gpus\":8,\"output_data_dir\":\"/opt/ml/output/data\",\"output_dir\":\"/opt/ml/output\",\"output_intermediate_dir\":\"/opt/ml/output/intermediate\",\"resource_config\":{\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"},\"user_entry_point\":\"launcher.py\"}\n", + "SM_USER_ARGS=[\"--batch_size\",\"1024\",\"--epochs\",\"10\",\"--model_dir\",\"/opt/ml/model\",\"--num_of_data_workers\",\"0\",\"--steps_per_epoch\",\"500\",\"--tf_data_mode\",\"local\"]\n", + "SM_OUTPUT_INTERMEDIATE_DIR=/opt/ml/output/intermediate\n", + "SM_HP_BATCH_SIZE=1024\n", + "SM_HP_EPOCHS=10\n", + "SM_HP_MODEL_DIR=/opt/ml/model\n", + "SM_HP_NUM_OF_DATA_WORKERS=0\n", + "SM_HP_STEPS_PER_EPOCH=500\n", + "SM_HP_TF_DATA_MODE=local\n", + "PYTHONPATH=/opt/ml/code:/usr/local/bin:/usr/local/lib/python39.zip:/usr/local/lib/python3.9:/usr/local/lib/python3.9/lib-dynload:/usr/local/lib/python3.9/site-packages:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument-3.4.2-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument_cext-0.2.4-py3.9-linux-x86_64.egg\n", + "Invoking script with the following command:\n", + "mpirun --host algo-1:8 -np 8 --allow-run-as-root --display-map --tag-output -mca btl_tcp_if_include eth0 -mca oob_tcp_if_include eth0 -mca plm_rsh_no_tree_spawn 1 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_abort_on_non_zero_status 1 -mca btl_vader_single_copy_mechanism none -x NCCL_MIN_NRINGS=4 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_DEBUG=WARN -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD=/usr/local/lib/python3.9/site-packages/gethostname.cpython-39-x86_64-linux-gnu.so -x SM_HOSTS -x SM_NETWORK_INTERFACE_NAME -x SM_HPS -x SM_USER_ENTRY_POINT -x SM_FRAMEWORK_PARAMS -x SM_RESOURCE_CONFIG -x SM_INPUT_DATA_CONFIG -x SM_OUTPUT_DATA_DIR -x SM_CHANNELS -x SM_CURRENT_HOST -x SM_CURRENT_INSTANCE_TYPE -x SM_CURRENT_INSTANCE_GROUP -x SM_CURRENT_INSTANCE_GROUP_HOSTS -x SM_INSTANCE_GROUPS -x SM_INSTANCE_GROUPS_DICT -x SM_DISTRIBUTION_INSTANCE_GROUPS -x SM_IS_HETERO -x SM_MODULE_NAME -x SM_LOG_LEVEL -x SM_FRAMEWORK_MODULE -x SM_INPUT_DIR -x SM_INPUT_CONFIG_DIR -x SM_OUTPUT_DIR -x SM_NUM_CPUS -x SM_NUM_GPUS -x SM_MODEL_DIR -x SM_MODULE_DIR -x SM_TRAINING_ENV -x SM_USER_ARGS -x SM_OUTPUT_INTERMEDIATE_DIR -x SM_HP_BATCH_SIZE -x SM_HP_EPOCHS -x SM_HP_MODEL_DIR -x SM_HP_NUM_OF_DATA_WORKERS -x SM_HP_STEPS_PER_EPOCH -x SM_HP_TF_DATA_MODE -x PYTHONPATH /usr/local/bin/python3.9 -m mpi4py launcher.py --batch_size 1024 --epochs 10 --model_dir /opt/ml/model --num_of_data_workers 0 --steps_per_epoch 500 --tf_data_mode local\n", + "Data for JOB [27836,1] offset 0 Total slots allocated 8\n", + " ======================== JOB MAP ========================\n", + " Data for node: ip-10-0-208-135#011Num slots: 8#011Max slots: 0#011Num procs: 8\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 0 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 1 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 2 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 3 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 4 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 5 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 6 Bound: N/A\n", + " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 7 Bound: N/A\n", + " =============================================================\n", + "[1,mpirank:1,algo-1]:env.is_hetero=False\n", + "[1,mpirank:1,algo-1]:current_host=algo-1\n", + "[1,mpirank:1,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:2,algo-1]:env.is_hetero=False\n", + "[1,mpirank:2,algo-1]:current_host=algo-1\n", + "[1,mpirank:2,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:3,algo-1]:env.is_hetero=False\n", + "[1,mpirank:3,algo-1]:current_host=algo-1\n", + "[1,mpirank:3,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:4,algo-1]:env.is_hetero=False\n", + "[1,mpirank:4,algo-1]:current_host=algo-1\n", + "[1,mpirank:4,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:0,algo-1]:env.is_hetero=False\n", + "[1,mpirank:0,algo-1]:current_host=algo-1\n", + "[1,mpirank:0,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:7,algo-1]:env.is_hetero=False\n", + "[1,mpirank:7,algo-1]:current_host=algo-1\n", + "[1,mpirank:7,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:6,algo-1]:env.is_hetero=False\n", + "[1,mpirank:6,algo-1]:current_host=algo-1\n", + "[1,mpirank:6,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:5,algo-1]:env.is_hetero=False\n", + "[1,mpirank:5,algo-1]:current_host=algo-1\n", + "[1,mpirank:5,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.594431: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.594427: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.594436: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.594432: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.594431: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.594438: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.594475: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.594565: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.594561: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.594560: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.594581: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.602661: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.602798: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.628661: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.628681: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.628663: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.628663: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.628648: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.628649: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.628657: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.637300: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:4,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:0,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:4,algo-1]:hvd.local_rank() 4\n", + "[1,mpirank:2,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:0,algo-1]:hvd.local_rank() 0\n", + "[1,mpirank:2,algo-1]:hvd.local_rank() 2\n", + "[1,mpirank:3,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:7,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:1,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:3,algo-1]:hvd.local_rank() 3\n", + "[1,mpirank:7,algo-1]:hvd.local_rank() 7\n", + "[1,mpirank:1,algo-1]:hvd.local_rank() 1\n", + "[1,mpirank:6,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:5,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:6,algo-1]:hvd.local_rank() 6\n", + "[1,mpirank:5,algo-1]:hvd.local_rank() 5\n", + "[1,mpirank:4,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:5,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:1,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:3,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:0,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:7,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:2,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:6,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:3,algo-1]:Epoch 1/10\n", + "[1,mpirank:6,algo-1]:Epoch 1/10\n", + "[1,mpirank:1,algo-1]:Epoch 1/10\n", + "[1,mpirank:5,algo-1]:Epoch 1/10\n", + "[1,mpirank:7,algo-1]:Epoch 1/10\n", + "[1,mpirank:0,algo-1]:Epoch 1/10\n", + "[1,mpirank:2,algo-1]:Epoch 1/10\n", + "[1,mpirank:4,algo-1]:Epoch 1/10\n", + "[1,mpirank:0,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:0,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:0,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:6,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:6,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:6,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:2,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:2,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:2,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:5,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:5,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:5,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:1,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:1,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:1,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:7,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:7,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:7,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:3,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:3,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:3,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:4,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:4,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:4,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:51.757 algo-1:183 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:51.758 algo-1:184 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:51.758 algo-1:177 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:51.758 algo-1:179 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:51.758 algo-1:178 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:51.758 algo-1:182 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:51.758 algo-1:181 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:51.758 algo-1:180 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:51.970 algo-1:183 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:51.970 algo-1:180 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:51.970 algo-1:177 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:51.970 algo-1:179 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:51.970 algo-1:184 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:51.970 algo-1:182 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:51.970 algo-1:181 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:51.970 algo-1:178 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.015 algo-1:183 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.015 algo-1:182 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.015 algo-1:177 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.015 algo-1:180 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.015 algo-1:179 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.015 algo-1:184 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.015 algo-1:178 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.015 algo-1:181 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.015 algo-1:183 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.015 algo-1:177 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.015 algo-1:182 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.015 algo-1:179 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.015 algo-1:180 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", + "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", + "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.017 algo-1:184 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", + "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.017 algo-1:178 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", + "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.017 algo-1:181 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", + "[1,mpirank:0,algo-1]:NCCL version 2.10.3+cuda11.2\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6272s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6272s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2050s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2050s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2058s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2058s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2067s vs `on_train_batch_end` time: 0.6277s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2067s vs `on_train_batch_end` time: 0.6277s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2081s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2081s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 2/10\n", + "[1,mpirank:1,algo-1]:Epoch 2/10\n", + "[1,mpirank:6,algo-1]:Epoch 2/10\n", + "[1,mpirank:5,algo-1]:Epoch 2/10\n", + "[1,mpirank:4,algo-1]:Epoch 2/10\n", + "[1,mpirank:2,algo-1]:Epoch 2/10\n", + "[1,mpirank:3,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 2/10\n", + "[1,mpirank:0,algo-1]:500/500 - 117s - loss: 2.4153 - lr: 0.0033 - 117s/epoch - 234ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 2/10\n", + "[1,mpirank:1,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:1,algo-1]:Epoch 3/10\n", + "[1,mpirank:6,algo-1]:Epoch 3/10\n", + "[1,mpirank:4,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 3/10\n", + "[1,mpirank:3,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:5,algo-1]:Epoch 3/10\n", + "[1,mpirank:7,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 3/10\n", + "[1,mpirank:7,algo-1]:Epoch 3/10\n", + "[1,mpirank:2,algo-1]:Epoch 3/10\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3755 - lr: 0.0057 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 3/10\n", + "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:\n", + "[1,mpirank:0,algo-1]:Epoch 3: finished gradual learning rate warmup to 0.008.\n", + "[1,mpirank:3,algo-1]:Epoch 4/10\n", + "[1,mpirank:7,algo-1]:Epoch 4/10\n", + "[1,mpirank:1,algo-1]:Epoch 4/10\n", + "[1,mpirank:5,algo-1]:Epoch 4/10\n", + "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 4/10\n", + "[1,mpirank:4,algo-1]:Epoch 4/10\n", + "[1,mpirank:6,algo-1]:Epoch 4/10\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 4/10\n", + "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:5,algo-1]:Epoch 5/10\n", + "[1,mpirank:4,algo-1]:Epoch 5/10\n", + "[1,mpirank:1,algo-1]:Epoch 5/10\n", + "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 5/10\n", + "[1,mpirank:2,algo-1]:Epoch 5/10\n", + "[1,mpirank:3,algo-1]:Epoch 5/10\n", + "[1,mpirank:7,algo-1]:Epoch 5/10\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 5/10\n", + "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 6/10\n", + "[1,mpirank:3,algo-1]:Epoch 6/10\n", + "[1,mpirank:6,algo-1]:Epoch 6/10\n", + "[1,mpirank:4,algo-1]:Epoch 6/10\n", + "[1,mpirank:1,algo-1]:Epoch 6/10\n", + "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 6/10\n", + "[1,mpirank:5,algo-1]:Epoch 6/10\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 6/10\n", + "[1,mpirank:2,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 7/10\n", + "[1,mpirank:5,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:1,algo-1]:Epoch 7/10\n", + "[1,mpirank:2,algo-1]:Epoch 7/10\n", + "[1,mpirank:6,algo-1]:Epoch 7/10\n", + "[1,mpirank:4,algo-1]:Epoch 7/10\n", + "[1,mpirank:5,algo-1]:Epoch 7/10\n", + "[1,mpirank:3,algo-1]:Epoch 7/10\n", + "[1,mpirank:0,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 7/10\n", + "[1,mpirank:5,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 8/10\n", + "[1,mpirank:5,algo-1]:Epoch 8/10\n", + "[1,mpirank:1,algo-1]:Epoch 8/10\n", + "[1,mpirank:6,algo-1]:Epoch 8/10\n", + "[1,mpirank:2,algo-1]:Epoch 8/10\n", + "[1,mpirank:3,algo-1]:Epoch 8/10\n", + "[1,mpirank:4,algo-1]:Epoch 8/10\n", + "[1,mpirank:0,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 8/10\n", + "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 9/10\n", + "[1,mpirank:4,algo-1]:Epoch 9/10\n", + "[1,mpirank:5,algo-1]:Epoch 9/10\n", + "[1,mpirank:7,algo-1]:Epoch 9/10\n", + "[1,mpirank:1,algo-1]:Epoch 9/10\n", + "[1,mpirank:2,algo-1]:Epoch 9/10\n", + "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 9/10\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 9/10\n", + "[1,mpirank:4,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 10/10\n", + "[1,mpirank:7,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 10/10\n", + "[1,mpirank:3,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 10/10\n", + "[1,mpirank:1,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 10/10\n", + "[1,mpirank:1,algo-1]:Epoch 10/10\n", + "[1,mpirank:3,algo-1]:Epoch 10/10\n", + "[1,mpirank:5,algo-1]:Epoch 10/10\n", + "[1,mpirank:0,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 10/10\n", + "[1,mpirank:6,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 177ms/step\n", + "[1,mpirank:6,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:7,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:5,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:1,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:2,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:4,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:3,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:0,algo-1]:WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:Process train_dnn.py closed with returncode=0\n", + "2022-09-23 23:42:52,800 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-23 23:42:52,800 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-23 23:42:52,801 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", + "\n", + "2022-09-23 23:42:58 Uploading - Uploading generated training model\n", + "2022-09-23 23:43:34 Completed - Training job completed\n", + "Training seconds: 1242\n", + "Billable seconds: 1242\n" + ] + } + ], "source": [ "estimator.fit(\n", - " inputs=data_uri,\n", " job_name=\"homogeneous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", ")" ] @@ -333,13 +900,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### E. Analyzing the homogeneous training job throughput and resource usage\n", + "#### Step 3: Analyzing the homogeneous training job throughput and resource usage\n", "We'll examine: CPU and GPU usage. Epoch time and step time\n", "\n", - "#### CPU and GPU usage analysis\n", - "In the screenshot below we observe that close to all the 96 vCPU of the instance is utilized. While GPU utilization is only ~40%. Clearly if we had more vCPUs we could increase GPU usage signifiantly to increase job throughput\n", + "**CPU and GPU usage analysis** \n", + "\n", + "In the screenshot below we observe that close to all the 96 vCPU of the instance is utilized. While GPU utilization is only ~45%. Clearly if we had more vCPUs we could increase GPU usage significantly to increase job throughput\n", "\n", - "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", + "Note: To view your own job Click on **View instance metrics** from the **Training jobs** in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. We captured metrics definitions used to produce this graph [here](./cloudwatch-metric-definitions/homogenous-workload%20copy.json). \n", "" ] }, @@ -347,13 +915,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Epoch time and step time analysis\n", - "For 2nd and 3rd epochs the below should printout: 105s/epoch - 209ms/step." + "**Epoch time and step time analysis**\n", + "\n", + "For 2nd and 3rd epochs the below should print out: 105s/epoch - 209ms/step." ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -363,17 +932,24 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Printing step time for epochs and steps for homogenous-20220909T140047Z\n", - "[1,mpirank:0,algo-1]:500/500 - 132s - loss: 1.9972 - lr: 0.0033 - 132s/epoch - 263ms/step\n", - "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8961 - lr: 0.0057 - 105s/epoch - 209ms/step\n", - "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 1.8536 - lr: 0.0080 - 105s/epoch - 211ms/step\n" + "Printing step time for epochs and steps for homogeneous-20220923T231801Z\n", + "[1,mpirank:0,algo-1]:500/500 - 117s - loss: 2.4153 - lr: 0.0033 - 117s/epoch - 234ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3755 - lr: 0.0057 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 183ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 184ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 177ms/step\n" ] } ], @@ -388,30 +964,32 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 3 - Running a Heterogeneous Training Job\n", - "We'll now run a training job in heterogeneous clusters mode. \n", + "### D. Run a heterogeneous cluster training job\n", + "\n", + "#### Step 1: Set up training environment\n", + "We'll now run a training job in heterogeneous cluster mode. \n", "Note the changes from the homogeneous cluster job: \n", - "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogeneous paramters `instance_type` and `instance_count`.\n", + "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogeneous parameters `instance_type` and `instance_count`.\n", "- In the `distribution` parameter for Horovod we added a new parameter `instance_groups` that is used to limit the MPI cluster to run in the `dnn_group`. The MPI cluster should include only the GPU nodes that run Horovod (which needs MPI). The `data_group` instances should not be part of the MPI cluster, as they set up their on `tf.data.service` cluster.\n", "\n", "More on the two instance groups config we use:\n", "- `data_group` - two ml.c5.18xlarge instances, each with 72 vCPUs to handle data preprocessing. Reading data from S3, preprocessing it, and forwarding it to the `dnn_group`.\n", - "- `dnn_group` - a single p4d.24xlarge instance, with 8 GPUs and 96 vCPUs. to handle deep neural network optimization (forward backword passes) releing on 8 GPUs and some of the 96 vPCUs. To fully utilize 96 vCPUs in the `dnn_group`, we'll be starting data workers on all instances in both groups, therefore we have 240 vCPUs (96+72+72) in total available for preprocessing (minus vCPUs used for the neural network optimization process).\n", + "- `dnn_group` - a single p4d.24xlarge instance, with 8 GPUs and 96 vCPUs to handle deep neural network optimization (forward backward passes). To fully utilize 96 vCPUs in the `dnn_group`, we'll be starting data workers on all the instances in both groups, therefore we have 240 vCPUs (96+72+72) in total available for preprocessing (minus vCPUs used for the neural network optimization process).\n", "\n", "There are three Python scripts to know about:\n", - "The 1st is `train_dnn.py` - This is your training script for the neural network, you should edit it to match your own use case. Note how this script isn't aware of the Heterogeneous clusters setup, except when it initializes the tf.data dataset calling this line: `ds = ds.apply(tf.data.experimental.service.distribute(...)`. \n", - "The 2nd and 3rd scripts, which you're not suppose to edit when adapting to your own use case, do the heavy lifting required for using tf.data.service over the Heterogeneous clusters feature. \n", + "The 1st is `train_dnn.py` - This is your training script for the neural network, you should edit it to match your own use case. Note that this script isn't aware of the Heterogeneous cluster set up, except when it initializes the tf.data dataset calling this line: `ds = ds.apply(tf.data.experimental.service.distribute(...)`. \n", + "The 2nd and 3rd scripts, which you're not suppose to edit when adapting to your own use case, do the heavy lifting required for using tf.data.service over the Heterogeneous cluster feature. \n", "`train_data.py` include functions to start/stop tf.service.data process like a dispatcher and WorkerServer. \n", "`launcher.py` has several responsibilities: \n", - "- a single entrypoint script for all instances in all instance groups (SageMaker will start the same script on all instances).\n", - "- Identify which instance group the node belong to, and start the relevant script accordingly (`train_dnn.py` or `train_data.py` or sometimes both).\n", - "- Takes measures to ensure that tf.data.sevice processes shutdown when training completes, as the training job completes only when all instances exit. Remember that training job.\n", - "- Allow to start more than one process (for example, on the dnn_gruop instances we'll run both the `train_dnn.py` and a tf.data.service worker to utilize the instance CPUs)." + "- A single entrypoint script for all instances in all instance groups (SageMaker will start the same script on all instances).\n", + "- Identifies which instance group the node belong to, and start the relevant script accordingly (`train_dnn.py` or `train_data.py` or sometimes both).\n", + "- Takes measures to ensure that tf.data.sevice processes shutdown when training completes, as the training job completes only when all instances exit.\n", + "- Allows to start more than one process (for example, on the dnn_group instances we'll run both the `train_dnn.py` and a tf.data.service worker to utilize the instance CPUs)." ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -425,12 +1003,12 @@ " \"epochs\": 10,\n", " \"steps_per_epoch\": 500,\n", " \"batch_size\": 1024,\n", - " \"tf_data_mode\": \"service\", # We'll be using tf.data.service for this Heterogeneous clusters job\n", - " \"num_of_data_workers\": 2, # We won't be using tf.data.service for this Heterogeneous clusters job\n", + " \"tf_data_mode\": \"service\", # Using tf.data.service for this Heterogeneous cluster job\n", + " \"num_of_data_workers\": 1, # One tf.data.service worker per node\n", "}\n", "\n", "# Group for CPU instances to run tf.data.service dispatcher/workers processes.\n", - "data_group = InstanceGroup(\"data_group\", \"ml.c5.18xlarge\", 3)\n", + "data_group = InstanceGroup(\"data_group\", \"ml.c5.18xlarge\", 2)\n", "# Group for deep neural network (dnn) with accleartors (e.g., GPU, FPGA, etc.)\n", "dnn_group = InstanceGroup(\"dnn_group\", \"ml.p4d.24xlarge\", 1)\n", "\n", @@ -443,17 +1021,19 @@ " volume_size=10,\n", " max_run=1800, # 30 minutes\n", " disable_profiler=True,\n", + " \n", " # instance_type='ml.p4d.24xlarge',\n", " # instance_count=1,\n", " instance_groups=[data_group, dnn_group],\n", + "\n", " hyperparameters=hyperparameters,\n", " distribution={\n", " \"mpi\": {\n", " \"enabled\": True,\n", - " \"processes_per_host\": 8, # 8 GPUs per host\n", + " \"processes_per_host\": 8, # p4d.24xlarge has 8 GPUs per host\n", " \"custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", " },\n", - " \"instance_groups\": [dnn_group],\n", + " \"instance_groups\": [dnn_group], # Apply distribution strategy to the dnn_group only\n", " },\n", ")" ] @@ -462,7 +1042,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### D. Submit the training job\n", + "#### Step 2: Submit the training job\n", "\n", "Note1: For the logs, click on **View logs** from the **Training Jobs** node in **Amazon SageMaker Console**. \n", "Note2: Ignore the 0 billable seconds shown below. See actual billable seconds in the AWS web console > SageMaker > Training Jobs > this job." @@ -470,21 +1050,26 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-13 21:29:25 Starting - Starting the training job." + "2022-09-23 23:52:33 Starting - Starting the training job......\n", + "2022-09-23 23:53:17 Starting - Preparing the instances for training........................\n", + "2022-09-23 23:57:33 Downloading - Downloading input data...\n", + "2022-09-23 23:57:48 Training - Downloading the training image...........................\n", + "2022-09-24 00:02:25 Training - Training image download completed. Training in progress....................................................\n", + "2022-09-24 00:11:23 Uploading - Uploading generated training model...\n", + "2022-09-24 00:11:59 Completed - Training job completed\n" ] } ], "source": [ "estimator2.fit(\n", - " inputs=data_uri,\n", - " job_name=\"heterogenous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + " job_name=\"heterogeneous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", ")" ] }, @@ -492,17 +1077,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### E. Analyzing the Heterogeneous training job throughput and resource usage\n", + "#### Step 3: Analyze the heterogeneous cluster training job's throughput and resource usage\n", "We'll examine: CPU and GPU usage. Epoch time and step time.\n", "\n", - "#### CPU and GPU usage analysis\n", - " In the screenshot below we observe that GPU usage has increase to 73% (compared to ~40% in the homogeneous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 90% CPU uage. \n", + "**CPU and GPU usage analysis** \n", + "\n", + " In the screenshot below we observe that GPU usage has increase to 74% (compared to ~45% in the homogeneous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 80% CPU uage. \n", " \n", - "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. \n", + "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. We captured metrics definitions used to produce this graph [here](./cloudwatch-metric-definitions/heterogenenous-workload.json). \n", "\n", "\n", - "#### Epoch time and step time analysis\n", - "For 2nd epoch onwards you should see this printout in the logs of the dnn_gruop instance (p4d.24xlarge): 45s/epoch - 89ms/step.\n", + "**Epoch time and step time analysis** \n", + "\n", + "For 2nd epoch onwards you should see this print out in the logs of the dnn_group instance (p4d.24xlarge): 43s/epoch - 86ms/step.\n", "Note that the instances are named: Algo1, Algo2, Algo3 randomly on each execution, so you'll need to open all instances logs to find the dnn_group instance." ] }, @@ -512,14 +1099,14 @@ "source": [ "## E. Comparing time-to-train and cost-to-train\n", "The table below summarizes both jobs. We can see that:\n", - "- The Heterogeneous job is 2.4x faster to train (86ms/step) than the homogeneous job (208ms/step).\n", - "- The Heterogeneous job is 50% cheaper to train than the homogeneous job. This is despite the heterogenous costs more per hour ($45/hour vs $37/hour), due to the two extra c5.18xlarge instances included in the heterogenous job `($45 = $37.7 + 2 * $3.67` \n", - "The cost-to-train formula we used: change in houly price `($45/$37.7) ` times `reduction-in-time-to-train (86ms/208ms)` = 50% = `($45/$37.7) * (86ms/208ms)`. \n", + "- The Heterogeneous job is 2.2x faster to train (86ms/step) than the homogeneous job (192ms/step).\n", + "- The Heterogeneous job is 45% cheaper to train than the homogeneous job. This is despite the heterogeneous costs more per hour ($45/hour vs $37/hour), due to the two extra c5.18xlarge instances included in the heterogeneous job `($45 = $37.7 + 2 * $3.67` \n", + "The cost-to-train formula we used: change in hourly price `($45/$37.7) ` times `reduction-in-time-to-train (86ms/192ms)` = 45% = `($45/$37.7) * (86ms/192ms)`. \n", "\n", "\"results\n", "\n", "## F. Conclusion\n", - "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training, with TensorFlow to achieve better price performance and increase training speed. To get started you can copy this example project and only change the `train_dnn.py` script. To run the job, you could use this notebook, or the `start_job.py`." + "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training, with TensorFlow to achieve better price performance and increase training speed. To get started you can copy this example project and change `train_dnn.py` to match your worklaod. To run the job, you could use this notebook, or the `start_job.py`." ] } ], diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5) (1).xml b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5) (1).xml new file mode 100644 index 0000000000..3c3ecb2977 --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/heterogeneous cluster diagrams (5) (1).xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/homogeneous-vs-heterogeneous-results-table.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/homogeneous-vs-heterogeneous-results-table.png index 18019150761a1dad9f608bc9e445a2d14500a691..1a9a99213069469c9ba23618a45445ebfcda5059 100644 GIT binary patch literal 29695 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

#t0tO`nS9yO%Vc&NR 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 literal 0 HcmV?d00001 diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogeneous cpu and gpu usage.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/metrics homogeneous cpu and gpu usage.png index 7cec8eb42a4ee559c2d36aad94b7effe6c4867b0..0c3d3f3ebf125e049a2759acc70663e715f01a10 100644 GIT binary patch literal 47674 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

MR(IpG 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 xnfpf$7+jude#1`R_+6>?Rv#jpUMV@`~3q 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 diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/images/tf.data.service-diagram.png b/training/heterogeneous-clusters/tf.data.service.sagemaker/images/tf.data.service-diagram.png index 8678c3f106580c0702c8291771433e1195574ec6..f08f27335dee9fde8bc7d54ae9b989b5112fbb13 100644 GIT binary patch literal 56335 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 EA6KqY)Bpeg literal 352969 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

vK|Cfeq=N}@?;bzHN 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 M4{ Date: Sat, 24 Sep 2022 14:37:12 +0300 Subject: [PATCH 05/15] adding retries to fit() --- training/heterogeneous-clusters/.gitignore | 1 + .../hetero-pytorch-mnist.ipynb | 4 +- .../hetero-tensorflow-restnet50.ipynb | 560 +----------------- .../tf.data.service.sagemaker/start_job.py | 145 ++--- .../start_job_utils.py | 37 ++ 5 files changed, 126 insertions(+), 621 deletions(-) create mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/start_job_utils.py diff --git a/training/heterogeneous-clusters/.gitignore b/training/heterogeneous-clusters/.gitignore index 18b4ec6a68..f6a49187cf 100644 --- a/training/heterogeneous-clusters/.gitignore +++ b/training/heterogeneous-clusters/.gitignore @@ -8,3 +8,4 @@ tf.data.service.sagemaker/data tf.data.service.sagemaker/code/__pycache__ tf.data.service.local/data pt.grpc.sagemaker/data +tf.data.service.sagemaker/__pycache__ diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index c109134505..d476f78fc3 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -83,8 +83,8 @@ "metadata": {}, "outputs": [], "source": [ - "#%%bash\n", - "#python3 -m pip install --upgrade boto3 botocore awscli sagemaker" + "%%bash\n", + "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" ] }, { diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 9c443c8ff9..95bf82f9dd 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -336,562 +336,23 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-23 23:18:04 Starting - Starting the training job......\n", - "2022-09-23 23:18:42 Starting - Preparing the instances for training.....................\n", - "2022-09-23 23:22:58 Downloading - Downloading input data\n", - "2022-09-23 23:22:58 Training - Downloading the training image.....................\n", - "2022-09-23 23:26:24 Training - Training image download completed. Training in progress.2022-09-23 23:26:28.318648: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "2022-09-23 23:26:28.324773: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "2022-09-23 23:26:28.664172: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "2022-09-23 23:26:33,877 sagemaker-training-toolkit INFO Imported framework sagemaker_tensorflow_container.training\n", - "2022-09-23 23:26:34,441 sagemaker-training-toolkit INFO Installing dependencies from requirements.txt:\n", - "/usr/local/bin/python3.9 -m pip install -r requirements.txt\n", - "Collecting protobuf==3.20.1\n", - "Downloading protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 36.8 MB/s eta 0:00:00\n", - "Collecting tensorflow-addons==0.17.0\n", - "Downloading tensorflow_addons-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 51.9 MB/s eta 0:00:00\n", - "Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (2.13.3)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (21.3)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.9/site-packages (from packaging->tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (3.0.9)\n", - "Installing collected packages: protobuf, tensorflow-addons\n", - "Attempting uninstall: protobuf\n", - "Found existing installation: protobuf 3.19.4\n", - "Uninstalling protobuf-3.19.4:\n", - "Successfully uninstalled protobuf-3.19.4\n", - "Attempting uninstall: tensorflow-addons\n", - "Found existing installation: tensorflow-addons 0.17.1\n", - "Uninstalling tensorflow-addons-0.17.1:\n", - "Successfully uninstalled tensorflow-addons-0.17.1\n", - "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "tf-models-official 2.9.1 requires tensorflow~=2.9.0, which is not installed.\n", - "tensorflow-gpu 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "tensorboard 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "sagemaker-training 4.1.4.dev0 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", - "Successfully installed protobuf-3.20.1 tensorflow-addons-0.17.0\n", - "WARNING: 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\n", - "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", - "[notice] To update, run: pip install --upgrade pip\n", - "2022-09-23 23:26:42,488 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", - "2022-09-23 23:26:42,488 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", - "2022-09-23 23:26:42,661 sagemaker-training-toolkit INFO Starting MPI run as worker node.\n", - "2022-09-23 23:26:42,661 sagemaker-training-toolkit INFO Creating SSH daemon.\n", - "2022-09-23 23:26:42,671 sagemaker-training-toolkit INFO Waiting for MPI workers to establish their SSH connections\n", - "2022-09-23 23:26:42,671 sagemaker-training-toolkit INFO Env Hosts: ['algo-1'] Hosts: ['algo-1:8'] process_per_hosts: 8 num_processes: 8\n", - "2022-09-23 23:26:42,672 sagemaker-training-toolkit INFO Network interface name: eth0\n", - "2022-09-23 23:26:42,755 sagemaker-training-toolkit INFO Invoking user script\n", - "Training Env:\n", - "{\n", - " \"additional_framework_parameters\": {\n", - " \"sagemaker_mpi_custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", - " \"sagemaker_mpi_enabled\": true,\n", - " \"sagemaker_mpi_num_of_processes_per_host\": 8\n", - " },\n", - " \"channel_input_dirs\": {},\n", - " \"current_host\": \"algo-1\",\n", - " \"current_instance_group\": \"homogeneousCluster\",\n", - " \"current_instance_group_hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", - " \"distribution_hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"distribution_instance_groups\": [\n", - " \"homogeneousCluster\"\n", - " ],\n", - " \"framework_module\": \"sagemaker_tensorflow_container.training:main\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"hyperparameters\": {\n", - " \"batch_size\": 1024,\n", - " \"epochs\": 10,\n", - " \"model_dir\": \"/opt/ml/model\",\n", - " \"num_of_data_workers\": 0,\n", - " \"steps_per_epoch\": 500,\n", - " \"tf_data_mode\": \"local\"\n", - " },\n", - " \"input_config_dir\": \"/opt/ml/input/config\",\n", - " \"input_data_config\": {},\n", - " \"input_dir\": \"/opt/ml/input\",\n", - " \"instance_groups\": [\n", - " \"homogeneousCluster\"\n", - " ],\n", - " \"instance_groups_dict\": {\n", - " \"homogeneousCluster\": {\n", - " \"instance_group_name\": \"homogeneousCluster\",\n", - " \"instance_type\": \"ml.p4d.24xlarge\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ]\n", - " }\n", - " },\n", - " \"is_hetero\": false,\n", - " \"is_master\": true,\n", - " \"job_name\": \"homogeneous-20220923T231801Z\",\n", - " \"log_level\": 20,\n", - " \"master_hostname\": \"algo-1\",\n", - " \"model_dir\": \"/opt/ml/model\",\n", - " \"module_dir\": \"s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\",\n", - " \"module_name\": \"launcher\",\n", - " \"network_interface_name\": \"eth0\",\n", - " \"num_cpus\": 96,\n", - " \"num_gpus\": 8,\n", - " \"output_data_dir\": \"/opt/ml/output/data\",\n", - " \"output_dir\": \"/opt/ml/output\",\n", - " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", - " \"resource_config\": {\n", - " \"current_host\": \"algo-1\",\n", - " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", - " \"current_group_name\": \"homogeneousCluster\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"instance_groups\": [\n", - " {\n", - " \"instance_group_name\": \"homogeneousCluster\",\n", - " \"instance_type\": \"ml.p4d.24xlarge\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ]\n", - " }\n", - " ],\n", - " \"network_interface_name\": \"eth0\"\n", - " },\n", - " \"user_entry_point\": \"launcher.py\"\n", - "}\n", - "Environment variables:\n", - "SM_HOSTS=[\"algo-1\"]\n", - "SM_NETWORK_INTERFACE_NAME=eth0\n", - "SM_HPS={\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"}\n", - "SM_USER_ENTRY_POINT=launcher.py\n", - "SM_FRAMEWORK_PARAMS={\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8}\n", - "SM_RESOURCE_CONFIG={\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"}\n", - "SM_INPUT_DATA_CONFIG={}\n", - "SM_OUTPUT_DATA_DIR=/opt/ml/output/data\n", - "SM_CHANNELS=[]\n", - "SM_CURRENT_HOST=algo-1\n", - "SM_CURRENT_INSTANCE_TYPE=ml.p4d.24xlarge\n", - "SM_CURRENT_INSTANCE_GROUP=homogeneousCluster\n", - "SM_CURRENT_INSTANCE_GROUP_HOSTS=[\"algo-1\"]\n", - "SM_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", - "SM_INSTANCE_GROUPS_DICT={\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}}\n", - "SM_DISTRIBUTION_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", - "SM_IS_HETERO=false\n", - "SM_MODULE_NAME=launcher\n", - "SM_LOG_LEVEL=20\n", - "SM_FRAMEWORK_MODULE=sagemaker_tensorflow_container.training:main\n", - "SM_INPUT_DIR=/opt/ml/input\n", - "SM_INPUT_CONFIG_DIR=/opt/ml/input/config\n", - "SM_OUTPUT_DIR=/opt/ml/output\n", - "SM_NUM_CPUS=96\n", - "SM_NUM_GPUS=8\n", - "SM_MODEL_DIR=/opt/ml/model\n", - "SM_MODULE_DIR=s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\n", - "SM_TRAINING_ENV={\"additional_framework_parameters\":{\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8},\"channel_input_dirs\":{},\"current_host\":\"algo-1\",\"current_instance_group\":\"homogeneousCluster\",\"current_instance_group_hosts\":[\"algo-1\"],\"current_instance_type\":\"ml.p4d.24xlarge\",\"distribution_hosts\":[\"algo-1\"],\"distribution_instance_groups\":[\"homogeneousCluster\"],\"framework_module\":\"sagemaker_tensorflow_container.training:main\",\"hosts\":[\"algo-1\"],\"hyperparameters\":{\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"},\"input_config_dir\":\"/opt/ml/input/config\",\"input_data_config\":{},\"input_dir\":\"/opt/ml/input\",\"instance_groups\":[\"homogeneousCluster\"],\"instance_groups_dict\":{\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}},\"is_hetero\":false,\"is_master\":true,\"job_name\":\"homogeneous-20220923T231801Z\",\"log_level\":20,\"master_hostname\":\"algo-1\",\"model_dir\":\"/opt/ml/model\",\"module_dir\":\"s3://sagemaker-us-east-1-331113010199/homogeneous-20220923T231801Z/source/sourcedir.tar.gz\",\"module_name\":\"launcher\",\"network_interface_name\":\"eth0\",\"num_cpus\":96,\"num_gpus\":8,\"output_data_dir\":\"/opt/ml/output/data\",\"output_dir\":\"/opt/ml/output\",\"output_intermediate_dir\":\"/opt/ml/output/intermediate\",\"resource_config\":{\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"},\"user_entry_point\":\"launcher.py\"}\n", - "SM_USER_ARGS=[\"--batch_size\",\"1024\",\"--epochs\",\"10\",\"--model_dir\",\"/opt/ml/model\",\"--num_of_data_workers\",\"0\",\"--steps_per_epoch\",\"500\",\"--tf_data_mode\",\"local\"]\n", - "SM_OUTPUT_INTERMEDIATE_DIR=/opt/ml/output/intermediate\n", - "SM_HP_BATCH_SIZE=1024\n", - "SM_HP_EPOCHS=10\n", - "SM_HP_MODEL_DIR=/opt/ml/model\n", - "SM_HP_NUM_OF_DATA_WORKERS=0\n", - "SM_HP_STEPS_PER_EPOCH=500\n", - "SM_HP_TF_DATA_MODE=local\n", - "PYTHONPATH=/opt/ml/code:/usr/local/bin:/usr/local/lib/python39.zip:/usr/local/lib/python3.9:/usr/local/lib/python3.9/lib-dynload:/usr/local/lib/python3.9/site-packages:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument-3.4.2-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument_cext-0.2.4-py3.9-linux-x86_64.egg\n", - "Invoking script with the following command:\n", - "mpirun --host algo-1:8 -np 8 --allow-run-as-root --display-map --tag-output -mca btl_tcp_if_include eth0 -mca oob_tcp_if_include eth0 -mca plm_rsh_no_tree_spawn 1 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_abort_on_non_zero_status 1 -mca btl_vader_single_copy_mechanism none -x NCCL_MIN_NRINGS=4 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_DEBUG=WARN -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD=/usr/local/lib/python3.9/site-packages/gethostname.cpython-39-x86_64-linux-gnu.so -x SM_HOSTS -x SM_NETWORK_INTERFACE_NAME -x SM_HPS -x SM_USER_ENTRY_POINT -x SM_FRAMEWORK_PARAMS -x SM_RESOURCE_CONFIG -x SM_INPUT_DATA_CONFIG -x SM_OUTPUT_DATA_DIR -x SM_CHANNELS -x SM_CURRENT_HOST -x SM_CURRENT_INSTANCE_TYPE -x SM_CURRENT_INSTANCE_GROUP -x SM_CURRENT_INSTANCE_GROUP_HOSTS -x SM_INSTANCE_GROUPS -x SM_INSTANCE_GROUPS_DICT -x SM_DISTRIBUTION_INSTANCE_GROUPS -x SM_IS_HETERO -x SM_MODULE_NAME -x SM_LOG_LEVEL -x SM_FRAMEWORK_MODULE -x SM_INPUT_DIR -x SM_INPUT_CONFIG_DIR -x SM_OUTPUT_DIR -x SM_NUM_CPUS -x SM_NUM_GPUS -x SM_MODEL_DIR -x SM_MODULE_DIR -x SM_TRAINING_ENV -x SM_USER_ARGS -x SM_OUTPUT_INTERMEDIATE_DIR -x SM_HP_BATCH_SIZE -x SM_HP_EPOCHS -x SM_HP_MODEL_DIR -x SM_HP_NUM_OF_DATA_WORKERS -x SM_HP_STEPS_PER_EPOCH -x SM_HP_TF_DATA_MODE -x PYTHONPATH /usr/local/bin/python3.9 -m mpi4py launcher.py --batch_size 1024 --epochs 10 --model_dir /opt/ml/model --num_of_data_workers 0 --steps_per_epoch 500 --tf_data_mode local\n", - "Data for JOB [27836,1] offset 0 Total slots allocated 8\n", - " ======================== JOB MAP ========================\n", - " Data for node: ip-10-0-208-135#011Num slots: 8#011Max slots: 0#011Num procs: 8\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 0 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 1 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 2 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 3 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 4 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 5 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 6 Bound: N/A\n", - " #011Process OMPI jobid: [27836,1] App: 0 Process rank: 7 Bound: N/A\n", - " =============================================================\n", - "[1,mpirank:1,algo-1]:env.is_hetero=False\n", - "[1,mpirank:1,algo-1]:current_host=algo-1\n", - "[1,mpirank:1,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:2,algo-1]:env.is_hetero=False\n", - "[1,mpirank:2,algo-1]:current_host=algo-1\n", - "[1,mpirank:2,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:3,algo-1]:env.is_hetero=False\n", - "[1,mpirank:3,algo-1]:current_host=algo-1\n", - "[1,mpirank:3,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:4,algo-1]:env.is_hetero=False\n", - "[1,mpirank:4,algo-1]:current_host=algo-1\n", - "[1,mpirank:4,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:0,algo-1]:env.is_hetero=False\n", - "[1,mpirank:0,algo-1]:current_host=algo-1\n", - "[1,mpirank:0,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:7,algo-1]:env.is_hetero=False\n", - "[1,mpirank:7,algo-1]:current_host=algo-1\n", - "[1,mpirank:7,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:6,algo-1]:env.is_hetero=False\n", - "[1,mpirank:6,algo-1]:current_host=algo-1\n", - "[1,mpirank:6,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:5,algo-1]:env.is_hetero=False\n", - "[1,mpirank:5,algo-1]:current_host=algo-1\n", - "[1,mpirank:5,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", - "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.594431: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.594427: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.594436: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.594432: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.594431: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.594438: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.594475: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.594559: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.594565: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.594561: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.594560: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.594581: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.602661: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.602798: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", - "[1,mpirank:4,algo-1]:2022-09-23 23:26:43.628661: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:5,algo-1]:2022-09-23 23:26:43.628681: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:0,algo-1]:2022-09-23 23:26:43.628663: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:3,algo-1]:2022-09-23 23:26:43.628663: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:1,algo-1]:2022-09-23 23:26:43.628648: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:2,algo-1]:2022-09-23 23:26:43.628649: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:7,algo-1]:2022-09-23 23:26:43.628657: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:6,algo-1]:2022-09-23 23:26:43.637300: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", - "[1,mpirank:4,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:0,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:4,algo-1]:hvd.local_rank() 4\n", - "[1,mpirank:2,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:0,algo-1]:hvd.local_rank() 0\n", - "[1,mpirank:2,algo-1]:hvd.local_rank() 2\n", - "[1,mpirank:3,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:7,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:1,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:3,algo-1]:hvd.local_rank() 3\n", - "[1,mpirank:7,algo-1]:hvd.local_rank() 7\n", - "[1,mpirank:1,algo-1]:hvd.local_rank() 1\n", - "[1,mpirank:6,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:5,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", - "[1,mpirank:6,algo-1]:hvd.local_rank() 6\n", - "[1,mpirank:5,algo-1]:hvd.local_rank() 5\n", - "[1,mpirank:4,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:5,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:1,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:3,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:0,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:7,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:2,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:6,algo-1]:Running in local tf_data_mode.\n", - "[1,mpirank:3,algo-1]:Epoch 1/10\n", - "[1,mpirank:6,algo-1]:Epoch 1/10\n", - "[1,mpirank:1,algo-1]:Epoch 1/10\n", - "[1,mpirank:5,algo-1]:Epoch 1/10\n", - "[1,mpirank:7,algo-1]:Epoch 1/10\n", - "[1,mpirank:0,algo-1]:Epoch 1/10\n", - "[1,mpirank:2,algo-1]:Epoch 1/10\n", - "[1,mpirank:4,algo-1]:Epoch 1/10\n", - "[1,mpirank:0,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:0,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:0,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:6,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:6,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:6,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:2,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:2,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:2,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:5,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:5,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:5,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:1,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:1,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:1,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:7,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:7,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:7,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:3,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:3,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:3,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:4,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", - "[1,mpirank:4,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", - "[1,mpirank:4,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:51.757 algo-1:183 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:51.758 algo-1:184 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:51.758 algo-1:177 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:51.758 algo-1:179 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:51.758 algo-1:178 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:51.758 algo-1:182 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:51.758 algo-1:181 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:51.758 algo-1:180 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", - "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:51.970 algo-1:183 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:51.970 algo-1:180 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:51.970 algo-1:177 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:51.970 algo-1:179 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:51.970 algo-1:184 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:51.970 algo-1:182 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:51.970 algo-1:181 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:51.970 algo-1:178 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.015 algo-1:183 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.015 algo-1:182 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.015 algo-1:177 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.015 algo-1:180 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.015 algo-1:179 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.015 algo-1:184 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.015 algo-1:178 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.015 algo-1:181 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.015 algo-1:183 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.015 algo-1:177 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.015 algo-1:182 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.015 algo-1:179 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.015 algo-1:180 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:6,algo-1]:[2022-09-23 23:26:52.016 algo-1:183 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.016 algo-1:184 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.016 algo-1:178 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:7,algo-1]:[2022-09-23 23:26:52.016 algo-1:182 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", - "[1,mpirank:3,algo-1]:[2022-09-23 23:26:52.016 algo-1:179 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", - "[1,mpirank:1,algo-1]:[2022-09-23 23:26:52.016 algo-1:177 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", - "[1,mpirank:4,algo-1]:[2022-09-23 23:26:52.016 algo-1:180 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.016 algo-1:181 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", - "[1,mpirank:5,algo-1]:[2022-09-23 23:26:52.017 algo-1:184 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", - "[1,mpirank:2,algo-1]:[2022-09-23 23:26:52.017 algo-1:178 INFO hook.py:421] Monitoring the collections: metrics, sm_metrics, losses\n", - "[1,mpirank:0,algo-1]:[2022-09-23 23:26:52.017 algo-1:181 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", - "[1,mpirank:0,algo-1]:NCCL version 2.10.3+cuda11.2\n", - "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6272s). Check your callbacks.\n", - "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6272s). Check your callbacks.\n", - "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2050s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2050s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2060s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2058s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", - "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2058s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", - "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2059s vs `on_train_batch_end` time: 0.6273s). Check your callbacks.\n", - "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2067s vs `on_train_batch_end` time: 0.6277s). Check your callbacks.\n", - "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2067s vs `on_train_batch_end` time: 0.6277s). Check your callbacks.\n", - "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2081s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", - "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2081s vs `on_train_batch_end` time: 0.6274s). Check your callbacks.\n", - "[1,mpirank:7,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:7,algo-1]:Epoch 2/10\n", - "[1,mpirank:1,algo-1]:Epoch 2/10\n", - "[1,mpirank:6,algo-1]:Epoch 2/10\n", - "[1,mpirank:5,algo-1]:Epoch 2/10\n", - "[1,mpirank:4,algo-1]:Epoch 2/10\n", - "[1,mpirank:2,algo-1]:Epoch 2/10\n", - "[1,mpirank:3,algo-1]:500/500 - 116s - loss: 2.4153 - lr: 0.0033 - 116s/epoch - 232ms/step\n", - "[1,mpirank:3,algo-1]:Epoch 2/10\n", - "[1,mpirank:0,algo-1]:500/500 - 117s - loss: 2.4153 - lr: 0.0033 - 117s/epoch - 234ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 2/10\n", - "[1,mpirank:1,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:1,algo-1]:Epoch 3/10\n", - "[1,mpirank:6,algo-1]:Epoch 3/10\n", - "[1,mpirank:4,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:4,algo-1]:Epoch 3/10\n", - "[1,mpirank:3,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:5,algo-1]:Epoch 3/10\n", - "[1,mpirank:7,algo-1]:500/500 - 91s - loss: 2.3755 - lr: 0.0057 - 91s/epoch - 183ms/step\n", - "[1,mpirank:3,algo-1]:Epoch 3/10\n", - "[1,mpirank:7,algo-1]:Epoch 3/10\n", - "[1,mpirank:2,algo-1]:Epoch 3/10\n", - "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3755 - lr: 0.0057 - 92s/epoch - 184ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 3/10\n", - "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:0,algo-1]:\n", - "[1,mpirank:0,algo-1]:Epoch 3: finished gradual learning rate warmup to 0.008.\n", - "[1,mpirank:3,algo-1]:Epoch 4/10\n", - "[1,mpirank:7,algo-1]:Epoch 4/10\n", - "[1,mpirank:1,algo-1]:Epoch 4/10\n", - "[1,mpirank:5,algo-1]:Epoch 4/10\n", - "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:2,algo-1]:Epoch 4/10\n", - "[1,mpirank:4,algo-1]:Epoch 4/10\n", - "[1,mpirank:6,algo-1]:Epoch 4/10\n", - "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3472 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 4/10\n", - "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:5,algo-1]:Epoch 5/10\n", - "[1,mpirank:4,algo-1]:Epoch 5/10\n", - "[1,mpirank:1,algo-1]:Epoch 5/10\n", - "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:6,algo-1]:Epoch 5/10\n", - "[1,mpirank:2,algo-1]:Epoch 5/10\n", - "[1,mpirank:3,algo-1]:Epoch 5/10\n", - "[1,mpirank:7,algo-1]:Epoch 5/10\n", - "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3175 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 5/10\n", - "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:2,algo-1]:Epoch 6/10\n", - "[1,mpirank:3,algo-1]:Epoch 6/10\n", - "[1,mpirank:6,algo-1]:Epoch 6/10\n", - "[1,mpirank:4,algo-1]:Epoch 6/10\n", - "[1,mpirank:1,algo-1]:Epoch 6/10\n", - "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:7,algo-1]:Epoch 6/10\n", - "[1,mpirank:5,algo-1]:Epoch 6/10\n", - "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3066 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 6/10\n", - "[1,mpirank:2,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:7,algo-1]:Epoch 7/10\n", - "[1,mpirank:5,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:1,algo-1]:Epoch 7/10\n", - "[1,mpirank:2,algo-1]:Epoch 7/10\n", - "[1,mpirank:6,algo-1]:Epoch 7/10\n", - "[1,mpirank:4,algo-1]:Epoch 7/10\n", - "[1,mpirank:5,algo-1]:Epoch 7/10\n", - "[1,mpirank:3,algo-1]:Epoch 7/10\n", - "[1,mpirank:0,algo-1]:500/500 - 90s - loss: 2.3043 - lr: 0.0080 - 90s/epoch - 181ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 7/10\n", - "[1,mpirank:5,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:7,algo-1]:Epoch 8/10\n", - "[1,mpirank:5,algo-1]:Epoch 8/10\n", - "[1,mpirank:1,algo-1]:Epoch 8/10\n", - "[1,mpirank:6,algo-1]:Epoch 8/10\n", - "[1,mpirank:2,algo-1]:Epoch 8/10\n", - "[1,mpirank:3,algo-1]:Epoch 8/10\n", - "[1,mpirank:4,algo-1]:Epoch 8/10\n", - "[1,mpirank:0,algo-1]:500/500 - 94s - loss: 2.3028 - lr: 0.0080 - 94s/epoch - 189ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 8/10\n", - "[1,mpirank:6,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:6,algo-1]:Epoch 9/10\n", - "[1,mpirank:4,algo-1]:Epoch 9/10\n", - "[1,mpirank:5,algo-1]:Epoch 9/10\n", - "[1,mpirank:7,algo-1]:Epoch 9/10\n", - "[1,mpirank:1,algo-1]:Epoch 9/10\n", - "[1,mpirank:2,algo-1]:Epoch 9/10\n", - "[1,mpirank:3,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 183ms/step\n", - "[1,mpirank:3,algo-1]:Epoch 9/10\n", - "[1,mpirank:0,algo-1]:500/500 - 92s - loss: 2.3024 - lr: 0.0080 - 92s/epoch - 184ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 9/10\n", - "[1,mpirank:4,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", - "[1,mpirank:6,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", - "[1,mpirank:4,algo-1]:Epoch 10/10\n", - "[1,mpirank:7,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", - "[1,mpirank:6,algo-1]:Epoch 10/10\n", - "[1,mpirank:3,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", - "[1,mpirank:2,algo-1]:Epoch 10/10\n", - "[1,mpirank:1,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 186ms/step\n", - "[1,mpirank:7,algo-1]:Epoch 10/10\n", - "[1,mpirank:1,algo-1]:Epoch 10/10\n", - "[1,mpirank:3,algo-1]:Epoch 10/10\n", - "[1,mpirank:5,algo-1]:Epoch 10/10\n", - "[1,mpirank:0,algo-1]:500/500 - 93s - loss: 2.3021 - lr: 0.0080 - 93s/epoch - 185ms/step\n", - "[1,mpirank:0,algo-1]:Epoch 10/10\n", - "[1,mpirank:6,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:7,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:3,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:5,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:1,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:4,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:2,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 178ms/step\n", - "[1,mpirank:0,algo-1]:500/500 - 89s - loss: 2.3018 - lr: 0.0080 - 89s/epoch - 177ms/step\n", - "[1,mpirank:6,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:7,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:5,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:1,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:2,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:4,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:3,algo-1]:Process train_dnn.py closed with returncode=0\n", - "[1,mpirank:0,algo-1]:WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n", - "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", - "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", - "[1,mpirank:0,algo-1]:Process train_dnn.py closed with returncode=0\n", - "2022-09-23 23:42:52,800 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", - "2022-09-23 23:42:52,800 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", - "2022-09-23 23:42:52,801 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", - "\n", - "2022-09-23 23:42:58 Uploading - Uploading generated training model\n", - "2022-09-23 23:43:34 Completed - Training job completed\n", - "Training seconds: 1242\n", - "Billable seconds: 1242\n" + "2022-09-24 11:28:23 Starting - Starting the training job......\n", + "2022-09-24 11:29:08 Starting - Preparing the instances for training........................\n", + "2022-09-24 11:33:34 Downloading - Downloading input data\n", + "2022-09-24 11:33:34 Training - Downloading the training image........" ] } ], "source": [ - "estimator.fit(\n", + "from start_job_utils import fit_with_retries\n", + "fit_with_retries(5, estimator, \n", " job_name=\"homogeneous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", ")" ] @@ -1021,11 +482,9 @@ " volume_size=10,\n", " max_run=1800, # 30 minutes\n", " disable_profiler=True,\n", - " \n", " # instance_type='ml.p4d.24xlarge',\n", " # instance_count=1,\n", " instance_groups=[data_group, dnn_group],\n", - "\n", " hyperparameters=hyperparameters,\n", " distribution={\n", " \"mpi\": {\n", @@ -1033,7 +492,7 @@ " \"processes_per_host\": 8, # p4d.24xlarge has 8 GPUs per host\n", " \"custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", " },\n", - " \"instance_groups\": [dnn_group], # Apply distribution strategy to the dnn_group only\n", + " \"instance_groups\": [dnn_group], # Apply distribution strategy to the dnn_group only\n", " },\n", ")" ] @@ -1068,7 +527,8 @@ } ], "source": [ - "estimator2.fit(\n", + "from start_job_utils import fit_with_retries\n", + "fit_with_retries(5, estimator2, \n", " job_name=\"heterogeneous-\" + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", ")" ] diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py index f0fbb4f84f..efbe852ce0 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py @@ -2,82 +2,89 @@ from sagemaker.tensorflow import TensorFlow from sagemaker.instance_group import InstanceGroup import os - import argparse -parser = argparse.ArgumentParser() -parser.add_argument('--tf_data_mode', type=str, default='local', - help="'service' distributed dataset using tf.data.service. 'local' use standard tf.data") -parser.add_argument('--is_cloud_job', default=True, action=argparse.BooleanOptionalAction, - help="True to run in the cloud, False to run on local machine") -parser.add_argument('--is_hetero', default=True, action=argparse.BooleanOptionalAction, - help="True to run in the heterogeneous mode (GPU + CPU instances), False when running in the homogeneous mode (GPU instances only)") -parser.add_argument("--num_of_data_workers", type=int, default=1) -parser.add_argument("--num_of_data_instances", type=int, default=1) -parser.add_argument("--batch_size", type=int, default=1024) +from start_job_utils import fit_with_retries + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--tf_data_mode', type=str, default='local', + help="'service' distributed dataset using tf.data.service. 'local' use standard tf.data") + parser.add_argument('--is_cloud_job', default=True, action=argparse.BooleanOptionalAction, + help="True to run in the cloud, False to run on local machine") + parser.add_argument('--is_hetero', default=True, action=argparse.BooleanOptionalAction, + help="True to run in the heterogeneous mode (GPU + CPU instances), False when running in the homogeneous mode (GPU instances only)") + parser.add_argument("--num_of_data_workers", type=int, default=1) + parser.add_argument("--num_of_data_instances", type=int, default=1) + parser.add_argument("--batch_size", type=int, default=1024) + + parser.add_argument("--training_dir", type=str, default='data') + args = parser.parse_args() + + assert args.is_cloud_job or not args.is_hetero, 'Heterogeneous cluster is not supported in sagemaker local mode' + assert args.is_hetero or args.tf_data_mode == 'local', 'TODO: tf.data.service not implemented in homogeneous cluster yet' + + REGION = 'us-east-1' + os.environ["AWS_DEFAULT_REGION"] = REGION + dnn_instance_type = 'ml.p4d.24xlarge' if args.is_cloud_job else 'local_gpu' # @see: https://aws.amazon.com/sagemaker/pricing/ + data_instance_type = "ml.c5.18xlarge" + + # Group for CPU instances that will run tf.data.service dispatcher/workers processes. + data_group = InstanceGroup("data_group", data_instance_type, args.num_of_data_instances) if args.is_hetero else None + # Group for deep neural network (dnn) with accleartors (e.g., GPU, FPGA, etc.) + dnn_group = InstanceGroup("dnn_group", dnn_instance_type, 1) if args.is_hetero else None + + kwargs = dict() + kwargs['hyperparameters'] = { + 'epochs' : 3, + 'steps_per_epoch' : 500, + 'num_of_data_workers' : args.num_of_data_workers, # How many tf.data.server Workers to start + 'batch_size' : args.batch_size, + 'tf_data_mode' : args.tf_data_mode, + } -parser.add_argument("--training_dir", type=str, default='data') -args = parser.parse_args() + if args.is_hetero: + print(f'args.is_hetero = {args.is_hetero}') + kwargs['instance_groups'] = [data_group, dnn_group] + else: + kwargs['instance_type'] = dnn_instance_type if args.is_cloud_job else 'local' + kwargs['instance_count'] = 1 -assert args.is_cloud_job or not args.is_hetero, 'Heterogeneous cluster is not supported in sagemaker local mode' -assert args.is_hetero or args.tf_data_mode == 'local', 'TODO: tf.data.service not implemented in homogeneous cluster yet' + processes_per_host_dict = { + 'ml.g5.xlarge' : 1, + 'ml.g5.12xlarge' : 4, + 'ml.p3.8xlarge' : 4, + 'ml.p4d.24xlarge' : 8, + } + kwargs['distribution'] = { + 'mpi': { + 'enabled': True, + 'processes_per_host': processes_per_host_dict[dnn_instance_type], + 'custom_mpi_options': '--NCCL_DEBUG WARN' + }, + } + if args.is_hetero: + # Start an MPI cluster only DNN instance group only + kwargs['distribution']['instance_groups'] = [dnn_group] # type: ignore -REGION = 'us-east-1' -os.environ["AWS_DEFAULT_REGION"] = REGION -dnn_instance_type = 'ml.p4d.24xlarge' if args.is_cloud_job else 'local_gpu' # @see: https://aws.amazon.com/sagemaker/pricing/ -data_instance_type = "ml.c5.18xlarge" + print(f"distribution={kwargs['distribution']}") -# Group for CPU instances that will run tf.data.service dispatcher/workers processes. -data_group = InstanceGroup("data_group", data_instance_type, args.num_of_data_instances) if args.is_hetero else None -# Group for deep neural network (dnn) with accleartors (e.g., GPU, FPGA, etc.) -dnn_group = InstanceGroup("dnn_group", dnn_instance_type, 1) if args.is_hetero else None + print(f'kwargs={kwargs}') + estimator = TensorFlow( + entry_point='launcher.py', + source_dir='./code', + framework_version='2.9.1', + py_version='py39', + role=os.environ.get('SAGEMAKER_ROLE'), + volume_size=30, + max_run=1800, + disable_profiler=True, + **kwargs, + ) -kwargs = dict() -kwargs['hyperparameters'] = { - 'epochs' : 3, - 'steps_per_epoch' : 500, - 'num_of_data_workers' : args.num_of_data_workers, # How many tf.data.server Workers to start - 'batch_size' : args.batch_size, - 'tf_data_mode' : args.tf_data_mode, -} + job_name=f'hetero-tf-data-{args.tf_data_mode}-Dnode{args.num_of_data_instances}-wrkrs-{args.num_of_data_workers}-{datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")}' + + fit_with_retries(5, estimator, job_name=job_name) -if args.is_hetero: - print(f'args.is_hetero = {args.is_hetero}') - kwargs['instance_groups'] = [data_group, dnn_group] -else: - kwargs['instance_type'] = dnn_instance_type if args.is_cloud_job else 'local' - kwargs['instance_count'] = 1 -processes_per_host_dict = { - 'ml.g5.xlarge' : 1, - 'ml.g5.12xlarge' : 4, - 'ml.p3.8xlarge' : 4, - 'ml.p4d.24xlarge' : 8, -} -kwargs['distribution'] = { - 'mpi': { - 'enabled': True, - 'processes_per_host': processes_per_host_dict[dnn_instance_type], - 'custom_mpi_options': '--NCCL_DEBUG WARN' - }, -} -if args.is_hetero: - # Start an MPI cluster only DNN instance group only - kwargs['distribution']['instance_groups'] = [dnn_group] # type: ignore -print(f"distribution={kwargs['distribution']}") -estimator = TensorFlow( - entry_point='launcher.py', - source_dir='./code', - framework_version='2.9.1', - py_version='py39', - role=os.environ.get('SAGEMAKER_ROLE'), - volume_size=30, - max_run=1800, - disable_profiler=True, - **kwargs, -) -print(f'kwargs={kwargs}') -estimator.fit( - job_name=f'hetero-tf-data-{args.tf_data_mode}-Dnode{args.num_of_data_instances}-wrkrs-{args.num_of_data_workers}-{datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")}', -) diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job_utils.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job_utils.py new file mode 100644 index 0000000000..2fd7e1d02e --- /dev/null +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job_utils.py @@ -0,0 +1,37 @@ +import time +from sagemaker.estimator import EstimatorBase + +def fit_with_retries(retries : int, estimator : EstimatorBase, *args, **kwargs): + """Run estimator fit with retries in case of temporary issues like capacity exception or user exceeded resource usage + Example invocation: fit_with_retries(5, estimator, job_name="my job name") + + Args: + retries (int): How many retries in case of exception_to_try is raised + estimator (EstimatorBase): will call estimator.fit(...) + *args: list of positioned arguments to pass to fit() + **kwargs: list of keyword arguments to pass to fit() + Returns: + None + """ + orig_job_name = kwargs['job_name'] if 'job_name' in kwargs and kwargs['job_name'] else None + for i in range(1, retries+1): + try: + # Ensure job_name is unique between retries (if specified) + if orig_job_name: + kwargs['job_name'] = orig_job_name + f'-{i}' + estimator.fit(*args, **kwargs) + break + except Exception as e: + if not ('CapacityError' in str(e) or 'ResourceLimitExceeded' in str(e)): + raise e + print(f'Caught error: {type(e).__name__}: {e}') + if i == retries: + print(f'Giving up after {retries} failed attempts.') + raise e + else: + if 'ResourceLimitExceeded' in str(e): + seconds = 10 + print(f'ResourceLimitExceeded: Sleeping {seconds}s before retrying.') + time.sleep(seconds) + print(f'Retrying attempt: {i+1}/{retries}') + continue \ No newline at end of file From 790d99db6c625d9789122329a195e76204fdf50f Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Mon, 26 Sep 2022 12:59:44 +0300 Subject: [PATCH 06/15] grammer fixes --- .../hetero-pytorch-mnist.ipynb | 42 +- .../hetero-tensorflow-restnet50.ipynb | 598 +++++++++++++++++- 2 files changed, 590 insertions(+), 50 deletions(-) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index d476f78fc3..3993d26287 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -33,9 +33,9 @@ "\n", "In homogeneous cluster training job, the data pre-processing and Deep Neural Network (DNN) training code runs on the same instance. However, in heterogeneous cluster training job, the data pre-processing code runs on the CPU nodes (here by referred as **data_group or data group**), whereas the Deep Neural Network (DNN) training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). The inter-node communication between the data and dnn groups is handled by generic implementation of [gRPC client-server interface](https://grpc.io/docs/languages/python/basics/).  \n", "\n", - "The script (`launcher.py`) has the logic to detect (using SageMaker environment variables) whether the node it is running on belongs to data_group or dnn_group. If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs grpc-server service for extracting processed training batches using [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview). The gRPC server running on the data_group listens on a specific port (ex. 6000). In the code (`train_data.py`) documentation, we have chosen an implementation that keeps the data loading logic intact  where data batches are entered into a shared queue. The `get_samples` function of the `DataFeedService` pulls batches from the same queue and sends them to the client in the form of a continuous data stream. While fetching the data, the main entrypoint script `launcher.py` listens on port 16000 for a shut down request coming from gRPC client i.e. data group. The `train_data.py` waits for shut down action from the parent process. \n", + "The script (`launcher.py`) has the logic to detect (using SageMaker environment variables) whether the node it is running on belongs to data_group or dnn_group. If it is data_group, it spawns a separate process by executing `train_data.py`. This script runs grpc-server service for extracting processed training batches using [Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview). The gRPC server running on the data_group listens on a specific port (ex. 6000). In the code (`train_data.py`) documentation, we have chosen an implementation that keeps the data loading logic intact  where data batches are entered into a shared queue. The `get_samples` function of the `DataFeedService` pulls batches from the same queue and sends them to the client in the form of a continuous data stream. While fetching the data, the main entrypoint script `launcher.py` listens on port 16000 for a shutdown request coming from gRPC client i.e. data group. The `train_data.py` waits for shutdown action from the parent process. \n", "\n", - "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. The script runs gRPC client code and DNN component of the training job. It consumes the processed training data from the gRPC server. We have defined an iterable PyTorch dataset, RemoteDataset, that opens a connection to the gRPC server, and reads from a stream of data batches. Once the model is trained with all the batches of training data, the gRPC client exits, and the parent process`launcher.py` sends a shut down request on port 16000. This indicates the gRPC server to shut down, and signals ends of the training job. \n", + "If the node belongs to dnn_group, the main training script (`launcher.py`) spawns a separate set of processes by executing `train_dnn.py`. The script runs gRPC client code and DNN component of the training job. It consumes the processed training data from the gRPC server. We have defined an iterable PyTorch dataset, RemoteDataset, that opens a connection to the gRPC server, and reads from a stream of data batches. Once the model is trained with all the batches of training data, the gRPC client exits, and the parent process`launcher.py` sends a shutdown request on port 16000. This indicates the gRPC server to shutdown, and signals ends of the training job. \n", "\n", "Here is how the workflow looks like:\n", "\n", @@ -46,22 +46,22 @@ "This notebook refers following files and folders:\n", "\n", "- Folders: \n", - "  - `code`: this has the training (data pre-processing and dnn) scripts, and grpc client-server start and shut down scripts\n", + "  - `code`: this has the training (data pre-processing and dnn) scripts, and grpc client-server start and shutdown scripts\n", "  - `images`: contains images referred in notebook\n", "- Files: \n", - "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. This is a parent process that makes a decision on where to spawn a data pre-processing or dnn component of the training job. The script runs on all the nodes as entrypoint. It also handles the shut down logic for gRPC server. \n", - "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shut down.\n", - "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shut down request after all the iterations on the preprocessed training data set. \n", + "  - `launcher.py`: entry point training script. This script is executed on all the nodes irrespective of which group it belongs to. This is a parent process that makes a decision on where to spawn a data pre-processing or dnn component of the training job. The script runs on all the nodes as entry point. It also handles the shutdown logic for gRPC server. \n", + "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shutdown.\n", + "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shutdown request after all the iterations on the preprocessed training data set. \n", "  - `requirement.txt`: defines package required for gRPC \n", - "  - `train.py`: this script is the entrypoint script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. \n", + "  - `train.py`: this script is the entry point script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. \n", "\n", "At a high level, the notebook covers:\n", - "-  Setting up SageMaker Studio Notebook \n", - "-  Setting up the Training environment \n", - "-  Submit a Training job\n", - "-  Monitor and visualize the CloudWatch metrics\n", - "-  Comparing time-to-train and cost-to-train\n", - "-  Conclusion \n", + "- Setting up SageMaker Studio Notebook \n", + "- Setting up the Training environment \n", + "- Submit a Training job\n", + "- Monitor and visualize the CloudWatch metrics\n", + "- Comparing time-to-train and cost-to-train\n", + "- Conclusion \n", "---\n" ] }, @@ -101,7 +101,7 @@ "id": "a9592cda", "metadata": {}, "source": [ - "#### Step 3 - Valdiate SageMaker Python SDK and PyTorch versions\n", + "#### Step 3 - Validate SageMaker Python SDK and PyTorch versions\n", "Ensure the output of the cell below reflects:\n", "\n", "- SageMaker Python SDK version 2.98.0 or above, \n", @@ -191,7 +191,7 @@ "metadata": {}, "source": [ "#### Step 2 - Configure environment variables \n", - "This step defines whether you want to run training job in heterogeneous cluster mode or not. Also, defines instance groups, multiple nodes in group, and hyperparameter values. For baselining, run a homoegeneous cluster training job by setting `IS_HETERO = False`. This will let both the data pre-processing and DNN code run on the same node i.e. `ml.p3.2xlarge`. \n", + "This step defines whether you want to run training job in heterogeneous cluster mode or not. Also, defines instance groups, multiple nodes in group, and hyperparameter values. For baselining, run a homogeneous cluster training job by setting `IS_HETERO = False`. This will let both the data pre-processing and DNN code run on the same node i.e. `ml.p3.2xlarge`. \n", "\n", "\n", "Test configuration (if running training on p3.2xl or g5.2xl as dnn_group instance type, and c5.2xl as data_group instance type: (training duration: 7-8 mins) \n", @@ -201,14 +201,14 @@ "`pin-memory\": True` \n", "`iterations : 100` \n", "\n", - "Perf configuration (if running training on p3.2xl as dnn_group instance type, and c5.9xl as data_group instance type OR training in homogeneous cluster mode i.e. g5.8xl): (training duration - 30 mins) \n", + "Performance configuration (if running training on p3.2xl as dnn_group instance type, and c5.9xl as data_group instance type OR training in homogeneous cluster mode i.e. g5.8xl): (training duration - 30 mins) \n", "`num-data-workers: 32` \n", "`grpc-workers: 2` \n", "`num-dnn-workers: 2` \n", "`pin-memory\": True` \n", "`iterations : 4800`\n", "\n", - "Perf configuration (if running training on p3.2xl in homogeneous cluster mode): \n", + "Performance configuration (if running training on p3.2xl in homogeneous cluster mode): \n", "`num-data-workers: 8` \n", "`grpc-workers: 2` \n", "`num-dnn-workers: 2` \n", @@ -390,7 +390,7 @@ "source": [ "## C. Submit the training job\n", "\n", - "The job runs for the predefined iterations. DNN instance group sends a shut down request to data group after done with the training. You can see the following entries in the CloudWatch logs of dnn instance. A job with 4800 iterations finishes in 29 mins in a Heterogeneous cluster composed of 1x ml.c5.9xlarge as data node and 1x ml.p3.2xlarge as DNN node.\n", + "The job runs for the predefined iterations. DNN instance group sends a shutdown request to data group after done with the training. You can see the following entries in the CloudWatch logs of dnn instance. A job with 4800 iterations finishes in 29 mins in a Heterogeneous cluster composed of 1x ml.c5.9xlarge as data node and 1x ml.p3.2xlarge as DNN node.\n", "\n", "Note: The console output of billing seconds can be ignored. See the AWS console > SageMaker > Training Job for the exact billing seconds.\n", "\n", @@ -407,8 +407,8 @@ "Training job completed!\n", "INFO:__main__:Training job completed!\n", "Process train_dnn.py closed with returncode=0\n", - "Shutting down data service dispatcher via: [algo-2:16000]\n", - "shut down request sent to algo-2:16000\n", + "Shutting downdata service dispatcher via: [algo-2:16000]\n", + "shutdown request sent to algo-2:16000\n", "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", "2022-08-16 01:15:05,555 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", "2022-08-16 01:15:05,556 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", @@ -462,7 +462,7 @@ "source": [ "## E. Comparing time-to-train and cost-to-train\n", "\n", - "Let's continue with the above example i.e. train a heavy data pre-processing (CPU intensive) model (MNIST) requiring only 1 GPU. We start with ml.p3.2xlarge (1xV100 GPU, 8x vCPU) in homogeneous cluster mode to get the baseline perf numbers. Due to the no. of CPU cores, we could not go beyond 8 data loader/workers for data pre-processing. The avg. step cost was `7.6 cents` and avg. step time is `1.19 seconds`. \n", + "Let's continue with the above example i.e. train a heavy data pre-processing (CPU intensive) model (MNIST) requiring only 1 GPU. We start with ml.p3.2xlarge (1xV100 GPU, 8x vCPU) in homogeneous cluster mode to get the baseline performance numbers. Due to the no. of CPU cores, we could not go beyond 8 data loader/workers for data pre-processing. The avg. step cost was `7.6 cents` and avg. step time is `1.19 seconds`. \n", "\n", "Our objective is to reduce the cost and speed up the model training time. The first choice here is to scale up the instance type in the same family. If we leverage the next instance type (4 GPU) in the P3 family, the GPUs would have gone underutilized. In this case, we needed more vCPU to GPU ratio. Assuming we haven't had any instance type in another instance family or the model is incompatible with the CPU/GPU architectures of other instance families, we are constrained to use ml.p3.2xlarge. The only way then to have more vCPUs to GPU ratio is to use SageMaker feature, Heterogeneous Cluster, which enables customers to offload data pre-processing logic to CPU only instance types example ml.c5. In the next test, we offloaded CPU intensive work i.e. data preprocessing to ml.c5.9xlarge (36 vCPU) and continued using ml.p3.2xlarge for DNN. The avg. step cost was `1.9 cents` and avg. step time is `0.18 seconds`. \n", "\n", diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 95bf82f9dd..3f4e77f91a 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -13,7 +13,7 @@ "\n", "This notebook demonstrates how to use Heterogeneous Clusters with TensorFlow's [tf.data.service](https://www.TensorFlow.org/api_docs/python/tf/data/experimental/service). It includes training a CPU intensive DL CV workload. Comparing cost and performance between homogeneous and heterogeneous training configurations. \n", "\n", - "💡To get started quickly with heterogenous clusters, we suggest you'll reuse the provided code as a quick way to migrate your workload from a local tf.data pipeline to a distributed tf.data.service pipeline. You'll need to change [code/train_dnn.py](./code/train_dnn.py), while keeping [code/train_data.py](./code/train_data.py) and [code/launcher.py](code/launcher.py) intact. This is explained below in the [Workload Details] section.\n", + "💡To get started quickly with heterogeneous clusters, we suggest you'll reuse the provided code as a quick way to migrate your workload from a local tf.data pipeline to a distributed tf.data.service pipeline. You'll need to change [code/train_dnn.py](./code/train_dnn.py), while keeping [code/train_data.py](./code/train_data.py) and [code/launcher.py](code/launcher.py) intact. This is explained below in the [Workload Details] section.\n", "\n", "\n", "\n", @@ -40,7 +40,7 @@ "metadata": {}, "source": [ "### Workload Details\n", - "Training data is an arteficially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neaural network optimization throughput expressd in epoch/step time. \n", + "Training data is an artificially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neural network optimization throughput expressed in epoch/step time. \n", "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The job runs on an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. " ] }, @@ -49,28 +49,28 @@ "metadata": {}, "source": [ "### Setting up heterogeneous clusters training\n", - "To switch to heterogenous clusters, we'll define two `instance_groups`:\n", + "To switch to heterogeneous clusters, we'll define two `instance_groups`:\n", "- **data_group** - A group of CPU instances that will run data pre-processing code.\n", - "- **dnn_group** - A group of GPU instances that will run Deep Neural Network training code.\n", + "- **dnn_group** - A group of GPU instances that will run Deep Neural Network training code.\n", "\n", - "In this example, the inter-node communication between CPU and GPU instance groups is implemented using [TensorFlow data service feature](https://www.TensorFlow.org/api_docs/python/tf/data/experimental/service). This feature allows to offload a configurable amount of preprocessing work to worker machines. Note that SageMaker's Heterogeneous cluster does not provide out-of-the-box support for inter-instance_group communication and it is up to the user to implement (we provide reference implementation here).\n", + "In this example, the inter-node communication between CPU and GPU instance groups is implemented using [TensorFlow data service feature](https://www.TensorFlow.org/api_docs/python/tf/data/experimental/service). This feature allows offloading a configurable amount of preprocessing work to worker machines. Note that SageMaker's Heterogeneous cluster does not provide out-of-the-box support for inter-instance_group communication, and it is up to the user to implement (we provide reference implementation here).\n", "\n", "This notebook refers following files and folders:\n", "- [code/train_dnn.py](./code/train_dnn.py) - this is standard TF training script, it has a single reference to tf.data.service when setting up the tf.data pipeline. This script will be executed on GPU instances belonging to the dnn_group.\n", "- [code/train_data.py](./code/train_data.py) - this script starts tf.data.service services like a tf.data.service Dispatcher and tf.data.service Worker processes. You shouldn't edit this script when adjusting to your workload.\n", - "- [code/launcher.py](./code/launcher.py) - Entry point training script. This is the script that SageMaker Training will start on all instances (all instances groups must share the same entrypoint script in heterogeneous clusters). `launcher.py` is responsible for detecting the instance group the instance belong to, and start `train_dnn.py` and `train_data.py` accordingly. It is also responsible for shutting down tf.data.services the training script completes (`train_dnn.py`) so all instances exit allowing the SageMaker training job to complete. \n", + "- [code/launcher.py](./code/launcher.py) - Entry point training script. This is the script that SageMaker Training will start on all instances (all instances groups must share the same entry point script in heterogeneous clusters). `launcher.py` is responsible for detecting the instance group the instance belong to, and start `train_dnn.py` and `train_data.py` accordingly. It is also responsible for shutting down tf.data.services the training script completes (`train_dnn.py`) so all instances exit allowing the SageMaker training job to complete. \n", "In every instance `luncher.py` will use `train_data.py` to start a tf.data.service worker server (As all instance types have CPUs that could be used for preprocessing). `luncher.py` will start a single tf.data.service dispatcher server (on the first instance of the `data_group`). \n", "`luncher.py` will start the `train_dnn.py` script in all GPU instances (`dnn_group` instances).\n", "\n", "#### Learn more about tf.data.service processes\n", - "`tf.data.service Dispatcher` - The dispatcher server acts as the control plain for tf.data.service; Being responsible for registering worker servers and assinging preprocessing tasks to them. Each training job has a single Dispatcher running in the first instance of the `data_group` and listens on port 6000.\n", + "`tf.data.service Dispatcher` - The dispatcher server acts as the control plain for tf.data.service; Being responsible for registering worker servers and assigning preprocessing tasks to them. Each training job has a single Dispatcher running in the first instance of the `data_group` and listens on port 6000.\n", "`tf.data.service Workers` - Worker servers carry out the data processing. Each instance could have one or more workers (listen on port 6001/6002/...).\n", "\n", "#### Defining what part of your pipeline runs in which instance\n", " Applying `tf.data.experimental.service.distribute` to your dataset, you can program the dataset to run all preprocessing operations up to the point of application, on the workers. \n", " As all instances will run a tf.data.service Worker, all instances will need access to a dataset you'll make available through a SageMaker training data channel. You do have the option of limiting which instance group will see which training data channel.\n", "\n", - "Thie below figutre shows sequence of events of setting up and running in a tf.data.service based heterogeneous cluster training job.\n", + "The below figure shows sequence of events of setting up and running in a tf.data.service based heterogeneous cluster training job.\n", "\n", "" ] @@ -93,17 +93,17 @@ "source": [ "\n", "At a high level, the notebook covers:\n", - "-  Set up Amazon SageMaker Studio Notebook \n", - "- Run homogeneous cluster training job \n", - " -  Setting up the Training environment\n", - " -  Submitting the Training job\n", - " -  Monitor and visualize the CloudWatch metrics\n", - "- Run heterogeneous cluster training job \n", - " -  Setting up the Training environment\n", - " -  Submitting the Training job\n", - " -  Monitor and visualize the CloudWatch metrics\n", - "-  Compare time-to-train and cost-to-train\n", - "-  Conclusion\n", + "- Set up Amazon SageMaker Studio Notebook \n", + "- Run homogeneous cluster training job \n", + " - Setting up the Training environment\n", + " - Submitting the Training job\n", + " - Monitor and visualize the CloudWatch metrics\n", + "- Run heterogeneous cluster training job \n", + " - Setting up the Training environment\n", + " - Submitting the Training job\n", + " - Monitor and visualize the CloudWatch metrics\n", + "- Compare time-to-train and cost-to-train\n", + "- Conclusion\n", "\n", "---" ] @@ -217,7 +217,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 3 - Valdiate SageMaker Python SDK and TensorFlow versions\n", + "#### Step 3 - Validate SageMaker Python SDK and TensorFlow versions\n", "Ensure the output of the cell below reflects:\n", "\n", "- SageMaker Python SDK version 2.98.0 or above, \n", @@ -346,7 +346,547 @@ "2022-09-24 11:28:23 Starting - Starting the training job......\n", "2022-09-24 11:29:08 Starting - Preparing the instances for training........................\n", "2022-09-24 11:33:34 Downloading - Downloading input data\n", - "2022-09-24 11:33:34 Training - Downloading the training image........" + "2022-09-24 11:33:34 Training - Downloading the training image..................\n", + "2022-09-24 11:37:00 Training - Training image download completed. Training in progress..2022-09-24 11:37:05.792579: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-24 11:37:05.801314: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "2022-09-24 11:37:06.269740: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "2022-09-24 11:37:13,412 sagemaker-training-toolkit INFO Imported framework sagemaker_tensorflow_container.training\n", + "2022-09-24 11:37:14,075 sagemaker-training-toolkit INFO Installing dependencies from requirements.txt:\n", + "/usr/local/bin/python3.9 -m pip install -r requirements.txt\n", + "Collecting protobuf==3.20.1\n", + "Downloading protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 39.6 MB/s eta 0:00:00\n", + "Collecting tensorflow-addons==0.17.0\n", + "Downloading tensorflow_addons-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", + "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 51.6 MB/s eta 0:00:00\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (21.3)\n", + "Requirement already satisfied: typeguard>=2.7 in /usr/local/lib/python3.9/site-packages (from tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (2.13.3)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.9/site-packages (from packaging->tensorflow-addons==0.17.0->-r requirements.txt (line 2)) (3.0.9)\n", + "Installing collected packages: protobuf, tensorflow-addons\n", + "Attempting uninstall: protobuf\n", + "Found existing installation: protobuf 3.19.4\n", + "Uninstalling protobuf-3.19.4:\n", + "Successfully uninstalled protobuf-3.19.4\n", + "Attempting uninstall: tensorflow-addons\n", + "Found existing installation: tensorflow-addons 0.17.1\n", + "Uninstalling tensorflow-addons-0.17.1:\n", + "Successfully uninstalled tensorflow-addons-0.17.1\n", + "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "tf-models-official 2.9.1 requires tensorflow~=2.9.0, which is not installed.\n", + "tensorflow-gpu 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "tensorboard 2.9.1 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "sagemaker-training 4.1.4.dev0 requires protobuf<3.20,>=3.9.2, but you have protobuf 3.20.1 which is incompatible.\n", + "Successfully installed protobuf-3.20.1 tensorflow-addons-0.17.0\n", + "WARNING: 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\n", + "[notice] A new release of pip available: 22.1.2 -> 22.2.2\n", + "[notice] To update, run: pip install --upgrade pip\n", + "2022-09-24 11:37:24,079 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-24 11:37:24,079 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-24 11:37:24,258 sagemaker-training-toolkit INFO Starting MPI run as worker node.\n", + "2022-09-24 11:37:24,258 sagemaker-training-toolkit INFO Creating SSH daemon.\n", + "2022-09-24 11:37:24,274 sagemaker-training-toolkit INFO Waiting for MPI workers to establish their SSH connections\n", + "2022-09-24 11:37:24,274 sagemaker-training-toolkit INFO Env Hosts: ['algo-1'] Hosts: ['algo-1:8'] process_per_hosts: 8 num_processes: 8\n", + "2022-09-24 11:37:24,276 sagemaker-training-toolkit INFO Network interface name: eth0\n", + "2022-09-24 11:37:24,368 sagemaker-training-toolkit INFO Invoking user script\n", + "Training Env:\n", + "{\n", + " \"additional_framework_parameters\": {\n", + " \"sagemaker_mpi_custom_mpi_options\": \"--NCCL_DEBUG WARN\",\n", + " \"sagemaker_mpi_enabled\": true,\n", + " \"sagemaker_mpi_num_of_processes_per_host\": 8\n", + " },\n", + " \"channel_input_dirs\": {},\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_group\": \"homogeneousCluster\",\n", + " \"current_instance_group_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"distribution_hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"distribution_instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"framework_module\": \"sagemaker_tensorflow_container.training:main\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"hyperparameters\": {\n", + " \"batch_size\": 1024,\n", + " \"epochs\": 10,\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"num_of_data_workers\": 0,\n", + " \"steps_per_epoch\": 500,\n", + " \"tf_data_mode\": \"local\"\n", + " },\n", + " \"input_config_dir\": \"/opt/ml/input/config\",\n", + " \"input_data_config\": {},\n", + " \"input_dir\": \"/opt/ml/input\",\n", + " \"instance_groups\": [\n", + " \"homogeneousCluster\"\n", + " ],\n", + " \"instance_groups_dict\": {\n", + " \"homogeneousCluster\": {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " },\n", + " \"is_hetero\": false,\n", + " \"is_master\": true,\n", + " \"job_name\": \"homogeneous-20220924T112821Z-1\",\n", + " \"log_level\": 20,\n", + " \"master_hostname\": \"algo-1\",\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"module_dir\": \"s3://sagemaker-us-east-1-331113010199/homogeneous-20220924T112821Z-1/source/sourcedir.tar.gz\",\n", + " \"module_name\": \"launcher\",\n", + " \"network_interface_name\": \"eth0\",\n", + " \"num_cpus\": 96,\n", + " \"num_gpus\": 8,\n", + " \"output_data_dir\": \"/opt/ml/output/data\",\n", + " \"output_dir\": \"/opt/ml/output\",\n", + " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", + " \"resource_config\": {\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_type\": \"ml.p4d.24xlarge\",\n", + " \"current_group_name\": \"homogeneousCluster\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"instance_groups\": [\n", + " {\n", + " \"instance_group_name\": \"homogeneousCluster\",\n", + " \"instance_type\": \"ml.p4d.24xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ]\n", + " }\n", + " ],\n", + " \"network_interface_name\": \"eth0\"\n", + " },\n", + " \"user_entry_point\": \"launcher.py\"\n", + "}\n", + "Environment variables:\n", + "SM_HOSTS=[\"algo-1\"]\n", + "SM_NETWORK_INTERFACE_NAME=eth0\n", + "SM_HPS={\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"}\n", + "SM_USER_ENTRY_POINT=launcher.py\n", + "SM_FRAMEWORK_PARAMS={\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8}\n", + "SM_RESOURCE_CONFIG={\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"}\n", + "SM_INPUT_DATA_CONFIG={}\n", + "SM_OUTPUT_DATA_DIR=/opt/ml/output/data\n", + "SM_CHANNELS=[]\n", + "SM_CURRENT_HOST=algo-1\n", + "SM_CURRENT_INSTANCE_TYPE=ml.p4d.24xlarge\n", + "SM_CURRENT_INSTANCE_GROUP=homogeneousCluster\n", + "SM_CURRENT_INSTANCE_GROUP_HOSTS=[\"algo-1\"]\n", + "SM_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_INSTANCE_GROUPS_DICT={\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}}\n", + "SM_DISTRIBUTION_INSTANCE_GROUPS=[\"homogeneousCluster\"]\n", + "SM_IS_HETERO=false\n", + "SM_MODULE_NAME=launcher\n", + "SM_LOG_LEVEL=20\n", + "SM_FRAMEWORK_MODULE=sagemaker_tensorflow_container.training:main\n", + "SM_INPUT_DIR=/opt/ml/input\n", + "SM_INPUT_CONFIG_DIR=/opt/ml/input/config\n", + "SM_OUTPUT_DIR=/opt/ml/output\n", + "SM_NUM_CPUS=96\n", + "SM_NUM_GPUS=8\n", + "SM_MODEL_DIR=/opt/ml/model\n", + "SM_MODULE_DIR=s3://sagemaker-us-east-1-331113010199/homogeneous-20220924T112821Z-1/source/sourcedir.tar.gz\n", + "SM_TRAINING_ENV={\"additional_framework_parameters\":{\"sagemaker_mpi_custom_mpi_options\":\"--NCCL_DEBUG WARN\",\"sagemaker_mpi_enabled\":true,\"sagemaker_mpi_num_of_processes_per_host\":8},\"channel_input_dirs\":{},\"current_host\":\"algo-1\",\"current_instance_group\":\"homogeneousCluster\",\"current_instance_group_hosts\":[\"algo-1\"],\"current_instance_type\":\"ml.p4d.24xlarge\",\"distribution_hosts\":[\"algo-1\"],\"distribution_instance_groups\":[\"homogeneousCluster\"],\"framework_module\":\"sagemaker_tensorflow_container.training:main\",\"hosts\":[\"algo-1\"],\"hyperparameters\":{\"batch_size\":1024,\"epochs\":10,\"model_dir\":\"/opt/ml/model\",\"num_of_data_workers\":0,\"steps_per_epoch\":500,\"tf_data_mode\":\"local\"},\"input_config_dir\":\"/opt/ml/input/config\",\"input_data_config\":{},\"input_dir\":\"/opt/ml/input\",\"instance_groups\":[\"homogeneousCluster\"],\"instance_groups_dict\":{\"homogeneousCluster\":{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}},\"is_hetero\":false,\"is_master\":true,\"job_name\":\"homogeneous-20220924T112821Z-1\",\"log_level\":20,\"master_hostname\":\"algo-1\",\"model_dir\":\"/opt/ml/model\",\"module_dir\":\"s3://sagemaker-us-east-1-331113010199/homogeneous-20220924T112821Z-1/source/sourcedir.tar.gz\",\"module_name\":\"launcher\",\"network_interface_name\":\"eth0\",\"num_cpus\":96,\"num_gpus\":8,\"output_data_dir\":\"/opt/ml/output/data\",\"output_dir\":\"/opt/ml/output\",\"output_intermediate_dir\":\"/opt/ml/output/intermediate\",\"resource_config\":{\"current_group_name\":\"homogeneousCluster\",\"current_host\":\"algo-1\",\"current_instance_type\":\"ml.p4d.24xlarge\",\"hosts\":[\"algo-1\"],\"instance_groups\":[{\"hosts\":[\"algo-1\"],\"instance_group_name\":\"homogeneousCluster\",\"instance_type\":\"ml.p4d.24xlarge\"}],\"network_interface_name\":\"eth0\"},\"user_entry_point\":\"launcher.py\"}\n", + "SM_USER_ARGS=[\"--batch_size\",\"1024\",\"--epochs\",\"10\",\"--model_dir\",\"/opt/ml/model\",\"--num_of_data_workers\",\"0\",\"--steps_per_epoch\",\"500\",\"--tf_data_mode\",\"local\"]\n", + "SM_OUTPUT_INTERMEDIATE_DIR=/opt/ml/output/intermediate\n", + "SM_HP_BATCH_SIZE=1024\n", + "SM_HP_EPOCHS=10\n", + "SM_HP_MODEL_DIR=/opt/ml/model\n", + "SM_HP_NUM_OF_DATA_WORKERS=0\n", + "SM_HP_STEPS_PER_EPOCH=500\n", + "SM_HP_TF_DATA_MODE=local\n", + "PYTHONPATH=/opt/ml/code:/usr/local/bin:/usr/local/lib/python39.zip:/usr/local/lib/python3.9:/usr/local/lib/python3.9/lib-dynload:/usr/local/lib/python3.9/site-packages:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument-3.4.2-py3.9.egg:/usr/local/lib/python3.9/site-packages/pyinstrument_cext-0.2.4-py3.9-linux-x86_64.egg\n", + "Invoking script with the following command:\n", + "mpirun --host algo-1:8 -np 8 --allow-run-as-root --display-map --tag-output -mca btl_tcp_if_include eth0 -mca oob_tcp_if_include eth0 -mca plm_rsh_no_tree_spawn 1 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_abort_on_non_zero_status 1 -mca btl_vader_single_copy_mechanism none -x NCCL_MIN_NRINGS=4 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_DEBUG=WARN -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD=/usr/local/lib/python3.9/site-packages/gethostname.cpython-39-x86_64-linux-gnu.so -x SM_HOSTS -x SM_NETWORK_INTERFACE_NAME -x SM_HPS -x SM_USER_ENTRY_POINT -x SM_FRAMEWORK_PARAMS -x SM_RESOURCE_CONFIG -x SM_INPUT_DATA_CONFIG -x SM_OUTPUT_DATA_DIR -x SM_CHANNELS -x SM_CURRENT_HOST -x SM_CURRENT_INSTANCE_TYPE -x SM_CURRENT_INSTANCE_GROUP -x SM_CURRENT_INSTANCE_GROUP_HOSTS -x SM_INSTANCE_GROUPS -x SM_INSTANCE_GROUPS_DICT -x SM_DISTRIBUTION_INSTANCE_GROUPS -x SM_IS_HETERO -x SM_MODULE_NAME -x SM_LOG_LEVEL -x SM_FRAMEWORK_MODULE -x SM_INPUT_DIR -x SM_INPUT_CONFIG_DIR -x SM_OUTPUT_DIR -x SM_NUM_CPUS -x SM_NUM_GPUS -x SM_MODEL_DIR -x SM_MODULE_DIR -x SM_TRAINING_ENV -x SM_USER_ARGS -x SM_OUTPUT_INTERMEDIATE_DIR -x SM_HP_BATCH_SIZE -x SM_HP_EPOCHS -x SM_HP_MODEL_DIR -x SM_HP_NUM_OF_DATA_WORKERS -x SM_HP_STEPS_PER_EPOCH -x SM_HP_TF_DATA_MODE -x PYTHONPATH /usr/local/bin/python3.9 -m mpi4py launcher.py --batch_size 1024 --epochs 10 --model_dir /opt/ml/model --num_of_data_workers 0 --steps_per_epoch 500 --tf_data_mode local\n", + "Data for JOB [7555,1] offset 0 Total slots allocated 8\n", + " ======================== JOB MAP ========================\n", + " Data for node: ip-10-0-215-180#011Num slots: 8#011Max slots: 0#011Num procs: 8\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 0 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 1 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 2 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 3 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 4 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 5 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 6 Bound: N/A\n", + " #011Process OMPI jobid: [7555,1] App: 0 Process rank: 7 Bound: N/A\n", + " =============================================================\n", + "[1,mpirank:1,algo-1]:env.is_hetero=False\n", + "[1,mpirank:1,algo-1]:current_host=algo-1\n", + "[1,mpirank:1,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:4,algo-1]:env.is_hetero=False\n", + "[1,mpirank:4,algo-1]:current_host=algo-1\n", + "[1,mpirank:4,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:5,algo-1]:env.is_hetero=False\n", + "[1,mpirank:5,algo-1]:current_host=algo-1\n", + "[1,mpirank:5,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:7,algo-1]:env.is_hetero=False\n", + "[1,mpirank:7,algo-1]:current_host=algo-1\n", + "[1,mpirank:7,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:0,algo-1]:env.is_hetero=False\n", + "[1,mpirank:0,algo-1]:current_host=algo-1\n", + "[1,mpirank:0,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:6,algo-1]:env.is_hetero=False\n", + "[1,mpirank:6,algo-1]:current_host=algo-1\n", + "[1,mpirank:6,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:3,algo-1]:env.is_hetero=False\n", + "[1,mpirank:3,algo-1]:current_host=algo-1\n", + "[1,mpirank:3,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:2,algo-1]:env.is_hetero=False\n", + "[1,mpirank:2,algo-1]:current_host=algo-1[1,mpirank:2,algo-1]:\n", + "[1,mpirank:2,algo-1]:Opening process: ['python', './train_dnn.py', '--batch_size', '1024', '--epochs', '10', '--model_dir', '/opt/ml/model', '--num_of_data_workers', '0', '--steps_per_epoch', '500', '--tf_data_mode', 'local']\n", + "[1,mpirank:1,algo-1]:2022-09-24 11:37:25.276381: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-24 11:37:25.276382: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:4,algo-1]:2022-09-24 11:37:25.276384: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-24 11:37:25.276524: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:2,algo-1]:2022-09-24 11:37:25.276524: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:4,algo-1]:2022-09-24 11:37:25.276524: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:0,algo-1]:2022-09-24 11:37:25.290991: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-24 11:37:25.290987: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-24 11:37:25.290990: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-24 11:37:25.290991: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:2022-09-24 11:37:25.290990: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:0,algo-1]:2022-09-24 11:37:25.291121: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:7,algo-1]:2022-09-24 11:37:25.291122: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:3,algo-1]:2022-09-24 11:37:25.291124: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:5,algo-1]:2022-09-24 11:37:25.291124: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:6,algo-1]:2022-09-24 11:37:25.291121: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:105] SageMaker Profiler is not enabled. The timeline writer thread will not be started, future recorded events will be dropped.\n", + "[1,mpirank:4,algo-1]:2022-09-24 11:37:25.310966: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:2,algo-1]:2022-09-24 11:37:25.310966: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:1,algo-1]:2022-09-24 11:37:25.310966: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:0,algo-1]:2022-09-24 11:37:25.325878: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:7,algo-1]:2022-09-24 11:37:25.325873: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:3,algo-1]:2022-09-24 11:37:25.325878: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:2022-09-24 11:37:25.326012: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:5,algo-1]:2022-09-24 11:37:25.326064: W tensorflow/core/profiler/internal/smprofiler_timeline.cc:460] Initializing the SageMaker Profiler.\n", + "[1,mpirank:6,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:0,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:0,algo-1]:hvd.local_rank() 0\n", + "[1,mpirank:1,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:6,algo-1]:hvd.local_rank() 6\n", + "[1,mpirank:1,algo-1]:hvd.local_rank() 1\n", + "[1,mpirank:5,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')][1,mpirank:5,algo-1]:\n", + "[1,mpirank:5,algo-1]:hvd.local_rank() 5\n", + "[1,mpirank:2,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:3,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:4,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:2,algo-1]:hvd.local_rank() 2\n", + "[1,mpirank:7,algo-1]:[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:4', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:5', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:6', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:7', device_type='GPU')]\n", + "[1,mpirank:3,algo-1]:hvd.local_rank() 3\n", + "[1,mpirank:4,algo-1]:hvd.local_rank() 4\n", + "[1,mpirank:7,algo-1]:hvd.local_rank() 7\n", + "[1,mpirank:3,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:6,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:5,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:0,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:7,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:2,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:1,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:4,algo-1]:Running in local tf_data_mode.\n", + "[1,mpirank:1,algo-1]:Epoch 1/10\n", + "[1,mpirank:4,algo-1]:Epoch 1/10\n", + "[1,mpirank:2,algo-1]:Epoch 1/10\n", + "[1,mpirank:3,algo-1]:Epoch 1/10\n", + "[1,mpirank:5,algo-1]:Epoch 1/10\n", + "[1,mpirank:7,algo-1]:Epoch 1/10\n", + "[1,mpirank:0,algo-1]:Epoch 1/10\n", + "[1,mpirank:6,algo-1]:Epoch 1/10\n", + "[1,mpirank:5,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:5,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:5,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:0,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:0,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:0,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:7,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:7,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:7,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:3,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:3,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:3,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:1,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:1,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:1,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:2,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:2,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:2,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:4,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:4,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:4,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:6,algo-1]:Extension horovod.torch has not been built: /usr/local/lib/python3.9/site-packages/horovod/torch/mpi_lib/_mpi_lib.cpython-39-x86_64-linux-gnu.so not found\n", + "[1,mpirank:6,algo-1]:If this is not expected, reinstall Horovod with HOROVOD_WITH_PYTORCH=1 to debug the build error.\n", + "[1,mpirank:6,algo-1]:Warning! MPI libs are missing, but python applications are still available.\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.366 algo-1:177 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.366 algo-1:178 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.366 algo-1:179 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.366 algo-1:181 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.366 algo-1:183 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.366 algo-1:184 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.366 algo-1:182 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.366 algo-1:180 INFO utils.py:27] RULE_JOB_STOP_SIGNAL_FILENAME: None\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:2,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:5,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:4,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:6,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:0,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:3,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:7,algo-1]:/usr/local/lib/python3.9/site-packages/smdebug-1.0.17b20220701-py3.9.egg/smdebug/profiler/system_metrics_reader.py:63: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.581 algo-1:177 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.581 algo-1:184 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.582 algo-1:181 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.582 algo-1:179 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.582 algo-1:180 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.582 algo-1:182 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.582 algo-1:183 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.582 algo-1:178 INFO profiler_config_parser.py:111] Unable to find config at /opt/ml/input/config/profilerconfig.json. Profiler is disabled.\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.639 algo-1:184 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.639 algo-1:177 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.639 algo-1:178 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.639 algo-1:183 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.639 algo-1:180 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.639 algo-1:182 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.639 algo-1:181 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.639 algo-1:179 INFO json_config.py:91] Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.640 algo-1:177 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.640 algo-1:178 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.640 algo-1:184 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.640 algo-1:183 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.640 algo-1:180 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.640 algo-1:182 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.640 algo-1:181 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.640 algo-1:184 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.640 algo-1:177 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.640 algo-1:178 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.640 algo-1:184 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.640 algo-1:178 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.640 algo-1:177 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.640 algo-1:179 INFO hook.py:201] tensorboard_dir has not been set for the hook. SMDebug will not be exporting tensorboard summaries.\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.640 algo-1:183 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.640 algo-1:183 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:2,algo-1]:[2022-09-24 11:37:33.640 algo-1:184 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.640 algo-1:180 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.640 algo-1:182 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:1,algo-1]:[2022-09-24 11:37:33.640 algo-1:177 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", + "[1,mpirank:4,algo-1]:[2022-09-24 11:37:33.640 algo-1:178 INFO hook.py:421] Monitoring the collections: losses, metrics, sm_metrics\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.640 algo-1:181 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.640 algo-1:180 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.640 algo-1:182 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.641 algo-1:181 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:3,algo-1]:[2022-09-24 11:37:33.641 algo-1:183 INFO hook.py:421] Monitoring the collections: losses, sm_metrics, metrics\n", + "[1,mpirank:6,algo-1]:[2022-09-24 11:37:33.641 algo-1:182 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", + "[1,mpirank:7,algo-1]:[2022-09-24 11:37:33.641 algo-1:180 INFO hook.py:421] Monitoring the collections: sm_metrics, losses, metrics\n", + "[1,mpirank:0,algo-1]:[2022-09-24 11:37:33.641 algo-1:181 INFO hook.py:421] Monitoring the collections: sm_metrics, metrics, losses\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.641 algo-1:179 INFO hook.py:254] Saving to /opt/ml/output/tensors\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.641 algo-1:179 INFO state_store.py:77] The checkpoint config file /opt/ml/input/config/checkpointconfig.json does not exist.\n", + "[1,mpirank:5,algo-1]:[2022-09-24 11:37:33.641 algo-1:179 INFO hook.py:421] Monitoring the collections: metrics, losses, sm_metrics\n", + "[1,mpirank:0,algo-1]:NCCL version 2.10.3+cuda11.2\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2246s vs `on_train_batch_end` time: 0.6465s). Check your callbacks.\n", + "[1,mpirank:2,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2246s vs `on_train_batch_end` time: 0.6465s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:3,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2237s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:0,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2237s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:5,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2241s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6465s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2241s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:6,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2247s vs `on_train_batch_end` time: 0.6465s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2255s vs `on_train_batch_end` time: 0.6463s). Check your callbacks.\n", + "[1,mpirank:1,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2255s vs `on_train_batch_end` time: 0.6463s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2250s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:4,algo-1]:WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2250s vs `on_train_batch_end` time: 0.6464s). Check your callbacks.\n", + "[1,mpirank:7,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:1,algo-1]:Epoch 2/10\n", + "[1,mpirank:5,algo-1]:Epoch 2/10\n", + "[1,mpirank:7,algo-1]:Epoch 2/10\n", + "[1,mpirank:6,algo-1]:Epoch 2/10\n", + "[1,mpirank:2,algo-1]:Epoch 2/10\n", + "[1,mpirank:4,algo-1]:Epoch 2/10\n", + "[1,mpirank:3,algo-1]:500/500 - 121s - loss: 2.4081 - lr: 0.0033 - 121s/epoch - 242ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 2/10\n", + "[1,mpirank:0,algo-1]:500/500 - 122s - loss: 2.4081 - lr: 0.0033 - 122s/epoch - 245ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 2/10\n", + "[1,mpirank:1,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 100s - loss: 2.3881 - lr: 0.0057 - 100s/epoch - 199ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 3/10\n", + "[1,mpirank:5,algo-1]:Epoch 3/10\n", + "[1,mpirank:2,algo-1]:Epoch 3/10\n", + "[1,mpirank:6,algo-1]:Epoch 3/10\n", + "[1,mpirank:4,algo-1]:Epoch 3/10\n", + "[1,mpirank:3,algo-1]:Epoch 3/10\n", + "[1,mpirank:1,algo-1]:Epoch 3/10\n", + "[1,mpirank:0,algo-1]:500/500 - 99s - loss: 2.3881 - lr: 0.0057 - 99s/epoch - 199ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 3/10\n", + "[1,mpirank:6,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:0,algo-1]:\n", + "[1,mpirank:0,algo-1]:Epoch 3: finished gradual learning rate warmup to 0.008.\n", + "[1,mpirank:7,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 4/10\n", + "[1,mpirank:5,algo-1]:Epoch 4/10\n", + "[1,mpirank:2,algo-1]:Epoch 4/10\n", + "[1,mpirank:7,algo-1]:Epoch 4/10\n", + "[1,mpirank:1,algo-1]:Epoch 4/10\n", + "[1,mpirank:3,algo-1]:Epoch 4/10\n", + "[1,mpirank:4,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 4/10\n", + "[1,mpirank:0,algo-1]:500/500 - 103s - loss: 2.3532 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 4/10\n", + "[1,mpirank:7,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 5/10\n", + "[1,mpirank:7,algo-1]:Epoch 5/10\n", + "[1,mpirank:4,algo-1]:Epoch 5/10\n", + "[1,mpirank:1,algo-1]:Epoch 5/10\n", + "[1,mpirank:2,algo-1]:Epoch 5/10\n", + "[1,mpirank:3,algo-1]:Epoch 5/10\n", + "[1,mpirank:5,algo-1]:Epoch 5/10\n", + "[1,mpirank:0,algo-1]:500/500 - 103s - loss: 2.3199 - lr: 0.0080 - 103s/epoch - 206ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 5/10\n", + "[1,mpirank:2,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 6/10\n", + "[1,mpirank:7,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 6/10\n", + "[1,mpirank:3,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:5,algo-1]:Epoch 6/10\n", + "[1,mpirank:7,algo-1]:Epoch 6/10\n", + "[1,mpirank:1,algo-1]:Epoch 6/10\n", + "[1,mpirank:3,algo-1]:Epoch 6/10\n", + "[1,mpirank:4,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 6/10\n", + "[1,mpirank:0,algo-1]:500/500 - 100s - loss: 2.3071 - lr: 0.0080 - 100s/epoch - 200ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 6/10\n", + "[1,mpirank:7,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 7/10\n", + "[1,mpirank:5,algo-1]:Epoch 7/10\n", + "[1,mpirank:3,algo-1]:Epoch 7/10\n", + "[1,mpirank:7,algo-1]:Epoch 7/10\n", + "[1,mpirank:1,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 7/10\n", + "[1,mpirank:1,algo-1]:Epoch 7/10\n", + "[1,mpirank:6,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 188ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 7/10\n", + "[1,mpirank:0,algo-1]:500/500 - 94s - loss: 2.3043 - lr: 0.0080 - 94s/epoch - 189ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 7/10\n", + "[1,mpirank:3,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 8/10\n", + "[1,mpirank:5,algo-1]:Epoch 8/10\n", + "[1,mpirank:2,algo-1]:Epoch 8/10\n", + "[1,mpirank:6,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:6,algo-1]:Epoch 8/10\n", + "[1,mpirank:1,algo-1]:Epoch 8/10\n", + "[1,mpirank:7,algo-1]:Epoch 8/10\n", + "[1,mpirank:4,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:4,algo-1]:Epoch 8/10\n", + "[1,mpirank:0,algo-1]:500/500 - 97s - loss: 2.3031 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 8/10\n", + "[1,mpirank:3,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:5,algo-1]:Epoch 9/10\n", + "[1,mpirank:4,algo-1]:Epoch 9/10\n", + "[1,mpirank:7,algo-1]:Epoch 9/10\n", + "[1,mpirank:3,algo-1]:Epoch 9/10\n", + "[1,mpirank:2,algo-1]:Epoch 9/10\n", + "[1,mpirank:6,algo-1]:Epoch 9/10\n", + "[1,mpirank:1,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:1,algo-1]:Epoch 9/10\n", + "[1,mpirank:0,algo-1]:500/500 - 96s - loss: 2.3027 - lr: 0.0080 - 96s/epoch - 192ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 9/10\n", + "[1,mpirank:2,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:2,algo-1]:Epoch 10/10\n", + "[1,mpirank:1,algo-1]:Epoch 10/10\n", + "[1,mpirank:4,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:6,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:3,algo-1]:Epoch 10/10\n", + "[1,mpirank:5,algo-1]:Epoch 10/10\n", + "[1,mpirank:6,algo-1]:Epoch 10/10\n", + "[1,mpirank:4,algo-1]:Epoch 10/10\n", + "[1,mpirank:7,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 210ms/step\n", + "[1,mpirank:7,algo-1]:Epoch 10/10\n", + "[1,mpirank:0,algo-1]:500/500 - 105s - loss: 2.3021 - lr: 0.0080 - 105s/epoch - 209ms/step\n", + "[1,mpirank:0,algo-1]:Epoch 10/10\n", + "[1,mpirank:6,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:7,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:3,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:2,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:5,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:1,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:4,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 194ms/step\n", + "[1,mpirank:0,algo-1]:500/500 - 97s - loss: 2.3013 - lr: 0.0080 - 97s/epoch - 193ms/step\n", + "[1,mpirank:4,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:6,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:3,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:1,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:5,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:7,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:2,algo-1]:Process train_dnn.py closed with returncode=0\n", + "[1,mpirank:0,algo-1]:WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op while saving (showing 5 of 53). These functions will not be directly callable after loading.\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:INFO:tensorflow:Assets written to: /opt/ml/model/000000001/assets\n", + "[1,mpirank:0,algo-1]:Process train_dnn.py closed with returncode=0\n", + "2022-09-24 11:54:50,061 sagemaker-training-toolkit INFO Waiting for the process to finish and give a return code.\n", + "2022-09-24 11:54:50,061 sagemaker-training-toolkit INFO Done waiting for a return code. Received 0 from exiting process.\n", + "2022-09-24 11:54:50,062 sagemaker-training-toolkit INFO Reporting training SUCCESS\n", + "\n", + "2022-09-24 11:55:05 Uploading - Uploading generated training model\n", + "2022-09-24 11:55:36 Completed - Training job completed\n", + "Training seconds: 1337\n", + "Billable seconds: 1337\n" ] } ], @@ -431,7 +971,7 @@ "We'll now run a training job in heterogeneous cluster mode. \n", "Note the changes from the homogeneous cluster job: \n", "- We define two new instance groups that are provided to the `estimator` as the `instance_groups` parameter that replaces the homogeneous parameters `instance_type` and `instance_count`.\n", - "- In the `distribution` parameter for Horovod we added a new parameter `instance_groups` that is used to limit the MPI cluster to run in the `dnn_group`. The MPI cluster should include only the GPU nodes that run Horovod (which needs MPI). The `data_group` instances should not be part of the MPI cluster, as they set up their on `tf.data.service` cluster.\n", + "- In the `distribution` parameter for Horovod we added a new parameter `instance_groups` that is used to limit the MPI cluster to run in the `dnn_group`. The MPI cluster should include only the GPU nodes that run Horovod (which needs MPI). The `data_group` instances should not be part of the MPI cluster, as they set up their on `tf.data.service` cluster.\n", "\n", "More on the two instance groups config we use:\n", "- `data_group` - two ml.c5.18xlarge instances, each with 72 vCPUs to handle data preprocessing. Reading data from S3, preprocessing it, and forwarding it to the `dnn_group`.\n", @@ -439,13 +979,13 @@ "\n", "There are three Python scripts to know about:\n", "The 1st is `train_dnn.py` - This is your training script for the neural network, you should edit it to match your own use case. Note that this script isn't aware of the Heterogeneous cluster set up, except when it initializes the tf.data dataset calling this line: `ds = ds.apply(tf.data.experimental.service.distribute(...)`. \n", - "The 2nd and 3rd scripts, which you're not suppose to edit when adapting to your own use case, do the heavy lifting required for using tf.data.service over the Heterogeneous cluster feature. \n", + "The 2nd and 3rd scripts, which should not need editing when adapting to your own use case, do the heavy lifting required for using tf.data.service over the Heterogeneous cluster feature. \n", "`train_data.py` include functions to start/stop tf.service.data process like a dispatcher and WorkerServer. \n", "`launcher.py` has several responsibilities: \n", - "- A single entrypoint script for all instances in all instance groups (SageMaker will start the same script on all instances).\n", - "- Identifies which instance group the node belong to, and start the relevant script accordingly (`train_dnn.py` or `train_data.py` or sometimes both).\n", - "- Takes measures to ensure that tf.data.sevice processes shutdown when training completes, as the training job completes only when all instances exit.\n", - "- Allows to start more than one process (for example, on the dnn_group instances we'll run both the `train_dnn.py` and a tf.data.service worker to utilize the instance CPUs)." + "- A single entry point script for all instances in all instance groups (SageMaker will start the same script on all instances).\n", + "- Identifies which instance group the node belong to, and start the relevant script accordingly (`train_dnn.py` or `train_data.py` or sometimes both).\n", + "- Takes measures to ensure that tf.data.service processes shutdown when training completes, as the training job completes only when all instances exit.\n", + "- Allow to start more than one process (for example, on the dnn_group instances we'll run both the `train_dnn.py` and a tf.data.service worker to utilize the instance CPUs)." ] }, { @@ -542,7 +1082,7 @@ "\n", "**CPU and GPU usage analysis** \n", "\n", - " In the screenshot below we observe that GPU usage has increase to 74% (compared to ~45% in the homogeneous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 80% CPU uage. \n", + " In the screenshot below we observe that GPU usage has increase to 74% (compared to ~45% in the homogeneous training run) which is what we were aiming for. The CPU usage on all 3 instances are close to 80% CPU usage. \n", " \n", "Note: To view your own job Click on **View instance metrics** from the **Training jobs** node in **Amazon SageMaker Console**. Then to rescale the CloudWatch Metrics to 100% on CPU utilization for algo-1 and algo-2, use CloudWatch \"Add Math\" feature and average it out by no. of vCPUs/GPUs on those instance types. We captured metrics definitions used to produce this graph [here](./cloudwatch-metric-definitions/heterogenenous-workload.json). \n", "\n", @@ -566,7 +1106,7 @@ "\"results\n", "\n", "## F. Conclusion\n", - "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training, with TensorFlow to achieve better price performance and increase training speed. To get started you can copy this example project and change `train_dnn.py` to match your worklaod. To run the job, you could use this notebook, or the `start_job.py`." + "In this notebook, we demonstrated how to leverage Heterogeneous cluster feature of SageMaker Training, with TensorFlow to achieve better price performance and increase training speed. To get started you can copy this example project and change `train_dnn.py` to match your workload. To run the job, you could use this notebook, or the `start_job.py`." ] } ], From d47542b19ee628ab4d0c4003952fcf44e01d062c Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Mon, 26 Sep 2022 13:15:40 +0300 Subject: [PATCH 07/15] remove cifar references --- sagemaker-datawrangler/readme.md | 40 ++++++ .../hetero-pytorch-mnist.ipynb | 2 +- .../pt.grpc.sagemaker/start_job.py | 91 ------------ .../generate_cifar10_tfrecords.py | 132 ------------------ .../tf.data.service.sagemaker/readme.md | 15 -- 5 files changed, 41 insertions(+), 239 deletions(-) delete mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py delete mode 100755 training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py diff --git a/sagemaker-datawrangler/readme.md b/sagemaker-datawrangler/readme.md index 8b13789179..d6c963f90d 100644 --- a/sagemaker-datawrangler/readme.md +++ b/sagemaker-datawrangler/readme.md @@ -1 +1,41 @@ +![Amazon SageMaker Data Wrangler](https://github.com/aws/amazon-sagemaker-examples/raw/main/_static/sagemaker-banner.png) + +# Amazon SageMaker Data Wrangler Examples + +Example flows that demonstrate how to aggregate and prepare data for Machine Learning using Amazon SageMaker Data Wrangler. + +## :books: Background + +[Amazon SageMaker Data Wrangler](https://aws.amazon.com/sagemaker/data-wrangler/) reduces the time it takes to aggregate and prepare data for ML. From a single interface in SageMaker Studio, you can import data from Amazon S3, Amazon Athena, Amazon Redshift, AWS Lake Formation, and Amazon SageMaker Feature Store, and in just a few clicks SageMaker Data Wrangler will automatically load, aggregate, and display the raw data. It will then make conversion recommendations based on the source data, transform the data into new features, validate the features, and provide visualizations with recommendations on how to remove common sources of error such as incorrect labels. Once your data is prepared, you can build fully automated ML workflows with Amazon SageMaker Pipelines or import that data into Amazon SageMaker Feature Store. + + + +The [SageMaker example notebooks](https://sagemaker-examples.readthedocs.io/en/latest/) are Jupyter notebooks that demonstrate the usage of Amazon SageMaker. + +## :hammer_and_wrench: Setup + +Amazon SageMaker Data Wrangler is a feature in Amazon SageMaker Studio. Use this section to learn how to access and get started using Data Wrangler. Do the following: + +* Complete each step in [Prerequisites](https://docs.aws.amazon.com/sagemaker/latest/dg/data-wrangler-getting-started.html#data-wrangler-getting-started-prerequisite). + +* Follow the procedure in [Access Data Wrangler](https://docs.aws.amazon.com/sagemaker/latest/dg/data-wrangler-getting-started.html#data-wrangler-getting-started-access) to start using Data Wrangler. + + + + +## :notebook: Examples + +### **[Tabular DataFlow](tabular-dataflow/README.md)** + +This example provide quick walkthrough of how to aggregate and prepare data for Machine Learning using Amazon SageMaker Data Wrangler for Tabular dataset. + +### **[Timeseries DataFlow](timeseries-dataflow/readme.md)** + +This example provide quick walkthrough of how to aggregate and prepare data for Machine Learning using Amazon SageMaker Data Wrangler for Timeseries dataset. + +### **[Joined DataFlow](joined-dataflow/readme.md)** + +This example provide quick walkthrough of how to aggregate and prepare data for Machine Learning using Amazon SageMaker Data Wrangler for Joined dataset. + + diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 3993d26287..c42c90c13c 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -469,7 +469,7 @@ "In summary, we reduced the training cost by 4.75 times, and the avg. step reduced by 6.5 times. This was possible because with higher cpu count, we could use 32 data loader workers (compared to 8 with p3.2xl) to preprocess the data, and kept GPU close to 100% utilized at frequent intervals. Note: These numbers are just taken as a sample, you have to do benchmarking with your own model and dataset to come up with the exact price-performance benefits. \n", "\n", "## F. Conclusion\n", - "In this notebook, we demonstrated how to leverage heterogeneous cluster feature of SageMaker Training to achieve better price performance. To get started you can copy this example project, and only change the `train_dnn.py` script. To run the job, you could use this notebook, or the start_job.py.\n" + "In this notebook, we demonstrated how to leverage heterogeneous cluster feature of SageMaker Training to achieve better price performance. To get started you can copy this example project, and only change the `train_dnn.py` script.\n" ] }, { diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py b/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py deleted file mode 100644 index 499601afa1..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/start_job.py +++ /dev/null @@ -1,91 +0,0 @@ -import os -import json -import datetime -import os - -import sagemaker -from sagemaker.pytorch import PyTorch -from sagemaker.instance_group import InstanceGroup -from sagemaker.inputs import TrainingInput - -S3_BUCKET_DATASET='sagemaker-us-east-1-776941257690' - -IS_CLOUD_JOB = True -IS_HETRO = True -TF_DATA_MODE = 'service' if IS_HETRO else 'local' # local | service -IS_DNN_DISTRIBUTION = False - -REGION = 'us-east-1' -os.environ["AWS_DEFAULT_REGION"] = REGION - -IS_CLOUD_JOB = True -IS_HETERO = True # if set to false, uses homogeneous cluster -PT_DATA_MODE = 'service' if IS_HETERO else 'local' # local | service -IS_DNN_DISTRIBUTION = False # Distributed Training with DNN nodes not tested, set it to False - -data_group = InstanceGroup("data_group", "ml.c5.9xlarge", 1) #36 vCPU #change the instance type if IS_HETERO=True -dnn_group = InstanceGroup("dnn_group", "ml.p3.2xlarge", 1) #8 vCPU #change the instance type if IS_HETERO=True - -kwargs = dict() -kwargs['hyperparameters'] = { - "batch-size": 8192, - "num-data-workers": 32, # This number drives the avg. step time. More workers help parallel pre-processing of data. Recommendation: Total no. of cpu 'n' = 'num-data-wokers'+'grpc-workers'+ 2 (reserved) - "grpc-workers": 2, # No. of workers serving pre-processed data to DNN group (gRPC client). see above formula. - "num-dnn-workers": 2, # Modify this no. to be less than the cpu core of your training instances in dnn group - "pin-memory": True, # Pin to GPU memory - 'iterations' : 100 # No. of iterations in an epoch (must be multiple of 10). -} - -if IS_HETERO: - kwargs['instance_groups'] = [data_group, dnn_group] - entry_point='launcher.py' -else: - kwargs['instance_type'] = 'ml.p3.2xlarge' if IS_CLOUD_JOB else 'local' #change the instance type if IS_HETERO=False - kwargs['instance_count'] = 1 - entry_point='train.py' - -if IS_DNN_DISTRIBUTION: - processes_per_host_dict = { - 'ml.g5.xlarge' : 1, - 'ml.g5.12xlarge' : 4, - 'ml.p3.8xlarge' : 4, - 'ml.p4d.24xlarge' : 8, - } - kwargs['distribution'] = { - 'mpi': { - 'enabled': True, - 'processes_per_host': processes_per_host_dict[dnn_instance_type], - 'custom_mpi_options': '--NCCL_DEBUG INFO' - }, - } - if IS_HETERO: - kwargs['distribution']['instance_groups'] = [dnn_group] - - print(f"distribution={kwargs['distribution']}") - -estimator = PyTorch( - framework_version='1.11.0', # 1.10.0 or later - py_version='py38', # Python v3.8 - role='arn:aws:iam::776941257690:role/service-role/AmazonSageMakerServiceCatalogProductsUseRole', - entry_point=entry_point, - source_dir='code', - volume_size=10, - max_run=4800, - disable_profiler=True, - debugger_hook_config=False, - **kwargs, -) - -s3_input = TrainingInput( - 's3://'+S3_BUCKET_DATASET+'/cifar10-tfrecord/', - #instance_groups=['data_group'], # this training channel is created only in data_group instances (i.e., not in dnn_group instance) - input_mode='FastFile', - ) - -data_uri = s3_input if IS_CLOUD_JOB else 'file://./data/' -estimator.fit( - inputs=data_uri, - job_name='pt-heterogenous' + - '-' + 'H-' + str(IS_HETRO)[0] + - '-' + datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ"), -) diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py deleted file mode 100755 index a7c78ecc37..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/generate_cifar10_tfrecords.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"). -# You may not use this file except in compliance with the License. -# A copy of the License is located at -# -# https://aws.amazon.com/apache-2-0/ -# -# or in the "license" file accompanying this file. This file is distributed -# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -# express or implied. See the License for the specific language governing -# permissions and limitations under the License. - -import argparse -import os -import sys -import tarfile - -import tensorflow as tf -from six.moves import cPickle as pickle -from six.moves import xrange # pylint: disable=redefined-builtin - -# import tensorflow_datasets as tfds - -CIFAR_FILENAME = "cifar-10-python.tar.gz" -CIFAR_DOWNLOAD_URL = "https://www.cs.toronto.edu/~kriz/" + CIFAR_FILENAME -CIFAR_LOCAL_FOLDER = "cifar-10-batches-py" - - -def download_and_extract(data_dir): - import tensorflow_datasets as tfds - - dm = tfds.download.DownloadManager(download_dir=data_dir + "/tmp") - extract_dir = dm.download_and_extract(CIFAR_DOWNLOAD_URL) - - return extract_dir - - -def _int64_feature(value): - return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) - - -def _bytes_feature(value): - return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) - - -def _get_file_names(): - """Returns the file names expected to exist in the input_dir.""" - file_names = {} - file_names["train"] = ["data_batch_%d" % i for i in xrange(1, 5)] - file_names["validation"] = ["data_batch_5"] - file_names["eval"] = ["test_batch"] - return file_names - - -def read_pickle_from_file(filename): - # with open(filename, 'rb') as f: - with tf.io.gfile.GFile(filename, "rb") as f: - if sys.version_info >= (3, 0): - data_dict = pickle.load(f, encoding="bytes") - else: - data_dict = pickle.load(f) - return data_dict - - -def convert_to_tfrecord(input_files, output_file): - """Converts a file to TFRecords.""" - print("Generating %s" % output_file) - with tf.io.TFRecordWriter(output_file) as record_writer: - for input_file in input_files: - data_dict = read_pickle_from_file(input_file) - data = data_dict[b"data"] - labels = data_dict[b"labels"] - - num_entries_in_batch = len(labels) - for i in range(num_entries_in_batch): - example = tf.train.Example( - features=tf.train.Features( - feature={ - "image": _bytes_feature(data[i].tobytes()), - "label": _int64_feature(labels[i]), - } - ) - ) - record_writer.write(example.SerializeToString()) - - -def install_dependencies(): - from subprocess import call - - call(["pip", "install", "--upgrade", "pip"]) - call(["pip", "install", "tensorflow_datasets==4.1.0"]) - - -def main(data_dir): - print("Download from {} and extract.".format(CIFAR_DOWNLOAD_URL)) - - extract_dir = download_and_extract(data_dir) - file_names = _get_file_names() - input_dir = os.path.join(extract_dir, CIFAR_LOCAL_FOLDER) - - for mode, files in file_names.items(): - input_files = [os.path.join(input_dir, f) for f in files] - output_file = os.path.join(data_dir + "/" + mode, mode + ".tfrecords") - if not os.path.exists(data_dir + "/" + mode): - os.makedirs(data_dir + "/" + mode) - try: - os.remove(output_file) - except OSError: - pass - # Convert to tf.train.Example and write the to TFRecords. - convert_to_tfrecord(input_files, output_file) - print("Done!") - import shutil - - shutil.rmtree(data_dir + "/tmp") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--data-dir", - type=str, - default="./data", - help="Directory to download and extract CIFAR-10 to.", - ) - - args = parser.parse_args() - - install_dependencies() - - main(args.data_dir) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md b/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md index 8f87590905..ace5fb21dd 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md @@ -1,21 +1,6 @@ ## setup Open bash and navigate to `./tf.data.service.sagemaker` -Let's generate some data to train over: -```bash -python3 ./generate_cifar10_tfrecords.py --data-dir ./data -rm -rf /tmp/data.old && mv data data.old && mkdir data && cp data.old/train/train.tfrecords ./data/ && mv data.old /tmp -``` -This use SageMaker default S3 bucket to store the dataset, you may choose a different bucket -```bash -export S3_BUCKET_DATASET=$(python3 -c "import sagemaker; print(sagemaker.Session().default_bucket())") -``` -Copy the dataset to the S3 bucket: -``` -aws s3 sync ./data/ s3://${S3_BUCKET_DATASET}/cifar10-tfrecord/ -``` -If you are not using the default bucket, then edit `start_job.py` and set `S3_BUCKET_DATASET` to your prefered S3 bucket. - Set your SageMaker IAM role as an environment varaible. For example: ``` export SAGEMAKER_ROLE="arn:aws:iam::1234567890123:role/service-role/AmazonSageMaker-ExecutionRole-20171221T130536" From 2da3cd91fc1931812eb096d5bfd976efbb968c48 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 16:15:57 +0300 Subject: [PATCH 08/15] Removing local tf and pt execution exmaples --- .../hello.world.sagemaker/README.md | 18 -- .../hello.world.sagemaker/start_job.py | 32 ---- .../pt.grpc.local/README.md | 106 ----------- .../pt.grpc.local/dataset_feed.proto | 14 -- .../pt.grpc.local/dataset_feed_pb2.py | 47 ----- .../pt.grpc.local/dataset_feed_pb2_grpc.py | 99 ---------- .../pt.grpc.local/generate_proto.bash | 2 - .../pt.grpc.local/main.py | 97 ---------- .../pt.grpc.local/main_grpc_client.py | 169 ----------------- .../pt.grpc.local/main_grpc_server.py | 170 ------------------ .../pt.grpc.local/requirements.txt | 5 - .../pt.grpc.sagemaker/README.md | 6 - .../tf.data.service.local/README.md | 47 ----- .../tf.data.service.local/requirements.txt | 3 - .../run-dispatcher-and-worker.py | 68 ------- .../tf.data.service.local/train.py | 111 ------------ .../tf.data.service.sagemaker/readme.md | 17 -- .../requirements.txt | 1 - .../tf.data.service.sagemaker/start_job.py | 90 ---------- 19 files changed, 1102 deletions(-) delete mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/README.md delete mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/start_job.py delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/README.md delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py delete mode 100755 training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/main.py delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py delete mode 100644 training/heterogeneous-clusters/pt.grpc.local/requirements.txt delete mode 100644 training/heterogeneous-clusters/pt.grpc.sagemaker/README.md delete mode 100644 training/heterogeneous-clusters/tf.data.service.local/README.md delete mode 100644 training/heterogeneous-clusters/tf.data.service.local/requirements.txt delete mode 100644 training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py delete mode 100755 training/heterogeneous-clusters/tf.data.service.local/train.py delete mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md delete mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/requirements.txt delete mode 100644 training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/README.md b/training/heterogeneous-clusters/hello.world.sagemaker/README.md deleted file mode 100644 index b88b6e8269..0000000000 --- a/training/heterogeneous-clusters/hello.world.sagemaker/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Hetero Training Job - Hello world -This basic example on how to run a Heterogeneous Clusters training job consisting of two instance groups. Each instance group includes a different instance type. -Each instance prints its environmental information including its instance group and exits. -This demo doesn't include applying a distribution to one of the instance groups (e.g., for distributed training) - -Environment information can be obtained in two ways: - - `Option-1`: Read instance group information using the convinient sagemaker_training.environment.Environment class. - - `Option-2`: Read instance group information from `/opt/ml/input/config/resourceconfig.json`. - -## Running the example: -Start a SageMaker training job: -```bash -cd ./hello.world.sagemaker/ -python3 ./start_job.py -``` -Wait for the training job to finish and review its logs in the AWS Console. You'll find two logs: Algo1, Algo2. Examine the printouts on each node on how to retrieve instance group environment infomation. - -Next, See the TensorFlow or PyTorch examples. \ No newline at end of file diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py b/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py deleted file mode 100644 index 7b2d772648..0000000000 --- a/training/heterogeneous-clusters/hello.world.sagemaker/start_job.py +++ /dev/null @@ -1,32 +0,0 @@ -import datetime -from sagemaker.tensorflow import TensorFlow -from sagemaker.instance_group import InstanceGroup -import os - -REGION = 'us-east-1' -os.environ["AWS_DEFAULT_REGION"] = REGION - -# https://aws.amazon.com/sagemaker/pricing/ -data_group = InstanceGroup("data_group", "ml.c5.xlarge", 1) -dnn_group = InstanceGroup("dnn_group", "ml.m4.xlarge", 1) - -estimator = TensorFlow( - entry_point='train.py', - source_dir='./source_dir', - #instance_type='ml.m4.xlarge', - #instance_count=1, - instance_groups = [data_group, dnn_group,], - framework_version='2.9.1', - py_version='py39', - role=os.environ.get('SAGEMAKER_ROLE'), - volume_size=10, - max_run=3600, - max_wait=3600, - disable_profiler=True, - #use_spot_instances=True, -) - -estimator.fit( - job_name='hello-world-heterogenous' + - '-' + datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ"), -) diff --git a/training/heterogeneous-clusters/pt.grpc.local/README.md b/training/heterogeneous-clusters/pt.grpc.local/README.md deleted file mode 100644 index a1cadfd9b7..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/README.md +++ /dev/null @@ -1,106 +0,0 @@ -### Local Training using gRPC Client-Server - -The example here provides a conceptual idea of how to separate data preprocessing and training processes, and establish a gRPC client server communication between these components. We re-use the same client-server communication implementation in our Heterocluster SageMaker training example . To demonstrate this we first run baseline testing where both the components (data preprocessing and training) run in a set of processes (see section A). In Section B, we split data processing run on gRPC Server set of processes whereas training run on a different set of processes. - -Important: -Use a GPU based (preferably g4dn.xlarge) based SageMaker Notebook Instance, and use terminal window (File > New > Terminal). Tested on python 3.8 and Pytorch 1.10. -Note: This example does not support SageMaker "Studio" Notebook Instance. - -**Prerequsites** -Pre-requisite -Install dependent packages like pytorch, tensorboard, grpc. And, switch to working directory where all the scripts are stored. -``` -pip install -r ~/SageMaker/hetro-training/pt.grpc.local/requirements.txt -cd ~/SageMaker/hetro-training/pt.grpc.local/ -``` -A. Baseline Testing ---- - -**Step 1**: Run basic mnist training script (no gRPC implementation). -Modify the `main.py` to set: - -`BATCH_SIZE = 8192` -`ITERATIONS = 100` # No. of iterations in an epoc - must be multiple of 10s -`DATALOADER_WORKERS = 2` #equals no. of CPUs of your local instance - -And, run the following commmand line: -``` -python main.py -``` - -**Step 2**: Observe the `avg step time`. The steps/second starts printing on the console. And, stops after predefined iterations. -``` -sh-4.2$ python main.py -Training job started... -10: avg step time: 2.4617617287999565 -20: avg step time: 2.4338118159999795 -30: avg step time: 2.4230862849000006 -40: avg step time: 2.42389511962499 -50: avg step time: 2.4670148023599903 -60: avg step time: 2.494912311566668 -70: avg step time: 2.5143303409714335 -80: avg step time: 2.530583710625001 -90: avg step time: 2.5414934969444403 -100: avg step time: 2.5489751799700024 -Training completed! -``` - - -B. Split data pre-processing and training testing using gRPC Client-Server inter-process communication ---- -In this example, we are decoupling the data pre-processing component of our training job, and the deep neural network (DNN) code. This way the data processing can run on CPU instance, and DNN on GPU instance. Here by introducing concept of heterogenous instances, but demonstrated both these processes running locally. The inter-process communucation is implemented by gRPC Client-Server communication. - -**Step 1**: Run gRPC Server in a new terminal session. The set of processes wait for client to request data. On request, it read the data from `data` folder, preprocess the data, and send it to the client for training. - -``` -python main_grpc_server.py --batch-size 8192 --num-data-workers 4 --iterations 100 --grpc-workers 2 -``` -where, -`batch-size` any integer -`num-workers` based on no. of cpu per of your data pre-processing instance -`iterations` no. of iterations in an epoch - must be multiple of 10s` -`grpc-workers` no. of workers fetching the pre-processed data to DNN process (gRPC client) - -**Step 2**: Run gRPC Client in a new terminal session (File > New > Terminal) . The set of process spawend by this script fetches pre-processed data from server and runs training. Make sure you change your working directory to where code exist (..\..\pt.grpc.local). -``` -cd ~/SageMaker/hetro-training/pt.grpc.local/ -python main_grpc_client.py --batch-size 8192 --num-dnn-workers 2 --iterations 100 --model-dir ./ -``` -where, -`batch-size` any integer, must match to the size mentioned in the gRPC server process launch -`num-workers` no. of dataloader workers, it is based on no. of cpu of the dnn instance -`iterations` no. of iterations in an epoch - must be multiple of 10s, must match to the no. mentioned in the gRPC server process launch -`model-dir` location of the model to be saved - -**Step 3**: Observe the `avg step time`. The steps/second starts printing to the console. And, stops after predefined iterations. -``` -sh-4.2$ python main_grpc_client.py -Training job started... -10: avg step time: 0.43338242229997376 -20: avg step time: 0.3908786807500064 -30: avg step time: 0.3767881167999955 -40: avg step time: 0.3698345946000018 -50: avg step time: 0.3657775266399949 -60: avg step time: 0.5407461890666657 -70: avg step time: 0.6490721581571441 -80: avg step time: 0.7544923407874989 -90: avg step time: 0.8115056776666633 -100: avg step time: 0.8806567812599997 -Saving the model -Training job completed! -Shutting down data service via port 16000 -``` - -**Step 4**: Optionally, in a new terminal window, you can validate whether the gRPC client-server communication is taking place. - -``` -sh-4.2$ netstat -an | grep 6000 -tcp6 0 0 :::6000 :::* LISTEN -tcp6 0 0 ::1:47888 ::1:6000 ESTABLISHED -tcp6 0 0 ::1:47890 ::1:6000 ESTABLISHED -tcp6 0 0 ::1:6000 ::1:47890 ESTABLISHED -tcp6 0 0 ::1:6000 ::1:47888 ESTABLISHED -``` -C. Conclusion ---- -In this example, we demonstrated concepts behind Heterogeneous cluster training. First, we ran a simple all-in one training script,(contains both data preprocessing and deep neural network(DNN) components), then we separated data pre-processing and dnn components to run as two different set of processes. We expand on these concepts in our next example [**PyTorch with gRPC distributed dataloader Heterogeneous Clusters training job example**](../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb). \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto deleted file mode 100644 index 94de2cd212..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -service DatasetFeed { - rpc get_examples(Dummy) returns (stream Example) {} - rpc shutdown(Dummy) returns (Dummy) {} -} - -message Dummy { -} - -message Example { - bytes image = 1; - bytes label = 2; -} \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py deleted file mode 100644 index 78575b8888..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: dataset_feed.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64\x61taset_feed.proto\"\x07\n\x05\x44ummy\"\'\n\x07\x45xample\x12\r\n\x05image\x18\x01 \x01(\x0c\x12\r\n\x05label\x18\x02 \x01(\x0c\x32Q\n\x0b\x44\x61tasetFeed\x12$\n\x0cget_examples\x12\x06.Dummy\x1a\x08.Example\"\x00\x30\x01\x12\x1c\n\x08shutdown\x12\x06.Dummy\x1a\x06.Dummy\"\x00\x62\x06proto3') - - - -_DUMMY = DESCRIPTOR.message_types_by_name['Dummy'] -_EXAMPLE = DESCRIPTOR.message_types_by_name['Example'] -Dummy = _reflection.GeneratedProtocolMessageType('Dummy', (_message.Message,), { - 'DESCRIPTOR' : _DUMMY, - '__module__' : 'dataset_feed_pb2' - # @@protoc_insertion_point(class_scope:Dummy) - }) -_sym_db.RegisterMessage(Dummy) - -Example = _reflection.GeneratedProtocolMessageType('Example', (_message.Message,), { - 'DESCRIPTOR' : _EXAMPLE, - '__module__' : 'dataset_feed_pb2' - # @@protoc_insertion_point(class_scope:Example) - }) -_sym_db.RegisterMessage(Example) - -_DATASETFEED = DESCRIPTOR.services_by_name['DatasetFeed'] -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - _DUMMY._serialized_start=22 - _DUMMY._serialized_end=29 - _EXAMPLE._serialized_start=31 - _EXAMPLE._serialized_end=70 - _DATASETFEED._serialized_start=72 - _DATASETFEED._serialized_end=153 -# @@protoc_insertion_point(module_scope) diff --git a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py b/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py deleted file mode 100644 index b37fe7aad6..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/dataset_feed_pb2_grpc.py +++ /dev/null @@ -1,99 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" -import grpc - -import dataset_feed_pb2 as dataset__feed__pb2 - - -class DatasetFeedStub(object): - """Missing associated documentation comment in .proto file.""" - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.get_examples = channel.unary_stream( - '/DatasetFeed/get_examples', - request_serializer=dataset__feed__pb2.Dummy.SerializeToString, - response_deserializer=dataset__feed__pb2.Example.FromString, - ) - self.shutdown = channel.unary_unary( - '/DatasetFeed/shutdown', - request_serializer=dataset__feed__pb2.Dummy.SerializeToString, - response_deserializer=dataset__feed__pb2.Dummy.FromString, - ) - - -class DatasetFeedServicer(object): - """Missing associated documentation comment in .proto file.""" - - def get_examples(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def shutdown(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_DatasetFeedServicer_to_server(servicer, server): - rpc_method_handlers = { - 'get_examples': grpc.unary_stream_rpc_method_handler( - servicer.get_examples, - request_deserializer=dataset__feed__pb2.Dummy.FromString, - response_serializer=dataset__feed__pb2.Example.SerializeToString, - ), - 'shutdown': grpc.unary_unary_rpc_method_handler( - servicer.shutdown, - request_deserializer=dataset__feed__pb2.Dummy.FromString, - response_serializer=dataset__feed__pb2.Dummy.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'DatasetFeed', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - # This class is part of an EXPERIMENTAL API. -class DatasetFeed(object): - """Missing associated documentation comment in .proto file.""" - - @staticmethod - def get_examples(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/DatasetFeed/get_examples', - dataset__feed__pb2.Dummy.SerializeToString, - dataset__feed__pb2.Example.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def shutdown(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/DatasetFeed/shutdown', - dataset__feed__pb2.Dummy.SerializeToString, - dataset__feed__pb2.Dummy.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash b/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash deleted file mode 100755 index 0f0dbd5838..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/generate_proto.bash +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. dataset_feed.proto \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.local/main.py b/training/heterogeneous-clusters/pt.grpc.local/main.py deleted file mode 100644 index 13b6c86c53..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/main.py +++ /dev/null @@ -1,97 +0,0 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F -import torch.optim as optim -from torchvision import datasets, transforms -import time -import logging -import sys -import os - -BATCH_SIZE = 8192 # Integer -ITERATIONS = 100 # No. of iterations in an epoc, must be multiple of 10s -DATALOADER_WORKERS = 4 # No. of workers, equals no. of CPUs of your local instance -MODEL_DIR = './' - -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -logger.addHandler(logging.StreamHandler(sys.stdout)) - -class Net(nn.Module): - def __init__(self): - super(Net, self).__init__() - self.conv1 = nn.Conv2d(1, 32, 3, 1) - self.conv2 = nn.Conv2d(32, 64, 3, 1) - self.dropout1 = nn.Dropout(0.25) - self.dropout2 = nn.Dropout(0.5) - self.fc1 = nn.Linear(9216, 128) - self.fc2 = nn.Linear(128, 10) - def forward(self, x): - x = self.conv1(x) - x = F.relu(x) - x = self.conv2(x) - x = F.relu(x) - x = F.max_pool2d(x, 2) - x = self.dropout1(x) - x = torch.flatten(x, 1) - x = self.fc1(x) - x = F.relu(x) - x = self.fc2(x) - output = F.log_softmax(x, dim=1) - return output - -class MyMNIST(datasets.MNIST): - ''' - A personalized extension of the MNIST class in which we - modify the __len__ operation to return the maximum value - of int32 so that we do not run out of data. - ''' - def __len__(self) -> int: - import numpy as np - size = BATCH_SIZE * ITERATIONS - return size - def __getitem__(self, index: int): - return super(MyMNIST,self).__getitem__(index%len(self.data)) - -def main(): - use_cuda = torch.cuda.is_available() - device = torch.device("cuda" if use_cuda else "cpu") - train_kwargs = {'batch_size': BATCH_SIZE, - 'num_workers': DATALOADER_WORKERS, - 'pin_memory': True - } - print ('Training job started...') - transform=transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.1307,), (0.3081,)), - transforms.GaussianBlur(11) - ]) - dataset = MyMNIST('./data', train=True, download=True, - transform=transform) - train_loader = torch.utils.data.DataLoader(dataset, - **train_kwargs) - model = Net().to(device) - optimizer = optim.Adadelta(model.parameters()) - model.train() - t = time.perf_counter() - for idx, (data, target) in enumerate(train_loader, start=1): - data, target = data.to(device), target.to(device) - optimizer.zero_grad() - output = model(data) - loss = F.nll_loss(output, target) - loss.backward() - optimizer.step() - if device=='cpu' or idx % 10 == 0: - print( - f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') - print('Training completed!') - save_model(model, MODEL_DIR) - -def save_model(model, model_dir): - logger.info("Saving the model") - path = os.path.join(model_dir, "model.pth") - torch.save(model.cpu().state_dict(), path) - return - -if __name__ == '__main__': - main() diff --git a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py deleted file mode 100644 index 5af7680c02..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_client.py +++ /dev/null @@ -1,169 +0,0 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F -import torch.optim as optim -from torchvision import datasets, transforms -import time -import grpc -import dataset_feed_pb2_grpc -import dataset_feed_pb2 -import logging -import sys -import json -import os - -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -logger.addHandler(logging.StreamHandler(sys.stdout)) - -class Net(nn.Module): - def __init__(self): - super(Net, self).__init__() - self.conv1 = nn.Conv2d(1, 32, 3, 1) - self.conv2 = nn.Conv2d(32, 64, 3, 1) - self.dropout1 = nn.Dropout(0.25) - self.dropout2 = nn.Dropout(0.5) - self.fc1 = nn.Linear(9216, 128) - self.fc2 = nn.Linear(128, 10) - def forward(self, x): - x = self.conv1(x) - x = F.relu(x) - x = self.conv2(x) - x = F.relu(x) - x = F.max_pool2d(x, 2) - x = self.dropout1(x) - x = torch.flatten(x, 1) - x = self.fc1(x) - x = F.relu(x) - x = self.fc2(x) - output = F.log_softmax(x, dim=1) - return output - - -# Decode binary data from SM_CHANNEL_TRAINING -# Decode and preprocess data -# Create map dataset -class RemoteDataset(torch.utils.data.IterableDataset): - ''' - An iterable PyTorch dataset that opens a connection to the - gRPC server and reads from a stream of data batches - ''' - - def __init__(self, batch_size, iterations): - self.batch_size = batch_size - self.iterations = iterations - - - def __len__(self) -> int: - size = self.batch_size * self.iterations - return size - - def get_stub(self): - host = 'localhost' - channel = grpc.insecure_channel(f'{host}:6000', - # overwrite the default max message length - options=[('grpc.max_receive_message_length', - 200 * 1024 * 1024)]) - - try: - # print('Waiting for gRPC data server to be ready...') - grpc.channel_ready_future(channel).result(timeout=30) - except grpc.FutureTimeoutError: - print('ERROR: Timeout connecting to gRPC data server. Check that it is running.') - raise - #print('Connected to gRPC data server.') - - return dataset_feed_pb2_grpc.DatasetFeedStub(channel,) - - - def __iter__(self): - import numpy as np - - examples = self.get_stub().get_examples(dataset_feed_pb2.Dummy()) - for s in examples: - image = torch.tensor(np.frombuffer(s.image, - dtype=np.float32)).reshape( - [self.batch_size, 1, 28, 28]) - label = torch.tensor(np.frombuffer(s.label, - dtype=np.int8)).reshape( - [self.batch_size]).type(torch.int64) - yield image, label - - - # def shutdown_remote(self): - # print('Calling remote server to shutdown') - # self.get_stub().shutdown(dataset_feed_pb2.Dummy()) - -def shutdown_data_service(): - SHUTDOWN_PORT = 16000 - print('Shutting down data service via port {}'.format(SHUTDOWN_PORT)) - import socket - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(('localhost', SHUTDOWN_PORT)) - s.close() - -def main(args): - print ('Training job started...') - use_cuda = torch.cuda.is_available() - device = torch.device("cuda" if use_cuda else "cpu") - - torch.manual_seed(args.seed) - if use_cuda: - torch.cuda.manual_seed(args.seed) - - train_kwargs = {'batch_size': None, #the data is already batched - 'num_workers': args.num_dnn_workers, #no. of cpus in dnn instance type - 'pin_memory': args.pin_memory, - } - dataset = RemoteDataset(args.batch_size, args.iterations) - train_loader = torch.utils.data.DataLoader(dataset, - **train_kwargs) - model = Net().to(device) - optimizer = optim.Adadelta(model.parameters()) - model.train() - t = time.perf_counter() - for idx, (data, target) in enumerate(train_loader, start=1): - data, target = data.to(device), target.to(device) - optimizer.zero_grad() - output = model(data) - loss = F.nll_loss(output, target) - loss.backward() - optimizer.step() - if device.type == 'cpu'or idx % 10 == 0: - logger.info( - f'{idx}: avg step time: {(time.perf_counter()-t)/idx}') - - # TODO: exit the loop through the iterator stopping by itself - if idx*args.batch_size==(dataset.__len__()): - break - save_model(model, args.model_dir) - print ('Training job completed!') - shutdown_data_service() - -def save_model(model, model_dir): - logger.info("Saving the model") - path = os.path.join(model_dir, "model.pth") - torch.save(model.cpu().state_dict(), path) - return - -"This function read mode command line argument" -def read_args(): - import argparse - parser = argparse.ArgumentParser() - parser.add_argument("--batch-size", type=int, default=4, metavar="N", - help="Input batch size for training",) - parser.add_argument("--num-dnn-workers", type=int, default=1, metavar="N", - help="Based on no. of cpu per training instance",) - parser.add_argument("--pin-memory", type=bool, default=1, metavar="N", - help="Pin to GPU memory (default: True)",) - parser.add_argument("--seed", type=int, default=1, metavar="S", - help="random seed (default: 1)",) - parser.add_argument("--model-dir", type=str) - parser.add_argument("--iterations", type=int, default=10, metavar="N", - help="The number of iterations per epoch (multiples of 10)",) - parser.add_argument("--first_data_host", type=str) - args, unknown = parser.parse_known_args() - return args - -if __name__ == '__main__': - main(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py b/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py deleted file mode 100644 index 905edcd075..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/main_grpc_server.py +++ /dev/null @@ -1,170 +0,0 @@ -import multiprocessing as mp -from concurrent import futures - -import grpc -import torch -from torchvision import datasets, transforms - -import dataset_feed_pb2 -import dataset_feed_pb2_grpc -import logging -import sys - -# Logging initialization -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -logger.addHandler(logging.StreamHandler(sys.stdout)) - -# The following class implements the data feeding service -class DatasetFeedService(dataset_feed_pb2_grpc.DatasetFeedServicer): - def __init__(self, q, kill_event): - ''' - param q: A shared queue containing data batches - param kill: Kill event for graceful shutdown - ''' - self.q = q - self.kill_event = kill_event - - - def get_examples(self, request, context): - while True: - #print('DEBUG: get_examples') - example = self.q.get() - yield dataset_feed_pb2.Example(image=example[0], - label=example[1]) - - - def shutdown(self, request, context): - print("Received shutdown request - Not implemented") - # from main_grpc_client import shutdown_data_service - # shutdown_data_service() - context.set_code(grpc.StatusCode.OK) - context.set_details('Shutting down') - return dataset_feed_pb2.Dummy() - - -# The data loading and preprocessing logic. -# We chose to keep the existing logic unchanged, just instead -# of feeding the model, the dataloader feeds a shared queue -class MyMNIST(datasets.MNIST): - ''' - A personalized extension of the MNIST class in which we - modify the __len__ operation to return the maximum value - of int32 so that we do not run out of data. - ''' - - def __init__(self, batch_size : int, iterations : int, **kwargs): - - super().__init__(**kwargs) - self.batch_size = batch_size - self.iterations = iterations - - def __len__(self) -> int: - size = self.batch_size * self.iterations - return size - - def __getitem__(self, index: int): - return super(MyMNIST, self).__getitem__(index % len(self.data)) - - -def fill_queue(q,kill, args): - train_kwargs = {'batch_size': args.batch_size, - 'num_workers': args.num_data_workers} - transform=transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.1307,), (0.3081,)), - transforms.GaussianBlur(11) - ]) - dataset = MyMNIST(batch_size=args.batch_size, iterations=args.iterations, root='./data', train=True, - transform=transform, download=True) - loader = torch.utils.data.DataLoader(dataset, **train_kwargs) - for batch_idx, (data, target) in enumerate(loader): - if kill.is_set(): - print('kill signal received, exiting fill_queue') - break - added = False - while not added and not kill.is_set(): - try: - # convert the data to bytestrings and add to queue - q.put((data.numpy().tobytes(), - target.type(torch.int8).numpy().tobytes()), - timeout=1) - #print(f'DEBUG: Added example to queue') - added = True - except: - continue - print('Finished filling queue with dataset.') - - -def start(kill_event, args): - q = mp.Queue(maxsize=32) - queuing_process = mp.Process(target=fill_queue, args=(q, kill_event, args)) - queuing_process.start() - print('Started queuing process.') - - server = grpc.server(futures.ThreadPoolExecutor(max_workers=args.grpc_workers)) - dataset_feed_pb2_grpc.add_DatasetFeedServicer_to_server( - DatasetFeedService(q, kill_event), server) - server.add_insecure_port('[::]:6000') - server.start() - print('gRPC Data Server started at port 6000.') - return queuing_process,server - - -def shutdown(queuing_process, grpc_server): - print('Shutting down...') - print('Stopping gRPC server...') - grpc_server.stop(2).wait() - print('Stopping queuing process...') - queuing_process.join(1) - queuing_process.terminate() - print('Shutdown done.') - import os, time - os.system('kill %d' % os.getpid()) - time.sleep(2) - os.system('kill -9 %d' % os.getpid()) - - -def wait_for_shutdown_signal(): - SHUTDOWN_PORT = 16000 - import socket - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(('', SHUTDOWN_PORT)) - s.listen(1) - print('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) - conn, addr = s.accept() - print('Received shutdown signal from: ', addr) - try: - conn.close() - s.close() - except Exception as e: - print(e) - - -def serve(args): - kill_event = mp.Event() # an mp.Event for graceful shutdown - queue_data_loader_process, grpc_server = start(kill_event, args) - wait_for_shutdown_signal() - kill_event.set() - shutdown(queue_data_loader_process, grpc_server) - - -"This function read mode command line argument" -def read_args(): - import argparse - parser = argparse.ArgumentParser() - parser.add_argument("--batch-size", type=int, default=4, metavar="N", - help="Input batch size for training",) - parser.add_argument("--num-data-workers", type=int, default=1, metavar="N", - help="Based on no. of cpu per training instance",) - parser.add_argument("--iterations", type=int, default=10, metavar="N", - help="The number of iterations per epoch (multiples of 10)",) - parser.add_argument("--grpc-workers", type=int, default=1, metavar="N", - help="No. of gRPC server workers",) - parser.add_argument("--first_data_host", type=str) - args, unknown = parser.parse_known_args() - return args - - -if __name__ == "__main__": - serve(read_args()) diff --git a/training/heterogeneous-clusters/pt.grpc.local/requirements.txt b/training/heterogeneous-clusters/pt.grpc.local/requirements.txt deleted file mode 100644 index 2da5553f42..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.local/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -torch -torchvision -grpcio-tools -tensorboard -torch-tb-profiler \ No newline at end of file diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md b/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md deleted file mode 100644 index b9461bacd6..0000000000 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# SageMaker heterogeneous Training ("Hetero") - Pytorch example (MNIST Dataset) -This example demonstrates a more general way of offloading pre-processing to auxiliary devices using gRPC, the same protocol underlying the TensorFlow data service. We use here pytorch 1.11 framework. The job is submitted to SageMaker using Hetero feature that allows you to run one training job that includes instances of different types (for example a GPU instance like ml.p3.2xlarge and a CPU instance like c5.9xlarge). The primary use case here is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the exensive GPU, and arrive at an improved time and cost to train. - - -## Instructions -Follow steps in [notebook](./hetero-pytorch-mnist.ipynb) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/README.md b/training/heterogeneous-clusters/tf.data.service.local/README.md deleted file mode 100644 index 148558dc89..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.local/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# tf.data.service - running locally -This example runs the tf.data.service locally on your machine (not on SageMaker). This will help you understand how tf.data.service dispatcher, worker and client work. - -## setup -Open bash and navigate to `./tf.data.service.local` -```bash -cd ./tf.data.service.local -``` - -Install requirements: -```bash -pip install -r requirements.txt -``` -## Running without tf.data.service -First lets run a single training process that handles both data augmentation and NN optimization: -```bash -python3 ./train.py --mode local --model-dir /tmp -``` -Expected output: -``` -Running in local mode -1/1 [==============================] - 33s 33s/step - loss: 3.9110 -``` -## Running with tf.data.service -Now let's run the same trianing job in two process utilizing tf.data.service. - -We first run the tf.data.service dispatcher and worker processes which will handle some of the heavy data augmentation tasks: -```bash -python3 ./run-dispatcher-and-worker.py -``` -Expected output: -``` -2022-06-28 18:10:50.337939: I tensorflow/core/data/service/server_lib.cc:64] Started tf.data DispatchServer running at 0.0.0.0:6000 -2022-06-28 18:10:50.350973: I tensorflow/core/data/service/worker_impl.cc:148] Worker registered with dispatcher running at localhost:6000 -2022-06-28 18:10:50.351535: I tensorflow/core/data/service/server_lib.cc:64] Started tf.data WorkerServer running at 0.0.0.0:6001 -``` -Now let's launch the NN training script which will connect to the dispatcher to consume its data.source -```bash -python3 ./train.py --mode service --model-dir /tmp -``` -Expected output: -``` -Running in service mode -1/1 [==============================] - 34s 34s/step - loss: 3.9806 -``` -Done. -Next see [**TensorFlow's tf.data.service with Amazon SageMaker Training Heterogeneous Clusters**](../tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/requirements.txt b/training/heterogeneous-clusters/tf.data.service.local/requirements.txt deleted file mode 100644 index a28cb240dd..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.local/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -tensorflow==2.8.0 -protobuf==3.20.1 -tensorflow-addons==0.17.0 \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py b/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py deleted file mode 100644 index a1edf291bf..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.local/run-dispatcher-and-worker.py +++ /dev/null @@ -1,68 +0,0 @@ -from tensorflow.data.experimental.service import DispatchServer, WorkerServer, DispatcherConfig, WorkerConfig - -def wait_for_shutdown_signal(dispatcher, workers): - SHUTDOWN_PORT = 16000 - import socket - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(('', SHUTDOWN_PORT)) - s.listen(1) - print('Awaiting shutdown signal on port {}'.format(SHUTDOWN_PORT)) - conn, addr = s.accept() - print('Received shutdown signal from: ', addr) - try: - conn.close() - s.close() - except Exception as e: - print(e) - - if dispatcher is not None: - print('Stopping dispatcher.') - dispatcher._stop() - print('Joining dispatcher') - dispatcher.join() - - for i,worker in enumerate(workers, start=0): - print(f'Stopping worker {i}') - worker._stop() - print(f'Joining worker {i}') - worker.join() - -def create_worker(workerIndex : int, dispatcher_host : str, current_host : str) -> WorkerServer: - port = 6001 + workerIndex - w_config = WorkerConfig(port=port, - dispatcher_address=f'{dispatcher_host}:6000', - worker_address=f'{current_host}:{port}') - print(f'Starting tf.data.service WorkerServer {w_config}') - worker = WorkerServer(w_config) - return worker - -def start_dispatcher_and_worker(dispatcher_host : str, current_host : str, num_of_data_workers : int): - assert(dispatcher_host is not None) - - if current_host == dispatcher_host: - print(f'starting Dispatcher (dispatcher_host={dispatcher_host})') - d_config = DispatcherConfig(port=6000) - dispatcher = DispatchServer(d_config) - else: - dispatcher = None - - workers = [ create_worker(i, dispatcher_host, current_host) for i in range(num_of_data_workers) ] - print(f'Finished starting dispatcher and {num_of_data_workers} workers') - - wait_for_shutdown_signal(dispatcher, workers) - - -"This function read mode command line argument" -def read_args(): - import argparse, os - parser = argparse.ArgumentParser() - parser.add_argument("--dispatcher_host", type=str, default='localhost') - parser.add_argument("--current_host", type=str, default='localhost') - parser.add_argument("--num_of_data_workers", type=int, default=1) - args, unknown = parser.parse_known_args() - return args - - -if __name__ == "__main__": - args = read_args() - start_dispatcher_and_worker(args.dispatcher_host, args.current_host, args.num_of_data_workers) \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.local/train.py b/training/heterogeneous-clusters/tf.data.service.local/train.py deleted file mode 100755 index 08a9368a6c..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.local/train.py +++ /dev/null @@ -1,111 +0,0 @@ -import os -import tensorflow as tf -import tensorflow_addons as tfa -from tensorflow.keras.applications.resnet50 import ResNet50 -from tensorflow.keras.layers.experimental import preprocessing - -DISPATCHER_HOST='localhost' - -# dilation filter -def dilate(image, label): - dilateFilter = tf.zeros([3, 3, 3], tf.uint8) - image = tf.expand_dims(image, 0) - image = tf.nn.dilation2d( - image, dilateFilter, strides=[1, 1, 1, 1], - dilations=[1, 1, 1, 1], - padding='SAME', - data_format='NHWC') - image = tf.squeeze(image) - return image, label -# blur filter -def blur(image, label): - image = tfa.image.gaussian_filter2d(image=image, - filter_shape=(11, 11), sigma=0.8) - return image, label -# rescale filter -def rescale(image, label): - image = preprocessing.Rescaling(1.0 / 255)(image) - return image, label -# augmentation filters -def augment(image, label): - data_augmentation = tf.keras.Sequential( - [preprocessing.RandomFlip("horizontal"), - preprocessing.RandomRotation(0.1), - preprocessing.RandomZoom(0.1)]) - image = data_augmentation(image) - return image, label - -# This function generates a dataset consisting 32x32x3 random images -# And a corresponding random label representing 10 different classes. -# As this dataset is randomly generated, you should not expect the model -# to converge in a meaningful way, it doesn't matter as our intent is -# only to measure data pipeline and DNN optimization throughput -def generate_artificial_dataset(): - import numpy as np - x_train = np.random.randint(0, 255, size=(32000, 32, 32, 3), dtype=np.uint8) - y_train = np.random.randint(0, 10, size=(32000,1)) - train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) - return train_dataset - -def get_dataset(training_dir : str, batch_size : int, use_tf_data_service : bool, dispatcher_host : str): - autotune = tf.data.experimental.AUTOTUNE - options = tf.data.Options() - options.experimental_deterministic = False - - ds = generate_artificial_dataset().shuffle(10000).repeat() - - ds = ds.map(dilate, num_parallel_calls=autotune) - ds = ds.map(blur, num_parallel_calls=autotune) - ds = ds.map(rescale,num_parallel_calls=autotune) - ds = ds.map(augment, num_parallel_calls=autotune) - ds = ds.batch(batch_size) - - if use_tf_data_service: - ds = ds.apply(tf.data.experimental.service.distribute( - processing_mode="parallel_epochs", - service=f'grpc://{dispatcher_host}:6000',), - ) - - ds = ds.prefetch(autotune) - return ds - -"This function read mode command line argument" -def read_args(): - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--mode', type=str, default='local', - help='Mode to run the script: local or service') - parser.add_argument("--training_dir", type=str, default='data') - parser.add_argument('--batch_size', type=int, default = 2048) - parser.add_argument('--model-dir', type=str, default=os.environ.get('SM_MODEL_DIR')) - args = parser.parse_args() - return args - -def shutdown_tf_data_service(): - SHUTDOWN_PORT = 16000 - print('Shutting down tf.data.service dispatcher via port {}'.format(SHUTDOWN_PORT)) - import socket - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(('localhost', SHUTDOWN_PORT)) - s.close() - -if __name__ == "__main__": - args = read_args() - mode = args.mode - model = ResNet50(weights=None, - input_shape=(32, 32, 3), - classes=10) - model.compile(loss=tf.losses.SparseCategoricalCrossentropy(), - optimizer=tf.optimizers.Adam()) - - assert(mode == 'local' or mode == 'service') - print(f'Running in {mode} mode.') - - dataset = get_dataset(args.training_dir, batch_size = 1024, use_tf_data_service=(mode == 'service'), dispatcher_host = DISPATCHER_HOST) - - model.fit(dataset, steps_per_epoch=1, epochs=2, verbose=2) - - model.save(os.path.join(args.model_dir, '000000001'), 'my_model.h5') - - if mode == 'service': - shutdown_tf_data_service() \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md b/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md deleted file mode 100644 index ace5fb21dd..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -## setup -Open bash and navigate to `./tf.data.service.sagemaker` - -Set your SageMaker IAM role as an environment varaible. For example: -``` -export SAGEMAKER_ROLE="arn:aws:iam::1234567890123:role/service-role/AmazonSageMaker-ExecutionRole-20171221T130536" -``` - -Start a homogeneous training job -``` -python '/Users/gili/dev/hetro-training/tf.data.service.sagemaker/start_job.py' --tf_data_mode local --is_cloud_job --no-is_hetero --num_of_data_workers 0 --num_of_data_instances 0 --batch_size 1024 -``` - -Start a heterogeneous training job -``` -python '/Users/gili/dev/hetro-training/tf.data.service.sagemaker/start_job.py' --tf_data_mode service --is_cloud_job --is_hetero --num_of_data_workers 2 --num_of_data_instances 2 --batch_size 1024 -``` \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/requirements.txt b/training/heterogeneous-clusters/tf.data.service.sagemaker/requirements.txt deleted file mode 100644 index 1fe7f0301f..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -sagemaker-training \ No newline at end of file diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py b/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py deleted file mode 100644 index efbe852ce0..0000000000 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/start_job.py +++ /dev/null @@ -1,90 +0,0 @@ -import datetime -from sagemaker.tensorflow import TensorFlow -from sagemaker.instance_group import InstanceGroup -import os -import argparse -from start_job_utils import fit_with_retries - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument('--tf_data_mode', type=str, default='local', - help="'service' distributed dataset using tf.data.service. 'local' use standard tf.data") - parser.add_argument('--is_cloud_job', default=True, action=argparse.BooleanOptionalAction, - help="True to run in the cloud, False to run on local machine") - parser.add_argument('--is_hetero', default=True, action=argparse.BooleanOptionalAction, - help="True to run in the heterogeneous mode (GPU + CPU instances), False when running in the homogeneous mode (GPU instances only)") - parser.add_argument("--num_of_data_workers", type=int, default=1) - parser.add_argument("--num_of_data_instances", type=int, default=1) - parser.add_argument("--batch_size", type=int, default=1024) - - parser.add_argument("--training_dir", type=str, default='data') - args = parser.parse_args() - - assert args.is_cloud_job or not args.is_hetero, 'Heterogeneous cluster is not supported in sagemaker local mode' - assert args.is_hetero or args.tf_data_mode == 'local', 'TODO: tf.data.service not implemented in homogeneous cluster yet' - - REGION = 'us-east-1' - os.environ["AWS_DEFAULT_REGION"] = REGION - dnn_instance_type = 'ml.p4d.24xlarge' if args.is_cloud_job else 'local_gpu' # @see: https://aws.amazon.com/sagemaker/pricing/ - data_instance_type = "ml.c5.18xlarge" - - # Group for CPU instances that will run tf.data.service dispatcher/workers processes. - data_group = InstanceGroup("data_group", data_instance_type, args.num_of_data_instances) if args.is_hetero else None - # Group for deep neural network (dnn) with accleartors (e.g., GPU, FPGA, etc.) - dnn_group = InstanceGroup("dnn_group", dnn_instance_type, 1) if args.is_hetero else None - - kwargs = dict() - kwargs['hyperparameters'] = { - 'epochs' : 3, - 'steps_per_epoch' : 500, - 'num_of_data_workers' : args.num_of_data_workers, # How many tf.data.server Workers to start - 'batch_size' : args.batch_size, - 'tf_data_mode' : args.tf_data_mode, - } - - if args.is_hetero: - print(f'args.is_hetero = {args.is_hetero}') - kwargs['instance_groups'] = [data_group, dnn_group] - else: - kwargs['instance_type'] = dnn_instance_type if args.is_cloud_job else 'local' - kwargs['instance_count'] = 1 - - processes_per_host_dict = { - 'ml.g5.xlarge' : 1, - 'ml.g5.12xlarge' : 4, - 'ml.p3.8xlarge' : 4, - 'ml.p4d.24xlarge' : 8, - } - kwargs['distribution'] = { - 'mpi': { - 'enabled': True, - 'processes_per_host': processes_per_host_dict[dnn_instance_type], - 'custom_mpi_options': '--NCCL_DEBUG WARN' - }, - } - if args.is_hetero: - # Start an MPI cluster only DNN instance group only - kwargs['distribution']['instance_groups'] = [dnn_group] # type: ignore - - print(f"distribution={kwargs['distribution']}") - - print(f'kwargs={kwargs}') - estimator = TensorFlow( - entry_point='launcher.py', - source_dir='./code', - framework_version='2.9.1', - py_version='py39', - role=os.environ.get('SAGEMAKER_ROLE'), - volume_size=30, - max_run=1800, - disable_profiler=True, - **kwargs, - ) - - job_name=f'hetero-tf-data-{args.tf_data_mode}-Dnode{args.num_of_data_instances}-wrkrs-{args.num_of_data_workers}-{datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")}' - - fit_with_retries(5, estimator, job_name=job_name) - - - - From 9bc6d34405f139d6965665f3556e5893eff0eaf4 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 16:17:09 +0300 Subject: [PATCH 09/15] Add security group info for private VPC use case --- .../helloworld-example.ipynb | 458 ++++++++++++++++++ .../hetero-pytorch-mnist.ipynb | 31 +- .../hetero-tensorflow-restnet50.ipynb | 104 ++-- 3 files changed, 529 insertions(+), 64 deletions(-) create mode 100644 training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb new file mode 100644 index 0000000000..f14984795c --- /dev/null +++ b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb @@ -0,0 +1,458 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Heterogeneous Cluster - a hello world training job\n", + "\n", + "This basic example on how to run a Heterogeneous Clusters training job consisting of two instance groups. Each instance group includes a different instance type. Each instance prints its environment information including its instance group and exits.\n", + "\n", + "You can retrieve environment information in either of the following ways:\n", + " - **Option 1**: Read instance group information using the convenient `sagemaker_training.environment.Environment` class.\n", + " - **Option 2**: Read instance group information from `/opt/ml/input/config/resourceconfig.json`.\n", + " \n", + " \n", + "Note: This notebook does not demonstrate offloading of data preprocessing job to data group and deep neural network training to dnn_group. We will cover those examples in [TensorFlow's tf.data.service based Amazon SageMaker Heterogeneous Clusters for training](../tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb) and [PyTorch and gRPC distributed dataloader based Amazon SageMaker Heterogeneous Clusters for training](../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb) notebooks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A. Setting up SageMaker Studio notebook\n", + "#### Before you start\n", + "Ensure you have selected Python 3 (_TensorFlow 2.6 Python 3.8 CPU Optimized_) image for your SageMaker Studio Notebook instance, and running on _ml.t3.medium_ instance type.\n", + "\n", + "#### Step 1 - Upgrade SageMaker SDK and dependent packages\n", + "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. This feature release requires you to have updated SageMaker SDK and boto3 client libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: boto3 in /usr/local/lib/python3.8/site-packages (1.24.72)\n", + "Collecting boto3\n", + " Downloading boto3-1.24.83-py3-none-any.whl (132 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 kB 2.5 MB/s eta 0:00:00\n", + "Requirement already satisfied: botocore in /usr/local/lib/python3.8/site-packages (1.27.72)\n", + "Collecting botocore\n", + " Downloading botocore-1.27.83-py3-none-any.whl (9.2 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2/9.2 MB 42.5 MB/s eta 0:00:00\n", + "Requirement already satisfied: awscli in /usr/local/lib/python3.8/site-packages (1.25.73)\n", + "Collecting awscli\n", + " Downloading awscli-1.25.84-py3-none-any.whl (3.9 MB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 35.4 MB/s eta 0:00:00\n", + "Requirement already satisfied: sagemaker in /usr/local/lib/python3.8/site-packages (2.109.0)\n", + "Collecting sagemaker\n", + " Downloading sagemaker-2.110.0.tar.gz (576 kB)\n", + " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 576.0/576.0 kB 9.9 MB/s eta 0:00:00\n", + " Preparing metadata (setup.py): started\n", + " Preparing metadata (setup.py): finished with status 'done'\n", + "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /usr/local/lib/python3.8/site-packages (from boto3) (0.6.0)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/local/lib/python3.8/site-packages (from boto3) (0.10.0)\n", + "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /usr/local/lib/python3.8/site-packages (from botocore) (1.25.11)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.8/site-packages (from botocore) (2.8.2)\n", + "Requirement already satisfied: colorama<0.4.5,>=0.2.5 in /usr/local/lib/python3.8/site-packages (from awscli) (0.4.3)\n", + "Requirement already satisfied: PyYAML<5.5,>=3.10 in /usr/local/lib/python3.8/site-packages (from awscli) (5.4.1)\n", + "Requirement already satisfied: docutils<0.17,>=0.10 in /usr/local/lib/python3.8/site-packages (from awscli) (0.15.2)\n", + "Requirement already satisfied: rsa<4.8,>=3.1.2 in /usr/local/lib/python3.8/site-packages (from awscli) (4.7.2)\n", + "Requirement already satisfied: attrs<22,>=20.3.0 in /usr/local/lib/python3.8/site-packages (from sagemaker) (21.2.0)\n", + "Requirement already satisfied: google-pasta in /usr/local/lib/python3.8/site-packages (from sagemaker) (0.2.0)\n", + "Requirement already satisfied: numpy<2.0,>=1.9.0 in /usr/local/lib/python3.8/site-packages (from sagemaker) (1.19.5)\n", + "Requirement already satisfied: protobuf<4.0,>=3.1 in /usr/local/lib/python3.8/site-packages (from sagemaker) (3.19.1)\n", + "Requirement already satisfied: protobuf3-to-dict<1.0,>=0.1.5 in /usr/local/lib/python3.8/site-packages (from sagemaker) (0.1.5)\n", + "Requirement already satisfied: smdebug_rulesconfig==1.0.1 in /usr/local/lib/python3.8/site-packages (from sagemaker) (1.0.1)\n", + "Requirement already satisfied: importlib-metadata<5.0,>=1.4.0 in /usr/local/lib/python3.8/site-packages (from sagemaker) (4.8.2)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.8/site-packages (from sagemaker) (21.3)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.8/site-packages (from sagemaker) (1.2.5)\n", + "Requirement already satisfied: pathos in /usr/local/lib/python3.8/site-packages (from sagemaker) (0.2.8)\n", + "Collecting schema\n", + " Downloading schema-0.7.5-py2.py3-none-any.whl (17 kB)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.8/site-packages (from importlib-metadata<5.0,>=1.4.0->sagemaker) (3.6.0)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.8/site-packages (from packaging>=20.0->sagemaker) (3.0.6)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.8/site-packages (from protobuf3-to-dict<1.0,>=0.1.5->sagemaker) (1.16.0)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.8/site-packages (from rsa<4.8,>=3.1.2->awscli) (0.4.8)\n", + "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/site-packages (from pandas->sagemaker) (2021.3)\n", + "Requirement already satisfied: dill>=0.3.4 in /usr/local/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.4)\n", + "Requirement already satisfied: ppft>=1.6.6.4 in /usr/local/lib/python3.8/site-packages (from pathos->sagemaker) (1.6.6.4)\n", + "Requirement already satisfied: pox>=0.3.0 in /usr/local/lib/python3.8/site-packages (from pathos->sagemaker) (0.3.0)\n", + "Requirement already satisfied: multiprocess>=0.70.12 in /usr/local/lib/python3.8/site-packages (from pathos->sagemaker) (0.70.12.2)\n", + "Collecting contextlib2>=0.5.5\n", + " Downloading contextlib2-21.6.0-py2.py3-none-any.whl (13 kB)\n", + "Building wheels for collected packages: sagemaker\n", + " Building wheel for sagemaker (setup.py): started\n", + " Building wheel for sagemaker (setup.py): finished with status 'done'\n", + " Created wheel for sagemaker: filename=sagemaker-2.110.0-py2.py3-none-any.whl size=791666 sha256=5e4f859fef28f399b5eb60568410a22ddb2c42bbc357d0b3eae61587a14ca679\n", + " Stored in directory: /root/.cache/pip/wheels/ad/56/4f/4c5b1ed9fb3a725a634741aa293beb6fad882af965e2ccb6ae\n", + "Successfully built sagemaker\n", + "Installing collected packages: contextlib2, schema, botocore, boto3, awscli, sagemaker\n", + " Attempting uninstall: botocore\n", + " Found existing installation: botocore 1.27.72\n", + " Uninstalling botocore-1.27.72:\n", + " Successfully uninstalled botocore-1.27.72\n", + " Attempting uninstall: boto3\n", + " Found existing installation: boto3 1.24.72\n", + " Uninstalling boto3-1.24.72:\n", + " Successfully uninstalled boto3-1.24.72\n", + " Attempting uninstall: awscli\n", + " Found existing installation: awscli 1.25.73\n", + " Uninstalling awscli-1.25.73:\n", + " Successfully uninstalled awscli-1.25.73\n", + " Attempting uninstall: sagemaker\n", + " Found existing installation: sagemaker 2.109.0\n", + " Uninstalling sagemaker-2.109.0:\n", + " Successfully uninstalled sagemaker-2.109.0\n", + "Successfully installed awscli-1.25.84 boto3-1.24.83 botocore-1.27.83 contextlib2-21.6.0 sagemaker-2.110.0 schema-0.7.5\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: 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\n" + ] + } + ], + "source": [ + "%%bash\n", + "python3 -m pip install --upgrade boto3 botocore awscli sagemaker" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 2 - Restart the notebook kernel \n", + "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 3 - Validate SageMaker Python SDK and TensorFlow versions\n", + "Ensure the output of the cell below reflects:\n", + "\n", + "- SageMaker Python SDK version 2.98.0 or above, \n", + "- boto3 1.24 or above \n", + "- botocore 1.27 or above \n", + "- TensorFlow 2.6 or above " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: sagemaker\n", + "Version: 2.110.0\n", + "---\n", + "Name: boto3\n", + "Version: 1.24.83\n", + "---\n", + "Name: botocore\n", + "Version: 1.27.83\n", + "---\n", + "Name: tensorflow\n", + "Version: 2.6.2\n", + "---\n", + "Name: protobuf\n", + "Version: 3.19.1\n" + ] + } + ], + "source": [ + "!pip show sagemaker boto3 botocore tensorflow protobuf |egrep 'Name|Version|---'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### B. Run a heterogeneous cluster training job\n", + "\n", + "#### Step 1: Set up training environment\n", + "Import the required libraries that enable you to use Heterogeneous clusters for training. In this step, you are also inheriting this notebook's IAM role and SageMaker session. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import datetime\n", + "\n", + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "from sagemaker.tensorflow import TensorFlow\n", + "from sagemaker.instance_group import InstanceGroup\n", + "\n", + "sess = sagemaker.Session()\n", + "role = get_execution_role()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 2: Define instance groups \n", + "Here we define instance groups. Each instance group includes a different instance type." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "data_group = InstanceGroup(\"data_group\", \"ml.c5.xlarge\", 1)\n", + "dnn_group = InstanceGroup(\"dnn_group\", \"ml.m4.xlarge\", 1) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 3: Review the \"hello world\" training code" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[34mimport\u001b[39;49;00m \u001b[04m\u001b[36mjson\u001b[39;49;00m\n", + "\u001b[34mimport\u001b[39;49;00m \u001b[04m\u001b[36mos\u001b[39;49;00m\n", + "\u001b[34mimport\u001b[39;49;00m \u001b[04m\u001b[36msys\u001b[39;49;00m\n", + "\u001b[34mfrom\u001b[39;49;00m \u001b[04m\u001b[36msagemaker_training\u001b[39;49;00m \u001b[34mimport\u001b[39;49;00m environment \u001b[37m# This module is present on the DLC images, or you can install it with pip install sagemaker_training\u001b[39;49;00m\n", + "\n", + "\u001b[34mif\u001b[39;49;00m \u001b[31m__name__\u001b[39;49;00m == \u001b[33m\"\u001b[39;49;00m\u001b[33m__main__\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m:\n", + " \n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33m\"\u001b[39;49;00m\u001b[33mOption-1: Read instance group information from the sagemaker_training.environment.Environment class\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " env = environment.Environment() \n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.is_hetero: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.is_hetero\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_host: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.current_host\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_instance_type: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.current_instance_type\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_instance_group: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.current_instance_group\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_instance_group_hosts: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.current_instance_group_hosts\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.instance_groups: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.instance_groups\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.instance_groups_dict: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.instance_groups_dict\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.distribution_hosts: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.distribution_hosts\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.distribution_instance_groups: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00menv.distribution_instance_groups\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \n", + "\n", + " file_path = \u001b[33m'\u001b[39;49;00m\u001b[33m/opt/ml/input/config/resourceconfig.json\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33m\"\u001b[39;49;00m\u001b[33mOption-2: Read instance group information from \u001b[39;49;00m\u001b[33m{file_path}\u001b[39;49;00m\u001b[33m.\u001b[39;49;00m\u001b[33m\\\u001b[39;49;00m\n", + "\u001b[33m You\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[33mll need to parse the json yourself. This doesn\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[33mt require an additional library.\u001b[39;49;00m\u001b[33m\\n\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \n", + " \u001b[34mwith\u001b[39;49;00m \u001b[36mopen\u001b[39;49;00m(file_path, \u001b[33m'\u001b[39;49;00m\u001b[33mr\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m) \u001b[34mas\u001b[39;49;00m f:\n", + " config = json.load(f)\n", + "\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[33m{\u001b[39;49;00mfile_path\u001b[33m}\u001b[39;49;00m\u001b[33m dump = \u001b[39;49;00m\u001b[33m{\u001b[39;49;00mjson.dumps(config, indent=\u001b[34m4\u001b[39;49;00m, sort_keys=\u001b[34mTrue\u001b[39;49;00m)\u001b[33m}\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m)\n", + " \n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.is_hetero: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[33minstance_groups\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m \u001b[35min\u001b[39;49;00m config\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33mcurrent_host=\u001b[39;49;00m\u001b[33m{\u001b[39;49;00mconfig[\u001b[33m'\u001b[39;49;00m\u001b[33mcurrent_host\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m]\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33mcurrent_instance_type=\u001b[39;49;00m\u001b[33m{\u001b[39;49;00mconfig[\u001b[33m'\u001b[39;49;00m\u001b[33mcurrent_instance_type\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m]\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_instance_group: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00mconfig[\u001b[33m'\u001b[39;49;00m\u001b[33mcurrent_group_name\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m]\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.current_instance_group_hosts: TODO\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.instance_groups: TODO\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.instance_groups_dict: \u001b[39;49;00m\u001b[33m{\u001b[39;49;00mconfig[\u001b[33m'\u001b[39;49;00m\u001b[33minstance_groups\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m]\u001b[33m}\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.distribution_hosts: TODO\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n", + " \u001b[36mprint\u001b[39;49;00m(\u001b[33mf\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[33menv.distribution_instance_groups: TODO\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\n" + ] + } + ], + "source": [ + "!pygmentize source_dir/train.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 4: Configure the Estimator\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "estimator = TensorFlow(\n", + " entry_point='train.py',\n", + " source_dir='./source_dir',\n", + " #instance_type='ml.m4.xlarge',\n", + " #instance_count=1,\n", + " instance_groups = [data_group, dnn_group,],\n", + " framework_version='2.9.1',\n", + " py_version='py39',\n", + " role=role,\n", + " volume_size=10,\n", + " max_run=3600,\n", + " disable_profiler=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 5: Submit the training job\n", + "Here you are submitting the heterogeneous cluster training job. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-30 17:23:58 Starting - Starting the training job...\n", + "2022-09-30 17:24:26 Starting - Preparing the instances for training.........\n", + "2022-09-30 17:25:56 Downloading - Downloading input data...\n", + "2022-09-30 17:26:22 Training - Downloading the training image...............\n", + "2022-09-30 17:28:53 Training - Training image download completed. Training in progress....\n", + "2022-09-30 17:29:24 Uploading - Uploading generated training model\n", + "2022-09-30 17:29:24 Completed - Training job completed\n", + "..Training seconds: 0\n", + "Billable seconds: 0\n" + ] + } + ], + "source": [ + "estimator.fit(\n", + " job_name='hello-world-heterogenous' + \n", + " '-' + datetime.datetime.utcnow().strftime(\"%Y%m%dT%H%M%SZ\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Step 6: Review the logs for environment information\n", + "\n", + "Wait for the training job to finish, and review its logs in the AWS Console (click on **View logs** from the **Training Jobs** node in **Amazon SageMaker Console**) You'll find two logs: Algo1, Algo2. Examine the printouts on each node on how to retrieve instance group environment information. An example is shown here:\n", + "\n", + "```\n", + "Option-1: Read instance group information from the sagemaker_training.environment.Environment class\n", + "env.is_hetero: True\n", + "env.current_host: algo-1\n", + "env.current_instance_type: ml.c5.xlarge\n", + "env.current_instance_group: data_group\n", + "env.current_instance_group_hosts: ['algo-1']\n", + "env.instance_groups: ['data_group', 'dnn_group']\n", + "\n", + "Option-2: Read instance group information from {file_path}. You'll need to parse the json yourself. This doesn't require an additional library.\n", + "/opt/ml/input/config/resourceconfig.json dump = {\n", + " \"current_group_name\": \"data_group\",\n", + " \"current_host\": \"algo-1\",\n", + " \"current_instance_type\": \"ml.c5.xlarge\",\n", + " \"hosts\": [\n", + " \"algo-1\",\n", + " \"algo-2\"\n", + " ],\n", + " \"instance_groups\": [\n", + " {\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"instance_group_name\": \"data_group\",\n", + " \"instance_type\": \"ml.c5.xlarge\"\n", + " },\n", + " {\n", + " \"hosts\": [\n", + " \"algo-2\"\n", + " ],\n", + " \"instance_group_name\": \"dnn_group\",\n", + " \"instance_type\": \"ml.m4.xlarge\"\n", + " }\n", + " ],\n", + " \"network_interface_name\": \"eth0\"\n", + "}\n", + "env.is_hetero: True\n", + "current_host=algo-1\n", + "current_instance_type=ml.c5.xlarge\n", + "env.current_instance_group: data_group\n", + "env.current_instance_group_hosts: TODO\n", + "env.instance_groups: TODO\n", + "env.instance_groups_dict: [{'instance_group_name': 'data_group', 'instance_type': 'ml.c5.xlarge', 'hosts': ['algo-1']}, {'instance_group_name': 'dnn_group', 'instance_type': 'ml.m4.xlarge', 'hosts': ['algo-2']}]\n", + "env.distribution_hosts: TODO\n", + "env.distribution_instance_groups: TODO\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### C. Next steps\n", + "\n", + "In this notebook, we demonstrated how to retrieve the environment information, and differentiate which instance group an instance belongs to. Based on this, you can build logic to offload data processing tasks in your training job to a dedicated instance group. To understand how that can be done with a real-world example, we suggest going through the following notebook examples: \n", + "\n", + "- [TensorFlow's tf.data.service based Amazon SageMaker Heterogeneous Clusters for training](../tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb)\n", + "- [PyTorch and gRPC distributed dataloader based Amazon SageMaker Heterogeneous Clusters for training](../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb)" + ] + } + ], + "metadata": { + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3.9.7 ('.venv': venv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "vscode": { + "interpreter": { + "hash": "77c0de85c2cb739aa5100af7b92fb9d2075368f0e653f4148499a56c989df5f7" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index c42c90c13c..f6e92d16d2 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -13,6 +13,14 @@ "\n", "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch 1.10. The notebook works on Python 3 (_PyTorch 1.10 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", "\n", + "The notebook covers:\n", + "- Setting up SageMaker Studio Notebook \n", + "- Setting up the Training environment \n", + "- Submit a Training job\n", + "- Monitor and visualize the CloudWatch metrics\n", + "- Comparing time-to-train and cost-to-train\n", + "- Conclusion \n", + "\n", "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/MNIST). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", "\n", "

\n", @@ -53,16 +61,19 @@ "  - `train_data.py`, `dataset_feed_pb2.py`, `dataset_feed_pb2_grpc.py`: these scripts run on the data_group nodes and responsible for setting up grpc-server, start and shutdown.\n", "  - `train_dnn.py`: this script runs dnn code on the training data set. It fetches preprocessed data from the data_group node as a stream using gRPC client-server communication. It also sends a shutdown request after all the iterations on the preprocessed training data set. \n", "  - `requirement.txt`: defines package required for gRPC \n", - "  - `train.py`: this script is the entry point script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. \n", - "\n", - "At a high level, the notebook covers:\n", - "- Setting up SageMaker Studio Notebook \n", - "- Setting up the Training environment \n", - "- Submit a Training job\n", - "- Monitor and visualize the CloudWatch metrics\n", - "- Comparing time-to-train and cost-to-train\n", - "- Conclusion \n", - "---\n" + "  - `train.py`: this script is the entry point script for SageMaker homogeneous cluster training. This script is picked up when you choose IS_HETERO = False. This uses a local dataset and runs both data pre-processing and a dnn component on the same node. " + ] + }, + { + "cell_type": "markdown", + "id": "1f98cde9", + "metadata": {}, + "source": [ + "### security groups update if running in private VPC\n", + "This section is relevant if you plan to [run in a private VPC](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) (passing `subnets` and `security_group_ids` parameters when defining an Estimator). \n", + "SageMaker documentation recommends you [add](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html#train-vpc-vpc) a rule for your security group that allows inbound connections between members of the same security group, for all TCP communication. This will also cover for the gRPC related traffic between instances:\n", + "- the data_group instances will listen on port 6000 for connections from all nodes. This stream is not encrypted. You can change the code to encrypted the connection if needed.\n", + "- the data_group intances listen on port 16000 for a shutdown signal from all nodes." ] }, { diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 3f4e77f91a..73f1061a55 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -17,12 +17,39 @@ "\n", "\n", "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook covers:\n", + "- A guide to switching from a homogeneous job (single instance type) to a heterogeneous job (multiple instance types)\n", + "- Explaining to use Heterogeneous clusters with TensorFlow's tf.data.service\n", + "- Set up Amazon SageMaker Studio Notebook \n", + "- Run homogeneous cluster training job \n", + "- Run heterogeneous cluster training job \n", + "- Compare time and cost to train between homogeneous and heterogeneous clusters\n", + "- Conclusion\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A guide to switching from a homogeneous to a heterogeneous job\n", + "\n", + "This notebook runs and compares these two workloads:\n", "
\n", " \n", " \n", " \n", " \n", " \n", @@ -32,24 +59,11 @@ " \n", " \n", "
Homogeneous Training Job
\n", " In a Homogeneous training job the ml.p4d.24xlarge instance GPUs are under-utilized due to a CPU bottleneck.
Heterogeneous Training Job
\n", - " In a Heterogeneous training job, we add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and drive up GPU usage, to improve training speed cost-efficiency.\n", + " In a Heterogeneous training job, we add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and increase GPU usage, to improve training speed cost-efficiency.\n", "
\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Workload Details\n", - "Training data is an artificially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neural network optimization throughput expressed in epoch/step time. \n", - "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The job runs on an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setting up heterogeneous clusters training\n", - "To switch to heterogeneous clusters, we'll define two `instance_groups`:\n", + "\n", + "In each workload: Training data is an artificially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neural network optimization throughput expressed in epoch/step time. \n", + "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The workloads uses an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. \n", + "\n", + "The heterogeneous job will include two instance groups:\n", "- **data_group** - A group of CPU instances that will run data pre-processing code.\n", "- **dnn_group** - A group of GPU instances that will run Deep Neural Network training code.\n", "\n", @@ -66,46 +80,24 @@ "`tf.data.service Dispatcher` - The dispatcher server acts as the control plain for tf.data.service; Being responsible for registering worker servers and assigning preprocessing tasks to them. Each training job has a single Dispatcher running in the first instance of the `data_group` and listens on port 6000.\n", "`tf.data.service Workers` - Worker servers carry out the data processing. Each instance could have one or more workers (listen on port 6001/6002/...).\n", "\n", - "#### Defining what part of your pipeline runs in which instance\n", - " Applying `tf.data.experimental.service.distribute` to your dataset, you can program the dataset to run all preprocessing operations up to the point of application, on the workers. \n", - " As all instances will run a tf.data.service Worker, all instances will need access to a dataset you'll make available through a SageMaker training data channel. You do have the option of limiting which instance group will see which training data channel.\n", + "##### Defining what part of your pipeline runs in which instance group\n", + " When you apply `tf.data.experimental.service.distribute()` on your dataset, all preprocessing operations defined up to the apply will run on the tf.data.service workers, and all dataset operations defined afterwords will run on the local process. All instances will need access to a dataset you'll make available through a SageMaker training data channel. You do have the option of limiting which instance group will see which training data channel.\n", "\n", "The below figure shows sequence of events of setting up and running in a tf.data.service based heterogeneous cluster training job.\n", "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "**NOTE**\n", - "\n", - "As an alternative to this notebook, you can follow (readme.md)[./readme.md] which allows you to set up and launch the training job from an IDE or command line. \n", - "\n", - "---" + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "At a high level, the notebook covers:\n", - "- Set up Amazon SageMaker Studio Notebook \n", - "- Run homogeneous cluster training job \n", - " - Setting up the Training environment\n", - " - Submitting the Training job\n", - " - Monitor and visualize the CloudWatch metrics\n", - "- Run heterogeneous cluster training job \n", - " - Setting up the Training environment\n", - " - Submitting the Training job\n", - " - Monitor and visualize the CloudWatch metrics\n", - "- Compare time-to-train and cost-to-train\n", - "- Conclusion\n", - "\n", - "---" + "### security groups update if running in private VPC\n", + "This section is relevant if you plan to [run in a private VPC](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) (passing `subnets` and `security_group_ids` parameters when defining an Estimator). \n", + "SageMaker documentation recommends you [add](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html#train-vpc-vpc) a rule for your security group that allows inbound connections between members of the same security group, for all TCP communication. This will also cover for the tf.data.service related traffic between instances:\n", + "- tf.data.service Dispatcher node will listen for incoming connections on port 6000 (configurable) from all nodes.\n", + "- tf.data.service Workers will listen on ports 6001-6006 from all nodes.\n", + "- Each node listens on port 16000 for a tf.data.service shutdown signal from all nodes." ] }, { @@ -117,7 +109,7 @@ "Ensure you have selected Python 3 (_TensorFlow 2.6 Python 3.8 CPU Optimized_) image for your SageMaker Studio Notebook instance, and running on _ml.t3.medium_ instance type.\n", "\n", "#### Step 1 - Upgrade SageMaker SDK and dependent packages \n", - "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. This feature release requires you to have updated SageMaker SDK, PyTorch, and Boto3 client." + "Heterogeneous Clusters for Amazon SageMaker model training was [announced](https://aws.amazon.com/about-aws/whats-new/2022/07/announcing-heterogeneous-clusters-amazon-sagemaker-model-training) on 07/08/2022. This feature release requires you to have updated SageMaker SDK, Boto3 client." ] }, { @@ -265,7 +257,6 @@ "import os\n", "import json\n", "import datetime\n", - "import os\n", "\n", "import sagemaker\n", "from sagemaker import get_execution_role\n", @@ -281,7 +272,7 @@ "source": [ "### C. Run a homogeneous training job\n", "#### Step 1: Set up the training environment\n", - "In this step, we define and submit a homogeneous training job. It uses a single instance type (p4d.24xlarge) with 8 GPUs, and analysis shows that is CPU bound causing its GPUs being underutilized." + "In this step, we define and submit a homogeneous training job. It uses a single instance type (p4d.24xlarge) with 8 GPUs. The analysis of the job will shows that it is CPU bound and therefore its GPUs are underutilized." ] }, { @@ -337,7 +328,12 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, "outputs": [ { "name": "stdout", From 3415bd9c07f86b48bbad0fb6d03989ee046d15c8 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 17:11:30 +0300 Subject: [PATCH 10/15] Adding index.rst for heterogeneous clusters --- index.rst | 2 +- training/heterogeneous-clusters/README.md | 11 ++++- training/heterogeneous-clusters/index.rst | 58 +++++++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 training/heterogeneous-clusters/index.rst diff --git a/index.rst b/index.rst index e153475283..53ddf2b0de 100644 --- a/index.rst +++ b/index.rst @@ -185,7 +185,7 @@ More examples sagemaker-script-mode/index training/bring_your_own_container training/management - + training/heterogeneous-clusters/index .. toctree:: :maxdepth: 1 diff --git a/training/heterogeneous-clusters/README.md b/training/heterogeneous-clusters/README.md index 409ba699f3..8fc73d4764 100644 --- a/training/heterogeneous-clusters/README.md +++ b/training/heterogeneous-clusters/README.md @@ -1,5 +1,12 @@ -# SageMaker Heterogeneous Clusters Training -SageMaker Training Heterogeneous Clusters allows you to run one training job that includes instances of different types (for example a GPU instance like ml.p4d.24xlarge and a CPU instance like c5.18xlarge). One primary use case is offloading CPU intensive tasks like image pre-processing (data augmentation) from the GPU instance to a dedicate CPU instance, so you can fully utilize the expensive GPUs, and arrive at an improved time and cost to train. +# Heterogeneous Clusters +SageMaker Training Heterogeneous Clusters allows you to run one training job +that includes instances of different types. For example a GPU instance like +ml.p4d.24xlarge and a CPU instance like c5.18xlarge. + +One primary use case is offloading CPU intensive tasks like image +pre-processing (data augmentation) from the GPU instance to a dedicate +CPU instance, so you can fully utilize the expensive GPUs, and arrive at +an improved time and cost to train. You'll find TensorFlow (tf.data.service) and PyTorch (a customer gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. You can reuse these examples when enabling your own training workload to use heterogeneous clusters. diff --git a/training/heterogeneous-clusters/index.rst b/training/heterogeneous-clusters/index.rst new file mode 100644 index 0000000000..d384129d0b --- /dev/null +++ b/training/heterogeneous-clusters/index.rst @@ -0,0 +1,58 @@ +#################### +Heterogeneous Clusters +#################### + +SageMaker Training Heterogeneous Clusters allows you to run one training job +that includes instances of different types. For example a GPU instance like +ml.p4d.24xlarge and a CPU instance like c5.18xlarge. + +One primary use case is offloading CPU intensive tasks like image +pre-processing (data augmentation) from the GPU instance to a dedicate +CPU instance, so you can fully utilize the expensive GPUs, and arrive at +an improved time and cost to train. + +.. admonition:: More resources: + + - `SageMaker heterogeneous cluster developer guide `_ + + +You'll find TensorFlow (tf.data.service) and PyTorch (a gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. You can reuse these examples when enabling your own training workload to use heterogeneous clusters. +Try one of the notebooks: + +.. admonition:: Frameworks + + - :ref:`hello-world-heterogeneous` + - :ref:`tensorflow-heterogeneous` + - :ref:`pytorch-heterogeneous` + + + +.. _hello-world-heterogeneous: + +Hello world +==================================== + +.. toctree:: + :maxdepth: 1 + + hello.world.sagemaker/helloworld-example + +.. _tensorflow-heterogeneous: + +TensorFlow +==================================== + +.. toctree:: + :maxdepth: 1 + + tf.data.service.sagemaker/hetero-tensorflow-restnet50 + + +PyTorch +==================================== + +.. toctree:: + :maxdepth: 1 + + pt.grpc.sagemaker/hetero-pytorch-mnist + From 280dbbd3010be367ac1e46da3ff91a8b01f8c37d Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 18:33:27 +0300 Subject: [PATCH 11/15] fix PT notebook heading for rst --- .../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index f6e92d16d2..ac42ba4364 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -5,7 +5,7 @@ "id": "85da9619", "metadata": {}, "source": [ - "## PyTorch's example to demonstrate Amazon SageMaker Heterogeneous Cluster for model training\n", + "# PyTorch's example to demonstrate Amazon SageMaker Heterogeneous Cluster for model training\n", "\n", "---\n", "### Description\n", From f8ee5df3add3dd2da0277c69aaeb599a31d76b5e Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 18:50:52 +0300 Subject: [PATCH 12/15] fix rst and notebook tables for rst --- training/heterogeneous-clusters/index.rst | 19 +++++------------- .../hetero-pytorch-mnist.ipynb | 19 ++++-------------- .../hetero-tensorflow-restnet50.ipynb | 20 +++++-------------- 3 files changed, 14 insertions(+), 44 deletions(-) diff --git a/training/heterogeneous-clusters/index.rst b/training/heterogeneous-clusters/index.rst index d384129d0b..55b3125889 100644 --- a/training/heterogeneous-clusters/index.rst +++ b/training/heterogeneous-clusters/index.rst @@ -16,31 +16,21 @@ an improved time and cost to train. - `SageMaker heterogeneous cluster developer guide `_ -You'll find TensorFlow (tf.data.service) and PyTorch (a gRPC based distributed data loading) examples on how to utilize Heterogeneous clusters in your training jobs. You can reuse these examples when enabling your own training workload to use heterogeneous clusters. -Try one of the notebooks: +See the following example notebooks: -.. admonition:: Frameworks - - - :ref:`hello-world-heterogeneous` - - :ref:`tensorflow-heterogeneous` - - :ref:`pytorch-heterogeneous` - - - -.. _hello-world-heterogeneous: - -Hello world +Hello World ==================================== +This minimal example launches a Heterogeneous cluster training job, print environment information, and exit. .. toctree:: :maxdepth: 1 hello.world.sagemaker/helloworld-example -.. _tensorflow-heterogeneous: TensorFlow ==================================== +This example is a reusable implementation of Heterogeneous cluster with TensorFlow's tf.data.service .. toctree:: :maxdepth: 1 @@ -50,6 +40,7 @@ TensorFlow PyTorch ==================================== +This example is a reusable implementation of Heterogeneous cluster with gRPC based data loader .. toctree:: :maxdepth: 1 diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index ac42ba4364..39f8544ec0 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -23,21 +23,10 @@ "\n", "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/MNIST). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Homogeneous training job
\n", - " We first run the homogeneous training job to get baseline performance number, and observe that it is unable to fully utilize GPU of ml.p3.2xlarge instance due to a CPU being the bottleneck.
Heterogeneous training job
\n", - " Then we'll switch to a heterogeneous training job where we'll add ml.c5.9xlarge instance for extra CPU cores, to allow increased GPU usage of ml.p3.2xlarge instance, and improve cost-efficiency. Both the jobs runs the training code, train data set, pre-processing, and other relevant parameters.\n", - "
\"homogeneous-training \"heterogeneous-training
\n", + "| Homogeneous Training Job | Heterogeneous Training Job |\n", + "|---|---|\n", + "| In this baseline we observe a ml.p3.2xlarge with an under-utilized GPU due to a CPU bottleneck. | We add ml.c5.9xlarge instance for extra CPU cores, to allow increased GPU usage of ml.p3.2xlarge instance, and improve cost-efficiency. Both the jobs runs the training code, train data set, pre-processing, and other relevant parameters. | \n", + "| \"homogeneous-training | \"heterogeneous-training |\n", "\n", "In homogeneous cluster training job, the data pre-processing and Deep Neural Network (DNN) training code runs on the same instance. However, in heterogeneous cluster training job, the data pre-processing code runs on the CPU nodes (here by referred as **data_group or data group**), whereas the Deep Neural Network (DNN) training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). The inter-node communication between the data and dnn groups is handled by generic implementation of [gRPC client-server interface](https://grpc.io/docs/languages/python/basics/).  \n", "\n", diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 73f1061a55..6f363f9d54 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -44,21 +44,11 @@ "### A guide to switching from a homogeneous to a heterogeneous job\n", "\n", "This notebook runs and compares these two workloads:\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Homogeneous Training Job
\n", - " In a Homogeneous training job the ml.p4d.24xlarge instance GPUs are under-utilized due to a CPU bottleneck.
Heterogeneous Training Job
\n", - " In a Heterogeneous training job, we add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and increase GPU usage, to improve training speed cost-efficiency.\n", - "
\"homogeneous\"Heterogeneous
\n", + "\n", + "| Homogeneous Training Job | Heterogeneous Training Job |\n", + "|---|---|\n", + "| We see a ml.p4d.24xlarge instance GPUs is under-utilized due to a CPU bottleneck. | We add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and increase GPU usage, to improve training speed cost-efficiency. | \n", + "| \"homogeneous | \"Heterogeneous |\n", "\n", "In each workload: Training data is an artificially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neural network optimization throughput expressed in epoch/step time. \n", "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The workloads uses an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. \n", From 307ae9dbd383c479b7a75631db58d82048befa04 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 21:13:57 +0300 Subject: [PATCH 13/15] Adding programmatic kernel restart --- .../helloworld-example.ipynb | 13 +++++++++++-- .../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb | 16 +++++++++++++--- .../hetero-tensorflow-restnet50.ipynb | 13 +++++++++++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb index f14984795c..fbeca9cdf8 100644 --- a/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb +++ b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb @@ -134,8 +134,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 2 - Restart the notebook kernel \n", - "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + "#### Step 2 - Restart the notebook kernel " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import IPython\n", + "IPython.Application.instance().kernel.do_shutdown(True)" ] }, { diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 39f8544ec0..06ffd4289d 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -11,7 +11,7 @@ "### Description\n", "Heterogeneous clusters enable launching training jobs that use multiple instance types in a single job. This capability can improve your training cost and speed by running different parts of the model training on the most suitable instance type. This use case typically happens in computer vision DL training, where training is bottleneck on CPU resources needed for data augmentation, leaving the expensive GPU underutilized. Heterogeneous clusters enable you to add more CPU resources to fully utilize GPUs, thus increase training speed and cost-efficiency. For more details, you can find the documentation of this feature [here](https://docs.aws.amazon.com/sagemaker/latest/dg/train-heterogeneous-cluster.html).\n", "\n", - "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch 1.10. The notebook works on Python 3 (_PyTorch 1.10 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", + "This notebook demonstrates how to use Heterogeneous Cluster feature of SageMaker Training with PyTorch. The notebook works on Python 3 (_PyTorch 1.11 Python 3.8 CPU Optimized_) image of SageMaker Studio Notebook instance, and runs on _ml.t3.medium_ instance type.\n", "\n", "The notebook covers:\n", "- Setting up SageMaker Studio Notebook \n", @@ -92,8 +92,18 @@ "id": "0d20b2f3", "metadata": {}, "source": [ - "#### Step 2 - Restart the notebook kernel \n", - "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + "#### Step 2 - Restart the notebook kernel " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "229e1b18", + "metadata": {}, + "outputs": [], + "source": [ + "import IPython\n", + "IPython.Application.instance().kernel.do_shutdown(True)" ] }, { diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 6f363f9d54..7b8413cec3 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -191,8 +191,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Step 2 - Restart the notebook kernel \n", - "From the Jupyter Lab menu bar **Kernel > Restart Kernel...**" + "#### Step 2 - Restart the notebook kernel " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import IPython\n", + "IPython.Application.instance().kernel.do_shutdown(True)" ] }, { From c56262bbff3cbdfe621e1c4253dc75dd753f3741 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 21:37:59 +0300 Subject: [PATCH 14/15] removing programmatic kernel restart - breaks CI --- .../hello.world.sagemaker/helloworld-example.ipynb | 4 ++-- .../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb | 4 ++-- .../hetero-tensorflow-restnet50.ipynb | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb index fbeca9cdf8..e990cf22ce 100644 --- a/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb +++ b/training/heterogeneous-clusters/hello.world.sagemaker/helloworld-example.ipynb @@ -143,8 +143,8 @@ "metadata": {}, "outputs": [], "source": [ - "import IPython\n", - "IPython.Application.instance().kernel.do_shutdown(True)" + "#import IPython\n", + "#IPython.Application.instance().kernel.do_shutdown(True)" ] }, { diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 06ffd4289d..34ea75aea4 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -102,8 +102,8 @@ "metadata": {}, "outputs": [], "source": [ - "import IPython\n", - "IPython.Application.instance().kernel.do_shutdown(True)" + "#import IPython\n", + "#IPython.Application.instance().kernel.do_shutdown(True)" ] }, { diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index 7b8413cec3..db9de031d7 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -200,8 +200,8 @@ "metadata": {}, "outputs": [], "source": [ - "import IPython\n", - "IPython.Application.instance().kernel.do_shutdown(True)" + "#import IPython\n", + "#IPython.Application.instance().kernel.do_shutdown(True)" ] }, { From 6b687d3b356d7a209711d00963858c031f1554f5 Mon Sep 17 00:00:00 2001 From: Gili Nachum Date: Tue, 4 Oct 2022 21:44:29 +0300 Subject: [PATCH 15/15] Remove tables that don't render in RST --- .../pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb | 9 +++++---- .../hetero-tensorflow-restnet50.ipynb | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb index 34ea75aea4..7146988464 100644 --- a/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb +++ b/training/heterogeneous-clusters/pt.grpc.sagemaker/hetero-pytorch-mnist.ipynb @@ -23,10 +23,11 @@ "\n", "In this sample notebook, we have taken the PyTorch model based on this [official MNIST example](https://github.com/pytorch/examples/tree/main/MNIST). We modified the training code to be heavy on data pre-processing. We are going to train this model in both Homogeneous and Heterogeneous Cluster modes. The flag to train on any of these modes can be set using `IS_HETERO = False or True` in section **B.2 Configure environment variables**. \n", "\n", - "| Homogeneous Training Job | Heterogeneous Training Job |\n", - "|---|---|\n", - "| In this baseline we observe a ml.p3.2xlarge with an under-utilized GPU due to a CPU bottleneck. | We add ml.c5.9xlarge instance for extra CPU cores, to allow increased GPU usage of ml.p3.2xlarge instance, and improve cost-efficiency. Both the jobs runs the training code, train data set, pre-processing, and other relevant parameters. | \n", - "| \"homogeneous-training | \"heterogeneous-training |\n", + "Homogeneous Training Job - In this baseline we observe an ml.p3.2xlarge with an under-utilized GPU due to a CPU bottleneck. \n", + "\"homogeneous-training \n", + "\n", + "Heterogeneous Training Job - Where we add ml.c5.9xlarge instance for extra CPU cores, to allow increased GPU usage of ml.p3.2xlarge instance, and improve cost-efficiency. Both the jobs runs the training code, train data set, pre-processing, and other relevant parameters.\n", + "\"heterogeneous-training\n", "\n", "In homogeneous cluster training job, the data pre-processing and Deep Neural Network (DNN) training code runs on the same instance. However, in heterogeneous cluster training job, the data pre-processing code runs on the CPU nodes (here by referred as **data_group or data group**), whereas the Deep Neural Network (DNN) training code runs on the GPU nodes (here referred as **dnn_group or dnn group**). The inter-node communication between the data and dnn groups is handled by generic implementation of [gRPC client-server interface](https://grpc.io/docs/languages/python/basics/).  \n", "\n", diff --git a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb index db9de031d7..61cdc56cf5 100644 --- a/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb +++ b/training/heterogeneous-clusters/tf.data.service.sagemaker/hetero-tensorflow-restnet50.ipynb @@ -45,10 +45,11 @@ "\n", "This notebook runs and compares these two workloads:\n", "\n", - "| Homogeneous Training Job | Heterogeneous Training Job |\n", - "|---|---|\n", - "| We see a ml.p4d.24xlarge instance GPUs is under-utilized due to a CPU bottleneck. | We add two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and increase GPU usage, to improve training speed cost-efficiency. | \n", - "| \"homogeneous | \"Heterogeneous |\n", + "Homogeneous Training Job - The image shows a ml.p4d.24xlarge instance GPUs is under-utilized due to a CPU bottleneck. \n", + "\"homogeneous\n", + " \n", + "Heterogeneous Training Job - The image shows two ml.c5.18xlarge instances with extra CPU cores, to reduce the CPU bottleneck and increase GPU usage, to improve training speed cost-efficiency. \n", + " \"Heterogeneous\n", "\n", "In each workload: Training data is an artificially generated dataset consisting of 32x32x3 images with random pixel values, and a corresponding random label representing 10 different classes. As this dataset is randomly generated, you should not expect the model to converge in a meaningful way. This shouldn't matter as our intent is only to measure data pipeline and neural network optimization throughput expressed in epoch/step time. \n", "The model we used is [Resnet50](https://www.TensorFlow.org/api_docs/python/tf/keras/applications/ResNet50). The workloads uses an 8 GPUs instance, ml.p4d.24xlarge, and uses Horovod for data parallelization. \n",