컴파일용 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 모델을 저장하는 데는 두 가지 옵션이 있습니다.
model.save("<model-name>", save_format="h5")
를 사용하여.h5
형식으로 내보냅니다.내보낸 후
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
로 저장해야 합니다.
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) 섹션을 참조하세요.