Modell für die Kompilierung vorbereiten - Amazon SageMaker AI

Modell für die Kompilierung vorbereiten

SageMaker Neo benötigt Modelle für das Machine Learning, um bestimmte Eingabedatenformen zu erfüllen. Welche Eingabeform für die Kompilierung erforderlich ist, hängt vom verwendeten Deep-Learning-Framework ab. Sobald die Eingabeform Ihres Modells korrekt formatiert ist, speichern Sie Ihr Modell gemäß den folgenden Anforderungen. Sobald Sie ein Modell gespeichert haben, komprimieren Sie die Modellartefakte.

Welche Formen von Eingabedaten erwartet SageMaker Neo?

Bevor Sie Ihr Modell kompilieren, stellen Sie sicher, dass Ihr Modell korrekt formatiert ist. Neo erwartet den Namen und die Form der erwarteten Dateneingaben für Ihr trainiertes Modell mit einer JSON-Wörterbuchform oder Listenform. Die Dateneingaben sind Framework-spezifisch.

Im Folgenden sind die Eingabeformen aufgeführt, die SageMaker Neo erwartet:

Sie müssen den Namen und die Form (NCHW-Format) erwarteter Dateneingaben unter Verwendung eines Wörterbuchformats für Ihr trainiertes Modell angeben. Beachten Sie, dass Keras-Modellartefakte zwar im NHWC-Format (channel-last) hochgeladen werden sollten, jedoch im NCHW-Format (channel-first) angegeben werden sollte. Gültige Wörterbuchformate sind folgende:

  • Für eine Eingabe: {'input_1':[1,3,224,224]}

  • Für zwei Eingaben: {'input_1': [1,3,224,224], 'input_2':[1,3,224,224]}

Sie müssen den Namen und die Form (NCHW-Format) erwarteter Dateneingaben unter Verwendung eines Wörterbuchformats für Ihr trainiertes Modell angeben. Gültige Wörterbuchformate sind folgende:

  • Für eine Eingabe: {'data':[1,3,1024,1024]}

  • Für zwei Eingaben: {'var1': [1,1,28,28], 'var2':[1,1,28,28]}

Für ein PyTorch-Modell müssen Sie den Namen und die Form der erwarteten Dateneingaben nicht angeben, wenn Sie die beiden folgenden Bedingungen erfüllen:

  • Sie haben Ihre Modelldefinitionsdatei mit PyTorch 2.0 oder höher erstellt. Weitere Informationen zum Erstellen der Definitionsdatei finden Sie im PyTorch Abschnitt Speichern von Modellen für SageMaker Neo.

  • Sie kompilieren Ihr Modell für eine Cloud-Instance. Weitere Informationen zu den unterstützten Instance-Typen finden Sie unter Unterstützte Instance-Typen und Frameworks.

Wenn Sie diese Bedingungen erfüllen, ruft SageMaker Neo die Eingabekonfiguration aus der Modelldefinitionsdatei (.pt oder .pth) ab, die Sie mit PyTorch erstellen.

Andernfalls müssen Sie wie folgt vorgehen:

Sie müssen den Namen und die Form (NCHW-Format) erwarteter Dateneingaben unter Verwendung eines Wörterbuchformats für Ihr trainiertes Modell angeben. Alternativ können Sie die Form nur in einem Listenformat angeben. Gültige Wörterbuchformate sind folgende:

  • Für eine Eingabe im Wörterbuchformat: {'input0':[1,3,224,224]}

  • Beispiel für eine Eingabe im Listenformat: [[1,3,224,224]]

  • Beispiele für zwei Eingaben im Wörterbuchformat: {'input0':[1,3,224,224], 'input1':[1,3,224,224]}

  • Beispiele für zwei Eingaben im Listenformat: [[1,3,224,224], [1,3,224,224]]

Sie müssen den Namen und die Form (NHWC-Format) der erwarteten Dateneingaben unter Verwendung eines Wörterbuchformats für Ihr trainiertes Modell angeben. Gültige Wörterbuchformate sind folgende:

  • Für eine Eingabe: {'input':[1,1024,1024,3]}

  • Für zwei Eingaben: {'data1': [1,28,28,1], 'data2':[1,28,28,1]}

Sie müssen den Namen und die Form (NHWC-Format) der erwarteten Dateneingaben unter Verwendung eines Wörterbuchformats für Ihr trainiertes Modell angeben. Gültige Wörterbuchformate sind folgende:

  • Für eine Eingabe: {'input':[1,224,224,3]}

Anmerkung

SageMaker Neo unterstützt TensorFlow Lite nur für Edge-Geräteziele. Eine Liste der unterstützten SageMaker Neo Edge-Geräteziele finden Sie auf der SageMaker Neo Geräte Seite. Eine Liste der unterstützten Cloud-Instance-Ziele von SageMaker Neo finden Sie auf der SageMaker Neo Unterstützte Instance-Typen und Frameworks Seite.

Der Name und die Form der Eingabedaten sind nicht erforderlich.

Speichern von Modellen für SageMaker Neo

Die folgenden Codebeispiele zeigen, wie Sie Ihr Modell speichern, um es mit Neo kompatibel zu machen. Modelle müssen als komprimierte TAR-Dateien (*.tar.gz) gepackt werden.

Keras-Modelle benötigen eine Modelldefinitionsdatei (.h5).

Es gibt zwei Möglichkeiten, Ihr Keras-Modell zu speichern, um es für SageMaker Neo kompatibel zu machen:

  1. Exportieren .h5 Format mit model.save("<model-name>", save_format="h5").

  2. Frieren Sie das SavedModel nach dem Export ein.

Im Folgenden finden Sie ein Beispiel für den Export eines tf.keras Modells als eingefrorenes Diagramm (Option zwei):

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()
Warnung

Exportieren Sie Ihr Modell nicht mit der SavedModel Klasse mithilfe des model.save(<path>, save_format='tf'). Dieses Format eignet sich für das Training, aber es ist nicht für Inferenzen geeignet.

MXNet-Modelle müssen als einzelne Symboldatei *-symbol.json und als einziger Parameter *.params files gespeichert werden.

Gluon Models

Definieren Sie das neuronale Netzwerk mithilfe der HybridSequential Klasse. Dadurch wird der Code im Stil der symbolischen Programmierung (im Gegensatz zur imperativen Programmierung) ausgeführt.

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()

Weitere Informationen zur Hybridisierung von Modellen finden Sie in der MXNet-Hybridize-Dokumentation.

Gluon Model Zoo (GluonCV)

Zoo-Modelle des GluonCV-Modells werden vorhybridisiert geliefert. Sie können sie also einfach exportieren.

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

Alle Modelle, die nicht von Gluon stammen, werden beim Speichern auf der Festplatte *-symbol und *.params in Dateien verwendet. Sie sind daher bereits im korrekten Format für 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-Modelle müssen als Definitionsdatei (.ptoder.pth) mit dem Eingabedatentyp von float32 gespeichert werden.

Verwenden Sie die Methode, gefolgt von der torch.save Methode, um Ihr torch.jit.trace Modell zu speichern. Dieser Prozess speichert ein Objekt in einer Festplattendatei und verwendet standardmäßig Python pickle (pickle_module=pickle), um die Objekte und einige Metadaten zu speichern. Als Nächstes konvertieren Sie das gespeicherte Modell in eine komprimierte TAR-Datei.

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()

Wenn Sie Ihr Modell mit PyTorch 2.0 oder höher speichern, leitet SageMaker Neo die Eingabekonfiguration für das Modell (den Namen und die Form für die Eingabe) aus der Definitionsdatei ab. In diesem Fall müssen Sie die Dateneingabekonfiguration für SageMaker AI nicht festlegen, wenn Sie das Modell kompilieren.

Wenn Sie verhindern möchten, dass SageMaker Neo die Eingabekonfiguration ableitet, können Sie den _store_inputs Parameter von torch.jit.trace auf False setzen. In diesem Fall müssen Sie bei der Kompilierung des Modells die Dateneingabekonfiguration für SageMaker AI angeben.

Weitere Informationen zur torch.jit.trace Methode finden Sie unter TORCH.JIT.TRACE in der PyTorch-Dokumentation.

TensorFlow benötigt eine .pb oder eine .pbtxt Datei und ein Variablenverzeichnis, das Variablen enthält. Für eingefrorene Modelle ist nur eine .pb oder .pbtxt Datei erforderlich.

Das folgende Codebeispiel veranschaulicht, wie Sie den Befehl tar Linux verwenden, um Ihr Modell zu komprimieren. Führen Sie Folgendes in Ihrem Terminal oder in einem Jupyter Notebook aus (wenn Sie ein Jupyter Notebook verwenden, fügen Sie den ! magischen Befehl am Anfang der Anweisung ein):

# 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

Die in diesem Beispiel verwendeten Befehlsflags bewirken Folgendes:

  • c: Erstellen eines Archivs

  • z: Komprimieren Sie das Archiv mit gzip

  • v: Zeigt den Fortschritt der Archivierung an

  • f: Geben Sie den Dateinamen des Archivs an

Integrierte Schätzer werden entweder durch Framework-spezifische Container oder durch algorithmusspezifische Container erstellt. Schätzobjekte sowohl für den integrierten Algorithmus als auch für den Framework-spezifischen Schätzer speichern das Modell im richtigen Format für Sie, wenn Sie das Modell mit der integrierten .fit Methode trainieren.

Sie können beispielsweise a sagemaker.TensorFlow verwenden, um einen TensorFlow-Schätzer zu definieren:

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')

Trainieren Sie dann das Modell mit .fit integrierten Methode:

estimator.fit(inputs)

Bevor Sie das Modell schließlich mit der Build-In compile_model Methode kompilieren:

# 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')

Sie können die sagemaker.estimator.Estimator Klasse auch verwenden, um ein Schätzerobjekt für das Training und die Kompilierung eines integrierten Algorithmus mit der compile_model Methode aus dem SageMaker Python SDK zu initialisieren:

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')

Weitere Informationen zum Kompilieren von Modellen mit dem SageMaker Python SDK finden Sie unter Kompilieren eines Modells (Amazon SageMaker AI SDK):