컴파일용 ML 모델 준비 - Amazon SageMaker

컴파일용 ML 모델 준비

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

SageMaker Neo에 필요한 입력 데이터 형태는 무엇입니까?

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

SageMaker Neo에 필요한 입력 형태는 다음과 같습니다.

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

  • 하나의 입력인 경우: {'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는 PyTorch로 생성하는 모델 정의 파일(.pt 또는.pth)에서 입력 구성을 가져옵니다.

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

훈련된 모델의 딕셔너리 형식을 사용하여 필요한 데이터 입력의 이름 및 형태(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 클라우드 인스턴스 대상 목록은 SageMaker Neo 지원되는 인스턴스 유형 및 프레임워크 페이지를 참조하세요.

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

SageMaker Neo에 대한 모델 저장

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

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

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

  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 모델은 입력 데이터 유형이 float32인 정의 파일(.pt 또는 .pth)로 저장해야 합니다.

모델을 저장하려면 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가 입력 구성을 얻지 못하도록 하려면 torch.jit.trace_store_inputs 파라미터를 False로 설정하면 됩니다. 이렇게 하면 모델을 컴파일할 때 SageMaker에 데이터 입력 구성을 지정해야 합니다.

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

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 메서드를 사용하여 모델을 훈련시킬 때 사용자를 위해 모델을 올바른 형식으로 저장합니다.

예를 들어 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 클래스를 사용하여 SageMaker Python SDK의 compile_model 메서드로 내장 알고리즘을 훈련 및 컴파일하기 위한 예측기 객체를 초기화할 수 있습니다.

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를 사용하여 모델을 컴파일하는 방법에 대한 자세한 내용은 모델 컴파일(Amazon SageMaker SDK) 섹션을 참조하세요.