Modell für die Kompilierung vorbereiten - Amazon SageMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Modell für die Kompilierung vorbereiten

SageMaker Neo benötigt Modelle für maschinelles Lernen, 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 der 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 JSON im Format oder Listenformat. Die Dateneingaben sind Framework-spezifisch.

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

Geben Sie den Namen und die Form (NCHWFormat) der erwarteten Dateneingaben mithilfe eines Wörterbuchformats für Ihr trainiertes Modell an. Beachten Sie, dass Keras-Modellartefakte zwar im Format NHWC (letzter Kanal) hochgeladen, aber im Format NCHW (Kanal zuerst) angegeben werden DataInputConfig sollten. 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]}

Geben Sie den Namen und die Form (NCHWFormat) der erwarteten Dateneingaben mithilfe eines Wörterbuchformats für Ihr trainiertes Modell an. 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 Modelle für SageMaker Neo speichern.

  • Sie kompilieren Ihr Modell für eine Cloud-Instance. Weitere Informationen zu den Instance-Typen, die SageMaker Neo unterstützt, finden Sie unterUnterstützte Instance-Typen und Frameworks.

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

Andernfalls müssen Sie wie folgt vorgehen:

Geben Sie den Namen und die Form (NCHWFormat) der erwarteten Dateneingaben mithilfe eines Wörterbuchformats für Ihr trainiertes Modell an. 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]]

Geben Sie den Namen und die Form (NHWCFormat) der erwarteten Dateneingaben mithilfe eines Wörterbuchformats für Ihr trainiertes Modell an. 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]}

Geben Sie den Namen und die Form (NHWCFormat) der erwarteten Dateneingaben mithilfe eines Wörterbuchformats für Ihr trainiertes Modell an. 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 Geräte Neo-Seite. Eine Liste der unterstützten SageMaker Neo-Cloud-Instanzziele finden Sie auf der SageMaker Unterstützte Instance-Typen und Frameworks Neo-Seite.

Der Name und die Form der Eingabedaten sind nicht erforderlich.

Modelle für SageMaker Neo speichern

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.

MXNetModelle 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 MXNetHybridisierungsdokumentation.

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 gespeichert werden. float32

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 nicht angeben, SageMaker wenn Sie das Modell kompilieren.

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

Weitere Hinweise zur torch.jit.trace Methode finden Sie unter TORCH. JIT. TRACEin 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 zum Beispiel a verwenden, sagemaker.TensorFlow 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 zu initialisieren und einen integrierten Algorithmus mit der compile_model Methode aus Python zu kompilieren: SageMaker SDK

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 Hinweise zum Kompilieren von Modellen mit SageMaker Python finden Sie SDK unterEin Modell kompilieren (Amazon SageMakerSDK).