

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Siapkan Model untuk Kompilasi
<a name="neo-compilation-preparing-model"></a>

SageMaker Neo membutuhkan model pembelajaran mesin untuk memenuhi bentuk data input tertentu. Bentuk input yang diperlukan untuk kompilasi tergantung pada kerangka pembelajaran mendalam yang Anda gunakan. Setelah bentuk input model Anda diformat dengan benar, simpan model Anda sesuai dengan persyaratan di bawah ini. Setelah Anda memiliki model yang disimpan, kompres artefak model.

**Topics**
+ [

## Bentuk data input apa yang diharapkan SageMaker Neo?
](#neo-job-compilation-expected-inputs)
+ [

## Menyimpan Model untuk SageMaker Neo
](#neo-job-compilation-how-to-save-model)

## Bentuk data input apa yang diharapkan SageMaker Neo?
<a name="neo-job-compilation-expected-inputs"></a>

Sebelum Anda mengkompilasi model Anda, pastikan model Anda diformat dengan benar. Neo mengharapkan nama dan bentuk input data yang diharapkan untuk model terlatih Anda dengan format JSON atau format daftar. Input yang diharapkan adalah kerangka kerja khusus. 

Di bawah ini adalah bentuk input yang diharapkan SageMaker Neo:

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

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Perhatikan bahwa sementara artefak model Keras harus diunggah dalam format NHWC (channel-last), DataInputConfig harus ditentukan dalam format NCHW (channel-first). Format kamus yang diperlukan adalah sebagai berikut: 
+ Untuk satu masukan: `{'input_1':[1,3,224,224]}`
+ Untuk dua input: `{'input_1': [1,3,224,224], 'input_2':[1,3,224,224]}`

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

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'data':[1,3,1024,1024]}`
+ Untuk dua input: `{'var1': [1,1,28,28], 'var2':[1,1,28,28]}`

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

Untuk PyTorch model, Anda tidak perlu memberikan nama dan bentuk input data yang diharapkan jika Anda memenuhi kedua kondisi berikut:
+ Anda membuat file definisi model Anda dengan menggunakan PyTorch 2.0 atau yang lebih baru. Untuk informasi selengkapnya tentang cara membuat file definisi, lihat [PyTorch](#how-to-save-pytorch) bagian di bawah *Menyimpan Model untuk SageMaker Neo*.
+ Anda sedang menyusun model Anda untuk instance cloud. Untuk informasi selengkapnya tentang jenis instance yang didukung SageMaker Neo, lihat[Jenis dan Kerangka Instance yang Didukung](neo-supported-cloud.md).

Jika Anda memenuhi kondisi ini, SageMaker Neo mendapatkan konfigurasi input dari file definisi model (.pt atau.pth) yang Anda buat dengan. PyTorch

Jika tidak, Anda harus melakukan hal berikut:

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Atau, Anda dapat menentukan bentuk hanya menggunakan format daftar. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan dalam format kamus: `{'input0':[1,3,224,224]}`
+ Untuk satu masukan dalam format daftar: `[[1,3,224,224]]`
+ Untuk dua input dalam format kamus: `{'input0':[1,3,224,224], 'input1':[1,3,224,224]}`
+ Untuk dua input dalam format daftar: `[[1,3,224,224], [1,3,224,224]]`

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

Tentukan nama dan bentuk (format NHWC) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'input':[1,1024,1024,3]}`
+ Untuk dua input: `{'data1': [1,28,28,1], 'data2':[1,28,28,1]}`

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

Tentukan nama dan bentuk (format NHWC) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'input':[1,224,224,3]}`

**catatan**  
SageMaker Neo hanya mendukung TensorFlow Lite untuk target perangkat edge. Untuk daftar target perangkat SageMaker Neo edge yang didukung, lihat [Perangkat](neo-supported-devices-edge-devices.md#neo-supported-edge-devices) halaman SageMaker Neo. Untuk daftar target instans SageMaker Neo cloud yang didukung, lihat [Jenis dan Kerangka Instance yang Didukung](neo-supported-cloud.md) halaman SageMaker Neo.

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

Nama dan bentuk data input tidak diperlukan.

## Menyimpan Model untuk SageMaker Neo
<a name="neo-job-compilation-how-to-save-model"></a>

Contoh kode berikut menunjukkan cara menyimpan model Anda agar kompatibel dengan Neo. Model harus dikemas sebagai file tar terkompresi ()`*.tar.gz`.

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

Model Keras memerlukan satu file definisi model (`.h5`).

Ada dua opsi untuk menyimpan model Keras Anda agar kompatibel untuk SageMaker Neo:

1. Ekspor ke `.h5` format dengan`model.save("<model-name>", save_format="h5")`.

1. Bekukan `SavedModel` setelah mengekspor.

Di bawah ini adalah contoh cara mengekspor `tf.keras` model sebagai grafik beku (opsi dua):

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

**Awas**  
Jangan mengekspor model Anda dengan `SavedModel` kelas menggunakan`model.save(<path>, save_format='tf')`. Format ini cocok untuk pelatihan, tetapi tidak cocok untuk inferensi.

### MXNet
<a name="how-to-save-mxnet"></a>

MXNet model harus disimpan sebagai file simbol tunggal `*-symbol.json` dan satu parameter`*.params files`.

------
#### [ Gluon Models ]

Tentukan jaringan saraf menggunakan `HybridSequential` Kelas. Ini akan menjalankan kode dalam gaya pemrograman simbolik (sebagai lawan dari pemrograman imperatif).

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

Untuk informasi lebih lanjut tentang model hibridisasi, lihat dokumentasi [MXNet hibridisasi](https://mxnet.apache.org/versions/1.7.0/api/python/docs/tutorials/packages/gluon/blocks/hybridize.html).

------
#### [ Gluon Model Zoo (GluonCV) ]

Model kebun binatang model GluonCV datang pra-hibridisasi. Jadi Anda bisa mengekspornya.

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

Semua model non-Gluon saat disimpan ke penggunaan disk `*-symbol` dan `*.params` file. Karena itu mereka sudah dalam format yang benar untuk 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 model harus disimpan sebagai file definisi (`.pt`atau`.pth`) dengan tipe data input dari. `float32`

Untuk menyimpan model Anda, gunakan `torch.jit.trace` metode yang diikuti oleh `torch.save` metode. Proses ini menyimpan objek ke file disk dan secara default menggunakan python pickle (`pickle_module=pickle`) untuk menyimpan objek dan beberapa metadata. Selanjutnya, konversi model yang disimpan ke file tar terkompresi.

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

Jika Anda menyimpan model Anda dengan PyTorch 2.0 atau yang lebih baru, SageMaker Neo memperoleh konfigurasi input untuk model (nama dan bentuk untuk inputnya) dari file definisi. Dalam hal ini, Anda tidak perlu menentukan konfigurasi input data ke SageMaker AI saat Anda mengkompilasi model.

Jika Anda ingin mencegah SageMaker Neo menurunkan konfigurasi input, Anda dapat mengatur `_store_inputs` parameter `torch.jit.trace` ke`False`. Jika Anda melakukan ini, Anda harus menentukan konfigurasi input data ke SageMaker AI saat Anda mengkompilasi model.

Untuk informasi selengkapnya tentang `torch.jit.trace` metode ini, lihat [TORCH.JIT.TRACE](https://pytorch.org/docs/stable/generated/torch.jit.trace.html#torch.jit.trace) di dokumentasi. PyTorch 

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

TensorFlow membutuhkan satu `.pb` atau satu `.pbtxt` file dan direktori variabel yang berisi variabel. Untuk model beku, hanya satu `.pb` atau `.pbtxt` file yang diperlukan.

Contoh kode berikut menunjukkan cara menggunakan perintah tar Linux untuk mengompres model Anda. Jalankan yang berikut ini di terminal Anda atau di notebook Jupyter (jika Anda menggunakan notebook Jupyter, masukkan perintah `!` ajaib di awal pernyataan):

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

Bendera perintah yang digunakan dalam contoh ini mencapai hal berikut:
+ `c`: Buat arsip
+ `z`: Kompres arsip dengan gzip
+ `v`: Tampilkan kemajuan arsip
+ `f`: Tentukan nama file arsip

### Estimator Bawaan
<a name="how-to-save-built-in"></a>

Estimator bawaan dibuat oleh wadah khusus kerangka kerja atau wadah khusus algoritme. Objek penaksir untuk algoritme bawaan dan estimator khusus kerangka kerja menyimpan model dalam format yang benar untuk Anda saat Anda melatih model menggunakan metode bawaan. `.fit`

Misalnya, Anda dapat menggunakan a `sagemaker.TensorFlow` untuk mendefinisikan TensorFlow estimator:

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

Kemudian latih model dengan metode `.fit` bawaan:

```
estimator.fit(inputs)
```

Sebelum akhirnya mengkompilasi model dengan `compile_model` metode build in:

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

Anda juga dapat menggunakan `sagemaker.estimator.Estimator` Class untuk menginisialisasi objek estimator untuk pelatihan dan mengkompilasi algoritma bawaan dengan `compile_model` metode dari Python 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')
```

Untuk informasi selengkapnya tentang mengkompilasi model dengan SageMaker Python SDK, lihat. [Kompilasi Model (Amazon SageMaker AI SDK)](neo-job-compilation-sagemaker-sdk.md)