<jupyter_start><jupyter_text>Amazon SageMaker와 병렬로 SageMaker 분산 모델을 사용하여 모델 병렬화로 훈련 작업 시작SageMaker 분산 모델 병렬 (SageMaker Distributed Model Parallel, SMP)은 GPU 메모리 제한으로 인해 이전에 학습하기 어려웠던 대규모 딥러닝 모델을 훈련하기 위한 모델 병렬 처리 라이브러리입니다. SageMaker Distributed Model Parallel은 여러 GPU 및 인스턴스에서 모델을 자동으로 효율적으로 분할하고 모델 훈련을 조정하므로 더 많은 매개 변수로 더 큰 모델을 생성하여 예측 정확도를 높일 수 있습니다.이 노트북을 사용하여 TensorFlow 및 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/overview.htmltrain-a-model-with-the-sagemaker-python-sdk)를 사용하여 모델을 훈련하도록 Sagemaker Distributed Model Parallel을 구성합니다. 추가 리소스Amazon SageMaker를 처음 사용하는 경우, SageMaker가 Docker를 사용하여 사용자 지정 모델을 훈련하는 방법을 이해하는 데 다음 정보들이 도움이 될 수 있습니다.* 자체 훈련 이미지와 함께 Amazon SageMaker를 사용하는 방법에 대한 자세한 내용은 [Use Your Own Training Algorithms](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo.html)을 참조하세요.* Docker를 사용하여 Amazon SageMaker로 자체 모델을 훈련하는 방법에 대한 자세한 내용은 [Example Notebooks: Use Your Own Algorithm or Model](https://docs.aws.amazon.com/sagemaker/latest/dg/adv-bring-own-examples.html)을 참조하세요.* Amazon SageMaker 및 Tensorflow를 사용한 분산 훈련의 다른 예제를 보려면 [Distributed TensorFlow training using Amazon SageMaker](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/advanced_functionality/distributed_tensorflow_mask_rcnn)을 참조하세요.  Amazon SageMaker 초기화다음 셀을 실행하여 노트북 인스턴스를 초기화합니다. 이 노트북을 실행하는 데 사용되는 SageMaker 실행 역할을 가져옵니다.<jupyter_code>pip install sagemaker-experiments
pip install sagemaker --upgrade
%%time
import sagemaker
from sagemaker import get_execution_role
from sagemaker.tensorflow import TensorFlow
from smexperiments.experiment import Experiment
from smexperiments.trial import Trial
import boto3
from time import gmtime, strftime

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

session = boto3.session.Session()<jupyter_output><empty_output><jupyter_text>훈련 스크립트 준비다음 코드 셀을 실행하여 TensorFlow 버전 2.3에 대한 예제 훈련 스크립트를 확인합니다. `tf2.py`는 순수 모델 병렬화이고 `tf2_hvd.py`는 Horovod를 사용한 데이터/모델 병렬화입니다.<jupyter_code># Run this cell to see an example of a training scripts that you can use to configure -
# SageMaker Distributed Model Parallel with TensorFlow versions 2.3
!cat utils/tf2.py
# Run this cell to see an example of a training scripts that you can use to configure -
# SageMaker Distributed Model Parallel using Horvod with TensorFlow 2.3
!cat utils/tf2_hvd.py<jupyter_output><empty_output><jupyter_text>SageMaker 훈련 작업 정의다음으로 SageMaker Estimator API를 사용하여 SageMaker 훈련 작업을 정의합니다. [`PyTorchEstimator`](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)를 사용하여 Amazon SageMaker가 훈련에 사용하는 EC2 인스턴스의 수와 유형을 정의합니다. 인스턴스에 연결된 볼륨의 크기도 포함됩니다.Estimator 호출 시, 아래의 인자값들을 업데이트해야 합니다.* `processes_per_host`* `entry_point`* `instance_count`* `instance_type`* `base_job_name`또한, SageMaker Distributed Model Parallel 라이브러리에 대한 설정 파라메터들을 제공하고 수정할 수 있습니다. 이러한 파라메터들은 아래와 같이 `distributions` 인수를 통해 전달됩니다. 사용할 EC2 인스턴스의 유형 및 개수 업데이트예시 스크립트인 `tf2.py`, `tf2_hvd.py` 중 하나에서 `entry_point`를 선택합니다.`processes_per_host`를 지정하고 `tf2.py`의 경우 2개만 사용하고 `tf2_hvd.py`의 경우 4개 이상을 사용해야 합니다. 파티션의 배수여야 하며 기본값은 2입니다.`instance_type` 및 `instance_count` 에서 지정하는 인스턴스 유형과 인스턴스 수에 따라 Amazon SageMaker가 훈련 중에 사용하는 GPU 수가 결정됩니다. 명시적으로`instance_type`은 단일 인스턴스의 GPU 수를 결정하고 그 숫자에 `instance_count`를 곱합니다.`instance_type`및 `instance_count` 값을 지정하여 학습에 사용할 수있는 총 GPU 수가 Estimator API에 있는 모델 병렬 분포 인수의 `parameters`에 있는 `partitions`와 같도록 해야 합니다.`tf2_hvd.py`를 사용하는 경우, 훈련 작업에서 지원할 수 있는 총 모델 복제본 수는 지정한 총 GPU 수를 `partitions`으로 나눈 값과 같습니다. 따라서 데이터 병렬화에 Horovod를 사용하는 경우 총 GPU 수를 원하는 모델 복제본 수에 `partitions`를 곱한 값(`total-model-replicas` x `partitions`)으로 지정하셔야 합니다.인스턴스 유형을 조회하려면 [Amazon EC2 인스턴스 유형](https://aws.amazon.com/sagemaker/pricing/)을 참조하세요. 훈련 중 체크 포인트 업로드 또는 이전 훈련에서 체크 포인트 재개또한 사용자가 훈련 중에 체크 포인트를 업로드하거나, 이전 훈련에서 체크 포인트를 재개할 수 있는 맞춤형 방법을 제공합니다. 이러한 방법들을 `tf2.py` 예제 스크립트에 통합하혔으며, `aws_s3_sync`,`sync_local_checkpoints_to_s3` 및 `sync_s3_checkpoints_to_local` 함수를 참조하시면 됩니다. 이 예제에서는 `sync_local_checkpoints_to_s3`을 사용하여 훈련 중에 체크 포인트만 업로드합니다. `entry_point`, `instance_count`, `instance_type` 및 `base_job_name`을 업데이트한 후 다음을 실행하여 estimator를 생성합니다.<jupyter_code>sagemaker_session = sagemaker.session.Session(boto_session=session)
mpioptions = "-verbose -x orte_base_help_aggregate=0 "
mpioptions += "--mca btl_vader_single_copy_mechanism none "

#choose an experiment name (only need to create it once)
experiment_name = "SM-MP-DEMO"

all_experiment_names = [exp.experiment_name for exp in Experiment.list()]
# Load the experiment if it exists, otherwise create 
if experiment_name not in all_experiment_names:
    customer_churn_experiment = Experiment.create(
        experiment_name=experiment_name, sagemaker_boto_client=boto3.client("sagemaker")
    )
else:
    customer_churn_experiment = Experiment.load(
        experiment_name=experiment_name, sagemaker_boto_client=boto3.client("sagemaker")
    )

# Create a trial for the current run
trial = Trial.create(
        trial_name="SMD-MP-demo-{}".format(strftime("%Y-%m-%d-%H-%M-%S", gmtime())),
        experiment_name=customer_churn_experiment.experiment_name,
        sagemaker_boto_client=boto3.client("sagemaker"),
    )


smd_mp_estimator = TensorFlow(
          entry_point="tf2.py", # Pick your train script
          source_dir="utils",
          role=role,
          framework_version='2.3.1',
          py_version='py37',
          instance_type='ml.p3.16xlarge',
          sagemaker_session=sagemaker_session,
          instance_count=1,
          distribution={
              "smdistributed": {
                  "modelparallel": {
                      "enabled":True,
                      "parameters": {
                          "microbatches": 2, 
                          "partitions": 2, 
                          "pipeline": "interleaved", 
                          "optimize": "memory",
                          #"horovod": True, #Set to True if using the horovod script
                      }
                  }
              },
              "mpi": {
                    "enabled": True,
                    "processes_per_host": 2, # Pick your processes_per_host
                    "custom_mpi_options": mpioptions 
              },
          },
          base_job_name="SMD-MP-demo"
      )<jupyter_output><empty_output><jupyter_text>마지막으로 estimator를 사용하여 SageMaker 훈련 작업을 시작합니다.<jupyter_code>smd_mp_estimator.fit(
        experiment_config={
            "ExperimentName": customer_churn_experiment.experiment_name,
            "TrialName": trial.trial_name,
            "TrialComponentDisplayName": "Training",
        })<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08227564581155741, 'fraction_numerical': 0.006719426608929371, 'mean_word_length': 3.590815627141878, 'pattern_counts': {'":': 16, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '183740', 'license': 'MIT', 'n_tokens_mistral': 3274, 'n_tokens_neox': 3772, 'n_words': 669, 'path': 'tensorflow/model_parallel/mnist/tensorflow_smmodelparallel_mnist.ipynb', 'repo_name': 'daekeun-ml/sagemaker-distributed-training', 'size': '6697'}