

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
<a name="neo-compilation-preparing-model"></a>

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.

**Topics**
+ [Welche Formen der Eingabedaten erwartet SageMaker Neo?](#neo-job-compilation-expected-inputs)
+ [Modelle für SageMaker Neo speichern](#neo-job-compilation-how-to-save-model)

## Welche Formen der Eingabedaten erwartet SageMaker Neo?
<a name="neo-job-compilation-expected-inputs"></a>

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:

### Keras
<a name="collapsible-section-1"></a>

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, aber im NCHW-Format (Channel-First) 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]}`

### MXNet/ONNX
<a name="collapsible-section-2"></a>

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]}`

### PyTorch
<a name="collapsible-section-3"></a>

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](#how-to-save-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 unter[Unterstützte Instance-Typen und Frameworks](neo-supported-cloud.md).

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:

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]]`

### TensorFlow
<a name="collapsible-section-4"></a>

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]}`

### TFLite
<a name="collapsible-section-5"></a>

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 [Geräte](neo-supported-devices-edge-devices.md#neo-supported-edge-devices) Neo-Seite. Eine Liste der unterstützten SageMaker Neo-Cloud-Instanzziele finden Sie auf der SageMaker [Unterstützte Instance-Typen und Frameworks](neo-supported-cloud.md) Neo-Seite.

### XGBoost
<a name="collapsible-section-6"></a>

Der Name und die Form der Eingabedaten sind nicht erforderlich.

## Modelle für SageMaker Neo speichern
<a name="neo-job-compilation-how-to-save-model"></a>

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
<a name="how-to-save-tf-keras"></a>

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")`.

1. 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
<a name="how-to-save-mxnet"></a>

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 Hybridisierungsdokumentation](https://mxnet.apache.org/versions/1.7.0/api/python/docs/tutorials/packages/gluon/blocks/hybridize.html).

------
#### [ 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
<a name="how-to-save-pytorch"></a>

PyTorch Modelle müssen als Definitionsdatei (`.pt`oder`.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 für SageMaker AI angeben, 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. Wenn Sie dies tun, müssen Sie die Dateneingabekonfiguration für SageMaker AI angeben, wenn Sie das Modell kompilieren.

Weitere Informationen zur `torch.jit.trace` Methode finden Sie unter [TORCH.JIT.TRACE](https://pytorch.org/docs/stable/generated/torch.jit.trace.html#torch.jit.trace) in der Dokumentation. PyTorch 

### TensorFlow
<a name="how-to-save-tf"></a>

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
<a name="how-to-save-built-in"></a>

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 dem Python-SDK zu kompilieren: 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')
```

Weitere Hinweise zum Kompilieren von Modellen mit dem SageMaker Python-SDK finden Sie unter[Ein Modell kompilieren (Amazon SageMaker AI SDK)](neo-job-compilation-sagemaker-sdk.md).