컴파일용 ML 모델 준비 - 아마존 SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

컴파일용 ML 모델 준비

SageMaker Neo는 특정 입력 데이터 셰이프를 충족하는 기계 학습 모델을 필요로 합니다. 컴파일에 필요한 입력 형태는 사용하는 딥러닝 프레임워크에 따라 달라집니다. 모델 입력 형태의 형식이 올바르게 지정되면 아래 요구 사항에 따라 모델을 저장합니다. 모델을 저장한 후에는 모델 아티팩트를 압축하세요.

SageMaker Neo는 어떤 입력 데이터 형태를 기대하나요?

모델을 컴파일하기 전에 모델 형식이 올바른지 확인하세요. Neo에는 훈련된 모델에 필요한 데이터 입력의 이름 및 형태가 JSON 형식 또는 목록 형식으로 필요합니다. 필요한 입력은 프레임워크에 따라 다릅니다.

SageMaker Neo가 기대하는 입력 형태는 다음과 같습니다.

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 형태(NCHW 형식)를 지정해야 합니다. Keras 모델 아티팩트는 NHWC (채널 마지막) 형식으로 업로드해야 하지만 NCHW (채널 우선) 형식으로 DataInputConfig 지정해야 한다는 점에 유의하세요. 필요한 딕셔너리 형식은 다음과 같습니다.

  • 하나의 입력인 경우: {'input_1':[1,3,224,224]}

  • 두개의 입력인 경우: {'input_1': [1,3,224,224], 'input_2':[1,3,224,224]}

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 형태(NCHW 형식)를 지정해야 합니다. 필요한 딕셔너리 형식은 다음과 같습니다.

  • 하나의 입력인 경우: {'data':[1,3,1024,1024]}

  • 두개의 입력인 경우: {'var1': [1,1,28,28], 'var2':[1,1,28,28]}

PyTorch 모델의 경우 다음 조건을 모두 충족하는 경우 예상 데이터 입력의 이름과 형태를 제공할 필요가 없습니다.

  • PyTorch 2.0 이상을 사용하여 모델 정의 파일을 생성했습니다. 정의 파일을 생성하는 방법에 대한 자세한 내용은 SageMaker Neo용 모델 저장하기 PyTorch 섹션을 참조하십시오.

  • 클라우드 인스턴스용 모델을 컴파일하고 있습니다. SageMaker Neo가 지원하는 인스턴스 유형에 대한 자세한 내용은 을 참조하십시오. 지원되는 인스턴스 유형 및 프레임워크

이러한 조건을 충족하는 경우 SageMaker Neo는 생성에 사용한 모델 정의 파일 (.pt 또는.pth) 에서 입력 구성을 가져옵니다. PyTorch

그 밖에는 다음과 같은 방법이 있습니다.

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 형태(NCHW 형식)를 지정해야 합니다. 또는 목록 형식만 사용하여 형태를 지정할 수도 있습니다. 필요한 딕셔너리 형식은 다음과 같습니다.

  • 딕셔너리 형식으로 하나의 입력인 경우: {'input0':[1,3,224,224]}

  • 목록 형식으로 하나의 입력인 경우: [[1,3,224,224]]

  • 딕셔너리 형식으로 두 개의 입력인 경우: {'input0':[1,3,224,224], 'input1':[1,3,224,224]}

  • 목록 형식으로 두 개의 입력인 경우: [[1,3,224,224], [1,3,224,224]]

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 셰이프(NHWC 형식)를 지정하세요. 필요한 딕셔너리 형식은 다음과 같습니다.

  • 하나의 입력인 경우: {'input':[1,1024,1024,3]}

  • 두개의 입력인 경우: {'data1': [1,28,28,1], 'data2':[1,28,28,1]}

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 셰이프(NHWC 형식)를 지정하세요. 필요한 딕셔너리 형식은 다음과 같습니다.

  • 하나의 입력인 경우: {'input':[1,224,224,3]}

참고

SageMaker Neo는 엣지 디바이스 TensorFlow 타겟용 Lite만 지원합니다. 지원되는 SageMaker Neo 엣지 디바이스 타겟 목록은 SageMaker Neo 디바이스 페이지를 참조하십시오. 지원되는 SageMaker Neo 클라우드 인스턴스 대상 목록은 Neo 페이지를 참조하십시오. SageMaker 지원되는 인스턴스 유형 및 프레임워크

입력 데이터 이름 및 형태는 필요하지 않습니다.

Neo용 모델 저장하기 SageMaker

다음 코드 예제는 Neo와 호환되도록 모델을 저장하는 방법을 보여줍니다. 모델은 압축된 tar 파일(*.tar.gz)로 패키징해야 합니다.

Keras 모델에는 하나의 모델 정의 파일(.h5)이 필요합니다.

Keras 모델을 Neo와 호환되도록 저장하기 위한 SageMaker 두 가지 옵션이 있습니다.

  1. model.save("<model-name>", save_format="h5")를 사용하여 .h5 형식으로 내보냅니다.

  2. 내보낸 후 SavedModel을 고정합니다.

다음은 tf.keras 모델을 고정 그래프로 내보내는 방법의 예입니다(옵션 2).

import os import tensorflow as tf from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras import backend tf.keras.backend.set_learning_phase(0) model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3), pooling='avg') model.summary() # Save as a SavedModel export_dir = 'saved_model/' model.save(export_dir, save_format='tf') # Freeze saved model input_node_names = [inp.name.split(":")[0] for inp in model.inputs] output_node_names = [output.name.split(":")[0] for output in model.outputs] print("Input names: ", input_node_names) with tf.Session() as sess: loaded = tf.saved_model.load(sess, export_dir=export_dir, tags=["serve"]) frozen_graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), output_node_names) tf.io.write_graph(graph_or_graph_def=frozen_graph, logdir=".", name="frozen_graph.pb", as_text=False) import tarfile tar = tarfile.open("frozen_graph.tar.gz", "w:gz") tar.add("frozen_graph.pb") tar.close()
주의

model.save(<path>, save_format='tf')를 사용하여 SavedModel 클래스와 함께 모델을 내보내지 마세요. 이 형식은 훈련에는 적합하지만 추론에는 적합하지 않습니다.

MXNet 모델은 단일 기호 파일 *-symbol.json 및 단일 파라미터 *.params files로 저장해야 합니다.

Gluon Models

HybridSequential 클래스를 사용하여 신경망을 정의합니다. 그러면 명령형 프로그래밍이 아닌 기호 프로그래밍 스타일로 코드가 실행됩니다.

from mxnet import nd, sym from mxnet.gluon import nn def get_net(): net = nn.HybridSequential() # Here we use the class HybridSequential. net.add(nn.Dense(256, activation='relu'), nn.Dense(128, activation='relu'), nn.Dense(2)) net.initialize() return net # Define an input to compute a forward calculation. x = nd.random.normal(shape=(1, 512)) net = get_net() # During the forward calculation, the neural network will automatically infer # the shape of the weight parameters of all the layers based on the shape of # the input. net(x) # hybridize model net.hybridize() net(x) # export model net.export('<model_name>') # this will create model-symbol.json and model-0000.params files import tarfile tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()

하이브리드 모델에 대한 자세한 내용은 MXNet 하이브리드 설명서를 참조하세요.

Gluon Model Zoo (GluonCV)

GluonCV 모델 동물원 모델은 사전 하이브리드된 상태로 제공됩니다. 따라서 그냥 내보내기만 하면 됩니다.

import numpy as np import mxnet as mx import gluoncv as gcv from gluoncv.utils import export_block import tarfile net = gcv.model_zoo.get_model('<model_name>', pretrained=True) # For example, choose <model_name> as resnet18_v1 export_block('<model_name>', net, preprocess=True, layout='HWC') tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()
Non Gluon Models

모든 GLUON이 아닌 모델을 디스크 사용 *-symbol*.params 파일에 저장한 경우. 따라서 이미 Neo를 위한 올바른 형식으로 되어 있습니다.

# Pass the following 3 parameters: sym, args, aux mx.model.save_checkpoint('<model_name>',0,sym,args,aux) # this will create <model_name>-symbol.json and <model_name>-0000.params files import tarfile tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()

PyTorch 모델은 입력 데이터 유형이 1인 정의 파일 (.pt또는.pth) 로 저장해야 합니다. float32

모델을 저장하려면 torch.jit.trace 메서드와 torch.save 메서드를 차례로 사용하세요. 이 프로세스는 객체를 디스크 파일에 저장하고 기본적으로 python pickle(pickle_module=pickle)을 사용하여 객체와 일부 메타데이터를 저장합니다. 다음으로, 저장된 모델을 압축된 tar 파일로 변환합니다.

import torchvision import torch model = torchvision.models.resnet18(pretrained=True) model.eval() inp = torch.rand(1, 3, 224, 224) model_trace = torch.jit.trace(model, inp) # Save your model. The following code saves it with the .pth file extension model_trace.save('model.pth') # Save as a compressed tar file import tarfile with tarfile.open('model.tar.gz', 'w:gz') as f: f.add('model.pth') f.close()

PyTorch 2.0 이상 버전으로 모델을 저장하면 SageMaker Neo는 정의 파일에서 모델의 입력 구성 (입력의 이름과 모양) 을 가져옵니다. 이 경우 모델을 컴파일할 SageMaker 때 데이터 입력 구성을 지정하지 않아도 됩니다.

SageMaker Neo가 입력 구성을 도출하지 못하도록 하려면 to의 파라미터를 설정하면 됩니다_store_inputs. torch.jit.trace False 이렇게 하면 모델을 컴파일할 SageMaker 때 데이터 입력 구성을 지정해야 합니다.

torch.jit.trace메서드에 대한 자세한 내용은 설명서의 TORCH.JIT.TRACE를 참조하십시오. PyTorch

TensorFlow 하나 .pb 또는 하나의 .pbtxt 파일과 변수를 포함하는 변수 디렉토리가 필요합니다. 고정된 모델의 경우 하나의 .pb 또는 .pbtxt 파일만 필요합니다.

다음 코드 예제는 tar Linux 명령을 사용하여 모델을 압축하는 방법을 보여줍니다. 터미널이나 Jupyter notebook에서 다음을 실행합니다(Jupyter notebook을 사용하는 경우 명령문 앞에 ! magic 명령을 삽입하세요).

# Download SSD_Mobilenet trained model !wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz # unzip the compressed tar file !tar xvf ssd_mobilenet_v2_coco_2018_03_29.tar.gz # Compress the tar file and save it in a directory called 'model.tar.gz' !tar czvf model.tar.gz ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb

이 예제에 사용된 명령 플래그는 다음을 수행합니다.

  • c: 아카이브 생성

  • z: gzip으로 아카이브 압축

  • v: 아카이브 진행률 표시

  • f: 아카이브의 파일 이름 지정

내장 추정기는 프레임워크별 컨테이너 또는 알고리즘별 컨테이너로 만들어집니다. 내장 알고리즘과 프레임워크별 예측기 모두에 대한 예측기 객체는 내장된 .fit 메서드를 사용하여 모델을 훈련시킬 때 사용자를 위해 모델을 올바른 형식으로 저장합니다.

예를 들어, a를 사용하여 sagemaker.TensorFlow TensorFlow 추정기를 정의할 수 있습니다.

from sagemaker.tensorflow import TensorFlow estimator = TensorFlow(entry_point='mnist.py', role=role, #param role can be arn of a sagemaker execution role framework_version='1.15.3', py_version='py3', training_steps=1000, evaluation_steps=100, instance_count=2, instance_type='ml.c4.xlarge')

그런 다음 .fit 내장 메서드로 모델을 훈련시킵니다.

estimator.fit(inputs)

마지막으로 compile_model 메서드로 모델을 컴파일하기 전에:

# Specify output path of the compiled model output_path = '/'.join(estimator.output_path.split('/')[:-1]) # Compile model optimized_estimator = estimator.compile_model(target_instance_family='ml_c5', input_shape={'data':[1, 784]}, # Batch size 1, 3 channels, 224x224 Images. output_path=output_path, framework='tensorflow', framework_version='1.15.3')

또한 sagemaker.estimator.Estimator Class를 사용하여 Python SDK의 메서드로 내장 알고리즘을 훈련하고 컴파일하기 위한 추정기 객체를 초기화할 수 있습니다. compile_model SageMaker

import sagemaker from sagemaker.image_uris import retrieve sagemaker_session = sagemaker.Session() aws_region = sagemaker_session.boto_region_name # Specify built-in algorithm training image training_image = retrieve(framework='image-classification', region=aws_region, image_scope='training') training_image = retrieve(framework='image-classification', region=aws_region, image_scope='training') # Create estimator object for training estimator = sagemaker.estimator.Estimator(image_uri=training_image, role=role, #param role can be arn of a sagemaker execution role instance_count=1, instance_type='ml.p3.8xlarge', volume_size = 50, max_run = 360000, input_mode= 'File', output_path=s3_training_output_location, base_job_name='image-classification-training' ) # Setup the input data_channels to be used later for training. train_data = sagemaker.inputs.TrainingInput(s3_training_data_location, content_type='application/x-recordio', s3_data_type='S3Prefix') validation_data = sagemaker.inputs.TrainingInput(s3_validation_data_location, content_type='application/x-recordio', s3_data_type='S3Prefix') data_channels = {'train': train_data, 'validation': validation_data} # Train model estimator.fit(inputs=data_channels, logs=True) # Compile model with Neo optimized_estimator = estimator.compile_model(target_instance_family='ml_c5', input_shape={'data':[1, 3, 224, 224], 'softmax_label':[1]}, output_path=s3_compilation_output_location, framework='mxnet', framework_version='1.7')

SageMaker Python SDK로 모델을 컴파일하는 방법에 대한 자세한 내용은 을 참조하십시오. 모델 컴파일 (아마존 SageMaker SDK)